]>
git.ipfire.org Git - thirdparty/hostap.git/blob - wlantest/test_vectors.c
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/crc32.h"
13 #include "utils/eloop.h"
14 #include "common/ieee802_11_defs.h"
18 static void test_vector_tkip(void)
21 0x12, 0x34, 0x56, 0x78, 0x90, 0x12, 0x34, 0x56,
22 0x78, 0x90, 0x12, 0x34, 0x56, 0x78, 0x90, 0x12,
23 0x34, 0x56, 0x78, 0x90, 0x12, 0x34, 0x56, 0x78,
24 0x90, 0x12, 0x34, 0x56, 0x78, 0x90, 0x12, 0x34
26 u8 pn
[] = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x01 };
28 0x08, 0x42, 0x2c, 0x00, 0x02, 0x03, 0x04, 0x05,
29 0x06, 0x08, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
30 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0xd0, 0x02,
31 /* 0x00, 0x20, 0x01, 0x20, 0x00, 0x00, 0x00, 0x00, */
32 0xaa, 0xaa, 0x03, 0x00, 0x00, 0x00, 0x08, 0x00,
33 0x45, 0x00, 0x00, 0x54, 0x00, 0x00, 0x40, 0x00,
34 0x40, 0x01, 0xa5, 0x55, 0xc0, 0xa8, 0x0a, 0x02,
35 0xc0, 0xa8, 0x0a, 0x01, 0x08, 0x00, 0x3a, 0xb0,
36 0x00, 0x00, 0x00, 0x00, 0xcd, 0x4c, 0x05, 0x00,
37 0x00, 0x00, 0x00, 0x00, 0x08, 0x09, 0x0a, 0x0b,
38 0x0c, 0x0d, 0x0e, 0x0f, 0x10, 0x11, 0x12, 0x13,
39 0x14, 0x15, 0x16, 0x17, 0x18, 0x19, 0x1a, 0x1b,
40 0x1c, 0x1d, 0x1e, 0x1f, 0x20, 0x21, 0x22, 0x23,
41 0x24, 0x25, 0x26, 0x27, 0x28, 0x29, 0x2a, 0x2b,
42 0x2c, 0x2d, 0x2e, 0x2f, 0x30, 0x31, 0x32, 0x33,
43 0x34, 0x35, 0x36, 0x37,
44 /* 0x68, 0x81, 0xa3, 0xf3, 0xd6, 0x48, 0xd0, 0x3c */
47 size_t enc_len
, plain_len
;
49 wpa_printf(MSG_INFO
, "\nIEEE Std 802.11-2012, M.6.3 TKIP test "
52 wpa_hexdump(MSG_INFO
, "TK", tk
, sizeof(tk
));
53 wpa_hexdump(MSG_INFO
, "PN", pn
, sizeof(pn
));
54 wpa_hexdump(MSG_INFO
, "Plaintext MPDU", frame
, sizeof(frame
));
56 enc
= tkip_encrypt(tk
, frame
, sizeof(frame
), 24, NULL
, pn
, 0, &enc_len
);
58 wpa_printf(MSG_ERROR
, "Failed to encrypt TKIP frame");
62 wpa_hexdump(MSG_INFO
, "Encrypted MPDU (without FCS)", enc
, enc_len
);
64 wpa_debug_level
= MSG_INFO
;
65 plain
= tkip_decrypt(tk
, (const struct ieee80211_hdr
*) enc
,
66 enc
+ 24, enc_len
- 24, &plain_len
);
67 wpa_debug_level
= MSG_EXCESSIVE
;
71 wpa_printf(MSG_ERROR
, "Failed to decrypt TKIP frame");
75 if (plain_len
!= sizeof(frame
) - 24 ||
76 os_memcmp(plain
, frame
+ 24, plain_len
) != 0) {
77 wpa_hexdump(MSG_ERROR
, "Decryption result did not match",
85 static void test_vector_ccmp(void)
87 u8 tk
[] = { 0xc9, 0x7c, 0x1f, 0x67, 0xce, 0x37, 0x11, 0x85,
88 0x51, 0x4a, 0x8a, 0x19, 0xf2, 0xbd, 0xd5, 0x2f };
89 u8 pn
[] = { 0xB5, 0x03, 0x97, 0x76, 0xE7, 0x0C };
91 0x08, 0x48, 0xc3, 0x2c, 0x0f, 0xd2, 0xe1, 0x28,
92 0xa5, 0x7c, 0x50, 0x30, 0xf1, 0x84, 0x44, 0x08,
93 0xab, 0xae, 0xa5, 0xb8, 0xfc, 0xba, 0x80, 0x33,
94 0xf8, 0xba, 0x1a, 0x55, 0xd0, 0x2f, 0x85, 0xae,
95 0x96, 0x7b, 0xb6, 0x2f, 0xb6, 0xcd, 0xa8, 0xeb,
96 0x7e, 0x78, 0xa0, 0x50
99 size_t enc_len
, plain_len
;
102 wpa_printf(MSG_INFO
, "\nIEEE Std 802.11-2012, M.6.4 CCMP test "
105 wpa_hexdump(MSG_INFO
, "TK", tk
, sizeof(tk
));
106 wpa_hexdump(MSG_INFO
, "PN", pn
, sizeof(pn
));
107 wpa_hexdump(MSG_INFO
, "802.11 Header", frame
, 24);
108 wpa_hexdump(MSG_INFO
, "Plaintext Data", frame
+ 24, sizeof(frame
) - 24);
110 enc
= ccmp_encrypt(tk
, frame
, sizeof(frame
), 24, NULL
, pn
, 0, &enc_len
);
112 wpa_printf(MSG_ERROR
, "Failed to encrypt CCMP frame");
116 wpa_hexdump(MSG_INFO
, "Encrypted MPDU (without FCS)", enc
, enc_len
);
117 WPA_PUT_LE32(fcs
, crc32(enc
, enc_len
));
118 wpa_hexdump(MSG_INFO
, "FCS", fcs
, sizeof(fcs
));
120 wpa_debug_level
= MSG_INFO
;
121 plain
= ccmp_decrypt(tk
, (const struct ieee80211_hdr
*) enc
,
122 enc
+ 24, enc_len
- 24, &plain_len
);
123 wpa_debug_level
= MSG_EXCESSIVE
;
127 wpa_printf(MSG_ERROR
, "Failed to decrypt CCMP frame");
131 if (plain_len
!= sizeof(frame
) - 24 ||
132 os_memcmp(plain
, frame
+ 24, plain_len
) != 0) {
133 wpa_hexdump(MSG_ERROR
, "Decryption result did not match",
141 static void test_vector_ccmp_pv1(void)
143 u8 tk
[] = { 0xc9, 0x7c, 0x1f, 0x67, 0xce, 0x37, 0x11, 0x85,
144 0x51, 0x4a, 0x8a, 0x19, 0xf2, 0xbd, 0xd5, 0x2f };
147 0x61, 0x00, 0xa2, 0xae, 0xa5, 0xb8, 0xfc, 0xba,
148 0x07, 0x00, 0x80, 0x33,
149 0xf8, 0xba, 0x1a, 0x55, 0xd0, 0x2f, 0x85, 0xae,
150 0x96, 0x7b, 0xb6, 0x2f, 0xb6, 0xcd, 0xa8, 0xeb,
151 0x7e, 0x78, 0xa0, 0x50
154 0x61, 0x00, 0xa2, 0xae, 0xa5, 0xb8, 0xfc, 0xba,
155 0x07, 0x20, 0x80, 0x33, 0x02, 0xd2, 0xe1, 0x28,
157 0xf8, 0xba, 0x1a, 0x55, 0xd0, 0x2f, 0x85, 0xae,
158 0x96, 0x7b, 0xb6, 0x2f, 0xb6, 0xcd, 0xa8, 0xeb,
159 0x7e, 0x78, 0xa0, 0x50
162 0x6d, 0x00, 0xa2, 0xae, 0xa5, 0xb8, 0xfc, 0xba,
163 0x52, 0x30, 0xf1, 0x84, 0x44, 0x08, 0x80, 0x33,
164 0xf8, 0xba, 0x1a, 0x55, 0xd0, 0x2f, 0x85, 0xae,
165 0x96, 0x7b, 0xb6, 0x2f, 0xb6, 0xcd, 0xa8, 0xeb,
166 0x7e, 0x78, 0xa0, 0x50
171 u8 bssid
[ETH_ALEN
] = { 0xa2, 0xae, 0xa5, 0xb8, 0xfc, 0xba };
172 u8 da
[ETH_ALEN
] = { 0x02, 0xd2, 0xe1, 0x28, 0xa5, 0x7c };
173 u8 sa
[ETH_ALEN
] = { 0x52, 0x30, 0xf1, 0x84, 0x44, 0x08 };
183 "\nIEEE P802.11ah/D10.0, J.6.4 CCMP PV1 test vectors\n");
185 wpa_printf(MSG_INFO
, "BSSID: " MACSTR
, MAC2STR(bssid
));
186 wpa_printf(MSG_INFO
, "DA: " MACSTR
, MAC2STR(da
));
187 wpa_printf(MSG_INFO
, "SA: " MACSTR
, MAC2STR(sa
));
188 wpa_printf(MSG_INFO
, "Association ID: %u", aid
);
189 wpa_printf(MSG_INFO
, "Base PN: %u (0x%08x)", bpn
, bpn
);
190 wpa_printf(MSG_INFO
, "SC = 0x%04x (FragNum=%u SeqNum=%u)",
191 sc
, WLAN_GET_SEQ_FRAG(sc
), WLAN_GET_SEQ_SEQ(sc
));
192 wpa_printf(MSG_INFO
, "TID = %u", tid
);
193 wpa_printf(MSG_INFO
, "Key ID: %u", key_id
);
194 wpa_hexdump(MSG_INFO
, "TK", tk
, sizeof(tk
));
195 wpa_printf(MSG_INFO
, "PN = SC||BPN");
196 WPA_PUT_LE16(&pn
[0], sc
);
197 WPA_PUT_LE32(&pn
[2], bpn
);
198 wpa_hexdump(MSG_INFO
, "PN (PN0..PN5)", pn
, sizeof(pn
));
201 "\nPV1 test vector #1:\nHeader compression used and A3 was previously stored at the receiver\n");
202 fc
= WPA_GET_LE16(frame1
);
204 "FC=0x%04x (PV=%u Type=%u PTID/Subtype=%u From_DS=%u More_Fragments=%u Power_Management=%u More_Data=%u Protected_Frame=%u End_of_SP=%u Relayed_Frame=%u Ack_Policy=%u)",
207 (fc
& (BIT(2) | BIT(3) | BIT(4))) >> 2,
208 (fc
& (BIT(5) | BIT(6) | BIT(7))) >> 5,
217 wpa_printf(MSG_INFO
, "A1=" MACSTR
, MAC2STR(&frame1
[2]));
218 sid
= WPA_GET_LE16(&frame1
[8]);
220 "A2=%02x %02x (SID: AID=%u A3_Present=%u A4_Present=%u A-MSDU=%u); corresponds to 52:30:f1:84:44:08 in uncompressed header",
221 frame1
[8], frame1
[9],
222 sid
& ~(BIT(13) | BIT(14) | BIT(15)),
226 sc
= WPA_GET_LE16(&frame1
[10]);
227 wpa_printf(MSG_INFO
, "Sequence Control: %02x %02x (FN=%u SN=%u)",
228 frame1
[10], frame1
[11],
229 WLAN_GET_SEQ_FRAG(sc
), WLAN_GET_SEQ_SEQ(sc
));
230 wpa_printf(MSG_INFO
, "A3 not present; corresponds to 02:d2:e1:28:a5:7c in uncompressed header");
231 wpa_printf(MSG_INFO
, "A4 not present");
232 wpa_hexdump(MSG_INFO
, "Plaintext Frame Header", frame1
, 12);
233 wpa_hexdump(MSG_INFO
, "Plaintext Frame Body",
234 frame1
+ 12, sizeof(frame1
) - 12);
236 enc
= ccmp_encrypt_pv1(tk
, &frame1
[2], sa
, da
, frame1
, sizeof(frame1
),
237 12, pn
, key_id
, &enc_len
);
239 wpa_printf(MSG_ERROR
, "Failed to encrypt CCMP frame");
243 wpa_hexdump(MSG_INFO
, "Encrypted Frame Header", enc
, 12);
244 wpa_hexdump(MSG_INFO
, "Encrypted Frame Frame Body",
245 enc
+ 12, enc_len
- 12);
246 WPA_PUT_LE32(fcs
, crc32(enc
, enc_len
));
247 wpa_hexdump(MSG_INFO
, "Encrypted Frame FCS", fcs
, sizeof(fcs
));
250 "\nPV1 test vector #2:\nHeader compression used and A3 was not previously stored at the receiver\n");
251 fc
= WPA_GET_LE16(frame2
);
253 "FC=0x%04x (PV=%u Type=%u PTID/Subtype=%u From_DS=%u More_Fragments=%u Power_Management=%u More_Data=%u Protected_Frame=%u End_of_SP=%u Relayed_Frame=%u Ack_Policy=%u)",
256 (fc
& (BIT(2) | BIT(3) | BIT(4))) >> 2,
257 (fc
& (BIT(5) | BIT(6) | BIT(7))) >> 5,
266 wpa_printf(MSG_INFO
, "A1=" MACSTR
, MAC2STR(&frame2
[2]));
267 sid
= WPA_GET_LE16(&frame2
[8]);
269 "A2=%02x %02x (SID: AID=%u A3_Present=%u A4_Present=%u A-MSDU=%u); corresponds to 52:30:f1:84:44:08 in uncompressed header",
270 frame2
[8], frame2
[9],
271 sid
& ~(BIT(13) | BIT(14) | BIT(15)),
275 sc
= WPA_GET_LE16(&frame2
[10]);
276 wpa_printf(MSG_INFO
, "Sequence Control: %02x %02x (FN=%u SN=%u)",
277 frame2
[10], frame2
[11],
278 WLAN_GET_SEQ_FRAG(sc
), WLAN_GET_SEQ_SEQ(sc
));
279 wpa_printf(MSG_INFO
, "A3=" MACSTR
, MAC2STR(&frame2
[12]));
280 wpa_printf(MSG_INFO
, "A4 not present");
281 wpa_hexdump(MSG_INFO
, "Plaintext Frame Header", frame2
, 18);
282 wpa_hexdump(MSG_INFO
, "Plaintext Frame Body",
283 frame2
+ 18, sizeof(frame2
) - 18);
285 enc
= ccmp_encrypt_pv1(tk
, &frame2
[2], sa
, &frame2
[12],
286 frame2
, sizeof(frame2
), 18, pn
, key_id
,
289 wpa_printf(MSG_ERROR
, "Failed to encrypt CCMP frame");
293 wpa_hexdump(MSG_INFO
, "Encrypted Frame Header", enc
, 18);
294 wpa_hexdump(MSG_INFO
, "Encrypted Frame Frame Body",
295 enc
+ 18, enc_len
- 18);
296 WPA_PUT_LE32(fcs
, crc32(enc
, enc_len
));
297 wpa_hexdump(MSG_INFO
, "Encrypted Frame FCS", fcs
, sizeof(fcs
));
300 "\nPV1 test vector #3:\nType 3 frame from SA to DA(=BSSID) (i.e., no separate DA in this example)\n");
301 fc
= WPA_GET_LE16(frame3
);
303 "FC=0x%04x (PV=%u Type=%u PTID/Subtype=%u From_DS=%u More_Fragments=%u Power_Management=%u More_Data=%u Protected_Frame=%u End_of_SP=%u Relayed_Frame=%u Ack_Policy=%u)",
306 (fc
& (BIT(2) | BIT(3) | BIT(4))) >> 2,
307 (fc
& (BIT(5) | BIT(6) | BIT(7))) >> 5,
316 wpa_printf(MSG_INFO
, "A1=" MACSTR
, MAC2STR(&frame3
[2]));
317 wpa_printf(MSG_INFO
, "A2=" MACSTR
, MAC2STR(&frame3
[8]));
318 sc
= WPA_GET_LE16(&frame3
[14]);
319 wpa_printf(MSG_INFO
, "Sequence Control: %02x %02x (FN=%u SN=%u)",
320 frame3
[14], frame3
[15],
321 WLAN_GET_SEQ_FRAG(sc
), WLAN_GET_SEQ_SEQ(sc
));
323 "A3 not present; corresponds to 02:d2:e1:28:a5:7c in uncompressed header");
324 wpa_printf(MSG_INFO
, "A4 not present");
325 wpa_hexdump(MSG_INFO
, "Plaintext Frame Header", frame3
, 16);
326 wpa_hexdump(MSG_INFO
, "Plaintext Frame Body",
327 frame3
+ 16, sizeof(frame3
) - 16);
329 enc
= ccmp_encrypt_pv1(tk
, &frame3
[2], &frame3
[8], da
,
330 frame3
, sizeof(frame3
), 16, pn
, key_id
,
333 wpa_printf(MSG_ERROR
, "Failed to encrypt CCMP frame");
337 wpa_hexdump(MSG_INFO
, "Encrypted Frame Header", enc
, 16);
338 wpa_hexdump(MSG_INFO
, "Encrypted Frame Frame Body",
339 enc
+ 16, enc_len
- 16);
340 WPA_PUT_LE32(fcs
, crc32(enc
, enc_len
));
341 wpa_hexdump(MSG_INFO
, "Encrypted Frame FCS", fcs
, sizeof(fcs
));
343 wpa_debug_level
= MSG_INFO
;
347 static void test_vector_bip(void)
350 0x4e, 0xa9, 0x54, 0x3e, 0x09, 0xcf, 0x2b, 0x1e,
351 0xca, 0x66, 0xff, 0xc5, 0x8b, 0xde, 0xcb, 0xcf
353 u8 ipn
[] = { 0x04, 0x00, 0x00, 0x00, 0x00, 0x00 };
355 0xc0, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff,
356 0xff, 0xff, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00,
357 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00,
363 wpa_printf(MSG_INFO
, "\nIEEE Std 802.11-2012, M.9.1 BIP with broadcast "
364 "Deauthentication frame\n");
366 wpa_hexdump(MSG_INFO
, "IGTK", igtk
, sizeof(igtk
));
367 wpa_hexdump(MSG_INFO
, "IPN", ipn
, sizeof(ipn
));
368 wpa_hexdump(MSG_INFO
, "Plaintext frame", frame
, sizeof(frame
));
370 prot
= bip_protect(igtk
, sizeof(igtk
), frame
, sizeof(frame
),
373 wpa_printf(MSG_ERROR
, "Failed to protect BIP frame");
377 wpa_hexdump(MSG_INFO
, "Protected MPDU (without FCS)", prot
, prot_len
);
382 static void test_vector_ccmp_mgmt(void)
384 u8 tk
[] = { 0x66, 0xed, 0x21, 0x04, 0x2f, 0x9f, 0x26, 0xd7,
385 0x11, 0x57, 0x06, 0xe4, 0x04, 0x14, 0xcf, 0x2e };
386 u8 pn
[] = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x01 };
388 0xc0, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00,
389 0x01, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00,
390 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x60, 0x00,
394 size_t enc_len
, plain_len
;
396 wpa_printf(MSG_INFO
, "\nIEEE Std 802.11-2012, M.9.2 CCMP with unicast "
397 "Deauthentication frame\n");
399 wpa_hexdump(MSG_INFO
, "TK", tk
, sizeof(tk
));
400 wpa_hexdump(MSG_INFO
, "PN", pn
, sizeof(pn
));
401 wpa_hexdump(MSG_INFO
, "802.11 Header", frame
, 24);
402 wpa_hexdump(MSG_INFO
, "Plaintext Data", frame
+ 24, sizeof(frame
) - 24);
404 enc
= ccmp_encrypt(tk
, frame
, sizeof(frame
), 24, NULL
, pn
, 0, &enc_len
);
406 wpa_printf(MSG_ERROR
, "Failed to encrypt CCMP frame");
410 wpa_hexdump(MSG_INFO
, "Encrypted MPDU (without FCS)", enc
, enc_len
);
412 wpa_debug_level
= MSG_INFO
;
413 plain
= ccmp_decrypt(tk
, (const struct ieee80211_hdr
*) enc
,
414 enc
+ 24, enc_len
- 24, &plain_len
);
415 wpa_debug_level
= MSG_EXCESSIVE
;
419 wpa_printf(MSG_ERROR
, "Failed to decrypt CCMP frame");
423 if (plain_len
!= sizeof(frame
) - 24 ||
424 os_memcmp(plain
, frame
+ 24, plain_len
) != 0) {
425 wpa_hexdump(MSG_ERROR
, "Decryption result did not match",
443 static const struct gcmp_test gcmp_vectors
[] =
446 .tk
= { 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa,
447 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa },
448 .pn
= { 0x00, 0x00, 0x00, 0x00, 0x00, 0x01 },
450 0x20, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
451 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
452 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00,
454 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
455 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
456 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
457 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
458 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
459 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
460 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
461 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
462 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
463 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
464 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
465 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
466 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
467 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
468 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
469 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
470 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
471 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
472 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
473 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
474 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
475 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
476 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
477 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
478 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
479 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
480 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
481 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
482 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
483 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
484 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
485 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
490 0x80, 0xCB, 0x06, 0x62, 0xEA, 0x71, 0xAB, 0xFD,
491 0x9F, 0x04, 0xC7, 0xF8, 0x72, 0xF5, 0x80, 0x90 },
493 0x5F, 0x55, 0x78, 0xC1, 0x8F, 0x13, 0x7A, 0xD2,
494 0x79, 0xBF, 0x3F, 0x2B, 0x24, 0xC7, 0xBD, 0x8F,
495 0x27, 0x7A, 0x1B, 0xE6, 0x77, 0x0D, 0xA1, 0xD9,
496 0x8B, 0x70, 0xC6, 0xD2, 0x8A, 0xE0, 0x1C, 0x55,
497 0x9E, 0xCB, 0xA6, 0xA0, 0x1D, 0xB0, 0x67, 0xC5,
498 0xA2, 0x7E, 0x4D, 0xB0, 0x8C, 0xDA, 0xDC, 0x77,
499 0x52, 0xAD, 0x63, 0x7E, 0xAF, 0x0A, 0x18, 0xED,
500 0x13, 0xFB, 0xAA, 0x14, 0x3B, 0xAF, 0xEF, 0x18,
501 0xF8, 0xFB, 0xCE, 0x4C, 0x65, 0xE8, 0x6B, 0xD0,
502 0x2A, 0x87, 0xB6, 0x01, 0xB7, 0xEA, 0xB9, 0x3F,
503 0x2B, 0xBC, 0x87, 0x4C, 0x8A, 0x71, 0x05, 0x80,
504 0xF5, 0x02, 0x34, 0x1A, 0x6A, 0x53, 0x39, 0x31,
505 0x43, 0xDE, 0x4C, 0x9E, 0xC6, 0xA2, 0x86, 0xF1,
506 0x25, 0x71, 0x83, 0x78, 0xAE, 0xDC, 0x84, 0xEB,
507 0xA2, 0xB3, 0x0F, 0x5C, 0x28, 0xBB, 0x5D, 0x75,
508 0xC6, 0xB0, 0x25, 0x46, 0x6D, 0x06, 0x51, 0xC7,
509 0x22, 0xDC, 0x71, 0x15, 0x1F, 0x21, 0x2D, 0x68,
510 0x87, 0x82, 0x8A, 0x03, 0x82, 0xE9, 0x28, 0x8A,
511 0x7F, 0x43, 0xD5, 0x2B, 0x7D, 0x25, 0x08, 0x61,
512 0x57, 0x64, 0x69, 0x54, 0xBB, 0x43, 0xB5, 0x7E,
513 0xA5, 0x87, 0xA0, 0x25, 0xF4, 0x0C, 0xE7, 0x45,
514 0x11, 0xE4, 0xDD, 0x22, 0x85, 0xB4, 0x0B, 0xA3,
515 0xF3, 0xB9, 0x62, 0x62, 0xCB, 0xC2, 0x8C, 0x6A,
516 0xA7, 0xBE, 0x44, 0x3E, 0x7B, 0x41, 0xE1, 0xEB,
517 0xFF, 0x52, 0x48, 0x57, 0xA6, 0x81, 0x68, 0x97,
518 0x75, 0x01, 0x15, 0xB0, 0x23, 0x1A, 0xB7, 0xC2,
519 0x84, 0x72, 0xC0, 0x6D, 0xD0, 0xB4, 0x9B, 0xE9,
520 0xF3, 0x69, 0xA8, 0xC3, 0x9C, 0xCD, 0x0D, 0xB7,
521 0x98, 0x35, 0x10, 0xE1, 0xAE, 0x8F, 0x05, 0xD7,
522 0x75, 0x45, 0xE0, 0x23, 0x5C, 0xDB, 0xD6, 0x12,
523 0xF3, 0x15, 0x07, 0x54, 0xCE, 0xE5, 0xCE, 0x6A,
524 0x12, 0x25, 0xD9, 0x95, 0x25, 0x02, 0x6F, 0x74
528 .tk
= { 0xc9, 0x7c, 0x1f, 0x67, 0xce, 0x37, 0x11, 0x85,
529 0x51, 0x4a, 0x8a, 0x19, 0xf2, 0xbd, 0xd5, 0x2f },
530 .pn
= { 0x00, 0x89, 0x5F, 0x5F, 0x2B, 0x08 },
532 0x88, 0x48, 0x0b, 0x00, 0x0f, 0xd2, 0xe1, 0x28,
533 0xa5, 0x7c, 0x50, 0x30, 0xf1, 0x84, 0x44, 0x08,
534 0x50, 0x30, 0xf1, 0x84, 0x44, 0x08, 0x80, 0x33,
537 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
538 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f,
539 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17,
540 0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f,
541 0x20, 0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27
546 0xde, 0xf6, 0x19, 0xc2, 0xa3, 0x74, 0xb6, 0xdf,
547 0x66, 0xff, 0xa5, 0x3b, 0x6c, 0x69, 0xd7, 0x9e },
549 0x60, 0xe9, 0x70, 0x0c, 0xc4, 0xd4, 0x0a, 0xc6,
550 0xd2, 0x88, 0xb2, 0x01, 0xc3, 0x8f, 0x5b, 0xf0,
551 0x8b, 0x80, 0x74, 0x42, 0x64, 0x0a, 0x15, 0x96,
552 0xe5, 0xdb, 0xda, 0xd4, 0x1d, 0x1f, 0x36, 0x23,
553 0xf4, 0x5d, 0x7a, 0x12, 0xdb, 0x7a, 0xfb, 0x23
559 static int run_gcmp(int idx
, const struct gcmp_test
*vector
)
562 size_t enc_len
, plain_len
;
567 "\nIEEE Std 802.11ad-2012, M.11.1 GCMP test mpdu #%d\n",
570 wpa_hexdump(MSG_INFO
, "TK", vector
->tk
, sizeof(vector
->tk
));
571 wpa_hexdump(MSG_INFO
, "PN", vector
->pn
, sizeof(vector
->pn
));
572 wpa_hexdump(MSG_INFO
, "802.11 Header", vector
->frame
, vector
->hdr_len
);
573 wpa_hexdump(MSG_INFO
, "Plaintext Data",
574 vector
->frame
+ vector
->hdr_len
,
575 vector
->payload_len
);
577 enc
= gcmp_encrypt(vector
->tk
, sizeof(vector
->tk
),
579 vector
->hdr_len
+ vector
->payload_len
,
581 vector
->hdr_len
== 26 ?
582 vector
->frame
+ vector
->hdr_len
- 2 : NULL
,
583 vector
->pn
, 0, &enc_len
);
585 wpa_printf(MSG_ERROR
, "Failed to encrypt GCMP frame");
589 wpa_hexdump(MSG_INFO
, "Encrypted MPDU (without FCS)", enc
, enc_len
);
590 if (os_memcmp(vector
->encr
, enc
+ vector
->hdr_len
+ 8,
591 vector
->payload_len
) != 0) {
592 wpa_printf(MSG_ERROR
, "GCMP test mpdu #%d enctypted data mismatch",
596 if (os_memcmp(vector
->mic
, enc
+ enc_len
- sizeof(vector
->mic
),
597 sizeof(vector
->mic
)) != 0) {
598 wpa_printf(MSG_ERROR
, "GCMP test mpdu #%d MIC mismatch", idx
);
601 WPA_PUT_LE32(fcs
, crc32(enc
, enc_len
));
602 wpa_hexdump(MSG_INFO
, "FCS", fcs
, sizeof(fcs
));
604 wpa_debug_level
= MSG_INFO
;
605 plain
= gcmp_decrypt(vector
->tk
, sizeof(vector
->tk
),
606 (const struct ieee80211_hdr
*) enc
,
607 enc
+ vector
->hdr_len
,
608 enc_len
- vector
->hdr_len
, &plain_len
);
609 wpa_debug_level
= MSG_EXCESSIVE
;
613 wpa_printf(MSG_ERROR
, "Failed to decrypt GCMP frame");
617 if (plain_len
!= vector
->payload_len
||
618 os_memcmp(plain
, vector
->frame
+ vector
->hdr_len
, plain_len
) != 0) {
619 wpa_hexdump(MSG_ERROR
, "Decryption result did not match",
630 static int test_vector_gcmp(void)
635 for (i
= 0; i
< ARRAY_SIZE(gcmp_vectors
); i
++) {
636 if (run_gcmp(i
+ 1, &gcmp_vectors
[i
]))
645 static int test_vector_gcmp_256(void)
647 u8 tk
[] = { 0xc9, 0x7c, 0x1f, 0x67, 0xce, 0x37, 0x11, 0x85,
648 0x51, 0x4a, 0x8a, 0x19, 0xf2, 0xbd, 0xd5, 0x2f,
649 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
650 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f };
652 0x00, 0x89, 0x5F, 0x5F, 0x2B, 0x08
655 0x88, 0x48, 0x0b, 0x00, 0x0f, 0xd2, 0xe1, 0x28,
656 0xa5, 0x7c, 0x50, 0x30, 0xf1, 0x84, 0x44, 0x08,
657 0x50, 0x30, 0xf1, 0x84, 0x44, 0x08, 0x80, 0x33,
658 0x03, 0x00, 0x00, 0x01, 0x02, 0x03, 0x04, 0x05,
659 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d,
660 0x0e, 0x0f, 0x10, 0x11, 0x12, 0x13, 0x14, 0x15,
661 0x16, 0x17, 0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d,
662 0x1e, 0x1f, 0x20, 0x21, 0x22, 0x23, 0x24, 0x25,
666 0x88, 0x48, 0x0b, 0x00, 0x0f, 0xd2, 0xe1, 0x28,
667 0xa5, 0x7c, 0x50, 0x30, 0xf1, 0x84, 0x44, 0x08,
668 0x50, 0x30, 0xf1, 0x84, 0x44, 0x08, 0x80, 0x33,
669 0x03, 0x00, 0x08, 0x2b, 0x00, 0x20, 0x5f, 0x5f,
670 0x89, 0x00, 0x65, 0x83, 0x43, 0xc8, 0xb1, 0x44,
671 0x47, 0xd9, 0x21, 0x1d, 0xef, 0xd4, 0x6a, 0xd8,
672 0x9c, 0x71, 0x0c, 0x6f, 0xc3, 0x33, 0x33, 0x23,
673 0x6e, 0x39, 0x97, 0xb9, 0x17, 0x6a, 0x5a, 0x8b,
674 0xe7, 0x79, 0xb2, 0x12, 0x66, 0x55, 0x5e, 0x70,
675 0xad, 0x79, 0x11, 0x43, 0x16, 0x85, 0x90, 0x95,
676 0x47, 0x3d, 0x5b, 0x1b, 0xd5, 0x96, 0xb3, 0xde,
680 size_t enc_len
, plain_len
;
684 wpa_printf(MSG_INFO
, "\nIEEE P802.11ac/D7.0, M.11.1 GCMP-256 test vector\n");
686 wpa_hexdump(MSG_INFO
, "TK", tk
, sizeof(tk
));
687 wpa_hexdump(MSG_INFO
, "PN", pn
, sizeof(pn
));
688 wpa_hexdump(MSG_INFO
, "802.11 Header", frame
, 26);
689 wpa_hexdump(MSG_INFO
, "Plaintext Data", frame
+ 26, sizeof(frame
) - 26);
691 enc
= gcmp_encrypt(tk
, sizeof(tk
), frame
, sizeof(frame
), 26, frame
+ 24,
694 wpa_printf(MSG_ERROR
, "Failed to encrypt GCMP frame");
698 wpa_hexdump(MSG_INFO
, "Encrypted MPDU (without FCS)", enc
, enc_len
);
699 if (enc_len
!= sizeof(encr
) || os_memcmp(enc
, encr
, enc_len
) != 0) {
700 wpa_printf(MSG_ERROR
, "GCMP-256 test vector mismatch");
703 WPA_PUT_LE32(fcs
, crc32(enc
, enc_len
));
704 wpa_hexdump(MSG_INFO
, "FCS", fcs
, sizeof(fcs
));
706 wpa_debug_level
= MSG_INFO
;
707 plain
= gcmp_decrypt(tk
, sizeof(tk
), (const struct ieee80211_hdr
*) enc
,
708 enc
+ 26, enc_len
- 26, &plain_len
);
709 wpa_debug_level
= MSG_EXCESSIVE
;
713 wpa_printf(MSG_ERROR
, "Failed to decrypt GCMP frame");
717 if (plain_len
!= sizeof(frame
) - 26 ||
718 os_memcmp(plain
, frame
+ 26, plain_len
) != 0) {
719 wpa_hexdump(MSG_ERROR
, "Decryption result did not match",
730 static int test_vector_ccmp_256(void)
732 u8 tk
[] = { 0xc9, 0x7c, 0x1f, 0x67, 0xce, 0x37, 0x11, 0x85,
733 0x51, 0x4a, 0x8a, 0x19, 0xf2, 0xbd, 0xd5, 0x2f,
734 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
735 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f };
736 u8 pn
[] = { 0xB5, 0x03, 0x97, 0x76, 0xE7, 0x0C };
738 0x08, 0x48, 0xc3, 0x2c, 0x0f, 0xd2, 0xe1, 0x28,
739 0xa5, 0x7c, 0x50, 0x30, 0xf1, 0x84, 0x44, 0x08,
740 0xab, 0xae, 0xa5, 0xb8, 0xfc, 0xba, 0x80, 0x33,
741 0xf8, 0xba, 0x1a, 0x55, 0xd0, 0x2f, 0x85, 0xae,
742 0x96, 0x7b, 0xb6, 0x2f, 0xb6, 0xcd, 0xa8, 0xeb,
743 0x7e, 0x78, 0xa0, 0x50
746 0x08, 0x48, 0xc3, 0x2c, 0x0f, 0xd2, 0xe1, 0x28,
747 0xa5, 0x7c, 0x50, 0x30, 0xf1, 0x84, 0x44, 0x08,
748 0xab, 0xae, 0xa5, 0xb8, 0xfc, 0xba, 0x80, 0x33,
749 0x0c, 0xe7, 0x00, 0x20, 0x76, 0x97, 0x03, 0xb5,
750 0x6d, 0x15, 0x5d, 0x88, 0x32, 0x66, 0x82, 0x56,
751 0xd6, 0xa9, 0x2b, 0x78, 0xe1, 0x1d, 0x8e, 0x54,
752 0x49, 0x5d, 0xd1, 0x74, 0x80, 0xaa, 0x56, 0xc9,
753 0x49, 0x2e, 0x88, 0x2b, 0x97, 0x64, 0x2f, 0x80,
754 0xd5, 0x0f, 0xe9, 0x7b
758 size_t enc_len
, plain_len
;
762 wpa_printf(MSG_INFO
, "\nIEEE P802.11ac/D7.0, M.6.4 CCMP-256 test vector\n");
764 wpa_hexdump(MSG_INFO
, "TK", tk
, sizeof(tk
));
765 wpa_hexdump(MSG_INFO
, "PN", pn
, sizeof(pn
));
766 wpa_hexdump(MSG_INFO
, "802.11 Header", frame
, 24);
767 wpa_hexdump(MSG_INFO
, "Plaintext Data", frame
+ 24, sizeof(frame
) - 24);
769 enc
= ccmp_256_encrypt(tk
, frame
, sizeof(frame
), 24, NULL
, pn
, 0,
772 wpa_printf(MSG_ERROR
, "Failed to encrypt CCMP frame");
776 wpa_hexdump(MSG_INFO
, "Encrypted MPDU (without FCS)", enc
, enc_len
);
777 if (enc_len
!= sizeof(encr
) || os_memcmp(enc
, encr
, enc_len
) != 0) {
778 wpa_printf(MSG_ERROR
, "CCMP-256 test vector mismatch");
781 WPA_PUT_LE32(fcs
, crc32(enc
, enc_len
));
782 wpa_hexdump(MSG_INFO
, "FCS", fcs
, sizeof(fcs
));
784 wpa_debug_level
= MSG_INFO
;
785 plain
= ccmp_256_decrypt(tk
, (const struct ieee80211_hdr
*) enc
,
786 enc
+ 24, enc_len
- 24, &plain_len
);
787 wpa_debug_level
= MSG_EXCESSIVE
;
791 wpa_printf(MSG_ERROR
, "Failed to decrypt CCMP-256 frame");
795 if (plain_len
!= sizeof(frame
) - 24 ||
796 os_memcmp(plain
, frame
+ 24, plain_len
) != 0) {
797 wpa_hexdump(MSG_ERROR
, "Decryption result did not match",
808 static int test_vector_bip_gmac_128(void)
811 0x4e, 0xa9, 0x54, 0x3e, 0x09, 0xcf, 0x2b, 0x1e,
812 0xca, 0x66, 0xff, 0xc5, 0x8b, 0xde, 0xcb, 0xcf
814 u8 ipn
[] = { 0x04, 0x00, 0x00, 0x00, 0x00, 0x00 };
816 0xc0, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff,
817 0xff, 0xff, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00,
818 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00,
822 0xc0, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff,
823 0xff, 0xff, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00,
824 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00,
825 0x02, 0x00, 0x4c, 0x18, 0x04, 0x00, 0x04, 0x00,
826 0x00, 0x00, 0x00, 0x00, 0x3e, 0xd8, 0x62, 0xfb,
827 0x0f, 0x33, 0x38, 0xdd, 0x33, 0x86, 0xc8, 0x97,
828 0xe2, 0xed, 0x05, 0x3d
834 wpa_printf(MSG_INFO
, "\nIEEE P802.11ac/D7.0, M.9.1 BIP-GMAC-128 with broadcast "
835 "Deauthentication frame\n");
837 wpa_hexdump(MSG_INFO
, "IGTK", igtk
, sizeof(igtk
));
838 wpa_hexdump(MSG_INFO
, "IPN", ipn
, sizeof(ipn
));
839 wpa_hexdump(MSG_INFO
, "Plaintext frame", frame
, sizeof(frame
));
841 prot
= bip_gmac_protect(igtk
, sizeof(igtk
), frame
, sizeof(frame
),
844 wpa_printf(MSG_ERROR
, "Failed to protect BIP-GMAC-128 frame");
848 wpa_hexdump(MSG_INFO
, "Protected MPDU (without FCS)", prot
, prot_len
);
849 if (prot_len
!= sizeof(res
) || os_memcmp(res
, prot
, prot_len
) != 0) {
850 wpa_printf(MSG_ERROR
, "BIP-GMAC-128 test vector mismatch");
859 static int test_vector_bip_gmac_256(void)
862 0x4e, 0xa9, 0x54, 0x3e, 0x09, 0xcf, 0x2b, 0x1e,
863 0xca, 0x66, 0xff, 0xc5, 0x8b, 0xde, 0xcb, 0xcf,
864 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
865 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f
867 u8 ipn
[] = { 0x04, 0x00, 0x00, 0x00, 0x00, 0x00 };
869 0xc0, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff,
870 0xff, 0xff, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00,
871 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00,
875 0xc0, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff,
876 0xff, 0xff, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00,
877 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00,
878 0x02, 0x00, 0x4c, 0x18, 0x04, 0x00, 0x04, 0x00,
879 0x00, 0x00, 0x00, 0x00, 0x23, 0xbe, 0x59, 0xdc,
880 0xc7, 0x02, 0x2e, 0xe3, 0x83, 0x62, 0x7e, 0xbb,
881 0x10, 0x17, 0xdd, 0xfc
887 wpa_printf(MSG_INFO
, "\nIEEE P802.11ac/D7.0, M.9.1 BIP-GMAC-256 with broadcast Deauthentication frame\n");
889 wpa_hexdump(MSG_INFO
, "IGTK", igtk
, sizeof(igtk
));
890 wpa_hexdump(MSG_INFO
, "IPN", ipn
, sizeof(ipn
));
891 wpa_hexdump(MSG_INFO
, "Plaintext frame", frame
, sizeof(frame
));
893 prot
= bip_gmac_protect(igtk
, sizeof(igtk
), frame
, sizeof(frame
),
896 wpa_printf(MSG_ERROR
, "Failed to protect BIP-GMAC-256 frame");
900 wpa_hexdump(MSG_INFO
, "Protected MPDU (without FCS)", prot
, prot_len
);
901 if (prot_len
!= sizeof(res
) || os_memcmp(res
, prot
, prot_len
) != 0) {
902 wpa_printf(MSG_ERROR
, "BIP-GMAC-128 test vector mismatch");
911 int main(int argc
, char *argv
[])
915 wpa_debug_level
= MSG_EXCESSIVE
;
916 wpa_debug_show_keys
= 1;
918 if (os_program_init())
923 test_vector_ccmp_pv1();
925 test_vector_ccmp_mgmt();
926 errors
+= test_vector_gcmp();
927 errors
+= test_vector_gcmp_256();
928 errors
+= test_vector_ccmp_256();
929 errors
+= test_vector_bip_gmac_128();
930 errors
+= test_vector_bip_gmac_256();
933 wpa_printf(MSG_INFO
, "One or more test vectors failed");
936 return errors
? -1 : 0;