1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
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: Read, Aes: BlockEncrypt> {
io: Io,
aes: Aes,
counter: u128,
block: [u8; 16],
cursor: usize,
}
impl<Io: Read, Aes: BlockEncrypt> AesDecoder<Io, Aes> {
pub fn new(mut io: Io, aes: Aes) -> IoResult<Self> {
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<Io: Read, Aes: BlockEncrypt> Read for AesDecoder<Io, Aes> {
fn read(&mut self, buf: &mut [u8]) -> IoResult<usize> {
todo!()
}
}
|