@@ -40,9 +40,16 @@ pub fn compress(data []u8) ?[]u8 {
40
40
return result
41
41
}
42
42
43
+ [params]
44
+ pub struct DecompressParams {
45
+ verify_header_checksum bool = true
46
+ verify_length bool = true
47
+ verify_checksum bool = true
48
+ }
49
+
43
50
// decompresses an array of bytes using zlib and returns the decompressed bytes in a new array
44
51
// Example: decompressed := gzip.decompress(b)?
45
- pub fn decompress (data []u8 ) ? []u8 {
52
+ pub fn decompress (data []u8 , params DecompressParams ) ? []u8 {
46
53
if data.len < 18 {
47
54
return error ('data is too short, not gzip compressed?' )
48
55
} else if data[0 ] != 0x1f || data[1 ] != 0x8b {
@@ -91,7 +98,7 @@ pub fn decompress(data []u8) ?[]u8 {
91
98
checksum_header := crc32 .sum (data[..header_length])
92
99
checksum_header_expected := (u32 (data[header_length]) << 24 ) | (u32 (data[header_length + 1 ]) << 16 ) | (u32 (data[
93
100
header_length + 2 ]) << 8 ) | data[header_length + 3 ]
94
- if checksum_header != checksum_header_expected {
101
+ if params.verify_header_checksum && checksum_header != checksum_header_expected {
95
102
return error ('header checksum verification failed' )
96
103
}
97
104
header_length + = 4
@@ -102,12 +109,12 @@ pub fn decompress(data []u8) ?[]u8 {
102
109
103
110
decompressed := compress.decompress (data[header_length..data.len - 8 ], 0 )?
104
111
length_expected := (u32 (data[data.len - 4 ]) << 24 ) | (u32 (data[data.len - 3 ]) << 16 ) | (u32 (data[data.len - 2 ]) << 8 ) | data[data.len - 1 ]
105
- if decompressed.len != length_expected {
112
+ if params.verify_length && decompressed.len != length_expected {
106
113
return error ('length verification failed, got $decompressed.len , expected $length_expected ' )
107
114
}
108
115
checksum := crc32 .sum (decompressed)
109
116
checksum_expected := (u32 (data[data.len - 8 ]) << 24 ) | (u32 (data[data.len - 7 ]) << 16 ) | (u32 (data[data.len - 6 ]) << 8 ) | data[data.len - 5 ]
110
- if checksum != checksum_expected {
117
+ if params.verify_checksum && checksum != checksum_expected {
111
118
return error ('checksum verification failed' )
112
119
}
113
120
return decompressed
0 commit comments