aboutsummaryrefslogtreecommitdiff
path: root/src/zip/encryption/aes.rs
diff options
context:
space:
mode:
Diffstat (limited to 'src/zip/encryption/aes.rs')
-rw-r--r--src/zip/encryption/aes.rs46
1 files changed, 46 insertions, 0 deletions
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 @@
1use crate::utils::ReadUtils;
2use aes::cipher::generic_array::GenericArray;
3use aes::cipher::BlockEncrypt;
4use std::io::{Read, Result as IoResult};
5
6#[allow(dead_code)]
7pub struct AesDecoder<Io: Read, Aes: BlockEncrypt> {
8 io: Io,
9 aes: Aes,
10
11 counter: u128,
12 block: [u8; 16],
13 cursor: usize,
14}
15
16impl<Io: Read, Aes: BlockEncrypt> AesDecoder<Io, Aes> {
17 pub fn new(mut io: Io, aes: Aes) -> IoResult<Self> {
18 let block = io.read_arr::<16>()?;
19 let mut decoder = Self {
20 io,
21 aes,
22 counter: 1,
23 block,
24 cursor: 0,
25 };
26 decoder.decrypt_block();
27 Ok(decoder)
28 }
29
30 #[inline]
31 fn decrypt_block(&mut self) {
32 let mut mask = self.counter.to_le_bytes();
33 self.aes
34 .encrypt_block(GenericArray::from_mut_slice(&mut mask));
35 for (b, m) in self.block.iter_mut().zip(mask) {
36 *b ^= m
37 }
38 self.counter += 1;
39 }
40}
41
42impl<Io: Read, Aes: BlockEncrypt> Read for AesDecoder<Io, Aes> {
43 fn read(&mut self, buf: &mut [u8]) -> IoResult<usize> {
44 todo!()
45 }
46}