Skip to content

Commit 43682f0

Browse files
committed
Introduce zipx encryption handling for bzip2 compressed zip files
1 parent 26256df commit 43682f0

5 files changed

Lines changed: 1640 additions & 0 deletions

Makefile.am

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1121,6 +1121,7 @@ libarchive_test_EXTRA_DIST=\
11211121
libarchive/test/test_read_format_zip_winzip_aes128.zip.uu \
11221122
libarchive/test/test_read_format_zip_winzip_aes256.zip.uu \
11231123
libarchive/test/test_read_format_zip_winzip_aes256_large.zip.uu \
1124+
libarchive/test/test_read_format_zip_winzip_aes256_large_bzip2.zip.uu \
11241125
libarchive/test/test_read_format_zip_winzip_aes256_large_lzma.zip.uu \
11251126
libarchive/test/test_read_format_zip_winzip_aes256_large_ppmd.zip.uu \
11261127
libarchive/test/test_read_format_zip_winzip_aes256_large_xz.zip.uu \

libarchive/archive_read_support_format_zip.c

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2542,6 +2542,7 @@ zip_read_data_zipx_bzip2(struct archive_read *a, const void **buff,
25422542
struct zip *zip = (struct zip *)(a->format->data);
25432543
ssize_t bytes_avail = 0, in_bytes, to_consume;
25442544
const void *compressed_buff;
2545+
const void *sp;
25452546
int r;
25462547
uint64_t total_out;
25472548

@@ -2574,6 +2575,9 @@ zip_read_data_zipx_bzip2(struct archive_read *a, const void **buff,
25742575
return (ARCHIVE_FATAL);
25752576
}
25762577

2578+
zip_read_decrypt(zip, compressed_buff, in_bytes,
2579+
&compressed_buff, &in_bytes, &sp);
2580+
25772581
/* Setup buffer boundaries. */
25782582
zip->bzstream.next_in = (char*)(uintptr_t) compressed_buff;
25792583
zip->bzstream.avail_in = (uint32_t)in_bytes;
@@ -2624,6 +2628,14 @@ zip_read_data_zipx_bzip2(struct archive_read *a, const void **buff,
26242628
zip->entry_compressed_bytes_read += to_consume;
26252629
zip->entry_uncompressed_bytes_read += total_out;
26262630

2631+
zip_read_decrypt_update(zip, to_consume, sp);
2632+
2633+
if (zip->end_of_entry && zip->hctx_valid) {
2634+
r = check_authentication_code(a, NULL);
2635+
if (r != ARCHIVE_OK)
2636+
return r;
2637+
}
2638+
26272639
/* Give libarchive its due. */
26282640
*size = (size_t)total_out;
26292641
*buff = zip->uncompressed_buffer;

0 commit comments

Comments
 (0)