From 7bcdc3b4ca460aec2b98fb2dca6165788c562b05 Mon Sep 17 00:00:00 2001 From: Igor Tolmachev Date: Sat, 20 Jul 2024 16:52:39 +0900 Subject: Partial aes implementation and others improvements --- src/zip/encryption/aes.rs | 46 ++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 46 insertions(+) create mode 100644 src/zip/encryption/aes.rs (limited to 'src/zip/encryption/aes.rs') diff --git a/src/zip/encryption/aes.rs b/src/zip/encryption/aes.rs new file mode 100644 index 0000000..6f41aaa --- /dev/null +++ b/src/zip/encryption/aes.rs @@ -0,0 +1,46 @@ +use crate::utils::ReadUtils; +use aes::cipher::generic_array::GenericArray; +use aes::cipher::BlockEncrypt; +use std::io::{Read, Result as IoResult}; + +#[allow(dead_code)] +pub struct AesDecoder { + io: Io, + aes: Aes, + + counter: u128, + block: [u8; 16], + cursor: usize, +} + +impl AesDecoder { + pub fn new(mut io: Io, aes: Aes) -> IoResult { + let block = io.read_arr::<16>()?; + let mut decoder = Self { + io, + aes, + counter: 1, + block, + cursor: 0, + }; + decoder.decrypt_block(); + Ok(decoder) + } + + #[inline] + fn decrypt_block(&mut self) { + 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; + } +} + +impl Read for AesDecoder { + fn read(&mut self, buf: &mut [u8]) -> IoResult { + todo!() + } +} -- cgit v1.2.3