aboutsummaryrefslogtreecommitdiff
path: root/src/zip/encryption/aes.rs
diff options
context:
space:
mode:
authorIgor Tolmachev <me@igorek.dev>2024-07-20 16:52:39 +0900
committerIgor Tolmachev <me@igorek.dev>2024-07-20 16:52:39 +0900
commit7bcdc3b4ca460aec2b98fb2dca6165788c562b05 (patch)
tree63f9616fc1b7f9ca6e414a4d32910720e155690c /src/zip/encryption/aes.rs
parent5f4ceda88c7299deb317f8d22a99ab2521c5a380 (diff)
downloadarchivator-7bcdc3b4ca460aec2b98fb2dca6165788c562b05.tar.gz
archivator-7bcdc3b4ca460aec2b98fb2dca6165788c562b05.zip
Partial aes implementation and others improvements
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}