summaryrefslogtreecommitdiffstats
path: root/rust/vendor/aes/src/soft.rs
diff options
context:
space:
mode:
authorDaniel Baumann <daniel.baumann@progress-linux.org>2024-04-19 17:39:49 +0000
committerDaniel Baumann <daniel.baumann@progress-linux.org>2024-04-19 17:39:49 +0000
commita0aa2307322cd47bbf416810ac0292925e03be87 (patch)
tree37076262a026c4b48c8a0e84f44ff9187556ca35 /rust/vendor/aes/src/soft.rs
parentInitial commit. (diff)
downloadsuricata-a0aa2307322cd47bbf416810ac0292925e03be87.tar.xz
suricata-a0aa2307322cd47bbf416810ac0292925e03be87.zip
Adding upstream version 1:7.0.3.upstream/1%7.0.3
Signed-off-by: Daniel Baumann <daniel.baumann@progress-linux.org>
Diffstat (limited to 'rust/vendor/aes/src/soft.rs')
-rw-r--r--rust/vendor/aes/src/soft.rs127
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"
+);