Skip to content

Commit 1107c9d

Browse files
committed
Add support for fuzzing using libFuzzer
1 parent 9c697ab commit 1107c9d

17 files changed

+447
-0
lines changed

README.md

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -474,6 +474,12 @@ In theory, much of the "heavy lifting" has been done, so it should be possible t
474474

475475
PRs welcome!
476476

477+
## Memory Safety
478+
479+
Given the heavy use of hardware intrinsics, this crate uses a decent amount of `unsafe` code.
480+
481+
To help ensure memory safety, this crate is validated using [Miri](https://github.com/rust-lang/miri) on `x86_64` as well as fuzz tested using [libFuzzer](https://github.com/rust-fuzz/libfuzzer) over millions of iterations.
482+
477483
## References
478484

479485
* [Catalogue of parametrised CRC algorithms](https://reveng.sourceforge.io/crc-catalogue/all.htm)

fuzz/.gitignore

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
target
2+
corpus
3+
artifacts
4+
coverage

fuzz/Cargo.lock

Lines changed: 184 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

fuzz/Cargo.toml

Lines changed: 98 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,98 @@
1+
[package]
2+
name = "crc-fast-rust-fuzz"
3+
version = "0.1.0"
4+
publish = false
5+
edition = "2021"
6+
7+
[package.metadata]
8+
cargo-fuzz = true
9+
10+
[dependencies]
11+
libfuzzer-sys = "0.4"
12+
13+
[dependencies.crc-fast]
14+
path = ".."
15+
16+
[[bin]]
17+
name = "digest_crc32_autosar"
18+
path = "fuzz_targets/digest_crc32_autosar.rs"
19+
test = false
20+
doc = false
21+
bench = false
22+
23+
[[bin]]
24+
name = "digest_crc32_bzip2"
25+
path = "fuzz_targets/digest_crc32_bzip2.rs"
26+
test = false
27+
doc = false
28+
bench = false
29+
30+
[[bin]]
31+
name = "digest_crc32_iscsi"
32+
path = "fuzz_targets/digest_crc32_iscsi.rs"
33+
test = false
34+
doc = false
35+
bench = false
36+
37+
[[bin]]
38+
name = "digest_crc32_iso_hdlc"
39+
path = "fuzz_targets/digest_crc32_iso_hdlc.rs"
40+
test = false
41+
doc = false
42+
bench = false
43+
44+
[[bin]]
45+
name = "digest_crc64_ecma_182"
46+
path = "fuzz_targets/digest_crc64_ecma_182.rs"
47+
test = false
48+
doc = false
49+
bench = false
50+
51+
[[bin]]
52+
name = "digest_crc64_nvme"
53+
path = "fuzz_targets/digest_crc64_nvme.rs"
54+
test = false
55+
doc = false
56+
bench = false
57+
58+
[[bin]]
59+
name = "checksum_crc32_autosar"
60+
path = "fuzz_targets/checksum_crc32_autosar.rs"
61+
test = false
62+
doc = false
63+
bench = false
64+
65+
[[bin]]
66+
name = "checksum_crc32_bzip2"
67+
path = "fuzz_targets/checksum_crc32_bzip2.rs"
68+
test = false
69+
doc = false
70+
bench = false
71+
72+
[[bin]]
73+
name = "checksum_crc32_iscsi"
74+
path = "fuzz_targets/checksum_crc32_iscsi.rs"
75+
test = false
76+
doc = false
77+
bench = false
78+
79+
[[bin]]
80+
name = "checksum_crc32_iso_hdlc"
81+
path = "fuzz_targets/checksum_crc32_iso_hdlc.rs"
82+
test = false
83+
doc = false
84+
bench = false
85+
86+
[[bin]]
87+
name = "checksum_crc64_ecma_182"
88+
path = "fuzz_targets/checksum_crc64_ecma_182.rs"
89+
test = false
90+
doc = false
91+
bench = false
92+
93+
[[bin]]
94+
name = "checksum_crc64_nvme"
95+
path = "fuzz_targets/checksum_crc64_nvme.rs"
96+
test = false
97+
doc = false
98+
bench = false
Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
//! Fuzz target for CRC-32/AUTOSAR checksum calculation, which is a reflected variant.
2+
3+
#![no_main]
4+
5+
use crc_fast::{CrcAlgorithm, checksum};
6+
use libfuzzer_sys::fuzz_target;
7+
8+
fuzz_target!(|data: &[u8]| {
9+
checksum(CrcAlgorithm::Crc32Autosar, data);
10+
});
Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
//! Fuzz target for CRC-32/BZIP2 checksum calculation, which is a forward variant.
2+
3+
#![no_main]
4+
5+
use crc_fast::{CrcAlgorithm, checksum};
6+
use libfuzzer_sys::fuzz_target;
7+
8+
fuzz_target!(|data: &[u8]| {
9+
checksum(CrcAlgorithm::Crc32Bzip2, data);
10+
});
Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
//! Fuzz target for CRC-32/ISCSI checksum calculation, which is a reflected variant which can use
2+
//! fusion techniques on x86 and aarch64 architectures.
3+
4+
#![no_main]
5+
6+
use crc_fast::{CrcAlgorithm, checksum};
7+
use libfuzzer_sys::fuzz_target;
8+
9+
fuzz_target!(|data: &[u8]| {
10+
checksum(CrcAlgorithm::Crc32Iscsi, data);
11+
});
Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
//! Fuzz target for CRC-32/ISO-HDLC checksum calculation, which is a reflected variant which can use
2+
//! fusion techniques on aarch64 architectures.
3+
4+
#![no_main]
5+
6+
use crc_fast::{CrcAlgorithm, checksum};
7+
use libfuzzer_sys::fuzz_target;
8+
9+
fuzz_target!(|data: &[u8]| {
10+
checksum(CrcAlgorithm::Crc32IsoHdlc, data);
11+
});
Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
//! Fuzz target for CRC-64/ECMA-182 checksum calculation, which is a forward variant.
2+
3+
#![no_main]
4+
5+
use crc_fast::{CrcAlgorithm, checksum};
6+
use libfuzzer_sys::fuzz_target;
7+
8+
fuzz_target!(|data: &[u8]| {
9+
checksum(CrcAlgorithm::Crc64Ecma182, data);
10+
});
Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
//! Fuzz target for CRC-64/NVME checksum calculation, which is a reflected variant.
2+
3+
#![no_main]
4+
5+
use crc_fast::{CrcAlgorithm, checksum};
6+
use libfuzzer_sys::fuzz_target;
7+
8+
fuzz_target!(|data: &[u8]| {
9+
checksum(CrcAlgorithm::Crc64Nvme, data);
10+
});

0 commit comments

Comments
 (0)