crypto_module_tests.c revision 346981
1/*
2 * crypto module tests
3 * Copyright (c) 2014-2015, 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 "utils/includes.h"
10
11#include "utils/common.h"
12#include "utils/module_tests.h"
13#include "crypto/aes_siv.h"
14#include "crypto/aes_wrap.h"
15#include "crypto/aes.h"
16#include "crypto/ms_funcs.h"
17#include "crypto/crypto.h"
18#include "crypto/sha1.h"
19#include "crypto/sha256.h"
20#include "crypto/sha384.h"
21
22
23static int test_siv(void)
24{
25#ifdef CONFIG_MESH
26	/* RFC 5297, A.1. Deterministic Authenticated Encryption Example */
27	u8 key[] = {
28		0xff, 0xfe, 0xfd, 0xfc, 0xfb, 0xfa, 0xf9, 0xf8,
29		0xf7, 0xf6, 0xf5, 0xf4, 0xf3, 0xf2, 0xf1, 0xf0,
30		0xf0, 0xf1, 0xf2, 0xf3, 0xf4, 0xf5, 0xf6, 0xf7,
31		0xf8, 0xf9, 0xfa, 0xfb, 0xfc, 0xfd, 0xfe, 0xff
32	};
33	u8 ad[] = {
34		0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17,
35		0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f,
36		0x20, 0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27
37	};
38	u8 plaintext[] = {
39		0x11, 0x22, 0x33, 0x44, 0x55, 0x66, 0x77, 0x88,
40		0x99, 0xaa, 0xbb, 0xcc, 0xdd, 0xee
41	};
42	u8 iv_c[] = {
43		0x85, 0x63, 0x2d, 0x07, 0xc6, 0xe8, 0xf3, 0x7f,
44		0x95, 0x0a, 0xcd, 0x32, 0x0a, 0x2e, 0xcc, 0x93,
45		0x40, 0xc0, 0x2b, 0x96, 0x90, 0xc4, 0xdc, 0x04,
46		0xda, 0xef, 0x7f, 0x6a, 0xfe, 0x5c
47	};
48	/* RFC 5297, A.2. Nonce-Based Authenticated Encryption Example */
49	u8 key_2[] = {
50		0x7f, 0x7e, 0x7d, 0x7c, 0x7b, 0x7a, 0x79, 0x78,
51		0x77, 0x76, 0x75, 0x74, 0x73, 0x72, 0x71, 0x70,
52		0x40, 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x47,
53		0x48, 0x49, 0x4a, 0x4b, 0x4c, 0x4d, 0x4e, 0x4f
54	};
55	u8 ad1_2[] = {
56		0x00, 0x11, 0x22, 0x33, 0x44, 0x55, 0x66, 0x77,
57		0x88, 0x99, 0xaa, 0xbb, 0xcc, 0xdd, 0xee, 0xff,
58		0xde, 0xad, 0xda, 0xda, 0xde, 0xad, 0xda, 0xda,
59		0xff, 0xee, 0xdd, 0xcc, 0xbb, 0xaa, 0x99, 0x88,
60		0x77, 0x66, 0x55, 0x44, 0x33, 0x22, 0x11, 0x00
61	};
62	u8 ad2_2[] = {
63		0x10, 0x20, 0x30, 0x40, 0x50, 0x60, 0x70, 0x80,
64		0x90, 0xa0
65	};
66	u8 nonce_2[] = {
67		0x09, 0xf9, 0x11, 0x02, 0x9d, 0x74, 0xe3, 0x5b,
68		0xd8, 0x41, 0x56, 0xc5, 0x63, 0x56, 0x88, 0xc0
69	};
70	u8 plaintext_2[] = {
71		0x74, 0x68, 0x69, 0x73, 0x20, 0x69, 0x73, 0x20,
72		0x73, 0x6f, 0x6d, 0x65, 0x20, 0x70, 0x6c, 0x61,
73		0x69, 0x6e, 0x74, 0x65, 0x78, 0x74, 0x20, 0x74,
74		0x6f, 0x20, 0x65, 0x6e, 0x63, 0x72, 0x79, 0x70,
75		0x74, 0x20, 0x75, 0x73, 0x69, 0x6e, 0x67, 0x20,
76		0x53, 0x49, 0x56, 0x2d, 0x41, 0x45, 0x53
77	};
78	u8 iv_c_2[] = {
79		0x7b, 0xdb, 0x6e, 0x3b, 0x43, 0x26, 0x67, 0xeb,
80		0x06, 0xf4, 0xd1, 0x4b, 0xff, 0x2f, 0xbd, 0x0f,
81		0xcb, 0x90, 0x0f, 0x2f, 0xdd, 0xbe, 0x40, 0x43,
82		0x26, 0x60, 0x19, 0x65, 0xc8, 0x89, 0xbf, 0x17,
83		0xdb, 0xa7, 0x7c, 0xeb, 0x09, 0x4f, 0xa6, 0x63,
84		0xb7, 0xa3, 0xf7, 0x48, 0xba, 0x8a, 0xf8, 0x29,
85		0xea, 0x64, 0xad, 0x54, 0x4a, 0x27, 0x2e, 0x9c,
86		0x48, 0x5b, 0x62, 0xa3, 0xfd, 0x5c, 0x0d
87	};
88	u8 out[2 * AES_BLOCK_SIZE + sizeof(plaintext_2)];
89	const u8 *addr[3];
90	size_t len[3];
91
92	/* RFC 5297, A.1. Deterministic Authenticated Encryption Example */
93	addr[0] = ad;
94	len[0] = sizeof(ad);
95
96	if (aes_siv_encrypt(key, sizeof(key), plaintext, sizeof(plaintext),
97			    1, addr, len, out)) {
98		wpa_printf(MSG_ERROR, "AES-SIV mode encryption failed");
99		return 1;
100	}
101	if (os_memcmp(out, iv_c, sizeof(iv_c)) != 0) {
102		wpa_printf(MSG_ERROR,
103			   "AES-SIV mode encryption returned invalid cipher text");
104		return 1;
105	}
106
107	if (aes_siv_decrypt(key, sizeof(key), iv_c, sizeof(iv_c),
108			    1, addr, len, out)) {
109		wpa_printf(MSG_ERROR, "AES-SIV mode decryption failed");
110		return 1;
111	}
112	if (os_memcmp(out, plaintext, sizeof(plaintext)) != 0) {
113		wpa_printf(MSG_ERROR,
114			   "AES-SIV mode decryption returned invalid plain text");
115		return 1;
116	}
117
118	/* RFC 5297, A.2. Nonce-Based Authenticated Encryption Example */
119	addr[0] = ad1_2;
120	len[0] = sizeof(ad1_2);
121	addr[1] = ad2_2;
122	len[1] = sizeof(ad2_2);
123	addr[2] = nonce_2;
124	len[2] = sizeof(nonce_2);
125
126	if (aes_siv_encrypt(key_2, sizeof(key_2),
127			    plaintext_2, sizeof(plaintext_2),
128			    3, addr, len, out)) {
129		wpa_printf(MSG_ERROR, "AES-SIV mode encryption failed");
130		return 1;
131	}
132	if (os_memcmp(out, iv_c_2, sizeof(iv_c_2)) != 0) {
133		wpa_printf(MSG_ERROR,
134			   "AES-SIV mode encryption returned invalid cipher text");
135		return 1;
136	}
137
138	if (aes_siv_decrypt(key_2, sizeof(key_2), iv_c_2, sizeof(iv_c_2),
139			    3, addr, len, out)) {
140		wpa_printf(MSG_ERROR, "AES-SIV mode decryption failed");
141		return 1;
142	}
143	if (os_memcmp(out, plaintext_2, sizeof(plaintext_2)) != 0) {
144		wpa_printf(MSG_ERROR,
145			   "AES-SIV mode decryption returned invalid plain text");
146		return 1;
147	}
148
149	wpa_printf(MSG_INFO, "AES-SIV test cases passed");
150#endif /* CONFIG_MESH */
151
152	return 0;
153}
154
155
156/* OMAC1 AES-128 test vectors from
157 * http://csrc.nist.gov/CryptoToolkit/modes/proposedmodes/omac/omac-ad.pdf
158 * which are same as the examples from NIST SP800-38B
159 * http://csrc.nist.gov/CryptoToolkit/modes/800-38_Series_Publications/SP800-38B.pdf
160 */
161
162struct omac1_test_vector {
163	u8 k[16];
164	u8 msg[64];
165	int msg_len;
166	u8 tag[16];
167};
168
169static const struct omac1_test_vector omac1_test_vectors[] =
170{
171	{
172		{ 0x2b, 0x7e, 0x15, 0x16, 0x28, 0xae, 0xd2, 0xa6,
173		  0xab, 0xf7, 0x15, 0x88, 0x09, 0xcf, 0x4f, 0x3c },
174		{ },
175		0,
176		{ 0xbb, 0x1d, 0x69, 0x29, 0xe9, 0x59, 0x37, 0x28,
177		  0x7f, 0xa3, 0x7d, 0x12, 0x9b, 0x75, 0x67, 0x46 }
178	},
179	{
180		{ 0x2b, 0x7e, 0x15, 0x16, 0x28, 0xae, 0xd2, 0xa6,
181		  0xab, 0xf7, 0x15, 0x88, 0x09, 0xcf, 0x4f, 0x3c },
182		{ 0x6b, 0xc1, 0xbe, 0xe2, 0x2e, 0x40, 0x9f, 0x96,
183		  0xe9, 0x3d, 0x7e, 0x11, 0x73, 0x93, 0x17, 0x2a},
184		16,
185		{ 0x07, 0x0a, 0x16, 0xb4, 0x6b, 0x4d, 0x41, 0x44,
186		  0xf7, 0x9b, 0xdd, 0x9d, 0xd0, 0x4a, 0x28, 0x7c }
187	},
188	{
189		{ 0x2b, 0x7e, 0x15, 0x16, 0x28, 0xae, 0xd2, 0xa6,
190		  0xab, 0xf7, 0x15, 0x88, 0x09, 0xcf, 0x4f, 0x3c },
191		{ 0x6b, 0xc1, 0xbe, 0xe2, 0x2e, 0x40, 0x9f, 0x96,
192		  0xe9, 0x3d, 0x7e, 0x11, 0x73, 0x93, 0x17, 0x2a,
193		  0xae, 0x2d, 0x8a, 0x57, 0x1e, 0x03, 0xac, 0x9c,
194		  0x9e, 0xb7, 0x6f, 0xac, 0x45, 0xaf, 0x8e, 0x51,
195		  0x30, 0xc8, 0x1c, 0x46, 0xa3, 0x5c, 0xe4, 0x11 },
196		40,
197		{ 0xdf, 0xa6, 0x67, 0x47, 0xde, 0x9a, 0xe6, 0x30,
198		  0x30, 0xca, 0x32, 0x61, 0x14, 0x97, 0xc8, 0x27 }
199	},
200	{
201		{ 0x2b, 0x7e, 0x15, 0x16, 0x28, 0xae, 0xd2, 0xa6,
202		  0xab, 0xf7, 0x15, 0x88, 0x09, 0xcf, 0x4f, 0x3c },
203		{ 0x6b, 0xc1, 0xbe, 0xe2, 0x2e, 0x40, 0x9f, 0x96,
204		  0xe9, 0x3d, 0x7e, 0x11, 0x73, 0x93, 0x17, 0x2a,
205		  0xae, 0x2d, 0x8a, 0x57, 0x1e, 0x03, 0xac, 0x9c,
206		  0x9e, 0xb7, 0x6f, 0xac, 0x45, 0xaf, 0x8e, 0x51,
207		  0x30, 0xc8, 0x1c, 0x46, 0xa3, 0x5c, 0xe4, 0x11,
208		  0xe5, 0xfb, 0xc1, 0x19, 0x1a, 0x0a, 0x52, 0xef,
209		  0xf6, 0x9f, 0x24, 0x45, 0xdf, 0x4f, 0x9b, 0x17,
210		  0xad, 0x2b, 0x41, 0x7b, 0xe6, 0x6c, 0x37, 0x10 },
211		64,
212		{ 0x51, 0xf0, 0xbe, 0xbf, 0x7e, 0x3b, 0x9d, 0x92,
213		  0xfc, 0x49, 0x74, 0x17, 0x79, 0x36, 0x3c, 0xfe }
214	},
215};
216
217
218static int test_omac1_vector(const struct omac1_test_vector *tv,
219			     unsigned int i)
220{
221	u8 key[] = {
222		0x2b, 0x7e, 0x15, 0x16, 0x28, 0xae, 0xd2, 0xa6,
223		0xab, 0xf7, 0x15, 0x88, 0x09, 0xcf, 0x4f, 0x3c
224	};
225	u8 msg[] = { 0x12, 0x34, 0x56 };
226	u8 result[24], result2[24];
227	const u8 *addr[3];
228	size_t len[3];
229
230	if (omac1_aes_128(tv->k, tv->msg, tv->msg_len, result) ||
231	    os_memcmp(result, tv->tag, 16) != 0) {
232		wpa_printf(MSG_ERROR, "OMAC1-AES-128 test vector %u failed", i);
233		return 1;
234	}
235
236	if (tv->msg_len > 1) {
237
238		addr[0] = tv->msg;
239		len[0] = 1;
240		addr[1] = tv->msg + 1;
241		len[1] = tv->msg_len - 1;
242
243		if (omac1_aes_128_vector(tv->k, 2, addr, len, result) ||
244		    os_memcmp(result, tv->tag, 16) != 0) {
245			wpa_printf(MSG_ERROR,
246				   "OMAC1-AES-128(vector) test vector %u failed",
247				   i);
248			return 1;
249		}
250
251		addr[0] = tv->msg;
252		len[0] = tv->msg_len - 2;
253		addr[1] = tv->msg + tv->msg_len - 2;
254		len[1] = 1;
255		addr[2] = tv->msg + tv->msg_len - 1;
256		len[2] = 1;
257
258		if (omac1_aes_128_vector(tv->k, 3, addr, len, result) ||
259		    os_memcmp(result, tv->tag, 16) != 0) {
260			wpa_printf(MSG_ERROR,
261				   "OMAC1-AES-128(vector2) test vector %u failed",
262				   i);
263			return 1;
264		}
265	}
266
267	addr[0] = &msg[0];
268	len[0] = 1;
269	addr[1] = &msg[1];
270	len[1] = 1;
271	addr[2] = &msg[2];
272	len[2] = 1;
273	if (omac1_aes_128(key, msg, sizeof(msg), result) ||
274	    omac1_aes_128_vector(key, 3, addr, len, result2) ||
275	    os_memcmp(result, result2, 16) != 0) {
276		wpa_printf(MSG_ERROR, "OMAC1-AES-128 short test mismatch");
277		return 1;
278	}
279
280	return 0;
281}
282
283
284static int test_omac1(void)
285{
286	unsigned int i;
287
288	for (i = 0; i < ARRAY_SIZE(omac1_test_vectors); i++) {
289		if (test_omac1_vector(&omac1_test_vectors[i], i))
290			return 1;
291	}
292
293	wpa_printf(MSG_INFO, "OMAC1-AES-128 test cases passed");
294
295	return 0;
296}
297
298
299static int test_eax(void)
300{
301#ifdef EAP_PSK
302	u8 msg[] = { 0xF7, 0xFB };
303	u8 key[] = { 0x91, 0x94, 0x5D, 0x3F, 0x4D, 0xCB, 0xEE, 0x0B,
304		     0xF4, 0x5E, 0xF5, 0x22, 0x55, 0xF0, 0x95, 0xA4 };
305	u8 nonce[] = { 0xBE, 0xCA, 0xF0, 0x43, 0xB0, 0xA2, 0x3D, 0x84,
306		       0x31, 0x94, 0xBA, 0x97, 0x2C, 0x66, 0xDE, 0xBD };
307	u8 hdr[] = { 0xFA, 0x3B, 0xFD, 0x48, 0x06, 0xEB, 0x53, 0xFA };
308	u8 cipher[] = { 0x19, 0xDD, 0x5C, 0x4C, 0x93, 0x31, 0x04, 0x9D,
309			0x0B, 0xDA, 0xB0, 0x27, 0x74, 0x08, 0xF6, 0x79,
310			0x67, 0xE5 };
311	u8 data[sizeof(msg)], tag[AES_BLOCK_SIZE];
312
313	os_memcpy(data, msg, sizeof(msg));
314	if (aes_128_eax_encrypt(key, nonce, sizeof(nonce), hdr, sizeof(hdr),
315				data, sizeof(data), tag)) {
316		wpa_printf(MSG_ERROR, "AES-128 EAX mode encryption failed");
317		return 1;
318	}
319	if (os_memcmp(data, cipher, sizeof(data)) != 0) {
320		wpa_printf(MSG_ERROR,
321			   "AES-128 EAX mode encryption returned invalid cipher text");
322		return 1;
323	}
324	if (os_memcmp(tag, cipher + sizeof(data), AES_BLOCK_SIZE) != 0) {
325		wpa_printf(MSG_ERROR,
326			   "AES-128 EAX mode encryption returned invalid tag");
327		return 1;
328	}
329
330	if (aes_128_eax_decrypt(key, nonce, sizeof(nonce), hdr, sizeof(hdr),
331				data, sizeof(data), tag)) {
332		wpa_printf(MSG_ERROR, "AES-128 EAX mode decryption failed");
333		return 1;
334	}
335	if (os_memcmp(data, msg, sizeof(data)) != 0) {
336		wpa_printf(MSG_ERROR,
337			   "AES-128 EAX mode decryption returned invalid plain text");
338		return 1;
339	}
340
341	wpa_printf(MSG_INFO, "AES-128 EAX mode test cases passed");
342#endif /* EAP_PSK */
343
344	return 0;
345}
346
347
348static int test_cbc(void)
349{
350	struct cbc_test_vector {
351		u8 key[16];
352		u8 iv[16];
353		u8 plain[32];
354		u8 cipher[32];
355		size_t len;
356	} vectors[] = {
357		{
358			{ 0x06, 0xa9, 0x21, 0x40, 0x36, 0xb8, 0xa1, 0x5b,
359			  0x51, 0x2e, 0x03, 0xd5, 0x34, 0x12, 0x00, 0x06 },
360			{ 0x3d, 0xaf, 0xba, 0x42, 0x9d, 0x9e, 0xb4, 0x30,
361			  0xb4, 0x22, 0xda, 0x80, 0x2c, 0x9f, 0xac, 0x41 },
362			"Single block msg",
363			{ 0xe3, 0x53, 0x77, 0x9c, 0x10, 0x79, 0xae, 0xb8,
364			  0x27, 0x08, 0x94, 0x2d, 0xbe, 0x77, 0x18, 0x1a },
365			16
366		},
367		{
368			{ 0xc2, 0x86, 0x69, 0x6d, 0x88, 0x7c, 0x9a, 0xa0,
369			  0x61, 0x1b, 0xbb, 0x3e, 0x20, 0x25, 0xa4, 0x5a },
370			{ 0x56, 0x2e, 0x17, 0x99, 0x6d, 0x09, 0x3d, 0x28,
371			  0xdd, 0xb3, 0xba, 0x69, 0x5a, 0x2e, 0x6f, 0x58 },
372			{ 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
373			  0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f,
374			  0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17,
375			  0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f },
376			{ 0xd2, 0x96, 0xcd, 0x94, 0xc2, 0xcc, 0xcf, 0x8a,
377			  0x3a, 0x86, 0x30, 0x28, 0xb5, 0xe1, 0xdc, 0x0a,
378			  0x75, 0x86, 0x60, 0x2d, 0x25, 0x3c, 0xff, 0xf9,
379			  0x1b, 0x82, 0x66, 0xbe, 0xa6, 0xd6, 0x1a, 0xb1 },
380			32
381		}
382	};
383	int ret = 0;
384	u8 *buf;
385	unsigned int i;
386
387	for (i = 0; i < ARRAY_SIZE(vectors); i++) {
388		struct cbc_test_vector *tv = &vectors[i];
389
390		buf = os_malloc(tv->len);
391		if (buf == NULL) {
392			ret++;
393			break;
394		}
395
396		os_memcpy(buf, tv->plain, tv->len);
397		if (aes_128_cbc_encrypt(tv->key, tv->iv, buf, tv->len) ||
398		    os_memcmp(buf, tv->cipher, tv->len) != 0) {
399			wpa_printf(MSG_ERROR, "AES-CBC encrypt %d failed", i);
400			ret++;
401		}
402
403		os_memcpy(buf, tv->cipher, tv->len);
404		if (aes_128_cbc_decrypt(tv->key, tv->iv, buf, tv->len) ||
405		    os_memcmp(buf, tv->plain, tv->len) != 0) {
406			wpa_printf(MSG_ERROR, "AES-CBC decrypt %d failed", i);
407			ret++;
408		}
409
410		os_free(buf);
411	}
412
413	return ret;
414}
415
416
417static int test_ecb(void)
418{
419#ifdef EAP_PSK
420	struct ecb_test_vector {
421		char *key;
422		char *plaintext;
423		char *ciphertext;
424	} vectors[] = {
425		/* CAVS 11.1 - ECBGFSbox128.rsp */
426		{
427			"00000000000000000000000000000000",
428			"f34481ec3cc627bacd5dc3fb08f273e6",
429			"0336763e966d92595a567cc9ce537f5e"
430		},
431		{
432			"00000000000000000000000000000000",
433			"9798c4640bad75c7c3227db910174e72",
434			"a9a1631bf4996954ebc093957b234589"
435		},
436		{
437			"00000000000000000000000000000000",
438			"96ab5c2ff612d9dfaae8c31f30c42168",
439			"ff4f8391a6a40ca5b25d23bedd44a597"
440		},
441		{
442			"00000000000000000000000000000000",
443			"6a118a874519e64e9963798a503f1d35",
444			"dc43be40be0e53712f7e2bf5ca707209"
445		},
446		{
447			"00000000000000000000000000000000",
448			"cb9fceec81286ca3e989bd979b0cb284",
449			"92beedab1895a94faa69b632e5cc47ce"
450		},
451		{
452			"00000000000000000000000000000000",
453			"b26aeb1874e47ca8358ff22378f09144",
454			"459264f4798f6a78bacb89c15ed3d601"
455		},
456		{
457			"00000000000000000000000000000000",
458			"58c8e00b2631686d54eab84b91f0aca1",
459			"08a4e2efec8a8e3312ca7460b9040bbf"
460		},
461		/* CAVS 11.1 - ECBKeySbox128.rsp */
462		{
463			"10a58869d74be5a374cf867cfb473859",
464			"00000000000000000000000000000000",
465			"6d251e6944b051e04eaa6fb4dbf78465"
466		},
467		{
468			"caea65cdbb75e9169ecd22ebe6e54675",
469			"00000000000000000000000000000000",
470			"6e29201190152df4ee058139def610bb",
471		}
472	};
473	int ret = 0;
474	unsigned int i;
475	u8 key[16], plain[16], cipher[16], out[16];
476
477	for (i = 0; i < ARRAY_SIZE(vectors); i++) {
478		struct ecb_test_vector *tv = &vectors[i];
479
480		if (hexstr2bin(tv->key, key, sizeof(key)) ||
481		    hexstr2bin(tv->plaintext, plain, sizeof(plain)) ||
482		    hexstr2bin(tv->ciphertext, cipher, sizeof(cipher))) {
483			wpa_printf(MSG_ERROR, "Invalid AES-ECB test vector %u",
484				   i);
485			ret++;
486			continue;
487		}
488
489		if (aes_128_encrypt_block(key, plain, out) < 0 ||
490		    os_memcmp(out, cipher, 16) != 0) {
491			wpa_printf(MSG_ERROR, "AES-ECB encrypt %u failed", i);
492			ret++;
493		}
494	}
495
496	if (!ret)
497		wpa_printf(MSG_INFO, "AES ECB mode test cases passed");
498
499	return ret;
500#endif /* EAP_PSK */
501
502	return 0;
503}
504
505
506static int test_key_wrap(void)
507{
508	int ret = 0;
509
510	/* RFC 3394 - Test vector 4.1 */
511	u8 kek41[] = {
512		0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
513		0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f
514	};
515	u8 plain41[] = {
516		0x00, 0x11, 0x22, 0x33, 0x44, 0x55, 0x66, 0x77,
517		0x88, 0x99, 0xaa, 0xbb, 0xcc, 0xdd, 0xee, 0xff
518	};
519	u8 crypt41[] = {
520		0x1F, 0xA6, 0x8B, 0x0A, 0x81, 0x12, 0xB4, 0x47,
521		0xAE, 0xF3, 0x4B, 0xD8, 0xFB, 0x5A, 0x7B, 0x82,
522		0x9D, 0x3E, 0x86, 0x23, 0x71, 0xD2, 0xCF, 0xE5
523	};
524#ifndef CONFIG_BORINGSSL
525	/* RFC 3394 - Test vector 4.2 */
526	u8 kek42[] = {
527		0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
528		0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f,
529		0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17
530	};
531	u8 plain42[] = {
532		0x00, 0x11, 0x22, 0x33, 0x44, 0x55, 0x66, 0x77,
533		0x88, 0x99, 0xaa, 0xbb, 0xcc, 0xdd, 0xee, 0xff
534	};
535	u8 crypt42[] = {
536		0x96, 0x77, 0x8B, 0x25, 0xAE, 0x6C, 0xA4, 0x35,
537		0xF9, 0x2B, 0x5B, 0x97, 0xC0, 0x50, 0xAE, 0xD2,
538		0x46, 0x8A, 0xB8, 0xA1, 0x7A, 0xD8, 0x4E, 0x5D
539	};
540#endif /* CONFIG_BORINGSSL */
541	/* RFC 3394 - Test vector 4.3 */
542	u8 kek43[] = {
543		0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
544		0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F,
545		0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17,
546		0x18, 0x19, 0x1A, 0x1B, 0x1C, 0x1D, 0x1E, 0x1F
547	};
548	u8 plain43[] = {
549		0x00, 0x11, 0x22, 0x33, 0x44, 0x55, 0x66, 0x77,
550		0x88, 0x99, 0xaa, 0xbb, 0xcc, 0xdd, 0xee, 0xff
551	};
552	u8 crypt43[] = {
553		0x64, 0xE8, 0xC3, 0xF9, 0xCE, 0x0F, 0x5B, 0xA2,
554		0x63, 0xE9, 0x77, 0x79, 0x05, 0x81, 0x8A, 0x2A,
555		0x93, 0xC8, 0x19, 0x1E, 0x7D, 0x6E, 0x8A, 0xE7,
556	};
557#ifndef CONFIG_BORINGSSL
558	/* RFC 3394 - Test vector 4.4 */
559	u8 kek44[] = {
560		0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
561		0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f,
562		0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17
563	};
564	u8 plain44[] = {
565		0x00, 0x11, 0x22, 0x33, 0x44, 0x55, 0x66, 0x77,
566		0x88, 0x99, 0xaa, 0xbb, 0xcc, 0xdd, 0xee, 0xff,
567		0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07
568	};
569	u8 crypt44[] = {
570		0x03, 0x1D, 0x33, 0x26, 0x4E, 0x15, 0xD3, 0x32,
571		0x68, 0xF2, 0x4E, 0xC2, 0x60, 0x74, 0x3E, 0xDC,
572		0xE1, 0xC6, 0xC7, 0xDD, 0xEE, 0x72, 0x5A, 0x93,
573		0x6B, 0xA8, 0x14, 0x91, 0x5C, 0x67, 0x62, 0xD2
574	};
575#endif /* CONFIG_BORINGSSL */
576	/* RFC 3394 - Test vector 4.5 */
577	u8 kek45[] = {
578		0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
579		0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F,
580		0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17,
581		0x18, 0x19, 0x1A, 0x1B, 0x1C, 0x1D, 0x1E, 0x1F
582	};
583	u8 plain45[] = {
584		0x00, 0x11, 0x22, 0x33, 0x44, 0x55, 0x66, 0x77,
585		0x88, 0x99, 0xaa, 0xbb, 0xcc, 0xdd, 0xee, 0xff,
586		0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07
587	};
588	u8 crypt45[] = {
589		0xA8, 0xF9, 0xBC, 0x16, 0x12, 0xC6, 0x8B, 0x3F,
590		0xF6, 0xE6, 0xF4, 0xFB, 0xE3, 0x0E, 0x71, 0xE4,
591		0x76, 0x9C, 0x8B, 0x80, 0xA3, 0x2C, 0xB8, 0x95,
592		0x8C, 0xD5, 0xD1, 0x7D, 0x6B, 0x25, 0x4D, 0xA1,
593	};
594	/* RFC 3394 - Test vector 4.6 */
595	u8 kek46[] = {
596		0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
597		0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F,
598		0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17,
599		0x18, 0x19, 0x1A, 0x1B, 0x1C, 0x1D, 0x1E, 0x1F
600	};
601	u8 plain46[] = {
602		0x00, 0x11, 0x22, 0x33, 0x44, 0x55, 0x66, 0x77,
603		0x88, 0x99, 0xAA, 0xBB, 0xCC, 0xDD, 0xEE, 0xFF,
604		0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
605		0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F
606	};
607	u8 crypt46[] = {
608		0x28, 0xC9, 0xF4, 0x04, 0xC4, 0xB8, 0x10, 0xF4,
609		0xCB, 0xCC, 0xB3, 0x5C, 0xFB, 0x87, 0xF8, 0x26,
610		0x3F, 0x57, 0x86, 0xE2, 0xD8, 0x0E, 0xD3, 0x26,
611		0xCB, 0xC7, 0xF0, 0xE7, 0x1A, 0x99, 0xF4, 0x3B,
612		0xFB, 0x98, 0x8B, 0x9B, 0x7A, 0x02, 0xDD, 0x21
613	};
614	u8 result[40];
615
616	wpa_printf(MSG_INFO, "RFC 3394 - Test vector 4.1");
617	if (aes_wrap(kek41, sizeof(kek41), sizeof(plain41) / 8, plain41,
618		     result)) {
619		wpa_printf(MSG_ERROR, "AES-WRAP-128 reported failure");
620		ret++;
621	}
622	if (os_memcmp(result, crypt41, sizeof(crypt41)) != 0) {
623		wpa_printf(MSG_ERROR, "AES-WRAP-128 failed");
624		ret++;
625	}
626	if (aes_unwrap(kek41, sizeof(kek41), sizeof(plain41) / 8, crypt41,
627		       result)) {
628		wpa_printf(MSG_ERROR, "AES-UNWRAP-128 reported failure");
629		ret++;
630	}
631	if (os_memcmp(result, plain41, sizeof(plain41)) != 0) {
632		wpa_printf(MSG_ERROR, "AES-UNWRAP-128 failed");
633		ret++;
634	}
635
636#ifndef CONFIG_BORINGSSL
637	wpa_printf(MSG_INFO, "RFC 3394 - Test vector 4.2");
638	if (aes_wrap(kek42, sizeof(kek42), sizeof(plain42) / 8, plain42,
639		     result)) {
640		wpa_printf(MSG_ERROR, "AES-WRAP-192 reported failure");
641		ret++;
642	}
643	if (os_memcmp(result, crypt42, sizeof(crypt42)) != 0) {
644		wpa_printf(MSG_ERROR, "AES-WRAP-192 failed");
645		ret++;
646	}
647	if (aes_unwrap(kek42, sizeof(kek42), sizeof(plain42) / 8, crypt42,
648		       result)) {
649		wpa_printf(MSG_ERROR, "AES-UNWRAP-192 reported failure");
650		ret++;
651	}
652	if (os_memcmp(result, plain42, sizeof(plain42)) != 0) {
653		wpa_printf(MSG_ERROR, "AES-UNWRAP-192 failed");
654		ret++;
655	}
656#endif /* CONFIG_BORINGSSL */
657
658	wpa_printf(MSG_INFO, "RFC 3394 - Test vector 4.3");
659	if (aes_wrap(kek43, sizeof(kek43), sizeof(plain43) / 8, plain43,
660		     result)) {
661		wpa_printf(MSG_ERROR, "AES-WRAP-256 reported failure");
662		ret++;
663	}
664	if (os_memcmp(result, crypt43, sizeof(crypt43)) != 0) {
665		wpa_printf(MSG_ERROR, "AES-WRAP-256 failed");
666		ret++;
667	}
668	if (aes_unwrap(kek43, sizeof(kek43), sizeof(plain43) / 8, crypt43,
669		       result)) {
670		wpa_printf(MSG_ERROR, "AES-UNWRAP-256 reported failure");
671		ret++;
672	}
673	if (os_memcmp(result, plain43, sizeof(plain43)) != 0) {
674		wpa_printf(MSG_ERROR, "AES-UNWRAP-256 failed");
675		ret++;
676	}
677
678#ifndef CONFIG_BORINGSSL
679	wpa_printf(MSG_INFO, "RFC 3394 - Test vector 4.4");
680	if (aes_wrap(kek44, sizeof(kek44), sizeof(plain44) / 8, plain44,
681		     result)) {
682		wpa_printf(MSG_ERROR, "AES-WRAP-192 reported failure");
683		ret++;
684	}
685	if (os_memcmp(result, crypt44, sizeof(crypt44)) != 0) {
686		wpa_printf(MSG_ERROR, "AES-WRAP-192 failed");
687		ret++;
688	}
689	if (aes_unwrap(kek44, sizeof(kek44), sizeof(plain44) / 8, crypt44,
690		       result)) {
691		wpa_printf(MSG_ERROR, "AES-UNWRAP-192 reported failure");
692		ret++;
693	}
694	if (os_memcmp(result, plain44, sizeof(plain44)) != 0) {
695		wpa_printf(MSG_ERROR, "AES-UNWRAP-192 failed");
696		ret++;
697	}
698#endif /* CONFIG_BORINGSSL */
699
700	wpa_printf(MSG_INFO, "RFC 3394 - Test vector 4.5");
701	if (aes_wrap(kek45, sizeof(kek45), sizeof(plain45) / 8, plain45,
702		     result)) {
703		wpa_printf(MSG_ERROR, "AES-WRAP-256 reported failure");
704		ret++;
705	}
706	if (os_memcmp(result, crypt45, sizeof(crypt45)) != 0) {
707		wpa_printf(MSG_ERROR, "AES-WRAP-256 failed");
708		ret++;
709	}
710	if (aes_unwrap(kek45, sizeof(kek45), sizeof(plain45) / 8, crypt45,
711		       result)) {
712		wpa_printf(MSG_ERROR, "AES-UNWRAP-256 reported failure");
713		ret++;
714	}
715	if (os_memcmp(result, plain45, sizeof(plain45)) != 0) {
716		wpa_printf(MSG_ERROR, "AES-UNWRAP-256 failed");
717		ret++;
718	}
719
720	wpa_printf(MSG_INFO, "RFC 3394 - Test vector 4.6");
721	if (aes_wrap(kek46, sizeof(kek46), sizeof(plain46) / 8, plain46,
722		     result)) {
723		wpa_printf(MSG_ERROR, "AES-WRAP-256 reported failure");
724		ret++;
725	}
726	if (os_memcmp(result, crypt46, sizeof(crypt46)) != 0) {
727		wpa_printf(MSG_ERROR, "AES-WRAP-256 failed");
728		ret++;
729	}
730	if (aes_unwrap(kek46, sizeof(kek46), sizeof(plain46) / 8, crypt46,
731		       result)) {
732		wpa_printf(MSG_ERROR, "AES-UNWRAP-256 reported failure");
733		ret++;
734	}
735	if (os_memcmp(result, plain46, sizeof(plain46)) != 0) {
736		wpa_printf(MSG_ERROR, "AES-UNWRAP-256 failed");
737		ret++;
738	}
739
740	if (!ret)
741		wpa_printf(MSG_INFO, "AES key wrap/unwrap test cases passed");
742
743	return ret;
744}
745
746
747static int test_md5(void)
748{
749#ifndef CONFIG_FIPS
750	struct {
751		char *data;
752		char *hash;
753	} tests[] = {
754		{
755			"",
756			"\xd4\x1d\x8c\xd9\x8f\x00\xb2\x04"
757			"\xe9\x80\x09\x98\xec\xf8\x42\x7e"
758		},
759		{
760			"a",
761			"\x0c\xc1\x75\xb9\xc0\xf1\xb6\xa8"
762			"\x31\xc3\x99\xe2\x69\x77\x26\x61"
763		},
764		{
765			"abc",
766			"\x90\x01\x50\x98\x3c\xd2\x4f\xb0"
767			"\xd6\x96\x3f\x7d\x28\xe1\x7f\x72"
768		},
769		{
770			"message digest",
771			"\xf9\x6b\x69\x7d\x7c\xb7\x93\x8d"
772			"\x52\x5a\x2f\x31\xaa\xf1\x61\xd0"
773		},
774		{
775			"abcdefghijklmnopqrstuvwxyz",
776			"\xc3\xfc\xd3\xd7\x61\x92\xe4\x00"
777			"\x7d\xfb\x49\x6c\xca\x67\xe1\x3b"
778		},
779		{
780			"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz"
781			"0123456789",
782			"\xd1\x74\xab\x98\xd2\x77\xd9\xf5"
783			"\xa5\x61\x1c\x2c\x9f\x41\x9d\x9f"
784		},
785		{
786			"12345678901234567890123456789012345678901234567890"
787			"123456789012345678901234567890",
788			"\x57\xed\xf4\xa2\x2b\xe3\xc9\x55"
789			"\xac\x49\xda\x2e\x21\x07\xb6\x7a"
790		}
791	};
792	unsigned int i;
793	u8 hash[16];
794	const u8 *addr[2];
795	size_t len[2];
796	int errors = 0;
797
798	for (i = 0; i < ARRAY_SIZE(tests); i++) {
799		wpa_printf(MSG_INFO, "MD5 test case %d", i);
800
801		addr[0] = (u8 *) tests[i].data;
802		len[0] = strlen(tests[i].data);
803		if (md5_vector(1, addr, len, hash) < 0 ||
804		    os_memcmp(hash, tests[i].hash, 16) != 0) {
805			wpa_printf(MSG_INFO, " FAIL");
806			errors++;
807		} else
808			wpa_printf(MSG_INFO, " OK");
809
810		if (len[0]) {
811			addr[0] = (u8 *) tests[i].data;
812			len[0] = strlen(tests[i].data);
813			addr[1] = (u8 *) tests[i].data + 1;
814			len[1] = strlen(tests[i].data) - 1;
815			if (md5_vector(1, addr, len, hash) < 0 ||
816			    os_memcmp(hash, tests[i].hash, 16) != 0) {
817				wpa_printf(MSG_INFO, " FAIL");
818				errors++;
819			} else
820				wpa_printf(MSG_INFO, " OK");
821		}
822	}
823
824	if (!errors)
825		wpa_printf(MSG_INFO, "MD5 test cases passed");
826
827	return errors;
828#else /* CONFIG_FIPS */
829	wpa_printf(MSG_INFO, "MD5 test cases skipped due to CONFIG_FIPS");
830	return 0;
831#endif /* CONFIG_FIPS */
832}
833
834
835static int test_eap_fast(void)
836{
837#ifdef EAP_FAST
838	/* RFC 4851, Appendix B.1 */
839	const u8 pac_key[] = {
840		0x0B, 0x97, 0x39, 0x0F, 0x37, 0x51, 0x78, 0x09,
841		0x81, 0x1E, 0xFD, 0x9C, 0x6E, 0x65, 0x94, 0x2B,
842		0x63, 0x2C, 0xE9, 0x53, 0x89, 0x38, 0x08, 0xBA,
843		0x36, 0x0B, 0x03, 0x7C, 0xD1, 0x85, 0xE4, 0x14
844	};
845	const u8 seed[] = {
846		0x3F, 0xFB, 0x11, 0xC4, 0x6C, 0xBF, 0xA5, 0x7A,
847		0x54, 0x40, 0xDA, 0xE8, 0x22, 0xD3, 0x11, 0xD3,
848		0xF7, 0x6D, 0xE4, 0x1D, 0xD9, 0x33, 0xE5, 0x93,
849		0x70, 0x97, 0xEB, 0xA9, 0xB3, 0x66, 0xF4, 0x2A,
850		0x00, 0x00, 0x00, 0x02, 0x6A, 0x66, 0x43, 0x2A,
851		0x8D, 0x14, 0x43, 0x2C, 0xEC, 0x58, 0x2D, 0x2F,
852		0xC7, 0x9C, 0x33, 0x64, 0xBA, 0x04, 0xAD, 0x3A,
853		0x52, 0x54, 0xD6, 0xA5, 0x79, 0xAD, 0x1E, 0x00
854	};
855	const u8 master_secret[] = {
856		0x4A, 0x1A, 0x51, 0x2C, 0x01, 0x60, 0xBC, 0x02,
857		0x3C, 0xCF, 0xBC, 0x83, 0x3F, 0x03, 0xBC, 0x64,
858		0x88, 0xC1, 0x31, 0x2F, 0x0B, 0xA9, 0xA2, 0x77,
859		0x16, 0xA8, 0xD8, 0xE8, 0xBD, 0xC9, 0xD2, 0x29,
860		0x38, 0x4B, 0x7A, 0x85, 0xBE, 0x16, 0x4D, 0x27,
861		0x33, 0xD5, 0x24, 0x79, 0x87, 0xB1, 0xC5, 0xA2
862	};
863#ifndef CONFIG_FIPS
864	const u8 key_block[] = {
865		0x59, 0x59, 0xBE, 0x8E, 0x41, 0x3A, 0x77, 0x74,
866		0x8B, 0xB2, 0xE5, 0xD3, 0x60, 0xAC, 0x4D, 0x35,
867		0xDF, 0xFB, 0xC8, 0x1E, 0x9C, 0x24, 0x9C, 0x8B,
868		0x0E, 0xC3, 0x1D, 0x72, 0xC8, 0x84, 0x9D, 0x57,
869		0x48, 0x51, 0x2E, 0x45, 0x97, 0x6C, 0x88, 0x70,
870		0xBE, 0x5F, 0x01, 0xD3, 0x64, 0xE7, 0x4C, 0xBB,
871		0x11, 0x24, 0xE3, 0x49, 0xE2, 0x3B, 0xCD, 0xEF,
872		0x7A, 0xB3, 0x05, 0x39, 0x5D, 0x64, 0x8A, 0x44,
873		0x11, 0xB6, 0x69, 0x88, 0x34, 0x2E, 0x8E, 0x29,
874		0xD6, 0x4B, 0x7D, 0x72, 0x17, 0x59, 0x28, 0x05,
875		0xAF, 0xF9, 0xB7, 0xFF, 0x66, 0x6D, 0xA1, 0x96,
876		0x8F, 0x0B, 0x5E, 0x06, 0x46, 0x7A, 0x44, 0x84,
877		0x64, 0xC1, 0xC8, 0x0C, 0x96, 0x44, 0x09, 0x98,
878		0xFF, 0x92, 0xA8, 0xB4, 0xC6, 0x42, 0x28, 0x71
879	};
880#endif /* CONFIG_FIPS */
881	const u8 sks[] = {
882		0xD6, 0x4B, 0x7D, 0x72, 0x17, 0x59, 0x28, 0x05,
883		0xAF, 0xF9, 0xB7, 0xFF, 0x66, 0x6D, 0xA1, 0x96,
884		0x8F, 0x0B, 0x5E, 0x06, 0x46, 0x7A, 0x44, 0x84,
885		0x64, 0xC1, 0xC8, 0x0C, 0x96, 0x44, 0x09, 0x98,
886		0xFF, 0x92, 0xA8, 0xB4, 0xC6, 0x42, 0x28, 0x71
887	};
888	const u8 isk[] = {
889		0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
890		0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
891		0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
892		0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
893	};
894	const u8 imck[] = {
895		0x16, 0x15, 0x3C, 0x3F, 0x21, 0x55, 0xEF, 0xD9,
896		0x7F, 0x34, 0xAE, 0xC8, 0x1A, 0x4E, 0x66, 0x80,
897		0x4C, 0xC3, 0x76, 0xF2, 0x8A, 0xA9, 0x6F, 0x96,
898		0xC2, 0x54, 0x5F, 0x8C, 0xAB, 0x65, 0x02, 0xE1,
899		0x18, 0x40, 0x7B, 0x56, 0xBE, 0xEA, 0xA7, 0xC5,
900		0x76, 0x5D, 0x8F, 0x0B, 0xC5, 0x07, 0xC6, 0xB9,
901		0x04, 0xD0, 0x69, 0x56, 0x72, 0x8B, 0x6B, 0xB8,
902		0x15, 0xEC, 0x57, 0x7B
903	};
904	const u8 msk[] = {
905		0x4D, 0x83, 0xA9, 0xBE, 0x6F, 0x8A, 0x74, 0xED,
906		0x6A, 0x02, 0x66, 0x0A, 0x63, 0x4D, 0x2C, 0x33,
907		0xC2, 0xDA, 0x60, 0x15, 0xC6, 0x37, 0x04, 0x51,
908		0x90, 0x38, 0x63, 0xDA, 0x54, 0x3E, 0x14, 0xB9,
909		0x27, 0x99, 0x18, 0x1E, 0x07, 0xBF, 0x0F, 0x5A,
910		0x5E, 0x3C, 0x32, 0x93, 0x80, 0x8C, 0x6C, 0x49,
911		0x67, 0xED, 0x24, 0xFE, 0x45, 0x40, 0xA0, 0x59,
912		0x5E, 0x37, 0xC2, 0xE9, 0xD0, 0x5D, 0x0A, 0xE3
913	};
914	const u8 emsk[] = {
915		0x3A, 0xD4, 0xAB, 0xDB, 0x76, 0xB2, 0x7F, 0x3B,
916		0xEA, 0x32, 0x2C, 0x2B, 0x74, 0xF4, 0x28, 0x55,
917		0xEF, 0x2D, 0xBA, 0x78, 0xC9, 0x57, 0x2F, 0x0D,
918		0x06, 0xCD, 0x51, 0x7C, 0x20, 0x93, 0x98, 0xA9,
919		0x76, 0xEA, 0x70, 0x21, 0xD7, 0x0E, 0x25, 0x54,
920		0x97, 0xED, 0xB2, 0x8A, 0xF6, 0xED, 0xFD, 0x0A,
921		0x2A, 0xE7, 0xA1, 0x58, 0x90, 0x10, 0x50, 0x44,
922		0xB3, 0x82, 0x85, 0xDB, 0x06, 0x14, 0xD2, 0xF9
923	};
924	/* RFC 4851, Appendix B.2 */
925	u8 tlv[] = {
926		0x80, 0x0C, 0x00, 0x38, 0x00, 0x01, 0x01, 0x00,
927		0xD8, 0x6A, 0x8C, 0x68, 0x3C, 0x32, 0x31, 0xA8,
928		0x56, 0x63, 0xB6, 0x40, 0x21, 0xFE, 0x21, 0x14,
929		0x4E, 0xE7, 0x54, 0x20, 0x79, 0x2D, 0x42, 0x62,
930		0xC9, 0xBF, 0x53, 0x7F, 0x54, 0xFD, 0xAC, 0x58,
931		0x43, 0x24, 0x6E, 0x30, 0x92, 0x17, 0x6D, 0xCF,
932		0xE6, 0xE0, 0x69, 0xEB, 0x33, 0x61, 0x6A, 0xCC,
933		0x05, 0xC5, 0x5B, 0xB7
934	};
935	const u8 compound_mac[] = {
936		0x43, 0x24, 0x6E, 0x30, 0x92, 0x17, 0x6D, 0xCF,
937		0xE6, 0xE0, 0x69, 0xEB, 0x33, 0x61, 0x6A, 0xCC,
938		0x05, 0xC5, 0x5B, 0xB7
939	};
940	u8 buf[512];
941	const u8 *simck, *cmk;
942	int errors = 0;
943
944	wpa_printf(MSG_INFO, "EAP-FAST test cases");
945
946	wpa_printf(MSG_INFO, "- T-PRF (SHA1) test case / master_secret");
947	if (sha1_t_prf(pac_key, sizeof(pac_key),
948		       "PAC to master secret label hash",
949		       seed, sizeof(seed), buf, sizeof(master_secret)) < 0 ||
950	    os_memcmp(master_secret, buf, sizeof(master_secret)) != 0) {
951		wpa_printf(MSG_INFO, "T-PRF test - FAILED!");
952		errors++;
953	}
954
955#ifndef CONFIG_FIPS
956	wpa_printf(MSG_INFO, "- PRF (TLS, SHA1/MD5) test case / key_block");
957	if (tls_prf_sha1_md5(master_secret, sizeof(master_secret),
958			     "key expansion", seed, sizeof(seed),
959			     buf, sizeof(key_block)) ||
960	    os_memcmp(key_block, buf, sizeof(key_block)) != 0) {
961		wpa_printf(MSG_INFO, "PRF test - FAILED!");
962		errors++;
963	}
964#endif /* CONFIG_FIPS */
965
966	wpa_printf(MSG_INFO, "- T-PRF (SHA1) test case / IMCK");
967	if (sha1_t_prf(sks, sizeof(sks), "Inner Methods Compound Keys",
968		       isk, sizeof(isk), buf, sizeof(imck)) < 0 ||
969	    os_memcmp(imck, buf, sizeof(imck)) != 0) {
970		wpa_printf(MSG_INFO, "T-PRF test - FAILED!");
971		errors++;
972	}
973
974	simck = imck;
975	cmk = imck + 40;
976
977	wpa_printf(MSG_INFO, "- T-PRF (SHA1) test case / MSK");
978	if (sha1_t_prf(simck, 40, "Session Key Generating Function",
979		       (u8 *) "", 0, buf, sizeof(msk)) < 0 ||
980	    os_memcmp(msk, buf, sizeof(msk)) != 0) {
981		wpa_printf(MSG_INFO, "T-PRF test - FAILED!");
982		errors++;
983	}
984
985	wpa_printf(MSG_INFO, "- T-PRF (SHA1) test case / EMSK");
986	if (sha1_t_prf(simck, 40, "Extended Session Key Generating Function",
987		       (u8 *) "", 0, buf, sizeof(msk)) < 0 ||
988	    os_memcmp(emsk, buf, sizeof(emsk)) != 0) {
989		wpa_printf(MSG_INFO, "T-PRF test - FAILED!");
990		errors++;
991	}
992
993	wpa_printf(MSG_INFO, "- Compound MAC test case");
994	os_memset(tlv + sizeof(tlv) - 20, 0, 20);
995	if (hmac_sha1(cmk, 20, tlv, sizeof(tlv), tlv + sizeof(tlv) - 20) < 0 ||
996	    os_memcmp(tlv + sizeof(tlv) - 20, compound_mac,
997		      sizeof(compound_mac)) != 0) {
998		wpa_printf(MSG_INFO, "Compound MAC test - FAILED!");
999		errors++;
1000	}
1001
1002	return errors;
1003#else /* EAP_FAST */
1004	return 0;
1005#endif /* EAP_FAST */
1006}
1007
1008
1009static const u8 key0[] =
1010{
1011	0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b,
1012	0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b,
1013	0x0b, 0x0b, 0x0b, 0x0b
1014};
1015static const u8 data0[] = "Hi There";
1016static const u8 prf0[] =
1017{
1018	0xbc, 0xd4, 0xc6, 0x50, 0xb3, 0x0b, 0x96, 0x84,
1019	0x95, 0x18, 0x29, 0xe0, 0xd7, 0x5f, 0x9d, 0x54,
1020	0xb8, 0x62, 0x17, 0x5e, 0xd9, 0xf0, 0x06, 0x06,
1021	0xe1, 0x7d, 0x8d, 0xa3, 0x54, 0x02, 0xff, 0xee,
1022	0x75, 0xdf, 0x78, 0xc3, 0xd3, 0x1e, 0x0f, 0x88,
1023	0x9f, 0x01, 0x21, 0x20, 0xc0, 0x86, 0x2b, 0xeb,
1024	0x67, 0x75, 0x3e, 0x74, 0x39, 0xae, 0x24, 0x2e,
1025	0xdb, 0x83, 0x73, 0x69, 0x83, 0x56, 0xcf, 0x5a
1026};
1027
1028static const u8 key1[] = "Jefe";
1029static const u8 data1[] = "what do ya want for nothing?";
1030static const u8 prf1[] =
1031{
1032	0x51, 0xf4, 0xde, 0x5b, 0x33, 0xf2, 0x49, 0xad,
1033	0xf8, 0x1a, 0xeb, 0x71, 0x3a, 0x3c, 0x20, 0xf4,
1034	0xfe, 0x63, 0x14, 0x46, 0xfa, 0xbd, 0xfa, 0x58,
1035	0x24, 0x47, 0x59, 0xae, 0x58, 0xef, 0x90, 0x09,
1036	0xa9, 0x9a, 0xbf, 0x4e, 0xac, 0x2c, 0xa5, 0xfa,
1037	0x87, 0xe6, 0x92, 0xc4, 0x40, 0xeb, 0x40, 0x02,
1038	0x3e, 0x7b, 0xab, 0xb2, 0x06, 0xd6, 0x1d, 0xe7,
1039	0xb9, 0x2f, 0x41, 0x52, 0x90, 0x92, 0xb8, 0xfc
1040};
1041
1042
1043static const u8 key2[] =
1044{
1045	0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa,
1046	0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa,
1047	0xaa, 0xaa, 0xaa, 0xaa
1048};
1049static const u8 data2[] =
1050{
1051	0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd,
1052	0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd,
1053	0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd,
1054	0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd,
1055	0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd,
1056	0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd,
1057	0xdd, 0xdd
1058};
1059static const u8 prf2[] =
1060{
1061	0xe1, 0xac, 0x54, 0x6e, 0xc4, 0xcb, 0x63, 0x6f,
1062	0x99, 0x76, 0x48, 0x7b, 0xe5, 0xc8, 0x6b, 0xe1,
1063	0x7a, 0x02, 0x52, 0xca, 0x5d, 0x8d, 0x8d, 0xf1,
1064	0x2c, 0xfb, 0x04, 0x73, 0x52, 0x52, 0x49, 0xce,
1065	0x9d, 0xd8, 0xd1, 0x77, 0xea, 0xd7, 0x10, 0xbc,
1066	0x9b, 0x59, 0x05, 0x47, 0x23, 0x91, 0x07, 0xae,
1067	0xf7, 0xb4, 0xab, 0xd4, 0x3d, 0x87, 0xf0, 0xa6,
1068	0x8f, 0x1c, 0xbd, 0x9e, 0x2b, 0x6f, 0x76, 0x07
1069};
1070
1071
1072struct passphrase_test {
1073	char *passphrase;
1074	char *ssid;
1075	char psk[32];
1076};
1077
1078static const struct passphrase_test passphrase_tests[] =
1079{
1080	{
1081		"password",
1082		"IEEE",
1083		{
1084			0xf4, 0x2c, 0x6f, 0xc5, 0x2d, 0xf0, 0xeb, 0xef,
1085			0x9e, 0xbb, 0x4b, 0x90, 0xb3, 0x8a, 0x5f, 0x90,
1086			0x2e, 0x83, 0xfe, 0x1b, 0x13, 0x5a, 0x70, 0xe2,
1087			0x3a, 0xed, 0x76, 0x2e, 0x97, 0x10, 0xa1, 0x2e
1088		}
1089	},
1090	{
1091		"ThisIsAPassword",
1092		"ThisIsASSID",
1093		{
1094			0x0d, 0xc0, 0xd6, 0xeb, 0x90, 0x55, 0x5e, 0xd6,
1095			0x41, 0x97, 0x56, 0xb9, 0xa1, 0x5e, 0xc3, 0xe3,
1096			0x20, 0x9b, 0x63, 0xdf, 0x70, 0x7d, 0xd5, 0x08,
1097			0xd1, 0x45, 0x81, 0xf8, 0x98, 0x27, 0x21, 0xaf
1098		}
1099	},
1100	{
1101		"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa",
1102		"ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ",
1103		{
1104			0xbe, 0xcb, 0x93, 0x86, 0x6b, 0xb8, 0xc3, 0x83,
1105			0x2c, 0xb7, 0x77, 0xc2, 0xf5, 0x59, 0x80, 0x7c,
1106			0x8c, 0x59, 0xaf, 0xcb, 0x6e, 0xae, 0x73, 0x48,
1107			0x85, 0x00, 0x13, 0x00, 0xa9, 0x81, 0xcc, 0x62
1108		}
1109	},
1110};
1111
1112#define NUM_PASSPHRASE_TESTS ARRAY_SIZE(passphrase_tests)
1113
1114
1115struct rfc6070_test {
1116	char *p;
1117	char *s;
1118	int c;
1119	char dk[32];
1120	size_t dk_len;
1121};
1122
1123static const struct rfc6070_test rfc6070_tests[] =
1124{
1125	{
1126		"password",
1127		"salt",
1128		1,
1129		{
1130			0x0c, 0x60, 0xc8, 0x0f, 0x96, 0x1f, 0x0e, 0x71,
1131			0xf3, 0xa9, 0xb5, 0x24, 0xaf, 0x60, 0x12, 0x06,
1132			0x2f, 0xe0, 0x37, 0xa6
1133		},
1134		20
1135	},
1136	{
1137		"password",
1138		"salt",
1139		2,
1140		{
1141			0xea, 0x6c, 0x01, 0x4d, 0xc7, 0x2d, 0x6f, 0x8c,
1142			0xcd, 0x1e, 0xd9, 0x2a, 0xce, 0x1d, 0x41, 0xf0,
1143			0xd8, 0xde, 0x89, 0x57
1144		},
1145		20
1146	},
1147	{
1148		"password",
1149		"salt",
1150		4096,
1151		{
1152			0x4b, 0x00, 0x79, 0x01, 0xb7, 0x65, 0x48, 0x9a,
1153			0xbe, 0xad, 0x49, 0xd9, 0x26, 0xf7, 0x21, 0xd0,
1154			0x65, 0xa4, 0x29, 0xc1
1155		},
1156		20
1157	},
1158#if 0 /* This takes quite long to derive.. */
1159	{
1160		"password",
1161		"salt",
1162		16777216,
1163		{
1164			0xee, 0xfe, 0x3d, 0x61, 0xcd, 0x4d, 0xa4, 0xe4,
1165			0xe9, 0x94, 0x5b, 0x3d, 0x6b, 0xa2, 0x15, 0x8c,
1166			0x26, 0x34, 0xe9, 0x84
1167		},
1168		20
1169	},
1170#endif
1171	{
1172		"passwordPASSWORDpassword",
1173		"saltSALTsaltSALTsaltSALTsaltSALTsalt",
1174		4096,
1175		{
1176			0x3d, 0x2e, 0xec, 0x4f, 0xe4, 0x1c, 0x84, 0x9b,
1177			0x80, 0xc8, 0xd8, 0x36, 0x62, 0xc0, 0xe4, 0x4a,
1178			0x8b, 0x29, 0x1a, 0x96, 0x4c, 0xf2, 0xf0, 0x70,
1179			0x38
1180		},
1181		25
1182	},
1183#if 0 /* \0 not currently supported in passphrase parameters.. */
1184	{
1185		"pass\0word",
1186		"sa\0lt",
1187		4096,
1188		{
1189			0x56, 0xfa, 0x6a, 0xa7, 0x55, 0x48, 0x09, 0x9d,
1190			0xcc, 0x37, 0xd7, 0xf0, 0x34, 0x25, 0xe0, 0xc3
1191		},
1192		16
1193	},
1194#endif
1195};
1196
1197#define NUM_RFC6070_TESTS ARRAY_SIZE(rfc6070_tests)
1198
1199
1200static int test_sha1(void)
1201{
1202	u8 res[512];
1203	int ret = 0;
1204	unsigned int i;
1205
1206	wpa_printf(MSG_INFO, "PRF-SHA1 test cases:");
1207
1208	if (sha1_prf(key0, sizeof(key0), "prefix", data0, sizeof(data0) - 1,
1209		     res, sizeof(prf0)) == 0 &&
1210	    os_memcmp(res, prf0, sizeof(prf0)) == 0)
1211		wpa_printf(MSG_INFO, "Test case 0 - OK");
1212	else {
1213		wpa_printf(MSG_INFO, "Test case 0 - FAILED!");
1214		ret++;
1215	}
1216
1217	if (sha1_prf(key1, sizeof(key1) - 1, "prefix", data1, sizeof(data1) - 1,
1218		     res, sizeof(prf1)) == 0 &&
1219	    os_memcmp(res, prf1, sizeof(prf1)) == 0)
1220		wpa_printf(MSG_INFO, "Test case 1 - OK");
1221	else {
1222		wpa_printf(MSG_INFO, "Test case 1 - FAILED!");
1223		ret++;
1224	}
1225
1226	if (sha1_prf(key2, sizeof(key2), "prefix", data2, sizeof(data2),
1227		     res, sizeof(prf2)) == 0 &&
1228	    os_memcmp(res, prf2, sizeof(prf2)) == 0)
1229		wpa_printf(MSG_INFO, "Test case 2 - OK");
1230	else {
1231		wpa_printf(MSG_INFO, "Test case 2 - FAILED!");
1232		ret++;
1233	}
1234
1235	ret += test_eap_fast();
1236
1237	wpa_printf(MSG_INFO, "PBKDF2-SHA1 Passphrase test cases:");
1238	for (i = 0; i < NUM_PASSPHRASE_TESTS; i++) {
1239		u8 psk[32];
1240		const struct passphrase_test *test = &passphrase_tests[i];
1241
1242		if (pbkdf2_sha1(test->passphrase,
1243				(const u8 *) test->ssid, strlen(test->ssid),
1244				4096, psk, 32) == 0 &&
1245		    os_memcmp(psk, test->psk, 32) == 0)
1246			wpa_printf(MSG_INFO, "Test case %d - OK", i);
1247		else {
1248			wpa_printf(MSG_INFO, "Test case %d - FAILED!", i);
1249			ret++;
1250		}
1251	}
1252
1253	wpa_printf(MSG_INFO, "PBKDF2-SHA1 test cases (RFC 6070):");
1254	for (i = 0; i < NUM_RFC6070_TESTS; i++) {
1255		u8 dk[25];
1256		const struct rfc6070_test *test = &rfc6070_tests[i];
1257
1258		if (pbkdf2_sha1(test->p, (const u8 *) test->s, strlen(test->s),
1259				test->c, dk, test->dk_len) == 0 &&
1260		    os_memcmp(dk, test->dk, test->dk_len) == 0)
1261			wpa_printf(MSG_INFO, "Test case %d - OK", i);
1262		else {
1263			wpa_printf(MSG_INFO, "Test case %d - FAILED!", i);
1264			ret++;
1265		}
1266	}
1267
1268	if (!ret)
1269		wpa_printf(MSG_INFO, "SHA1 test cases passed");
1270	return ret;
1271}
1272
1273
1274static const struct {
1275	char *data;
1276	u8 hash[32];
1277} tests[] = {
1278	{
1279		"abc",
1280		{
1281			0xba, 0x78, 0x16, 0xbf, 0x8f, 0x01, 0xcf, 0xea,
1282			0x41, 0x41, 0x40, 0xde, 0x5d, 0xae, 0x22, 0x23,
1283			0xb0, 0x03, 0x61, 0xa3, 0x96, 0x17, 0x7a, 0x9c,
1284			0xb4, 0x10, 0xff, 0x61, 0xf2, 0x00, 0x15, 0xad
1285		}
1286	},
1287	{
1288		"abcdbcdecdefdefgefghfghighijhijkijkljklmklmnlmnomnopnopq",
1289		{
1290			0x24, 0x8d, 0x6a, 0x61, 0xd2, 0x06, 0x38, 0xb8,
1291			0xe5, 0xc0, 0x26, 0x93, 0x0c, 0x3e, 0x60, 0x39,
1292			0xa3, 0x3c, 0xe4, 0x59, 0x64, 0xff, 0x21, 0x67,
1293			0xf6, 0xec, 0xed, 0xd4, 0x19, 0xdb, 0x06, 0xc1
1294		}
1295	}
1296};
1297
1298static const struct hmac_test {
1299	u8 key[150];
1300	size_t key_len;
1301	u8 data[160];
1302	size_t data_len;
1303	u8 hash[32]; /* HMAC-SHA-256 */
1304	u8 hash384[48]; /* HMAC-SHA-384 */
1305} hmac_tests[] = {
1306	/* draft-ietf-ipsec-ciph-sha-256-01.txt; RFC 4231 */
1307	{
1308		{
1309			0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08,
1310			0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, 0x10,
1311			0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x18,
1312			0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f, 0x20
1313		},
1314		32,
1315		"abc", 3,
1316		{
1317			0xa2, 0x1b, 0x1f, 0x5d, 0x4c, 0xf4, 0xf7, 0x3a,
1318			0x4d, 0xd9, 0x39, 0x75, 0x0f, 0x7a, 0x06, 0x6a,
1319			0x7f, 0x98, 0xcc, 0x13, 0x1c, 0xb1, 0x6a, 0x66,
1320			0x92, 0x75, 0x90, 0x21, 0xcf, 0xab, 0x81, 0x81
1321		},
1322		{ }
1323	},
1324	{
1325		{
1326			0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08,
1327			0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, 0x10,
1328			0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x18,
1329			0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f, 0x20
1330		},
1331		32,
1332		"abcdbcdecdefdefgefghfghighijhijkijkljklmklmnlmnomnopnopq",
1333		56,
1334		{
1335			0x10, 0x4f, 0xdc, 0x12, 0x57, 0x32, 0x8f, 0x08,
1336			0x18, 0x4b, 0xa7, 0x31, 0x31, 0xc5, 0x3c, 0xae,
1337			0xe6, 0x98, 0xe3, 0x61, 0x19, 0x42, 0x11, 0x49,
1338			0xea, 0x8c, 0x71, 0x24, 0x56, 0x69, 0x7d, 0x30
1339		},
1340		{ }
1341	},
1342	{
1343		{
1344			0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08,
1345			0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, 0x10,
1346			0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x18,
1347			0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f, 0x20
1348		},
1349		32,
1350		"abcdbcdecdefdefgefghfghighijhijkijkljklmklmnlmnomnopnopq"
1351		"abcdbcdecdefdefgefghfghighijhijkijkljklmklmnlmnomnopnopq",
1352		112,
1353		{
1354			0x47, 0x03, 0x05, 0xfc, 0x7e, 0x40, 0xfe, 0x34,
1355			0xd3, 0xee, 0xb3, 0xe7, 0x73, 0xd9, 0x5a, 0xab,
1356			0x73, 0xac, 0xf0, 0xfd, 0x06, 0x04, 0x47, 0xa5,
1357			0xeb, 0x45, 0x95, 0xbf, 0x33, 0xa9, 0xd1, 0xa3
1358		},
1359		{ }
1360	},
1361	{
1362		{
1363			0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b,
1364			0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b,
1365			0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b,
1366			0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b
1367		},
1368		32,
1369		"Hi There",
1370		8,
1371		{
1372			0x19, 0x8a, 0x60, 0x7e, 0xb4, 0x4b, 0xfb, 0xc6,
1373			0x99, 0x03, 0xa0, 0xf1, 0xcf, 0x2b, 0xbd, 0xc5,
1374			0xba, 0x0a, 0xa3, 0xf3, 0xd9, 0xae, 0x3c, 0x1c,
1375			0x7a, 0x3b, 0x16, 0x96, 0xa0, 0xb6, 0x8c, 0xf7
1376		},
1377		{ }
1378	},
1379	{ /* RFC 4231 - Test Case 1 */
1380		{
1381			0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b,
1382			0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b,
1383			0x0b, 0x0b, 0x0b, 0x0b
1384		},
1385		20,
1386		"Hi There",
1387		8,
1388		{
1389			0xb0, 0x34, 0x4c, 0x61, 0xd8, 0xdb, 0x38, 0x53,
1390			0x5c, 0xa8, 0xaf, 0xce, 0xaf, 0x0b, 0xf1, 0x2b,
1391			0x88, 0x1d, 0xc2, 0x00, 0xc9, 0x83, 0x3d, 0xa7,
1392			0x26, 0xe9, 0x37, 0x6c, 0x2e, 0x32, 0xcf, 0xf7
1393		},
1394		{
1395			0xaf, 0xd0, 0x39, 0x44, 0xd8, 0x48, 0x95, 0x62,
1396			0x6b, 0x08, 0x25, 0xf4, 0xab, 0x46, 0x90, 0x7f,
1397			0x15, 0xf9, 0xda, 0xdb, 0xe4, 0x10, 0x1e, 0xc6,
1398			0x82, 0xaa, 0x03, 0x4c, 0x7c, 0xeb, 0xc5, 0x9c,
1399			0xfa, 0xea, 0x9e, 0xa9, 0x07, 0x6e, 0xde, 0x7f,
1400			0x4a, 0xf1, 0x52, 0xe8, 0xb2, 0xfa, 0x9c, 0xb6
1401		}
1402	},
1403	{ /* RFC 4231 - Test Case 2 */
1404		"Jefe",
1405		4,
1406		"what do ya want for nothing?",
1407		28,
1408		{
1409			0x5b, 0xdc, 0xc1, 0x46, 0xbf, 0x60, 0x75, 0x4e,
1410			0x6a, 0x04, 0x24, 0x26, 0x08, 0x95, 0x75, 0xc7,
1411			0x5a, 0x00, 0x3f, 0x08, 0x9d, 0x27, 0x39, 0x83,
1412			0x9d, 0xec, 0x58, 0xb9, 0x64, 0xec, 0x38, 0x43
1413		},
1414		{
1415			0xaf, 0x45, 0xd2, 0xe3, 0x76, 0x48, 0x40, 0x31,
1416			0x61, 0x7f, 0x78, 0xd2, 0xb5, 0x8a, 0x6b, 0x1b,
1417			0x9c, 0x7e, 0xf4, 0x64, 0xf5, 0xa0, 0x1b, 0x47,
1418			0xe4, 0x2e, 0xc3, 0x73, 0x63, 0x22, 0x44, 0x5e,
1419			0x8e, 0x22, 0x40, 0xca, 0x5e, 0x69, 0xe2, 0xc7,
1420			0x8b, 0x32, 0x39, 0xec, 0xfa, 0xb2, 0x16, 0x49
1421		}
1422	},
1423	{
1424		{
1425			0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa,
1426			0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa,
1427			0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa,
1428			0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa
1429		},
1430		32,
1431		{
1432			0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd,
1433			0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd,
1434			0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd,
1435			0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd,
1436			0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd,
1437			0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd,
1438			0xdd, 0xdd
1439		},
1440		50,
1441		{
1442			0xcd, 0xcb, 0x12, 0x20, 0xd1, 0xec, 0xcc, 0xea,
1443			0x91, 0xe5, 0x3a, 0xba, 0x30, 0x92, 0xf9, 0x62,
1444			0xe5, 0x49, 0xfe, 0x6c, 0xe9, 0xed, 0x7f, 0xdc,
1445			0x43, 0x19, 0x1f, 0xbd, 0xe4, 0x5c, 0x30, 0xb0
1446		},
1447		{ }
1448	},
1449	{ /* RFC 4231 - Test Case 3 */
1450		{
1451			0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa,
1452			0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa,
1453			0xaa, 0xaa, 0xaa, 0xaa
1454		},
1455		20,
1456		{
1457			0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd,
1458			0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd,
1459			0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd,
1460			0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd,
1461			0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd,
1462			0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd,
1463			0xdd, 0xdd
1464		},
1465		50,
1466		{
1467			0x77, 0x3e, 0xa9, 0x1e, 0x36, 0x80, 0x0e, 0x46,
1468			0x85, 0x4d, 0xb8, 0xeb, 0xd0, 0x91, 0x81, 0xa7,
1469			0x29, 0x59, 0x09, 0x8b, 0x3e, 0xf8, 0xc1, 0x22,
1470			0xd9, 0x63, 0x55, 0x14, 0xce, 0xd5, 0x65, 0xfe
1471		},
1472		{
1473			0x88, 0x06, 0x26, 0x08, 0xd3, 0xe6, 0xad, 0x8a,
1474			0x0a, 0xa2, 0xac, 0xe0, 0x14, 0xc8, 0xa8, 0x6f,
1475			0x0a, 0xa6, 0x35, 0xd9, 0x47, 0xac, 0x9f, 0xeb,
1476			0xe8, 0x3e, 0xf4, 0xe5, 0x59, 0x66, 0x14, 0x4b,
1477			0x2a, 0x5a, 0xb3, 0x9d, 0xc1, 0x38, 0x14, 0xb9,
1478			0x4e, 0x3a, 0xb6, 0xe1, 0x01, 0xa3, 0x4f, 0x27
1479		}
1480	},
1481	{
1482		{
1483			0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08,
1484			0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, 0x10,
1485			0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x18,
1486			0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f, 0x20,
1487			0x21, 0x22, 0x23, 0x24, 0x25
1488		},
1489		37,
1490		{
1491			0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd,
1492			0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd,
1493			0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd,
1494			0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd,
1495			0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd,
1496			0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd,
1497			0xcd, 0xcd
1498		},
1499		50,
1500		{
1501			0xd4, 0x63, 0x3c, 0x17, 0xf6, 0xfb, 0x8d, 0x74,
1502			0x4c, 0x66, 0xde, 0xe0, 0xf8, 0xf0, 0x74, 0x55,
1503			0x6e, 0xc4, 0xaf, 0x55, 0xef, 0x07, 0x99, 0x85,
1504			0x41, 0x46, 0x8e, 0xb4, 0x9b, 0xd2, 0xe9, 0x17
1505		},
1506		{ }
1507	},
1508	{ /* RFC 4231 - Test Case 4 */
1509		{
1510			0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08,
1511			0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, 0x10,
1512			0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x18,
1513			0x19,
1514		},
1515		25,
1516		{
1517			0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd,
1518			0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd,
1519			0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd,
1520			0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd,
1521			0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd,
1522			0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd,
1523			0xcd, 0xcd
1524		},
1525		50,
1526		{
1527			0x82, 0x55, 0x8a, 0x38, 0x9a, 0x44, 0x3c, 0x0e,
1528			0xa4, 0xcc, 0x81, 0x98, 0x99, 0xf2, 0x08, 0x3a,
1529			0x85, 0xf0, 0xfa, 0xa3, 0xe5, 0x78, 0xf8, 0x07,
1530			0x7a, 0x2e, 0x3f, 0xf4, 0x67, 0x29, 0x66, 0x5b
1531		},
1532		{
1533			0x3e, 0x8a, 0x69, 0xb7, 0x78, 0x3c, 0x25, 0x85,
1534			0x19, 0x33, 0xab, 0x62, 0x90, 0xaf, 0x6c, 0xa7,
1535			0x7a, 0x99, 0x81, 0x48, 0x08, 0x50, 0x00, 0x9c,
1536			0xc5, 0x57, 0x7c, 0x6e, 0x1f, 0x57, 0x3b, 0x4e,
1537			0x68, 0x01, 0xdd, 0x23, 0xc4, 0xa7, 0xd6, 0x79,
1538			0xcc, 0xf8, 0xa3, 0x86, 0xc6, 0x74, 0xcf, 0xfb
1539		}
1540	},
1541	{
1542		{
1543			0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c,
1544			0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c,
1545			0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c,
1546			0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c
1547		},
1548		32,
1549		"Test With Truncation",
1550		20,
1551		{
1552			0x75, 0x46, 0xaf, 0x01, 0x84, 0x1f, 0xc0, 0x9b,
1553			0x1a, 0xb9, 0xc3, 0x74, 0x9a, 0x5f, 0x1c, 0x17,
1554			0xd4, 0xf5, 0x89, 0x66, 0x8a, 0x58, 0x7b, 0x27,
1555			0x00, 0xa9, 0xc9, 0x7c, 0x11, 0x93, 0xcf, 0x42
1556		},
1557		{ }
1558	},
1559	{
1560		{
1561			0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa,
1562			0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa,
1563			0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa,
1564			0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa,
1565			0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa,
1566			0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa,
1567			0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa,
1568			0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa,
1569			0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa,
1570			0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa
1571		},
1572		80,
1573		"Test Using Larger Than Block-Size Key - Hash Key First",
1574		54,
1575		{
1576			0x69, 0x53, 0x02, 0x5e, 0xd9, 0x6f, 0x0c, 0x09,
1577			0xf8, 0x0a, 0x96, 0xf7, 0x8e, 0x65, 0x38, 0xdb,
1578			0xe2, 0xe7, 0xb8, 0x20, 0xe3, 0xdd, 0x97, 0x0e,
1579			0x7d, 0xdd, 0x39, 0x09, 0x1b, 0x32, 0x35, 0x2f
1580		},
1581		{ }
1582	},
1583	{ /* RFC 4231 - Test Case 6 */
1584		{
1585			0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa,
1586			0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa,
1587			0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa,
1588			0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa,
1589			0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa,
1590			0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa,
1591			0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa,
1592			0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa,
1593			0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa,
1594			0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa,
1595			0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa,
1596			0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa,
1597			0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa,
1598			0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa,
1599			0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa,
1600			0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa,
1601			0xaa, 0xaa, 0xaa
1602		},
1603		131,
1604		"Test Using Larger Than Block-Size Key - Hash Key First",
1605		54,
1606		{
1607			0x60, 0xe4, 0x31, 0x59, 0x1e, 0xe0, 0xb6, 0x7f,
1608			0x0d, 0x8a, 0x26, 0xaa, 0xcb, 0xf5, 0xb7, 0x7f,
1609			0x8e, 0x0b, 0xc6, 0x21, 0x37, 0x28, 0xc5, 0x14,
1610			0x05, 0x46, 0x04, 0x0f, 0x0e, 0xe3, 0x7f, 0x54
1611		},
1612		{
1613			0x4e, 0xce, 0x08, 0x44, 0x85, 0x81, 0x3e, 0x90,
1614			0x88, 0xd2, 0xc6, 0x3a, 0x04, 0x1b, 0xc5, 0xb4,
1615			0x4f, 0x9e, 0xf1, 0x01, 0x2a, 0x2b, 0x58, 0x8f,
1616			0x3c, 0xd1, 0x1f, 0x05, 0x03, 0x3a, 0xc4, 0xc6,
1617			0x0c, 0x2e, 0xf6, 0xab, 0x40, 0x30, 0xfe, 0x82,
1618			0x96, 0x24, 0x8d, 0xf1, 0x63, 0xf4, 0x49, 0x52
1619		}
1620	},
1621	{
1622		{
1623			0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa,
1624			0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa,
1625			0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa,
1626			0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa,
1627			0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa,
1628			0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa,
1629			0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa,
1630			0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa,
1631			0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa,
1632			0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa
1633		},
1634		80,
1635		"Test Using Larger Than Block-Size Key and Larger Than One "
1636		"Block-Size Data",
1637		73,
1638		{
1639			0x63, 0x55, 0xac, 0x22, 0xe8, 0x90, 0xd0, 0xa3,
1640			0xc8, 0x48, 0x1a, 0x5c, 0xa4, 0x82, 0x5b, 0xc8,
1641			0x84, 0xd3, 0xe7, 0xa1, 0xff, 0x98, 0xa2, 0xfc,
1642			0x2a, 0xc7, 0xd8, 0xe0, 0x64, 0xc3, 0xb2, 0xe6
1643		},
1644		{ }
1645	},
1646	{ /* RFC 4231 - Test Case 7 */
1647		{
1648			0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa,
1649			0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa,
1650			0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa,
1651			0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa,
1652			0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa,
1653			0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa,
1654			0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa,
1655			0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa,
1656			0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa,
1657			0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa,
1658			0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa,
1659			0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa,
1660			0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa,
1661			0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa,
1662			0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa,
1663			0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa,
1664			0xaa, 0xaa, 0xaa
1665		},
1666		131,
1667		"This is a test using a larger than block-size key and a larger than block-size data. The key needs to be hashed before being used by the HMAC algorithm.",
1668		152,
1669		{
1670			0x9b, 0x09, 0xff, 0xa7, 0x1b, 0x94, 0x2f, 0xcb,
1671			0x27, 0x63, 0x5f, 0xbc, 0xd5, 0xb0, 0xe9, 0x44,
1672			0xbf, 0xdc, 0x63, 0x64, 0x4f, 0x07, 0x13, 0x93,
1673			0x8a, 0x7f, 0x51, 0x53, 0x5c, 0x3a, 0x35, 0xe2
1674		},
1675		{
1676			0x66, 0x17, 0x17, 0x8e, 0x94, 0x1f, 0x02, 0x0d,
1677			0x35, 0x1e, 0x2f, 0x25, 0x4e, 0x8f, 0xd3, 0x2c,
1678			0x60, 0x24, 0x20, 0xfe, 0xb0, 0xb8, 0xfb, 0x9a,
1679			0xdc, 0xce, 0xbb, 0x82, 0x46, 0x1e, 0x99, 0xc5,
1680			0xa6, 0x78, 0xcc, 0x31, 0xe7, 0x99, 0x17, 0x6d,
1681			0x38, 0x60, 0xe6, 0x11, 0x0c, 0x46, 0x52, 0x3e
1682		}
1683	}
1684};
1685
1686
1687static int test_sha256(void)
1688{
1689	unsigned int i;
1690	u8 hash[32];
1691	const u8 *addr[2];
1692	size_t len[2];
1693	int errors = 0;
1694	u8 *key;
1695
1696	for (i = 0; i < ARRAY_SIZE(tests); i++) {
1697		wpa_printf(MSG_INFO, "SHA256 test case %d:", i + 1);
1698
1699		addr[0] = (u8 *) tests[i].data;
1700		len[0] = strlen(tests[i].data);
1701		sha256_vector(1, addr, len, hash);
1702		if (memcmp(hash, tests[i].hash, 32) != 0) {
1703			wpa_printf(MSG_INFO, " FAIL");
1704			errors++;
1705		} else
1706			wpa_printf(MSG_INFO, " OK");
1707
1708		if (len[0]) {
1709			addr[0] = (u8 *) tests[i].data;
1710			len[0] = 1;
1711			addr[1] = (u8 *) tests[i].data + 1;
1712			len[1] = strlen(tests[i].data) - 1;
1713			sha256_vector(2, addr, len, hash);
1714			if (memcmp(hash, tests[i].hash, 32) != 0) {
1715				wpa_printf(MSG_INFO, " FAIL");
1716				errors++;
1717			} else
1718				wpa_printf(MSG_INFO, " OK");
1719		}
1720	}
1721
1722	for (i = 0; i < ARRAY_SIZE(hmac_tests); i++) {
1723		const struct hmac_test *t = &hmac_tests[i];
1724
1725		wpa_printf(MSG_INFO, "HMAC-SHA256 test case %d:", i + 1);
1726
1727		if (hmac_sha256(t->key, t->key_len, t->data, t->data_len,
1728				hash) < 0 ||
1729		    os_memcmp(hash, t->hash, 32) != 0) {
1730			wpa_printf(MSG_INFO, " FAIL");
1731			errors++;
1732		} else
1733			wpa_printf(MSG_INFO, " OK");
1734
1735		addr[0] = t->data;
1736		len[0] = t->data_len;
1737		if (hmac_sha256_vector(t->key, t->key_len, 1, addr, len,
1738				       hash) < 0 ||
1739		    os_memcmp(hash, t->hash, 32) != 0) {
1740			wpa_printf(MSG_INFO, " FAIL");
1741			errors++;
1742		} else
1743			wpa_printf(MSG_INFO, " OK");
1744
1745		if (len[0]) {
1746			addr[0] = t->data;
1747			len[0] = 1;
1748			addr[1] = t->data + 1;
1749			len[1] = t->data_len - 1;
1750			if (hmac_sha256_vector(t->key, t->key_len, 2, addr, len,
1751					       hash) < 0 ||
1752			    os_memcmp(hash, t->hash, 32) != 0) {
1753				wpa_printf(MSG_INFO, " FAIL");
1754				errors++;
1755			} else
1756				wpa_printf(MSG_INFO, " OK");
1757		}
1758	}
1759
1760	wpa_printf(MSG_INFO, "Test IEEE 802.11r KDF");
1761	sha256_prf((u8 *) "abc", 3, "KDF test", (u8 *) "data", 4,
1762		   hash, sizeof(hash));
1763	/* TODO: add proper test case for this */
1764
1765	key = os_malloc(8161);
1766	if (key) {
1767#ifdef CONFIG_HMAC_SHA256_KDF
1768		int res;
1769
1770		res = hmac_sha256_kdf((u8 *) "secret", 6, "label",
1771				      (u8 *) "seed", 4, key, 8160);
1772		if (res) {
1773			wpa_printf(MSG_INFO,
1774				   "Unexpected hmac_sha256_kdf(outlen=8160) failure");
1775			errors++;
1776		}
1777
1778		res = hmac_sha256_kdf((u8 *) "secret", 6, "label",
1779				      (u8 *) "seed", 4, key, 8161);
1780		if (res == 0) {
1781			wpa_printf(MSG_INFO,
1782				   "Unexpected hmac_sha256_kdf(outlen=8161) success");
1783			errors++;
1784		}
1785#endif /* CONFIG_HMAC_SHA256_KDF */
1786
1787		os_free(key);
1788	}
1789
1790	if (!errors)
1791		wpa_printf(MSG_INFO, "SHA256 test cases passed");
1792	return errors;
1793}
1794
1795
1796static int test_sha384(void)
1797{
1798#ifdef CONFIG_SHA384
1799	unsigned int i;
1800	u8 hash[48];
1801	const u8 *addr[2];
1802	size_t len[2];
1803	int errors = 0;
1804	const char *data = "hello";
1805	const u8 hash_res[] = {
1806		0x59, 0xe1, 0x74, 0x87, 0x77, 0x44, 0x8c, 0x69,
1807		0xde, 0x6b, 0x80, 0x0d, 0x7a, 0x33, 0xbb, 0xfb,
1808		0x9f, 0xf1, 0xb4, 0x63, 0xe4, 0x43, 0x54, 0xc3,
1809		0x55, 0x3b, 0xcd, 0xb9, 0xc6, 0x66, 0xfa, 0x90,
1810		0x12, 0x5a, 0x3c, 0x79, 0xf9, 0x03, 0x97, 0xbd,
1811		0xf5, 0xf6, 0xa1, 0x3d, 0xe8, 0x28, 0x68, 0x4f
1812	};
1813
1814	addr[0] = (const u8 *) data;
1815	len[0] = 5;
1816	if (sha384_vector(1, addr, len, hash) < 0 ||
1817	    os_memcmp(hash, hash_res, 48) != 0) {
1818		wpa_printf(MSG_INFO, "SHA384 test case 1: FAIL");
1819		errors++;
1820	} else {
1821		wpa_printf(MSG_INFO, "SHA384 test case 1: OK");
1822	}
1823
1824	addr[0] = (const u8 *) data;
1825	len[0] = 4;
1826	addr[1] = (const u8 *) data + 4;
1827	len[1] = 1;
1828	if (sha384_vector(2, addr, len, hash) < 0 ||
1829	    os_memcmp(hash, hash_res, 48) != 0) {
1830		wpa_printf(MSG_INFO, "SHA384 test case 2: FAIL");
1831		errors++;
1832	} else {
1833		wpa_printf(MSG_INFO, "SHA384 test case 2: OK");
1834	}
1835
1836	for (i = 0; i < ARRAY_SIZE(hmac_tests); i++) {
1837		const struct hmac_test *t = &hmac_tests[i];
1838
1839		if (t->hash384[0] == 0 && t->hash384[1] == 0 &&
1840		    t->hash384[2] == 0 && t->hash384[3] == 0)
1841			continue;
1842		wpa_printf(MSG_INFO, "HMAC-SHA384 test case %d:", i + 1);
1843
1844		if (hmac_sha384(t->key, t->key_len, t->data, t->data_len,
1845				hash) < 0 ||
1846		    os_memcmp(hash, t->hash384, 48) != 0) {
1847			wpa_printf(MSG_INFO, " FAIL");
1848			errors++;
1849		} else
1850			wpa_printf(MSG_INFO, " OK");
1851
1852		addr[0] = t->data;
1853		len[0] = t->data_len;
1854		if (hmac_sha384_vector(t->key, t->key_len, 1, addr, len,
1855				       hash) < 0 ||
1856		    os_memcmp(hash, t->hash384, 48) != 0) {
1857			wpa_printf(MSG_INFO, " FAIL");
1858			errors++;
1859		} else
1860			wpa_printf(MSG_INFO, " OK");
1861
1862		if (len[0]) {
1863			addr[0] = t->data;
1864			len[0] = 1;
1865			addr[1] = t->data + 1;
1866			len[1] = t->data_len - 1;
1867			if (hmac_sha384_vector(t->key, t->key_len, 2, addr, len,
1868					       hash) < 0 ||
1869			    os_memcmp(hash, t->hash384, 48) != 0) {
1870				wpa_printf(MSG_INFO, " FAIL");
1871				errors++;
1872			} else
1873				wpa_printf(MSG_INFO, " OK");
1874		}
1875	}
1876
1877	if (!errors)
1878		wpa_printf(MSG_INFO, "SHA384 test cases passed");
1879	return errors;
1880#else /* CONFIG_SHA384 */
1881	return 0;
1882#endif /* CONFIG_SHA384 */
1883}
1884
1885
1886static int test_fips186_2_prf(void)
1887{
1888	/* http://csrc.nist.gov/encryption/dss/Examples-1024bit.pdf */
1889	u8 xkey[] = {
1890		0xbd, 0x02, 0x9b, 0xbe, 0x7f, 0x51, 0x96, 0x0b,
1891		0xcf, 0x9e, 0xdb, 0x2b, 0x61, 0xf0, 0x6f, 0x0f,
1892		0xeb, 0x5a, 0x38, 0xb6
1893	};
1894	u8 w[] = {
1895		0x20, 0x70, 0xb3, 0x22, 0x3d, 0xba, 0x37, 0x2f,
1896		0xde, 0x1c, 0x0f, 0xfc, 0x7b, 0x2e, 0x3b, 0x49,
1897		0x8b, 0x26, 0x06, 0x14, 0x3c, 0x6c, 0x18, 0xba,
1898		0xcb, 0x0f, 0x6c, 0x55, 0xba, 0xbb, 0x13, 0x78,
1899		0x8e, 0x20, 0xd7, 0x37, 0xa3, 0x27, 0x51, 0x16
1900	};
1901	u8 buf[40];
1902
1903	wpa_printf(MSG_INFO,
1904		   "Testing EAP-SIM PRF (FIPS 186-2 + change notice 1)");
1905	if (fips186_2_prf(xkey, sizeof(xkey), buf, sizeof(buf)) < 0 ||
1906	    os_memcmp(w, buf, sizeof(w)) != 0) {
1907		wpa_printf(MSG_INFO, "fips186_2_prf failed");
1908		return 1;
1909	}
1910
1911	return 0;
1912}
1913
1914
1915static int test_extract_expand_hkdf(void)
1916{
1917	u8 prk[SHA256_MAC_LEN];
1918	u8 okm[82];
1919
1920	/* RFC 5869, A.1 */
1921	u8 ikm1[22] = {
1922		0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b,
1923		0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b,
1924		0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b
1925	};
1926	u8 salt1[13] = {
1927		0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
1928		0x08, 0x09, 0x0a, 0x0b, 0x0c
1929	};
1930	u8 info1[10] = {
1931		0xf0, 0xf1, 0xf2, 0xf3, 0xf4, 0xf5, 0xf6, 0xf7,
1932		0xf8, 0xf9
1933	};
1934	u8 prk1[32] = {
1935		0x07, 0x77, 0x09, 0x36, 0x2c, 0x2e, 0x32, 0xdf,
1936		0x0d, 0xdc, 0x3f, 0x0d, 0xc4, 0x7b, 0xba, 0x63,
1937		0x90, 0xb6, 0xc7, 0x3b, 0xb5, 0x0f, 0x9c, 0x31,
1938		0x22, 0xec, 0x84, 0x4a, 0xd7, 0xc2, 0xb3, 0xe5
1939	};
1940	u8 okm1[42] = {
1941		0x3c, 0xb2, 0x5f, 0x25, 0xfa, 0xac, 0xd5, 0x7a,
1942		0x90, 0x43, 0x4f, 0x64, 0xd0, 0x36, 0x2f, 0x2a,
1943		0x2d, 0x2d, 0x0a, 0x90, 0xcf, 0x1a, 0x5a, 0x4c,
1944		0x5d, 0xb0, 0x2d, 0x56, 0xec, 0xc4, 0xc5, 0xbf,
1945		0x34, 0x00, 0x72, 0x08, 0xd5, 0xb8, 0x87, 0x18,
1946		0x58, 0x65
1947	};
1948
1949	/* RFC 5869, A.2 */
1950	u8 ikm2[80] = {
1951		0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
1952		0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f,
1953		0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17,
1954		0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f,
1955		0x20, 0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27,
1956		0x28, 0x29, 0x2a, 0x2b, 0x2c, 0x2d, 0x2e, 0x2f,
1957		0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37,
1958		0x38, 0x39, 0x3a, 0x3b, 0x3c, 0x3d, 0x3e, 0x3f,
1959		0x40, 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x47,
1960		0x48, 0x49, 0x4a, 0x4b, 0x4c, 0x4d, 0x4e, 0x4f
1961	};
1962	u8 salt2[80] = {
1963		0x60, 0x61, 0x62, 0x63, 0x64, 0x65, 0x66, 0x67,
1964		0x68, 0x69, 0x6a, 0x6b, 0x6c, 0x6d, 0x6e, 0x6f,
1965		0x70, 0x71, 0x72, 0x73, 0x74, 0x75, 0x76, 0x77,
1966		0x78, 0x79, 0x7a, 0x7b, 0x7c, 0x7d, 0x7e, 0x7f,
1967		0x80, 0x81, 0x82, 0x83, 0x84, 0x85, 0x86, 0x87,
1968		0x88, 0x89, 0x8a, 0x8b, 0x8c, 0x8d, 0x8e, 0x8f,
1969		0x90, 0x91, 0x92, 0x93, 0x94, 0x95, 0x96, 0x97,
1970		0x98, 0x99, 0x9a, 0x9b, 0x9c, 0x9d, 0x9e, 0x9f,
1971		0xa0, 0xa1, 0xa2, 0xa3, 0xa4, 0xa5, 0xa6, 0xa7,
1972		0xa8, 0xa9, 0xaa, 0xab, 0xac, 0xad, 0xae, 0xaf
1973	};
1974	u8 info2[80] = {
1975		0xb0, 0xb1, 0xb2, 0xb3, 0xb4, 0xb5, 0xb6, 0xb7,
1976		0xb8, 0xb9, 0xba, 0xbb, 0xbc, 0xbd, 0xbe, 0xbf,
1977		0xc0, 0xc1, 0xc2, 0xc3, 0xc4, 0xc5, 0xc6, 0xc7,
1978		0xc8, 0xc9, 0xca, 0xcb, 0xcc, 0xcd, 0xce, 0xcf,
1979		0xd0, 0xd1, 0xd2, 0xd3, 0xd4, 0xd5, 0xd6, 0xd7,
1980		0xd8, 0xd9, 0xda, 0xdb, 0xdc, 0xdd, 0xde, 0xdf,
1981		0xe0, 0xe1, 0xe2, 0xe3, 0xe4, 0xe5, 0xe6, 0xe7,
1982		0xe8, 0xe9, 0xea, 0xeb, 0xec, 0xed, 0xee, 0xef,
1983		0xf0, 0xf1, 0xf2, 0xf3, 0xf4, 0xf5, 0xf6, 0xf7,
1984		0xf8, 0xf9, 0xfa, 0xfb, 0xfc, 0xfd, 0xfe, 0xff
1985	};
1986	u8 prk2[32] = {
1987		0x06, 0xa6, 0xb8, 0x8c, 0x58, 0x53, 0x36, 0x1a,
1988		0x06, 0x10, 0x4c, 0x9c, 0xeb, 0x35, 0xb4, 0x5c,
1989		0xef, 0x76, 0x00, 0x14, 0x90, 0x46, 0x71, 0x01,
1990		0x4a, 0x19, 0x3f, 0x40, 0xc1, 0x5f, 0xc2, 0x44
1991	};
1992	u8 okm2[82] = {
1993		0xb1, 0x1e, 0x39, 0x8d, 0xc8, 0x03, 0x27, 0xa1,
1994		0xc8, 0xe7, 0xf7, 0x8c, 0x59, 0x6a, 0x49, 0x34,
1995		0x4f, 0x01, 0x2e, 0xda, 0x2d, 0x4e, 0xfa, 0xd8,
1996		0xa0, 0x50, 0xcc, 0x4c, 0x19, 0xaf, 0xa9, 0x7c,
1997		0x59, 0x04, 0x5a, 0x99, 0xca, 0xc7, 0x82, 0x72,
1998		0x71, 0xcb, 0x41, 0xc6, 0x5e, 0x59, 0x0e, 0x09,
1999		0xda, 0x32, 0x75, 0x60, 0x0c, 0x2f, 0x09, 0xb8,
2000		0x36, 0x77, 0x93, 0xa9, 0xac, 0xa3, 0xdb, 0x71,
2001		0xcc, 0x30, 0xc5, 0x81, 0x79, 0xec, 0x3e, 0x87,
2002		0xc1, 0x4c, 0x01, 0xd5, 0xc1, 0xf3, 0x43, 0x4f,
2003		0x1d, 0x87
2004	};
2005
2006	wpa_printf(MSG_INFO, "Testing Extract-and-Expand HKDF (RFC 5869)");
2007
2008	wpa_printf(MSG_INFO, "RFC 5869 - Test Case 1");
2009	if (hmac_sha256(salt1, sizeof(salt1), ikm1, sizeof(ikm1), prk) < 0)
2010		return -1;
2011	if (os_memcmp(prk, prk1, SHA256_MAC_LEN) != 0) {
2012		wpa_printf(MSG_INFO, "HKDF-Extract mismatch in PRK");
2013		return -1;
2014	}
2015	if (hmac_sha256_kdf(prk1, sizeof(prk1), NULL, info1, sizeof(info1),
2016			    okm, sizeof(okm1)) < 0)
2017		return -1;
2018	if (os_memcmp(okm, okm1, sizeof(okm1)) != 0) {
2019		wpa_printf(MSG_INFO, "HKDF-Expand mismatch in OKM");
2020		return -1;
2021	}
2022
2023	wpa_printf(MSG_INFO, "RFC 5869 - Test Case 2");
2024	if (hmac_sha256(salt2, sizeof(salt2), ikm2, sizeof(ikm2), prk) < 0)
2025		return -1;
2026	if (os_memcmp(prk, prk2, SHA256_MAC_LEN) != 0) {
2027		wpa_printf(MSG_INFO, "HKDF-Extract mismatch in PRK");
2028		return -1;
2029	}
2030	if (hmac_sha256_kdf(prk2, sizeof(prk2), NULL, info2, sizeof(info2),
2031			    okm, sizeof(okm2)) < 0)
2032		return -1;
2033	if (os_memcmp(okm, okm2, sizeof(okm2)) != 0) {
2034		wpa_printf(MSG_INFO, "HKDF-Expand mismatch in OKM");
2035		return -1;
2036	}
2037
2038	wpa_printf(MSG_INFO, "Extract-and-Expand HKDF test cases passed");
2039
2040	return 0;
2041}
2042
2043
2044static int test_ms_funcs(void)
2045{
2046#ifndef CONFIG_FIPS
2047	/* Test vector from RFC2759 example */
2048	char *username = "User";
2049	char *password = "clientPass";
2050	u8 auth_challenge[] = {
2051		0x5B, 0x5D, 0x7C, 0x7D, 0x7B, 0x3F, 0x2F, 0x3E,
2052		0x3C, 0x2C, 0x60, 0x21, 0x32, 0x26, 0x26, 0x28
2053	};
2054	u8 peer_challenge[] = {
2055		0x21, 0x40, 0x23, 0x24, 0x25, 0x5E, 0x26, 0x2A,
2056		0x28, 0x29, 0x5F, 0x2B, 0x3A, 0x33, 0x7C, 0x7E
2057	};
2058	u8 password_hash[] = {
2059		0x44, 0xEB, 0xBA, 0x8D, 0x53, 0x12, 0xB8, 0xD6,
2060		0x11, 0x47, 0x44, 0x11, 0xF5, 0x69, 0x89, 0xAE
2061	};
2062	u8 nt_response[] = {
2063		0x82, 0x30, 0x9E, 0xCD, 0x8D, 0x70, 0x8B, 0x5E,
2064		0xA0, 0x8F, 0xAA, 0x39, 0x81, 0xCD, 0x83, 0x54,
2065		0x42, 0x33, 0x11, 0x4A, 0x3D, 0x85, 0xD6, 0xDF
2066	};
2067	u8 password_hash_hash[] = {
2068		0x41, 0xC0, 0x0C, 0x58, 0x4B, 0xD2, 0xD9, 0x1C,
2069		0x40, 0x17, 0xA2, 0xA1, 0x2F, 0xA5, 0x9F, 0x3F
2070	};
2071	u8 authenticator_response[] = {
2072		0x40, 0x7A, 0x55, 0x89, 0x11, 0x5F, 0xD0, 0xD6,
2073		0x20, 0x9F, 0x51, 0x0F, 0xE9, 0xC0, 0x45, 0x66,
2074		0x93, 0x2C, 0xDA, 0x56
2075	};
2076	u8 master_key[] = {
2077		0xFD, 0xEC, 0xE3, 0x71, 0x7A, 0x8C, 0x83, 0x8C,
2078		0xB3, 0x88, 0xE5, 0x27, 0xAE, 0x3C, 0xDD, 0x31
2079	};
2080	u8 send_start_key[] = {
2081		0x8B, 0x7C, 0xDC, 0x14, 0x9B, 0x99, 0x3A, 0x1B,
2082		0xA1, 0x18, 0xCB, 0x15, 0x3F, 0x56, 0xDC, 0xCB
2083	};
2084	u8 buf[32];
2085	int errors = 0;
2086
2087	if (nt_password_hash((u8 *) password, os_strlen(password), buf) ||
2088	    os_memcmp(password_hash, buf, sizeof(password_hash)) != 0) {
2089		wpa_printf(MSG_ERROR, "nt_password_hash failed");
2090		errors++;
2091	}
2092
2093	if (generate_nt_response(auth_challenge, peer_challenge,
2094				 (u8 *) username, os_strlen(username),
2095				 (u8 *) password, os_strlen(password), buf) ||
2096	    os_memcmp(nt_response, buf, sizeof(nt_response)) != 0) {
2097		wpa_printf(MSG_ERROR, "generate_nt_response failed");
2098		errors++;
2099	}
2100
2101	if (hash_nt_password_hash(password_hash, buf) ||
2102	    os_memcmp(password_hash_hash, buf,
2103		      sizeof(password_hash_hash)) != 0) {
2104		wpa_printf(MSG_ERROR, "hash_nt_password_hash failed");
2105		errors++;
2106	}
2107
2108	if (generate_authenticator_response((u8 *) password,
2109					    os_strlen(password),
2110					    peer_challenge, auth_challenge,
2111					    (u8 *) username,
2112					    os_strlen(username),
2113					    nt_response, buf) ||
2114	    os_memcmp(authenticator_response, buf,
2115		      sizeof(authenticator_response)) != 0) {
2116		wpa_printf(MSG_ERROR, "generate_authenticator_response failed");
2117		errors++;
2118	}
2119
2120	if (get_master_key(password_hash_hash, nt_response, buf) ||
2121	    os_memcmp(master_key, buf, sizeof(master_key)) != 0) {
2122		wpa_printf(MSG_ERROR, "get_master_key failed");
2123		errors++;
2124	}
2125
2126	if (get_asymetric_start_key(master_key, buf, sizeof(send_start_key),
2127				    1, 1) ||
2128	    os_memcmp(send_start_key, buf, sizeof(send_start_key)) != 0) {
2129		wpa_printf(MSG_ERROR, "get_asymetric_start_key failed");
2130		errors++;
2131	}
2132
2133	if (errors)
2134		wpa_printf(MSG_ERROR, "ms_funcs: %d errors", errors);
2135	else
2136		wpa_printf(MSG_INFO, "ms_funcs test cases passed");
2137
2138	return errors;
2139#else /* CONFIG_FIPS */
2140	wpa_printf(MSG_INFO, "ms_funcs test cases skipped due to CONFIG_FIPS");
2141	return 0;
2142#endif /* CONFIG_FIPS */
2143}
2144
2145
2146int crypto_module_tests(void)
2147{
2148	int ret = 0;
2149
2150	wpa_printf(MSG_INFO, "crypto module tests");
2151	if (test_siv() ||
2152	    test_omac1() ||
2153	    test_eax() ||
2154	    test_cbc() ||
2155	    test_ecb() ||
2156	    test_key_wrap() ||
2157	    test_md5() ||
2158	    test_sha1() ||
2159	    test_sha256() ||
2160	    test_sha384() ||
2161	    test_fips186_2_prf() ||
2162	    test_extract_expand_hkdf() ||
2163	    test_ms_funcs())
2164		ret = -1;
2165
2166	return ret;
2167}
2168