|
5 | 5 |
|
6 | 6 | use libfuzzer_sys::fuzz_target; |
7 | 7 |
|
8 | | -fuzz_target!(|input: (Vec<u8>, u32)| { |
9 | | - let (input, start) = input; |
| 8 | +const BASE: u32 = 65521; |
| 9 | + |
| 10 | +fn adler32_scalar(start: u32, data: &[u8]) -> u32 { |
| 11 | + let mut s1 = start & 0xffff; |
| 12 | + let mut s2 = (start >> 16) & 0xffff; |
| 13 | + for &b in data { |
| 14 | + s1 = (s1 + b as u32) % BASE; |
| 15 | + s2 = (s2 + s1) % BASE; |
| 16 | + } |
| 17 | + (s2 << 16) | s1 |
| 18 | +} |
| 19 | + |
| 20 | +fuzz_target!(|input: (Vec<u8>, u8, u32)| { |
| 21 | + let (input, offset, start) = input; |
| 22 | + |
| 23 | + // Add an offset to the input because some of the checksum algorithms are sensitive to |
| 24 | + // alignment. |
| 25 | + let Some(input) = input.get(usize::from(offset)..) else { |
| 26 | + return; |
| 27 | + }; |
10 | 28 |
|
11 | 29 | { |
12 | 30 | let expected = { |
13 | 31 | let mut h = crc32fast::Hasher::new_with_initial(start); |
14 | | - h.update(&input[..]); |
| 32 | + h.update(input); |
15 | 33 | h.finalize() |
16 | 34 | }; |
17 | 35 |
|
18 | | - let actual = zlib_rs::crc32::crc32(start, input.as_slice()); |
| 36 | + let actual = zlib_rs::crc32::crc32(start, input); |
19 | 37 |
|
20 | 38 | assert_eq!(expected, actual); |
21 | 39 | } |
@@ -53,11 +71,18 @@ fuzz_target!(|input: (Vec<u8>, u32)| { |
53 | 71 | assert_eq!(combine1, combine2); |
54 | 72 | } |
55 | 73 |
|
| 74 | + { |
| 75 | + use zlib_rs::adler32::adler32; |
| 76 | + assert_eq!(adler32(start, &input), adler32_scalar(start, &input)); |
| 77 | + } |
| 78 | + |
56 | 79 | { |
57 | 80 | use zlib_rs::adler32::{adler32, adler32_combine}; |
58 | 81 |
|
59 | 82 | let data = &input; |
60 | 83 |
|
| 84 | + assert_eq!(adler32(start, data), adler32_scalar(start, data)); |
| 85 | + |
61 | 86 | let Some(buf_len) = data.first().copied() else { |
62 | 87 | return; |
63 | 88 | }; |
|
0 commit comments