1 /* 2 * hostapd - WPA/RSN IE and KDE definitions 3 * Copyright (c) 2004-2008, Jouni Malinen <j (at) w1.fi> 4 * 5 * This program is free software; you can redistribute it and/or modify 6 * it under the terms of the GNU General Public License version 2 as 7 * published by the Free Software Foundation. 8 * 9 * Alternatively, this software may be distributed under the terms of BSD 10 * license. 11 * 12 * See README and COPYING for more details. 13 */ 14 15 #include "utils/includes.h" 16 17 #include "utils/common.h" 18 #include "common/ieee802_11_defs.h" 19 #include "eapol_auth/eapol_auth_sm.h" 20 #include "ap_config.h" 21 #include "ieee802_11.h" 22 #include "wpa_auth.h" 23 #include "pmksa_cache_auth.h" 24 #include "wpa_auth_ie.h" 25 #include "wpa_auth_i.h" 26 27 28 #ifdef CONFIG_RSN_TESTING 29 int rsn_testing = 0; 30 #endif /* CONFIG_RSN_TESTING */ 31 32 33 static int wpa_write_wpa_ie(struct wpa_auth_config *conf, u8 *buf, size_t len) 34 { 35 struct wpa_ie_hdr *hdr; 36 int num_suites; 37 u8 *pos, *count; 38 39 hdr = (struct wpa_ie_hdr *) buf; 40 hdr->elem_id = WLAN_EID_VENDOR_SPECIFIC; 41 RSN_SELECTOR_PUT(hdr->oui, WPA_OUI_TYPE); 42 WPA_PUT_LE16(hdr->version, WPA_VERSION); 43 pos = (u8 *) (hdr + 1); 44 45 if (conf->wpa_group == WPA_CIPHER_CCMP) { 46 RSN_SELECTOR_PUT(pos, WPA_CIPHER_SUITE_CCMP); 47 } else if (conf->wpa_group == WPA_CIPHER_TKIP) { 48 RSN_SELECTOR_PUT(pos, WPA_CIPHER_SUITE_TKIP); 49 } else if (conf->wpa_group == WPA_CIPHER_WEP104) { 50 RSN_SELECTOR_PUT(pos, WPA_CIPHER_SUITE_WEP104); 51 } else if (conf->wpa_group == WPA_CIPHER_WEP40) { 52 RSN_SELECTOR_PUT(pos, WPA_CIPHER_SUITE_WEP40); 53 } else { 54 wpa_printf(MSG_DEBUG, "Invalid group cipher (%d).", 55 conf->wpa_group); 56 return -1; 57 } 58 pos += WPA_SELECTOR_LEN; 59 60 num_suites = 0; 61 count = pos; 62 pos += 2; 63 64 if (conf->wpa_pairwise & WPA_CIPHER_CCMP) { 65 RSN_SELECTOR_PUT(pos, WPA_CIPHER_SUITE_CCMP); 66 pos += WPA_SELECTOR_LEN; 67 num_suites++; 68 } 69 if (conf->wpa_pairwise & WPA_CIPHER_TKIP) { 70 RSN_SELECTOR_PUT(pos, WPA_CIPHER_SUITE_TKIP); 71 pos += WPA_SELECTOR_LEN; 72 num_suites++; 73 } 74 if (conf->wpa_pairwise & WPA_CIPHER_NONE) { 75 RSN_SELECTOR_PUT(pos, WPA_CIPHER_SUITE_NONE); 76 pos += WPA_SELECTOR_LEN; 77 num_suites++; 78 } 79 80 if (num_suites == 0) { 81 wpa_printf(MSG_DEBUG, "Invalid pairwise cipher (%d).", 82 conf->wpa_pairwise); 83 return -1; 84 } 85 WPA_PUT_LE16(count, num_suites); 86 87 num_suites = 0; 88 count = pos; 89 pos += 2; 90 91 if (conf->wpa_key_mgmt & WPA_KEY_MGMT_IEEE8021X) { 92 RSN_SELECTOR_PUT(pos, WPA_AUTH_KEY_MGMT_UNSPEC_802_1X); 93 pos += WPA_SELECTOR_LEN; 94 num_suites++; 95 } 96 if (conf->wpa_key_mgmt & WPA_KEY_MGMT_PSK) { 97 RSN_SELECTOR_PUT(pos, WPA_AUTH_KEY_MGMT_PSK_OVER_802_1X); 98 pos += WPA_SELECTOR_LEN; 99 num_suites++; 100 } 101 102 if (num_suites == 0) { 103 wpa_printf(MSG_DEBUG, "Invalid key management type (%d).", 104 conf->wpa_key_mgmt); 105 return -1; 106 } 107 WPA_PUT_LE16(count, num_suites); 108 109 /* WPA Capabilities; use defaults, so no need to include it */ 110 111 hdr->len = (pos - buf) - 2; 112 113 return pos - buf; 114 } 115 116 117 int wpa_write_rsn_ie(struct wpa_auth_config *conf, u8 *buf, size_t len, 118 const u8 *pmkid) 119 { 120 struct rsn_ie_hdr *hdr; 121 int num_suites; 122 u8 *pos, *count; 123 u16 capab; 124 125 hdr = (struct rsn_ie_hdr *) buf; 126 hdr->elem_id = WLAN_EID_RSN; 127 WPA_PUT_LE16(hdr->version, RSN_VERSION); 128 pos = (u8 *) (hdr + 1); 129 130 if (conf->wpa_group == WPA_CIPHER_CCMP) { 131 RSN_SELECTOR_PUT(pos, RSN_CIPHER_SUITE_CCMP); 132 } else if (conf->wpa_group == WPA_CIPHER_TKIP) { 133 RSN_SELECTOR_PUT(pos, RSN_CIPHER_SUITE_TKIP); 134 } else if (conf->wpa_group == WPA_CIPHER_WEP104) { 135 RSN_SELECTOR_PUT(pos, RSN_CIPHER_SUITE_WEP104); 136 } else if (conf->wpa_group == WPA_CIPHER_WEP40) { 137 RSN_SELECTOR_PUT(pos, RSN_CIPHER_SUITE_WEP40); 138 } else { 139 wpa_printf(MSG_DEBUG, "Invalid group cipher (%d).", 140 conf->wpa_group); 141 return -1; 142 } 143 pos += RSN_SELECTOR_LEN; 144 145 num_suites = 0; 146 count = pos; 147 pos += 2; 148 149 #ifdef CONFIG_RSN_TESTING 150 if (rsn_testing) { 151 RSN_SELECTOR_PUT(pos, RSN_SELECTOR(0x12, 0x34, 0x56, 1)); 152 pos += RSN_SELECTOR_LEN; 153 num_suites++; 154 } 155 #endif /* CONFIG_RSN_TESTING */ 156 157 if (conf->rsn_pairwise & WPA_CIPHER_CCMP) { 158 RSN_SELECTOR_PUT(pos, RSN_CIPHER_SUITE_CCMP); 159 pos += RSN_SELECTOR_LEN; 160 num_suites++; 161 } 162 if (conf->rsn_pairwise & WPA_CIPHER_TKIP) { 163 RSN_SELECTOR_PUT(pos, RSN_CIPHER_SUITE_TKIP); 164 pos += RSN_SELECTOR_LEN; 165 num_suites++; 166 } 167 if (conf->rsn_pairwise & WPA_CIPHER_NONE) { 168 RSN_SELECTOR_PUT(pos, RSN_CIPHER_SUITE_NONE); 169 pos += RSN_SELECTOR_LEN; 170 num_suites++; 171 } 172 173 #ifdef CONFIG_RSN_TESTING 174 if (rsn_testing) { 175 RSN_SELECTOR_PUT(pos, RSN_SELECTOR(0x12, 0x34, 0x56, 2)); 176 pos += RSN_SELECTOR_LEN; 177 num_suites++; 178 } 179 #endif /* CONFIG_RSN_TESTING */ 180 181 if (num_suites == 0) { 182 wpa_printf(MSG_DEBUG, "Invalid pairwise cipher (%d).", 183 conf->rsn_pairwise); 184 return -1; 185 } 186 WPA_PUT_LE16(count, num_suites); 187 188 num_suites = 0; 189 count = pos; 190 pos += 2; 191 192 #ifdef CONFIG_RSN_TESTING 193 if (rsn_testing) { 194 RSN_SELECTOR_PUT(pos, RSN_SELECTOR(0x12, 0x34, 0x56, 1)); 195 pos += RSN_SELECTOR_LEN; 196 num_suites++; 197 } 198 #endif /* CONFIG_RSN_TESTING */ 199 200 if (conf->wpa_key_mgmt & WPA_KEY_MGMT_IEEE8021X) { 201 RSN_SELECTOR_PUT(pos, RSN_AUTH_KEY_MGMT_UNSPEC_802_1X); 202 pos += RSN_SELECTOR_LEN; 203 num_suites++; 204 } 205 if (conf->wpa_key_mgmt & WPA_KEY_MGMT_PSK) { 206 RSN_SELECTOR_PUT(pos, RSN_AUTH_KEY_MGMT_PSK_OVER_802_1X); 207 pos += RSN_SELECTOR_LEN; 208 num_suites++; 209 } 210 #ifdef CONFIG_IEEE80211R 211 if (conf->wpa_key_mgmt & WPA_KEY_MGMT_FT_IEEE8021X) { 212 RSN_SELECTOR_PUT(pos, RSN_AUTH_KEY_MGMT_FT_802_1X); 213 pos += RSN_SELECTOR_LEN; 214 num_suites++; 215 } 216 if (conf->wpa_key_mgmt & WPA_KEY_MGMT_FT_PSK) { 217 RSN_SELECTOR_PUT(pos, RSN_AUTH_KEY_MGMT_FT_PSK); 218 pos += RSN_SELECTOR_LEN; 219 num_suites++; 220 } 221 #endif /* CONFIG_IEEE80211R */ 222 #ifdef CONFIG_IEEE80211W 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 #endif /* CONFIG_IEEE80211W */ 234 235 #ifdef CONFIG_RSN_TESTING 236 if (rsn_testing) { 237 RSN_SELECTOR_PUT(pos, RSN_SELECTOR(0x12, 0x34, 0x56, 2)); 238 pos += RSN_SELECTOR_LEN; 239 num_suites++; 240 } 241 #endif /* CONFIG_RSN_TESTING */ 242 243 if (num_suites == 0) { 244 wpa_printf(MSG_DEBUG, "Invalid key management type (%d).", 245 conf->wpa_key_mgmt); 246 return -1; 247 } 248 WPA_PUT_LE16(count, num_suites); 249 250 /* RSN Capabilities */ 251 capab = 0; 252 if (conf->rsn_preauth) 253 capab |= WPA_CAPABILITY_PREAUTH; 254 if (conf->peerkey) 255 capab |= WPA_CAPABILITY_PEERKEY_ENABLED; 256 #ifdef ANDROID_BRCM_P2P_PATCH 257 /* WAR: we should make an get_wpa_rsnie_cap() to get the cap of peer supp 258 * Temporally we force tp set replay counter tp 0x3 259 * as if wmm is enable in all of supp device 260 */ 261 capab |= (RSN_NUM_REPLAY_COUNTERS_16 << 2); 262 #else 263 if (conf->wmm_enabled) { 264 /* 4 PTKSA replay counters when using WMM */ 265 capab |= (RSN_NUM_REPLAY_COUNTERS_16 << 2); 266 } 267 #endif /* ANDROID_BRCM_P2P_PATCH */ 268 269 #ifdef CONFIG_IEEE80211W 270 if (conf->ieee80211w != NO_MGMT_FRAME_PROTECTION) { 271 capab |= WPA_CAPABILITY_MFPC; 272 if (conf->ieee80211w == MGMT_FRAME_PROTECTION_REQUIRED) 273 capab |= WPA_CAPABILITY_MFPR; 274 } 275 #endif /* CONFIG_IEEE80211W */ 276 #ifdef CONFIG_RSN_TESTING 277 if (rsn_testing) 278 capab |= BIT(8) | BIT(14) | BIT(15); 279 #endif /* CONFIG_RSN_TESTING */ 280 WPA_PUT_LE16(pos, capab); 281 pos += 2; 282 283 if (pmkid) { 284 if (pos + 2 + PMKID_LEN > buf + len) 285 return -1; 286 /* PMKID Count */ 287 WPA_PUT_LE16(pos, 1); 288 pos += 2; 289 os_memcpy(pos, pmkid, PMKID_LEN); 290 pos += PMKID_LEN; 291 } 292 293 #ifdef CONFIG_IEEE80211W 294 if (conf->ieee80211w != NO_MGMT_FRAME_PROTECTION) { 295 if (pos + 2 + 4 > buf + len) 296 return -1; 297 if (pmkid == NULL) { 298 /* PMKID Count */ 299 WPA_PUT_LE16(pos, 0); 300 pos += 2; 301 } 302 303 /* Management Group Cipher Suite */ 304 RSN_SELECTOR_PUT(pos, RSN_CIPHER_SUITE_AES_128_CMAC); 305 pos += RSN_SELECTOR_LEN; 306 } 307 #endif /* CONFIG_IEEE80211W */ 308 309 #ifdef CONFIG_RSN_TESTING 310 if (rsn_testing) { 311 /* 312 * Fill in any defined fields and add extra data to the end of 313 * the element. 314 */ 315 int pmkid_count_set = pmkid != NULL; 316 if (conf->ieee80211w != NO_MGMT_FRAME_PROTECTION) 317 pmkid_count_set = 1; 318 /* PMKID Count */ 319 WPA_PUT_LE16(pos, 0); 320 pos += 2; 321 if (conf->ieee80211w == NO_MGMT_FRAME_PROTECTION) { 322 /* Management Group Cipher Suite */ 323 RSN_SELECTOR_PUT(pos, RSN_CIPHER_SUITE_AES_128_CMAC); 324 pos += RSN_SELECTOR_LEN; 325 } 326 327 os_memset(pos, 0x12, 17); 328 pos += 17; 329 } 330 #endif /* CONFIG_RSN_TESTING */ 331 332 hdr->len = (pos - buf) - 2; 333 334 return pos - buf; 335 } 336 337 338 int wpa_auth_gen_wpa_ie(struct wpa_authenticator *wpa_auth) 339 { 340 u8 *pos, buf[128]; 341 int res; 342 343 pos = buf; 344 345 if (wpa_auth->conf.wpa & WPA_PROTO_RSN) { 346 res = wpa_write_rsn_ie(&wpa_auth->conf, 347 pos, buf + sizeof(buf) - pos, NULL); 348 if (res < 0) 349 return res; 350 pos += res; 351 } 352 #ifdef CONFIG_IEEE80211R 353 if (wpa_auth->conf.wpa_key_mgmt & 354 (WPA_KEY_MGMT_FT_IEEE8021X | WPA_KEY_MGMT_FT_PSK)) { 355 res = wpa_write_mdie(&wpa_auth->conf, pos, 356 buf + sizeof(buf) - pos); 357 if (res < 0) 358 return res; 359 pos += res; 360 } 361 #endif /* CONFIG_IEEE80211R */ 362 if (wpa_auth->conf.wpa & WPA_PROTO_WPA) { 363 res = wpa_write_wpa_ie(&wpa_auth->conf, 364 pos, buf + sizeof(buf) - pos); 365 if (res < 0) 366 return res; 367 pos += res; 368 } 369 370 os_free(wpa_auth->wpa_ie); 371 wpa_auth->wpa_ie = os_malloc(pos - buf); 372 if (wpa_auth->wpa_ie == NULL) 373 return -1; 374 os_memcpy(wpa_auth->wpa_ie, buf, pos - buf); 375 wpa_auth->wpa_ie_len = pos - buf; 376 377 return 0; 378 } 379 380 381 u8 * wpa_add_kde(u8 *pos, u32 kde, const u8 *data, size_t data_len, 382 const u8 *data2, size_t data2_len) 383 { 384 *pos++ = WLAN_EID_VENDOR_SPECIFIC; 385 *pos++ = RSN_SELECTOR_LEN + data_len + data2_len; 386 RSN_SELECTOR_PUT(pos, kde); 387 pos += RSN_SELECTOR_LEN; 388 os_memcpy(pos, data, data_len); 389 pos += data_len; 390 if (data2) { 391 os_memcpy(pos, data2, data2_len); 392 pos += data2_len; 393 } 394 return pos; 395 } 396 397 398 struct wpa_auth_okc_iter_data { 399 struct rsn_pmksa_cache_entry *pmksa; 400 const u8 *aa; 401 const u8 *spa; 402 const u8 *pmkid; 403 }; 404 405 406 static int wpa_auth_okc_iter(struct wpa_authenticator *a, void *ctx) 407 { 408 struct wpa_auth_okc_iter_data *data = ctx; 409 data->pmksa = pmksa_cache_get_okc(a->pmksa, data->aa, data->spa, 410 data->pmkid); 411 if (data->pmksa) 412 return 1; 413 return 0; 414 } 415 416 417 int wpa_validate_wpa_ie(struct wpa_authenticator *wpa_auth, 418 struct wpa_state_machine *sm, 419 const u8 *wpa_ie, size_t wpa_ie_len, 420 const u8 *mdie, size_t mdie_len) 421 { 422 struct wpa_ie_data data; 423 int ciphers, key_mgmt, res, version; 424 u32 selector; 425 size_t i; 426 const u8 *pmkid = NULL; 427 428 if (wpa_auth == NULL || sm == NULL) 429 return WPA_NOT_ENABLED; 430 431 if (wpa_ie == NULL || wpa_ie_len < 1) 432 return WPA_INVALID_IE; 433 434 if (wpa_ie[0] == WLAN_EID_RSN) 435 version = WPA_PROTO_RSN; 436 else 437 version = WPA_PROTO_WPA; 438 439 if (!(wpa_auth->conf.wpa & version)) { 440 wpa_printf(MSG_DEBUG, "Invalid WPA proto (%d) from " MACSTR, 441 version, MAC2STR(sm->addr)); 442 return WPA_INVALID_PROTO; 443 } 444 445 if (version == WPA_PROTO_RSN) { 446 res = wpa_parse_wpa_ie_rsn(wpa_ie, wpa_ie_len, &data); 447 448 selector = RSN_AUTH_KEY_MGMT_UNSPEC_802_1X; 449 if (0) { 450 } 451 #ifdef CONFIG_IEEE80211R 452 else if (data.key_mgmt & WPA_KEY_MGMT_FT_IEEE8021X) 453 selector = RSN_AUTH_KEY_MGMT_FT_802_1X; 454 else if (data.key_mgmt & WPA_KEY_MGMT_FT_PSK) 455 selector = RSN_AUTH_KEY_MGMT_FT_PSK; 456 #endif /* CONFIG_IEEE80211R */ 457 #ifdef CONFIG_IEEE80211W 458 else if (data.key_mgmt & WPA_KEY_MGMT_IEEE8021X_SHA256) 459 selector = RSN_AUTH_KEY_MGMT_802_1X_SHA256; 460 else if (data.key_mgmt & WPA_KEY_MGMT_PSK_SHA256) 461 selector = RSN_AUTH_KEY_MGMT_PSK_SHA256; 462 #endif /* CONFIG_IEEE80211W */ 463 else if (data.key_mgmt & WPA_KEY_MGMT_IEEE8021X) 464 selector = RSN_AUTH_KEY_MGMT_UNSPEC_802_1X; 465 else if (data.key_mgmt & WPA_KEY_MGMT_PSK) 466 selector = RSN_AUTH_KEY_MGMT_PSK_OVER_802_1X; 467 wpa_auth->dot11RSNAAuthenticationSuiteSelected = selector; 468 469 selector = RSN_CIPHER_SUITE_CCMP; 470 if (data.pairwise_cipher & WPA_CIPHER_CCMP) 471 selector = RSN_CIPHER_SUITE_CCMP; 472 else if (data.pairwise_cipher & WPA_CIPHER_TKIP) 473 selector = RSN_CIPHER_SUITE_TKIP; 474 else if (data.pairwise_cipher & WPA_CIPHER_WEP104) 475 selector = RSN_CIPHER_SUITE_WEP104; 476 else if (data.pairwise_cipher & WPA_CIPHER_WEP40) 477 selector = RSN_CIPHER_SUITE_WEP40; 478 else if (data.pairwise_cipher & WPA_CIPHER_NONE) 479 selector = RSN_CIPHER_SUITE_NONE; 480 wpa_auth->dot11RSNAPairwiseCipherSelected = selector; 481 482 selector = RSN_CIPHER_SUITE_CCMP; 483 if (data.group_cipher & WPA_CIPHER_CCMP) 484 selector = RSN_CIPHER_SUITE_CCMP; 485 else if (data.group_cipher & WPA_CIPHER_TKIP) 486 selector = RSN_CIPHER_SUITE_TKIP; 487 else if (data.group_cipher & WPA_CIPHER_WEP104) 488 selector = RSN_CIPHER_SUITE_WEP104; 489 else if (data.group_cipher & WPA_CIPHER_WEP40) 490 selector = RSN_CIPHER_SUITE_WEP40; 491 else if (data.group_cipher & WPA_CIPHER_NONE) 492 selector = RSN_CIPHER_SUITE_NONE; 493 wpa_auth->dot11RSNAGroupCipherSelected = selector; 494 } else { 495 res = wpa_parse_wpa_ie_wpa(wpa_ie, wpa_ie_len, &data); 496 497 selector = WPA_AUTH_KEY_MGMT_UNSPEC_802_1X; 498 if (data.key_mgmt & WPA_KEY_MGMT_IEEE8021X) 499 selector = WPA_AUTH_KEY_MGMT_UNSPEC_802_1X; 500 else if (data.key_mgmt & WPA_KEY_MGMT_PSK) 501 selector = WPA_AUTH_KEY_MGMT_PSK_OVER_802_1X; 502 wpa_auth->dot11RSNAAuthenticationSuiteSelected = selector; 503 504 selector = WPA_CIPHER_SUITE_TKIP; 505 if (data.pairwise_cipher & WPA_CIPHER_CCMP) 506 selector = WPA_CIPHER_SUITE_CCMP; 507 else if (data.pairwise_cipher & WPA_CIPHER_TKIP) 508 selector = WPA_CIPHER_SUITE_TKIP; 509 else if (data.pairwise_cipher & WPA_CIPHER_WEP104) 510 selector = WPA_CIPHER_SUITE_WEP104; 511 else if (data.pairwise_cipher & WPA_CIPHER_WEP40) 512 selector = WPA_CIPHER_SUITE_WEP40; 513 else if (data.pairwise_cipher & WPA_CIPHER_NONE) 514 selector = WPA_CIPHER_SUITE_NONE; 515 wpa_auth->dot11RSNAPairwiseCipherSelected = selector; 516 517 selector = WPA_CIPHER_SUITE_TKIP; 518 if (data.group_cipher & WPA_CIPHER_CCMP) 519 selector = WPA_CIPHER_SUITE_CCMP; 520 else if (data.group_cipher & WPA_CIPHER_TKIP) 521 selector = WPA_CIPHER_SUITE_TKIP; 522 else if (data.group_cipher & WPA_CIPHER_WEP104) 523 selector = WPA_CIPHER_SUITE_WEP104; 524 else if (data.group_cipher & WPA_CIPHER_WEP40) 525 selector = WPA_CIPHER_SUITE_WEP40; 526 else if (data.group_cipher & WPA_CIPHER_NONE) 527 selector = WPA_CIPHER_SUITE_NONE; 528 wpa_auth->dot11RSNAGroupCipherSelected = selector; 529 } 530 if (res) { 531 wpa_printf(MSG_DEBUG, "Failed to parse WPA/RSN IE from " 532 MACSTR " (res=%d)", MAC2STR(sm->addr), res); 533 wpa_hexdump(MSG_DEBUG, "WPA/RSN IE", wpa_ie, wpa_ie_len); 534 return WPA_INVALID_IE; 535 } 536 537 if (data.group_cipher != wpa_auth->conf.wpa_group) { 538 wpa_printf(MSG_DEBUG, "Invalid WPA group cipher (0x%x) from " 539 MACSTR, data.group_cipher, MAC2STR(sm->addr)); 540 return WPA_INVALID_GROUP; 541 } 542 543 key_mgmt = data.key_mgmt & wpa_auth->conf.wpa_key_mgmt; 544 if (!key_mgmt) { 545 wpa_printf(MSG_DEBUG, "Invalid WPA key mgmt (0x%x) from " 546 MACSTR, data.key_mgmt, MAC2STR(sm->addr)); 547 return WPA_INVALID_AKMP; 548 } 549 if (0) { 550 } 551 #ifdef CONFIG_IEEE80211R 552 else if (key_mgmt & WPA_KEY_MGMT_FT_IEEE8021X) 553 sm->wpa_key_mgmt = WPA_KEY_MGMT_FT_IEEE8021X; 554 else if (key_mgmt & WPA_KEY_MGMT_FT_PSK) 555 sm->wpa_key_mgmt = WPA_KEY_MGMT_FT_PSK; 556 #endif /* CONFIG_IEEE80211R */ 557 #ifdef CONFIG_IEEE80211W 558 else if (key_mgmt & WPA_KEY_MGMT_IEEE8021X_SHA256) 559 sm->wpa_key_mgmt = WPA_KEY_MGMT_IEEE8021X_SHA256; 560 else if (key_mgmt & WPA_KEY_MGMT_PSK_SHA256) 561 sm->wpa_key_mgmt = WPA_KEY_MGMT_PSK_SHA256; 562 #endif /* CONFIG_IEEE80211W */ 563 else if (key_mgmt & WPA_KEY_MGMT_IEEE8021X) 564 sm->wpa_key_mgmt = WPA_KEY_MGMT_IEEE8021X; 565 else 566 sm->wpa_key_mgmt = WPA_KEY_MGMT_PSK; 567 568 if (version == WPA_PROTO_RSN) 569 ciphers = data.pairwise_cipher & wpa_auth->conf.rsn_pairwise; 570 else 571 ciphers = data.pairwise_cipher & wpa_auth->conf.wpa_pairwise; 572 if (!ciphers) { 573 wpa_printf(MSG_DEBUG, "Invalid %s pairwise cipher (0x%x) " 574 "from " MACSTR, 575 version == WPA_PROTO_RSN ? "RSN" : "WPA", 576 data.pairwise_cipher, MAC2STR(sm->addr)); 577 return WPA_INVALID_PAIRWISE; 578 } 579 580 #ifdef CONFIG_IEEE80211W 581 if (wpa_auth->conf.ieee80211w == MGMT_FRAME_PROTECTION_REQUIRED) { 582 if (!(data.capabilities & WPA_CAPABILITY_MFPC)) { 583 wpa_printf(MSG_DEBUG, "Management frame protection " 584 "required, but client did not enable it"); 585 return WPA_MGMT_FRAME_PROTECTION_VIOLATION; 586 } 587 588 if (ciphers & WPA_CIPHER_TKIP) { 589 wpa_printf(MSG_DEBUG, "Management frame protection " 590 "cannot use TKIP"); 591 return WPA_MGMT_FRAME_PROTECTION_VIOLATION; 592 } 593 594 if (data.mgmt_group_cipher != WPA_CIPHER_AES_128_CMAC) { 595 wpa_printf(MSG_DEBUG, "Unsupported management group " 596 "cipher %d", data.mgmt_group_cipher); 597 return WPA_INVALID_MGMT_GROUP_CIPHER; 598 } 599 } 600 601 if (wpa_auth->conf.ieee80211w == NO_MGMT_FRAME_PROTECTION || 602 !(data.capabilities & WPA_CAPABILITY_MFPC)) 603 sm->mgmt_frame_prot = 0; 604 else 605 sm->mgmt_frame_prot = 1; 606 #endif /* CONFIG_IEEE80211W */ 607 608 #ifdef CONFIG_IEEE80211R 609 if (wpa_key_mgmt_ft(sm->wpa_key_mgmt)) { 610 if (mdie == NULL || mdie_len < MOBILITY_DOMAIN_ID_LEN + 1) { 611 wpa_printf(MSG_DEBUG, "RSN: Trying to use FT, but " 612 "MDIE not included"); 613 return WPA_INVALID_MDIE; 614 } 615 if (os_memcmp(mdie, wpa_auth->conf.mobility_domain, 616 MOBILITY_DOMAIN_ID_LEN) != 0) { 617 wpa_hexdump(MSG_DEBUG, "RSN: Attempted to use unknown " 618 "MDIE", mdie, MOBILITY_DOMAIN_ID_LEN); 619 return WPA_INVALID_MDIE; 620 } 621 } 622 #endif /* CONFIG_IEEE80211R */ 623 624 if (ciphers & WPA_CIPHER_CCMP) 625 sm->pairwise = WPA_CIPHER_CCMP; 626 else 627 sm->pairwise = WPA_CIPHER_TKIP; 628 629 /* TODO: clear WPA/WPA2 state if STA changes from one to another */ 630 if (wpa_ie[0] == WLAN_EID_RSN) 631 sm->wpa = WPA_VERSION_WPA2; 632 else 633 sm->wpa = WPA_VERSION_WPA; 634 635 sm->pmksa = NULL; 636 for (i = 0; i < data.num_pmkid; i++) { 637 wpa_hexdump(MSG_DEBUG, "RSN IE: STA PMKID", 638 &data.pmkid[i * PMKID_LEN], PMKID_LEN); 639 sm->pmksa = pmksa_cache_auth_get(wpa_auth->pmksa, sm->addr, 640 &data.pmkid[i * PMKID_LEN]); 641 if (sm->pmksa) { 642 pmkid = sm->pmksa->pmkid; 643 break; 644 } 645 } 646 for (i = 0; sm->pmksa == NULL && wpa_auth->conf.okc && 647 i < data.num_pmkid; i++) { 648 struct wpa_auth_okc_iter_data idata; 649 idata.pmksa = NULL; 650 idata.aa = wpa_auth->addr; 651 idata.spa = sm->addr; 652 idata.pmkid = &data.pmkid[i * PMKID_LEN]; 653 wpa_auth_for_each_auth(wpa_auth, wpa_auth_okc_iter, &idata); 654 if (idata.pmksa) { 655 wpa_auth_vlogger(wpa_auth, sm->addr, LOGGER_DEBUG, 656 "OKC match for PMKID"); 657 sm->pmksa = pmksa_cache_add_okc(wpa_auth->pmksa, 658 idata.pmksa, 659 wpa_auth->addr, 660 idata.pmkid); 661 pmkid = idata.pmkid; 662 break; 663 } 664 } 665 if (sm->pmksa) { 666 wpa_auth_vlogger(wpa_auth, sm->addr, LOGGER_DEBUG, 667 "PMKID found from PMKSA cache " 668 "eap_type=%d vlan_id=%d", 669 sm->pmksa->eap_type_authsrv, 670 sm->pmksa->vlan_id); 671 os_memcpy(wpa_auth->dot11RSNAPMKIDUsed, pmkid, PMKID_LEN); 672 } 673 674 if (sm->wpa_ie == NULL || sm->wpa_ie_len < wpa_ie_len) { 675 os_free(sm->wpa_ie); 676 sm->wpa_ie = os_malloc(wpa_ie_len); 677 if (sm->wpa_ie == NULL) 678 return WPA_ALLOC_FAIL; 679 } 680 os_memcpy(sm->wpa_ie, wpa_ie, wpa_ie_len); 681 sm->wpa_ie_len = wpa_ie_len; 682 683 return WPA_IE_OK; 684 } 685 686 687 /** 688 * wpa_parse_generic - Parse EAPOL-Key Key Data Generic IEs 689 * @pos: Pointer to the IE header 690 * @end: Pointer to the end of the Key Data buffer 691 * @ie: Pointer to parsed IE data 692 * Returns: 0 on success, 1 if end mark is found, -1 on failure 693 */ 694 static int wpa_parse_generic(const u8 *pos, const u8 *end, 695 struct wpa_eapol_ie_parse *ie) 696 { 697 if (pos[1] == 0) 698 return 1; 699 700 if (pos[1] >= 6 && 701 RSN_SELECTOR_GET(pos + 2) == WPA_OUI_TYPE && 702 pos[2 + WPA_SELECTOR_LEN] == 1 && 703 pos[2 + WPA_SELECTOR_LEN + 1] == 0) { 704 ie->wpa_ie = pos; 705 ie->wpa_ie_len = pos[1] + 2; 706 return 0; 707 } 708 709 if (pos + 1 + RSN_SELECTOR_LEN < end && 710 pos[1] >= RSN_SELECTOR_LEN + PMKID_LEN && 711 RSN_SELECTOR_GET(pos + 2) == RSN_KEY_DATA_PMKID) { 712 ie->pmkid = pos + 2 + RSN_SELECTOR_LEN; 713 return 0; 714 } 715 716 if (pos[1] > RSN_SELECTOR_LEN + 2 && 717 RSN_SELECTOR_GET(pos + 2) == RSN_KEY_DATA_GROUPKEY) { 718 ie->gtk = pos + 2 + RSN_SELECTOR_LEN; 719 ie->gtk_len = pos[1] - RSN_SELECTOR_LEN; 720 return 0; 721 } 722 723 if (pos[1] > RSN_SELECTOR_LEN + 2 && 724 RSN_SELECTOR_GET(pos + 2) == RSN_KEY_DATA_MAC_ADDR) { 725 ie->mac_addr = pos + 2 + RSN_SELECTOR_LEN; 726 ie->mac_addr_len = pos[1] - RSN_SELECTOR_LEN; 727 return 0; 728 } 729 730 #ifdef CONFIG_PEERKEY 731 if (pos[1] > RSN_SELECTOR_LEN + 2 && 732 RSN_SELECTOR_GET(pos + 2) == RSN_KEY_DATA_SMK) { 733 ie->smk = pos + 2 + RSN_SELECTOR_LEN; 734 ie->smk_len = pos[1] - RSN_SELECTOR_LEN; 735 return 0; 736 } 737 738 if (pos[1] > RSN_SELECTOR_LEN + 2 && 739 RSN_SELECTOR_GET(pos + 2) == RSN_KEY_DATA_NONCE) { 740 ie->nonce = pos + 2 + RSN_SELECTOR_LEN; 741 ie->nonce_len = pos[1] - RSN_SELECTOR_LEN; 742 return 0; 743 } 744 745 if (pos[1] > RSN_SELECTOR_LEN + 2 && 746 RSN_SELECTOR_GET(pos + 2) == RSN_KEY_DATA_LIFETIME) { 747 ie->lifetime = pos + 2 + RSN_SELECTOR_LEN; 748 ie->lifetime_len = pos[1] - RSN_SELECTOR_LEN; 749 return 0; 750 } 751 752 if (pos[1] > RSN_SELECTOR_LEN + 2 && 753 RSN_SELECTOR_GET(pos + 2) == RSN_KEY_DATA_ERROR) { 754 ie->error = pos + 2 + RSN_SELECTOR_LEN; 755 ie->error_len = pos[1] - RSN_SELECTOR_LEN; 756 return 0; 757 } 758 #endif /* CONFIG_PEERKEY */ 759 760 #ifdef CONFIG_IEEE80211W 761 if (pos[1] > RSN_SELECTOR_LEN + 2 && 762 RSN_SELECTOR_GET(pos + 2) == RSN_KEY_DATA_IGTK) { 763 ie->igtk = pos + 2 + RSN_SELECTOR_LEN; 764 ie->igtk_len = pos[1] - RSN_SELECTOR_LEN; 765 return 0; 766 } 767 #endif /* CONFIG_IEEE80211W */ 768 769 return 0; 770 } 771 772 773 /** 774 * wpa_parse_kde_ies - Parse EAPOL-Key Key Data IEs 775 * @buf: Pointer to the Key Data buffer 776 * @len: Key Data Length 777 * @ie: Pointer to parsed IE data 778 * Returns: 0 on success, -1 on failure 779 */ 780 int wpa_parse_kde_ies(const u8 *buf, size_t len, struct wpa_eapol_ie_parse *ie) 781 { 782 const u8 *pos, *end; 783 int ret = 0; 784 785 os_memset(ie, 0, sizeof(*ie)); 786 for (pos = buf, end = pos + len; pos + 1 < end; pos += 2 + pos[1]) { 787 if (pos[0] == 0xdd && 788 ((pos == buf + len - 1) || pos[1] == 0)) { 789 /* Ignore padding */ 790 break; 791 } 792 if (pos + 2 + pos[1] > end) { 793 wpa_printf(MSG_DEBUG, "WPA: EAPOL-Key Key Data " 794 "underflow (ie=%d len=%d pos=%d)", 795 pos[0], pos[1], (int) (pos - buf)); 796 wpa_hexdump_key(MSG_DEBUG, "WPA: Key Data", 797 buf, len); 798 ret = -1; 799 break; 800 } 801 if (*pos == WLAN_EID_RSN) { 802 ie->rsn_ie = pos; 803 ie->rsn_ie_len = pos[1] + 2; 804 #ifdef CONFIG_IEEE80211R 805 } else if (*pos == WLAN_EID_MOBILITY_DOMAIN) { 806 ie->mdie = pos; 807 ie->mdie_len = pos[1] + 2; 808 } else if (*pos == WLAN_EID_FAST_BSS_TRANSITION) { 809 ie->ftie = pos; 810 ie->ftie_len = pos[1] + 2; 811 #endif /* CONFIG_IEEE80211R */ 812 } else if (*pos == WLAN_EID_VENDOR_SPECIFIC) { 813 ret = wpa_parse_generic(pos, end, ie); 814 if (ret < 0) 815 break; 816 if (ret > 0) { 817 ret = 0; 818 break; 819 } 820 } else { 821 wpa_hexdump(MSG_DEBUG, "WPA: Unrecognized EAPOL-Key " 822 "Key Data IE", pos, 2 + pos[1]); 823 } 824 } 825 826 return ret; 827 } 828 829 830 int wpa_auth_uses_mfp(struct wpa_state_machine *sm) 831 { 832 return sm ? sm->mgmt_frame_prot : 0; 833 } 834