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.rs | 89 --------------------------------------------------- 1 file changed, 89 deletions(-) delete mode 100644 src/zip/encryption.rs (limited to 'src/zip/encryption.rs') diff --git a/src/zip/encryption.rs b/src/zip/encryption.rs deleted file mode 100644 index f317245..0000000 --- a/src/zip/encryption.rs +++ /dev/null @@ -1,89 +0,0 @@ -use crate::utils::ReadUtils; -use crate::zip::{ZipError, ZipResult}; -use std::io::{Read, Result as IoResult}; - -const TABLE: [u32; 256] = generate_table(); - -const fn generate_table() -> [u32; 256] { - let mut table = [0; 256]; - - let mut i = 0; - while i <= 255 { - let mut t = i as u32; - - let mut j = 0; - while j < 8 { - if (t & 1) > 0 { - t = (t >> 1) ^ 0xEDB88320 - } else { - t >>= 1 - } - j += 1; - } - - table[i] = t; - i += 1 - } - - table -} - -fn crc32(byte: u8, crc: u32) -> u32 { - (crc >> 8) ^ TABLE[((crc & 0xFF) as u8 ^ byte) as usize] -} - -pub struct WeakDecoder { - key0: u32, - key1: u32, - key2: u32, - io: Io, -} - -impl WeakDecoder { - pub fn new(io: Io, check: u8, password: &[u8]) -> ZipResult { - let mut decoder = Self { - key0: 305419896, - key1: 591751049, - key2: 878082192, - io, - }; - - for c in password { - decoder.update_keys(*c) - } - - let buf = decoder.read_arr::<12>()?; - if check != buf[11] { - return Err(ZipError::IncorrectPassword.into()); - } - - Ok(decoder) - } - - fn update_keys(&mut self, byte: u8) { - self.key0 = crc32(byte, self.key0); - self.key1 = self - .key1 - .wrapping_add(self.key0 & 0xFF) - .wrapping_mul(134775813) - .wrapping_add(1); - self.key2 = crc32((self.key1 >> 24) as u8, self.key2); - } - - fn decode_byte(&mut self, byte: u8) -> u8 { - let key = self.key2 | 2; - let byte = byte ^ ((key.wrapping_mul(key ^ 1)) >> 8) as u8; - self.update_keys(byte); - byte - } -} - -impl Read for WeakDecoder { - fn read(&mut self, buf: &mut [u8]) -> IoResult { - let bytes = self.io.read(buf)?; - for i in 0..bytes { - buf[i] = self.decode_byte(buf[i]); - } - Ok(bytes) - } -} -- cgit v1.2.3