jh_rs/
lib.rs

1use std::convert::TryFrom;
2mod hash;
3use hash::*;
4mod e8;
5
6///
7
8/// hash a message,
9/// 
10/// two inputs: message digest size in bits (hashbitlen); message (data)
11/// 
12/// one output:   message digest (hashval)
13///
14pub fn hash(bitlen: u16, data: &[u8], result: &mut [u8]) -> Result<(), JhError> {
15    let bitlen = HashBitLen::try_from(bitlen)?;
16    let mut state = HashState::new(bitlen);
17    state.update(data);
18    state.finalize(result);
19    Ok(())
20}
21
22#[cfg(test)]
23mod tests {
24    use rand::Fill;
25    use jhffi;
26    use super::hash;
27    #[test]
28    fn small() {
29        let keccak_state: [u8; 200] = [0; 200];
30        let mut result_jhffi = [0; 32];
31        let mut result = [0; 32];
32        jhffi::hash(256, &keccak_state, &mut result_jhffi).unwrap();
33        hash(256, &keccak_state, &mut result).unwrap();
34        assert_eq!(result_jhffi, result);
35    }
36
37    #[test]
38    fn large() {
39        let keccak_state: [u8; 1600] = [1; 1600];
40        let mut result_jhffi = [0; 32];
41        let mut result = [0; 32];
42        jhffi::hash(256, &keccak_state, &mut result_jhffi).unwrap();
43        hash(256, &keccak_state, &mut result).unwrap();
44        assert_eq!(result_jhffi, result);
45    }
46
47    #[test]
48    fn large_6400() {
49        let keccak_state: [u8; 6400] = [1; 6400];
50        let mut result_jhffi = [0; 32];
51        let mut result = [0; 32];
52        jhffi::hash(256, &keccak_state, &mut result_jhffi).unwrap();
53        hash(256, &keccak_state, &mut result).unwrap();
54        assert_eq!(result_jhffi, result);
55    }
56
57    #[test]
58    fn rand_100() {
59        let mut rng = rand::thread_rng();
60        let mut keccak_state: [u8; 200] = [0; 200];
61        let mut result_jhffi = [0; 32];
62        let mut result = [0; 32];
63        for _ in 0..100 {
64            keccak_state.try_fill(&mut rng).unwrap();
65            jhffi::hash(256, &keccak_state, &mut result_jhffi).unwrap();
66            hash(256, &keccak_state, &mut result).unwrap();
67            assert_eq!(result_jhffi, result);
68        }
69    }
70
71    #[test]
72    fn rand_100_large() {
73        let mut rng = rand::thread_rng();
74        let mut keccak_state: [u8; 1600] = [0; 1600];
75        let mut result_jhffi = [0; 32];
76        let mut result = [0; 32];
77        for _ in 0..100 {
78            keccak_state.try_fill(&mut rng).unwrap();
79            jhffi::hash(256, &keccak_state, &mut result_jhffi).unwrap();
80            hash(256, &keccak_state, &mut result).unwrap();
81            assert_eq!(result_jhffi, result);
82        }
83    }
84}