wlan_rsn/integrity/
hmac_sha1.rs
1use super::Algorithm;
6use crate::Error;
7
8use hmac::Mac as _;
9
10pub struct HmacSha1;
11
12impl HmacSha1 {
13 pub fn new() -> HmacSha1 {
14 HmacSha1 {}
15 }
16}
17
18impl Algorithm for HmacSha1 {
19 fn compute(&self, key: &[u8], data: &[u8]) -> Result<Vec<u8>, Error> {
20 let mut hmac =
21 hmac::Hmac::<sha1::Sha1>::new_from_slice(key).expect("construct new HmacSha1");
22 hmac.update(data);
23 let bytes: [u8; 20] = hmac.finalize().into_bytes().into();
24 Ok(bytes.into())
25 }
26}
27
28#[cfg(test)]
29mod tests {
30 use super::*;
31 use hex::FromHex;
32
33 fn run_test_case(key: &[u8], data: &[u8], expected_hex: &str) {
34 let hmac_sha1_128 = HmacSha1 {};
35 let result = hmac_sha1_128.compute(key, data);
36 assert!(result.is_ok());
37
38 let expected = Vec::from_hex(expected_hex).unwrap();
39 assert_eq!(expected, result.unwrap());
40
41 assert!(hmac_sha1_128.verify(key, data, &expected[..]));
42 }
43
44 #[test]
46 fn test_test_case_1() {
47 let key = Vec::from_hex("0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b").unwrap();
48 let data = "Hi There".as_bytes();
49 let expected = "b617318655057264e28bc0b6fb378c8ef146be00";
50 run_test_case(&key[..], data, expected);
51 }
52
53 #[test]
55 fn test_test_case_2() {
56 let key = "Jefe".as_bytes();
57 let data = "what do ya want for nothing?".as_bytes();
58 let expected = "effcdf6ae5eb2fa2d27416d5f184df9c259a7c79";
59 run_test_case(key, data, expected);
60 }
61
62 #[test]
64 fn test_test_case_3() {
65 let key = Vec::from_hex("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa").unwrap();
66 let data = Vec::from_hex("dddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddd").unwrap();
67 let expected = "125d7342b9ac11cd91a39af48aa17b4f63f175d3";
68 run_test_case(&key[..], &data[..], expected);
69 }
70
71 #[test]
73 fn test_test_case_4() {
74 let key = Vec::from_hex("0102030405060708090a0b0c0d0e0f10111213141516171819").unwrap();
75 let data = Vec::from_hex("cdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcd").unwrap();
76 let expected = "4c9007f4026250c6bc8414f9bf50c86c2d7235da";
77 run_test_case(&key[..], &data[..], expected);
78 }
79
80 #[test]
82 fn test_test_case_5() {
83 let key = Vec::from_hex("0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c").unwrap();
84 let data = "Test With Truncation".as_bytes();
85 let expected = "4c1a03424b55e07fe7f27be1d58bb9324a9a5a04";
86 run_test_case(&key[..], data, expected);
87 }
88
89 #[test]
91 fn test_test_case_6() {
92 let key = Vec::from_hex("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa").unwrap();
93 let data = "Test Using Larger Than Block-Size Key - Hash Key First".as_bytes();
94 let expected = "aa4ae5e15272d00e95705637ce8a3b55ed402112";
95 run_test_case(&key[..], data, expected);
96 }
97
98 #[test]
100 fn test_test_case_7() {
101 let key = Vec::from_hex("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa").unwrap();
102 let data =
103 "Test Using Larger Than Block-Size Key and Larger Than One Block-Size Data".as_bytes();
104 let expected = "e8e99d0f45237d786d6bbaa7965c7808bbff1a91";
105 run_test_case(&key[..], data, expected);
106 }
107
108 #[test]
110 fn test_test_case_8() {
111 let key = Vec::from_hex("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa").unwrap();
112 let data = "Test Using Larger Than Block-Size Key - Hash Key First".as_bytes();
113 let expected = "aa4ae5e15272d00e95705637ce8a3b55ed402112";
114 run_test_case(&key[..], data, expected);
115 }
116
117 #[test]
119 fn test_test_case_9() {
120 let key = Vec::from_hex("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa").unwrap();
121 let data =
122 "Test Using Larger Than Block-Size Key and Larger Than One Block-Size Data".as_bytes();
123 let expected = "e8e99d0f45237d786d6bbaa7965c7808bbff1a91";
124 run_test_case(&key[..], data, expected);
125 }
126
127 #[test]
128 fn test_verify_failure() {
129 let key = Vec::from_hex("0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b").unwrap();
130 let data = "Hi There".as_bytes();
131 let expected = Vec::from_hex("b617318655057264e28bc0b6fb378c8ef146be00").unwrap();
132 let hmac_sha1_128 = HmacSha1 {};
133 let result = hmac_sha1_128.verify(&key[..], data, &expected[..]);
134 assert!(result);
135
136 let not_expected = Vec::from_hex("c617318655057264e28bc0b6fb378c8ef146be00").unwrap();
137 let result = hmac_sha1_128.verify(&key[..], data, ¬_expected[..]);
138 assert!(!result);
139 }
140}