test: Fix bugs involving AES encryption
This commit is contained in:
parent
c0fd504771
commit
499bd65f71
2 changed files with 13 additions and 6 deletions
|
@ -1215,8 +1215,10 @@ pub(crate) fn parse_extra_field(file: &mut ZipFileData) -> ZipResult<()> {
|
||||||
let mut reader = io::Cursor::new(extra_field);
|
let mut reader = io::Cursor::new(extra_field);
|
||||||
|
|
||||||
/* TODO: codify this structure into Zip64ExtraFieldBlock fields! */
|
/* TODO: codify this structure into Zip64ExtraFieldBlock fields! */
|
||||||
while (reader.position() as usize) < len {
|
let mut position = reader.position();
|
||||||
parse_single_extra_field(file, &mut reader)?;
|
while (position as usize) < len {
|
||||||
|
parse_single_extra_field(file, &mut reader, position)?;
|
||||||
|
position = reader.position();
|
||||||
}
|
}
|
||||||
Ok(())
|
Ok(())
|
||||||
}
|
}
|
||||||
|
@ -1224,6 +1226,7 @@ pub(crate) fn parse_extra_field(file: &mut ZipFileData) -> ZipResult<()> {
|
||||||
pub(crate) fn parse_single_extra_field<R: Read>(
|
pub(crate) fn parse_single_extra_field<R: Read>(
|
||||||
file: &mut ZipFileData,
|
file: &mut ZipFileData,
|
||||||
reader: &mut R,
|
reader: &mut R,
|
||||||
|
bytes_already_read: u64,
|
||||||
) -> ZipResult<()> {
|
) -> ZipResult<()> {
|
||||||
let kind = reader.read_u16_le()?;
|
let kind = reader.read_u16_le()?;
|
||||||
let len = reader.read_u16_le()?;
|
let len = reader.read_u16_le()?;
|
||||||
|
@ -1271,6 +1274,7 @@ pub(crate) fn parse_single_extra_field<R: Read>(
|
||||||
_ => return Err(ZipError::InvalidArchive("Invalid AES encryption strength")),
|
_ => return Err(ZipError::InvalidArchive("Invalid AES encryption strength")),
|
||||||
};
|
};
|
||||||
file.compression_method = compression_method;
|
file.compression_method = compression_method;
|
||||||
|
file.aes_extra_data_start = bytes_already_read;
|
||||||
}
|
}
|
||||||
0x5455 => {
|
0x5455 => {
|
||||||
// extended timestamp
|
// extended timestamp
|
||||||
|
|
11
src/write.rs
11
src/write.rs
|
@ -4,8 +4,7 @@
|
||||||
use crate::aes::AesWriter;
|
use crate::aes::AesWriter;
|
||||||
use crate::compression::CompressionMethod;
|
use crate::compression::CompressionMethod;
|
||||||
use crate::read::{
|
use crate::read::{
|
||||||
find_content, parse_extra_field, parse_single_extra_field, Config, ZipArchive, ZipFile,
|
find_content, parse_single_extra_field, Config, ZipArchive, ZipFile, ZipFileReader,
|
||||||
ZipFileReader,
|
|
||||||
};
|
};
|
||||||
use crate::result::{ZipError, ZipResult};
|
use crate::result::{ZipError, ZipResult};
|
||||||
use crate::spec::{self, FixedSizeBlock, Magic};
|
use crate::spec::{self, FixedSizeBlock, Magic};
|
||||||
|
@ -351,7 +350,7 @@ impl ExtendedFileOptions {
|
||||||
}
|
}
|
||||||
data.seek(SeekFrom::Current(-2))?;
|
data.seek(SeekFrom::Current(-2))?;
|
||||||
}
|
}
|
||||||
parse_single_extra_field(&mut ZipFileData::default(), &mut data)?;
|
parse_single_extra_field(&mut ZipFileData::default(), &mut data, 0)?;
|
||||||
}
|
}
|
||||||
Ok(())
|
Ok(())
|
||||||
}
|
}
|
||||||
|
@ -874,6 +873,7 @@ impl<W: Write + Seek> ZipWriter<W> {
|
||||||
if let Some(EncryptWith::Aes { mode, .. }) = options.encrypt_with {
|
if let Some(EncryptWith::Aes { mode, .. }) = options.encrypt_with {
|
||||||
let aes_dummy_extra_data =
|
let aes_dummy_extra_data =
|
||||||
vec![0x02, 0x00, 0x41, 0x45, mode as u8, 0x00, 0x00].into_boxed_slice();
|
vec![0x02, 0x00, 0x41, 0x45, mode as u8, 0x00, 0x00].into_boxed_slice();
|
||||||
|
aes_extra_data_start = extensions.extra_data.len() as u64;
|
||||||
extensions.add_extra_data(0x9901, aes_dummy_extra_data, false)?;
|
extensions.add_extra_data(0x9901, aes_dummy_extra_data, false)?;
|
||||||
}
|
}
|
||||||
{
|
{
|
||||||
|
@ -898,7 +898,6 @@ impl<W: Write + Seek> ZipWriter<W> {
|
||||||
aes_mode,
|
aes_mode,
|
||||||
&extensions.extra_data,
|
&extensions.extra_data,
|
||||||
);
|
);
|
||||||
parse_extra_field(&mut file)?;
|
|
||||||
file.version_made_by = file.version_made_by.max(file.version_needed() as u8);
|
file.version_made_by = file.version_made_by.max(file.version_needed() as u8);
|
||||||
let index = self.insert_file_data(file)?;
|
let index = self.insert_file_data(file)?;
|
||||||
let file = &mut self.files[index];
|
let file = &mut self.files[index];
|
||||||
|
@ -943,6 +942,10 @@ impl<W: Write + Seek> ZipWriter<W> {
|
||||||
extensions.add_extra_data(0xa11e, pad_body.into_boxed_slice(), false)?;
|
extensions.add_extra_data(0xa11e, pad_body.into_boxed_slice(), false)?;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
extensions.validate_extra_data()?;
|
||||||
|
if extensions.central_extra_data.len() > 0 {
|
||||||
|
file.central_extra_field = Some(extensions.central_extra_data);
|
||||||
|
}
|
||||||
writer.write_all(&extensions.extra_data)?;
|
writer.write_all(&extensions.extra_data)?;
|
||||||
extra_data_end = writer.stream_position()?;
|
extra_data_end = writer.stream_position()?;
|
||||||
debug_assert_eq!(extra_data_end % (options.alignment.max(1) as u64), 0);
|
debug_assert_eq!(extra_data_end % (options.alignment.max(1) as u64), 0);
|
||||||
|
|
Loading…
Add table
Reference in a new issue