use crate::{VariableOutput, VariableOutputReset}; use core::fmt::Debug; /// Variable-output resettable digest test pub fn variable_reset_test(input: &[u8], output: &[u8]) -> Option<&'static str> where D: VariableOutputReset + Debug + Clone, { let mut hasher = D::new(output.len()).unwrap(); let mut buf = [0u8; 128]; let buf = &mut buf[..output.len()]; // Test that it works when accepting the message all at once hasher.update(input); let mut hasher2 = hasher.clone(); hasher.finalize_variable(buf).unwrap(); if buf != output { return Some("whole message"); } buf.iter_mut().for_each(|b| *b = 0); // Test if reset works correctly hasher2.reset(); hasher2.update(input); hasher2.finalize_variable_reset(buf).unwrap(); if buf != output { return Some("whole message after reset"); } buf.iter_mut().for_each(|b| *b = 0); // Test that it works when accepting the message in chunks for n in 1..core::cmp::min(17, input.len()) { let mut hasher = D::new(output.len()).unwrap(); for chunk in input.chunks(n) { hasher.update(chunk); hasher2.update(chunk); } hasher.finalize_variable(buf).unwrap(); if buf != output { return Some("message in chunks"); } buf.iter_mut().for_each(|b| *b = 0); hasher2.finalize_variable_reset(buf).unwrap(); if buf != output { return Some("message in chunks"); } buf.iter_mut().for_each(|b| *b = 0); } None } /// Variable-output resettable digest test pub fn variable_test(input: &[u8], output: &[u8]) -> Option<&'static str> where D: VariableOutput + Debug + Clone, { let mut hasher = D::new(output.len()).unwrap(); let mut buf = [0u8; 128]; let buf = &mut buf[..output.len()]; // Test that it works when accepting the message all at once hasher.update(input); hasher.finalize_variable(buf).unwrap(); if buf != output { return Some("whole message"); } buf.iter_mut().for_each(|b| *b = 0); // Test that it works when accepting the message in chunks for n in 1..core::cmp::min(17, input.len()) { let mut hasher = D::new(output.len()).unwrap(); for chunk in input.chunks(n) { hasher.update(chunk); } hasher.finalize_variable(buf).unwrap(); if buf != output { return Some("message in chunks"); } buf.iter_mut().for_each(|b| *b = 0); } None }