aboutsummaryrefslogtreecommitdiff
path: root/src/aesround.rs
diff options
context:
space:
mode:
authorDaniel Schadt <kingdread@gmx.de>2025-04-15 22:00:53 +0200
committerDaniel Schadt <kingdread@gmx.de>2025-04-15 22:00:53 +0200
commitff3a647bc51d83208da341daa121db674e41f9e6 (patch)
treeae4d0a4e78f1b58d9c0ed66d45a8473541285dd0 /src/aesround.rs
parentaf2c01c00afdb819c95d68e2c7e980e673c0d5b2 (diff)
downloadzears-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.rs43
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)
}
}
}