diff options
author | Daniel Schadt <kingdread@gmx.de> | 2025-04-11 12:48:18 +0200 |
---|---|---|
committer | Daniel Schadt <kingdread@gmx.de> | 2025-04-11 12:48:18 +0200 |
commit | 5bd298ed568aca12a54f014a7b13f943379a5eb9 (patch) | |
tree | 911afd45baafe196517455f33ab89bc8a9f09355 /src/aesround.rs | |
parent | 34ed0189281fcca1921d4e3d762e6d9183d5230f (diff) | |
download | zears-5bd298ed568aca12a54f014a7b13f943379a5eb9.tar.gz zears-5bd298ed568aca12a54f014a7b13f943379a5eb9.tar.bz2 zears-5bd298ed568aca12a54f014a7b13f943379a5eb9.zip |
use simd instructions
(requires nightly compiler)
Diffstat (limited to 'src/aesround.rs')
-rw-r--r-- | src/aesround.rs | 49 |
1 files changed, 21 insertions, 28 deletions
diff --git a/src/aesround.rs b/src/aesround.rs index 0a06192..d04ac9b 100644 --- a/src/aesround.rs +++ b/src/aesround.rs @@ -26,23 +26,23 @@ pub struct AesSoft { impl AesRound for AesSoft { fn new(key_i: Block, key_j: Block, key_l: Block) -> Self { Self { - key_i: key_i.0.into(), - key_j: key_j.0.into(), - key_l: key_l.0.into(), + key_i: key_i.bytes().into(), + key_j: key_j.bytes().into(), + key_l: key_l.bytes().into(), } } fn aes4(&self, value: Block) -> Block { - let mut block: aes::Block = value.0.into(); + let mut block: aes::Block = value.bytes().into(); ::aes::hazmat::cipher_round(&mut block, &self.key_j); ::aes::hazmat::cipher_round(&mut block, &self.key_i); ::aes::hazmat::cipher_round(&mut block, &self.key_l); - ::aes::hazmat::cipher_round(&mut block, &Block::NULL.0.into()); - Block(block.into()) + ::aes::hazmat::cipher_round(&mut block, &Block::null().bytes().into()); + <Block as From<[u8; 16]>>::from(block.into()) } fn aes10(&self, value: Block) -> Block { - let mut block: aes::Block = value.0.into(); + let mut block: aes::Block = value.bytes().into(); ::aes::hazmat::cipher_round(&mut block, &self.key_i); ::aes::hazmat::cipher_round(&mut block, &self.key_j); ::aes::hazmat::cipher_round(&mut block, &self.key_l); @@ -53,7 +53,7 @@ impl AesRound for AesSoft { ::aes::hazmat::cipher_round(&mut block, &self.key_j); ::aes::hazmat::cipher_round(&mut block, &self.key_l); ::aes::hazmat::cipher_round(&mut block, &self.key_i); - Block(block.into()) + <Block as From<[u8; 16]>>::from(block.into()) } } @@ -75,16 +75,13 @@ pub mod x86_64 { impl AesRound for AesNi { fn new(key_i: Block, key_j: Block, key_l: Block) -> Self { - // SAFETY: loadu can load from unaligned memory - unsafe { - Self { - support: cpuid_aes::init(), - fallback: AesSoft::new(key_i, key_j, key_l), - key_i: _mm_loadu_si128(key_i.0.as_ptr() as *const _), - key_j: _mm_loadu_si128(key_j.0.as_ptr() as *const _), - key_l: _mm_loadu_si128(key_l.0.as_ptr() as *const _), - null: _mm_loadu_si128(Block::NULL.0.as_ptr() as *const _), - } + Self { + support: cpuid_aes::init(), + fallback: AesSoft::new(key_i, key_j, key_l), + key_i: key_i.simd().into(), + key_j: key_j.simd().into(), + key_l: key_l.simd().into(), + null: Block::null().simd().into(), } } @@ -93,16 +90,14 @@ pub mod x86_64 { return self.fallback.aes4(value); } - // SAFETY: loadu can load from unaligned memory + // SAFETY: Nothing should go wrong when calling AESENC unsafe { - let mut block = _mm_loadu_si128(value.0.as_ptr() as *const _); + let mut block = value.simd().into(); block = _mm_aesenc_si128(block, self.key_j); block = _mm_aesenc_si128(block, self.key_i); block = _mm_aesenc_si128(block, self.key_l); block = _mm_aesenc_si128(block, self.null); - let mut result = Block::default(); - _mm_storeu_si128(result.0.as_mut_ptr() as *mut _, block); - result + Block::from_simd(block.into()) } } @@ -111,9 +106,9 @@ pub mod x86_64 { return self.fallback.aes10(value); } - // SAFETY: loadu can load from unaligned memory + // SAFETY: Nothing should go wrong when calling AESENC unsafe { - let mut block = _mm_loadu_si128(value.0.as_ptr() as *const _); + let mut block = value.simd().into(); block = _mm_aesenc_si128(block, self.key_i); block = _mm_aesenc_si128(block, self.key_j); block = _mm_aesenc_si128(block, self.key_l); @@ -124,9 +119,7 @@ pub mod x86_64 { block = _mm_aesenc_si128(block, self.key_j); block = _mm_aesenc_si128(block, self.key_l); block = _mm_aesenc_si128(block, self.key_i); - let mut result = Block::default(); - _mm_storeu_si128(result.0.as_mut_ptr() as *mut _, block); - result + Block::from_simd(block.into()) } } } |