2 * IEEE 802.11 RSN / WPA Authenticator
3 * Copyright (c) 2004-2015, Jouni Malinen <j@w1.fi>
5 * This software may be distributed under the terms of the BSD license.
6 * See README for more details.
9 #include "utils/includes.h"
11 #include "utils/common.h"
12 #include "utils/eloop.h"
13 #include "utils/state_machine.h"
14 #include "utils/bitfield.h"
15 #include "common/ieee802_11_defs.h"
16 #include "crypto/aes_wrap.h"
17 #include "crypto/crypto.h"
18 #include "crypto/sha1.h"
19 #include "crypto/sha256.h"
20 #include "crypto/random.h"
21 #include "eapol_auth/eapol_auth_sm.h"
22 #include "ap_config.h"
23 #include "ieee802_11.h"
25 #include "pmksa_cache_auth.h"
26 #include "wpa_auth_i.h"
27 #include "wpa_auth_ie.h"
29 #define STATE_MACHINE_DATA struct wpa_state_machine
30 #define STATE_MACHINE_DEBUG_PREFIX "WPA"
31 #define STATE_MACHINE_ADDR sm->addr
34 static void wpa_send_eapol_timeout(void *eloop_ctx, void *timeout_ctx);
35 static int wpa_sm_step(struct wpa_state_machine *sm);
36 static int wpa_verify_key_mic(int akmp, struct wpa_ptk *PTK, u8 *data,
38 static void wpa_sm_call_step(void *eloop_ctx, void *timeout_ctx);
39 static void wpa_group_sm_step(struct wpa_authenticator *wpa_auth,
40 struct wpa_group *group);
41 static void wpa_request_new_ptk(struct wpa_state_machine *sm);
42 static int wpa_gtk_update(struct wpa_authenticator *wpa_auth,
43 struct wpa_group *group);
44 static int wpa_group_config_group_keys(struct wpa_authenticator *wpa_auth,
45 struct wpa_group *group);
46 static int wpa_derive_ptk(struct wpa_state_machine *sm, const u8 *snonce,
47 const u8 *pmk, unsigned int pmk_len,
49 static void wpa_group_free(struct wpa_authenticator *wpa_auth,
50 struct wpa_group *group);
51 static void wpa_group_get(struct wpa_authenticator *wpa_auth,
52 struct wpa_group *group);
53 static void wpa_group_put(struct wpa_authenticator *wpa_auth,
54 struct wpa_group *group);
56 static const u32 dot11RSNAConfigGroupUpdateCount = 4;
57 static const u32 dot11RSNAConfigPairwiseUpdateCount = 4;
58 static const u32 eapol_key_timeout_first = 100; /* ms */
59 static const u32 eapol_key_timeout_subseq = 1000; /* ms */
60 static const u32 eapol_key_timeout_first_group = 500; /* ms */
62 /* TODO: make these configurable */
63 static const int dot11RSNAConfigPMKLifetime = 43200;
64 static const int dot11RSNAConfigPMKReauthThreshold = 70;
65 static const int dot11RSNAConfigSATimeout = 60;
68 static inline int wpa_auth_mic_failure_report(
69 struct wpa_authenticator *wpa_auth, const u8 *addr)
71 if (wpa_auth->cb.mic_failure_report)
72 return wpa_auth->cb.mic_failure_report(wpa_auth->cb.ctx, addr);
77 static inline void wpa_auth_psk_failure_report(
78 struct wpa_authenticator *wpa_auth, const u8 *addr)
80 if (wpa_auth->cb.psk_failure_report)
81 wpa_auth->cb.psk_failure_report(wpa_auth->cb.ctx, addr);
85 static inline void wpa_auth_set_eapol(struct wpa_authenticator *wpa_auth,
86 const u8 *addr, wpa_eapol_variable var,
89 if (wpa_auth->cb.set_eapol)
90 wpa_auth->cb.set_eapol(wpa_auth->cb.ctx, addr, var, value);
94 static inline int wpa_auth_get_eapol(struct wpa_authenticator *wpa_auth,
95 const u8 *addr, wpa_eapol_variable var)
97 if (wpa_auth->cb.get_eapol == NULL)
99 return wpa_auth->cb.get_eapol(wpa_auth->cb.ctx, addr, var);
103 static inline const u8 * wpa_auth_get_psk(struct wpa_authenticator *wpa_auth,
105 const u8 *p2p_dev_addr,
108 if (wpa_auth->cb.get_psk == NULL)
110 return wpa_auth->cb.get_psk(wpa_auth->cb.ctx, addr, p2p_dev_addr,
115 static inline int wpa_auth_get_msk(struct wpa_authenticator *wpa_auth,
116 const u8 *addr, u8 *msk, size_t *len)
118 if (wpa_auth->cb.get_msk == NULL)
120 return wpa_auth->cb.get_msk(wpa_auth->cb.ctx, addr, msk, len);
124 static inline int wpa_auth_set_key(struct wpa_authenticator *wpa_auth,
126 enum wpa_alg alg, const u8 *addr, int idx,
127 u8 *key, size_t key_len)
129 if (wpa_auth->cb.set_key == NULL)
131 return wpa_auth->cb.set_key(wpa_auth->cb.ctx, vlan_id, alg, addr, idx,
136 static inline int wpa_auth_get_seqnum(struct wpa_authenticator *wpa_auth,
137 const u8 *addr, int idx, u8 *seq)
139 if (wpa_auth->cb.get_seqnum == NULL)
141 return wpa_auth->cb.get_seqnum(wpa_auth->cb.ctx, addr, idx, seq);
146 wpa_auth_send_eapol(struct wpa_authenticator *wpa_auth, const u8 *addr,
147 const u8 *data, size_t data_len, int encrypt)
149 if (wpa_auth->cb.send_eapol == NULL)
151 return wpa_auth->cb.send_eapol(wpa_auth->cb.ctx, addr, data, data_len,
157 static inline int wpa_auth_start_ampe(struct wpa_authenticator *wpa_auth,
160 if (wpa_auth->cb.start_ampe == NULL)
162 return wpa_auth->cb.start_ampe(wpa_auth->cb.ctx, addr);
164 #endif /* CONFIG_MESH */
167 int wpa_auth_for_each_sta(struct wpa_authenticator *wpa_auth,
168 int (*cb)(struct wpa_state_machine *sm, void *ctx),
171 if (wpa_auth->cb.for_each_sta == NULL)
173 return wpa_auth->cb.for_each_sta(wpa_auth->cb.ctx, cb, cb_ctx);
177 int wpa_auth_for_each_auth(struct wpa_authenticator *wpa_auth,
178 int (*cb)(struct wpa_authenticator *a, void *ctx),
181 if (wpa_auth->cb.for_each_auth == NULL)
183 return wpa_auth->cb.for_each_auth(wpa_auth->cb.ctx, cb, cb_ctx);
187 void wpa_auth_logger(struct wpa_authenticator *wpa_auth, const u8 *addr,
188 logger_level level, const char *txt)
190 if (wpa_auth->cb.logger == NULL)
192 wpa_auth->cb.logger(wpa_auth->cb.ctx, addr, level, txt);
196 void wpa_auth_vlogger(struct wpa_authenticator *wpa_auth, const u8 *addr,
197 logger_level level, const char *fmt, ...)
203 if (wpa_auth->cb.logger == NULL)
206 maxlen = os_strlen(fmt) + 100;
207 format = os_malloc(maxlen);
212 vsnprintf(format, maxlen, fmt, ap);
215 wpa_auth_logger(wpa_auth, addr, level, format);
221 static void wpa_sta_disconnect(struct wpa_authenticator *wpa_auth,
224 if (wpa_auth->cb.disconnect == NULL)
226 wpa_printf(MSG_DEBUG, "wpa_sta_disconnect STA " MACSTR, MAC2STR(addr));
227 wpa_auth->cb.disconnect(wpa_auth->cb.ctx, addr,
228 WLAN_REASON_PREV_AUTH_NOT_VALID);
232 static int wpa_use_aes_cmac(struct wpa_state_machine *sm)
235 #ifdef CONFIG_IEEE80211R
236 if (wpa_key_mgmt_ft(sm->wpa_key_mgmt))
238 #endif /* CONFIG_IEEE80211R */
239 #ifdef CONFIG_IEEE80211W
240 if (wpa_key_mgmt_sha256(sm->wpa_key_mgmt))
242 #endif /* CONFIG_IEEE80211W */
243 if (sm->wpa_key_mgmt == WPA_KEY_MGMT_OSEN)
249 static void wpa_rekey_gmk(void *eloop_ctx, void *timeout_ctx)
251 struct wpa_authenticator *wpa_auth = eloop_ctx;
253 if (random_get_bytes(wpa_auth->group->GMK, WPA_GMK_LEN)) {
254 wpa_printf(MSG_ERROR, "Failed to get random data for WPA "
257 wpa_auth_logger(wpa_auth, NULL, LOGGER_DEBUG, "GMK rekeyd");
258 wpa_hexdump_key(MSG_DEBUG, "GMK",
259 wpa_auth->group->GMK, WPA_GMK_LEN);
262 if (wpa_auth->conf.wpa_gmk_rekey) {
263 eloop_register_timeout(wpa_auth->conf.wpa_gmk_rekey, 0,
264 wpa_rekey_gmk, wpa_auth, NULL);
269 static void wpa_rekey_gtk(void *eloop_ctx, void *timeout_ctx)
271 struct wpa_authenticator *wpa_auth = eloop_ctx;
272 struct wpa_group *group, *next;
274 wpa_auth_logger(wpa_auth, NULL, LOGGER_DEBUG, "rekeying GTK");
275 group = wpa_auth->group;
277 wpa_group_get(wpa_auth, group);
279 group->GTKReKey = TRUE;
281 group->changed = FALSE;
282 wpa_group_sm_step(wpa_auth, group);
283 } while (group->changed);
286 wpa_group_put(wpa_auth, group);
290 if (wpa_auth->conf.wpa_group_rekey) {
291 eloop_register_timeout(wpa_auth->conf.wpa_group_rekey,
292 0, wpa_rekey_gtk, wpa_auth, NULL);
297 static void wpa_rekey_ptk(void *eloop_ctx, void *timeout_ctx)
299 struct wpa_authenticator *wpa_auth = eloop_ctx;
300 struct wpa_state_machine *sm = timeout_ctx;
302 wpa_auth_logger(wpa_auth, sm->addr, LOGGER_DEBUG, "rekeying PTK");
303 wpa_request_new_ptk(sm);
308 static int wpa_auth_pmksa_clear_cb(struct wpa_state_machine *sm, void *ctx)
310 if (sm->pmksa == ctx)
316 static void wpa_auth_pmksa_free_cb(struct rsn_pmksa_cache_entry *entry,
319 struct wpa_authenticator *wpa_auth = ctx;
320 wpa_auth_for_each_sta(wpa_auth, wpa_auth_pmksa_clear_cb, entry);
324 static int wpa_group_init_gmk_and_counter(struct wpa_authenticator *wpa_auth,
325 struct wpa_group *group)
327 u8 buf[ETH_ALEN + 8 + sizeof(unsigned long)];
331 if (random_get_bytes(group->GMK, WPA_GMK_LEN) < 0)
333 wpa_hexdump_key(MSG_DEBUG, "GMK", group->GMK, WPA_GMK_LEN);
336 * Counter = PRF-256(Random number, "Init Counter",
337 * Local MAC Address || Time)
339 os_memcpy(buf, wpa_auth->addr, ETH_ALEN);
340 wpa_get_ntp_timestamp(buf + ETH_ALEN);
341 ptr = (unsigned long) group;
342 os_memcpy(buf + ETH_ALEN + 8, &ptr, sizeof(ptr));
343 if (random_get_bytes(rkey, sizeof(rkey)) < 0)
346 if (sha1_prf(rkey, sizeof(rkey), "Init Counter", buf, sizeof(buf),
347 group->Counter, WPA_NONCE_LEN) < 0)
349 wpa_hexdump_key(MSG_DEBUG, "Key Counter",
350 group->Counter, WPA_NONCE_LEN);
356 static struct wpa_group * wpa_group_init(struct wpa_authenticator *wpa_auth,
357 int vlan_id, int delay_init)
359 struct wpa_group *group;
361 group = os_zalloc(sizeof(struct wpa_group));
365 group->GTKAuthenticator = TRUE;
366 group->vlan_id = vlan_id;
367 group->GTK_len = wpa_cipher_key_len(wpa_auth->conf.wpa_group);
369 if (random_pool_ready() != 1) {
370 wpa_printf(MSG_INFO, "WPA: Not enough entropy in random pool "
371 "for secure operations - update keys later when "
372 "the first station connects");
376 * Set initial GMK/Counter value here. The actual values that will be
377 * used in negotiations will be set once the first station tries to
378 * connect. This allows more time for collecting additional randomness
379 * on embedded devices.
381 if (wpa_group_init_gmk_and_counter(wpa_auth, group) < 0) {
382 wpa_printf(MSG_ERROR, "Failed to get random data for WPA "
390 wpa_printf(MSG_DEBUG, "WPA: Delay group state machine start "
391 "until Beacon frames have been configured");
392 /* Initialization is completed in wpa_init_keys(). */
394 wpa_group_sm_step(wpa_auth, group);
395 group->GInit = FALSE;
396 wpa_group_sm_step(wpa_auth, group);
404 * wpa_init - Initialize WPA authenticator
405 * @addr: Authenticator address
406 * @conf: Configuration for WPA authenticator
407 * @cb: Callback functions for WPA authenticator
408 * Returns: Pointer to WPA authenticator data or %NULL on failure
410 struct wpa_authenticator * wpa_init(const u8 *addr,
411 struct wpa_auth_config *conf,
412 struct wpa_auth_callbacks *cb)
414 struct wpa_authenticator *wpa_auth;
416 wpa_auth = os_zalloc(sizeof(struct wpa_authenticator));
417 if (wpa_auth == NULL)
419 os_memcpy(wpa_auth->addr, addr, ETH_ALEN);
420 os_memcpy(&wpa_auth->conf, conf, sizeof(*conf));
421 os_memcpy(&wpa_auth->cb, cb, sizeof(*cb));
423 if (wpa_auth_gen_wpa_ie(wpa_auth)) {
424 wpa_printf(MSG_ERROR, "Could not generate WPA IE.");
429 wpa_auth->group = wpa_group_init(wpa_auth, 0, 1);
430 if (wpa_auth->group == NULL) {
431 os_free(wpa_auth->wpa_ie);
436 wpa_auth->pmksa = pmksa_cache_auth_init(wpa_auth_pmksa_free_cb,
438 if (wpa_auth->pmksa == NULL) {
439 wpa_printf(MSG_ERROR, "PMKSA cache initialization failed.");
440 os_free(wpa_auth->group);
441 os_free(wpa_auth->wpa_ie);
446 #ifdef CONFIG_IEEE80211R
447 wpa_auth->ft_pmk_cache = wpa_ft_pmk_cache_init();
448 if (wpa_auth->ft_pmk_cache == NULL) {
449 wpa_printf(MSG_ERROR, "FT PMK cache initialization failed.");
450 os_free(wpa_auth->group);
451 os_free(wpa_auth->wpa_ie);
452 pmksa_cache_auth_deinit(wpa_auth->pmksa);
456 #endif /* CONFIG_IEEE80211R */
458 if (wpa_auth->conf.wpa_gmk_rekey) {
459 eloop_register_timeout(wpa_auth->conf.wpa_gmk_rekey, 0,
460 wpa_rekey_gmk, wpa_auth, NULL);
463 if (wpa_auth->conf.wpa_group_rekey) {
464 eloop_register_timeout(wpa_auth->conf.wpa_group_rekey, 0,
465 wpa_rekey_gtk, wpa_auth, NULL);
469 if (WPA_GET_BE32(conf->ip_addr_start)) {
470 int count = WPA_GET_BE32(conf->ip_addr_end) -
471 WPA_GET_BE32(conf->ip_addr_start) + 1;
475 wpa_auth->ip_pool = bitfield_alloc(count);
477 #endif /* CONFIG_P2P */
483 int wpa_init_keys(struct wpa_authenticator *wpa_auth)
485 struct wpa_group *group = wpa_auth->group;
487 wpa_printf(MSG_DEBUG, "WPA: Start group state machine to set initial "
489 wpa_group_sm_step(wpa_auth, group);
490 group->GInit = FALSE;
491 wpa_group_sm_step(wpa_auth, group);
492 if (group->wpa_group_state == WPA_GROUP_FATAL_FAILURE)
499 * wpa_deinit - Deinitialize WPA authenticator
500 * @wpa_auth: Pointer to WPA authenticator data from wpa_init()
502 void wpa_deinit(struct wpa_authenticator *wpa_auth)
504 struct wpa_group *group, *prev;
506 eloop_cancel_timeout(wpa_rekey_gmk, wpa_auth, NULL);
507 eloop_cancel_timeout(wpa_rekey_gtk, wpa_auth, NULL);
509 #ifdef CONFIG_PEERKEY
510 while (wpa_auth->stsl_negotiations)
511 wpa_stsl_remove(wpa_auth, wpa_auth->stsl_negotiations);
512 #endif /* CONFIG_PEERKEY */
514 pmksa_cache_auth_deinit(wpa_auth->pmksa);
516 #ifdef CONFIG_IEEE80211R
517 wpa_ft_pmk_cache_deinit(wpa_auth->ft_pmk_cache);
518 wpa_auth->ft_pmk_cache = NULL;
519 #endif /* CONFIG_IEEE80211R */
522 bitfield_free(wpa_auth->ip_pool);
523 #endif /* CONFIG_P2P */
526 os_free(wpa_auth->wpa_ie);
528 group = wpa_auth->group;
540 * wpa_reconfig - Update WPA authenticator configuration
541 * @wpa_auth: Pointer to WPA authenticator data from wpa_init()
542 * @conf: Configuration for WPA authenticator
544 int wpa_reconfig(struct wpa_authenticator *wpa_auth,
545 struct wpa_auth_config *conf)
547 struct wpa_group *group;
548 if (wpa_auth == NULL)
551 os_memcpy(&wpa_auth->conf, conf, sizeof(*conf));
552 if (wpa_auth_gen_wpa_ie(wpa_auth)) {
553 wpa_printf(MSG_ERROR, "Could not generate WPA IE.");
558 * Reinitialize GTK to make sure it is suitable for the new
561 group = wpa_auth->group;
562 group->GTK_len = wpa_cipher_key_len(wpa_auth->conf.wpa_group);
564 wpa_group_sm_step(wpa_auth, group);
565 group->GInit = FALSE;
566 wpa_group_sm_step(wpa_auth, group);
572 struct wpa_state_machine *
573 wpa_auth_sta_init(struct wpa_authenticator *wpa_auth, const u8 *addr,
574 const u8 *p2p_dev_addr)
576 struct wpa_state_machine *sm;
578 if (wpa_auth->group->wpa_group_state == WPA_GROUP_FATAL_FAILURE)
581 sm = os_zalloc(sizeof(struct wpa_state_machine));
584 os_memcpy(sm->addr, addr, ETH_ALEN);
586 os_memcpy(sm->p2p_dev_addr, p2p_dev_addr, ETH_ALEN);
588 sm->wpa_auth = wpa_auth;
589 sm->group = wpa_auth->group;
590 wpa_group_get(sm->wpa_auth, sm->group);
596 int wpa_auth_sta_associated(struct wpa_authenticator *wpa_auth,
597 struct wpa_state_machine *sm)
599 if (wpa_auth == NULL || !wpa_auth->conf.wpa || sm == NULL)
602 #ifdef CONFIG_IEEE80211R
603 if (sm->ft_completed) {
604 wpa_auth_logger(wpa_auth, sm->addr, LOGGER_DEBUG,
605 "FT authentication already completed - do not "
606 "start 4-way handshake");
607 /* Go to PTKINITDONE state to allow GTK rekeying */
608 sm->wpa_ptk_state = WPA_PTK_PTKINITDONE;
611 #endif /* CONFIG_IEEE80211R */
614 os_memset(&sm->key_replay, 0, sizeof(sm->key_replay));
615 sm->ReAuthenticationRequest = TRUE;
616 return wpa_sm_step(sm);
619 wpa_auth_logger(wpa_auth, sm->addr, LOGGER_DEBUG,
620 "start authentication");
624 if (wpa_sm_step(sm) == 1)
625 return 1; /* should not really happen */
627 sm->AuthenticationRequest = TRUE;
628 return wpa_sm_step(sm);
632 void wpa_auth_sta_no_wpa(struct wpa_state_machine *sm)
634 /* WPA/RSN was not used - clear WPA state. This is needed if the STA
635 * reassociates back to the same AP while the previous entry for the
636 * STA has not yet been removed. */
640 sm->wpa_key_mgmt = 0;
644 static void wpa_free_sta_sm(struct wpa_state_machine *sm)
647 if (WPA_GET_BE32(sm->ip_addr)) {
649 wpa_printf(MSG_DEBUG, "P2P: Free assigned IP "
650 "address %u.%u.%u.%u from " MACSTR,
651 sm->ip_addr[0], sm->ip_addr[1],
652 sm->ip_addr[2], sm->ip_addr[3],
654 start = WPA_GET_BE32(sm->wpa_auth->conf.ip_addr_start);
655 bitfield_clear(sm->wpa_auth->ip_pool,
656 WPA_GET_BE32(sm->ip_addr) - start);
658 #endif /* CONFIG_P2P */
659 if (sm->GUpdateStationKeys) {
660 sm->group->GKeyDoneStations--;
661 sm->GUpdateStationKeys = FALSE;
663 #ifdef CONFIG_IEEE80211R
664 os_free(sm->assoc_resp_ftie);
665 wpabuf_free(sm->ft_pending_req_ies);
666 #endif /* CONFIG_IEEE80211R */
667 os_free(sm->last_rx_eapol_key);
669 wpa_group_put(sm->wpa_auth, sm->group);
674 void wpa_auth_sta_deinit(struct wpa_state_machine *sm)
679 if (sm->wpa_auth->conf.wpa_strict_rekey && sm->has_GTK) {
680 wpa_auth_logger(sm->wpa_auth, sm->addr, LOGGER_DEBUG,
681 "strict rekeying - force GTK rekey since STA "
683 eloop_cancel_timeout(wpa_rekey_gtk, sm->wpa_auth, NULL);
684 eloop_register_timeout(0, 500000, wpa_rekey_gtk, sm->wpa_auth,
688 eloop_cancel_timeout(wpa_send_eapol_timeout, sm->wpa_auth, sm);
689 sm->pending_1_of_4_timeout = 0;
690 eloop_cancel_timeout(wpa_sm_call_step, sm, NULL);
691 eloop_cancel_timeout(wpa_rekey_ptk, sm->wpa_auth, sm);
692 if (sm->in_step_loop) {
693 /* Must not free state machine while wpa_sm_step() is running.
694 * Freeing will be completed in the end of wpa_sm_step(). */
695 wpa_printf(MSG_DEBUG, "WPA: Registering pending STA state "
696 "machine deinit for " MACSTR, MAC2STR(sm->addr));
697 sm->pending_deinit = 1;
703 static void wpa_request_new_ptk(struct wpa_state_machine *sm)
708 sm->PTKRequest = TRUE;
713 static int wpa_replay_counter_valid(struct wpa_key_replay_counter *ctr,
714 const u8 *replay_counter)
717 for (i = 0; i < RSNA_MAX_EAPOL_RETRIES; i++) {
720 if (os_memcmp(replay_counter, ctr[i].counter,
721 WPA_REPLAY_COUNTER_LEN) == 0)
728 static void wpa_replay_counter_mark_invalid(struct wpa_key_replay_counter *ctr,
729 const u8 *replay_counter)
732 for (i = 0; i < RSNA_MAX_EAPOL_RETRIES; i++) {
734 (replay_counter == NULL ||
735 os_memcmp(replay_counter, ctr[i].counter,
736 WPA_REPLAY_COUNTER_LEN) == 0))
737 ctr[i].valid = FALSE;
742 #ifdef CONFIG_IEEE80211R
743 static int ft_check_msg_2_of_4(struct wpa_authenticator *wpa_auth,
744 struct wpa_state_machine *sm,
745 struct wpa_eapol_ie_parse *kde)
747 struct wpa_ie_data ie;
748 struct rsn_mdie *mdie;
750 if (wpa_parse_wpa_ie_rsn(kde->rsn_ie, kde->rsn_ie_len, &ie) < 0 ||
751 ie.num_pmkid != 1 || ie.pmkid == NULL) {
752 wpa_printf(MSG_DEBUG, "FT: No PMKR1Name in "
753 "FT 4-way handshake message 2/4");
757 os_memcpy(sm->sup_pmk_r1_name, ie.pmkid, PMKID_LEN);
758 wpa_hexdump(MSG_DEBUG, "FT: PMKR1Name from Supplicant",
759 sm->sup_pmk_r1_name, PMKID_LEN);
761 if (!kde->mdie || !kde->ftie) {
762 wpa_printf(MSG_DEBUG, "FT: No %s in FT 4-way handshake "
763 "message 2/4", kde->mdie ? "FTIE" : "MDIE");
767 mdie = (struct rsn_mdie *) (kde->mdie + 2);
768 if (kde->mdie[1] < sizeof(struct rsn_mdie) ||
769 os_memcmp(wpa_auth->conf.mobility_domain, mdie->mobility_domain,
770 MOBILITY_DOMAIN_ID_LEN) != 0) {
771 wpa_printf(MSG_DEBUG, "FT: MDIE mismatch");
775 if (sm->assoc_resp_ftie &&
776 (kde->ftie[1] != sm->assoc_resp_ftie[1] ||
777 os_memcmp(kde->ftie, sm->assoc_resp_ftie,
778 2 + sm->assoc_resp_ftie[1]) != 0)) {
779 wpa_printf(MSG_DEBUG, "FT: FTIE mismatch");
780 wpa_hexdump(MSG_DEBUG, "FT: FTIE in EAPOL-Key msg 2/4",
781 kde->ftie, kde->ftie_len);
782 wpa_hexdump(MSG_DEBUG, "FT: FTIE in (Re)AssocResp",
783 sm->assoc_resp_ftie, 2 + sm->assoc_resp_ftie[1]);
789 #endif /* CONFIG_IEEE80211R */
792 static int wpa_receive_error_report(struct wpa_authenticator *wpa_auth,
793 struct wpa_state_machine *sm, int group)
795 /* Supplicant reported a Michael MIC error */
796 wpa_auth_vlogger(wpa_auth, sm->addr, LOGGER_INFO,
797 "received EAPOL-Key Error Request "
798 "(STA detected Michael MIC failure (group=%d))",
801 if (group && wpa_auth->conf.wpa_group != WPA_CIPHER_TKIP) {
802 wpa_auth_logger(wpa_auth, sm->addr, LOGGER_INFO,
803 "ignore Michael MIC failure report since "
804 "group cipher is not TKIP");
805 } else if (!group && sm->pairwise != WPA_CIPHER_TKIP) {
806 wpa_auth_logger(wpa_auth, sm->addr, LOGGER_INFO,
807 "ignore Michael MIC failure report since "
808 "pairwise cipher is not TKIP");
810 if (wpa_auth_mic_failure_report(wpa_auth, sm->addr) > 0)
811 return 1; /* STA entry was removed */
812 sm->dot11RSNAStatsTKIPRemoteMICFailures++;
813 wpa_auth->dot11RSNAStatsTKIPRemoteMICFailures++;
817 * Error report is not a request for a new key handshake, but since
818 * Authenticator may do it, let's change the keys now anyway.
820 wpa_request_new_ptk(sm);
825 static int wpa_try_alt_snonce(struct wpa_state_machine *sm, u8 *data,
830 const u8 *pmk = NULL;
831 unsigned int pmk_len;
834 if (wpa_key_mgmt_wpa_psk(sm->wpa_key_mgmt)) {
835 pmk = wpa_auth_get_psk(sm->wpa_auth, sm->addr,
836 sm->p2p_dev_addr, pmk);
842 pmk_len = sm->pmk_len;
845 wpa_derive_ptk(sm, sm->alt_SNonce, pmk, pmk_len, &PTK);
847 if (wpa_verify_key_mic(sm->wpa_key_mgmt, &PTK, data, data_len)
853 if (!wpa_key_mgmt_wpa_psk(sm->wpa_key_mgmt))
858 wpa_printf(MSG_DEBUG,
859 "WPA: Earlier SNonce did not result in matching MIC");
863 wpa_printf(MSG_DEBUG,
864 "WPA: Earlier SNonce resulted in matching MIC");
865 sm->alt_snonce_valid = 0;
866 os_memcpy(sm->SNonce, sm->alt_SNonce, WPA_NONCE_LEN);
867 os_memcpy(&sm->PTK, &PTK, sizeof(PTK));
868 sm->PTK_valid = TRUE;
874 void wpa_receive(struct wpa_authenticator *wpa_auth,
875 struct wpa_state_machine *sm,
876 u8 *data, size_t data_len)
878 struct ieee802_1x_hdr *hdr;
879 struct wpa_eapol_key *key;
880 struct wpa_eapol_key_192 *key192;
881 u16 key_info, key_data_length;
882 enum { PAIRWISE_2, PAIRWISE_4, GROUP_2, REQUEST,
883 SMK_M1, SMK_M3, SMK_ERROR } msg;
885 struct wpa_eapol_ie_parse kde;
887 const u8 *eapol_key_ie, *key_data;
888 size_t eapol_key_ie_len, keyhdrlen, mic_len;
890 if (wpa_auth == NULL || !wpa_auth->conf.wpa || sm == NULL)
893 mic_len = wpa_mic_len(sm->wpa_key_mgmt);
894 keyhdrlen = mic_len == 24 ? sizeof(*key192) : sizeof(*key);
896 if (data_len < sizeof(*hdr) + keyhdrlen)
899 hdr = (struct ieee802_1x_hdr *) data;
900 key = (struct wpa_eapol_key *) (hdr + 1);
901 key192 = (struct wpa_eapol_key_192 *) (hdr + 1);
902 key_info = WPA_GET_BE16(key->key_info);
904 key_data = (const u8 *) (key192 + 1);
905 key_data_length = WPA_GET_BE16(key192->key_data_length);
907 key_data = (const u8 *) (key + 1);
908 key_data_length = WPA_GET_BE16(key->key_data_length);
910 wpa_printf(MSG_DEBUG, "WPA: Received EAPOL-Key from " MACSTR
911 " key_info=0x%x type=%u key_data_length=%u",
912 MAC2STR(sm->addr), key_info, key->type, key_data_length);
913 if (key_data_length > data_len - sizeof(*hdr) - keyhdrlen) {
914 wpa_printf(MSG_INFO, "WPA: Invalid EAPOL-Key frame - "
915 "key_data overflow (%d > %lu)",
917 (unsigned long) (data_len - sizeof(*hdr) -
922 if (sm->wpa == WPA_VERSION_WPA2) {
923 if (key->type == EAPOL_KEY_TYPE_WPA) {
925 * Some deployed station implementations seem to send
926 * msg 4/4 with incorrect type value in WPA2 mode.
928 wpa_printf(MSG_DEBUG, "Workaround: Allow EAPOL-Key "
929 "with unexpected WPA type in RSN mode");
930 } else if (key->type != EAPOL_KEY_TYPE_RSN) {
931 wpa_printf(MSG_DEBUG, "Ignore EAPOL-Key with "
932 "unexpected type %d in RSN mode",
937 if (key->type != EAPOL_KEY_TYPE_WPA) {
938 wpa_printf(MSG_DEBUG, "Ignore EAPOL-Key with "
939 "unexpected type %d in WPA mode",
945 wpa_hexdump(MSG_DEBUG, "WPA: Received Key Nonce", key->key_nonce,
947 wpa_hexdump(MSG_DEBUG, "WPA: Received Replay Counter",
948 key->replay_counter, WPA_REPLAY_COUNTER_LEN);
950 /* FIX: verify that the EAPOL-Key frame was encrypted if pairwise keys
953 if ((key_info & (WPA_KEY_INFO_SMK_MESSAGE | WPA_KEY_INFO_REQUEST)) ==
954 (WPA_KEY_INFO_SMK_MESSAGE | WPA_KEY_INFO_REQUEST)) {
955 if (key_info & WPA_KEY_INFO_ERROR) {
957 msgtxt = "SMK Error";
962 } else if (key_info & WPA_KEY_INFO_SMK_MESSAGE) {
965 } else if (key_info & WPA_KEY_INFO_REQUEST) {
968 } else if (!(key_info & WPA_KEY_INFO_KEY_TYPE)) {
970 msgtxt = "2/2 Group";
971 } else if (key_data_length == 0) {
973 msgtxt = "4/4 Pairwise";
976 msgtxt = "2/4 Pairwise";
979 /* TODO: key_info type validation for PeerKey */
980 if (msg == REQUEST || msg == PAIRWISE_2 || msg == PAIRWISE_4 ||
982 u16 ver = key_info & WPA_KEY_INFO_TYPE_MASK;
983 if (sm->pairwise == WPA_CIPHER_CCMP ||
984 sm->pairwise == WPA_CIPHER_GCMP) {
985 if (wpa_use_aes_cmac(sm) &&
986 sm->wpa_key_mgmt != WPA_KEY_MGMT_OSEN &&
987 !wpa_key_mgmt_suite_b(sm->wpa_key_mgmt) &&
988 ver != WPA_KEY_INFO_TYPE_AES_128_CMAC) {
989 wpa_auth_logger(wpa_auth, sm->addr,
991 "advertised support for "
992 "AES-128-CMAC, but did not "
997 if (!wpa_use_aes_cmac(sm) &&
998 ver != WPA_KEY_INFO_TYPE_HMAC_SHA1_AES) {
999 wpa_auth_logger(wpa_auth, sm->addr,
1001 "did not use HMAC-SHA1-AES "
1007 if (wpa_key_mgmt_suite_b(sm->wpa_key_mgmt) &&
1008 ver != WPA_KEY_INFO_TYPE_AKM_DEFINED) {
1009 wpa_auth_logger(wpa_auth, sm->addr, LOGGER_WARNING,
1010 "did not use EAPOL-Key descriptor version 0 as required for AKM-defined cases");
1015 if (key_info & WPA_KEY_INFO_REQUEST) {
1016 if (sm->req_replay_counter_used &&
1017 os_memcmp(key->replay_counter, sm->req_replay_counter,
1018 WPA_REPLAY_COUNTER_LEN) <= 0) {
1019 wpa_auth_logger(wpa_auth, sm->addr, LOGGER_WARNING,
1020 "received EAPOL-Key request with "
1021 "replayed counter");
1026 if (!(key_info & WPA_KEY_INFO_REQUEST) &&
1027 !wpa_replay_counter_valid(sm->key_replay, key->replay_counter)) {
1030 if (msg == PAIRWISE_2 &&
1031 wpa_replay_counter_valid(sm->prev_key_replay,
1032 key->replay_counter) &&
1033 sm->wpa_ptk_state == WPA_PTK_PTKINITNEGOTIATING &&
1034 os_memcmp(sm->SNonce, key->key_nonce, WPA_NONCE_LEN) != 0)
1037 * Some supplicant implementations (e.g., Windows XP
1038 * WZC) update SNonce for each EAPOL-Key 2/4. This
1039 * breaks the workaround on accepting any of the
1040 * pending requests, so allow the SNonce to be updated
1041 * even if we have already sent out EAPOL-Key 3/4.
1043 wpa_auth_vlogger(wpa_auth, sm->addr, LOGGER_DEBUG,
1044 "Process SNonce update from STA "
1045 "based on retransmitted EAPOL-Key "
1047 sm->update_snonce = 1;
1048 os_memcpy(sm->alt_SNonce, sm->SNonce, WPA_NONCE_LEN);
1049 sm->alt_snonce_valid = TRUE;
1050 os_memcpy(sm->alt_replay_counter,
1051 sm->key_replay[0].counter,
1052 WPA_REPLAY_COUNTER_LEN);
1053 goto continue_processing;
1056 if (msg == PAIRWISE_4 && sm->alt_snonce_valid &&
1057 sm->wpa_ptk_state == WPA_PTK_PTKINITNEGOTIATING &&
1058 os_memcmp(key->replay_counter, sm->alt_replay_counter,
1059 WPA_REPLAY_COUNTER_LEN) == 0) {
1061 * Supplicant may still be using the old SNonce since
1062 * there was two EAPOL-Key 2/4 messages and they had
1063 * different SNonce values.
1065 wpa_auth_vlogger(wpa_auth, sm->addr, LOGGER_DEBUG,
1066 "Try to process received EAPOL-Key 4/4 based on old Replay Counter and SNonce from an earlier EAPOL-Key 1/4");
1067 goto continue_processing;
1070 if (msg == PAIRWISE_2 &&
1071 wpa_replay_counter_valid(sm->prev_key_replay,
1072 key->replay_counter) &&
1073 sm->wpa_ptk_state == WPA_PTK_PTKINITNEGOTIATING) {
1074 wpa_auth_vlogger(wpa_auth, sm->addr, LOGGER_DEBUG,
1075 "ignore retransmitted EAPOL-Key %s - "
1076 "SNonce did not change", msgtxt);
1078 wpa_auth_vlogger(wpa_auth, sm->addr, LOGGER_DEBUG,
1079 "received EAPOL-Key %s with "
1080 "unexpected replay counter", msgtxt);
1082 for (i = 0; i < RSNA_MAX_EAPOL_RETRIES; i++) {
1083 if (!sm->key_replay[i].valid)
1085 wpa_hexdump(MSG_DEBUG, "pending replay counter",
1086 sm->key_replay[i].counter,
1087 WPA_REPLAY_COUNTER_LEN);
1089 wpa_hexdump(MSG_DEBUG, "received replay counter",
1090 key->replay_counter, WPA_REPLAY_COUNTER_LEN);
1094 continue_processing:
1097 if (sm->wpa_ptk_state != WPA_PTK_PTKSTART &&
1098 sm->wpa_ptk_state != WPA_PTK_PTKCALCNEGOTIATING &&
1099 (!sm->update_snonce ||
1100 sm->wpa_ptk_state != WPA_PTK_PTKINITNEGOTIATING)) {
1101 wpa_auth_vlogger(wpa_auth, sm->addr, LOGGER_INFO,
1102 "received EAPOL-Key msg 2/4 in "
1103 "invalid state (%d) - dropped",
1107 random_add_randomness(key->key_nonce, WPA_NONCE_LEN);
1108 if (sm->group->reject_4way_hs_for_entropy) {
1110 * The system did not have enough entropy to generate
1111 * strong random numbers. Reject the first 4-way
1112 * handshake(s) and collect some entropy based on the
1113 * information from it. Once enough entropy is
1114 * available, the next atempt will trigger GMK/Key
1115 * Counter update and the station will be allowed to
1118 wpa_printf(MSG_DEBUG, "WPA: Reject 4-way handshake to "
1119 "collect more entropy for random number "
1121 random_mark_pool_ready();
1122 wpa_sta_disconnect(wpa_auth, sm->addr);
1125 if (wpa_parse_kde_ies(key_data, key_data_length, &kde) < 0) {
1126 wpa_auth_vlogger(wpa_auth, sm->addr, LOGGER_INFO,
1127 "received EAPOL-Key msg 2/4 with "
1128 "invalid Key Data contents");
1132 eapol_key_ie = kde.rsn_ie;
1133 eapol_key_ie_len = kde.rsn_ie_len;
1134 } else if (kde.osen) {
1135 eapol_key_ie = kde.osen;
1136 eapol_key_ie_len = kde.osen_len;
1138 eapol_key_ie = kde.wpa_ie;
1139 eapol_key_ie_len = kde.wpa_ie_len;
1141 ft = sm->wpa == WPA_VERSION_WPA2 &&
1142 wpa_key_mgmt_ft(sm->wpa_key_mgmt);
1143 if (sm->wpa_ie == NULL ||
1144 wpa_compare_rsn_ie(ft,
1145 sm->wpa_ie, sm->wpa_ie_len,
1146 eapol_key_ie, eapol_key_ie_len)) {
1147 wpa_auth_logger(wpa_auth, sm->addr, LOGGER_INFO,
1148 "WPA IE from (Re)AssocReq did not "
1149 "match with msg 2/4");
1151 wpa_hexdump(MSG_DEBUG, "WPA IE in AssocReq",
1152 sm->wpa_ie, sm->wpa_ie_len);
1154 wpa_hexdump(MSG_DEBUG, "WPA IE in msg 2/4",
1155 eapol_key_ie, eapol_key_ie_len);
1156 /* MLME-DEAUTHENTICATE.request */
1157 wpa_sta_disconnect(wpa_auth, sm->addr);
1160 #ifdef CONFIG_IEEE80211R
1161 if (ft && ft_check_msg_2_of_4(wpa_auth, sm, &kde) < 0) {
1162 wpa_sta_disconnect(wpa_auth, sm->addr);
1165 #endif /* CONFIG_IEEE80211R */
1167 if (kde.ip_addr_req && kde.ip_addr_req[0] &&
1168 wpa_auth->ip_pool && WPA_GET_BE32(sm->ip_addr) == 0) {
1170 wpa_printf(MSG_DEBUG, "P2P: IP address requested in "
1171 "EAPOL-Key exchange");
1172 idx = bitfield_get_first_zero(wpa_auth->ip_pool);
1174 u32 start = WPA_GET_BE32(wpa_auth->conf.
1176 bitfield_set(wpa_auth->ip_pool, idx);
1177 WPA_PUT_BE32(sm->ip_addr, start + idx);
1178 wpa_printf(MSG_DEBUG, "P2P: Assigned IP "
1179 "address %u.%u.%u.%u to " MACSTR,
1180 sm->ip_addr[0], sm->ip_addr[1],
1181 sm->ip_addr[2], sm->ip_addr[3],
1185 #endif /* CONFIG_P2P */
1188 if (sm->wpa_ptk_state != WPA_PTK_PTKINITNEGOTIATING ||
1190 wpa_auth_vlogger(wpa_auth, sm->addr, LOGGER_INFO,
1191 "received EAPOL-Key msg 4/4 in "
1192 "invalid state (%d) - dropped",
1198 if (sm->wpa_ptk_group_state != WPA_PTK_GROUP_REKEYNEGOTIATING
1199 || !sm->PTK_valid) {
1200 wpa_auth_vlogger(wpa_auth, sm->addr, LOGGER_INFO,
1201 "received EAPOL-Key msg 2/2 in "
1202 "invalid state (%d) - dropped",
1203 sm->wpa_ptk_group_state);
1207 #ifdef CONFIG_PEERKEY
1211 if (!wpa_auth->conf.peerkey) {
1212 wpa_printf(MSG_DEBUG, "RSN: SMK M1/M3/Error, but "
1213 "PeerKey use disabled - ignoring message");
1216 if (!sm->PTK_valid) {
1217 wpa_auth_logger(wpa_auth, sm->addr, LOGGER_INFO,
1218 "received EAPOL-Key msg SMK in "
1219 "invalid state - dropped");
1223 #else /* CONFIG_PEERKEY */
1227 return; /* STSL disabled - ignore SMK messages */
1228 #endif /* CONFIG_PEERKEY */
1233 wpa_auth_vlogger(wpa_auth, sm->addr, LOGGER_DEBUG,
1234 "received EAPOL-Key frame (%s)", msgtxt);
1236 if (key_info & WPA_KEY_INFO_ACK) {
1237 wpa_auth_logger(wpa_auth, sm->addr, LOGGER_INFO,
1238 "received invalid EAPOL-Key: Key Ack set");
1242 if (!(key_info & WPA_KEY_INFO_MIC)) {
1243 wpa_auth_logger(wpa_auth, sm->addr, LOGGER_INFO,
1244 "received invalid EAPOL-Key: Key MIC not set");
1248 sm->MICVerified = FALSE;
1249 if (sm->PTK_valid && !sm->update_snonce) {
1250 if (wpa_verify_key_mic(sm->wpa_key_mgmt, &sm->PTK, data,
1252 (msg != PAIRWISE_4 || !sm->alt_snonce_valid ||
1253 wpa_try_alt_snonce(sm, data, data_len))) {
1254 wpa_auth_logger(wpa_auth, sm->addr, LOGGER_INFO,
1255 "received EAPOL-Key with invalid MIC");
1258 sm->MICVerified = TRUE;
1259 eloop_cancel_timeout(wpa_send_eapol_timeout, wpa_auth, sm);
1260 sm->pending_1_of_4_timeout = 0;
1263 if (key_info & WPA_KEY_INFO_REQUEST) {
1264 if (sm->MICVerified) {
1265 sm->req_replay_counter_used = 1;
1266 os_memcpy(sm->req_replay_counter, key->replay_counter,
1267 WPA_REPLAY_COUNTER_LEN);
1269 wpa_auth_logger(wpa_auth, sm->addr, LOGGER_INFO,
1270 "received EAPOL-Key request with "
1276 * TODO: should decrypt key data field if encryption was used;
1277 * even though MAC address KDE is not normally encrypted,
1278 * supplicant is allowed to encrypt it.
1280 if (msg == SMK_ERROR) {
1281 #ifdef CONFIG_PEERKEY
1282 wpa_smk_error(wpa_auth, sm, key_data, key_data_length);
1283 #endif /* CONFIG_PEERKEY */
1285 } else if (key_info & WPA_KEY_INFO_ERROR) {
1286 if (wpa_receive_error_report(
1288 !(key_info & WPA_KEY_INFO_KEY_TYPE)) > 0)
1289 return; /* STA entry was removed */
1290 } else if (key_info & WPA_KEY_INFO_KEY_TYPE) {
1291 wpa_auth_logger(wpa_auth, sm->addr, LOGGER_INFO,
1292 "received EAPOL-Key Request for new "
1294 wpa_request_new_ptk(sm);
1295 #ifdef CONFIG_PEERKEY
1296 } else if (msg == SMK_M1) {
1297 wpa_smk_m1(wpa_auth, sm, key, key_data,
1299 #endif /* CONFIG_PEERKEY */
1300 } else if (key_data_length > 0 &&
1301 wpa_parse_kde_ies(key_data, key_data_length,
1305 wpa_auth_logger(wpa_auth, sm->addr, LOGGER_INFO,
1306 "received EAPOL-Key Request for GTK "
1308 eloop_cancel_timeout(wpa_rekey_gtk, wpa_auth, NULL);
1309 wpa_rekey_gtk(wpa_auth, NULL);
1312 /* Do not allow the same key replay counter to be reused. */
1313 wpa_replay_counter_mark_invalid(sm->key_replay,
1314 key->replay_counter);
1316 if (msg == PAIRWISE_2) {
1318 * Maintain a copy of the pending EAPOL-Key frames in
1319 * case the EAPOL-Key frame was retransmitted. This is
1320 * needed to allow EAPOL-Key msg 2/4 reply to another
1321 * pending msg 1/4 to update the SNonce to work around
1322 * unexpected supplicant behavior.
1324 os_memcpy(sm->prev_key_replay, sm->key_replay,
1325 sizeof(sm->key_replay));
1327 os_memset(sm->prev_key_replay, 0,
1328 sizeof(sm->prev_key_replay));
1332 * Make sure old valid counters are not accepted anymore and
1333 * do not get copied again.
1335 wpa_replay_counter_mark_invalid(sm->key_replay, NULL);
1338 #ifdef CONFIG_PEERKEY
1339 if (msg == SMK_M3) {
1340 wpa_smk_m3(wpa_auth, sm, key, key_data, key_data_length);
1343 #endif /* CONFIG_PEERKEY */
1345 os_free(sm->last_rx_eapol_key);
1346 sm->last_rx_eapol_key = os_malloc(data_len);
1347 if (sm->last_rx_eapol_key == NULL)
1349 os_memcpy(sm->last_rx_eapol_key, data, data_len);
1350 sm->last_rx_eapol_key_len = data_len;
1352 sm->rx_eapol_key_secure = !!(key_info & WPA_KEY_INFO_SECURE);
1353 sm->EAPOLKeyReceived = TRUE;
1354 sm->EAPOLKeyPairwise = !!(key_info & WPA_KEY_INFO_KEY_TYPE);
1355 sm->EAPOLKeyRequest = !!(key_info & WPA_KEY_INFO_REQUEST);
1356 os_memcpy(sm->SNonce, key->key_nonce, WPA_NONCE_LEN);
1361 static int wpa_gmk_to_gtk(const u8 *gmk, const char *label, const u8 *addr,
1362 const u8 *gnonce, u8 *gtk, size_t gtk_len)
1364 u8 data[ETH_ALEN + WPA_NONCE_LEN + 8 + 16];
1368 /* GTK = PRF-X(GMK, "Group key expansion",
1369 * AA || GNonce || Time || random data)
1370 * The example described in the IEEE 802.11 standard uses only AA and
1371 * GNonce as inputs here. Add some more entropy since this derivation
1372 * is done only at the Authenticator and as such, does not need to be
1375 os_memcpy(data, addr, ETH_ALEN);
1376 os_memcpy(data + ETH_ALEN, gnonce, WPA_NONCE_LEN);
1377 pos = data + ETH_ALEN + WPA_NONCE_LEN;
1378 wpa_get_ntp_timestamp(pos);
1380 if (random_get_bytes(pos, 16) < 0)
1383 #ifdef CONFIG_IEEE80211W
1384 sha256_prf(gmk, WPA_GMK_LEN, label, data, sizeof(data), gtk, gtk_len);
1385 #else /* CONFIG_IEEE80211W */
1386 if (sha1_prf(gmk, WPA_GMK_LEN, label, data, sizeof(data), gtk, gtk_len)
1389 #endif /* CONFIG_IEEE80211W */
1395 static void wpa_send_eapol_timeout(void *eloop_ctx, void *timeout_ctx)
1397 struct wpa_authenticator *wpa_auth = eloop_ctx;
1398 struct wpa_state_machine *sm = timeout_ctx;
1400 sm->pending_1_of_4_timeout = 0;
1401 wpa_auth_logger(wpa_auth, sm->addr, LOGGER_DEBUG, "EAPOL-Key timeout");
1402 sm->TimeoutEvt = TRUE;
1407 void __wpa_send_eapol(struct wpa_authenticator *wpa_auth,
1408 struct wpa_state_machine *sm, int key_info,
1409 const u8 *key_rsc, const u8 *nonce,
1410 const u8 *kde, size_t kde_len,
1411 int keyidx, int encr, int force_version)
1413 struct ieee802_1x_hdr *hdr;
1414 struct wpa_eapol_key *key;
1415 struct wpa_eapol_key_192 *key192;
1416 size_t len, mic_len, keyhdrlen;
1418 int key_data_len, pad_len = 0;
1420 int version, pairwise;
1424 mic_len = wpa_mic_len(sm->wpa_key_mgmt);
1425 keyhdrlen = mic_len == 24 ? sizeof(*key192) : sizeof(*key);
1427 len = sizeof(struct ieee802_1x_hdr) + keyhdrlen;
1430 version = force_version;
1431 else if (sm->wpa_key_mgmt == WPA_KEY_MGMT_OSEN ||
1432 wpa_key_mgmt_suite_b(sm->wpa_key_mgmt))
1433 version = WPA_KEY_INFO_TYPE_AKM_DEFINED;
1434 else if (wpa_use_aes_cmac(sm))
1435 version = WPA_KEY_INFO_TYPE_AES_128_CMAC;
1436 else if (sm->pairwise != WPA_CIPHER_TKIP)
1437 version = WPA_KEY_INFO_TYPE_HMAC_SHA1_AES;
1439 version = WPA_KEY_INFO_TYPE_HMAC_MD5_RC4;
1441 pairwise = !!(key_info & WPA_KEY_INFO_KEY_TYPE);
1443 wpa_printf(MSG_DEBUG, "WPA: Send EAPOL(version=%d secure=%d mic=%d "
1444 "ack=%d install=%d pairwise=%d kde_len=%lu keyidx=%d "
1447 (key_info & WPA_KEY_INFO_SECURE) ? 1 : 0,
1448 (key_info & WPA_KEY_INFO_MIC) ? 1 : 0,
1449 (key_info & WPA_KEY_INFO_ACK) ? 1 : 0,
1450 (key_info & WPA_KEY_INFO_INSTALL) ? 1 : 0,
1451 pairwise, (unsigned long) kde_len, keyidx, encr);
1453 key_data_len = kde_len;
1455 if ((version == WPA_KEY_INFO_TYPE_HMAC_SHA1_AES ||
1456 sm->wpa_key_mgmt == WPA_KEY_MGMT_OSEN ||
1457 wpa_key_mgmt_suite_b(sm->wpa_key_mgmt) ||
1458 version == WPA_KEY_INFO_TYPE_AES_128_CMAC) && encr) {
1459 pad_len = key_data_len % 8;
1461 pad_len = 8 - pad_len;
1462 key_data_len += pad_len + 8;
1465 len += key_data_len;
1467 hdr = os_zalloc(len);
1470 hdr->version = wpa_auth->conf.eapol_version;
1471 hdr->type = IEEE802_1X_TYPE_EAPOL_KEY;
1472 hdr->length = host_to_be16(len - sizeof(*hdr));
1473 key = (struct wpa_eapol_key *) (hdr + 1);
1474 key192 = (struct wpa_eapol_key_192 *) (hdr + 1);
1475 key_data = ((u8 *) (hdr + 1)) + keyhdrlen;
1477 key->type = sm->wpa == WPA_VERSION_WPA2 ?
1478 EAPOL_KEY_TYPE_RSN : EAPOL_KEY_TYPE_WPA;
1479 key_info |= version;
1480 if (encr && sm->wpa == WPA_VERSION_WPA2)
1481 key_info |= WPA_KEY_INFO_ENCR_KEY_DATA;
1482 if (sm->wpa != WPA_VERSION_WPA2)
1483 key_info |= keyidx << WPA_KEY_INFO_KEY_INDEX_SHIFT;
1484 WPA_PUT_BE16(key->key_info, key_info);
1486 alg = pairwise ? sm->pairwise : wpa_auth->conf.wpa_group;
1487 WPA_PUT_BE16(key->key_length, wpa_cipher_key_len(alg));
1488 if (key_info & WPA_KEY_INFO_SMK_MESSAGE)
1489 WPA_PUT_BE16(key->key_length, 0);
1491 /* FIX: STSL: what to use as key_replay_counter? */
1492 for (i = RSNA_MAX_EAPOL_RETRIES - 1; i > 0; i--) {
1493 sm->key_replay[i].valid = sm->key_replay[i - 1].valid;
1494 os_memcpy(sm->key_replay[i].counter,
1495 sm->key_replay[i - 1].counter,
1496 WPA_REPLAY_COUNTER_LEN);
1498 inc_byte_array(sm->key_replay[0].counter, WPA_REPLAY_COUNTER_LEN);
1499 os_memcpy(key->replay_counter, sm->key_replay[0].counter,
1500 WPA_REPLAY_COUNTER_LEN);
1501 wpa_hexdump(MSG_DEBUG, "WPA: Replay Counter",
1502 key->replay_counter, WPA_REPLAY_COUNTER_LEN);
1503 sm->key_replay[0].valid = TRUE;
1506 os_memcpy(key->key_nonce, nonce, WPA_NONCE_LEN);
1509 os_memcpy(key->key_rsc, key_rsc, WPA_KEY_RSC_LEN);
1512 os_memcpy(key_data, kde, kde_len);
1514 WPA_PUT_BE16(key192->key_data_length, kde_len);
1516 WPA_PUT_BE16(key->key_data_length, kde_len);
1517 } else if (encr && kde) {
1518 buf = os_zalloc(key_data_len);
1524 os_memcpy(pos, kde, kde_len);
1530 wpa_hexdump_key(MSG_DEBUG, "Plaintext EAPOL-Key Key Data",
1532 if (version == WPA_KEY_INFO_TYPE_HMAC_SHA1_AES ||
1533 sm->wpa_key_mgmt == WPA_KEY_MGMT_OSEN ||
1534 wpa_key_mgmt_suite_b(sm->wpa_key_mgmt) ||
1535 version == WPA_KEY_INFO_TYPE_AES_128_CMAC) {
1536 if (aes_wrap(sm->PTK.kek, sm->PTK.kek_len,
1537 (key_data_len - 8) / 8, buf, key_data)) {
1543 WPA_PUT_BE16(key192->key_data_length,
1546 WPA_PUT_BE16(key->key_data_length,
1548 #ifndef CONFIG_NO_RC4
1549 } else if (sm->PTK.kek_len == 16) {
1551 os_memcpy(key->key_iv,
1552 sm->group->Counter + WPA_NONCE_LEN - 16, 16);
1553 inc_byte_array(sm->group->Counter, WPA_NONCE_LEN);
1554 os_memcpy(ek, key->key_iv, 16);
1555 os_memcpy(ek + 16, sm->PTK.kek, sm->PTK.kek_len);
1556 os_memcpy(key_data, buf, key_data_len);
1557 rc4_skip(ek, 32, 256, key_data, key_data_len);
1559 WPA_PUT_BE16(key192->key_data_length,
1562 WPA_PUT_BE16(key->key_data_length,
1564 #endif /* CONFIG_NO_RC4 */
1573 if (key_info & WPA_KEY_INFO_MIC) {
1576 if (!sm->PTK_valid) {
1577 wpa_auth_logger(wpa_auth, sm->addr, LOGGER_DEBUG,
1578 "PTK not valid when sending EAPOL-Key "
1584 key_mic = key192->key_mic; /* same offset for key and key192 */
1585 wpa_eapol_key_mic(sm->PTK.kck, sm->PTK.kck_len,
1586 sm->wpa_key_mgmt, version,
1587 (u8 *) hdr, len, key_mic);
1588 #ifdef CONFIG_TESTING_OPTIONS
1590 wpa_auth->conf.corrupt_gtk_rekey_mic_probability > 0.0 &&
1592 wpa_auth->conf.corrupt_gtk_rekey_mic_probability) {
1593 wpa_auth_logger(wpa_auth, sm->addr, LOGGER_INFO,
1594 "Corrupting group EAPOL-Key Key MIC");
1597 #endif /* CONFIG_TESTING_OPTIONS */
1600 wpa_auth_set_eapol(sm->wpa_auth, sm->addr, WPA_EAPOL_inc_EapolFramesTx,
1602 wpa_auth_send_eapol(wpa_auth, sm->addr, (u8 *) hdr, len,
1608 static void wpa_send_eapol(struct wpa_authenticator *wpa_auth,
1609 struct wpa_state_machine *sm, int key_info,
1610 const u8 *key_rsc, const u8 *nonce,
1611 const u8 *kde, size_t kde_len,
1612 int keyidx, int encr)
1615 int pairwise = key_info & WPA_KEY_INFO_KEY_TYPE;
1621 __wpa_send_eapol(wpa_auth, sm, key_info, key_rsc, nonce, kde, kde_len,
1624 ctr = pairwise ? sm->TimeoutCtr : sm->GTimeoutCtr;
1625 if (ctr == 1 && wpa_auth->conf.tx_status)
1626 timeout_ms = pairwise ? eapol_key_timeout_first :
1627 eapol_key_timeout_first_group;
1629 timeout_ms = eapol_key_timeout_subseq;
1630 if (pairwise && ctr == 1 && !(key_info & WPA_KEY_INFO_MIC))
1631 sm->pending_1_of_4_timeout = 1;
1632 wpa_printf(MSG_DEBUG, "WPA: Use EAPOL-Key timeout of %u ms (retry "
1633 "counter %d)", timeout_ms, ctr);
1634 eloop_register_timeout(timeout_ms / 1000, (timeout_ms % 1000) * 1000,
1635 wpa_send_eapol_timeout, wpa_auth, sm);
1639 static int wpa_verify_key_mic(int akmp, struct wpa_ptk *PTK, u8 *data,
1642 struct ieee802_1x_hdr *hdr;
1643 struct wpa_eapol_key *key;
1644 struct wpa_eapol_key_192 *key192;
1647 u8 mic[WPA_EAPOL_KEY_MIC_MAX_LEN];
1648 size_t mic_len = wpa_mic_len(akmp);
1650 if (data_len < sizeof(*hdr) + sizeof(*key))
1653 hdr = (struct ieee802_1x_hdr *) data;
1654 key = (struct wpa_eapol_key *) (hdr + 1);
1655 key192 = (struct wpa_eapol_key_192 *) (hdr + 1);
1656 key_info = WPA_GET_BE16(key->key_info);
1657 os_memcpy(mic, key192->key_mic, mic_len);
1658 os_memset(key192->key_mic, 0, mic_len);
1659 if (wpa_eapol_key_mic(PTK->kck, PTK->kck_len, akmp,
1660 key_info & WPA_KEY_INFO_TYPE_MASK,
1661 data, data_len, key192->key_mic) ||
1662 os_memcmp_const(mic, key192->key_mic, mic_len) != 0)
1664 os_memcpy(key192->key_mic, mic, mic_len);
1669 void wpa_remove_ptk(struct wpa_state_machine *sm)
1671 sm->PTK_valid = FALSE;
1672 os_memset(&sm->PTK, 0, sizeof(sm->PTK));
1673 wpa_auth_set_key(sm->wpa_auth, 0, WPA_ALG_NONE, sm->addr, 0, NULL, 0);
1674 sm->pairwise_set = FALSE;
1675 eloop_cancel_timeout(wpa_rekey_ptk, sm->wpa_auth, sm);
1679 int wpa_auth_sm_event(struct wpa_state_machine *sm, enum wpa_event event)
1686 wpa_auth_vlogger(sm->wpa_auth, sm->addr, LOGGER_DEBUG,
1687 "event %d notification", event);
1692 /* PTKs are derived through AMPE */
1693 if (wpa_auth_start_ampe(sm->wpa_auth, sm->addr)) {
1698 #endif /* CONFIG_MESH */
1703 sm->DeauthenticationRequest = TRUE;
1706 case WPA_REAUTH_EAPOL:
1709 * When using WPS, we may end up here if the STA
1710 * manages to re-associate without the previous STA
1711 * entry getting removed. Consequently, we need to make
1712 * sure that the WPA state machines gets initialized
1713 * properly at this point.
1715 wpa_printf(MSG_DEBUG, "WPA state machine had not been "
1716 "started - initialize now");
1719 if (wpa_sm_step(sm) == 1)
1720 return 1; /* should not really happen */
1722 sm->AuthenticationRequest = TRUE;
1725 if (sm->GUpdateStationKeys) {
1727 * Reauthentication cancels the pending group key
1728 * update for this STA.
1730 sm->group->GKeyDoneStations--;
1731 sm->GUpdateStationKeys = FALSE;
1732 sm->PtkGroupInit = TRUE;
1734 sm->ReAuthenticationRequest = TRUE;
1737 #ifdef CONFIG_IEEE80211R
1738 wpa_printf(MSG_DEBUG, "FT: Retry PTK configuration "
1739 "after association");
1740 wpa_ft_install_ptk(sm);
1742 /* Using FT protocol, not WPA auth state machine */
1743 sm->ft_completed = 1;
1745 #else /* CONFIG_IEEE80211R */
1747 #endif /* CONFIG_IEEE80211R */
1750 #ifdef CONFIG_IEEE80211R
1751 sm->ft_completed = 0;
1752 #endif /* CONFIG_IEEE80211R */
1754 #ifdef CONFIG_IEEE80211W
1755 if (sm->mgmt_frame_prot && event == WPA_AUTH)
1757 #endif /* CONFIG_IEEE80211W */
1760 sm->PTK_valid = FALSE;
1761 os_memset(&sm->PTK, 0, sizeof(sm->PTK));
1763 if (event != WPA_REAUTH_EAPOL)
1767 if (sm->in_step_loop) {
1769 * wpa_sm_step() is already running - avoid recursive call to
1770 * it by making the existing loop process the new update.
1775 return wpa_sm_step(sm);
1779 SM_STATE(WPA_PTK, INITIALIZE)
1781 SM_ENTRY_MA(WPA_PTK, INITIALIZE, wpa_ptk);
1783 /* Init flag is not cleared here, so avoid busy
1784 * loop by claiming nothing changed. */
1785 sm->changed = FALSE;
1789 if (sm->GUpdateStationKeys)
1790 sm->group->GKeyDoneStations--;
1791 sm->GUpdateStationKeys = FALSE;
1792 if (sm->wpa == WPA_VERSION_WPA)
1793 sm->PInitAKeys = FALSE;
1794 if (1 /* Unicast cipher supported AND (ESS OR ((IBSS or WDS) and
1795 * Local AA > Remote AA)) */) {
1798 wpa_auth_set_eapol(sm->wpa_auth, sm->addr, WPA_EAPOL_portEnabled, 0);
1800 wpa_auth_set_eapol(sm->wpa_auth, sm->addr, WPA_EAPOL_portValid, 0);
1802 if (wpa_key_mgmt_wpa_psk(sm->wpa_key_mgmt)) {
1803 wpa_auth_set_eapol(sm->wpa_auth, sm->addr,
1804 WPA_EAPOL_authorized, 0);
1809 SM_STATE(WPA_PTK, DISCONNECT)
1811 SM_ENTRY_MA(WPA_PTK, DISCONNECT, wpa_ptk);
1812 sm->Disconnect = FALSE;
1813 wpa_sta_disconnect(sm->wpa_auth, sm->addr);
1817 SM_STATE(WPA_PTK, DISCONNECTED)
1819 SM_ENTRY_MA(WPA_PTK, DISCONNECTED, wpa_ptk);
1820 sm->DeauthenticationRequest = FALSE;
1824 SM_STATE(WPA_PTK, AUTHENTICATION)
1826 SM_ENTRY_MA(WPA_PTK, AUTHENTICATION, wpa_ptk);
1827 os_memset(&sm->PTK, 0, sizeof(sm->PTK));
1828 sm->PTK_valid = FALSE;
1829 wpa_auth_set_eapol(sm->wpa_auth, sm->addr, WPA_EAPOL_portControl_Auto,
1831 wpa_auth_set_eapol(sm->wpa_auth, sm->addr, WPA_EAPOL_portEnabled, 1);
1832 sm->AuthenticationRequest = FALSE;
1836 static void wpa_group_ensure_init(struct wpa_authenticator *wpa_auth,
1837 struct wpa_group *group)
1839 if (group->first_sta_seen)
1842 * System has run bit further than at the time hostapd was started
1843 * potentially very early during boot up. This provides better chances
1844 * of collecting more randomness on embedded systems. Re-initialize the
1845 * GMK and Counter here to improve their strength if there was not
1846 * enough entropy available immediately after system startup.
1848 wpa_printf(MSG_DEBUG, "WPA: Re-initialize GMK/Counter on first "
1850 if (random_pool_ready() != 1) {
1851 wpa_printf(MSG_INFO, "WPA: Not enough entropy in random pool "
1852 "to proceed - reject first 4-way handshake");
1853 group->reject_4way_hs_for_entropy = TRUE;
1855 group->first_sta_seen = TRUE;
1856 group->reject_4way_hs_for_entropy = FALSE;
1859 if (wpa_group_init_gmk_and_counter(wpa_auth, group) < 0 ||
1860 wpa_gtk_update(wpa_auth, group) < 0 ||
1861 wpa_group_config_group_keys(wpa_auth, group) < 0) {
1862 wpa_printf(MSG_INFO, "WPA: GMK/GTK setup failed");
1863 group->first_sta_seen = FALSE;
1864 group->reject_4way_hs_for_entropy = TRUE;
1869 SM_STATE(WPA_PTK, AUTHENTICATION2)
1871 SM_ENTRY_MA(WPA_PTK, AUTHENTICATION2, wpa_ptk);
1873 wpa_group_ensure_init(sm->wpa_auth, sm->group);
1874 sm->ReAuthenticationRequest = FALSE;
1877 * Definition of ANonce selection in IEEE Std 802.11i-2004 is somewhat
1878 * ambiguous. The Authenticator state machine uses a counter that is
1879 * incremented by one for each 4-way handshake. However, the security
1880 * analysis of 4-way handshake points out that unpredictable nonces
1881 * help in preventing precomputation attacks. Instead of the state
1882 * machine definition, use an unpredictable nonce value here to provide
1883 * stronger protection against potential precomputation attacks.
1885 if (random_get_bytes(sm->ANonce, WPA_NONCE_LEN)) {
1886 wpa_printf(MSG_ERROR, "WPA: Failed to get random data for "
1888 sm->Disconnect = TRUE;
1891 wpa_hexdump(MSG_DEBUG, "WPA: Assign ANonce", sm->ANonce,
1893 /* IEEE 802.11i does not clear TimeoutCtr here, but this is more
1894 * logical place than INITIALIZE since AUTHENTICATION2 can be
1895 * re-entered on ReAuthenticationRequest without going through
1901 SM_STATE(WPA_PTK, INITPMK)
1903 u8 msk[2 * PMK_LEN];
1904 size_t len = 2 * PMK_LEN;
1906 SM_ENTRY_MA(WPA_PTK, INITPMK, wpa_ptk);
1907 #ifdef CONFIG_IEEE80211R
1909 #endif /* CONFIG_IEEE80211R */
1911 wpa_printf(MSG_DEBUG, "WPA: PMK from PMKSA cache");
1912 os_memcpy(sm->PMK, sm->pmksa->pmk, sm->pmksa->pmk_len);
1913 sm->pmk_len = sm->pmksa->pmk_len;
1914 } else if (wpa_auth_get_msk(sm->wpa_auth, sm->addr, msk, &len) == 0) {
1915 unsigned int pmk_len;
1917 if (sm->wpa_key_mgmt & WPA_KEY_MGMT_IEEE8021X_SUITE_B_192)
1918 pmk_len = PMK_LEN_SUITE_B_192;
1921 wpa_printf(MSG_DEBUG, "WPA: PMK from EAPOL state machine "
1922 "(MSK len=%lu PMK len=%u)", (unsigned long) len,
1924 if (len < pmk_len) {
1925 wpa_printf(MSG_DEBUG,
1926 "WPA: MSK not long enough (%u) to create PMK (%u)",
1927 (unsigned int) len, (unsigned int) pmk_len);
1928 sm->Disconnect = TRUE;
1931 os_memcpy(sm->PMK, msk, pmk_len);
1932 sm->pmk_len = pmk_len;
1933 #ifdef CONFIG_IEEE80211R
1934 if (len >= 2 * PMK_LEN) {
1935 os_memcpy(sm->xxkey, msk + PMK_LEN, PMK_LEN);
1936 sm->xxkey_len = PMK_LEN;
1938 #endif /* CONFIG_IEEE80211R */
1940 wpa_printf(MSG_DEBUG, "WPA: Could not get PMK, get_msk: %p",
1941 sm->wpa_auth->cb.get_msk);
1942 sm->Disconnect = TRUE;
1945 os_memset(msk, 0, sizeof(msk));
1947 sm->req_replay_counter_used = 0;
1948 /* IEEE 802.11i does not set keyRun to FALSE, but not doing this
1949 * will break reauthentication since EAPOL state machines may not be
1950 * get into AUTHENTICATING state that clears keyRun before WPA state
1951 * machine enters AUTHENTICATION2 state and goes immediately to INITPMK
1952 * state and takes PMK from the previously used AAA Key. This will
1953 * eventually fail in 4-Way Handshake because Supplicant uses PMK
1954 * derived from the new AAA Key. Setting keyRun = FALSE here seems to
1955 * be good workaround for this issue. */
1956 wpa_auth_set_eapol(sm->wpa_auth, sm->addr, WPA_EAPOL_keyRun, 0);
1960 SM_STATE(WPA_PTK, INITPSK)
1963 SM_ENTRY_MA(WPA_PTK, INITPSK, wpa_ptk);
1964 psk = wpa_auth_get_psk(sm->wpa_auth, sm->addr, sm->p2p_dev_addr, NULL);
1966 os_memcpy(sm->PMK, psk, PMK_LEN);
1967 sm->pmk_len = PMK_LEN;
1968 #ifdef CONFIG_IEEE80211R
1969 os_memcpy(sm->xxkey, psk, PMK_LEN);
1970 sm->xxkey_len = PMK_LEN;
1971 #endif /* CONFIG_IEEE80211R */
1973 sm->req_replay_counter_used = 0;
1977 SM_STATE(WPA_PTK, PTKSTART)
1979 u8 buf[2 + RSN_SELECTOR_LEN + PMKID_LEN], *pmkid = NULL;
1980 size_t pmkid_len = 0;
1982 SM_ENTRY_MA(WPA_PTK, PTKSTART, wpa_ptk);
1983 sm->PTKRequest = FALSE;
1984 sm->TimeoutEvt = FALSE;
1985 sm->alt_snonce_valid = FALSE;
1988 if (sm->TimeoutCtr > (int) dot11RSNAConfigPairwiseUpdateCount) {
1989 /* No point in sending the EAPOL-Key - we will disconnect
1990 * immediately following this. */
1994 wpa_auth_logger(sm->wpa_auth, sm->addr, LOGGER_DEBUG,
1995 "sending 1/4 msg of 4-Way Handshake");
1997 * TODO: Could add PMKID even with WPA2-PSK, but only if there is only
1998 * one possible PSK for this STA.
2000 if (sm->wpa == WPA_VERSION_WPA2 &&
2001 wpa_key_mgmt_wpa_ieee8021x(sm->wpa_key_mgmt) &&
2002 sm->wpa_key_mgmt != WPA_KEY_MGMT_OSEN) {
2004 pmkid_len = 2 + RSN_SELECTOR_LEN + PMKID_LEN;
2005 pmkid[0] = WLAN_EID_VENDOR_SPECIFIC;
2006 pmkid[1] = RSN_SELECTOR_LEN + PMKID_LEN;
2007 RSN_SELECTOR_PUT(&pmkid[2], RSN_KEY_DATA_PMKID);
2009 os_memcpy(&pmkid[2 + RSN_SELECTOR_LEN],
2010 sm->pmksa->pmkid, PMKID_LEN);
2011 } else if (wpa_key_mgmt_suite_b(sm->wpa_key_mgmt)) {
2012 /* No KCK available to derive PMKID */
2016 * Calculate PMKID since no PMKSA cache entry was
2017 * available with pre-calculated PMKID.
2019 rsn_pmkid(sm->PMK, sm->pmk_len, sm->wpa_auth->addr,
2020 sm->addr, &pmkid[2 + RSN_SELECTOR_LEN],
2021 wpa_key_mgmt_sha256(sm->wpa_key_mgmt));
2024 wpa_send_eapol(sm->wpa_auth, sm,
2025 WPA_KEY_INFO_ACK | WPA_KEY_INFO_KEY_TYPE, NULL,
2026 sm->ANonce, pmkid, pmkid_len, 0, 0);
2030 static int wpa_derive_ptk(struct wpa_state_machine *sm, const u8 *snonce,
2031 const u8 *pmk, unsigned int pmk_len,
2032 struct wpa_ptk *ptk)
2034 #ifdef CONFIG_IEEE80211R
2035 if (wpa_key_mgmt_ft(sm->wpa_key_mgmt))
2036 return wpa_auth_derive_ptk_ft(sm, pmk, ptk);
2037 #endif /* CONFIG_IEEE80211R */
2039 return wpa_pmk_to_ptk(pmk, pmk_len, "Pairwise key expansion",
2040 sm->wpa_auth->addr, sm->addr, sm->ANonce, snonce,
2041 ptk, sm->wpa_key_mgmt, sm->pairwise);
2045 SM_STATE(WPA_PTK, PTKCALCNEGOTIATING)
2048 int ok = 0, psk_found = 0;
2049 const u8 *pmk = NULL;
2050 unsigned int pmk_len;
2052 SM_ENTRY_MA(WPA_PTK, PTKCALCNEGOTIATING, wpa_ptk);
2053 sm->EAPOLKeyReceived = FALSE;
2054 sm->update_snonce = FALSE;
2056 /* WPA with IEEE 802.1X: use the derived PMK from EAP
2057 * WPA-PSK: iterate through possible PSKs and select the one matching
2060 if (wpa_key_mgmt_wpa_psk(sm->wpa_key_mgmt)) {
2061 pmk = wpa_auth_get_psk(sm->wpa_auth, sm->addr,
2062 sm->p2p_dev_addr, pmk);
2069 pmk_len = sm->pmk_len;
2072 wpa_derive_ptk(sm, sm->SNonce, pmk, pmk_len, &PTK);
2074 if (wpa_verify_key_mic(sm->wpa_key_mgmt, &PTK,
2075 sm->last_rx_eapol_key,
2076 sm->last_rx_eapol_key_len) == 0) {
2081 if (!wpa_key_mgmt_wpa_psk(sm->wpa_key_mgmt))
2086 wpa_auth_logger(sm->wpa_auth, sm->addr, LOGGER_DEBUG,
2087 "invalid MIC in msg 2/4 of 4-Way Handshake");
2089 wpa_auth_psk_failure_report(sm->wpa_auth, sm->addr);
2093 #ifdef CONFIG_IEEE80211R
2094 if (sm->wpa == WPA_VERSION_WPA2 && wpa_key_mgmt_ft(sm->wpa_key_mgmt)) {
2096 * Verify that PMKR1Name from EAPOL-Key message 2/4 matches
2097 * with the value we derived.
2099 if (os_memcmp_const(sm->sup_pmk_r1_name, sm->pmk_r1_name,
2100 WPA_PMK_NAME_LEN) != 0) {
2101 wpa_auth_logger(sm->wpa_auth, sm->addr, LOGGER_DEBUG,
2102 "PMKR1Name mismatch in FT 4-way "
2104 wpa_hexdump(MSG_DEBUG, "FT: PMKR1Name from "
2106 sm->sup_pmk_r1_name, WPA_PMK_NAME_LEN);
2107 wpa_hexdump(MSG_DEBUG, "FT: Derived PMKR1Name",
2108 sm->pmk_r1_name, WPA_PMK_NAME_LEN);
2112 #endif /* CONFIG_IEEE80211R */
2114 sm->pending_1_of_4_timeout = 0;
2115 eloop_cancel_timeout(wpa_send_eapol_timeout, sm->wpa_auth, sm);
2117 if (wpa_key_mgmt_wpa_psk(sm->wpa_key_mgmt)) {
2118 /* PSK may have changed from the previous choice, so update
2119 * state machine data based on whatever PSK was selected here.
2121 os_memcpy(sm->PMK, pmk, PMK_LEN);
2122 sm->pmk_len = PMK_LEN;
2125 sm->MICVerified = TRUE;
2127 os_memcpy(&sm->PTK, &PTK, sizeof(PTK));
2128 sm->PTK_valid = TRUE;
2132 SM_STATE(WPA_PTK, PTKCALCNEGOTIATING2)
2134 SM_ENTRY_MA(WPA_PTK, PTKCALCNEGOTIATING2, wpa_ptk);
2139 #ifdef CONFIG_IEEE80211W
2141 static int ieee80211w_kde_len(struct wpa_state_machine *sm)
2143 if (sm->mgmt_frame_prot) {
2145 len = wpa_cipher_key_len(sm->wpa_auth->conf.group_mgmt_cipher);
2146 return 2 + RSN_SELECTOR_LEN + WPA_IGTK_KDE_PREFIX_LEN + len;
2153 static u8 * ieee80211w_kde_add(struct wpa_state_machine *sm, u8 *pos)
2155 struct wpa_igtk_kde igtk;
2156 struct wpa_group *gsm = sm->group;
2157 u8 rsc[WPA_KEY_RSC_LEN];
2158 size_t len = wpa_cipher_key_len(sm->wpa_auth->conf.group_mgmt_cipher);
2160 if (!sm->mgmt_frame_prot)
2163 igtk.keyid[0] = gsm->GN_igtk;
2165 if (gsm->wpa_group_state != WPA_GROUP_SETKEYSDONE ||
2166 wpa_auth_get_seqnum(sm->wpa_auth, NULL, gsm->GN_igtk, rsc) < 0)
2167 os_memset(igtk.pn, 0, sizeof(igtk.pn));
2169 os_memcpy(igtk.pn, rsc, sizeof(igtk.pn));
2170 os_memcpy(igtk.igtk, gsm->IGTK[gsm->GN_igtk - 4], len);
2171 if (sm->wpa_auth->conf.disable_gtk) {
2173 * Provide unique random IGTK to each STA to prevent use of
2176 if (random_get_bytes(igtk.igtk, len) < 0)
2179 pos = wpa_add_kde(pos, RSN_KEY_DATA_IGTK,
2180 (const u8 *) &igtk, WPA_IGTK_KDE_PREFIX_LEN + len,
2186 #else /* CONFIG_IEEE80211W */
2188 static int ieee80211w_kde_len(struct wpa_state_machine *sm)
2194 static u8 * ieee80211w_kde_add(struct wpa_state_machine *sm, u8 *pos)
2199 #endif /* CONFIG_IEEE80211W */
2202 SM_STATE(WPA_PTK, PTKINITNEGOTIATING)
2204 u8 rsc[WPA_KEY_RSC_LEN], *_rsc, *gtk, *kde, *pos, dummy_gtk[32];
2205 size_t gtk_len, kde_len;
2206 struct wpa_group *gsm = sm->group;
2208 int wpa_ie_len, secure, keyidx, encr = 0;
2210 SM_ENTRY_MA(WPA_PTK, PTKINITNEGOTIATING, wpa_ptk);
2211 sm->TimeoutEvt = FALSE;
2214 if (sm->TimeoutCtr > (int) dot11RSNAConfigPairwiseUpdateCount) {
2215 /* No point in sending the EAPOL-Key - we will disconnect
2216 * immediately following this. */
2220 /* Send EAPOL(1, 1, 1, Pair, P, RSC, ANonce, MIC(PTK), RSNIE, [MDIE],
2221 GTK[GN], IGTK, [FTIE], [TIE * 2])
2223 os_memset(rsc, 0, WPA_KEY_RSC_LEN);
2224 wpa_auth_get_seqnum(sm->wpa_auth, NULL, gsm->GN, rsc);
2225 /* If FT is used, wpa_auth->wpa_ie includes both RSNIE and MDIE */
2226 wpa_ie = sm->wpa_auth->wpa_ie;
2227 wpa_ie_len = sm->wpa_auth->wpa_ie_len;
2228 if (sm->wpa == WPA_VERSION_WPA &&
2229 (sm->wpa_auth->conf.wpa & WPA_PROTO_RSN) &&
2230 wpa_ie_len > wpa_ie[1] + 2 && wpa_ie[0] == WLAN_EID_RSN) {
2231 /* WPA-only STA, remove RSN IE and possible MDIE */
2232 wpa_ie = wpa_ie + wpa_ie[1] + 2;
2233 if (wpa_ie[0] == WLAN_EID_MOBILITY_DOMAIN)
2234 wpa_ie = wpa_ie + wpa_ie[1] + 2;
2235 wpa_ie_len = wpa_ie[1] + 2;
2237 wpa_auth_logger(sm->wpa_auth, sm->addr, LOGGER_DEBUG,
2238 "sending 3/4 msg of 4-Way Handshake");
2239 if (sm->wpa == WPA_VERSION_WPA2) {
2240 /* WPA2 send GTK in the 4-way handshake */
2242 gtk = gsm->GTK[gsm->GN - 1];
2243 gtk_len = gsm->GTK_len;
2244 if (sm->wpa_auth->conf.disable_gtk) {
2246 * Provide unique random GTK to each STA to prevent use
2247 * of GTK in the BSS.
2249 if (random_get_bytes(dummy_gtk, gtk_len) < 0)
2257 /* WPA does not include GTK in msg 3/4 */
2263 if (sm->rx_eapol_key_secure) {
2265 * It looks like Windows 7 supplicant tries to use
2266 * Secure bit in msg 2/4 after having reported Michael
2267 * MIC failure and it then rejects the 4-way handshake
2268 * if msg 3/4 does not set Secure bit. Work around this
2269 * by setting the Secure bit here even in the case of
2270 * WPA if the supplicant used it first.
2272 wpa_auth_logger(sm->wpa_auth, sm->addr, LOGGER_DEBUG,
2273 "STA used Secure bit in WPA msg 2/4 - "
2274 "set Secure for 3/4 as workaround");
2279 kde_len = wpa_ie_len + ieee80211w_kde_len(sm);
2281 kde_len += 2 + RSN_SELECTOR_LEN + 2 + gtk_len;
2282 #ifdef CONFIG_IEEE80211R
2283 if (wpa_key_mgmt_ft(sm->wpa_key_mgmt)) {
2284 kde_len += 2 + PMKID_LEN; /* PMKR1Name into RSN IE */
2285 kde_len += 300; /* FTIE + 2 * TIE */
2287 #endif /* CONFIG_IEEE80211R */
2289 if (WPA_GET_BE32(sm->ip_addr) > 0)
2290 kde_len += 2 + RSN_SELECTOR_LEN + 3 * 4;
2291 #endif /* CONFIG_P2P */
2292 kde = os_malloc(kde_len);
2297 os_memcpy(pos, wpa_ie, wpa_ie_len);
2299 #ifdef CONFIG_IEEE80211R
2300 if (wpa_key_mgmt_ft(sm->wpa_key_mgmt)) {
2305 res = wpa_insert_pmkid(kde, &elen, sm->pmk_r1_name);
2307 wpa_printf(MSG_ERROR, "FT: Failed to insert "
2308 "PMKR1Name into RSN IE in EAPOL-Key data");
2315 #endif /* CONFIG_IEEE80211R */
2318 hdr[0] = keyidx & 0x03;
2320 pos = wpa_add_kde(pos, RSN_KEY_DATA_GROUPKEY, hdr, 2,
2323 pos = ieee80211w_kde_add(sm, pos);
2325 #ifdef CONFIG_IEEE80211R
2326 if (wpa_key_mgmt_ft(sm->wpa_key_mgmt)) {
2328 struct wpa_auth_config *conf;
2330 conf = &sm->wpa_auth->conf;
2331 if (sm->assoc_resp_ftie &&
2332 kde + kde_len - pos >= 2 + sm->assoc_resp_ftie[1]) {
2333 os_memcpy(pos, sm->assoc_resp_ftie,
2334 2 + sm->assoc_resp_ftie[1]);
2335 res = 2 + sm->assoc_resp_ftie[1];
2337 res = wpa_write_ftie(conf, conf->r0_key_holder,
2338 conf->r0_key_holder_len,
2340 kde + kde_len - pos,
2344 wpa_printf(MSG_ERROR, "FT: Failed to insert FTIE "
2345 "into EAPOL-Key Key Data");
2351 /* TIE[ReassociationDeadline] (TU) */
2352 *pos++ = WLAN_EID_TIMEOUT_INTERVAL;
2354 *pos++ = WLAN_TIMEOUT_REASSOC_DEADLINE;
2355 WPA_PUT_LE32(pos, conf->reassociation_deadline);
2358 /* TIE[KeyLifetime] (seconds) */
2359 *pos++ = WLAN_EID_TIMEOUT_INTERVAL;
2361 *pos++ = WLAN_TIMEOUT_KEY_LIFETIME;
2362 WPA_PUT_LE32(pos, conf->r0_key_lifetime * 60);
2365 #endif /* CONFIG_IEEE80211R */
2367 if (WPA_GET_BE32(sm->ip_addr) > 0) {
2369 os_memcpy(addr, sm->ip_addr, 4);
2370 os_memcpy(addr + 4, sm->wpa_auth->conf.ip_addr_mask, 4);
2371 os_memcpy(addr + 8, sm->wpa_auth->conf.ip_addr_go, 4);
2372 pos = wpa_add_kde(pos, WFA_KEY_DATA_IP_ADDR_ALLOC,
2373 addr, sizeof(addr), NULL, 0);
2375 #endif /* CONFIG_P2P */
2377 wpa_send_eapol(sm->wpa_auth, sm,
2378 (secure ? WPA_KEY_INFO_SECURE : 0) | WPA_KEY_INFO_MIC |
2379 WPA_KEY_INFO_ACK | WPA_KEY_INFO_INSTALL |
2380 WPA_KEY_INFO_KEY_TYPE,
2381 _rsc, sm->ANonce, kde, pos - kde, keyidx, encr);
2386 SM_STATE(WPA_PTK, PTKINITDONE)
2388 SM_ENTRY_MA(WPA_PTK, PTKINITDONE, wpa_ptk);
2389 sm->EAPOLKeyReceived = FALSE;
2391 enum wpa_alg alg = wpa_cipher_to_alg(sm->pairwise);
2392 int klen = wpa_cipher_key_len(sm->pairwise);
2393 if (wpa_auth_set_key(sm->wpa_auth, 0, alg, sm->addr, 0,
2394 sm->PTK.tk, klen)) {
2395 wpa_sta_disconnect(sm->wpa_auth, sm->addr);
2398 /* FIX: MLME-SetProtection.Request(TA, Tx_Rx) */
2399 sm->pairwise_set = TRUE;
2401 if (sm->wpa_auth->conf.wpa_ptk_rekey) {
2402 eloop_cancel_timeout(wpa_rekey_ptk, sm->wpa_auth, sm);
2403 eloop_register_timeout(sm->wpa_auth->conf.
2404 wpa_ptk_rekey, 0, wpa_rekey_ptk,
2408 if (wpa_key_mgmt_wpa_psk(sm->wpa_key_mgmt)) {
2409 wpa_auth_set_eapol(sm->wpa_auth, sm->addr,
2410 WPA_EAPOL_authorized, 1);
2414 if (0 /* IBSS == TRUE */) {
2416 if (sm->keycount == 2) {
2417 wpa_auth_set_eapol(sm->wpa_auth, sm->addr,
2418 WPA_EAPOL_portValid, 1);
2421 wpa_auth_set_eapol(sm->wpa_auth, sm->addr, WPA_EAPOL_portValid,
2424 wpa_auth_set_eapol(sm->wpa_auth, sm->addr, WPA_EAPOL_keyAvailable, 0);
2425 wpa_auth_set_eapol(sm->wpa_auth, sm->addr, WPA_EAPOL_keyDone, 1);
2426 if (sm->wpa == WPA_VERSION_WPA)
2427 sm->PInitAKeys = TRUE;
2430 wpa_auth_vlogger(sm->wpa_auth, sm->addr, LOGGER_INFO,
2431 "pairwise key handshake completed (%s)",
2432 sm->wpa == WPA_VERSION_WPA ? "WPA" : "RSN");
2434 #ifdef CONFIG_IEEE80211R
2435 wpa_ft_push_pmk_r1(sm->wpa_auth, sm->addr);
2436 #endif /* CONFIG_IEEE80211R */
2442 struct wpa_authenticator *wpa_auth = sm->wpa_auth;
2445 SM_ENTER(WPA_PTK, INITIALIZE);
2446 else if (sm->Disconnect
2447 /* || FIX: dot11RSNAConfigSALifetime timeout */) {
2448 wpa_auth_logger(wpa_auth, sm->addr, LOGGER_DEBUG,
2449 "WPA_PTK: sm->Disconnect");
2450 SM_ENTER(WPA_PTK, DISCONNECT);
2452 else if (sm->DeauthenticationRequest)
2453 SM_ENTER(WPA_PTK, DISCONNECTED);
2454 else if (sm->AuthenticationRequest)
2455 SM_ENTER(WPA_PTK, AUTHENTICATION);
2456 else if (sm->ReAuthenticationRequest)
2457 SM_ENTER(WPA_PTK, AUTHENTICATION2);
2458 else if (sm->PTKRequest)
2459 SM_ENTER(WPA_PTK, PTKSTART);
2460 else switch (sm->wpa_ptk_state) {
2461 case WPA_PTK_INITIALIZE:
2463 case WPA_PTK_DISCONNECT:
2464 SM_ENTER(WPA_PTK, DISCONNECTED);
2466 case WPA_PTK_DISCONNECTED:
2467 SM_ENTER(WPA_PTK, INITIALIZE);
2469 case WPA_PTK_AUTHENTICATION:
2470 SM_ENTER(WPA_PTK, AUTHENTICATION2);
2472 case WPA_PTK_AUTHENTICATION2:
2473 if (wpa_key_mgmt_wpa_ieee8021x(sm->wpa_key_mgmt) &&
2474 wpa_auth_get_eapol(sm->wpa_auth, sm->addr,
2475 WPA_EAPOL_keyRun) > 0)
2476 SM_ENTER(WPA_PTK, INITPMK);
2477 else if (wpa_key_mgmt_wpa_psk(sm->wpa_key_mgmt)
2478 /* FIX: && 802.1X::keyRun */)
2479 SM_ENTER(WPA_PTK, INITPSK);
2481 case WPA_PTK_INITPMK:
2482 if (wpa_auth_get_eapol(sm->wpa_auth, sm->addr,
2483 WPA_EAPOL_keyAvailable) > 0)
2484 SM_ENTER(WPA_PTK, PTKSTART);
2486 wpa_auth->dot11RSNA4WayHandshakeFailures++;
2487 wpa_auth_logger(sm->wpa_auth, sm->addr, LOGGER_INFO,
2488 "INITPMK - keyAvailable = false");
2489 SM_ENTER(WPA_PTK, DISCONNECT);
2492 case WPA_PTK_INITPSK:
2493 if (wpa_auth_get_psk(sm->wpa_auth, sm->addr, sm->p2p_dev_addr,
2495 SM_ENTER(WPA_PTK, PTKSTART);
2497 wpa_auth_logger(sm->wpa_auth, sm->addr, LOGGER_INFO,
2498 "no PSK configured for the STA");
2499 wpa_auth->dot11RSNA4WayHandshakeFailures++;
2500 SM_ENTER(WPA_PTK, DISCONNECT);
2503 case WPA_PTK_PTKSTART:
2504 if (sm->EAPOLKeyReceived && !sm->EAPOLKeyRequest &&
2505 sm->EAPOLKeyPairwise)
2506 SM_ENTER(WPA_PTK, PTKCALCNEGOTIATING);
2507 else if (sm->TimeoutCtr >
2508 (int) dot11RSNAConfigPairwiseUpdateCount) {
2509 wpa_auth->dot11RSNA4WayHandshakeFailures++;
2510 wpa_auth_vlogger(sm->wpa_auth, sm->addr, LOGGER_DEBUG,
2511 "PTKSTART: Retry limit %d reached",
2512 dot11RSNAConfigPairwiseUpdateCount);
2513 SM_ENTER(WPA_PTK, DISCONNECT);
2514 } else if (sm->TimeoutEvt)
2515 SM_ENTER(WPA_PTK, PTKSTART);
2517 case WPA_PTK_PTKCALCNEGOTIATING:
2518 if (sm->MICVerified)
2519 SM_ENTER(WPA_PTK, PTKCALCNEGOTIATING2);
2520 else if (sm->EAPOLKeyReceived && !sm->EAPOLKeyRequest &&
2521 sm->EAPOLKeyPairwise)
2522 SM_ENTER(WPA_PTK, PTKCALCNEGOTIATING);
2523 else if (sm->TimeoutEvt)
2524 SM_ENTER(WPA_PTK, PTKSTART);
2526 case WPA_PTK_PTKCALCNEGOTIATING2:
2527 SM_ENTER(WPA_PTK, PTKINITNEGOTIATING);
2529 case WPA_PTK_PTKINITNEGOTIATING:
2530 if (sm->update_snonce)
2531 SM_ENTER(WPA_PTK, PTKCALCNEGOTIATING);
2532 else if (sm->EAPOLKeyReceived && !sm->EAPOLKeyRequest &&
2533 sm->EAPOLKeyPairwise && sm->MICVerified)
2534 SM_ENTER(WPA_PTK, PTKINITDONE);
2535 else if (sm->TimeoutCtr >
2536 (int) dot11RSNAConfigPairwiseUpdateCount) {
2537 wpa_auth->dot11RSNA4WayHandshakeFailures++;
2538 wpa_auth_vlogger(sm->wpa_auth, sm->addr, LOGGER_DEBUG,
2539 "PTKINITNEGOTIATING: Retry limit %d "
2541 dot11RSNAConfigPairwiseUpdateCount);
2542 SM_ENTER(WPA_PTK, DISCONNECT);
2543 } else if (sm->TimeoutEvt)
2544 SM_ENTER(WPA_PTK, PTKINITNEGOTIATING);
2546 case WPA_PTK_PTKINITDONE:
2552 SM_STATE(WPA_PTK_GROUP, IDLE)
2554 SM_ENTRY_MA(WPA_PTK_GROUP, IDLE, wpa_ptk_group);
2556 /* Init flag is not cleared here, so avoid busy
2557 * loop by claiming nothing changed. */
2558 sm->changed = FALSE;
2560 sm->GTimeoutCtr = 0;
2564 SM_STATE(WPA_PTK_GROUP, REKEYNEGOTIATING)
2566 u8 rsc[WPA_KEY_RSC_LEN];
2567 struct wpa_group *gsm = sm->group;
2569 u8 *kde_buf = NULL, *pos, hdr[2];
2571 u8 *gtk, dummy_gtk[32];
2573 SM_ENTRY_MA(WPA_PTK_GROUP, REKEYNEGOTIATING, wpa_ptk_group);
2576 if (sm->GTimeoutCtr > (int) dot11RSNAConfigGroupUpdateCount) {
2577 /* No point in sending the EAPOL-Key - we will disconnect
2578 * immediately following this. */
2582 if (sm->wpa == WPA_VERSION_WPA)
2583 sm->PInitAKeys = FALSE;
2584 sm->TimeoutEvt = FALSE;
2585 /* Send EAPOL(1, 1, 1, !Pair, G, RSC, GNonce, MIC(PTK), GTK[GN]) */
2586 os_memset(rsc, 0, WPA_KEY_RSC_LEN);
2587 if (gsm->wpa_group_state == WPA_GROUP_SETKEYSDONE)
2588 wpa_auth_get_seqnum(sm->wpa_auth, NULL, gsm->GN, rsc);
2589 wpa_auth_logger(sm->wpa_auth, sm->addr, LOGGER_DEBUG,
2590 "sending 1/2 msg of Group Key Handshake");
2592 gtk = gsm->GTK[gsm->GN - 1];
2593 if (sm->wpa_auth->conf.disable_gtk) {
2595 * Provide unique random GTK to each STA to prevent use
2596 * of GTK in the BSS.
2598 if (random_get_bytes(dummy_gtk, gsm->GTK_len) < 0)
2602 if (sm->wpa == WPA_VERSION_WPA2) {
2603 kde_len = 2 + RSN_SELECTOR_LEN + 2 + gsm->GTK_len +
2604 ieee80211w_kde_len(sm);
2605 kde_buf = os_malloc(kde_len);
2606 if (kde_buf == NULL)
2609 kde = pos = kde_buf;
2610 hdr[0] = gsm->GN & 0x03;
2612 pos = wpa_add_kde(pos, RSN_KEY_DATA_GROUPKEY, hdr, 2,
2614 pos = ieee80211w_kde_add(sm, pos);
2615 kde_len = pos - kde;
2618 kde_len = gsm->GTK_len;
2621 wpa_send_eapol(sm->wpa_auth, sm,
2622 WPA_KEY_INFO_SECURE | WPA_KEY_INFO_MIC |
2624 (!sm->Pair ? WPA_KEY_INFO_INSTALL : 0),
2625 rsc, gsm->GNonce, kde, kde_len, gsm->GN, 1);
2631 SM_STATE(WPA_PTK_GROUP, REKEYESTABLISHED)
2633 SM_ENTRY_MA(WPA_PTK_GROUP, REKEYESTABLISHED, wpa_ptk_group);
2634 sm->EAPOLKeyReceived = FALSE;
2635 if (sm->GUpdateStationKeys)
2636 sm->group->GKeyDoneStations--;
2637 sm->GUpdateStationKeys = FALSE;
2638 sm->GTimeoutCtr = 0;
2639 /* FIX: MLME.SetProtection.Request(TA, Tx_Rx) */
2640 wpa_auth_vlogger(sm->wpa_auth, sm->addr, LOGGER_INFO,
2641 "group key handshake completed (%s)",
2642 sm->wpa == WPA_VERSION_WPA ? "WPA" : "RSN");
2647 SM_STATE(WPA_PTK_GROUP, KEYERROR)
2649 SM_ENTRY_MA(WPA_PTK_GROUP, KEYERROR, wpa_ptk_group);
2650 if (sm->GUpdateStationKeys)
2651 sm->group->GKeyDoneStations--;
2652 sm->GUpdateStationKeys = FALSE;
2653 sm->Disconnect = TRUE;
2657 SM_STEP(WPA_PTK_GROUP)
2659 if (sm->Init || sm->PtkGroupInit) {
2660 SM_ENTER(WPA_PTK_GROUP, IDLE);
2661 sm->PtkGroupInit = FALSE;
2662 } else switch (sm->wpa_ptk_group_state) {
2663 case WPA_PTK_GROUP_IDLE:
2664 if (sm->GUpdateStationKeys ||
2665 (sm->wpa == WPA_VERSION_WPA && sm->PInitAKeys))
2666 SM_ENTER(WPA_PTK_GROUP, REKEYNEGOTIATING);
2668 case WPA_PTK_GROUP_REKEYNEGOTIATING:
2669 if (sm->EAPOLKeyReceived && !sm->EAPOLKeyRequest &&
2670 !sm->EAPOLKeyPairwise && sm->MICVerified)
2671 SM_ENTER(WPA_PTK_GROUP, REKEYESTABLISHED);
2672 else if (sm->GTimeoutCtr >
2673 (int) dot11RSNAConfigGroupUpdateCount)
2674 SM_ENTER(WPA_PTK_GROUP, KEYERROR);
2675 else if (sm->TimeoutEvt)
2676 SM_ENTER(WPA_PTK_GROUP, REKEYNEGOTIATING);
2678 case WPA_PTK_GROUP_KEYERROR:
2679 SM_ENTER(WPA_PTK_GROUP, IDLE);
2681 case WPA_PTK_GROUP_REKEYESTABLISHED:
2682 SM_ENTER(WPA_PTK_GROUP, IDLE);
2688 static int wpa_gtk_update(struct wpa_authenticator *wpa_auth,
2689 struct wpa_group *group)
2693 os_memcpy(group->GNonce, group->Counter, WPA_NONCE_LEN);
2694 inc_byte_array(group->Counter, WPA_NONCE_LEN);
2695 if (wpa_gmk_to_gtk(group->GMK, "Group key expansion",
2696 wpa_auth->addr, group->GNonce,
2697 group->GTK[group->GN - 1], group->GTK_len) < 0)
2699 wpa_hexdump_key(MSG_DEBUG, "GTK",
2700 group->GTK[group->GN - 1], group->GTK_len);
2702 #ifdef CONFIG_IEEE80211W
2703 if (wpa_auth->conf.ieee80211w != NO_MGMT_FRAME_PROTECTION) {
2705 len = wpa_cipher_key_len(wpa_auth->conf.group_mgmt_cipher);
2706 os_memcpy(group->GNonce, group->Counter, WPA_NONCE_LEN);
2707 inc_byte_array(group->Counter, WPA_NONCE_LEN);
2708 if (wpa_gmk_to_gtk(group->GMK, "IGTK key expansion",
2709 wpa_auth->addr, group->GNonce,
2710 group->IGTK[group->GN_igtk - 4], len) < 0)
2712 wpa_hexdump_key(MSG_DEBUG, "IGTK",
2713 group->IGTK[group->GN_igtk - 4], len);
2715 #endif /* CONFIG_IEEE80211W */
2721 static void wpa_group_gtk_init(struct wpa_authenticator *wpa_auth,
2722 struct wpa_group *group)
2724 wpa_printf(MSG_DEBUG, "WPA: group state machine entering state "
2725 "GTK_INIT (VLAN-ID %d)", group->vlan_id);
2726 group->changed = FALSE; /* GInit is not cleared here; avoid loop */
2727 group->wpa_group_state = WPA_GROUP_GTK_INIT;
2730 os_memset(group->GTK, 0, sizeof(group->GTK));
2733 #ifdef CONFIG_IEEE80211W
2736 #endif /* CONFIG_IEEE80211W */
2737 /* GTK[GN] = CalcGTK() */
2738 wpa_gtk_update(wpa_auth, group);
2742 static int wpa_group_update_sta(struct wpa_state_machine *sm, void *ctx)
2744 if (ctx != NULL && ctx != sm->group)
2747 if (sm->wpa_ptk_state != WPA_PTK_PTKINITDONE) {
2748 wpa_auth_logger(sm->wpa_auth, sm->addr, LOGGER_DEBUG,
2749 "Not in PTKINITDONE; skip Group Key update");
2750 sm->GUpdateStationKeys = FALSE;
2753 if (sm->GUpdateStationKeys) {
2755 * This should not really happen, so add a debug log entry.
2756 * Since we clear the GKeyDoneStations before the loop, the
2757 * station needs to be counted here anyway.
2759 wpa_auth_logger(sm->wpa_auth, sm->addr, LOGGER_DEBUG,
2760 "GUpdateStationKeys was already set when "
2761 "marking station for GTK rekeying");
2764 /* Do not rekey GTK/IGTK when STA is in WNM-Sleep Mode */
2765 if (sm->is_wnmsleep)
2768 sm->group->GKeyDoneStations++;
2769 sm->GUpdateStationKeys = TRUE;
2777 /* update GTK when exiting WNM-Sleep Mode */
2778 void wpa_wnmsleep_rekey_gtk(struct wpa_state_machine *sm)
2780 if (sm == NULL || sm->is_wnmsleep)
2783 wpa_group_update_sta(sm, NULL);
2787 void wpa_set_wnmsleep(struct wpa_state_machine *sm, int flag)
2790 sm->is_wnmsleep = !!flag;
2794 int wpa_wnmsleep_gtk_subelem(struct wpa_state_machine *sm, u8 *pos)
2796 struct wpa_group *gsm = sm->group;
2801 * Sub-elem ID[1] | Length[1] | Key Info[2] | Key Length[1] | RSC[8] |
2804 *pos++ = WNM_SLEEP_SUBELEM_GTK;
2805 *pos++ = 11 + gsm->GTK_len;
2806 /* Key ID in B0-B1 of Key Info */
2807 WPA_PUT_LE16(pos, gsm->GN & 0x03);
2809 *pos++ = gsm->GTK_len;
2810 if (wpa_auth_get_seqnum(sm->wpa_auth, NULL, gsm->GN, pos) != 0)
2813 os_memcpy(pos, gsm->GTK[gsm->GN - 1], gsm->GTK_len);
2814 pos += gsm->GTK_len;
2816 wpa_printf(MSG_DEBUG, "WNM: GTK Key ID %u in WNM-Sleep Mode exit",
2818 wpa_hexdump_key(MSG_DEBUG, "WNM: GTK in WNM-Sleep Mode exit",
2819 gsm->GTK[gsm->GN - 1], gsm->GTK_len);
2825 #ifdef CONFIG_IEEE80211W
2826 int wpa_wnmsleep_igtk_subelem(struct wpa_state_machine *sm, u8 *pos)
2828 struct wpa_group *gsm = sm->group;
2830 size_t len = wpa_cipher_key_len(sm->wpa_auth->conf.group_mgmt_cipher);
2834 * Sub-elem ID[1] | Length[1] | KeyID[2] | PN[6] | Key[16]
2836 *pos++ = WNM_SLEEP_SUBELEM_IGTK;
2837 *pos++ = 2 + 6 + len;
2838 WPA_PUT_LE16(pos, gsm->GN_igtk);
2840 if (wpa_auth_get_seqnum(sm->wpa_auth, NULL, gsm->GN_igtk, pos) != 0)
2844 os_memcpy(pos, gsm->IGTK[gsm->GN_igtk - 4], len);
2847 wpa_printf(MSG_DEBUG, "WNM: IGTK Key ID %u in WNM-Sleep Mode exit",
2849 wpa_hexdump_key(MSG_DEBUG, "WNM: IGTK in WNM-Sleep Mode exit",
2850 gsm->IGTK[gsm->GN_igtk - 4], len);
2854 #endif /* CONFIG_IEEE80211W */
2855 #endif /* CONFIG_WNM */
2858 static void wpa_group_setkeys(struct wpa_authenticator *wpa_auth,
2859 struct wpa_group *group)
2863 wpa_printf(MSG_DEBUG, "WPA: group state machine entering state "
2864 "SETKEYS (VLAN-ID %d)", group->vlan_id);
2865 group->changed = TRUE;
2866 group->wpa_group_state = WPA_GROUP_SETKEYS;
2867 group->GTKReKey = FALSE;
2869 group->GM = group->GN;
2871 #ifdef CONFIG_IEEE80211W
2872 tmp = group->GM_igtk;
2873 group->GM_igtk = group->GN_igtk;
2874 group->GN_igtk = tmp;
2875 #endif /* CONFIG_IEEE80211W */
2876 /* "GKeyDoneStations = GNoStations" is done in more robust way by
2877 * counting the STAs that are marked with GUpdateStationKeys instead of
2878 * including all STAs that could be in not-yet-completed state. */
2879 wpa_gtk_update(wpa_auth, group);
2881 if (group->GKeyDoneStations) {
2882 wpa_printf(MSG_DEBUG, "wpa_group_setkeys: Unexpected "
2883 "GKeyDoneStations=%d when starting new GTK rekey",
2884 group->GKeyDoneStations);
2885 group->GKeyDoneStations = 0;
2887 wpa_auth_for_each_sta(wpa_auth, wpa_group_update_sta, group);
2888 wpa_printf(MSG_DEBUG, "wpa_group_setkeys: GKeyDoneStations=%d",
2889 group->GKeyDoneStations);
2893 static int wpa_group_config_group_keys(struct wpa_authenticator *wpa_auth,
2894 struct wpa_group *group)
2898 if (wpa_auth_set_key(wpa_auth, group->vlan_id,
2899 wpa_cipher_to_alg(wpa_auth->conf.wpa_group),
2900 broadcast_ether_addr, group->GN,
2901 group->GTK[group->GN - 1], group->GTK_len) < 0)
2904 #ifdef CONFIG_IEEE80211W
2905 if (wpa_auth->conf.ieee80211w != NO_MGMT_FRAME_PROTECTION) {
2909 alg = wpa_cipher_to_alg(wpa_auth->conf.group_mgmt_cipher);
2910 len = wpa_cipher_key_len(wpa_auth->conf.group_mgmt_cipher);
2913 wpa_auth_set_key(wpa_auth, group->vlan_id, alg,
2914 broadcast_ether_addr, group->GN_igtk,
2915 group->IGTK[group->GN_igtk - 4], len) < 0)
2918 #endif /* CONFIG_IEEE80211W */
2924 static int wpa_group_disconnect_cb(struct wpa_state_machine *sm, void *ctx)
2926 if (sm->group == ctx) {
2927 wpa_printf(MSG_DEBUG, "WPA: Mark STA " MACSTR
2928 " for discconnection due to fatal failure",
2930 sm->Disconnect = TRUE;
2937 static void wpa_group_fatal_failure(struct wpa_authenticator *wpa_auth,
2938 struct wpa_group *group)
2940 wpa_printf(MSG_DEBUG, "WPA: group state machine entering state FATAL_FAILURE");
2941 group->changed = TRUE;
2942 group->wpa_group_state = WPA_GROUP_FATAL_FAILURE;
2943 wpa_auth_for_each_sta(wpa_auth, wpa_group_disconnect_cb, group);
2947 static int wpa_group_setkeysdone(struct wpa_authenticator *wpa_auth,
2948 struct wpa_group *group)
2950 wpa_printf(MSG_DEBUG, "WPA: group state machine entering state "
2951 "SETKEYSDONE (VLAN-ID %d)", group->vlan_id);
2952 group->changed = TRUE;
2953 group->wpa_group_state = WPA_GROUP_SETKEYSDONE;
2955 if (wpa_group_config_group_keys(wpa_auth, group) < 0) {
2956 wpa_group_fatal_failure(wpa_auth, group);
2964 static void wpa_group_sm_step(struct wpa_authenticator *wpa_auth,
2965 struct wpa_group *group)
2968 wpa_group_gtk_init(wpa_auth, group);
2969 } else if (group->wpa_group_state == WPA_GROUP_FATAL_FAILURE) {
2970 /* Do not allow group operations */
2971 } else if (group->wpa_group_state == WPA_GROUP_GTK_INIT &&
2972 group->GTKAuthenticator) {
2973 wpa_group_setkeysdone(wpa_auth, group);
2974 } else if (group->wpa_group_state == WPA_GROUP_SETKEYSDONE &&
2976 wpa_group_setkeys(wpa_auth, group);
2977 } else if (group->wpa_group_state == WPA_GROUP_SETKEYS) {
2978 if (group->GKeyDoneStations == 0)
2979 wpa_group_setkeysdone(wpa_auth, group);
2980 else if (group->GTKReKey)
2981 wpa_group_setkeys(wpa_auth, group);
2986 static int wpa_sm_step(struct wpa_state_machine *sm)
2991 if (sm->in_step_loop) {
2992 /* This should not happen, but if it does, make sure we do not
2993 * end up freeing the state machine too early by exiting the
2994 * recursive call. */
2995 wpa_printf(MSG_ERROR, "WPA: wpa_sm_step() called recursively");
2999 sm->in_step_loop = 1;
3001 if (sm->pending_deinit)
3004 sm->changed = FALSE;
3005 sm->wpa_auth->group->changed = FALSE;
3007 SM_STEP_RUN(WPA_PTK);
3008 if (sm->pending_deinit)
3010 SM_STEP_RUN(WPA_PTK_GROUP);
3011 if (sm->pending_deinit)
3013 wpa_group_sm_step(sm->wpa_auth, sm->group);
3014 } while (sm->changed || sm->wpa_auth->group->changed);
3015 sm->in_step_loop = 0;
3017 if (sm->pending_deinit) {
3018 wpa_printf(MSG_DEBUG, "WPA: Completing pending STA state "
3019 "machine deinit for " MACSTR, MAC2STR(sm->addr));
3020 wpa_free_sta_sm(sm);
3027 static void wpa_sm_call_step(void *eloop_ctx, void *timeout_ctx)
3029 struct wpa_state_machine *sm = eloop_ctx;
3034 void wpa_auth_sm_notify(struct wpa_state_machine *sm)
3038 eloop_register_timeout(0, 0, wpa_sm_call_step, sm, NULL);
3042 void wpa_gtk_rekey(struct wpa_authenticator *wpa_auth)
3045 struct wpa_group *group;
3047 if (wpa_auth == NULL)
3050 group = wpa_auth->group;
3052 for (i = 0; i < 2; i++) {
3054 group->GM = group->GN;
3056 #ifdef CONFIG_IEEE80211W
3057 tmp = group->GM_igtk;
3058 group->GM_igtk = group->GN_igtk;
3059 group->GN_igtk = tmp;
3060 #endif /* CONFIG_IEEE80211W */
3061 wpa_gtk_update(wpa_auth, group);
3062 wpa_group_config_group_keys(wpa_auth, group);
3067 static const char * wpa_bool_txt(int val)
3069 return val ? "TRUE" : "FALSE";
3073 #define RSN_SUITE "%02x-%02x-%02x-%d"
3074 #define RSN_SUITE_ARG(s) \
3075 ((s) >> 24) & 0xff, ((s) >> 16) & 0xff, ((s) >> 8) & 0xff, (s) & 0xff
3077 int wpa_get_mib(struct wpa_authenticator *wpa_auth, char *buf, size_t buflen)
3080 char pmkid_txt[PMKID_LEN * 2 + 1];
3081 #ifdef CONFIG_RSN_PREAUTH
3082 const int preauth = 1;
3083 #else /* CONFIG_RSN_PREAUTH */
3084 const int preauth = 0;
3085 #endif /* CONFIG_RSN_PREAUTH */
3087 if (wpa_auth == NULL)
3090 ret = os_snprintf(buf + len, buflen - len,
3091 "dot11RSNAOptionImplemented=TRUE\n"
3092 "dot11RSNAPreauthenticationImplemented=%s\n"
3093 "dot11RSNAEnabled=%s\n"
3094 "dot11RSNAPreauthenticationEnabled=%s\n",
3095 wpa_bool_txt(preauth),
3096 wpa_bool_txt(wpa_auth->conf.wpa & WPA_PROTO_RSN),
3097 wpa_bool_txt(wpa_auth->conf.rsn_preauth));
3098 if (os_snprintf_error(buflen - len, ret))
3102 wpa_snprintf_hex(pmkid_txt, sizeof(pmkid_txt),
3103 wpa_auth->dot11RSNAPMKIDUsed, PMKID_LEN);
3106 buf + len, buflen - len,
3107 "dot11RSNAConfigVersion=%u\n"
3108 "dot11RSNAConfigPairwiseKeysSupported=9999\n"
3109 /* FIX: dot11RSNAConfigGroupCipher */
3110 /* FIX: dot11RSNAConfigGroupRekeyMethod */
3111 /* FIX: dot11RSNAConfigGroupRekeyTime */
3112 /* FIX: dot11RSNAConfigGroupRekeyPackets */
3113 "dot11RSNAConfigGroupRekeyStrict=%u\n"
3114 "dot11RSNAConfigGroupUpdateCount=%u\n"
3115 "dot11RSNAConfigPairwiseUpdateCount=%u\n"
3116 "dot11RSNAConfigGroupCipherSize=%u\n"
3117 "dot11RSNAConfigPMKLifetime=%u\n"
3118 "dot11RSNAConfigPMKReauthThreshold=%u\n"
3119 "dot11RSNAConfigNumberOfPTKSAReplayCounters=0\n"
3120 "dot11RSNAConfigSATimeout=%u\n"
3121 "dot11RSNAAuthenticationSuiteSelected=" RSN_SUITE "\n"
3122 "dot11RSNAPairwiseCipherSelected=" RSN_SUITE "\n"
3123 "dot11RSNAGroupCipherSelected=" RSN_SUITE "\n"
3124 "dot11RSNAPMKIDUsed=%s\n"
3125 "dot11RSNAAuthenticationSuiteRequested=" RSN_SUITE "\n"
3126 "dot11RSNAPairwiseCipherRequested=" RSN_SUITE "\n"
3127 "dot11RSNAGroupCipherRequested=" RSN_SUITE "\n"
3128 "dot11RSNATKIPCounterMeasuresInvoked=%u\n"
3129 "dot11RSNA4WayHandshakeFailures=%u\n"
3130 "dot11RSNAConfigNumberOfGTKSAReplayCounters=0\n",
3132 !!wpa_auth->conf.wpa_strict_rekey,
3133 dot11RSNAConfigGroupUpdateCount,
3134 dot11RSNAConfigPairwiseUpdateCount,
3135 wpa_cipher_key_len(wpa_auth->conf.wpa_group) * 8,
3136 dot11RSNAConfigPMKLifetime,
3137 dot11RSNAConfigPMKReauthThreshold,
3138 dot11RSNAConfigSATimeout,
3139 RSN_SUITE_ARG(wpa_auth->dot11RSNAAuthenticationSuiteSelected),
3140 RSN_SUITE_ARG(wpa_auth->dot11RSNAPairwiseCipherSelected),
3141 RSN_SUITE_ARG(wpa_auth->dot11RSNAGroupCipherSelected),
3143 RSN_SUITE_ARG(wpa_auth->dot11RSNAAuthenticationSuiteRequested),
3144 RSN_SUITE_ARG(wpa_auth->dot11RSNAPairwiseCipherRequested),
3145 RSN_SUITE_ARG(wpa_auth->dot11RSNAGroupCipherRequested),
3146 wpa_auth->dot11RSNATKIPCounterMeasuresInvoked,
3147 wpa_auth->dot11RSNA4WayHandshakeFailures);
3148 if (os_snprintf_error(buflen - len, ret))
3152 /* TODO: dot11RSNAConfigPairwiseCiphersTable */
3153 /* TODO: dot11RSNAConfigAuthenticationSuitesTable */
3156 ret = os_snprintf(buf + len, buflen - len, "hostapdWPAGroupState=%d\n",
3157 wpa_auth->group->wpa_group_state);
3158 if (os_snprintf_error(buflen - len, ret))
3166 int wpa_get_mib_sta(struct wpa_state_machine *sm, char *buf, size_t buflen)
3174 /* TODO: FF-FF-FF-FF-FF-FF entry for broadcast/multicast stats */
3176 /* dot11RSNAStatsEntry */
3178 pairwise = wpa_cipher_to_suite(sm->wpa == WPA_VERSION_WPA2 ?
3179 WPA_PROTO_RSN : WPA_PROTO_WPA,
3185 buf + len, buflen - len,
3186 /* TODO: dot11RSNAStatsIndex */
3187 "dot11RSNAStatsSTAAddress=" MACSTR "\n"
3188 "dot11RSNAStatsVersion=1\n"
3189 "dot11RSNAStatsSelectedPairwiseCipher=" RSN_SUITE "\n"
3190 /* TODO: dot11RSNAStatsTKIPICVErrors */
3191 "dot11RSNAStatsTKIPLocalMICFailures=%u\n"
3192 "dot11RSNAStatsTKIPRemoteMICFailures=%u\n"
3193 /* TODO: dot11RSNAStatsCCMPReplays */
3194 /* TODO: dot11RSNAStatsCCMPDecryptErrors */
3195 /* TODO: dot11RSNAStatsTKIPReplays */,
3197 RSN_SUITE_ARG(pairwise),
3198 sm->dot11RSNAStatsTKIPLocalMICFailures,
3199 sm->dot11RSNAStatsTKIPRemoteMICFailures);
3200 if (os_snprintf_error(buflen - len, ret))
3205 ret = os_snprintf(buf + len, buflen - len,
3206 "hostapdWPAPTKState=%d\n"
3207 "hostapdWPAPTKGroupState=%d\n",
3209 sm->wpa_ptk_group_state);
3210 if (os_snprintf_error(buflen - len, ret))
3218 void wpa_auth_countermeasures_start(struct wpa_authenticator *wpa_auth)
3221 wpa_auth->dot11RSNATKIPCounterMeasuresInvoked++;
3225 int wpa_auth_pairwise_set(struct wpa_state_machine *sm)
3227 return sm && sm->pairwise_set;
3231 int wpa_auth_get_pairwise(struct wpa_state_machine *sm)
3233 return sm->pairwise;
3237 int wpa_auth_sta_key_mgmt(struct wpa_state_machine *sm)
3241 return sm->wpa_key_mgmt;
3245 int wpa_auth_sta_wpa_version(struct wpa_state_machine *sm)
3253 int wpa_auth_sta_clear_pmksa(struct wpa_state_machine *sm,
3254 struct rsn_pmksa_cache_entry *entry)
3256 if (sm == NULL || sm->pmksa != entry)
3263 struct rsn_pmksa_cache_entry *
3264 wpa_auth_sta_get_pmksa(struct wpa_state_machine *sm)
3266 return sm ? sm->pmksa : NULL;
3270 void wpa_auth_sta_local_mic_failure_report(struct wpa_state_machine *sm)
3273 sm->dot11RSNAStatsTKIPLocalMICFailures++;
3277 const u8 * wpa_auth_get_wpa_ie(struct wpa_authenticator *wpa_auth, size_t *len)
3279 if (wpa_auth == NULL)
3281 *len = wpa_auth->wpa_ie_len;
3282 return wpa_auth->wpa_ie;
3286 int wpa_auth_pmksa_add(struct wpa_state_machine *sm, const u8 *pmk,
3287 unsigned int pmk_len,
3288 int session_timeout, struct eapol_state_machine *eapol)
3290 if (sm == NULL || sm->wpa != WPA_VERSION_WPA2 ||
3291 sm->wpa_auth->conf.disable_pmksa_caching)
3294 if (sm->wpa_key_mgmt & WPA_KEY_MGMT_IEEE8021X_SUITE_B_192) {
3295 if (pmk_len > PMK_LEN_SUITE_B_192)
3296 pmk_len = PMK_LEN_SUITE_B_192;
3297 } else if (pmk_len > PMK_LEN) {
3301 if (pmksa_cache_auth_add(sm->wpa_auth->pmksa, pmk, pmk_len, NULL,
3302 sm->PTK.kck, sm->PTK.kck_len,
3303 sm->wpa_auth->addr, sm->addr, session_timeout,
3304 eapol, sm->wpa_key_mgmt))
3311 int wpa_auth_pmksa_add_preauth(struct wpa_authenticator *wpa_auth,
3312 const u8 *pmk, size_t len, const u8 *sta_addr,
3313 int session_timeout,
3314 struct eapol_state_machine *eapol)
3316 if (wpa_auth == NULL)
3319 if (pmksa_cache_auth_add(wpa_auth->pmksa, pmk, len, NULL,
3322 sta_addr, session_timeout, eapol,
3323 WPA_KEY_MGMT_IEEE8021X))
3330 int wpa_auth_pmksa_add_sae(struct wpa_authenticator *wpa_auth, const u8 *addr,
3331 const u8 *pmk, const u8 *pmkid)
3333 if (wpa_auth->conf.disable_pmksa_caching)
3336 if (pmksa_cache_auth_add(wpa_auth->pmksa, pmk, PMK_LEN, pmkid,
3338 wpa_auth->addr, addr, 0, NULL,
3346 void wpa_auth_pmksa_remove(struct wpa_authenticator *wpa_auth,
3349 struct rsn_pmksa_cache_entry *pmksa;
3351 if (wpa_auth == NULL || wpa_auth->pmksa == NULL)
3353 pmksa = pmksa_cache_auth_get(wpa_auth->pmksa, sta_addr, NULL);
3355 wpa_printf(MSG_DEBUG, "WPA: Remove PMKSA cache entry for "
3356 MACSTR " based on request", MAC2STR(sta_addr));
3357 pmksa_cache_free_entry(wpa_auth->pmksa, pmksa);
3362 int wpa_auth_pmksa_list(struct wpa_authenticator *wpa_auth, char *buf,
3365 if (!wpa_auth || !wpa_auth->pmksa)
3367 return pmksa_cache_auth_list(wpa_auth->pmksa, buf, len);
3371 void wpa_auth_pmksa_flush(struct wpa_authenticator *wpa_auth)
3373 if (wpa_auth && wpa_auth->pmksa)
3374 pmksa_cache_auth_flush(wpa_auth->pmksa);
3378 struct rsn_pmksa_cache_entry *
3379 wpa_auth_pmksa_get(struct wpa_authenticator *wpa_auth, const u8 *sta_addr)
3381 if (!wpa_auth || !wpa_auth->pmksa)
3383 return pmksa_cache_auth_get(wpa_auth->pmksa, sta_addr, NULL);
3387 void wpa_auth_pmksa_set_to_sm(struct rsn_pmksa_cache_entry *pmksa,
3388 struct wpa_state_machine *sm,
3389 struct wpa_authenticator *wpa_auth,
3396 os_memcpy(pmk, pmksa->pmk, PMK_LEN);
3397 os_memcpy(pmkid, pmksa->pmkid, PMKID_LEN);
3398 os_memcpy(wpa_auth->dot11RSNAPMKIDUsed, pmksa->pmkid, PMKID_LEN);
3403 * Remove and free the group from wpa_authenticator. This is triggered by a
3404 * callback to make sure nobody is currently iterating the group list while it
3407 static void wpa_group_free(struct wpa_authenticator *wpa_auth,
3408 struct wpa_group *group)
3410 struct wpa_group *prev = wpa_auth->group;
3412 wpa_printf(MSG_DEBUG, "WPA: Remove group state machine for VLAN-ID %d",
3416 if (prev->next == group) {
3417 /* This never frees the special first group as needed */
3418 prev->next = group->next;
3428 /* Increase the reference counter for group */
3429 static void wpa_group_get(struct wpa_authenticator *wpa_auth,
3430 struct wpa_group *group)
3432 /* Skip the special first group */
3433 if (wpa_auth->group == group)
3436 group->references++;
3440 /* Decrease the reference counter and maybe free the group */
3441 static void wpa_group_put(struct wpa_authenticator *wpa_auth,
3442 struct wpa_group *group)
3444 /* Skip the special first group */
3445 if (wpa_auth->group == group)
3448 group->references--;
3449 if (group->references)
3451 wpa_group_free(wpa_auth, group);
3456 * Add a group that has its references counter set to zero. Caller needs to
3457 * call wpa_group_get() on the return value to mark the entry in use.
3459 static struct wpa_group *
3460 wpa_auth_add_group(struct wpa_authenticator *wpa_auth, int vlan_id)
3462 struct wpa_group *group;
3464 if (wpa_auth == NULL || wpa_auth->group == NULL)
3467 wpa_printf(MSG_DEBUG, "WPA: Add group state machine for VLAN-ID %d",
3469 group = wpa_group_init(wpa_auth, vlan_id, 0);
3473 group->next = wpa_auth->group->next;
3474 wpa_auth->group->next = group;
3481 * Enforce that the group state machine for the VLAN is running, increase
3482 * reference counter as interface is up. References might have been increased
3483 * even if a negative value is returned.
3484 * Returns: -1 on error (group missing, group already failed); otherwise, 0
3486 int wpa_auth_ensure_group(struct wpa_authenticator *wpa_auth, int vlan_id)
3488 struct wpa_group *group;
3490 if (wpa_auth == NULL)
3493 group = wpa_auth->group;
3495 if (group->vlan_id == vlan_id)
3497 group = group->next;
3500 if (group == NULL) {
3501 group = wpa_auth_add_group(wpa_auth, vlan_id);
3506 wpa_printf(MSG_DEBUG,
3507 "WPA: Ensure group state machine running for VLAN ID %d",
3510 wpa_group_get(wpa_auth, group);
3511 group->num_setup_iface++;
3513 if (group->wpa_group_state == WPA_GROUP_FATAL_FAILURE)
3521 * Decrease reference counter, expected to be zero afterwards.
3522 * returns: -1 on error (group not found, group in fail state)
3523 * -2 if wpa_group is still referenced
3526 int wpa_auth_release_group(struct wpa_authenticator *wpa_auth, int vlan_id)
3528 struct wpa_group *group;
3531 if (wpa_auth == NULL)
3534 group = wpa_auth->group;
3536 if (group->vlan_id == vlan_id)
3538 group = group->next;
3544 wpa_printf(MSG_DEBUG,
3545 "WPA: Try stopping group state machine for VLAN ID %d",
3548 if (group->num_setup_iface <= 0) {
3549 wpa_printf(MSG_ERROR,
3550 "WPA: wpa_auth_release_group called more often than wpa_auth_ensure_group for VLAN ID %d, skipping.",
3554 group->num_setup_iface--;
3556 if (group->wpa_group_state == WPA_GROUP_FATAL_FAILURE)
3559 if (group->references > 1) {
3560 wpa_printf(MSG_DEBUG,
3561 "WPA: Cannot stop group state machine for VLAN ID %d as references are still hold",
3566 wpa_group_put(wpa_auth, group);
3572 int wpa_auth_sta_set_vlan(struct wpa_state_machine *sm, int vlan_id)
3574 struct wpa_group *group;
3576 if (sm == NULL || sm->wpa_auth == NULL)
3579 group = sm->wpa_auth->group;
3581 if (group->vlan_id == vlan_id)
3583 group = group->next;
3586 if (group == NULL) {
3587 group = wpa_auth_add_group(sm->wpa_auth, vlan_id);
3592 if (sm->group == group)
3595 if (group->wpa_group_state == WPA_GROUP_FATAL_FAILURE)
3598 wpa_printf(MSG_DEBUG, "WPA: Moving STA " MACSTR " to use group state "
3599 "machine for VLAN ID %d", MAC2STR(sm->addr), vlan_id);
3601 wpa_group_get(sm->wpa_auth, group);
3602 wpa_group_put(sm->wpa_auth, sm->group);
3609 void wpa_auth_eapol_key_tx_status(struct wpa_authenticator *wpa_auth,
3610 struct wpa_state_machine *sm, int ack)
3612 if (wpa_auth == NULL || sm == NULL)
3614 wpa_printf(MSG_DEBUG, "WPA: EAPOL-Key TX status for STA " MACSTR
3615 " ack=%d", MAC2STR(sm->addr), ack);
3616 if (sm->pending_1_of_4_timeout && ack) {
3618 * Some deployed supplicant implementations update their SNonce
3619 * for each EAPOL-Key 2/4 message even within the same 4-way
3620 * handshake and then fail to use the first SNonce when
3621 * deriving the PTK. This results in unsuccessful 4-way
3622 * handshake whenever the relatively short initial timeout is
3623 * reached and EAPOL-Key 1/4 is retransmitted. Try to work
3624 * around this by increasing the timeout now that we know that
3625 * the station has received the frame.
3627 int timeout_ms = eapol_key_timeout_subseq;
3628 wpa_printf(MSG_DEBUG, "WPA: Increase initial EAPOL-Key 1/4 "
3629 "timeout by %u ms because of acknowledged frame",
3631 eloop_cancel_timeout(wpa_send_eapol_timeout, wpa_auth, sm);
3632 eloop_register_timeout(timeout_ms / 1000,
3633 (timeout_ms % 1000) * 1000,
3634 wpa_send_eapol_timeout, wpa_auth, sm);
3639 int wpa_auth_uses_sae(struct wpa_state_machine *sm)
3643 return wpa_key_mgmt_sae(sm->wpa_key_mgmt);
3647 int wpa_auth_uses_ft_sae(struct wpa_state_machine *sm)
3651 return sm->wpa_key_mgmt == WPA_KEY_MGMT_FT_SAE;
3656 int wpa_auth_get_ip_addr(struct wpa_state_machine *sm, u8 *addr)
3658 if (sm == NULL || WPA_GET_BE32(sm->ip_addr) == 0)
3660 os_memcpy(addr, sm->ip_addr, 4);
3663 #endif /* CONFIG_P2P */
3666 int wpa_auth_radius_das_disconnect_pmksa(struct wpa_authenticator *wpa_auth,
3667 struct radius_das_attrs *attr)
3669 return pmksa_cache_auth_radius_das_disconnect(wpa_auth->pmksa, attr);
3673 void wpa_auth_reconfig_group_keys(struct wpa_authenticator *wpa_auth)
3675 struct wpa_group *group;
3679 for (group = wpa_auth->group; group; group = group->next)
3680 wpa_group_config_group_keys(wpa_auth, group);