1 /* test_hmac.c - TinyCrypt implementation of some HMAC tests */
2
3 /*
4 * Copyright (C) 2017 by Intel Corporation, All Rights Reserved.
5 *
6 * Redistribution and use in source and binary forms, with or without
7 * modification, are permitted provided that the following conditions are met:
8 *
9 * - Redistributions of source code must retain the above copyright notice,
10 * this list of conditions and the following disclaimer.
11 *
12 * - Redistributions in binary form must reproduce the above copyright
13 * notice, this list of conditions and the following disclaimer in the
14 * documentation and/or other materials provided with the distribution.
15 *
16 * - Neither the name of Intel Corporation nor the names of its contributors
17 * may be used to endorse or promote products derived from this software
18 * without specific prior written permission.
19 *
20 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
21 * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
22 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
23 * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
24 * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
25 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
26 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
27 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
28 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
29 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
30 * POSSIBILITY OF SUCH DAMAGE.
31 */
32
33 /*
34 DESCRIPTION
35 This module tests the following HMAC routines:
36
37 Scenarios tested include:
38 - HMAC tests (RFC 4231 test vectors)
39 */
40
41 #include <tinycrypt/hmac.h>
42 #include <tinycrypt/sha256.h>
43 #include <tinycrypt/constants.h>
44 #include <test_utils.h>
45
46 #include <stdio.h>
47 #include <stdlib.h>
48 #include <string.h>
49 #include <stdint.h>
50
do_hmac_test(TCHmacState_t h,unsigned int testnum,const uint8_t * data,size_t datalen,const uint8_t * expected,size_t expectedlen)51 unsigned int do_hmac_test(TCHmacState_t h, unsigned int testnum, const uint8_t *data,
52 size_t datalen, const uint8_t *expected,
53 size_t expectedlen)
54 {
55 uint8_t digest[32];
56 unsigned int result = TC_PASS;
57
58 (void)tc_hmac_init(h);
59 (void)tc_hmac_update(h, data, datalen);
60 (void)tc_hmac_final(digest, TC_SHA256_DIGEST_SIZE, h);
61 result = check_result(testnum, expected, expectedlen,
62 digest, sizeof(digest));
63 return result;
64 }
65
66 /*
67 * NIST test vectors for encryption.
68 */
test_1(void)69 unsigned int test_1(void)
70 {
71 unsigned int result = TC_PASS;
72
73 TC_PRINT("HMAC %s:\n", __func__);
74
75 const uint8_t key[20] = {
76 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b,
77 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b
78 };
79 const uint8_t data[8] = {
80 0x48, 0x69, 0x20, 0x54, 0x68, 0x65, 0x72, 0x65
81 };
82 const uint8_t expected[32] = {
83 0xb0, 0x34, 0x4c, 0x61, 0xd8, 0xdb, 0x38, 0x53, 0x5c, 0xa8, 0xaf, 0xce,
84 0xaf, 0x0b, 0xf1, 0x2b, 0x88, 0x1d, 0xc2, 0x00, 0xc9, 0x83, 0x3d, 0xa7,
85 0x26, 0xe9, 0x37, 0x6c, 0x2e, 0x32, 0xcf, 0xf7
86 };
87 struct tc_hmac_state_struct h;
88
89 (void)memset(&h, 0x00, sizeof(h));
90 (void)tc_hmac_set_key(&h, key, sizeof(key));
91 result = do_hmac_test(&h, 1, data, sizeof(data),expected,
92 sizeof(expected));
93 TC_END_RESULT(result);
94 return result;
95 }
96
test_2(void)97 unsigned int test_2(void)
98 {
99 unsigned int result = TC_PASS;
100 TC_PRINT("HMAC %s:\n", __func__);
101 const uint8_t key[4] = {
102 0x4a, 0x65, 0x66, 0x65
103 };
104 const uint8_t data[28] = {
105 0x77, 0x68, 0x61, 0x74, 0x20, 0x64, 0x6f, 0x20, 0x79, 0x61, 0x20, 0x77,
106 0x61, 0x6e, 0x74, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x6e, 0x6f, 0x74, 0x68,
107 0x69, 0x6e, 0x67, 0x3f
108 };
109 const uint8_t expected[32] = {
110 0x5b, 0xdc, 0xc1, 0x46, 0xbf, 0x60, 0x75, 0x4e, 0x6a, 0x04, 0x24, 0x26,
111 0x08, 0x95, 0x75, 0xc7, 0x5a, 0x00, 0x3f, 0x08, 0x9d, 0x27, 0x39, 0x83,
112 0x9d, 0xec, 0x58, 0xb9, 0x64, 0xec, 0x38, 0x43
113 };
114 struct tc_hmac_state_struct h;
115
116 (void)memset(&h, 0x00, sizeof(h));
117 (void)tc_hmac_set_key(&h, key, sizeof(key));
118
119 result = do_hmac_test(&h, 2, data, sizeof(data), expected,
120 sizeof(expected));
121 TC_END_RESULT(result);
122 return result;
123 }
124
test_3(void)125 unsigned int test_3(void)
126 {
127 unsigned int result = TC_PASS;
128 TC_PRINT("HMAC %s:\n", __func__);
129 const uint8_t key[20] = {
130 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa,
131 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa
132 };
133 const uint8_t data[50] = {
134 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd,
135 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd,
136 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd,
137 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd,
138 0xdd, 0xdd
139 };
140 const uint8_t expected[32] = {
141 0x77, 0x3e, 0xa9, 0x1e, 0x36, 0x80, 0x0e, 0x46, 0x85, 0x4d, 0xb8, 0xeb,
142 0xd0, 0x91, 0x81, 0xa7, 0x29, 0x59, 0x09, 0x8b, 0x3e, 0xf8, 0xc1, 0x22,
143 0xd9, 0x63, 0x55, 0x14, 0xce, 0xd5, 0x65, 0xfe
144 };
145 struct tc_hmac_state_struct h;
146
147 (void)memset(&h, 0x00, sizeof(h));
148 (void)tc_hmac_set_key(&h, key, sizeof(key));
149
150 result = do_hmac_test(&h, 3, data, sizeof(data), expected,
151 sizeof(expected));
152 TC_END_RESULT(result);
153 return result;
154 }
155
test_4(void)156 unsigned int test_4(void)
157 {
158 unsigned int result = TC_PASS;
159 TC_PRINT("HMAC %s:\n", __func__);
160
161 const uint8_t key[25] = {
162 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b, 0x0c,
163 0x0d, 0x0e, 0x0f, 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x18,
164 0x19
165 };
166 const uint8_t data[50] = {
167 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd,
168 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd,
169 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd,
170 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd,
171 0xcd, 0xcd
172 };
173 const uint8_t expected[32] = {
174 0x82, 0x55, 0x8a, 0x38, 0x9a, 0x44, 0x3c, 0x0e, 0xa4, 0xcc, 0x81, 0x98,
175 0x99, 0xf2, 0x08, 0x3a, 0x85, 0xf0, 0xfa, 0xa3, 0xe5, 0x78, 0xf8, 0x07,
176 0x7a, 0x2e, 0x3f, 0xf4, 0x67, 0x29, 0x66, 0x5b
177 };
178 struct tc_hmac_state_struct h;
179
180 (void)memset(&h, 0x00, sizeof(h));
181 (void)tc_hmac_set_key(&h, key, sizeof(key));
182
183 result = do_hmac_test(&h, 4, data, sizeof(data), expected,
184 sizeof(expected));
185 TC_END_RESULT(result);
186 return result;
187 }
188
test_5(void)189 unsigned int test_5(void)
190 {
191 unsigned int result = TC_PASS;
192 TC_PRINT("HMAC %s:\n", __func__);
193 const uint8_t key[20] = {
194 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c,
195 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c
196 };
197 const uint8_t data[20] = {
198 0x54, 0x65, 0x73, 0x74, 0x20, 0x57, 0x69, 0x74, 0x68, 0x20, 0x54, 0x72,
199 0x75, 0x6e, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e
200 };
201 const uint8_t expected[32] = {
202 0xa3, 0xb6, 0x16, 0x74, 0x73, 0x10, 0x0e, 0xe0, 0x6e, 0x0c, 0x79, 0x6c,
203 0x29, 0x55, 0x55, 0x2b, 0xfa, 0x6f, 0x7c, 0x0a, 0x6a, 0x8a, 0xef, 0x8b,
204 0x93, 0xf8, 0x60, 0xaa, 0xb0, 0xcd, 0x20, 0xc5
205 };
206 struct tc_hmac_state_struct h;
207
208 (void)memset(&h, 0x00, sizeof(h));
209 (void)tc_hmac_set_key(&h, key, sizeof(key));
210
211 result = do_hmac_test(&h, 5, data, sizeof(data), expected,
212 sizeof(expected));
213 TC_END_RESULT(result);
214 return result;
215 }
216
test_6(void)217 unsigned int test_6(void)
218 {
219 unsigned int result = TC_PASS;
220 TC_PRINT("HMAC %s:\n", __func__);
221 const uint8_t key[131] = {
222 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa,
223 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa,
224 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa,
225 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa,
226 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa,
227 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa,
228 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa,
229 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa,
230 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa,
231 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa,
232 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa
233 };
234 const uint8_t data[54] = {
235 0x54, 0x65, 0x73, 0x74, 0x20, 0x55, 0x73, 0x69, 0x6e, 0x67, 0x20, 0x4c,
236 0x61, 0x72, 0x67, 0x65, 0x72, 0x20, 0x54, 0x68, 0x61, 0x6e, 0x20, 0x42,
237 0x6c, 0x6f, 0x63, 0x6b, 0x2d, 0x53, 0x69, 0x7a, 0x65, 0x20, 0x4b, 0x65,
238 0x79, 0x20, 0x2d, 0x20, 0x48, 0x61, 0x73, 0x68, 0x20, 0x4b, 0x65, 0x79,
239 0x20, 0x46, 0x69, 0x72, 0x73, 0x74
240 };
241 const uint8_t expected[32] = {
242 0x60, 0xe4, 0x31, 0x59, 0x1e, 0xe0, 0xb6, 0x7f, 0x0d, 0x8a, 0x26, 0xaa,
243 0xcb, 0xf5, 0xb7, 0x7f, 0x8e, 0x0b, 0xc6, 0x21, 0x37, 0x28, 0xc5, 0x14,
244 0x05, 0x46, 0x04, 0x0f, 0x0e, 0xe3, 0x7f, 0x54
245 };
246 struct tc_hmac_state_struct h;
247
248 (void)memset(&h, 0x00, sizeof(h));
249 (void)tc_hmac_set_key(&h, key, sizeof(key));
250
251 result = do_hmac_test(&h, 6, data, sizeof(data), expected,
252 sizeof(expected));
253 TC_END_RESULT(result);
254 return result;
255 }
256
test_7(void)257 unsigned int test_7(void)
258 {
259 unsigned int result = TC_PASS;
260 TC_PRINT("HMAC %s:\n", __func__);
261 const uint8_t key[131] = {
262 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa,
263 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa,
264 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa,
265 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa,
266 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa,
267 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa,
268 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa,
269 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa,
270 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa,
271 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa,
272 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa
273 };
274 const uint8_t data[152] = {
275 0x54, 0x68, 0x69, 0x73, 0x20, 0x69, 0x73, 0x20, 0x61, 0x20, 0x74, 0x65,
276 0x73, 0x74, 0x20, 0x75, 0x73, 0x69, 0x6e, 0x67, 0x20, 0x61, 0x20, 0x6c,
277 0x61, 0x72, 0x67, 0x65, 0x72, 0x20, 0x74, 0x68, 0x61, 0x6e, 0x20, 0x62,
278 0x6c, 0x6f, 0x63, 0x6b, 0x2d, 0x73, 0x69, 0x7a, 0x65, 0x20, 0x6b, 0x65,
279 0x79, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x61, 0x20, 0x6c, 0x61, 0x72, 0x67,
280 0x65, 0x72, 0x20, 0x74, 0x68, 0x61, 0x6e, 0x20, 0x62, 0x6c, 0x6f, 0x63,
281 0x6b, 0x2d, 0x73, 0x69, 0x7a, 0x65, 0x20, 0x64, 0x61, 0x74, 0x61, 0x2e,
282 0x20, 0x54, 0x68, 0x65, 0x20, 0x6b, 0x65, 0x79, 0x20, 0x6e, 0x65, 0x65,
283 0x64, 0x73, 0x20, 0x74, 0x6f, 0x20, 0x62, 0x65, 0x20, 0x68, 0x61, 0x73,
284 0x68, 0x65, 0x64, 0x20, 0x62, 0x65, 0x66, 0x6f, 0x72, 0x65, 0x20, 0x62,
285 0x65, 0x69, 0x6e, 0x67, 0x20, 0x75, 0x73, 0x65, 0x64, 0x20, 0x62, 0x79,
286 0x20, 0x74, 0x68, 0x65, 0x20, 0x48, 0x4d, 0x41, 0x43, 0x20, 0x61, 0x6c,
287 0x67, 0x6f, 0x72, 0x69, 0x74, 0x68, 0x6d, 0x2e
288 };
289 const uint8_t expected[32] = {
290 0x9b, 0x09, 0xff, 0xa7, 0x1b, 0x94, 0x2f, 0xcb, 0x27, 0x63, 0x5f, 0xbc,
291 0xd5, 0xb0, 0xe9, 0x44, 0xbf, 0xdc, 0x63, 0x64, 0x4f, 0x07, 0x13, 0x93,
292 0x8a, 0x7f, 0x51, 0x53, 0x5c, 0x3a, 0x35, 0xe2
293 };
294 struct tc_hmac_state_struct h;
295
296 (void)memset(&h, 0x00, sizeof(h));
297 (void)tc_hmac_set_key(&h, key, sizeof(key));
298
299 result = do_hmac_test(&h, 7, data, sizeof(data), expected,
300 sizeof(expected));
301 TC_END_RESULT(result);
302 return result;
303 }
304
305 /*
306 * Main task to test AES
307 */
main(void)308 int main(void)
309 {
310 unsigned int result = TC_PASS;
311
312 TC_START("Performing HMAC tests (RFC4231 test vectors):");
313
314 result = test_1();
315 if (result == TC_FAIL) {
316 /* terminate test */
317 TC_ERROR("HMAC test #1 failed.\n");
318 goto exitTest;
319 }
320 result = test_2();
321 if (result == TC_FAIL) {
322 /* terminate test */
323 TC_ERROR("HMAC test #2 failed.\n");
324 goto exitTest;
325 }
326 result = test_3();
327 if (result == TC_FAIL) {
328 /* terminate test */
329 TC_ERROR("HMAC test #3 failed.\n");
330 goto exitTest;
331 }
332 result = test_4();
333 if (result == TC_FAIL) {
334 /* terminate test */
335 TC_ERROR("HMAC test #4 failed.\n");
336 goto exitTest;
337 }
338 result = test_5();
339 if (result == TC_FAIL) {
340 /* terminate test */
341 TC_ERROR("HMAC test #5 failed.\n");
342 goto exitTest;
343 }
344 result = test_6();
345 if (result == TC_FAIL) {
346 /* terminate test */
347 TC_ERROR("HMAC #6 test failed.\n");
348 goto exitTest;
349 }
350 result = test_7();
351 if (result == TC_FAIL) {
352 /* terminate test */
353 TC_ERROR("HMAC test #7 failed.\n");
354 goto exitTest;
355 }
356
357 TC_PRINT("All HMAC tests succeeded!\n");
358
359 exitTest:
360 TC_END_RESULT(result);
361 TC_END_REPORT(result);
362 }
363