1 /* 2 * hostapd - WPA/RSN IE and KDE definitions 3 * Copyright (c) 2004-2018, Jouni Malinen <j@w1.fi> 4 * 5 * This software may be distributed under the terms of the BSD license. 6 * See README for more details. 7 */ 8 9 #include "utils/includes.h" 10 11 #include "utils/common.h" 12 #include "common/ieee802_11_defs.h" 13 #include "drivers/driver.h" 14 #include "eapol_auth/eapol_auth_sm.h" 15 #include "ap_config.h" 16 #include "ieee802_11.h" 17 #include "wpa_auth.h" 18 #include "pmksa_cache_auth.h" 19 #include "wpa_auth_ie.h" 20 #include "wpa_auth_i.h" 21 22 23 #ifdef CONFIG_RSN_TESTING 24 int rsn_testing = 0; 25 #endif /* CONFIG_RSN_TESTING */ 26 27 28 static int wpa_write_wpa_ie(struct wpa_auth_config *conf, u8 *buf, size_t len) 29 { 30 struct wpa_ie_hdr *hdr; 31 int num_suites; 32 u8 *pos, *count; 33 u32 suite; 34 35 hdr = (struct wpa_ie_hdr *) buf; 36 hdr->elem_id = WLAN_EID_VENDOR_SPECIFIC; 37 RSN_SELECTOR_PUT(hdr->oui, WPA_OUI_TYPE); 38 WPA_PUT_LE16(hdr->version, WPA_VERSION); 39 pos = (u8 *) (hdr + 1); 40 41 suite = wpa_cipher_to_suite(WPA_PROTO_WPA, conf->wpa_group); 42 if (suite == 0) { 43 wpa_printf(MSG_DEBUG, "Invalid group cipher (%d).", 44 conf->wpa_group); 45 return -1; 46 } 47 RSN_SELECTOR_PUT(pos, suite); 48 pos += WPA_SELECTOR_LEN; 49 50 count = pos; 51 pos += 2; 52 53 num_suites = wpa_cipher_put_suites(pos, conf->wpa_pairwise); 54 if (num_suites == 0) { 55 wpa_printf(MSG_DEBUG, "Invalid pairwise cipher (%d).", 56 conf->wpa_pairwise); 57 return -1; 58 } 59 pos += num_suites * WPA_SELECTOR_LEN; 60 WPA_PUT_LE16(count, num_suites); 61 62 num_suites = 0; 63 count = pos; 64 pos += 2; 65 66 if (conf->wpa_key_mgmt & WPA_KEY_MGMT_IEEE8021X) { 67 RSN_SELECTOR_PUT(pos, WPA_AUTH_KEY_MGMT_UNSPEC_802_1X); 68 pos += WPA_SELECTOR_LEN; 69 num_suites++; 70 } 71 if (conf->wpa_key_mgmt & WPA_KEY_MGMT_PSK) { 72 RSN_SELECTOR_PUT(pos, WPA_AUTH_KEY_MGMT_PSK_OVER_802_1X); 73 pos += WPA_SELECTOR_LEN; 74 num_suites++; 75 } 76 77 if (num_suites == 0) { 78 wpa_printf(MSG_DEBUG, "Invalid key management type (%d).", 79 conf->wpa_key_mgmt); 80 return -1; 81 } 82 WPA_PUT_LE16(count, num_suites); 83 84 /* WPA Capabilities; use defaults, so no need to include it */ 85 86 hdr->len = (pos - buf) - 2; 87 88 return pos - buf; 89 } 90 91 92 static u16 wpa_own_rsn_capab(struct wpa_auth_config *conf) 93 { 94 u16 capab = 0; 95 96 if (conf->rsn_preauth) 97 capab |= WPA_CAPABILITY_PREAUTH; 98 if (conf->wmm_enabled) { 99 /* 4 PTKSA replay counters when using WMM */ 100 capab |= (RSN_NUM_REPLAY_COUNTERS_16 << 2); 101 } 102 if (conf->ieee80211w != NO_MGMT_FRAME_PROTECTION) { 103 capab |= WPA_CAPABILITY_MFPC; 104 if (conf->ieee80211w == MGMT_FRAME_PROTECTION_REQUIRED) 105 capab |= WPA_CAPABILITY_MFPR; 106 } 107 #ifdef CONFIG_OCV 108 if (conf->ocv) 109 capab |= WPA_CAPABILITY_OCVC; 110 #endif /* CONFIG_OCV */ 111 #ifdef CONFIG_RSN_TESTING 112 if (rsn_testing) 113 capab |= BIT(8) | BIT(15); 114 #endif /* CONFIG_RSN_TESTING */ 115 if (conf->extended_key_id) 116 capab |= WPA_CAPABILITY_EXT_KEY_ID_FOR_UNICAST; 117 118 return capab; 119 } 120 121 122 int wpa_write_rsn_ie(struct wpa_auth_config *conf, u8 *buf, size_t len, 123 const u8 *pmkid) 124 { 125 struct rsn_ie_hdr *hdr; 126 int num_suites, res; 127 u8 *pos, *count; 128 u32 suite; 129 130 hdr = (struct rsn_ie_hdr *) buf; 131 hdr->elem_id = WLAN_EID_RSN; 132 WPA_PUT_LE16(hdr->version, RSN_VERSION); 133 pos = (u8 *) (hdr + 1); 134 135 suite = wpa_cipher_to_suite(WPA_PROTO_RSN, conf->wpa_group); 136 if (suite == 0) { 137 wpa_printf(MSG_DEBUG, "Invalid group cipher (%d).", 138 conf->wpa_group); 139 return -1; 140 } 141 RSN_SELECTOR_PUT(pos, suite); 142 pos += RSN_SELECTOR_LEN; 143 144 num_suites = 0; 145 count = pos; 146 pos += 2; 147 148 #ifdef CONFIG_RSN_TESTING 149 if (rsn_testing) { 150 RSN_SELECTOR_PUT(pos, RSN_SELECTOR(0x12, 0x34, 0x56, 1)); 151 pos += RSN_SELECTOR_LEN; 152 num_suites++; 153 } 154 #endif /* CONFIG_RSN_TESTING */ 155 156 res = rsn_cipher_put_suites(pos, conf->rsn_pairwise); 157 num_suites += res; 158 pos += res * RSN_SELECTOR_LEN; 159 160 #ifdef CONFIG_RSN_TESTING 161 if (rsn_testing) { 162 RSN_SELECTOR_PUT(pos, RSN_SELECTOR(0x12, 0x34, 0x56, 2)); 163 pos += RSN_SELECTOR_LEN; 164 num_suites++; 165 } 166 #endif /* CONFIG_RSN_TESTING */ 167 168 if (num_suites == 0) { 169 wpa_printf(MSG_DEBUG, "Invalid pairwise cipher (%d).", 170 conf->rsn_pairwise); 171 return -1; 172 } 173 WPA_PUT_LE16(count, num_suites); 174 175 num_suites = 0; 176 count = pos; 177 pos += 2; 178 179 #ifdef CONFIG_RSN_TESTING 180 if (rsn_testing) { 181 RSN_SELECTOR_PUT(pos, RSN_SELECTOR(0x12, 0x34, 0x56, 1)); 182 pos += RSN_SELECTOR_LEN; 183 num_suites++; 184 } 185 #endif /* CONFIG_RSN_TESTING */ 186 187 if (conf->wpa_key_mgmt & WPA_KEY_MGMT_IEEE8021X) { 188 RSN_SELECTOR_PUT(pos, RSN_AUTH_KEY_MGMT_UNSPEC_802_1X); 189 pos += RSN_SELECTOR_LEN; 190 num_suites++; 191 } 192 if (conf->wpa_key_mgmt & WPA_KEY_MGMT_PSK) { 193 RSN_SELECTOR_PUT(pos, RSN_AUTH_KEY_MGMT_PSK_OVER_802_1X); 194 pos += RSN_SELECTOR_LEN; 195 num_suites++; 196 } 197 #ifdef CONFIG_IEEE80211R_AP 198 if (conf->wpa_key_mgmt & WPA_KEY_MGMT_FT_IEEE8021X) { 199 RSN_SELECTOR_PUT(pos, RSN_AUTH_KEY_MGMT_FT_802_1X); 200 pos += RSN_SELECTOR_LEN; 201 num_suites++; 202 } 203 #ifdef CONFIG_SHA384 204 if (conf->wpa_key_mgmt & WPA_KEY_MGMT_FT_IEEE8021X_SHA384) { 205 RSN_SELECTOR_PUT(pos, RSN_AUTH_KEY_MGMT_FT_802_1X_SHA384); 206 pos += RSN_SELECTOR_LEN; 207 num_suites++; 208 } 209 #endif /* CONFIG_SHA384 */ 210 if (conf->wpa_key_mgmt & WPA_KEY_MGMT_FT_PSK) { 211 RSN_SELECTOR_PUT(pos, RSN_AUTH_KEY_MGMT_FT_PSK); 212 pos += RSN_SELECTOR_LEN; 213 num_suites++; 214 } 215 #endif /* CONFIG_IEEE80211R_AP */ 216 #ifdef CONFIG_SHA384 217 if (conf->wpa_key_mgmt & WPA_KEY_MGMT_IEEE8021X_SHA384) { 218 RSN_SELECTOR_PUT(pos, RSN_AUTH_KEY_MGMT_802_1X_SHA384); 219 pos += RSN_SELECTOR_LEN; 220 num_suites++; 221 } 222 #endif /* CONFIG_SHA384 */ 223 if (conf->wpa_key_mgmt & WPA_KEY_MGMT_IEEE8021X_SHA256) { 224 RSN_SELECTOR_PUT(pos, RSN_AUTH_KEY_MGMT_802_1X_SHA256); 225 pos += RSN_SELECTOR_LEN; 226 num_suites++; 227 } 228 if (conf->wpa_key_mgmt & WPA_KEY_MGMT_PSK_SHA256) { 229 RSN_SELECTOR_PUT(pos, RSN_AUTH_KEY_MGMT_PSK_SHA256); 230 pos += RSN_SELECTOR_LEN; 231 num_suites++; 232 } 233 #ifdef CONFIG_SAE 234 if (conf->wpa_key_mgmt & WPA_KEY_MGMT_SAE) { 235 RSN_SELECTOR_PUT(pos, RSN_AUTH_KEY_MGMT_SAE); 236 pos += RSN_SELECTOR_LEN; 237 num_suites++; 238 } 239 if (conf->wpa_key_mgmt & WPA_KEY_MGMT_SAE_EXT_KEY) { 240 RSN_SELECTOR_PUT(pos, RSN_AUTH_KEY_MGMT_SAE_EXT_KEY); 241 pos += RSN_SELECTOR_LEN; 242 num_suites++; 243 } 244 if (conf->wpa_key_mgmt & WPA_KEY_MGMT_FT_SAE) { 245 RSN_SELECTOR_PUT(pos, RSN_AUTH_KEY_MGMT_FT_SAE); 246 pos += RSN_SELECTOR_LEN; 247 num_suites++; 248 } 249 if (conf->wpa_key_mgmt & WPA_KEY_MGMT_FT_SAE_EXT_KEY) { 250 RSN_SELECTOR_PUT(pos, RSN_AUTH_KEY_MGMT_FT_SAE_EXT_KEY); 251 pos += RSN_SELECTOR_LEN; 252 num_suites++; 253 } 254 #endif /* CONFIG_SAE */ 255 if (conf->wpa_key_mgmt & WPA_KEY_MGMT_IEEE8021X_SUITE_B) { 256 RSN_SELECTOR_PUT(pos, RSN_AUTH_KEY_MGMT_802_1X_SUITE_B); 257 pos += RSN_SELECTOR_LEN; 258 num_suites++; 259 } 260 if (conf->wpa_key_mgmt & WPA_KEY_MGMT_IEEE8021X_SUITE_B_192) { 261 RSN_SELECTOR_PUT(pos, RSN_AUTH_KEY_MGMT_802_1X_SUITE_B_192); 262 pos += RSN_SELECTOR_LEN; 263 num_suites++; 264 } 265 #ifdef CONFIG_FILS 266 if (conf->wpa_key_mgmt & WPA_KEY_MGMT_FILS_SHA256) { 267 RSN_SELECTOR_PUT(pos, RSN_AUTH_KEY_MGMT_FILS_SHA256); 268 pos += RSN_SELECTOR_LEN; 269 num_suites++; 270 } 271 if (conf->wpa_key_mgmt & WPA_KEY_MGMT_FILS_SHA384) { 272 RSN_SELECTOR_PUT(pos, RSN_AUTH_KEY_MGMT_FILS_SHA384); 273 pos += RSN_SELECTOR_LEN; 274 num_suites++; 275 } 276 #ifdef CONFIG_IEEE80211R_AP 277 if (conf->wpa_key_mgmt & WPA_KEY_MGMT_FT_FILS_SHA256) { 278 RSN_SELECTOR_PUT(pos, RSN_AUTH_KEY_MGMT_FT_FILS_SHA256); 279 pos += RSN_SELECTOR_LEN; 280 num_suites++; 281 } 282 if (conf->wpa_key_mgmt & WPA_KEY_MGMT_FT_FILS_SHA384) { 283 RSN_SELECTOR_PUT(pos, RSN_AUTH_KEY_MGMT_FT_FILS_SHA384); 284 pos += RSN_SELECTOR_LEN; 285 num_suites++; 286 } 287 #endif /* CONFIG_IEEE80211R_AP */ 288 #endif /* CONFIG_FILS */ 289 #ifdef CONFIG_OWE 290 if (conf->wpa_key_mgmt & WPA_KEY_MGMT_OWE) { 291 RSN_SELECTOR_PUT(pos, RSN_AUTH_KEY_MGMT_OWE); 292 pos += RSN_SELECTOR_LEN; 293 num_suites++; 294 } 295 #endif /* CONFIG_OWE */ 296 #ifdef CONFIG_DPP 297 if (conf->wpa_key_mgmt & WPA_KEY_MGMT_DPP) { 298 RSN_SELECTOR_PUT(pos, RSN_AUTH_KEY_MGMT_DPP); 299 pos += RSN_SELECTOR_LEN; 300 num_suites++; 301 } 302 #endif /* CONFIG_DPP */ 303 #ifdef CONFIG_HS20 304 if (conf->wpa_key_mgmt & WPA_KEY_MGMT_OSEN) { 305 RSN_SELECTOR_PUT(pos, RSN_AUTH_KEY_MGMT_OSEN); 306 pos += RSN_SELECTOR_LEN; 307 num_suites++; 308 } 309 #endif /* CONFIG_HS20 */ 310 #ifdef CONFIG_PASN 311 if (conf->wpa_key_mgmt & WPA_KEY_MGMT_PASN) { 312 RSN_SELECTOR_PUT(pos, RSN_AUTH_KEY_MGMT_PASN); 313 pos += RSN_SELECTOR_LEN; 314 num_suites++; 315 } 316 #endif /* CONFIG_PASN */ 317 318 #ifdef CONFIG_RSN_TESTING 319 if (rsn_testing) { 320 RSN_SELECTOR_PUT(pos, RSN_SELECTOR(0x12, 0x34, 0x56, 2)); 321 pos += RSN_SELECTOR_LEN; 322 num_suites++; 323 } 324 #endif /* CONFIG_RSN_TESTING */ 325 326 if (num_suites == 0) { 327 wpa_printf(MSG_DEBUG, "Invalid key management type (%d).", 328 conf->wpa_key_mgmt); 329 return -1; 330 } 331 WPA_PUT_LE16(count, num_suites); 332 333 /* RSN Capabilities */ 334 WPA_PUT_LE16(pos, wpa_own_rsn_capab(conf)); 335 pos += 2; 336 337 if (pmkid) { 338 if (2 + PMKID_LEN > buf + len - pos) 339 return -1; 340 /* PMKID Count */ 341 WPA_PUT_LE16(pos, 1); 342 pos += 2; 343 os_memcpy(pos, pmkid, PMKID_LEN); 344 pos += PMKID_LEN; 345 } 346 347 if (conf->ieee80211w != NO_MGMT_FRAME_PROTECTION && 348 conf->group_mgmt_cipher != WPA_CIPHER_AES_128_CMAC) { 349 if (2 + 4 > buf + len - pos) 350 return -1; 351 if (pmkid == NULL) { 352 /* PMKID Count */ 353 WPA_PUT_LE16(pos, 0); 354 pos += 2; 355 } 356 357 /* Management Group Cipher Suite */ 358 switch (conf->group_mgmt_cipher) { 359 case WPA_CIPHER_AES_128_CMAC: 360 RSN_SELECTOR_PUT(pos, RSN_CIPHER_SUITE_AES_128_CMAC); 361 break; 362 case WPA_CIPHER_BIP_GMAC_128: 363 RSN_SELECTOR_PUT(pos, RSN_CIPHER_SUITE_BIP_GMAC_128); 364 break; 365 case WPA_CIPHER_BIP_GMAC_256: 366 RSN_SELECTOR_PUT(pos, RSN_CIPHER_SUITE_BIP_GMAC_256); 367 break; 368 case WPA_CIPHER_BIP_CMAC_256: 369 RSN_SELECTOR_PUT(pos, RSN_CIPHER_SUITE_BIP_CMAC_256); 370 break; 371 default: 372 wpa_printf(MSG_DEBUG, 373 "Invalid group management cipher (0x%x)", 374 conf->group_mgmt_cipher); 375 return -1; 376 } 377 pos += RSN_SELECTOR_LEN; 378 } 379 380 #ifdef CONFIG_RSN_TESTING 381 if (rsn_testing) { 382 /* 383 * Fill in any defined fields and add extra data to the end of 384 * the element. 385 */ 386 int pmkid_count_set = pmkid != NULL; 387 if (conf->ieee80211w != NO_MGMT_FRAME_PROTECTION) 388 pmkid_count_set = 1; 389 /* PMKID Count */ 390 WPA_PUT_LE16(pos, 0); 391 pos += 2; 392 if (conf->ieee80211w == NO_MGMT_FRAME_PROTECTION) { 393 /* Management Group Cipher Suite */ 394 RSN_SELECTOR_PUT(pos, RSN_CIPHER_SUITE_AES_128_CMAC); 395 pos += RSN_SELECTOR_LEN; 396 } 397 398 os_memset(pos, 0x12, 17); 399 pos += 17; 400 } 401 #endif /* CONFIG_RSN_TESTING */ 402 403 hdr->len = (pos - buf) - 2; 404 405 return pos - buf; 406 } 407 408 409 int wpa_write_rsnxe(struct wpa_auth_config *conf, u8 *buf, size_t len) 410 { 411 u8 *pos = buf; 412 u32 capab = 0, tmp; 413 size_t flen; 414 415 if (wpa_key_mgmt_sae(conf->wpa_key_mgmt) && 416 (conf->sae_pwe == SAE_PWE_HASH_TO_ELEMENT || 417 conf->sae_pwe == SAE_PWE_BOTH || conf->sae_pk || 418 wpa_key_mgmt_sae_ext_key(conf->wpa_key_mgmt))) { 419 capab |= BIT(WLAN_RSNX_CAPAB_SAE_H2E); 420 #ifdef CONFIG_SAE_PK 421 if (conf->sae_pk) 422 capab |= BIT(WLAN_RSNX_CAPAB_SAE_PK); 423 #endif /* CONFIG_SAE_PK */ 424 } 425 426 if (conf->secure_ltf) 427 capab |= BIT(WLAN_RSNX_CAPAB_SECURE_LTF); 428 if (conf->secure_rtt) 429 capab |= BIT(WLAN_RSNX_CAPAB_SECURE_RTT); 430 if (conf->prot_range_neg) 431 capab |= BIT(WLAN_RSNX_CAPAB_URNM_MFPR); 432 if (conf->ssid_protection) 433 capab |= BIT(WLAN_RSNX_CAPAB_SSID_PROTECTION); 434 435 if (!capab) 436 return 0; /* no supported extended RSN capabilities */ 437 tmp = capab; 438 flen = 0; 439 while (tmp) { 440 flen++; 441 tmp >>= 8; 442 } 443 if (len < 2 + flen) 444 return -1; 445 capab |= flen - 1; /* bit 0-3 = Field length (n - 1) */ 446 447 *pos++ = WLAN_EID_RSNX; 448 *pos++ = flen; 449 while (capab) { 450 *pos++ = capab & 0xff; 451 capab >>= 8; 452 } 453 454 return pos - buf; 455 } 456 457 458 static u8 * wpa_write_osen(struct wpa_auth_config *conf, u8 *eid) 459 { 460 u8 *len; 461 u16 capab; 462 463 *eid++ = WLAN_EID_VENDOR_SPECIFIC; 464 len = eid++; /* to be filled */ 465 WPA_PUT_BE24(eid, OUI_WFA); 466 eid += 3; 467 *eid++ = HS20_OSEN_OUI_TYPE; 468 469 /* Group Data Cipher Suite */ 470 RSN_SELECTOR_PUT(eid, RSN_CIPHER_SUITE_NO_GROUP_ADDRESSED); 471 eid += RSN_SELECTOR_LEN; 472 473 /* Pairwise Cipher Suite Count and List */ 474 WPA_PUT_LE16(eid, 1); 475 eid += 2; 476 RSN_SELECTOR_PUT(eid, RSN_CIPHER_SUITE_CCMP); 477 eid += RSN_SELECTOR_LEN; 478 479 /* AKM Suite Count and List */ 480 WPA_PUT_LE16(eid, 1); 481 eid += 2; 482 RSN_SELECTOR_PUT(eid, RSN_AUTH_KEY_MGMT_OSEN); 483 eid += RSN_SELECTOR_LEN; 484 485 /* RSN Capabilities */ 486 capab = 0; 487 if (conf->wmm_enabled) { 488 /* 4 PTKSA replay counters when using WMM */ 489 capab |= (RSN_NUM_REPLAY_COUNTERS_16 << 2); 490 } 491 if (conf->ieee80211w != NO_MGMT_FRAME_PROTECTION) { 492 capab |= WPA_CAPABILITY_MFPC; 493 if (conf->ieee80211w == MGMT_FRAME_PROTECTION_REQUIRED) 494 capab |= WPA_CAPABILITY_MFPR; 495 } 496 #ifdef CONFIG_OCV 497 if (conf->ocv) 498 capab |= WPA_CAPABILITY_OCVC; 499 #endif /* CONFIG_OCV */ 500 WPA_PUT_LE16(eid, capab); 501 eid += 2; 502 503 *len = eid - len - 1; 504 505 return eid; 506 } 507 508 509 int wpa_auth_gen_wpa_ie(struct wpa_authenticator *wpa_auth) 510 { 511 u8 *pos, buf[128]; 512 int res; 513 514 #ifdef CONFIG_TESTING_OPTIONS 515 if (wpa_auth->conf.own_ie_override_len) { 516 wpa_hexdump(MSG_DEBUG, "WPA: Forced own IE(s) for testing", 517 wpa_auth->conf.own_ie_override, 518 wpa_auth->conf.own_ie_override_len); 519 os_free(wpa_auth->wpa_ie); 520 wpa_auth->wpa_ie = 521 os_malloc(wpa_auth->conf.own_ie_override_len); 522 if (wpa_auth->wpa_ie == NULL) 523 return -1; 524 os_memcpy(wpa_auth->wpa_ie, wpa_auth->conf.own_ie_override, 525 wpa_auth->conf.own_ie_override_len); 526 wpa_auth->wpa_ie_len = wpa_auth->conf.own_ie_override_len; 527 return 0; 528 } 529 #endif /* CONFIG_TESTING_OPTIONS */ 530 531 pos = buf; 532 533 if (wpa_auth->conf.wpa == WPA_PROTO_OSEN) { 534 pos = wpa_write_osen(&wpa_auth->conf, pos); 535 } 536 if (wpa_auth->conf.wpa & WPA_PROTO_RSN) { 537 res = wpa_write_rsn_ie(&wpa_auth->conf, 538 pos, buf + sizeof(buf) - pos, NULL); 539 if (res < 0) 540 return res; 541 pos += res; 542 res = wpa_write_rsnxe(&wpa_auth->conf, pos, 543 buf + sizeof(buf) - pos); 544 if (res < 0) 545 return res; 546 pos += res; 547 } 548 #ifdef CONFIG_IEEE80211R_AP 549 if (wpa_key_mgmt_ft(wpa_auth->conf.wpa_key_mgmt)) { 550 res = wpa_write_mdie(&wpa_auth->conf, pos, 551 buf + sizeof(buf) - pos); 552 if (res < 0) 553 return res; 554 pos += res; 555 } 556 #endif /* CONFIG_IEEE80211R_AP */ 557 if (wpa_auth->conf.wpa & WPA_PROTO_WPA) { 558 res = wpa_write_wpa_ie(&wpa_auth->conf, 559 pos, buf + sizeof(buf) - pos); 560 if (res < 0) 561 return res; 562 pos += res; 563 } 564 565 os_free(wpa_auth->wpa_ie); 566 wpa_auth->wpa_ie = os_malloc(pos - buf); 567 if (wpa_auth->wpa_ie == NULL) 568 return -1; 569 os_memcpy(wpa_auth->wpa_ie, buf, pos - buf); 570 wpa_auth->wpa_ie_len = pos - buf; 571 572 return 0; 573 } 574 575 576 u8 * wpa_add_kde(u8 *pos, u32 kde, const u8 *data, size_t data_len, 577 const u8 *data2, size_t data2_len) 578 { 579 *pos++ = WLAN_EID_VENDOR_SPECIFIC; 580 *pos++ = RSN_SELECTOR_LEN + data_len + data2_len; 581 RSN_SELECTOR_PUT(pos, kde); 582 pos += RSN_SELECTOR_LEN; 583 os_memcpy(pos, data, data_len); 584 pos += data_len; 585 if (data2) { 586 os_memcpy(pos, data2, data2_len); 587 pos += data2_len; 588 } 589 return pos; 590 } 591 592 593 struct wpa_auth_okc_iter_data { 594 struct rsn_pmksa_cache_entry *pmksa; 595 const u8 *aa; 596 const u8 *spa; 597 const u8 *pmkid; 598 }; 599 600 601 static int wpa_auth_okc_iter(struct wpa_authenticator *a, void *ctx) 602 { 603 struct wpa_auth_okc_iter_data *data = ctx; 604 data->pmksa = pmksa_cache_get_okc(a->pmksa, data->aa, data->spa, 605 data->pmkid); 606 if (data->pmksa) 607 return 1; 608 return 0; 609 } 610 611 612 enum wpa_validate_result 613 wpa_validate_wpa_ie(struct wpa_authenticator *wpa_auth, 614 struct wpa_state_machine *sm, int freq, 615 const u8 *wpa_ie, size_t wpa_ie_len, 616 const u8 *rsnxe, size_t rsnxe_len, 617 const u8 *mdie, size_t mdie_len, 618 const u8 *owe_dh, size_t owe_dh_len, 619 struct wpa_state_machine *assoc_sm) 620 { 621 struct wpa_auth_config *conf = &wpa_auth->conf; 622 struct wpa_ie_data data; 623 int ciphers, key_mgmt, res, version; 624 u32 selector; 625 size_t i; 626 const u8 *pmkid = NULL; 627 628 if (wpa_auth == NULL || sm == NULL) 629 return WPA_NOT_ENABLED; 630 631 if (wpa_ie == NULL || wpa_ie_len < 1) 632 return WPA_INVALID_IE; 633 634 if (wpa_ie[0] == WLAN_EID_RSN) 635 version = WPA_PROTO_RSN; 636 else 637 version = WPA_PROTO_WPA; 638 639 if (!(wpa_auth->conf.wpa & version)) { 640 wpa_printf(MSG_DEBUG, "Invalid WPA proto (%d) from " MACSTR, 641 version, MAC2STR(sm->addr)); 642 return WPA_INVALID_PROTO; 643 } 644 645 if (version == WPA_PROTO_RSN) { 646 res = wpa_parse_wpa_ie_rsn(wpa_ie, wpa_ie_len, &data); 647 if (!data.has_pairwise) 648 data.pairwise_cipher = wpa_default_rsn_cipher(freq); 649 if (!data.has_group) 650 data.group_cipher = wpa_default_rsn_cipher(freq); 651 652 if (wpa_key_mgmt_ft(data.key_mgmt) && !mdie && 653 !wpa_key_mgmt_only_ft(data.key_mgmt)) { 654 /* Workaround for some HP and Epson printers that seem 655 * to incorrectly copy the FT-PSK + WPA-PSK AKMs from AP 656 * advertised RSNE to Association Request frame. */ 657 wpa_printf(MSG_DEBUG, 658 "RSN: FT set in RSNE AKM but MDE is missing from " 659 MACSTR 660 " - ignore FT AKM(s) because there's also a non-FT AKM", 661 MAC2STR(sm->addr)); 662 data.key_mgmt &= ~WPA_KEY_MGMT_FT; 663 } 664 665 selector = RSN_AUTH_KEY_MGMT_UNSPEC_802_1X; 666 if (0) { 667 } 668 else if (data.key_mgmt & WPA_KEY_MGMT_IEEE8021X_SUITE_B_192) 669 selector = RSN_AUTH_KEY_MGMT_802_1X_SUITE_B_192; 670 else if (data.key_mgmt & WPA_KEY_MGMT_IEEE8021X_SUITE_B) 671 selector = RSN_AUTH_KEY_MGMT_802_1X_SUITE_B; 672 #ifdef CONFIG_FILS 673 #ifdef CONFIG_IEEE80211R_AP 674 else if (data.key_mgmt & WPA_KEY_MGMT_FT_FILS_SHA384) 675 selector = RSN_AUTH_KEY_MGMT_FT_FILS_SHA384; 676 else if (data.key_mgmt & WPA_KEY_MGMT_FT_FILS_SHA256) 677 selector = RSN_AUTH_KEY_MGMT_FT_FILS_SHA256; 678 #endif /* CONFIG_IEEE80211R_AP */ 679 else if (data.key_mgmt & WPA_KEY_MGMT_FILS_SHA384) 680 selector = RSN_AUTH_KEY_MGMT_FILS_SHA384; 681 else if (data.key_mgmt & WPA_KEY_MGMT_FILS_SHA256) 682 selector = RSN_AUTH_KEY_MGMT_FILS_SHA256; 683 #endif /* CONFIG_FILS */ 684 #ifdef CONFIG_IEEE80211R_AP 685 #ifdef CONFIG_SHA384 686 else if (data.key_mgmt & WPA_KEY_MGMT_FT_IEEE8021X_SHA384) 687 selector = RSN_AUTH_KEY_MGMT_FT_802_1X_SHA384; 688 #endif /* CONFIG_SHA384 */ 689 else if (data.key_mgmt & WPA_KEY_MGMT_FT_IEEE8021X) 690 selector = RSN_AUTH_KEY_MGMT_FT_802_1X; 691 else if (data.key_mgmt & WPA_KEY_MGMT_FT_PSK) 692 selector = RSN_AUTH_KEY_MGMT_FT_PSK; 693 #endif /* CONFIG_IEEE80211R_AP */ 694 else if (data.key_mgmt & WPA_KEY_MGMT_IEEE8021X_SHA256) 695 selector = RSN_AUTH_KEY_MGMT_802_1X_SHA256; 696 else if (data.key_mgmt & WPA_KEY_MGMT_PSK_SHA256) 697 selector = RSN_AUTH_KEY_MGMT_PSK_SHA256; 698 #ifdef CONFIG_SAE 699 else if (data.key_mgmt & WPA_KEY_MGMT_SAE) 700 selector = RSN_AUTH_KEY_MGMT_SAE; 701 else if (data.key_mgmt & WPA_KEY_MGMT_SAE_EXT_KEY) 702 selector = RSN_AUTH_KEY_MGMT_SAE_EXT_KEY; 703 else if (data.key_mgmt & WPA_KEY_MGMT_FT_SAE) 704 selector = RSN_AUTH_KEY_MGMT_FT_SAE; 705 else if (data.key_mgmt & WPA_KEY_MGMT_FT_SAE_EXT_KEY) 706 selector = RSN_AUTH_KEY_MGMT_FT_SAE_EXT_KEY; 707 #endif /* CONFIG_SAE */ 708 else if (data.key_mgmt & WPA_KEY_MGMT_IEEE8021X) 709 selector = RSN_AUTH_KEY_MGMT_UNSPEC_802_1X; 710 else if (data.key_mgmt & WPA_KEY_MGMT_PSK) 711 selector = RSN_AUTH_KEY_MGMT_PSK_OVER_802_1X; 712 #ifdef CONFIG_OWE 713 else if (data.key_mgmt & WPA_KEY_MGMT_OWE) 714 selector = RSN_AUTH_KEY_MGMT_OWE; 715 #endif /* CONFIG_OWE */ 716 #ifdef CONFIG_DPP 717 else if (data.key_mgmt & WPA_KEY_MGMT_DPP) 718 selector = RSN_AUTH_KEY_MGMT_DPP; 719 #endif /* CONFIG_DPP */ 720 #ifdef CONFIG_HS20 721 else if (data.key_mgmt & WPA_KEY_MGMT_OSEN) 722 selector = RSN_AUTH_KEY_MGMT_OSEN; 723 #endif /* CONFIG_HS20 */ 724 #ifdef CONFIG_SHA384 725 else if (data.key_mgmt & WPA_KEY_MGMT_IEEE8021X_SHA384) 726 selector = RSN_AUTH_KEY_MGMT_802_1X_SHA384; 727 #endif /* CONFIG_SHA384 */ 728 wpa_auth->dot11RSNAAuthenticationSuiteSelected = selector; 729 730 selector = wpa_cipher_to_suite(WPA_PROTO_RSN, 731 data.pairwise_cipher); 732 if (!selector) 733 selector = RSN_CIPHER_SUITE_CCMP; 734 wpa_auth->dot11RSNAPairwiseCipherSelected = selector; 735 736 selector = wpa_cipher_to_suite(WPA_PROTO_RSN, 737 data.group_cipher); 738 if (!selector) 739 selector = RSN_CIPHER_SUITE_CCMP; 740 wpa_auth->dot11RSNAGroupCipherSelected = selector; 741 } else { 742 res = wpa_parse_wpa_ie_wpa(wpa_ie, wpa_ie_len, &data); 743 744 selector = WPA_AUTH_KEY_MGMT_UNSPEC_802_1X; 745 if (data.key_mgmt & WPA_KEY_MGMT_IEEE8021X) 746 selector = WPA_AUTH_KEY_MGMT_UNSPEC_802_1X; 747 else if (data.key_mgmt & WPA_KEY_MGMT_PSK) 748 selector = WPA_AUTH_KEY_MGMT_PSK_OVER_802_1X; 749 wpa_auth->dot11RSNAAuthenticationSuiteSelected = selector; 750 751 selector = wpa_cipher_to_suite(WPA_PROTO_WPA, 752 data.pairwise_cipher); 753 if (!selector) 754 selector = RSN_CIPHER_SUITE_TKIP; 755 wpa_auth->dot11RSNAPairwiseCipherSelected = selector; 756 757 selector = wpa_cipher_to_suite(WPA_PROTO_WPA, 758 data.group_cipher); 759 if (!selector) 760 selector = WPA_CIPHER_SUITE_TKIP; 761 wpa_auth->dot11RSNAGroupCipherSelected = selector; 762 } 763 if (res) { 764 wpa_printf(MSG_DEBUG, "Failed to parse WPA/RSN IE from " 765 MACSTR " (res=%d)", MAC2STR(sm->addr), res); 766 wpa_hexdump(MSG_DEBUG, "WPA/RSN IE", wpa_ie, wpa_ie_len); 767 return WPA_INVALID_IE; 768 } 769 770 if (data.group_cipher != wpa_auth->conf.wpa_group) { 771 wpa_printf(MSG_DEBUG, "Invalid WPA group cipher (0x%x) from " 772 MACSTR, data.group_cipher, MAC2STR(sm->addr)); 773 return WPA_INVALID_GROUP; 774 } 775 776 key_mgmt = data.key_mgmt & wpa_auth->conf.wpa_key_mgmt; 777 if (!key_mgmt) { 778 wpa_printf(MSG_DEBUG, "Invalid WPA key mgmt (0x%x) from " 779 MACSTR, data.key_mgmt, MAC2STR(sm->addr)); 780 return WPA_INVALID_AKMP; 781 } 782 if (0) { 783 } 784 else if (key_mgmt & WPA_KEY_MGMT_IEEE8021X_SUITE_B_192) 785 sm->wpa_key_mgmt = WPA_KEY_MGMT_IEEE8021X_SUITE_B_192; 786 else if (key_mgmt & WPA_KEY_MGMT_IEEE8021X_SUITE_B) 787 sm->wpa_key_mgmt = WPA_KEY_MGMT_IEEE8021X_SUITE_B; 788 #ifdef CONFIG_FILS 789 #ifdef CONFIG_IEEE80211R_AP 790 else if (key_mgmt & WPA_KEY_MGMT_FT_FILS_SHA384) 791 sm->wpa_key_mgmt = WPA_KEY_MGMT_FT_FILS_SHA384; 792 else if (data.key_mgmt & WPA_KEY_MGMT_FT_FILS_SHA256) 793 sm->wpa_key_mgmt = WPA_KEY_MGMT_FT_FILS_SHA256; 794 #endif /* CONFIG_IEEE80211R_AP */ 795 else if (key_mgmt & WPA_KEY_MGMT_FILS_SHA384) 796 sm->wpa_key_mgmt = WPA_KEY_MGMT_FILS_SHA384; 797 else if (key_mgmt & WPA_KEY_MGMT_FILS_SHA256) 798 sm->wpa_key_mgmt = WPA_KEY_MGMT_FILS_SHA256; 799 #endif /* CONFIG_FILS */ 800 #ifdef CONFIG_IEEE80211R_AP 801 #ifdef CONFIG_SHA384 802 else if (key_mgmt & WPA_KEY_MGMT_FT_IEEE8021X_SHA384) 803 sm->wpa_key_mgmt = WPA_KEY_MGMT_FT_IEEE8021X_SHA384; 804 #endif /* CONFIG_SHA384 */ 805 else if (key_mgmt & WPA_KEY_MGMT_FT_IEEE8021X) 806 sm->wpa_key_mgmt = WPA_KEY_MGMT_FT_IEEE8021X; 807 else if (key_mgmt & WPA_KEY_MGMT_FT_PSK) 808 sm->wpa_key_mgmt = WPA_KEY_MGMT_FT_PSK; 809 #endif /* CONFIG_IEEE80211R_AP */ 810 #ifdef CONFIG_SHA384 811 else if (key_mgmt & WPA_KEY_MGMT_IEEE8021X_SHA384) 812 sm->wpa_key_mgmt = WPA_KEY_MGMT_IEEE8021X_SHA384; 813 #endif /* CONFIG_SHA384 */ 814 else if (key_mgmt & WPA_KEY_MGMT_IEEE8021X_SHA256) 815 sm->wpa_key_mgmt = WPA_KEY_MGMT_IEEE8021X_SHA256; 816 else if (key_mgmt & WPA_KEY_MGMT_PSK_SHA256) 817 sm->wpa_key_mgmt = WPA_KEY_MGMT_PSK_SHA256; 818 #ifdef CONFIG_SAE 819 else if (key_mgmt & WPA_KEY_MGMT_SAE) 820 sm->wpa_key_mgmt = WPA_KEY_MGMT_SAE; 821 else if (key_mgmt & WPA_KEY_MGMT_SAE_EXT_KEY) 822 sm->wpa_key_mgmt = WPA_KEY_MGMT_SAE_EXT_KEY; 823 else if (key_mgmt & WPA_KEY_MGMT_FT_SAE) 824 sm->wpa_key_mgmt = WPA_KEY_MGMT_FT_SAE; 825 else if (key_mgmt & WPA_KEY_MGMT_FT_SAE_EXT_KEY) 826 sm->wpa_key_mgmt = WPA_KEY_MGMT_FT_SAE_EXT_KEY; 827 #endif /* CONFIG_SAE */ 828 else if (key_mgmt & WPA_KEY_MGMT_IEEE8021X) 829 sm->wpa_key_mgmt = WPA_KEY_MGMT_IEEE8021X; 830 #ifdef CONFIG_OWE 831 else if (key_mgmt & WPA_KEY_MGMT_OWE) 832 sm->wpa_key_mgmt = WPA_KEY_MGMT_OWE; 833 #endif /* CONFIG_OWE */ 834 #ifdef CONFIG_DPP 835 else if (key_mgmt & WPA_KEY_MGMT_DPP) 836 sm->wpa_key_mgmt = WPA_KEY_MGMT_DPP; 837 #endif /* CONFIG_DPP */ 838 #ifdef CONFIG_HS20 839 else if (key_mgmt & WPA_KEY_MGMT_OSEN) 840 sm->wpa_key_mgmt = WPA_KEY_MGMT_OSEN; 841 #endif /* CONFIG_HS20 */ 842 else 843 sm->wpa_key_mgmt = WPA_KEY_MGMT_PSK; 844 845 if (version == WPA_PROTO_RSN) 846 ciphers = data.pairwise_cipher & wpa_auth->conf.rsn_pairwise; 847 else 848 ciphers = data.pairwise_cipher & wpa_auth->conf.wpa_pairwise; 849 if (!ciphers) { 850 wpa_printf(MSG_DEBUG, "Invalid %s pairwise cipher (0x%x) " 851 "from " MACSTR, 852 version == WPA_PROTO_RSN ? "RSN" : "WPA", 853 data.pairwise_cipher, MAC2STR(sm->addr)); 854 return WPA_INVALID_PAIRWISE; 855 } 856 857 if (wpa_auth->conf.ieee80211w == MGMT_FRAME_PROTECTION_REQUIRED) { 858 if (!(data.capabilities & WPA_CAPABILITY_MFPC)) { 859 wpa_printf(MSG_DEBUG, "Management frame protection " 860 "required, but client did not enable it"); 861 return WPA_MGMT_FRAME_PROTECTION_VIOLATION; 862 } 863 864 if (data.mgmt_group_cipher != wpa_auth->conf.group_mgmt_cipher) 865 { 866 wpa_printf(MSG_DEBUG, "Unsupported management group " 867 "cipher %d", data.mgmt_group_cipher); 868 return WPA_INVALID_MGMT_GROUP_CIPHER; 869 } 870 } 871 872 #ifdef CONFIG_SAE 873 if (wpa_auth->conf.ieee80211w == MGMT_FRAME_PROTECTION_OPTIONAL && 874 wpa_auth->conf.sae_require_mfp && 875 wpa_key_mgmt_sae(sm->wpa_key_mgmt) && 876 !(data.capabilities & WPA_CAPABILITY_MFPC)) { 877 wpa_printf(MSG_DEBUG, 878 "Management frame protection required with SAE, but client did not enable it"); 879 return WPA_MGMT_FRAME_PROTECTION_VIOLATION; 880 } 881 #endif /* CONFIG_SAE */ 882 883 #ifdef CONFIG_OCV 884 if (wpa_auth->conf.ocv && (data.capabilities & WPA_CAPABILITY_OCVC) && 885 !(data.capabilities & WPA_CAPABILITY_MFPC)) { 886 /* Some legacy MFP incapable STAs wrongly copy OCVC bit from 887 * AP RSN capabilities. To improve interoperability with such 888 * legacy STAs allow connection without enabling OCV when the 889 * workaround mode (ocv=2) is enabled. 890 */ 891 if (wpa_auth->conf.ocv == 2) { 892 wpa_printf(MSG_DEBUG, 893 "Allow connecting MFP incapable and OCV capable STA without enabling OCV"); 894 wpa_auth_set_ocv(sm, 0); 895 } else { 896 wpa_printf(MSG_DEBUG, 897 "Management frame protection required with OCV, but client did not enable it"); 898 return WPA_MGMT_FRAME_PROTECTION_VIOLATION; 899 } 900 } else { 901 wpa_auth_set_ocv(sm, (data.capabilities & WPA_CAPABILITY_OCVC) ? 902 wpa_auth->conf.ocv : 0); 903 } 904 #endif /* CONFIG_OCV */ 905 906 if (wpa_auth->conf.ieee80211w == NO_MGMT_FRAME_PROTECTION || 907 !(data.capabilities & WPA_CAPABILITY_MFPC)) 908 sm->mgmt_frame_prot = 0; 909 else 910 sm->mgmt_frame_prot = 1; 911 sm->mfpr = !!(data.capabilities & WPA_CAPABILITY_MFPR); 912 913 if (sm->mgmt_frame_prot && (ciphers & WPA_CIPHER_TKIP)) { 914 wpa_printf(MSG_DEBUG, 915 "Management frame protection cannot use TKIP"); 916 return WPA_MGMT_FRAME_PROTECTION_VIOLATION; 917 } 918 919 #ifdef CONFIG_IEEE80211R_AP 920 if (wpa_key_mgmt_ft(sm->wpa_key_mgmt)) { 921 if (mdie == NULL || mdie_len < MOBILITY_DOMAIN_ID_LEN + 1) { 922 wpa_printf(MSG_DEBUG, "RSN: Trying to use FT, but " 923 "MDIE not included"); 924 return WPA_INVALID_MDIE; 925 } 926 if (os_memcmp(mdie, wpa_auth->conf.mobility_domain, 927 MOBILITY_DOMAIN_ID_LEN) != 0) { 928 wpa_hexdump(MSG_DEBUG, "RSN: Attempted to use unknown " 929 "MDIE", mdie, MOBILITY_DOMAIN_ID_LEN); 930 return WPA_INVALID_MDIE; 931 } 932 } else if (mdie != NULL) { 933 wpa_printf(MSG_DEBUG, 934 "RSN: Trying to use non-FT AKM suite, but MDIE included"); 935 return WPA_INVALID_AKMP; 936 } 937 #endif /* CONFIG_IEEE80211R_AP */ 938 939 #ifdef CONFIG_OWE 940 if (sm->wpa_key_mgmt == WPA_KEY_MGMT_OWE && !owe_dh) { 941 wpa_printf(MSG_DEBUG, 942 "OWE: No Diffie-Hellman Parameter element"); 943 return WPA_INVALID_AKMP; 944 } 945 #endif /* CONFIG_OWE */ 946 947 #ifdef CONFIG_DPP2 948 if (sm->wpa_key_mgmt == WPA_KEY_MGMT_DPP && 949 ((conf->dpp_pfs == 1 && !owe_dh) || 950 (conf->dpp_pfs == 2 && owe_dh))) { 951 wpa_printf(MSG_DEBUG, "DPP: PFS %s", 952 conf->dpp_pfs == 1 ? "required" : "not allowed"); 953 return WPA_DENIED_OTHER_REASON; 954 } 955 #endif /* CONFIG_DPP2 */ 956 957 sm->pairwise = wpa_pick_pairwise_cipher(ciphers, 0); 958 if (sm->pairwise < 0) 959 return WPA_INVALID_PAIRWISE; 960 961 /* TODO: clear WPA/WPA2 state if STA changes from one to another */ 962 if (wpa_ie[0] == WLAN_EID_RSN) 963 sm->wpa = WPA_VERSION_WPA2; 964 else 965 sm->wpa = WPA_VERSION_WPA; 966 967 if (assoc_sm) { 968 /* For ML association link STA cannot choose a different 969 * AKM or pairwise cipher from association STA */ 970 if (sm->wpa_key_mgmt != assoc_sm->wpa_key_mgmt) 971 return WPA_INVALID_AKMP; 972 if (sm->pairwise != assoc_sm->pairwise) 973 return WPA_INVALID_PAIRWISE; 974 } 975 976 #if defined(CONFIG_IEEE80211R_AP) && defined(CONFIG_FILS) 977 if ((sm->wpa_key_mgmt == WPA_KEY_MGMT_FT_FILS_SHA256 || 978 sm->wpa_key_mgmt == WPA_KEY_MGMT_FT_FILS_SHA384) && 979 (sm->auth_alg == WLAN_AUTH_FILS_SK || 980 sm->auth_alg == WLAN_AUTH_FILS_SK_PFS || 981 sm->auth_alg == WLAN_AUTH_FILS_PK) && 982 (data.num_pmkid != 1 || !data.pmkid || !sm->pmk_r1_name_valid || 983 os_memcmp_const(data.pmkid, sm->pmk_r1_name, 984 WPA_PMK_NAME_LEN) != 0)) { 985 wpa_auth_vlogger(wpa_auth, sm->addr, LOGGER_DEBUG, 986 "No PMKR1Name match for FILS+FT"); 987 return WPA_INVALID_PMKID; 988 } 989 #endif /* CONFIG_IEEE80211R_AP && CONFIG_FILS */ 990 991 sm->pmksa = NULL; 992 for (i = 0; i < data.num_pmkid; i++) { 993 wpa_hexdump(MSG_DEBUG, "RSN IE: STA PMKID", 994 &data.pmkid[i * PMKID_LEN], PMKID_LEN); 995 sm->pmksa = pmksa_cache_auth_get(wpa_auth->pmksa, sm->addr, 996 &data.pmkid[i * PMKID_LEN]); 997 if (sm->pmksa) { 998 pmkid = sm->pmksa->pmkid; 999 break; 1000 } 1001 } 1002 for (i = 0; sm->pmksa == NULL && wpa_auth->conf.okc && 1003 i < data.num_pmkid; i++) { 1004 struct wpa_auth_okc_iter_data idata; 1005 idata.pmksa = NULL; 1006 idata.aa = wpa_auth->addr; 1007 idata.spa = sm->addr; 1008 idata.pmkid = &data.pmkid[i * PMKID_LEN]; 1009 wpa_auth_for_each_auth(wpa_auth, wpa_auth_okc_iter, &idata); 1010 if (idata.pmksa) { 1011 wpa_auth_vlogger(wpa_auth, sm->addr, LOGGER_DEBUG, 1012 "OKC match for PMKID"); 1013 sm->pmksa = pmksa_cache_add_okc(wpa_auth->pmksa, 1014 idata.pmksa, 1015 wpa_auth->addr, 1016 idata.pmkid); 1017 pmkid = idata.pmkid; 1018 break; 1019 } 1020 } 1021 if (sm->pmksa && pmkid) { 1022 struct vlan_description *vlan; 1023 1024 vlan = sm->pmksa->vlan_desc; 1025 wpa_auth_vlogger(wpa_auth, sm->addr, LOGGER_DEBUG, 1026 "PMKID found from PMKSA cache eap_type=%d vlan=%d%s", 1027 sm->pmksa->eap_type_authsrv, 1028 vlan ? vlan->untagged : 0, 1029 (vlan && vlan->tagged[0]) ? "+" : ""); 1030 os_memcpy(wpa_auth->dot11RSNAPMKIDUsed, pmkid, PMKID_LEN); 1031 } 1032 1033 #ifdef CONFIG_SAE 1034 if (sm->wpa_key_mgmt == WPA_KEY_MGMT_SAE || 1035 sm->wpa_key_mgmt == WPA_KEY_MGMT_SAE_EXT_KEY) { 1036 u64 drv_flags = 0; 1037 u64 drv_flags2 = 0; 1038 bool ap_sae_offload = false; 1039 1040 if (wpa_auth->cb->get_drv_flags && 1041 wpa_auth->cb->get_drv_flags(wpa_auth->cb_ctx, &drv_flags, 1042 &drv_flags2) == 0) 1043 ap_sae_offload = 1044 !!(drv_flags2 & 1045 WPA_DRIVER_FLAGS2_SAE_OFFLOAD_AP); 1046 1047 if (!ap_sae_offload && data.num_pmkid && !sm->pmksa) { 1048 wpa_auth_vlogger(wpa_auth, sm->addr, LOGGER_DEBUG, 1049 "No PMKSA cache entry found for SAE"); 1050 return WPA_INVALID_PMKID; 1051 } 1052 } 1053 #endif /* CONFIG_SAE */ 1054 1055 #ifdef CONFIG_DPP 1056 if (sm->wpa_key_mgmt == WPA_KEY_MGMT_DPP && !sm->pmksa) { 1057 wpa_auth_vlogger(wpa_auth, sm->addr, LOGGER_DEBUG, 1058 "No PMKSA cache entry found for DPP"); 1059 return WPA_INVALID_PMKID; 1060 } 1061 #endif /* CONFIG_DPP */ 1062 1063 if (conf->extended_key_id && sm->wpa == WPA_VERSION_WPA2 && 1064 sm->pairwise != WPA_CIPHER_TKIP && 1065 (data.capabilities & WPA_CAPABILITY_EXT_KEY_ID_FOR_UNICAST)) { 1066 sm->use_ext_key_id = true; 1067 if (conf->extended_key_id == 2 && 1068 !wpa_key_mgmt_ft(sm->wpa_key_mgmt) && 1069 !wpa_key_mgmt_fils(sm->wpa_key_mgmt)) 1070 sm->keyidx_active = 1; 1071 else 1072 sm->keyidx_active = 0; 1073 wpa_printf(MSG_DEBUG, 1074 "RSN: Extended Key ID supported (start with %d)", 1075 sm->keyidx_active); 1076 } else { 1077 sm->use_ext_key_id = false; 1078 } 1079 1080 if (sm->wpa_ie == NULL || sm->wpa_ie_len < wpa_ie_len) { 1081 os_free(sm->wpa_ie); 1082 sm->wpa_ie = os_malloc(wpa_ie_len); 1083 if (sm->wpa_ie == NULL) 1084 return WPA_ALLOC_FAIL; 1085 } 1086 os_memcpy(sm->wpa_ie, wpa_ie, wpa_ie_len); 1087 sm->wpa_ie_len = wpa_ie_len; 1088 1089 if (rsnxe && rsnxe_len) { 1090 if (!sm->rsnxe || sm->rsnxe_len < rsnxe_len) { 1091 os_free(sm->rsnxe); 1092 sm->rsnxe = os_malloc(rsnxe_len); 1093 if (!sm->rsnxe) 1094 return WPA_ALLOC_FAIL; 1095 } 1096 os_memcpy(sm->rsnxe, rsnxe, rsnxe_len); 1097 sm->rsnxe_len = rsnxe_len; 1098 } else { 1099 os_free(sm->rsnxe); 1100 sm->rsnxe = NULL; 1101 sm->rsnxe_len = 0; 1102 } 1103 1104 return WPA_IE_OK; 1105 } 1106 1107 1108 #ifdef CONFIG_HS20 1109 int wpa_validate_osen(struct wpa_authenticator *wpa_auth, 1110 struct wpa_state_machine *sm, 1111 const u8 *osen_ie, size_t osen_ie_len) 1112 { 1113 if (wpa_auth == NULL || sm == NULL) 1114 return -1; 1115 1116 /* TODO: parse OSEN element */ 1117 sm->wpa_key_mgmt = WPA_KEY_MGMT_OSEN; 1118 sm->mgmt_frame_prot = 1; 1119 sm->pairwise = WPA_CIPHER_CCMP; 1120 sm->wpa = WPA_VERSION_WPA2; 1121 1122 if (sm->wpa_ie == NULL || sm->wpa_ie_len < osen_ie_len) { 1123 os_free(sm->wpa_ie); 1124 sm->wpa_ie = os_malloc(osen_ie_len); 1125 if (sm->wpa_ie == NULL) 1126 return -1; 1127 } 1128 1129 os_memcpy(sm->wpa_ie, osen_ie, osen_ie_len); 1130 sm->wpa_ie_len = osen_ie_len; 1131 1132 return 0; 1133 } 1134 1135 #endif /* CONFIG_HS20 */ 1136 1137 1138 int wpa_auth_uses_mfp(struct wpa_state_machine *sm) 1139 { 1140 return sm ? sm->mgmt_frame_prot : 0; 1141 } 1142 1143 1144 #ifdef CONFIG_OCV 1145 1146 void wpa_auth_set_ocv(struct wpa_state_machine *sm, int ocv) 1147 { 1148 if (sm) 1149 sm->ocv_enabled = ocv; 1150 } 1151 1152 1153 int wpa_auth_uses_ocv(struct wpa_state_machine *sm) 1154 { 1155 return sm ? sm->ocv_enabled : 0; 1156 } 1157 1158 #endif /* CONFIG_OCV */ 1159 1160 1161 #ifdef CONFIG_OWE 1162 u8 * wpa_auth_write_assoc_resp_owe(struct wpa_state_machine *sm, 1163 u8 *pos, size_t max_len, 1164 const u8 *req_ies, size_t req_ies_len) 1165 { 1166 int res; 1167 struct wpa_auth_config *conf; 1168 1169 if (!sm) 1170 return pos; 1171 conf = &sm->wpa_auth->conf; 1172 1173 #ifdef CONFIG_TESTING_OPTIONS 1174 if (conf->own_ie_override_len) { 1175 if (max_len < conf->own_ie_override_len) 1176 return NULL; 1177 wpa_hexdump(MSG_DEBUG, "WPA: Forced own IE(s) for testing", 1178 conf->own_ie_override, conf->own_ie_override_len); 1179 os_memcpy(pos, conf->own_ie_override, 1180 conf->own_ie_override_len); 1181 return pos + conf->own_ie_override_len; 1182 } 1183 #endif /* CONFIG_TESTING_OPTIONS */ 1184 1185 res = wpa_write_rsn_ie(conf, pos, max_len, 1186 sm->pmksa ? sm->pmksa->pmkid : NULL); 1187 if (res < 0) 1188 return pos; 1189 return pos + res; 1190 } 1191 #endif /* CONFIG_OWE */ 1192 1193 1194 #ifdef CONFIG_FILS 1195 1196 u8 * wpa_auth_write_assoc_resp_fils(struct wpa_state_machine *sm, 1197 u8 *pos, size_t max_len, 1198 const u8 *req_ies, size_t req_ies_len) 1199 { 1200 int res; 1201 1202 if (!sm || 1203 sm->wpa_key_mgmt & (WPA_KEY_MGMT_FT_FILS_SHA256 | 1204 WPA_KEY_MGMT_FT_FILS_SHA384)) 1205 return pos; 1206 1207 res = wpa_write_rsn_ie(&sm->wpa_auth->conf, pos, max_len, NULL); 1208 if (res < 0) 1209 return pos; 1210 return pos + res; 1211 } 1212 1213 1214 bool wpa_auth_write_fd_rsn_info(struct wpa_authenticator *wpa_auth, 1215 u8 *fd_rsn_info) 1216 { 1217 struct wpa_auth_config *conf; 1218 u32 selectors = 0; 1219 u8 *pos = fd_rsn_info; 1220 int i, res; 1221 u32 cipher, suite, selector, mask; 1222 u8 tmp[10 * RSN_SELECTOR_LEN]; 1223 1224 if (!wpa_auth) 1225 return false; 1226 conf = &wpa_auth->conf; 1227 1228 if (!(conf->wpa & WPA_PROTO_RSN)) 1229 return false; 1230 1231 /* RSN Capability (B0..B15) */ 1232 WPA_PUT_LE16(pos, wpa_own_rsn_capab(conf)); 1233 pos += 2; 1234 1235 /* Group Data Cipher Suite Selector (B16..B21) */ 1236 suite = wpa_cipher_to_suite(WPA_PROTO_RSN, conf->wpa_group); 1237 if (suite == RSN_CIPHER_SUITE_NO_GROUP_ADDRESSED) 1238 cipher = 63; /* No cipher suite selected */ 1239 else if ((suite >> 8) == 0x000fac && ((suite & 0xff) <= 13)) 1240 cipher = suite & 0xff; 1241 else 1242 cipher = 62; /* vendor specific */ 1243 selectors |= cipher; 1244 1245 /* Group Management Cipher Suite Selector (B22..B27) */ 1246 cipher = 63; /* Default to no cipher suite selected */ 1247 if (conf->ieee80211w != NO_MGMT_FRAME_PROTECTION) { 1248 switch (conf->group_mgmt_cipher) { 1249 case WPA_CIPHER_AES_128_CMAC: 1250 cipher = RSN_CIPHER_SUITE_AES_128_CMAC & 0xff; 1251 break; 1252 case WPA_CIPHER_BIP_GMAC_128: 1253 cipher = RSN_CIPHER_SUITE_BIP_GMAC_128 & 0xff; 1254 break; 1255 case WPA_CIPHER_BIP_GMAC_256: 1256 cipher = RSN_CIPHER_SUITE_BIP_GMAC_256 & 0xff; 1257 break; 1258 case WPA_CIPHER_BIP_CMAC_256: 1259 cipher = RSN_CIPHER_SUITE_BIP_CMAC_256 & 0xff; 1260 break; 1261 } 1262 } 1263 selectors |= cipher << 6; 1264 1265 /* Pairwise Cipher Suite Selector (B28..B33) */ 1266 cipher = 63; /* Default to no cipher suite selected */ 1267 res = rsn_cipher_put_suites(tmp, conf->rsn_pairwise); 1268 if (res == 1 && tmp[0] == 0x00 && tmp[1] == 0x0f && tmp[2] == 0xac && 1269 tmp[3] <= 13) 1270 cipher = tmp[3]; 1271 selectors |= cipher << 12; 1272 1273 /* AKM Suite Selector (B34..B39) */ 1274 selector = 0; /* default to AKM from RSNE in Beacon/Probe Response */ 1275 mask = WPA_KEY_MGMT_FILS_SHA256 | WPA_KEY_MGMT_FILS_SHA384 | 1276 WPA_KEY_MGMT_FT_FILS_SHA384; 1277 if ((conf->wpa_key_mgmt & mask) && (conf->wpa_key_mgmt & ~mask) == 0) { 1278 suite = conf->wpa_key_mgmt & mask; 1279 if (suite == WPA_KEY_MGMT_FILS_SHA256) 1280 selector = 1; /* 00-0f-ac:14 */ 1281 else if (suite == WPA_KEY_MGMT_FILS_SHA384) 1282 selector = 2; /* 00-0f-ac:15 */ 1283 else if (suite == (WPA_KEY_MGMT_FILS_SHA256 | 1284 WPA_KEY_MGMT_FILS_SHA384)) 1285 selector = 3; /* 00-0f-ac:14 or 00-0f-ac:15 */ 1286 else if (suite == WPA_KEY_MGMT_FT_FILS_SHA384) 1287 selector = 4; /* 00-0f-ac:17 */ 1288 } 1289 selectors |= selector << 18; 1290 1291 for (i = 0; i < 3; i++) { 1292 *pos++ = selectors & 0xff; 1293 selectors >>= 8; 1294 } 1295 1296 return true; 1297 } 1298 1299 #endif /* CONFIG_FILS */ 1300