From be8ec280a056be688913c1a35c589ef406f72f50 Mon Sep 17 00:00:00 2001 From: Santo Cariotti Date: Mon, 23 Jun 2025 09:39:36 +0200 Subject: Add `Keccak512Hasher` --- src/hasher.rs | 43 +++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 43 insertions(+) (limited to 'src') diff --git a/src/hasher.rs b/src/hasher.rs index 088b16a..7692e0f 100644 --- a/src/hasher.rs +++ b/src/hasher.rs @@ -1,6 +1,7 @@ //! Provides hashing abstractions and implementations including SHA256 and a default dummy hasher. use sha2::{Digest, Sha256}; +use sha3::Keccak512; /// A trait representing a generic hash function. /// @@ -47,6 +48,30 @@ impl Hasher for SHA256Hasher { } } +#[derive(Clone)] +/// A hasher implementation using the Keccak512 cryptographic hash function. +pub struct Keccak512Hasher; + +impl Default for Keccak512Hasher { + fn default() -> Self { + Self::new() + } +} + +impl Keccak512Hasher { + pub fn new() -> Self { + Self {} + } +} + +impl Hasher for Keccak512Hasher { + fn hash(&self, input: &[u8]) -> String { + let mut hasher = Keccak512::new(); + hasher.update(input); + hex::encode(hasher.finalize()) + } +} + #[cfg(test)] mod tests { use super::*; @@ -68,4 +93,22 @@ mod tests { let actual_hash = hasher.hash(input); assert_eq!(actual_hash, expected_hash); } + + #[test] + fn test_keccak512_hasher_with_known_input() { + let hasher = Keccak512Hasher; + let input = "hello".as_bytes(); + let expected_hash = "52fa80662e64c128f8389c9ea6c73d4c02368004bf4463491900d11aaadca39d47de1b01361f207c512cfa79f0f92c3395c67ff7928e3f5ce3e3c852b392f976"; + let actual_hash = hasher.hash(input); + assert_eq!(actual_hash, expected_hash); + } + + #[test] + fn test_keccak512_hasher_empty_string() { + let hasher = Keccak512Hasher; + let input = &[]; + let expected_hash = "0eab42de4c3ceb9235fc91acffe746b29c29a8c366b7c60e4e67c466f36a4304c00fa9caf9d87976ba469bcbe06713b435f091ef2769fb160cdab33d3670680e"; + let actual_hash = hasher.hash(input); + assert_eq!(actual_hash, expected_hash); + } } -- cgit v1.2.3-71-g8e6c