use sn_protocol::messages::MerkleTreeNodesType;
use merkletree::hash::Algorithm;
use tiny_keccak::{Hasher, Sha3};
pub(super) struct Sha256Hasher {
engine: Sha3,
}
impl Default for Sha256Hasher {
fn default() -> Self {
Self {
engine: Sha3::v256(),
}
}
}
impl std::hash::Hasher for Sha256Hasher {
fn finish(&self) -> u64 {
error!(
"Hasher's contract (finish function is supposedly not used) is deliberately broken by design"
);
0
}
fn write(&mut self, bytes: &[u8]) {
self.engine.update(bytes)
}
}
impl Algorithm<MerkleTreeNodesType> for Sha256Hasher {
fn hash(&mut self) -> MerkleTreeNodesType {
let sha3 = self.engine.clone();
let mut hash = MerkleTreeNodesType::default();
sha3.finalize(&mut hash);
hash
}
}