Add compression method to AES info
Signed-off-by: Johannes Löthberg <johannes.loethberg@elokon.com>
This commit is contained in:
parent
a17578990b
commit
80dc8f2484
2 changed files with 16 additions and 11 deletions
24
src/read.rs
24
src/read.rs
|
@ -238,7 +238,7 @@ pub(crate) fn make_crypto_reader<'a>(
|
||||||
using_data_descriptor: bool,
|
using_data_descriptor: bool,
|
||||||
reader: io::Take<&'a mut dyn Read>,
|
reader: io::Take<&'a mut dyn Read>,
|
||||||
password: Option<&[u8]>,
|
password: Option<&[u8]>,
|
||||||
aes_info: Option<(AesMode, AesVendorVersion)>,
|
aes_info: Option<(AesMode, AesVendorVersion, CompressionMethod)>,
|
||||||
#[cfg(feature = "aes-crypto")] compressed_size: u64,
|
#[cfg(feature = "aes-crypto")] compressed_size: u64,
|
||||||
) -> ZipResult<CryptoReader<'a>> {
|
) -> ZipResult<CryptoReader<'a>> {
|
||||||
#[allow(deprecated)]
|
#[allow(deprecated)]
|
||||||
|
@ -256,7 +256,7 @@ pub(crate) fn make_crypto_reader<'a>(
|
||||||
))
|
))
|
||||||
}
|
}
|
||||||
#[cfg(feature = "aes-crypto")]
|
#[cfg(feature = "aes-crypto")]
|
||||||
(Some(password), Some((aes_mode, vendor_version))) => {
|
(Some(password), Some((aes_mode, vendor_version, _))) => {
|
||||||
match AesReader::new(reader, aes_mode, compressed_size).validate(password)? {
|
match AesReader::new(reader, aes_mode, compressed_size).validate(password)? {
|
||||||
None => return Err(InvalidPassword),
|
None => return Err(InvalidPassword),
|
||||||
Some(r) => CryptoReader::Aes {
|
Some(r) => CryptoReader::Aes {
|
||||||
|
@ -996,7 +996,8 @@ fn parse_extra_field(file: &mut ZipFileData) -> ZipResult<()> {
|
||||||
let mut out = [0u8];
|
let mut out = [0u8];
|
||||||
reader.read_exact(&mut out)?;
|
reader.read_exact(&mut out)?;
|
||||||
let aes_mode = out[0];
|
let aes_mode = out[0];
|
||||||
let compression_method = reader.read_u16_le()?;
|
#[allow(deprecated)]
|
||||||
|
let compression_method = CompressionMethod::from_u16(reader.read_u16_le()?);
|
||||||
|
|
||||||
if vendor_id != 0x4541 {
|
if vendor_id != 0x4541 {
|
||||||
return Err(ZipError::InvalidArchive("Invalid AES vendor"));
|
return Err(ZipError::InvalidArchive("Invalid AES vendor"));
|
||||||
|
@ -1007,15 +1008,18 @@ fn parse_extra_field(file: &mut ZipFileData) -> ZipResult<()> {
|
||||||
_ => return Err(ZipError::InvalidArchive("Invalid AES vendor version")),
|
_ => return Err(ZipError::InvalidArchive("Invalid AES vendor version")),
|
||||||
};
|
};
|
||||||
match aes_mode {
|
match aes_mode {
|
||||||
0x01 => file.aes_mode = Some((AesMode::Aes128, vendor_version)),
|
0x01 => {
|
||||||
0x02 => file.aes_mode = Some((AesMode::Aes192, vendor_version)),
|
file.aes_mode = Some((AesMode::Aes128, vendor_version, compression_method))
|
||||||
0x03 => file.aes_mode = Some((AesMode::Aes256, vendor_version)),
|
}
|
||||||
|
0x02 => {
|
||||||
|
file.aes_mode = Some((AesMode::Aes192, vendor_version, compression_method))
|
||||||
|
}
|
||||||
|
0x03 => {
|
||||||
|
file.aes_mode = Some((AesMode::Aes256, vendor_version, compression_method))
|
||||||
|
}
|
||||||
_ => return Err(ZipError::InvalidArchive("Invalid AES encryption strength")),
|
_ => return Err(ZipError::InvalidArchive("Invalid AES encryption strength")),
|
||||||
};
|
};
|
||||||
file.compression_method = {
|
file.compression_method = compression_method;
|
||||||
#[allow(deprecated)]
|
|
||||||
CompressionMethod::from_u16(compression_method)
|
|
||||||
};
|
|
||||||
}
|
}
|
||||||
0x5455 => {
|
0x5455 => {
|
||||||
// extended timestamp
|
// extended timestamp
|
||||||
|
|
|
@ -48,6 +48,7 @@ mod atomic {
|
||||||
|
|
||||||
use crate::extra_fields::ExtraField;
|
use crate::extra_fields::ExtraField;
|
||||||
use crate::result::DateTimeRangeError;
|
use crate::result::DateTimeRangeError;
|
||||||
|
use crate::CompressionMethod;
|
||||||
#[cfg(feature = "time")]
|
#[cfg(feature = "time")]
|
||||||
use time::{error::ComponentRange, Date, Month, OffsetDateTime, PrimitiveDateTime, Time};
|
use time::{error::ComponentRange, Date, Month, OffsetDateTime, PrimitiveDateTime, Time};
|
||||||
|
|
||||||
|
@ -362,7 +363,7 @@ pub struct ZipFileData {
|
||||||
/// Reserve local ZIP64 extra field
|
/// Reserve local ZIP64 extra field
|
||||||
pub large_file: bool,
|
pub large_file: bool,
|
||||||
/// AES mode if applicable
|
/// AES mode if applicable
|
||||||
pub aes_mode: Option<(AesMode, AesVendorVersion)>,
|
pub aes_mode: Option<(AesMode, AesVendorVersion, CompressionMethod)>,
|
||||||
|
|
||||||
/// extra fields, see <https://libzip.org/specifications/extrafld.txt>
|
/// extra fields, see <https://libzip.org/specifications/extrafld.txt>
|
||||||
pub extra_fields: Vec<ExtraField>,
|
pub extra_fields: Vec<ExtraField>,
|
||||||
|
|
Loading…
Add table
Reference in a new issue