use super::HashLen;
use super::Result;
use crypto::digest::Digest;
use crypto::sha2;
pub fn hash(input: &[u8], len: HashLen, round: u8) -> Result<Vec<u8>> {
match len {
HashLen::Len224 => {
let mut ret = [0; 28];
let mut hasher = sha2::Sha224::new();
hasher.input(input);
hasher.result(&mut ret);
for _ in 0..round - 1 {
let mut hasher = sha2::Sha224::new();
hasher.input(&ret);
hasher.result(&mut ret);
}
return Ok(ret.to_vec());
}
HashLen::Len256 => {
let mut ret = [0; 32];
let mut hasher = sha2::Sha256::new();
hasher.input(input);
hasher.result(&mut ret);
for _ in 0..round - 1 {
let mut hasher = sha2::Sha256::new();
hasher.input(&ret);
hasher.result(&mut ret);
}
return Ok(ret.to_vec());
}
HashLen::Len384 => {
let mut ret = [0; 48];
let mut hasher = sha2::Sha384::new();
hasher.input(input);
hasher.result(&mut ret);
for _ in 0..round - 1 {
let mut hasher = sha2::Sha384::new();
hasher.input(&ret);
hasher.result(&mut ret);
}
return Ok(ret.to_vec());
}
HashLen::Len512 => {
let mut ret = [0; 64];
let mut hasher = sha2::Sha512::new();
hasher.input(input);
hasher.result(&mut ret);
for _ in 0..round - 1 {
let mut hasher = sha2::Sha512::new();
hasher.input(&ret);
hasher.result(&mut ret);
}
return Ok(ret.to_vec());
}
_ => bail!("sha2 not support hash algo {:?}", len),
}
}
#[test]
fn test_sha2() -> Result<()> {
let input = &"hello".as_bytes();
let expect_256_1 = vec![
44, 242, 77, 186, 95, 176, 163, 14, 38, 232, 59, 42, 197, 185, 226, 158, 27, 22, 30, 92,
31, 167, 66, 94, 115, 4, 51, 98, 147, 139, 152, 36,
];
assert_eq!(hash(input, HashLen::Len256, 1)?, expect_256_1);
let expect_256_2 = vec![
149, 149, 201, 223, 144, 7, 81, 72, 235, 6, 134, 3, 101, 223, 51, 88, 75, 117, 191, 247,
130, 165, 16, 198, 205, 72, 131, 164, 25, 131, 61, 80,
];
assert_eq!(hash(input, HashLen::Len256, 2)?, expect_256_2);
let expect_384_2 = vec![
212, 125, 137, 255, 213, 7, 30, 130, 96, 205, 111, 202, 26, 70, 104, 96, 88, 113, 175, 95,
190, 219, 237, 115, 117, 161, 17, 124, 140, 20, 200, 45, 60, 234, 194, 52, 77, 209, 224,
48, 53, 174, 28, 94, 117, 92, 245, 242,
];
assert_eq!(hash(input, HashLen::Len384, 2)?, expect_384_2);
Ok(())
}