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