summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJack O'Connor <oconnor663@gmail.com>2023-05-28 13:02:48 -0700
committerJack O'Connor <oconnor663@gmail.com>2024-08-15 16:02:10 -0700
commiteb15bce0f1443b07fc45f151a72c840c19c4b2ae (patch)
treeb48e97bb6bce1ac2eb090d18a93abca7eecd5b63
parentcfb305d0ab8e20d40a555f5241e29e0f5db06917 (diff)
test_fuzz_xof
-rw-r--r--src/test.rs36
1 files changed, 36 insertions, 0 deletions
diff --git a/src/test.rs b/src/test.rs
index 39dfe46..6ce2e50 100644
--- a/src/test.rs
+++ b/src/test.rs
@@ -520,6 +520,42 @@ fn test_fuzz_hasher() {
}
#[test]
+fn test_fuzz_xof() {
+ let mut input_buf = [0u8; 3 * BLOCK_LEN];
+ paint_test_input(&mut input_buf);
+
+ // Don't do too many iterations in debug mode, to keep the tests under a
+ // second or so. CI should run tests in release mode also. Provide an
+ // environment variable for specifying a larger number of fuzz iterations.
+ let num_tests = if cfg!(debug_assertions) { 100 } else { 2500 };
+
+ // Use a fixed RNG seed for reproducibility.
+ let mut rng = rand_chacha::ChaCha8Rng::from_seed([1; 32]);
+ for _num_test in 0..num_tests {
+ #[cfg(feature = "std")]
+ dbg!(_num_test);
+ // 31 (16 + 8 + 4 + 2 + 1) outputs
+ let mut output_buf = [0; 31 * CHUNK_LEN];
+ let input_len = rng.gen_range(0..input_buf.len());
+ let mut xof = crate::Hasher::new()
+ .update(&input_buf[..input_len])
+ .finalize_xof();
+ let partial_start = rng.gen_range(0..output_buf.len());
+ let partial_end = rng.gen_range(partial_start..output_buf.len());
+ xof.fill(&mut output_buf[..partial_start]);
+ xof.fill(&mut output_buf[partial_start..partial_end]);
+ xof.fill(&mut output_buf[partial_end..]);
+
+ let mut reference_buf = [0; 31 * CHUNK_LEN];
+ let mut reference_hasher = reference_impl::Hasher::new();
+ reference_hasher.update(&input_buf[..input_len]);
+ reference_hasher.finalize(&mut reference_buf);
+
+ assert_eq!(reference_buf, output_buf);
+ }
+}
+
+#[test]
fn test_xof_seek() {
let mut out = [0; 533];
let mut hasher = crate::Hasher::new();