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