diff options
Diffstat (limited to 'rust/vendor/aes/src/soft.rs')
-rw-r--r-- | rust/vendor/aes/src/soft.rs | 127 |
1 files changed, 127 insertions, 0 deletions
diff --git a/rust/vendor/aes/src/soft.rs b/rust/vendor/aes/src/soft.rs new file mode 100644 index 0000000..1b51d22 --- /dev/null +++ b/rust/vendor/aes/src/soft.rs @@ -0,0 +1,127 @@ +//! AES block cipher constant-time implementation. +//! +//! The implementation uses a technique called [fixslicing][1], an improved +//! form of bitslicing which represents ciphers in a way which enables +//! very efficient constant-time implementations in software. +//! +//! [1]: https://eprint.iacr.org/2020/1123.pdf + +#![deny(unsafe_code)] + +#[cfg_attr(not(target_pointer_width = "64"), path = "soft/fixslice32.rs")] +#[cfg_attr(target_pointer_width = "64", path = "soft/fixslice64.rs")] +pub(crate) mod fixslice; + +#[cfg(feature = "ctr")] +mod ctr; + +#[cfg(feature = "ctr")] +pub use self::ctr::{Aes128Ctr, Aes192Ctr, Aes256Ctr}; + +use crate::{Block, ParBlocks}; +use cipher::{ + consts::{U16, U24, U32, U8}, + generic_array::GenericArray, + BlockCipher, BlockDecrypt, BlockEncrypt, NewBlockCipher, +}; +use fixslice::{FixsliceKeys128, FixsliceKeys192, FixsliceKeys256, FIXSLICE_BLOCKS}; + +macro_rules! define_aes_impl { + ( + $name:ident, + $key_size:ty, + $fixslice_keys:ty, + $fixslice_key_schedule:path, + $fixslice_decrypt:path, + $fixslice_encrypt:path, + $doc:expr + ) => { + #[doc=$doc] + #[derive(Clone)] + pub struct $name { + keys: $fixslice_keys, + } + + impl NewBlockCipher for $name { + type KeySize = $key_size; + + #[inline] + fn new(key: &GenericArray<u8, $key_size>) -> Self { + Self { + keys: $fixslice_key_schedule(key), + } + } + } + + impl BlockCipher for $name { + type BlockSize = U16; + type ParBlocks = U8; + } + + impl BlockEncrypt for $name { + #[inline] + fn encrypt_block(&self, block: &mut Block) { + let mut blocks = [Block::default(); FIXSLICE_BLOCKS]; + blocks[0].copy_from_slice(block); + $fixslice_encrypt(&self.keys, &mut blocks); + block.copy_from_slice(&blocks[0]); + } + + #[inline] + fn encrypt_par_blocks(&self, blocks: &mut ParBlocks) { + for chunk in blocks.chunks_mut(FIXSLICE_BLOCKS) { + $fixslice_encrypt(&self.keys, chunk); + } + } + } + + impl BlockDecrypt for $name { + #[inline] + fn decrypt_block(&self, block: &mut Block) { + let mut blocks = [Block::default(); FIXSLICE_BLOCKS]; + blocks[0].copy_from_slice(block); + $fixslice_decrypt(&self.keys, &mut blocks); + block.copy_from_slice(&blocks[0]); + } + + #[inline] + fn decrypt_par_blocks(&self, blocks: &mut ParBlocks) { + for chunk in blocks.chunks_mut(FIXSLICE_BLOCKS) { + $fixslice_decrypt(&self.keys, chunk); + } + } + } + + opaque_debug::implement!($name); + }; +} + +define_aes_impl!( + Aes128, + U16, + FixsliceKeys128, + fixslice::aes128_key_schedule, + fixslice::aes128_decrypt, + fixslice::aes128_encrypt, + "AES-128 block cipher instance" +); + +define_aes_impl!( + Aes192, + U24, + FixsliceKeys192, + fixslice::aes192_key_schedule, + fixslice::aes192_decrypt, + fixslice::aes192_encrypt, + "AES-192 block cipher instance" +); + +define_aes_impl!( + Aes256, + U32, + FixsliceKeys256, + fixslice::aes256_key_schedule, + fixslice::aes256_decrypt, + fixslice::aes256_encrypt, + "AES-256 block cipher instance" +); |