OSDN Git Service

BRCM P2P update
[android-x86/external-wpa_supplicant_8.git] / src / ap / wpa_auth.c
1 /*
2  * hostapd - IEEE 802.11i-2004 / WPA Authenticator
3  * Copyright (c) 2004-2009, Jouni Malinen <j@w1.fi>
4  *
5  * This program is free software; you can redistribute it and/or modify
6  * it under the terms of the GNU General Public License version 2 as
7  * published by the Free Software Foundation.
8  *
9  * Alternatively, this software may be distributed under the terms of BSD
10  * license.
11  *
12  * See README and COPYING for more details.
13  */
14
15 #include "utils/includes.h"
16
17 #include "utils/common.h"
18 #include "utils/eloop.h"
19 #include "utils/state_machine.h"
20 #include "common/ieee802_11_defs.h"
21 #include "crypto/aes_wrap.h"
22 #include "crypto/crypto.h"
23 #include "crypto/sha1.h"
24 #include "crypto/sha256.h"
25 #include "crypto/random.h"
26 #include "eapol_auth/eapol_auth_sm.h"
27 #include "ap_config.h"
28 #include "ieee802_11.h"
29 #include "wpa_auth.h"
30 #include "pmksa_cache_auth.h"
31 #include "wpa_auth_i.h"
32 #include "wpa_auth_ie.h"
33
34 #define STATE_MACHINE_DATA struct wpa_state_machine
35 #define STATE_MACHINE_DEBUG_PREFIX "WPA"
36 #define STATE_MACHINE_ADDR sm->addr
37
38
39 static void wpa_send_eapol_timeout(void *eloop_ctx, void *timeout_ctx);
40 static int wpa_sm_step(struct wpa_state_machine *sm);
41 static int wpa_verify_key_mic(struct wpa_ptk *PTK, u8 *data, size_t data_len);
42 static void wpa_sm_call_step(void *eloop_ctx, void *timeout_ctx);
43 static void wpa_group_sm_step(struct wpa_authenticator *wpa_auth,
44                               struct wpa_group *group);
45 static void wpa_request_new_ptk(struct wpa_state_machine *sm);
46 static int wpa_gtk_update(struct wpa_authenticator *wpa_auth,
47                           struct wpa_group *group);
48 static int wpa_group_config_group_keys(struct wpa_authenticator *wpa_auth,
49                                        struct wpa_group *group);
50
51 static const u32 dot11RSNAConfigGroupUpdateCount = 4;
52 static const u32 dot11RSNAConfigPairwiseUpdateCount = 4;
53 static const u32 eapol_key_timeout_first = 100; /* ms */
54 static const u32 eapol_key_timeout_subseq = 1000; /* ms */
55
56 /* TODO: make these configurable */
57 static const int dot11RSNAConfigPMKLifetime = 43200;
58 static const int dot11RSNAConfigPMKReauthThreshold = 70;
59 static const int dot11RSNAConfigSATimeout = 60;
60
61
62 static inline void wpa_auth_mic_failure_report(
63         struct wpa_authenticator *wpa_auth, const u8 *addr)
64 {
65         if (wpa_auth->cb.mic_failure_report)
66                 wpa_auth->cb.mic_failure_report(wpa_auth->cb.ctx, addr);
67 }
68
69
70 static inline void wpa_auth_set_eapol(struct wpa_authenticator *wpa_auth,
71                                       const u8 *addr, wpa_eapol_variable var,
72                                       int value)
73 {
74         if (wpa_auth->cb.set_eapol)
75                 wpa_auth->cb.set_eapol(wpa_auth->cb.ctx, addr, var, value);
76 }
77
78
79 static inline int wpa_auth_get_eapol(struct wpa_authenticator *wpa_auth,
80                                      const u8 *addr, wpa_eapol_variable var)
81 {
82         if (wpa_auth->cb.get_eapol == NULL)
83                 return -1;
84         return wpa_auth->cb.get_eapol(wpa_auth->cb.ctx, addr, var);
85 }
86
87
88 static inline const u8 * wpa_auth_get_psk(struct wpa_authenticator *wpa_auth,
89                                           const u8 *addr, const u8 *prev_psk)
90 {
91         if (wpa_auth->cb.get_psk == NULL)
92                 return NULL;
93         return wpa_auth->cb.get_psk(wpa_auth->cb.ctx, addr, prev_psk);
94 }
95
96
97 static inline int wpa_auth_get_msk(struct wpa_authenticator *wpa_auth,
98                                    const u8 *addr, u8 *msk, size_t *len)
99 {
100         if (wpa_auth->cb.get_msk == NULL)
101                 return -1;
102         return wpa_auth->cb.get_msk(wpa_auth->cb.ctx, addr, msk, len);
103 }
104
105
106 static inline int wpa_auth_set_key(struct wpa_authenticator *wpa_auth,
107                                    int vlan_id,
108                                    enum wpa_alg alg, const u8 *addr, int idx,
109                                    u8 *key, size_t key_len)
110 {
111         if (wpa_auth->cb.set_key == NULL)
112                 return -1;
113         return wpa_auth->cb.set_key(wpa_auth->cb.ctx, vlan_id, alg, addr, idx,
114                                     key, key_len);
115 }
116
117
118 static inline int wpa_auth_get_seqnum(struct wpa_authenticator *wpa_auth,
119                                       const u8 *addr, int idx, u8 *seq)
120 {
121         if (wpa_auth->cb.get_seqnum == NULL)
122                 return -1;
123         return wpa_auth->cb.get_seqnum(wpa_auth->cb.ctx, addr, idx, seq);
124 }
125
126
127 static inline int
128 wpa_auth_send_eapol(struct wpa_authenticator *wpa_auth, const u8 *addr,
129                     const u8 *data, size_t data_len, int encrypt)
130 {
131         if (wpa_auth->cb.send_eapol == NULL)
132                 return -1;
133         return wpa_auth->cb.send_eapol(wpa_auth->cb.ctx, addr, data, data_len,
134                                        encrypt);
135 }
136
137
138 int wpa_auth_for_each_sta(struct wpa_authenticator *wpa_auth,
139                           int (*cb)(struct wpa_state_machine *sm, void *ctx),
140                           void *cb_ctx)
141 {
142         if (wpa_auth->cb.for_each_sta == NULL)
143                 return 0;
144         return wpa_auth->cb.for_each_sta(wpa_auth->cb.ctx, cb, cb_ctx);
145 }
146
147
148 int wpa_auth_for_each_auth(struct wpa_authenticator *wpa_auth,
149                            int (*cb)(struct wpa_authenticator *a, void *ctx),
150                            void *cb_ctx)
151 {
152         if (wpa_auth->cb.for_each_auth == NULL)
153                 return 0;
154         return wpa_auth->cb.for_each_auth(wpa_auth->cb.ctx, cb, cb_ctx);
155 }
156
157
158 void wpa_auth_logger(struct wpa_authenticator *wpa_auth, const u8 *addr,
159                      logger_level level, const char *txt)
160 {
161         if (wpa_auth->cb.logger == NULL)
162                 return;
163         wpa_auth->cb.logger(wpa_auth->cb.ctx, addr, level, txt);
164 }
165
166
167 void wpa_auth_vlogger(struct wpa_authenticator *wpa_auth, const u8 *addr,
168                       logger_level level, const char *fmt, ...)
169 {
170         char *format;
171         int maxlen;
172         va_list ap;
173
174         if (wpa_auth->cb.logger == NULL)
175                 return;
176
177         maxlen = os_strlen(fmt) + 100;
178         format = os_malloc(maxlen);
179         if (!format)
180                 return;
181
182         va_start(ap, fmt);
183         vsnprintf(format, maxlen, fmt, ap);
184         va_end(ap);
185
186         wpa_auth_logger(wpa_auth, addr, level, format);
187
188         os_free(format);
189 }
190
191
192 static void wpa_sta_disconnect(struct wpa_authenticator *wpa_auth,
193                                const u8 *addr)
194 {
195         if (wpa_auth->cb.disconnect == NULL)
196                 return;
197         wpa_auth->cb.disconnect(wpa_auth->cb.ctx, addr,
198                                 WLAN_REASON_PREV_AUTH_NOT_VALID);
199 }
200
201
202 static int wpa_use_aes_cmac(struct wpa_state_machine *sm)
203 {
204         int ret = 0;
205 #ifdef CONFIG_IEEE80211R
206         if (wpa_key_mgmt_ft(sm->wpa_key_mgmt))
207                 ret = 1;
208 #endif /* CONFIG_IEEE80211R */
209 #ifdef CONFIG_IEEE80211W
210         if (wpa_key_mgmt_sha256(sm->wpa_key_mgmt))
211                 ret = 1;
212 #endif /* CONFIG_IEEE80211W */
213         return ret;
214 }
215
216
217 static void wpa_rekey_gmk(void *eloop_ctx, void *timeout_ctx)
218 {
219         struct wpa_authenticator *wpa_auth = eloop_ctx;
220
221         if (random_get_bytes(wpa_auth->group->GMK, WPA_GMK_LEN)) {
222                 wpa_printf(MSG_ERROR, "Failed to get random data for WPA "
223                            "initialization.");
224         } else {
225                 wpa_auth_logger(wpa_auth, NULL, LOGGER_DEBUG, "GMK rekeyd");
226                 wpa_hexdump_key(MSG_DEBUG, "GMK",
227                                 wpa_auth->group->GMK, WPA_GMK_LEN);
228         }
229
230         if (wpa_auth->conf.wpa_gmk_rekey) {
231                 eloop_register_timeout(wpa_auth->conf.wpa_gmk_rekey, 0,
232                                        wpa_rekey_gmk, wpa_auth, NULL);
233         }
234 }
235
236
237 static void wpa_rekey_gtk(void *eloop_ctx, void *timeout_ctx)
238 {
239         struct wpa_authenticator *wpa_auth = eloop_ctx;
240         struct wpa_group *group;
241
242         wpa_auth_logger(wpa_auth, NULL, LOGGER_DEBUG, "rekeying GTK");
243         for (group = wpa_auth->group; group; group = group->next) {
244                 group->GTKReKey = TRUE;
245                 do {
246                         group->changed = FALSE;
247                         wpa_group_sm_step(wpa_auth, group);
248                 } while (group->changed);
249         }
250
251         if (wpa_auth->conf.wpa_group_rekey) {
252                 eloop_register_timeout(wpa_auth->conf.wpa_group_rekey,
253                                        0, wpa_rekey_gtk, wpa_auth, NULL);
254         }
255 }
256
257
258 static void wpa_rekey_ptk(void *eloop_ctx, void *timeout_ctx)
259 {
260         struct wpa_authenticator *wpa_auth = eloop_ctx;
261         struct wpa_state_machine *sm = timeout_ctx;
262
263         wpa_auth_logger(wpa_auth, sm->addr, LOGGER_DEBUG, "rekeying PTK");
264         wpa_request_new_ptk(sm);
265         wpa_sm_step(sm);
266 }
267
268
269 static int wpa_auth_pmksa_clear_cb(struct wpa_state_machine *sm, void *ctx)
270 {
271         if (sm->pmksa == ctx)
272                 sm->pmksa = NULL;
273         return 0;
274 }
275
276
277 static void wpa_auth_pmksa_free_cb(struct rsn_pmksa_cache_entry *entry,
278                                    void *ctx)
279 {
280         struct wpa_authenticator *wpa_auth = ctx;
281         wpa_auth_for_each_sta(wpa_auth, wpa_auth_pmksa_clear_cb, entry);
282 }
283
284
285 static void wpa_group_set_key_len(struct wpa_group *group, int cipher)
286 {
287         switch (cipher) {
288         case WPA_CIPHER_CCMP:
289                 group->GTK_len = 16;
290                 break;
291         case WPA_CIPHER_TKIP:
292                 group->GTK_len = 32;
293                 break;
294         case WPA_CIPHER_WEP104:
295                 group->GTK_len = 13;
296                 break;
297         case WPA_CIPHER_WEP40:
298                 group->GTK_len = 5;
299                 break;
300         }
301 }
302
303
304 static int wpa_group_init_gmk_and_counter(struct wpa_authenticator *wpa_auth,
305                                           struct wpa_group *group)
306 {
307         u8 buf[ETH_ALEN + 8 + sizeof(group)];
308         u8 rkey[32];
309
310         if (random_get_bytes(group->GMK, WPA_GMK_LEN) < 0)
311                 return -1;
312         wpa_hexdump_key(MSG_DEBUG, "GMK", group->GMK, WPA_GMK_LEN);
313
314         /*
315          * Counter = PRF-256(Random number, "Init Counter",
316          *                   Local MAC Address || Time)
317          */
318         os_memcpy(buf, wpa_auth->addr, ETH_ALEN);
319         wpa_get_ntp_timestamp(buf + ETH_ALEN);
320         os_memcpy(buf + ETH_ALEN + 8, &group, sizeof(group));
321         if (random_get_bytes(rkey, sizeof(rkey)) < 0)
322                 return -1;
323
324         if (sha1_prf(rkey, sizeof(rkey), "Init Counter", buf, sizeof(buf),
325                      group->Counter, WPA_NONCE_LEN) < 0)
326                 return -1;
327         wpa_hexdump_key(MSG_DEBUG, "Key Counter",
328                         group->Counter, WPA_NONCE_LEN);
329
330         return 0;
331 }
332
333
334 static struct wpa_group * wpa_group_init(struct wpa_authenticator *wpa_auth,
335                                          int vlan_id)
336 {
337         struct wpa_group *group;
338
339         group = os_zalloc(sizeof(struct wpa_group));
340         if (group == NULL)
341                 return NULL;
342
343         group->GTKAuthenticator = TRUE;
344         group->vlan_id = vlan_id;
345
346         wpa_group_set_key_len(group, wpa_auth->conf.wpa_group);
347
348         if (random_pool_ready() != 1) {
349                 wpa_printf(MSG_INFO, "WPA: Not enough entropy in random pool "
350                            "for secure operations - update keys later when "
351                            "the first station connects");
352 #ifdef ANDROID_BRCM_P2P_PATCH
353                 os_free(group);
354                 return NULL;
355 #endif
356         }
357
358         /*
359          * Set initial GMK/Counter value here. The actual values that will be
360          * used in negotiations will be set once the first station tries to
361          * connect. This allows more time for collecting additional randomness
362          * on embedded devices.
363          */
364         if (wpa_group_init_gmk_and_counter(wpa_auth, group) < 0) {
365                 wpa_printf(MSG_ERROR, "Failed to get random data for WPA "
366                            "initialization.");
367                 os_free(group);
368                 return NULL;
369         }
370
371         group->GInit = TRUE;
372         wpa_group_sm_step(wpa_auth, group);
373         group->GInit = FALSE;
374         wpa_group_sm_step(wpa_auth, group);
375
376         return group;
377 }
378
379
380 /**
381  * wpa_init - Initialize WPA authenticator
382  * @addr: Authenticator address
383  * @conf: Configuration for WPA authenticator
384  * @cb: Callback functions for WPA authenticator
385  * Returns: Pointer to WPA authenticator data or %NULL on failure
386  */
387 struct wpa_authenticator * wpa_init(const u8 *addr,
388                                     struct wpa_auth_config *conf,
389                                     struct wpa_auth_callbacks *cb)
390 {
391         struct wpa_authenticator *wpa_auth;
392
393         wpa_auth = os_zalloc(sizeof(struct wpa_authenticator));
394         if (wpa_auth == NULL)
395                 return NULL;
396         os_memcpy(wpa_auth->addr, addr, ETH_ALEN);
397         os_memcpy(&wpa_auth->conf, conf, sizeof(*conf));
398         os_memcpy(&wpa_auth->cb, cb, sizeof(*cb));
399
400         if (wpa_auth_gen_wpa_ie(wpa_auth)) {
401                 wpa_printf(MSG_ERROR, "Could not generate WPA IE.");
402                 os_free(wpa_auth);
403                 return NULL;
404         }
405
406         wpa_auth->group = wpa_group_init(wpa_auth, 0);
407         if (wpa_auth->group == NULL) {
408                 os_free(wpa_auth->wpa_ie);
409                 os_free(wpa_auth);
410                 return NULL;
411         }
412
413         wpa_auth->pmksa = pmksa_cache_auth_init(wpa_auth_pmksa_free_cb,
414                                                 wpa_auth);
415         if (wpa_auth->pmksa == NULL) {
416                 wpa_printf(MSG_ERROR, "PMKSA cache initialization failed.");
417                 os_free(wpa_auth->wpa_ie);
418                 os_free(wpa_auth);
419                 return NULL;
420         }
421
422 #ifdef CONFIG_IEEE80211R
423         wpa_auth->ft_pmk_cache = wpa_ft_pmk_cache_init();
424         if (wpa_auth->ft_pmk_cache == NULL) {
425                 wpa_printf(MSG_ERROR, "FT PMK cache initialization failed.");
426                 os_free(wpa_auth->wpa_ie);
427                 pmksa_cache_auth_deinit(wpa_auth->pmksa);
428                 os_free(wpa_auth);
429                 return NULL;
430         }
431 #endif /* CONFIG_IEEE80211R */
432
433         if (wpa_auth->conf.wpa_gmk_rekey) {
434                 eloop_register_timeout(wpa_auth->conf.wpa_gmk_rekey, 0,
435                                        wpa_rekey_gmk, wpa_auth, NULL);
436         }
437
438         if (wpa_auth->conf.wpa_group_rekey) {
439                 eloop_register_timeout(wpa_auth->conf.wpa_group_rekey, 0,
440                                        wpa_rekey_gtk, wpa_auth, NULL);
441         }
442
443         return wpa_auth;
444 }
445
446
447 /**
448  * wpa_deinit - Deinitialize WPA authenticator
449  * @wpa_auth: Pointer to WPA authenticator data from wpa_init()
450  */
451 void wpa_deinit(struct wpa_authenticator *wpa_auth)
452 {
453         struct wpa_group *group, *prev;
454
455         eloop_cancel_timeout(wpa_rekey_gmk, wpa_auth, NULL);
456         eloop_cancel_timeout(wpa_rekey_gtk, wpa_auth, NULL);
457
458 #ifdef CONFIG_PEERKEY
459         while (wpa_auth->stsl_negotiations)
460                 wpa_stsl_remove(wpa_auth, wpa_auth->stsl_negotiations);
461 #endif /* CONFIG_PEERKEY */
462
463         pmksa_cache_auth_deinit(wpa_auth->pmksa);
464
465 #ifdef CONFIG_IEEE80211R
466         wpa_ft_pmk_cache_deinit(wpa_auth->ft_pmk_cache);
467         wpa_auth->ft_pmk_cache = NULL;
468 #endif /* CONFIG_IEEE80211R */
469
470         os_free(wpa_auth->wpa_ie);
471
472         group = wpa_auth->group;
473         while (group) {
474                 prev = group;
475                 group = group->next;
476                 os_free(prev);
477         }
478
479         os_free(wpa_auth);
480 }
481
482
483 /**
484  * wpa_reconfig - Update WPA authenticator configuration
485  * @wpa_auth: Pointer to WPA authenticator data from wpa_init()
486  * @conf: Configuration for WPA authenticator
487  */
488 int wpa_reconfig(struct wpa_authenticator *wpa_auth,
489                  struct wpa_auth_config *conf)
490 {
491         struct wpa_group *group;
492         if (wpa_auth == NULL)
493                 return 0;
494
495         os_memcpy(&wpa_auth->conf, conf, sizeof(*conf));
496         if (wpa_auth_gen_wpa_ie(wpa_auth)) {
497                 wpa_printf(MSG_ERROR, "Could not generate WPA IE.");
498                 return -1;
499         }
500
501         /*
502          * Reinitialize GTK to make sure it is suitable for the new
503          * configuration.
504          */
505         group = wpa_auth->group;
506         wpa_group_set_key_len(group, wpa_auth->conf.wpa_group);
507         group->GInit = TRUE;
508         wpa_group_sm_step(wpa_auth, group);
509         group->GInit = FALSE;
510         wpa_group_sm_step(wpa_auth, group);
511
512         return 0;
513 }
514
515
516 struct wpa_state_machine *
517 wpa_auth_sta_init(struct wpa_authenticator *wpa_auth, const u8 *addr)
518 {
519         struct wpa_state_machine *sm;
520
521         sm = os_zalloc(sizeof(struct wpa_state_machine));
522         if (sm == NULL)
523                 return NULL;
524         os_memcpy(sm->addr, addr, ETH_ALEN);
525
526         sm->wpa_auth = wpa_auth;
527         sm->group = wpa_auth->group;
528
529         return sm;
530 }
531
532
533 int wpa_auth_sta_associated(struct wpa_authenticator *wpa_auth,
534                             struct wpa_state_machine *sm)
535 {
536         if (wpa_auth == NULL || !wpa_auth->conf.wpa || sm == NULL)
537                 return -1;
538
539 #ifdef CONFIG_IEEE80211R
540         if (sm->ft_completed) {
541                 wpa_auth_logger(wpa_auth, sm->addr, LOGGER_DEBUG,
542                                 "FT authentication already completed - do not "
543                                 "start 4-way handshake");
544                 return 0;
545         }
546 #endif /* CONFIG_IEEE80211R */
547
548         if (sm->started) {
549                 os_memset(&sm->key_replay, 0, sizeof(sm->key_replay));
550                 sm->ReAuthenticationRequest = TRUE;
551                 return wpa_sm_step(sm);
552         }
553
554         wpa_auth_logger(wpa_auth, sm->addr, LOGGER_DEBUG,
555                         "start authentication");
556         sm->started = 1;
557
558         sm->Init = TRUE;
559         if (wpa_sm_step(sm) == 1)
560                 return 1; /* should not really happen */
561         sm->Init = FALSE;
562         sm->AuthenticationRequest = TRUE;
563         return wpa_sm_step(sm);
564 }
565
566
567 void wpa_auth_sta_no_wpa(struct wpa_state_machine *sm)
568 {
569         /* WPA/RSN was not used - clear WPA state. This is needed if the STA
570          * reassociates back to the same AP while the previous entry for the
571          * STA has not yet been removed. */
572         if (sm == NULL)
573                 return;
574
575         sm->wpa_key_mgmt = 0;
576 }
577
578
579 static void wpa_free_sta_sm(struct wpa_state_machine *sm)
580 {
581         if (sm->GUpdateStationKeys) {
582                 sm->group->GKeyDoneStations--;
583                 sm->GUpdateStationKeys = FALSE;
584         }
585 #ifdef CONFIG_IEEE80211R
586         os_free(sm->assoc_resp_ftie);
587 #endif /* CONFIG_IEEE80211R */
588         os_free(sm->last_rx_eapol_key);
589         os_free(sm->wpa_ie);
590         os_free(sm);
591 }
592
593
594 void wpa_auth_sta_deinit(struct wpa_state_machine *sm)
595 {
596         if (sm == NULL)
597                 return;
598
599         if (sm->wpa_auth->conf.wpa_strict_rekey && sm->has_GTK) {
600                 wpa_auth_logger(sm->wpa_auth, sm->addr, LOGGER_DEBUG,
601                                 "strict rekeying - force GTK rekey since STA "
602                                 "is leaving");
603                 eloop_cancel_timeout(wpa_rekey_gtk, sm->wpa_auth, NULL);
604                 eloop_register_timeout(0, 500000, wpa_rekey_gtk, sm->wpa_auth,
605                                        NULL);
606         }
607
608         eloop_cancel_timeout(wpa_send_eapol_timeout, sm->wpa_auth, sm);
609         sm->pending_1_of_4_timeout = 0;
610         eloop_cancel_timeout(wpa_sm_call_step, sm, NULL);
611         eloop_cancel_timeout(wpa_rekey_ptk, sm->wpa_auth, sm);
612         if (sm->in_step_loop) {
613                 /* Must not free state machine while wpa_sm_step() is running.
614                  * Freeing will be completed in the end of wpa_sm_step(). */
615                 wpa_printf(MSG_DEBUG, "WPA: Registering pending STA state "
616                            "machine deinit for " MACSTR, MAC2STR(sm->addr));
617                 sm->pending_deinit = 1;
618         } else
619                 wpa_free_sta_sm(sm);
620 }
621
622
623 static void wpa_request_new_ptk(struct wpa_state_machine *sm)
624 {
625         if (sm == NULL)
626                 return;
627
628         sm->PTKRequest = TRUE;
629         sm->PTK_valid = 0;
630 }
631
632
633 static int wpa_replay_counter_valid(struct wpa_state_machine *sm,
634                                     const u8 *replay_counter)
635 {
636         int i;
637         for (i = 0; i < RSNA_MAX_EAPOL_RETRIES; i++) {
638                 if (!sm->key_replay[i].valid)
639                         break;
640                 if (os_memcmp(replay_counter, sm->key_replay[i].counter,
641                               WPA_REPLAY_COUNTER_LEN) == 0)
642                         return 1;
643         }
644         return 0;
645 }
646
647
648 #ifdef CONFIG_IEEE80211R
649 static int ft_check_msg_2_of_4(struct wpa_authenticator *wpa_auth,
650                                struct wpa_state_machine *sm,
651                                struct wpa_eapol_ie_parse *kde)
652 {
653         struct wpa_ie_data ie;
654         struct rsn_mdie *mdie;
655
656         if (wpa_parse_wpa_ie_rsn(kde->rsn_ie, kde->rsn_ie_len, &ie) < 0 ||
657             ie.num_pmkid != 1 || ie.pmkid == NULL) {
658                 wpa_printf(MSG_DEBUG, "FT: No PMKR1Name in "
659                            "FT 4-way handshake message 2/4");
660                 return -1;
661         }
662
663         os_memcpy(sm->sup_pmk_r1_name, ie.pmkid, PMKID_LEN);
664         wpa_hexdump(MSG_DEBUG, "FT: PMKR1Name from Supplicant",
665                     sm->sup_pmk_r1_name, PMKID_LEN);
666
667         if (!kde->mdie || !kde->ftie) {
668                 wpa_printf(MSG_DEBUG, "FT: No %s in FT 4-way handshake "
669                            "message 2/4", kde->mdie ? "FTIE" : "MDIE");
670                 return -1;
671         }
672
673         mdie = (struct rsn_mdie *) (kde->mdie + 2);
674         if (kde->mdie[1] < sizeof(struct rsn_mdie) ||
675             os_memcmp(wpa_auth->conf.mobility_domain, mdie->mobility_domain,
676                       MOBILITY_DOMAIN_ID_LEN) != 0) {
677                 wpa_printf(MSG_DEBUG, "FT: MDIE mismatch");
678                 return -1;
679         }
680
681         if (sm->assoc_resp_ftie &&
682             (kde->ftie[1] != sm->assoc_resp_ftie[1] ||
683              os_memcmp(kde->ftie, sm->assoc_resp_ftie,
684                        2 + sm->assoc_resp_ftie[1]) != 0)) {
685                 wpa_printf(MSG_DEBUG, "FT: FTIE mismatch");
686                 wpa_hexdump(MSG_DEBUG, "FT: FTIE in EAPOL-Key msg 2/4",
687                             kde->ftie, kde->ftie_len);
688                 wpa_hexdump(MSG_DEBUG, "FT: FTIE in (Re)AssocResp",
689                             sm->assoc_resp_ftie, 2 + sm->assoc_resp_ftie[1]);
690                 return -1;
691         }
692
693         return 0;
694 }
695 #endif /* CONFIG_IEEE80211R */
696
697
698 void wpa_receive(struct wpa_authenticator *wpa_auth,
699                  struct wpa_state_machine *sm,
700                  u8 *data, size_t data_len)
701 {
702         struct ieee802_1x_hdr *hdr;
703         struct wpa_eapol_key *key;
704         u16 key_info, key_data_length;
705         enum { PAIRWISE_2, PAIRWISE_4, GROUP_2, REQUEST,
706                SMK_M1, SMK_M3, SMK_ERROR } msg;
707         char *msgtxt;
708         struct wpa_eapol_ie_parse kde;
709         int ft;
710         const u8 *eapol_key_ie;
711         size_t eapol_key_ie_len;
712
713         if (wpa_auth == NULL || !wpa_auth->conf.wpa || sm == NULL)
714                 return;
715
716         if (data_len < sizeof(*hdr) + sizeof(*key))
717                 return;
718
719         hdr = (struct ieee802_1x_hdr *) data;
720         key = (struct wpa_eapol_key *) (hdr + 1);
721         key_info = WPA_GET_BE16(key->key_info);
722         key_data_length = WPA_GET_BE16(key->key_data_length);
723         if (key_data_length > data_len - sizeof(*hdr) - sizeof(*key)) {
724                 wpa_printf(MSG_INFO, "WPA: Invalid EAPOL-Key frame - "
725                            "key_data overflow (%d > %lu)",
726                            key_data_length,
727                            (unsigned long) (data_len - sizeof(*hdr) -
728                                             sizeof(*key)));
729                 return;
730         }
731
732         if (sm->wpa == WPA_VERSION_WPA2) {
733                 if (key->type != EAPOL_KEY_TYPE_RSN) {
734                         wpa_printf(MSG_DEBUG, "Ignore EAPOL-Key with "
735                                    "unexpected type %d in RSN mode",
736                                    key->type);
737                         return;
738                 }
739         } else {
740                 if (key->type != EAPOL_KEY_TYPE_WPA) {
741                         wpa_printf(MSG_DEBUG, "Ignore EAPOL-Key with "
742                                    "unexpected type %d in WPA mode",
743                                    key->type);
744                         return;
745                 }
746         }
747
748         wpa_hexdump(MSG_DEBUG, "WPA: Received Key Nonce", key->key_nonce,
749                     WPA_NONCE_LEN);
750         wpa_hexdump(MSG_DEBUG, "WPA: Received Replay Counter",
751                     key->replay_counter, WPA_REPLAY_COUNTER_LEN);
752
753         /* FIX: verify that the EAPOL-Key frame was encrypted if pairwise keys
754          * are set */
755
756         if ((key_info & (WPA_KEY_INFO_SMK_MESSAGE | WPA_KEY_INFO_REQUEST)) ==
757             (WPA_KEY_INFO_SMK_MESSAGE | WPA_KEY_INFO_REQUEST)) {
758                 if (key_info & WPA_KEY_INFO_ERROR) {
759                         msg = SMK_ERROR;
760                         msgtxt = "SMK Error";
761                 } else {
762                         msg = SMK_M1;
763                         msgtxt = "SMK M1";
764                 }
765         } else if (key_info & WPA_KEY_INFO_SMK_MESSAGE) {
766                 msg = SMK_M3;
767                 msgtxt = "SMK M3";
768         } else if (key_info & WPA_KEY_INFO_REQUEST) {
769                 msg = REQUEST;
770                 msgtxt = "Request";
771         } else if (!(key_info & WPA_KEY_INFO_KEY_TYPE)) {
772                 msg = GROUP_2;
773                 msgtxt = "2/2 Group";
774         } else if (key_data_length == 0) {
775                 msg = PAIRWISE_4;
776                 msgtxt = "4/4 Pairwise";
777         } else {
778                 msg = PAIRWISE_2;
779                 msgtxt = "2/4 Pairwise";
780         }
781
782         /* TODO: key_info type validation for PeerKey */
783         if (msg == REQUEST || msg == PAIRWISE_2 || msg == PAIRWISE_4 ||
784             msg == GROUP_2) {
785                 u16 ver = key_info & WPA_KEY_INFO_TYPE_MASK;
786                 if (sm->pairwise == WPA_CIPHER_CCMP) {
787                         if (wpa_use_aes_cmac(sm) &&
788                             ver != WPA_KEY_INFO_TYPE_AES_128_CMAC) {
789                                 wpa_auth_logger(wpa_auth, sm->addr,
790                                                 LOGGER_WARNING,
791                                                 "advertised support for "
792                                                 "AES-128-CMAC, but did not "
793                                                 "use it");
794                                 return;
795                         }
796
797                         if (!wpa_use_aes_cmac(sm) &&
798                             ver != WPA_KEY_INFO_TYPE_HMAC_SHA1_AES) {
799                                 wpa_auth_logger(wpa_auth, sm->addr,
800                                                 LOGGER_WARNING,
801                                                 "did not use HMAC-SHA1-AES "
802                                                 "with CCMP");
803                                 return;
804                         }
805                 }
806         }
807
808         if (key_info & WPA_KEY_INFO_REQUEST) {
809                 if (sm->req_replay_counter_used &&
810                     os_memcmp(key->replay_counter, sm->req_replay_counter,
811                               WPA_REPLAY_COUNTER_LEN) <= 0) {
812                         wpa_auth_logger(wpa_auth, sm->addr, LOGGER_WARNING,
813                                         "received EAPOL-Key request with "
814                                         "replayed counter");
815                         return;
816                 }
817         }
818
819         if (!(key_info & WPA_KEY_INFO_REQUEST) &&
820             !wpa_replay_counter_valid(sm, key->replay_counter)) {
821                 int i;
822                 wpa_auth_vlogger(wpa_auth, sm->addr, LOGGER_INFO,
823                                  "received EAPOL-Key %s with unexpected "
824                                  "replay counter", msgtxt);
825                 for (i = 0; i < RSNA_MAX_EAPOL_RETRIES; i++) {
826                         if (!sm->key_replay[i].valid)
827                                 break;
828                         wpa_hexdump(MSG_DEBUG, "pending replay counter",
829                                     sm->key_replay[i].counter,
830                                     WPA_REPLAY_COUNTER_LEN);
831                 }
832                 wpa_hexdump(MSG_DEBUG, "received replay counter",
833                             key->replay_counter, WPA_REPLAY_COUNTER_LEN);
834                 return;
835         }
836
837         switch (msg) {
838         case PAIRWISE_2:
839                 if (sm->wpa_ptk_state != WPA_PTK_PTKSTART &&
840                     sm->wpa_ptk_state != WPA_PTK_PTKCALCNEGOTIATING) {
841                         wpa_auth_vlogger(wpa_auth, sm->addr, LOGGER_INFO,
842                                          "received EAPOL-Key msg 2/4 in "
843                                          "invalid state (%d) - dropped",
844                                          sm->wpa_ptk_state);
845                         return;
846                 }
847                 random_add_randomness(key->key_nonce, WPA_NONCE_LEN);
848                 if (sm->group->reject_4way_hs_for_entropy) {
849                         /*
850                          * The system did not have enough entropy to generate
851                          * strong random numbers. Reject the first 4-way
852                          * handshake(s) and collect some entropy based on the
853                          * information from it. Once enough entropy is
854                          * available, the next atempt will trigger GMK/Key
855                          * Counter update and the station will be allowed to
856                          * continue.
857                          */
858                         wpa_printf(MSG_DEBUG, "WPA: Reject 4-way handshake to "
859                                    "collect more entropy for random number "
860                                    "generation");
861                         sm->group->reject_4way_hs_for_entropy = FALSE;
862                         random_mark_pool_ready();
863                         sm->group->first_sta_seen = FALSE;
864                         wpa_sta_disconnect(wpa_auth, sm->addr);
865                         return;
866                 }
867                 if (wpa_parse_kde_ies((u8 *) (key + 1), key_data_length,
868                                       &kde) < 0) {
869                         wpa_auth_vlogger(wpa_auth, sm->addr, LOGGER_INFO,
870                                          "received EAPOL-Key msg 2/4 with "
871                                          "invalid Key Data contents");
872                         return;
873                 }
874                 if (kde.rsn_ie) {
875                         eapol_key_ie = kde.rsn_ie;
876                         eapol_key_ie_len = kde.rsn_ie_len;
877                 } else {
878                         eapol_key_ie = kde.wpa_ie;
879                         eapol_key_ie_len = kde.wpa_ie_len;
880                 }
881                 ft = sm->wpa == WPA_VERSION_WPA2 &&
882                         wpa_key_mgmt_ft(sm->wpa_key_mgmt);
883                 if (sm->wpa_ie == NULL ||
884                     wpa_compare_rsn_ie(ft,
885                                        sm->wpa_ie, sm->wpa_ie_len,
886                                        eapol_key_ie, eapol_key_ie_len)) {
887                         wpa_auth_logger(wpa_auth, sm->addr, LOGGER_INFO,
888                                         "WPA IE from (Re)AssocReq did not "
889                                         "match with msg 2/4");
890                         if (sm->wpa_ie) {
891                                 wpa_hexdump(MSG_DEBUG, "WPA IE in AssocReq",
892                                             sm->wpa_ie, sm->wpa_ie_len);
893                         }
894                         wpa_hexdump(MSG_DEBUG, "WPA IE in msg 2/4",
895                                     eapol_key_ie, eapol_key_ie_len);
896                         /* MLME-DEAUTHENTICATE.request */
897                         wpa_sta_disconnect(wpa_auth, sm->addr);
898                         return;
899                 }
900 #ifdef CONFIG_IEEE80211R
901                 if (ft && ft_check_msg_2_of_4(wpa_auth, sm, &kde) < 0) {
902                         wpa_sta_disconnect(wpa_auth, sm->addr);
903                         return;
904                 }
905 #endif /* CONFIG_IEEE80211R */
906                 break;
907         case PAIRWISE_4:
908                 if (sm->wpa_ptk_state != WPA_PTK_PTKINITNEGOTIATING ||
909                     !sm->PTK_valid) {
910                         wpa_auth_vlogger(wpa_auth, sm->addr, LOGGER_INFO,
911                                          "received EAPOL-Key msg 4/4 in "
912                                          "invalid state (%d) - dropped",
913                                          sm->wpa_ptk_state);
914                         return;
915                 }
916                 break;
917         case GROUP_2:
918                 if (sm->wpa_ptk_group_state != WPA_PTK_GROUP_REKEYNEGOTIATING
919                     || !sm->PTK_valid) {
920                         wpa_auth_vlogger(wpa_auth, sm->addr, LOGGER_INFO,
921                                          "received EAPOL-Key msg 2/2 in "
922                                          "invalid state (%d) - dropped",
923                                          sm->wpa_ptk_group_state);
924                         return;
925                 }
926                 break;
927 #ifdef CONFIG_PEERKEY
928         case SMK_M1:
929         case SMK_M3:
930         case SMK_ERROR:
931                 if (!wpa_auth->conf.peerkey) {
932                         wpa_printf(MSG_DEBUG, "RSN: SMK M1/M3/Error, but "
933                                    "PeerKey use disabled - ignoring message");
934                         return;
935                 }
936                 if (!sm->PTK_valid) {
937                         wpa_auth_logger(wpa_auth, sm->addr, LOGGER_INFO,
938                                         "received EAPOL-Key msg SMK in "
939                                         "invalid state - dropped");
940                         return;
941                 }
942                 break;
943 #else /* CONFIG_PEERKEY */
944         case SMK_M1:
945         case SMK_M3:
946         case SMK_ERROR:
947                 return; /* STSL disabled - ignore SMK messages */
948 #endif /* CONFIG_PEERKEY */
949         case REQUEST:
950                 break;
951         }
952
953         wpa_auth_vlogger(wpa_auth, sm->addr, LOGGER_DEBUG,
954                          "received EAPOL-Key frame (%s)", msgtxt);
955
956         if (key_info & WPA_KEY_INFO_ACK) {
957                 wpa_auth_logger(wpa_auth, sm->addr, LOGGER_INFO,
958                                 "received invalid EAPOL-Key: Key Ack set");
959                 return;
960         }
961
962         if (!(key_info & WPA_KEY_INFO_MIC)) {
963                 wpa_auth_logger(wpa_auth, sm->addr, LOGGER_INFO,
964                                 "received invalid EAPOL-Key: Key MIC not set");
965                 return;
966         }
967
968         sm->MICVerified = FALSE;
969         if (sm->PTK_valid) {
970                 if (wpa_verify_key_mic(&sm->PTK, data, data_len)) {
971                         wpa_auth_logger(wpa_auth, sm->addr, LOGGER_INFO,
972                                         "received EAPOL-Key with invalid MIC");
973                         return;
974                 }
975                 sm->MICVerified = TRUE;
976                 eloop_cancel_timeout(wpa_send_eapol_timeout, wpa_auth, sm);
977                 sm->pending_1_of_4_timeout = 0;
978         }
979
980         if (key_info & WPA_KEY_INFO_REQUEST) {
981                 if (sm->MICVerified) {
982                         sm->req_replay_counter_used = 1;
983                         os_memcpy(sm->req_replay_counter, key->replay_counter,
984                                   WPA_REPLAY_COUNTER_LEN);
985                 } else {
986                         wpa_auth_logger(wpa_auth, sm->addr, LOGGER_INFO,
987                                         "received EAPOL-Key request with "
988                                         "invalid MIC");
989                         return;
990                 }
991
992                 /*
993                  * TODO: should decrypt key data field if encryption was used;
994                  * even though MAC address KDE is not normally encrypted,
995                  * supplicant is allowed to encrypt it.
996                  */
997                 if (msg == SMK_ERROR) {
998 #ifdef CONFIG_PEERKEY
999                         wpa_smk_error(wpa_auth, sm, key);
1000 #endif /* CONFIG_PEERKEY */
1001                         return;
1002                 } else if (key_info & WPA_KEY_INFO_ERROR) {
1003                         /* Supplicant reported a Michael MIC error */
1004                         wpa_auth_logger(wpa_auth, sm->addr, LOGGER_INFO,
1005                                         "received EAPOL-Key Error Request "
1006                                         "(STA detected Michael MIC failure)");
1007                         wpa_auth_mic_failure_report(wpa_auth, sm->addr);
1008                         sm->dot11RSNAStatsTKIPRemoteMICFailures++;
1009                         wpa_auth->dot11RSNAStatsTKIPRemoteMICFailures++;
1010                         /* Error report is not a request for a new key
1011                          * handshake, but since Authenticator may do it, let's
1012                          * change the keys now anyway. */
1013                         wpa_request_new_ptk(sm);
1014                 } else if (key_info & WPA_KEY_INFO_KEY_TYPE) {
1015                         wpa_auth_logger(wpa_auth, sm->addr, LOGGER_INFO,
1016                                         "received EAPOL-Key Request for new "
1017                                         "4-Way Handshake");
1018                         wpa_request_new_ptk(sm);
1019 #ifdef CONFIG_PEERKEY
1020                 } else if (msg == SMK_M1) {
1021                         wpa_smk_m1(wpa_auth, sm, key);
1022 #endif /* CONFIG_PEERKEY */
1023                 } else if (key_data_length > 0 &&
1024                            wpa_parse_kde_ies((const u8 *) (key + 1),
1025                                              key_data_length, &kde) == 0 &&
1026                            kde.mac_addr) {
1027                 } else {
1028                         wpa_auth_logger(wpa_auth, sm->addr, LOGGER_INFO,
1029                                         "received EAPOL-Key Request for GTK "
1030                                         "rekeying");
1031                         /* FIX: why was this triggering PTK rekeying for the
1032                          * STA that requested Group Key rekeying?? */
1033                         /* wpa_request_new_ptk(sta->wpa_sm); */
1034                         eloop_cancel_timeout(wpa_rekey_gtk, wpa_auth, NULL);
1035                         wpa_rekey_gtk(wpa_auth, NULL);
1036                 }
1037         } else {
1038                 /* Do not allow the same key replay counter to be reused. This
1039                  * does also invalidate all other pending replay counters if
1040                  * retransmissions were used, i.e., we will only process one of
1041                  * the pending replies and ignore rest if more than one is
1042                  * received. */
1043                 sm->key_replay[0].valid = FALSE;
1044         }
1045
1046 #ifdef CONFIG_PEERKEY
1047         if (msg == SMK_M3) {
1048                 wpa_smk_m3(wpa_auth, sm, key);
1049                 return;
1050         }
1051 #endif /* CONFIG_PEERKEY */
1052
1053         os_free(sm->last_rx_eapol_key);
1054         sm->last_rx_eapol_key = os_malloc(data_len);
1055         if (sm->last_rx_eapol_key == NULL)
1056                 return;
1057         os_memcpy(sm->last_rx_eapol_key, data, data_len);
1058         sm->last_rx_eapol_key_len = data_len;
1059
1060         sm->EAPOLKeyReceived = TRUE;
1061         sm->EAPOLKeyPairwise = !!(key_info & WPA_KEY_INFO_KEY_TYPE);
1062         sm->EAPOLKeyRequest = !!(key_info & WPA_KEY_INFO_REQUEST);
1063         os_memcpy(sm->SNonce, key->key_nonce, WPA_NONCE_LEN);
1064         wpa_sm_step(sm);
1065 }
1066
1067
1068 static int wpa_gmk_to_gtk(const u8 *gmk, const char *label, const u8 *addr,
1069                           const u8 *gnonce, u8 *gtk, size_t gtk_len)
1070 {
1071         u8 data[ETH_ALEN + WPA_NONCE_LEN + 8 + 16];
1072         u8 *pos;
1073         int ret = 0;
1074
1075         /* GTK = PRF-X(GMK, "Group key expansion",
1076          *      AA || GNonce || Time || random data)
1077          * The example described in the IEEE 802.11 standard uses only AA and
1078          * GNonce as inputs here. Add some more entropy since this derivation
1079          * is done only at the Authenticator and as such, does not need to be
1080          * exactly same.
1081          */
1082         os_memcpy(data, addr, ETH_ALEN);
1083         os_memcpy(data + ETH_ALEN, gnonce, WPA_NONCE_LEN);
1084         pos = data + ETH_ALEN + WPA_NONCE_LEN;
1085         wpa_get_ntp_timestamp(pos);
1086         pos += 8;
1087         if (random_get_bytes(pos, 16) < 0)
1088                 ret = -1;
1089
1090 #ifdef CONFIG_IEEE80211W
1091         sha256_prf(gmk, WPA_GMK_LEN, label, data, sizeof(data), gtk, gtk_len);
1092 #else /* CONFIG_IEEE80211W */
1093         if (sha1_prf(gmk, WPA_GMK_LEN, label, data, sizeof(data), gtk, gtk_len)
1094             < 0)
1095                 ret = -1;
1096 #endif /* CONFIG_IEEE80211W */
1097
1098         return ret;
1099 }
1100
1101
1102 static void wpa_send_eapol_timeout(void *eloop_ctx, void *timeout_ctx)
1103 {
1104         struct wpa_authenticator *wpa_auth = eloop_ctx;
1105         struct wpa_state_machine *sm = timeout_ctx;
1106
1107         sm->pending_1_of_4_timeout = 0;
1108         wpa_auth_logger(wpa_auth, sm->addr, LOGGER_DEBUG, "EAPOL-Key timeout");
1109         sm->TimeoutEvt = TRUE;
1110         wpa_sm_step(sm);
1111 }
1112
1113
1114 void __wpa_send_eapol(struct wpa_authenticator *wpa_auth,
1115                       struct wpa_state_machine *sm, int key_info,
1116                       const u8 *key_rsc, const u8 *nonce,
1117                       const u8 *kde, size_t kde_len,
1118                       int keyidx, int encr, int force_version)
1119 {
1120         struct ieee802_1x_hdr *hdr;
1121         struct wpa_eapol_key *key;
1122         size_t len;
1123         int alg;
1124         int key_data_len, pad_len = 0;
1125         u8 *buf, *pos;
1126         int version, pairwise;
1127         int i;
1128
1129         len = sizeof(struct ieee802_1x_hdr) + sizeof(struct wpa_eapol_key);
1130
1131         if (force_version)
1132                 version = force_version;
1133         else if (wpa_use_aes_cmac(sm))
1134                 version = WPA_KEY_INFO_TYPE_AES_128_CMAC;
1135         else if (sm->pairwise == WPA_CIPHER_CCMP)
1136                 version = WPA_KEY_INFO_TYPE_HMAC_SHA1_AES;
1137         else
1138                 version = WPA_KEY_INFO_TYPE_HMAC_MD5_RC4;
1139
1140         pairwise = key_info & WPA_KEY_INFO_KEY_TYPE;
1141
1142         wpa_printf(MSG_DEBUG, "WPA: Send EAPOL(version=%d secure=%d mic=%d "
1143                    "ack=%d install=%d pairwise=%d kde_len=%lu keyidx=%d "
1144                    "encr=%d)",
1145                    version,
1146                    (key_info & WPA_KEY_INFO_SECURE) ? 1 : 0,
1147                    (key_info & WPA_KEY_INFO_MIC) ? 1 : 0,
1148                    (key_info & WPA_KEY_INFO_ACK) ? 1 : 0,
1149                    (key_info & WPA_KEY_INFO_INSTALL) ? 1 : 0,
1150                    pairwise, (unsigned long) kde_len, keyidx, encr);
1151
1152         key_data_len = kde_len;
1153
1154         if ((version == WPA_KEY_INFO_TYPE_HMAC_SHA1_AES ||
1155              version == WPA_KEY_INFO_TYPE_AES_128_CMAC) && encr) {
1156                 pad_len = key_data_len % 8;
1157                 if (pad_len)
1158                         pad_len = 8 - pad_len;
1159                 key_data_len += pad_len + 8;
1160         }
1161
1162         len += key_data_len;
1163
1164         hdr = os_zalloc(len);
1165         if (hdr == NULL)
1166                 return;
1167         hdr->version = wpa_auth->conf.eapol_version;
1168         hdr->type = IEEE802_1X_TYPE_EAPOL_KEY;
1169         hdr->length = host_to_be16(len  - sizeof(*hdr));
1170         key = (struct wpa_eapol_key *) (hdr + 1);
1171
1172         key->type = sm->wpa == WPA_VERSION_WPA2 ?
1173                 EAPOL_KEY_TYPE_RSN : EAPOL_KEY_TYPE_WPA;
1174         key_info |= version;
1175         if (encr && sm->wpa == WPA_VERSION_WPA2)
1176                 key_info |= WPA_KEY_INFO_ENCR_KEY_DATA;
1177         if (sm->wpa != WPA_VERSION_WPA2)
1178                 key_info |= keyidx << WPA_KEY_INFO_KEY_INDEX_SHIFT;
1179         WPA_PUT_BE16(key->key_info, key_info);
1180
1181         alg = pairwise ? sm->pairwise : wpa_auth->conf.wpa_group;
1182         switch (alg) {
1183         case WPA_CIPHER_CCMP:
1184                 WPA_PUT_BE16(key->key_length, 16);
1185                 break;
1186         case WPA_CIPHER_TKIP:
1187                 WPA_PUT_BE16(key->key_length, 32);
1188                 break;
1189         case WPA_CIPHER_WEP40:
1190                 WPA_PUT_BE16(key->key_length, 5);
1191                 break;
1192         case WPA_CIPHER_WEP104:
1193                 WPA_PUT_BE16(key->key_length, 13);
1194                 break;
1195         }
1196         if (key_info & WPA_KEY_INFO_SMK_MESSAGE)
1197                 WPA_PUT_BE16(key->key_length, 0);
1198
1199         /* FIX: STSL: what to use as key_replay_counter? */
1200         for (i = RSNA_MAX_EAPOL_RETRIES - 1; i > 0; i--) {
1201                 sm->key_replay[i].valid = sm->key_replay[i - 1].valid;
1202                 os_memcpy(sm->key_replay[i].counter,
1203                           sm->key_replay[i - 1].counter,
1204                           WPA_REPLAY_COUNTER_LEN);
1205         }
1206         inc_byte_array(sm->key_replay[0].counter, WPA_REPLAY_COUNTER_LEN);
1207         os_memcpy(key->replay_counter, sm->key_replay[0].counter,
1208                   WPA_REPLAY_COUNTER_LEN);
1209         sm->key_replay[0].valid = TRUE;
1210
1211         if (nonce)
1212                 os_memcpy(key->key_nonce, nonce, WPA_NONCE_LEN);
1213
1214         if (key_rsc)
1215                 os_memcpy(key->key_rsc, key_rsc, WPA_KEY_RSC_LEN);
1216
1217         if (kde && !encr) {
1218                 os_memcpy(key + 1, kde, kde_len);
1219                 WPA_PUT_BE16(key->key_data_length, kde_len);
1220         } else if (encr && kde) {
1221                 buf = os_zalloc(key_data_len);
1222                 if (buf == NULL) {
1223                         os_free(hdr);
1224                         return;
1225                 }
1226                 pos = buf;
1227                 os_memcpy(pos, kde, kde_len);
1228                 pos += kde_len;
1229
1230                 if (pad_len)
1231                         *pos++ = 0xdd;
1232
1233                 wpa_hexdump_key(MSG_DEBUG, "Plaintext EAPOL-Key Key Data",
1234                                 buf, key_data_len);
1235                 if (version == WPA_KEY_INFO_TYPE_HMAC_SHA1_AES ||
1236                     version == WPA_KEY_INFO_TYPE_AES_128_CMAC) {
1237                         if (aes_wrap(sm->PTK.kek, (key_data_len - 8) / 8, buf,
1238                                      (u8 *) (key + 1))) {
1239                                 os_free(hdr);
1240                                 os_free(buf);
1241                                 return;
1242                         }
1243                         WPA_PUT_BE16(key->key_data_length, key_data_len);
1244                 } else {
1245                         u8 ek[32];
1246                         os_memcpy(key->key_iv,
1247                                   sm->group->Counter + WPA_NONCE_LEN - 16, 16);
1248                         inc_byte_array(sm->group->Counter, WPA_NONCE_LEN);
1249                         os_memcpy(ek, key->key_iv, 16);
1250                         os_memcpy(ek + 16, sm->PTK.kek, 16);
1251                         os_memcpy(key + 1, buf, key_data_len);
1252                         rc4_skip(ek, 32, 256, (u8 *) (key + 1), key_data_len);
1253                         WPA_PUT_BE16(key->key_data_length, key_data_len);
1254                 }
1255                 os_free(buf);
1256         }
1257
1258         if (key_info & WPA_KEY_INFO_MIC) {
1259                 if (!sm->PTK_valid) {
1260                         wpa_auth_logger(wpa_auth, sm->addr, LOGGER_DEBUG,
1261                                         "PTK not valid when sending EAPOL-Key "
1262                                         "frame");
1263                         os_free(hdr);
1264                         return;
1265                 }
1266                 wpa_eapol_key_mic(sm->PTK.kck, version, (u8 *) hdr, len,
1267                                   key->key_mic);
1268         }
1269
1270         wpa_auth_set_eapol(sm->wpa_auth, sm->addr, WPA_EAPOL_inc_EapolFramesTx,
1271                            1);
1272         wpa_auth_send_eapol(wpa_auth, sm->addr, (u8 *) hdr, len,
1273                             sm->pairwise_set);
1274         os_free(hdr);
1275 }
1276
1277
1278 static void wpa_send_eapol(struct wpa_authenticator *wpa_auth,
1279                            struct wpa_state_machine *sm, int key_info,
1280                            const u8 *key_rsc, const u8 *nonce,
1281                            const u8 *kde, size_t kde_len,
1282                            int keyidx, int encr)
1283 {
1284         int timeout_ms;
1285         int pairwise = key_info & WPA_KEY_INFO_KEY_TYPE;
1286         int ctr;
1287
1288         if (sm == NULL)
1289                 return;
1290
1291         __wpa_send_eapol(wpa_auth, sm, key_info, key_rsc, nonce, kde, kde_len,
1292                          keyidx, encr, 0);
1293
1294         ctr = pairwise ? sm->TimeoutCtr : sm->GTimeoutCtr;
1295         if (ctr == 1 && wpa_auth->conf.tx_status)
1296                 timeout_ms = eapol_key_timeout_first;
1297         else
1298                 timeout_ms = eapol_key_timeout_subseq;
1299         if (pairwise && ctr == 1 && !(key_info & WPA_KEY_INFO_MIC))
1300                 sm->pending_1_of_4_timeout = 1;
1301         wpa_printf(MSG_DEBUG, "WPA: Use EAPOL-Key timeout of %u ms (retry "
1302                    "counter %d)", timeout_ms, ctr);
1303         eloop_register_timeout(timeout_ms / 1000, (timeout_ms % 1000) * 1000,
1304                                wpa_send_eapol_timeout, wpa_auth, sm);
1305 }
1306
1307
1308 static int wpa_verify_key_mic(struct wpa_ptk *PTK, u8 *data, size_t data_len)
1309 {
1310         struct ieee802_1x_hdr *hdr;
1311         struct wpa_eapol_key *key;
1312         u16 key_info;
1313         int ret = 0;
1314         u8 mic[16];
1315
1316         if (data_len < sizeof(*hdr) + sizeof(*key))
1317                 return -1;
1318
1319         hdr = (struct ieee802_1x_hdr *) data;
1320         key = (struct wpa_eapol_key *) (hdr + 1);
1321         key_info = WPA_GET_BE16(key->key_info);
1322         os_memcpy(mic, key->key_mic, 16);
1323         os_memset(key->key_mic, 0, 16);
1324         if (wpa_eapol_key_mic(PTK->kck, key_info & WPA_KEY_INFO_TYPE_MASK,
1325                               data, data_len, key->key_mic) ||
1326             os_memcmp(mic, key->key_mic, 16) != 0)
1327                 ret = -1;
1328         os_memcpy(key->key_mic, mic, 16);
1329         return ret;
1330 }
1331
1332
1333 void wpa_remove_ptk(struct wpa_state_machine *sm)
1334 {
1335         sm->PTK_valid = FALSE;
1336         os_memset(&sm->PTK, 0, sizeof(sm->PTK));
1337         wpa_auth_set_key(sm->wpa_auth, 0, WPA_ALG_NONE, sm->addr, 0, NULL, 0);
1338         sm->pairwise_set = FALSE;
1339         eloop_cancel_timeout(wpa_rekey_ptk, sm->wpa_auth, sm);
1340 }
1341
1342
1343 int wpa_auth_sm_event(struct wpa_state_machine *sm, wpa_event event)
1344 {
1345         int remove_ptk = 1;
1346
1347         if (sm == NULL)
1348                 return -1;
1349
1350         wpa_auth_vlogger(sm->wpa_auth, sm->addr, LOGGER_DEBUG,
1351                          "event %d notification", event);
1352
1353         switch (event) {
1354         case WPA_AUTH:
1355         case WPA_ASSOC:
1356                 break;
1357         case WPA_DEAUTH:
1358         case WPA_DISASSOC:
1359                 sm->DeauthenticationRequest = TRUE;
1360                 break;
1361         case WPA_REAUTH:
1362         case WPA_REAUTH_EAPOL:
1363                 if (!sm->started) {
1364                         /*
1365                          * When using WPS, we may end up here if the STA
1366                          * manages to re-associate without the previous STA
1367                          * entry getting removed. Consequently, we need to make
1368                          * sure that the WPA state machines gets initialized
1369                          * properly at this point.
1370                          */
1371                         wpa_printf(MSG_DEBUG, "WPA state machine had not been "
1372                                    "started - initialize now");
1373                         sm->started = 1;
1374                         sm->Init = TRUE;
1375                         if (wpa_sm_step(sm) == 1)
1376                                 return 1; /* should not really happen */
1377                         sm->Init = FALSE;
1378                         sm->AuthenticationRequest = TRUE;
1379                         break;
1380                 }
1381                 if (sm->GUpdateStationKeys) {
1382                         /*
1383                          * Reauthentication cancels the pending group key
1384                          * update for this STA.
1385                          */
1386                         sm->group->GKeyDoneStations--;
1387                         sm->GUpdateStationKeys = FALSE;
1388                         sm->PtkGroupInit = TRUE;
1389                 }
1390                 sm->ReAuthenticationRequest = TRUE;
1391                 break;
1392         case WPA_ASSOC_FT:
1393 #ifdef CONFIG_IEEE80211R
1394                 wpa_printf(MSG_DEBUG, "FT: Retry PTK configuration "
1395                            "after association");
1396                 wpa_ft_install_ptk(sm);
1397
1398                 /* Using FT protocol, not WPA auth state machine */
1399                 sm->ft_completed = 1;
1400                 return 0;
1401 #else /* CONFIG_IEEE80211R */
1402                 break;
1403 #endif /* CONFIG_IEEE80211R */
1404         }
1405
1406 #ifdef CONFIG_IEEE80211R
1407         sm->ft_completed = 0;
1408 #endif /* CONFIG_IEEE80211R */
1409
1410 #ifdef CONFIG_IEEE80211W
1411         if (sm->mgmt_frame_prot && event == WPA_AUTH)
1412                 remove_ptk = 0;
1413 #endif /* CONFIG_IEEE80211W */
1414
1415         if (remove_ptk) {
1416                 sm->PTK_valid = FALSE;
1417                 os_memset(&sm->PTK, 0, sizeof(sm->PTK));
1418
1419                 if (event != WPA_REAUTH_EAPOL)
1420                         wpa_remove_ptk(sm);
1421         }
1422
1423         return wpa_sm_step(sm);
1424 }
1425
1426
1427 static enum wpa_alg wpa_alg_enum(int alg)
1428 {
1429         switch (alg) {
1430         case WPA_CIPHER_CCMP:
1431                 return WPA_ALG_CCMP;
1432         case WPA_CIPHER_TKIP:
1433                 return WPA_ALG_TKIP;
1434         case WPA_CIPHER_WEP104:
1435         case WPA_CIPHER_WEP40:
1436                 return WPA_ALG_WEP;
1437         default:
1438                 return WPA_ALG_NONE;
1439         }
1440 }
1441
1442
1443 SM_STATE(WPA_PTK, INITIALIZE)
1444 {
1445         SM_ENTRY_MA(WPA_PTK, INITIALIZE, wpa_ptk);
1446         if (sm->Init) {
1447                 /* Init flag is not cleared here, so avoid busy
1448                  * loop by claiming nothing changed. */
1449                 sm->changed = FALSE;
1450         }
1451
1452         sm->keycount = 0;
1453         if (sm->GUpdateStationKeys)
1454                 sm->group->GKeyDoneStations--;
1455         sm->GUpdateStationKeys = FALSE;
1456         if (sm->wpa == WPA_VERSION_WPA)
1457                 sm->PInitAKeys = FALSE;
1458         if (1 /* Unicast cipher supported AND (ESS OR ((IBSS or WDS) and
1459                * Local AA > Remote AA)) */) {
1460                 sm->Pair = TRUE;
1461         }
1462         wpa_auth_set_eapol(sm->wpa_auth, sm->addr, WPA_EAPOL_portEnabled, 0);
1463         wpa_remove_ptk(sm);
1464         wpa_auth_set_eapol(sm->wpa_auth, sm->addr, WPA_EAPOL_portValid, 0);
1465         sm->TimeoutCtr = 0;
1466         if (wpa_key_mgmt_wpa_psk(sm->wpa_key_mgmt)) {
1467                 wpa_auth_set_eapol(sm->wpa_auth, sm->addr,
1468                                    WPA_EAPOL_authorized, 0);
1469         }
1470 }
1471
1472
1473 SM_STATE(WPA_PTK, DISCONNECT)
1474 {
1475         SM_ENTRY_MA(WPA_PTK, DISCONNECT, wpa_ptk);
1476         sm->Disconnect = FALSE;
1477         wpa_sta_disconnect(sm->wpa_auth, sm->addr);
1478 }
1479
1480
1481 SM_STATE(WPA_PTK, DISCONNECTED)
1482 {
1483         SM_ENTRY_MA(WPA_PTK, DISCONNECTED, wpa_ptk);
1484         sm->DeauthenticationRequest = FALSE;
1485 }
1486
1487
1488 SM_STATE(WPA_PTK, AUTHENTICATION)
1489 {
1490         SM_ENTRY_MA(WPA_PTK, AUTHENTICATION, wpa_ptk);
1491         os_memset(&sm->PTK, 0, sizeof(sm->PTK));
1492         sm->PTK_valid = FALSE;
1493         wpa_auth_set_eapol(sm->wpa_auth, sm->addr, WPA_EAPOL_portControl_Auto,
1494                            1);
1495         wpa_auth_set_eapol(sm->wpa_auth, sm->addr, WPA_EAPOL_portEnabled, 1);
1496         sm->AuthenticationRequest = FALSE;
1497 }
1498
1499
1500 static void wpa_group_first_station(struct wpa_authenticator *wpa_auth,
1501                                     struct wpa_group *group)
1502 {
1503         /*
1504          * System has run bit further than at the time hostapd was started
1505          * potentially very early during boot up. This provides better chances
1506          * of collecting more randomness on embedded systems. Re-initialize the
1507          * GMK and Counter here to improve their strength if there was not
1508          * enough entropy available immediately after system startup.
1509          */
1510         wpa_printf(MSG_DEBUG, "WPA: Re-initialize GMK/Counter on first "
1511                    "station");
1512         if (random_pool_ready() != 1) {
1513                 wpa_printf(MSG_INFO, "WPA: Not enough entropy in random pool "
1514                            "to proceed - reject first 4-way handshake");
1515                 group->reject_4way_hs_for_entropy = TRUE;
1516         }
1517         wpa_group_init_gmk_and_counter(wpa_auth, group);
1518         wpa_gtk_update(wpa_auth, group);
1519         wpa_group_config_group_keys(wpa_auth, group);
1520 }
1521
1522
1523 SM_STATE(WPA_PTK, AUTHENTICATION2)
1524 {
1525         SM_ENTRY_MA(WPA_PTK, AUTHENTICATION2, wpa_ptk);
1526
1527         if (!sm->group->first_sta_seen) {
1528                 wpa_group_first_station(sm->wpa_auth, sm->group);
1529                 sm->group->first_sta_seen = TRUE;
1530         }
1531
1532         os_memcpy(sm->ANonce, sm->group->Counter, WPA_NONCE_LEN);
1533         wpa_hexdump(MSG_DEBUG, "WPA: Assign ANonce", sm->ANonce,
1534                     WPA_NONCE_LEN);
1535         inc_byte_array(sm->group->Counter, WPA_NONCE_LEN);
1536         sm->ReAuthenticationRequest = FALSE;
1537         /* IEEE 802.11i does not clear TimeoutCtr here, but this is more
1538          * logical place than INITIALIZE since AUTHENTICATION2 can be
1539          * re-entered on ReAuthenticationRequest without going through
1540          * INITIALIZE. */
1541         sm->TimeoutCtr = 0;
1542 }
1543
1544
1545 SM_STATE(WPA_PTK, INITPMK)
1546 {
1547         u8 msk[2 * PMK_LEN];
1548         size_t len = 2 * PMK_LEN;
1549
1550         SM_ENTRY_MA(WPA_PTK, INITPMK, wpa_ptk);
1551 #ifdef CONFIG_IEEE80211R
1552         sm->xxkey_len = 0;
1553 #endif /* CONFIG_IEEE80211R */
1554         if (sm->pmksa) {
1555                 wpa_printf(MSG_DEBUG, "WPA: PMK from PMKSA cache");
1556                 os_memcpy(sm->PMK, sm->pmksa->pmk, PMK_LEN);
1557         } else if (wpa_auth_get_msk(sm->wpa_auth, sm->addr, msk, &len) == 0) {
1558                 wpa_printf(MSG_DEBUG, "WPA: PMK from EAPOL state machine "
1559                            "(len=%lu)", (unsigned long) len);
1560                 os_memcpy(sm->PMK, msk, PMK_LEN);
1561 #ifdef CONFIG_IEEE80211R
1562                 if (len >= 2 * PMK_LEN) {
1563                         os_memcpy(sm->xxkey, msk + PMK_LEN, PMK_LEN);
1564                         sm->xxkey_len = PMK_LEN;
1565                 }
1566 #endif /* CONFIG_IEEE80211R */
1567         } else {
1568                 wpa_printf(MSG_DEBUG, "WPA: Could not get PMK");
1569         }
1570
1571         sm->req_replay_counter_used = 0;
1572         /* IEEE 802.11i does not set keyRun to FALSE, but not doing this
1573          * will break reauthentication since EAPOL state machines may not be
1574          * get into AUTHENTICATING state that clears keyRun before WPA state
1575          * machine enters AUTHENTICATION2 state and goes immediately to INITPMK
1576          * state and takes PMK from the previously used AAA Key. This will
1577          * eventually fail in 4-Way Handshake because Supplicant uses PMK
1578          * derived from the new AAA Key. Setting keyRun = FALSE here seems to
1579          * be good workaround for this issue. */
1580         wpa_auth_set_eapol(sm->wpa_auth, sm->addr, WPA_EAPOL_keyRun, 0);
1581 }
1582
1583
1584 SM_STATE(WPA_PTK, INITPSK)
1585 {
1586         const u8 *psk;
1587         SM_ENTRY_MA(WPA_PTK, INITPSK, wpa_ptk);
1588         psk = wpa_auth_get_psk(sm->wpa_auth, sm->addr, NULL);
1589         if (psk) {
1590                 os_memcpy(sm->PMK, psk, PMK_LEN);
1591 #ifdef CONFIG_IEEE80211R
1592                 os_memcpy(sm->xxkey, psk, PMK_LEN);
1593                 sm->xxkey_len = PMK_LEN;
1594 #endif /* CONFIG_IEEE80211R */
1595         }
1596         sm->req_replay_counter_used = 0;
1597 }
1598
1599
1600 SM_STATE(WPA_PTK, PTKSTART)
1601 {
1602         u8 buf[2 + RSN_SELECTOR_LEN + PMKID_LEN], *pmkid = NULL;
1603         size_t pmkid_len = 0;
1604
1605         SM_ENTRY_MA(WPA_PTK, PTKSTART, wpa_ptk);
1606         sm->PTKRequest = FALSE;
1607         sm->TimeoutEvt = FALSE;
1608
1609         sm->TimeoutCtr++;
1610         if (sm->TimeoutCtr > (int) dot11RSNAConfigPairwiseUpdateCount) {
1611                 /* No point in sending the EAPOL-Key - we will disconnect
1612                  * immediately following this. */
1613                 return;
1614         }
1615
1616         wpa_auth_logger(sm->wpa_auth, sm->addr, LOGGER_DEBUG,
1617                         "sending 1/4 msg of 4-Way Handshake");
1618         /*
1619          * TODO: Could add PMKID even with WPA2-PSK, but only if there is only
1620          * one possible PSK for this STA.
1621          */
1622         if (sm->wpa == WPA_VERSION_WPA2 &&
1623             wpa_key_mgmt_wpa_ieee8021x(sm->wpa_key_mgmt)) {
1624                 pmkid = buf;
1625                 pmkid_len = 2 + RSN_SELECTOR_LEN + PMKID_LEN;
1626                 pmkid[0] = WLAN_EID_VENDOR_SPECIFIC;
1627                 pmkid[1] = RSN_SELECTOR_LEN + PMKID_LEN;
1628                 RSN_SELECTOR_PUT(&pmkid[2], RSN_KEY_DATA_PMKID);
1629                 if (sm->pmksa)
1630                         os_memcpy(&pmkid[2 + RSN_SELECTOR_LEN],
1631                                   sm->pmksa->pmkid, PMKID_LEN);
1632                 else {
1633                         /*
1634                          * Calculate PMKID since no PMKSA cache entry was
1635                          * available with pre-calculated PMKID.
1636                          */
1637                         rsn_pmkid(sm->PMK, PMK_LEN, sm->wpa_auth->addr,
1638                                   sm->addr, &pmkid[2 + RSN_SELECTOR_LEN],
1639                                   wpa_key_mgmt_sha256(sm->wpa_key_mgmt));
1640                 }
1641         }
1642         wpa_send_eapol(sm->wpa_auth, sm,
1643                        WPA_KEY_INFO_ACK | WPA_KEY_INFO_KEY_TYPE, NULL,
1644                        sm->ANonce, pmkid, pmkid_len, 0, 0);
1645 }
1646
1647
1648 static int wpa_derive_ptk(struct wpa_state_machine *sm, const u8 *pmk,
1649                           struct wpa_ptk *ptk)
1650 {
1651         size_t ptk_len = sm->pairwise == WPA_CIPHER_CCMP ? 48 : 64;
1652 #ifdef CONFIG_IEEE80211R
1653         if (wpa_key_mgmt_ft(sm->wpa_key_mgmt))
1654                 return wpa_auth_derive_ptk_ft(sm, pmk, ptk, ptk_len);
1655 #endif /* CONFIG_IEEE80211R */
1656
1657         wpa_pmk_to_ptk(pmk, PMK_LEN, "Pairwise key expansion",
1658                        sm->wpa_auth->addr, sm->addr, sm->ANonce, sm->SNonce,
1659                        (u8 *) ptk, ptk_len,
1660                        wpa_key_mgmt_sha256(sm->wpa_key_mgmt));
1661
1662         return 0;
1663 }
1664
1665
1666 SM_STATE(WPA_PTK, PTKCALCNEGOTIATING)
1667 {
1668         struct wpa_ptk PTK;
1669         int ok = 0;
1670         const u8 *pmk = NULL;
1671
1672         SM_ENTRY_MA(WPA_PTK, PTKCALCNEGOTIATING, wpa_ptk);
1673         sm->EAPOLKeyReceived = FALSE;
1674
1675         /* WPA with IEEE 802.1X: use the derived PMK from EAP
1676          * WPA-PSK: iterate through possible PSKs and select the one matching
1677          * the packet */
1678         for (;;) {
1679                 if (wpa_key_mgmt_wpa_psk(sm->wpa_key_mgmt)) {
1680                         pmk = wpa_auth_get_psk(sm->wpa_auth, sm->addr, pmk);
1681                         if (pmk == NULL)
1682                                 break;
1683                 } else
1684                         pmk = sm->PMK;
1685
1686                 wpa_derive_ptk(sm, pmk, &PTK);
1687
1688                 if (wpa_verify_key_mic(&PTK, sm->last_rx_eapol_key,
1689                                        sm->last_rx_eapol_key_len) == 0) {
1690                         ok = 1;
1691                         break;
1692                 }
1693
1694                 if (!wpa_key_mgmt_wpa_psk(sm->wpa_key_mgmt))
1695                         break;
1696         }
1697
1698         if (!ok) {
1699                 wpa_auth_logger(sm->wpa_auth, sm->addr, LOGGER_DEBUG,
1700                                 "invalid MIC in msg 2/4 of 4-Way Handshake");
1701                 return;
1702         }
1703
1704 #ifdef CONFIG_IEEE80211R
1705         if (sm->wpa == WPA_VERSION_WPA2 && wpa_key_mgmt_ft(sm->wpa_key_mgmt)) {
1706                 /*
1707                  * Verify that PMKR1Name from EAPOL-Key message 2/4 matches
1708                  * with the value we derived.
1709                  */
1710                 if (os_memcmp(sm->sup_pmk_r1_name, sm->pmk_r1_name,
1711                               WPA_PMK_NAME_LEN) != 0) {
1712                         wpa_auth_logger(sm->wpa_auth, sm->addr, LOGGER_DEBUG,
1713                                         "PMKR1Name mismatch in FT 4-way "
1714                                         "handshake");
1715                         wpa_hexdump(MSG_DEBUG, "FT: PMKR1Name from "
1716                                     "Supplicant",
1717                                     sm->sup_pmk_r1_name, WPA_PMK_NAME_LEN);
1718                         wpa_hexdump(MSG_DEBUG, "FT: Derived PMKR1Name",
1719                                     sm->pmk_r1_name, WPA_PMK_NAME_LEN);
1720                         return;
1721                 }
1722         }
1723 #endif /* CONFIG_IEEE80211R */
1724
1725         sm->pending_1_of_4_timeout = 0;
1726         eloop_cancel_timeout(wpa_send_eapol_timeout, sm->wpa_auth, sm);
1727
1728         if (wpa_key_mgmt_wpa_psk(sm->wpa_key_mgmt)) {
1729                 /* PSK may have changed from the previous choice, so update
1730                  * state machine data based on whatever PSK was selected here.
1731                  */
1732                 os_memcpy(sm->PMK, pmk, PMK_LEN);
1733         }
1734
1735         sm->MICVerified = TRUE;
1736
1737         os_memcpy(&sm->PTK, &PTK, sizeof(PTK));
1738         sm->PTK_valid = TRUE;
1739 }
1740
1741
1742 SM_STATE(WPA_PTK, PTKCALCNEGOTIATING2)
1743 {
1744         SM_ENTRY_MA(WPA_PTK, PTKCALCNEGOTIATING2, wpa_ptk);
1745         sm->TimeoutCtr = 0;
1746 }
1747
1748
1749 #ifdef CONFIG_IEEE80211W
1750
1751 static int ieee80211w_kde_len(struct wpa_state_machine *sm)
1752 {
1753         if (sm->mgmt_frame_prot) {
1754                 return 2 + RSN_SELECTOR_LEN + sizeof(struct wpa_igtk_kde);
1755         }
1756
1757         return 0;
1758 }
1759
1760
1761 static u8 * ieee80211w_kde_add(struct wpa_state_machine *sm, u8 *pos)
1762 {
1763         struct wpa_igtk_kde igtk;
1764         struct wpa_group *gsm = sm->group;
1765
1766         if (!sm->mgmt_frame_prot)
1767                 return pos;
1768
1769         igtk.keyid[0] = gsm->GN_igtk;
1770         igtk.keyid[1] = 0;
1771         if (gsm->wpa_group_state != WPA_GROUP_SETKEYSDONE ||
1772             wpa_auth_get_seqnum(sm->wpa_auth, NULL, gsm->GN_igtk, igtk.pn) < 0)
1773                 os_memset(igtk.pn, 0, sizeof(igtk.pn));
1774         os_memcpy(igtk.igtk, gsm->IGTK[gsm->GN_igtk - 4], WPA_IGTK_LEN);
1775         pos = wpa_add_kde(pos, RSN_KEY_DATA_IGTK,
1776                           (const u8 *) &igtk, sizeof(igtk), NULL, 0);
1777
1778         return pos;
1779 }
1780
1781 #else /* CONFIG_IEEE80211W */
1782
1783 static int ieee80211w_kde_len(struct wpa_state_machine *sm)
1784 {
1785         return 0;
1786 }
1787
1788
1789 static u8 * ieee80211w_kde_add(struct wpa_state_machine *sm, u8 *pos)
1790 {
1791         return pos;
1792 }
1793
1794 #endif /* CONFIG_IEEE80211W */
1795
1796
1797 SM_STATE(WPA_PTK, PTKINITNEGOTIATING)
1798 {
1799         u8 rsc[WPA_KEY_RSC_LEN], *_rsc, *gtk, *kde, *pos;
1800         size_t gtk_len, kde_len;
1801         struct wpa_group *gsm = sm->group;
1802         u8 *wpa_ie;
1803         int wpa_ie_len, secure, keyidx, encr = 0;
1804
1805         SM_ENTRY_MA(WPA_PTK, PTKINITNEGOTIATING, wpa_ptk);
1806         sm->TimeoutEvt = FALSE;
1807
1808         sm->TimeoutCtr++;
1809         if (sm->TimeoutCtr > (int) dot11RSNAConfigPairwiseUpdateCount) {
1810                 /* No point in sending the EAPOL-Key - we will disconnect
1811                  * immediately following this. */
1812                 return;
1813         }
1814
1815         /* Send EAPOL(1, 1, 1, Pair, P, RSC, ANonce, MIC(PTK), RSNIE, [MDIE],
1816            GTK[GN], IGTK, [FTIE], [TIE * 2])
1817          */
1818         os_memset(rsc, 0, WPA_KEY_RSC_LEN);
1819         wpa_auth_get_seqnum(sm->wpa_auth, NULL, gsm->GN, rsc);
1820         /* If FT is used, wpa_auth->wpa_ie includes both RSNIE and MDIE */
1821         wpa_ie = sm->wpa_auth->wpa_ie;
1822         wpa_ie_len = sm->wpa_auth->wpa_ie_len;
1823         if (sm->wpa == WPA_VERSION_WPA &&
1824             (sm->wpa_auth->conf.wpa & WPA_PROTO_RSN) &&
1825             wpa_ie_len > wpa_ie[1] + 2 && wpa_ie[0] == WLAN_EID_RSN) {
1826                 /* WPA-only STA, remove RSN IE */
1827                 wpa_ie = wpa_ie + wpa_ie[1] + 2;
1828                 wpa_ie_len = wpa_ie[1] + 2;
1829         }
1830         wpa_auth_logger(sm->wpa_auth, sm->addr, LOGGER_DEBUG,
1831                         "sending 3/4 msg of 4-Way Handshake");
1832         if (sm->wpa == WPA_VERSION_WPA2) {
1833                 /* WPA2 send GTK in the 4-way handshake */
1834                 secure = 1;
1835                 gtk = gsm->GTK[gsm->GN - 1];
1836                 gtk_len = gsm->GTK_len;
1837                 keyidx = gsm->GN;
1838                 _rsc = rsc;
1839                 encr = 1;
1840         } else {
1841                 /* WPA does not include GTK in msg 3/4 */
1842                 secure = 0;
1843                 gtk = NULL;
1844                 gtk_len = 0;
1845                 keyidx = 0;
1846                 _rsc = NULL;
1847         }
1848
1849         kde_len = wpa_ie_len + ieee80211w_kde_len(sm);
1850         if (gtk)
1851                 kde_len += 2 + RSN_SELECTOR_LEN + 2 + gtk_len;
1852 #ifdef CONFIG_IEEE80211R
1853         if (wpa_key_mgmt_ft(sm->wpa_key_mgmt)) {
1854                 kde_len += 2 + PMKID_LEN; /* PMKR1Name into RSN IE */
1855                 kde_len += 300; /* FTIE + 2 * TIE */
1856         }
1857 #endif /* CONFIG_IEEE80211R */
1858         kde = os_malloc(kde_len);
1859         if (kde == NULL)
1860                 return;
1861
1862         pos = kde;
1863         os_memcpy(pos, wpa_ie, wpa_ie_len);
1864         pos += wpa_ie_len;
1865 #ifdef CONFIG_IEEE80211R
1866         if (wpa_key_mgmt_ft(sm->wpa_key_mgmt)) {
1867                 int res = wpa_insert_pmkid(kde, pos - kde, sm->pmk_r1_name);
1868                 if (res < 0) {
1869                         wpa_printf(MSG_ERROR, "FT: Failed to insert "
1870                                    "PMKR1Name into RSN IE in EAPOL-Key data");
1871                         os_free(kde);
1872                         return;
1873                 }
1874                 pos += res;
1875         }
1876 #endif /* CONFIG_IEEE80211R */
1877         if (gtk) {
1878                 u8 hdr[2];
1879                 hdr[0] = keyidx & 0x03;
1880                 hdr[1] = 0;
1881                 pos = wpa_add_kde(pos, RSN_KEY_DATA_GROUPKEY, hdr, 2,
1882                                   gtk, gtk_len);
1883         }
1884         pos = ieee80211w_kde_add(sm, pos);
1885
1886 #ifdef CONFIG_IEEE80211R
1887         if (wpa_key_mgmt_ft(sm->wpa_key_mgmt)) {
1888                 int res;
1889                 struct wpa_auth_config *conf;
1890
1891                 conf = &sm->wpa_auth->conf;
1892                 res = wpa_write_ftie(conf, conf->r0_key_holder,
1893                                      conf->r0_key_holder_len,
1894                                      NULL, NULL, pos, kde + kde_len - pos,
1895                                      NULL, 0);
1896                 if (res < 0) {
1897                         wpa_printf(MSG_ERROR, "FT: Failed to insert FTIE "
1898                                    "into EAPOL-Key Key Data");
1899                         os_free(kde);
1900                         return;
1901                 }
1902                 pos += res;
1903
1904                 /* TIE[ReassociationDeadline] (TU) */
1905                 *pos++ = WLAN_EID_TIMEOUT_INTERVAL;
1906                 *pos++ = 5;
1907                 *pos++ = WLAN_TIMEOUT_REASSOC_DEADLINE;
1908                 WPA_PUT_LE32(pos, conf->reassociation_deadline);
1909                 pos += 4;
1910
1911                 /* TIE[KeyLifetime] (seconds) */
1912                 *pos++ = WLAN_EID_TIMEOUT_INTERVAL;
1913                 *pos++ = 5;
1914                 *pos++ = WLAN_TIMEOUT_KEY_LIFETIME;
1915                 WPA_PUT_LE32(pos, conf->r0_key_lifetime * 60);
1916                 pos += 4;
1917         }
1918 #endif /* CONFIG_IEEE80211R */
1919
1920         wpa_send_eapol(sm->wpa_auth, sm,
1921                        (secure ? WPA_KEY_INFO_SECURE : 0) | WPA_KEY_INFO_MIC |
1922                        WPA_KEY_INFO_ACK | WPA_KEY_INFO_INSTALL |
1923                        WPA_KEY_INFO_KEY_TYPE,
1924                        _rsc, sm->ANonce, kde, pos - kde, keyidx, encr);
1925         os_free(kde);
1926 }
1927
1928
1929 SM_STATE(WPA_PTK, PTKINITDONE)
1930 {
1931         SM_ENTRY_MA(WPA_PTK, PTKINITDONE, wpa_ptk);
1932         sm->EAPOLKeyReceived = FALSE;
1933         if (sm->Pair) {
1934                 enum wpa_alg alg;
1935                 int klen;
1936                 if (sm->pairwise == WPA_CIPHER_TKIP) {
1937                         alg = WPA_ALG_TKIP;
1938                         klen = 32;
1939                 } else {
1940                         alg = WPA_ALG_CCMP;
1941                         klen = 16;
1942                 }
1943                 if (wpa_auth_set_key(sm->wpa_auth, 0, alg, sm->addr, 0,
1944                                      sm->PTK.tk1, klen)) {
1945                         wpa_sta_disconnect(sm->wpa_auth, sm->addr);
1946                         return;
1947                 }
1948                 /* FIX: MLME-SetProtection.Request(TA, Tx_Rx) */
1949                 sm->pairwise_set = TRUE;
1950
1951                 if (sm->wpa_auth->conf.wpa_ptk_rekey) {
1952                         eloop_cancel_timeout(wpa_rekey_ptk, sm->wpa_auth, sm);
1953                         eloop_register_timeout(sm->wpa_auth->conf.
1954                                                wpa_ptk_rekey, 0, wpa_rekey_ptk,
1955                                                sm->wpa_auth, sm);
1956                 }
1957
1958                 if (wpa_key_mgmt_wpa_psk(sm->wpa_key_mgmt)) {
1959                         wpa_auth_set_eapol(sm->wpa_auth, sm->addr,
1960                                            WPA_EAPOL_authorized, 1);
1961                 }
1962         }
1963
1964         if (0 /* IBSS == TRUE */) {
1965                 sm->keycount++;
1966                 if (sm->keycount == 2) {
1967                         wpa_auth_set_eapol(sm->wpa_auth, sm->addr,
1968                                            WPA_EAPOL_portValid, 1);
1969                 }
1970         } else {
1971                 wpa_auth_set_eapol(sm->wpa_auth, sm->addr, WPA_EAPOL_portValid,
1972                                    1);
1973         }
1974         wpa_auth_set_eapol(sm->wpa_auth, sm->addr, WPA_EAPOL_keyAvailable, 0);
1975         wpa_auth_set_eapol(sm->wpa_auth, sm->addr, WPA_EAPOL_keyDone, 1);
1976         if (sm->wpa == WPA_VERSION_WPA)
1977                 sm->PInitAKeys = TRUE;
1978         else
1979                 sm->has_GTK = TRUE;
1980         wpa_auth_vlogger(sm->wpa_auth, sm->addr, LOGGER_INFO,
1981                          "pairwise key handshake completed (%s)",
1982                          sm->wpa == WPA_VERSION_WPA ? "WPA" : "RSN");
1983
1984 #ifdef CONFIG_IEEE80211R
1985         wpa_ft_push_pmk_r1(sm->wpa_auth, sm->addr);
1986 #endif /* CONFIG_IEEE80211R */
1987 }
1988
1989
1990 SM_STEP(WPA_PTK)
1991 {
1992         struct wpa_authenticator *wpa_auth = sm->wpa_auth;
1993
1994         if (sm->Init)
1995                 SM_ENTER(WPA_PTK, INITIALIZE);
1996         else if (sm->Disconnect
1997                  /* || FIX: dot11RSNAConfigSALifetime timeout */) {
1998                 wpa_auth_logger(wpa_auth, sm->addr, LOGGER_DEBUG,
1999                                 "WPA_PTK: sm->Disconnect");
2000                 SM_ENTER(WPA_PTK, DISCONNECT);
2001         }
2002         else if (sm->DeauthenticationRequest)
2003                 SM_ENTER(WPA_PTK, DISCONNECTED);
2004         else if (sm->AuthenticationRequest)
2005                 SM_ENTER(WPA_PTK, AUTHENTICATION);
2006         else if (sm->ReAuthenticationRequest)
2007                 SM_ENTER(WPA_PTK, AUTHENTICATION2);
2008         else if (sm->PTKRequest)
2009                 SM_ENTER(WPA_PTK, PTKSTART);
2010         else switch (sm->wpa_ptk_state) {
2011         case WPA_PTK_INITIALIZE:
2012                 break;
2013         case WPA_PTK_DISCONNECT:
2014                 SM_ENTER(WPA_PTK, DISCONNECTED);
2015                 break;
2016         case WPA_PTK_DISCONNECTED:
2017                 SM_ENTER(WPA_PTK, INITIALIZE);
2018                 break;
2019         case WPA_PTK_AUTHENTICATION:
2020                 SM_ENTER(WPA_PTK, AUTHENTICATION2);
2021                 break;
2022         case WPA_PTK_AUTHENTICATION2:
2023                 if (wpa_key_mgmt_wpa_ieee8021x(sm->wpa_key_mgmt) &&
2024                     wpa_auth_get_eapol(sm->wpa_auth, sm->addr,
2025                                        WPA_EAPOL_keyRun) > 0)
2026                         SM_ENTER(WPA_PTK, INITPMK);
2027                 else if (wpa_key_mgmt_wpa_psk(sm->wpa_key_mgmt)
2028                          /* FIX: && 802.1X::keyRun */)
2029                         SM_ENTER(WPA_PTK, INITPSK);
2030                 break;
2031         case WPA_PTK_INITPMK:
2032                 if (wpa_auth_get_eapol(sm->wpa_auth, sm->addr,
2033                                        WPA_EAPOL_keyAvailable) > 0)
2034                         SM_ENTER(WPA_PTK, PTKSTART);
2035                 else {
2036                         wpa_auth->dot11RSNA4WayHandshakeFailures++;
2037                         wpa_auth_logger(sm->wpa_auth, sm->addr, LOGGER_INFO,
2038                                         "INITPMK - keyAvailable = false");
2039                         SM_ENTER(WPA_PTK, DISCONNECT);
2040                 }
2041                 break;
2042         case WPA_PTK_INITPSK:
2043                 if (wpa_auth_get_psk(sm->wpa_auth, sm->addr, NULL))
2044                         SM_ENTER(WPA_PTK, PTKSTART);
2045                 else {
2046                         wpa_auth_logger(sm->wpa_auth, sm->addr, LOGGER_INFO,
2047                                         "no PSK configured for the STA");
2048                         wpa_auth->dot11RSNA4WayHandshakeFailures++;
2049                         SM_ENTER(WPA_PTK, DISCONNECT);
2050                 }
2051                 break;
2052         case WPA_PTK_PTKSTART:
2053                 if (sm->EAPOLKeyReceived && !sm->EAPOLKeyRequest &&
2054                     sm->EAPOLKeyPairwise)
2055                         SM_ENTER(WPA_PTK, PTKCALCNEGOTIATING);
2056                 else if (sm->TimeoutCtr >
2057                          (int) dot11RSNAConfigPairwiseUpdateCount) {
2058                         wpa_auth->dot11RSNA4WayHandshakeFailures++;
2059                         wpa_auth_vlogger(sm->wpa_auth, sm->addr, LOGGER_DEBUG,
2060                                          "PTKSTART: Retry limit %d reached",
2061                                          dot11RSNAConfigPairwiseUpdateCount);
2062                         SM_ENTER(WPA_PTK, DISCONNECT);
2063                 } else if (sm->TimeoutEvt)
2064                         SM_ENTER(WPA_PTK, PTKSTART);
2065                 break;
2066         case WPA_PTK_PTKCALCNEGOTIATING:
2067                 if (sm->MICVerified)
2068                         SM_ENTER(WPA_PTK, PTKCALCNEGOTIATING2);
2069                 else if (sm->EAPOLKeyReceived && !sm->EAPOLKeyRequest &&
2070                          sm->EAPOLKeyPairwise)
2071                         SM_ENTER(WPA_PTK, PTKCALCNEGOTIATING);
2072                 else if (sm->TimeoutEvt)
2073                         SM_ENTER(WPA_PTK, PTKSTART);
2074                 break;
2075         case WPA_PTK_PTKCALCNEGOTIATING2:
2076                 SM_ENTER(WPA_PTK, PTKINITNEGOTIATING);
2077                 break;
2078         case WPA_PTK_PTKINITNEGOTIATING:
2079                 if (sm->EAPOLKeyReceived && !sm->EAPOLKeyRequest &&
2080                     sm->EAPOLKeyPairwise && sm->MICVerified)
2081                         SM_ENTER(WPA_PTK, PTKINITDONE);
2082                 else if (sm->TimeoutCtr >
2083                          (int) dot11RSNAConfigPairwiseUpdateCount) {
2084                         wpa_auth->dot11RSNA4WayHandshakeFailures++;
2085                         wpa_auth_vlogger(sm->wpa_auth, sm->addr, LOGGER_DEBUG,
2086                                          "PTKINITNEGOTIATING: Retry limit %d "
2087                                          "reached",
2088                                          dot11RSNAConfigPairwiseUpdateCount);
2089                         SM_ENTER(WPA_PTK, DISCONNECT);
2090                 } else if (sm->TimeoutEvt)
2091                         SM_ENTER(WPA_PTK, PTKINITNEGOTIATING);
2092                 break;
2093         case WPA_PTK_PTKINITDONE:
2094                 break;
2095         }
2096 }
2097
2098
2099 SM_STATE(WPA_PTK_GROUP, IDLE)
2100 {
2101         SM_ENTRY_MA(WPA_PTK_GROUP, IDLE, wpa_ptk_group);
2102         if (sm->Init) {
2103                 /* Init flag is not cleared here, so avoid busy
2104                  * loop by claiming nothing changed. */
2105                 sm->changed = FALSE;
2106         }
2107         sm->GTimeoutCtr = 0;
2108 }
2109
2110
2111 SM_STATE(WPA_PTK_GROUP, REKEYNEGOTIATING)
2112 {
2113         u8 rsc[WPA_KEY_RSC_LEN];
2114         struct wpa_group *gsm = sm->group;
2115         u8 *kde, *pos, hdr[2];
2116         size_t kde_len;
2117
2118         SM_ENTRY_MA(WPA_PTK_GROUP, REKEYNEGOTIATING, wpa_ptk_group);
2119
2120         sm->GTimeoutCtr++;
2121         if (sm->GTimeoutCtr > (int) dot11RSNAConfigGroupUpdateCount) {
2122                 /* No point in sending the EAPOL-Key - we will disconnect
2123                  * immediately following this. */
2124                 return;
2125         }
2126
2127         if (sm->wpa == WPA_VERSION_WPA)
2128                 sm->PInitAKeys = FALSE;
2129         sm->TimeoutEvt = FALSE;
2130         /* Send EAPOL(1, 1, 1, !Pair, G, RSC, GNonce, MIC(PTK), GTK[GN]) */
2131         os_memset(rsc, 0, WPA_KEY_RSC_LEN);
2132         if (gsm->wpa_group_state == WPA_GROUP_SETKEYSDONE)
2133                 wpa_auth_get_seqnum(sm->wpa_auth, NULL, gsm->GN, rsc);
2134         wpa_auth_logger(sm->wpa_auth, sm->addr, LOGGER_DEBUG,
2135                         "sending 1/2 msg of Group Key Handshake");
2136
2137         if (sm->wpa == WPA_VERSION_WPA2) {
2138                 kde_len = 2 + RSN_SELECTOR_LEN + 2 + gsm->GTK_len +
2139                         ieee80211w_kde_len(sm);
2140                 kde = os_malloc(kde_len);
2141                 if (kde == NULL)
2142                         return;
2143
2144                 pos = kde;
2145                 hdr[0] = gsm->GN & 0x03;
2146                 hdr[1] = 0;
2147                 pos = wpa_add_kde(pos, RSN_KEY_DATA_GROUPKEY, hdr, 2,
2148                                   gsm->GTK[gsm->GN - 1], gsm->GTK_len);
2149                 pos = ieee80211w_kde_add(sm, pos);
2150         } else {
2151                 kde = gsm->GTK[gsm->GN - 1];
2152                 pos = kde + gsm->GTK_len;
2153         }
2154
2155         wpa_send_eapol(sm->wpa_auth, sm,
2156                        WPA_KEY_INFO_SECURE | WPA_KEY_INFO_MIC |
2157                        WPA_KEY_INFO_ACK |
2158                        (!sm->Pair ? WPA_KEY_INFO_INSTALL : 0),
2159                        rsc, gsm->GNonce, kde, pos - kde, gsm->GN, 1);
2160         if (sm->wpa == WPA_VERSION_WPA2)
2161                 os_free(kde);
2162 }
2163
2164
2165 SM_STATE(WPA_PTK_GROUP, REKEYESTABLISHED)
2166 {
2167         SM_ENTRY_MA(WPA_PTK_GROUP, REKEYESTABLISHED, wpa_ptk_group);
2168         sm->EAPOLKeyReceived = FALSE;
2169         if (sm->GUpdateStationKeys)
2170                 sm->group->GKeyDoneStations--;
2171         sm->GUpdateStationKeys = FALSE;
2172         sm->GTimeoutCtr = 0;
2173         /* FIX: MLME.SetProtection.Request(TA, Tx_Rx) */
2174         wpa_auth_vlogger(sm->wpa_auth, sm->addr, LOGGER_INFO,
2175                          "group key handshake completed (%s)",
2176                          sm->wpa == WPA_VERSION_WPA ? "WPA" : "RSN");
2177         sm->has_GTK = TRUE;
2178 }
2179
2180
2181 SM_STATE(WPA_PTK_GROUP, KEYERROR)
2182 {
2183         SM_ENTRY_MA(WPA_PTK_GROUP, KEYERROR, wpa_ptk_group);
2184         if (sm->GUpdateStationKeys)
2185                 sm->group->GKeyDoneStations--;
2186         sm->GUpdateStationKeys = FALSE;
2187         sm->Disconnect = TRUE;
2188 }
2189
2190
2191 SM_STEP(WPA_PTK_GROUP)
2192 {
2193         if (sm->Init || sm->PtkGroupInit) {
2194                 SM_ENTER(WPA_PTK_GROUP, IDLE);
2195                 sm->PtkGroupInit = FALSE;
2196         } else switch (sm->wpa_ptk_group_state) {
2197         case WPA_PTK_GROUP_IDLE:
2198                 if (sm->GUpdateStationKeys ||
2199                     (sm->wpa == WPA_VERSION_WPA && sm->PInitAKeys))
2200                         SM_ENTER(WPA_PTK_GROUP, REKEYNEGOTIATING);
2201                 break;
2202         case WPA_PTK_GROUP_REKEYNEGOTIATING:
2203                 if (sm->EAPOLKeyReceived && !sm->EAPOLKeyRequest &&
2204                     !sm->EAPOLKeyPairwise && sm->MICVerified)
2205                         SM_ENTER(WPA_PTK_GROUP, REKEYESTABLISHED);
2206                 else if (sm->GTimeoutCtr >
2207                          (int) dot11RSNAConfigGroupUpdateCount)
2208                         SM_ENTER(WPA_PTK_GROUP, KEYERROR);
2209                 else if (sm->TimeoutEvt)
2210                         SM_ENTER(WPA_PTK_GROUP, REKEYNEGOTIATING);
2211                 break;
2212         case WPA_PTK_GROUP_KEYERROR:
2213                 SM_ENTER(WPA_PTK_GROUP, IDLE);
2214                 break;
2215         case WPA_PTK_GROUP_REKEYESTABLISHED:
2216                 SM_ENTER(WPA_PTK_GROUP, IDLE);
2217                 break;
2218         }
2219 }
2220
2221
2222 static int wpa_gtk_update(struct wpa_authenticator *wpa_auth,
2223                           struct wpa_group *group)
2224 {
2225         int ret = 0;
2226
2227         os_memcpy(group->GNonce, group->Counter, WPA_NONCE_LEN);
2228         inc_byte_array(group->Counter, WPA_NONCE_LEN);
2229         if (wpa_gmk_to_gtk(group->GMK, "Group key expansion",
2230                            wpa_auth->addr, group->GNonce,
2231                            group->GTK[group->GN - 1], group->GTK_len) < 0)
2232                 ret = -1;
2233         wpa_hexdump_key(MSG_DEBUG, "GTK",
2234                         group->GTK[group->GN - 1], group->GTK_len);
2235
2236 #ifdef CONFIG_IEEE80211W
2237         if (wpa_auth->conf.ieee80211w != NO_MGMT_FRAME_PROTECTION) {
2238                 os_memcpy(group->GNonce, group->Counter, WPA_NONCE_LEN);
2239                 inc_byte_array(group->Counter, WPA_NONCE_LEN);
2240                 if (wpa_gmk_to_gtk(group->GMK, "IGTK key expansion",
2241                                    wpa_auth->addr, group->GNonce,
2242                                    group->IGTK[group->GN_igtk - 4],
2243                                    WPA_IGTK_LEN) < 0)
2244                         ret = -1;
2245                 wpa_hexdump_key(MSG_DEBUG, "IGTK",
2246                                 group->IGTK[group->GN_igtk - 4], WPA_IGTK_LEN);
2247         }
2248 #endif /* CONFIG_IEEE80211W */
2249
2250         return ret;
2251 }
2252
2253
2254 static void wpa_group_gtk_init(struct wpa_authenticator *wpa_auth,
2255                                struct wpa_group *group)
2256 {
2257         wpa_printf(MSG_DEBUG, "WPA: group state machine entering state "
2258                    "GTK_INIT (VLAN-ID %d)", group->vlan_id);
2259         group->changed = FALSE; /* GInit is not cleared here; avoid loop */
2260         group->wpa_group_state = WPA_GROUP_GTK_INIT;
2261
2262         /* GTK[0..N] = 0 */
2263         os_memset(group->GTK, 0, sizeof(group->GTK));
2264         group->GN = 1;
2265         group->GM = 2;
2266 #ifdef CONFIG_IEEE80211W
2267         group->GN_igtk = 4;
2268         group->GM_igtk = 5;
2269 #endif /* CONFIG_IEEE80211W */
2270         /* GTK[GN] = CalcGTK() */
2271         wpa_gtk_update(wpa_auth, group);
2272 }
2273
2274
2275 static int wpa_group_update_sta(struct wpa_state_machine *sm, void *ctx)
2276 {
2277         if (sm->wpa_ptk_state != WPA_PTK_PTKINITDONE) {
2278                 wpa_auth_logger(sm->wpa_auth, sm->addr, LOGGER_DEBUG,
2279                                 "Not in PTKINITDONE; skip Group Key update");
2280                 sm->GUpdateStationKeys = FALSE;
2281                 return 0;
2282         }
2283         if (sm->GUpdateStationKeys) {
2284                 /*
2285                  * This should not really happen, so add a debug log entry.
2286                  * Since we clear the GKeyDoneStations before the loop, the
2287                  * station needs to be counted here anyway.
2288                  */
2289                 wpa_auth_logger(sm->wpa_auth, sm->addr, LOGGER_DEBUG,
2290                                 "GUpdateStationKeys was already set when "
2291                                 "marking station for GTK rekeying");
2292         }
2293
2294         sm->group->GKeyDoneStations++;
2295         sm->GUpdateStationKeys = TRUE;
2296
2297         wpa_sm_step(sm);
2298         return 0;
2299 }
2300
2301
2302 static void wpa_group_setkeys(struct wpa_authenticator *wpa_auth,
2303                               struct wpa_group *group)
2304 {
2305         int tmp;
2306
2307         wpa_printf(MSG_DEBUG, "WPA: group state machine entering state "
2308                    "SETKEYS (VLAN-ID %d)", group->vlan_id);
2309         group->changed = TRUE;
2310         group->wpa_group_state = WPA_GROUP_SETKEYS;
2311         group->GTKReKey = FALSE;
2312         tmp = group->GM;
2313         group->GM = group->GN;
2314         group->GN = tmp;
2315 #ifdef CONFIG_IEEE80211W
2316         tmp = group->GM_igtk;
2317         group->GM_igtk = group->GN_igtk;
2318         group->GN_igtk = tmp;
2319 #endif /* CONFIG_IEEE80211W */
2320         /* "GKeyDoneStations = GNoStations" is done in more robust way by
2321          * counting the STAs that are marked with GUpdateStationKeys instead of
2322          * including all STAs that could be in not-yet-completed state. */
2323         wpa_gtk_update(wpa_auth, group);
2324
2325         if (group->GKeyDoneStations) {
2326                 wpa_printf(MSG_DEBUG, "wpa_group_setkeys: Unexpected "
2327                            "GKeyDoneStations=%d when starting new GTK rekey",
2328                            group->GKeyDoneStations);
2329                 group->GKeyDoneStations = 0;
2330         }
2331         wpa_auth_for_each_sta(wpa_auth, wpa_group_update_sta, NULL);
2332         wpa_printf(MSG_DEBUG, "wpa_group_setkeys: GKeyDoneStations=%d",
2333                    group->GKeyDoneStations);
2334 }
2335
2336
2337 static int wpa_group_config_group_keys(struct wpa_authenticator *wpa_auth,
2338                                        struct wpa_group *group)
2339 {
2340         int ret = 0;
2341
2342         if (wpa_auth_set_key(wpa_auth, group->vlan_id,
2343                              wpa_alg_enum(wpa_auth->conf.wpa_group),
2344                              broadcast_ether_addr, group->GN,
2345                              group->GTK[group->GN - 1], group->GTK_len) < 0)
2346                 ret = -1;
2347
2348 #ifdef CONFIG_IEEE80211W
2349         if (wpa_auth->conf.ieee80211w != NO_MGMT_FRAME_PROTECTION &&
2350             wpa_auth_set_key(wpa_auth, group->vlan_id, WPA_ALG_IGTK,
2351                              broadcast_ether_addr, group->GN_igtk,
2352                              group->IGTK[group->GN_igtk - 4],
2353                              WPA_IGTK_LEN) < 0)
2354                 ret = -1;
2355 #endif /* CONFIG_IEEE80211W */
2356
2357         return ret;
2358 }
2359
2360
2361 static int wpa_group_setkeysdone(struct wpa_authenticator *wpa_auth,
2362                                  struct wpa_group *group)
2363 {
2364         wpa_printf(MSG_DEBUG, "WPA: group state machine entering state "
2365                    "SETKEYSDONE (VLAN-ID %d)", group->vlan_id);
2366         group->changed = TRUE;
2367         group->wpa_group_state = WPA_GROUP_SETKEYSDONE;
2368
2369         if (wpa_group_config_group_keys(wpa_auth, group) < 0)
2370                 return -1;
2371
2372         return 0;
2373 }
2374
2375
2376 static void wpa_group_sm_step(struct wpa_authenticator *wpa_auth,
2377                               struct wpa_group *group)
2378 {
2379         if (group->GInit) {
2380                 wpa_group_gtk_init(wpa_auth, group);
2381         } else if (group->wpa_group_state == WPA_GROUP_GTK_INIT &&
2382                    group->GTKAuthenticator) {
2383                 wpa_group_setkeysdone(wpa_auth, group);
2384         } else if (group->wpa_group_state == WPA_GROUP_SETKEYSDONE &&
2385                    group->GTKReKey) {
2386                 wpa_group_setkeys(wpa_auth, group);
2387         } else if (group->wpa_group_state == WPA_GROUP_SETKEYS) {
2388                 if (group->GKeyDoneStations == 0)
2389                         wpa_group_setkeysdone(wpa_auth, group);
2390                 else if (group->GTKReKey)
2391                         wpa_group_setkeys(wpa_auth, group);
2392         }
2393 }
2394
2395
2396 static int wpa_sm_step(struct wpa_state_machine *sm)
2397 {
2398         if (sm == NULL)
2399                 return 0;
2400
2401         if (sm->in_step_loop) {
2402                 /* This should not happen, but if it does, make sure we do not
2403                  * end up freeing the state machine too early by exiting the
2404                  * recursive call. */
2405                 wpa_printf(MSG_ERROR, "WPA: wpa_sm_step() called recursively");
2406                 return 0;
2407         }
2408
2409         sm->in_step_loop = 1;
2410         do {
2411                 if (sm->pending_deinit)
2412                         break;
2413
2414                 sm->changed = FALSE;
2415                 sm->wpa_auth->group->changed = FALSE;
2416
2417                 SM_STEP_RUN(WPA_PTK);
2418                 if (sm->pending_deinit)
2419                         break;
2420                 SM_STEP_RUN(WPA_PTK_GROUP);
2421                 if (sm->pending_deinit)
2422                         break;
2423                 wpa_group_sm_step(sm->wpa_auth, sm->group);
2424         } while (sm->changed || sm->wpa_auth->group->changed);
2425         sm->in_step_loop = 0;
2426
2427         if (sm->pending_deinit) {
2428                 wpa_printf(MSG_DEBUG, "WPA: Completing pending STA state "
2429                            "machine deinit for " MACSTR, MAC2STR(sm->addr));
2430                 wpa_free_sta_sm(sm);
2431                 return 1;
2432         }
2433         return 0;
2434 }
2435
2436
2437 static void wpa_sm_call_step(void *eloop_ctx, void *timeout_ctx)
2438 {
2439         struct wpa_state_machine *sm = eloop_ctx;
2440         wpa_sm_step(sm);
2441 }
2442
2443
2444 void wpa_auth_sm_notify(struct wpa_state_machine *sm)
2445 {
2446         if (sm == NULL)
2447                 return;
2448         eloop_register_timeout(0, 0, wpa_sm_call_step, sm, NULL);
2449 }
2450
2451
2452 void wpa_gtk_rekey(struct wpa_authenticator *wpa_auth)
2453 {
2454         int tmp, i;
2455         struct wpa_group *group;
2456
2457         if (wpa_auth == NULL)
2458                 return;
2459
2460         group = wpa_auth->group;
2461
2462         for (i = 0; i < 2; i++) {
2463                 tmp = group->GM;
2464                 group->GM = group->GN;
2465                 group->GN = tmp;
2466 #ifdef CONFIG_IEEE80211W
2467                 tmp = group->GM_igtk;
2468                 group->GM_igtk = group->GN_igtk;
2469                 group->GN_igtk = tmp;
2470 #endif /* CONFIG_IEEE80211W */
2471                 wpa_gtk_update(wpa_auth, group);
2472         }
2473 }
2474
2475
2476 static const char * wpa_bool_txt(int bool)
2477 {
2478         return bool ? "TRUE" : "FALSE";
2479 }
2480
2481
2482 static int wpa_cipher_bits(int cipher)
2483 {
2484         switch (cipher) {
2485         case WPA_CIPHER_CCMP:
2486                 return 128;
2487         case WPA_CIPHER_TKIP:
2488                 return 256;
2489         case WPA_CIPHER_WEP104:
2490                 return 104;
2491         case WPA_CIPHER_WEP40:
2492                 return 40;
2493         default:
2494                 return 0;
2495         }
2496 }
2497
2498
2499 #define RSN_SUITE "%02x-%02x-%02x-%d"
2500 #define RSN_SUITE_ARG(s) \
2501 ((s) >> 24) & 0xff, ((s) >> 16) & 0xff, ((s) >> 8) & 0xff, (s) & 0xff
2502
2503 int wpa_get_mib(struct wpa_authenticator *wpa_auth, char *buf, size_t buflen)
2504 {
2505         int len = 0, ret;
2506         char pmkid_txt[PMKID_LEN * 2 + 1];
2507 #ifdef CONFIG_RSN_PREAUTH
2508         const int preauth = 1;
2509 #else /* CONFIG_RSN_PREAUTH */
2510         const int preauth = 0;
2511 #endif /* CONFIG_RSN_PREAUTH */
2512
2513         if (wpa_auth == NULL)
2514                 return len;
2515
2516         ret = os_snprintf(buf + len, buflen - len,
2517                           "dot11RSNAOptionImplemented=TRUE\n"
2518                           "dot11RSNAPreauthenticationImplemented=%s\n"
2519                           "dot11RSNAEnabled=%s\n"
2520                           "dot11RSNAPreauthenticationEnabled=%s\n",
2521                           wpa_bool_txt(preauth),
2522                           wpa_bool_txt(wpa_auth->conf.wpa & WPA_PROTO_RSN),
2523                           wpa_bool_txt(wpa_auth->conf.rsn_preauth));
2524         if (ret < 0 || (size_t) ret >= buflen - len)
2525                 return len;
2526         len += ret;
2527
2528         wpa_snprintf_hex(pmkid_txt, sizeof(pmkid_txt),
2529                          wpa_auth->dot11RSNAPMKIDUsed, PMKID_LEN);
2530
2531         ret = os_snprintf(
2532                 buf + len, buflen - len,
2533                 "dot11RSNAConfigVersion=%u\n"
2534                 "dot11RSNAConfigPairwiseKeysSupported=9999\n"
2535                 /* FIX: dot11RSNAConfigGroupCipher */
2536                 /* FIX: dot11RSNAConfigGroupRekeyMethod */
2537                 /* FIX: dot11RSNAConfigGroupRekeyTime */
2538                 /* FIX: dot11RSNAConfigGroupRekeyPackets */
2539                 "dot11RSNAConfigGroupRekeyStrict=%u\n"
2540                 "dot11RSNAConfigGroupUpdateCount=%u\n"
2541                 "dot11RSNAConfigPairwiseUpdateCount=%u\n"
2542                 "dot11RSNAConfigGroupCipherSize=%u\n"
2543                 "dot11RSNAConfigPMKLifetime=%u\n"
2544                 "dot11RSNAConfigPMKReauthThreshold=%u\n"
2545                 "dot11RSNAConfigNumberOfPTKSAReplayCounters=0\n"
2546                 "dot11RSNAConfigSATimeout=%u\n"
2547                 "dot11RSNAAuthenticationSuiteSelected=" RSN_SUITE "\n"
2548                 "dot11RSNAPairwiseCipherSelected=" RSN_SUITE "\n"
2549                 "dot11RSNAGroupCipherSelected=" RSN_SUITE "\n"
2550                 "dot11RSNAPMKIDUsed=%s\n"
2551                 "dot11RSNAAuthenticationSuiteRequested=" RSN_SUITE "\n"
2552                 "dot11RSNAPairwiseCipherRequested=" RSN_SUITE "\n"
2553                 "dot11RSNAGroupCipherRequested=" RSN_SUITE "\n"
2554                 "dot11RSNATKIPCounterMeasuresInvoked=%u\n"
2555                 "dot11RSNA4WayHandshakeFailures=%u\n"
2556                 "dot11RSNAConfigNumberOfGTKSAReplayCounters=0\n",
2557                 RSN_VERSION,
2558                 !!wpa_auth->conf.wpa_strict_rekey,
2559                 dot11RSNAConfigGroupUpdateCount,
2560                 dot11RSNAConfigPairwiseUpdateCount,
2561                 wpa_cipher_bits(wpa_auth->conf.wpa_group),
2562                 dot11RSNAConfigPMKLifetime,
2563                 dot11RSNAConfigPMKReauthThreshold,
2564                 dot11RSNAConfigSATimeout,
2565                 RSN_SUITE_ARG(wpa_auth->dot11RSNAAuthenticationSuiteSelected),
2566                 RSN_SUITE_ARG(wpa_auth->dot11RSNAPairwiseCipherSelected),
2567                 RSN_SUITE_ARG(wpa_auth->dot11RSNAGroupCipherSelected),
2568                 pmkid_txt,
2569                 RSN_SUITE_ARG(wpa_auth->dot11RSNAAuthenticationSuiteRequested),
2570                 RSN_SUITE_ARG(wpa_auth->dot11RSNAPairwiseCipherRequested),
2571                 RSN_SUITE_ARG(wpa_auth->dot11RSNAGroupCipherRequested),
2572                 wpa_auth->dot11RSNATKIPCounterMeasuresInvoked,
2573                 wpa_auth->dot11RSNA4WayHandshakeFailures);
2574         if (ret < 0 || (size_t) ret >= buflen - len)
2575                 return len;
2576         len += ret;
2577
2578         /* TODO: dot11RSNAConfigPairwiseCiphersTable */
2579         /* TODO: dot11RSNAConfigAuthenticationSuitesTable */
2580
2581         /* Private MIB */
2582         ret = os_snprintf(buf + len, buflen - len, "hostapdWPAGroupState=%d\n",
2583                           wpa_auth->group->wpa_group_state);
2584         if (ret < 0 || (size_t) ret >= buflen - len)
2585                 return len;
2586         len += ret;
2587
2588         return len;
2589 }
2590
2591
2592 int wpa_get_mib_sta(struct wpa_state_machine *sm, char *buf, size_t buflen)
2593 {
2594         int len = 0, ret;
2595         u32 pairwise = 0;
2596
2597         if (sm == NULL)
2598                 return 0;
2599
2600         /* TODO: FF-FF-FF-FF-FF-FF entry for broadcast/multicast stats */
2601
2602         /* dot11RSNAStatsEntry */
2603
2604         if (sm->wpa == WPA_VERSION_WPA) {
2605                 if (sm->pairwise == WPA_CIPHER_CCMP)
2606                         pairwise = WPA_CIPHER_SUITE_CCMP;
2607                 else if (sm->pairwise == WPA_CIPHER_TKIP)
2608                         pairwise = WPA_CIPHER_SUITE_TKIP;
2609                 else if (sm->pairwise == WPA_CIPHER_WEP104)
2610                         pairwise = WPA_CIPHER_SUITE_WEP104;
2611                 else if (sm->pairwise == WPA_CIPHER_WEP40)
2612                         pairwise = WPA_CIPHER_SUITE_WEP40;
2613                 else if (sm->pairwise == WPA_CIPHER_NONE)
2614                         pairwise = WPA_CIPHER_SUITE_NONE;
2615         } else if (sm->wpa == WPA_VERSION_WPA2) {
2616                 if (sm->pairwise == WPA_CIPHER_CCMP)
2617                         pairwise = RSN_CIPHER_SUITE_CCMP;
2618                 else if (sm->pairwise == WPA_CIPHER_TKIP)
2619                         pairwise = RSN_CIPHER_SUITE_TKIP;
2620                 else if (sm->pairwise == WPA_CIPHER_WEP104)
2621                         pairwise = RSN_CIPHER_SUITE_WEP104;
2622                 else if (sm->pairwise == WPA_CIPHER_WEP40)
2623                         pairwise = RSN_CIPHER_SUITE_WEP40;
2624                 else if (sm->pairwise == WPA_CIPHER_NONE)
2625                         pairwise = RSN_CIPHER_SUITE_NONE;
2626         } else
2627                 return 0;
2628
2629         ret = os_snprintf(
2630                 buf + len, buflen - len,
2631                 /* TODO: dot11RSNAStatsIndex */
2632                 "dot11RSNAStatsSTAAddress=" MACSTR "\n"
2633                 "dot11RSNAStatsVersion=1\n"
2634                 "dot11RSNAStatsSelectedPairwiseCipher=" RSN_SUITE "\n"
2635                 /* TODO: dot11RSNAStatsTKIPICVErrors */
2636                 "dot11RSNAStatsTKIPLocalMICFailures=%u\n"
2637                 "dot11RSNAStatsTKIPRemoteMICFailures=%u\n"
2638                 /* TODO: dot11RSNAStatsCCMPReplays */
2639                 /* TODO: dot11RSNAStatsCCMPDecryptErrors */
2640                 /* TODO: dot11RSNAStatsTKIPReplays */,
2641                 MAC2STR(sm->addr),
2642                 RSN_SUITE_ARG(pairwise),
2643                 sm->dot11RSNAStatsTKIPLocalMICFailures,
2644                 sm->dot11RSNAStatsTKIPRemoteMICFailures);
2645         if (ret < 0 || (size_t) ret >= buflen - len)
2646                 return len;
2647         len += ret;
2648
2649         /* Private MIB */
2650         ret = os_snprintf(buf + len, buflen - len,
2651                           "hostapdWPAPTKState=%d\n"
2652                           "hostapdWPAPTKGroupState=%d\n",
2653                           sm->wpa_ptk_state,
2654                           sm->wpa_ptk_group_state);
2655         if (ret < 0 || (size_t) ret >= buflen - len)
2656                 return len;
2657         len += ret;
2658
2659         return len;
2660 }
2661
2662
2663 void wpa_auth_countermeasures_start(struct wpa_authenticator *wpa_auth)
2664 {
2665         if (wpa_auth)
2666                 wpa_auth->dot11RSNATKIPCounterMeasuresInvoked++;
2667 }
2668
2669
2670 int wpa_auth_pairwise_set(struct wpa_state_machine *sm)
2671 {
2672         return sm && sm->pairwise_set;
2673 }
2674
2675
2676 int wpa_auth_get_pairwise(struct wpa_state_machine *sm)
2677 {
2678         return sm->pairwise;
2679 }
2680
2681
2682 int wpa_auth_sta_key_mgmt(struct wpa_state_machine *sm)
2683 {
2684         if (sm == NULL)
2685                 return -1;
2686         return sm->wpa_key_mgmt;
2687 }
2688
2689
2690 int wpa_auth_sta_wpa_version(struct wpa_state_machine *sm)
2691 {
2692         if (sm == NULL)
2693                 return 0;
2694         return sm->wpa;
2695 }
2696
2697
2698 int wpa_auth_sta_clear_pmksa(struct wpa_state_machine *sm,
2699                              struct rsn_pmksa_cache_entry *entry)
2700 {
2701         if (sm == NULL || sm->pmksa != entry)
2702                 return -1;
2703         sm->pmksa = NULL;
2704         return 0;
2705 }
2706
2707
2708 struct rsn_pmksa_cache_entry *
2709 wpa_auth_sta_get_pmksa(struct wpa_state_machine *sm)
2710 {
2711         return sm ? sm->pmksa : NULL;
2712 }
2713
2714
2715 void wpa_auth_sta_local_mic_failure_report(struct wpa_state_machine *sm)
2716 {
2717         if (sm)
2718                 sm->dot11RSNAStatsTKIPLocalMICFailures++;
2719 }
2720
2721
2722 const u8 * wpa_auth_get_wpa_ie(struct wpa_authenticator *wpa_auth, size_t *len)
2723 {
2724         if (wpa_auth == NULL)
2725                 return NULL;
2726         *len = wpa_auth->wpa_ie_len;
2727         return wpa_auth->wpa_ie;
2728 }
2729
2730
2731 int wpa_auth_pmksa_add(struct wpa_state_machine *sm, const u8 *pmk,
2732                        int session_timeout, struct eapol_state_machine *eapol)
2733 {
2734         if (sm == NULL || sm->wpa != WPA_VERSION_WPA2 ||
2735             sm->wpa_auth->conf.disable_pmksa_caching)
2736                 return -1;
2737
2738         if (pmksa_cache_auth_add(sm->wpa_auth->pmksa, pmk, PMK_LEN,
2739                                  sm->wpa_auth->addr, sm->addr, session_timeout,
2740                                  eapol, sm->wpa_key_mgmt))
2741                 return 0;
2742
2743         return -1;
2744 }
2745
2746
2747 int wpa_auth_pmksa_add_preauth(struct wpa_authenticator *wpa_auth,
2748                                const u8 *pmk, size_t len, const u8 *sta_addr,
2749                                int session_timeout,
2750                                struct eapol_state_machine *eapol)
2751 {
2752         if (wpa_auth == NULL)
2753                 return -1;
2754
2755         if (pmksa_cache_auth_add(wpa_auth->pmksa, pmk, len, wpa_auth->addr,
2756                                  sta_addr, session_timeout, eapol,
2757                                  WPA_KEY_MGMT_IEEE8021X))
2758                 return 0;
2759
2760         return -1;
2761 }
2762
2763
2764 static struct wpa_group *
2765 wpa_auth_add_group(struct wpa_authenticator *wpa_auth, int vlan_id)
2766 {
2767         struct wpa_group *group;
2768
2769         if (wpa_auth == NULL || wpa_auth->group == NULL)
2770                 return NULL;
2771
2772         wpa_printf(MSG_DEBUG, "WPA: Add group state machine for VLAN-ID %d",
2773                    vlan_id);
2774         group = wpa_group_init(wpa_auth, vlan_id);
2775         if (group == NULL)
2776                 return NULL;
2777
2778         group->next = wpa_auth->group->next;
2779         wpa_auth->group->next = group;
2780
2781         return group;
2782 }
2783
2784
2785 int wpa_auth_sta_set_vlan(struct wpa_state_machine *sm, int vlan_id)
2786 {
2787         struct wpa_group *group;
2788
2789         if (sm == NULL || sm->wpa_auth == NULL)
2790                 return 0;
2791
2792         group = sm->wpa_auth->group;
2793         while (group) {
2794                 if (group->vlan_id == vlan_id)
2795                         break;
2796                 group = group->next;
2797         }
2798
2799         if (group == NULL) {
2800                 group = wpa_auth_add_group(sm->wpa_auth, vlan_id);
2801                 if (group == NULL)
2802                         return -1;
2803         }
2804
2805         if (sm->group == group)
2806                 return 0;
2807
2808         wpa_printf(MSG_DEBUG, "WPA: Moving STA " MACSTR " to use group state "
2809                    "machine for VLAN ID %d", MAC2STR(sm->addr), vlan_id);
2810
2811         sm->group = group;
2812         return 0;
2813 }
2814
2815
2816 void wpa_auth_eapol_key_tx_status(struct wpa_authenticator *wpa_auth,
2817                                   struct wpa_state_machine *sm, int ack)
2818 {
2819         if (wpa_auth == NULL || sm == NULL)
2820                 return;
2821         wpa_printf(MSG_DEBUG, "WPA: EAPOL-Key TX status for STA " MACSTR
2822                    " ack=%d", MAC2STR(sm->addr), ack);
2823         if (sm->pending_1_of_4_timeout && ack) {
2824                 /*
2825                  * Some deployed supplicant implementations update their SNonce
2826                  * for each EAPOL-Key 2/4 message even within the same 4-way
2827                  * handshake and then fail to use the first SNonce when
2828                  * deriving the PTK. This results in unsuccessful 4-way
2829                  * handshake whenever the relatively short initial timeout is
2830                  * reached and EAPOL-Key 1/4 is retransmitted. Try to work
2831                  * around this by increasing the timeout now that we know that
2832                  * the station has received the frame.
2833                  */
2834                 int timeout_ms = eapol_key_timeout_subseq;
2835                 wpa_printf(MSG_DEBUG, "WPA: Increase initial EAPOL-Key 1/4 "
2836                            "timeout by %u ms because of acknowledged frame",
2837                            timeout_ms);
2838                 eloop_cancel_timeout(wpa_send_eapol_timeout, wpa_auth, sm);
2839                 eloop_register_timeout(timeout_ms / 1000,
2840                                        (timeout_ms % 1000) * 1000,
2841                                        wpa_send_eapol_timeout, wpa_auth, sm);
2842         }
2843 }