diff --git a/cbc/src/decrypt.rs b/cbc/src/decrypt.rs index b35e8cc..5118b1a 100644 --- a/cbc/src/decrypt.rs +++ b/cbc/src/decrypt.rs @@ -34,8 +34,40 @@ where C: BlockCipherDecrypt, { fn decrypt_with_backend(&mut self, f: impl BlockModeDecClosure) { + struct Closure<'a, BS, BC> + where + BS: BlockSizes, + BC: BlockModeDecClosure, + { + iv: &'a mut Array, + f: BC, + } + + impl<'a, BS, BC> BlockSizeUser for Closure<'a, BS, BC> + where + BS: BlockSizes, + BC: BlockModeDecClosure, + { + type BlockSize = BS; + } + + impl<'a, BS, BC> BlockCipherDecClosure for Closure<'a, BS, BC> + where + BS: BlockSizes, + BC: BlockModeDecClosure, + { + #[inline(always)] + fn call>( + self, + cipher_backend: &B, + ) { + let Self { iv, f } = self; + f.call(&mut Backend { iv, cipher_backend }); + } + } + let Self { cipher, iv } = self; - cipher.decrypt_with_backend(ClosurePassedToCipher { iv, f }) + cipher.decrypt_with_backend(Closure { iv, f }) } } @@ -108,35 +140,6 @@ impl Drop for Decryptor { #[cfg(feature = "zeroize")] impl ZeroizeOnDrop for Decryptor {} -struct ClosurePassedToCipher<'a, BS, BC> -where - BS: BlockSizes, - BC: BlockModeDecClosure, -{ - iv: &'a mut Array, - f: BC, -} - -impl<'a, BS, BC> BlockSizeUser for ClosurePassedToCipher<'a, BS, BC> -where - BS: BlockSizes, - BC: BlockModeDecClosure, -{ - type BlockSize = BS; -} - -impl<'a, BS, BC> BlockCipherDecClosure for ClosurePassedToCipher<'a, BS, BC> -where - BS: BlockSizes, - BC: BlockModeDecClosure, -{ - #[inline(always)] - fn call>(self, cipher_backend: &B) { - let Self { iv, f } = self; - f.call(&mut Backend { iv, cipher_backend }); - } -} - struct Backend<'a, BS, BK> where BS: BlockSizes, diff --git a/cbc/src/encrypt.rs b/cbc/src/encrypt.rs index edecabb..0950d3c 100644 --- a/cbc/src/encrypt.rs +++ b/cbc/src/encrypt.rs @@ -1,6 +1,8 @@ use crate::xor; use cipher::{ - consts::U1, crypto_common::InnerUser, AlgorithmName, Block, BlockCipherEncrypt, + consts::U1, + crypto_common::{BlockSizes, InnerUser}, + AlgorithmName, Array, Block, BlockCipherEncBackend, BlockCipherEncClosure, BlockCipherEncrypt, BlockModeEncBackend, BlockModeEncClosure, BlockModeEncrypt, BlockSizeUser, InOut, InnerIvInit, Iv, IvSizeUser, IvState, ParBlocksSizeUser, }; @@ -68,28 +70,40 @@ where C: BlockCipherEncrypt, { fn encrypt_with_backend(&mut self, f: impl BlockModeEncClosure) { - f.call(self) - } -} + struct Closure<'a, BS, BC> + where + BS: BlockSizes, + BC: BlockModeEncClosure, + { + iv: &'a mut Array, + f: BC, + } -impl ParBlocksSizeUser for Encryptor -where - C: BlockCipherEncrypt, -{ - type ParBlocksSize = U1; -} + impl<'a, BS, BC> BlockSizeUser for Closure<'a, BS, BC> + where + BS: BlockSizes, + BC: BlockModeEncClosure, + { + type BlockSize = BS; + } -impl BlockModeEncBackend for Encryptor -where - C: BlockCipherEncrypt, -{ - #[inline(always)] - fn encrypt_block(&mut self, mut block: InOut<'_, '_, Block>) { - let mut t = block.clone_in(); - xor(&mut t, &self.iv); - self.cipher.encrypt_block(&mut t); - self.iv = t.clone(); - *block.get_out() = t; + impl<'a, BS, BC> BlockCipherEncClosure for Closure<'a, BS, BC> + where + BS: BlockSizes, + BC: BlockModeEncClosure, + { + #[inline(always)] + fn call>( + self, + cipher_backend: &B, + ) { + let Self { iv, f } = self; + f.call(&mut Backend { iv, cipher_backend }); + } + } + + let Self { cipher, iv } = self; + cipher.encrypt_with_backend(Closure { iv, f }) } } @@ -124,3 +138,43 @@ impl Drop for Encryptor { #[cfg(feature = "zeroize")] impl ZeroizeOnDrop for Encryptor {} + +struct Backend<'a, BS, BK> +where + BS: BlockSizes, + BK: BlockCipherEncBackend, +{ + iv: &'a mut Array, + cipher_backend: &'a BK, +} + +impl<'a, BS, BK> BlockSizeUser for Backend<'a, BS, BK> +where + BS: BlockSizes, + BK: BlockCipherEncBackend, +{ + type BlockSize = BS; +} + +impl<'a, BS, BK> ParBlocksSizeUser for Backend<'a, BS, BK> +where + BS: BlockSizes, + BK: BlockCipherEncBackend, +{ + type ParBlocksSize = U1; +} + +impl<'a, BS, BK> BlockModeEncBackend for Backend<'a, BS, BK> +where + BS: BlockSizes, + BK: BlockCipherEncBackend, +{ + #[inline(always)] + fn encrypt_block(&mut self, mut block: InOut<'_, '_, Block>) { + let mut t = block.clone_in(); + xor(&mut t, self.iv); + self.cipher_backend.encrypt_block((&mut t).into()); + *self.iv = t.clone(); + *block.get_out() = t; + } +}