1use std::convert::TryFrom;
2mod hash;
3use hash::*;
4mod e8;
5
6pub 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}