Add TEST_ASSOC_IE for WPA/RSN IE testing on AP side
[mech_eap.git] / src / rsn_supp / wpa.c
1 /*
2  * WPA Supplicant - WPA state machine and EAPOL-Key processing
3  * Copyright (c) 2003-2015, Jouni Malinen <j@w1.fi>
4  * Copyright(c) 2015 Intel Deutschland GmbH
5  *
6  * This software may be distributed under the terms of the BSD license.
7  * See README for more details.
8  */
9
10 #include "includes.h"
11
12 #include "common.h"
13 #include "crypto/aes_wrap.h"
14 #include "crypto/crypto.h"
15 #include "crypto/random.h"
16 #include "common/ieee802_11_defs.h"
17 #include "eapol_supp/eapol_supp_sm.h"
18 #include "wpa.h"
19 #include "eloop.h"
20 #include "preauth.h"
21 #include "pmksa_cache.h"
22 #include "wpa_i.h"
23 #include "wpa_ie.h"
24 #include "peerkey.h"
25
26
27 static const u8 null_rsc[8] = { 0, 0, 0, 0, 0, 0, 0, 0 };
28
29
30 /**
31  * wpa_eapol_key_send - Send WPA/RSN EAPOL-Key message
32  * @sm: Pointer to WPA state machine data from wpa_sm_init()
33  * @kck: Key Confirmation Key (KCK, part of PTK)
34  * @kck_len: KCK length in octets
35  * @ver: Version field from Key Info
36  * @dest: Destination address for the frame
37  * @proto: Ethertype (usually ETH_P_EAPOL)
38  * @msg: EAPOL-Key message
39  * @msg_len: Length of message
40  * @key_mic: Pointer to the buffer to which the EAPOL-Key MIC is written
41  * Returns: >= 0 on success, < 0 on failure
42  */
43 int wpa_eapol_key_send(struct wpa_sm *sm, const u8 *kck, size_t kck_len,
44                        int ver, const u8 *dest, u16 proto,
45                        u8 *msg, size_t msg_len, u8 *key_mic)
46 {
47         int ret = -1;
48         size_t mic_len = wpa_mic_len(sm->key_mgmt);
49
50         if (is_zero_ether_addr(dest) && is_zero_ether_addr(sm->bssid)) {
51                 /*
52                  * Association event was not yet received; try to fetch
53                  * BSSID from the driver.
54                  */
55                 if (wpa_sm_get_bssid(sm, sm->bssid) < 0) {
56                         wpa_dbg(sm->ctx->msg_ctx, MSG_DEBUG,
57                                 "WPA: Failed to read BSSID for "
58                                 "EAPOL-Key destination address");
59                 } else {
60                         dest = sm->bssid;
61                         wpa_dbg(sm->ctx->msg_ctx, MSG_DEBUG,
62                                 "WPA: Use BSSID (" MACSTR
63                                 ") as the destination for EAPOL-Key",
64                                 MAC2STR(dest));
65                 }
66         }
67         if (key_mic &&
68             wpa_eapol_key_mic(kck, kck_len, sm->key_mgmt, ver, msg, msg_len,
69                               key_mic)) {
70                 wpa_msg(sm->ctx->msg_ctx, MSG_ERROR,
71                         "WPA: Failed to generate EAPOL-Key version %d key_mgmt 0x%x MIC",
72                         ver, sm->key_mgmt);
73                 goto out;
74         }
75         wpa_hexdump_key(MSG_DEBUG, "WPA: KCK", kck, kck_len);
76         wpa_hexdump(MSG_DEBUG, "WPA: Derived Key MIC", key_mic, mic_len);
77         wpa_hexdump(MSG_MSGDUMP, "WPA: TX EAPOL-Key", msg, msg_len);
78         ret = wpa_sm_ether_send(sm, dest, proto, msg, msg_len);
79         eapol_sm_notify_tx_eapol_key(sm->eapol);
80 out:
81         os_free(msg);
82         return ret;
83 }
84
85
86 /**
87  * wpa_sm_key_request - Send EAPOL-Key Request
88  * @sm: Pointer to WPA state machine data from wpa_sm_init()
89  * @error: Indicate whether this is an Michael MIC error report
90  * @pairwise: 1 = error report for pairwise packet, 0 = for group packet
91  *
92  * Send an EAPOL-Key Request to the current authenticator. This function is
93  * used to request rekeying and it is usually called when a local Michael MIC
94  * failure is detected.
95  */
96 void wpa_sm_key_request(struct wpa_sm *sm, int error, int pairwise)
97 {
98         size_t mic_len, hdrlen, rlen;
99         struct wpa_eapol_key *reply;
100         struct wpa_eapol_key_192 *reply192;
101         int key_info, ver;
102         u8 bssid[ETH_ALEN], *rbuf, *key_mic;
103
104         if (sm->key_mgmt == WPA_KEY_MGMT_OSEN ||
105             wpa_key_mgmt_suite_b(sm->key_mgmt))
106                 ver = WPA_KEY_INFO_TYPE_AKM_DEFINED;
107         else if (wpa_key_mgmt_ft(sm->key_mgmt) ||
108                  wpa_key_mgmt_sha256(sm->key_mgmt))
109                 ver = WPA_KEY_INFO_TYPE_AES_128_CMAC;
110         else if (sm->pairwise_cipher != WPA_CIPHER_TKIP)
111                 ver = WPA_KEY_INFO_TYPE_HMAC_SHA1_AES;
112         else
113                 ver = WPA_KEY_INFO_TYPE_HMAC_MD5_RC4;
114
115         if (wpa_sm_get_bssid(sm, bssid) < 0) {
116                 wpa_msg(sm->ctx->msg_ctx, MSG_WARNING,
117                         "Failed to read BSSID for EAPOL-Key request");
118                 return;
119         }
120
121         mic_len = wpa_mic_len(sm->key_mgmt);
122         hdrlen = mic_len == 24 ? sizeof(*reply192) : sizeof(*reply);
123         rbuf = wpa_sm_alloc_eapol(sm, IEEE802_1X_TYPE_EAPOL_KEY, NULL,
124                                   hdrlen, &rlen, (void *) &reply);
125         if (rbuf == NULL)
126                 return;
127         reply192 = (struct wpa_eapol_key_192 *) reply;
128
129         reply->type = (sm->proto == WPA_PROTO_RSN ||
130                        sm->proto == WPA_PROTO_OSEN) ?
131                 EAPOL_KEY_TYPE_RSN : EAPOL_KEY_TYPE_WPA;
132         key_info = WPA_KEY_INFO_REQUEST | ver;
133         if (sm->ptk_set)
134                 key_info |= WPA_KEY_INFO_MIC;
135         if (error)
136                 key_info |= WPA_KEY_INFO_ERROR;
137         if (pairwise)
138                 key_info |= WPA_KEY_INFO_KEY_TYPE;
139         WPA_PUT_BE16(reply->key_info, key_info);
140         WPA_PUT_BE16(reply->key_length, 0);
141         os_memcpy(reply->replay_counter, sm->request_counter,
142                   WPA_REPLAY_COUNTER_LEN);
143         inc_byte_array(sm->request_counter, WPA_REPLAY_COUNTER_LEN);
144
145         if (mic_len == 24)
146                 WPA_PUT_BE16(reply192->key_data_length, 0);
147         else
148                 WPA_PUT_BE16(reply->key_data_length, 0);
149         if (!(key_info & WPA_KEY_INFO_MIC))
150                 key_mic = NULL;
151         else
152                 key_mic = reply192->key_mic; /* same offset in reply */
153
154         wpa_msg(sm->ctx->msg_ctx, MSG_INFO,
155                 "WPA: Sending EAPOL-Key Request (error=%d "
156                 "pairwise=%d ptk_set=%d len=%lu)",
157                 error, pairwise, sm->ptk_set, (unsigned long) rlen);
158         wpa_eapol_key_send(sm, sm->ptk.kck, sm->ptk.kck_len, ver, bssid,
159                            ETH_P_EAPOL, rbuf, rlen, key_mic);
160 }
161
162
163 static void wpa_supplicant_key_mgmt_set_pmk(struct wpa_sm *sm)
164 {
165 #ifdef CONFIG_IEEE80211R
166         if (sm->key_mgmt == WPA_KEY_MGMT_FT_IEEE8021X) {
167                 if (wpa_sm_key_mgmt_set_pmk(sm, sm->xxkey, sm->xxkey_len))
168                         wpa_dbg(sm->ctx->msg_ctx, MSG_DEBUG,
169                                 "RSN: Cannot set low order 256 bits of MSK for key management offload");
170         } else {
171 #endif /* CONFIG_IEEE80211R */
172                 if (wpa_sm_key_mgmt_set_pmk(sm, sm->pmk, sm->pmk_len))
173                         wpa_dbg(sm->ctx->msg_ctx, MSG_DEBUG,
174                                 "RSN: Cannot set PMK for key management offload");
175 #ifdef CONFIG_IEEE80211R
176         }
177 #endif /* CONFIG_IEEE80211R */
178 }
179
180
181 static int wpa_supplicant_get_pmk(struct wpa_sm *sm,
182                                   const unsigned char *src_addr,
183                                   const u8 *pmkid)
184 {
185         int abort_cached = 0;
186
187         if (pmkid && !sm->cur_pmksa) {
188                 /* When using drivers that generate RSN IE, wpa_supplicant may
189                  * not have enough time to get the association information
190                  * event before receiving this 1/4 message, so try to find a
191                  * matching PMKSA cache entry here. */
192                 sm->cur_pmksa = pmksa_cache_get(sm->pmksa, src_addr, pmkid,
193                                                 NULL);
194                 if (sm->cur_pmksa) {
195                         wpa_dbg(sm->ctx->msg_ctx, MSG_DEBUG,
196                                 "RSN: found matching PMKID from PMKSA cache");
197                 } else {
198                         wpa_dbg(sm->ctx->msg_ctx, MSG_DEBUG,
199                                 "RSN: no matching PMKID found");
200                         abort_cached = 1;
201                 }
202         }
203
204         if (pmkid && sm->cur_pmksa &&
205             os_memcmp_const(pmkid, sm->cur_pmksa->pmkid, PMKID_LEN) == 0) {
206                 wpa_hexdump(MSG_DEBUG, "RSN: matched PMKID", pmkid, PMKID_LEN);
207                 wpa_sm_set_pmk_from_pmksa(sm);
208                 wpa_hexdump_key(MSG_DEBUG, "RSN: PMK from PMKSA cache",
209                                 sm->pmk, sm->pmk_len);
210                 eapol_sm_notify_cached(sm->eapol);
211 #ifdef CONFIG_IEEE80211R
212                 sm->xxkey_len = 0;
213 #endif /* CONFIG_IEEE80211R */
214         } else if (wpa_key_mgmt_wpa_ieee8021x(sm->key_mgmt) && sm->eapol) {
215                 int res, pmk_len;
216
217                 if (sm->key_mgmt & WPA_KEY_MGMT_IEEE8021X_SUITE_B_192)
218                         pmk_len = PMK_LEN_SUITE_B_192;
219                 else
220                         pmk_len = PMK_LEN;
221                 res = eapol_sm_get_key(sm->eapol, sm->pmk, pmk_len);
222                 if (res) {
223                         if (pmk_len == PMK_LEN) {
224                                 /*
225                                  * EAP-LEAP is an exception from other EAP
226                                  * methods: it uses only 16-byte PMK.
227                                  */
228                                 res = eapol_sm_get_key(sm->eapol, sm->pmk, 16);
229                                 pmk_len = 16;
230                         }
231                 } else {
232 #ifdef CONFIG_IEEE80211R
233                         u8 buf[2 * PMK_LEN];
234                         if (eapol_sm_get_key(sm->eapol, buf, 2 * PMK_LEN) == 0)
235                         {
236                                 os_memcpy(sm->xxkey, buf + PMK_LEN, PMK_LEN);
237                                 sm->xxkey_len = PMK_LEN;
238                                 os_memset(buf, 0, sizeof(buf));
239                         }
240 #endif /* CONFIG_IEEE80211R */
241                 }
242                 if (res == 0) {
243                         struct rsn_pmksa_cache_entry *sa = NULL;
244                         wpa_hexdump_key(MSG_DEBUG, "WPA: PMK from EAPOL state "
245                                         "machines", sm->pmk, pmk_len);
246                         sm->pmk_len = pmk_len;
247                         wpa_supplicant_key_mgmt_set_pmk(sm);
248                         if (sm->proto == WPA_PROTO_RSN &&
249                             !wpa_key_mgmt_suite_b(sm->key_mgmt) &&
250                             !wpa_key_mgmt_ft(sm->key_mgmt)) {
251                                 sa = pmksa_cache_add(sm->pmksa,
252                                                      sm->pmk, pmk_len,
253                                                      NULL, 0,
254                                                      src_addr, sm->own_addr,
255                                                      sm->network_ctx,
256                                                      sm->key_mgmt);
257                         }
258                         if (!sm->cur_pmksa && pmkid &&
259                             pmksa_cache_get(sm->pmksa, src_addr, pmkid, NULL))
260                         {
261                                 wpa_dbg(sm->ctx->msg_ctx, MSG_DEBUG,
262                                         "RSN: the new PMK matches with the "
263                                         "PMKID");
264                                 abort_cached = 0;
265                         } else if (sa && !sm->cur_pmksa && pmkid) {
266                                 /*
267                                  * It looks like the authentication server
268                                  * derived mismatching MSK. This should not
269                                  * really happen, but bugs happen.. There is not
270                                  * much we can do here without knowing what
271                                  * exactly caused the server to misbehave.
272                                  */
273                                 wpa_dbg(sm->ctx->msg_ctx, MSG_INFO,
274                                         "RSN: PMKID mismatch - authentication server may have derived different MSK?!");
275                                 return -1;
276                         }
277
278                         if (!sm->cur_pmksa)
279                                 sm->cur_pmksa = sa;
280                 } else {
281                         wpa_msg(sm->ctx->msg_ctx, MSG_WARNING,
282                                 "WPA: Failed to get master session key from "
283                                 "EAPOL state machines - key handshake "
284                                 "aborted");
285                         if (sm->cur_pmksa) {
286                                 wpa_dbg(sm->ctx->msg_ctx, MSG_DEBUG,
287                                         "RSN: Cancelled PMKSA caching "
288                                         "attempt");
289                                 sm->cur_pmksa = NULL;
290                                 abort_cached = 1;
291                         } else if (!abort_cached) {
292                                 return -1;
293                         }
294                 }
295         }
296
297         if (abort_cached && wpa_key_mgmt_wpa_ieee8021x(sm->key_mgmt) &&
298             !wpa_key_mgmt_suite_b(sm->key_mgmt) &&
299             !wpa_key_mgmt_ft(sm->key_mgmt) && sm->key_mgmt != WPA_KEY_MGMT_OSEN)
300         {
301                 /* Send EAPOL-Start to trigger full EAP authentication. */
302                 u8 *buf;
303                 size_t buflen;
304
305                 wpa_dbg(sm->ctx->msg_ctx, MSG_DEBUG,
306                         "RSN: no PMKSA entry found - trigger "
307                         "full EAP authentication");
308                 buf = wpa_sm_alloc_eapol(sm, IEEE802_1X_TYPE_EAPOL_START,
309                                          NULL, 0, &buflen, NULL);
310                 if (buf) {
311                         wpa_sm_ether_send(sm, sm->bssid, ETH_P_EAPOL,
312                                           buf, buflen);
313                         os_free(buf);
314                         return -2;
315                 }
316
317                 return -1;
318         }
319
320         return 0;
321 }
322
323
324 /**
325  * wpa_supplicant_send_2_of_4 - Send message 2 of WPA/RSN 4-Way Handshake
326  * @sm: Pointer to WPA state machine data from wpa_sm_init()
327  * @dst: Destination address for the frame
328  * @key: Pointer to the EAPOL-Key frame header
329  * @ver: Version bits from EAPOL-Key Key Info
330  * @nonce: Nonce value for the EAPOL-Key frame
331  * @wpa_ie: WPA/RSN IE
332  * @wpa_ie_len: Length of the WPA/RSN IE
333  * @ptk: PTK to use for keyed hash and encryption
334  * Returns: >= 0 on success, < 0 on failure
335  */
336 int wpa_supplicant_send_2_of_4(struct wpa_sm *sm, const unsigned char *dst,
337                                const struct wpa_eapol_key *key,
338                                int ver, const u8 *nonce,
339                                const u8 *wpa_ie, size_t wpa_ie_len,
340                                struct wpa_ptk *ptk)
341 {
342         size_t mic_len, hdrlen, rlen;
343         struct wpa_eapol_key *reply;
344         struct wpa_eapol_key_192 *reply192;
345         u8 *rbuf, *key_mic;
346         u8 *rsn_ie_buf = NULL;
347
348         if (wpa_ie == NULL) {
349                 wpa_msg(sm->ctx->msg_ctx, MSG_WARNING, "WPA: No wpa_ie set - "
350                         "cannot generate msg 2/4");
351                 return -1;
352         }
353
354 #ifdef CONFIG_IEEE80211R
355         if (wpa_key_mgmt_ft(sm->key_mgmt)) {
356                 int res;
357
358                 /*
359                  * Add PMKR1Name into RSN IE (PMKID-List) and add MDIE and
360                  * FTIE from (Re)Association Response.
361                  */
362                 rsn_ie_buf = os_malloc(wpa_ie_len + 2 + 2 + PMKID_LEN +
363                                        sm->assoc_resp_ies_len);
364                 if (rsn_ie_buf == NULL)
365                         return -1;
366                 os_memcpy(rsn_ie_buf, wpa_ie, wpa_ie_len);
367                 res = wpa_insert_pmkid(rsn_ie_buf, wpa_ie_len,
368                                        sm->pmk_r1_name);
369                 if (res < 0) {
370                         os_free(rsn_ie_buf);
371                         return -1;
372                 }
373                 wpa_ie_len += res;
374
375                 if (sm->assoc_resp_ies) {
376                         os_memcpy(rsn_ie_buf + wpa_ie_len, sm->assoc_resp_ies,
377                                   sm->assoc_resp_ies_len);
378                         wpa_ie_len += sm->assoc_resp_ies_len;
379                 }
380
381                 wpa_ie = rsn_ie_buf;
382         }
383 #endif /* CONFIG_IEEE80211R */
384
385         wpa_hexdump(MSG_DEBUG, "WPA: WPA IE for msg 2/4", wpa_ie, wpa_ie_len);
386
387         mic_len = wpa_mic_len(sm->key_mgmt);
388         hdrlen = mic_len == 24 ? sizeof(*reply192) : sizeof(*reply);
389         rbuf = wpa_sm_alloc_eapol(sm, IEEE802_1X_TYPE_EAPOL_KEY,
390                                   NULL, hdrlen + wpa_ie_len,
391                                   &rlen, (void *) &reply);
392         if (rbuf == NULL) {
393                 os_free(rsn_ie_buf);
394                 return -1;
395         }
396         reply192 = (struct wpa_eapol_key_192 *) reply;
397
398         reply->type = (sm->proto == WPA_PROTO_RSN ||
399                        sm->proto == WPA_PROTO_OSEN) ?
400                 EAPOL_KEY_TYPE_RSN : EAPOL_KEY_TYPE_WPA;
401         WPA_PUT_BE16(reply->key_info,
402                      ver | WPA_KEY_INFO_KEY_TYPE | WPA_KEY_INFO_MIC);
403         if (sm->proto == WPA_PROTO_RSN || sm->proto == WPA_PROTO_OSEN)
404                 WPA_PUT_BE16(reply->key_length, 0);
405         else
406                 os_memcpy(reply->key_length, key->key_length, 2);
407         os_memcpy(reply->replay_counter, key->replay_counter,
408                   WPA_REPLAY_COUNTER_LEN);
409         wpa_hexdump(MSG_DEBUG, "WPA: Replay Counter", reply->replay_counter,
410                     WPA_REPLAY_COUNTER_LEN);
411
412         key_mic = reply192->key_mic; /* same offset for reply and reply192 */
413         if (mic_len == 24) {
414                 WPA_PUT_BE16(reply192->key_data_length, wpa_ie_len);
415                 os_memcpy(reply192 + 1, wpa_ie, wpa_ie_len);
416         } else {
417                 WPA_PUT_BE16(reply->key_data_length, wpa_ie_len);
418                 os_memcpy(reply + 1, wpa_ie, wpa_ie_len);
419         }
420         os_free(rsn_ie_buf);
421
422         os_memcpy(reply->key_nonce, nonce, WPA_NONCE_LEN);
423
424         wpa_dbg(sm->ctx->msg_ctx, MSG_DEBUG, "WPA: Sending EAPOL-Key 2/4");
425         return wpa_eapol_key_send(sm, ptk->kck, ptk->kck_len, ver, dst,
426                                   ETH_P_EAPOL, rbuf, rlen, key_mic);
427 }
428
429
430 static int wpa_derive_ptk(struct wpa_sm *sm, const unsigned char *src_addr,
431                           const struct wpa_eapol_key *key, struct wpa_ptk *ptk)
432 {
433 #ifdef CONFIG_IEEE80211R
434         if (wpa_key_mgmt_ft(sm->key_mgmt))
435                 return wpa_derive_ptk_ft(sm, src_addr, key, ptk);
436 #endif /* CONFIG_IEEE80211R */
437
438         return wpa_pmk_to_ptk(sm->pmk, sm->pmk_len, "Pairwise key expansion",
439                               sm->own_addr, sm->bssid, sm->snonce,
440                               key->key_nonce, ptk, sm->key_mgmt,
441                               sm->pairwise_cipher);
442 }
443
444
445 static void wpa_supplicant_process_1_of_4(struct wpa_sm *sm,
446                                           const unsigned char *src_addr,
447                                           const struct wpa_eapol_key *key,
448                                           u16 ver, const u8 *key_data,
449                                           size_t key_data_len)
450 {
451         struct wpa_eapol_ie_parse ie;
452         struct wpa_ptk *ptk;
453         int res;
454         u8 *kde, *kde_buf = NULL;
455         size_t kde_len;
456
457         if (wpa_sm_get_network_ctx(sm) == NULL) {
458                 wpa_msg(sm->ctx->msg_ctx, MSG_WARNING, "WPA: No SSID info "
459                         "found (msg 1 of 4)");
460                 return;
461         }
462
463         wpa_sm_set_state(sm, WPA_4WAY_HANDSHAKE);
464         wpa_dbg(sm->ctx->msg_ctx, MSG_DEBUG, "WPA: RX message 1 of 4-Way "
465                 "Handshake from " MACSTR " (ver=%d)", MAC2STR(src_addr), ver);
466
467         os_memset(&ie, 0, sizeof(ie));
468
469         if (sm->proto == WPA_PROTO_RSN || sm->proto == WPA_PROTO_OSEN) {
470                 /* RSN: msg 1/4 should contain PMKID for the selected PMK */
471                 wpa_hexdump(MSG_DEBUG, "RSN: msg 1/4 key data",
472                             key_data, key_data_len);
473                 if (wpa_supplicant_parse_ies(key_data, key_data_len, &ie) < 0)
474                         goto failed;
475                 if (ie.pmkid) {
476                         wpa_hexdump(MSG_DEBUG, "RSN: PMKID from "
477                                     "Authenticator", ie.pmkid, PMKID_LEN);
478                 }
479         }
480
481         res = wpa_supplicant_get_pmk(sm, src_addr, ie.pmkid);
482         if (res == -2) {
483                 wpa_dbg(sm->ctx->msg_ctx, MSG_DEBUG, "RSN: Do not reply to "
484                         "msg 1/4 - requesting full EAP authentication");
485                 return;
486         }
487         if (res)
488                 goto failed;
489
490         if (sm->renew_snonce) {
491                 if (random_get_bytes(sm->snonce, WPA_NONCE_LEN)) {
492                         wpa_msg(sm->ctx->msg_ctx, MSG_WARNING,
493                                 "WPA: Failed to get random data for SNonce");
494                         goto failed;
495                 }
496                 sm->renew_snonce = 0;
497                 wpa_hexdump(MSG_DEBUG, "WPA: Renewed SNonce",
498                             sm->snonce, WPA_NONCE_LEN);
499         }
500
501         /* Calculate PTK which will be stored as a temporary PTK until it has
502          * been verified when processing message 3/4. */
503         ptk = &sm->tptk;
504         wpa_derive_ptk(sm, src_addr, key, ptk);
505         if (sm->pairwise_cipher == WPA_CIPHER_TKIP) {
506                 u8 buf[8];
507                 /* Supplicant: swap tx/rx Mic keys */
508                 os_memcpy(buf, &ptk->tk[16], 8);
509                 os_memcpy(&ptk->tk[16], &ptk->tk[24], 8);
510                 os_memcpy(&ptk->tk[24], buf, 8);
511                 os_memset(buf, 0, sizeof(buf));
512         }
513         sm->tptk_set = 1;
514         sm->tk_to_set = 1;
515
516         kde = sm->assoc_wpa_ie;
517         kde_len = sm->assoc_wpa_ie_len;
518
519 #ifdef CONFIG_P2P
520         if (sm->p2p) {
521                 kde_buf = os_malloc(kde_len + 2 + RSN_SELECTOR_LEN + 1);
522                 if (kde_buf) {
523                         u8 *pos;
524                         wpa_printf(MSG_DEBUG, "P2P: Add IP Address Request KDE "
525                                    "into EAPOL-Key 2/4");
526                         os_memcpy(kde_buf, kde, kde_len);
527                         kde = kde_buf;
528                         pos = kde + kde_len;
529                         *pos++ = WLAN_EID_VENDOR_SPECIFIC;
530                         *pos++ = RSN_SELECTOR_LEN + 1;
531                         RSN_SELECTOR_PUT(pos, WFA_KEY_DATA_IP_ADDR_REQ);
532                         pos += RSN_SELECTOR_LEN;
533                         *pos++ = 0x01;
534                         kde_len = pos - kde;
535                 }
536         }
537 #endif /* CONFIG_P2P */
538
539         if (wpa_supplicant_send_2_of_4(sm, sm->bssid, key, ver, sm->snonce,
540                                        kde, kde_len, ptk) < 0)
541                 goto failed;
542
543         os_free(kde_buf);
544         os_memcpy(sm->anonce, key->key_nonce, WPA_NONCE_LEN);
545         return;
546
547 failed:
548         os_free(kde_buf);
549         wpa_sm_deauthenticate(sm, WLAN_REASON_UNSPECIFIED);
550 }
551
552
553 static void wpa_sm_start_preauth(void *eloop_ctx, void *timeout_ctx)
554 {
555         struct wpa_sm *sm = eloop_ctx;
556         rsn_preauth_candidate_process(sm);
557 }
558
559
560 static void wpa_supplicant_key_neg_complete(struct wpa_sm *sm,
561                                             const u8 *addr, int secure)
562 {
563         wpa_msg(sm->ctx->msg_ctx, MSG_INFO,
564                 "WPA: Key negotiation completed with "
565                 MACSTR " [PTK=%s GTK=%s]", MAC2STR(addr),
566                 wpa_cipher_txt(sm->pairwise_cipher),
567                 wpa_cipher_txt(sm->group_cipher));
568         wpa_sm_cancel_auth_timeout(sm);
569         wpa_sm_set_state(sm, WPA_COMPLETED);
570
571         if (secure) {
572                 wpa_sm_mlme_setprotection(
573                         sm, addr, MLME_SETPROTECTION_PROTECT_TYPE_RX_TX,
574                         MLME_SETPROTECTION_KEY_TYPE_PAIRWISE);
575                 eapol_sm_notify_portValid(sm->eapol, TRUE);
576                 if (wpa_key_mgmt_wpa_psk(sm->key_mgmt))
577                         eapol_sm_notify_eap_success(sm->eapol, TRUE);
578                 /*
579                  * Start preauthentication after a short wait to avoid a
580                  * possible race condition between the data receive and key
581                  * configuration after the 4-Way Handshake. This increases the
582                  * likelihood of the first preauth EAPOL-Start frame getting to
583                  * the target AP.
584                  */
585                 eloop_register_timeout(1, 0, wpa_sm_start_preauth, sm, NULL);
586         }
587
588         if (sm->cur_pmksa && sm->cur_pmksa->opportunistic) {
589                 wpa_dbg(sm->ctx->msg_ctx, MSG_DEBUG,
590                         "RSN: Authenticator accepted "
591                         "opportunistic PMKSA entry - marking it valid");
592                 sm->cur_pmksa->opportunistic = 0;
593         }
594
595 #ifdef CONFIG_IEEE80211R
596         if (wpa_key_mgmt_ft(sm->key_mgmt)) {
597                 /* Prepare for the next transition */
598                 wpa_ft_prepare_auth_request(sm, NULL);
599         }
600 #endif /* CONFIG_IEEE80211R */
601 }
602
603
604 static void wpa_sm_rekey_ptk(void *eloop_ctx, void *timeout_ctx)
605 {
606         struct wpa_sm *sm = eloop_ctx;
607         wpa_dbg(sm->ctx->msg_ctx, MSG_DEBUG, "WPA: Request PTK rekeying");
608         wpa_sm_key_request(sm, 0, 1);
609 }
610
611
612 static int wpa_supplicant_install_ptk(struct wpa_sm *sm,
613                                       const struct wpa_eapol_key *key)
614 {
615         int keylen, rsclen;
616         enum wpa_alg alg;
617         const u8 *key_rsc;
618
619         if (!sm->tk_to_set) {
620                 wpa_dbg(sm->ctx->msg_ctx, MSG_DEBUG,
621                         "WPA: Do not re-install same PTK to the driver");
622                 return 0;
623         }
624
625         wpa_dbg(sm->ctx->msg_ctx, MSG_DEBUG,
626                 "WPA: Installing PTK to the driver");
627
628         if (sm->pairwise_cipher == WPA_CIPHER_NONE) {
629                 wpa_dbg(sm->ctx->msg_ctx, MSG_DEBUG, "WPA: Pairwise Cipher "
630                         "Suite: NONE - do not use pairwise keys");
631                 return 0;
632         }
633
634         if (!wpa_cipher_valid_pairwise(sm->pairwise_cipher)) {
635                 wpa_msg(sm->ctx->msg_ctx, MSG_WARNING,
636                         "WPA: Unsupported pairwise cipher %d",
637                         sm->pairwise_cipher);
638                 return -1;
639         }
640
641         alg = wpa_cipher_to_alg(sm->pairwise_cipher);
642         keylen = wpa_cipher_key_len(sm->pairwise_cipher);
643         rsclen = wpa_cipher_rsc_len(sm->pairwise_cipher);
644
645         if (sm->proto == WPA_PROTO_RSN || sm->proto == WPA_PROTO_OSEN) {
646                 key_rsc = null_rsc;
647         } else {
648                 key_rsc = key->key_rsc;
649                 wpa_hexdump(MSG_DEBUG, "WPA: RSC", key_rsc, rsclen);
650         }
651
652         if (wpa_sm_set_key(sm, alg, sm->bssid, 0, 1, key_rsc, rsclen,
653                            sm->ptk.tk, keylen) < 0) {
654                 wpa_msg(sm->ctx->msg_ctx, MSG_WARNING,
655                         "WPA: Failed to set PTK to the "
656                         "driver (alg=%d keylen=%d bssid=" MACSTR ")",
657                         alg, keylen, MAC2STR(sm->bssid));
658                 return -1;
659         }
660
661         /* TK is not needed anymore in supplicant */
662         os_memset(sm->ptk.tk, 0, WPA_TK_MAX_LEN);
663         sm->tk_to_set = 0;
664
665         if (sm->wpa_ptk_rekey) {
666                 eloop_cancel_timeout(wpa_sm_rekey_ptk, sm, NULL);
667                 eloop_register_timeout(sm->wpa_ptk_rekey, 0, wpa_sm_rekey_ptk,
668                                        sm, NULL);
669         }
670
671         return 0;
672 }
673
674
675 static int wpa_supplicant_check_group_cipher(struct wpa_sm *sm,
676                                              int group_cipher,
677                                              int keylen, int maxkeylen,
678                                              int *key_rsc_len,
679                                              enum wpa_alg *alg)
680 {
681         int klen;
682
683         *alg = wpa_cipher_to_alg(group_cipher);
684         if (*alg == WPA_ALG_NONE) {
685                 wpa_msg(sm->ctx->msg_ctx, MSG_WARNING,
686                         "WPA: Unsupported Group Cipher %d",
687                         group_cipher);
688                 return -1;
689         }
690         *key_rsc_len = wpa_cipher_rsc_len(group_cipher);
691
692         klen = wpa_cipher_key_len(group_cipher);
693         if (keylen != klen || maxkeylen < klen) {
694                 wpa_msg(sm->ctx->msg_ctx, MSG_WARNING,
695                         "WPA: Unsupported %s Group Cipher key length %d (%d)",
696                         wpa_cipher_txt(group_cipher), keylen, maxkeylen);
697                 return -1;
698         }
699         return 0;
700 }
701
702
703 struct wpa_gtk_data {
704         enum wpa_alg alg;
705         int tx, key_rsc_len, keyidx;
706         u8 gtk[32];
707         int gtk_len;
708 };
709
710
711 static int wpa_supplicant_install_gtk(struct wpa_sm *sm,
712                                       const struct wpa_gtk_data *gd,
713                                       const u8 *key_rsc)
714 {
715         const u8 *_gtk = gd->gtk;
716         u8 gtk_buf[32];
717
718         wpa_hexdump_key(MSG_DEBUG, "WPA: Group Key", gd->gtk, gd->gtk_len);
719         wpa_dbg(sm->ctx->msg_ctx, MSG_DEBUG,
720                 "WPA: Installing GTK to the driver (keyidx=%d tx=%d len=%d)",
721                 gd->keyidx, gd->tx, gd->gtk_len);
722         wpa_hexdump(MSG_DEBUG, "WPA: RSC", key_rsc, gd->key_rsc_len);
723         if (sm->group_cipher == WPA_CIPHER_TKIP) {
724                 /* Swap Tx/Rx keys for Michael MIC */
725                 os_memcpy(gtk_buf, gd->gtk, 16);
726                 os_memcpy(gtk_buf + 16, gd->gtk + 24, 8);
727                 os_memcpy(gtk_buf + 24, gd->gtk + 16, 8);
728                 _gtk = gtk_buf;
729         }
730         if (sm->pairwise_cipher == WPA_CIPHER_NONE) {
731                 if (wpa_sm_set_key(sm, gd->alg, NULL,
732                                    gd->keyidx, 1, key_rsc, gd->key_rsc_len,
733                                    _gtk, gd->gtk_len) < 0) {
734                         wpa_msg(sm->ctx->msg_ctx, MSG_WARNING,
735                                 "WPA: Failed to set GTK to the driver "
736                                 "(Group only)");
737                         os_memset(gtk_buf, 0, sizeof(gtk_buf));
738                         return -1;
739                 }
740         } else if (wpa_sm_set_key(sm, gd->alg, broadcast_ether_addr,
741                                   gd->keyidx, gd->tx, key_rsc, gd->key_rsc_len,
742                                   _gtk, gd->gtk_len) < 0) {
743                 wpa_msg(sm->ctx->msg_ctx, MSG_WARNING,
744                         "WPA: Failed to set GTK to "
745                         "the driver (alg=%d keylen=%d keyidx=%d)",
746                         gd->alg, gd->gtk_len, gd->keyidx);
747                 os_memset(gtk_buf, 0, sizeof(gtk_buf));
748                 return -1;
749         }
750         os_memset(gtk_buf, 0, sizeof(gtk_buf));
751
752         return 0;
753 }
754
755
756 static int wpa_supplicant_gtk_tx_bit_workaround(const struct wpa_sm *sm,
757                                                 int tx)
758 {
759         if (tx && sm->pairwise_cipher != WPA_CIPHER_NONE) {
760                 /* Ignore Tx bit for GTK if a pairwise key is used. One AP
761                  * seemed to set this bit (incorrectly, since Tx is only when
762                  * doing Group Key only APs) and without this workaround, the
763                  * data connection does not work because wpa_supplicant
764                  * configured non-zero keyidx to be used for unicast. */
765                 wpa_msg(sm->ctx->msg_ctx, MSG_INFO,
766                         "WPA: Tx bit set for GTK, but pairwise "
767                         "keys are used - ignore Tx bit");
768                 return 0;
769         }
770         return tx;
771 }
772
773
774 static int wpa_supplicant_rsc_relaxation(const struct wpa_sm *sm,
775                                          const u8 *rsc)
776 {
777         int rsclen;
778
779         if (!sm->wpa_rsc_relaxation)
780                 return 0;
781
782         rsclen = wpa_cipher_rsc_len(sm->group_cipher);
783
784         /*
785          * Try to detect RSC (endian) corruption issue where the AP sends
786          * the RSC bytes in EAPOL-Key message in the wrong order, both if
787          * it's actually a 6-byte field (as it should be) and if it treats
788          * it as an 8-byte field.
789          * An AP model known to have this bug is the Sapido RB-1632.
790          */
791         if (rsclen == 6 && ((rsc[5] && !rsc[0]) || rsc[6] || rsc[7])) {
792                 wpa_msg(sm->ctx->msg_ctx, MSG_WARNING,
793                         "RSC %02x%02x%02x%02x%02x%02x%02x%02x is likely bogus, using 0",
794                         rsc[0], rsc[1], rsc[2], rsc[3],
795                         rsc[4], rsc[5], rsc[6], rsc[7]);
796
797                 return 1;
798         }
799
800         return 0;
801 }
802
803
804 static int wpa_supplicant_pairwise_gtk(struct wpa_sm *sm,
805                                        const struct wpa_eapol_key *key,
806                                        const u8 *gtk, size_t gtk_len,
807                                        int key_info)
808 {
809         struct wpa_gtk_data gd;
810         const u8 *key_rsc;
811
812         /*
813          * IEEE Std 802.11i-2004 - 8.5.2 EAPOL-Key frames - Figure 43x
814          * GTK KDE format:
815          * KeyID[bits 0-1], Tx [bit 2], Reserved [bits 3-7]
816          * Reserved [bits 0-7]
817          * GTK
818          */
819
820         os_memset(&gd, 0, sizeof(gd));
821         wpa_hexdump_key(MSG_DEBUG, "RSN: received GTK in pairwise handshake",
822                         gtk, gtk_len);
823
824         if (gtk_len < 2 || gtk_len - 2 > sizeof(gd.gtk))
825                 return -1;
826
827         gd.keyidx = gtk[0] & 0x3;
828         gd.tx = wpa_supplicant_gtk_tx_bit_workaround(sm,
829                                                      !!(gtk[0] & BIT(2)));
830         gtk += 2;
831         gtk_len -= 2;
832
833         os_memcpy(gd.gtk, gtk, gtk_len);
834         gd.gtk_len = gtk_len;
835
836         key_rsc = key->key_rsc;
837         if (wpa_supplicant_rsc_relaxation(sm, key->key_rsc))
838                 key_rsc = null_rsc;
839
840         if (sm->group_cipher != WPA_CIPHER_GTK_NOT_USED &&
841             (wpa_supplicant_check_group_cipher(sm, sm->group_cipher,
842                                                gtk_len, gtk_len,
843                                                &gd.key_rsc_len, &gd.alg) ||
844              wpa_supplicant_install_gtk(sm, &gd, key_rsc))) {
845                 wpa_dbg(sm->ctx->msg_ctx, MSG_DEBUG,
846                         "RSN: Failed to install GTK");
847                 os_memset(&gd, 0, sizeof(gd));
848                 return -1;
849         }
850         os_memset(&gd, 0, sizeof(gd));
851
852         wpa_supplicant_key_neg_complete(sm, sm->bssid,
853                                         key_info & WPA_KEY_INFO_SECURE);
854         return 0;
855 }
856
857
858 static int ieee80211w_set_keys(struct wpa_sm *sm,
859                                struct wpa_eapol_ie_parse *ie)
860 {
861 #ifdef CONFIG_IEEE80211W
862         if (!wpa_cipher_valid_mgmt_group(sm->mgmt_group_cipher))
863                 return 0;
864
865         if (ie->igtk) {
866                 size_t len;
867                 const struct wpa_igtk_kde *igtk;
868                 u16 keyidx;
869                 len = wpa_cipher_key_len(sm->mgmt_group_cipher);
870                 if (ie->igtk_len != WPA_IGTK_KDE_PREFIX_LEN + len)
871                         return -1;
872                 igtk = (const struct wpa_igtk_kde *) ie->igtk;
873                 keyidx = WPA_GET_LE16(igtk->keyid);
874                 wpa_dbg(sm->ctx->msg_ctx, MSG_DEBUG, "WPA: IGTK keyid %d "
875                         "pn %02x%02x%02x%02x%02x%02x",
876                         keyidx, MAC2STR(igtk->pn));
877                 wpa_hexdump_key(MSG_DEBUG, "WPA: IGTK",
878                                 igtk->igtk, len);
879                 if (keyidx > 4095) {
880                         wpa_msg(sm->ctx->msg_ctx, MSG_WARNING,
881                                 "WPA: Invalid IGTK KeyID %d", keyidx);
882                         return -1;
883                 }
884                 if (wpa_sm_set_key(sm, wpa_cipher_to_alg(sm->mgmt_group_cipher),
885                                    broadcast_ether_addr,
886                                    keyidx, 0, igtk->pn, sizeof(igtk->pn),
887                                    igtk->igtk, len) < 0) {
888                         wpa_msg(sm->ctx->msg_ctx, MSG_WARNING,
889                                 "WPA: Failed to configure IGTK to the driver");
890                         return -1;
891                 }
892         }
893
894         return 0;
895 #else /* CONFIG_IEEE80211W */
896         return 0;
897 #endif /* CONFIG_IEEE80211W */
898 }
899
900
901 static void wpa_report_ie_mismatch(struct wpa_sm *sm,
902                                    const char *reason, const u8 *src_addr,
903                                    const u8 *wpa_ie, size_t wpa_ie_len,
904                                    const u8 *rsn_ie, size_t rsn_ie_len)
905 {
906         wpa_msg(sm->ctx->msg_ctx, MSG_WARNING, "WPA: %s (src=" MACSTR ")",
907                 reason, MAC2STR(src_addr));
908
909         if (sm->ap_wpa_ie) {
910                 wpa_hexdump(MSG_INFO, "WPA: WPA IE in Beacon/ProbeResp",
911                             sm->ap_wpa_ie, sm->ap_wpa_ie_len);
912         }
913         if (wpa_ie) {
914                 if (!sm->ap_wpa_ie) {
915                         wpa_msg(sm->ctx->msg_ctx, MSG_INFO,
916                                 "WPA: No WPA IE in Beacon/ProbeResp");
917                 }
918                 wpa_hexdump(MSG_INFO, "WPA: WPA IE in 3/4 msg",
919                             wpa_ie, wpa_ie_len);
920         }
921
922         if (sm->ap_rsn_ie) {
923                 wpa_hexdump(MSG_INFO, "WPA: RSN IE in Beacon/ProbeResp",
924                             sm->ap_rsn_ie, sm->ap_rsn_ie_len);
925         }
926         if (rsn_ie) {
927                 if (!sm->ap_rsn_ie) {
928                         wpa_msg(sm->ctx->msg_ctx, MSG_INFO,
929                                 "WPA: No RSN IE in Beacon/ProbeResp");
930                 }
931                 wpa_hexdump(MSG_INFO, "WPA: RSN IE in 3/4 msg",
932                             rsn_ie, rsn_ie_len);
933         }
934
935         wpa_sm_deauthenticate(sm, WLAN_REASON_IE_IN_4WAY_DIFFERS);
936 }
937
938
939 #ifdef CONFIG_IEEE80211R
940
941 static int ft_validate_mdie(struct wpa_sm *sm,
942                             const unsigned char *src_addr,
943                             struct wpa_eapol_ie_parse *ie,
944                             const u8 *assoc_resp_mdie)
945 {
946         struct rsn_mdie *mdie;
947
948         mdie = (struct rsn_mdie *) (ie->mdie + 2);
949         if (ie->mdie == NULL || ie->mdie_len < 2 + sizeof(*mdie) ||
950             os_memcmp(mdie->mobility_domain, sm->mobility_domain,
951                       MOBILITY_DOMAIN_ID_LEN) != 0) {
952                 wpa_dbg(sm->ctx->msg_ctx, MSG_DEBUG, "FT: MDIE in msg 3/4 did "
953                         "not match with the current mobility domain");
954                 return -1;
955         }
956
957         if (assoc_resp_mdie &&
958             (assoc_resp_mdie[1] != ie->mdie[1] ||
959              os_memcmp(assoc_resp_mdie, ie->mdie, 2 + ie->mdie[1]) != 0)) {
960                 wpa_dbg(sm->ctx->msg_ctx, MSG_DEBUG, "FT: MDIE mismatch");
961                 wpa_hexdump(MSG_DEBUG, "FT: MDIE in EAPOL-Key msg 3/4",
962                             ie->mdie, 2 + ie->mdie[1]);
963                 wpa_hexdump(MSG_DEBUG, "FT: MDIE in (Re)Association Response",
964                             assoc_resp_mdie, 2 + assoc_resp_mdie[1]);
965                 return -1;
966         }
967
968         return 0;
969 }
970
971
972 static int ft_validate_ftie(struct wpa_sm *sm,
973                             const unsigned char *src_addr,
974                             struct wpa_eapol_ie_parse *ie,
975                             const u8 *assoc_resp_ftie)
976 {
977         if (ie->ftie == NULL) {
978                 wpa_dbg(sm->ctx->msg_ctx, MSG_DEBUG,
979                         "FT: No FTIE in EAPOL-Key msg 3/4");
980                 return -1;
981         }
982
983         if (assoc_resp_ftie == NULL)
984                 return 0;
985
986         if (assoc_resp_ftie[1] != ie->ftie[1] ||
987             os_memcmp(assoc_resp_ftie, ie->ftie, 2 + ie->ftie[1]) != 0) {
988                 wpa_dbg(sm->ctx->msg_ctx, MSG_DEBUG, "FT: FTIE mismatch");
989                 wpa_hexdump(MSG_DEBUG, "FT: FTIE in EAPOL-Key msg 3/4",
990                             ie->ftie, 2 + ie->ftie[1]);
991                 wpa_hexdump(MSG_DEBUG, "FT: FTIE in (Re)Association Response",
992                             assoc_resp_ftie, 2 + assoc_resp_ftie[1]);
993                 return -1;
994         }
995
996         return 0;
997 }
998
999
1000 static int ft_validate_rsnie(struct wpa_sm *sm,
1001                              const unsigned char *src_addr,
1002                              struct wpa_eapol_ie_parse *ie)
1003 {
1004         struct wpa_ie_data rsn;
1005
1006         if (!ie->rsn_ie)
1007                 return 0;
1008
1009         /*
1010          * Verify that PMKR1Name from EAPOL-Key message 3/4
1011          * matches with the value we derived.
1012          */
1013         if (wpa_parse_wpa_ie_rsn(ie->rsn_ie, ie->rsn_ie_len, &rsn) < 0 ||
1014             rsn.num_pmkid != 1 || rsn.pmkid == NULL) {
1015                 wpa_dbg(sm->ctx->msg_ctx, MSG_DEBUG, "FT: No PMKR1Name in "
1016                         "FT 4-way handshake message 3/4");
1017                 return -1;
1018         }
1019
1020         if (os_memcmp_const(rsn.pmkid, sm->pmk_r1_name, WPA_PMK_NAME_LEN) != 0)
1021         {
1022                 wpa_dbg(sm->ctx->msg_ctx, MSG_DEBUG,
1023                         "FT: PMKR1Name mismatch in "
1024                         "FT 4-way handshake message 3/4");
1025                 wpa_hexdump(MSG_DEBUG, "FT: PMKR1Name from Authenticator",
1026                             rsn.pmkid, WPA_PMK_NAME_LEN);
1027                 wpa_hexdump(MSG_DEBUG, "FT: Derived PMKR1Name",
1028                             sm->pmk_r1_name, WPA_PMK_NAME_LEN);
1029                 return -1;
1030         }
1031
1032         return 0;
1033 }
1034
1035
1036 static int wpa_supplicant_validate_ie_ft(struct wpa_sm *sm,
1037                                          const unsigned char *src_addr,
1038                                          struct wpa_eapol_ie_parse *ie)
1039 {
1040         const u8 *pos, *end, *mdie = NULL, *ftie = NULL;
1041
1042         if (sm->assoc_resp_ies) {
1043                 pos = sm->assoc_resp_ies;
1044                 end = pos + sm->assoc_resp_ies_len;
1045                 while (end - pos > 2) {
1046                         if (2 + pos[1] > end - pos)
1047                                 break;
1048                         switch (*pos) {
1049                         case WLAN_EID_MOBILITY_DOMAIN:
1050                                 mdie = pos;
1051                                 break;
1052                         case WLAN_EID_FAST_BSS_TRANSITION:
1053                                 ftie = pos;
1054                                 break;
1055                         }
1056                         pos += 2 + pos[1];
1057                 }
1058         }
1059
1060         if (ft_validate_mdie(sm, src_addr, ie, mdie) < 0 ||
1061             ft_validate_ftie(sm, src_addr, ie, ftie) < 0 ||
1062             ft_validate_rsnie(sm, src_addr, ie) < 0)
1063                 return -1;
1064
1065         return 0;
1066 }
1067
1068 #endif /* CONFIG_IEEE80211R */
1069
1070
1071 static int wpa_supplicant_validate_ie(struct wpa_sm *sm,
1072                                       const unsigned char *src_addr,
1073                                       struct wpa_eapol_ie_parse *ie)
1074 {
1075         if (sm->ap_wpa_ie == NULL && sm->ap_rsn_ie == NULL) {
1076                 wpa_dbg(sm->ctx->msg_ctx, MSG_DEBUG,
1077                         "WPA: No WPA/RSN IE for this AP known. "
1078                         "Trying to get from scan results");
1079                 if (wpa_sm_get_beacon_ie(sm) < 0) {
1080                         wpa_msg(sm->ctx->msg_ctx, MSG_WARNING,
1081                                 "WPA: Could not find AP from "
1082                                 "the scan results");
1083                 } else {
1084                         wpa_msg(sm->ctx->msg_ctx, MSG_DEBUG,
1085                                 "WPA: Found the current AP from "
1086                                 "updated scan results");
1087                 }
1088         }
1089
1090         if (ie->wpa_ie == NULL && ie->rsn_ie == NULL &&
1091             (sm->ap_wpa_ie || sm->ap_rsn_ie)) {
1092                 wpa_report_ie_mismatch(sm, "IE in 3/4 msg does not match "
1093                                        "with IE in Beacon/ProbeResp (no IE?)",
1094                                        src_addr, ie->wpa_ie, ie->wpa_ie_len,
1095                                        ie->rsn_ie, ie->rsn_ie_len);
1096                 return -1;
1097         }
1098
1099         if ((ie->wpa_ie && sm->ap_wpa_ie &&
1100              (ie->wpa_ie_len != sm->ap_wpa_ie_len ||
1101               os_memcmp(ie->wpa_ie, sm->ap_wpa_ie, ie->wpa_ie_len) != 0)) ||
1102             (ie->rsn_ie && sm->ap_rsn_ie &&
1103              wpa_compare_rsn_ie(wpa_key_mgmt_ft(sm->key_mgmt),
1104                                 sm->ap_rsn_ie, sm->ap_rsn_ie_len,
1105                                 ie->rsn_ie, ie->rsn_ie_len))) {
1106                 wpa_report_ie_mismatch(sm, "IE in 3/4 msg does not match "
1107                                        "with IE in Beacon/ProbeResp",
1108                                        src_addr, ie->wpa_ie, ie->wpa_ie_len,
1109                                        ie->rsn_ie, ie->rsn_ie_len);
1110                 return -1;
1111         }
1112
1113         if (sm->proto == WPA_PROTO_WPA &&
1114             ie->rsn_ie && sm->ap_rsn_ie == NULL && sm->rsn_enabled) {
1115                 wpa_report_ie_mismatch(sm, "Possible downgrade attack "
1116                                        "detected - RSN was enabled and RSN IE "
1117                                        "was in msg 3/4, but not in "
1118                                        "Beacon/ProbeResp",
1119                                        src_addr, ie->wpa_ie, ie->wpa_ie_len,
1120                                        ie->rsn_ie, ie->rsn_ie_len);
1121                 return -1;
1122         }
1123
1124 #ifdef CONFIG_IEEE80211R
1125         if (wpa_key_mgmt_ft(sm->key_mgmt) &&
1126             wpa_supplicant_validate_ie_ft(sm, src_addr, ie) < 0)
1127                 return -1;
1128 #endif /* CONFIG_IEEE80211R */
1129
1130         return 0;
1131 }
1132
1133
1134 /**
1135  * wpa_supplicant_send_4_of_4 - Send message 4 of WPA/RSN 4-Way Handshake
1136  * @sm: Pointer to WPA state machine data from wpa_sm_init()
1137  * @dst: Destination address for the frame
1138  * @key: Pointer to the EAPOL-Key frame header
1139  * @ver: Version bits from EAPOL-Key Key Info
1140  * @key_info: Key Info
1141  * @ptk: PTK to use for keyed hash and encryption
1142  * Returns: >= 0 on success, < 0 on failure
1143  */
1144 int wpa_supplicant_send_4_of_4(struct wpa_sm *sm, const unsigned char *dst,
1145                                const struct wpa_eapol_key *key,
1146                                u16 ver, u16 key_info,
1147                                struct wpa_ptk *ptk)
1148 {
1149         size_t mic_len, hdrlen, rlen;
1150         struct wpa_eapol_key *reply;
1151         struct wpa_eapol_key_192 *reply192;
1152         u8 *rbuf, *key_mic;
1153
1154         mic_len = wpa_mic_len(sm->key_mgmt);
1155         hdrlen = mic_len == 24 ? sizeof(*reply192) : sizeof(*reply);
1156         rbuf = wpa_sm_alloc_eapol(sm, IEEE802_1X_TYPE_EAPOL_KEY, NULL,
1157                                   hdrlen, &rlen, (void *) &reply);
1158         if (rbuf == NULL)
1159                 return -1;
1160         reply192 = (struct wpa_eapol_key_192 *) reply;
1161
1162         reply->type = (sm->proto == WPA_PROTO_RSN ||
1163                        sm->proto == WPA_PROTO_OSEN) ?
1164                 EAPOL_KEY_TYPE_RSN : EAPOL_KEY_TYPE_WPA;
1165         key_info &= WPA_KEY_INFO_SECURE;
1166         key_info |= ver | WPA_KEY_INFO_KEY_TYPE | WPA_KEY_INFO_MIC;
1167         WPA_PUT_BE16(reply->key_info, key_info);
1168         if (sm->proto == WPA_PROTO_RSN || sm->proto == WPA_PROTO_OSEN)
1169                 WPA_PUT_BE16(reply->key_length, 0);
1170         else
1171                 os_memcpy(reply->key_length, key->key_length, 2);
1172         os_memcpy(reply->replay_counter, key->replay_counter,
1173                   WPA_REPLAY_COUNTER_LEN);
1174
1175         key_mic = reply192->key_mic; /* same offset for reply and reply192 */
1176         if (mic_len == 24)
1177                 WPA_PUT_BE16(reply192->key_data_length, 0);
1178         else
1179                 WPA_PUT_BE16(reply->key_data_length, 0);
1180
1181         wpa_dbg(sm->ctx->msg_ctx, MSG_DEBUG, "WPA: Sending EAPOL-Key 4/4");
1182         return wpa_eapol_key_send(sm, ptk->kck, ptk->kck_len, ver, dst,
1183                                   ETH_P_EAPOL, rbuf, rlen, key_mic);
1184 }
1185
1186
1187 static void wpa_supplicant_process_3_of_4(struct wpa_sm *sm,
1188                                           const struct wpa_eapol_key *key,
1189                                           u16 ver, const u8 *key_data,
1190                                           size_t key_data_len)
1191 {
1192         u16 key_info, keylen;
1193         struct wpa_eapol_ie_parse ie;
1194
1195         wpa_sm_set_state(sm, WPA_4WAY_HANDSHAKE);
1196         wpa_dbg(sm->ctx->msg_ctx, MSG_DEBUG, "WPA: RX message 3 of 4-Way "
1197                 "Handshake from " MACSTR " (ver=%d)", MAC2STR(sm->bssid), ver);
1198
1199         key_info = WPA_GET_BE16(key->key_info);
1200
1201         wpa_hexdump(MSG_DEBUG, "WPA: IE KeyData", key_data, key_data_len);
1202         if (wpa_supplicant_parse_ies(key_data, key_data_len, &ie) < 0)
1203                 goto failed;
1204         if (ie.gtk && !(key_info & WPA_KEY_INFO_ENCR_KEY_DATA)) {
1205                 wpa_msg(sm->ctx->msg_ctx, MSG_WARNING,
1206                         "WPA: GTK IE in unencrypted key data");
1207                 goto failed;
1208         }
1209 #ifdef CONFIG_IEEE80211W
1210         if (ie.igtk && !(key_info & WPA_KEY_INFO_ENCR_KEY_DATA)) {
1211                 wpa_msg(sm->ctx->msg_ctx, MSG_WARNING,
1212                         "WPA: IGTK KDE in unencrypted key data");
1213                 goto failed;
1214         }
1215
1216         if (ie.igtk &&
1217             wpa_cipher_valid_mgmt_group(sm->mgmt_group_cipher) &&
1218             ie.igtk_len != WPA_IGTK_KDE_PREFIX_LEN +
1219             (unsigned int) wpa_cipher_key_len(sm->mgmt_group_cipher)) {
1220                 wpa_msg(sm->ctx->msg_ctx, MSG_WARNING,
1221                         "WPA: Invalid IGTK KDE length %lu",
1222                         (unsigned long) ie.igtk_len);
1223                 goto failed;
1224         }
1225 #endif /* CONFIG_IEEE80211W */
1226
1227         if (wpa_supplicant_validate_ie(sm, sm->bssid, &ie) < 0)
1228                 goto failed;
1229
1230         if (os_memcmp(sm->anonce, key->key_nonce, WPA_NONCE_LEN) != 0) {
1231                 wpa_msg(sm->ctx->msg_ctx, MSG_WARNING,
1232                         "WPA: ANonce from message 1 of 4-Way Handshake "
1233                         "differs from 3 of 4-Way Handshake - drop packet (src="
1234                         MACSTR ")", MAC2STR(sm->bssid));
1235                 goto failed;
1236         }
1237
1238         keylen = WPA_GET_BE16(key->key_length);
1239         if (keylen != wpa_cipher_key_len(sm->pairwise_cipher)) {
1240                 wpa_msg(sm->ctx->msg_ctx, MSG_WARNING,
1241                         "WPA: Invalid %s key length %d (src=" MACSTR
1242                         ")", wpa_cipher_txt(sm->pairwise_cipher), keylen,
1243                         MAC2STR(sm->bssid));
1244                 goto failed;
1245         }
1246
1247 #ifdef CONFIG_P2P
1248         if (ie.ip_addr_alloc) {
1249                 os_memcpy(sm->p2p_ip_addr, ie.ip_addr_alloc, 3 * 4);
1250                 wpa_hexdump(MSG_DEBUG, "P2P: IP address info",
1251                             sm->p2p_ip_addr, sizeof(sm->p2p_ip_addr));
1252         }
1253 #endif /* CONFIG_P2P */
1254
1255         if (wpa_supplicant_send_4_of_4(sm, sm->bssid, key, ver, key_info,
1256                                        &sm->ptk) < 0) {
1257                 goto failed;
1258         }
1259
1260         /* SNonce was successfully used in msg 3/4, so mark it to be renewed
1261          * for the next 4-Way Handshake. If msg 3 is received again, the old
1262          * SNonce will still be used to avoid changing PTK. */
1263         sm->renew_snonce = 1;
1264
1265         if (key_info & WPA_KEY_INFO_INSTALL) {
1266                 if (wpa_supplicant_install_ptk(sm, key))
1267                         goto failed;
1268         }
1269
1270         if (key_info & WPA_KEY_INFO_SECURE) {
1271                 wpa_sm_mlme_setprotection(
1272                         sm, sm->bssid, MLME_SETPROTECTION_PROTECT_TYPE_RX,
1273                         MLME_SETPROTECTION_KEY_TYPE_PAIRWISE);
1274                 eapol_sm_notify_portValid(sm->eapol, TRUE);
1275         }
1276         wpa_sm_set_state(sm, WPA_GROUP_HANDSHAKE);
1277
1278         if (sm->group_cipher == WPA_CIPHER_GTK_NOT_USED) {
1279                 wpa_supplicant_key_neg_complete(sm, sm->bssid,
1280                                                 key_info & WPA_KEY_INFO_SECURE);
1281         } else if (ie.gtk &&
1282             wpa_supplicant_pairwise_gtk(sm, key,
1283                                         ie.gtk, ie.gtk_len, key_info) < 0) {
1284                 wpa_msg(sm->ctx->msg_ctx, MSG_INFO,
1285                         "RSN: Failed to configure GTK");
1286                 goto failed;
1287         }
1288
1289         if (ieee80211w_set_keys(sm, &ie) < 0) {
1290                 wpa_msg(sm->ctx->msg_ctx, MSG_INFO,
1291                         "RSN: Failed to configure IGTK");
1292                 goto failed;
1293         }
1294
1295         if (ie.gtk)
1296                 wpa_sm_set_rekey_offload(sm);
1297
1298         if (sm->proto == WPA_PROTO_RSN && wpa_key_mgmt_suite_b(sm->key_mgmt)) {
1299                 struct rsn_pmksa_cache_entry *sa;
1300
1301                 sa = pmksa_cache_add(sm->pmksa, sm->pmk, sm->pmk_len,
1302                                      sm->ptk.kck, sm->ptk.kck_len,
1303                                      sm->bssid, sm->own_addr,
1304                                      sm->network_ctx, sm->key_mgmt);
1305                 if (!sm->cur_pmksa)
1306                         sm->cur_pmksa = sa;
1307         }
1308
1309         sm->msg_3_of_4_ok = 1;
1310         return;
1311
1312 failed:
1313         wpa_sm_deauthenticate(sm, WLAN_REASON_UNSPECIFIED);
1314 }
1315
1316
1317 static int wpa_supplicant_process_1_of_2_rsn(struct wpa_sm *sm,
1318                                              const u8 *keydata,
1319                                              size_t keydatalen,
1320                                              u16 key_info,
1321                                              struct wpa_gtk_data *gd)
1322 {
1323         int maxkeylen;
1324         struct wpa_eapol_ie_parse ie;
1325
1326         wpa_hexdump(MSG_DEBUG, "RSN: msg 1/2 key data", keydata, keydatalen);
1327         if (wpa_supplicant_parse_ies(keydata, keydatalen, &ie) < 0)
1328                 return -1;
1329         if (ie.gtk && !(key_info & WPA_KEY_INFO_ENCR_KEY_DATA)) {
1330                 wpa_msg(sm->ctx->msg_ctx, MSG_WARNING,
1331                         "WPA: GTK IE in unencrypted key data");
1332                 return -1;
1333         }
1334         if (ie.gtk == NULL) {
1335                 wpa_msg(sm->ctx->msg_ctx, MSG_INFO,
1336                         "WPA: No GTK IE in Group Key msg 1/2");
1337                 return -1;
1338         }
1339         maxkeylen = gd->gtk_len = ie.gtk_len - 2;
1340
1341         if (wpa_supplicant_check_group_cipher(sm, sm->group_cipher,
1342                                               gd->gtk_len, maxkeylen,
1343                                               &gd->key_rsc_len, &gd->alg))
1344                 return -1;
1345
1346         wpa_hexdump_key(MSG_DEBUG, "RSN: received GTK in group key handshake",
1347                         ie.gtk, ie.gtk_len);
1348         gd->keyidx = ie.gtk[0] & 0x3;
1349         gd->tx = wpa_supplicant_gtk_tx_bit_workaround(sm,
1350                                                       !!(ie.gtk[0] & BIT(2)));
1351         if (ie.gtk_len - 2 > sizeof(gd->gtk)) {
1352                 wpa_msg(sm->ctx->msg_ctx, MSG_INFO,
1353                         "RSN: Too long GTK in GTK IE (len=%lu)",
1354                         (unsigned long) ie.gtk_len - 2);
1355                 return -1;
1356         }
1357         os_memcpy(gd->gtk, ie.gtk + 2, ie.gtk_len - 2);
1358
1359         if (ieee80211w_set_keys(sm, &ie) < 0)
1360                 wpa_msg(sm->ctx->msg_ctx, MSG_INFO,
1361                         "RSN: Failed to configure IGTK");
1362
1363         return 0;
1364 }
1365
1366
1367 static int wpa_supplicant_process_1_of_2_wpa(struct wpa_sm *sm,
1368                                              const struct wpa_eapol_key *key,
1369                                              const u8 *key_data,
1370                                              size_t key_data_len, u16 key_info,
1371                                              u16 ver, struct wpa_gtk_data *gd)
1372 {
1373         size_t maxkeylen;
1374         u16 gtk_len;
1375
1376         gtk_len = WPA_GET_BE16(key->key_length);
1377         maxkeylen = key_data_len;
1378         if (ver == WPA_KEY_INFO_TYPE_HMAC_SHA1_AES) {
1379                 if (maxkeylen < 8) {
1380                         wpa_msg(sm->ctx->msg_ctx, MSG_INFO,
1381                                 "WPA: Too short maxkeylen (%lu)",
1382                                 (unsigned long) maxkeylen);
1383                         return -1;
1384                 }
1385                 maxkeylen -= 8;
1386         }
1387
1388         if (gtk_len > maxkeylen ||
1389             wpa_supplicant_check_group_cipher(sm, sm->group_cipher,
1390                                               gtk_len, maxkeylen,
1391                                               &gd->key_rsc_len, &gd->alg))
1392                 return -1;
1393
1394         gd->gtk_len = gtk_len;
1395         gd->keyidx = (key_info & WPA_KEY_INFO_KEY_INDEX_MASK) >>
1396                 WPA_KEY_INFO_KEY_INDEX_SHIFT;
1397         if (ver == WPA_KEY_INFO_TYPE_HMAC_MD5_RC4 && sm->ptk.kek_len == 16) {
1398 #ifdef CONFIG_NO_RC4
1399                 wpa_msg(sm->ctx->msg_ctx, MSG_WARNING,
1400                         "WPA: RC4 not supported in the build");
1401                 return -1;
1402 #else /* CONFIG_NO_RC4 */
1403                 u8 ek[32];
1404                 if (key_data_len > sizeof(gd->gtk)) {
1405                         wpa_msg(sm->ctx->msg_ctx, MSG_WARNING,
1406                                 "WPA: RC4 key data too long (%lu)",
1407                                 (unsigned long) key_data_len);
1408                         return -1;
1409                 }
1410                 os_memcpy(ek, key->key_iv, 16);
1411                 os_memcpy(ek + 16, sm->ptk.kek, sm->ptk.kek_len);
1412                 os_memcpy(gd->gtk, key_data, key_data_len);
1413                 if (rc4_skip(ek, 32, 256, gd->gtk, key_data_len)) {
1414                         os_memset(ek, 0, sizeof(ek));
1415                         wpa_msg(sm->ctx->msg_ctx, MSG_ERROR,
1416                                 "WPA: RC4 failed");
1417                         return -1;
1418                 }
1419                 os_memset(ek, 0, sizeof(ek));
1420 #endif /* CONFIG_NO_RC4 */
1421         } else if (ver == WPA_KEY_INFO_TYPE_HMAC_SHA1_AES) {
1422                 if (maxkeylen % 8) {
1423                         wpa_msg(sm->ctx->msg_ctx, MSG_WARNING,
1424                                 "WPA: Unsupported AES-WRAP len %lu",
1425                                 (unsigned long) maxkeylen);
1426                         return -1;
1427                 }
1428                 if (maxkeylen > sizeof(gd->gtk)) {
1429                         wpa_msg(sm->ctx->msg_ctx, MSG_WARNING,
1430                                 "WPA: AES-WRAP key data "
1431                                 "too long (keydatalen=%lu maxkeylen=%lu)",
1432                                 (unsigned long) key_data_len,
1433                                 (unsigned long) maxkeylen);
1434                         return -1;
1435                 }
1436                 if (aes_unwrap(sm->ptk.kek, sm->ptk.kek_len, maxkeylen / 8,
1437                                key_data, gd->gtk)) {
1438                         wpa_msg(sm->ctx->msg_ctx, MSG_WARNING,
1439                                 "WPA: AES unwrap failed - could not decrypt "
1440                                 "GTK");
1441                         return -1;
1442                 }
1443         } else {
1444                 wpa_msg(sm->ctx->msg_ctx, MSG_WARNING,
1445                         "WPA: Unsupported key_info type %d", ver);
1446                 return -1;
1447         }
1448         gd->tx = wpa_supplicant_gtk_tx_bit_workaround(
1449                 sm, !!(key_info & WPA_KEY_INFO_TXRX));
1450         return 0;
1451 }
1452
1453
1454 static int wpa_supplicant_send_2_of_2(struct wpa_sm *sm,
1455                                       const struct wpa_eapol_key *key,
1456                                       int ver, u16 key_info)
1457 {
1458         size_t mic_len, hdrlen, rlen;
1459         struct wpa_eapol_key *reply;
1460         struct wpa_eapol_key_192 *reply192;
1461         u8 *rbuf, *key_mic;
1462
1463         mic_len = wpa_mic_len(sm->key_mgmt);
1464         hdrlen = mic_len == 24 ? sizeof(*reply192) : sizeof(*reply);
1465         rbuf = wpa_sm_alloc_eapol(sm, IEEE802_1X_TYPE_EAPOL_KEY, NULL,
1466                                   hdrlen, &rlen, (void *) &reply);
1467         if (rbuf == NULL)
1468                 return -1;
1469         reply192 = (struct wpa_eapol_key_192 *) reply;
1470
1471         reply->type = (sm->proto == WPA_PROTO_RSN ||
1472                        sm->proto == WPA_PROTO_OSEN) ?
1473                 EAPOL_KEY_TYPE_RSN : EAPOL_KEY_TYPE_WPA;
1474         key_info &= WPA_KEY_INFO_KEY_INDEX_MASK;
1475         key_info |= ver | WPA_KEY_INFO_MIC | WPA_KEY_INFO_SECURE;
1476         WPA_PUT_BE16(reply->key_info, key_info);
1477         if (sm->proto == WPA_PROTO_RSN || sm->proto == WPA_PROTO_OSEN)
1478                 WPA_PUT_BE16(reply->key_length, 0);
1479         else
1480                 os_memcpy(reply->key_length, key->key_length, 2);
1481         os_memcpy(reply->replay_counter, key->replay_counter,
1482                   WPA_REPLAY_COUNTER_LEN);
1483
1484         key_mic = reply192->key_mic; /* same offset for reply and reply192 */
1485         if (mic_len == 24)
1486                 WPA_PUT_BE16(reply192->key_data_length, 0);
1487         else
1488                 WPA_PUT_BE16(reply->key_data_length, 0);
1489
1490         wpa_dbg(sm->ctx->msg_ctx, MSG_DEBUG, "WPA: Sending EAPOL-Key 2/2");
1491         return wpa_eapol_key_send(sm, sm->ptk.kck, sm->ptk.kck_len, ver,
1492                                   sm->bssid, ETH_P_EAPOL, rbuf, rlen, key_mic);
1493 }
1494
1495
1496 static void wpa_supplicant_process_1_of_2(struct wpa_sm *sm,
1497                                           const unsigned char *src_addr,
1498                                           const struct wpa_eapol_key *key,
1499                                           const u8 *key_data,
1500                                           size_t key_data_len, u16 ver)
1501 {
1502         u16 key_info;
1503         int rekey, ret;
1504         struct wpa_gtk_data gd;
1505         const u8 *key_rsc;
1506
1507         if (!sm->msg_3_of_4_ok) {
1508                 wpa_msg(sm->ctx->msg_ctx, MSG_INFO,
1509                         "WPA: Group Key Handshake started prior to completion of 4-way handshake");
1510                 goto failed;
1511         }
1512
1513         os_memset(&gd, 0, sizeof(gd));
1514
1515         rekey = wpa_sm_get_state(sm) == WPA_COMPLETED;
1516         wpa_dbg(sm->ctx->msg_ctx, MSG_DEBUG, "WPA: RX message 1 of Group Key "
1517                 "Handshake from " MACSTR " (ver=%d)", MAC2STR(src_addr), ver);
1518
1519         key_info = WPA_GET_BE16(key->key_info);
1520
1521         if (sm->proto == WPA_PROTO_RSN || sm->proto == WPA_PROTO_OSEN) {
1522                 ret = wpa_supplicant_process_1_of_2_rsn(sm, key_data,
1523                                                         key_data_len, key_info,
1524                                                         &gd);
1525         } else {
1526                 ret = wpa_supplicant_process_1_of_2_wpa(sm, key, key_data,
1527                                                         key_data_len,
1528                                                         key_info, ver, &gd);
1529         }
1530
1531         wpa_sm_set_state(sm, WPA_GROUP_HANDSHAKE);
1532
1533         if (ret)
1534                 goto failed;
1535
1536         key_rsc = key->key_rsc;
1537         if (wpa_supplicant_rsc_relaxation(sm, key->key_rsc))
1538                 key_rsc = null_rsc;
1539
1540         if (wpa_supplicant_install_gtk(sm, &gd, key_rsc) ||
1541             wpa_supplicant_send_2_of_2(sm, key, ver, key_info) < 0)
1542                 goto failed;
1543         os_memset(&gd, 0, sizeof(gd));
1544
1545         if (rekey) {
1546                 wpa_msg(sm->ctx->msg_ctx, MSG_INFO, "WPA: Group rekeying "
1547                         "completed with " MACSTR " [GTK=%s]",
1548                         MAC2STR(sm->bssid), wpa_cipher_txt(sm->group_cipher));
1549                 wpa_sm_cancel_auth_timeout(sm);
1550                 wpa_sm_set_state(sm, WPA_COMPLETED);
1551         } else {
1552                 wpa_supplicant_key_neg_complete(sm, sm->bssid,
1553                                                 key_info &
1554                                                 WPA_KEY_INFO_SECURE);
1555         }
1556
1557         wpa_sm_set_rekey_offload(sm);
1558
1559         return;
1560
1561 failed:
1562         os_memset(&gd, 0, sizeof(gd));
1563         wpa_sm_deauthenticate(sm, WLAN_REASON_UNSPECIFIED);
1564 }
1565
1566
1567 static int wpa_supplicant_verify_eapol_key_mic(struct wpa_sm *sm,
1568                                                struct wpa_eapol_key_192 *key,
1569                                                u16 ver,
1570                                                const u8 *buf, size_t len)
1571 {
1572         u8 mic[WPA_EAPOL_KEY_MIC_MAX_LEN];
1573         int ok = 0;
1574         size_t mic_len = wpa_mic_len(sm->key_mgmt);
1575
1576         os_memcpy(mic, key->key_mic, mic_len);
1577         if (sm->tptk_set) {
1578                 os_memset(key->key_mic, 0, mic_len);
1579                 wpa_eapol_key_mic(sm->tptk.kck, sm->tptk.kck_len, sm->key_mgmt,
1580                                   ver, buf, len, key->key_mic);
1581                 if (os_memcmp_const(mic, key->key_mic, mic_len) != 0) {
1582                         wpa_msg(sm->ctx->msg_ctx, MSG_WARNING,
1583                                 "WPA: Invalid EAPOL-Key MIC "
1584                                 "when using TPTK - ignoring TPTK");
1585                 } else {
1586                         ok = 1;
1587                         sm->tptk_set = 0;
1588                         sm->ptk_set = 1;
1589                         os_memcpy(&sm->ptk, &sm->tptk, sizeof(sm->ptk));
1590                         os_memset(&sm->tptk, 0, sizeof(sm->tptk));
1591                 }
1592         }
1593
1594         if (!ok && sm->ptk_set) {
1595                 os_memset(key->key_mic, 0, mic_len);
1596                 wpa_eapol_key_mic(sm->ptk.kck, sm->ptk.kck_len, sm->key_mgmt,
1597                                   ver, buf, len, key->key_mic);
1598                 if (os_memcmp_const(mic, key->key_mic, mic_len) != 0) {
1599                         wpa_msg(sm->ctx->msg_ctx, MSG_WARNING,
1600                                 "WPA: Invalid EAPOL-Key MIC - "
1601                                 "dropping packet");
1602                         return -1;
1603                 }
1604                 ok = 1;
1605         }
1606
1607         if (!ok) {
1608                 wpa_msg(sm->ctx->msg_ctx, MSG_WARNING,
1609                         "WPA: Could not verify EAPOL-Key MIC - "
1610                         "dropping packet");
1611                 return -1;
1612         }
1613
1614         os_memcpy(sm->rx_replay_counter, key->replay_counter,
1615                   WPA_REPLAY_COUNTER_LEN);
1616         sm->rx_replay_counter_set = 1;
1617         return 0;
1618 }
1619
1620
1621 /* Decrypt RSN EAPOL-Key key data (RC4 or AES-WRAP) */
1622 static int wpa_supplicant_decrypt_key_data(struct wpa_sm *sm,
1623                                            struct wpa_eapol_key *key, u16 ver,
1624                                            u8 *key_data, size_t *key_data_len)
1625 {
1626         wpa_hexdump(MSG_DEBUG, "RSN: encrypted key data",
1627                     key_data, *key_data_len);
1628         if (!sm->ptk_set) {
1629                 wpa_msg(sm->ctx->msg_ctx, MSG_WARNING,
1630                         "WPA: PTK not available, cannot decrypt EAPOL-Key Key "
1631                         "Data");
1632                 return -1;
1633         }
1634
1635         /* Decrypt key data here so that this operation does not need
1636          * to be implemented separately for each message type. */
1637         if (ver == WPA_KEY_INFO_TYPE_HMAC_MD5_RC4 && sm->ptk.kek_len == 16) {
1638 #ifdef CONFIG_NO_RC4
1639                 wpa_msg(sm->ctx->msg_ctx, MSG_WARNING,
1640                         "WPA: RC4 not supported in the build");
1641                 return -1;
1642 #else /* CONFIG_NO_RC4 */
1643                 u8 ek[32];
1644                 os_memcpy(ek, key->key_iv, 16);
1645                 os_memcpy(ek + 16, sm->ptk.kek, sm->ptk.kek_len);
1646                 if (rc4_skip(ek, 32, 256, key_data, *key_data_len)) {
1647                         os_memset(ek, 0, sizeof(ek));
1648                         wpa_msg(sm->ctx->msg_ctx, MSG_ERROR,
1649                                 "WPA: RC4 failed");
1650                         return -1;
1651                 }
1652                 os_memset(ek, 0, sizeof(ek));
1653 #endif /* CONFIG_NO_RC4 */
1654         } else if (ver == WPA_KEY_INFO_TYPE_HMAC_SHA1_AES ||
1655                    ver == WPA_KEY_INFO_TYPE_AES_128_CMAC ||
1656                    sm->key_mgmt == WPA_KEY_MGMT_OSEN ||
1657                    wpa_key_mgmt_suite_b(sm->key_mgmt)) {
1658                 u8 *buf;
1659                 if (*key_data_len < 8 || *key_data_len % 8) {
1660                         wpa_msg(sm->ctx->msg_ctx, MSG_WARNING,
1661                                 "WPA: Unsupported AES-WRAP len %u",
1662                                 (unsigned int) *key_data_len);
1663                         return -1;
1664                 }
1665                 *key_data_len -= 8; /* AES-WRAP adds 8 bytes */
1666                 buf = os_malloc(*key_data_len);
1667                 if (buf == NULL) {
1668                         wpa_msg(sm->ctx->msg_ctx, MSG_WARNING,
1669                                 "WPA: No memory for AES-UNWRAP buffer");
1670                         return -1;
1671                 }
1672                 if (aes_unwrap(sm->ptk.kek, sm->ptk.kek_len, *key_data_len / 8,
1673                                key_data, buf)) {
1674                         os_free(buf);
1675                         wpa_msg(sm->ctx->msg_ctx, MSG_WARNING,
1676                                 "WPA: AES unwrap failed - "
1677                                 "could not decrypt EAPOL-Key key data");
1678                         return -1;
1679                 }
1680                 os_memcpy(key_data, buf, *key_data_len);
1681                 os_free(buf);
1682                 WPA_PUT_BE16(key->key_data_length, *key_data_len);
1683         } else {
1684                 wpa_msg(sm->ctx->msg_ctx, MSG_WARNING,
1685                         "WPA: Unsupported key_info type %d", ver);
1686                 return -1;
1687         }
1688         wpa_hexdump_key(MSG_DEBUG, "WPA: decrypted EAPOL-Key key data",
1689                         key_data, *key_data_len);
1690         return 0;
1691 }
1692
1693
1694 /**
1695  * wpa_sm_aborted_cached - Notify WPA that PMKSA caching was aborted
1696  * @sm: Pointer to WPA state machine data from wpa_sm_init()
1697  */
1698 void wpa_sm_aborted_cached(struct wpa_sm *sm)
1699 {
1700         if (sm && sm->cur_pmksa) {
1701                 wpa_dbg(sm->ctx->msg_ctx, MSG_DEBUG,
1702                         "RSN: Cancelling PMKSA caching attempt");
1703                 sm->cur_pmksa = NULL;
1704         }
1705 }
1706
1707
1708 static void wpa_eapol_key_dump(struct wpa_sm *sm,
1709                                const struct wpa_eapol_key *key,
1710                                unsigned int key_data_len,
1711                                const u8 *mic, unsigned int mic_len)
1712 {
1713 #ifndef CONFIG_NO_STDOUT_DEBUG
1714         u16 key_info = WPA_GET_BE16(key->key_info);
1715
1716         wpa_dbg(sm->ctx->msg_ctx, MSG_DEBUG, "  EAPOL-Key type=%d", key->type);
1717         wpa_dbg(sm->ctx->msg_ctx, MSG_DEBUG,
1718                 "  key_info 0x%x (ver=%d keyidx=%d rsvd=%d %s%s%s%s%s%s%s%s)",
1719                 key_info, key_info & WPA_KEY_INFO_TYPE_MASK,
1720                 (key_info & WPA_KEY_INFO_KEY_INDEX_MASK) >>
1721                 WPA_KEY_INFO_KEY_INDEX_SHIFT,
1722                 (key_info & (BIT(13) | BIT(14) | BIT(15))) >> 13,
1723                 key_info & WPA_KEY_INFO_KEY_TYPE ? "Pairwise" : "Group",
1724                 key_info & WPA_KEY_INFO_INSTALL ? " Install" : "",
1725                 key_info & WPA_KEY_INFO_ACK ? " Ack" : "",
1726                 key_info & WPA_KEY_INFO_MIC ? " MIC" : "",
1727                 key_info & WPA_KEY_INFO_SECURE ? " Secure" : "",
1728                 key_info & WPA_KEY_INFO_ERROR ? " Error" : "",
1729                 key_info & WPA_KEY_INFO_REQUEST ? " Request" : "",
1730                 key_info & WPA_KEY_INFO_ENCR_KEY_DATA ? " Encr" : "");
1731         wpa_dbg(sm->ctx->msg_ctx, MSG_DEBUG,
1732                 "  key_length=%u key_data_length=%u",
1733                 WPA_GET_BE16(key->key_length), key_data_len);
1734         wpa_hexdump(MSG_DEBUG, "  replay_counter",
1735                     key->replay_counter, WPA_REPLAY_COUNTER_LEN);
1736         wpa_hexdump(MSG_DEBUG, "  key_nonce", key->key_nonce, WPA_NONCE_LEN);
1737         wpa_hexdump(MSG_DEBUG, "  key_iv", key->key_iv, 16);
1738         wpa_hexdump(MSG_DEBUG, "  key_rsc", key->key_rsc, 8);
1739         wpa_hexdump(MSG_DEBUG, "  key_id (reserved)", key->key_id, 8);
1740         wpa_hexdump(MSG_DEBUG, "  key_mic", mic, mic_len);
1741 #endif /* CONFIG_NO_STDOUT_DEBUG */
1742 }
1743
1744
1745 /**
1746  * wpa_sm_rx_eapol - Process received WPA EAPOL frames
1747  * @sm: Pointer to WPA state machine data from wpa_sm_init()
1748  * @src_addr: Source MAC address of the EAPOL packet
1749  * @buf: Pointer to the beginning of the EAPOL data (EAPOL header)
1750  * @len: Length of the EAPOL frame
1751  * Returns: 1 = WPA EAPOL-Key processed, 0 = not a WPA EAPOL-Key, -1 failure
1752  *
1753  * This function is called for each received EAPOL frame. Other than EAPOL-Key
1754  * frames can be skipped if filtering is done elsewhere. wpa_sm_rx_eapol() is
1755  * only processing WPA and WPA2 EAPOL-Key frames.
1756  *
1757  * The received EAPOL-Key packets are validated and valid packets are replied
1758  * to. In addition, key material (PTK, GTK) is configured at the end of a
1759  * successful key handshake.
1760  */
1761 int wpa_sm_rx_eapol(struct wpa_sm *sm, const u8 *src_addr,
1762                     const u8 *buf, size_t len)
1763 {
1764         size_t plen, data_len, key_data_len;
1765         const struct ieee802_1x_hdr *hdr;
1766         struct wpa_eapol_key *key;
1767         struct wpa_eapol_key_192 *key192;
1768         u16 key_info, ver;
1769         u8 *tmp = NULL;
1770         int ret = -1;
1771         struct wpa_peerkey *peerkey = NULL;
1772         u8 *key_data;
1773         size_t mic_len, keyhdrlen;
1774
1775 #ifdef CONFIG_IEEE80211R
1776         sm->ft_completed = 0;
1777 #endif /* CONFIG_IEEE80211R */
1778
1779         mic_len = wpa_mic_len(sm->key_mgmt);
1780         keyhdrlen = mic_len == 24 ? sizeof(*key192) : sizeof(*key);
1781
1782         if (len < sizeof(*hdr) + keyhdrlen) {
1783                 wpa_dbg(sm->ctx->msg_ctx, MSG_DEBUG,
1784                         "WPA: EAPOL frame too short to be a WPA "
1785                         "EAPOL-Key (len %lu, expecting at least %lu)",
1786                         (unsigned long) len,
1787                         (unsigned long) sizeof(*hdr) + keyhdrlen);
1788                 return 0;
1789         }
1790
1791         hdr = (const struct ieee802_1x_hdr *) buf;
1792         plen = be_to_host16(hdr->length);
1793         data_len = plen + sizeof(*hdr);
1794         wpa_dbg(sm->ctx->msg_ctx, MSG_DEBUG,
1795                 "IEEE 802.1X RX: version=%d type=%d length=%lu",
1796                 hdr->version, hdr->type, (unsigned long) plen);
1797
1798         if (hdr->version < EAPOL_VERSION) {
1799                 /* TODO: backwards compatibility */
1800         }
1801         if (hdr->type != IEEE802_1X_TYPE_EAPOL_KEY) {
1802                 wpa_dbg(sm->ctx->msg_ctx, MSG_DEBUG,
1803                         "WPA: EAPOL frame (type %u) discarded, "
1804                         "not a Key frame", hdr->type);
1805                 ret = 0;
1806                 goto out;
1807         }
1808         wpa_hexdump(MSG_MSGDUMP, "WPA: RX EAPOL-Key", buf, len);
1809         if (plen > len - sizeof(*hdr) || plen < keyhdrlen) {
1810                 wpa_dbg(sm->ctx->msg_ctx, MSG_DEBUG,
1811                         "WPA: EAPOL frame payload size %lu "
1812                         "invalid (frame size %lu)",
1813                         (unsigned long) plen, (unsigned long) len);
1814                 ret = 0;
1815                 goto out;
1816         }
1817         if (data_len < len) {
1818                 wpa_dbg(sm->ctx->msg_ctx, MSG_DEBUG,
1819                         "WPA: ignoring %lu bytes after the IEEE 802.1X data",
1820                         (unsigned long) len - data_len);
1821         }
1822
1823         /*
1824          * Make a copy of the frame since we need to modify the buffer during
1825          * MAC validation and Key Data decryption.
1826          */
1827         tmp = os_malloc(data_len);
1828         if (tmp == NULL)
1829                 goto out;
1830         os_memcpy(tmp, buf, data_len);
1831         key = (struct wpa_eapol_key *) (tmp + sizeof(struct ieee802_1x_hdr));
1832         key192 = (struct wpa_eapol_key_192 *)
1833                 (tmp + sizeof(struct ieee802_1x_hdr));
1834         if (mic_len == 24)
1835                 key_data = (u8 *) (key192 + 1);
1836         else
1837                 key_data = (u8 *) (key + 1);
1838
1839         if (key->type != EAPOL_KEY_TYPE_WPA && key->type != EAPOL_KEY_TYPE_RSN)
1840         {
1841                 wpa_dbg(sm->ctx->msg_ctx, MSG_DEBUG,
1842                         "WPA: EAPOL-Key type (%d) unknown, discarded",
1843                         key->type);
1844                 ret = 0;
1845                 goto out;
1846         }
1847
1848         if (mic_len == 24)
1849                 key_data_len = WPA_GET_BE16(key192->key_data_length);
1850         else
1851                 key_data_len = WPA_GET_BE16(key->key_data_length);
1852         wpa_eapol_key_dump(sm, key, key_data_len, key192->key_mic, mic_len);
1853
1854         if (key_data_len > plen - keyhdrlen) {
1855                 wpa_msg(sm->ctx->msg_ctx, MSG_INFO, "WPA: Invalid EAPOL-Key "
1856                         "frame - key_data overflow (%u > %u)",
1857                         (unsigned int) key_data_len,
1858                         (unsigned int) (plen - keyhdrlen));
1859                 goto out;
1860         }
1861
1862         eapol_sm_notify_lower_layer_success(sm->eapol, 0);
1863         key_info = WPA_GET_BE16(key->key_info);
1864         ver = key_info & WPA_KEY_INFO_TYPE_MASK;
1865         if (ver != WPA_KEY_INFO_TYPE_HMAC_MD5_RC4 &&
1866 #if defined(CONFIG_IEEE80211R) || defined(CONFIG_IEEE80211W)
1867             ver != WPA_KEY_INFO_TYPE_AES_128_CMAC &&
1868 #endif /* CONFIG_IEEE80211R || CONFIG_IEEE80211W */
1869             ver != WPA_KEY_INFO_TYPE_HMAC_SHA1_AES &&
1870             !wpa_key_mgmt_suite_b(sm->key_mgmt) &&
1871             sm->key_mgmt != WPA_KEY_MGMT_OSEN) {
1872                 wpa_msg(sm->ctx->msg_ctx, MSG_INFO,
1873                         "WPA: Unsupported EAPOL-Key descriptor version %d",
1874                         ver);
1875                 goto out;
1876         }
1877
1878         if (sm->key_mgmt == WPA_KEY_MGMT_OSEN &&
1879             ver != WPA_KEY_INFO_TYPE_AKM_DEFINED) {
1880                 wpa_msg(sm->ctx->msg_ctx, MSG_INFO,
1881                         "OSEN: Unsupported EAPOL-Key descriptor version %d",
1882                         ver);
1883                 goto out;
1884         }
1885
1886         if (wpa_key_mgmt_suite_b(sm->key_mgmt) &&
1887             ver != WPA_KEY_INFO_TYPE_AKM_DEFINED) {
1888                 wpa_msg(sm->ctx->msg_ctx, MSG_INFO,
1889                         "RSN: Unsupported EAPOL-Key descriptor version %d (expected AKM defined = 0)",
1890                         ver);
1891                 goto out;
1892         }
1893
1894 #ifdef CONFIG_IEEE80211R
1895         if (wpa_key_mgmt_ft(sm->key_mgmt)) {
1896                 /* IEEE 802.11r uses a new key_info type (AES-128-CMAC). */
1897                 if (ver != WPA_KEY_INFO_TYPE_AES_128_CMAC) {
1898                         wpa_msg(sm->ctx->msg_ctx, MSG_INFO,
1899                                 "FT: AP did not use AES-128-CMAC");
1900                         goto out;
1901                 }
1902         } else
1903 #endif /* CONFIG_IEEE80211R */
1904 #ifdef CONFIG_IEEE80211W
1905         if (wpa_key_mgmt_sha256(sm->key_mgmt)) {
1906                 if (ver != WPA_KEY_INFO_TYPE_AES_128_CMAC &&
1907                     sm->key_mgmt != WPA_KEY_MGMT_OSEN &&
1908                     !wpa_key_mgmt_suite_b(sm->key_mgmt)) {
1909                         wpa_msg(sm->ctx->msg_ctx, MSG_INFO,
1910                                 "WPA: AP did not use the "
1911                                 "negotiated AES-128-CMAC");
1912                         goto out;
1913                 }
1914         } else
1915 #endif /* CONFIG_IEEE80211W */
1916         if (sm->pairwise_cipher == WPA_CIPHER_CCMP &&
1917             !wpa_key_mgmt_suite_b(sm->key_mgmt) &&
1918             ver != WPA_KEY_INFO_TYPE_HMAC_SHA1_AES) {
1919                 wpa_msg(sm->ctx->msg_ctx, MSG_INFO,
1920                         "WPA: CCMP is used, but EAPOL-Key "
1921                         "descriptor version (%d) is not 2", ver);
1922                 if (sm->group_cipher != WPA_CIPHER_CCMP &&
1923                     !(key_info & WPA_KEY_INFO_KEY_TYPE)) {
1924                         /* Earlier versions of IEEE 802.11i did not explicitly
1925                          * require version 2 descriptor for all EAPOL-Key
1926                          * packets, so allow group keys to use version 1 if
1927                          * CCMP is not used for them. */
1928                         wpa_msg(sm->ctx->msg_ctx, MSG_INFO,
1929                                 "WPA: Backwards compatibility: allow invalid "
1930                                 "version for non-CCMP group keys");
1931                 } else if (ver == WPA_KEY_INFO_TYPE_AES_128_CMAC) {
1932                         wpa_msg(sm->ctx->msg_ctx, MSG_INFO,
1933                                 "WPA: Interoperability workaround: allow incorrect (should have been HMAC-SHA1), but stronger (is AES-128-CMAC), descriptor version to be used");
1934                 } else
1935                         goto out;
1936         } else if (sm->pairwise_cipher == WPA_CIPHER_GCMP &&
1937                    !wpa_key_mgmt_suite_b(sm->key_mgmt) &&
1938                    ver != WPA_KEY_INFO_TYPE_HMAC_SHA1_AES) {
1939                 wpa_msg(sm->ctx->msg_ctx, MSG_INFO,
1940                         "WPA: GCMP is used, but EAPOL-Key "
1941                         "descriptor version (%d) is not 2", ver);
1942                 goto out;
1943         }
1944
1945 #ifdef CONFIG_PEERKEY
1946         for (peerkey = sm->peerkey; peerkey; peerkey = peerkey->next) {
1947                 if (os_memcmp(peerkey->addr, src_addr, ETH_ALEN) == 0)
1948                         break;
1949         }
1950
1951         if (!(key_info & WPA_KEY_INFO_SMK_MESSAGE) && peerkey) {
1952                 if (!peerkey->initiator && peerkey->replay_counter_set &&
1953                     os_memcmp(key->replay_counter, peerkey->replay_counter,
1954                               WPA_REPLAY_COUNTER_LEN) <= 0) {
1955                         wpa_msg(sm->ctx->msg_ctx, MSG_WARNING,
1956                                 "RSN: EAPOL-Key Replay Counter did not "
1957                                 "increase (STK) - dropping packet");
1958                         goto out;
1959                 } else if (peerkey->initiator) {
1960                         u8 _tmp[WPA_REPLAY_COUNTER_LEN];
1961                         os_memcpy(_tmp, key->replay_counter,
1962                                   WPA_REPLAY_COUNTER_LEN);
1963                         inc_byte_array(_tmp, WPA_REPLAY_COUNTER_LEN);
1964                         if (os_memcmp(_tmp, peerkey->replay_counter,
1965                                       WPA_REPLAY_COUNTER_LEN) != 0) {
1966                                 wpa_dbg(sm->ctx->msg_ctx, MSG_DEBUG,
1967                                         "RSN: EAPOL-Key Replay "
1968                                         "Counter did not match (STK) - "
1969                                         "dropping packet");
1970                                 goto out;
1971                         }
1972                 }
1973         }
1974
1975         if (peerkey && peerkey->initiator && (key_info & WPA_KEY_INFO_ACK)) {
1976                 wpa_msg(sm->ctx->msg_ctx, MSG_INFO,
1977                         "RSN: Ack bit in key_info from STK peer");
1978                 goto out;
1979         }
1980 #endif /* CONFIG_PEERKEY */
1981
1982         if (!peerkey && sm->rx_replay_counter_set &&
1983             os_memcmp(key->replay_counter, sm->rx_replay_counter,
1984                       WPA_REPLAY_COUNTER_LEN) <= 0) {
1985                 wpa_msg(sm->ctx->msg_ctx, MSG_WARNING,
1986                         "WPA: EAPOL-Key Replay Counter did not increase - "
1987                         "dropping packet");
1988                 goto out;
1989         }
1990
1991         if (!(key_info & (WPA_KEY_INFO_ACK | WPA_KEY_INFO_SMK_MESSAGE))
1992 #ifdef CONFIG_PEERKEY
1993             && (peerkey == NULL || !peerkey->initiator)
1994 #endif /* CONFIG_PEERKEY */
1995                 ) {
1996                 wpa_msg(sm->ctx->msg_ctx, MSG_INFO,
1997                         "WPA: No Ack bit in key_info");
1998                 goto out;
1999         }
2000
2001         if (key_info & WPA_KEY_INFO_REQUEST) {
2002                 wpa_msg(sm->ctx->msg_ctx, MSG_INFO,
2003                         "WPA: EAPOL-Key with Request bit - dropped");
2004                 goto out;
2005         }
2006
2007         if ((key_info & WPA_KEY_INFO_MIC) && !peerkey &&
2008             wpa_supplicant_verify_eapol_key_mic(sm, key192, ver, tmp, data_len))
2009                 goto out;
2010
2011 #ifdef CONFIG_PEERKEY
2012         if ((key_info & WPA_KEY_INFO_MIC) && peerkey &&
2013             peerkey_verify_eapol_key_mic(sm, peerkey, key192, ver, tmp,
2014                                          data_len))
2015                 goto out;
2016 #endif /* CONFIG_PEERKEY */
2017
2018         if ((sm->proto == WPA_PROTO_RSN || sm->proto == WPA_PROTO_OSEN) &&
2019             (key_info & WPA_KEY_INFO_ENCR_KEY_DATA)) {
2020                 if (wpa_supplicant_decrypt_key_data(sm, key, ver, key_data,
2021                                                     &key_data_len))
2022                         goto out;
2023         }
2024
2025         if (key_info & WPA_KEY_INFO_KEY_TYPE) {
2026                 if (key_info & WPA_KEY_INFO_KEY_INDEX_MASK) {
2027                         wpa_msg(sm->ctx->msg_ctx, MSG_WARNING,
2028                                 "WPA: Ignored EAPOL-Key (Pairwise) with "
2029                                 "non-zero key index");
2030                         goto out;
2031                 }
2032                 if (peerkey) {
2033                         /* PeerKey 4-Way Handshake */
2034                         peerkey_rx_eapol_4way(sm, peerkey, key, key_info, ver,
2035                                               key_data, key_data_len);
2036                 } else if (key_info & WPA_KEY_INFO_MIC) {
2037                         /* 3/4 4-Way Handshake */
2038                         wpa_supplicant_process_3_of_4(sm, key, ver, key_data,
2039                                                       key_data_len);
2040                 } else {
2041                         /* 1/4 4-Way Handshake */
2042                         wpa_supplicant_process_1_of_4(sm, src_addr, key,
2043                                                       ver, key_data,
2044                                                       key_data_len);
2045                 }
2046         } else if (key_info & WPA_KEY_INFO_SMK_MESSAGE) {
2047                 /* PeerKey SMK Handshake */
2048                 peerkey_rx_eapol_smk(sm, src_addr, key, key_data_len, key_info,
2049                                      ver);
2050         } else {
2051                 if (key_info & WPA_KEY_INFO_MIC) {
2052                         /* 1/2 Group Key Handshake */
2053                         wpa_supplicant_process_1_of_2(sm, src_addr, key,
2054                                                       key_data, key_data_len,
2055                                                       ver);
2056                 } else {
2057                         wpa_msg(sm->ctx->msg_ctx, MSG_WARNING,
2058                                 "WPA: EAPOL-Key (Group) without Mic bit - "
2059                                 "dropped");
2060                 }
2061         }
2062
2063         ret = 1;
2064
2065 out:
2066         bin_clear_free(tmp, data_len);
2067         return ret;
2068 }
2069
2070
2071 #ifdef CONFIG_CTRL_IFACE
2072 static u32 wpa_key_mgmt_suite(struct wpa_sm *sm)
2073 {
2074         switch (sm->key_mgmt) {
2075         case WPA_KEY_MGMT_IEEE8021X:
2076                 return ((sm->proto == WPA_PROTO_RSN ||
2077                          sm->proto == WPA_PROTO_OSEN) ?
2078                         RSN_AUTH_KEY_MGMT_UNSPEC_802_1X :
2079                         WPA_AUTH_KEY_MGMT_UNSPEC_802_1X);
2080         case WPA_KEY_MGMT_PSK:
2081                 return (sm->proto == WPA_PROTO_RSN ?
2082                         RSN_AUTH_KEY_MGMT_PSK_OVER_802_1X :
2083                         WPA_AUTH_KEY_MGMT_PSK_OVER_802_1X);
2084 #ifdef CONFIG_IEEE80211R
2085         case WPA_KEY_MGMT_FT_IEEE8021X:
2086                 return RSN_AUTH_KEY_MGMT_FT_802_1X;
2087         case WPA_KEY_MGMT_FT_PSK:
2088                 return RSN_AUTH_KEY_MGMT_FT_PSK;
2089 #endif /* CONFIG_IEEE80211R */
2090 #ifdef CONFIG_IEEE80211W
2091         case WPA_KEY_MGMT_IEEE8021X_SHA256:
2092                 return RSN_AUTH_KEY_MGMT_802_1X_SHA256;
2093         case WPA_KEY_MGMT_PSK_SHA256:
2094                 return RSN_AUTH_KEY_MGMT_PSK_SHA256;
2095 #endif /* CONFIG_IEEE80211W */
2096         case WPA_KEY_MGMT_CCKM:
2097                 return (sm->proto == WPA_PROTO_RSN ?
2098                         RSN_AUTH_KEY_MGMT_CCKM:
2099                         WPA_AUTH_KEY_MGMT_CCKM);
2100         case WPA_KEY_MGMT_WPA_NONE:
2101                 return WPA_AUTH_KEY_MGMT_NONE;
2102         case WPA_KEY_MGMT_IEEE8021X_SUITE_B:
2103                 return RSN_AUTH_KEY_MGMT_802_1X_SUITE_B;
2104         case WPA_KEY_MGMT_IEEE8021X_SUITE_B_192:
2105                 return RSN_AUTH_KEY_MGMT_802_1X_SUITE_B_192;
2106         default:
2107                 return 0;
2108         }
2109 }
2110
2111
2112 #define RSN_SUITE "%02x-%02x-%02x-%d"
2113 #define RSN_SUITE_ARG(s) \
2114 ((s) >> 24) & 0xff, ((s) >> 16) & 0xff, ((s) >> 8) & 0xff, (s) & 0xff
2115
2116 /**
2117  * wpa_sm_get_mib - Dump text list of MIB entries
2118  * @sm: Pointer to WPA state machine data from wpa_sm_init()
2119  * @buf: Buffer for the list
2120  * @buflen: Length of the buffer
2121  * Returns: Number of bytes written to buffer
2122  *
2123  * This function is used fetch dot11 MIB variables.
2124  */
2125 int wpa_sm_get_mib(struct wpa_sm *sm, char *buf, size_t buflen)
2126 {
2127         char pmkid_txt[PMKID_LEN * 2 + 1];
2128         int rsna, ret;
2129         size_t len;
2130
2131         if (sm->cur_pmksa) {
2132                 wpa_snprintf_hex(pmkid_txt, sizeof(pmkid_txt),
2133                                  sm->cur_pmksa->pmkid, PMKID_LEN);
2134         } else
2135                 pmkid_txt[0] = '\0';
2136
2137         if ((wpa_key_mgmt_wpa_psk(sm->key_mgmt) ||
2138              wpa_key_mgmt_wpa_ieee8021x(sm->key_mgmt)) &&
2139             sm->proto == WPA_PROTO_RSN)
2140                 rsna = 1;
2141         else
2142                 rsna = 0;
2143
2144         ret = os_snprintf(buf, buflen,
2145                           "dot11RSNAOptionImplemented=TRUE\n"
2146                           "dot11RSNAPreauthenticationImplemented=TRUE\n"
2147                           "dot11RSNAEnabled=%s\n"
2148                           "dot11RSNAPreauthenticationEnabled=%s\n"
2149                           "dot11RSNAConfigVersion=%d\n"
2150                           "dot11RSNAConfigPairwiseKeysSupported=5\n"
2151                           "dot11RSNAConfigGroupCipherSize=%d\n"
2152                           "dot11RSNAConfigPMKLifetime=%d\n"
2153                           "dot11RSNAConfigPMKReauthThreshold=%d\n"
2154                           "dot11RSNAConfigNumberOfPTKSAReplayCounters=1\n"
2155                           "dot11RSNAConfigSATimeout=%d\n",
2156                           rsna ? "TRUE" : "FALSE",
2157                           rsna ? "TRUE" : "FALSE",
2158                           RSN_VERSION,
2159                           wpa_cipher_key_len(sm->group_cipher) * 8,
2160                           sm->dot11RSNAConfigPMKLifetime,
2161                           sm->dot11RSNAConfigPMKReauthThreshold,
2162                           sm->dot11RSNAConfigSATimeout);
2163         if (os_snprintf_error(buflen, ret))
2164                 return 0;
2165         len = ret;
2166
2167         ret = os_snprintf(
2168                 buf + len, buflen - len,
2169                 "dot11RSNAAuthenticationSuiteSelected=" RSN_SUITE "\n"
2170                 "dot11RSNAPairwiseCipherSelected=" RSN_SUITE "\n"
2171                 "dot11RSNAGroupCipherSelected=" RSN_SUITE "\n"
2172                 "dot11RSNAPMKIDUsed=%s\n"
2173                 "dot11RSNAAuthenticationSuiteRequested=" RSN_SUITE "\n"
2174                 "dot11RSNAPairwiseCipherRequested=" RSN_SUITE "\n"
2175                 "dot11RSNAGroupCipherRequested=" RSN_SUITE "\n"
2176                 "dot11RSNAConfigNumberOfGTKSAReplayCounters=0\n"
2177                 "dot11RSNA4WayHandshakeFailures=%u\n",
2178                 RSN_SUITE_ARG(wpa_key_mgmt_suite(sm)),
2179                 RSN_SUITE_ARG(wpa_cipher_to_suite(sm->proto,
2180                                                   sm->pairwise_cipher)),
2181                 RSN_SUITE_ARG(wpa_cipher_to_suite(sm->proto,
2182                                                   sm->group_cipher)),
2183                 pmkid_txt,
2184                 RSN_SUITE_ARG(wpa_key_mgmt_suite(sm)),
2185                 RSN_SUITE_ARG(wpa_cipher_to_suite(sm->proto,
2186                                                   sm->pairwise_cipher)),
2187                 RSN_SUITE_ARG(wpa_cipher_to_suite(sm->proto,
2188                                                   sm->group_cipher)),
2189                 sm->dot11RSNA4WayHandshakeFailures);
2190         if (!os_snprintf_error(buflen - len, ret))
2191                 len += ret;
2192
2193         return (int) len;
2194 }
2195 #endif /* CONFIG_CTRL_IFACE */
2196
2197
2198 static void wpa_sm_pmksa_free_cb(struct rsn_pmksa_cache_entry *entry,
2199                                  void *ctx, enum pmksa_free_reason reason)
2200 {
2201         struct wpa_sm *sm = ctx;
2202         int deauth = 0;
2203
2204         wpa_dbg(sm->ctx->msg_ctx, MSG_DEBUG, "RSN: PMKSA cache entry free_cb: "
2205                 MACSTR " reason=%d", MAC2STR(entry->aa), reason);
2206
2207         if (sm->cur_pmksa == entry) {
2208                 wpa_dbg(sm->ctx->msg_ctx, MSG_DEBUG,
2209                         "RSN: %s current PMKSA entry",
2210                         reason == PMKSA_REPLACE ? "replaced" : "removed");
2211                 pmksa_cache_clear_current(sm);
2212
2213                 /*
2214                  * If an entry is simply being replaced, there's no need to
2215                  * deauthenticate because it will be immediately re-added.
2216                  * This happens when EAP authentication is completed again
2217                  * (reauth or failed PMKSA caching attempt).
2218                  */
2219                 if (reason != PMKSA_REPLACE)
2220                         deauth = 1;
2221         }
2222
2223         if (reason == PMKSA_EXPIRE &&
2224             (sm->pmk_len == entry->pmk_len &&
2225              os_memcmp(sm->pmk, entry->pmk, sm->pmk_len) == 0)) {
2226                 wpa_dbg(sm->ctx->msg_ctx, MSG_DEBUG,
2227                         "RSN: deauthenticating due to expired PMK");
2228                 pmksa_cache_clear_current(sm);
2229                 deauth = 1;
2230         }
2231
2232         if (deauth) {
2233                 os_memset(sm->pmk, 0, sizeof(sm->pmk));
2234                 wpa_sm_deauthenticate(sm, WLAN_REASON_UNSPECIFIED);
2235         }
2236 }
2237
2238
2239 /**
2240  * wpa_sm_init - Initialize WPA state machine
2241  * @ctx: Context pointer for callbacks; this needs to be an allocated buffer
2242  * Returns: Pointer to the allocated WPA state machine data
2243  *
2244  * This function is used to allocate a new WPA state machine and the returned
2245  * value is passed to all WPA state machine calls.
2246  */
2247 struct wpa_sm * wpa_sm_init(struct wpa_sm_ctx *ctx)
2248 {
2249         struct wpa_sm *sm;
2250
2251         sm = os_zalloc(sizeof(*sm));
2252         if (sm == NULL)
2253                 return NULL;
2254         dl_list_init(&sm->pmksa_candidates);
2255         sm->renew_snonce = 1;
2256         sm->ctx = ctx;
2257
2258         sm->dot11RSNAConfigPMKLifetime = 43200;
2259         sm->dot11RSNAConfigPMKReauthThreshold = 70;
2260         sm->dot11RSNAConfigSATimeout = 60;
2261
2262         sm->pmksa = pmksa_cache_init(wpa_sm_pmksa_free_cb, sm, sm);
2263         if (sm->pmksa == NULL) {
2264                 wpa_msg(sm->ctx->msg_ctx, MSG_ERROR,
2265                         "RSN: PMKSA cache initialization failed");
2266                 os_free(sm);
2267                 return NULL;
2268         }
2269
2270         return sm;
2271 }
2272
2273
2274 /**
2275  * wpa_sm_deinit - Deinitialize WPA state machine
2276  * @sm: Pointer to WPA state machine data from wpa_sm_init()
2277  */
2278 void wpa_sm_deinit(struct wpa_sm *sm)
2279 {
2280         if (sm == NULL)
2281                 return;
2282         pmksa_cache_deinit(sm->pmksa);
2283         eloop_cancel_timeout(wpa_sm_start_preauth, sm, NULL);
2284         eloop_cancel_timeout(wpa_sm_rekey_ptk, sm, NULL);
2285         os_free(sm->assoc_wpa_ie);
2286         os_free(sm->ap_wpa_ie);
2287         os_free(sm->ap_rsn_ie);
2288         wpa_sm_drop_sa(sm);
2289         os_free(sm->ctx);
2290         peerkey_deinit(sm);
2291 #ifdef CONFIG_IEEE80211R
2292         os_free(sm->assoc_resp_ies);
2293 #endif /* CONFIG_IEEE80211R */
2294 #ifdef CONFIG_TESTING_OPTIONS
2295         wpabuf_free(sm->test_assoc_ie);
2296 #endif /* CONFIG_TESTING_OPTIONS */
2297         os_free(sm);
2298 }
2299
2300
2301 /**
2302  * wpa_sm_notify_assoc - Notify WPA state machine about association
2303  * @sm: Pointer to WPA state machine data from wpa_sm_init()
2304  * @bssid: The BSSID of the new association
2305  *
2306  * This function is called to let WPA state machine know that the connection
2307  * was established.
2308  */
2309 void wpa_sm_notify_assoc(struct wpa_sm *sm, const u8 *bssid)
2310 {
2311         int clear_ptk = 1;
2312
2313         if (sm == NULL)
2314                 return;
2315
2316         wpa_dbg(sm->ctx->msg_ctx, MSG_DEBUG,
2317                 "WPA: Association event - clear replay counter");
2318         os_memcpy(sm->bssid, bssid, ETH_ALEN);
2319         os_memset(sm->rx_replay_counter, 0, WPA_REPLAY_COUNTER_LEN);
2320         sm->rx_replay_counter_set = 0;
2321         sm->renew_snonce = 1;
2322         if (os_memcmp(sm->preauth_bssid, bssid, ETH_ALEN) == 0)
2323                 rsn_preauth_deinit(sm);
2324
2325 #ifdef CONFIG_IEEE80211R
2326         if (wpa_ft_is_completed(sm)) {
2327                 /*
2328                  * Clear portValid to kick EAPOL state machine to re-enter
2329                  * AUTHENTICATED state to get the EAPOL port Authorized.
2330                  */
2331                 eapol_sm_notify_portValid(sm->eapol, FALSE);
2332                 wpa_supplicant_key_neg_complete(sm, sm->bssid, 1);
2333
2334                 /* Prepare for the next transition */
2335                 wpa_ft_prepare_auth_request(sm, NULL);
2336
2337                 clear_ptk = 0;
2338         }
2339 #endif /* CONFIG_IEEE80211R */
2340
2341         if (clear_ptk) {
2342                 /*
2343                  * IEEE 802.11, 8.4.10: Delete PTK SA on (re)association if
2344                  * this is not part of a Fast BSS Transition.
2345                  */
2346                 wpa_dbg(sm->ctx->msg_ctx, MSG_DEBUG, "WPA: Clear old PTK");
2347                 sm->ptk_set = 0;
2348                 os_memset(&sm->ptk, 0, sizeof(sm->ptk));
2349                 sm->tptk_set = 0;
2350                 os_memset(&sm->tptk, 0, sizeof(sm->tptk));
2351         }
2352
2353 #ifdef CONFIG_TDLS
2354         wpa_tdls_assoc(sm);
2355 #endif /* CONFIG_TDLS */
2356
2357 #ifdef CONFIG_P2P
2358         os_memset(sm->p2p_ip_addr, 0, sizeof(sm->p2p_ip_addr));
2359 #endif /* CONFIG_P2P */
2360 }
2361
2362
2363 /**
2364  * wpa_sm_notify_disassoc - Notify WPA state machine about disassociation
2365  * @sm: Pointer to WPA state machine data from wpa_sm_init()
2366  *
2367  * This function is called to let WPA state machine know that the connection
2368  * was lost. This will abort any existing pre-authentication session.
2369  */
2370 void wpa_sm_notify_disassoc(struct wpa_sm *sm)
2371 {
2372         eloop_cancel_timeout(wpa_sm_start_preauth, sm, NULL);
2373         eloop_cancel_timeout(wpa_sm_rekey_ptk, sm, NULL);
2374         peerkey_deinit(sm);
2375         rsn_preauth_deinit(sm);
2376         pmksa_cache_clear_current(sm);
2377         if (wpa_sm_get_state(sm) == WPA_4WAY_HANDSHAKE)
2378                 sm->dot11RSNA4WayHandshakeFailures++;
2379 #ifdef CONFIG_TDLS
2380         wpa_tdls_disassoc(sm);
2381 #endif /* CONFIG_TDLS */
2382
2383         /* Keys are not needed in the WPA state machine anymore */
2384         wpa_sm_drop_sa(sm);
2385
2386         sm->msg_3_of_4_ok = 0;
2387 }
2388
2389
2390 /**
2391  * wpa_sm_set_pmk - Set PMK
2392  * @sm: Pointer to WPA state machine data from wpa_sm_init()
2393  * @pmk: The new PMK
2394  * @pmk_len: The length of the new PMK in bytes
2395  * @bssid: AA to add into PMKSA cache or %NULL to not cache the PMK
2396  *
2397  * Configure the PMK for WPA state machine.
2398  */
2399 void wpa_sm_set_pmk(struct wpa_sm *sm, const u8 *pmk, size_t pmk_len,
2400                     const u8 *bssid)
2401 {
2402         if (sm == NULL)
2403                 return;
2404
2405         sm->pmk_len = pmk_len;
2406         os_memcpy(sm->pmk, pmk, pmk_len);
2407
2408 #ifdef CONFIG_IEEE80211R
2409         /* Set XXKey to be PSK for FT key derivation */
2410         sm->xxkey_len = pmk_len;
2411         os_memcpy(sm->xxkey, pmk, pmk_len);
2412 #endif /* CONFIG_IEEE80211R */
2413
2414         if (bssid) {
2415                 pmksa_cache_add(sm->pmksa, pmk, pmk_len, NULL, 0,
2416                                 bssid, sm->own_addr,
2417                                 sm->network_ctx, sm->key_mgmt);
2418         }
2419 }
2420
2421
2422 /**
2423  * wpa_sm_set_pmk_from_pmksa - Set PMK based on the current PMKSA
2424  * @sm: Pointer to WPA state machine data from wpa_sm_init()
2425  *
2426  * Take the PMK from the current PMKSA into use. If no PMKSA is active, the PMK
2427  * will be cleared.
2428  */
2429 void wpa_sm_set_pmk_from_pmksa(struct wpa_sm *sm)
2430 {
2431         if (sm == NULL)
2432                 return;
2433
2434         if (sm->cur_pmksa) {
2435                 sm->pmk_len = sm->cur_pmksa->pmk_len;
2436                 os_memcpy(sm->pmk, sm->cur_pmksa->pmk, sm->pmk_len);
2437         } else {
2438                 sm->pmk_len = PMK_LEN;
2439                 os_memset(sm->pmk, 0, PMK_LEN);
2440         }
2441 }
2442
2443
2444 /**
2445  * wpa_sm_set_fast_reauth - Set fast reauthentication (EAP) enabled/disabled
2446  * @sm: Pointer to WPA state machine data from wpa_sm_init()
2447  * @fast_reauth: Whether fast reauthentication (EAP) is allowed
2448  */
2449 void wpa_sm_set_fast_reauth(struct wpa_sm *sm, int fast_reauth)
2450 {
2451         if (sm)
2452                 sm->fast_reauth = fast_reauth;
2453 }
2454
2455
2456 /**
2457  * wpa_sm_set_scard_ctx - Set context pointer for smartcard callbacks
2458  * @sm: Pointer to WPA state machine data from wpa_sm_init()
2459  * @scard_ctx: Context pointer for smartcard related callback functions
2460  */
2461 void wpa_sm_set_scard_ctx(struct wpa_sm *sm, void *scard_ctx)
2462 {
2463         if (sm == NULL)
2464                 return;
2465         sm->scard_ctx = scard_ctx;
2466         if (sm->preauth_eapol)
2467                 eapol_sm_register_scard_ctx(sm->preauth_eapol, scard_ctx);
2468 }
2469
2470
2471 /**
2472  * wpa_sm_set_config - Notification of current configration change
2473  * @sm: Pointer to WPA state machine data from wpa_sm_init()
2474  * @config: Pointer to current network configuration
2475  *
2476  * Notify WPA state machine that configuration has changed. config will be
2477  * stored as a backpointer to network configuration. This can be %NULL to clear
2478  * the stored pointed.
2479  */
2480 void wpa_sm_set_config(struct wpa_sm *sm, struct rsn_supp_config *config)
2481 {
2482         if (!sm)
2483                 return;
2484
2485         if (config) {
2486                 sm->network_ctx = config->network_ctx;
2487                 sm->peerkey_enabled = config->peerkey_enabled;
2488                 sm->allowed_pairwise_cipher = config->allowed_pairwise_cipher;
2489                 sm->proactive_key_caching = config->proactive_key_caching;
2490                 sm->eap_workaround = config->eap_workaround;
2491                 sm->eap_conf_ctx = config->eap_conf_ctx;
2492                 if (config->ssid) {
2493                         os_memcpy(sm->ssid, config->ssid, config->ssid_len);
2494                         sm->ssid_len = config->ssid_len;
2495                 } else
2496                         sm->ssid_len = 0;
2497                 sm->wpa_ptk_rekey = config->wpa_ptk_rekey;
2498                 sm->p2p = config->p2p;
2499                 sm->wpa_rsc_relaxation = config->wpa_rsc_relaxation;
2500         } else {
2501                 sm->network_ctx = NULL;
2502                 sm->peerkey_enabled = 0;
2503                 sm->allowed_pairwise_cipher = 0;
2504                 sm->proactive_key_caching = 0;
2505                 sm->eap_workaround = 0;
2506                 sm->eap_conf_ctx = NULL;
2507                 sm->ssid_len = 0;
2508                 sm->wpa_ptk_rekey = 0;
2509                 sm->p2p = 0;
2510                 sm->wpa_rsc_relaxation = 0;
2511         }
2512 }
2513
2514
2515 /**
2516  * wpa_sm_set_own_addr - Set own MAC address
2517  * @sm: Pointer to WPA state machine data from wpa_sm_init()
2518  * @addr: Own MAC address
2519  */
2520 void wpa_sm_set_own_addr(struct wpa_sm *sm, const u8 *addr)
2521 {
2522         if (sm)
2523                 os_memcpy(sm->own_addr, addr, ETH_ALEN);
2524 }
2525
2526
2527 /**
2528  * wpa_sm_set_ifname - Set network interface name
2529  * @sm: Pointer to WPA state machine data from wpa_sm_init()
2530  * @ifname: Interface name
2531  * @bridge_ifname: Optional bridge interface name (for pre-auth)
2532  */
2533 void wpa_sm_set_ifname(struct wpa_sm *sm, const char *ifname,
2534                        const char *bridge_ifname)
2535 {
2536         if (sm) {
2537                 sm->ifname = ifname;
2538                 sm->bridge_ifname = bridge_ifname;
2539         }
2540 }
2541
2542
2543 /**
2544  * wpa_sm_set_eapol - Set EAPOL state machine pointer
2545  * @sm: Pointer to WPA state machine data from wpa_sm_init()
2546  * @eapol: Pointer to EAPOL state machine allocated with eapol_sm_init()
2547  */
2548 void wpa_sm_set_eapol(struct wpa_sm *sm, struct eapol_sm *eapol)
2549 {
2550         if (sm)
2551                 sm->eapol = eapol;
2552 }
2553
2554
2555 /**
2556  * wpa_sm_set_param - Set WPA state machine parameters
2557  * @sm: Pointer to WPA state machine data from wpa_sm_init()
2558  * @param: Parameter field
2559  * @value: Parameter value
2560  * Returns: 0 on success, -1 on failure
2561  */
2562 int wpa_sm_set_param(struct wpa_sm *sm, enum wpa_sm_conf_params param,
2563                      unsigned int value)
2564 {
2565         int ret = 0;
2566
2567         if (sm == NULL)
2568                 return -1;
2569
2570         switch (param) {
2571         case RSNA_PMK_LIFETIME:
2572                 if (value > 0)
2573                         sm->dot11RSNAConfigPMKLifetime = value;
2574                 else
2575                         ret = -1;
2576                 break;
2577         case RSNA_PMK_REAUTH_THRESHOLD:
2578                 if (value > 0 && value <= 100)
2579                         sm->dot11RSNAConfigPMKReauthThreshold = value;
2580                 else
2581                         ret = -1;
2582                 break;
2583         case RSNA_SA_TIMEOUT:
2584                 if (value > 0)
2585                         sm->dot11RSNAConfigSATimeout = value;
2586                 else
2587                         ret = -1;
2588                 break;
2589         case WPA_PARAM_PROTO:
2590                 sm->proto = value;
2591                 break;
2592         case WPA_PARAM_PAIRWISE:
2593                 sm->pairwise_cipher = value;
2594                 break;
2595         case WPA_PARAM_GROUP:
2596                 sm->group_cipher = value;
2597                 break;
2598         case WPA_PARAM_KEY_MGMT:
2599                 sm->key_mgmt = value;
2600                 break;
2601 #ifdef CONFIG_IEEE80211W
2602         case WPA_PARAM_MGMT_GROUP:
2603                 sm->mgmt_group_cipher = value;
2604                 break;
2605 #endif /* CONFIG_IEEE80211W */
2606         case WPA_PARAM_RSN_ENABLED:
2607                 sm->rsn_enabled = value;
2608                 break;
2609         case WPA_PARAM_MFP:
2610                 sm->mfp = value;
2611                 break;
2612         default:
2613                 break;
2614         }
2615
2616         return ret;
2617 }
2618
2619
2620 /**
2621  * wpa_sm_get_status - Get WPA state machine
2622  * @sm: Pointer to WPA state machine data from wpa_sm_init()
2623  * @buf: Buffer for status information
2624  * @buflen: Maximum buffer length
2625  * @verbose: Whether to include verbose status information
2626  * Returns: Number of bytes written to buf.
2627  *
2628  * Query WPA state machine for status information. This function fills in
2629  * a text area with current status information. If the buffer (buf) is not
2630  * large enough, status information will be truncated to fit the buffer.
2631  */
2632 int wpa_sm_get_status(struct wpa_sm *sm, char *buf, size_t buflen,
2633                       int verbose)
2634 {
2635         char *pos = buf, *end = buf + buflen;
2636         int ret;
2637
2638         ret = os_snprintf(pos, end - pos,
2639                           "pairwise_cipher=%s\n"
2640                           "group_cipher=%s\n"
2641                           "key_mgmt=%s\n",
2642                           wpa_cipher_txt(sm->pairwise_cipher),
2643                           wpa_cipher_txt(sm->group_cipher),
2644                           wpa_key_mgmt_txt(sm->key_mgmt, sm->proto));
2645         if (os_snprintf_error(end - pos, ret))
2646                 return pos - buf;
2647         pos += ret;
2648
2649         if (sm->mfp != NO_MGMT_FRAME_PROTECTION && sm->ap_rsn_ie) {
2650                 struct wpa_ie_data rsn;
2651                 if (wpa_parse_wpa_ie_rsn(sm->ap_rsn_ie, sm->ap_rsn_ie_len, &rsn)
2652                     >= 0 &&
2653                     rsn.capabilities & (WPA_CAPABILITY_MFPR |
2654                                         WPA_CAPABILITY_MFPC)) {
2655                         ret = os_snprintf(pos, end - pos, "pmf=%d\n",
2656                                           (rsn.capabilities &
2657                                            WPA_CAPABILITY_MFPR) ? 2 : 1);
2658                         if (os_snprintf_error(end - pos, ret))
2659                                 return pos - buf;
2660                         pos += ret;
2661                 }
2662         }
2663
2664         return pos - buf;
2665 }
2666
2667
2668 int wpa_sm_pmf_enabled(struct wpa_sm *sm)
2669 {
2670         struct wpa_ie_data rsn;
2671
2672         if (sm->mfp == NO_MGMT_FRAME_PROTECTION || !sm->ap_rsn_ie)
2673                 return 0;
2674
2675         if (wpa_parse_wpa_ie_rsn(sm->ap_rsn_ie, sm->ap_rsn_ie_len, &rsn) >= 0 &&
2676             rsn.capabilities & (WPA_CAPABILITY_MFPR | WPA_CAPABILITY_MFPC))
2677                 return 1;
2678
2679         return 0;
2680 }
2681
2682
2683 /**
2684  * wpa_sm_set_assoc_wpa_ie_default - Generate own WPA/RSN IE from configuration
2685  * @sm: Pointer to WPA state machine data from wpa_sm_init()
2686  * @wpa_ie: Pointer to buffer for WPA/RSN IE
2687  * @wpa_ie_len: Pointer to the length of the wpa_ie buffer
2688  * Returns: 0 on success, -1 on failure
2689  */
2690 int wpa_sm_set_assoc_wpa_ie_default(struct wpa_sm *sm, u8 *wpa_ie,
2691                                     size_t *wpa_ie_len)
2692 {
2693         int res;
2694
2695         if (sm == NULL)
2696                 return -1;
2697
2698 #ifdef CONFIG_TESTING_OPTIONS
2699         if (sm->test_assoc_ie) {
2700                 wpa_printf(MSG_DEBUG,
2701                            "TESTING: Replace association WPA/RSN IE");
2702                 if (*wpa_ie_len < wpabuf_len(sm->test_assoc_ie))
2703                         return -1;
2704                 os_memcpy(wpa_ie, wpabuf_head(sm->test_assoc_ie),
2705                           wpabuf_len(sm->test_assoc_ie));
2706                 res = wpabuf_len(sm->test_assoc_ie);
2707         } else
2708 #endif /* CONFIG_TESTING_OPTIONS */
2709         res = wpa_gen_wpa_ie(sm, wpa_ie, *wpa_ie_len);
2710         if (res < 0)
2711                 return -1;
2712         *wpa_ie_len = res;
2713
2714         wpa_hexdump(MSG_DEBUG, "WPA: Set own WPA IE default",
2715                     wpa_ie, *wpa_ie_len);
2716
2717         if (sm->assoc_wpa_ie == NULL) {
2718                 /*
2719                  * Make a copy of the WPA/RSN IE so that 4-Way Handshake gets
2720                  * the correct version of the IE even if PMKSA caching is
2721                  * aborted (which would remove PMKID from IE generation).
2722                  */
2723                 sm->assoc_wpa_ie = os_malloc(*wpa_ie_len);
2724                 if (sm->assoc_wpa_ie == NULL)
2725                         return -1;
2726
2727                 os_memcpy(sm->assoc_wpa_ie, wpa_ie, *wpa_ie_len);
2728                 sm->assoc_wpa_ie_len = *wpa_ie_len;
2729         }
2730
2731         return 0;
2732 }
2733
2734
2735 /**
2736  * wpa_sm_set_assoc_wpa_ie - Set own WPA/RSN IE from (Re)AssocReq
2737  * @sm: Pointer to WPA state machine data from wpa_sm_init()
2738  * @ie: Pointer to IE data (starting from id)
2739  * @len: IE length
2740  * Returns: 0 on success, -1 on failure
2741  *
2742  * Inform WPA state machine about the WPA/RSN IE used in (Re)Association
2743  * Request frame. The IE will be used to override the default value generated
2744  * with wpa_sm_set_assoc_wpa_ie_default().
2745  */
2746 int wpa_sm_set_assoc_wpa_ie(struct wpa_sm *sm, const u8 *ie, size_t len)
2747 {
2748         if (sm == NULL)
2749                 return -1;
2750
2751         os_free(sm->assoc_wpa_ie);
2752         if (ie == NULL || len == 0) {
2753                 wpa_dbg(sm->ctx->msg_ctx, MSG_DEBUG,
2754                         "WPA: clearing own WPA/RSN IE");
2755                 sm->assoc_wpa_ie = NULL;
2756                 sm->assoc_wpa_ie_len = 0;
2757         } else {
2758                 wpa_hexdump(MSG_DEBUG, "WPA: set own WPA/RSN IE", ie, len);
2759                 sm->assoc_wpa_ie = os_malloc(len);
2760                 if (sm->assoc_wpa_ie == NULL)
2761                         return -1;
2762
2763                 os_memcpy(sm->assoc_wpa_ie, ie, len);
2764                 sm->assoc_wpa_ie_len = len;
2765         }
2766
2767         return 0;
2768 }
2769
2770
2771 /**
2772  * wpa_sm_set_ap_wpa_ie - Set AP WPA IE from Beacon/ProbeResp
2773  * @sm: Pointer to WPA state machine data from wpa_sm_init()
2774  * @ie: Pointer to IE data (starting from id)
2775  * @len: IE length
2776  * Returns: 0 on success, -1 on failure
2777  *
2778  * Inform WPA state machine about the WPA IE used in Beacon / Probe Response
2779  * frame.
2780  */
2781 int wpa_sm_set_ap_wpa_ie(struct wpa_sm *sm, const u8 *ie, size_t len)
2782 {
2783         if (sm == NULL)
2784                 return -1;
2785
2786         os_free(sm->ap_wpa_ie);
2787         if (ie == NULL || len == 0) {
2788                 wpa_dbg(sm->ctx->msg_ctx, MSG_DEBUG,
2789                         "WPA: clearing AP WPA IE");
2790                 sm->ap_wpa_ie = NULL;
2791                 sm->ap_wpa_ie_len = 0;
2792         } else {
2793                 wpa_hexdump(MSG_DEBUG, "WPA: set AP WPA IE", ie, len);
2794                 sm->ap_wpa_ie = os_malloc(len);
2795                 if (sm->ap_wpa_ie == NULL)
2796                         return -1;
2797
2798                 os_memcpy(sm->ap_wpa_ie, ie, len);
2799                 sm->ap_wpa_ie_len = len;
2800         }
2801
2802         return 0;
2803 }
2804
2805
2806 /**
2807  * wpa_sm_set_ap_rsn_ie - Set AP RSN IE from Beacon/ProbeResp
2808  * @sm: Pointer to WPA state machine data from wpa_sm_init()
2809  * @ie: Pointer to IE data (starting from id)
2810  * @len: IE length
2811  * Returns: 0 on success, -1 on failure
2812  *
2813  * Inform WPA state machine about the RSN IE used in Beacon / Probe Response
2814  * frame.
2815  */
2816 int wpa_sm_set_ap_rsn_ie(struct wpa_sm *sm, const u8 *ie, size_t len)
2817 {
2818         if (sm == NULL)
2819                 return -1;
2820
2821         os_free(sm->ap_rsn_ie);
2822         if (ie == NULL || len == 0) {
2823                 wpa_dbg(sm->ctx->msg_ctx, MSG_DEBUG,
2824                         "WPA: clearing AP RSN IE");
2825                 sm->ap_rsn_ie = NULL;
2826                 sm->ap_rsn_ie_len = 0;
2827         } else {
2828                 wpa_hexdump(MSG_DEBUG, "WPA: set AP RSN IE", ie, len);
2829                 sm->ap_rsn_ie = os_malloc(len);
2830                 if (sm->ap_rsn_ie == NULL)
2831                         return -1;
2832
2833                 os_memcpy(sm->ap_rsn_ie, ie, len);
2834                 sm->ap_rsn_ie_len = len;
2835         }
2836
2837         return 0;
2838 }
2839
2840
2841 /**
2842  * wpa_sm_parse_own_wpa_ie - Parse own WPA/RSN IE
2843  * @sm: Pointer to WPA state machine data from wpa_sm_init()
2844  * @data: Pointer to data area for parsing results
2845  * Returns: 0 on success, -1 if IE is not known, or -2 on parsing failure
2846  *
2847  * Parse the contents of the own WPA or RSN IE from (Re)AssocReq and write the
2848  * parsed data into data.
2849  */
2850 int wpa_sm_parse_own_wpa_ie(struct wpa_sm *sm, struct wpa_ie_data *data)
2851 {
2852         if (sm == NULL)
2853                 return -1;
2854
2855         if (sm->assoc_wpa_ie == NULL) {
2856                 wpa_dbg(sm->ctx->msg_ctx, MSG_DEBUG,
2857                         "WPA: No WPA/RSN IE available from association info");
2858                 return -1;
2859         }
2860         if (wpa_parse_wpa_ie(sm->assoc_wpa_ie, sm->assoc_wpa_ie_len, data))
2861                 return -2;
2862         return 0;
2863 }
2864
2865
2866 int wpa_sm_pmksa_cache_list(struct wpa_sm *sm, char *buf, size_t len)
2867 {
2868         return pmksa_cache_list(sm->pmksa, buf, len);
2869 }
2870
2871
2872 void wpa_sm_drop_sa(struct wpa_sm *sm)
2873 {
2874         wpa_dbg(sm->ctx->msg_ctx, MSG_DEBUG, "WPA: Clear old PMK and PTK");
2875         sm->ptk_set = 0;
2876         sm->tptk_set = 0;
2877         os_memset(sm->pmk, 0, sizeof(sm->pmk));
2878         os_memset(&sm->ptk, 0, sizeof(sm->ptk));
2879         os_memset(&sm->tptk, 0, sizeof(sm->tptk));
2880 #ifdef CONFIG_IEEE80211R
2881         os_memset(sm->xxkey, 0, sizeof(sm->xxkey));
2882         os_memset(sm->pmk_r0, 0, sizeof(sm->pmk_r0));
2883         os_memset(sm->pmk_r1, 0, sizeof(sm->pmk_r1));
2884 #endif /* CONFIG_IEEE80211R */
2885 }
2886
2887
2888 int wpa_sm_has_ptk(struct wpa_sm *sm)
2889 {
2890         if (sm == NULL)
2891                 return 0;
2892         return sm->ptk_set;
2893 }
2894
2895
2896 void wpa_sm_update_replay_ctr(struct wpa_sm *sm, const u8 *replay_ctr)
2897 {
2898         os_memcpy(sm->rx_replay_counter, replay_ctr, WPA_REPLAY_COUNTER_LEN);
2899 }
2900
2901
2902 void wpa_sm_pmksa_cache_flush(struct wpa_sm *sm, void *network_ctx)
2903 {
2904         pmksa_cache_flush(sm->pmksa, network_ctx, NULL, 0);
2905 }
2906
2907
2908 #ifdef CONFIG_WNM
2909 int wpa_wnmsleep_install_key(struct wpa_sm *sm, u8 subelem_id, u8 *buf)
2910 {
2911         u16 keyinfo;
2912         u8 keylen;  /* plaintext key len */
2913         u8 *key_rsc;
2914
2915         if (subelem_id == WNM_SLEEP_SUBELEM_GTK) {
2916                 struct wpa_gtk_data gd;
2917
2918                 os_memset(&gd, 0, sizeof(gd));
2919                 keylen = wpa_cipher_key_len(sm->group_cipher);
2920                 gd.key_rsc_len = wpa_cipher_rsc_len(sm->group_cipher);
2921                 gd.alg = wpa_cipher_to_alg(sm->group_cipher);
2922                 if (gd.alg == WPA_ALG_NONE) {
2923                         wpa_printf(MSG_DEBUG, "Unsupported group cipher suite");
2924                         return -1;
2925                 }
2926
2927                 key_rsc = buf + 5;
2928                 keyinfo = WPA_GET_LE16(buf + 2);
2929                 gd.gtk_len = keylen;
2930                 if (gd.gtk_len != buf[4]) {
2931                         wpa_printf(MSG_DEBUG, "GTK len mismatch len %d vs %d",
2932                                    gd.gtk_len, buf[4]);
2933                         return -1;
2934                 }
2935                 gd.keyidx = keyinfo & 0x03; /* B0 - B1 */
2936                 gd.tx = wpa_supplicant_gtk_tx_bit_workaround(
2937                          sm, !!(keyinfo & WPA_KEY_INFO_TXRX));
2938
2939                 os_memcpy(gd.gtk, buf + 13, gd.gtk_len);
2940
2941                 wpa_hexdump_key(MSG_DEBUG, "Install GTK (WNM SLEEP)",
2942                                 gd.gtk, gd.gtk_len);
2943                 if (wpa_supplicant_install_gtk(sm, &gd, key_rsc)) {
2944                         os_memset(&gd, 0, sizeof(gd));
2945                         wpa_printf(MSG_DEBUG, "Failed to install the GTK in "
2946                                    "WNM mode");
2947                         return -1;
2948                 }
2949                 os_memset(&gd, 0, sizeof(gd));
2950 #ifdef CONFIG_IEEE80211W
2951         } else if (subelem_id == WNM_SLEEP_SUBELEM_IGTK) {
2952                 struct wpa_igtk_kde igd;
2953                 u16 keyidx;
2954
2955                 os_memset(&igd, 0, sizeof(igd));
2956                 keylen = wpa_cipher_key_len(sm->mgmt_group_cipher);
2957                 os_memcpy(igd.keyid, buf + 2, 2);
2958                 os_memcpy(igd.pn, buf + 4, 6);
2959
2960                 keyidx = WPA_GET_LE16(igd.keyid);
2961                 os_memcpy(igd.igtk, buf + 10, keylen);
2962
2963                 wpa_hexdump_key(MSG_DEBUG, "Install IGTK (WNM SLEEP)",
2964                                 igd.igtk, keylen);
2965                 if (wpa_sm_set_key(sm, wpa_cipher_to_alg(sm->mgmt_group_cipher),
2966                                    broadcast_ether_addr,
2967                                    keyidx, 0, igd.pn, sizeof(igd.pn),
2968                                    igd.igtk, keylen) < 0) {
2969                         wpa_printf(MSG_DEBUG, "Failed to install the IGTK in "
2970                                    "WNM mode");
2971                         os_memset(&igd, 0, sizeof(igd));
2972                         return -1;
2973                 }
2974                 os_memset(&igd, 0, sizeof(igd));
2975 #endif /* CONFIG_IEEE80211W */
2976         } else {
2977                 wpa_printf(MSG_DEBUG, "Unknown element id");
2978                 return -1;
2979         }
2980
2981         return 0;
2982 }
2983 #endif /* CONFIG_WNM */
2984
2985
2986 #ifdef CONFIG_PEERKEY
2987 int wpa_sm_rx_eapol_peerkey(struct wpa_sm *sm, const u8 *src_addr,
2988                             const u8 *buf, size_t len)
2989 {
2990         struct wpa_peerkey *peerkey;
2991
2992         for (peerkey = sm->peerkey; peerkey; peerkey = peerkey->next) {
2993                 if (os_memcmp(peerkey->addr, src_addr, ETH_ALEN) == 0)
2994                         break;
2995         }
2996
2997         if (!peerkey)
2998                 return 0;
2999
3000         wpa_sm_rx_eapol(sm, src_addr, buf, len);
3001
3002         return 1;
3003 }
3004 #endif /* CONFIG_PEERKEY */
3005
3006
3007 #ifdef CONFIG_P2P
3008
3009 int wpa_sm_get_p2p_ip_addr(struct wpa_sm *sm, u8 *buf)
3010 {
3011         if (sm == NULL || WPA_GET_BE32(sm->p2p_ip_addr) == 0)
3012                 return -1;
3013         os_memcpy(buf, sm->p2p_ip_addr, 3 * 4);
3014         return 0;
3015 }
3016
3017 #endif /* CONFIG_P2P */
3018
3019
3020 void wpa_sm_set_rx_replay_ctr(struct wpa_sm *sm, const u8 *rx_replay_counter)
3021 {
3022         if (rx_replay_counter == NULL)
3023                 return;
3024
3025         os_memcpy(sm->rx_replay_counter, rx_replay_counter,
3026                   WPA_REPLAY_COUNTER_LEN);
3027         sm->rx_replay_counter_set = 1;
3028         wpa_printf(MSG_DEBUG, "Updated key replay counter");
3029 }
3030
3031
3032 void wpa_sm_set_ptk_kck_kek(struct wpa_sm *sm,
3033                             const u8 *ptk_kck, size_t ptk_kck_len,
3034                             const u8 *ptk_kek, size_t ptk_kek_len)
3035 {
3036         if (ptk_kck && ptk_kck_len <= WPA_KCK_MAX_LEN) {
3037                 os_memcpy(sm->ptk.kck, ptk_kck, ptk_kck_len);
3038                 sm->ptk.kck_len = ptk_kck_len;
3039                 wpa_printf(MSG_DEBUG, "Updated PTK KCK");
3040         }
3041         if (ptk_kek && ptk_kek_len <= WPA_KEK_MAX_LEN) {
3042                 os_memcpy(sm->ptk.kek, ptk_kek, ptk_kek_len);
3043                 sm->ptk.kek_len = ptk_kek_len;
3044                 wpa_printf(MSG_DEBUG, "Updated PTK KEK");
3045         }
3046         sm->ptk_set = 1;
3047 }
3048
3049
3050 #ifdef CONFIG_TESTING_OPTIONS
3051 void wpa_sm_set_test_assoc_ie(struct wpa_sm *sm, struct wpabuf *buf)
3052 {
3053         wpabuf_free(sm->test_assoc_ie);
3054         sm->test_assoc_ie = buf;
3055 }
3056 #endif /* CONFIG_TESTING_OPTIONS */