2 * hostapd - WPA/RSN IE and KDE definitions
3 * Copyright (c) 2004-2018, 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 "common/ieee802_11_defs.h"
13 #include "eapol_auth/eapol_auth_sm.h"
14 #include "ap_config.h"
15 #include "ieee802_11.h"
17 #include "pmksa_cache_auth.h"
18 #include "wpa_auth_ie.h"
19 #include "wpa_auth_i.h"
22 #ifdef CONFIG_RSN_TESTING
24 #endif /* CONFIG_RSN_TESTING */
27 static int wpa_write_wpa_ie(struct wpa_auth_config
*conf
, u8
*buf
, size_t len
)
29 struct wpa_ie_hdr
*hdr
;
34 hdr
= (struct wpa_ie_hdr
*) buf
;
35 hdr
->elem_id
= WLAN_EID_VENDOR_SPECIFIC
;
36 RSN_SELECTOR_PUT(hdr
->oui
, WPA_OUI_TYPE
);
37 WPA_PUT_LE16(hdr
->version
, WPA_VERSION
);
38 pos
= (u8
*) (hdr
+ 1);
40 suite
= wpa_cipher_to_suite(WPA_PROTO_WPA
, conf
->wpa_group
);
42 wpa_printf(MSG_DEBUG
, "Invalid group cipher (%d).",
46 RSN_SELECTOR_PUT(pos
, suite
);
47 pos
+= WPA_SELECTOR_LEN
;
52 num_suites
= wpa_cipher_put_suites(pos
, conf
->wpa_pairwise
);
53 if (num_suites
== 0) {
54 wpa_printf(MSG_DEBUG
, "Invalid pairwise cipher (%d).",
58 pos
+= num_suites
* WPA_SELECTOR_LEN
;
59 WPA_PUT_LE16(count
, num_suites
);
65 if (conf
->wpa_key_mgmt
& WPA_KEY_MGMT_IEEE8021X
) {
66 RSN_SELECTOR_PUT(pos
, WPA_AUTH_KEY_MGMT_UNSPEC_802_1X
);
67 pos
+= WPA_SELECTOR_LEN
;
70 if (conf
->wpa_key_mgmt
& WPA_KEY_MGMT_PSK
) {
71 RSN_SELECTOR_PUT(pos
, WPA_AUTH_KEY_MGMT_PSK_OVER_802_1X
);
72 pos
+= WPA_SELECTOR_LEN
;
76 if (num_suites
== 0) {
77 wpa_printf(MSG_DEBUG
, "Invalid key management type (%d).",
81 WPA_PUT_LE16(count
, num_suites
);
83 /* WPA Capabilities; use defaults, so no need to include it */
85 hdr
->len
= (pos
- buf
) - 2;
91 int wpa_write_rsn_ie(struct wpa_auth_config
*conf
, u8
*buf
, size_t len
,
94 struct rsn_ie_hdr
*hdr
;
100 hdr
= (struct rsn_ie_hdr
*) buf
;
101 hdr
->elem_id
= WLAN_EID_RSN
;
102 WPA_PUT_LE16(hdr
->version
, RSN_VERSION
);
103 pos
= (u8
*) (hdr
+ 1);
105 suite
= wpa_cipher_to_suite(WPA_PROTO_RSN
, conf
->wpa_group
);
107 wpa_printf(MSG_DEBUG
, "Invalid group cipher (%d).",
111 RSN_SELECTOR_PUT(pos
, suite
);
112 pos
+= RSN_SELECTOR_LEN
;
118 #ifdef CONFIG_RSN_TESTING
120 RSN_SELECTOR_PUT(pos
, RSN_SELECTOR(0x12, 0x34, 0x56, 1));
121 pos
+= RSN_SELECTOR_LEN
;
124 #endif /* CONFIG_RSN_TESTING */
126 res
= rsn_cipher_put_suites(pos
, conf
->rsn_pairwise
);
128 pos
+= res
* RSN_SELECTOR_LEN
;
130 #ifdef CONFIG_RSN_TESTING
132 RSN_SELECTOR_PUT(pos
, RSN_SELECTOR(0x12, 0x34, 0x56, 2));
133 pos
+= RSN_SELECTOR_LEN
;
136 #endif /* CONFIG_RSN_TESTING */
138 if (num_suites
== 0) {
139 wpa_printf(MSG_DEBUG
, "Invalid pairwise cipher (%d).",
143 WPA_PUT_LE16(count
, num_suites
);
149 #ifdef CONFIG_RSN_TESTING
151 RSN_SELECTOR_PUT(pos
, RSN_SELECTOR(0x12, 0x34, 0x56, 1));
152 pos
+= RSN_SELECTOR_LEN
;
155 #endif /* CONFIG_RSN_TESTING */
157 if (conf
->wpa_key_mgmt
& WPA_KEY_MGMT_IEEE8021X
) {
158 RSN_SELECTOR_PUT(pos
, RSN_AUTH_KEY_MGMT_UNSPEC_802_1X
);
159 pos
+= RSN_SELECTOR_LEN
;
162 if (conf
->wpa_key_mgmt
& WPA_KEY_MGMT_PSK
) {
163 RSN_SELECTOR_PUT(pos
, RSN_AUTH_KEY_MGMT_PSK_OVER_802_1X
);
164 pos
+= RSN_SELECTOR_LEN
;
167 #ifdef CONFIG_IEEE80211R_AP
168 if (conf
->wpa_key_mgmt
& WPA_KEY_MGMT_FT_IEEE8021X
) {
169 RSN_SELECTOR_PUT(pos
, RSN_AUTH_KEY_MGMT_FT_802_1X
);
170 pos
+= RSN_SELECTOR_LEN
;
174 if (conf
->wpa_key_mgmt
& WPA_KEY_MGMT_FT_IEEE8021X_SHA384
) {
175 RSN_SELECTOR_PUT(pos
, RSN_AUTH_KEY_MGMT_FT_802_1X_SHA384
);
176 pos
+= RSN_SELECTOR_LEN
;
179 #endif /* CONFIG_SHA384 */
180 if (conf
->wpa_key_mgmt
& WPA_KEY_MGMT_FT_PSK
) {
181 RSN_SELECTOR_PUT(pos
, RSN_AUTH_KEY_MGMT_FT_PSK
);
182 pos
+= RSN_SELECTOR_LEN
;
185 #endif /* CONFIG_IEEE80211R_AP */
186 if (conf
->wpa_key_mgmt
& WPA_KEY_MGMT_IEEE8021X_SHA256
) {
187 RSN_SELECTOR_PUT(pos
, RSN_AUTH_KEY_MGMT_802_1X_SHA256
);
188 pos
+= RSN_SELECTOR_LEN
;
191 if (conf
->wpa_key_mgmt
& WPA_KEY_MGMT_PSK_SHA256
) {
192 RSN_SELECTOR_PUT(pos
, RSN_AUTH_KEY_MGMT_PSK_SHA256
);
193 pos
+= RSN_SELECTOR_LEN
;
197 if (conf
->wpa_key_mgmt
& WPA_KEY_MGMT_SAE
) {
198 RSN_SELECTOR_PUT(pos
, RSN_AUTH_KEY_MGMT_SAE
);
199 pos
+= RSN_SELECTOR_LEN
;
202 if (conf
->wpa_key_mgmt
& WPA_KEY_MGMT_FT_SAE
) {
203 RSN_SELECTOR_PUT(pos
, RSN_AUTH_KEY_MGMT_FT_SAE
);
204 pos
+= RSN_SELECTOR_LEN
;
207 #endif /* CONFIG_SAE */
208 if (conf
->wpa_key_mgmt
& WPA_KEY_MGMT_IEEE8021X_SUITE_B
) {
209 RSN_SELECTOR_PUT(pos
, RSN_AUTH_KEY_MGMT_802_1X_SUITE_B
);
210 pos
+= RSN_SELECTOR_LEN
;
213 if (conf
->wpa_key_mgmt
& WPA_KEY_MGMT_IEEE8021X_SUITE_B_192
) {
214 RSN_SELECTOR_PUT(pos
, RSN_AUTH_KEY_MGMT_802_1X_SUITE_B_192
);
215 pos
+= RSN_SELECTOR_LEN
;
219 if (conf
->wpa_key_mgmt
& WPA_KEY_MGMT_FILS_SHA256
) {
220 RSN_SELECTOR_PUT(pos
, RSN_AUTH_KEY_MGMT_FILS_SHA256
);
221 pos
+= RSN_SELECTOR_LEN
;
224 if (conf
->wpa_key_mgmt
& WPA_KEY_MGMT_FILS_SHA384
) {
225 RSN_SELECTOR_PUT(pos
, RSN_AUTH_KEY_MGMT_FILS_SHA384
);
226 pos
+= RSN_SELECTOR_LEN
;
229 #ifdef CONFIG_IEEE80211R_AP
230 if (conf
->wpa_key_mgmt
& WPA_KEY_MGMT_FT_FILS_SHA256
) {
231 RSN_SELECTOR_PUT(pos
, RSN_AUTH_KEY_MGMT_FT_FILS_SHA256
);
232 pos
+= RSN_SELECTOR_LEN
;
235 if (conf
->wpa_key_mgmt
& WPA_KEY_MGMT_FT_FILS_SHA384
) {
236 RSN_SELECTOR_PUT(pos
, RSN_AUTH_KEY_MGMT_FT_FILS_SHA384
);
237 pos
+= RSN_SELECTOR_LEN
;
240 #endif /* CONFIG_IEEE80211R_AP */
241 #endif /* CONFIG_FILS */
243 if (conf
->wpa_key_mgmt
& WPA_KEY_MGMT_OWE
) {
244 RSN_SELECTOR_PUT(pos
, RSN_AUTH_KEY_MGMT_OWE
);
245 pos
+= RSN_SELECTOR_LEN
;
248 #endif /* CONFIG_OWE */
250 if (conf
->wpa_key_mgmt
& WPA_KEY_MGMT_DPP
) {
251 RSN_SELECTOR_PUT(pos
, RSN_AUTH_KEY_MGMT_DPP
);
252 pos
+= RSN_SELECTOR_LEN
;
255 #endif /* CONFIG_DPP */
257 if (conf
->wpa_key_mgmt
& WPA_KEY_MGMT_OSEN
) {
258 RSN_SELECTOR_PUT(pos
, RSN_AUTH_KEY_MGMT_OSEN
);
259 pos
+= RSN_SELECTOR_LEN
;
262 #endif /* CONFIG_HS20 */
264 #ifdef CONFIG_RSN_TESTING
266 RSN_SELECTOR_PUT(pos
, RSN_SELECTOR(0x12, 0x34, 0x56, 2));
267 pos
+= RSN_SELECTOR_LEN
;
270 #endif /* CONFIG_RSN_TESTING */
272 if (num_suites
== 0) {
273 wpa_printf(MSG_DEBUG
, "Invalid key management type (%d).",
277 WPA_PUT_LE16(count
, num_suites
);
279 /* RSN Capabilities */
281 if (conf
->rsn_preauth
)
282 capab
|= WPA_CAPABILITY_PREAUTH
;
283 if (conf
->wmm_enabled
) {
284 /* 4 PTKSA replay counters when using WMM */
285 capab
|= (RSN_NUM_REPLAY_COUNTERS_16
<< 2);
287 if (conf
->ieee80211w
!= NO_MGMT_FRAME_PROTECTION
) {
288 capab
|= WPA_CAPABILITY_MFPC
;
289 if (conf
->ieee80211w
== MGMT_FRAME_PROTECTION_REQUIRED
)
290 capab
|= WPA_CAPABILITY_MFPR
;
294 capab
|= WPA_CAPABILITY_OCVC
;
295 #endif /* CONFIG_OCV */
296 #ifdef CONFIG_RSN_TESTING
298 capab
|= BIT(8) | BIT(15);
299 #endif /* CONFIG_RSN_TESTING */
300 WPA_PUT_LE16(pos
, capab
);
304 if (2 + PMKID_LEN
> buf
+ len
- pos
)
307 WPA_PUT_LE16(pos
, 1);
309 os_memcpy(pos
, pmkid
, PMKID_LEN
);
313 if (conf
->ieee80211w
!= NO_MGMT_FRAME_PROTECTION
&&
314 conf
->group_mgmt_cipher
!= WPA_CIPHER_AES_128_CMAC
) {
315 if (2 + 4 > buf
+ len
- pos
)
319 WPA_PUT_LE16(pos
, 0);
323 /* Management Group Cipher Suite */
324 switch (conf
->group_mgmt_cipher
) {
325 case WPA_CIPHER_AES_128_CMAC
:
326 RSN_SELECTOR_PUT(pos
, RSN_CIPHER_SUITE_AES_128_CMAC
);
328 case WPA_CIPHER_BIP_GMAC_128
:
329 RSN_SELECTOR_PUT(pos
, RSN_CIPHER_SUITE_BIP_GMAC_128
);
331 case WPA_CIPHER_BIP_GMAC_256
:
332 RSN_SELECTOR_PUT(pos
, RSN_CIPHER_SUITE_BIP_GMAC_256
);
334 case WPA_CIPHER_BIP_CMAC_256
:
335 RSN_SELECTOR_PUT(pos
, RSN_CIPHER_SUITE_BIP_CMAC_256
);
338 wpa_printf(MSG_DEBUG
,
339 "Invalid group management cipher (0x%x)",
340 conf
->group_mgmt_cipher
);
343 pos
+= RSN_SELECTOR_LEN
;
346 #ifdef CONFIG_RSN_TESTING
349 * Fill in any defined fields and add extra data to the end of
352 int pmkid_count_set
= pmkid
!= NULL
;
353 if (conf
->ieee80211w
!= NO_MGMT_FRAME_PROTECTION
)
356 WPA_PUT_LE16(pos
, 0);
358 if (conf
->ieee80211w
== NO_MGMT_FRAME_PROTECTION
) {
359 /* Management Group Cipher Suite */
360 RSN_SELECTOR_PUT(pos
, RSN_CIPHER_SUITE_AES_128_CMAC
);
361 pos
+= RSN_SELECTOR_LEN
;
364 os_memset(pos
, 0x12, 17);
367 #endif /* CONFIG_RSN_TESTING */
369 hdr
->len
= (pos
- buf
) - 2;
375 int wpa_write_rsnxe(struct wpa_auth_config
*conf
, u8
*buf
, size_t len
)
379 if (conf
->sae_pwe
!= 1 && conf
->sae_pwe
!= 2)
380 return 0; /* no supported extended RSN capabilities */
385 *pos
++ = WLAN_EID_RSNX
;
387 /* bits 0-3 = 0 since only one octet of Extended RSN Capabilities is
389 *pos
++ = BIT(WLAN_RSNX_CAPAB_SAE_H2E
);
395 static u8
* wpa_write_osen(struct wpa_auth_config
*conf
, u8
*eid
)
400 *eid
++ = WLAN_EID_VENDOR_SPECIFIC
;
401 len
= eid
++; /* to be filled */
402 WPA_PUT_BE24(eid
, OUI_WFA
);
404 *eid
++ = HS20_OSEN_OUI_TYPE
;
406 /* Group Data Cipher Suite */
407 RSN_SELECTOR_PUT(eid
, RSN_CIPHER_SUITE_NO_GROUP_ADDRESSED
);
408 eid
+= RSN_SELECTOR_LEN
;
410 /* Pairwise Cipher Suite Count and List */
411 WPA_PUT_LE16(eid
, 1);
413 RSN_SELECTOR_PUT(eid
, RSN_CIPHER_SUITE_CCMP
);
414 eid
+= RSN_SELECTOR_LEN
;
416 /* AKM Suite Count and List */
417 WPA_PUT_LE16(eid
, 1);
419 RSN_SELECTOR_PUT(eid
, RSN_AUTH_KEY_MGMT_OSEN
);
420 eid
+= RSN_SELECTOR_LEN
;
422 /* RSN Capabilities */
424 if (conf
->wmm_enabled
) {
425 /* 4 PTKSA replay counters when using WMM */
426 capab
|= (RSN_NUM_REPLAY_COUNTERS_16
<< 2);
428 if (conf
->ieee80211w
!= NO_MGMT_FRAME_PROTECTION
) {
429 capab
|= WPA_CAPABILITY_MFPC
;
430 if (conf
->ieee80211w
== MGMT_FRAME_PROTECTION_REQUIRED
)
431 capab
|= WPA_CAPABILITY_MFPR
;
435 capab
|= WPA_CAPABILITY_OCVC
;
436 #endif /* CONFIG_OCV */
437 WPA_PUT_LE16(eid
, capab
);
440 *len
= eid
- len
- 1;
446 int wpa_auth_gen_wpa_ie(struct wpa_authenticator
*wpa_auth
)
451 #ifdef CONFIG_TESTING_OPTIONS
452 if (wpa_auth
->conf
.own_ie_override_len
) {
453 wpa_hexdump(MSG_DEBUG
, "WPA: Forced own IE(s) for testing",
454 wpa_auth
->conf
.own_ie_override
,
455 wpa_auth
->conf
.own_ie_override_len
);
456 os_free(wpa_auth
->wpa_ie
);
458 os_malloc(wpa_auth
->conf
.own_ie_override_len
);
459 if (wpa_auth
->wpa_ie
== NULL
)
461 os_memcpy(wpa_auth
->wpa_ie
, wpa_auth
->conf
.own_ie_override
,
462 wpa_auth
->conf
.own_ie_override_len
);
463 wpa_auth
->wpa_ie_len
= wpa_auth
->conf
.own_ie_override_len
;
466 #endif /* CONFIG_TESTING_OPTIONS */
470 if (wpa_auth
->conf
.wpa
== WPA_PROTO_OSEN
) {
471 pos
= wpa_write_osen(&wpa_auth
->conf
, pos
);
473 if (wpa_auth
->conf
.wpa
& WPA_PROTO_RSN
) {
474 res
= wpa_write_rsn_ie(&wpa_auth
->conf
,
475 pos
, buf
+ sizeof(buf
) - pos
, NULL
);
479 res
= wpa_write_rsnxe(&wpa_auth
->conf
, pos
,
480 buf
+ sizeof(buf
) - pos
);
485 #ifdef CONFIG_IEEE80211R_AP
486 if (wpa_key_mgmt_ft(wpa_auth
->conf
.wpa_key_mgmt
)) {
487 res
= wpa_write_mdie(&wpa_auth
->conf
, pos
,
488 buf
+ sizeof(buf
) - pos
);
493 #endif /* CONFIG_IEEE80211R_AP */
494 if (wpa_auth
->conf
.wpa
& WPA_PROTO_WPA
) {
495 res
= wpa_write_wpa_ie(&wpa_auth
->conf
,
496 pos
, buf
+ sizeof(buf
) - pos
);
502 os_free(wpa_auth
->wpa_ie
);
503 wpa_auth
->wpa_ie
= os_malloc(pos
- buf
);
504 if (wpa_auth
->wpa_ie
== NULL
)
506 os_memcpy(wpa_auth
->wpa_ie
, buf
, pos
- buf
);
507 wpa_auth
->wpa_ie_len
= pos
- buf
;
513 u8
* wpa_add_kde(u8
*pos
, u32 kde
, const u8
*data
, size_t data_len
,
514 const u8
*data2
, size_t data2_len
)
516 *pos
++ = WLAN_EID_VENDOR_SPECIFIC
;
517 *pos
++ = RSN_SELECTOR_LEN
+ data_len
+ data2_len
;
518 RSN_SELECTOR_PUT(pos
, kde
);
519 pos
+= RSN_SELECTOR_LEN
;
520 os_memcpy(pos
, data
, data_len
);
523 os_memcpy(pos
, data2
, data2_len
);
530 struct wpa_auth_okc_iter_data
{
531 struct rsn_pmksa_cache_entry
*pmksa
;
538 static int wpa_auth_okc_iter(struct wpa_authenticator
*a
, void *ctx
)
540 struct wpa_auth_okc_iter_data
*data
= ctx
;
541 data
->pmksa
= pmksa_cache_get_okc(a
->pmksa
, data
->aa
, data
->spa
,
549 int wpa_validate_wpa_ie(struct wpa_authenticator
*wpa_auth
,
550 struct wpa_state_machine
*sm
, int freq
,
551 const u8
*wpa_ie
, size_t wpa_ie_len
,
552 const u8
*rsnxe
, size_t rsnxe_len
,
553 const u8
*mdie
, size_t mdie_len
,
554 const u8
*owe_dh
, size_t owe_dh_len
)
556 struct wpa_ie_data data
;
557 int ciphers
, key_mgmt
, res
, version
;
560 const u8
*pmkid
= NULL
;
562 if (wpa_auth
== NULL
|| sm
== NULL
)
563 return WPA_NOT_ENABLED
;
565 if (wpa_ie
== NULL
|| wpa_ie_len
< 1)
566 return WPA_INVALID_IE
;
568 if (wpa_ie
[0] == WLAN_EID_RSN
)
569 version
= WPA_PROTO_RSN
;
571 version
= WPA_PROTO_WPA
;
573 if (!(wpa_auth
->conf
.wpa
& version
)) {
574 wpa_printf(MSG_DEBUG
, "Invalid WPA proto (%d) from " MACSTR
,
575 version
, MAC2STR(sm
->addr
));
576 return WPA_INVALID_PROTO
;
579 if (version
== WPA_PROTO_RSN
) {
580 res
= wpa_parse_wpa_ie_rsn(wpa_ie
, wpa_ie_len
, &data
);
581 if (!data
.has_pairwise
)
582 data
.pairwise_cipher
= wpa_default_rsn_cipher(freq
);
584 data
.group_cipher
= wpa_default_rsn_cipher(freq
);
586 if (wpa_key_mgmt_ft(data
.key_mgmt
) && !mdie
&&
587 !wpa_key_mgmt_only_ft(data
.key_mgmt
)) {
588 /* Workaround for some HP and Epson printers that seem
589 * to incorrectly copy the FT-PSK + WPA-PSK AKMs from AP
590 * advertised RSNE to Association Request frame. */
591 wpa_printf(MSG_DEBUG
,
592 "RSN: FT set in RSNE AKM but MDE is missing from "
594 " - ignore FT AKM(s) because there's also a non-FT AKM",
596 data
.key_mgmt
&= ~WPA_KEY_MGMT_FT
;
599 selector
= RSN_AUTH_KEY_MGMT_UNSPEC_802_1X
;
602 else if (data
.key_mgmt
& WPA_KEY_MGMT_IEEE8021X_SUITE_B_192
)
603 selector
= RSN_AUTH_KEY_MGMT_802_1X_SUITE_B_192
;
604 else if (data
.key_mgmt
& WPA_KEY_MGMT_IEEE8021X_SUITE_B
)
605 selector
= RSN_AUTH_KEY_MGMT_802_1X_SUITE_B
;
607 #ifdef CONFIG_IEEE80211R_AP
608 else if (data
.key_mgmt
& WPA_KEY_MGMT_FT_FILS_SHA384
)
609 selector
= RSN_AUTH_KEY_MGMT_FT_FILS_SHA384
;
610 else if (data
.key_mgmt
& WPA_KEY_MGMT_FT_FILS_SHA256
)
611 selector
= RSN_AUTH_KEY_MGMT_FT_FILS_SHA256
;
612 #endif /* CONFIG_IEEE80211R_AP */
613 else if (data
.key_mgmt
& WPA_KEY_MGMT_FILS_SHA384
)
614 selector
= RSN_AUTH_KEY_MGMT_FILS_SHA384
;
615 else if (data
.key_mgmt
& WPA_KEY_MGMT_FILS_SHA256
)
616 selector
= RSN_AUTH_KEY_MGMT_FILS_SHA256
;
617 #endif /* CONFIG_FILS */
618 #ifdef CONFIG_IEEE80211R_AP
620 else if (data
.key_mgmt
& WPA_KEY_MGMT_FT_IEEE8021X_SHA384
)
621 selector
= RSN_AUTH_KEY_MGMT_FT_802_1X_SHA384
;
622 #endif /* CONFIG_SHA384 */
623 else if (data
.key_mgmt
& WPA_KEY_MGMT_FT_IEEE8021X
)
624 selector
= RSN_AUTH_KEY_MGMT_FT_802_1X
;
625 else if (data
.key_mgmt
& WPA_KEY_MGMT_FT_PSK
)
626 selector
= RSN_AUTH_KEY_MGMT_FT_PSK
;
627 #endif /* CONFIG_IEEE80211R_AP */
628 else if (data
.key_mgmt
& WPA_KEY_MGMT_IEEE8021X_SHA256
)
629 selector
= RSN_AUTH_KEY_MGMT_802_1X_SHA256
;
630 else if (data
.key_mgmt
& WPA_KEY_MGMT_PSK_SHA256
)
631 selector
= RSN_AUTH_KEY_MGMT_PSK_SHA256
;
633 else if (data
.key_mgmt
& WPA_KEY_MGMT_SAE
)
634 selector
= RSN_AUTH_KEY_MGMT_SAE
;
635 else if (data
.key_mgmt
& WPA_KEY_MGMT_FT_SAE
)
636 selector
= RSN_AUTH_KEY_MGMT_FT_SAE
;
637 #endif /* CONFIG_SAE */
638 else if (data
.key_mgmt
& WPA_KEY_MGMT_IEEE8021X
)
639 selector
= RSN_AUTH_KEY_MGMT_UNSPEC_802_1X
;
640 else if (data
.key_mgmt
& WPA_KEY_MGMT_PSK
)
641 selector
= RSN_AUTH_KEY_MGMT_PSK_OVER_802_1X
;
643 else if (data
.key_mgmt
& WPA_KEY_MGMT_OWE
)
644 selector
= RSN_AUTH_KEY_MGMT_OWE
;
645 #endif /* CONFIG_OWE */
647 else if (data
.key_mgmt
& WPA_KEY_MGMT_DPP
)
648 selector
= RSN_AUTH_KEY_MGMT_DPP
;
649 #endif /* CONFIG_DPP */
651 else if (data
.key_mgmt
& WPA_KEY_MGMT_OSEN
)
652 selector
= RSN_AUTH_KEY_MGMT_OSEN
;
653 #endif /* CONFIG_HS20 */
654 wpa_auth
->dot11RSNAAuthenticationSuiteSelected
= selector
;
656 selector
= wpa_cipher_to_suite(WPA_PROTO_RSN
,
657 data
.pairwise_cipher
);
659 selector
= RSN_CIPHER_SUITE_CCMP
;
660 wpa_auth
->dot11RSNAPairwiseCipherSelected
= selector
;
662 selector
= wpa_cipher_to_suite(WPA_PROTO_RSN
,
665 selector
= RSN_CIPHER_SUITE_CCMP
;
666 wpa_auth
->dot11RSNAGroupCipherSelected
= selector
;
668 res
= wpa_parse_wpa_ie_wpa(wpa_ie
, wpa_ie_len
, &data
);
670 selector
= WPA_AUTH_KEY_MGMT_UNSPEC_802_1X
;
671 if (data
.key_mgmt
& WPA_KEY_MGMT_IEEE8021X
)
672 selector
= WPA_AUTH_KEY_MGMT_UNSPEC_802_1X
;
673 else if (data
.key_mgmt
& WPA_KEY_MGMT_PSK
)
674 selector
= WPA_AUTH_KEY_MGMT_PSK_OVER_802_1X
;
675 wpa_auth
->dot11RSNAAuthenticationSuiteSelected
= selector
;
677 selector
= wpa_cipher_to_suite(WPA_PROTO_WPA
,
678 data
.pairwise_cipher
);
680 selector
= RSN_CIPHER_SUITE_TKIP
;
681 wpa_auth
->dot11RSNAPairwiseCipherSelected
= selector
;
683 selector
= wpa_cipher_to_suite(WPA_PROTO_WPA
,
686 selector
= WPA_CIPHER_SUITE_TKIP
;
687 wpa_auth
->dot11RSNAGroupCipherSelected
= selector
;
690 wpa_printf(MSG_DEBUG
, "Failed to parse WPA/RSN IE from "
691 MACSTR
" (res=%d)", MAC2STR(sm
->addr
), res
);
692 wpa_hexdump(MSG_DEBUG
, "WPA/RSN IE", wpa_ie
, wpa_ie_len
);
693 return WPA_INVALID_IE
;
696 if (data
.group_cipher
!= wpa_auth
->conf
.wpa_group
) {
697 wpa_printf(MSG_DEBUG
, "Invalid WPA group cipher (0x%x) from "
698 MACSTR
, data
.group_cipher
, MAC2STR(sm
->addr
));
699 return WPA_INVALID_GROUP
;
702 key_mgmt
= data
.key_mgmt
& wpa_auth
->conf
.wpa_key_mgmt
;
704 wpa_printf(MSG_DEBUG
, "Invalid WPA key mgmt (0x%x) from "
705 MACSTR
, data
.key_mgmt
, MAC2STR(sm
->addr
));
706 return WPA_INVALID_AKMP
;
710 else if (key_mgmt
& WPA_KEY_MGMT_IEEE8021X_SUITE_B_192
)
711 sm
->wpa_key_mgmt
= WPA_KEY_MGMT_IEEE8021X_SUITE_B_192
;
712 else if (key_mgmt
& WPA_KEY_MGMT_IEEE8021X_SUITE_B
)
713 sm
->wpa_key_mgmt
= WPA_KEY_MGMT_IEEE8021X_SUITE_B
;
715 #ifdef CONFIG_IEEE80211R_AP
716 else if (key_mgmt
& WPA_KEY_MGMT_FT_FILS_SHA384
)
717 sm
->wpa_key_mgmt
= WPA_KEY_MGMT_FT_FILS_SHA384
;
718 else if (data
.key_mgmt
& WPA_KEY_MGMT_FT_FILS_SHA256
)
719 sm
->wpa_key_mgmt
= WPA_KEY_MGMT_FT_FILS_SHA256
;
720 #endif /* CONFIG_IEEE80211R_AP */
721 else if (key_mgmt
& WPA_KEY_MGMT_FILS_SHA384
)
722 sm
->wpa_key_mgmt
= WPA_KEY_MGMT_FILS_SHA384
;
723 else if (key_mgmt
& WPA_KEY_MGMT_FILS_SHA256
)
724 sm
->wpa_key_mgmt
= WPA_KEY_MGMT_FILS_SHA256
;
725 #endif /* CONFIG_FILS */
726 #ifdef CONFIG_IEEE80211R_AP
728 else if (key_mgmt
& WPA_KEY_MGMT_FT_IEEE8021X_SHA384
)
729 sm
->wpa_key_mgmt
= WPA_KEY_MGMT_FT_IEEE8021X_SHA384
;
730 #endif /* CONFIG_SHA384 */
731 else if (key_mgmt
& WPA_KEY_MGMT_FT_IEEE8021X
)
732 sm
->wpa_key_mgmt
= WPA_KEY_MGMT_FT_IEEE8021X
;
733 else if (key_mgmt
& WPA_KEY_MGMT_FT_PSK
)
734 sm
->wpa_key_mgmt
= WPA_KEY_MGMT_FT_PSK
;
735 #endif /* CONFIG_IEEE80211R_AP */
736 else if (key_mgmt
& WPA_KEY_MGMT_IEEE8021X_SHA256
)
737 sm
->wpa_key_mgmt
= WPA_KEY_MGMT_IEEE8021X_SHA256
;
738 else if (key_mgmt
& WPA_KEY_MGMT_PSK_SHA256
)
739 sm
->wpa_key_mgmt
= WPA_KEY_MGMT_PSK_SHA256
;
741 else if (key_mgmt
& WPA_KEY_MGMT_SAE
)
742 sm
->wpa_key_mgmt
= WPA_KEY_MGMT_SAE
;
743 else if (key_mgmt
& WPA_KEY_MGMT_FT_SAE
)
744 sm
->wpa_key_mgmt
= WPA_KEY_MGMT_FT_SAE
;
745 #endif /* CONFIG_SAE */
746 else if (key_mgmt
& WPA_KEY_MGMT_IEEE8021X
)
747 sm
->wpa_key_mgmt
= WPA_KEY_MGMT_IEEE8021X
;
749 else if (key_mgmt
& WPA_KEY_MGMT_OWE
)
750 sm
->wpa_key_mgmt
= WPA_KEY_MGMT_OWE
;
751 #endif /* CONFIG_OWE */
753 else if (key_mgmt
& WPA_KEY_MGMT_DPP
)
754 sm
->wpa_key_mgmt
= WPA_KEY_MGMT_DPP
;
755 #endif /* CONFIG_DPP */
757 else if (key_mgmt
& WPA_KEY_MGMT_OSEN
)
758 sm
->wpa_key_mgmt
= WPA_KEY_MGMT_OSEN
;
759 #endif /* CONFIG_HS20 */
761 sm
->wpa_key_mgmt
= WPA_KEY_MGMT_PSK
;
763 if (version
== WPA_PROTO_RSN
)
764 ciphers
= data
.pairwise_cipher
& wpa_auth
->conf
.rsn_pairwise
;
766 ciphers
= data
.pairwise_cipher
& wpa_auth
->conf
.wpa_pairwise
;
768 wpa_printf(MSG_DEBUG
, "Invalid %s pairwise cipher (0x%x) "
770 version
== WPA_PROTO_RSN
? "RSN" : "WPA",
771 data
.pairwise_cipher
, MAC2STR(sm
->addr
));
772 return WPA_INVALID_PAIRWISE
;
775 if (wpa_auth
->conf
.ieee80211w
== MGMT_FRAME_PROTECTION_REQUIRED
) {
776 if (!(data
.capabilities
& WPA_CAPABILITY_MFPC
)) {
777 wpa_printf(MSG_DEBUG
, "Management frame protection "
778 "required, but client did not enable it");
779 return WPA_MGMT_FRAME_PROTECTION_VIOLATION
;
782 if (data
.mgmt_group_cipher
!= wpa_auth
->conf
.group_mgmt_cipher
)
784 wpa_printf(MSG_DEBUG
, "Unsupported management group "
785 "cipher %d", data
.mgmt_group_cipher
);
786 return WPA_INVALID_MGMT_GROUP_CIPHER
;
791 if (wpa_auth
->conf
.ieee80211w
== MGMT_FRAME_PROTECTION_OPTIONAL
&&
792 wpa_auth
->conf
.sae_require_mfp
&&
793 wpa_key_mgmt_sae(sm
->wpa_key_mgmt
) &&
794 !(data
.capabilities
& WPA_CAPABILITY_MFPC
)) {
795 wpa_printf(MSG_DEBUG
,
796 "Management frame protection required with SAE, but client did not enable it");
797 return WPA_MGMT_FRAME_PROTECTION_VIOLATION
;
799 #endif /* CONFIG_SAE */
802 if ((data
.capabilities
& WPA_CAPABILITY_OCVC
) &&
803 !(data
.capabilities
& WPA_CAPABILITY_MFPC
)) {
804 wpa_printf(MSG_DEBUG
,
805 "Management frame protection required with OCV, but client did not enable it");
806 return WPA_MGMT_FRAME_PROTECTION_VIOLATION
;
808 wpa_auth_set_ocv(sm
, wpa_auth
->conf
.ocv
&&
809 (data
.capabilities
& WPA_CAPABILITY_OCVC
));
810 #endif /* CONFIG_OCV */
812 if (wpa_auth
->conf
.ieee80211w
== NO_MGMT_FRAME_PROTECTION
||
813 !(data
.capabilities
& WPA_CAPABILITY_MFPC
))
814 sm
->mgmt_frame_prot
= 0;
816 sm
->mgmt_frame_prot
= 1;
818 if (sm
->mgmt_frame_prot
&& (ciphers
& WPA_CIPHER_TKIP
)) {
819 wpa_printf(MSG_DEBUG
,
820 "Management frame protection cannot use TKIP");
821 return WPA_MGMT_FRAME_PROTECTION_VIOLATION
;
824 #ifdef CONFIG_IEEE80211R_AP
825 if (wpa_key_mgmt_ft(sm
->wpa_key_mgmt
)) {
826 if (mdie
== NULL
|| mdie_len
< MOBILITY_DOMAIN_ID_LEN
+ 1) {
827 wpa_printf(MSG_DEBUG
, "RSN: Trying to use FT, but "
828 "MDIE not included");
829 return WPA_INVALID_MDIE
;
831 if (os_memcmp(mdie
, wpa_auth
->conf
.mobility_domain
,
832 MOBILITY_DOMAIN_ID_LEN
) != 0) {
833 wpa_hexdump(MSG_DEBUG
, "RSN: Attempted to use unknown "
834 "MDIE", mdie
, MOBILITY_DOMAIN_ID_LEN
);
835 return WPA_INVALID_MDIE
;
837 } else if (mdie
!= NULL
) {
838 wpa_printf(MSG_DEBUG
,
839 "RSN: Trying to use non-FT AKM suite, but MDIE included");
840 return WPA_INVALID_AKMP
;
842 #endif /* CONFIG_IEEE80211R_AP */
845 if (sm
->wpa_key_mgmt
== WPA_KEY_MGMT_OWE
&& !owe_dh
) {
846 wpa_printf(MSG_DEBUG
,
847 "OWE: No Diffie-Hellman Parameter element");
848 return WPA_INVALID_AKMP
;
851 if (sm
->wpa_key_mgmt
== WPA_KEY_MGMT_DPP
&& owe_dh
) {
852 /* Diffie-Hellman Parameter element can be used with DPP as
853 * well, so allow this to proceed. */
855 #endif /* CONFIG_DPP */
856 if (sm
->wpa_key_mgmt
!= WPA_KEY_MGMT_OWE
&& owe_dh
) {
857 wpa_printf(MSG_DEBUG
,
858 "OWE: Unexpected Diffie-Hellman Parameter element with non-OWE AKM");
859 return WPA_INVALID_AKMP
;
861 #endif /* CONFIG_OWE */
863 sm
->pairwise
= wpa_pick_pairwise_cipher(ciphers
, 0);
864 if (sm
->pairwise
< 0)
865 return WPA_INVALID_PAIRWISE
;
867 /* TODO: clear WPA/WPA2 state if STA changes from one to another */
868 if (wpa_ie
[0] == WLAN_EID_RSN
)
869 sm
->wpa
= WPA_VERSION_WPA2
;
871 sm
->wpa
= WPA_VERSION_WPA
;
873 #if defined(CONFIG_IEEE80211R_AP) && defined(CONFIG_FILS)
874 if ((sm
->wpa_key_mgmt
== WPA_KEY_MGMT_FT_FILS_SHA256
||
875 sm
->wpa_key_mgmt
== WPA_KEY_MGMT_FT_FILS_SHA384
) &&
876 (sm
->auth_alg
== WLAN_AUTH_FILS_SK
||
877 sm
->auth_alg
== WLAN_AUTH_FILS_SK_PFS
||
878 sm
->auth_alg
== WLAN_AUTH_FILS_PK
) &&
879 (data
.num_pmkid
!= 1 || !data
.pmkid
|| !sm
->pmk_r1_name_valid
||
880 os_memcmp_const(data
.pmkid
, sm
->pmk_r1_name
,
881 WPA_PMK_NAME_LEN
) != 0)) {
882 wpa_auth_vlogger(wpa_auth
, sm
->addr
, LOGGER_DEBUG
,
883 "No PMKR1Name match for FILS+FT");
884 return WPA_INVALID_PMKID
;
886 #endif /* CONFIG_IEEE80211R_AP && CONFIG_FILS */
889 for (i
= 0; i
< data
.num_pmkid
; i
++) {
890 wpa_hexdump(MSG_DEBUG
, "RSN IE: STA PMKID",
891 &data
.pmkid
[i
* PMKID_LEN
], PMKID_LEN
);
892 sm
->pmksa
= pmksa_cache_auth_get(wpa_auth
->pmksa
, sm
->addr
,
893 &data
.pmkid
[i
* PMKID_LEN
]);
895 pmkid
= sm
->pmksa
->pmkid
;
899 for (i
= 0; sm
->pmksa
== NULL
&& wpa_auth
->conf
.okc
&&
900 i
< data
.num_pmkid
; i
++) {
901 struct wpa_auth_okc_iter_data idata
;
903 idata
.aa
= wpa_auth
->addr
;
904 idata
.spa
= sm
->addr
;
905 idata
.pmkid
= &data
.pmkid
[i
* PMKID_LEN
];
906 wpa_auth_for_each_auth(wpa_auth
, wpa_auth_okc_iter
, &idata
);
908 wpa_auth_vlogger(wpa_auth
, sm
->addr
, LOGGER_DEBUG
,
909 "OKC match for PMKID");
910 sm
->pmksa
= pmksa_cache_add_okc(wpa_auth
->pmksa
,
918 if (sm
->pmksa
&& pmkid
) {
919 struct vlan_description
*vlan
;
921 vlan
= sm
->pmksa
->vlan_desc
;
922 wpa_auth_vlogger(wpa_auth
, sm
->addr
, LOGGER_DEBUG
,
923 "PMKID found from PMKSA cache eap_type=%d vlan=%d%s",
924 sm
->pmksa
->eap_type_authsrv
,
925 vlan
? vlan
->untagged
: 0,
926 (vlan
&& vlan
->tagged
[0]) ? "+" : "");
927 os_memcpy(wpa_auth
->dot11RSNAPMKIDUsed
, pmkid
, PMKID_LEN
);
931 if (sm
->wpa_key_mgmt
== WPA_KEY_MGMT_SAE
&& data
.num_pmkid
&&
933 wpa_auth_vlogger(wpa_auth
, sm
->addr
, LOGGER_DEBUG
,
934 "No PMKSA cache entry found for SAE");
935 return WPA_INVALID_PMKID
;
937 #endif /* CONFIG_SAE */
940 if (sm
->wpa_key_mgmt
== WPA_KEY_MGMT_DPP
&& !sm
->pmksa
) {
941 wpa_auth_vlogger(wpa_auth
, sm
->addr
, LOGGER_DEBUG
,
942 "No PMKSA cache entry found for DPP");
943 return WPA_INVALID_PMKID
;
945 #endif /* CONFIG_DPP */
947 if (sm
->wpa_ie
== NULL
|| sm
->wpa_ie_len
< wpa_ie_len
) {
949 sm
->wpa_ie
= os_malloc(wpa_ie_len
);
950 if (sm
->wpa_ie
== NULL
)
951 return WPA_ALLOC_FAIL
;
953 os_memcpy(sm
->wpa_ie
, wpa_ie
, wpa_ie_len
);
954 sm
->wpa_ie_len
= wpa_ie_len
;
956 if (rsnxe
&& rsnxe_len
) {
957 if (!sm
->rsnxe
|| sm
->rsnxe_len
< rsnxe_len
) {
959 sm
->rsnxe
= os_malloc(rsnxe_len
);
961 return WPA_ALLOC_FAIL
;
963 os_memcpy(sm
->rsnxe
, rsnxe
, rsnxe_len
);
964 sm
->rsnxe_len
= rsnxe_len
;
976 int wpa_validate_osen(struct wpa_authenticator
*wpa_auth
,
977 struct wpa_state_machine
*sm
,
978 const u8
*osen_ie
, size_t osen_ie_len
)
980 if (wpa_auth
== NULL
|| sm
== NULL
)
983 /* TODO: parse OSEN element */
984 sm
->wpa_key_mgmt
= WPA_KEY_MGMT_OSEN
;
985 sm
->mgmt_frame_prot
= 1;
986 sm
->pairwise
= WPA_CIPHER_CCMP
;
987 sm
->wpa
= WPA_VERSION_WPA2
;
989 if (sm
->wpa_ie
== NULL
|| sm
->wpa_ie_len
< osen_ie_len
) {
991 sm
->wpa_ie
= os_malloc(osen_ie_len
);
992 if (sm
->wpa_ie
== NULL
)
996 os_memcpy(sm
->wpa_ie
, osen_ie
, osen_ie_len
);
997 sm
->wpa_ie_len
= osen_ie_len
;
1002 #endif /* CONFIG_HS20 */
1005 int wpa_auth_uses_mfp(struct wpa_state_machine
*sm
)
1007 return sm
? sm
->mgmt_frame_prot
: 0;
1013 void wpa_auth_set_ocv(struct wpa_state_machine
*sm
, int ocv
)
1016 sm
->ocv_enabled
= ocv
;
1020 int wpa_auth_uses_ocv(struct wpa_state_machine
*sm
)
1022 return sm
? sm
->ocv_enabled
: 0;
1025 #endif /* CONFIG_OCV */
1029 u8
* wpa_auth_write_assoc_resp_owe(struct wpa_state_machine
*sm
,
1030 u8
*pos
, size_t max_len
,
1031 const u8
*req_ies
, size_t req_ies_len
)
1034 struct wpa_auth_config
*conf
;
1038 conf
= &sm
->wpa_auth
->conf
;
1040 #ifdef CONFIG_TESTING_OPTIONS
1041 if (conf
->own_ie_override_len
) {
1042 if (max_len
< conf
->own_ie_override_len
)
1044 wpa_hexdump(MSG_DEBUG
, "WPA: Forced own IE(s) for testing",
1045 conf
->own_ie_override
, conf
->own_ie_override_len
);
1046 os_memcpy(pos
, conf
->own_ie_override
,
1047 conf
->own_ie_override_len
);
1048 return pos
+ conf
->own_ie_override_len
;
1050 #endif /* CONFIG_TESTING_OPTIONS */
1052 res
= wpa_write_rsn_ie(conf
, pos
, max_len
,
1053 sm
->pmksa
? sm
->pmksa
->pmkid
: NULL
);
1058 #endif /* CONFIG_OWE */
1062 u8
* wpa_auth_write_assoc_resp_fils(struct wpa_state_machine
*sm
,
1063 u8
*pos
, size_t max_len
,
1064 const u8
*req_ies
, size_t req_ies_len
)
1069 sm
->wpa_key_mgmt
& (WPA_KEY_MGMT_FT_FILS_SHA256
|
1070 WPA_KEY_MGMT_FT_FILS_SHA384
))
1073 res
= wpa_write_rsn_ie(&sm
->wpa_auth
->conf
, pos
, max_len
, NULL
);
1078 #endif /* CONFIG_FILS */