xref: /freebsd/contrib/wpa/src/crypto/crypto_module_tests.c (revision 1f4bcc459a76b7aa664f3fd557684cd0ba6da352)
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 
21 static 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 
157 struct omac1_test_vector {
158 	u8 k[16];
159 	u8 msg[64];
160 	int msg_len;
161 	u8 tag[16];
162 };
163 
164 static 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 
213 static 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 
279 static 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 
294 static 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 
343 static 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 
412 static 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 
501 static 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 #ifndef CONFIG_BORINGSSL
520 	/* RFC 3394 - Test vector 4.2 */
521 	u8 kek42[] = {
522 		0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
523 		0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f,
524 		0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17
525 	};
526 	u8 plain42[] = {
527 		0x00, 0x11, 0x22, 0x33, 0x44, 0x55, 0x66, 0x77,
528 		0x88, 0x99, 0xaa, 0xbb, 0xcc, 0xdd, 0xee, 0xff
529 	};
530 	u8 crypt42[] = {
531 		0x96, 0x77, 0x8B, 0x25, 0xAE, 0x6C, 0xA4, 0x35,
532 		0xF9, 0x2B, 0x5B, 0x97, 0xC0, 0x50, 0xAE, 0xD2,
533 		0x46, 0x8A, 0xB8, 0xA1, 0x7A, 0xD8, 0x4E, 0x5D
534 	};
535 #endif /* CONFIG_BORINGSSL */
536 	/* RFC 3394 - Test vector 4.3 */
537 	u8 kek43[] = {
538 		0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
539 		0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F,
540 		0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17,
541 		0x18, 0x19, 0x1A, 0x1B, 0x1C, 0x1D, 0x1E, 0x1F
542 	};
543 	u8 plain43[] = {
544 		0x00, 0x11, 0x22, 0x33, 0x44, 0x55, 0x66, 0x77,
545 		0x88, 0x99, 0xaa, 0xbb, 0xcc, 0xdd, 0xee, 0xff
546 	};
547 	u8 crypt43[] = {
548 		0x64, 0xE8, 0xC3, 0xF9, 0xCE, 0x0F, 0x5B, 0xA2,
549 		0x63, 0xE9, 0x77, 0x79, 0x05, 0x81, 0x8A, 0x2A,
550 		0x93, 0xC8, 0x19, 0x1E, 0x7D, 0x6E, 0x8A, 0xE7,
551 	};
552 #ifndef CONFIG_BORINGSSL
553 	/* RFC 3394 - Test vector 4.4 */
554 	u8 kek44[] = {
555 		0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
556 		0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f,
557 		0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17
558 	};
559 	u8 plain44[] = {
560 		0x00, 0x11, 0x22, 0x33, 0x44, 0x55, 0x66, 0x77,
561 		0x88, 0x99, 0xaa, 0xbb, 0xcc, 0xdd, 0xee, 0xff,
562 		0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07
563 	};
564 	u8 crypt44[] = {
565 		0x03, 0x1D, 0x33, 0x26, 0x4E, 0x15, 0xD3, 0x32,
566 		0x68, 0xF2, 0x4E, 0xC2, 0x60, 0x74, 0x3E, 0xDC,
567 		0xE1, 0xC6, 0xC7, 0xDD, 0xEE, 0x72, 0x5A, 0x93,
568 		0x6B, 0xA8, 0x14, 0x91, 0x5C, 0x67, 0x62, 0xD2
569 	};
570 #endif /* CONFIG_BORINGSSL */
571 	/* RFC 3394 - Test vector 4.5 */
572 	u8 kek45[] = {
573 		0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
574 		0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F,
575 		0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17,
576 		0x18, 0x19, 0x1A, 0x1B, 0x1C, 0x1D, 0x1E, 0x1F
577 	};
578 	u8 plain45[] = {
579 		0x00, 0x11, 0x22, 0x33, 0x44, 0x55, 0x66, 0x77,
580 		0x88, 0x99, 0xaa, 0xbb, 0xcc, 0xdd, 0xee, 0xff,
581 		0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07
582 	};
583 	u8 crypt45[] = {
584 		0xA8, 0xF9, 0xBC, 0x16, 0x12, 0xC6, 0x8B, 0x3F,
585 		0xF6, 0xE6, 0xF4, 0xFB, 0xE3, 0x0E, 0x71, 0xE4,
586 		0x76, 0x9C, 0x8B, 0x80, 0xA3, 0x2C, 0xB8, 0x95,
587 		0x8C, 0xD5, 0xD1, 0x7D, 0x6B, 0x25, 0x4D, 0xA1,
588 	};
589 	/* RFC 3394 - Test vector 4.6 */
590 	u8 kek46[] = {
591 		0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
592 		0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F,
593 		0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17,
594 		0x18, 0x19, 0x1A, 0x1B, 0x1C, 0x1D, 0x1E, 0x1F
595 	};
596 	u8 plain46[] = {
597 		0x00, 0x11, 0x22, 0x33, 0x44, 0x55, 0x66, 0x77,
598 		0x88, 0x99, 0xAA, 0xBB, 0xCC, 0xDD, 0xEE, 0xFF,
599 		0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
600 		0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F
601 	};
602 	u8 crypt46[] = {
603 		0x28, 0xC9, 0xF4, 0x04, 0xC4, 0xB8, 0x10, 0xF4,
604 		0xCB, 0xCC, 0xB3, 0x5C, 0xFB, 0x87, 0xF8, 0x26,
605 		0x3F, 0x57, 0x86, 0xE2, 0xD8, 0x0E, 0xD3, 0x26,
606 		0xCB, 0xC7, 0xF0, 0xE7, 0x1A, 0x99, 0xF4, 0x3B,
607 		0xFB, 0x98, 0x8B, 0x9B, 0x7A, 0x02, 0xDD, 0x21
608 	};
609 	u8 result[40];
610 
611 	wpa_printf(MSG_INFO, "RFC 3394 - Test vector 4.1");
612 	if (aes_wrap(kek41, sizeof(kek41), sizeof(plain41) / 8, plain41,
613 		     result)) {
614 		wpa_printf(MSG_ERROR, "AES-WRAP-128 reported failure");
615 		ret++;
616 	}
617 	if (os_memcmp(result, crypt41, sizeof(crypt41)) != 0) {
618 		wpa_printf(MSG_ERROR, "AES-WRAP-128 failed");
619 		ret++;
620 	}
621 	if (aes_unwrap(kek41, sizeof(kek41), sizeof(plain41) / 8, crypt41,
622 		       result)) {
623 		wpa_printf(MSG_ERROR, "AES-UNWRAP-128 reported failure");
624 		ret++;
625 	}
626 	if (os_memcmp(result, plain41, sizeof(plain41)) != 0) {
627 		wpa_printf(MSG_ERROR, "AES-UNWRAP-128 failed");
628 		ret++;
629 	}
630 
631 #ifndef CONFIG_BORINGSSL
632 	wpa_printf(MSG_INFO, "RFC 3394 - Test vector 4.2");
633 	if (aes_wrap(kek42, sizeof(kek42), sizeof(plain42) / 8, plain42,
634 		     result)) {
635 		wpa_printf(MSG_ERROR, "AES-WRAP-192 reported failure");
636 		ret++;
637 	}
638 	if (os_memcmp(result, crypt42, sizeof(crypt42)) != 0) {
639 		wpa_printf(MSG_ERROR, "AES-WRAP-192 failed");
640 		ret++;
641 	}
642 	if (aes_unwrap(kek42, sizeof(kek42), sizeof(plain42) / 8, crypt42,
643 		       result)) {
644 		wpa_printf(MSG_ERROR, "AES-UNWRAP-192 reported failure");
645 		ret++;
646 	}
647 	if (os_memcmp(result, plain42, sizeof(plain42)) != 0) {
648 		wpa_printf(MSG_ERROR, "AES-UNWRAP-192 failed");
649 		ret++;
650 	}
651 #endif /* CONFIG_BORINGSSL */
652 
653 	wpa_printf(MSG_INFO, "RFC 3394 - Test vector 4.3");
654 	if (aes_wrap(kek43, sizeof(kek43), sizeof(plain43) / 8, plain43,
655 		     result)) {
656 		wpa_printf(MSG_ERROR, "AES-WRAP-256 reported failure");
657 		ret++;
658 	}
659 	if (os_memcmp(result, crypt43, sizeof(crypt43)) != 0) {
660 		wpa_printf(MSG_ERROR, "AES-WRAP-256 failed");
661 		ret++;
662 	}
663 	if (aes_unwrap(kek43, sizeof(kek43), sizeof(plain43) / 8, crypt43,
664 		       result)) {
665 		wpa_printf(MSG_ERROR, "AES-UNWRAP-256 reported failure");
666 		ret++;
667 	}
668 	if (os_memcmp(result, plain43, sizeof(plain43)) != 0) {
669 		wpa_printf(MSG_ERROR, "AES-UNWRAP-256 failed");
670 		ret++;
671 	}
672 
673 #ifndef CONFIG_BORINGSSL
674 	wpa_printf(MSG_INFO, "RFC 3394 - Test vector 4.4");
675 	if (aes_wrap(kek44, sizeof(kek44), sizeof(plain44) / 8, plain44,
676 		     result)) {
677 		wpa_printf(MSG_ERROR, "AES-WRAP-192 reported failure");
678 		ret++;
679 	}
680 	if (os_memcmp(result, crypt44, sizeof(crypt44)) != 0) {
681 		wpa_printf(MSG_ERROR, "AES-WRAP-192 failed");
682 		ret++;
683 	}
684 	if (aes_unwrap(kek44, sizeof(kek44), sizeof(plain44) / 8, crypt44,
685 		       result)) {
686 		wpa_printf(MSG_ERROR, "AES-UNWRAP-192 reported failure");
687 		ret++;
688 	}
689 	if (os_memcmp(result, plain44, sizeof(plain44)) != 0) {
690 		wpa_printf(MSG_ERROR, "AES-UNWRAP-192 failed");
691 		ret++;
692 	}
693 #endif /* CONFIG_BORINGSSL */
694 
695 	wpa_printf(MSG_INFO, "RFC 3394 - Test vector 4.5");
696 	if (aes_wrap(kek45, sizeof(kek45), sizeof(plain45) / 8, plain45,
697 		     result)) {
698 		wpa_printf(MSG_ERROR, "AES-WRAP-256 reported failure");
699 		ret++;
700 	}
701 	if (os_memcmp(result, crypt45, sizeof(crypt45)) != 0) {
702 		wpa_printf(MSG_ERROR, "AES-WRAP-256 failed");
703 		ret++;
704 	}
705 	if (aes_unwrap(kek45, sizeof(kek45), sizeof(plain45) / 8, crypt45,
706 		       result)) {
707 		wpa_printf(MSG_ERROR, "AES-UNWRAP-256 reported failure");
708 		ret++;
709 	}
710 	if (os_memcmp(result, plain45, sizeof(plain45)) != 0) {
711 		wpa_printf(MSG_ERROR, "AES-UNWRAP-256 failed");
712 		ret++;
713 	}
714 
715 	wpa_printf(MSG_INFO, "RFC 3394 - Test vector 4.6");
716 	if (aes_wrap(kek46, sizeof(kek46), sizeof(plain46) / 8, plain46,
717 		     result)) {
718 		wpa_printf(MSG_ERROR, "AES-WRAP-256 reported failure");
719 		ret++;
720 	}
721 	if (os_memcmp(result, crypt46, sizeof(crypt46)) != 0) {
722 		wpa_printf(MSG_ERROR, "AES-WRAP-256 failed");
723 		ret++;
724 	}
725 	if (aes_unwrap(kek46, sizeof(kek46), sizeof(plain46) / 8, crypt46,
726 		       result)) {
727 		wpa_printf(MSG_ERROR, "AES-UNWRAP-256 reported failure");
728 		ret++;
729 	}
730 	if (os_memcmp(result, plain46, sizeof(plain46)) != 0) {
731 		wpa_printf(MSG_ERROR, "AES-UNWRAP-256 failed");
732 		ret++;
733 	}
734 
735 	if (!ret)
736 		wpa_printf(MSG_INFO, "AES key wrap/unwrap test cases passed");
737 
738 	return ret;
739 }
740 
741 
742 static int test_md5(void)
743 {
744 #ifndef CONFIG_FIPS
745 	struct {
746 		char *data;
747 		char *hash;
748 	} tests[] = {
749 		{
750 			"",
751 			"\xd4\x1d\x8c\xd9\x8f\x00\xb2\x04"
752 			"\xe9\x80\x09\x98\xec\xf8\x42\x7e"
753 		},
754 		{
755 			"a",
756 			"\x0c\xc1\x75\xb9\xc0\xf1\xb6\xa8"
757 			"\x31\xc3\x99\xe2\x69\x77\x26\x61"
758 		},
759 		{
760 			"abc",
761 			"\x90\x01\x50\x98\x3c\xd2\x4f\xb0"
762 			"\xd6\x96\x3f\x7d\x28\xe1\x7f\x72"
763 		},
764 		{
765 			"message digest",
766 			"\xf9\x6b\x69\x7d\x7c\xb7\x93\x8d"
767 			"\x52\x5a\x2f\x31\xaa\xf1\x61\xd0"
768 		},
769 		{
770 			"abcdefghijklmnopqrstuvwxyz",
771 			"\xc3\xfc\xd3\xd7\x61\x92\xe4\x00"
772 			"\x7d\xfb\x49\x6c\xca\x67\xe1\x3b"
773 		},
774 		{
775 			"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz"
776 			"0123456789",
777 			"\xd1\x74\xab\x98\xd2\x77\xd9\xf5"
778 			"\xa5\x61\x1c\x2c\x9f\x41\x9d\x9f"
779 		},
780 		{
781 			"12345678901234567890123456789012345678901234567890"
782 			"123456789012345678901234567890",
783 			"\x57\xed\xf4\xa2\x2b\xe3\xc9\x55"
784 			"\xac\x49\xda\x2e\x21\x07\xb6\x7a"
785 		}
786 	};
787 	unsigned int i;
788 	u8 hash[16];
789 	const u8 *addr[2];
790 	size_t len[2];
791 	int errors = 0;
792 
793 	for (i = 0; i < ARRAY_SIZE(tests); i++) {
794 		wpa_printf(MSG_INFO, "MD5 test case %d", i);
795 
796 		addr[0] = (u8 *) tests[i].data;
797 		len[0] = strlen(tests[i].data);
798 		if (md5_vector(1, addr, len, hash) < 0 ||
799 		    os_memcmp(hash, tests[i].hash, 16) != 0) {
800 			wpa_printf(MSG_INFO, " FAIL");
801 			errors++;
802 		} else
803 			wpa_printf(MSG_INFO, " OK");
804 
805 		if (len[0]) {
806 			addr[0] = (u8 *) tests[i].data;
807 			len[0] = strlen(tests[i].data);
808 			addr[1] = (u8 *) tests[i].data + 1;
809 			len[1] = strlen(tests[i].data) - 1;
810 			if (md5_vector(1, addr, len, hash) < 0 ||
811 			    os_memcmp(hash, tests[i].hash, 16) != 0) {
812 				wpa_printf(MSG_INFO, " FAIL");
813 				errors++;
814 			} else
815 				wpa_printf(MSG_INFO, " OK");
816 		}
817 	}
818 
819 	if (!errors)
820 		wpa_printf(MSG_INFO, "MD5 test cases passed");
821 
822 	return errors;
823 #else /* CONFIG_FIPS */
824 	wpa_printf(MSG_INFO, "MD5 test cases skipped due to CONFIG_FIPS");
825 	return 0;
826 #endif /* CONFIG_FIPS */
827 }
828 
829 
830 static int test_eap_fast(void)
831 {
832 #ifdef EAP_FAST
833 	/* RFC 4851, Appendix B.1 */
834 	const u8 pac_key[] = {
835 		0x0B, 0x97, 0x39, 0x0F, 0x37, 0x51, 0x78, 0x09,
836 		0x81, 0x1E, 0xFD, 0x9C, 0x6E, 0x65, 0x94, 0x2B,
837 		0x63, 0x2C, 0xE9, 0x53, 0x89, 0x38, 0x08, 0xBA,
838 		0x36, 0x0B, 0x03, 0x7C, 0xD1, 0x85, 0xE4, 0x14
839 	};
840 	const u8 seed[] = {
841 		0x3F, 0xFB, 0x11, 0xC4, 0x6C, 0xBF, 0xA5, 0x7A,
842 		0x54, 0x40, 0xDA, 0xE8, 0x22, 0xD3, 0x11, 0xD3,
843 		0xF7, 0x6D, 0xE4, 0x1D, 0xD9, 0x33, 0xE5, 0x93,
844 		0x70, 0x97, 0xEB, 0xA9, 0xB3, 0x66, 0xF4, 0x2A,
845 		0x00, 0x00, 0x00, 0x02, 0x6A, 0x66, 0x43, 0x2A,
846 		0x8D, 0x14, 0x43, 0x2C, 0xEC, 0x58, 0x2D, 0x2F,
847 		0xC7, 0x9C, 0x33, 0x64, 0xBA, 0x04, 0xAD, 0x3A,
848 		0x52, 0x54, 0xD6, 0xA5, 0x79, 0xAD, 0x1E, 0x00
849 	};
850 	const u8 master_secret[] = {
851 		0x4A, 0x1A, 0x51, 0x2C, 0x01, 0x60, 0xBC, 0x02,
852 		0x3C, 0xCF, 0xBC, 0x83, 0x3F, 0x03, 0xBC, 0x64,
853 		0x88, 0xC1, 0x31, 0x2F, 0x0B, 0xA9, 0xA2, 0x77,
854 		0x16, 0xA8, 0xD8, 0xE8, 0xBD, 0xC9, 0xD2, 0x29,
855 		0x38, 0x4B, 0x7A, 0x85, 0xBE, 0x16, 0x4D, 0x27,
856 		0x33, 0xD5, 0x24, 0x79, 0x87, 0xB1, 0xC5, 0xA2
857 	};
858 #ifndef CONFIG_FIPS
859 	const u8 key_block[] = {
860 		0x59, 0x59, 0xBE, 0x8E, 0x41, 0x3A, 0x77, 0x74,
861 		0x8B, 0xB2, 0xE5, 0xD3, 0x60, 0xAC, 0x4D, 0x35,
862 		0xDF, 0xFB, 0xC8, 0x1E, 0x9C, 0x24, 0x9C, 0x8B,
863 		0x0E, 0xC3, 0x1D, 0x72, 0xC8, 0x84, 0x9D, 0x57,
864 		0x48, 0x51, 0x2E, 0x45, 0x97, 0x6C, 0x88, 0x70,
865 		0xBE, 0x5F, 0x01, 0xD3, 0x64, 0xE7, 0x4C, 0xBB,
866 		0x11, 0x24, 0xE3, 0x49, 0xE2, 0x3B, 0xCD, 0xEF,
867 		0x7A, 0xB3, 0x05, 0x39, 0x5D, 0x64, 0x8A, 0x44,
868 		0x11, 0xB6, 0x69, 0x88, 0x34, 0x2E, 0x8E, 0x29,
869 		0xD6, 0x4B, 0x7D, 0x72, 0x17, 0x59, 0x28, 0x05,
870 		0xAF, 0xF9, 0xB7, 0xFF, 0x66, 0x6D, 0xA1, 0x96,
871 		0x8F, 0x0B, 0x5E, 0x06, 0x46, 0x7A, 0x44, 0x84,
872 		0x64, 0xC1, 0xC8, 0x0C, 0x96, 0x44, 0x09, 0x98,
873 		0xFF, 0x92, 0xA8, 0xB4, 0xC6, 0x42, 0x28, 0x71
874 	};
875 #endif /* CONFIG_FIPS */
876 	const u8 sks[] = {
877 		0xD6, 0x4B, 0x7D, 0x72, 0x17, 0x59, 0x28, 0x05,
878 		0xAF, 0xF9, 0xB7, 0xFF, 0x66, 0x6D, 0xA1, 0x96,
879 		0x8F, 0x0B, 0x5E, 0x06, 0x46, 0x7A, 0x44, 0x84,
880 		0x64, 0xC1, 0xC8, 0x0C, 0x96, 0x44, 0x09, 0x98,
881 		0xFF, 0x92, 0xA8, 0xB4, 0xC6, 0x42, 0x28, 0x71
882 	};
883 	const u8 isk[] = {
884 		0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
885 		0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
886 		0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
887 		0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
888 	};
889 	const u8 imck[] = {
890 		0x16, 0x15, 0x3C, 0x3F, 0x21, 0x55, 0xEF, 0xD9,
891 		0x7F, 0x34, 0xAE, 0xC8, 0x1A, 0x4E, 0x66, 0x80,
892 		0x4C, 0xC3, 0x76, 0xF2, 0x8A, 0xA9, 0x6F, 0x96,
893 		0xC2, 0x54, 0x5F, 0x8C, 0xAB, 0x65, 0x02, 0xE1,
894 		0x18, 0x40, 0x7B, 0x56, 0xBE, 0xEA, 0xA7, 0xC5,
895 		0x76, 0x5D, 0x8F, 0x0B, 0xC5, 0x07, 0xC6, 0xB9,
896 		0x04, 0xD0, 0x69, 0x56, 0x72, 0x8B, 0x6B, 0xB8,
897 		0x15, 0xEC, 0x57, 0x7B
898 	};
899 	const u8 msk[] = {
900 		0x4D, 0x83, 0xA9, 0xBE, 0x6F, 0x8A, 0x74, 0xED,
901 		0x6A, 0x02, 0x66, 0x0A, 0x63, 0x4D, 0x2C, 0x33,
902 		0xC2, 0xDA, 0x60, 0x15, 0xC6, 0x37, 0x04, 0x51,
903 		0x90, 0x38, 0x63, 0xDA, 0x54, 0x3E, 0x14, 0xB9,
904 		0x27, 0x99, 0x18, 0x1E, 0x07, 0xBF, 0x0F, 0x5A,
905 		0x5E, 0x3C, 0x32, 0x93, 0x80, 0x8C, 0x6C, 0x49,
906 		0x67, 0xED, 0x24, 0xFE, 0x45, 0x40, 0xA0, 0x59,
907 		0x5E, 0x37, 0xC2, 0xE9, 0xD0, 0x5D, 0x0A, 0xE3
908 	};
909 	const u8 emsk[] = {
910 		0x3A, 0xD4, 0xAB, 0xDB, 0x76, 0xB2, 0x7F, 0x3B,
911 		0xEA, 0x32, 0x2C, 0x2B, 0x74, 0xF4, 0x28, 0x55,
912 		0xEF, 0x2D, 0xBA, 0x78, 0xC9, 0x57, 0x2F, 0x0D,
913 		0x06, 0xCD, 0x51, 0x7C, 0x20, 0x93, 0x98, 0xA9,
914 		0x76, 0xEA, 0x70, 0x21, 0xD7, 0x0E, 0x25, 0x54,
915 		0x97, 0xED, 0xB2, 0x8A, 0xF6, 0xED, 0xFD, 0x0A,
916 		0x2A, 0xE7, 0xA1, 0x58, 0x90, 0x10, 0x50, 0x44,
917 		0xB3, 0x82, 0x85, 0xDB, 0x06, 0x14, 0xD2, 0xF9
918 	};
919 	/* RFC 4851, Appendix B.2 */
920 	u8 tlv[] = {
921 		0x80, 0x0C, 0x00, 0x38, 0x00, 0x01, 0x01, 0x00,
922 		0xD8, 0x6A, 0x8C, 0x68, 0x3C, 0x32, 0x31, 0xA8,
923 		0x56, 0x63, 0xB6, 0x40, 0x21, 0xFE, 0x21, 0x14,
924 		0x4E, 0xE7, 0x54, 0x20, 0x79, 0x2D, 0x42, 0x62,
925 		0xC9, 0xBF, 0x53, 0x7F, 0x54, 0xFD, 0xAC, 0x58,
926 		0x43, 0x24, 0x6E, 0x30, 0x92, 0x17, 0x6D, 0xCF,
927 		0xE6, 0xE0, 0x69, 0xEB, 0x33, 0x61, 0x6A, 0xCC,
928 		0x05, 0xC5, 0x5B, 0xB7
929 	};
930 	const u8 compound_mac[] = {
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 	u8 buf[512];
936 	const u8 *simck, *cmk;
937 	int errors = 0;
938 
939 	wpa_printf(MSG_INFO, "EAP-FAST test cases");
940 
941 	wpa_printf(MSG_INFO, "- T-PRF (SHA1) test case / master_secret");
942 	if (sha1_t_prf(pac_key, sizeof(pac_key),
943 		       "PAC to master secret label hash",
944 		       seed, sizeof(seed), buf, sizeof(master_secret)) < 0 ||
945 	    os_memcmp(master_secret, buf, sizeof(master_secret)) != 0) {
946 		wpa_printf(MSG_INFO, "T-PRF test - FAILED!");
947 		errors++;
948 	}
949 
950 #ifndef CONFIG_FIPS
951 	wpa_printf(MSG_INFO, "- PRF (TLS, SHA1/MD5) test case / key_block");
952 	if (tls_prf_sha1_md5(master_secret, sizeof(master_secret),
953 			     "key expansion", seed, sizeof(seed),
954 			     buf, sizeof(key_block)) ||
955 	    os_memcmp(key_block, buf, sizeof(key_block)) != 0) {
956 		wpa_printf(MSG_INFO, "PRF test - FAILED!");
957 		errors++;
958 	}
959 #endif /* CONFIG_FIPS */
960 
961 	wpa_printf(MSG_INFO, "- T-PRF (SHA1) test case / IMCK");
962 	if (sha1_t_prf(sks, sizeof(sks), "Inner Methods Compound Keys",
963 		       isk, sizeof(isk), buf, sizeof(imck)) < 0 ||
964 	    os_memcmp(imck, buf, sizeof(imck)) != 0) {
965 		wpa_printf(MSG_INFO, "T-PRF test - FAILED!");
966 		errors++;
967 	}
968 
969 	simck = imck;
970 	cmk = imck + 40;
971 
972 	wpa_printf(MSG_INFO, "- T-PRF (SHA1) test case / MSK");
973 	if (sha1_t_prf(simck, 40, "Session Key Generating Function",
974 		       (u8 *) "", 0, buf, sizeof(msk)) < 0 ||
975 	    os_memcmp(msk, buf, sizeof(msk)) != 0) {
976 		wpa_printf(MSG_INFO, "T-PRF test - FAILED!");
977 		errors++;
978 	}
979 
980 	wpa_printf(MSG_INFO, "- T-PRF (SHA1) test case / EMSK");
981 	if (sha1_t_prf(simck, 40, "Extended Session Key Generating Function",
982 		       (u8 *) "", 0, buf, sizeof(msk)) < 0 ||
983 	    os_memcmp(emsk, buf, sizeof(emsk)) != 0) {
984 		wpa_printf(MSG_INFO, "T-PRF test - FAILED!");
985 		errors++;
986 	}
987 
988 	wpa_printf(MSG_INFO, "- Compound MAC test case");
989 	os_memset(tlv + sizeof(tlv) - 20, 0, 20);
990 	if (hmac_sha1(cmk, 20, tlv, sizeof(tlv), tlv + sizeof(tlv) - 20) < 0 ||
991 	    os_memcmp(tlv + sizeof(tlv) - 20, compound_mac,
992 		      sizeof(compound_mac)) != 0) {
993 		wpa_printf(MSG_INFO, "Compound MAC test - FAILED!");
994 		errors++;
995 	}
996 
997 	return errors;
998 #else /* EAP_FAST */
999 	return 0;
1000 #endif /* EAP_FAST */
1001 }
1002 
1003 
1004 static const u8 key0[] =
1005 {
1006 	0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b,
1007 	0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b,
1008 	0x0b, 0x0b, 0x0b, 0x0b
1009 };
1010 static const u8 data0[] = "Hi There";
1011 static const u8 prf0[] =
1012 {
1013 	0xbc, 0xd4, 0xc6, 0x50, 0xb3, 0x0b, 0x96, 0x84,
1014 	0x95, 0x18, 0x29, 0xe0, 0xd7, 0x5f, 0x9d, 0x54,
1015 	0xb8, 0x62, 0x17, 0x5e, 0xd9, 0xf0, 0x06, 0x06,
1016 	0xe1, 0x7d, 0x8d, 0xa3, 0x54, 0x02, 0xff, 0xee,
1017 	0x75, 0xdf, 0x78, 0xc3, 0xd3, 0x1e, 0x0f, 0x88,
1018 	0x9f, 0x01, 0x21, 0x20, 0xc0, 0x86, 0x2b, 0xeb,
1019 	0x67, 0x75, 0x3e, 0x74, 0x39, 0xae, 0x24, 0x2e,
1020 	0xdb, 0x83, 0x73, 0x69, 0x83, 0x56, 0xcf, 0x5a
1021 };
1022 
1023 static const u8 key1[] = "Jefe";
1024 static const u8 data1[] = "what do ya want for nothing?";
1025 static const u8 prf1[] =
1026 {
1027 	0x51, 0xf4, 0xde, 0x5b, 0x33, 0xf2, 0x49, 0xad,
1028 	0xf8, 0x1a, 0xeb, 0x71, 0x3a, 0x3c, 0x20, 0xf4,
1029 	0xfe, 0x63, 0x14, 0x46, 0xfa, 0xbd, 0xfa, 0x58,
1030 	0x24, 0x47, 0x59, 0xae, 0x58, 0xef, 0x90, 0x09,
1031 	0xa9, 0x9a, 0xbf, 0x4e, 0xac, 0x2c, 0xa5, 0xfa,
1032 	0x87, 0xe6, 0x92, 0xc4, 0x40, 0xeb, 0x40, 0x02,
1033 	0x3e, 0x7b, 0xab, 0xb2, 0x06, 0xd6, 0x1d, 0xe7,
1034 	0xb9, 0x2f, 0x41, 0x52, 0x90, 0x92, 0xb8, 0xfc
1035 };
1036 
1037 
1038 static const u8 key2[] =
1039 {
1040 	0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa,
1041 	0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa,
1042 	0xaa, 0xaa, 0xaa, 0xaa
1043 };
1044 static const u8 data2[] =
1045 {
1046 	0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd,
1047 	0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd,
1048 	0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd,
1049 	0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd,
1050 	0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd,
1051 	0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd,
1052 	0xdd, 0xdd
1053 };
1054 static const u8 prf2[] =
1055 {
1056 	0xe1, 0xac, 0x54, 0x6e, 0xc4, 0xcb, 0x63, 0x6f,
1057 	0x99, 0x76, 0x48, 0x7b, 0xe5, 0xc8, 0x6b, 0xe1,
1058 	0x7a, 0x02, 0x52, 0xca, 0x5d, 0x8d, 0x8d, 0xf1,
1059 	0x2c, 0xfb, 0x04, 0x73, 0x52, 0x52, 0x49, 0xce,
1060 	0x9d, 0xd8, 0xd1, 0x77, 0xea, 0xd7, 0x10, 0xbc,
1061 	0x9b, 0x59, 0x05, 0x47, 0x23, 0x91, 0x07, 0xae,
1062 	0xf7, 0xb4, 0xab, 0xd4, 0x3d, 0x87, 0xf0, 0xa6,
1063 	0x8f, 0x1c, 0xbd, 0x9e, 0x2b, 0x6f, 0x76, 0x07
1064 };
1065 
1066 
1067 struct passphrase_test {
1068 	char *passphrase;
1069 	char *ssid;
1070 	char psk[32];
1071 };
1072 
1073 static const struct passphrase_test passphrase_tests[] =
1074 {
1075 	{
1076 		"password",
1077 		"IEEE",
1078 		{
1079 			0xf4, 0x2c, 0x6f, 0xc5, 0x2d, 0xf0, 0xeb, 0xef,
1080 			0x9e, 0xbb, 0x4b, 0x90, 0xb3, 0x8a, 0x5f, 0x90,
1081 			0x2e, 0x83, 0xfe, 0x1b, 0x13, 0x5a, 0x70, 0xe2,
1082 			0x3a, 0xed, 0x76, 0x2e, 0x97, 0x10, 0xa1, 0x2e
1083 		}
1084 	},
1085 	{
1086 		"ThisIsAPassword",
1087 		"ThisIsASSID",
1088 		{
1089 			0x0d, 0xc0, 0xd6, 0xeb, 0x90, 0x55, 0x5e, 0xd6,
1090 			0x41, 0x97, 0x56, 0xb9, 0xa1, 0x5e, 0xc3, 0xe3,
1091 			0x20, 0x9b, 0x63, 0xdf, 0x70, 0x7d, 0xd5, 0x08,
1092 			0xd1, 0x45, 0x81, 0xf8, 0x98, 0x27, 0x21, 0xaf
1093 		}
1094 	},
1095 	{
1096 		"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa",
1097 		"ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ",
1098 		{
1099 			0xbe, 0xcb, 0x93, 0x86, 0x6b, 0xb8, 0xc3, 0x83,
1100 			0x2c, 0xb7, 0x77, 0xc2, 0xf5, 0x59, 0x80, 0x7c,
1101 			0x8c, 0x59, 0xaf, 0xcb, 0x6e, 0xae, 0x73, 0x48,
1102 			0x85, 0x00, 0x13, 0x00, 0xa9, 0x81, 0xcc, 0x62
1103 		}
1104 	},
1105 };
1106 
1107 #define NUM_PASSPHRASE_TESTS ARRAY_SIZE(passphrase_tests)
1108 
1109 
1110 struct rfc6070_test {
1111 	char *p;
1112 	char *s;
1113 	int c;
1114 	char dk[32];
1115 	size_t dk_len;
1116 };
1117 
1118 static const struct rfc6070_test rfc6070_tests[] =
1119 {
1120 	{
1121 		"password",
1122 		"salt",
1123 		1,
1124 		{
1125 			0x0c, 0x60, 0xc8, 0x0f, 0x96, 0x1f, 0x0e, 0x71,
1126 			0xf3, 0xa9, 0xb5, 0x24, 0xaf, 0x60, 0x12, 0x06,
1127 			0x2f, 0xe0, 0x37, 0xa6
1128 		},
1129 		20
1130 	},
1131 	{
1132 		"password",
1133 		"salt",
1134 		2,
1135 		{
1136 			0xea, 0x6c, 0x01, 0x4d, 0xc7, 0x2d, 0x6f, 0x8c,
1137 			0xcd, 0x1e, 0xd9, 0x2a, 0xce, 0x1d, 0x41, 0xf0,
1138 			0xd8, 0xde, 0x89, 0x57
1139 		},
1140 		20
1141 	},
1142 	{
1143 		"password",
1144 		"salt",
1145 		4096,
1146 		{
1147 			0x4b, 0x00, 0x79, 0x01, 0xb7, 0x65, 0x48, 0x9a,
1148 			0xbe, 0xad, 0x49, 0xd9, 0x26, 0xf7, 0x21, 0xd0,
1149 			0x65, 0xa4, 0x29, 0xc1
1150 		},
1151 		20
1152 	},
1153 #if 0 /* This takes quite long to derive.. */
1154 	{
1155 		"password",
1156 		"salt",
1157 		16777216,
1158 		{
1159 			0xee, 0xfe, 0x3d, 0x61, 0xcd, 0x4d, 0xa4, 0xe4,
1160 			0xe9, 0x94, 0x5b, 0x3d, 0x6b, 0xa2, 0x15, 0x8c,
1161 			0x26, 0x34, 0xe9, 0x84
1162 		},
1163 		20
1164 	},
1165 #endif
1166 	{
1167 		"passwordPASSWORDpassword",
1168 		"saltSALTsaltSALTsaltSALTsaltSALTsalt",
1169 		4096,
1170 		{
1171 			0x3d, 0x2e, 0xec, 0x4f, 0xe4, 0x1c, 0x84, 0x9b,
1172 			0x80, 0xc8, 0xd8, 0x36, 0x62, 0xc0, 0xe4, 0x4a,
1173 			0x8b, 0x29, 0x1a, 0x96, 0x4c, 0xf2, 0xf0, 0x70,
1174 			0x38
1175 		},
1176 		25
1177 	},
1178 #if 0 /* \0 not currently supported in passphrase parameters.. */
1179 	{
1180 		"pass\0word",
1181 		"sa\0lt",
1182 		4096,
1183 		{
1184 			0x56, 0xfa, 0x6a, 0xa7, 0x55, 0x48, 0x09, 0x9d,
1185 			0xcc, 0x37, 0xd7, 0xf0, 0x34, 0x25, 0xe0, 0xc3
1186 		},
1187 		16
1188 	},
1189 #endif
1190 };
1191 
1192 #define NUM_RFC6070_TESTS ARRAY_SIZE(rfc6070_tests)
1193 
1194 
1195 static int test_sha1(void)
1196 {
1197 	u8 res[512];
1198 	int ret = 0;
1199 	unsigned int i;
1200 
1201 	wpa_printf(MSG_INFO, "PRF-SHA1 test cases:");
1202 
1203 	if (sha1_prf(key0, sizeof(key0), "prefix", data0, sizeof(data0) - 1,
1204 		     res, sizeof(prf0)) == 0 &&
1205 	    os_memcmp(res, prf0, sizeof(prf0)) == 0)
1206 		wpa_printf(MSG_INFO, "Test case 0 - OK");
1207 	else {
1208 		wpa_printf(MSG_INFO, "Test case 0 - FAILED!");
1209 		ret++;
1210 	}
1211 
1212 	if (sha1_prf(key1, sizeof(key1) - 1, "prefix", data1, sizeof(data1) - 1,
1213 		     res, sizeof(prf1)) == 0 &&
1214 	    os_memcmp(res, prf1, sizeof(prf1)) == 0)
1215 		wpa_printf(MSG_INFO, "Test case 1 - OK");
1216 	else {
1217 		wpa_printf(MSG_INFO, "Test case 1 - FAILED!");
1218 		ret++;
1219 	}
1220 
1221 	if (sha1_prf(key2, sizeof(key2), "prefix", data2, sizeof(data2),
1222 		     res, sizeof(prf2)) == 0 &&
1223 	    os_memcmp(res, prf2, sizeof(prf2)) == 0)
1224 		wpa_printf(MSG_INFO, "Test case 2 - OK");
1225 	else {
1226 		wpa_printf(MSG_INFO, "Test case 2 - FAILED!");
1227 		ret++;
1228 	}
1229 
1230 	ret += test_eap_fast();
1231 
1232 	wpa_printf(MSG_INFO, "PBKDF2-SHA1 Passphrase test cases:");
1233 	for (i = 0; i < NUM_PASSPHRASE_TESTS; i++) {
1234 		u8 psk[32];
1235 		const struct passphrase_test *test = &passphrase_tests[i];
1236 
1237 		if (pbkdf2_sha1(test->passphrase,
1238 				(const u8 *) test->ssid, strlen(test->ssid),
1239 				4096, psk, 32) == 0 &&
1240 		    os_memcmp(psk, test->psk, 32) == 0)
1241 			wpa_printf(MSG_INFO, "Test case %d - OK", i);
1242 		else {
1243 			wpa_printf(MSG_INFO, "Test case %d - FAILED!", i);
1244 			ret++;
1245 		}
1246 	}
1247 
1248 	wpa_printf(MSG_INFO, "PBKDF2-SHA1 test cases (RFC 6070):");
1249 	for (i = 0; i < NUM_RFC6070_TESTS; i++) {
1250 		u8 dk[25];
1251 		const struct rfc6070_test *test = &rfc6070_tests[i];
1252 
1253 		if (pbkdf2_sha1(test->p, (const u8 *) test->s, strlen(test->s),
1254 				test->c, dk, test->dk_len) == 0 &&
1255 		    os_memcmp(dk, test->dk, test->dk_len) == 0)
1256 			wpa_printf(MSG_INFO, "Test case %d - OK", i);
1257 		else {
1258 			wpa_printf(MSG_INFO, "Test case %d - FAILED!", i);
1259 			ret++;
1260 		}
1261 	}
1262 
1263 	if (!ret)
1264 		wpa_printf(MSG_INFO, "SHA1 test cases passed");
1265 	return ret;
1266 }
1267 
1268 
1269 const struct {
1270 	char *data;
1271 	u8 hash[32];
1272 } tests[] = {
1273 	{
1274 		"abc",
1275 		{
1276 			0xba, 0x78, 0x16, 0xbf, 0x8f, 0x01, 0xcf, 0xea,
1277 			0x41, 0x41, 0x40, 0xde, 0x5d, 0xae, 0x22, 0x23,
1278 			0xb0, 0x03, 0x61, 0xa3, 0x96, 0x17, 0x7a, 0x9c,
1279 			0xb4, 0x10, 0xff, 0x61, 0xf2, 0x00, 0x15, 0xad
1280 		}
1281 	},
1282 	{
1283 		"abcdbcdecdefdefgefghfghighijhijkijkljklmklmnlmnomnopnopq",
1284 		{
1285 			0x24, 0x8d, 0x6a, 0x61, 0xd2, 0x06, 0x38, 0xb8,
1286 			0xe5, 0xc0, 0x26, 0x93, 0x0c, 0x3e, 0x60, 0x39,
1287 			0xa3, 0x3c, 0xe4, 0x59, 0x64, 0xff, 0x21, 0x67,
1288 			0xf6, 0xec, 0xed, 0xd4, 0x19, 0xdb, 0x06, 0xc1
1289 		}
1290 	}
1291 };
1292 
1293 const struct hmac_test {
1294 	u8 key[80];
1295 	size_t key_len;
1296 	u8 data[128];
1297 	size_t data_len;
1298 	u8 hash[32];
1299 } hmac_tests[] = {
1300 	/* draft-ietf-ipsec-ciph-sha-256-01.txt */
1301 	{
1302 		{
1303 			0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08,
1304 			0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, 0x10,
1305 			0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x18,
1306 			0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f, 0x20
1307 		},
1308 		32,
1309 		"abc", 3,
1310 		{
1311 			0xa2, 0x1b, 0x1f, 0x5d, 0x4c, 0xf4, 0xf7, 0x3a,
1312 			0x4d, 0xd9, 0x39, 0x75, 0x0f, 0x7a, 0x06, 0x6a,
1313 			0x7f, 0x98, 0xcc, 0x13, 0x1c, 0xb1, 0x6a, 0x66,
1314 			0x92, 0x75, 0x90, 0x21, 0xcf, 0xab, 0x81, 0x81
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 		56,
1327 		{
1328 			0x10, 0x4f, 0xdc, 0x12, 0x57, 0x32, 0x8f, 0x08,
1329 			0x18, 0x4b, 0xa7, 0x31, 0x31, 0xc5, 0x3c, 0xae,
1330 			0xe6, 0x98, 0xe3, 0x61, 0x19, 0x42, 0x11, 0x49,
1331 			0xea, 0x8c, 0x71, 0x24, 0x56, 0x69, 0x7d, 0x30
1332 		}
1333 	},
1334 	{
1335 		{
1336 			0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08,
1337 			0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, 0x10,
1338 			0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x18,
1339 			0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f, 0x20
1340 		},
1341 		32,
1342 		"abcdbcdecdefdefgefghfghighijhijkijkljklmklmnlmnomnopnopq"
1343 		"abcdbcdecdefdefgefghfghighijhijkijkljklmklmnlmnomnopnopq",
1344 		112,
1345 		{
1346 			0x47, 0x03, 0x05, 0xfc, 0x7e, 0x40, 0xfe, 0x34,
1347 			0xd3, 0xee, 0xb3, 0xe7, 0x73, 0xd9, 0x5a, 0xab,
1348 			0x73, 0xac, 0xf0, 0xfd, 0x06, 0x04, 0x47, 0xa5,
1349 			0xeb, 0x45, 0x95, 0xbf, 0x33, 0xa9, 0xd1, 0xa3
1350 		}
1351 	},
1352 	{
1353 		{
1354 			0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b,
1355 			0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b,
1356 			0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b,
1357 			0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b
1358 		},
1359 		32,
1360 		"Hi There",
1361 		8,
1362 		{
1363 			0x19, 0x8a, 0x60, 0x7e, 0xb4, 0x4b, 0xfb, 0xc6,
1364 			0x99, 0x03, 0xa0, 0xf1, 0xcf, 0x2b, 0xbd, 0xc5,
1365 			0xba, 0x0a, 0xa3, 0xf3, 0xd9, 0xae, 0x3c, 0x1c,
1366 			0x7a, 0x3b, 0x16, 0x96, 0xa0, 0xb6, 0x8c, 0xf7
1367 		}
1368 	},
1369 	{
1370 		"Jefe",
1371 		4,
1372 		"what do ya want for nothing?",
1373 		28,
1374 		{
1375 			0x5b, 0xdc, 0xc1, 0x46, 0xbf, 0x60, 0x75, 0x4e,
1376 			0x6a, 0x04, 0x24, 0x26, 0x08, 0x95, 0x75, 0xc7,
1377 			0x5a, 0x00, 0x3f, 0x08, 0x9d, 0x27, 0x39, 0x83,
1378 			0x9d, 0xec, 0x58, 0xb9, 0x64, 0xec, 0x38, 0x43
1379 		}
1380 	},
1381 	{
1382 		{
1383 			0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa,
1384 			0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa,
1385 			0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa,
1386 			0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa
1387 		},
1388 		32,
1389 		{
1390 			0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd,
1391 			0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd,
1392 			0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd,
1393 			0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd,
1394 			0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd,
1395 			0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd,
1396 			0xdd, 0xdd
1397 		},
1398 		50,
1399 		{
1400 			0xcd, 0xcb, 0x12, 0x20, 0xd1, 0xec, 0xcc, 0xea,
1401 			0x91, 0xe5, 0x3a, 0xba, 0x30, 0x92, 0xf9, 0x62,
1402 			0xe5, 0x49, 0xfe, 0x6c, 0xe9, 0xed, 0x7f, 0xdc,
1403 			0x43, 0x19, 0x1f, 0xbd, 0xe4, 0x5c, 0x30, 0xb0
1404 		}
1405 	},
1406 	{
1407 		{
1408 			0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08,
1409 			0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, 0x10,
1410 			0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x18,
1411 			0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f, 0x20,
1412 			0x21, 0x22, 0x23, 0x24, 0x25
1413 		},
1414 		37,
1415 		{
1416 			0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd,
1417 			0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd,
1418 			0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd,
1419 			0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd,
1420 			0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd,
1421 			0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd,
1422 			0xcd, 0xcd
1423 		},
1424 		50,
1425 		{
1426 			0xd4, 0x63, 0x3c, 0x17, 0xf6, 0xfb, 0x8d, 0x74,
1427 			0x4c, 0x66, 0xde, 0xe0, 0xf8, 0xf0, 0x74, 0x55,
1428 			0x6e, 0xc4, 0xaf, 0x55, 0xef, 0x07, 0x99, 0x85,
1429 			0x41, 0x46, 0x8e, 0xb4, 0x9b, 0xd2, 0xe9, 0x17
1430 		}
1431 	},
1432 	{
1433 		{
1434 			0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c,
1435 			0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c,
1436 			0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c,
1437 			0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c
1438 		},
1439 		32,
1440 		"Test With Truncation",
1441 		20,
1442 		{
1443 			0x75, 0x46, 0xaf, 0x01, 0x84, 0x1f, 0xc0, 0x9b,
1444 			0x1a, 0xb9, 0xc3, 0x74, 0x9a, 0x5f, 0x1c, 0x17,
1445 			0xd4, 0xf5, 0x89, 0x66, 0x8a, 0x58, 0x7b, 0x27,
1446 			0x00, 0xa9, 0xc9, 0x7c, 0x11, 0x93, 0xcf, 0x42
1447 		}
1448 	},
1449 	{
1450 		{
1451 			0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa,
1452 			0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa,
1453 			0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa,
1454 			0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa,
1455 			0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa,
1456 			0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa,
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 		},
1462 		80,
1463 		"Test Using Larger Than Block-Size Key - Hash Key First",
1464 		54,
1465 		{
1466 			0x69, 0x53, 0x02, 0x5e, 0xd9, 0x6f, 0x0c, 0x09,
1467 			0xf8, 0x0a, 0x96, 0xf7, 0x8e, 0x65, 0x38, 0xdb,
1468 			0xe2, 0xe7, 0xb8, 0x20, 0xe3, 0xdd, 0x97, 0x0e,
1469 			0x7d, 0xdd, 0x39, 0x09, 0x1b, 0x32, 0x35, 0x2f
1470 		}
1471 	},
1472 	{
1473 		{
1474 			0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa,
1475 			0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa,
1476 			0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa,
1477 			0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa,
1478 			0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa,
1479 			0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa,
1480 			0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa,
1481 			0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa,
1482 			0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa,
1483 			0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa
1484 		},
1485 		80,
1486 		"Test Using Larger Than Block-Size Key and Larger Than One "
1487 		"Block-Size Data",
1488 		73,
1489 		{
1490 			0x63, 0x55, 0xac, 0x22, 0xe8, 0x90, 0xd0, 0xa3,
1491 			0xc8, 0x48, 0x1a, 0x5c, 0xa4, 0x82, 0x5b, 0xc8,
1492 			0x84, 0xd3, 0xe7, 0xa1, 0xff, 0x98, 0xa2, 0xfc,
1493 			0x2a, 0xc7, 0xd8, 0xe0, 0x64, 0xc3, 0xb2, 0xe6
1494 		}
1495 	}
1496 };
1497 
1498 
1499 static int test_sha256(void)
1500 {
1501 	unsigned int i;
1502 	u8 hash[32];
1503 	const u8 *addr[2];
1504 	size_t len[2];
1505 	int errors = 0;
1506 
1507 	for (i = 0; i < ARRAY_SIZE(tests); i++) {
1508 		wpa_printf(MSG_INFO, "SHA256 test case %d:", i + 1);
1509 
1510 		addr[0] = (u8 *) tests[i].data;
1511 		len[0] = strlen(tests[i].data);
1512 		sha256_vector(1, addr, len, hash);
1513 		if (memcmp(hash, tests[i].hash, 32) != 0) {
1514 			wpa_printf(MSG_INFO, " FAIL");
1515 			errors++;
1516 		} else
1517 			wpa_printf(MSG_INFO, " OK");
1518 
1519 		if (len[0]) {
1520 			addr[0] = (u8 *) tests[i].data;
1521 			len[0] = 1;
1522 			addr[1] = (u8 *) tests[i].data + 1;
1523 			len[1] = strlen(tests[i].data) - 1;
1524 			sha256_vector(2, addr, len, hash);
1525 			if (memcmp(hash, tests[i].hash, 32) != 0) {
1526 				wpa_printf(MSG_INFO, " FAIL");
1527 				errors++;
1528 			} else
1529 				wpa_printf(MSG_INFO, " OK");
1530 		}
1531 	}
1532 
1533 	for (i = 0; i < ARRAY_SIZE(hmac_tests); i++) {
1534 		const struct hmac_test *t = &hmac_tests[i];
1535 
1536 		wpa_printf(MSG_INFO, "HMAC-SHA256 test case %d:", i + 1);
1537 
1538 		if (hmac_sha256(t->key, t->key_len, t->data, t->data_len,
1539 				hash) < 0 ||
1540 		    os_memcmp(hash, t->hash, 32) != 0) {
1541 			wpa_printf(MSG_INFO, " FAIL");
1542 			errors++;
1543 		} else
1544 			wpa_printf(MSG_INFO, " OK");
1545 
1546 		addr[0] = t->data;
1547 		len[0] = t->data_len;
1548 		if (hmac_sha256_vector(t->key, t->key_len, 1, addr, len,
1549 				       hash) < 0 ||
1550 		    os_memcmp(hash, t->hash, 32) != 0) {
1551 			wpa_printf(MSG_INFO, " FAIL");
1552 			errors++;
1553 		} else
1554 			wpa_printf(MSG_INFO, " OK");
1555 
1556 		if (len[0]) {
1557 			addr[0] = t->data;
1558 			len[0] = 1;
1559 			addr[1] = t->data + 1;
1560 			len[1] = t->data_len - 1;
1561 			if (hmac_sha256_vector(t->key, t->key_len, 2, addr, len,
1562 					       hash) < 0 ||
1563 			    os_memcmp(hash, t->hash, 32) != 0) {
1564 				wpa_printf(MSG_INFO, " FAIL");
1565 				errors++;
1566 			} else
1567 				wpa_printf(MSG_INFO, " OK");
1568 		}
1569 	}
1570 
1571 	wpa_printf(MSG_INFO, "Test IEEE 802.11r KDF");
1572 	sha256_prf((u8 *) "abc", 3, "KDF test", (u8 *) "data", 4,
1573 		   hash, sizeof(hash));
1574 	/* TODO: add proper test case for this */
1575 
1576 	if (!errors)
1577 		wpa_printf(MSG_INFO, "SHA256 test cases passed");
1578 	return errors;
1579 }
1580 
1581 
1582 static int test_ms_funcs(void)
1583 {
1584 #ifndef CONFIG_FIPS
1585 	/* Test vector from RFC2759 example */
1586 	char *username = "User";
1587 	char *password = "clientPass";
1588 	u8 auth_challenge[] = {
1589 		0x5B, 0x5D, 0x7C, 0x7D, 0x7B, 0x3F, 0x2F, 0x3E,
1590 		0x3C, 0x2C, 0x60, 0x21, 0x32, 0x26, 0x26, 0x28
1591 	};
1592 	u8 peer_challenge[] = {
1593 		0x21, 0x40, 0x23, 0x24, 0x25, 0x5E, 0x26, 0x2A,
1594 		0x28, 0x29, 0x5F, 0x2B, 0x3A, 0x33, 0x7C, 0x7E
1595 	};
1596 	u8 password_hash[] = {
1597 		0x44, 0xEB, 0xBA, 0x8D, 0x53, 0x12, 0xB8, 0xD6,
1598 		0x11, 0x47, 0x44, 0x11, 0xF5, 0x69, 0x89, 0xAE
1599 	};
1600 	u8 nt_response[] = {
1601 		0x82, 0x30, 0x9E, 0xCD, 0x8D, 0x70, 0x8B, 0x5E,
1602 		0xA0, 0x8F, 0xAA, 0x39, 0x81, 0xCD, 0x83, 0x54,
1603 		0x42, 0x33, 0x11, 0x4A, 0x3D, 0x85, 0xD6, 0xDF
1604 	};
1605 	u8 password_hash_hash[] = {
1606 		0x41, 0xC0, 0x0C, 0x58, 0x4B, 0xD2, 0xD9, 0x1C,
1607 		0x40, 0x17, 0xA2, 0xA1, 0x2F, 0xA5, 0x9F, 0x3F
1608 	};
1609 	u8 authenticator_response[] = {
1610 		0x40, 0x7A, 0x55, 0x89, 0x11, 0x5F, 0xD0, 0xD6,
1611 		0x20, 0x9F, 0x51, 0x0F, 0xE9, 0xC0, 0x45, 0x66,
1612 		0x93, 0x2C, 0xDA, 0x56
1613 	};
1614 	u8 master_key[] = {
1615 		0xFD, 0xEC, 0xE3, 0x71, 0x7A, 0x8C, 0x83, 0x8C,
1616 		0xB3, 0x88, 0xE5, 0x27, 0xAE, 0x3C, 0xDD, 0x31
1617 	};
1618 	u8 send_start_key[] = {
1619 		0x8B, 0x7C, 0xDC, 0x14, 0x9B, 0x99, 0x3A, 0x1B,
1620 		0xA1, 0x18, 0xCB, 0x15, 0x3F, 0x56, 0xDC, 0xCB
1621 	};
1622 	u8 buf[32];
1623 	int errors = 0;
1624 
1625 	if (nt_password_hash((u8 *) password, os_strlen(password), buf) ||
1626 	    os_memcmp(password_hash, buf, sizeof(password_hash)) != 0) {
1627 		wpa_printf(MSG_ERROR, "nt_password_hash failed");
1628 		errors++;
1629 	}
1630 
1631 	if (generate_nt_response(auth_challenge, peer_challenge,
1632 				 (u8 *) username, os_strlen(username),
1633 				 (u8 *) password, os_strlen(password), buf) ||
1634 	    os_memcmp(nt_response, buf, sizeof(nt_response)) != 0) {
1635 		wpa_printf(MSG_ERROR, "generate_nt_response failed");
1636 		errors++;
1637 	}
1638 
1639 	if (hash_nt_password_hash(password_hash, buf) ||
1640 	    os_memcmp(password_hash_hash, buf,
1641 		      sizeof(password_hash_hash)) != 0) {
1642 		wpa_printf(MSG_ERROR, "hash_nt_password_hash failed");
1643 		errors++;
1644 	}
1645 
1646 	if (generate_authenticator_response((u8 *) password,
1647 					    os_strlen(password),
1648 					    peer_challenge, auth_challenge,
1649 					    (u8 *) username,
1650 					    os_strlen(username),
1651 					    nt_response, buf) ||
1652 	    os_memcmp(authenticator_response, buf,
1653 		      sizeof(authenticator_response)) != 0) {
1654 		wpa_printf(MSG_ERROR, "generate_authenticator_response failed");
1655 		errors++;
1656 	}
1657 
1658 	if (get_master_key(password_hash_hash, nt_response, buf) ||
1659 	    os_memcmp(master_key, buf, sizeof(master_key)) != 0) {
1660 		wpa_printf(MSG_ERROR, "get_master_key failed");
1661 		errors++;
1662 	}
1663 
1664 	if (get_asymetric_start_key(master_key, buf, sizeof(send_start_key),
1665 				    1, 1) ||
1666 	    os_memcmp(send_start_key, buf, sizeof(send_start_key)) != 0) {
1667 		wpa_printf(MSG_ERROR, "get_asymetric_start_key failed");
1668 		errors++;
1669 	}
1670 
1671 	if (errors)
1672 		wpa_printf(MSG_ERROR, "ms_funcs: %d errors", errors);
1673 	else
1674 		wpa_printf(MSG_INFO, "ms_funcs test cases passed");
1675 
1676 	return errors;
1677 #else /* CONFIG_FIPS */
1678 	wpa_printf(MSG_INFO, "ms_funcs test cases skipped due to CONFIG_FIPS");
1679 	return 0;
1680 #endif /* CONFIG_FIPS */
1681 }
1682 
1683 
1684 int crypto_module_tests(void)
1685 {
1686 	int ret = 0;
1687 
1688 	wpa_printf(MSG_INFO, "crypto module tests");
1689 	if (test_siv() ||
1690 	    test_omac1() ||
1691 	    test_eax() ||
1692 	    test_cbc() ||
1693 	    test_ecb() ||
1694 	    test_key_wrap() ||
1695 	    test_md5() ||
1696 	    test_sha1() ||
1697 	    test_sha256() ||
1698 	    test_ms_funcs())
1699 		ret = -1;
1700 
1701 	return ret;
1702 }
1703