diff options
author | Daniel Schadt <kingdread@gmx.de> | 2025-04-15 22:00:53 +0200 |
---|---|---|
committer | Daniel Schadt <kingdread@gmx.de> | 2025-04-15 22:00:53 +0200 |
commit | ff3a647bc51d83208da341daa121db674e41f9e6 (patch) | |
tree | ae4d0a4e78f1b58d9c0ed66d45a8473541285dd0 /src/aesround.rs | |
parent | af2c01c00afdb819c95d68e2c7e980e673c0d5b2 (diff) | |
download | zears-ff3a647bc51d83208da341daa121db674e41f9e6.tar.gz zears-ff3a647bc51d83208da341daa121db674e41f9e6.tar.bz2 zears-ff3a647bc51d83208da341daa121db674e41f9e6.zip |
make portable_simd optional
Diffstat (limited to 'src/aesround.rs')
-rw-r--r-- | src/aesround.rs | 43 |
1 files changed, 35 insertions, 8 deletions
diff --git a/src/aesround.rs b/src/aesround.rs index 169c125..6f63243 100644 --- a/src/aesround.rs +++ b/src/aesround.rs @@ -80,15 +80,42 @@ pub mod x86_64 { null: __m128i, } + #[cfg(feature = "simd")] + fn to_simd(block: Block) -> __m128i { + block.simd().into() + } + + #[cfg(not(feature = "simd"))] + fn to_simd(block: Block) -> __m128i { + let bytes = block.bytes(); + // SAFETY: loadu can load from unaligned memory + unsafe { _mm_loadu_si128(bytes.as_ptr() as *const _) } + } + + #[cfg(feature = "simd")] + fn from_simd(simd: __m128i) -> Block { + Block::from_simd(simd.into()) + } + + #[cfg(not(feature = "simd"))] + fn from_simd(simd: __m128i) -> Block { + let mut bytes = [0; 16]; + // SAFETY: storeu can store to unaligned memory + unsafe { + _mm_storeu_si128(bytes.as_mut_ptr() as *mut _, simd); + } + Block::from(bytes) + } + impl AesRound for AesNi { fn new(key_i: Block, key_j: Block, key_l: Block) -> Self { 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(), + key_i: to_simd(key_i), + key_j: to_simd(key_j), + key_l: to_simd(key_l), + null: to_simd(Block::null()), } } @@ -99,12 +126,12 @@ pub mod x86_64 { // SAFETY: Nothing should go wrong when calling AESENC unsafe { - let mut block = value.simd().into(); + let mut block = to_simd(value); 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); - Block::from_simd(block.into()) + from_simd(block) } } @@ -115,7 +142,7 @@ pub mod x86_64 { // SAFETY: Nothing should go wrong when calling AESENC unsafe { - let mut block = value.simd().into(); + let mut block = to_simd(value); block = _mm_aesenc_si128(block, self.key_i); block = _mm_aesenc_si128(block, self.key_j); block = _mm_aesenc_si128(block, self.key_l); @@ -126,7 +153,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); - Block::from_simd(block.into()) + from_simd(block) } } } |