wlan_rsn/integrity/
hmac_sha1.rs

1// Copyright 2018 The Fuchsia Authors. All rights reserved.
2// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
5use 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    // RFC 2202, Test Case 1
45    #[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    // RFC 2202, Test Case 2
54    #[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    // RFC 2202, Test Case 3
63    #[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    // RFC 2202, Test Case 4
72    #[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    // RFC 2202, Test Case 5
81    #[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    // RFC 2202, Test Case 6
90    #[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    // RFC 2202, Test Case 7
99    #[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    // RFC 2202, Test Case 8
109    #[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    // RFC 2202, Test Case 9
118    #[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, &not_expected[..]);
138        assert!(!result);
139    }
140}