|
1 | | -use hex_literal::hex; |
2 | | -use hkdf::{Hkdf, hmac::EagerHash}; |
3 | | -use sha1::Sha1; |
4 | | -use sha2::Sha256; |
| 1 | +//! Test vectors from https://tools.ietf.org/html/rfc5869 |
| 2 | +use hkdf::{GenericHkdf, HmacImpl}; |
| 3 | +use hmac::{Hmac, SimpleHmac}; |
5 | 4 |
|
6 | | -struct Test<'a> { |
7 | | - ikm: &'a [u8], |
8 | | - salt: &'a [u8], |
9 | | - info: &'a [u8], |
10 | | - prk: &'a [u8], |
11 | | - okm: &'a [u8], |
| 5 | +#[derive(Copy, Clone, Debug)] |
| 6 | +struct TestVector { |
| 7 | + ikm: &'static [u8], |
| 8 | + salt: &'static [u8], |
| 9 | + info: &'static [u8], |
| 10 | + prk: &'static [u8], |
| 11 | + okm: &'static [u8], |
12 | 12 | } |
13 | 13 |
|
14 | | -fn rfc_test<H: EagerHash>(tests: &[Test]) { |
| 14 | +fn test<H: HmacImpl>(tvs: &[TestVector]) { |
15 | 15 | let mut buf = [0u8; 128]; |
16 | | - for test in tests.iter() { |
17 | | - let salt = if test.salt.is_empty() { |
| 16 | + for tv in tvs { |
| 17 | + let salt = if tv.salt.is_empty() { |
18 | 18 | None |
19 | 19 | } else { |
20 | | - Some(test.salt) |
| 20 | + Some(tv.salt) |
21 | 21 | }; |
22 | | - let (prk2, hkdf) = Hkdf::<H>::extract(salt, test.ikm); |
23 | | - let okm = &mut buf[..test.okm.len()]; |
24 | | - assert!(hkdf.expand(test.info, okm).is_ok()); |
| 22 | + let (prk2, hkdf) = GenericHkdf::<H>::extract(salt, tv.ikm); |
| 23 | + let okm_dst = &mut buf[..tv.okm.len()]; |
| 24 | + assert!(hkdf.expand(tv.info, okm_dst).is_ok()); |
25 | 25 |
|
26 | | - assert_eq!(prk2[..], test.prk[..]); |
27 | | - assert_eq!(okm, test.okm); |
| 26 | + assert_eq!(prk2[..], tv.prk[..]); |
| 27 | + assert_eq!(okm_dst, tv.okm); |
28 | 28 |
|
29 | | - okm.fill(0); |
30 | | - let hkdf = Hkdf::<H>::from_prk(test.prk).unwrap(); |
31 | | - assert!(hkdf.expand(test.info, okm).is_ok()); |
32 | | - assert_eq!(okm, test.okm); |
| 29 | + okm_dst.fill(0); |
| 30 | + let hkdf = GenericHkdf::<H>::from_prk(tv.prk).unwrap(); |
| 31 | + assert!(hkdf.expand(tv.info, okm_dst).is_ok()); |
| 32 | + assert_eq!(okm_dst, tv.okm); |
33 | 33 | } |
34 | 34 | } |
35 | 35 |
|
36 | | -// Test Vectors from https://tools.ietf.org/html/rfc5869. |
37 | | -#[test] |
38 | | -fn test_rfc5869_sha256() { |
39 | | - rfc_test::<Sha256>(&[ |
40 | | - // Test Case 1 |
41 | | - Test { |
42 | | - ikm: &hex!("0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b"), |
43 | | - salt: &hex!("000102030405060708090a0b0c"), |
44 | | - info: &hex!("f0f1f2f3f4f5f6f7f8f9"), |
45 | | - prk: &hex!( |
46 | | - "077709362c2e32df0ddc3f0dc47bba63" |
47 | | - "90b6c73bb50f9c3122ec844ad7c2b3e5" |
48 | | - ), |
49 | | - okm: &hex!( |
50 | | - "3cb25f25faacd57a90434f64d0362f2a" |
51 | | - "2d2d0a90cf1a5a4c5db02d56ecc4c5bf" |
52 | | - "34007208d5b887185865" |
53 | | - ), |
54 | | - }, |
55 | | - // Test Case 2 |
56 | | - Test { |
57 | | - ikm: &hex!( |
58 | | - "000102030405060708090a0b0c0d0e0f" |
59 | | - "101112131415161718191a1b1c1d1e1f" |
60 | | - "202122232425262728292a2b2c2d2e2f" |
61 | | - "303132333435363738393a3b3c3d3e3f" |
62 | | - "404142434445464748494a4b4c4d4e4f" |
63 | | - ), |
64 | | - salt: &hex!( |
65 | | - "606162636465666768696a6b6c6d6e6f" |
66 | | - "707172737475767778797a7b7c7d7e7f" |
67 | | - "808182838485868788898a8b8c8d8e8f" |
68 | | - "909192939495969798999a9b9c9d9e9f" |
69 | | - "a0a1a2a3a4a5a6a7a8a9aaabacadaeaf" |
70 | | - ), |
71 | | - info: &hex!( |
72 | | - "b0b1b2b3b4b5b6b7b8b9babbbcbdbebf" |
73 | | - "c0c1c2c3c4c5c6c7c8c9cacbcccdcecf" |
74 | | - "d0d1d2d3d4d5d6d7d8d9dadbdcdddedf" |
75 | | - "e0e1e2e3e4e5e6e7e8e9eaebecedeeef" |
76 | | - "f0f1f2f3f4f5f6f7f8f9fafbfcfdfeff" |
77 | | - ), |
78 | | - prk: &hex!( |
79 | | - "06a6b88c5853361a06104c9ceb35b45c" |
80 | | - "ef760014904671014a193f40c15fc244" |
81 | | - ), |
82 | | - okm: &hex!( |
83 | | - "b11e398dc80327a1c8e7f78c596a4934" |
84 | | - "4f012eda2d4efad8a050cc4c19afa97c" |
85 | | - "59045a99cac7827271cb41c65e590e09" |
86 | | - "da3275600c2f09b8367793a9aca3db71" |
87 | | - "cc30c58179ec3e87c14c01d5c1f3434f" |
88 | | - "1d87" |
89 | | - ), |
90 | | - }, |
91 | | - // Test Case 3 |
92 | | - Test { |
93 | | - ikm: &hex!("0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b"), |
94 | | - salt: &hex!(""), |
95 | | - info: &hex!(""), |
96 | | - prk: &hex!( |
97 | | - "19ef24a32c717b167f33a91d6f648bdf" |
98 | | - "96596776afdb6377ac434c1c293ccb04" |
99 | | - ), |
100 | | - okm: &hex!( |
101 | | - "8da4e775a563c18f715f802a063c5a31" |
102 | | - "b8a11f5c5ee1879ec3454e5f3c738d2d" |
103 | | - "9d201395faa4b61a96c8" |
104 | | - ), |
105 | | - }, |
106 | | - ]); |
107 | | -} |
| 36 | +macro_rules! new_test { |
| 37 | + ($name:ident, $hash:ty) => { |
| 38 | + #[test] |
| 39 | + fn $name() { |
| 40 | + blobby::parse_into_structs!( |
| 41 | + include_bytes!(concat!("data/", stringify!($name), ".blb")); |
| 42 | + static TEST_VECTORS: &[TestVector { ikm, salt, info, prk, okm }]; |
| 43 | + ); |
108 | 44 |
|
109 | | -#[test] |
110 | | -fn test_rfc5869_sha1() { |
111 | | - rfc_test::<Sha1>(&[ |
112 | | - // Test Case 4 |
113 | | - Test { |
114 | | - ikm: &hex!("0b0b0b0b0b0b0b0b0b0b0b"), |
115 | | - salt: &hex!("000102030405060708090a0b0c"), |
116 | | - info: &hex!("f0f1f2f3f4f5f6f7f8f9"), |
117 | | - prk: &hex!("9b6c18c432a7bf8f0e71c8eb88f4b30baa2ba243"), |
118 | | - okm: &hex!( |
119 | | - "085a01ea1b10f36933068b56efa5ad81" |
120 | | - "a4f14b822f5b091568a9cdd4f155fda2" |
121 | | - "c22e422478d305f3f896" |
122 | | - ), |
123 | | - }, |
124 | | - // Test Case 5 |
125 | | - Test { |
126 | | - ikm: &hex!( |
127 | | - "000102030405060708090a0b0c0d0e0f" |
128 | | - "101112131415161718191a1b1c1d1e1f" |
129 | | - "202122232425262728292a2b2c2d2e2f" |
130 | | - "303132333435363738393a3b3c3d3e3f" |
131 | | - "404142434445464748494a4b4c4d4e4f" |
132 | | - ), |
133 | | - salt: &hex!( |
134 | | - "606162636465666768696a6b6c6d6e6f" |
135 | | - "707172737475767778797a7b7c7d7e7f" |
136 | | - "808182838485868788898a8b8c8d8e8f" |
137 | | - "909192939495969798999a9b9c9d9e9f" |
138 | | - "a0a1a2a3a4a5a6a7a8a9aaabacadaeaf" |
139 | | - ), |
140 | | - info: &hex!( |
141 | | - "b0b1b2b3b4b5b6b7b8b9babbbcbdbebf" |
142 | | - "c0c1c2c3c4c5c6c7c8c9cacbcccdcecf" |
143 | | - "d0d1d2d3d4d5d6d7d8d9dadbdcdddedf" |
144 | | - "e0e1e2e3e4e5e6e7e8e9eaebecedeeef" |
145 | | - "f0f1f2f3f4f5f6f7f8f9fafbfcfdfeff" |
146 | | - ), |
147 | | - prk: &hex!("8adae09a2a307059478d309b26c4115a224cfaf6"), |
148 | | - okm: &hex!( |
149 | | - "0bd770a74d1160f7c9f12cd5912a06eb" |
150 | | - "ff6adcae899d92191fe4305673ba2ffe" |
151 | | - "8fa3f1a4e5ad79f3f334b3b202b2173c" |
152 | | - "486ea37ce3d397ed034c7f9dfeb15c5e" |
153 | | - "927336d0441f4c4300e2cff0d0900b52" |
154 | | - "d3b4" |
155 | | - ), |
156 | | - }, |
157 | | - // Test Case 6 |
158 | | - Test { |
159 | | - ikm: &hex!("0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b"), |
160 | | - salt: &hex!(""), |
161 | | - info: &hex!(""), |
162 | | - prk: &hex!("da8c8a73c7fa77288ec6f5e7c297786aa0d32d01"), |
163 | | - okm: &hex!( |
164 | | - "0ac1af7002b3d761d1e55298da9d0506" |
165 | | - "b9ae52057220a306e07b6b87e8df21d0" |
166 | | - "ea00033de03984d34918" |
167 | | - ), |
168 | | - }, |
169 | | - // Test Case 7 |
170 | | - Test { |
171 | | - ikm: &hex!("0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c"), |
172 | | - salt: &hex!(""), // "Not Provided" |
173 | | - info: &hex!(""), |
174 | | - prk: &hex!("2adccada18779e7c2077ad2eb19d3f3e731385dd"), |
175 | | - okm: &hex!( |
176 | | - "2c91117204d745f3500d636a62f64f0a" |
177 | | - "b3bae548aa53d423b0d1f27ebba6f5e5" |
178 | | - "673a081d70cce7acfc48" |
179 | | - ), |
180 | | - }, |
181 | | - ]); |
| 45 | + test::<Hmac<$hash>>(TEST_VECTORS); |
| 46 | + test::<SimpleHmac<$hash>>(TEST_VECTORS); |
| 47 | + } |
| 48 | + }; |
182 | 49 | } |
| 50 | + |
| 51 | +new_test!(rfc5869_sha1, sha1::Sha1); |
| 52 | +new_test!(rfc5869_sha256, sha2::Sha256); |
0 commit comments