2 * test_vectors - IEEE 802.11 test vector generator
3 * Copyright (c) 2012, Jouni Malinen <j@w1.fi>
5 * This software may be distributed under the terms of the BSD license.
6 * See README for more details.
9 #include "utils/includes.h"
11 #include "utils/common.h"
12 #include "utils/eloop.h"
16 extern int wpa_debug_level;
17 extern int wpa_debug_show_keys;
20 static void test_vector_tkip(void)
23 0x12, 0x34, 0x56, 0x78, 0x90, 0x12, 0x34, 0x56,
24 0x78, 0x90, 0x12, 0x34, 0x56, 0x78, 0x90, 0x12,
25 0x34, 0x56, 0x78, 0x90, 0x12, 0x34, 0x56, 0x78,
26 0x90, 0x12, 0x34, 0x56, 0x78, 0x90, 0x12, 0x34
28 u8 pn[] = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x01 };
30 0x08, 0x42, 0x2c, 0x00, 0x02, 0x03, 0x04, 0x05,
31 0x06, 0x08, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
32 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0xd0, 0x02,
33 /* 0x00, 0x20, 0x01, 0x20, 0x00, 0x00, 0x00, 0x00, */
34 0xaa, 0xaa, 0x03, 0x00, 0x00, 0x00, 0x08, 0x00,
35 0x45, 0x00, 0x00, 0x54, 0x00, 0x00, 0x40, 0x00,
36 0x40, 0x01, 0xa5, 0x55, 0xc0, 0xa8, 0x0a, 0x02,
37 0xc0, 0xa8, 0x0a, 0x01, 0x08, 0x00, 0x3a, 0xb0,
38 0x00, 0x00, 0x00, 0x00, 0xcd, 0x4c, 0x05, 0x00,
39 0x00, 0x00, 0x00, 0x00, 0x08, 0x09, 0x0a, 0x0b,
40 0x0c, 0x0d, 0x0e, 0x0f, 0x10, 0x11, 0x12, 0x13,
41 0x14, 0x15, 0x16, 0x17, 0x18, 0x19, 0x1a, 0x1b,
42 0x1c, 0x1d, 0x1e, 0x1f, 0x20, 0x21, 0x22, 0x23,
43 0x24, 0x25, 0x26, 0x27, 0x28, 0x29, 0x2a, 0x2b,
44 0x2c, 0x2d, 0x2e, 0x2f, 0x30, 0x31, 0x32, 0x33,
45 0x34, 0x35, 0x36, 0x37,
46 /* 0x68, 0x81, 0xa3, 0xf3, 0xd6, 0x48, 0xd0, 0x3c */
49 size_t enc_len, plain_len;
51 wpa_printf(MSG_INFO, "\nIEEE Std 802.11-2012, M.6.3 TKIP test "
54 wpa_hexdump(MSG_INFO, "TK", tk, sizeof(tk));
55 wpa_hexdump(MSG_INFO, "PN", pn, sizeof(pn));
56 wpa_hexdump(MSG_INFO, "Plaintext MPDU", frame, sizeof(frame));
58 enc = tkip_encrypt(tk, frame, sizeof(frame), 24, NULL, pn, 0, &enc_len);
60 wpa_printf(MSG_ERROR, "Failed to encrypt TKIP frame");
64 wpa_hexdump(MSG_INFO, "Encrypted MPDU (without FCS)", enc, enc_len);
66 wpa_debug_level = MSG_INFO;
67 plain = tkip_decrypt(tk, (const struct ieee80211_hdr *) enc,
68 enc + 24, enc_len - 24, &plain_len);
69 wpa_debug_level = MSG_EXCESSIVE;
73 wpa_printf(MSG_ERROR, "Failed to decrypt TKIP frame");
77 if (plain_len != sizeof(frame) - 24 ||
78 os_memcmp(plain, frame + 24, plain_len) != 0) {
79 wpa_hexdump(MSG_ERROR, "Decryption result did not match",
87 static void test_vector_ccmp(void)
89 u8 tk[] = { 0xc9, 0x7c, 0x1f, 0x67, 0xce, 0x37, 0x11, 0x85,
90 0x51, 0x4a, 0x8a, 0x19, 0xf2, 0xbd, 0xd5, 0x2f };
91 u8 pn[] = { 0xB5, 0x03, 0x97, 0x76, 0xE7, 0x0C };
93 0x08, 0x48, 0xc3, 0x2c, 0x0f, 0xd2, 0xe1, 0x28,
94 0xa5, 0x7c, 0x50, 0x30, 0xf1, 0x84, 0x44, 0x08,
95 0xab, 0xae, 0xa5, 0xb8, 0xfc, 0xba, 0x80, 0x33,
96 0xf8, 0xba, 0x1a, 0x55, 0xd0, 0x2f, 0x85, 0xae,
97 0x96, 0x7b, 0xb6, 0x2f, 0xb6, 0xcd, 0xa8, 0xeb,
98 0x7e, 0x78, 0xa0, 0x50
101 size_t enc_len, plain_len;
104 wpa_printf(MSG_INFO, "\nIEEE Std 802.11-2012, M.6.4 CCMP test "
107 wpa_hexdump(MSG_INFO, "TK", tk, sizeof(tk));
108 wpa_hexdump(MSG_INFO, "PN", pn, sizeof(pn));
109 wpa_hexdump(MSG_INFO, "802.11 Header", frame, 24);
110 wpa_hexdump(MSG_INFO, "Plaintext Data", frame + 24, sizeof(frame) - 24);
112 enc = ccmp_encrypt(tk, frame, sizeof(frame), 24, NULL, pn, 0, &enc_len);
114 wpa_printf(MSG_ERROR, "Failed to encrypt CCMP frame");
118 wpa_hexdump(MSG_INFO, "Encrypted MPDU (without FCS)", enc, enc_len);
119 WPA_PUT_LE32(fcs, crc32(enc, enc_len));
120 wpa_hexdump(MSG_INFO, "FCS", fcs, sizeof(fcs));
122 wpa_debug_level = MSG_INFO;
123 plain = ccmp_decrypt(tk, (const struct ieee80211_hdr *) enc,
124 enc + 24, enc_len - 24, &plain_len);
125 wpa_debug_level = MSG_EXCESSIVE;
129 wpa_printf(MSG_ERROR, "Failed to decrypt CCMP frame");
133 if (plain_len != sizeof(frame) - 24 ||
134 os_memcmp(plain, frame + 24, plain_len) != 0) {
135 wpa_hexdump(MSG_ERROR, "Decryption result did not match",
143 static void test_vector_bip(void)
146 0x4e, 0xa9, 0x54, 0x3e, 0x09, 0xcf, 0x2b, 0x1e,
147 0xca, 0x66, 0xff, 0xc5, 0x8b, 0xde, 0xcb, 0xcf
149 u8 ipn[] = { 0x04, 0x00, 0x00, 0x00, 0x00, 0x00 };
151 0xc0, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff,
152 0xff, 0xff, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00,
153 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00,
159 wpa_printf(MSG_INFO, "\nIEEE Std 802.11-2012, M.9.1 BIP with broadcast "
160 "Deauthentication frame\n");
162 wpa_hexdump(MSG_INFO, "IGTK", igtk, sizeof(igtk));
163 wpa_hexdump(MSG_INFO, "IPN", ipn, sizeof(ipn));
164 wpa_hexdump(MSG_INFO, "Plaintext frame", frame, sizeof(frame));
166 prot = bip_protect(igtk, frame, sizeof(frame), ipn, 4, &prot_len);
168 wpa_printf(MSG_ERROR, "Failed to protect BIP frame");
172 wpa_hexdump(MSG_INFO, "Protected MPDU (without FCS)", prot, prot_len);
177 static void test_vector_ccmp_mgmt(void)
179 u8 tk[] = { 0x66, 0xed, 0x21, 0x04, 0x2f, 0x9f, 0x26, 0xd7,
180 0x11, 0x57, 0x06, 0xe4, 0x04, 0x14, 0xcf, 0x2e };
181 u8 pn[] = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x01 };
183 0xc0, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00,
184 0x01, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00,
185 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x60, 0x00,
189 size_t enc_len, plain_len;
191 wpa_printf(MSG_INFO, "\nIEEE Std 802.11-2012, M.9.2 CCMP with unicast "
192 "Deauthentication frame\n");
194 wpa_hexdump(MSG_INFO, "TK", tk, sizeof(tk));
195 wpa_hexdump(MSG_INFO, "PN", pn, sizeof(pn));
196 wpa_hexdump(MSG_INFO, "802.11 Header", frame, 24);
197 wpa_hexdump(MSG_INFO, "Plaintext Data", frame + 24, sizeof(frame) - 24);
199 enc = ccmp_encrypt(tk, frame, sizeof(frame), 24, NULL, pn, 0, &enc_len);
201 wpa_printf(MSG_ERROR, "Failed to encrypt CCMP frame");
205 wpa_hexdump(MSG_INFO, "Encrypted MPDU (without FCS)", enc, enc_len);
207 wpa_debug_level = MSG_INFO;
208 plain = ccmp_decrypt(tk, (const struct ieee80211_hdr *) enc,
209 enc + 24, enc_len - 24, &plain_len);
210 wpa_debug_level = MSG_EXCESSIVE;
214 wpa_printf(MSG_ERROR, "Failed to decrypt CCMP frame");
218 if (plain_len != sizeof(frame) - 24 ||
219 os_memcmp(plain, frame + 24, plain_len) != 0) {
220 wpa_hexdump(MSG_ERROR, "Decryption result did not match",
228 static void test_vector_gcmp(void)
230 u8 tk[] = { 0xc9, 0x7c, 0x1f, 0x67, 0xce, 0x37, 0x11, 0x85,
231 0x51, 0x4a, 0x8a, 0x19, 0xf2, 0xbd, 0xd5, 0x2f };
233 0x00, 0x89, 0x5F, 0x5F, 0x2B, 0x08
236 0x88, 0x48, 0x0b, 0x00, 0x0f, 0xd2, 0xe1, 0x28,
237 0xa5, 0x7c, 0x50, 0x30, 0xf1, 0x84, 0x44, 0x08,
238 0x50, 0x30, 0xf1, 0x84, 0x44, 0x08, 0x80, 0x33,
239 0x03, 0x00, 0x00, 0x01, 0x02, 0x03, 0x04, 0x05,
240 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d,
241 0x0e, 0x0f, 0x10, 0x11, 0x12, 0x13, 0x14, 0x15,
242 0x16, 0x17, 0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d,
243 0x1e, 0x1f, 0x20, 0x21, 0x22, 0x23, 0x24, 0x25,
247 size_t enc_len, plain_len;
250 wpa_printf(MSG_INFO, "\nIEEE P802.11ad/D9.0, M.11.1 GCMP test "
253 wpa_hexdump(MSG_INFO, "TK", tk, sizeof(tk));
254 wpa_hexdump(MSG_INFO, "PN", pn, sizeof(pn));
255 wpa_hexdump(MSG_INFO, "802.11 Header", frame, 26);
256 wpa_hexdump(MSG_INFO, "Plaintext Data", frame + 26, sizeof(frame) - 26);
258 enc = gcmp_encrypt(tk, sizeof(tk), frame, sizeof(frame), 26, frame + 24,
261 wpa_printf(MSG_ERROR, "Failed to encrypt GCMP frame");
265 wpa_hexdump(MSG_INFO, "Encrypted MPDU (without FCS)", enc, enc_len);
266 WPA_PUT_LE32(fcs, crc32(enc, enc_len));
267 wpa_hexdump(MSG_INFO, "FCS", fcs, sizeof(fcs));
269 wpa_debug_level = MSG_INFO;
270 plain = gcmp_decrypt(tk, sizeof(tk), (const struct ieee80211_hdr *) enc,
271 enc + 26, enc_len - 26, &plain_len);
272 wpa_debug_level = MSG_EXCESSIVE;
276 wpa_printf(MSG_ERROR, "Failed to decrypt GCMP frame");
280 if (plain_len != sizeof(frame) - 26 ||
281 os_memcmp(plain, frame + 26, plain_len) != 0) {
282 wpa_hexdump(MSG_ERROR, "Decryption result did not match",
290 static void test_vector_gcmp_256(void)
292 u8 tk[] = { 0xc9, 0x7c, 0x1f, 0x67, 0xce, 0x37, 0x11, 0x85,
293 0x51, 0x4a, 0x8a, 0x19, 0xf2, 0xbd, 0xd5, 0x2f,
294 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
295 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f };
297 0x00, 0x89, 0x5F, 0x5F, 0x2B, 0x08
300 0x88, 0x48, 0x0b, 0x00, 0x0f, 0xd2, 0xe1, 0x28,
301 0xa5, 0x7c, 0x50, 0x30, 0xf1, 0x84, 0x44, 0x08,
302 0x50, 0x30, 0xf1, 0x84, 0x44, 0x08, 0x80, 0x33,
303 0x03, 0x00, 0x00, 0x01, 0x02, 0x03, 0x04, 0x05,
304 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d,
305 0x0e, 0x0f, 0x10, 0x11, 0x12, 0x13, 0x14, 0x15,
306 0x16, 0x17, 0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d,
307 0x1e, 0x1f, 0x20, 0x21, 0x22, 0x23, 0x24, 0x25,
311 size_t enc_len, plain_len;
314 wpa_printf(MSG_INFO, "\nGCMP-256 test vector\n");
316 wpa_hexdump(MSG_INFO, "TK", tk, sizeof(tk));
317 wpa_hexdump(MSG_INFO, "PN", pn, sizeof(pn));
318 wpa_hexdump(MSG_INFO, "802.11 Header", frame, 26);
319 wpa_hexdump(MSG_INFO, "Plaintext Data", frame + 26, sizeof(frame) - 26);
321 enc = gcmp_encrypt(tk, sizeof(tk), frame, sizeof(frame), 26, frame + 24,
324 wpa_printf(MSG_ERROR, "Failed to encrypt GCMP frame");
328 wpa_hexdump(MSG_INFO, "Encrypted MPDU (without FCS)", enc, enc_len);
329 WPA_PUT_LE32(fcs, crc32(enc, enc_len));
330 wpa_hexdump(MSG_INFO, "FCS", fcs, sizeof(fcs));
332 wpa_debug_level = MSG_INFO;
333 plain = gcmp_decrypt(tk, sizeof(tk), (const struct ieee80211_hdr *) enc,
334 enc + 26, enc_len - 26, &plain_len);
335 wpa_debug_level = MSG_EXCESSIVE;
339 wpa_printf(MSG_ERROR, "Failed to decrypt GCMP frame");
343 if (plain_len != sizeof(frame) - 26 ||
344 os_memcmp(plain, frame + 26, plain_len) != 0) {
345 wpa_hexdump(MSG_ERROR, "Decryption result did not match",
353 static void test_vector_ccmp_256(void)
355 u8 tk[] = { 0xc9, 0x7c, 0x1f, 0x67, 0xce, 0x37, 0x11, 0x85,
356 0x51, 0x4a, 0x8a, 0x19, 0xf2, 0xbd, 0xd5, 0x2f,
357 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
358 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f };
359 u8 pn[] = { 0xB5, 0x03, 0x97, 0x76, 0xE7, 0x0C };
361 0x08, 0x48, 0xc3, 0x2c, 0x0f, 0xd2, 0xe1, 0x28,
362 0xa5, 0x7c, 0x50, 0x30, 0xf1, 0x84, 0x44, 0x08,
363 0xab, 0xae, 0xa5, 0xb8, 0xfc, 0xba, 0x80, 0x33,
364 0xf8, 0xba, 0x1a, 0x55, 0xd0, 0x2f, 0x85, 0xae,
365 0x96, 0x7b, 0xb6, 0x2f, 0xb6, 0xcd, 0xa8, 0xeb,
366 0x7e, 0x78, 0xa0, 0x50
369 size_t enc_len, plain_len;
372 wpa_printf(MSG_INFO, "\nCCMP-256 test vector\n");
374 wpa_hexdump(MSG_INFO, "TK", tk, sizeof(tk));
375 wpa_hexdump(MSG_INFO, "PN", pn, sizeof(pn));
376 wpa_hexdump(MSG_INFO, "802.11 Header", frame, 24);
377 wpa_hexdump(MSG_INFO, "Plaintext Data", frame + 24, sizeof(frame) - 24);
379 enc = ccmp_256_encrypt(tk, frame, sizeof(frame), 24, NULL, pn, 0,
382 wpa_printf(MSG_ERROR, "Failed to encrypt CCMP frame");
386 wpa_hexdump(MSG_INFO, "Encrypted MPDU (without FCS)", enc, enc_len);
387 WPA_PUT_LE32(fcs, crc32(enc, enc_len));
388 wpa_hexdump(MSG_INFO, "FCS", fcs, sizeof(fcs));
390 wpa_debug_level = MSG_INFO;
391 plain = ccmp_256_decrypt(tk, (const struct ieee80211_hdr *) enc,
392 enc + 24, enc_len - 24, &plain_len);
393 wpa_debug_level = MSG_EXCESSIVE;
397 wpa_printf(MSG_ERROR, "Failed to decrypt CCMP-256 frame");
401 if (plain_len != sizeof(frame) - 24 ||
402 os_memcmp(plain, frame + 24, plain_len) != 0) {
403 wpa_hexdump(MSG_ERROR, "Decryption result did not match",
411 int main(int argc, char *argv[])
413 wpa_debug_level = MSG_EXCESSIVE;
414 wpa_debug_show_keys = 1;
416 if (os_program_init())
422 test_vector_ccmp_mgmt();
424 test_vector_gcmp_256();
425 test_vector_ccmp_256();