From 4c411b76cad9cc735687dc739d2e2db5d00e5eac Mon Sep 17 00:00:00 2001 From: Igor Tolmachev Date: Sun, 21 Jul 2024 16:59:14 +0900 Subject: Add AES encryption --- src/zip/encryption/aes.rs | 49 +++++++++++++++++++++++++++++++++++------------ 1 file changed, 37 insertions(+), 12 deletions(-) (limited to 'src/zip/encryption/aes.rs') diff --git a/src/zip/encryption/aes.rs b/src/zip/encryption/aes.rs index 6f41aaa..b690482 100644 --- a/src/zip/encryption/aes.rs +++ b/src/zip/encryption/aes.rs @@ -1,4 +1,3 @@ -use crate::utils::ReadUtils; use aes::cipher::generic_array::GenericArray; use aes::cipher::BlockEncrypt; use std::io::{Read, Result as IoResult}; @@ -10,37 +9,63 @@ pub struct AesDecoder { counter: u128, block: [u8; 16], - cursor: usize, + lower: usize, + upper: usize, } impl AesDecoder { - pub fn new(mut io: Io, aes: Aes) -> IoResult { - let block = io.read_arr::<16>()?; + pub fn new(io: Io, aes: Aes) -> IoResult { let mut decoder = Self { io, aes, - counter: 1, - block, - cursor: 0, + + counter: 0, + block: [0; 16], + lower: 0, + upper: 0, }; - decoder.decrypt_block(); + + decoder.update_block()?; + Ok(decoder) } #[inline] - fn decrypt_block(&mut self) { + fn update_block(&mut self) -> IoResult<()> { + self.upper = self.io.read(&mut self.block)?; + self.lower = 0; + + self.counter += 1; let mut mask = self.counter.to_le_bytes(); + self.aes .encrypt_block(GenericArray::from_mut_slice(&mut mask)); + for (b, m) in self.block.iter_mut().zip(mask) { *b ^= m } - self.counter += 1; + + Ok(()) } } impl Read for AesDecoder { - fn read(&mut self, buf: &mut [u8]) -> IoResult { - todo!() + fn read(&mut self, mut buf: &mut [u8]) -> IoResult { + let mut bytes = 0; + while !buf.is_empty() && self.lower != self.upper { + for (to, fr) in buf.iter_mut().zip(&self.block[self.lower..self.upper]) { + *to = *fr + } + + let consumed = buf.len().min(self.upper - self.lower); + buf = &mut buf[consumed..]; + self.lower += consumed; + bytes += consumed; + + if self.lower == 16 { + self.update_block()?; + } + } + Ok(bytes) } } -- cgit v1.2.3