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