]> git.ipfire.org Git - thirdparty/hostap.git/blob - tests/test-sha256.c
tests: Add CAVP test vectors for byte-oriented SHA-1 and SHA-256
[thirdparty/hostap.git] / tests / test-sha256.c
1 /*
2 * Test program for SHA256
3 * Copyright (c) 2006, Jouni Malinen <j@w1.fi>
4 *
5 * This software may be distributed under the terms of the BSD license.
6 * See README for more details.
7 */
8
9 #include "includes.h"
10
11 #include "common.h"
12 #include "crypto/sha256.h"
13 #include "crypto/crypto.h"
14
15 struct {
16 char *data;
17 u8 hash[32];
18 } tests[] = {
19 {
20 "abc",
21 {
22 0xba, 0x78, 0x16, 0xbf, 0x8f, 0x01, 0xcf, 0xea,
23 0x41, 0x41, 0x40, 0xde, 0x5d, 0xae, 0x22, 0x23,
24 0xb0, 0x03, 0x61, 0xa3, 0x96, 0x17, 0x7a, 0x9c,
25 0xb4, 0x10, 0xff, 0x61, 0xf2, 0x00, 0x15, 0xad
26 }
27 },
28 {
29 "abcdbcdecdefdefgefghfghighijhijkijkljklmklmnlmnomnopnopq",
30 {
31 0x24, 0x8d, 0x6a, 0x61, 0xd2, 0x06, 0x38, 0xb8,
32 0xe5, 0xc0, 0x26, 0x93, 0x0c, 0x3e, 0x60, 0x39,
33 0xa3, 0x3c, 0xe4, 0x59, 0x64, 0xff, 0x21, 0x67,
34 0xf6, 0xec, 0xed, 0xd4, 0x19, 0xdb, 0x06, 0xc1
35 }
36 }
37 };
38
39 struct hmac_test {
40 u8 key[80];
41 size_t key_len;
42 u8 data[128];
43 size_t data_len;
44 u8 hash[32];
45 } hmac_tests[] = {
46 /* draft-ietf-ipsec-ciph-sha-256-01.txt */
47 {
48 {
49 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08,
50 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, 0x10,
51 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x18,
52 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f, 0x20
53 },
54 32,
55 "abc", 3,
56 {
57 0xa2, 0x1b, 0x1f, 0x5d, 0x4c, 0xf4, 0xf7, 0x3a,
58 0x4d, 0xd9, 0x39, 0x75, 0x0f, 0x7a, 0x06, 0x6a,
59 0x7f, 0x98, 0xcc, 0x13, 0x1c, 0xb1, 0x6a, 0x66,
60 0x92, 0x75, 0x90, 0x21, 0xcf, 0xab, 0x81, 0x81
61 }
62 },
63 {
64 {
65 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08,
66 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, 0x10,
67 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x18,
68 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f, 0x20
69 },
70 32,
71 "abcdbcdecdefdefgefghfghighijhijkijkljklmklmnlmnomnopnopq",
72 56,
73 {
74 0x10, 0x4f, 0xdc, 0x12, 0x57, 0x32, 0x8f, 0x08,
75 0x18, 0x4b, 0xa7, 0x31, 0x31, 0xc5, 0x3c, 0xae,
76 0xe6, 0x98, 0xe3, 0x61, 0x19, 0x42, 0x11, 0x49,
77 0xea, 0x8c, 0x71, 0x24, 0x56, 0x69, 0x7d, 0x30
78 }
79 },
80 {
81 {
82 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08,
83 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, 0x10,
84 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x18,
85 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f, 0x20
86 },
87 32,
88 "abcdbcdecdefdefgefghfghighijhijkijkljklmklmnlmnomnopnopq"
89 "abcdbcdecdefdefgefghfghighijhijkijkljklmklmnlmnomnopnopq",
90 112,
91 {
92 0x47, 0x03, 0x05, 0xfc, 0x7e, 0x40, 0xfe, 0x34,
93 0xd3, 0xee, 0xb3, 0xe7, 0x73, 0xd9, 0x5a, 0xab,
94 0x73, 0xac, 0xf0, 0xfd, 0x06, 0x04, 0x47, 0xa5,
95 0xeb, 0x45, 0x95, 0xbf, 0x33, 0xa9, 0xd1, 0xa3
96 }
97 },
98 {
99 {
100 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b,
101 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b,
102 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b,
103 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b
104 },
105 32,
106 "Hi There",
107 8,
108 {
109 0x19, 0x8a, 0x60, 0x7e, 0xb4, 0x4b, 0xfb, 0xc6,
110 0x99, 0x03, 0xa0, 0xf1, 0xcf, 0x2b, 0xbd, 0xc5,
111 0xba, 0x0a, 0xa3, 0xf3, 0xd9, 0xae, 0x3c, 0x1c,
112 0x7a, 0x3b, 0x16, 0x96, 0xa0, 0xb6, 0x8c, 0xf7
113 }
114 },
115 {
116 "Jefe",
117 4,
118 "what do ya want for nothing?",
119 28,
120 {
121 0x5b, 0xdc, 0xc1, 0x46, 0xbf, 0x60, 0x75, 0x4e,
122 0x6a, 0x04, 0x24, 0x26, 0x08, 0x95, 0x75, 0xc7,
123 0x5a, 0x00, 0x3f, 0x08, 0x9d, 0x27, 0x39, 0x83,
124 0x9d, 0xec, 0x58, 0xb9, 0x64, 0xec, 0x38, 0x43
125 }
126 },
127 {
128 {
129 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa,
130 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa,
131 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa,
132 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa
133 },
134 32,
135 {
136 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd,
137 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd,
138 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd,
139 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd,
140 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd,
141 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd,
142 0xdd, 0xdd
143 },
144 50,
145 {
146 0xcd, 0xcb, 0x12, 0x20, 0xd1, 0xec, 0xcc, 0xea,
147 0x91, 0xe5, 0x3a, 0xba, 0x30, 0x92, 0xf9, 0x62,
148 0xe5, 0x49, 0xfe, 0x6c, 0xe9, 0xed, 0x7f, 0xdc,
149 0x43, 0x19, 0x1f, 0xbd, 0xe4, 0x5c, 0x30, 0xb0
150 }
151 },
152 {
153 {
154 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08,
155 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, 0x10,
156 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x18,
157 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f, 0x20,
158 0x21, 0x22, 0x23, 0x24, 0x25
159 },
160 37,
161 {
162 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd,
163 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd,
164 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd,
165 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd,
166 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd,
167 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd,
168 0xcd, 0xcd
169 },
170 50,
171 {
172 0xd4, 0x63, 0x3c, 0x17, 0xf6, 0xfb, 0x8d, 0x74,
173 0x4c, 0x66, 0xde, 0xe0, 0xf8, 0xf0, 0x74, 0x55,
174 0x6e, 0xc4, 0xaf, 0x55, 0xef, 0x07, 0x99, 0x85,
175 0x41, 0x46, 0x8e, 0xb4, 0x9b, 0xd2, 0xe9, 0x17
176 }
177 },
178 {
179 {
180 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c,
181 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c,
182 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c,
183 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c
184 },
185 32,
186 "Test With Truncation",
187 20,
188 {
189 0x75, 0x46, 0xaf, 0x01, 0x84, 0x1f, 0xc0, 0x9b,
190 0x1a, 0xb9, 0xc3, 0x74, 0x9a, 0x5f, 0x1c, 0x17,
191 0xd4, 0xf5, 0x89, 0x66, 0x8a, 0x58, 0x7b, 0x27,
192 0x00, 0xa9, 0xc9, 0x7c, 0x11, 0x93, 0xcf, 0x42
193 }
194 },
195 {
196 {
197 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa,
198 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa,
199 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa,
200 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa,
201 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa,
202 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa,
203 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa,
204 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa,
205 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa,
206 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa
207 },
208 80,
209 "Test Using Larger Than Block-Size Key - Hash Key First",
210 54,
211 {
212 0x69, 0x53, 0x02, 0x5e, 0xd9, 0x6f, 0x0c, 0x09,
213 0xf8, 0x0a, 0x96, 0xf7, 0x8e, 0x65, 0x38, 0xdb,
214 0xe2, 0xe7, 0xb8, 0x20, 0xe3, 0xdd, 0x97, 0x0e,
215 0x7d, 0xdd, 0x39, 0x09, 0x1b, 0x32, 0x35, 0x2f
216 }
217 },
218 {
219 {
220 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa,
221 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa,
222 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa,
223 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa,
224 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa,
225 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa,
226 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa,
227 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa,
228 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa,
229 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa
230 },
231 80,
232 "Test Using Larger Than Block-Size Key and Larger Than One "
233 "Block-Size Data",
234 73,
235 {
236 0x63, 0x55, 0xac, 0x22, 0xe8, 0x90, 0xd0, 0xa3,
237 0xc8, 0x48, 0x1a, 0x5c, 0xa4, 0x82, 0x5b, 0xc8,
238 0x84, 0xd3, 0xe7, 0xa1, 0xff, 0x98, 0xa2, 0xfc,
239 0x2a, 0xc7, 0xd8, 0xe0, 0x64, 0xc3, 0xb2, 0xe6
240 }
241 }
242 };
243
244
245 static int cavp_shavs(const char *fname)
246 {
247 FILE *f;
248 int ret = 0;
249 char buf[15000], *pos, *pos2;
250 u8 msg[6400];
251 int msg_len = 0, tmp_len;
252 u8 md[32], hash[32];
253 int ok = 0;
254
255 printf("CAVP SHAVS test vectors from %s\n", fname);
256
257 f = fopen(fname, "r");
258 if (f == NULL) {
259 printf("%s does not exist - cannot validate CAVP SHAVS test vectors\n",
260 fname);
261 return 0;
262 }
263
264 while (fgets(buf, sizeof(buf), f)) {
265 pos = os_strchr(buf, '=');
266 if (pos == NULL)
267 continue;
268 pos2 = pos - 1;
269 while (pos2 >= buf && *pos2 == ' ')
270 *pos2-- = '\0';
271 *pos++ = '\0';
272 while (*pos == ' ')
273 *pos++ = '\0';
274 pos2 = os_strchr(pos, '\r');
275 if (!pos2)
276 pos2 = os_strchr(pos, '\n');
277 if (pos2)
278 *pos2 = '\0';
279 else
280 pos2 = pos + os_strlen(pos);
281
282 if (os_strcmp(buf, "Len") == 0) {
283 msg_len = atoi(pos);
284 } else if (os_strcmp(buf, "Msg") == 0) {
285 tmp_len = os_strlen(pos);
286 if (msg_len == 0 && tmp_len == 2)
287 tmp_len = 0;
288 if (msg_len != tmp_len * 4) {
289 printf("Unexpected Msg length (msg_len=%u tmp_len=%u, Msg='%s'\n",
290 msg_len, tmp_len, pos);
291 ret++;
292 break;
293 }
294
295 if (hexstr2bin(pos, msg, msg_len / 8) < 0) {
296 printf("Invalid hex string '%s'\n", pos);
297 ret++;
298 break;
299 }
300 } else if (os_strcmp(buf, "MD") == 0) {
301 const u8 *addr[1];
302 size_t len[1];
303
304 tmp_len = os_strlen(pos);
305 if (tmp_len != 2 * 32) {
306 printf("Unexpected MD length (MD='%s'\n",
307 pos);
308 ret++;
309 break;
310 }
311
312 if (hexstr2bin(pos, md, 32) < 0) {
313 printf("Invalid hex string '%s'\n", pos);
314 ret++;
315 break;
316 }
317
318 addr[0] = msg;
319 len[0] = msg_len / 8;
320 if (sha256_vector(1, addr, len, hash) < 0 ||
321 os_memcmp(hash, md, 32) != 0)
322 ret++;
323 else
324 ok++;
325 }
326 }
327
328 fclose(f);
329
330 if (ret)
331 printf("Test case failed\n");
332 else
333 printf("%d test vectors OK\n", ok);
334
335 return ret;
336 }
337
338
339 int main(int argc, char *argv[])
340 {
341
342 unsigned int i;
343 u8 hash[32];
344 const u8 *addr[2];
345 size_t len[2];
346 int errors = 0;
347
348 for (i = 0; i < ARRAY_SIZE(tests); i++) {
349 printf("SHA256 test case %d:", i + 1);
350
351 addr[0] = (u8 *) tests[i].data;
352 len[0] = strlen(tests[i].data);
353 sha256_vector(1, addr, len, hash);
354 if (memcmp(hash, tests[i].hash, 32) != 0) {
355 printf(" FAIL");
356 errors++;
357 } else
358 printf(" OK");
359
360 if (len[0]) {
361 addr[0] = (u8 *) tests[i].data;
362 len[0] = 1;
363 addr[1] = (u8 *) tests[i].data + 1;
364 len[1] = strlen(tests[i].data) - 1;
365 sha256_vector(2, addr, len, hash);
366 if (memcmp(hash, tests[i].hash, 32) != 0) {
367 printf(" FAIL");
368 errors++;
369 } else
370 printf(" OK");
371 }
372
373 printf("\n");
374 }
375
376 for (i = 0; i < ARRAY_SIZE(hmac_tests); i++) {
377 struct hmac_test *t = &hmac_tests[i];
378 printf("HMAC-SHA256 test case %d:", i + 1);
379
380 hmac_sha256(t->key, t->key_len, t->data, t->data_len, hash);
381 if (memcmp(hash, t->hash, 32) != 0) {
382 printf(" FAIL");
383 errors++;
384 } else
385 printf(" OK");
386
387 addr[0] = t->data;
388 len[0] = t->data_len;
389 hmac_sha256_vector(t->key, t->key_len, 1, addr, len, hash);
390 if (memcmp(hash, t->hash, 32) != 0) {
391 printf(" FAIL");
392 errors++;
393 } else
394 printf(" OK");
395
396 if (len[0]) {
397 addr[0] = t->data;
398 len[0] = 1;
399 addr[1] = t->data + 1;
400 len[1] = t->data_len - 1;
401 hmac_sha256_vector(t->key, t->key_len, 2, addr, len,
402 hash);
403 if (memcmp(hash, t->hash, 32) != 0) {
404 printf(" FAIL");
405 errors++;
406 } else
407 printf(" OK");
408 }
409
410 printf("\n");
411 }
412
413 printf("Test IEEE 802.11r KDF\n");
414 sha256_prf((u8 *) "abc", 3, "KDF test", (u8 *) "data", 4,
415 hash, sizeof(hash));
416 /* TODO: add proper test case for this */
417
418 if (cavp_shavs("CAVP/SHA256ShortMsg.rsp"))
419 errors++;
420 if (cavp_shavs("CAVP/SHA256LongMsg.rsp"))
421 errors++;
422
423 return errors;
424 }