|
1 | 1 | use cipher::{ |
2 | | - AlgorithmName, Array, AsyncStreamCipher, Block, BlockCipherDecrypt, BlockCipherEncBackend, |
3 | | - BlockCipherEncClosure, BlockCipherEncrypt, BlockModeDecBackend, BlockModeDecClosure, |
4 | | - BlockModeDecrypt, BlockSizeUser, InOut, InnerIvInit, Iv, IvSizeUser, IvState, ParBlocks, |
5 | | - ParBlocksSizeUser, |
| 2 | + AlgorithmName, Array, Block, BlockCipherDecrypt, BlockCipherEncBackend, BlockCipherEncClosure, |
| 3 | + BlockCipherEncrypt, BlockModeDecBackend, BlockModeDecClosure, BlockModeDecrypt, BlockSizeUser, |
| 4 | + InnerIvInit, Iv, IvSizeUser, IvState, ParBlocks, ParBlocksSizeUser, |
6 | 5 | common::{BlockSizes, InnerUser}, |
| 6 | + inout::{InOut, InOutBuf, NotEqualError}, |
7 | 7 | typenum::Unsigned, |
8 | 8 | }; |
9 | 9 | use core::fmt; |
@@ -186,7 +186,36 @@ where |
186 | 186 | } |
187 | 187 | } |
188 | 188 |
|
189 | | -impl<C> AsyncStreamCipher for Decryptor<C> where C: BlockCipherEncrypt {} |
| 189 | +impl<C> Decryptor<C> |
| 190 | +where |
| 191 | + C: BlockCipherEncrypt, |
| 192 | +{ |
| 193 | + /// Decrypt data using `InOutBuf`. |
| 194 | + pub fn decrypt_inout(mut self, data: InOutBuf<'_, '_, u8>) { |
| 195 | + let (blocks, mut tail) = data.into_chunks(); |
| 196 | + self.decrypt_blocks_inout(blocks); |
| 197 | + let n = tail.len(); |
| 198 | + if n != 0 { |
| 199 | + let mut block = Block::<Self>::default(); |
| 200 | + block[..n].copy_from_slice(tail.get_in()); |
| 201 | + self.decrypt_block(&mut block); |
| 202 | + tail.get_out().copy_from_slice(&block[..n]); |
| 203 | + } |
| 204 | + } |
| 205 | + |
| 206 | + /// Decrypt data in place. |
| 207 | + pub fn decrypt(self, buf: &mut [u8]) { |
| 208 | + self.decrypt_inout(buf.into()); |
| 209 | + } |
| 210 | + |
| 211 | + /// Decrypt data from buffer to buffer. |
| 212 | + /// |
| 213 | + /// # Errors |
| 214 | + /// If `in_buf` and `out_buf` have different lengths. |
| 215 | + pub fn decrypt_b2b(self, in_buf: &[u8], out_buf: &mut [u8]) -> Result<(), NotEqualError> { |
| 216 | + InOutBuf::new(in_buf, out_buf).map(|b| self.decrypt_inout(b)) |
| 217 | + } |
| 218 | +} |
190 | 219 |
|
191 | 220 | impl<C> InnerUser for Decryptor<C> |
192 | 221 | where |
|
0 commit comments