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