diff --git a/hashers/src/blake/blake256.rs b/hashers/src/blake/blake256.rs index 92fe3a6f..8fe835bd 100644 --- a/hashers/src/blake/blake256.rs +++ b/hashers/src/blake/blake256.rs @@ -129,10 +129,7 @@ impl StatefulHasher for Blake224 { .collect_vec() } - fn hash(mut self, bytes: &[u8]) -> Vec { - self.update(bytes); - self.finalize() - } + crate::stateful_hash_helpers!(); } #[derive(Debug, Clone)] @@ -217,10 +214,7 @@ impl StatefulHasher for Blake256 { .collect_vec() } - fn hash(mut self, bytes: &[u8]) -> Vec { - self.update(bytes); - self.finalize() - } + crate::stateful_hash_helpers!(); } crate::stateful_hash_tests!( diff --git a/hashers/src/blake/blake2b.rs b/hashers/src/blake/blake2b.rs index fa2e84ef..e4144ff8 100644 --- a/hashers/src/blake/blake2b.rs +++ b/hashers/src/blake/blake2b.rs @@ -192,16 +192,11 @@ impl StatefulHasher for Blake2b { .collect_vec() } - fn hash(mut self, bytes: &[u8]) -> Vec { - self.update(bytes); - self.finalize() - } + crate::stateful_hash_helpers!(); } #[cfg(test)] mod blake2b_stests { - use utils::byte_formatting::hex_to_bytes_ltr; - use super::*; const KEY: &[u8] = &[ @@ -232,45 +227,27 @@ mod blake2b_stests { 0xf0, 0xf1, 0xf2, 0xf3, 0xf4, 0xf5, 0xf6, 0xf7, 0xf8, 0xf9, 0xfa, 0xfb, 0xfc, 0xfd, 0xfe, ]; - // crate::incremental_hash_tests!( - // with_key, Blake2b::init(KEY, 64), - // [ - // &MSG[..13], - // &MSG[13..148], - // &MSG[148..], - // ], - // "142709d62e28fcccd0af97fad0f8465b971e82201dc51070faa0372aa43e92484be1c1e73ba10906d5d1853db6a4106e0a7bf9800d373d6dee2d46d62ef2a461"; - - // abc, Blake2b::init_hash_512(), - // [ - // [0x61], - // [0x62], - // [0x63], - // ], - // "ba80a53f981c4d0d6a2797b69f12f6e94c212f14685ac4b74b12bb6fdbffa2d17d87c5392aab792dc252d5de4533cc9518d38aa8dbf1925ab92386edd4009923"; - // ); + crate::incremental_hash_tests!( + with_key, Blake2b::init(KEY, 64), + &[ + &MSG[..13], + &MSG[13..148], + &MSG[148..], + ], + "142709d62e28fcccd0af97fad0f8465b971e82201dc51070faa0372aa43e92484be1c1e73ba10906d5d1853db6a4106e0a7bf9800d373d6dee2d46d62ef2a461"; + + abc, Blake2b::init_hash_512(), + &[ + &[0x61], + &[0x62], + &[0x63], + ], + "ba80a53f981c4d0d6a2797b69f12f6e94c212f14685ac4b74b12bb6fdbffa2d17d87c5392aab792dc252d5de4533cc9518d38aa8dbf1925ab92386edd4009923"; + ); crate::stateful_hash_tests!( empty, Blake2b::init_hash_512(), &[], "786a02f742015903c6c6fd852552d272912f4740e15847618a86e217f71f5419d25e1031afee585313896444934eb04b903a685b1448b755d56f701afe9be2ce"; abc, Blake2b::init_hash_512(), &[0x61, 0x62, 0x63], "ba80a53f981c4d0d6a2797b69f12f6e94c212f14685ac4b74b12bb6fdbffa2d17d87c5392aab792dc252d5de4533cc9518d38aa8dbf1925ab92386edd4009923"; with_key, Blake2b::init(KEY, 64), &MSG, "142709d62e28fcccd0af97fad0f8465b971e82201dc51070faa0372aa43e92484be1c1e73ba10906d5d1853db6a4106e0a7bf9800d373d6dee2d46d62ef2a461"; ); - - #[test] - fn test_abc_partial() { - let mut hasher = Blake2b::init_hash_512(); - hasher.update(&[0x61]); - hasher.update(&[0x62]); - hasher.update(&[0x63]); - assert_eq!(hasher.finalize(), hex_to_bytes_ltr("ba80a53f981c4d0d6a2797b69f12f6e94c212f14685ac4b74b12bb6fdbffa2d17d87c5392aab792dc252d5de4533cc9518d38aa8dbf1925ab92386edd4009923").unwrap()); - } - - #[test] - fn test_with_key_partial() { - let mut hasher = Blake2b::init(KEY, 64); - hasher.update(&MSG[..13]); - hasher.update(&MSG[13..148]); - hasher.update(&MSG[148..]); - assert_eq!(hasher.finalize(), hex_to_bytes_ltr("142709d62e28fcccd0af97fad0f8465b971e82201dc51070faa0372aa43e92484be1c1e73ba10906d5d1853db6a4106e0a7bf9800d373d6dee2d46d62ef2a461").unwrap()); - } } diff --git a/hashers/src/blake/blake2b_long.rs b/hashers/src/blake/blake2b_long.rs index a273bd61..02dab874 100644 --- a/hashers/src/blake/blake2b_long.rs +++ b/hashers/src/blake/blake2b_long.rs @@ -65,8 +65,5 @@ impl StatefulHasher for Blake2bLong { } } - fn hash(mut self, bytes: &[u8]) -> Vec { - self.update(bytes); - self.finalize() - } + crate::stateful_hash_helpers!(); } diff --git a/hashers/src/blake/blake2s.rs b/hashers/src/blake/blake2s.rs index 72f07632..7e289ca1 100644 --- a/hashers/src/blake/blake2s.rs +++ b/hashers/src/blake/blake2s.rs @@ -162,10 +162,7 @@ impl StatefulHasher for Blake2s { .collect_vec() } - fn hash(mut self, bytes: &[u8]) -> Vec { - self.update(bytes); - self.finalize() - } + crate::stateful_hash_helpers!(); } #[cfg(test)] diff --git a/hashers/src/blake/blake512.rs b/hashers/src/blake/blake512.rs index 1e063891..5775be83 100644 --- a/hashers/src/blake/blake512.rs +++ b/hashers/src/blake/blake512.rs @@ -156,10 +156,7 @@ impl StatefulHasher for Blake384 { .collect_vec() } - fn hash(mut self, bytes: &[u8]) -> Vec { - self.update(bytes); - self.finalize() - } + crate::stateful_hash_helpers!(); } #[derive(Debug, Clone)] @@ -245,10 +242,7 @@ impl StatefulHasher for Blake512 { .collect_vec() } - fn hash(mut self, bytes: &[u8]) -> Vec { - self.update(bytes); - self.finalize() - } + crate::stateful_hash_helpers!(); } crate::stateful_hash_tests!( diff --git a/hashers/src/sha/sha0_stateful.rs b/hashers/src/sha/sha0_stateful.rs index cb1a74c8..c0c95ef0 100644 --- a/hashers/src/sha/sha0_stateful.rs +++ b/hashers/src/sha/sha0_stateful.rs @@ -104,10 +104,7 @@ impl StatefulHasher for Sha0Stateful { out } - fn hash(mut self, bytes: &[u8]) -> Vec { - self.update(bytes); - self.finalize() - } + crate::stateful_hash_helpers!(); } impl Sha0Stateful { diff --git a/hashers/src/sha/sha1_stateful.rs b/hashers/src/sha/sha1_stateful.rs index 402ecd4c..c10e6d82 100644 --- a/hashers/src/sha/sha1_stateful.rs +++ b/hashers/src/sha/sha1_stateful.rs @@ -104,10 +104,7 @@ impl StatefulHasher for Sha1Stateful { out } - fn hash(mut self, bytes: &[u8]) -> Vec { - self.update(bytes); - self.finalize() - } + crate::stateful_hash_helpers!(); } impl Sha1Stateful { diff --git a/hashers/src/traits.rs b/hashers/src/traits.rs index d1fe7382..63109f09 100644 --- a/hashers/src/traits.rs +++ b/hashers/src/traits.rs @@ -14,6 +14,26 @@ pub trait StatefulHasher { // Simultaneously update and finalize. fn hash(self, bytes: &[u8]) -> Vec; + + // Hash multiple inputs + fn hash_multiple(self, bytes: &[&[u8]]) -> Vec; +} + +#[macro_export] +macro_rules! stateful_hash_helpers { + () => { + fn hash(mut self, bytes: &[u8]) -> Vec { + self.update(bytes); + self.finalize() + } + + fn hash_multiple(mut self, bytes: &[&[u8]]) -> Vec { + for b in bytes { + self.update(b) + } + self.finalize() + } + }; } #[macro_export] @@ -88,39 +108,32 @@ macro_rules! stateful_hash_tests { }; } -// The update doesn't work for some reason -// #[macro_export] -// macro_rules! incremental_hash_tests { -// ($($test_name: ident, $hasher: expr, $input: expr, $output: expr);+ $(;)?) => { -// #[cfg(test)] -// mod stateful_incremental_tests { -// use super::*; -// $( -// #[test] -// fn $test_name() { -// for partial in $input { -// $hasher.update(&partial); -// println!("state {:02x?}", $hasher.state_bytes()); -// } -// assert_eq!(utils::byte_formatting::hex_to_bytes_ltr($output).unwrap(), $hasher.finalize()); -// } -// )+ -// } -// }; -// // Optional variant with module name for separation -// (($mod_name: ident)?; $($name: ident, $hasher: expr, $input: expr, $output: expr);+ $(;)?) => { -// #[cfg(test)] -// mod $mod_name { -// use super::*; -// $( -// #[test] -// fn $test_name() { -// for partial in input { -// $hasher.update(partial) -// } -// assert_eq!(utils::byte_formatting::hex_to_bytes_ltr($output).unwrap(), $hasher.finalize()); -// } -// )+ -// } -// }; -// } +#[macro_export] +macro_rules! incremental_hash_tests { + ($($test_name: ident, $hasher: expr, $input: expr, $output: expr);+ $(;)?) => { + #[cfg(test)] + mod stateful_incremental_tests { + use super::*; + $( + #[test] + fn $test_name() { + assert_eq!(utils::byte_formatting::hex_to_bytes_ltr($output).unwrap(), $hasher.hash_multiple($input)); + } + )+ + } + }; + // Optional variant with module name for separation + (($mod_name: ident)?; $($name: ident, $hasher: expr, $input: expr, $output: expr);+ $(;)?) => { + #[cfg(test)] + mod $mod_name { + use super::*; + $( + #[test] + fn $test_name() { + $hasher.hash_multiple($input); + assert_eq!(utils::byte_formatting::hex_to_bytes_ltr($output).unwrap(), $hasher.hash_multiple($input)); + } + )+ + } + }; +}