#[derive(PartialEq, Eq, Clone, Debug, Copy, Hash)]
pub enum Hash {
Identity,
SHA1,
SHA2256,
SHA2512,
SHA3512,
SHA3384,
SHA3256,
SHA3224,
Keccak224,
Keccak256,
Keccak384,
Keccak512,
Blake2b512,
Blake2b256,
Blake2s256,
Blake2s128,
}
impl Hash {
pub fn code(&self) -> u16 {
match self {
Hash::Identity => 0x00,
Hash::SHA1 => 0x11,
Hash::SHA2256 => 0x12,
Hash::SHA2512 => 0x13,
Hash::SHA3224 => 0x17,
Hash::SHA3256 => 0x16,
Hash::SHA3384 => 0x15,
Hash::SHA3512 => 0x14,
Hash::Keccak224 => 0x1A,
Hash::Keccak256 => 0x1B,
Hash::Keccak384 => 0x1C,
Hash::Keccak512 => 0x1D,
Hash::Blake2b512 => 0xB240,
Hash::Blake2b256 => 0xB220,
Hash::Blake2s256 => 0xB260,
Hash::Blake2s128 => 0xB250,
}
}
pub fn size(&self) -> u8 {
match self {
Hash::Identity => 42,
Hash::SHA1 => 20,
Hash::SHA2256 => 32,
Hash::SHA2512 => 64,
Hash::SHA3224 => 28,
Hash::SHA3256 => 32,
Hash::SHA3384 => 48,
Hash::SHA3512 => 64,
Hash::Keccak224 => 28,
Hash::Keccak256 => 32,
Hash::Keccak384 => 48,
Hash::Keccak512 => 64,
Hash::Blake2b512 => 64,
Hash::Blake2b256 => 32,
Hash::Blake2s256 => 32,
Hash::Blake2s128 => 16,
}
}
pub fn from_code(code: u16) -> Option<Hash> {
Some(match code {
0x00 => Hash::Identity,
0x11 => Hash::SHA1,
0x12 => Hash::SHA2256,
0x13 => Hash::SHA2512,
0x14 => Hash::SHA3512,
0x15 => Hash::SHA3384,
0x16 => Hash::SHA3256,
0x17 => Hash::SHA3224,
0x1A => Hash::Keccak224,
0x1B => Hash::Keccak256,
0x1C => Hash::Keccak384,
0x1D => Hash::Keccak512,
0xB240 => Hash::Blake2b512,
0xB220 => Hash::Blake2b256,
0xB260 => Hash::Blake2s256,
0xB250 => Hash::Blake2s128,
_ => return None,
})
}
}