use crate::hash::{ MD4, MD5, SHA0, SHA1,
SHA2_224, SHA2_256, SHA2_384,
SHA2_512, SHA2_512_256, SHA2_512_t_224,
SHA3_256, SHA3_384, SHA3_512 };
#[allow(non_camel_case_types)]
pub trait Hash
{
fn box_new() -> Box<Self> where Self: Sized;
fn get_default_length_in_bytes(&self) -> usize;
fn calculate_hash_code(&mut self, message: &[u8], counter: u32) -> Vec<u8>;
}
macro_rules! trait_Hash_impl {
($($hash_type:ty), *) => {
$(
impl Hash for $hash_type
{
fn box_new() -> Box<Self>
where Self: Sized
{
Box::new(Self::new())
}
#[inline]
fn get_default_length_in_bytes(&self) -> usize
{
Self::DEFUALT_OUTPUT_LENGTH_IN_BYTES
}
fn calculate_hash_code(&mut self, message: &[u8], counter: u32) -> Vec<u8>
{
let mut message_array = Vec::<u8>::from(message);
let counter = counter.to_be_bytes();
for i in 0..4
{ message_array.push(counter[i]); }
self.digest_vec(&message_array);
self.get_hash_value_in_vec().into_iter().flat_map(|x| x.to_le_bytes()).collect()
}
}
)*
};
}
trait_Hash_impl!{ MD4, MD5, SHA0, SHA1,
SHA2_224, SHA2_256, SHA2_384, SHA2_512, SHA2_512_256, SHA2_512_t_224,
SHA3_256, SHA3_384, SHA3_512 }