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