Updated to hostap_2_6
[mech_eap.git] / libeap / src / ap / wpa_auth.c
1 /*
2  * IEEE 802.11 RSN / WPA Authenticator
3  * Copyright (c) 2004-2015, Jouni Malinen <j@w1.fi>
4  *
5  * This software may be distributed under the terms of the BSD license.
6  * See README for more details.
7  */
8
9 #include "utils/includes.h"
10
11 #include "utils/common.h"
12 #include "utils/eloop.h"
13 #include "utils/state_machine.h"
14 #include "utils/bitfield.h"
15 #include "common/ieee802_11_defs.h"
16 #include "crypto/aes_wrap.h"
17 #include "crypto/crypto.h"
18 #include "crypto/sha1.h"
19 #include "crypto/sha256.h"
20 #include "crypto/random.h"
21 #include "eapol_auth/eapol_auth_sm.h"
22 #include "ap_config.h"
23 #include "ieee802_11.h"
24 #include "wpa_auth.h"
25 #include "pmksa_cache_auth.h"
26 #include "wpa_auth_i.h"
27 #include "wpa_auth_ie.h"
28
29 #define STATE_MACHINE_DATA struct wpa_state_machine
30 #define STATE_MACHINE_DEBUG_PREFIX "WPA"
31 #define STATE_MACHINE_ADDR sm->addr
32
33
34 static void wpa_send_eapol_timeout(void *eloop_ctx, void *timeout_ctx);
35 static int wpa_sm_step(struct wpa_state_machine *sm);
36 static int wpa_verify_key_mic(int akmp, struct wpa_ptk *PTK, u8 *data,
37                               size_t data_len);
38 static void wpa_sm_call_step(void *eloop_ctx, void *timeout_ctx);
39 static void wpa_group_sm_step(struct wpa_authenticator *wpa_auth,
40                               struct wpa_group *group);
41 static void wpa_request_new_ptk(struct wpa_state_machine *sm);
42 static int wpa_gtk_update(struct wpa_authenticator *wpa_auth,
43                           struct wpa_group *group);
44 static int wpa_group_config_group_keys(struct wpa_authenticator *wpa_auth,
45                                        struct wpa_group *group);
46 static int wpa_derive_ptk(struct wpa_state_machine *sm, const u8 *snonce,
47                           const u8 *pmk, unsigned int pmk_len,
48                           struct wpa_ptk *ptk);
49 static void wpa_group_free(struct wpa_authenticator *wpa_auth,
50                            struct wpa_group *group);
51 static void wpa_group_get(struct wpa_authenticator *wpa_auth,
52                           struct wpa_group *group);
53 static void wpa_group_put(struct wpa_authenticator *wpa_auth,
54                           struct wpa_group *group);
55
56 static const u32 dot11RSNAConfigGroupUpdateCount = 4;
57 static const u32 dot11RSNAConfigPairwiseUpdateCount = 4;
58 static const u32 eapol_key_timeout_first = 100; /* ms */
59 static const u32 eapol_key_timeout_subseq = 1000; /* ms */
60 static const u32 eapol_key_timeout_first_group = 500; /* ms */
61
62 /* TODO: make these configurable */
63 static const int dot11RSNAConfigPMKLifetime = 43200;
64 static const int dot11RSNAConfigPMKReauthThreshold = 70;
65 static const int dot11RSNAConfigSATimeout = 60;
66
67
68 static inline int wpa_auth_mic_failure_report(
69         struct wpa_authenticator *wpa_auth, const u8 *addr)
70 {
71         if (wpa_auth->cb.mic_failure_report)
72                 return wpa_auth->cb.mic_failure_report(wpa_auth->cb.ctx, addr);
73         return 0;
74 }
75
76
77 static inline void wpa_auth_psk_failure_report(
78         struct wpa_authenticator *wpa_auth, const u8 *addr)
79 {
80         if (wpa_auth->cb.psk_failure_report)
81                 wpa_auth->cb.psk_failure_report(wpa_auth->cb.ctx, addr);
82 }
83
84
85 static inline void wpa_auth_set_eapol(struct wpa_authenticator *wpa_auth,
86                                       const u8 *addr, wpa_eapol_variable var,
87                                       int value)
88 {
89         if (wpa_auth->cb.set_eapol)
90                 wpa_auth->cb.set_eapol(wpa_auth->cb.ctx, addr, var, value);
91 }
92
93
94 static inline int wpa_auth_get_eapol(struct wpa_authenticator *wpa_auth,
95                                      const u8 *addr, wpa_eapol_variable var)
96 {
97         if (wpa_auth->cb.get_eapol == NULL)
98                 return -1;
99         return wpa_auth->cb.get_eapol(wpa_auth->cb.ctx, addr, var);
100 }
101
102
103 static inline const u8 * wpa_auth_get_psk(struct wpa_authenticator *wpa_auth,
104                                           const u8 *addr,
105                                           const u8 *p2p_dev_addr,
106                                           const u8 *prev_psk)
107 {
108         if (wpa_auth->cb.get_psk == NULL)
109                 return NULL;
110         return wpa_auth->cb.get_psk(wpa_auth->cb.ctx, addr, p2p_dev_addr,
111                                     prev_psk);
112 }
113
114
115 static inline int wpa_auth_get_msk(struct wpa_authenticator *wpa_auth,
116                                    const u8 *addr, u8 *msk, size_t *len)
117 {
118         if (wpa_auth->cb.get_msk == NULL)
119                 return -1;
120         return wpa_auth->cb.get_msk(wpa_auth->cb.ctx, addr, msk, len);
121 }
122
123
124 static inline int wpa_auth_set_key(struct wpa_authenticator *wpa_auth,
125                                    int vlan_id,
126                                    enum wpa_alg alg, const u8 *addr, int idx,
127                                    u8 *key, size_t key_len)
128 {
129         if (wpa_auth->cb.set_key == NULL)
130                 return -1;
131         return wpa_auth->cb.set_key(wpa_auth->cb.ctx, vlan_id, alg, addr, idx,
132                                     key, key_len);
133 }
134
135
136 static inline int wpa_auth_get_seqnum(struct wpa_authenticator *wpa_auth,
137                                       const u8 *addr, int idx, u8 *seq)
138 {
139         if (wpa_auth->cb.get_seqnum == NULL)
140                 return -1;
141         return wpa_auth->cb.get_seqnum(wpa_auth->cb.ctx, addr, idx, seq);
142 }
143
144
145 static inline int
146 wpa_auth_send_eapol(struct wpa_authenticator *wpa_auth, const u8 *addr,
147                     const u8 *data, size_t data_len, int encrypt)
148 {
149         if (wpa_auth->cb.send_eapol == NULL)
150                 return -1;
151         return wpa_auth->cb.send_eapol(wpa_auth->cb.ctx, addr, data, data_len,
152                                        encrypt);
153 }
154
155
156 #ifdef CONFIG_MESH
157 static inline int wpa_auth_start_ampe(struct wpa_authenticator *wpa_auth,
158                                       const u8 *addr)
159 {
160         if (wpa_auth->cb.start_ampe == NULL)
161                 return -1;
162         return wpa_auth->cb.start_ampe(wpa_auth->cb.ctx, addr);
163 }
164 #endif /* CONFIG_MESH */
165
166
167 int wpa_auth_for_each_sta(struct wpa_authenticator *wpa_auth,
168                           int (*cb)(struct wpa_state_machine *sm, void *ctx),
169                           void *cb_ctx)
170 {
171         if (wpa_auth->cb.for_each_sta == NULL)
172                 return 0;
173         return wpa_auth->cb.for_each_sta(wpa_auth->cb.ctx, cb, cb_ctx);
174 }
175
176
177 int wpa_auth_for_each_auth(struct wpa_authenticator *wpa_auth,
178                            int (*cb)(struct wpa_authenticator *a, void *ctx),
179                            void *cb_ctx)
180 {
181         if (wpa_auth->cb.for_each_auth == NULL)
182                 return 0;
183         return wpa_auth->cb.for_each_auth(wpa_auth->cb.ctx, cb, cb_ctx);
184 }
185
186
187 void wpa_auth_logger(struct wpa_authenticator *wpa_auth, const u8 *addr,
188                      logger_level level, const char *txt)
189 {
190         if (wpa_auth->cb.logger == NULL)
191                 return;
192         wpa_auth->cb.logger(wpa_auth->cb.ctx, addr, level, txt);
193 }
194
195
196 void wpa_auth_vlogger(struct wpa_authenticator *wpa_auth, const u8 *addr,
197                       logger_level level, const char *fmt, ...)
198 {
199         char *format;
200         int maxlen;
201         va_list ap;
202
203         if (wpa_auth->cb.logger == NULL)
204                 return;
205
206         maxlen = os_strlen(fmt) + 100;
207         format = os_malloc(maxlen);
208         if (!format)
209                 return;
210
211         va_start(ap, fmt);
212         vsnprintf(format, maxlen, fmt, ap);
213         va_end(ap);
214
215         wpa_auth_logger(wpa_auth, addr, level, format);
216
217         os_free(format);
218 }
219
220
221 static void wpa_sta_disconnect(struct wpa_authenticator *wpa_auth,
222                                const u8 *addr)
223 {
224         if (wpa_auth->cb.disconnect == NULL)
225                 return;
226         wpa_printf(MSG_DEBUG, "wpa_sta_disconnect STA " MACSTR, MAC2STR(addr));
227         wpa_auth->cb.disconnect(wpa_auth->cb.ctx, addr,
228                                 WLAN_REASON_PREV_AUTH_NOT_VALID);
229 }
230
231
232 static int wpa_use_aes_cmac(struct wpa_state_machine *sm)
233 {
234         int ret = 0;
235 #ifdef CONFIG_IEEE80211R
236         if (wpa_key_mgmt_ft(sm->wpa_key_mgmt))
237                 ret = 1;
238 #endif /* CONFIG_IEEE80211R */
239 #ifdef CONFIG_IEEE80211W
240         if (wpa_key_mgmt_sha256(sm->wpa_key_mgmt))
241                 ret = 1;
242 #endif /* CONFIG_IEEE80211W */
243         if (sm->wpa_key_mgmt == WPA_KEY_MGMT_OSEN)
244                 ret = 1;
245         return ret;
246 }
247
248
249 static void wpa_rekey_gmk(void *eloop_ctx, void *timeout_ctx)
250 {
251         struct wpa_authenticator *wpa_auth = eloop_ctx;
252
253         if (random_get_bytes(wpa_auth->group->GMK, WPA_GMK_LEN)) {
254                 wpa_printf(MSG_ERROR, "Failed to get random data for WPA "
255                            "initialization.");
256         } else {
257                 wpa_auth_logger(wpa_auth, NULL, LOGGER_DEBUG, "GMK rekeyd");
258                 wpa_hexdump_key(MSG_DEBUG, "GMK",
259                                 wpa_auth->group->GMK, WPA_GMK_LEN);
260         }
261
262         if (wpa_auth->conf.wpa_gmk_rekey) {
263                 eloop_register_timeout(wpa_auth->conf.wpa_gmk_rekey, 0,
264                                        wpa_rekey_gmk, wpa_auth, NULL);
265         }
266 }
267
268
269 static void wpa_rekey_gtk(void *eloop_ctx, void *timeout_ctx)
270 {
271         struct wpa_authenticator *wpa_auth = eloop_ctx;
272         struct wpa_group *group, *next;
273
274         wpa_auth_logger(wpa_auth, NULL, LOGGER_DEBUG, "rekeying GTK");
275         group = wpa_auth->group;
276         while (group) {
277                 wpa_group_get(wpa_auth, group);
278
279                 group->GTKReKey = TRUE;
280                 do {
281                         group->changed = FALSE;
282                         wpa_group_sm_step(wpa_auth, group);
283                 } while (group->changed);
284
285                 next = group->next;
286                 wpa_group_put(wpa_auth, group);
287                 group = next;
288         }
289
290         if (wpa_auth->conf.wpa_group_rekey) {
291                 eloop_register_timeout(wpa_auth->conf.wpa_group_rekey,
292                                        0, wpa_rekey_gtk, wpa_auth, NULL);
293         }
294 }
295
296
297 static void wpa_rekey_ptk(void *eloop_ctx, void *timeout_ctx)
298 {
299         struct wpa_authenticator *wpa_auth = eloop_ctx;
300         struct wpa_state_machine *sm = timeout_ctx;
301
302         wpa_auth_logger(wpa_auth, sm->addr, LOGGER_DEBUG, "rekeying PTK");
303         wpa_request_new_ptk(sm);
304         wpa_sm_step(sm);
305 }
306
307
308 static int wpa_auth_pmksa_clear_cb(struct wpa_state_machine *sm, void *ctx)
309 {
310         if (sm->pmksa == ctx)
311                 sm->pmksa = NULL;
312         return 0;
313 }
314
315
316 static void wpa_auth_pmksa_free_cb(struct rsn_pmksa_cache_entry *entry,
317                                    void *ctx)
318 {
319         struct wpa_authenticator *wpa_auth = ctx;
320         wpa_auth_for_each_sta(wpa_auth, wpa_auth_pmksa_clear_cb, entry);
321 }
322
323
324 static int wpa_group_init_gmk_and_counter(struct wpa_authenticator *wpa_auth,
325                                           struct wpa_group *group)
326 {
327         u8 buf[ETH_ALEN + 8 + sizeof(unsigned long)];
328         u8 rkey[32];
329         unsigned long ptr;
330
331         if (random_get_bytes(group->GMK, WPA_GMK_LEN) < 0)
332                 return -1;
333         wpa_hexdump_key(MSG_DEBUG, "GMK", group->GMK, WPA_GMK_LEN);
334
335         /*
336          * Counter = PRF-256(Random number, "Init Counter",
337          *                   Local MAC Address || Time)
338          */
339         os_memcpy(buf, wpa_auth->addr, ETH_ALEN);
340         wpa_get_ntp_timestamp(buf + ETH_ALEN);
341         ptr = (unsigned long) group;
342         os_memcpy(buf + ETH_ALEN + 8, &ptr, sizeof(ptr));
343         if (random_get_bytes(rkey, sizeof(rkey)) < 0)
344                 return -1;
345
346         if (sha1_prf(rkey, sizeof(rkey), "Init Counter", buf, sizeof(buf),
347                      group->Counter, WPA_NONCE_LEN) < 0)
348                 return -1;
349         wpa_hexdump_key(MSG_DEBUG, "Key Counter",
350                         group->Counter, WPA_NONCE_LEN);
351
352         return 0;
353 }
354
355
356 static struct wpa_group * wpa_group_init(struct wpa_authenticator *wpa_auth,
357                                          int vlan_id, int delay_init)
358 {
359         struct wpa_group *group;
360
361         group = os_zalloc(sizeof(struct wpa_group));
362         if (group == NULL)
363                 return NULL;
364
365         group->GTKAuthenticator = TRUE;
366         group->vlan_id = vlan_id;
367         group->GTK_len = wpa_cipher_key_len(wpa_auth->conf.wpa_group);
368
369         if (random_pool_ready() != 1) {
370                 wpa_printf(MSG_INFO, "WPA: Not enough entropy in random pool "
371                            "for secure operations - update keys later when "
372                            "the first station connects");
373         }
374
375         /*
376          * Set initial GMK/Counter value here. The actual values that will be
377          * used in negotiations will be set once the first station tries to
378          * connect. This allows more time for collecting additional randomness
379          * on embedded devices.
380          */
381         if (wpa_group_init_gmk_and_counter(wpa_auth, group) < 0) {
382                 wpa_printf(MSG_ERROR, "Failed to get random data for WPA "
383                            "initialization.");
384                 os_free(group);
385                 return NULL;
386         }
387
388         group->GInit = TRUE;
389         if (delay_init) {
390                 wpa_printf(MSG_DEBUG, "WPA: Delay group state machine start "
391                            "until Beacon frames have been configured");
392                 /* Initialization is completed in wpa_init_keys(). */
393         } else {
394                 wpa_group_sm_step(wpa_auth, group);
395                 group->GInit = FALSE;
396                 wpa_group_sm_step(wpa_auth, group);
397         }
398
399         return group;
400 }
401
402
403 /**
404  * wpa_init - Initialize WPA authenticator
405  * @addr: Authenticator address
406  * @conf: Configuration for WPA authenticator
407  * @cb: Callback functions for WPA authenticator
408  * Returns: Pointer to WPA authenticator data or %NULL on failure
409  */
410 struct wpa_authenticator * wpa_init(const u8 *addr,
411                                     struct wpa_auth_config *conf,
412                                     struct wpa_auth_callbacks *cb)
413 {
414         struct wpa_authenticator *wpa_auth;
415
416         wpa_auth = os_zalloc(sizeof(struct wpa_authenticator));
417         if (wpa_auth == NULL)
418                 return NULL;
419         os_memcpy(wpa_auth->addr, addr, ETH_ALEN);
420         os_memcpy(&wpa_auth->conf, conf, sizeof(*conf));
421         os_memcpy(&wpa_auth->cb, cb, sizeof(*cb));
422
423         if (wpa_auth_gen_wpa_ie(wpa_auth)) {
424                 wpa_printf(MSG_ERROR, "Could not generate WPA IE.");
425                 os_free(wpa_auth);
426                 return NULL;
427         }
428
429         wpa_auth->group = wpa_group_init(wpa_auth, 0, 1);
430         if (wpa_auth->group == NULL) {
431                 os_free(wpa_auth->wpa_ie);
432                 os_free(wpa_auth);
433                 return NULL;
434         }
435
436         wpa_auth->pmksa = pmksa_cache_auth_init(wpa_auth_pmksa_free_cb,
437                                                 wpa_auth);
438         if (wpa_auth->pmksa == NULL) {
439                 wpa_printf(MSG_ERROR, "PMKSA cache initialization failed.");
440                 os_free(wpa_auth->group);
441                 os_free(wpa_auth->wpa_ie);
442                 os_free(wpa_auth);
443                 return NULL;
444         }
445
446 #ifdef CONFIG_IEEE80211R
447         wpa_auth->ft_pmk_cache = wpa_ft_pmk_cache_init();
448         if (wpa_auth->ft_pmk_cache == NULL) {
449                 wpa_printf(MSG_ERROR, "FT PMK cache initialization failed.");
450                 os_free(wpa_auth->group);
451                 os_free(wpa_auth->wpa_ie);
452                 pmksa_cache_auth_deinit(wpa_auth->pmksa);
453                 os_free(wpa_auth);
454                 return NULL;
455         }
456 #endif /* CONFIG_IEEE80211R */
457
458         if (wpa_auth->conf.wpa_gmk_rekey) {
459                 eloop_register_timeout(wpa_auth->conf.wpa_gmk_rekey, 0,
460                                        wpa_rekey_gmk, wpa_auth, NULL);
461         }
462
463         if (wpa_auth->conf.wpa_group_rekey) {
464                 eloop_register_timeout(wpa_auth->conf.wpa_group_rekey, 0,
465                                        wpa_rekey_gtk, wpa_auth, NULL);
466         }
467
468 #ifdef CONFIG_P2P
469         if (WPA_GET_BE32(conf->ip_addr_start)) {
470                 int count = WPA_GET_BE32(conf->ip_addr_end) -
471                         WPA_GET_BE32(conf->ip_addr_start) + 1;
472                 if (count > 1000)
473                         count = 1000;
474                 if (count > 0)
475                         wpa_auth->ip_pool = bitfield_alloc(count);
476         }
477 #endif /* CONFIG_P2P */
478
479         return wpa_auth;
480 }
481
482
483 int wpa_init_keys(struct wpa_authenticator *wpa_auth)
484 {
485         struct wpa_group *group = wpa_auth->group;
486
487         wpa_printf(MSG_DEBUG, "WPA: Start group state machine to set initial "
488                    "keys");
489         wpa_group_sm_step(wpa_auth, group);
490         group->GInit = FALSE;
491         wpa_group_sm_step(wpa_auth, group);
492         if (group->wpa_group_state == WPA_GROUP_FATAL_FAILURE)
493                 return -1;
494         return 0;
495 }
496
497
498 /**
499  * wpa_deinit - Deinitialize WPA authenticator
500  * @wpa_auth: Pointer to WPA authenticator data from wpa_init()
501  */
502 void wpa_deinit(struct wpa_authenticator *wpa_auth)
503 {
504         struct wpa_group *group, *prev;
505
506         eloop_cancel_timeout(wpa_rekey_gmk, wpa_auth, NULL);
507         eloop_cancel_timeout(wpa_rekey_gtk, wpa_auth, NULL);
508
509 #ifdef CONFIG_PEERKEY
510         while (wpa_auth->stsl_negotiations)
511                 wpa_stsl_remove(wpa_auth, wpa_auth->stsl_negotiations);
512 #endif /* CONFIG_PEERKEY */
513
514         pmksa_cache_auth_deinit(wpa_auth->pmksa);
515
516 #ifdef CONFIG_IEEE80211R
517         wpa_ft_pmk_cache_deinit(wpa_auth->ft_pmk_cache);
518         wpa_auth->ft_pmk_cache = NULL;
519 #endif /* CONFIG_IEEE80211R */
520
521 #ifdef CONFIG_P2P
522         bitfield_free(wpa_auth->ip_pool);
523 #endif /* CONFIG_P2P */
524
525
526         os_free(wpa_auth->wpa_ie);
527
528         group = wpa_auth->group;
529         while (group) {
530                 prev = group;
531                 group = group->next;
532                 os_free(prev);
533         }
534
535         os_free(wpa_auth);
536 }
537
538
539 /**
540  * wpa_reconfig - Update WPA authenticator configuration
541  * @wpa_auth: Pointer to WPA authenticator data from wpa_init()
542  * @conf: Configuration for WPA authenticator
543  */
544 int wpa_reconfig(struct wpa_authenticator *wpa_auth,
545                  struct wpa_auth_config *conf)
546 {
547         struct wpa_group *group;
548         if (wpa_auth == NULL)
549                 return 0;
550
551         os_memcpy(&wpa_auth->conf, conf, sizeof(*conf));
552         if (wpa_auth_gen_wpa_ie(wpa_auth)) {
553                 wpa_printf(MSG_ERROR, "Could not generate WPA IE.");
554                 return -1;
555         }
556
557         /*
558          * Reinitialize GTK to make sure it is suitable for the new
559          * configuration.
560          */
561         group = wpa_auth->group;
562         group->GTK_len = wpa_cipher_key_len(wpa_auth->conf.wpa_group);
563         group->GInit = TRUE;
564         wpa_group_sm_step(wpa_auth, group);
565         group->GInit = FALSE;
566         wpa_group_sm_step(wpa_auth, group);
567
568         return 0;
569 }
570
571
572 struct wpa_state_machine *
573 wpa_auth_sta_init(struct wpa_authenticator *wpa_auth, const u8 *addr,
574                   const u8 *p2p_dev_addr)
575 {
576         struct wpa_state_machine *sm;
577
578         if (wpa_auth->group->wpa_group_state == WPA_GROUP_FATAL_FAILURE)
579                 return NULL;
580
581         sm = os_zalloc(sizeof(struct wpa_state_machine));
582         if (sm == NULL)
583                 return NULL;
584         os_memcpy(sm->addr, addr, ETH_ALEN);
585         if (p2p_dev_addr)
586                 os_memcpy(sm->p2p_dev_addr, p2p_dev_addr, ETH_ALEN);
587
588         sm->wpa_auth = wpa_auth;
589         sm->group = wpa_auth->group;
590         wpa_group_get(sm->wpa_auth, sm->group);
591
592         return sm;
593 }
594
595
596 int wpa_auth_sta_associated(struct wpa_authenticator *wpa_auth,
597                             struct wpa_state_machine *sm)
598 {
599         if (wpa_auth == NULL || !wpa_auth->conf.wpa || sm == NULL)
600                 return -1;
601
602 #ifdef CONFIG_IEEE80211R
603         if (sm->ft_completed) {
604                 wpa_auth_logger(wpa_auth, sm->addr, LOGGER_DEBUG,
605                                 "FT authentication already completed - do not "
606                                 "start 4-way handshake");
607                 /* Go to PTKINITDONE state to allow GTK rekeying */
608                 sm->wpa_ptk_state = WPA_PTK_PTKINITDONE;
609                 return 0;
610         }
611 #endif /* CONFIG_IEEE80211R */
612
613         if (sm->started) {
614                 os_memset(&sm->key_replay, 0, sizeof(sm->key_replay));
615                 sm->ReAuthenticationRequest = TRUE;
616                 return wpa_sm_step(sm);
617         }
618
619         wpa_auth_logger(wpa_auth, sm->addr, LOGGER_DEBUG,
620                         "start authentication");
621         sm->started = 1;
622
623         sm->Init = TRUE;
624         if (wpa_sm_step(sm) == 1)
625                 return 1; /* should not really happen */
626         sm->Init = FALSE;
627         sm->AuthenticationRequest = TRUE;
628         return wpa_sm_step(sm);
629 }
630
631
632 void wpa_auth_sta_no_wpa(struct wpa_state_machine *sm)
633 {
634         /* WPA/RSN was not used - clear WPA state. This is needed if the STA
635          * reassociates back to the same AP while the previous entry for the
636          * STA has not yet been removed. */
637         if (sm == NULL)
638                 return;
639
640         sm->wpa_key_mgmt = 0;
641 }
642
643
644 static void wpa_free_sta_sm(struct wpa_state_machine *sm)
645 {
646 #ifdef CONFIG_P2P
647         if (WPA_GET_BE32(sm->ip_addr)) {
648                 u32 start;
649                 wpa_printf(MSG_DEBUG, "P2P: Free assigned IP "
650                            "address %u.%u.%u.%u from " MACSTR,
651                            sm->ip_addr[0], sm->ip_addr[1],
652                            sm->ip_addr[2], sm->ip_addr[3],
653                            MAC2STR(sm->addr));
654                 start = WPA_GET_BE32(sm->wpa_auth->conf.ip_addr_start);
655                 bitfield_clear(sm->wpa_auth->ip_pool,
656                                WPA_GET_BE32(sm->ip_addr) - start);
657         }
658 #endif /* CONFIG_P2P */
659         if (sm->GUpdateStationKeys) {
660                 sm->group->GKeyDoneStations--;
661                 sm->GUpdateStationKeys = FALSE;
662         }
663 #ifdef CONFIG_IEEE80211R
664         os_free(sm->assoc_resp_ftie);
665         wpabuf_free(sm->ft_pending_req_ies);
666 #endif /* CONFIG_IEEE80211R */
667         os_free(sm->last_rx_eapol_key);
668         os_free(sm->wpa_ie);
669         wpa_group_put(sm->wpa_auth, sm->group);
670         os_free(sm);
671 }
672
673
674 void wpa_auth_sta_deinit(struct wpa_state_machine *sm)
675 {
676         if (sm == NULL)
677                 return;
678
679         if (sm->wpa_auth->conf.wpa_strict_rekey && sm->has_GTK) {
680                 wpa_auth_logger(sm->wpa_auth, sm->addr, LOGGER_DEBUG,
681                                 "strict rekeying - force GTK rekey since STA "
682                                 "is leaving");
683                 eloop_cancel_timeout(wpa_rekey_gtk, sm->wpa_auth, NULL);
684                 eloop_register_timeout(0, 500000, wpa_rekey_gtk, sm->wpa_auth,
685                                        NULL);
686         }
687
688         eloop_cancel_timeout(wpa_send_eapol_timeout, sm->wpa_auth, sm);
689         sm->pending_1_of_4_timeout = 0;
690         eloop_cancel_timeout(wpa_sm_call_step, sm, NULL);
691         eloop_cancel_timeout(wpa_rekey_ptk, sm->wpa_auth, sm);
692         if (sm->in_step_loop) {
693                 /* Must not free state machine while wpa_sm_step() is running.
694                  * Freeing will be completed in the end of wpa_sm_step(). */
695                 wpa_printf(MSG_DEBUG, "WPA: Registering pending STA state "
696                            "machine deinit for " MACSTR, MAC2STR(sm->addr));
697                 sm->pending_deinit = 1;
698         } else
699                 wpa_free_sta_sm(sm);
700 }
701
702
703 static void wpa_request_new_ptk(struct wpa_state_machine *sm)
704 {
705         if (sm == NULL)
706                 return;
707
708         sm->PTKRequest = TRUE;
709         sm->PTK_valid = 0;
710 }
711
712
713 static int wpa_replay_counter_valid(struct wpa_key_replay_counter *ctr,
714                                     const u8 *replay_counter)
715 {
716         int i;
717         for (i = 0; i < RSNA_MAX_EAPOL_RETRIES; i++) {
718                 if (!ctr[i].valid)
719                         break;
720                 if (os_memcmp(replay_counter, ctr[i].counter,
721                               WPA_REPLAY_COUNTER_LEN) == 0)
722                         return 1;
723         }
724         return 0;
725 }
726
727
728 static void wpa_replay_counter_mark_invalid(struct wpa_key_replay_counter *ctr,
729                                             const u8 *replay_counter)
730 {
731         int i;
732         for (i = 0; i < RSNA_MAX_EAPOL_RETRIES; i++) {
733                 if (ctr[i].valid &&
734                     (replay_counter == NULL ||
735                      os_memcmp(replay_counter, ctr[i].counter,
736                                WPA_REPLAY_COUNTER_LEN) == 0))
737                         ctr[i].valid = FALSE;
738         }
739 }
740
741
742 #ifdef CONFIG_IEEE80211R
743 static int ft_check_msg_2_of_4(struct wpa_authenticator *wpa_auth,
744                                struct wpa_state_machine *sm,
745                                struct wpa_eapol_ie_parse *kde)
746 {
747         struct wpa_ie_data ie;
748         struct rsn_mdie *mdie;
749
750         if (wpa_parse_wpa_ie_rsn(kde->rsn_ie, kde->rsn_ie_len, &ie) < 0 ||
751             ie.num_pmkid != 1 || ie.pmkid == NULL) {
752                 wpa_printf(MSG_DEBUG, "FT: No PMKR1Name in "
753                            "FT 4-way handshake message 2/4");
754                 return -1;
755         }
756
757         os_memcpy(sm->sup_pmk_r1_name, ie.pmkid, PMKID_LEN);
758         wpa_hexdump(MSG_DEBUG, "FT: PMKR1Name from Supplicant",
759                     sm->sup_pmk_r1_name, PMKID_LEN);
760
761         if (!kde->mdie || !kde->ftie) {
762                 wpa_printf(MSG_DEBUG, "FT: No %s in FT 4-way handshake "
763                            "message 2/4", kde->mdie ? "FTIE" : "MDIE");
764                 return -1;
765         }
766
767         mdie = (struct rsn_mdie *) (kde->mdie + 2);
768         if (kde->mdie[1] < sizeof(struct rsn_mdie) ||
769             os_memcmp(wpa_auth->conf.mobility_domain, mdie->mobility_domain,
770                       MOBILITY_DOMAIN_ID_LEN) != 0) {
771                 wpa_printf(MSG_DEBUG, "FT: MDIE mismatch");
772                 return -1;
773         }
774
775         if (sm->assoc_resp_ftie &&
776             (kde->ftie[1] != sm->assoc_resp_ftie[1] ||
777              os_memcmp(kde->ftie, sm->assoc_resp_ftie,
778                        2 + sm->assoc_resp_ftie[1]) != 0)) {
779                 wpa_printf(MSG_DEBUG, "FT: FTIE mismatch");
780                 wpa_hexdump(MSG_DEBUG, "FT: FTIE in EAPOL-Key msg 2/4",
781                             kde->ftie, kde->ftie_len);
782                 wpa_hexdump(MSG_DEBUG, "FT: FTIE in (Re)AssocResp",
783                             sm->assoc_resp_ftie, 2 + sm->assoc_resp_ftie[1]);
784                 return -1;
785         }
786
787         return 0;
788 }
789 #endif /* CONFIG_IEEE80211R */
790
791
792 static int wpa_receive_error_report(struct wpa_authenticator *wpa_auth,
793                                     struct wpa_state_machine *sm, int group)
794 {
795         /* Supplicant reported a Michael MIC error */
796         wpa_auth_vlogger(wpa_auth, sm->addr, LOGGER_INFO,
797                          "received EAPOL-Key Error Request "
798                          "(STA detected Michael MIC failure (group=%d))",
799                          group);
800
801         if (group && wpa_auth->conf.wpa_group != WPA_CIPHER_TKIP) {
802                 wpa_auth_logger(wpa_auth, sm->addr, LOGGER_INFO,
803                                 "ignore Michael MIC failure report since "
804                                 "group cipher is not TKIP");
805         } else if (!group && sm->pairwise != WPA_CIPHER_TKIP) {
806                 wpa_auth_logger(wpa_auth, sm->addr, LOGGER_INFO,
807                                 "ignore Michael MIC failure report since "
808                                 "pairwise cipher is not TKIP");
809         } else {
810                 if (wpa_auth_mic_failure_report(wpa_auth, sm->addr) > 0)
811                         return 1; /* STA entry was removed */
812                 sm->dot11RSNAStatsTKIPRemoteMICFailures++;
813                 wpa_auth->dot11RSNAStatsTKIPRemoteMICFailures++;
814         }
815
816         /*
817          * Error report is not a request for a new key handshake, but since
818          * Authenticator may do it, let's change the keys now anyway.
819          */
820         wpa_request_new_ptk(sm);
821         return 0;
822 }
823
824
825 static int wpa_try_alt_snonce(struct wpa_state_machine *sm, u8 *data,
826                               size_t data_len)
827 {
828         struct wpa_ptk PTK;
829         int ok = 0;
830         const u8 *pmk = NULL;
831         unsigned int pmk_len;
832
833         for (;;) {
834                 if (wpa_key_mgmt_wpa_psk(sm->wpa_key_mgmt)) {
835                         pmk = wpa_auth_get_psk(sm->wpa_auth, sm->addr,
836                                                sm->p2p_dev_addr, pmk);
837                         if (pmk == NULL)
838                                 break;
839                         pmk_len = PMK_LEN;
840                 } else {
841                         pmk = sm->PMK;
842                         pmk_len = sm->pmk_len;
843                 }
844
845                 wpa_derive_ptk(sm, sm->alt_SNonce, pmk, pmk_len, &PTK);
846
847                 if (wpa_verify_key_mic(sm->wpa_key_mgmt, &PTK, data, data_len)
848                     == 0) {
849                         ok = 1;
850                         break;
851                 }
852
853                 if (!wpa_key_mgmt_wpa_psk(sm->wpa_key_mgmt))
854                         break;
855         }
856
857         if (!ok) {
858                 wpa_printf(MSG_DEBUG,
859                            "WPA: Earlier SNonce did not result in matching MIC");
860                 return -1;
861         }
862
863         wpa_printf(MSG_DEBUG,
864                    "WPA: Earlier SNonce resulted in matching MIC");
865         sm->alt_snonce_valid = 0;
866         os_memcpy(sm->SNonce, sm->alt_SNonce, WPA_NONCE_LEN);
867         os_memcpy(&sm->PTK, &PTK, sizeof(PTK));
868         sm->PTK_valid = TRUE;
869
870         return 0;
871 }
872
873
874 void wpa_receive(struct wpa_authenticator *wpa_auth,
875                  struct wpa_state_machine *sm,
876                  u8 *data, size_t data_len)
877 {
878         struct ieee802_1x_hdr *hdr;
879         struct wpa_eapol_key *key;
880         struct wpa_eapol_key_192 *key192;
881         u16 key_info, key_data_length;
882         enum { PAIRWISE_2, PAIRWISE_4, GROUP_2, REQUEST,
883                SMK_M1, SMK_M3, SMK_ERROR } msg;
884         char *msgtxt;
885         struct wpa_eapol_ie_parse kde;
886         int ft;
887         const u8 *eapol_key_ie, *key_data;
888         size_t eapol_key_ie_len, keyhdrlen, mic_len;
889
890         if (wpa_auth == NULL || !wpa_auth->conf.wpa || sm == NULL)
891                 return;
892
893         mic_len = wpa_mic_len(sm->wpa_key_mgmt);
894         keyhdrlen = mic_len == 24 ? sizeof(*key192) : sizeof(*key);
895
896         if (data_len < sizeof(*hdr) + keyhdrlen)
897                 return;
898
899         hdr = (struct ieee802_1x_hdr *) data;
900         key = (struct wpa_eapol_key *) (hdr + 1);
901         key192 = (struct wpa_eapol_key_192 *) (hdr + 1);
902         key_info = WPA_GET_BE16(key->key_info);
903         if (mic_len == 24) {
904                 key_data = (const u8 *) (key192 + 1);
905                 key_data_length = WPA_GET_BE16(key192->key_data_length);
906         } else {
907                 key_data = (const u8 *) (key + 1);
908                 key_data_length = WPA_GET_BE16(key->key_data_length);
909         }
910         wpa_printf(MSG_DEBUG, "WPA: Received EAPOL-Key from " MACSTR
911                    " key_info=0x%x type=%u key_data_length=%u",
912                    MAC2STR(sm->addr), key_info, key->type, key_data_length);
913         if (key_data_length > data_len - sizeof(*hdr) - keyhdrlen) {
914                 wpa_printf(MSG_INFO, "WPA: Invalid EAPOL-Key frame - "
915                            "key_data overflow (%d > %lu)",
916                            key_data_length,
917                            (unsigned long) (data_len - sizeof(*hdr) -
918                                             keyhdrlen));
919                 return;
920         }
921
922         if (sm->wpa == WPA_VERSION_WPA2) {
923                 if (key->type == EAPOL_KEY_TYPE_WPA) {
924                         /*
925                          * Some deployed station implementations seem to send
926                          * msg 4/4 with incorrect type value in WPA2 mode.
927                          */
928                         wpa_printf(MSG_DEBUG, "Workaround: Allow EAPOL-Key "
929                                    "with unexpected WPA type in RSN mode");
930                 } else if (key->type != EAPOL_KEY_TYPE_RSN) {
931                         wpa_printf(MSG_DEBUG, "Ignore EAPOL-Key with "
932                                    "unexpected type %d in RSN mode",
933                                    key->type);
934                         return;
935                 }
936         } else {
937                 if (key->type != EAPOL_KEY_TYPE_WPA) {
938                         wpa_printf(MSG_DEBUG, "Ignore EAPOL-Key with "
939                                    "unexpected type %d in WPA mode",
940                                    key->type);
941                         return;
942                 }
943         }
944
945         wpa_hexdump(MSG_DEBUG, "WPA: Received Key Nonce", key->key_nonce,
946                     WPA_NONCE_LEN);
947         wpa_hexdump(MSG_DEBUG, "WPA: Received Replay Counter",
948                     key->replay_counter, WPA_REPLAY_COUNTER_LEN);
949
950         /* FIX: verify that the EAPOL-Key frame was encrypted if pairwise keys
951          * are set */
952
953         if ((key_info & (WPA_KEY_INFO_SMK_MESSAGE | WPA_KEY_INFO_REQUEST)) ==
954             (WPA_KEY_INFO_SMK_MESSAGE | WPA_KEY_INFO_REQUEST)) {
955                 if (key_info & WPA_KEY_INFO_ERROR) {
956                         msg = SMK_ERROR;
957                         msgtxt = "SMK Error";
958                 } else {
959                         msg = SMK_M1;
960                         msgtxt = "SMK M1";
961                 }
962         } else if (key_info & WPA_KEY_INFO_SMK_MESSAGE) {
963                 msg = SMK_M3;
964                 msgtxt = "SMK M3";
965         } else if (key_info & WPA_KEY_INFO_REQUEST) {
966                 msg = REQUEST;
967                 msgtxt = "Request";
968         } else if (!(key_info & WPA_KEY_INFO_KEY_TYPE)) {
969                 msg = GROUP_2;
970                 msgtxt = "2/2 Group";
971         } else if (key_data_length == 0) {
972                 msg = PAIRWISE_4;
973                 msgtxt = "4/4 Pairwise";
974         } else {
975                 msg = PAIRWISE_2;
976                 msgtxt = "2/4 Pairwise";
977         }
978
979         /* TODO: key_info type validation for PeerKey */
980         if (msg == REQUEST || msg == PAIRWISE_2 || msg == PAIRWISE_4 ||
981             msg == GROUP_2) {
982                 u16 ver = key_info & WPA_KEY_INFO_TYPE_MASK;
983                 if (sm->pairwise == WPA_CIPHER_CCMP ||
984                     sm->pairwise == WPA_CIPHER_GCMP) {
985                         if (wpa_use_aes_cmac(sm) &&
986                             sm->wpa_key_mgmt != WPA_KEY_MGMT_OSEN &&
987                             !wpa_key_mgmt_suite_b(sm->wpa_key_mgmt) &&
988                             ver != WPA_KEY_INFO_TYPE_AES_128_CMAC) {
989                                 wpa_auth_logger(wpa_auth, sm->addr,
990                                                 LOGGER_WARNING,
991                                                 "advertised support for "
992                                                 "AES-128-CMAC, but did not "
993                                                 "use it");
994                                 return;
995                         }
996
997                         if (!wpa_use_aes_cmac(sm) &&
998                             ver != WPA_KEY_INFO_TYPE_HMAC_SHA1_AES) {
999                                 wpa_auth_logger(wpa_auth, sm->addr,
1000                                                 LOGGER_WARNING,
1001                                                 "did not use HMAC-SHA1-AES "
1002                                                 "with CCMP/GCMP");
1003                                 return;
1004                         }
1005                 }
1006
1007                 if (wpa_key_mgmt_suite_b(sm->wpa_key_mgmt) &&
1008                     ver != WPA_KEY_INFO_TYPE_AKM_DEFINED) {
1009                         wpa_auth_logger(wpa_auth, sm->addr, LOGGER_WARNING,
1010                                         "did not use EAPOL-Key descriptor version 0 as required for AKM-defined cases");
1011                         return;
1012                 }
1013         }
1014
1015         if (key_info & WPA_KEY_INFO_REQUEST) {
1016                 if (sm->req_replay_counter_used &&
1017                     os_memcmp(key->replay_counter, sm->req_replay_counter,
1018                               WPA_REPLAY_COUNTER_LEN) <= 0) {
1019                         wpa_auth_logger(wpa_auth, sm->addr, LOGGER_WARNING,
1020                                         "received EAPOL-Key request with "
1021                                         "replayed counter");
1022                         return;
1023                 }
1024         }
1025
1026         if (!(key_info & WPA_KEY_INFO_REQUEST) &&
1027             !wpa_replay_counter_valid(sm->key_replay, key->replay_counter)) {
1028                 int i;
1029
1030                 if (msg == PAIRWISE_2 &&
1031                     wpa_replay_counter_valid(sm->prev_key_replay,
1032                                              key->replay_counter) &&
1033                     sm->wpa_ptk_state == WPA_PTK_PTKINITNEGOTIATING &&
1034                     os_memcmp(sm->SNonce, key->key_nonce, WPA_NONCE_LEN) != 0)
1035                 {
1036                         /*
1037                          * Some supplicant implementations (e.g., Windows XP
1038                          * WZC) update SNonce for each EAPOL-Key 2/4. This
1039                          * breaks the workaround on accepting any of the
1040                          * pending requests, so allow the SNonce to be updated
1041                          * even if we have already sent out EAPOL-Key 3/4.
1042                          */
1043                         wpa_auth_vlogger(wpa_auth, sm->addr, LOGGER_DEBUG,
1044                                          "Process SNonce update from STA "
1045                                          "based on retransmitted EAPOL-Key "
1046                                          "1/4");
1047                         sm->update_snonce = 1;
1048                         os_memcpy(sm->alt_SNonce, sm->SNonce, WPA_NONCE_LEN);
1049                         sm->alt_snonce_valid = TRUE;
1050                         os_memcpy(sm->alt_replay_counter,
1051                                   sm->key_replay[0].counter,
1052                                   WPA_REPLAY_COUNTER_LEN);
1053                         goto continue_processing;
1054                 }
1055
1056                 if (msg == PAIRWISE_4 && sm->alt_snonce_valid &&
1057                     sm->wpa_ptk_state == WPA_PTK_PTKINITNEGOTIATING &&
1058                     os_memcmp(key->replay_counter, sm->alt_replay_counter,
1059                               WPA_REPLAY_COUNTER_LEN) == 0) {
1060                         /*
1061                          * Supplicant may still be using the old SNonce since
1062                          * there was two EAPOL-Key 2/4 messages and they had
1063                          * different SNonce values.
1064                          */
1065                         wpa_auth_vlogger(wpa_auth, sm->addr, LOGGER_DEBUG,
1066                                          "Try to process received EAPOL-Key 4/4 based on old Replay Counter and SNonce from an earlier EAPOL-Key 1/4");
1067                         goto continue_processing;
1068                 }
1069
1070                 if (msg == PAIRWISE_2 &&
1071                     wpa_replay_counter_valid(sm->prev_key_replay,
1072                                              key->replay_counter) &&
1073                     sm->wpa_ptk_state == WPA_PTK_PTKINITNEGOTIATING) {
1074                         wpa_auth_vlogger(wpa_auth, sm->addr, LOGGER_DEBUG,
1075                                          "ignore retransmitted EAPOL-Key %s - "
1076                                          "SNonce did not change", msgtxt);
1077                 } else {
1078                         wpa_auth_vlogger(wpa_auth, sm->addr, LOGGER_DEBUG,
1079                                          "received EAPOL-Key %s with "
1080                                          "unexpected replay counter", msgtxt);
1081                 }
1082                 for (i = 0; i < RSNA_MAX_EAPOL_RETRIES; i++) {
1083                         if (!sm->key_replay[i].valid)
1084                                 break;
1085                         wpa_hexdump(MSG_DEBUG, "pending replay counter",
1086                                     sm->key_replay[i].counter,
1087                                     WPA_REPLAY_COUNTER_LEN);
1088                 }
1089                 wpa_hexdump(MSG_DEBUG, "received replay counter",
1090                             key->replay_counter, WPA_REPLAY_COUNTER_LEN);
1091                 return;
1092         }
1093
1094 continue_processing:
1095         switch (msg) {
1096         case PAIRWISE_2:
1097                 if (sm->wpa_ptk_state != WPA_PTK_PTKSTART &&
1098                     sm->wpa_ptk_state != WPA_PTK_PTKCALCNEGOTIATING &&
1099                     (!sm->update_snonce ||
1100                      sm->wpa_ptk_state != WPA_PTK_PTKINITNEGOTIATING)) {
1101                         wpa_auth_vlogger(wpa_auth, sm->addr, LOGGER_INFO,
1102                                          "received EAPOL-Key msg 2/4 in "
1103                                          "invalid state (%d) - dropped",
1104                                          sm->wpa_ptk_state);
1105                         return;
1106                 }
1107                 random_add_randomness(key->key_nonce, WPA_NONCE_LEN);
1108                 if (sm->group->reject_4way_hs_for_entropy) {
1109                         /*
1110                          * The system did not have enough entropy to generate
1111                          * strong random numbers. Reject the first 4-way
1112                          * handshake(s) and collect some entropy based on the
1113                          * information from it. Once enough entropy is
1114                          * available, the next atempt will trigger GMK/Key
1115                          * Counter update and the station will be allowed to
1116                          * continue.
1117                          */
1118                         wpa_printf(MSG_DEBUG, "WPA: Reject 4-way handshake to "
1119                                    "collect more entropy for random number "
1120                                    "generation");
1121                         random_mark_pool_ready();
1122                         wpa_sta_disconnect(wpa_auth, sm->addr);
1123                         return;
1124                 }
1125                 if (wpa_parse_kde_ies(key_data, key_data_length, &kde) < 0) {
1126                         wpa_auth_vlogger(wpa_auth, sm->addr, LOGGER_INFO,
1127                                          "received EAPOL-Key msg 2/4 with "
1128                                          "invalid Key Data contents");
1129                         return;
1130                 }
1131                 if (kde.rsn_ie) {
1132                         eapol_key_ie = kde.rsn_ie;
1133                         eapol_key_ie_len = kde.rsn_ie_len;
1134                 } else if (kde.osen) {
1135                         eapol_key_ie = kde.osen;
1136                         eapol_key_ie_len = kde.osen_len;
1137                 } else {
1138                         eapol_key_ie = kde.wpa_ie;
1139                         eapol_key_ie_len = kde.wpa_ie_len;
1140                 }
1141                 ft = sm->wpa == WPA_VERSION_WPA2 &&
1142                         wpa_key_mgmt_ft(sm->wpa_key_mgmt);
1143                 if (sm->wpa_ie == NULL ||
1144                     wpa_compare_rsn_ie(ft,
1145                                        sm->wpa_ie, sm->wpa_ie_len,
1146                                        eapol_key_ie, eapol_key_ie_len)) {
1147                         wpa_auth_logger(wpa_auth, sm->addr, LOGGER_INFO,
1148                                         "WPA IE from (Re)AssocReq did not "
1149                                         "match with msg 2/4");
1150                         if (sm->wpa_ie) {
1151                                 wpa_hexdump(MSG_DEBUG, "WPA IE in AssocReq",
1152                                             sm->wpa_ie, sm->wpa_ie_len);
1153                         }
1154                         wpa_hexdump(MSG_DEBUG, "WPA IE in msg 2/4",
1155                                     eapol_key_ie, eapol_key_ie_len);
1156                         /* MLME-DEAUTHENTICATE.request */
1157                         wpa_sta_disconnect(wpa_auth, sm->addr);
1158                         return;
1159                 }
1160 #ifdef CONFIG_IEEE80211R
1161                 if (ft && ft_check_msg_2_of_4(wpa_auth, sm, &kde) < 0) {
1162                         wpa_sta_disconnect(wpa_auth, sm->addr);
1163                         return;
1164                 }
1165 #endif /* CONFIG_IEEE80211R */
1166 #ifdef CONFIG_P2P
1167                 if (kde.ip_addr_req && kde.ip_addr_req[0] &&
1168                     wpa_auth->ip_pool && WPA_GET_BE32(sm->ip_addr) == 0) {
1169                         int idx;
1170                         wpa_printf(MSG_DEBUG, "P2P: IP address requested in "
1171                                    "EAPOL-Key exchange");
1172                         idx = bitfield_get_first_zero(wpa_auth->ip_pool);
1173                         if (idx >= 0) {
1174                                 u32 start = WPA_GET_BE32(wpa_auth->conf.
1175                                                          ip_addr_start);
1176                                 bitfield_set(wpa_auth->ip_pool, idx);
1177                                 WPA_PUT_BE32(sm->ip_addr, start + idx);
1178                                 wpa_printf(MSG_DEBUG, "P2P: Assigned IP "
1179                                            "address %u.%u.%u.%u to " MACSTR,
1180                                            sm->ip_addr[0], sm->ip_addr[1],
1181                                            sm->ip_addr[2], sm->ip_addr[3],
1182                                            MAC2STR(sm->addr));
1183                         }
1184                 }
1185 #endif /* CONFIG_P2P */
1186                 break;
1187         case PAIRWISE_4:
1188                 if (sm->wpa_ptk_state != WPA_PTK_PTKINITNEGOTIATING ||
1189                     !sm->PTK_valid) {
1190                         wpa_auth_vlogger(wpa_auth, sm->addr, LOGGER_INFO,
1191                                          "received EAPOL-Key msg 4/4 in "
1192                                          "invalid state (%d) - dropped",
1193                                          sm->wpa_ptk_state);
1194                         return;
1195                 }
1196                 break;
1197         case GROUP_2:
1198                 if (sm->wpa_ptk_group_state != WPA_PTK_GROUP_REKEYNEGOTIATING
1199                     || !sm->PTK_valid) {
1200                         wpa_auth_vlogger(wpa_auth, sm->addr, LOGGER_INFO,
1201                                          "received EAPOL-Key msg 2/2 in "
1202                                          "invalid state (%d) - dropped",
1203                                          sm->wpa_ptk_group_state);
1204                         return;
1205                 }
1206                 break;
1207 #ifdef CONFIG_PEERKEY
1208         case SMK_M1:
1209         case SMK_M3:
1210         case SMK_ERROR:
1211                 if (!wpa_auth->conf.peerkey) {
1212                         wpa_printf(MSG_DEBUG, "RSN: SMK M1/M3/Error, but "
1213                                    "PeerKey use disabled - ignoring message");
1214                         return;
1215                 }
1216                 if (!sm->PTK_valid) {
1217                         wpa_auth_logger(wpa_auth, sm->addr, LOGGER_INFO,
1218                                         "received EAPOL-Key msg SMK in "
1219                                         "invalid state - dropped");
1220                         return;
1221                 }
1222                 break;
1223 #else /* CONFIG_PEERKEY */
1224         case SMK_M1:
1225         case SMK_M3:
1226         case SMK_ERROR:
1227                 return; /* STSL disabled - ignore SMK messages */
1228 #endif /* CONFIG_PEERKEY */
1229         case REQUEST:
1230                 break;
1231         }
1232
1233         wpa_auth_vlogger(wpa_auth, sm->addr, LOGGER_DEBUG,
1234                          "received EAPOL-Key frame (%s)", msgtxt);
1235
1236         if (key_info & WPA_KEY_INFO_ACK) {
1237                 wpa_auth_logger(wpa_auth, sm->addr, LOGGER_INFO,
1238                                 "received invalid EAPOL-Key: Key Ack set");
1239                 return;
1240         }
1241
1242         if (!(key_info & WPA_KEY_INFO_MIC)) {
1243                 wpa_auth_logger(wpa_auth, sm->addr, LOGGER_INFO,
1244                                 "received invalid EAPOL-Key: Key MIC not set");
1245                 return;
1246         }
1247
1248         sm->MICVerified = FALSE;
1249         if (sm->PTK_valid && !sm->update_snonce) {
1250                 if (wpa_verify_key_mic(sm->wpa_key_mgmt, &sm->PTK, data,
1251                                        data_len) &&
1252                     (msg != PAIRWISE_4 || !sm->alt_snonce_valid ||
1253                      wpa_try_alt_snonce(sm, data, data_len))) {
1254                         wpa_auth_logger(wpa_auth, sm->addr, LOGGER_INFO,
1255                                         "received EAPOL-Key with invalid MIC");
1256                         return;
1257                 }
1258                 sm->MICVerified = TRUE;
1259                 eloop_cancel_timeout(wpa_send_eapol_timeout, wpa_auth, sm);
1260                 sm->pending_1_of_4_timeout = 0;
1261         }
1262
1263         if (key_info & WPA_KEY_INFO_REQUEST) {
1264                 if (sm->MICVerified) {
1265                         sm->req_replay_counter_used = 1;
1266                         os_memcpy(sm->req_replay_counter, key->replay_counter,
1267                                   WPA_REPLAY_COUNTER_LEN);
1268                 } else {
1269                         wpa_auth_logger(wpa_auth, sm->addr, LOGGER_INFO,
1270                                         "received EAPOL-Key request with "
1271                                         "invalid MIC");
1272                         return;
1273                 }
1274
1275                 /*
1276                  * TODO: should decrypt key data field if encryption was used;
1277                  * even though MAC address KDE is not normally encrypted,
1278                  * supplicant is allowed to encrypt it.
1279                  */
1280                 if (msg == SMK_ERROR) {
1281 #ifdef CONFIG_PEERKEY
1282                         wpa_smk_error(wpa_auth, sm, key_data, key_data_length);
1283 #endif /* CONFIG_PEERKEY */
1284                         return;
1285                 } else if (key_info & WPA_KEY_INFO_ERROR) {
1286                         if (wpa_receive_error_report(
1287                                     wpa_auth, sm,
1288                                     !(key_info & WPA_KEY_INFO_KEY_TYPE)) > 0)
1289                                 return; /* STA entry was removed */
1290                 } else if (key_info & WPA_KEY_INFO_KEY_TYPE) {
1291                         wpa_auth_logger(wpa_auth, sm->addr, LOGGER_INFO,
1292                                         "received EAPOL-Key Request for new "
1293                                         "4-Way Handshake");
1294                         wpa_request_new_ptk(sm);
1295 #ifdef CONFIG_PEERKEY
1296                 } else if (msg == SMK_M1) {
1297                         wpa_smk_m1(wpa_auth, sm, key, key_data,
1298                                    key_data_length);
1299 #endif /* CONFIG_PEERKEY */
1300                 } else if (key_data_length > 0 &&
1301                            wpa_parse_kde_ies(key_data, key_data_length,
1302                                              &kde) == 0 &&
1303                            kde.mac_addr) {
1304                 } else {
1305                         wpa_auth_logger(wpa_auth, sm->addr, LOGGER_INFO,
1306                                         "received EAPOL-Key Request for GTK "
1307                                         "rekeying");
1308                         eloop_cancel_timeout(wpa_rekey_gtk, wpa_auth, NULL);
1309                         wpa_rekey_gtk(wpa_auth, NULL);
1310                 }
1311         } else {
1312                 /* Do not allow the same key replay counter to be reused. */
1313                 wpa_replay_counter_mark_invalid(sm->key_replay,
1314                                                 key->replay_counter);
1315
1316                 if (msg == PAIRWISE_2) {
1317                         /*
1318                          * Maintain a copy of the pending EAPOL-Key frames in
1319                          * case the EAPOL-Key frame was retransmitted. This is
1320                          * needed to allow EAPOL-Key msg 2/4 reply to another
1321                          * pending msg 1/4 to update the SNonce to work around
1322                          * unexpected supplicant behavior.
1323                          */
1324                         os_memcpy(sm->prev_key_replay, sm->key_replay,
1325                                   sizeof(sm->key_replay));
1326                 } else {
1327                         os_memset(sm->prev_key_replay, 0,
1328                                   sizeof(sm->prev_key_replay));
1329                 }
1330
1331                 /*
1332                  * Make sure old valid counters are not accepted anymore and
1333                  * do not get copied again.
1334                  */
1335                 wpa_replay_counter_mark_invalid(sm->key_replay, NULL);
1336         }
1337
1338 #ifdef CONFIG_PEERKEY
1339         if (msg == SMK_M3) {
1340                 wpa_smk_m3(wpa_auth, sm, key, key_data, key_data_length);
1341                 return;
1342         }
1343 #endif /* CONFIG_PEERKEY */
1344
1345         os_free(sm->last_rx_eapol_key);
1346         sm->last_rx_eapol_key = os_malloc(data_len);
1347         if (sm->last_rx_eapol_key == NULL)
1348                 return;
1349         os_memcpy(sm->last_rx_eapol_key, data, data_len);
1350         sm->last_rx_eapol_key_len = data_len;
1351
1352         sm->rx_eapol_key_secure = !!(key_info & WPA_KEY_INFO_SECURE);
1353         sm->EAPOLKeyReceived = TRUE;
1354         sm->EAPOLKeyPairwise = !!(key_info & WPA_KEY_INFO_KEY_TYPE);
1355         sm->EAPOLKeyRequest = !!(key_info & WPA_KEY_INFO_REQUEST);
1356         os_memcpy(sm->SNonce, key->key_nonce, WPA_NONCE_LEN);
1357         wpa_sm_step(sm);
1358 }
1359
1360
1361 static int wpa_gmk_to_gtk(const u8 *gmk, const char *label, const u8 *addr,
1362                           const u8 *gnonce, u8 *gtk, size_t gtk_len)
1363 {
1364         u8 data[ETH_ALEN + WPA_NONCE_LEN + 8 + 16];
1365         u8 *pos;
1366         int ret = 0;
1367
1368         /* GTK = PRF-X(GMK, "Group key expansion",
1369          *      AA || GNonce || Time || random data)
1370          * The example described in the IEEE 802.11 standard uses only AA and
1371          * GNonce as inputs here. Add some more entropy since this derivation
1372          * is done only at the Authenticator and as such, does not need to be
1373          * exactly same.
1374          */
1375         os_memcpy(data, addr, ETH_ALEN);
1376         os_memcpy(data + ETH_ALEN, gnonce, WPA_NONCE_LEN);
1377         pos = data + ETH_ALEN + WPA_NONCE_LEN;
1378         wpa_get_ntp_timestamp(pos);
1379         pos += 8;
1380         if (random_get_bytes(pos, 16) < 0)
1381                 ret = -1;
1382
1383 #ifdef CONFIG_IEEE80211W
1384         sha256_prf(gmk, WPA_GMK_LEN, label, data, sizeof(data), gtk, gtk_len);
1385 #else /* CONFIG_IEEE80211W */
1386         if (sha1_prf(gmk, WPA_GMK_LEN, label, data, sizeof(data), gtk, gtk_len)
1387             < 0)
1388                 ret = -1;
1389 #endif /* CONFIG_IEEE80211W */
1390
1391         return ret;
1392 }
1393
1394
1395 static void wpa_send_eapol_timeout(void *eloop_ctx, void *timeout_ctx)
1396 {
1397         struct wpa_authenticator *wpa_auth = eloop_ctx;
1398         struct wpa_state_machine *sm = timeout_ctx;
1399
1400         sm->pending_1_of_4_timeout = 0;
1401         wpa_auth_logger(wpa_auth, sm->addr, LOGGER_DEBUG, "EAPOL-Key timeout");
1402         sm->TimeoutEvt = TRUE;
1403         wpa_sm_step(sm);
1404 }
1405
1406
1407 void __wpa_send_eapol(struct wpa_authenticator *wpa_auth,
1408                       struct wpa_state_machine *sm, int key_info,
1409                       const u8 *key_rsc, const u8 *nonce,
1410                       const u8 *kde, size_t kde_len,
1411                       int keyidx, int encr, int force_version)
1412 {
1413         struct ieee802_1x_hdr *hdr;
1414         struct wpa_eapol_key *key;
1415         struct wpa_eapol_key_192 *key192;
1416         size_t len, mic_len, keyhdrlen;
1417         int alg;
1418         int key_data_len, pad_len = 0;
1419         u8 *buf, *pos;
1420         int version, pairwise;
1421         int i;
1422         u8 *key_data;
1423
1424         mic_len = wpa_mic_len(sm->wpa_key_mgmt);
1425         keyhdrlen = mic_len == 24 ? sizeof(*key192) : sizeof(*key);
1426
1427         len = sizeof(struct ieee802_1x_hdr) + keyhdrlen;
1428
1429         if (force_version)
1430                 version = force_version;
1431         else if (sm->wpa_key_mgmt == WPA_KEY_MGMT_OSEN ||
1432                  wpa_key_mgmt_suite_b(sm->wpa_key_mgmt))
1433                 version = WPA_KEY_INFO_TYPE_AKM_DEFINED;
1434         else if (wpa_use_aes_cmac(sm))
1435                 version = WPA_KEY_INFO_TYPE_AES_128_CMAC;
1436         else if (sm->pairwise != WPA_CIPHER_TKIP)
1437                 version = WPA_KEY_INFO_TYPE_HMAC_SHA1_AES;
1438         else
1439                 version = WPA_KEY_INFO_TYPE_HMAC_MD5_RC4;
1440
1441         pairwise = !!(key_info & WPA_KEY_INFO_KEY_TYPE);
1442
1443         wpa_printf(MSG_DEBUG, "WPA: Send EAPOL(version=%d secure=%d mic=%d "
1444                    "ack=%d install=%d pairwise=%d kde_len=%lu keyidx=%d "
1445                    "encr=%d)",
1446                    version,
1447                    (key_info & WPA_KEY_INFO_SECURE) ? 1 : 0,
1448                    (key_info & WPA_KEY_INFO_MIC) ? 1 : 0,
1449                    (key_info & WPA_KEY_INFO_ACK) ? 1 : 0,
1450                    (key_info & WPA_KEY_INFO_INSTALL) ? 1 : 0,
1451                    pairwise, (unsigned long) kde_len, keyidx, encr);
1452
1453         key_data_len = kde_len;
1454
1455         if ((version == WPA_KEY_INFO_TYPE_HMAC_SHA1_AES ||
1456              sm->wpa_key_mgmt == WPA_KEY_MGMT_OSEN ||
1457              wpa_key_mgmt_suite_b(sm->wpa_key_mgmt) ||
1458              version == WPA_KEY_INFO_TYPE_AES_128_CMAC) && encr) {
1459                 pad_len = key_data_len % 8;
1460                 if (pad_len)
1461                         pad_len = 8 - pad_len;
1462                 key_data_len += pad_len + 8;
1463         }
1464
1465         len += key_data_len;
1466
1467         hdr = os_zalloc(len);
1468         if (hdr == NULL)
1469                 return;
1470         hdr->version = wpa_auth->conf.eapol_version;
1471         hdr->type = IEEE802_1X_TYPE_EAPOL_KEY;
1472         hdr->length = host_to_be16(len  - sizeof(*hdr));
1473         key = (struct wpa_eapol_key *) (hdr + 1);
1474         key192 = (struct wpa_eapol_key_192 *) (hdr + 1);
1475         key_data = ((u8 *) (hdr + 1)) + keyhdrlen;
1476
1477         key->type = sm->wpa == WPA_VERSION_WPA2 ?
1478                 EAPOL_KEY_TYPE_RSN : EAPOL_KEY_TYPE_WPA;
1479         key_info |= version;
1480         if (encr && sm->wpa == WPA_VERSION_WPA2)
1481                 key_info |= WPA_KEY_INFO_ENCR_KEY_DATA;
1482         if (sm->wpa != WPA_VERSION_WPA2)
1483                 key_info |= keyidx << WPA_KEY_INFO_KEY_INDEX_SHIFT;
1484         WPA_PUT_BE16(key->key_info, key_info);
1485
1486         alg = pairwise ? sm->pairwise : wpa_auth->conf.wpa_group;
1487         WPA_PUT_BE16(key->key_length, wpa_cipher_key_len(alg));
1488         if (key_info & WPA_KEY_INFO_SMK_MESSAGE)
1489                 WPA_PUT_BE16(key->key_length, 0);
1490
1491         /* FIX: STSL: what to use as key_replay_counter? */
1492         for (i = RSNA_MAX_EAPOL_RETRIES - 1; i > 0; i--) {
1493                 sm->key_replay[i].valid = sm->key_replay[i - 1].valid;
1494                 os_memcpy(sm->key_replay[i].counter,
1495                           sm->key_replay[i - 1].counter,
1496                           WPA_REPLAY_COUNTER_LEN);
1497         }
1498         inc_byte_array(sm->key_replay[0].counter, WPA_REPLAY_COUNTER_LEN);
1499         os_memcpy(key->replay_counter, sm->key_replay[0].counter,
1500                   WPA_REPLAY_COUNTER_LEN);
1501         wpa_hexdump(MSG_DEBUG, "WPA: Replay Counter",
1502                     key->replay_counter, WPA_REPLAY_COUNTER_LEN);
1503         sm->key_replay[0].valid = TRUE;
1504
1505         if (nonce)
1506                 os_memcpy(key->key_nonce, nonce, WPA_NONCE_LEN);
1507
1508         if (key_rsc)
1509                 os_memcpy(key->key_rsc, key_rsc, WPA_KEY_RSC_LEN);
1510
1511         if (kde && !encr) {
1512                 os_memcpy(key_data, kde, kde_len);
1513                 if (mic_len == 24)
1514                         WPA_PUT_BE16(key192->key_data_length, kde_len);
1515                 else
1516                         WPA_PUT_BE16(key->key_data_length, kde_len);
1517         } else if (encr && kde) {
1518                 buf = os_zalloc(key_data_len);
1519                 if (buf == NULL) {
1520                         os_free(hdr);
1521                         return;
1522                 }
1523                 pos = buf;
1524                 os_memcpy(pos, kde, kde_len);
1525                 pos += kde_len;
1526
1527                 if (pad_len)
1528                         *pos++ = 0xdd;
1529
1530                 wpa_hexdump_key(MSG_DEBUG, "Plaintext EAPOL-Key Key Data",
1531                                 buf, key_data_len);
1532                 if (version == WPA_KEY_INFO_TYPE_HMAC_SHA1_AES ||
1533                     sm->wpa_key_mgmt == WPA_KEY_MGMT_OSEN ||
1534                     wpa_key_mgmt_suite_b(sm->wpa_key_mgmt) ||
1535                     version == WPA_KEY_INFO_TYPE_AES_128_CMAC) {
1536                         if (aes_wrap(sm->PTK.kek, sm->PTK.kek_len,
1537                                      (key_data_len - 8) / 8, buf, key_data)) {
1538                                 os_free(hdr);
1539                                 os_free(buf);
1540                                 return;
1541                         }
1542                         if (mic_len == 24)
1543                                 WPA_PUT_BE16(key192->key_data_length,
1544                                              key_data_len);
1545                         else
1546                                 WPA_PUT_BE16(key->key_data_length,
1547                                              key_data_len);
1548 #ifndef CONFIG_NO_RC4
1549                 } else if (sm->PTK.kek_len == 16) {
1550                         u8 ek[32];
1551                         os_memcpy(key->key_iv,
1552                                   sm->group->Counter + WPA_NONCE_LEN - 16, 16);
1553                         inc_byte_array(sm->group->Counter, WPA_NONCE_LEN);
1554                         os_memcpy(ek, key->key_iv, 16);
1555                         os_memcpy(ek + 16, sm->PTK.kek, sm->PTK.kek_len);
1556                         os_memcpy(key_data, buf, key_data_len);
1557                         rc4_skip(ek, 32, 256, key_data, key_data_len);
1558                         if (mic_len == 24)
1559                                 WPA_PUT_BE16(key192->key_data_length,
1560                                              key_data_len);
1561                         else
1562                                 WPA_PUT_BE16(key->key_data_length,
1563                                              key_data_len);
1564 #endif /* CONFIG_NO_RC4 */
1565                 } else {
1566                         os_free(hdr);
1567                         os_free(buf);
1568                         return;
1569                 }
1570                 os_free(buf);
1571         }
1572
1573         if (key_info & WPA_KEY_INFO_MIC) {
1574                 u8 *key_mic;
1575
1576                 if (!sm->PTK_valid) {
1577                         wpa_auth_logger(wpa_auth, sm->addr, LOGGER_DEBUG,
1578                                         "PTK not valid when sending EAPOL-Key "
1579                                         "frame");
1580                         os_free(hdr);
1581                         return;
1582                 }
1583
1584                 key_mic = key192->key_mic; /* same offset for key and key192 */
1585                 wpa_eapol_key_mic(sm->PTK.kck, sm->PTK.kck_len,
1586                                   sm->wpa_key_mgmt, version,
1587                                   (u8 *) hdr, len, key_mic);
1588 #ifdef CONFIG_TESTING_OPTIONS
1589                 if (!pairwise &&
1590                     wpa_auth->conf.corrupt_gtk_rekey_mic_probability > 0.0 &&
1591                     drand48() <
1592                     wpa_auth->conf.corrupt_gtk_rekey_mic_probability) {
1593                         wpa_auth_logger(wpa_auth, sm->addr, LOGGER_INFO,
1594                                         "Corrupting group EAPOL-Key Key MIC");
1595                         key_mic[0]++;
1596                 }
1597 #endif /* CONFIG_TESTING_OPTIONS */
1598         }
1599
1600         wpa_auth_set_eapol(sm->wpa_auth, sm->addr, WPA_EAPOL_inc_EapolFramesTx,
1601                            1);
1602         wpa_auth_send_eapol(wpa_auth, sm->addr, (u8 *) hdr, len,
1603                             sm->pairwise_set);
1604         os_free(hdr);
1605 }
1606
1607
1608 static void wpa_send_eapol(struct wpa_authenticator *wpa_auth,
1609                            struct wpa_state_machine *sm, int key_info,
1610                            const u8 *key_rsc, const u8 *nonce,
1611                            const u8 *kde, size_t kde_len,
1612                            int keyidx, int encr)
1613 {
1614         int timeout_ms;
1615         int pairwise = key_info & WPA_KEY_INFO_KEY_TYPE;
1616         int ctr;
1617
1618         if (sm == NULL)
1619                 return;
1620
1621         __wpa_send_eapol(wpa_auth, sm, key_info, key_rsc, nonce, kde, kde_len,
1622                          keyidx, encr, 0);
1623
1624         ctr = pairwise ? sm->TimeoutCtr : sm->GTimeoutCtr;
1625         if (ctr == 1 && wpa_auth->conf.tx_status)
1626                 timeout_ms = pairwise ? eapol_key_timeout_first :
1627                         eapol_key_timeout_first_group;
1628         else
1629                 timeout_ms = eapol_key_timeout_subseq;
1630         if (pairwise && ctr == 1 && !(key_info & WPA_KEY_INFO_MIC))
1631                 sm->pending_1_of_4_timeout = 1;
1632         wpa_printf(MSG_DEBUG, "WPA: Use EAPOL-Key timeout of %u ms (retry "
1633                    "counter %d)", timeout_ms, ctr);
1634         eloop_register_timeout(timeout_ms / 1000, (timeout_ms % 1000) * 1000,
1635                                wpa_send_eapol_timeout, wpa_auth, sm);
1636 }
1637
1638
1639 static int wpa_verify_key_mic(int akmp, struct wpa_ptk *PTK, u8 *data,
1640                               size_t data_len)
1641 {
1642         struct ieee802_1x_hdr *hdr;
1643         struct wpa_eapol_key *key;
1644         struct wpa_eapol_key_192 *key192;
1645         u16 key_info;
1646         int ret = 0;
1647         u8 mic[WPA_EAPOL_KEY_MIC_MAX_LEN];
1648         size_t mic_len = wpa_mic_len(akmp);
1649
1650         if (data_len < sizeof(*hdr) + sizeof(*key))
1651                 return -1;
1652
1653         hdr = (struct ieee802_1x_hdr *) data;
1654         key = (struct wpa_eapol_key *) (hdr + 1);
1655         key192 = (struct wpa_eapol_key_192 *) (hdr + 1);
1656         key_info = WPA_GET_BE16(key->key_info);
1657         os_memcpy(mic, key192->key_mic, mic_len);
1658         os_memset(key192->key_mic, 0, mic_len);
1659         if (wpa_eapol_key_mic(PTK->kck, PTK->kck_len, akmp,
1660                               key_info & WPA_KEY_INFO_TYPE_MASK,
1661                               data, data_len, key192->key_mic) ||
1662             os_memcmp_const(mic, key192->key_mic, mic_len) != 0)
1663                 ret = -1;
1664         os_memcpy(key192->key_mic, mic, mic_len);
1665         return ret;
1666 }
1667
1668
1669 void wpa_remove_ptk(struct wpa_state_machine *sm)
1670 {
1671         sm->PTK_valid = FALSE;
1672         os_memset(&sm->PTK, 0, sizeof(sm->PTK));
1673         wpa_auth_set_key(sm->wpa_auth, 0, WPA_ALG_NONE, sm->addr, 0, NULL, 0);
1674         sm->pairwise_set = FALSE;
1675         eloop_cancel_timeout(wpa_rekey_ptk, sm->wpa_auth, sm);
1676 }
1677
1678
1679 int wpa_auth_sm_event(struct wpa_state_machine *sm, enum wpa_event event)
1680 {
1681         int remove_ptk = 1;
1682
1683         if (sm == NULL)
1684                 return -1;
1685
1686         wpa_auth_vlogger(sm->wpa_auth, sm->addr, LOGGER_DEBUG,
1687                          "event %d notification", event);
1688
1689         switch (event) {
1690         case WPA_AUTH:
1691 #ifdef CONFIG_MESH
1692                 /* PTKs are derived through AMPE */
1693                 if (wpa_auth_start_ampe(sm->wpa_auth, sm->addr)) {
1694                         /* not mesh */
1695                         break;
1696                 }
1697                 return 0;
1698 #endif /* CONFIG_MESH */
1699         case WPA_ASSOC:
1700                 break;
1701         case WPA_DEAUTH:
1702         case WPA_DISASSOC:
1703                 sm->DeauthenticationRequest = TRUE;
1704                 break;
1705         case WPA_REAUTH:
1706         case WPA_REAUTH_EAPOL:
1707                 if (!sm->started) {
1708                         /*
1709                          * When using WPS, we may end up here if the STA
1710                          * manages to re-associate without the previous STA
1711                          * entry getting removed. Consequently, we need to make
1712                          * sure that the WPA state machines gets initialized
1713                          * properly at this point.
1714                          */
1715                         wpa_printf(MSG_DEBUG, "WPA state machine had not been "
1716                                    "started - initialize now");
1717                         sm->started = 1;
1718                         sm->Init = TRUE;
1719                         if (wpa_sm_step(sm) == 1)
1720                                 return 1; /* should not really happen */
1721                         sm->Init = FALSE;
1722                         sm->AuthenticationRequest = TRUE;
1723                         break;
1724                 }
1725                 if (sm->GUpdateStationKeys) {
1726                         /*
1727                          * Reauthentication cancels the pending group key
1728                          * update for this STA.
1729                          */
1730                         sm->group->GKeyDoneStations--;
1731                         sm->GUpdateStationKeys = FALSE;
1732                         sm->PtkGroupInit = TRUE;
1733                 }
1734                 sm->ReAuthenticationRequest = TRUE;
1735                 break;
1736         case WPA_ASSOC_FT:
1737 #ifdef CONFIG_IEEE80211R
1738                 wpa_printf(MSG_DEBUG, "FT: Retry PTK configuration "
1739                            "after association");
1740                 wpa_ft_install_ptk(sm);
1741
1742                 /* Using FT protocol, not WPA auth state machine */
1743                 sm->ft_completed = 1;
1744                 return 0;
1745 #else /* CONFIG_IEEE80211R */
1746                 break;
1747 #endif /* CONFIG_IEEE80211R */
1748         }
1749
1750 #ifdef CONFIG_IEEE80211R
1751         sm->ft_completed = 0;
1752 #endif /* CONFIG_IEEE80211R */
1753
1754 #ifdef CONFIG_IEEE80211W
1755         if (sm->mgmt_frame_prot && event == WPA_AUTH)
1756                 remove_ptk = 0;
1757 #endif /* CONFIG_IEEE80211W */
1758
1759         if (remove_ptk) {
1760                 sm->PTK_valid = FALSE;
1761                 os_memset(&sm->PTK, 0, sizeof(sm->PTK));
1762
1763                 if (event != WPA_REAUTH_EAPOL)
1764                         wpa_remove_ptk(sm);
1765         }
1766
1767         if (sm->in_step_loop) {
1768                 /*
1769                  * wpa_sm_step() is already running - avoid recursive call to
1770                  * it by making the existing loop process the new update.
1771                  */
1772                 sm->changed = TRUE;
1773                 return 0;
1774         }
1775         return wpa_sm_step(sm);
1776 }
1777
1778
1779 SM_STATE(WPA_PTK, INITIALIZE)
1780 {
1781         SM_ENTRY_MA(WPA_PTK, INITIALIZE, wpa_ptk);
1782         if (sm->Init) {
1783                 /* Init flag is not cleared here, so avoid busy
1784                  * loop by claiming nothing changed. */
1785                 sm->changed = FALSE;
1786         }
1787
1788         sm->keycount = 0;
1789         if (sm->GUpdateStationKeys)
1790                 sm->group->GKeyDoneStations--;
1791         sm->GUpdateStationKeys = FALSE;
1792         if (sm->wpa == WPA_VERSION_WPA)
1793                 sm->PInitAKeys = FALSE;
1794         if (1 /* Unicast cipher supported AND (ESS OR ((IBSS or WDS) and
1795                * Local AA > Remote AA)) */) {
1796                 sm->Pair = TRUE;
1797         }
1798         wpa_auth_set_eapol(sm->wpa_auth, sm->addr, WPA_EAPOL_portEnabled, 0);
1799         wpa_remove_ptk(sm);
1800         wpa_auth_set_eapol(sm->wpa_auth, sm->addr, WPA_EAPOL_portValid, 0);
1801         sm->TimeoutCtr = 0;
1802         if (wpa_key_mgmt_wpa_psk(sm->wpa_key_mgmt)) {
1803                 wpa_auth_set_eapol(sm->wpa_auth, sm->addr,
1804                                    WPA_EAPOL_authorized, 0);
1805         }
1806 }
1807
1808
1809 SM_STATE(WPA_PTK, DISCONNECT)
1810 {
1811         SM_ENTRY_MA(WPA_PTK, DISCONNECT, wpa_ptk);
1812         sm->Disconnect = FALSE;
1813         wpa_sta_disconnect(sm->wpa_auth, sm->addr);
1814 }
1815
1816
1817 SM_STATE(WPA_PTK, DISCONNECTED)
1818 {
1819         SM_ENTRY_MA(WPA_PTK, DISCONNECTED, wpa_ptk);
1820         sm->DeauthenticationRequest = FALSE;
1821 }
1822
1823
1824 SM_STATE(WPA_PTK, AUTHENTICATION)
1825 {
1826         SM_ENTRY_MA(WPA_PTK, AUTHENTICATION, wpa_ptk);
1827         os_memset(&sm->PTK, 0, sizeof(sm->PTK));
1828         sm->PTK_valid = FALSE;
1829         wpa_auth_set_eapol(sm->wpa_auth, sm->addr, WPA_EAPOL_portControl_Auto,
1830                            1);
1831         wpa_auth_set_eapol(sm->wpa_auth, sm->addr, WPA_EAPOL_portEnabled, 1);
1832         sm->AuthenticationRequest = FALSE;
1833 }
1834
1835
1836 static void wpa_group_ensure_init(struct wpa_authenticator *wpa_auth,
1837                                   struct wpa_group *group)
1838 {
1839         if (group->first_sta_seen)
1840                 return;
1841         /*
1842          * System has run bit further than at the time hostapd was started
1843          * potentially very early during boot up. This provides better chances
1844          * of collecting more randomness on embedded systems. Re-initialize the
1845          * GMK and Counter here to improve their strength if there was not
1846          * enough entropy available immediately after system startup.
1847          */
1848         wpa_printf(MSG_DEBUG, "WPA: Re-initialize GMK/Counter on first "
1849                    "station");
1850         if (random_pool_ready() != 1) {
1851                 wpa_printf(MSG_INFO, "WPA: Not enough entropy in random pool "
1852                            "to proceed - reject first 4-way handshake");
1853                 group->reject_4way_hs_for_entropy = TRUE;
1854         } else {
1855                 group->first_sta_seen = TRUE;
1856                 group->reject_4way_hs_for_entropy = FALSE;
1857         }
1858
1859         if (wpa_group_init_gmk_and_counter(wpa_auth, group) < 0 ||
1860             wpa_gtk_update(wpa_auth, group) < 0 ||
1861             wpa_group_config_group_keys(wpa_auth, group) < 0) {
1862                 wpa_printf(MSG_INFO, "WPA: GMK/GTK setup failed");
1863                 group->first_sta_seen = FALSE;
1864                 group->reject_4way_hs_for_entropy = TRUE;
1865         }
1866 }
1867
1868
1869 SM_STATE(WPA_PTK, AUTHENTICATION2)
1870 {
1871         SM_ENTRY_MA(WPA_PTK, AUTHENTICATION2, wpa_ptk);
1872
1873         wpa_group_ensure_init(sm->wpa_auth, sm->group);
1874         sm->ReAuthenticationRequest = FALSE;
1875
1876         /*
1877          * Definition of ANonce selection in IEEE Std 802.11i-2004 is somewhat
1878          * ambiguous. The Authenticator state machine uses a counter that is
1879          * incremented by one for each 4-way handshake. However, the security
1880          * analysis of 4-way handshake points out that unpredictable nonces
1881          * help in preventing precomputation attacks. Instead of the state
1882          * machine definition, use an unpredictable nonce value here to provide
1883          * stronger protection against potential precomputation attacks.
1884          */
1885         if (random_get_bytes(sm->ANonce, WPA_NONCE_LEN)) {
1886                 wpa_printf(MSG_ERROR, "WPA: Failed to get random data for "
1887                            "ANonce.");
1888                 sm->Disconnect = TRUE;
1889                 return;
1890         }
1891         wpa_hexdump(MSG_DEBUG, "WPA: Assign ANonce", sm->ANonce,
1892                     WPA_NONCE_LEN);
1893         /* IEEE 802.11i does not clear TimeoutCtr here, but this is more
1894          * logical place than INITIALIZE since AUTHENTICATION2 can be
1895          * re-entered on ReAuthenticationRequest without going through
1896          * INITIALIZE. */
1897         sm->TimeoutCtr = 0;
1898 }
1899
1900
1901 SM_STATE(WPA_PTK, INITPMK)
1902 {
1903         u8 msk[2 * PMK_LEN];
1904         size_t len = 2 * PMK_LEN;
1905
1906         SM_ENTRY_MA(WPA_PTK, INITPMK, wpa_ptk);
1907 #ifdef CONFIG_IEEE80211R
1908         sm->xxkey_len = 0;
1909 #endif /* CONFIG_IEEE80211R */
1910         if (sm->pmksa) {
1911                 wpa_printf(MSG_DEBUG, "WPA: PMK from PMKSA cache");
1912                 os_memcpy(sm->PMK, sm->pmksa->pmk, sm->pmksa->pmk_len);
1913                 sm->pmk_len = sm->pmksa->pmk_len;
1914         } else if (wpa_auth_get_msk(sm->wpa_auth, sm->addr, msk, &len) == 0) {
1915                 unsigned int pmk_len;
1916
1917                 if (sm->wpa_key_mgmt & WPA_KEY_MGMT_IEEE8021X_SUITE_B_192)
1918                         pmk_len = PMK_LEN_SUITE_B_192;
1919                 else
1920                         pmk_len = PMK_LEN;
1921                 wpa_printf(MSG_DEBUG, "WPA: PMK from EAPOL state machine "
1922                            "(MSK len=%lu PMK len=%u)", (unsigned long) len,
1923                            pmk_len);
1924                 if (len < pmk_len) {
1925                         wpa_printf(MSG_DEBUG,
1926                                    "WPA: MSK not long enough (%u) to create PMK (%u)",
1927                                    (unsigned int) len, (unsigned int) pmk_len);
1928                         sm->Disconnect = TRUE;
1929                         return;
1930                 }
1931                 os_memcpy(sm->PMK, msk, pmk_len);
1932                 sm->pmk_len = pmk_len;
1933 #ifdef CONFIG_IEEE80211R
1934                 if (len >= 2 * PMK_LEN) {
1935                         os_memcpy(sm->xxkey, msk + PMK_LEN, PMK_LEN);
1936                         sm->xxkey_len = PMK_LEN;
1937                 }
1938 #endif /* CONFIG_IEEE80211R */
1939         } else {
1940                 wpa_printf(MSG_DEBUG, "WPA: Could not get PMK, get_msk: %p",
1941                            sm->wpa_auth->cb.get_msk);
1942                 sm->Disconnect = TRUE;
1943                 return;
1944         }
1945         os_memset(msk, 0, sizeof(msk));
1946
1947         sm->req_replay_counter_used = 0;
1948         /* IEEE 802.11i does not set keyRun to FALSE, but not doing this
1949          * will break reauthentication since EAPOL state machines may not be
1950          * get into AUTHENTICATING state that clears keyRun before WPA state
1951          * machine enters AUTHENTICATION2 state and goes immediately to INITPMK
1952          * state and takes PMK from the previously used AAA Key. This will
1953          * eventually fail in 4-Way Handshake because Supplicant uses PMK
1954          * derived from the new AAA Key. Setting keyRun = FALSE here seems to
1955          * be good workaround for this issue. */
1956         wpa_auth_set_eapol(sm->wpa_auth, sm->addr, WPA_EAPOL_keyRun, 0);
1957 }
1958
1959
1960 SM_STATE(WPA_PTK, INITPSK)
1961 {
1962         const u8 *psk;
1963         SM_ENTRY_MA(WPA_PTK, INITPSK, wpa_ptk);
1964         psk = wpa_auth_get_psk(sm->wpa_auth, sm->addr, sm->p2p_dev_addr, NULL);
1965         if (psk) {
1966                 os_memcpy(sm->PMK, psk, PMK_LEN);
1967                 sm->pmk_len = PMK_LEN;
1968 #ifdef CONFIG_IEEE80211R
1969                 os_memcpy(sm->xxkey, psk, PMK_LEN);
1970                 sm->xxkey_len = PMK_LEN;
1971 #endif /* CONFIG_IEEE80211R */
1972         }
1973         sm->req_replay_counter_used = 0;
1974 }
1975
1976
1977 SM_STATE(WPA_PTK, PTKSTART)
1978 {
1979         u8 buf[2 + RSN_SELECTOR_LEN + PMKID_LEN], *pmkid = NULL;
1980         size_t pmkid_len = 0;
1981
1982         SM_ENTRY_MA(WPA_PTK, PTKSTART, wpa_ptk);
1983         sm->PTKRequest = FALSE;
1984         sm->TimeoutEvt = FALSE;
1985         sm->alt_snonce_valid = FALSE;
1986
1987         sm->TimeoutCtr++;
1988         if (sm->TimeoutCtr > (int) dot11RSNAConfigPairwiseUpdateCount) {
1989                 /* No point in sending the EAPOL-Key - we will disconnect
1990                  * immediately following this. */
1991                 return;
1992         }
1993
1994         wpa_auth_logger(sm->wpa_auth, sm->addr, LOGGER_DEBUG,
1995                         "sending 1/4 msg of 4-Way Handshake");
1996         /*
1997          * TODO: Could add PMKID even with WPA2-PSK, but only if there is only
1998          * one possible PSK for this STA.
1999          */
2000         if (sm->wpa == WPA_VERSION_WPA2 &&
2001             wpa_key_mgmt_wpa_ieee8021x(sm->wpa_key_mgmt) &&
2002             sm->wpa_key_mgmt != WPA_KEY_MGMT_OSEN) {
2003                 pmkid = buf;
2004                 pmkid_len = 2 + RSN_SELECTOR_LEN + PMKID_LEN;
2005                 pmkid[0] = WLAN_EID_VENDOR_SPECIFIC;
2006                 pmkid[1] = RSN_SELECTOR_LEN + PMKID_LEN;
2007                 RSN_SELECTOR_PUT(&pmkid[2], RSN_KEY_DATA_PMKID);
2008                 if (sm->pmksa) {
2009                         os_memcpy(&pmkid[2 + RSN_SELECTOR_LEN],
2010                                   sm->pmksa->pmkid, PMKID_LEN);
2011                 } else if (wpa_key_mgmt_suite_b(sm->wpa_key_mgmt)) {
2012                         /* No KCK available to derive PMKID */
2013                         pmkid = NULL;
2014                 } else {
2015                         /*
2016                          * Calculate PMKID since no PMKSA cache entry was
2017                          * available with pre-calculated PMKID.
2018                          */
2019                         rsn_pmkid(sm->PMK, sm->pmk_len, sm->wpa_auth->addr,
2020                                   sm->addr, &pmkid[2 + RSN_SELECTOR_LEN],
2021                                   wpa_key_mgmt_sha256(sm->wpa_key_mgmt));
2022                 }
2023         }
2024         wpa_send_eapol(sm->wpa_auth, sm,
2025                        WPA_KEY_INFO_ACK | WPA_KEY_INFO_KEY_TYPE, NULL,
2026                        sm->ANonce, pmkid, pmkid_len, 0, 0);
2027 }
2028
2029
2030 static int wpa_derive_ptk(struct wpa_state_machine *sm, const u8 *snonce,
2031                           const u8 *pmk, unsigned int pmk_len,
2032                           struct wpa_ptk *ptk)
2033 {
2034 #ifdef CONFIG_IEEE80211R
2035         if (wpa_key_mgmt_ft(sm->wpa_key_mgmt))
2036                 return wpa_auth_derive_ptk_ft(sm, pmk, ptk);
2037 #endif /* CONFIG_IEEE80211R */
2038
2039         return wpa_pmk_to_ptk(pmk, pmk_len, "Pairwise key expansion",
2040                               sm->wpa_auth->addr, sm->addr, sm->ANonce, snonce,
2041                               ptk, sm->wpa_key_mgmt, sm->pairwise);
2042 }
2043
2044
2045 SM_STATE(WPA_PTK, PTKCALCNEGOTIATING)
2046 {
2047         struct wpa_ptk PTK;
2048         int ok = 0, psk_found = 0;
2049         const u8 *pmk = NULL;
2050         unsigned int pmk_len;
2051
2052         SM_ENTRY_MA(WPA_PTK, PTKCALCNEGOTIATING, wpa_ptk);
2053         sm->EAPOLKeyReceived = FALSE;
2054         sm->update_snonce = FALSE;
2055
2056         /* WPA with IEEE 802.1X: use the derived PMK from EAP
2057          * WPA-PSK: iterate through possible PSKs and select the one matching
2058          * the packet */
2059         for (;;) {
2060                 if (wpa_key_mgmt_wpa_psk(sm->wpa_key_mgmt)) {
2061                         pmk = wpa_auth_get_psk(sm->wpa_auth, sm->addr,
2062                                                sm->p2p_dev_addr, pmk);
2063                         if (pmk == NULL)
2064                                 break;
2065                         psk_found = 1;
2066                         pmk_len = PMK_LEN;
2067                 } else {
2068                         pmk = sm->PMK;
2069                         pmk_len = sm->pmk_len;
2070                 }
2071
2072                 wpa_derive_ptk(sm, sm->SNonce, pmk, pmk_len, &PTK);
2073
2074                 if (wpa_verify_key_mic(sm->wpa_key_mgmt, &PTK,
2075                                        sm->last_rx_eapol_key,
2076                                        sm->last_rx_eapol_key_len) == 0) {
2077                         ok = 1;
2078                         break;
2079                 }
2080
2081                 if (!wpa_key_mgmt_wpa_psk(sm->wpa_key_mgmt))
2082                         break;
2083         }
2084
2085         if (!ok) {
2086                 wpa_auth_logger(sm->wpa_auth, sm->addr, LOGGER_DEBUG,
2087                                 "invalid MIC in msg 2/4 of 4-Way Handshake");
2088                 if (psk_found)
2089                         wpa_auth_psk_failure_report(sm->wpa_auth, sm->addr);
2090                 return;
2091         }
2092
2093 #ifdef CONFIG_IEEE80211R
2094         if (sm->wpa == WPA_VERSION_WPA2 && wpa_key_mgmt_ft(sm->wpa_key_mgmt)) {
2095                 /*
2096                  * Verify that PMKR1Name from EAPOL-Key message 2/4 matches
2097                  * with the value we derived.
2098                  */
2099                 if (os_memcmp_const(sm->sup_pmk_r1_name, sm->pmk_r1_name,
2100                                     WPA_PMK_NAME_LEN) != 0) {
2101                         wpa_auth_logger(sm->wpa_auth, sm->addr, LOGGER_DEBUG,
2102                                         "PMKR1Name mismatch in FT 4-way "
2103                                         "handshake");
2104                         wpa_hexdump(MSG_DEBUG, "FT: PMKR1Name from "
2105                                     "Supplicant",
2106                                     sm->sup_pmk_r1_name, WPA_PMK_NAME_LEN);
2107                         wpa_hexdump(MSG_DEBUG, "FT: Derived PMKR1Name",
2108                                     sm->pmk_r1_name, WPA_PMK_NAME_LEN);
2109                         return;
2110                 }
2111         }
2112 #endif /* CONFIG_IEEE80211R */
2113
2114         sm->pending_1_of_4_timeout = 0;
2115         eloop_cancel_timeout(wpa_send_eapol_timeout, sm->wpa_auth, sm);
2116
2117         if (wpa_key_mgmt_wpa_psk(sm->wpa_key_mgmt)) {
2118                 /* PSK may have changed from the previous choice, so update
2119                  * state machine data based on whatever PSK was selected here.
2120                  */
2121                 os_memcpy(sm->PMK, pmk, PMK_LEN);
2122                 sm->pmk_len = PMK_LEN;
2123         }
2124
2125         sm->MICVerified = TRUE;
2126
2127         os_memcpy(&sm->PTK, &PTK, sizeof(PTK));
2128         sm->PTK_valid = TRUE;
2129 }
2130
2131
2132 SM_STATE(WPA_PTK, PTKCALCNEGOTIATING2)
2133 {
2134         SM_ENTRY_MA(WPA_PTK, PTKCALCNEGOTIATING2, wpa_ptk);
2135         sm->TimeoutCtr = 0;
2136 }
2137
2138
2139 #ifdef CONFIG_IEEE80211W
2140
2141 static int ieee80211w_kde_len(struct wpa_state_machine *sm)
2142 {
2143         if (sm->mgmt_frame_prot) {
2144                 size_t len;
2145                 len = wpa_cipher_key_len(sm->wpa_auth->conf.group_mgmt_cipher);
2146                 return 2 + RSN_SELECTOR_LEN + WPA_IGTK_KDE_PREFIX_LEN + len;
2147         }
2148
2149         return 0;
2150 }
2151
2152
2153 static u8 * ieee80211w_kde_add(struct wpa_state_machine *sm, u8 *pos)
2154 {
2155         struct wpa_igtk_kde igtk;
2156         struct wpa_group *gsm = sm->group;
2157         u8 rsc[WPA_KEY_RSC_LEN];
2158         size_t len = wpa_cipher_key_len(sm->wpa_auth->conf.group_mgmt_cipher);
2159
2160         if (!sm->mgmt_frame_prot)
2161                 return pos;
2162
2163         igtk.keyid[0] = gsm->GN_igtk;
2164         igtk.keyid[1] = 0;
2165         if (gsm->wpa_group_state != WPA_GROUP_SETKEYSDONE ||
2166             wpa_auth_get_seqnum(sm->wpa_auth, NULL, gsm->GN_igtk, rsc) < 0)
2167                 os_memset(igtk.pn, 0, sizeof(igtk.pn));
2168         else
2169                 os_memcpy(igtk.pn, rsc, sizeof(igtk.pn));
2170         os_memcpy(igtk.igtk, gsm->IGTK[gsm->GN_igtk - 4], len);
2171         if (sm->wpa_auth->conf.disable_gtk) {
2172                 /*
2173                  * Provide unique random IGTK to each STA to prevent use of
2174                  * IGTK in the BSS.
2175                  */
2176                 if (random_get_bytes(igtk.igtk, len) < 0)
2177                         return pos;
2178         }
2179         pos = wpa_add_kde(pos, RSN_KEY_DATA_IGTK,
2180                           (const u8 *) &igtk, WPA_IGTK_KDE_PREFIX_LEN + len,
2181                           NULL, 0);
2182
2183         return pos;
2184 }
2185
2186 #else /* CONFIG_IEEE80211W */
2187
2188 static int ieee80211w_kde_len(struct wpa_state_machine *sm)
2189 {
2190         return 0;
2191 }
2192
2193
2194 static u8 * ieee80211w_kde_add(struct wpa_state_machine *sm, u8 *pos)
2195 {
2196         return pos;
2197 }
2198
2199 #endif /* CONFIG_IEEE80211W */
2200
2201
2202 SM_STATE(WPA_PTK, PTKINITNEGOTIATING)
2203 {
2204         u8 rsc[WPA_KEY_RSC_LEN], *_rsc, *gtk, *kde, *pos, dummy_gtk[32];
2205         size_t gtk_len, kde_len;
2206         struct wpa_group *gsm = sm->group;
2207         u8 *wpa_ie;
2208         int wpa_ie_len, secure, keyidx, encr = 0;
2209
2210         SM_ENTRY_MA(WPA_PTK, PTKINITNEGOTIATING, wpa_ptk);
2211         sm->TimeoutEvt = FALSE;
2212
2213         sm->TimeoutCtr++;
2214         if (sm->TimeoutCtr > (int) dot11RSNAConfigPairwiseUpdateCount) {
2215                 /* No point in sending the EAPOL-Key - we will disconnect
2216                  * immediately following this. */
2217                 return;
2218         }
2219
2220         /* Send EAPOL(1, 1, 1, Pair, P, RSC, ANonce, MIC(PTK), RSNIE, [MDIE],
2221            GTK[GN], IGTK, [FTIE], [TIE * 2])
2222          */
2223         os_memset(rsc, 0, WPA_KEY_RSC_LEN);
2224         wpa_auth_get_seqnum(sm->wpa_auth, NULL, gsm->GN, rsc);
2225         /* If FT is used, wpa_auth->wpa_ie includes both RSNIE and MDIE */
2226         wpa_ie = sm->wpa_auth->wpa_ie;
2227         wpa_ie_len = sm->wpa_auth->wpa_ie_len;
2228         if (sm->wpa == WPA_VERSION_WPA &&
2229             (sm->wpa_auth->conf.wpa & WPA_PROTO_RSN) &&
2230             wpa_ie_len > wpa_ie[1] + 2 && wpa_ie[0] == WLAN_EID_RSN) {
2231                 /* WPA-only STA, remove RSN IE and possible MDIE */
2232                 wpa_ie = wpa_ie + wpa_ie[1] + 2;
2233                 if (wpa_ie[0] == WLAN_EID_MOBILITY_DOMAIN)
2234                         wpa_ie = wpa_ie + wpa_ie[1] + 2;
2235                 wpa_ie_len = wpa_ie[1] + 2;
2236         }
2237         wpa_auth_logger(sm->wpa_auth, sm->addr, LOGGER_DEBUG,
2238                         "sending 3/4 msg of 4-Way Handshake");
2239         if (sm->wpa == WPA_VERSION_WPA2) {
2240                 /* WPA2 send GTK in the 4-way handshake */
2241                 secure = 1;
2242                 gtk = gsm->GTK[gsm->GN - 1];
2243                 gtk_len = gsm->GTK_len;
2244                 if (sm->wpa_auth->conf.disable_gtk) {
2245                         /*
2246                          * Provide unique random GTK to each STA to prevent use
2247                          * of GTK in the BSS.
2248                          */
2249                         if (random_get_bytes(dummy_gtk, gtk_len) < 0)
2250                                 return;
2251                         gtk = dummy_gtk;
2252                 }
2253                 keyidx = gsm->GN;
2254                 _rsc = rsc;
2255                 encr = 1;
2256         } else {
2257                 /* WPA does not include GTK in msg 3/4 */
2258                 secure = 0;
2259                 gtk = NULL;
2260                 gtk_len = 0;
2261                 keyidx = 0;
2262                 _rsc = NULL;
2263                 if (sm->rx_eapol_key_secure) {
2264                         /*
2265                          * It looks like Windows 7 supplicant tries to use
2266                          * Secure bit in msg 2/4 after having reported Michael
2267                          * MIC failure and it then rejects the 4-way handshake
2268                          * if msg 3/4 does not set Secure bit. Work around this
2269                          * by setting the Secure bit here even in the case of
2270                          * WPA if the supplicant used it first.
2271                          */
2272                         wpa_auth_logger(sm->wpa_auth, sm->addr, LOGGER_DEBUG,
2273                                         "STA used Secure bit in WPA msg 2/4 - "
2274                                         "set Secure for 3/4 as workaround");
2275                         secure = 1;
2276                 }
2277         }
2278
2279         kde_len = wpa_ie_len + ieee80211w_kde_len(sm);
2280         if (gtk)
2281                 kde_len += 2 + RSN_SELECTOR_LEN + 2 + gtk_len;
2282 #ifdef CONFIG_IEEE80211R
2283         if (wpa_key_mgmt_ft(sm->wpa_key_mgmt)) {
2284                 kde_len += 2 + PMKID_LEN; /* PMKR1Name into RSN IE */
2285                 kde_len += 300; /* FTIE + 2 * TIE */
2286         }
2287 #endif /* CONFIG_IEEE80211R */
2288 #ifdef CONFIG_P2P
2289         if (WPA_GET_BE32(sm->ip_addr) > 0)
2290                 kde_len += 2 + RSN_SELECTOR_LEN + 3 * 4;
2291 #endif /* CONFIG_P2P */
2292         kde = os_malloc(kde_len);
2293         if (kde == NULL)
2294                 return;
2295
2296         pos = kde;
2297         os_memcpy(pos, wpa_ie, wpa_ie_len);
2298         pos += wpa_ie_len;
2299 #ifdef CONFIG_IEEE80211R
2300         if (wpa_key_mgmt_ft(sm->wpa_key_mgmt)) {
2301                 int res;
2302                 size_t elen;
2303
2304                 elen = pos - kde;
2305                 res = wpa_insert_pmkid(kde, &elen, sm->pmk_r1_name);
2306                 if (res < 0) {
2307                         wpa_printf(MSG_ERROR, "FT: Failed to insert "
2308                                    "PMKR1Name into RSN IE in EAPOL-Key data");
2309                         os_free(kde);
2310                         return;
2311                 }
2312                 pos -= wpa_ie_len;
2313                 pos += elen;
2314         }
2315 #endif /* CONFIG_IEEE80211R */
2316         if (gtk) {
2317                 u8 hdr[2];
2318                 hdr[0] = keyidx & 0x03;
2319                 hdr[1] = 0;
2320                 pos = wpa_add_kde(pos, RSN_KEY_DATA_GROUPKEY, hdr, 2,
2321                                   gtk, gtk_len);
2322         }
2323         pos = ieee80211w_kde_add(sm, pos);
2324
2325 #ifdef CONFIG_IEEE80211R
2326         if (wpa_key_mgmt_ft(sm->wpa_key_mgmt)) {
2327                 int res;
2328                 struct wpa_auth_config *conf;
2329
2330                 conf = &sm->wpa_auth->conf;
2331                 if (sm->assoc_resp_ftie &&
2332                     kde + kde_len - pos >= 2 + sm->assoc_resp_ftie[1]) {
2333                         os_memcpy(pos, sm->assoc_resp_ftie,
2334                                   2 + sm->assoc_resp_ftie[1]);
2335                         res = 2 + sm->assoc_resp_ftie[1];
2336                 } else {
2337                         res = wpa_write_ftie(conf, conf->r0_key_holder,
2338                                              conf->r0_key_holder_len,
2339                                              NULL, NULL, pos,
2340                                              kde + kde_len - pos,
2341                                              NULL, 0);
2342                 }
2343                 if (res < 0) {
2344                         wpa_printf(MSG_ERROR, "FT: Failed to insert FTIE "
2345                                    "into EAPOL-Key Key Data");
2346                         os_free(kde);
2347                         return;
2348                 }
2349                 pos += res;
2350
2351                 /* TIE[ReassociationDeadline] (TU) */
2352                 *pos++ = WLAN_EID_TIMEOUT_INTERVAL;
2353                 *pos++ = 5;
2354                 *pos++ = WLAN_TIMEOUT_REASSOC_DEADLINE;
2355                 WPA_PUT_LE32(pos, conf->reassociation_deadline);
2356                 pos += 4;
2357
2358                 /* TIE[KeyLifetime] (seconds) */
2359                 *pos++ = WLAN_EID_TIMEOUT_INTERVAL;
2360                 *pos++ = 5;
2361                 *pos++ = WLAN_TIMEOUT_KEY_LIFETIME;
2362                 WPA_PUT_LE32(pos, conf->r0_key_lifetime * 60);
2363                 pos += 4;
2364         }
2365 #endif /* CONFIG_IEEE80211R */
2366 #ifdef CONFIG_P2P
2367         if (WPA_GET_BE32(sm->ip_addr) > 0) {
2368                 u8 addr[3 * 4];
2369                 os_memcpy(addr, sm->ip_addr, 4);
2370                 os_memcpy(addr + 4, sm->wpa_auth->conf.ip_addr_mask, 4);
2371                 os_memcpy(addr + 8, sm->wpa_auth->conf.ip_addr_go, 4);
2372                 pos = wpa_add_kde(pos, WFA_KEY_DATA_IP_ADDR_ALLOC,
2373                                   addr, sizeof(addr), NULL, 0);
2374         }
2375 #endif /* CONFIG_P2P */
2376
2377         wpa_send_eapol(sm->wpa_auth, sm,
2378                        (secure ? WPA_KEY_INFO_SECURE : 0) | WPA_KEY_INFO_MIC |
2379                        WPA_KEY_INFO_ACK | WPA_KEY_INFO_INSTALL |
2380                        WPA_KEY_INFO_KEY_TYPE,
2381                        _rsc, sm->ANonce, kde, pos - kde, keyidx, encr);
2382         os_free(kde);
2383 }
2384
2385
2386 SM_STATE(WPA_PTK, PTKINITDONE)
2387 {
2388         SM_ENTRY_MA(WPA_PTK, PTKINITDONE, wpa_ptk);
2389         sm->EAPOLKeyReceived = FALSE;
2390         if (sm->Pair) {
2391                 enum wpa_alg alg = wpa_cipher_to_alg(sm->pairwise);
2392                 int klen = wpa_cipher_key_len(sm->pairwise);
2393                 if (wpa_auth_set_key(sm->wpa_auth, 0, alg, sm->addr, 0,
2394                                      sm->PTK.tk, klen)) {
2395                         wpa_sta_disconnect(sm->wpa_auth, sm->addr);
2396                         return;
2397                 }
2398                 /* FIX: MLME-SetProtection.Request(TA, Tx_Rx) */
2399                 sm->pairwise_set = TRUE;
2400
2401                 if (sm->wpa_auth->conf.wpa_ptk_rekey) {
2402                         eloop_cancel_timeout(wpa_rekey_ptk, sm->wpa_auth, sm);
2403                         eloop_register_timeout(sm->wpa_auth->conf.
2404                                                wpa_ptk_rekey, 0, wpa_rekey_ptk,
2405                                                sm->wpa_auth, sm);
2406                 }
2407
2408                 if (wpa_key_mgmt_wpa_psk(sm->wpa_key_mgmt)) {
2409                         wpa_auth_set_eapol(sm->wpa_auth, sm->addr,
2410                                            WPA_EAPOL_authorized, 1);
2411                 }
2412         }
2413
2414         if (0 /* IBSS == TRUE */) {
2415                 sm->keycount++;
2416                 if (sm->keycount == 2) {
2417                         wpa_auth_set_eapol(sm->wpa_auth, sm->addr,
2418                                            WPA_EAPOL_portValid, 1);
2419                 }
2420         } else {
2421                 wpa_auth_set_eapol(sm->wpa_auth, sm->addr, WPA_EAPOL_portValid,
2422                                    1);
2423         }
2424         wpa_auth_set_eapol(sm->wpa_auth, sm->addr, WPA_EAPOL_keyAvailable, 0);
2425         wpa_auth_set_eapol(sm->wpa_auth, sm->addr, WPA_EAPOL_keyDone, 1);
2426         if (sm->wpa == WPA_VERSION_WPA)
2427                 sm->PInitAKeys = TRUE;
2428         else
2429                 sm->has_GTK = TRUE;
2430         wpa_auth_vlogger(sm->wpa_auth, sm->addr, LOGGER_INFO,
2431                          "pairwise key handshake completed (%s)",
2432                          sm->wpa == WPA_VERSION_WPA ? "WPA" : "RSN");
2433
2434 #ifdef CONFIG_IEEE80211R
2435         wpa_ft_push_pmk_r1(sm->wpa_auth, sm->addr);
2436 #endif /* CONFIG_IEEE80211R */
2437 }
2438
2439
2440 SM_STEP(WPA_PTK)
2441 {
2442         struct wpa_authenticator *wpa_auth = sm->wpa_auth;
2443
2444         if (sm->Init)
2445                 SM_ENTER(WPA_PTK, INITIALIZE);
2446         else if (sm->Disconnect
2447                  /* || FIX: dot11RSNAConfigSALifetime timeout */) {
2448                 wpa_auth_logger(wpa_auth, sm->addr, LOGGER_DEBUG,
2449                                 "WPA_PTK: sm->Disconnect");
2450                 SM_ENTER(WPA_PTK, DISCONNECT);
2451         }
2452         else if (sm->DeauthenticationRequest)
2453                 SM_ENTER(WPA_PTK, DISCONNECTED);
2454         else if (sm->AuthenticationRequest)
2455                 SM_ENTER(WPA_PTK, AUTHENTICATION);
2456         else if (sm->ReAuthenticationRequest)
2457                 SM_ENTER(WPA_PTK, AUTHENTICATION2);
2458         else if (sm->PTKRequest)
2459                 SM_ENTER(WPA_PTK, PTKSTART);
2460         else switch (sm->wpa_ptk_state) {
2461         case WPA_PTK_INITIALIZE:
2462                 break;
2463         case WPA_PTK_DISCONNECT:
2464                 SM_ENTER(WPA_PTK, DISCONNECTED);
2465                 break;
2466         case WPA_PTK_DISCONNECTED:
2467                 SM_ENTER(WPA_PTK, INITIALIZE);
2468                 break;
2469         case WPA_PTK_AUTHENTICATION:
2470                 SM_ENTER(WPA_PTK, AUTHENTICATION2);
2471                 break;
2472         case WPA_PTK_AUTHENTICATION2:
2473                 if (wpa_key_mgmt_wpa_ieee8021x(sm->wpa_key_mgmt) &&
2474                     wpa_auth_get_eapol(sm->wpa_auth, sm->addr,
2475                                        WPA_EAPOL_keyRun) > 0)
2476                         SM_ENTER(WPA_PTK, INITPMK);
2477                 else if (wpa_key_mgmt_wpa_psk(sm->wpa_key_mgmt)
2478                          /* FIX: && 802.1X::keyRun */)
2479                         SM_ENTER(WPA_PTK, INITPSK);
2480                 break;
2481         case WPA_PTK_INITPMK:
2482                 if (wpa_auth_get_eapol(sm->wpa_auth, sm->addr,
2483                                        WPA_EAPOL_keyAvailable) > 0)
2484                         SM_ENTER(WPA_PTK, PTKSTART);
2485                 else {
2486                         wpa_auth->dot11RSNA4WayHandshakeFailures++;
2487                         wpa_auth_logger(sm->wpa_auth, sm->addr, LOGGER_INFO,
2488                                         "INITPMK - keyAvailable = false");
2489                         SM_ENTER(WPA_PTK, DISCONNECT);
2490                 }
2491                 break;
2492         case WPA_PTK_INITPSK:
2493                 if (wpa_auth_get_psk(sm->wpa_auth, sm->addr, sm->p2p_dev_addr,
2494                                      NULL))
2495                         SM_ENTER(WPA_PTK, PTKSTART);
2496                 else {
2497                         wpa_auth_logger(sm->wpa_auth, sm->addr, LOGGER_INFO,
2498                                         "no PSK configured for the STA");
2499                         wpa_auth->dot11RSNA4WayHandshakeFailures++;
2500                         SM_ENTER(WPA_PTK, DISCONNECT);
2501                 }
2502                 break;
2503         case WPA_PTK_PTKSTART:
2504                 if (sm->EAPOLKeyReceived && !sm->EAPOLKeyRequest &&
2505                     sm->EAPOLKeyPairwise)
2506                         SM_ENTER(WPA_PTK, PTKCALCNEGOTIATING);
2507                 else if (sm->TimeoutCtr >
2508                          (int) dot11RSNAConfigPairwiseUpdateCount) {
2509                         wpa_auth->dot11RSNA4WayHandshakeFailures++;
2510                         wpa_auth_vlogger(sm->wpa_auth, sm->addr, LOGGER_DEBUG,
2511                                          "PTKSTART: Retry limit %d reached",
2512                                          dot11RSNAConfigPairwiseUpdateCount);
2513                         SM_ENTER(WPA_PTK, DISCONNECT);
2514                 } else if (sm->TimeoutEvt)
2515                         SM_ENTER(WPA_PTK, PTKSTART);
2516                 break;
2517         case WPA_PTK_PTKCALCNEGOTIATING:
2518                 if (sm->MICVerified)
2519                         SM_ENTER(WPA_PTK, PTKCALCNEGOTIATING2);
2520                 else if (sm->EAPOLKeyReceived && !sm->EAPOLKeyRequest &&
2521                          sm->EAPOLKeyPairwise)
2522                         SM_ENTER(WPA_PTK, PTKCALCNEGOTIATING);
2523                 else if (sm->TimeoutEvt)
2524                         SM_ENTER(WPA_PTK, PTKSTART);
2525                 break;
2526         case WPA_PTK_PTKCALCNEGOTIATING2:
2527                 SM_ENTER(WPA_PTK, PTKINITNEGOTIATING);
2528                 break;
2529         case WPA_PTK_PTKINITNEGOTIATING:
2530                 if (sm->update_snonce)
2531                         SM_ENTER(WPA_PTK, PTKCALCNEGOTIATING);
2532                 else if (sm->EAPOLKeyReceived && !sm->EAPOLKeyRequest &&
2533                          sm->EAPOLKeyPairwise && sm->MICVerified)
2534                         SM_ENTER(WPA_PTK, PTKINITDONE);
2535                 else if (sm->TimeoutCtr >
2536                          (int) dot11RSNAConfigPairwiseUpdateCount) {
2537                         wpa_auth->dot11RSNA4WayHandshakeFailures++;
2538                         wpa_auth_vlogger(sm->wpa_auth, sm->addr, LOGGER_DEBUG,
2539                                          "PTKINITNEGOTIATING: Retry limit %d "
2540                                          "reached",
2541                                          dot11RSNAConfigPairwiseUpdateCount);
2542                         SM_ENTER(WPA_PTK, DISCONNECT);
2543                 } else if (sm->TimeoutEvt)
2544                         SM_ENTER(WPA_PTK, PTKINITNEGOTIATING);
2545                 break;
2546         case WPA_PTK_PTKINITDONE:
2547                 break;
2548         }
2549 }
2550
2551
2552 SM_STATE(WPA_PTK_GROUP, IDLE)
2553 {
2554         SM_ENTRY_MA(WPA_PTK_GROUP, IDLE, wpa_ptk_group);
2555         if (sm->Init) {
2556                 /* Init flag is not cleared here, so avoid busy
2557                  * loop by claiming nothing changed. */
2558                 sm->changed = FALSE;
2559         }
2560         sm->GTimeoutCtr = 0;
2561 }
2562
2563
2564 SM_STATE(WPA_PTK_GROUP, REKEYNEGOTIATING)
2565 {
2566         u8 rsc[WPA_KEY_RSC_LEN];
2567         struct wpa_group *gsm = sm->group;
2568         const u8 *kde;
2569         u8 *kde_buf = NULL, *pos, hdr[2];
2570         size_t kde_len;
2571         u8 *gtk, dummy_gtk[32];
2572
2573         SM_ENTRY_MA(WPA_PTK_GROUP, REKEYNEGOTIATING, wpa_ptk_group);
2574
2575         sm->GTimeoutCtr++;
2576         if (sm->GTimeoutCtr > (int) dot11RSNAConfigGroupUpdateCount) {
2577                 /* No point in sending the EAPOL-Key - we will disconnect
2578                  * immediately following this. */
2579                 return;
2580         }
2581
2582         if (sm->wpa == WPA_VERSION_WPA)
2583                 sm->PInitAKeys = FALSE;
2584         sm->TimeoutEvt = FALSE;
2585         /* Send EAPOL(1, 1, 1, !Pair, G, RSC, GNonce, MIC(PTK), GTK[GN]) */
2586         os_memset(rsc, 0, WPA_KEY_RSC_LEN);
2587         if (gsm->wpa_group_state == WPA_GROUP_SETKEYSDONE)
2588                 wpa_auth_get_seqnum(sm->wpa_auth, NULL, gsm->GN, rsc);
2589         wpa_auth_logger(sm->wpa_auth, sm->addr, LOGGER_DEBUG,
2590                         "sending 1/2 msg of Group Key Handshake");
2591
2592         gtk = gsm->GTK[gsm->GN - 1];
2593         if (sm->wpa_auth->conf.disable_gtk) {
2594                 /*
2595                  * Provide unique random GTK to each STA to prevent use
2596                  * of GTK in the BSS.
2597                  */
2598                 if (random_get_bytes(dummy_gtk, gsm->GTK_len) < 0)
2599                         return;
2600                 gtk = dummy_gtk;
2601         }
2602         if (sm->wpa == WPA_VERSION_WPA2) {
2603                 kde_len = 2 + RSN_SELECTOR_LEN + 2 + gsm->GTK_len +
2604                         ieee80211w_kde_len(sm);
2605                 kde_buf = os_malloc(kde_len);
2606                 if (kde_buf == NULL)
2607                         return;
2608
2609                 kde = pos = kde_buf;
2610                 hdr[0] = gsm->GN & 0x03;
2611                 hdr[1] = 0;
2612                 pos = wpa_add_kde(pos, RSN_KEY_DATA_GROUPKEY, hdr, 2,
2613                                   gtk, gsm->GTK_len);
2614                 pos = ieee80211w_kde_add(sm, pos);
2615                 kde_len = pos - kde;
2616         } else {
2617                 kde = gtk;
2618                 kde_len = gsm->GTK_len;
2619         }
2620
2621         wpa_send_eapol(sm->wpa_auth, sm,
2622                        WPA_KEY_INFO_SECURE | WPA_KEY_INFO_MIC |
2623                        WPA_KEY_INFO_ACK |
2624                        (!sm->Pair ? WPA_KEY_INFO_INSTALL : 0),
2625                        rsc, gsm->GNonce, kde, kde_len, gsm->GN, 1);
2626
2627         os_free(kde_buf);
2628 }
2629
2630
2631 SM_STATE(WPA_PTK_GROUP, REKEYESTABLISHED)
2632 {
2633         SM_ENTRY_MA(WPA_PTK_GROUP, REKEYESTABLISHED, wpa_ptk_group);
2634         sm->EAPOLKeyReceived = FALSE;
2635         if (sm->GUpdateStationKeys)
2636                 sm->group->GKeyDoneStations--;
2637         sm->GUpdateStationKeys = FALSE;
2638         sm->GTimeoutCtr = 0;
2639         /* FIX: MLME.SetProtection.Request(TA, Tx_Rx) */
2640         wpa_auth_vlogger(sm->wpa_auth, sm->addr, LOGGER_INFO,
2641                          "group key handshake completed (%s)",
2642                          sm->wpa == WPA_VERSION_WPA ? "WPA" : "RSN");
2643         sm->has_GTK = TRUE;
2644 }
2645
2646
2647 SM_STATE(WPA_PTK_GROUP, KEYERROR)
2648 {
2649         SM_ENTRY_MA(WPA_PTK_GROUP, KEYERROR, wpa_ptk_group);
2650         if (sm->GUpdateStationKeys)
2651                 sm->group->GKeyDoneStations--;
2652         sm->GUpdateStationKeys = FALSE;
2653         sm->Disconnect = TRUE;
2654 }
2655
2656
2657 SM_STEP(WPA_PTK_GROUP)
2658 {
2659         if (sm->Init || sm->PtkGroupInit) {
2660                 SM_ENTER(WPA_PTK_GROUP, IDLE);
2661                 sm->PtkGroupInit = FALSE;
2662         } else switch (sm->wpa_ptk_group_state) {
2663         case WPA_PTK_GROUP_IDLE:
2664                 if (sm->GUpdateStationKeys ||
2665                     (sm->wpa == WPA_VERSION_WPA && sm->PInitAKeys))
2666                         SM_ENTER(WPA_PTK_GROUP, REKEYNEGOTIATING);
2667                 break;
2668         case WPA_PTK_GROUP_REKEYNEGOTIATING:
2669                 if (sm->EAPOLKeyReceived && !sm->EAPOLKeyRequest &&
2670                     !sm->EAPOLKeyPairwise && sm->MICVerified)
2671                         SM_ENTER(WPA_PTK_GROUP, REKEYESTABLISHED);
2672                 else if (sm->GTimeoutCtr >
2673                          (int) dot11RSNAConfigGroupUpdateCount)
2674                         SM_ENTER(WPA_PTK_GROUP, KEYERROR);
2675                 else if (sm->TimeoutEvt)
2676                         SM_ENTER(WPA_PTK_GROUP, REKEYNEGOTIATING);
2677                 break;
2678         case WPA_PTK_GROUP_KEYERROR:
2679                 SM_ENTER(WPA_PTK_GROUP, IDLE);
2680                 break;
2681         case WPA_PTK_GROUP_REKEYESTABLISHED:
2682                 SM_ENTER(WPA_PTK_GROUP, IDLE);
2683                 break;
2684         }
2685 }
2686
2687
2688 static int wpa_gtk_update(struct wpa_authenticator *wpa_auth,
2689                           struct wpa_group *group)
2690 {
2691         int ret = 0;
2692
2693         os_memcpy(group->GNonce, group->Counter, WPA_NONCE_LEN);
2694         inc_byte_array(group->Counter, WPA_NONCE_LEN);
2695         if (wpa_gmk_to_gtk(group->GMK, "Group key expansion",
2696                            wpa_auth->addr, group->GNonce,
2697                            group->GTK[group->GN - 1], group->GTK_len) < 0)
2698                 ret = -1;
2699         wpa_hexdump_key(MSG_DEBUG, "GTK",
2700                         group->GTK[group->GN - 1], group->GTK_len);
2701
2702 #ifdef CONFIG_IEEE80211W
2703         if (wpa_auth->conf.ieee80211w != NO_MGMT_FRAME_PROTECTION) {
2704                 size_t len;
2705                 len = wpa_cipher_key_len(wpa_auth->conf.group_mgmt_cipher);
2706                 os_memcpy(group->GNonce, group->Counter, WPA_NONCE_LEN);
2707                 inc_byte_array(group->Counter, WPA_NONCE_LEN);
2708                 if (wpa_gmk_to_gtk(group->GMK, "IGTK key expansion",
2709                                    wpa_auth->addr, group->GNonce,
2710                                    group->IGTK[group->GN_igtk - 4], len) < 0)
2711                         ret = -1;
2712                 wpa_hexdump_key(MSG_DEBUG, "IGTK",
2713                                 group->IGTK[group->GN_igtk - 4], len);
2714         }
2715 #endif /* CONFIG_IEEE80211W */
2716
2717         return ret;
2718 }
2719
2720
2721 static void wpa_group_gtk_init(struct wpa_authenticator *wpa_auth,
2722                                struct wpa_group *group)
2723 {
2724         wpa_printf(MSG_DEBUG, "WPA: group state machine entering state "
2725                    "GTK_INIT (VLAN-ID %d)", group->vlan_id);
2726         group->changed = FALSE; /* GInit is not cleared here; avoid loop */
2727         group->wpa_group_state = WPA_GROUP_GTK_INIT;
2728
2729         /* GTK[0..N] = 0 */
2730         os_memset(group->GTK, 0, sizeof(group->GTK));
2731         group->GN = 1;
2732         group->GM = 2;
2733 #ifdef CONFIG_IEEE80211W
2734         group->GN_igtk = 4;
2735         group->GM_igtk = 5;
2736 #endif /* CONFIG_IEEE80211W */
2737         /* GTK[GN] = CalcGTK() */
2738         wpa_gtk_update(wpa_auth, group);
2739 }
2740
2741
2742 static int wpa_group_update_sta(struct wpa_state_machine *sm, void *ctx)
2743 {
2744         if (ctx != NULL && ctx != sm->group)
2745                 return 0;
2746
2747         if (sm->wpa_ptk_state != WPA_PTK_PTKINITDONE) {
2748                 wpa_auth_logger(sm->wpa_auth, sm->addr, LOGGER_DEBUG,
2749                                 "Not in PTKINITDONE; skip Group Key update");
2750                 sm->GUpdateStationKeys = FALSE;
2751                 return 0;
2752         }
2753         if (sm->GUpdateStationKeys) {
2754                 /*
2755                  * This should not really happen, so add a debug log entry.
2756                  * Since we clear the GKeyDoneStations before the loop, the
2757                  * station needs to be counted here anyway.
2758                  */
2759                 wpa_auth_logger(sm->wpa_auth, sm->addr, LOGGER_DEBUG,
2760                                 "GUpdateStationKeys was already set when "
2761                                 "marking station for GTK rekeying");
2762         }
2763
2764         /* Do not rekey GTK/IGTK when STA is in WNM-Sleep Mode */
2765         if (sm->is_wnmsleep)
2766                 return 0;
2767
2768         sm->group->GKeyDoneStations++;
2769         sm->GUpdateStationKeys = TRUE;
2770
2771         wpa_sm_step(sm);
2772         return 0;
2773 }
2774
2775
2776 #ifdef CONFIG_WNM
2777 /* update GTK when exiting WNM-Sleep Mode */
2778 void wpa_wnmsleep_rekey_gtk(struct wpa_state_machine *sm)
2779 {
2780         if (sm == NULL || sm->is_wnmsleep)
2781                 return;
2782
2783         wpa_group_update_sta(sm, NULL);
2784 }
2785
2786
2787 void wpa_set_wnmsleep(struct wpa_state_machine *sm, int flag)
2788 {
2789         if (sm)
2790                 sm->is_wnmsleep = !!flag;
2791 }
2792
2793
2794 int wpa_wnmsleep_gtk_subelem(struct wpa_state_machine *sm, u8 *pos)
2795 {
2796         struct wpa_group *gsm = sm->group;
2797         u8 *start = pos;
2798
2799         /*
2800          * GTK subelement:
2801          * Sub-elem ID[1] | Length[1] | Key Info[2] | Key Length[1] | RSC[8] |
2802          * Key[5..32]
2803          */
2804         *pos++ = WNM_SLEEP_SUBELEM_GTK;
2805         *pos++ = 11 + gsm->GTK_len;
2806         /* Key ID in B0-B1 of Key Info */
2807         WPA_PUT_LE16(pos, gsm->GN & 0x03);
2808         pos += 2;
2809         *pos++ = gsm->GTK_len;
2810         if (wpa_auth_get_seqnum(sm->wpa_auth, NULL, gsm->GN, pos) != 0)
2811                 return 0;
2812         pos += 8;
2813         os_memcpy(pos, gsm->GTK[gsm->GN - 1], gsm->GTK_len);
2814         pos += gsm->GTK_len;
2815
2816         wpa_printf(MSG_DEBUG, "WNM: GTK Key ID %u in WNM-Sleep Mode exit",
2817                    gsm->GN);
2818         wpa_hexdump_key(MSG_DEBUG, "WNM: GTK in WNM-Sleep Mode exit",
2819                         gsm->GTK[gsm->GN - 1], gsm->GTK_len);
2820
2821         return pos - start;
2822 }
2823
2824
2825 #ifdef CONFIG_IEEE80211W
2826 int wpa_wnmsleep_igtk_subelem(struct wpa_state_machine *sm, u8 *pos)
2827 {
2828         struct wpa_group *gsm = sm->group;
2829         u8 *start = pos;
2830         size_t len = wpa_cipher_key_len(sm->wpa_auth->conf.group_mgmt_cipher);
2831
2832         /*
2833          * IGTK subelement:
2834          * Sub-elem ID[1] | Length[1] | KeyID[2] | PN[6] | Key[16]
2835          */
2836         *pos++ = WNM_SLEEP_SUBELEM_IGTK;
2837         *pos++ = 2 + 6 + len;
2838         WPA_PUT_LE16(pos, gsm->GN_igtk);
2839         pos += 2;
2840         if (wpa_auth_get_seqnum(sm->wpa_auth, NULL, gsm->GN_igtk, pos) != 0)
2841                 return 0;
2842         pos += 6;
2843
2844         os_memcpy(pos, gsm->IGTK[gsm->GN_igtk - 4], len);
2845         pos += len;
2846
2847         wpa_printf(MSG_DEBUG, "WNM: IGTK Key ID %u in WNM-Sleep Mode exit",
2848                    gsm->GN_igtk);
2849         wpa_hexdump_key(MSG_DEBUG, "WNM: IGTK in WNM-Sleep Mode exit",
2850                         gsm->IGTK[gsm->GN_igtk - 4], len);
2851
2852         return pos - start;
2853 }
2854 #endif /* CONFIG_IEEE80211W */
2855 #endif /* CONFIG_WNM */
2856
2857
2858 static void wpa_group_setkeys(struct wpa_authenticator *wpa_auth,
2859                               struct wpa_group *group)
2860 {
2861         int tmp;
2862
2863         wpa_printf(MSG_DEBUG, "WPA: group state machine entering state "
2864                    "SETKEYS (VLAN-ID %d)", group->vlan_id);
2865         group->changed = TRUE;
2866         group->wpa_group_state = WPA_GROUP_SETKEYS;
2867         group->GTKReKey = FALSE;
2868         tmp = group->GM;
2869         group->GM = group->GN;
2870         group->GN = tmp;
2871 #ifdef CONFIG_IEEE80211W
2872         tmp = group->GM_igtk;
2873         group->GM_igtk = group->GN_igtk;
2874         group->GN_igtk = tmp;
2875 #endif /* CONFIG_IEEE80211W */
2876         /* "GKeyDoneStations = GNoStations" is done in more robust way by
2877          * counting the STAs that are marked with GUpdateStationKeys instead of
2878          * including all STAs that could be in not-yet-completed state. */
2879         wpa_gtk_update(wpa_auth, group);
2880
2881         if (group->GKeyDoneStations) {
2882                 wpa_printf(MSG_DEBUG, "wpa_group_setkeys: Unexpected "
2883                            "GKeyDoneStations=%d when starting new GTK rekey",
2884                            group->GKeyDoneStations);
2885                 group->GKeyDoneStations = 0;
2886         }
2887         wpa_auth_for_each_sta(wpa_auth, wpa_group_update_sta, group);
2888         wpa_printf(MSG_DEBUG, "wpa_group_setkeys: GKeyDoneStations=%d",
2889                    group->GKeyDoneStations);
2890 }
2891
2892
2893 static int wpa_group_config_group_keys(struct wpa_authenticator *wpa_auth,
2894                                        struct wpa_group *group)
2895 {
2896         int ret = 0;
2897
2898         if (wpa_auth_set_key(wpa_auth, group->vlan_id,
2899                              wpa_cipher_to_alg(wpa_auth->conf.wpa_group),
2900                              broadcast_ether_addr, group->GN,
2901                              group->GTK[group->GN - 1], group->GTK_len) < 0)
2902                 ret = -1;
2903
2904 #ifdef CONFIG_IEEE80211W
2905         if (wpa_auth->conf.ieee80211w != NO_MGMT_FRAME_PROTECTION) {
2906                 enum wpa_alg alg;
2907                 size_t len;
2908
2909                 alg = wpa_cipher_to_alg(wpa_auth->conf.group_mgmt_cipher);
2910                 len = wpa_cipher_key_len(wpa_auth->conf.group_mgmt_cipher);
2911
2912                 if (ret == 0 &&
2913                     wpa_auth_set_key(wpa_auth, group->vlan_id, alg,
2914                                      broadcast_ether_addr, group->GN_igtk,
2915                                      group->IGTK[group->GN_igtk - 4], len) < 0)
2916                         ret = -1;
2917         }
2918 #endif /* CONFIG_IEEE80211W */
2919
2920         return ret;
2921 }
2922
2923
2924 static int wpa_group_disconnect_cb(struct wpa_state_machine *sm, void *ctx)
2925 {
2926         if (sm->group == ctx) {
2927                 wpa_printf(MSG_DEBUG, "WPA: Mark STA " MACSTR
2928                            " for discconnection due to fatal failure",
2929                            MAC2STR(sm->addr));
2930                 sm->Disconnect = TRUE;
2931         }
2932
2933         return 0;
2934 }
2935
2936
2937 static void wpa_group_fatal_failure(struct wpa_authenticator *wpa_auth,
2938                                     struct wpa_group *group)
2939 {
2940         wpa_printf(MSG_DEBUG, "WPA: group state machine entering state FATAL_FAILURE");
2941         group->changed = TRUE;
2942         group->wpa_group_state = WPA_GROUP_FATAL_FAILURE;
2943         wpa_auth_for_each_sta(wpa_auth, wpa_group_disconnect_cb, group);
2944 }
2945
2946
2947 static int wpa_group_setkeysdone(struct wpa_authenticator *wpa_auth,
2948                                  struct wpa_group *group)
2949 {
2950         wpa_printf(MSG_DEBUG, "WPA: group state machine entering state "
2951                    "SETKEYSDONE (VLAN-ID %d)", group->vlan_id);
2952         group->changed = TRUE;
2953         group->wpa_group_state = WPA_GROUP_SETKEYSDONE;
2954
2955         if (wpa_group_config_group_keys(wpa_auth, group) < 0) {
2956                 wpa_group_fatal_failure(wpa_auth, group);
2957                 return -1;
2958         }
2959
2960         return 0;
2961 }
2962
2963
2964 static void wpa_group_sm_step(struct wpa_authenticator *wpa_auth,
2965                               struct wpa_group *group)
2966 {
2967         if (group->GInit) {
2968                 wpa_group_gtk_init(wpa_auth, group);
2969         } else if (group->wpa_group_state == WPA_GROUP_FATAL_FAILURE) {
2970                 /* Do not allow group operations */
2971         } else if (group->wpa_group_state == WPA_GROUP_GTK_INIT &&
2972                    group->GTKAuthenticator) {
2973                 wpa_group_setkeysdone(wpa_auth, group);
2974         } else if (group->wpa_group_state == WPA_GROUP_SETKEYSDONE &&
2975                    group->GTKReKey) {
2976                 wpa_group_setkeys(wpa_auth, group);
2977         } else if (group->wpa_group_state == WPA_GROUP_SETKEYS) {
2978                 if (group->GKeyDoneStations == 0)
2979                         wpa_group_setkeysdone(wpa_auth, group);
2980                 else if (group->GTKReKey)
2981                         wpa_group_setkeys(wpa_auth, group);
2982         }
2983 }
2984
2985
2986 static int wpa_sm_step(struct wpa_state_machine *sm)
2987 {
2988         if (sm == NULL)
2989                 return 0;
2990
2991         if (sm->in_step_loop) {
2992                 /* This should not happen, but if it does, make sure we do not
2993                  * end up freeing the state machine too early by exiting the
2994                  * recursive call. */
2995                 wpa_printf(MSG_ERROR, "WPA: wpa_sm_step() called recursively");
2996                 return 0;
2997         }
2998
2999         sm->in_step_loop = 1;
3000         do {
3001                 if (sm->pending_deinit)
3002                         break;
3003
3004                 sm->changed = FALSE;
3005                 sm->wpa_auth->group->changed = FALSE;
3006
3007                 SM_STEP_RUN(WPA_PTK);
3008                 if (sm->pending_deinit)
3009                         break;
3010                 SM_STEP_RUN(WPA_PTK_GROUP);
3011                 if (sm->pending_deinit)
3012                         break;
3013                 wpa_group_sm_step(sm->wpa_auth, sm->group);
3014         } while (sm->changed || sm->wpa_auth->group->changed);
3015         sm->in_step_loop = 0;
3016
3017         if (sm->pending_deinit) {
3018                 wpa_printf(MSG_DEBUG, "WPA: Completing pending STA state "
3019                            "machine deinit for " MACSTR, MAC2STR(sm->addr));
3020                 wpa_free_sta_sm(sm);
3021                 return 1;
3022         }
3023         return 0;
3024 }
3025
3026
3027 static void wpa_sm_call_step(void *eloop_ctx, void *timeout_ctx)
3028 {
3029         struct wpa_state_machine *sm = eloop_ctx;
3030         wpa_sm_step(sm);
3031 }
3032
3033
3034 void wpa_auth_sm_notify(struct wpa_state_machine *sm)
3035 {
3036         if (sm == NULL)
3037                 return;
3038         eloop_register_timeout(0, 0, wpa_sm_call_step, sm, NULL);
3039 }
3040
3041
3042 void wpa_gtk_rekey(struct wpa_authenticator *wpa_auth)
3043 {
3044         int tmp, i;
3045         struct wpa_group *group;
3046
3047         if (wpa_auth == NULL)
3048                 return;
3049
3050         group = wpa_auth->group;
3051
3052         for (i = 0; i < 2; i++) {
3053                 tmp = group->GM;
3054                 group->GM = group->GN;
3055                 group->GN = tmp;
3056 #ifdef CONFIG_IEEE80211W
3057                 tmp = group->GM_igtk;
3058                 group->GM_igtk = group->GN_igtk;
3059                 group->GN_igtk = tmp;
3060 #endif /* CONFIG_IEEE80211W */
3061                 wpa_gtk_update(wpa_auth, group);
3062                 wpa_group_config_group_keys(wpa_auth, group);
3063         }
3064 }
3065
3066
3067 static const char * wpa_bool_txt(int val)
3068 {
3069         return val ? "TRUE" : "FALSE";
3070 }
3071
3072
3073 #define RSN_SUITE "%02x-%02x-%02x-%d"
3074 #define RSN_SUITE_ARG(s) \
3075 ((s) >> 24) & 0xff, ((s) >> 16) & 0xff, ((s) >> 8) & 0xff, (s) & 0xff
3076
3077 int wpa_get_mib(struct wpa_authenticator *wpa_auth, char *buf, size_t buflen)
3078 {
3079         int len = 0, ret;
3080         char pmkid_txt[PMKID_LEN * 2 + 1];
3081 #ifdef CONFIG_RSN_PREAUTH
3082         const int preauth = 1;
3083 #else /* CONFIG_RSN_PREAUTH */
3084         const int preauth = 0;
3085 #endif /* CONFIG_RSN_PREAUTH */
3086
3087         if (wpa_auth == NULL)
3088                 return len;
3089
3090         ret = os_snprintf(buf + len, buflen - len,
3091                           "dot11RSNAOptionImplemented=TRUE\n"
3092                           "dot11RSNAPreauthenticationImplemented=%s\n"
3093                           "dot11RSNAEnabled=%s\n"
3094                           "dot11RSNAPreauthenticationEnabled=%s\n",
3095                           wpa_bool_txt(preauth),
3096                           wpa_bool_txt(wpa_auth->conf.wpa & WPA_PROTO_RSN),
3097                           wpa_bool_txt(wpa_auth->conf.rsn_preauth));
3098         if (os_snprintf_error(buflen - len, ret))
3099                 return len;
3100         len += ret;
3101
3102         wpa_snprintf_hex(pmkid_txt, sizeof(pmkid_txt),
3103                          wpa_auth->dot11RSNAPMKIDUsed, PMKID_LEN);
3104
3105         ret = os_snprintf(
3106                 buf + len, buflen - len,
3107                 "dot11RSNAConfigVersion=%u\n"
3108                 "dot11RSNAConfigPairwiseKeysSupported=9999\n"
3109                 /* FIX: dot11RSNAConfigGroupCipher */
3110                 /* FIX: dot11RSNAConfigGroupRekeyMethod */
3111                 /* FIX: dot11RSNAConfigGroupRekeyTime */
3112                 /* FIX: dot11RSNAConfigGroupRekeyPackets */
3113                 "dot11RSNAConfigGroupRekeyStrict=%u\n"
3114                 "dot11RSNAConfigGroupUpdateCount=%u\n"
3115                 "dot11RSNAConfigPairwiseUpdateCount=%u\n"
3116                 "dot11RSNAConfigGroupCipherSize=%u\n"
3117                 "dot11RSNAConfigPMKLifetime=%u\n"
3118                 "dot11RSNAConfigPMKReauthThreshold=%u\n"
3119                 "dot11RSNAConfigNumberOfPTKSAReplayCounters=0\n"
3120                 "dot11RSNAConfigSATimeout=%u\n"
3121                 "dot11RSNAAuthenticationSuiteSelected=" RSN_SUITE "\n"
3122                 "dot11RSNAPairwiseCipherSelected=" RSN_SUITE "\n"
3123                 "dot11RSNAGroupCipherSelected=" RSN_SUITE "\n"
3124                 "dot11RSNAPMKIDUsed=%s\n"
3125                 "dot11RSNAAuthenticationSuiteRequested=" RSN_SUITE "\n"
3126                 "dot11RSNAPairwiseCipherRequested=" RSN_SUITE "\n"
3127                 "dot11RSNAGroupCipherRequested=" RSN_SUITE "\n"
3128                 "dot11RSNATKIPCounterMeasuresInvoked=%u\n"
3129                 "dot11RSNA4WayHandshakeFailures=%u\n"
3130                 "dot11RSNAConfigNumberOfGTKSAReplayCounters=0\n",
3131                 RSN_VERSION,
3132                 !!wpa_auth->conf.wpa_strict_rekey,
3133                 dot11RSNAConfigGroupUpdateCount,
3134                 dot11RSNAConfigPairwiseUpdateCount,
3135                 wpa_cipher_key_len(wpa_auth->conf.wpa_group) * 8,
3136                 dot11RSNAConfigPMKLifetime,
3137                 dot11RSNAConfigPMKReauthThreshold,
3138                 dot11RSNAConfigSATimeout,
3139                 RSN_SUITE_ARG(wpa_auth->dot11RSNAAuthenticationSuiteSelected),
3140                 RSN_SUITE_ARG(wpa_auth->dot11RSNAPairwiseCipherSelected),
3141                 RSN_SUITE_ARG(wpa_auth->dot11RSNAGroupCipherSelected),
3142                 pmkid_txt,
3143                 RSN_SUITE_ARG(wpa_auth->dot11RSNAAuthenticationSuiteRequested),
3144                 RSN_SUITE_ARG(wpa_auth->dot11RSNAPairwiseCipherRequested),
3145                 RSN_SUITE_ARG(wpa_auth->dot11RSNAGroupCipherRequested),
3146                 wpa_auth->dot11RSNATKIPCounterMeasuresInvoked,
3147                 wpa_auth->dot11RSNA4WayHandshakeFailures);
3148         if (os_snprintf_error(buflen - len, ret))
3149                 return len;
3150         len += ret;
3151
3152         /* TODO: dot11RSNAConfigPairwiseCiphersTable */
3153         /* TODO: dot11RSNAConfigAuthenticationSuitesTable */
3154
3155         /* Private MIB */
3156         ret = os_snprintf(buf + len, buflen - len, "hostapdWPAGroupState=%d\n",
3157                           wpa_auth->group->wpa_group_state);
3158         if (os_snprintf_error(buflen - len, ret))
3159                 return len;
3160         len += ret;
3161
3162         return len;
3163 }
3164
3165
3166 int wpa_get_mib_sta(struct wpa_state_machine *sm, char *buf, size_t buflen)
3167 {
3168         int len = 0, ret;
3169         u32 pairwise = 0;
3170
3171         if (sm == NULL)
3172                 return 0;
3173
3174         /* TODO: FF-FF-FF-FF-FF-FF entry for broadcast/multicast stats */
3175
3176         /* dot11RSNAStatsEntry */
3177
3178         pairwise = wpa_cipher_to_suite(sm->wpa == WPA_VERSION_WPA2 ?
3179                                        WPA_PROTO_RSN : WPA_PROTO_WPA,
3180                                        sm->pairwise);
3181         if (pairwise == 0)
3182                 return 0;
3183
3184         ret = os_snprintf(
3185                 buf + len, buflen - len,
3186                 /* TODO: dot11RSNAStatsIndex */
3187                 "dot11RSNAStatsSTAAddress=" MACSTR "\n"
3188                 "dot11RSNAStatsVersion=1\n"
3189                 "dot11RSNAStatsSelectedPairwiseCipher=" RSN_SUITE "\n"
3190                 /* TODO: dot11RSNAStatsTKIPICVErrors */
3191                 "dot11RSNAStatsTKIPLocalMICFailures=%u\n"
3192                 "dot11RSNAStatsTKIPRemoteMICFailures=%u\n"
3193                 /* TODO: dot11RSNAStatsCCMPReplays */
3194                 /* TODO: dot11RSNAStatsCCMPDecryptErrors */
3195                 /* TODO: dot11RSNAStatsTKIPReplays */,
3196                 MAC2STR(sm->addr),
3197                 RSN_SUITE_ARG(pairwise),
3198                 sm->dot11RSNAStatsTKIPLocalMICFailures,
3199                 sm->dot11RSNAStatsTKIPRemoteMICFailures);
3200         if (os_snprintf_error(buflen - len, ret))
3201                 return len;
3202         len += ret;
3203
3204         /* Private MIB */
3205         ret = os_snprintf(buf + len, buflen - len,
3206                           "hostapdWPAPTKState=%d\n"
3207                           "hostapdWPAPTKGroupState=%d\n",
3208                           sm->wpa_ptk_state,
3209                           sm->wpa_ptk_group_state);
3210         if (os_snprintf_error(buflen - len, ret))
3211                 return len;
3212         len += ret;
3213
3214         return len;
3215 }
3216
3217
3218 void wpa_auth_countermeasures_start(struct wpa_authenticator *wpa_auth)
3219 {
3220         if (wpa_auth)
3221                 wpa_auth->dot11RSNATKIPCounterMeasuresInvoked++;
3222 }
3223
3224
3225 int wpa_auth_pairwise_set(struct wpa_state_machine *sm)
3226 {
3227         return sm && sm->pairwise_set;
3228 }
3229
3230
3231 int wpa_auth_get_pairwise(struct wpa_state_machine *sm)
3232 {
3233         return sm->pairwise;
3234 }
3235
3236
3237 int wpa_auth_sta_key_mgmt(struct wpa_state_machine *sm)
3238 {
3239         if (sm == NULL)
3240                 return -1;
3241         return sm->wpa_key_mgmt;
3242 }
3243
3244
3245 int wpa_auth_sta_wpa_version(struct wpa_state_machine *sm)
3246 {
3247         if (sm == NULL)
3248                 return 0;
3249         return sm->wpa;
3250 }
3251
3252
3253 int wpa_auth_sta_clear_pmksa(struct wpa_state_machine *sm,
3254                              struct rsn_pmksa_cache_entry *entry)
3255 {
3256         if (sm == NULL || sm->pmksa != entry)
3257                 return -1;
3258         sm->pmksa = NULL;
3259         return 0;
3260 }
3261
3262
3263 struct rsn_pmksa_cache_entry *
3264 wpa_auth_sta_get_pmksa(struct wpa_state_machine *sm)
3265 {
3266         return sm ? sm->pmksa : NULL;
3267 }
3268
3269
3270 void wpa_auth_sta_local_mic_failure_report(struct wpa_state_machine *sm)
3271 {
3272         if (sm)
3273                 sm->dot11RSNAStatsTKIPLocalMICFailures++;
3274 }
3275
3276
3277 const u8 * wpa_auth_get_wpa_ie(struct wpa_authenticator *wpa_auth, size_t *len)
3278 {
3279         if (wpa_auth == NULL)
3280                 return NULL;
3281         *len = wpa_auth->wpa_ie_len;
3282         return wpa_auth->wpa_ie;
3283 }
3284
3285
3286 int wpa_auth_pmksa_add(struct wpa_state_machine *sm, const u8 *pmk,
3287                        unsigned int pmk_len,
3288                        int session_timeout, struct eapol_state_machine *eapol)
3289 {
3290         if (sm == NULL || sm->wpa != WPA_VERSION_WPA2 ||
3291             sm->wpa_auth->conf.disable_pmksa_caching)
3292                 return -1;
3293
3294         if (sm->wpa_key_mgmt & WPA_KEY_MGMT_IEEE8021X_SUITE_B_192) {
3295                 if (pmk_len > PMK_LEN_SUITE_B_192)
3296                         pmk_len = PMK_LEN_SUITE_B_192;
3297         } else if (pmk_len > PMK_LEN) {
3298                 pmk_len = PMK_LEN;
3299         }
3300
3301         if (pmksa_cache_auth_add(sm->wpa_auth->pmksa, pmk, pmk_len, NULL,
3302                                  sm->PTK.kck, sm->PTK.kck_len,
3303                                  sm->wpa_auth->addr, sm->addr, session_timeout,
3304                                  eapol, sm->wpa_key_mgmt))
3305                 return 0;
3306
3307         return -1;
3308 }
3309
3310
3311 int wpa_auth_pmksa_add_preauth(struct wpa_authenticator *wpa_auth,
3312                                const u8 *pmk, size_t len, const u8 *sta_addr,
3313                                int session_timeout,
3314                                struct eapol_state_machine *eapol)
3315 {
3316         if (wpa_auth == NULL)
3317                 return -1;
3318
3319         if (pmksa_cache_auth_add(wpa_auth->pmksa, pmk, len, NULL,
3320                                  NULL, 0,
3321                                  wpa_auth->addr,
3322                                  sta_addr, session_timeout, eapol,
3323                                  WPA_KEY_MGMT_IEEE8021X))
3324                 return 0;
3325
3326         return -1;
3327 }
3328
3329
3330 int wpa_auth_pmksa_add_sae(struct wpa_authenticator *wpa_auth, const u8 *addr,
3331                            const u8 *pmk, const u8 *pmkid)
3332 {
3333         if (wpa_auth->conf.disable_pmksa_caching)
3334                 return -1;
3335
3336         if (pmksa_cache_auth_add(wpa_auth->pmksa, pmk, PMK_LEN, pmkid,
3337                                  NULL, 0,
3338                                  wpa_auth->addr, addr, 0, NULL,
3339                                  WPA_KEY_MGMT_SAE))
3340                 return 0;
3341
3342         return -1;
3343 }
3344
3345
3346 void wpa_auth_pmksa_remove(struct wpa_authenticator *wpa_auth,
3347                            const u8 *sta_addr)
3348 {
3349         struct rsn_pmksa_cache_entry *pmksa;
3350
3351         if (wpa_auth == NULL || wpa_auth->pmksa == NULL)
3352                 return;
3353         pmksa = pmksa_cache_auth_get(wpa_auth->pmksa, sta_addr, NULL);
3354         if (pmksa) {
3355                 wpa_printf(MSG_DEBUG, "WPA: Remove PMKSA cache entry for "
3356                            MACSTR " based on request", MAC2STR(sta_addr));
3357                 pmksa_cache_free_entry(wpa_auth->pmksa, pmksa);
3358         }
3359 }
3360
3361
3362 int wpa_auth_pmksa_list(struct wpa_authenticator *wpa_auth, char *buf,
3363                         size_t len)
3364 {
3365         if (!wpa_auth || !wpa_auth->pmksa)
3366                 return 0;
3367         return pmksa_cache_auth_list(wpa_auth->pmksa, buf, len);
3368 }
3369
3370
3371 void wpa_auth_pmksa_flush(struct wpa_authenticator *wpa_auth)
3372 {
3373         if (wpa_auth && wpa_auth->pmksa)
3374                 pmksa_cache_auth_flush(wpa_auth->pmksa);
3375 }
3376
3377
3378 struct rsn_pmksa_cache_entry *
3379 wpa_auth_pmksa_get(struct wpa_authenticator *wpa_auth, const u8 *sta_addr)
3380 {
3381         if (!wpa_auth || !wpa_auth->pmksa)
3382                 return NULL;
3383         return pmksa_cache_auth_get(wpa_auth->pmksa, sta_addr, NULL);
3384 }
3385
3386
3387 void wpa_auth_pmksa_set_to_sm(struct rsn_pmksa_cache_entry *pmksa,
3388                               struct wpa_state_machine *sm,
3389                               struct wpa_authenticator *wpa_auth,
3390                               u8 *pmkid, u8 *pmk)
3391 {
3392         if (!sm)
3393                 return;
3394
3395         sm->pmksa = pmksa;
3396         os_memcpy(pmk, pmksa->pmk, PMK_LEN);
3397         os_memcpy(pmkid, pmksa->pmkid, PMKID_LEN);
3398         os_memcpy(wpa_auth->dot11RSNAPMKIDUsed, pmksa->pmkid, PMKID_LEN);
3399 }
3400
3401
3402 /*
3403  * Remove and free the group from wpa_authenticator. This is triggered by a
3404  * callback to make sure nobody is currently iterating the group list while it
3405  * gets modified.
3406  */
3407 static void wpa_group_free(struct wpa_authenticator *wpa_auth,
3408                            struct wpa_group *group)
3409 {
3410         struct wpa_group *prev = wpa_auth->group;
3411
3412         wpa_printf(MSG_DEBUG, "WPA: Remove group state machine for VLAN-ID %d",
3413                    group->vlan_id);
3414
3415         while (prev) {
3416                 if (prev->next == group) {
3417                         /* This never frees the special first group as needed */
3418                         prev->next = group->next;
3419                         os_free(group);
3420                         break;
3421                 }
3422                 prev = prev->next;
3423         }
3424
3425 }
3426
3427
3428 /* Increase the reference counter for group */
3429 static void wpa_group_get(struct wpa_authenticator *wpa_auth,
3430                           struct wpa_group *group)
3431 {
3432         /* Skip the special first group */
3433         if (wpa_auth->group == group)
3434                 return;
3435
3436         group->references++;
3437 }
3438
3439
3440 /* Decrease the reference counter and maybe free the group */
3441 static void wpa_group_put(struct wpa_authenticator *wpa_auth,
3442                           struct wpa_group *group)
3443 {
3444         /* Skip the special first group */
3445         if (wpa_auth->group == group)
3446                 return;
3447
3448         group->references--;
3449         if (group->references)
3450                 return;
3451         wpa_group_free(wpa_auth, group);
3452 }
3453
3454
3455 /*
3456  * Add a group that has its references counter set to zero. Caller needs to
3457  * call wpa_group_get() on the return value to mark the entry in use.
3458  */
3459 static struct wpa_group *
3460 wpa_auth_add_group(struct wpa_authenticator *wpa_auth, int vlan_id)
3461 {
3462         struct wpa_group *group;
3463
3464         if (wpa_auth == NULL || wpa_auth->group == NULL)
3465                 return NULL;
3466
3467         wpa_printf(MSG_DEBUG, "WPA: Add group state machine for VLAN-ID %d",
3468                    vlan_id);
3469         group = wpa_group_init(wpa_auth, vlan_id, 0);
3470         if (group == NULL)
3471                 return NULL;
3472
3473         group->next = wpa_auth->group->next;
3474         wpa_auth->group->next = group;
3475
3476         return group;
3477 }
3478
3479
3480 /*
3481  * Enforce that the group state machine for the VLAN is running, increase
3482  * reference counter as interface is up. References might have been increased
3483  * even if a negative value is returned.
3484  * Returns: -1 on error (group missing, group already failed); otherwise, 0
3485  */
3486 int wpa_auth_ensure_group(struct wpa_authenticator *wpa_auth, int vlan_id)
3487 {
3488         struct wpa_group *group;
3489
3490         if (wpa_auth == NULL)
3491                 return 0;
3492
3493         group = wpa_auth->group;
3494         while (group) {
3495                 if (group->vlan_id == vlan_id)
3496                         break;
3497                 group = group->next;
3498         }
3499
3500         if (group == NULL) {
3501                 group = wpa_auth_add_group(wpa_auth, vlan_id);
3502                 if (group == NULL)
3503                         return -1;
3504         }
3505
3506         wpa_printf(MSG_DEBUG,
3507                    "WPA: Ensure group state machine running for VLAN ID %d",
3508                    vlan_id);
3509
3510         wpa_group_get(wpa_auth, group);
3511         group->num_setup_iface++;
3512
3513         if (group->wpa_group_state == WPA_GROUP_FATAL_FAILURE)
3514                 return -1;
3515
3516         return 0;
3517 }
3518
3519
3520 /*
3521  * Decrease reference counter, expected to be zero afterwards.
3522  * returns: -1 on error (group not found, group in fail state)
3523  *          -2 if wpa_group is still referenced
3524  *           0 else
3525  */
3526 int wpa_auth_release_group(struct wpa_authenticator *wpa_auth, int vlan_id)
3527 {
3528         struct wpa_group *group;
3529         int ret = 0;
3530
3531         if (wpa_auth == NULL)
3532                 return 0;
3533
3534         group = wpa_auth->group;
3535         while (group) {
3536                 if (group->vlan_id == vlan_id)
3537                         break;
3538                 group = group->next;
3539         }
3540
3541         if (group == NULL)
3542                 return -1;
3543
3544         wpa_printf(MSG_DEBUG,
3545                    "WPA: Try stopping group state machine for VLAN ID %d",
3546                    vlan_id);
3547
3548         if (group->num_setup_iface <= 0) {
3549                 wpa_printf(MSG_ERROR,
3550                            "WPA: wpa_auth_release_group called more often than wpa_auth_ensure_group for VLAN ID %d, skipping.",
3551                            vlan_id);
3552                 return -1;
3553         }
3554         group->num_setup_iface--;
3555
3556         if (group->wpa_group_state == WPA_GROUP_FATAL_FAILURE)
3557                 ret = -1;
3558
3559         if (group->references > 1) {
3560                 wpa_printf(MSG_DEBUG,
3561                            "WPA: Cannot stop group state machine for VLAN ID %d as references are still hold",
3562                            vlan_id);
3563                 ret = -2;
3564         }
3565
3566         wpa_group_put(wpa_auth, group);
3567
3568         return ret;
3569 }
3570
3571
3572 int wpa_auth_sta_set_vlan(struct wpa_state_machine *sm, int vlan_id)
3573 {
3574         struct wpa_group *group;
3575
3576         if (sm == NULL || sm->wpa_auth == NULL)
3577                 return 0;
3578
3579         group = sm->wpa_auth->group;
3580         while (group) {
3581                 if (group->vlan_id == vlan_id)
3582                         break;
3583                 group = group->next;
3584         }
3585
3586         if (group == NULL) {
3587                 group = wpa_auth_add_group(sm->wpa_auth, vlan_id);
3588                 if (group == NULL)
3589                         return -1;
3590         }
3591
3592         if (sm->group == group)
3593                 return 0;
3594
3595         if (group->wpa_group_state == WPA_GROUP_FATAL_FAILURE)
3596                 return -1;
3597
3598         wpa_printf(MSG_DEBUG, "WPA: Moving STA " MACSTR " to use group state "
3599                    "machine for VLAN ID %d", MAC2STR(sm->addr), vlan_id);
3600
3601         wpa_group_get(sm->wpa_auth, group);
3602         wpa_group_put(sm->wpa_auth, sm->group);
3603         sm->group = group;
3604
3605         return 0;
3606 }
3607
3608
3609 void wpa_auth_eapol_key_tx_status(struct wpa_authenticator *wpa_auth,
3610                                   struct wpa_state_machine *sm, int ack)
3611 {
3612         if (wpa_auth == NULL || sm == NULL)
3613                 return;
3614         wpa_printf(MSG_DEBUG, "WPA: EAPOL-Key TX status for STA " MACSTR
3615                    " ack=%d", MAC2STR(sm->addr), ack);
3616         if (sm->pending_1_of_4_timeout && ack) {
3617                 /*
3618                  * Some deployed supplicant implementations update their SNonce
3619                  * for each EAPOL-Key 2/4 message even within the same 4-way
3620                  * handshake and then fail to use the first SNonce when
3621                  * deriving the PTK. This results in unsuccessful 4-way
3622                  * handshake whenever the relatively short initial timeout is
3623                  * reached and EAPOL-Key 1/4 is retransmitted. Try to work
3624                  * around this by increasing the timeout now that we know that
3625                  * the station has received the frame.
3626                  */
3627                 int timeout_ms = eapol_key_timeout_subseq;
3628                 wpa_printf(MSG_DEBUG, "WPA: Increase initial EAPOL-Key 1/4 "
3629                            "timeout by %u ms because of acknowledged frame",
3630                            timeout_ms);
3631                 eloop_cancel_timeout(wpa_send_eapol_timeout, wpa_auth, sm);
3632                 eloop_register_timeout(timeout_ms / 1000,
3633                                        (timeout_ms % 1000) * 1000,
3634                                        wpa_send_eapol_timeout, wpa_auth, sm);
3635         }
3636 }
3637
3638
3639 int wpa_auth_uses_sae(struct wpa_state_machine *sm)
3640 {
3641         if (sm == NULL)
3642                 return 0;
3643         return wpa_key_mgmt_sae(sm->wpa_key_mgmt);
3644 }
3645
3646
3647 int wpa_auth_uses_ft_sae(struct wpa_state_machine *sm)
3648 {
3649         if (sm == NULL)
3650                 return 0;
3651         return sm->wpa_key_mgmt == WPA_KEY_MGMT_FT_SAE;
3652 }
3653
3654
3655 #ifdef CONFIG_P2P
3656 int wpa_auth_get_ip_addr(struct wpa_state_machine *sm, u8 *addr)
3657 {
3658         if (sm == NULL || WPA_GET_BE32(sm->ip_addr) == 0)
3659                 return -1;
3660         os_memcpy(addr, sm->ip_addr, 4);
3661         return 0;
3662 }
3663 #endif /* CONFIG_P2P */
3664
3665
3666 int wpa_auth_radius_das_disconnect_pmksa(struct wpa_authenticator *wpa_auth,
3667                                          struct radius_das_attrs *attr)
3668 {
3669         return pmksa_cache_auth_radius_das_disconnect(wpa_auth->pmksa, attr);
3670 }
3671
3672
3673 void wpa_auth_reconfig_group_keys(struct wpa_authenticator *wpa_auth)
3674 {
3675         struct wpa_group *group;
3676
3677         if (!wpa_auth)
3678                 return;
3679         for (group = wpa_auth->group; group; group = group->next)
3680                 wpa_group_config_group_keys(wpa_auth, group);
3681 }