blob: 38ccf9fdbbfa9d48fe9158fd47f9a7ffe5c652c8 [file] [log] [blame]
David Brownfecda2d2017-09-07 10:20:34 -06001/* test_hmac.c - TinyCrypt implementation of some HMAC tests */
2
3/*
4 * Copyright (C) 2015 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
51uint32_t do_hmac_test(TCHmacState_t h, uint32_t testnum, const uint8_t *data,
52 size_t datalen, const uint8_t *expected,
53 size_t expectedlen)
54{
55 uint8_t digest[32];
56 uint32_t 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 */
69uint32_t test_1(void)
70{
71 uint32_t 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),
92 expected, sizeof(expected));
93 TC_END_RESULT(result);
94 return result;
95}
96
97uint32_t test_2(void)
98{
99 uint32_t result = TC_PASS;
100
101 TC_PRINT("HMAC %s:\n", __func__);
102 const uint8_t key[4] = {
103 0x4a, 0x65, 0x66, 0x65
104 };
105 const uint8_t data[28] = {
106 0x77, 0x68, 0x61, 0x74, 0x20, 0x64, 0x6f, 0x20, 0x79, 0x61, 0x20, 0x77,
107 0x61, 0x6e, 0x74, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x6e, 0x6f, 0x74, 0x68,
108 0x69, 0x6e, 0x67, 0x3f
109 };
110 const uint8_t expected[32] = {
111 0x5b, 0xdc, 0xc1, 0x46, 0xbf, 0x60, 0x75, 0x4e, 0x6a, 0x04, 0x24, 0x26,
112 0x08, 0x95, 0x75, 0xc7, 0x5a, 0x00, 0x3f, 0x08, 0x9d, 0x27, 0x39, 0x83,
113 0x9d, 0xec, 0x58, 0xb9, 0x64, 0xec, 0x38, 0x43
114 };
115 struct tc_hmac_state_struct h;
116
117 (void)memset(&h, 0x00, sizeof(h));
118 (void)tc_hmac_set_key(&h, key, sizeof(key));
119
120 result = do_hmac_test(&h, 2, data, sizeof(data),
121 expected, sizeof(expected));
122 TC_END_RESULT(result);
123 return result;
124}
125
126uint32_t test_3(void)
127{
128 uint32_t result = TC_PASS;
129
130 TC_PRINT("HMAC %s:\n", __func__);
131 const uint8_t key[20] = {
132 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa,
133 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa
134 };
135 const uint8_t data[50] = {
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, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd,
139 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd,
140 0xdd, 0xdd
141 };
142 const uint8_t expected[32] = {
143 0x77, 0x3e, 0xa9, 0x1e, 0x36, 0x80, 0x0e, 0x46, 0x85, 0x4d, 0xb8, 0xeb,
144 0xd0, 0x91, 0x81, 0xa7, 0x29, 0x59, 0x09, 0x8b, 0x3e, 0xf8, 0xc1, 0x22,
145 0xd9, 0x63, 0x55, 0x14, 0xce, 0xd5, 0x65, 0xfe
146 };
147 struct tc_hmac_state_struct h;
148
149 (void)memset(&h, 0x00, sizeof(h));
150 (void)tc_hmac_set_key(&h, key, sizeof(key));
151
152 result = do_hmac_test(&h, 3, data, sizeof(data),
153 expected, sizeof(expected));
154 TC_END_RESULT(result);
155 return result;
156}
157
158uint32_t test_4(void)
159{
160 uint32_t result = TC_PASS;
161
162 TC_PRINT("HMAC %s:\n", __func__);
163 const uint8_t key[25] = {
164 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b, 0x0c,
165 0x0d, 0x0e, 0x0f, 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x18,
166 0x19
167 };
168 const uint8_t data[50] = {
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, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd,
172 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd,
173 0xcd, 0xcd
174 };
175 const uint8_t expected[32] = {
176 0x82, 0x55, 0x8a, 0x38, 0x9a, 0x44, 0x3c, 0x0e, 0xa4, 0xcc, 0x81, 0x98,
177 0x99, 0xf2, 0x08, 0x3a, 0x85, 0xf0, 0xfa, 0xa3, 0xe5, 0x78, 0xf8, 0x07,
178 0x7a, 0x2e, 0x3f, 0xf4, 0x67, 0x29, 0x66, 0x5b
179 };
180 struct tc_hmac_state_struct h;
181
182 (void)memset(&h, 0x00, sizeof(h));
183 (void)tc_hmac_set_key(&h, key, sizeof(key));
184
185 result = do_hmac_test(&h, 4, data, sizeof(data),
186 expected, sizeof(expected));
187 TC_END_RESULT(result);
188 return result;
189}
190
191uint32_t test_5(void)
192{
193 uint32_t result = TC_PASS;
194
195 TC_PRINT("HMAC %s:\n", __func__);
196 const uint8_t key[20] = {
197 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c,
198 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c
199 };
200 const uint8_t data[20] = {
201 0x54, 0x65, 0x73, 0x74, 0x20, 0x57, 0x69, 0x74, 0x68, 0x20, 0x54, 0x72,
202 0x75, 0x6e, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e
203 };
204 const uint8_t expected[32] = {
205 0xa3, 0xb6, 0x16, 0x74, 0x73, 0x10, 0x0e, 0xe0, 0x6e, 0x0c, 0x79, 0x6c,
206 0x29, 0x55, 0x55, 0x2b, 0xfa, 0x6f, 0x7c, 0x0a, 0x6a, 0x8a, 0xef, 0x8b,
207 0x93, 0xf8, 0x60, 0xaa, 0xb0, 0xcd, 0x20, 0xc5
208 };
209 struct tc_hmac_state_struct h;
210
211 (void)memset(&h, 0x00, sizeof(h));
212 (void)tc_hmac_set_key(&h, key, sizeof(key));
213
214 result = do_hmac_test(&h, 5, data, sizeof(data),
215 expected, sizeof(expected));
216 TC_END_RESULT(result);
217 return result;
218}
219
220uint32_t test_6(void)
221{
222 uint32_t result = TC_PASS;
223
224 TC_PRINT("HMAC %s:\n", __func__);
225 const uint8_t key[131] = {
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, 0xaa,
233 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa,
234 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa,
235 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa,
236 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa
237 };
238 const uint8_t data[54] = {
239 0x54, 0x65, 0x73, 0x74, 0x20, 0x55, 0x73, 0x69, 0x6e, 0x67, 0x20, 0x4c,
240 0x61, 0x72, 0x67, 0x65, 0x72, 0x20, 0x54, 0x68, 0x61, 0x6e, 0x20, 0x42,
241 0x6c, 0x6f, 0x63, 0x6b, 0x2d, 0x53, 0x69, 0x7a, 0x65, 0x20, 0x4b, 0x65,
242 0x79, 0x20, 0x2d, 0x20, 0x48, 0x61, 0x73, 0x68, 0x20, 0x4b, 0x65, 0x79,
243 0x20, 0x46, 0x69, 0x72, 0x73, 0x74
244 };
245 const uint8_t expected[32] = {
246 0x60, 0xe4, 0x31, 0x59, 0x1e, 0xe0, 0xb6, 0x7f, 0x0d, 0x8a, 0x26, 0xaa,
247 0xcb, 0xf5, 0xb7, 0x7f, 0x8e, 0x0b, 0xc6, 0x21, 0x37, 0x28, 0xc5, 0x14,
248 0x05, 0x46, 0x04, 0x0f, 0x0e, 0xe3, 0x7f, 0x54
249 };
250 struct tc_hmac_state_struct h;
251
252 (void)memset(&h, 0x00, sizeof(h));
253 (void)tc_hmac_set_key(&h, key, sizeof(key));
254
255 result = do_hmac_test(&h, 6, data, sizeof(data),
256 expected, sizeof(expected));
257 TC_END_RESULT(result);
258 return result;
259}
260
261uint32_t test_7(void)
262{
263 uint32_t result = TC_PASS;
264
265 TC_PRINT("HMAC %s:\n", __func__);
266 const uint8_t key[131] = {
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, 0xaa,
273 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa,
274 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa,
275 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa,
276 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa,
277 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa
278 };
279 const uint8_t data[152] = {
280 0x54, 0x68, 0x69, 0x73, 0x20, 0x69, 0x73, 0x20, 0x61, 0x20, 0x74, 0x65,
281 0x73, 0x74, 0x20, 0x75, 0x73, 0x69, 0x6e, 0x67, 0x20, 0x61, 0x20, 0x6c,
282 0x61, 0x72, 0x67, 0x65, 0x72, 0x20, 0x74, 0x68, 0x61, 0x6e, 0x20, 0x62,
283 0x6c, 0x6f, 0x63, 0x6b, 0x2d, 0x73, 0x69, 0x7a, 0x65, 0x20, 0x6b, 0x65,
284 0x79, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x61, 0x20, 0x6c, 0x61, 0x72, 0x67,
285 0x65, 0x72, 0x20, 0x74, 0x68, 0x61, 0x6e, 0x20, 0x62, 0x6c, 0x6f, 0x63,
286 0x6b, 0x2d, 0x73, 0x69, 0x7a, 0x65, 0x20, 0x64, 0x61, 0x74, 0x61, 0x2e,
287 0x20, 0x54, 0x68, 0x65, 0x20, 0x6b, 0x65, 0x79, 0x20, 0x6e, 0x65, 0x65,
288 0x64, 0x73, 0x20, 0x74, 0x6f, 0x20, 0x62, 0x65, 0x20, 0x68, 0x61, 0x73,
289 0x68, 0x65, 0x64, 0x20, 0x62, 0x65, 0x66, 0x6f, 0x72, 0x65, 0x20, 0x62,
290 0x65, 0x69, 0x6e, 0x67, 0x20, 0x75, 0x73, 0x65, 0x64, 0x20, 0x62, 0x79,
291 0x20, 0x74, 0x68, 0x65, 0x20, 0x48, 0x4d, 0x41, 0x43, 0x20, 0x61, 0x6c,
292 0x67, 0x6f, 0x72, 0x69, 0x74, 0x68, 0x6d, 0x2e
293 };
294 const uint8_t expected[32] = {
295 0x9b, 0x09, 0xff, 0xa7, 0x1b, 0x94, 0x2f, 0xcb, 0x27, 0x63, 0x5f, 0xbc,
296 0xd5, 0xb0, 0xe9, 0x44, 0xbf, 0xdc, 0x63, 0x64, 0x4f, 0x07, 0x13, 0x93,
297 0x8a, 0x7f, 0x51, 0x53, 0x5c, 0x3a, 0x35, 0xe2
298 };
299 struct tc_hmac_state_struct h;
300
301 (void)memset(&h, 0x00, sizeof(h));
302 (void)tc_hmac_set_key(&h, key, sizeof(key));
303
304 result = do_hmac_test(&h, 7, data, sizeof(data),
305 expected, sizeof(expected));
306 TC_END_RESULT(result);
307 return result;
308}
309
310/*
311 * Main task to test AES
312 */
313int main(void)
314{
315 uint32_t result = TC_PASS;
316
317 TC_START("Performing HMAC tests (RFC4231 test vectors):");
318
319 result = test_1();
320 if (result == TC_FAIL) { /* terminate test */
321 TC_ERROR("HMAC test #1 failed.\n");
322 goto exitTest;
323 }
324 result = test_2();
325 if (result == TC_FAIL) { /* terminate test */
326 TC_ERROR("HMAC test #2 failed.\n");
327 goto exitTest;
328 }
329 result = test_3();
330 if (result == TC_FAIL) { /* terminate test */
331 TC_ERROR("HMAC test #3 failed.\n");
332 goto exitTest;
333 }
334 result = test_4();
335 if (result == TC_FAIL) { /* terminate test */
336 TC_ERROR("HMAC test #4 failed.\n");
337 goto exitTest;
338 }
339 result = test_5();
340 if (result == TC_FAIL) { /* terminate test */
341 TC_ERROR("HMAC test #5 failed.\n");
342 goto exitTest;
343 }
344 result = test_6();
345 if (result == TC_FAIL) { /* terminate test */
346 TC_ERROR("HMAC #6 test failed.\n");
347 goto exitTest;
348 }
349 result = test_7();
350 if (result == TC_FAIL) { /* terminate test */
351 TC_ERROR("HMAC test #7 failed.\n");
352 goto exitTest;
353 }
354
355 TC_PRINT("All HMAC tests succeeded!\n");
356
357exitTest:
358 TC_END_RESULT(result);
359 TC_END_REPORT(result);
360}