|
1 | 1 | use bash_prg_hash::{BashPrgHash1282, BashPrgHash1921, BashPrgHash2562}; |
2 | | -use digest::ExtendableOutput; |
3 | | -use digest::dev::xof_reset_test; |
| 2 | +use digest::dev::TestVector; |
| 3 | +use digest::{ExtendableOutput, XofReader}; |
4 | 4 | use hex_literal::hex; |
| 5 | +use std::fmt::Debug; |
| 6 | + |
| 7 | +pub fn xof_test<D: ExtendableOutput + Default + Debug + Clone>( |
| 8 | + &TestVector { input, output }: &TestVector, |
| 9 | +) -> Result<(), &'static str> { |
| 10 | + let mut hasher = D::default(); |
| 11 | + let mut buf = [0u8; 1024]; |
| 12 | + let buf = &mut buf[..output.len()]; |
| 13 | + |
| 14 | + // Test that it works when accepting the message all at once |
| 15 | + hasher.update(input); |
| 16 | + hasher.finalize_xof().read(buf); |
| 17 | + if buf != output { |
| 18 | + return Err("whole message"); |
| 19 | + } |
| 20 | + buf.iter_mut().for_each(|b| *b = 0); |
| 21 | + |
| 22 | + // Test with fresh hasher |
| 23 | + let mut hasher = D::default(); |
| 24 | + hasher.update(input); |
| 25 | + hasher.finalize_xof().read(buf); |
| 26 | + if buf != output { |
| 27 | + return Err("whole message after reset"); |
| 28 | + } |
| 29 | + buf.iter_mut().for_each(|b| *b = 0); |
| 30 | + |
| 31 | + // Test that it works when accepting the message in chunks |
| 32 | + for n in 1..core::cmp::min(17, input.len()) { |
| 33 | + let mut hasher = D::default(); |
| 34 | + let mut hasher2 = D::default(); |
| 35 | + for chunk in input.chunks(n) { |
| 36 | + hasher.update(chunk); |
| 37 | + hasher2.update(chunk); |
| 38 | + } |
| 39 | + hasher.finalize_xof().read(buf); |
| 40 | + if buf != output { |
| 41 | + return Err("message in chunks"); |
| 42 | + } |
| 43 | + buf.iter_mut().for_each(|b| *b = 0); |
| 44 | + |
| 45 | + hasher2.finalize_xof().read(buf); |
| 46 | + if buf != output { |
| 47 | + return Err("message in chunks"); |
| 48 | + } |
| 49 | + buf.iter_mut().for_each(|b| *b = 0); |
| 50 | + } |
| 51 | + |
| 52 | + Ok(()) |
| 53 | +} |
5 | 54 |
|
6 | 55 | // Test vectors from STB 34.101.77-2020 (Appendix A, Table A.5) |
7 | | -digest::new_test!(bashprg1282, BashPrgHash1282, xof_reset_test); |
8 | | -digest::new_test!(bashprg1921, BashPrgHash1921, xof_reset_test); |
| 56 | +digest::new_test!(bashprg1282, BashPrgHash1282, xof_test); |
| 57 | +digest::new_test!(bashprg1921, BashPrgHash1921, xof_test); |
9 | 58 | // Not in STB 34.101.77-2020, but included for completeness |
10 | | -digest::new_test!(bashprg2562, BashPrgHash2562, xof_reset_test); |
| 59 | +digest::new_test!(bashprg2562, BashPrgHash2562, xof_test); |
11 | 60 |
|
12 | 61 | macro_rules! test_bash_prg_rand { |
13 | 62 | ($name:ident, $hasher:ty, $expected:expr) => { |
|
0 commit comments