From ff3a647bc51d83208da341daa121db674e41f9e6 Mon Sep 17 00:00:00 2001 From: Daniel Schadt Date: Tue, 15 Apr 2025 22:00:53 +0200 Subject: make portable_simd optional --- src/aesround.rs | 43 +++++++++++++++++++++++++++++++++++-------- 1 file changed, 35 insertions(+), 8 deletions(-) (limited to 'src/aesround.rs') 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) } } } -- cgit v1.2.3