diff --git a/apk_frauder/src/zip_writer.rs b/apk_frauder/src/zip_writer.rs index 5faf7cd..18e9fbe 100644 --- a/apk_frauder/src/zip_writer.rs +++ b/apk_frauder/src/zip_writer.rs @@ -77,9 +77,10 @@ impl ZipFileWriter { assert!( header.general_purpose_flags & (general_purpose_flags::MASK_COMPRESS_OPTION_1 - | general_purpose_flags::MASK_COMPRESS_OPTION_2 - | general_purpose_flags::MASK_UTF8_FILENAME) + | general_purpose_flags::MASK_COMPRESS_OPTION_2) == 0 + || header.compression_method == CompressionMethod::Deflated + || header.compression_method == CompressionMethod::Stored ); assert!( header.compression_method == CompressionMethod::Deflated @@ -100,9 +101,10 @@ impl ZipFileWriter { assert!( header.general_purpose_flags & (general_purpose_flags::MASK_COMPRESS_OPTION_1 - | general_purpose_flags::MASK_COMPRESS_OPTION_2 - | general_purpose_flags::MASK_UTF8_FILENAME) + | general_purpose_flags::MASK_COMPRESS_OPTION_2) == 0 + || header.compression_method == CompressionMethod::Deflated + || header.compression_method == CompressionMethod::Stored ); assert!( header.compression_method == CompressionMethod::Deflated @@ -168,9 +170,17 @@ impl ZipFileWriter { CompressionMethod::Deflated => { // TODO: find a way to do this in place, the compressed data can be large, and storing it // in memory is bad, but Deflate consume the Reader, so we cannot juste give it self.data - // TODO: Compression::default -> use flag? - let mut compressor = - CrcWriter::new(DeflateEncoder::new(Vec::new(), Compression::default())); + let option = match header.general_purpose_flags + & (general_purpose_flags::MASK_COMPRESS_OPTION_1 + | general_purpose_flags::MASK_COMPRESS_OPTION_2) + { + 0b000 => Compression::default(), + 0b010 => Compression::best(), + 0b100 => Compression::fast(), + 0b110 => panic!("Super Fast deflate compression not supported"), + flag => panic!("Something is verry wrong: {flag:b}"), + }; + let mut compressor = CrcWriter::new(DeflateEncoder::new(Vec::new(), option)); io::copy(file, &mut compressor).unwrap(); local_header.crc_32 = compressor.crc().sum(); compressor.into_inner().finish().unwrap() @@ -188,12 +198,6 @@ impl ZipFileWriter { header.set_uncompressed_size(local_header.get_uncompressed_size()); header.set_offset_local_header(header_offset); - // TODO: compression flags are not used right now, set to zero - local_header.general_purpose_flags &= !(general_purpose_flags::MASK_COMPRESS_OPTION_1 - | general_purpose_flags::MASK_COMPRESS_OPTION_2); - header.general_purpose_flags &= !(general_purpose_flags::MASK_COMPRESS_OPTION_1 - | general_purpose_flags::MASK_COMPRESS_OPTION_2); - if data_descriptor.is_some() { panic!("Writing file with data_descriptor is not yet implemented"); }