From cc18a545a87ca616f05114d174690e5cc9614669 Mon Sep 17 00:00:00 2001 From: Igor Tolmachev Date: Tue, 16 Jul 2024 17:24:33 +0900 Subject: Optimize encryption - Add archive for testing encryption of compressed files - Implement incorrect password check - Use custom crc32 function --- src/zip/file/info.rs | 16 ++++++++++------ 1 file changed, 10 insertions(+), 6 deletions(-) (limited to 'src/zip/file/info.rs') diff --git a/src/zip/file/info.rs b/src/zip/file/info.rs index f5d4d8a..599dcc3 100644 --- a/src/zip/file/info.rs +++ b/src/zip/file/info.rs @@ -2,7 +2,7 @@ use crate::driver::ArchiveFileInfo; use crate::zip::{ZipError, ZipResult}; use chrono::{DateTime, Local}; -#[derive(Debug, PartialEq, Eq, Clone, Copy)] +#[derive(Debug, PartialEq, Eq, Clone)] pub enum CompressionMethod { Store, Deflate, @@ -28,18 +28,22 @@ impl CompressionMethod { } } -#[derive(Debug, PartialEq, Eq, Clone, Copy)] +#[derive(Debug, PartialEq, Eq, Clone)] pub enum EncryptionMethod { None, - Weak, + Weak(u8), Unsupported, } impl EncryptionMethod { - pub(crate) fn from_bit_flag(bit_flag: BitFlag) -> EncryptionMethod { + pub(crate) fn from_bif_flag(bit_flag: BitFlag, crc: u32, dos_time: u16) -> EncryptionMethod { match (bit_flag.is_encrypted(), bit_flag.is_strong_encryption()) { (false, false) => EncryptionMethod::None, - (true, false) => EncryptionMethod::Weak, + (true, false) => EncryptionMethod::Weak(if bit_flag.is_has_data_descriptor() { + (dos_time >> 8) as u8 // Info-ZIP modification + } else { + (crc >> 24) as u8 + }), (true, true) => EncryptionMethod::Unsupported, _ => panic!("impossible"), } @@ -52,7 +56,7 @@ pub struct BitFlag { } pub mod bit { - #[derive(Debug, PartialEq, Eq, Clone, Copy)] + #[derive(Debug, PartialEq, Eq, Clone)] pub enum DeflateMode { Normal, Maximum, -- cgit v1.2.3