2
* Test program for SHA1 and MD5
3
* Copyright (c) 2003-2006, Jouni Malinen <j@w1.fi>
5
* This program is free software; you can redistribute it and/or modify
6
* it under the terms of the GNU General Public License version 2 as
7
* published by the Free Software Foundation.
9
* Alternatively, this software may be distributed under the terms of BSD
12
* See README and COPYING for more details.
23
static int test_eap_fast(void)
25
/* draft-cam-winget-eap-fast-01.txt */
26
const u8 pac_key[] = {
27
0x0B, 0x97, 0x39, 0x0F, 0x37, 0x51, 0x78, 0x09,
28
0x81, 0x1E, 0xFD, 0x9C, 0x6E, 0x65, 0x94, 0x2B,
29
0x63, 0x2C, 0xE9, 0x53, 0x89, 0x38, 0x08, 0xBA,
30
0x36, 0x0B, 0x03, 0x7C, 0xD1, 0x85, 0xE4, 0x14
33
0x3F, 0xFB, 0x11, 0xC4, 0x6C, 0xBF, 0xA5, 0x7A,
34
0x54, 0x40, 0xDA, 0xE8, 0x22, 0xD3, 0x11, 0xD3,
35
0xF7, 0x6D, 0xE4, 0x1D, 0xD9, 0x33, 0xE5, 0x93,
36
0x70, 0x97, 0xEB, 0xA9, 0xB3, 0x66, 0xF4, 0x2A,
37
0x00, 0x00, 0x00, 0x02, 0x6A, 0x66, 0x43, 0x2A,
38
0x8D, 0x14, 0x43, 0x2C, 0xEC, 0x58, 0x2D, 0x2F,
39
0xC7, 0x9C, 0x33, 0x64, 0xBA, 0x04, 0xAD, 0x3A,
40
0x52, 0x54, 0xD6, 0xA5, 0x79, 0xAD, 0x1E, 0x00
42
const u8 master_secret[] = {
43
0x4A, 0x1A, 0x51, 0x2C, 0x01, 0x60, 0xBC, 0x02,
44
0x3C, 0xCF, 0xBC, 0x83, 0x3F, 0x03, 0xBC, 0x64,
45
0x88, 0xC1, 0x31, 0x2F, 0x0B, 0xA9, 0xA2, 0x77,
46
0x16, 0xA8, 0xD8, 0xE8, 0xBD, 0xC9, 0xD2, 0x29,
47
0x38, 0x4B, 0x7A, 0x85, 0xBE, 0x16, 0x4D, 0x27,
48
0x33, 0xD5, 0x24, 0x79, 0x87, 0xB1, 0xC5, 0xA2
50
const u8 key_block[] = {
51
0x59, 0x59, 0xBE, 0x8E, 0x41, 0x3A, 0x77, 0x74,
52
0x8B, 0xB2, 0xE5, 0xD3, 0x60, 0xAC, 0x4D, 0x35,
53
0xDF, 0xFB, 0xC8, 0x1E, 0x9C, 0x24, 0x9C, 0x8B,
54
0x0E, 0xC3, 0x1D, 0x72, 0xC8, 0x84, 0x9D, 0x57,
55
0x48, 0x51, 0x2E, 0x45, 0x97, 0x6C, 0x88, 0x70,
56
0xBE, 0x5F, 0x01, 0xD3, 0x64, 0xE7, 0x4C, 0xBB,
57
0x11, 0x24, 0xE3, 0x49, 0xE2, 0x3B, 0xCD, 0xEF,
58
0x7A, 0xB3, 0x05, 0x39, 0x5D, 0x64, 0x8A, 0x44,
59
0x11, 0xB6, 0x69, 0x88, 0x34, 0x2E, 0x8E, 0x29,
60
0xD6, 0x4B, 0x7D, 0x72, 0x17, 0x59, 0x28, 0x05,
61
0xAF, 0xF9, 0xB7, 0xFF, 0x66, 0x6D, 0xA1, 0x96,
62
0x8F, 0x0B, 0x5E, 0x06, 0x46, 0x7A, 0x44, 0x84,
63
0x64, 0xC1, 0xC8, 0x0C, 0x96, 0x44, 0x09, 0x98,
64
0xFF, 0x92, 0xA8, 0xB4, 0xC6, 0x42, 0x28, 0x71
67
0xD6, 0x4B, 0x7D, 0x72, 0x17, 0x59, 0x28, 0x05,
68
0xAF, 0xF9, 0xB7, 0xFF, 0x66, 0x6D, 0xA1, 0x96,
69
0x8F, 0x0B, 0x5E, 0x06, 0x46, 0x7A, 0x44, 0x84,
70
0x64, 0xC1, 0xC8, 0x0C, 0x96, 0x44, 0x09, 0x98,
71
0xFF, 0x92, 0xA8, 0xB4, 0xC6, 0x42, 0x28, 0x71
74
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
75
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
76
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
77
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
80
0x16, 0x15, 0x3C, 0x3F, 0x21, 0x55, 0xEF, 0xD9,
81
0x7F, 0x34, 0xAE, 0xC8, 0x1A, 0x4E, 0x66, 0x80,
82
0x4C, 0xC3, 0x76, 0xF2, 0x8A, 0xA9, 0x6F, 0x96,
83
0xC2, 0x54, 0x5F, 0x8C, 0xAB, 0x65, 0x02, 0xE1,
84
0x18, 0x40, 0x7B, 0x56, 0xBE, 0xEA, 0xA7, 0xC5,
85
0x76, 0x5D, 0x8F, 0x0B, 0xC5, 0x07, 0xC6, 0xB9,
86
0x04, 0xD0, 0x69, 0x56, 0x72, 0x8B, 0x6B, 0xB8,
87
0x15, 0xEC, 0x57, 0x7B
90
0x4D, 0x83, 0xA9, 0xBE, 0x6F, 0x8A, 0x74, 0xED,
91
0x6A, 0x02, 0x66, 0x0A, 0x63, 0x4D, 0x2C, 0x33,
92
0xC2, 0xDA, 0x60, 0x15, 0xC6, 0x37, 0x04, 0x51,
93
0x90, 0x38, 0x63, 0xDA, 0x54, 0x3E, 0x14, 0xB9,
94
0x27, 0x99, 0x18, 0x1E, 0x07, 0xBF, 0x0F, 0x5A,
95
0x5E, 0x3C, 0x32, 0x93, 0x80, 0x8C, 0x6C, 0x49,
96
0x67, 0xED, 0x24, 0xFE, 0x45, 0x40, 0xA0, 0x59,
97
0x5E, 0x37, 0xC2, 0xE9, 0xD0, 0x5D, 0x0A, 0xE3
100
0x80, 0x0C, 0x00, 0x38, 0x00, 0x01, 0x01, 0x00,
101
0xD8, 0x6A, 0x8C, 0x68, 0x3C, 0x32, 0x31, 0xA8,
102
0x56, 0x63, 0xB6, 0x40, 0x21, 0xFE, 0x21, 0x14,
103
0x4E, 0xE7, 0x54, 0x20, 0x79, 0x2D, 0x42, 0x62,
104
0xC9, 0xBF, 0x53, 0x7F, 0x54, 0xFD, 0xAC, 0x58,
105
0x43, 0x24, 0x6E, 0x30, 0x92, 0x17, 0x6D, 0xCF,
106
0xE6, 0xE0, 0x69, 0xEB, 0x33, 0x61, 0x6A, 0xCC,
107
0x05, 0xC5, 0x5B, 0xB7
109
const u8 compound_mac[] = {
110
0x43, 0x24, 0x6E, 0x30, 0x92, 0x17, 0x6D, 0xCF,
111
0xE6, 0xE0, 0x69, 0xEB, 0x33, 0x61, 0x6A, 0xCC,
112
0x05, 0xC5, 0x5B, 0xB7
115
const u8 *simck, *cmk;
118
printf("EAP-FAST test cases\n");
120
printf("- T-PRF (SHA1) test case / master_secret\n");
121
sha1_t_prf(pac_key, sizeof(pac_key), "PAC to master secret label hash",
122
seed, sizeof(seed), buf, sizeof(master_secret));
123
if (memcmp(master_secret, buf, sizeof(master_secret)) != 0) {
124
printf("T-PRF test - FAILED!\n");
128
printf("- PRF (TLS, SHA1/MD5) test case / key_block\n");
129
tls_prf(master_secret, sizeof(master_secret), "key expansion",
130
seed, sizeof(seed), buf, sizeof(key_block));
131
if (memcmp(key_block, buf, sizeof(key_block)) != 0) {
132
printf("PRF test - FAILED!\n");
136
printf("- T-PRF (SHA1) test case / IMCK\n");
137
sha1_t_prf(sks, sizeof(sks), "Inner Methods Compound Keys",
138
isk, sizeof(isk), buf, sizeof(imck));
139
if (memcmp(imck, buf, sizeof(imck)) != 0) {
140
printf("T-PRF test - FAILED!\n");
147
printf("- T-PRF (SHA1) test case / MSK\n");
148
sha1_t_prf(simck, 40, "Session Key Generating Function",
149
(u8 *) "", 0, buf, sizeof(msk));
150
if (memcmp(msk, buf, sizeof(msk)) != 0) {
151
printf("T-PRF test - FAILED!\n");
155
printf("- Compound MAC test case\n");
156
memset(tlv + sizeof(tlv) - 20, 0, 20);
157
hmac_sha1(cmk, 20, tlv, sizeof(tlv), tlv + sizeof(tlv) - 20);
158
if (memcmp(tlv + sizeof(tlv) - 20, compound_mac, sizeof(compound_mac))
160
printf("Compound MAC test - FAILED!\n");
170
0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b,
171
0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b,
172
0x0b, 0x0b, 0x0b, 0x0b
174
static u8 data0[] = "Hi There";
177
0xbc, 0xd4, 0xc6, 0x50, 0xb3, 0x0b, 0x96, 0x84,
178
0x95, 0x18, 0x29, 0xe0, 0xd7, 0x5f, 0x9d, 0x54,
179
0xb8, 0x62, 0x17, 0x5e, 0xd9, 0xf0, 0x06, 0x06,
180
0xe1, 0x7d, 0x8d, 0xa3, 0x54, 0x02, 0xff, 0xee,
181
0x75, 0xdf, 0x78, 0xc3, 0xd3, 0x1e, 0x0f, 0x88,
182
0x9f, 0x01, 0x21, 0x20, 0xc0, 0x86, 0x2b, 0xeb,
183
0x67, 0x75, 0x3e, 0x74, 0x39, 0xae, 0x24, 0x2e,
184
0xdb, 0x83, 0x73, 0x69, 0x83, 0x56, 0xcf, 0x5a
187
static u8 key1[] = "Jefe";
188
static u8 data1[] = "what do ya want for nothing?";
191
0x51, 0xf4, 0xde, 0x5b, 0x33, 0xf2, 0x49, 0xad,
192
0xf8, 0x1a, 0xeb, 0x71, 0x3a, 0x3c, 0x20, 0xf4,
193
0xfe, 0x63, 0x14, 0x46, 0xfa, 0xbd, 0xfa, 0x58,
194
0x24, 0x47, 0x59, 0xae, 0x58, 0xef, 0x90, 0x09,
195
0xa9, 0x9a, 0xbf, 0x4e, 0xac, 0x2c, 0xa5, 0xfa,
196
0x87, 0xe6, 0x92, 0xc4, 0x40, 0xeb, 0x40, 0x02,
197
0x3e, 0x7b, 0xab, 0xb2, 0x06, 0xd6, 0x1d, 0xe7,
198
0xb9, 0x2f, 0x41, 0x52, 0x90, 0x92, 0xb8, 0xfc
204
0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa,
205
0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa,
206
0xaa, 0xaa, 0xaa, 0xaa
210
0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd,
211
0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd,
212
0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd,
213
0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd,
214
0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd,
215
0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd,
220
0xe1, 0xac, 0x54, 0x6e, 0xc4, 0xcb, 0x63, 0x6f,
221
0x99, 0x76, 0x48, 0x7b, 0xe5, 0xc8, 0x6b, 0xe1,
222
0x7a, 0x02, 0x52, 0xca, 0x5d, 0x8d, 0x8d, 0xf1,
223
0x2c, 0xfb, 0x04, 0x73, 0x52, 0x52, 0x49, 0xce,
224
0x9d, 0xd8, 0xd1, 0x77, 0xea, 0xd7, 0x10, 0xbc,
225
0x9b, 0x59, 0x05, 0x47, 0x23, 0x91, 0x07, 0xae,
226
0xf7, 0xb4, 0xab, 0xd4, 0x3d, 0x87, 0xf0, 0xa6,
227
0x8f, 0x1c, 0xbd, 0x9e, 0x2b, 0x6f, 0x76, 0x07
231
struct passphrase_test {
237
static struct passphrase_test passphrase_tests[] =
243
0xf4, 0x2c, 0x6f, 0xc5, 0x2d, 0xf0, 0xeb, 0xef,
244
0x9e, 0xbb, 0x4b, 0x90, 0xb3, 0x8a, 0x5f, 0x90,
245
0x2e, 0x83, 0xfe, 0x1b, 0x13, 0x5a, 0x70, 0xe2,
246
0x3a, 0xed, 0x76, 0x2e, 0x97, 0x10, 0xa1, 0x2e
253
0x0d, 0xc0, 0xd6, 0xeb, 0x90, 0x55, 0x5e, 0xd6,
254
0x41, 0x97, 0x56, 0xb9, 0xa1, 0x5e, 0xc3, 0xe3,
255
0x20, 0x9b, 0x63, 0xdf, 0x70, 0x7d, 0xd5, 0x08,
256
0xd1, 0x45, 0x81, 0xf8, 0x98, 0x27, 0x21, 0xaf
260
"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa",
261
"ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ",
263
0xbe, 0xcb, 0x93, 0x86, 0x6b, 0xb8, 0xc3, 0x83,
264
0x2c, 0xb7, 0x77, 0xc2, 0xf5, 0x59, 0x80, 0x7c,
265
0x8c, 0x59, 0xaf, 0xcb, 0x6e, 0xae, 0x73, 0x48,
266
0x85, 0x00, 0x13, 0x00, 0xa9, 0x81, 0xcc, 0x62
271
#define NUM_PASSPHRASE_TESTS \
272
(sizeof(passphrase_tests) / sizeof(passphrase_tests[0]))
275
int main(int argc, char *argv[])
281
printf("PRF-SHA1 test cases:\n");
283
sha1_prf(key0, sizeof(key0), "prefix", data0, sizeof(data0) - 1,
285
if (memcmp(res, prf0, sizeof(prf0)) == 0)
286
printf("Test case 0 - OK\n");
288
printf("Test case 0 - FAILED!\n");
292
sha1_prf(key1, sizeof(key1) - 1, "prefix", data1, sizeof(data1) - 1,
294
if (memcmp(res, prf1, sizeof(prf1)) == 0)
295
printf("Test case 1 - OK\n");
297
printf("Test case 1 - FAILED!\n");
301
sha1_prf(key2, sizeof(key2), "prefix", data2, sizeof(data2),
303
if (memcmp(res, prf2, sizeof(prf2)) == 0)
304
printf("Test case 2 - OK\n");
306
printf("Test case 2 - FAILED!\n");
310
ret += test_eap_fast();
312
printf("PBKDF2-SHA1 Passphrase test cases:\n");
313
for (i = 0; i < NUM_PASSPHRASE_TESTS; i++) {
315
struct passphrase_test *test = &passphrase_tests[i];
316
pbkdf2_sha1(test->passphrase,
317
test->ssid, strlen(test->ssid),
319
if (memcmp(psk, test->psk, 32) == 0)
320
printf("Test case %d - OK\n", i);
322
printf("Test case %d - FAILED!\n", i);