xref: /freebsd/contrib/wpa/src/ap/ieee802_1x.c (revision ef0cb5db0af0d5d5b75b74f8e534fe601b7176d7)
1 /*
2  * hostapd / IEEE 802.1X-2004 Authenticator
3  * Copyright (c) 2002-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 "utils/includes.h"
10 
11 #include "utils/common.h"
12 #include "utils/eloop.h"
13 #include "crypto/md5.h"
14 #include "crypto/crypto.h"
15 #include "crypto/random.h"
16 #include "common/ieee802_11_defs.h"
17 #include "radius/radius.h"
18 #include "radius/radius_client.h"
19 #include "eap_server/eap.h"
20 #include "eap_common/eap_wsc_common.h"
21 #include "eapol_auth/eapol_auth_sm.h"
22 #include "eapol_auth/eapol_auth_sm_i.h"
23 #include "p2p/p2p.h"
24 #include "hostapd.h"
25 #include "accounting.h"
26 #include "sta_info.h"
27 #include "wpa_auth.h"
28 #include "preauth_auth.h"
29 #include "pmksa_cache_auth.h"
30 #include "ap_config.h"
31 #include "ap_drv_ops.h"
32 #include "wps_hostapd.h"
33 #include "hs20.h"
34 #include "ieee802_1x.h"
35 
36 
37 static void ieee802_1x_finished(struct hostapd_data *hapd,
38 				struct sta_info *sta, int success,
39 				int remediation);
40 
41 
42 static void ieee802_1x_send(struct hostapd_data *hapd, struct sta_info *sta,
43 			    u8 type, const u8 *data, size_t datalen)
44 {
45 	u8 *buf;
46 	struct ieee802_1x_hdr *xhdr;
47 	size_t len;
48 	int encrypt = 0;
49 
50 	len = sizeof(*xhdr) + datalen;
51 	buf = os_zalloc(len);
52 	if (buf == NULL) {
53 		wpa_printf(MSG_ERROR, "malloc() failed for "
54 			   "ieee802_1x_send(len=%lu)",
55 			   (unsigned long) len);
56 		return;
57 	}
58 
59 	xhdr = (struct ieee802_1x_hdr *) buf;
60 	xhdr->version = hapd->conf->eapol_version;
61 	xhdr->type = type;
62 	xhdr->length = host_to_be16(datalen);
63 
64 	if (datalen > 0 && data != NULL)
65 		os_memcpy(xhdr + 1, data, datalen);
66 
67 	if (wpa_auth_pairwise_set(sta->wpa_sm))
68 		encrypt = 1;
69 #ifdef CONFIG_TESTING_OPTIONS
70 	if (hapd->ext_eapol_frame_io) {
71 		size_t hex_len = 2 * len + 1;
72 		char *hex = os_malloc(hex_len);
73 
74 		if (hex) {
75 			wpa_snprintf_hex(hex, hex_len, buf, len);
76 			wpa_msg(hapd->msg_ctx, MSG_INFO,
77 				"EAPOL-TX " MACSTR " %s",
78 				MAC2STR(sta->addr), hex);
79 			os_free(hex);
80 		}
81 	} else
82 #endif /* CONFIG_TESTING_OPTIONS */
83 	if (sta->flags & WLAN_STA_PREAUTH) {
84 		rsn_preauth_send(hapd, sta, buf, len);
85 	} else {
86 		hostapd_drv_hapd_send_eapol(
87 			hapd, sta->addr, buf, len,
88 			encrypt, hostapd_sta_flags_to_drv(sta->flags));
89 	}
90 
91 	os_free(buf);
92 }
93 
94 
95 void ieee802_1x_set_sta_authorized(struct hostapd_data *hapd,
96 				   struct sta_info *sta, int authorized)
97 {
98 	int res;
99 
100 	if (sta->flags & WLAN_STA_PREAUTH)
101 		return;
102 
103 	if (authorized) {
104 		ap_sta_set_authorized(hapd, sta, 1);
105 		res = hostapd_set_authorized(hapd, sta, 1);
106 		hostapd_logger(hapd, sta->addr, HOSTAPD_MODULE_IEEE8021X,
107 			       HOSTAPD_LEVEL_DEBUG, "authorizing port");
108 	} else {
109 		ap_sta_set_authorized(hapd, sta, 0);
110 		res = hostapd_set_authorized(hapd, sta, 0);
111 		hostapd_logger(hapd, sta->addr, HOSTAPD_MODULE_IEEE8021X,
112 			       HOSTAPD_LEVEL_DEBUG, "unauthorizing port");
113 	}
114 
115 	if (res && errno != ENOENT) {
116 		wpa_printf(MSG_DEBUG, "Could not set station " MACSTR
117 			   " flags for kernel driver (errno=%d).",
118 			   MAC2STR(sta->addr), errno);
119 	}
120 
121 	if (authorized) {
122 		os_get_reltime(&sta->connected_time);
123 		accounting_sta_start(hapd, sta);
124 	}
125 }
126 
127 
128 static void ieee802_1x_tx_key_one(struct hostapd_data *hapd,
129 				  struct sta_info *sta,
130 				  int idx, int broadcast,
131 				  u8 *key_data, size_t key_len)
132 {
133 	u8 *buf, *ekey;
134 	struct ieee802_1x_hdr *hdr;
135 	struct ieee802_1x_eapol_key *key;
136 	size_t len, ekey_len;
137 	struct eapol_state_machine *sm = sta->eapol_sm;
138 
139 	if (sm == NULL)
140 		return;
141 
142 	len = sizeof(*key) + key_len;
143 	buf = os_zalloc(sizeof(*hdr) + len);
144 	if (buf == NULL)
145 		return;
146 
147 	hdr = (struct ieee802_1x_hdr *) buf;
148 	key = (struct ieee802_1x_eapol_key *) (hdr + 1);
149 	key->type = EAPOL_KEY_TYPE_RC4;
150 	WPA_PUT_BE16(key->key_length, key_len);
151 	wpa_get_ntp_timestamp(key->replay_counter);
152 
153 	if (random_get_bytes(key->key_iv, sizeof(key->key_iv))) {
154 		wpa_printf(MSG_ERROR, "Could not get random numbers");
155 		os_free(buf);
156 		return;
157 	}
158 
159 	key->key_index = idx | (broadcast ? 0 : BIT(7));
160 	if (hapd->conf->eapol_key_index_workaround) {
161 		/* According to some information, WinXP Supplicant seems to
162 		 * interpret bit7 as an indication whether the key is to be
163 		 * activated, so make it possible to enable workaround that
164 		 * sets this bit for all keys. */
165 		key->key_index |= BIT(7);
166 	}
167 
168 	/* Key is encrypted using "Key-IV + MSK[0..31]" as the RC4-key and
169 	 * MSK[32..63] is used to sign the message. */
170 	if (sm->eap_if->eapKeyData == NULL || sm->eap_if->eapKeyDataLen < 64) {
171 		wpa_printf(MSG_ERROR, "No eapKeyData available for encrypting "
172 			   "and signing EAPOL-Key");
173 		os_free(buf);
174 		return;
175 	}
176 	os_memcpy((u8 *) (key + 1), key_data, key_len);
177 	ekey_len = sizeof(key->key_iv) + 32;
178 	ekey = os_malloc(ekey_len);
179 	if (ekey == NULL) {
180 		wpa_printf(MSG_ERROR, "Could not encrypt key");
181 		os_free(buf);
182 		return;
183 	}
184 	os_memcpy(ekey, key->key_iv, sizeof(key->key_iv));
185 	os_memcpy(ekey + sizeof(key->key_iv), sm->eap_if->eapKeyData, 32);
186 	rc4_skip(ekey, ekey_len, 0, (u8 *) (key + 1), key_len);
187 	os_free(ekey);
188 
189 	/* This header is needed here for HMAC-MD5, but it will be regenerated
190 	 * in ieee802_1x_send() */
191 	hdr->version = hapd->conf->eapol_version;
192 	hdr->type = IEEE802_1X_TYPE_EAPOL_KEY;
193 	hdr->length = host_to_be16(len);
194 	hmac_md5(sm->eap_if->eapKeyData + 32, 32, buf, sizeof(*hdr) + len,
195 		 key->key_signature);
196 
197 	wpa_printf(MSG_DEBUG, "IEEE 802.1X: Sending EAPOL-Key to " MACSTR
198 		   " (%s index=%d)", MAC2STR(sm->addr),
199 		   broadcast ? "broadcast" : "unicast", idx);
200 	ieee802_1x_send(hapd, sta, IEEE802_1X_TYPE_EAPOL_KEY, (u8 *) key, len);
201 	if (sta->eapol_sm)
202 		sta->eapol_sm->dot1xAuthEapolFramesTx++;
203 	os_free(buf);
204 }
205 
206 
207 void ieee802_1x_tx_key(struct hostapd_data *hapd, struct sta_info *sta)
208 {
209 	struct eapol_authenticator *eapol = hapd->eapol_auth;
210 	struct eapol_state_machine *sm = sta->eapol_sm;
211 
212 	if (sm == NULL || !sm->eap_if->eapKeyData)
213 		return;
214 
215 	wpa_printf(MSG_DEBUG, "IEEE 802.1X: Sending EAPOL-Key(s) to " MACSTR,
216 		   MAC2STR(sta->addr));
217 
218 #ifndef CONFIG_NO_VLAN
219 	if (sta->vlan_id > 0 && sta->vlan_id <= MAX_VLAN_ID) {
220 		wpa_printf(MSG_ERROR, "Using WEP with vlans is not supported.");
221 		return;
222 	}
223 #endif /* CONFIG_NO_VLAN */
224 
225 	if (eapol->default_wep_key) {
226 		ieee802_1x_tx_key_one(hapd, sta, eapol->default_wep_key_idx, 1,
227 				      eapol->default_wep_key,
228 				      hapd->conf->default_wep_key_len);
229 	}
230 
231 	if (hapd->conf->individual_wep_key_len > 0) {
232 		u8 *ikey;
233 		ikey = os_malloc(hapd->conf->individual_wep_key_len);
234 		if (ikey == NULL ||
235 		    random_get_bytes(ikey, hapd->conf->individual_wep_key_len))
236 		{
237 			wpa_printf(MSG_ERROR, "Could not generate random "
238 				   "individual WEP key.");
239 			os_free(ikey);
240 			return;
241 		}
242 
243 		wpa_hexdump_key(MSG_DEBUG, "Individual WEP key",
244 				ikey, hapd->conf->individual_wep_key_len);
245 
246 		ieee802_1x_tx_key_one(hapd, sta, 0, 0, ikey,
247 				      hapd->conf->individual_wep_key_len);
248 
249 		/* TODO: set encryption in TX callback, i.e., only after STA
250 		 * has ACKed EAPOL-Key frame */
251 		if (hostapd_drv_set_key(hapd->conf->iface, hapd, WPA_ALG_WEP,
252 					sta->addr, 0, 1, NULL, 0, ikey,
253 					hapd->conf->individual_wep_key_len)) {
254 			wpa_printf(MSG_ERROR, "Could not set individual WEP "
255 				   "encryption.");
256 		}
257 
258 		os_free(ikey);
259 	}
260 }
261 
262 
263 const char *radius_mode_txt(struct hostapd_data *hapd)
264 {
265 	switch (hapd->iface->conf->hw_mode) {
266 	case HOSTAPD_MODE_IEEE80211AD:
267 		return "802.11ad";
268 	case HOSTAPD_MODE_IEEE80211A:
269 		return "802.11a";
270 	case HOSTAPD_MODE_IEEE80211G:
271 		return "802.11g";
272 	case HOSTAPD_MODE_IEEE80211B:
273 	default:
274 		return "802.11b";
275 	}
276 }
277 
278 
279 int radius_sta_rate(struct hostapd_data *hapd, struct sta_info *sta)
280 {
281 	int i;
282 	u8 rate = 0;
283 
284 	for (i = 0; i < sta->supported_rates_len; i++)
285 		if ((sta->supported_rates[i] & 0x7f) > rate)
286 			rate = sta->supported_rates[i] & 0x7f;
287 
288 	return rate;
289 }
290 
291 
292 #ifndef CONFIG_NO_RADIUS
293 static void ieee802_1x_learn_identity(struct hostapd_data *hapd,
294 				      struct eapol_state_machine *sm,
295 				      const u8 *eap, size_t len)
296 {
297 	const u8 *identity;
298 	size_t identity_len;
299 	const struct eap_hdr *hdr = (const struct eap_hdr *) eap;
300 
301 	if (len <= sizeof(struct eap_hdr) ||
302 	    (hdr->code == EAP_CODE_RESPONSE &&
303 	     eap[sizeof(struct eap_hdr)] != EAP_TYPE_IDENTITY) ||
304 	    (hdr->code == EAP_CODE_INITIATE &&
305 	     eap[sizeof(struct eap_hdr)] != EAP_ERP_TYPE_REAUTH) ||
306 	    (hdr->code != EAP_CODE_RESPONSE &&
307 	     hdr->code != EAP_CODE_INITIATE))
308 		return;
309 
310 	identity = eap_get_identity(sm->eap, &identity_len);
311 	if (identity == NULL)
312 		return;
313 
314 	/* Save station identity for future RADIUS packets */
315 	os_free(sm->identity);
316 	sm->identity = (u8 *) dup_binstr(identity, identity_len);
317 	if (sm->identity == NULL) {
318 		sm->identity_len = 0;
319 		return;
320 	}
321 
322 	sm->identity_len = identity_len;
323 	hostapd_logger(hapd, sm->addr, HOSTAPD_MODULE_IEEE8021X,
324 		       HOSTAPD_LEVEL_DEBUG, "STA identity '%s'", sm->identity);
325 	sm->dot1xAuthEapolRespIdFramesRx++;
326 }
327 
328 
329 static int add_common_radius_sta_attr_rsn(struct hostapd_data *hapd,
330 					  struct hostapd_radius_attr *req_attr,
331 					  struct sta_info *sta,
332 					  struct radius_msg *msg)
333 {
334 	u32 suite;
335 	int ver, val;
336 
337 	ver = wpa_auth_sta_wpa_version(sta->wpa_sm);
338 	val = wpa_auth_get_pairwise(sta->wpa_sm);
339 	suite = wpa_cipher_to_suite(ver, val);
340 	if (val != -1 &&
341 	    !hostapd_config_get_radius_attr(req_attr,
342 					    RADIUS_ATTR_WLAN_PAIRWISE_CIPHER) &&
343 	    !radius_msg_add_attr_int32(msg, RADIUS_ATTR_WLAN_PAIRWISE_CIPHER,
344 				       suite)) {
345 		wpa_printf(MSG_ERROR, "Could not add WLAN-Pairwise-Cipher");
346 		return -1;
347 	}
348 
349 	suite = wpa_cipher_to_suite((hapd->conf->wpa & 0x2) ?
350 				    WPA_PROTO_RSN : WPA_PROTO_WPA,
351 				    hapd->conf->wpa_group);
352 	if (!hostapd_config_get_radius_attr(req_attr,
353 					    RADIUS_ATTR_WLAN_GROUP_CIPHER) &&
354 	    !radius_msg_add_attr_int32(msg, RADIUS_ATTR_WLAN_GROUP_CIPHER,
355 				       suite)) {
356 		wpa_printf(MSG_ERROR, "Could not add WLAN-Group-Cipher");
357 		return -1;
358 	}
359 
360 	val = wpa_auth_sta_key_mgmt(sta->wpa_sm);
361 	suite = wpa_akm_to_suite(val);
362 	if (val != -1 &&
363 	    !hostapd_config_get_radius_attr(req_attr,
364 					    RADIUS_ATTR_WLAN_AKM_SUITE) &&
365 	    !radius_msg_add_attr_int32(msg, RADIUS_ATTR_WLAN_AKM_SUITE,
366 				       suite)) {
367 		wpa_printf(MSG_ERROR, "Could not add WLAN-AKM-Suite");
368 		return -1;
369 	}
370 
371 #ifdef CONFIG_IEEE80211W
372 	if (hapd->conf->ieee80211w != NO_MGMT_FRAME_PROTECTION) {
373 		suite = wpa_cipher_to_suite(WPA_PROTO_RSN,
374 					    hapd->conf->group_mgmt_cipher);
375 		if (!hostapd_config_get_radius_attr(
376 			    req_attr, RADIUS_ATTR_WLAN_GROUP_MGMT_CIPHER) &&
377 		    !radius_msg_add_attr_int32(
378 			    msg, RADIUS_ATTR_WLAN_GROUP_MGMT_CIPHER, suite)) {
379 			wpa_printf(MSG_ERROR,
380 				   "Could not add WLAN-Group-Mgmt-Cipher");
381 			return -1;
382 		}
383 	}
384 #endif /* CONFIG_IEEE80211W */
385 
386 	return 0;
387 }
388 
389 
390 static int add_common_radius_sta_attr(struct hostapd_data *hapd,
391 				      struct hostapd_radius_attr *req_attr,
392 				      struct sta_info *sta,
393 				      struct radius_msg *msg)
394 {
395 	char buf[128];
396 
397 	if (!hostapd_config_get_radius_attr(req_attr,
398 					    RADIUS_ATTR_NAS_PORT) &&
399 	    !radius_msg_add_attr_int32(msg, RADIUS_ATTR_NAS_PORT, sta->aid)) {
400 		wpa_printf(MSG_ERROR, "Could not add NAS-Port");
401 		return -1;
402 	}
403 
404 	os_snprintf(buf, sizeof(buf), RADIUS_802_1X_ADDR_FORMAT,
405 		    MAC2STR(sta->addr));
406 	buf[sizeof(buf) - 1] = '\0';
407 	if (!radius_msg_add_attr(msg, RADIUS_ATTR_CALLING_STATION_ID,
408 				 (u8 *) buf, os_strlen(buf))) {
409 		wpa_printf(MSG_ERROR, "Could not add Calling-Station-Id");
410 		return -1;
411 	}
412 
413 	if (sta->flags & WLAN_STA_PREAUTH) {
414 		os_strlcpy(buf, "IEEE 802.11i Pre-Authentication",
415 			   sizeof(buf));
416 	} else {
417 		os_snprintf(buf, sizeof(buf), "CONNECT %d%sMbps %s",
418 			    radius_sta_rate(hapd, sta) / 2,
419 			    (radius_sta_rate(hapd, sta) & 1) ? ".5" : "",
420 			    radius_mode_txt(hapd));
421 		buf[sizeof(buf) - 1] = '\0';
422 	}
423 	if (!hostapd_config_get_radius_attr(req_attr,
424 					    RADIUS_ATTR_CONNECT_INFO) &&
425 	    !radius_msg_add_attr(msg, RADIUS_ATTR_CONNECT_INFO,
426 				 (u8 *) buf, os_strlen(buf))) {
427 		wpa_printf(MSG_ERROR, "Could not add Connect-Info");
428 		return -1;
429 	}
430 
431 	if (sta->acct_session_id_hi || sta->acct_session_id_lo) {
432 		os_snprintf(buf, sizeof(buf), "%08X-%08X",
433 			    sta->acct_session_id_hi, sta->acct_session_id_lo);
434 		if (!radius_msg_add_attr(msg, RADIUS_ATTR_ACCT_SESSION_ID,
435 					 (u8 *) buf, os_strlen(buf))) {
436 			wpa_printf(MSG_ERROR, "Could not add Acct-Session-Id");
437 			return -1;
438 		}
439 	}
440 
441 #ifdef CONFIG_IEEE80211R
442 	if (hapd->conf->wpa && wpa_key_mgmt_ft(hapd->conf->wpa_key_mgmt) &&
443 	    sta->wpa_sm &&
444 	    (wpa_key_mgmt_ft(wpa_auth_sta_key_mgmt(sta->wpa_sm)) ||
445 	     sta->auth_alg == WLAN_AUTH_FT) &&
446 	    !hostapd_config_get_radius_attr(req_attr,
447 					    RADIUS_ATTR_MOBILITY_DOMAIN_ID) &&
448 	    !radius_msg_add_attr_int32(msg, RADIUS_ATTR_MOBILITY_DOMAIN_ID,
449 				       WPA_GET_BE16(
450 					       hapd->conf->mobility_domain))) {
451 		wpa_printf(MSG_ERROR, "Could not add Mobility-Domain-Id");
452 		return -1;
453 	}
454 #endif /* CONFIG_IEEE80211R */
455 
456 	if (hapd->conf->wpa && sta->wpa_sm &&
457 	    add_common_radius_sta_attr_rsn(hapd, req_attr, sta, msg) < 0)
458 		return -1;
459 
460 	return 0;
461 }
462 
463 
464 int add_common_radius_attr(struct hostapd_data *hapd,
465 			   struct hostapd_radius_attr *req_attr,
466 			   struct sta_info *sta,
467 			   struct radius_msg *msg)
468 {
469 	char buf[128];
470 	struct hostapd_radius_attr *attr;
471 
472 	if (!hostapd_config_get_radius_attr(req_attr,
473 					    RADIUS_ATTR_NAS_IP_ADDRESS) &&
474 	    hapd->conf->own_ip_addr.af == AF_INET &&
475 	    !radius_msg_add_attr(msg, RADIUS_ATTR_NAS_IP_ADDRESS,
476 				 (u8 *) &hapd->conf->own_ip_addr.u.v4, 4)) {
477 		wpa_printf(MSG_ERROR, "Could not add NAS-IP-Address");
478 		return -1;
479 	}
480 
481 #ifdef CONFIG_IPV6
482 	if (!hostapd_config_get_radius_attr(req_attr,
483 					    RADIUS_ATTR_NAS_IPV6_ADDRESS) &&
484 	    hapd->conf->own_ip_addr.af == AF_INET6 &&
485 	    !radius_msg_add_attr(msg, RADIUS_ATTR_NAS_IPV6_ADDRESS,
486 				 (u8 *) &hapd->conf->own_ip_addr.u.v6, 16)) {
487 		wpa_printf(MSG_ERROR, "Could not add NAS-IPv6-Address");
488 		return -1;
489 	}
490 #endif /* CONFIG_IPV6 */
491 
492 	if (!hostapd_config_get_radius_attr(req_attr,
493 					    RADIUS_ATTR_NAS_IDENTIFIER) &&
494 	    hapd->conf->nas_identifier &&
495 	    !radius_msg_add_attr(msg, RADIUS_ATTR_NAS_IDENTIFIER,
496 				 (u8 *) hapd->conf->nas_identifier,
497 				 os_strlen(hapd->conf->nas_identifier))) {
498 		wpa_printf(MSG_ERROR, "Could not add NAS-Identifier");
499 		return -1;
500 	}
501 
502 	os_snprintf(buf, sizeof(buf), RADIUS_802_1X_ADDR_FORMAT ":%s",
503 		    MAC2STR(hapd->own_addr),
504 		    wpa_ssid_txt(hapd->conf->ssid.ssid,
505 				 hapd->conf->ssid.ssid_len));
506 	buf[sizeof(buf) - 1] = '\0';
507 	if (!hostapd_config_get_radius_attr(req_attr,
508 					    RADIUS_ATTR_CALLED_STATION_ID) &&
509 	    !radius_msg_add_attr(msg, RADIUS_ATTR_CALLED_STATION_ID,
510 				 (u8 *) buf, os_strlen(buf))) {
511 		wpa_printf(MSG_ERROR, "Could not add Called-Station-Id");
512 		return -1;
513 	}
514 
515 	if (!hostapd_config_get_radius_attr(req_attr,
516 					    RADIUS_ATTR_NAS_PORT_TYPE) &&
517 	    !radius_msg_add_attr_int32(msg, RADIUS_ATTR_NAS_PORT_TYPE,
518 				       RADIUS_NAS_PORT_TYPE_IEEE_802_11)) {
519 		wpa_printf(MSG_ERROR, "Could not add NAS-Port-Type");
520 		return -1;
521 	}
522 
523 #ifdef CONFIG_INTERWORKING
524 	if (hapd->conf->interworking &&
525 	    !is_zero_ether_addr(hapd->conf->hessid)) {
526 		os_snprintf(buf, sizeof(buf), RADIUS_802_1X_ADDR_FORMAT,
527 			    MAC2STR(hapd->conf->hessid));
528 		buf[sizeof(buf) - 1] = '\0';
529 		if (!hostapd_config_get_radius_attr(req_attr,
530 						    RADIUS_ATTR_WLAN_HESSID) &&
531 		    !radius_msg_add_attr(msg, RADIUS_ATTR_WLAN_HESSID,
532 					 (u8 *) buf, os_strlen(buf))) {
533 			wpa_printf(MSG_ERROR, "Could not add WLAN-HESSID");
534 			return -1;
535 		}
536 	}
537 #endif /* CONFIG_INTERWORKING */
538 
539 	if (sta && add_common_radius_sta_attr(hapd, req_attr, sta, msg) < 0)
540 		return -1;
541 
542 	for (attr = req_attr; attr; attr = attr->next) {
543 		if (!radius_msg_add_attr(msg, attr->type,
544 					 wpabuf_head(attr->val),
545 					 wpabuf_len(attr->val))) {
546 			wpa_printf(MSG_ERROR, "Could not add RADIUS "
547 				   "attribute");
548 			return -1;
549 		}
550 	}
551 
552 	return 0;
553 }
554 
555 
556 static void ieee802_1x_encapsulate_radius(struct hostapd_data *hapd,
557 					  struct sta_info *sta,
558 					  const u8 *eap, size_t len)
559 {
560 	struct radius_msg *msg;
561 	struct eapol_state_machine *sm = sta->eapol_sm;
562 
563 	if (sm == NULL)
564 		return;
565 
566 	ieee802_1x_learn_identity(hapd, sm, eap, len);
567 
568 	wpa_printf(MSG_DEBUG, "Encapsulating EAP message into a RADIUS "
569 		   "packet");
570 
571 	sm->radius_identifier = radius_client_get_id(hapd->radius);
572 	msg = radius_msg_new(RADIUS_CODE_ACCESS_REQUEST,
573 			     sm->radius_identifier);
574 	if (msg == NULL) {
575 		wpa_printf(MSG_INFO, "Could not create new RADIUS packet");
576 		return;
577 	}
578 
579 	radius_msg_make_authenticator(msg, (u8 *) sta, sizeof(*sta));
580 
581 	if (sm->identity &&
582 	    !radius_msg_add_attr(msg, RADIUS_ATTR_USER_NAME,
583 				 sm->identity, sm->identity_len)) {
584 		wpa_printf(MSG_INFO, "Could not add User-Name");
585 		goto fail;
586 	}
587 
588 	if (add_common_radius_attr(hapd, hapd->conf->radius_auth_req_attr, sta,
589 				   msg) < 0)
590 		goto fail;
591 
592 	/* TODO: should probably check MTU from driver config; 2304 is max for
593 	 * IEEE 802.11, but use 1400 to avoid problems with too large packets
594 	 */
595 	if (!hostapd_config_get_radius_attr(hapd->conf->radius_auth_req_attr,
596 					    RADIUS_ATTR_FRAMED_MTU) &&
597 	    !radius_msg_add_attr_int32(msg, RADIUS_ATTR_FRAMED_MTU, 1400)) {
598 		wpa_printf(MSG_INFO, "Could not add Framed-MTU");
599 		goto fail;
600 	}
601 
602 	if (eap && !radius_msg_add_eap(msg, eap, len)) {
603 		wpa_printf(MSG_INFO, "Could not add EAP-Message");
604 		goto fail;
605 	}
606 
607 	/* State attribute must be copied if and only if this packet is
608 	 * Access-Request reply to the previous Access-Challenge */
609 	if (sm->last_recv_radius &&
610 	    radius_msg_get_hdr(sm->last_recv_radius)->code ==
611 	    RADIUS_CODE_ACCESS_CHALLENGE) {
612 		int res = radius_msg_copy_attr(msg, sm->last_recv_radius,
613 					       RADIUS_ATTR_STATE);
614 		if (res < 0) {
615 			wpa_printf(MSG_INFO, "Could not copy State attribute from previous Access-Challenge");
616 			goto fail;
617 		}
618 		if (res > 0) {
619 			wpa_printf(MSG_DEBUG, "Copied RADIUS State Attribute");
620 		}
621 	}
622 
623 	if (hapd->conf->radius_request_cui) {
624 		const u8 *cui;
625 		size_t cui_len;
626 		/* Add previously learned CUI or nul CUI to request CUI */
627 		if (sm->radius_cui) {
628 			cui = wpabuf_head(sm->radius_cui);
629 			cui_len = wpabuf_len(sm->radius_cui);
630 		} else {
631 			cui = (const u8 *) "\0";
632 			cui_len = 1;
633 		}
634 		if (!radius_msg_add_attr(msg,
635 					 RADIUS_ATTR_CHARGEABLE_USER_IDENTITY,
636 					 cui, cui_len)) {
637 			wpa_printf(MSG_ERROR, "Could not add CUI");
638 			goto fail;
639 		}
640 	}
641 
642 #ifdef CONFIG_HS20
643 	if (hapd->conf->hs20) {
644 		u8 ver = 1; /* Release 2 */
645 		if (!radius_msg_add_wfa(
646 			    msg, RADIUS_VENDOR_ATTR_WFA_HS20_AP_VERSION,
647 			    &ver, 1)) {
648 			wpa_printf(MSG_ERROR, "Could not add HS 2.0 AP "
649 				   "version");
650 			goto fail;
651 		}
652 
653 		if (sta->hs20_ie && wpabuf_len(sta->hs20_ie) > 0) {
654 			const u8 *pos;
655 			u8 buf[3];
656 			u16 id;
657 			pos = wpabuf_head_u8(sta->hs20_ie);
658 			buf[0] = (*pos) >> 4;
659 			if (((*pos) & HS20_PPS_MO_ID_PRESENT) &&
660 			    wpabuf_len(sta->hs20_ie) >= 3)
661 				id = WPA_GET_LE16(pos + 1);
662 			else
663 				id = 0;
664 			WPA_PUT_BE16(buf + 1, id);
665 			if (!radius_msg_add_wfa(
666 				    msg,
667 				    RADIUS_VENDOR_ATTR_WFA_HS20_STA_VERSION,
668 				    buf, sizeof(buf))) {
669 				wpa_printf(MSG_ERROR, "Could not add HS 2.0 "
670 					   "STA version");
671 				goto fail;
672 			}
673 		}
674 	}
675 #endif /* CONFIG_HS20 */
676 
677 	if (radius_client_send(hapd->radius, msg, RADIUS_AUTH, sta->addr) < 0)
678 		goto fail;
679 
680 	return;
681 
682  fail:
683 	radius_msg_free(msg);
684 }
685 #endif /* CONFIG_NO_RADIUS */
686 
687 
688 static void handle_eap_response(struct hostapd_data *hapd,
689 				struct sta_info *sta, struct eap_hdr *eap,
690 				size_t len)
691 {
692 	u8 type, *data;
693 	struct eapol_state_machine *sm = sta->eapol_sm;
694 	if (sm == NULL)
695 		return;
696 
697 	data = (u8 *) (eap + 1);
698 
699 	if (len < sizeof(*eap) + 1) {
700 		wpa_printf(MSG_INFO, "handle_eap_response: too short response data");
701 		return;
702 	}
703 
704 	sm->eap_type_supp = type = data[0];
705 
706 	hostapd_logger(hapd, sm->addr, HOSTAPD_MODULE_IEEE8021X,
707 		       HOSTAPD_LEVEL_DEBUG, "received EAP packet (code=%d "
708 		       "id=%d len=%d) from STA: EAP Response-%s (%d)",
709 		       eap->code, eap->identifier, be_to_host16(eap->length),
710 		       eap_server_get_name(0, type), type);
711 
712 	sm->dot1xAuthEapolRespFramesRx++;
713 
714 	wpabuf_free(sm->eap_if->eapRespData);
715 	sm->eap_if->eapRespData = wpabuf_alloc_copy(eap, len);
716 	sm->eapolEap = TRUE;
717 }
718 
719 
720 static void handle_eap_initiate(struct hostapd_data *hapd,
721 				struct sta_info *sta, struct eap_hdr *eap,
722 				size_t len)
723 {
724 #ifdef CONFIG_ERP
725 	u8 type, *data;
726 	struct eapol_state_machine *sm = sta->eapol_sm;
727 
728 	if (sm == NULL)
729 		return;
730 
731 	if (len < sizeof(*eap) + 1) {
732 		wpa_printf(MSG_INFO,
733 			   "handle_eap_initiate: too short response data");
734 		return;
735 	}
736 
737 	data = (u8 *) (eap + 1);
738 	type = data[0];
739 
740 	hostapd_logger(hapd, sm->addr, HOSTAPD_MODULE_IEEE8021X,
741 		       HOSTAPD_LEVEL_DEBUG, "received EAP packet (code=%d "
742 		       "id=%d len=%d) from STA: EAP Initiate type %u",
743 		       eap->code, eap->identifier, be_to_host16(eap->length),
744 		       type);
745 
746 	wpabuf_free(sm->eap_if->eapRespData);
747 	sm->eap_if->eapRespData = wpabuf_alloc_copy(eap, len);
748 	sm->eapolEap = TRUE;
749 #endif /* CONFIG_ERP */
750 }
751 
752 
753 /* Process incoming EAP packet from Supplicant */
754 static void handle_eap(struct hostapd_data *hapd, struct sta_info *sta,
755 		       u8 *buf, size_t len)
756 {
757 	struct eap_hdr *eap;
758 	u16 eap_len;
759 
760 	if (len < sizeof(*eap)) {
761 		wpa_printf(MSG_INFO, "   too short EAP packet");
762 		return;
763 	}
764 
765 	eap = (struct eap_hdr *) buf;
766 
767 	eap_len = be_to_host16(eap->length);
768 	wpa_printf(MSG_DEBUG, "EAP: code=%d identifier=%d length=%d",
769 		   eap->code, eap->identifier, eap_len);
770 	if (eap_len < sizeof(*eap)) {
771 		wpa_printf(MSG_DEBUG, "   Invalid EAP length");
772 		return;
773 	} else if (eap_len > len) {
774 		wpa_printf(MSG_DEBUG, "   Too short frame to contain this EAP "
775 			   "packet");
776 		return;
777 	} else if (eap_len < len) {
778 		wpa_printf(MSG_DEBUG, "   Ignoring %lu extra bytes after EAP "
779 			   "packet", (unsigned long) len - eap_len);
780 	}
781 
782 	switch (eap->code) {
783 	case EAP_CODE_REQUEST:
784 		wpa_printf(MSG_DEBUG, " (request)");
785 		return;
786 	case EAP_CODE_RESPONSE:
787 		wpa_printf(MSG_DEBUG, " (response)");
788 		handle_eap_response(hapd, sta, eap, eap_len);
789 		break;
790 	case EAP_CODE_SUCCESS:
791 		wpa_printf(MSG_DEBUG, " (success)");
792 		return;
793 	case EAP_CODE_FAILURE:
794 		wpa_printf(MSG_DEBUG, " (failure)");
795 		return;
796 	case EAP_CODE_INITIATE:
797 		wpa_printf(MSG_DEBUG, " (initiate)");
798 		handle_eap_initiate(hapd, sta, eap, eap_len);
799 		break;
800 	case EAP_CODE_FINISH:
801 		wpa_printf(MSG_DEBUG, " (finish)");
802 		break;
803 	default:
804 		wpa_printf(MSG_DEBUG, " (unknown code)");
805 		return;
806 	}
807 }
808 
809 
810 static struct eapol_state_machine *
811 ieee802_1x_alloc_eapol_sm(struct hostapd_data *hapd, struct sta_info *sta)
812 {
813 	int flags = 0;
814 	if (sta->flags & WLAN_STA_PREAUTH)
815 		flags |= EAPOL_SM_PREAUTH;
816 	if (sta->wpa_sm) {
817 		flags |= EAPOL_SM_USES_WPA;
818 		if (wpa_auth_sta_get_pmksa(sta->wpa_sm))
819 			flags |= EAPOL_SM_FROM_PMKSA_CACHE;
820 	}
821 	return eapol_auth_alloc(hapd->eapol_auth, sta->addr, flags,
822 				sta->wps_ie, sta->p2p_ie, sta,
823 				sta->identity, sta->radius_cui);
824 }
825 
826 
827 /**
828  * ieee802_1x_receive - Process the EAPOL frames from the Supplicant
829  * @hapd: hostapd BSS data
830  * @sa: Source address (sender of the EAPOL frame)
831  * @buf: EAPOL frame
832  * @len: Length of buf in octets
833  *
834  * This function is called for each incoming EAPOL frame from the interface
835  */
836 void ieee802_1x_receive(struct hostapd_data *hapd, const u8 *sa, const u8 *buf,
837 			size_t len)
838 {
839 	struct sta_info *sta;
840 	struct ieee802_1x_hdr *hdr;
841 	struct ieee802_1x_eapol_key *key;
842 	u16 datalen;
843 	struct rsn_pmksa_cache_entry *pmksa;
844 	int key_mgmt;
845 
846 	if (!hapd->conf->ieee802_1x && !hapd->conf->wpa && !hapd->conf->osen &&
847 	    !hapd->conf->wps_state)
848 		return;
849 
850 	wpa_printf(MSG_DEBUG, "IEEE 802.1X: %lu bytes from " MACSTR,
851 		   (unsigned long) len, MAC2STR(sa));
852 	sta = ap_get_sta(hapd, sa);
853 	if (!sta || (!(sta->flags & (WLAN_STA_ASSOC | WLAN_STA_PREAUTH)) &&
854 		     !(hapd->iface->drv_flags & WPA_DRIVER_FLAGS_WIRED))) {
855 		wpa_printf(MSG_DEBUG, "IEEE 802.1X data frame from not "
856 			   "associated/Pre-authenticating STA");
857 		return;
858 	}
859 
860 	if (len < sizeof(*hdr)) {
861 		wpa_printf(MSG_INFO, "   too short IEEE 802.1X packet");
862 		return;
863 	}
864 
865 	hdr = (struct ieee802_1x_hdr *) buf;
866 	datalen = be_to_host16(hdr->length);
867 	wpa_printf(MSG_DEBUG, "   IEEE 802.1X: version=%d type=%d length=%d",
868 		   hdr->version, hdr->type, datalen);
869 
870 	if (len - sizeof(*hdr) < datalen) {
871 		wpa_printf(MSG_INFO, "   frame too short for this IEEE 802.1X packet");
872 		if (sta->eapol_sm)
873 			sta->eapol_sm->dot1xAuthEapLengthErrorFramesRx++;
874 		return;
875 	}
876 	if (len - sizeof(*hdr) > datalen) {
877 		wpa_printf(MSG_DEBUG, "   ignoring %lu extra octets after "
878 			   "IEEE 802.1X packet",
879 			   (unsigned long) len - sizeof(*hdr) - datalen);
880 	}
881 
882 	if (sta->eapol_sm) {
883 		sta->eapol_sm->dot1xAuthLastEapolFrameVersion = hdr->version;
884 		sta->eapol_sm->dot1xAuthEapolFramesRx++;
885 	}
886 
887 	key = (struct ieee802_1x_eapol_key *) (hdr + 1);
888 	if (datalen >= sizeof(struct ieee802_1x_eapol_key) &&
889 	    hdr->type == IEEE802_1X_TYPE_EAPOL_KEY &&
890 	    (key->type == EAPOL_KEY_TYPE_WPA ||
891 	     key->type == EAPOL_KEY_TYPE_RSN)) {
892 		wpa_receive(hapd->wpa_auth, sta->wpa_sm, (u8 *) hdr,
893 			    sizeof(*hdr) + datalen);
894 		return;
895 	}
896 
897 	if (!hapd->conf->ieee802_1x && !hapd->conf->osen &&
898 	    !(sta->flags & (WLAN_STA_WPS | WLAN_STA_MAYBE_WPS))) {
899 		wpa_printf(MSG_DEBUG, "IEEE 802.1X: Ignore EAPOL message - "
900 			   "802.1X not enabled and WPS not used");
901 		return;
902 	}
903 
904 	key_mgmt = wpa_auth_sta_key_mgmt(sta->wpa_sm);
905 	if (key_mgmt != -1 && wpa_key_mgmt_wpa_psk(key_mgmt)) {
906 		wpa_printf(MSG_DEBUG, "IEEE 802.1X: Ignore EAPOL message - "
907 			   "STA is using PSK");
908 		return;
909 	}
910 
911 	if (!sta->eapol_sm) {
912 		sta->eapol_sm = ieee802_1x_alloc_eapol_sm(hapd, sta);
913 		if (!sta->eapol_sm)
914 			return;
915 
916 #ifdef CONFIG_WPS
917 		if (!hapd->conf->ieee802_1x && hapd->conf->wps_state) {
918 			u32 wflags = sta->flags & (WLAN_STA_WPS |
919 						   WLAN_STA_WPS2 |
920 						   WLAN_STA_MAYBE_WPS);
921 			if (wflags == WLAN_STA_MAYBE_WPS ||
922 			    wflags == (WLAN_STA_WPS | WLAN_STA_MAYBE_WPS)) {
923 				/*
924 				 * Delay EAPOL frame transmission until a
925 				 * possible WPS STA initiates the handshake
926 				 * with EAPOL-Start. Only allow the wait to be
927 				 * skipped if the STA is known to support WPS
928 				 * 2.0.
929 				 */
930 				wpa_printf(MSG_DEBUG, "WPS: Do not start "
931 					   "EAPOL until EAPOL-Start is "
932 					   "received");
933 				sta->eapol_sm->flags |= EAPOL_SM_WAIT_START;
934 			}
935 		}
936 #endif /* CONFIG_WPS */
937 
938 		sta->eapol_sm->eap_if->portEnabled = TRUE;
939 	}
940 
941 	/* since we support version 1, we can ignore version field and proceed
942 	 * as specified in version 1 standard [IEEE Std 802.1X-2001, 7.5.5] */
943 	/* TODO: actually, we are not version 1 anymore.. However, Version 2
944 	 * does not change frame contents, so should be ok to process frames
945 	 * more or less identically. Some changes might be needed for
946 	 * verification of fields. */
947 
948 	switch (hdr->type) {
949 	case IEEE802_1X_TYPE_EAP_PACKET:
950 		handle_eap(hapd, sta, (u8 *) (hdr + 1), datalen);
951 		break;
952 
953 	case IEEE802_1X_TYPE_EAPOL_START:
954 		hostapd_logger(hapd, sta->addr, HOSTAPD_MODULE_IEEE8021X,
955 			       HOSTAPD_LEVEL_DEBUG, "received EAPOL-Start "
956 			       "from STA");
957 		sta->eapol_sm->flags &= ~EAPOL_SM_WAIT_START;
958 		pmksa = wpa_auth_sta_get_pmksa(sta->wpa_sm);
959 		if (pmksa) {
960 			hostapd_logger(hapd, sta->addr, HOSTAPD_MODULE_WPA,
961 				       HOSTAPD_LEVEL_DEBUG, "cached PMKSA "
962 				       "available - ignore it since "
963 				       "STA sent EAPOL-Start");
964 			wpa_auth_sta_clear_pmksa(sta->wpa_sm, pmksa);
965 		}
966 		sta->eapol_sm->eapolStart = TRUE;
967 		sta->eapol_sm->dot1xAuthEapolStartFramesRx++;
968 		eap_server_clear_identity(sta->eapol_sm->eap);
969 		wpa_auth_sm_event(sta->wpa_sm, WPA_REAUTH_EAPOL);
970 		break;
971 
972 	case IEEE802_1X_TYPE_EAPOL_LOGOFF:
973 		hostapd_logger(hapd, sta->addr, HOSTAPD_MODULE_IEEE8021X,
974 			       HOSTAPD_LEVEL_DEBUG, "received EAPOL-Logoff "
975 			       "from STA");
976 		sta->acct_terminate_cause =
977 			RADIUS_ACCT_TERMINATE_CAUSE_USER_REQUEST;
978 		accounting_sta_stop(hapd, sta);
979 		sta->eapol_sm->eapolLogoff = TRUE;
980 		sta->eapol_sm->dot1xAuthEapolLogoffFramesRx++;
981 		eap_server_clear_identity(sta->eapol_sm->eap);
982 		break;
983 
984 	case IEEE802_1X_TYPE_EAPOL_KEY:
985 		wpa_printf(MSG_DEBUG, "   EAPOL-Key");
986 		if (!ap_sta_is_authorized(sta)) {
987 			wpa_printf(MSG_DEBUG, "   Dropped key data from "
988 				   "unauthorized Supplicant");
989 			break;
990 		}
991 		break;
992 
993 	case IEEE802_1X_TYPE_EAPOL_ENCAPSULATED_ASF_ALERT:
994 		wpa_printf(MSG_DEBUG, "   EAPOL-Encapsulated-ASF-Alert");
995 		/* TODO: implement support for this; show data */
996 		break;
997 
998 	default:
999 		wpa_printf(MSG_DEBUG, "   unknown IEEE 802.1X packet type");
1000 		sta->eapol_sm->dot1xAuthInvalidEapolFramesRx++;
1001 		break;
1002 	}
1003 
1004 	eapol_auth_step(sta->eapol_sm);
1005 }
1006 
1007 
1008 /**
1009  * ieee802_1x_new_station - Start IEEE 802.1X authentication
1010  * @hapd: hostapd BSS data
1011  * @sta: The station
1012  *
1013  * This function is called to start IEEE 802.1X authentication when a new
1014  * station completes IEEE 802.11 association.
1015  */
1016 void ieee802_1x_new_station(struct hostapd_data *hapd, struct sta_info *sta)
1017 {
1018 	struct rsn_pmksa_cache_entry *pmksa;
1019 	int reassoc = 1;
1020 	int force_1x = 0;
1021 	int key_mgmt;
1022 
1023 #ifdef CONFIG_WPS
1024 	if (hapd->conf->wps_state &&
1025 	    ((hapd->conf->wpa && (sta->flags & WLAN_STA_MAYBE_WPS)) ||
1026 	     (sta->flags & WLAN_STA_WPS))) {
1027 		/*
1028 		 * Need to enable IEEE 802.1X/EAPOL state machines for possible
1029 		 * WPS handshake even if IEEE 802.1X/EAPOL is not used for
1030 		 * authentication in this BSS.
1031 		 */
1032 		force_1x = 1;
1033 	}
1034 #endif /* CONFIG_WPS */
1035 
1036 	if (!force_1x && !hapd->conf->ieee802_1x && !hapd->conf->osen) {
1037 		wpa_printf(MSG_DEBUG, "IEEE 802.1X: Ignore STA - "
1038 			   "802.1X not enabled or forced for WPS");
1039 		/*
1040 		 * Clear any possible EAPOL authenticator state to support
1041 		 * reassociation change from WPS to PSK.
1042 		 */
1043 		ieee802_1x_free_station(sta);
1044 		return;
1045 	}
1046 
1047 	key_mgmt = wpa_auth_sta_key_mgmt(sta->wpa_sm);
1048 	if (key_mgmt != -1 && wpa_key_mgmt_wpa_psk(key_mgmt)) {
1049 		wpa_printf(MSG_DEBUG, "IEEE 802.1X: Ignore STA - using PSK");
1050 		/*
1051 		 * Clear any possible EAPOL authenticator state to support
1052 		 * reassociation change from WPA-EAP to PSK.
1053 		 */
1054 		ieee802_1x_free_station(sta);
1055 		return;
1056 	}
1057 
1058 	if (sta->eapol_sm == NULL) {
1059 		hostapd_logger(hapd, sta->addr, HOSTAPD_MODULE_IEEE8021X,
1060 			       HOSTAPD_LEVEL_DEBUG, "start authentication");
1061 		sta->eapol_sm = ieee802_1x_alloc_eapol_sm(hapd, sta);
1062 		if (sta->eapol_sm == NULL) {
1063 			hostapd_logger(hapd, sta->addr,
1064 				       HOSTAPD_MODULE_IEEE8021X,
1065 				       HOSTAPD_LEVEL_INFO,
1066 				       "failed to allocate state machine");
1067 			return;
1068 		}
1069 		reassoc = 0;
1070 	}
1071 
1072 #ifdef CONFIG_WPS
1073 	sta->eapol_sm->flags &= ~EAPOL_SM_WAIT_START;
1074 	if (!hapd->conf->ieee802_1x && hapd->conf->wps_state &&
1075 	    !(sta->flags & WLAN_STA_WPS2)) {
1076 		/*
1077 		 * Delay EAPOL frame transmission until a possible WPS STA
1078 		 * initiates the handshake with EAPOL-Start. Only allow the
1079 		 * wait to be skipped if the STA is known to support WPS 2.0.
1080 		 */
1081 		wpa_printf(MSG_DEBUG, "WPS: Do not start EAPOL until "
1082 			   "EAPOL-Start is received");
1083 		sta->eapol_sm->flags |= EAPOL_SM_WAIT_START;
1084 	}
1085 #endif /* CONFIG_WPS */
1086 
1087 	sta->eapol_sm->eap_if->portEnabled = TRUE;
1088 
1089 #ifdef CONFIG_IEEE80211R
1090 	if (sta->auth_alg == WLAN_AUTH_FT) {
1091 		hostapd_logger(hapd, sta->addr, HOSTAPD_MODULE_IEEE8021X,
1092 			       HOSTAPD_LEVEL_DEBUG,
1093 			       "PMK from FT - skip IEEE 802.1X/EAP");
1094 		/* Setup EAPOL state machines to already authenticated state
1095 		 * because of existing FT information from R0KH. */
1096 		sta->eapol_sm->keyRun = TRUE;
1097 		sta->eapol_sm->eap_if->eapKeyAvailable = TRUE;
1098 		sta->eapol_sm->auth_pae_state = AUTH_PAE_AUTHENTICATING;
1099 		sta->eapol_sm->be_auth_state = BE_AUTH_SUCCESS;
1100 		sta->eapol_sm->authSuccess = TRUE;
1101 		sta->eapol_sm->authFail = FALSE;
1102 		if (sta->eapol_sm->eap)
1103 			eap_sm_notify_cached(sta->eapol_sm->eap);
1104 		/* TODO: get vlan_id from R0KH using RRB message */
1105 		return;
1106 	}
1107 #endif /* CONFIG_IEEE80211R */
1108 
1109 	pmksa = wpa_auth_sta_get_pmksa(sta->wpa_sm);
1110 	if (pmksa) {
1111 		int old_vlanid;
1112 
1113 		hostapd_logger(hapd, sta->addr, HOSTAPD_MODULE_IEEE8021X,
1114 			       HOSTAPD_LEVEL_DEBUG,
1115 			       "PMK from PMKSA cache - skip IEEE 802.1X/EAP");
1116 		/* Setup EAPOL state machines to already authenticated state
1117 		 * because of existing PMKSA information in the cache. */
1118 		sta->eapol_sm->keyRun = TRUE;
1119 		sta->eapol_sm->eap_if->eapKeyAvailable = TRUE;
1120 		sta->eapol_sm->auth_pae_state = AUTH_PAE_AUTHENTICATING;
1121 		sta->eapol_sm->be_auth_state = BE_AUTH_SUCCESS;
1122 		sta->eapol_sm->authSuccess = TRUE;
1123 		sta->eapol_sm->authFail = FALSE;
1124 		if (sta->eapol_sm->eap)
1125 			eap_sm_notify_cached(sta->eapol_sm->eap);
1126 		old_vlanid = sta->vlan_id;
1127 		pmksa_cache_to_eapol_data(pmksa, sta->eapol_sm);
1128 		if (sta->ssid->dynamic_vlan == DYNAMIC_VLAN_DISABLED)
1129 			sta->vlan_id = 0;
1130 		ap_sta_bind_vlan(hapd, sta, old_vlanid);
1131 	} else {
1132 		if (reassoc) {
1133 			/*
1134 			 * Force EAPOL state machines to start
1135 			 * re-authentication without having to wait for the
1136 			 * Supplicant to send EAPOL-Start.
1137 			 */
1138 			sta->eapol_sm->reAuthenticate = TRUE;
1139 		}
1140 		eapol_auth_step(sta->eapol_sm);
1141 	}
1142 }
1143 
1144 
1145 void ieee802_1x_free_station(struct sta_info *sta)
1146 {
1147 	struct eapol_state_machine *sm = sta->eapol_sm;
1148 
1149 	if (sm == NULL)
1150 		return;
1151 
1152 	sta->eapol_sm = NULL;
1153 
1154 #ifndef CONFIG_NO_RADIUS
1155 	radius_msg_free(sm->last_recv_radius);
1156 	radius_free_class(&sm->radius_class);
1157 	wpabuf_free(sm->radius_cui);
1158 #endif /* CONFIG_NO_RADIUS */
1159 
1160 	os_free(sm->identity);
1161 	eapol_auth_free(sm);
1162 }
1163 
1164 
1165 #ifndef CONFIG_NO_RADIUS
1166 static void ieee802_1x_decapsulate_radius(struct hostapd_data *hapd,
1167 					  struct sta_info *sta)
1168 {
1169 	struct wpabuf *eap;
1170 	const struct eap_hdr *hdr;
1171 	int eap_type = -1;
1172 	char buf[64];
1173 	struct radius_msg *msg;
1174 	struct eapol_state_machine *sm = sta->eapol_sm;
1175 
1176 	if (sm == NULL || sm->last_recv_radius == NULL) {
1177 		if (sm)
1178 			sm->eap_if->aaaEapNoReq = TRUE;
1179 		return;
1180 	}
1181 
1182 	msg = sm->last_recv_radius;
1183 
1184 	eap = radius_msg_get_eap(msg);
1185 	if (eap == NULL) {
1186 		/* RFC 3579, Chap. 2.6.3:
1187 		 * RADIUS server SHOULD NOT send Access-Reject/no EAP-Message
1188 		 * attribute */
1189 		hostapd_logger(hapd, sta->addr, HOSTAPD_MODULE_IEEE8021X,
1190 			       HOSTAPD_LEVEL_WARNING, "could not extract "
1191 			       "EAP-Message from RADIUS message");
1192 		sm->eap_if->aaaEapNoReq = TRUE;
1193 		return;
1194 	}
1195 
1196 	if (wpabuf_len(eap) < sizeof(*hdr)) {
1197 		hostapd_logger(hapd, sta->addr, HOSTAPD_MODULE_IEEE8021X,
1198 			       HOSTAPD_LEVEL_WARNING, "too short EAP packet "
1199 			       "received from authentication server");
1200 		wpabuf_free(eap);
1201 		sm->eap_if->aaaEapNoReq = TRUE;
1202 		return;
1203 	}
1204 
1205 	if (wpabuf_len(eap) > sizeof(*hdr))
1206 		eap_type = (wpabuf_head_u8(eap))[sizeof(*hdr)];
1207 
1208 	hdr = wpabuf_head(eap);
1209 	switch (hdr->code) {
1210 	case EAP_CODE_REQUEST:
1211 		if (eap_type >= 0)
1212 			sm->eap_type_authsrv = eap_type;
1213 		os_snprintf(buf, sizeof(buf), "EAP-Request-%s (%d)",
1214 			    eap_server_get_name(0, eap_type), eap_type);
1215 		break;
1216 	case EAP_CODE_RESPONSE:
1217 		os_snprintf(buf, sizeof(buf), "EAP Response-%s (%d)",
1218 			    eap_server_get_name(0, eap_type), eap_type);
1219 		break;
1220 	case EAP_CODE_SUCCESS:
1221 		os_strlcpy(buf, "EAP Success", sizeof(buf));
1222 		break;
1223 	case EAP_CODE_FAILURE:
1224 		os_strlcpy(buf, "EAP Failure", sizeof(buf));
1225 		break;
1226 	default:
1227 		os_strlcpy(buf, "unknown EAP code", sizeof(buf));
1228 		break;
1229 	}
1230 	buf[sizeof(buf) - 1] = '\0';
1231 	hostapd_logger(hapd, sta->addr, HOSTAPD_MODULE_IEEE8021X,
1232 		       HOSTAPD_LEVEL_DEBUG, "decapsulated EAP packet (code=%d "
1233 		       "id=%d len=%d) from RADIUS server: %s",
1234 		       hdr->code, hdr->identifier, be_to_host16(hdr->length),
1235 		       buf);
1236 	sm->eap_if->aaaEapReq = TRUE;
1237 
1238 	wpabuf_free(sm->eap_if->aaaEapReqData);
1239 	sm->eap_if->aaaEapReqData = eap;
1240 }
1241 
1242 
1243 static void ieee802_1x_get_keys(struct hostapd_data *hapd,
1244 				struct sta_info *sta, struct radius_msg *msg,
1245 				struct radius_msg *req,
1246 				const u8 *shared_secret,
1247 				size_t shared_secret_len)
1248 {
1249 	struct radius_ms_mppe_keys *keys;
1250 	struct eapol_state_machine *sm = sta->eapol_sm;
1251 	if (sm == NULL)
1252 		return;
1253 
1254 	keys = radius_msg_get_ms_keys(msg, req, shared_secret,
1255 				      shared_secret_len);
1256 
1257 	if (keys && keys->send && keys->recv) {
1258 		size_t len = keys->send_len + keys->recv_len;
1259 		wpa_hexdump_key(MSG_DEBUG, "MS-MPPE-Send-Key",
1260 				keys->send, keys->send_len);
1261 		wpa_hexdump_key(MSG_DEBUG, "MS-MPPE-Recv-Key",
1262 				keys->recv, keys->recv_len);
1263 
1264 		os_free(sm->eap_if->aaaEapKeyData);
1265 		sm->eap_if->aaaEapKeyData = os_malloc(len);
1266 		if (sm->eap_if->aaaEapKeyData) {
1267 			os_memcpy(sm->eap_if->aaaEapKeyData, keys->recv,
1268 				  keys->recv_len);
1269 			os_memcpy(sm->eap_if->aaaEapKeyData + keys->recv_len,
1270 				  keys->send, keys->send_len);
1271 			sm->eap_if->aaaEapKeyDataLen = len;
1272 			sm->eap_if->aaaEapKeyAvailable = TRUE;
1273 		}
1274 	} else {
1275 		wpa_printf(MSG_DEBUG,
1276 			   "MS-MPPE: 1x_get_keys, could not get keys: %p  send: %p  recv: %p",
1277 			   keys, keys ? keys->send : NULL,
1278 			   keys ? keys->recv : NULL);
1279 	}
1280 
1281 	if (keys) {
1282 		os_free(keys->send);
1283 		os_free(keys->recv);
1284 		os_free(keys);
1285 	}
1286 }
1287 
1288 
1289 static void ieee802_1x_store_radius_class(struct hostapd_data *hapd,
1290 					  struct sta_info *sta,
1291 					  struct radius_msg *msg)
1292 {
1293 	u8 *class;
1294 	size_t class_len;
1295 	struct eapol_state_machine *sm = sta->eapol_sm;
1296 	int count, i;
1297 	struct radius_attr_data *nclass;
1298 	size_t nclass_count;
1299 
1300 	if (!hapd->conf->radius->acct_server || hapd->radius == NULL ||
1301 	    sm == NULL)
1302 		return;
1303 
1304 	radius_free_class(&sm->radius_class);
1305 	count = radius_msg_count_attr(msg, RADIUS_ATTR_CLASS, 1);
1306 	if (count <= 0)
1307 		return;
1308 
1309 	nclass = os_calloc(count, sizeof(struct radius_attr_data));
1310 	if (nclass == NULL)
1311 		return;
1312 
1313 	nclass_count = 0;
1314 
1315 	class = NULL;
1316 	for (i = 0; i < count; i++) {
1317 		do {
1318 			if (radius_msg_get_attr_ptr(msg, RADIUS_ATTR_CLASS,
1319 						    &class, &class_len,
1320 						    class) < 0) {
1321 				i = count;
1322 				break;
1323 			}
1324 		} while (class_len < 1);
1325 
1326 		nclass[nclass_count].data = os_malloc(class_len);
1327 		if (nclass[nclass_count].data == NULL)
1328 			break;
1329 
1330 		os_memcpy(nclass[nclass_count].data, class, class_len);
1331 		nclass[nclass_count].len = class_len;
1332 		nclass_count++;
1333 	}
1334 
1335 	sm->radius_class.attr = nclass;
1336 	sm->radius_class.count = nclass_count;
1337 	wpa_printf(MSG_DEBUG, "IEEE 802.1X: Stored %lu RADIUS Class "
1338 		   "attributes for " MACSTR,
1339 		   (unsigned long) sm->radius_class.count,
1340 		   MAC2STR(sta->addr));
1341 }
1342 
1343 
1344 /* Update sta->identity based on User-Name attribute in Access-Accept */
1345 static void ieee802_1x_update_sta_identity(struct hostapd_data *hapd,
1346 					   struct sta_info *sta,
1347 					   struct radius_msg *msg)
1348 {
1349 	u8 *buf, *identity;
1350 	size_t len;
1351 	struct eapol_state_machine *sm = sta->eapol_sm;
1352 
1353 	if (sm == NULL)
1354 		return;
1355 
1356 	if (radius_msg_get_attr_ptr(msg, RADIUS_ATTR_USER_NAME, &buf, &len,
1357 				    NULL) < 0)
1358 		return;
1359 
1360 	identity = (u8 *) dup_binstr(buf, len);
1361 	if (identity == NULL)
1362 		return;
1363 
1364 	hostapd_logger(hapd, sta->addr, HOSTAPD_MODULE_IEEE8021X,
1365 		       HOSTAPD_LEVEL_DEBUG, "old identity '%s' updated with "
1366 		       "User-Name from Access-Accept '%s'",
1367 		       sm->identity ? (char *) sm->identity : "N/A",
1368 		       (char *) identity);
1369 
1370 	os_free(sm->identity);
1371 	sm->identity = identity;
1372 	sm->identity_len = len;
1373 }
1374 
1375 
1376 /* Update CUI based on Chargeable-User-Identity attribute in Access-Accept */
1377 static void ieee802_1x_update_sta_cui(struct hostapd_data *hapd,
1378 				      struct sta_info *sta,
1379 				      struct radius_msg *msg)
1380 {
1381 	struct eapol_state_machine *sm = sta->eapol_sm;
1382 	struct wpabuf *cui;
1383 	u8 *buf;
1384 	size_t len;
1385 
1386 	if (sm == NULL)
1387 		return;
1388 
1389 	if (radius_msg_get_attr_ptr(msg, RADIUS_ATTR_CHARGEABLE_USER_IDENTITY,
1390 				    &buf, &len, NULL) < 0)
1391 		return;
1392 
1393 	cui = wpabuf_alloc_copy(buf, len);
1394 	if (cui == NULL)
1395 		return;
1396 
1397 	wpabuf_free(sm->radius_cui);
1398 	sm->radius_cui = cui;
1399 }
1400 
1401 
1402 #ifdef CONFIG_HS20
1403 
1404 static void ieee802_1x_hs20_sub_rem(struct sta_info *sta, u8 *pos, size_t len)
1405 {
1406 	sta->remediation = 1;
1407 	os_free(sta->remediation_url);
1408 	if (len > 2) {
1409 		sta->remediation_url = os_malloc(len);
1410 		if (!sta->remediation_url)
1411 			return;
1412 		sta->remediation_method = pos[0];
1413 		os_memcpy(sta->remediation_url, pos + 1, len - 1);
1414 		sta->remediation_url[len - 1] = '\0';
1415 		wpa_printf(MSG_DEBUG, "HS 2.0: Subscription remediation needed "
1416 			   "for " MACSTR " - server method %u URL %s",
1417 			   MAC2STR(sta->addr), sta->remediation_method,
1418 			   sta->remediation_url);
1419 	} else {
1420 		sta->remediation_url = NULL;
1421 		wpa_printf(MSG_DEBUG, "HS 2.0: Subscription remediation needed "
1422 			   "for " MACSTR, MAC2STR(sta->addr));
1423 	}
1424 	/* TODO: assign the STA into remediation VLAN or add filtering */
1425 }
1426 
1427 
1428 static void ieee802_1x_hs20_deauth_req(struct hostapd_data *hapd,
1429 				       struct sta_info *sta, u8 *pos,
1430 				       size_t len)
1431 {
1432 	if (len < 3)
1433 		return; /* Malformed information */
1434 	sta->hs20_deauth_requested = 1;
1435 	wpa_printf(MSG_DEBUG, "HS 2.0: Deauthentication request - Code %u  "
1436 		   "Re-auth Delay %u",
1437 		   *pos, WPA_GET_LE16(pos + 1));
1438 	wpabuf_free(sta->hs20_deauth_req);
1439 	sta->hs20_deauth_req = wpabuf_alloc(len + 1);
1440 	if (sta->hs20_deauth_req) {
1441 		wpabuf_put_data(sta->hs20_deauth_req, pos, 3);
1442 		wpabuf_put_u8(sta->hs20_deauth_req, len - 3);
1443 		wpabuf_put_data(sta->hs20_deauth_req, pos + 3, len - 3);
1444 	}
1445 	ap_sta_session_timeout(hapd, sta, hapd->conf->hs20_deauth_req_timeout);
1446 }
1447 
1448 
1449 static void ieee802_1x_hs20_session_info(struct hostapd_data *hapd,
1450 					 struct sta_info *sta, u8 *pos,
1451 					 size_t len, int session_timeout)
1452 {
1453 	unsigned int swt;
1454 	int warning_time, beacon_int;
1455 
1456 	if (len < 1)
1457 		return; /* Malformed information */
1458 	os_free(sta->hs20_session_info_url);
1459 	sta->hs20_session_info_url = os_malloc(len);
1460 	if (sta->hs20_session_info_url == NULL)
1461 		return;
1462 	swt = pos[0];
1463 	os_memcpy(sta->hs20_session_info_url, pos + 1, len - 1);
1464 	sta->hs20_session_info_url[len - 1] = '\0';
1465 	wpa_printf(MSG_DEBUG, "HS 2.0: Session Information URL='%s' SWT=%u "
1466 		   "(session_timeout=%d)",
1467 		   sta->hs20_session_info_url, swt, session_timeout);
1468 	if (session_timeout < 0) {
1469 		wpa_printf(MSG_DEBUG, "HS 2.0: No Session-Timeout set - ignore session info URL");
1470 		return;
1471 	}
1472 	if (swt == 255)
1473 		swt = 1; /* Use one minute as the AP selected value */
1474 
1475 	if ((unsigned int) session_timeout < swt * 60)
1476 		warning_time = 0;
1477 	else
1478 		warning_time = session_timeout - swt * 60;
1479 
1480 	beacon_int = hapd->iconf->beacon_int;
1481 	if (beacon_int < 1)
1482 		beacon_int = 100; /* best guess */
1483 	sta->hs20_disassoc_timer = swt * 60 * 1000 / beacon_int * 125 / 128;
1484 	if (sta->hs20_disassoc_timer > 65535)
1485 		sta->hs20_disassoc_timer = 65535;
1486 
1487 	ap_sta_session_warning_timeout(hapd, sta, warning_time);
1488 }
1489 
1490 #endif /* CONFIG_HS20 */
1491 
1492 
1493 static void ieee802_1x_check_hs20(struct hostapd_data *hapd,
1494 				  struct sta_info *sta,
1495 				  struct radius_msg *msg,
1496 				  int session_timeout)
1497 {
1498 #ifdef CONFIG_HS20
1499 	u8 *buf, *pos, *end, type, sublen;
1500 	size_t len;
1501 
1502 	buf = NULL;
1503 	sta->remediation = 0;
1504 	sta->hs20_deauth_requested = 0;
1505 
1506 	for (;;) {
1507 		if (radius_msg_get_attr_ptr(msg, RADIUS_ATTR_VENDOR_SPECIFIC,
1508 					    &buf, &len, buf) < 0)
1509 			break;
1510 		if (len < 6)
1511 			continue;
1512 		pos = buf;
1513 		end = buf + len;
1514 		if (WPA_GET_BE32(pos) != RADIUS_VENDOR_ID_WFA)
1515 			continue;
1516 		pos += 4;
1517 
1518 		type = *pos++;
1519 		sublen = *pos++;
1520 		if (sublen < 2)
1521 			continue; /* invalid length */
1522 		sublen -= 2; /* skip header */
1523 		if (pos + sublen > end)
1524 			continue; /* invalid WFA VSA */
1525 
1526 		switch (type) {
1527 		case RADIUS_VENDOR_ATTR_WFA_HS20_SUBSCR_REMEDIATION:
1528 			ieee802_1x_hs20_sub_rem(sta, pos, sublen);
1529 			break;
1530 		case RADIUS_VENDOR_ATTR_WFA_HS20_DEAUTH_REQ:
1531 			ieee802_1x_hs20_deauth_req(hapd, sta, pos, sublen);
1532 			break;
1533 		case RADIUS_VENDOR_ATTR_WFA_HS20_SESSION_INFO_URL:
1534 			ieee802_1x_hs20_session_info(hapd, sta, pos, sublen,
1535 						     session_timeout);
1536 			break;
1537 		}
1538 	}
1539 #endif /* CONFIG_HS20 */
1540 }
1541 
1542 
1543 struct sta_id_search {
1544 	u8 identifier;
1545 	struct eapol_state_machine *sm;
1546 };
1547 
1548 
1549 static int ieee802_1x_select_radius_identifier(struct hostapd_data *hapd,
1550 					       struct sta_info *sta,
1551 					       void *ctx)
1552 {
1553 	struct sta_id_search *id_search = ctx;
1554 	struct eapol_state_machine *sm = sta->eapol_sm;
1555 
1556 	if (sm && sm->radius_identifier >= 0 &&
1557 	    sm->radius_identifier == id_search->identifier) {
1558 		id_search->sm = sm;
1559 		return 1;
1560 	}
1561 	return 0;
1562 }
1563 
1564 
1565 static struct eapol_state_machine *
1566 ieee802_1x_search_radius_identifier(struct hostapd_data *hapd, u8 identifier)
1567 {
1568 	struct sta_id_search id_search;
1569 	id_search.identifier = identifier;
1570 	id_search.sm = NULL;
1571 	ap_for_each_sta(hapd, ieee802_1x_select_radius_identifier, &id_search);
1572 	return id_search.sm;
1573 }
1574 
1575 
1576 /**
1577  * ieee802_1x_receive_auth - Process RADIUS frames from Authentication Server
1578  * @msg: RADIUS response message
1579  * @req: RADIUS request message
1580  * @shared_secret: RADIUS shared secret
1581  * @shared_secret_len: Length of shared_secret in octets
1582  * @data: Context data (struct hostapd_data *)
1583  * Returns: Processing status
1584  */
1585 static RadiusRxResult
1586 ieee802_1x_receive_auth(struct radius_msg *msg, struct radius_msg *req,
1587 			const u8 *shared_secret, size_t shared_secret_len,
1588 			void *data)
1589 {
1590 	struct hostapd_data *hapd = data;
1591 	struct sta_info *sta;
1592 	u32 session_timeout = 0, termination_action, acct_interim_interval;
1593 	int session_timeout_set, old_vlanid = 0;
1594 	struct eapol_state_machine *sm;
1595 	int override_eapReq = 0;
1596 	struct radius_hdr *hdr = radius_msg_get_hdr(msg);
1597 
1598 	sm = ieee802_1x_search_radius_identifier(hapd, hdr->identifier);
1599 	if (sm == NULL) {
1600 		wpa_printf(MSG_DEBUG, "IEEE 802.1X: Could not find matching "
1601 			   "station for this RADIUS message");
1602 		return RADIUS_RX_UNKNOWN;
1603 	}
1604 	sta = sm->sta;
1605 
1606 	/* RFC 2869, Ch. 5.13: valid Message-Authenticator attribute MUST be
1607 	 * present when packet contains an EAP-Message attribute */
1608 	if (hdr->code == RADIUS_CODE_ACCESS_REJECT &&
1609 	    radius_msg_get_attr(msg, RADIUS_ATTR_MESSAGE_AUTHENTICATOR, NULL,
1610 				0) < 0 &&
1611 	    radius_msg_get_attr(msg, RADIUS_ATTR_EAP_MESSAGE, NULL, 0) < 0) {
1612 		wpa_printf(MSG_DEBUG, "Allowing RADIUS Access-Reject without "
1613 			   "Message-Authenticator since it does not include "
1614 			   "EAP-Message");
1615 	} else if (radius_msg_verify(msg, shared_secret, shared_secret_len,
1616 				     req, 1)) {
1617 		wpa_printf(MSG_INFO, "Incoming RADIUS packet did not have correct Message-Authenticator - dropped");
1618 		return RADIUS_RX_INVALID_AUTHENTICATOR;
1619 	}
1620 
1621 	if (hdr->code != RADIUS_CODE_ACCESS_ACCEPT &&
1622 	    hdr->code != RADIUS_CODE_ACCESS_REJECT &&
1623 	    hdr->code != RADIUS_CODE_ACCESS_CHALLENGE) {
1624 		wpa_printf(MSG_INFO, "Unknown RADIUS message code");
1625 		return RADIUS_RX_UNKNOWN;
1626 	}
1627 
1628 	sm->radius_identifier = -1;
1629 	wpa_printf(MSG_DEBUG, "RADIUS packet matching with station " MACSTR,
1630 		   MAC2STR(sta->addr));
1631 
1632 	radius_msg_free(sm->last_recv_radius);
1633 	sm->last_recv_radius = msg;
1634 
1635 	session_timeout_set =
1636 		!radius_msg_get_attr_int32(msg, RADIUS_ATTR_SESSION_TIMEOUT,
1637 					   &session_timeout);
1638 	if (radius_msg_get_attr_int32(msg, RADIUS_ATTR_TERMINATION_ACTION,
1639 				      &termination_action))
1640 		termination_action = RADIUS_TERMINATION_ACTION_DEFAULT;
1641 
1642 	if (hapd->conf->acct_interim_interval == 0 &&
1643 	    hdr->code == RADIUS_CODE_ACCESS_ACCEPT &&
1644 	    radius_msg_get_attr_int32(msg, RADIUS_ATTR_ACCT_INTERIM_INTERVAL,
1645 				      &acct_interim_interval) == 0) {
1646 		if (acct_interim_interval < 60) {
1647 			hostapd_logger(hapd, sta->addr,
1648 				       HOSTAPD_MODULE_IEEE8021X,
1649 				       HOSTAPD_LEVEL_INFO,
1650 				       "ignored too small "
1651 				       "Acct-Interim-Interval %d",
1652 				       acct_interim_interval);
1653 		} else
1654 			sta->acct_interim_interval = acct_interim_interval;
1655 	}
1656 
1657 
1658 	switch (hdr->code) {
1659 	case RADIUS_CODE_ACCESS_ACCEPT:
1660 		if (sta->ssid->dynamic_vlan == DYNAMIC_VLAN_DISABLED)
1661 			sta->vlan_id = 0;
1662 #ifndef CONFIG_NO_VLAN
1663 		else {
1664 			old_vlanid = sta->vlan_id;
1665 			sta->vlan_id = radius_msg_get_vlanid(msg);
1666 		}
1667 		if (sta->vlan_id > 0 &&
1668 		    hostapd_vlan_id_valid(hapd->conf->vlan, sta->vlan_id)) {
1669 			hostapd_logger(hapd, sta->addr,
1670 				       HOSTAPD_MODULE_RADIUS,
1671 				       HOSTAPD_LEVEL_INFO,
1672 				       "VLAN ID %d", sta->vlan_id);
1673 		} else if (sta->ssid->dynamic_vlan == DYNAMIC_VLAN_REQUIRED) {
1674 			sta->eapol_sm->authFail = TRUE;
1675 			hostapd_logger(hapd, sta->addr,
1676 				       HOSTAPD_MODULE_IEEE8021X,
1677 				       HOSTAPD_LEVEL_INFO, "authentication "
1678 				       "server did not include required VLAN "
1679 				       "ID in Access-Accept");
1680 			break;
1681 		}
1682 #endif /* CONFIG_NO_VLAN */
1683 
1684 		if (ap_sta_bind_vlan(hapd, sta, old_vlanid) < 0)
1685 			break;
1686 
1687 		sta->session_timeout_set = !!session_timeout_set;
1688 		sta->session_timeout = session_timeout;
1689 
1690 		/* RFC 3580, Ch. 3.17 */
1691 		if (session_timeout_set && termination_action ==
1692 		    RADIUS_TERMINATION_ACTION_RADIUS_REQUEST) {
1693 			sm->reAuthPeriod = session_timeout;
1694 		} else if (session_timeout_set)
1695 			ap_sta_session_timeout(hapd, sta, session_timeout);
1696 
1697 		sm->eap_if->aaaSuccess = TRUE;
1698 		override_eapReq = 1;
1699 		ieee802_1x_get_keys(hapd, sta, msg, req, shared_secret,
1700 				    shared_secret_len);
1701 		ieee802_1x_store_radius_class(hapd, sta, msg);
1702 		ieee802_1x_update_sta_identity(hapd, sta, msg);
1703 		ieee802_1x_update_sta_cui(hapd, sta, msg);
1704 		ieee802_1x_check_hs20(hapd, sta, msg,
1705 				      session_timeout_set ?
1706 				      (int) session_timeout : -1);
1707 		if (sm->eap_if->eapKeyAvailable && !sta->remediation &&
1708 		    !sta->hs20_deauth_requested &&
1709 		    wpa_auth_pmksa_add(sta->wpa_sm, sm->eapol_key_crypt,
1710 				       session_timeout_set ?
1711 				       (int) session_timeout : -1, sm) == 0) {
1712 			hostapd_logger(hapd, sta->addr, HOSTAPD_MODULE_WPA,
1713 				       HOSTAPD_LEVEL_DEBUG,
1714 				       "Added PMKSA cache entry");
1715 		}
1716 		break;
1717 	case RADIUS_CODE_ACCESS_REJECT:
1718 		sm->eap_if->aaaFail = TRUE;
1719 		override_eapReq = 1;
1720 		break;
1721 	case RADIUS_CODE_ACCESS_CHALLENGE:
1722 		sm->eap_if->aaaEapReq = TRUE;
1723 		if (session_timeout_set) {
1724 			/* RFC 2869, Ch. 2.3.2; RFC 3580, Ch. 3.17 */
1725 			sm->eap_if->aaaMethodTimeout = session_timeout;
1726 			hostapd_logger(hapd, sm->addr,
1727 				       HOSTAPD_MODULE_IEEE8021X,
1728 				       HOSTAPD_LEVEL_DEBUG,
1729 				       "using EAP timeout of %d seconds (from "
1730 				       "RADIUS)",
1731 				       sm->eap_if->aaaMethodTimeout);
1732 		} else {
1733 			/*
1734 			 * Use dynamic retransmission behavior per EAP
1735 			 * specification.
1736 			 */
1737 			sm->eap_if->aaaMethodTimeout = 0;
1738 		}
1739 		break;
1740 	}
1741 
1742 	ieee802_1x_decapsulate_radius(hapd, sta);
1743 	if (override_eapReq)
1744 		sm->eap_if->aaaEapReq = FALSE;
1745 
1746 	eapol_auth_step(sm);
1747 
1748 	return RADIUS_RX_QUEUED;
1749 }
1750 #endif /* CONFIG_NO_RADIUS */
1751 
1752 
1753 void ieee802_1x_abort_auth(struct hostapd_data *hapd, struct sta_info *sta)
1754 {
1755 	struct eapol_state_machine *sm = sta->eapol_sm;
1756 	if (sm == NULL)
1757 		return;
1758 
1759 	hostapd_logger(hapd, sta->addr, HOSTAPD_MODULE_IEEE8021X,
1760 		       HOSTAPD_LEVEL_DEBUG, "aborting authentication");
1761 
1762 #ifndef CONFIG_NO_RADIUS
1763 	radius_msg_free(sm->last_recv_radius);
1764 	sm->last_recv_radius = NULL;
1765 #endif /* CONFIG_NO_RADIUS */
1766 
1767 	if (sm->eap_if->eapTimeout) {
1768 		/*
1769 		 * Disconnect the STA since it did not reply to the last EAP
1770 		 * request and we cannot continue EAP processing (EAP-Failure
1771 		 * could only be sent if the EAP peer actually replied).
1772 		 */
1773 		wpa_dbg(hapd->msg_ctx, MSG_DEBUG, "EAP Timeout, STA " MACSTR,
1774 			MAC2STR(sta->addr));
1775 
1776 		sm->eap_if->portEnabled = FALSE;
1777 		ap_sta_disconnect(hapd, sta, sta->addr,
1778 				  WLAN_REASON_PREV_AUTH_NOT_VALID);
1779 	}
1780 }
1781 
1782 
1783 static int ieee802_1x_rekey_broadcast(struct hostapd_data *hapd)
1784 {
1785 	struct eapol_authenticator *eapol = hapd->eapol_auth;
1786 
1787 	if (hapd->conf->default_wep_key_len < 1)
1788 		return 0;
1789 
1790 	os_free(eapol->default_wep_key);
1791 	eapol->default_wep_key = os_malloc(hapd->conf->default_wep_key_len);
1792 	if (eapol->default_wep_key == NULL ||
1793 	    random_get_bytes(eapol->default_wep_key,
1794 			     hapd->conf->default_wep_key_len)) {
1795 		wpa_printf(MSG_INFO, "Could not generate random WEP key");
1796 		os_free(eapol->default_wep_key);
1797 		eapol->default_wep_key = NULL;
1798 		return -1;
1799 	}
1800 
1801 	wpa_hexdump_key(MSG_DEBUG, "IEEE 802.1X: New default WEP key",
1802 			eapol->default_wep_key,
1803 			hapd->conf->default_wep_key_len);
1804 
1805 	return 0;
1806 }
1807 
1808 
1809 static int ieee802_1x_sta_key_available(struct hostapd_data *hapd,
1810 					struct sta_info *sta, void *ctx)
1811 {
1812 	if (sta->eapol_sm) {
1813 		sta->eapol_sm->eap_if->eapKeyAvailable = TRUE;
1814 		eapol_auth_step(sta->eapol_sm);
1815 	}
1816 	return 0;
1817 }
1818 
1819 
1820 static void ieee802_1x_rekey(void *eloop_ctx, void *timeout_ctx)
1821 {
1822 	struct hostapd_data *hapd = eloop_ctx;
1823 	struct eapol_authenticator *eapol = hapd->eapol_auth;
1824 
1825 	if (eapol->default_wep_key_idx >= 3)
1826 		eapol->default_wep_key_idx =
1827 			hapd->conf->individual_wep_key_len > 0 ? 1 : 0;
1828 	else
1829 		eapol->default_wep_key_idx++;
1830 
1831 	wpa_printf(MSG_DEBUG, "IEEE 802.1X: New default WEP key index %d",
1832 		   eapol->default_wep_key_idx);
1833 
1834 	if (ieee802_1x_rekey_broadcast(hapd)) {
1835 		hostapd_logger(hapd, NULL, HOSTAPD_MODULE_IEEE8021X,
1836 			       HOSTAPD_LEVEL_WARNING, "failed to generate a "
1837 			       "new broadcast key");
1838 		os_free(eapol->default_wep_key);
1839 		eapol->default_wep_key = NULL;
1840 		return;
1841 	}
1842 
1843 	/* TODO: Could setup key for RX here, but change default TX keyid only
1844 	 * after new broadcast key has been sent to all stations. */
1845 	if (hostapd_drv_set_key(hapd->conf->iface, hapd, WPA_ALG_WEP,
1846 				broadcast_ether_addr,
1847 				eapol->default_wep_key_idx, 1, NULL, 0,
1848 				eapol->default_wep_key,
1849 				hapd->conf->default_wep_key_len)) {
1850 		hostapd_logger(hapd, NULL, HOSTAPD_MODULE_IEEE8021X,
1851 			       HOSTAPD_LEVEL_WARNING, "failed to configure a "
1852 			       "new broadcast key");
1853 		os_free(eapol->default_wep_key);
1854 		eapol->default_wep_key = NULL;
1855 		return;
1856 	}
1857 
1858 	ap_for_each_sta(hapd, ieee802_1x_sta_key_available, NULL);
1859 
1860 	if (hapd->conf->wep_rekeying_period > 0) {
1861 		eloop_register_timeout(hapd->conf->wep_rekeying_period, 0,
1862 				       ieee802_1x_rekey, hapd, NULL);
1863 	}
1864 }
1865 
1866 
1867 static void ieee802_1x_eapol_send(void *ctx, void *sta_ctx, u8 type,
1868 				  const u8 *data, size_t datalen)
1869 {
1870 #ifdef CONFIG_WPS
1871 	struct sta_info *sta = sta_ctx;
1872 
1873 	if ((sta->flags & (WLAN_STA_WPS | WLAN_STA_MAYBE_WPS)) ==
1874 	    WLAN_STA_MAYBE_WPS) {
1875 		const u8 *identity;
1876 		size_t identity_len;
1877 		struct eapol_state_machine *sm = sta->eapol_sm;
1878 
1879 		identity = eap_get_identity(sm->eap, &identity_len);
1880 		if (identity &&
1881 		    ((identity_len == WSC_ID_ENROLLEE_LEN &&
1882 		      os_memcmp(identity, WSC_ID_ENROLLEE,
1883 				WSC_ID_ENROLLEE_LEN) == 0) ||
1884 		     (identity_len == WSC_ID_REGISTRAR_LEN &&
1885 		      os_memcmp(identity, WSC_ID_REGISTRAR,
1886 				WSC_ID_REGISTRAR_LEN) == 0))) {
1887 			wpa_printf(MSG_DEBUG, "WPS: WLAN_STA_MAYBE_WPS -> "
1888 				   "WLAN_STA_WPS");
1889 			sta->flags |= WLAN_STA_WPS;
1890 		}
1891 	}
1892 #endif /* CONFIG_WPS */
1893 
1894 	ieee802_1x_send(ctx, sta_ctx, type, data, datalen);
1895 }
1896 
1897 
1898 static void ieee802_1x_aaa_send(void *ctx, void *sta_ctx,
1899 				const u8 *data, size_t datalen)
1900 {
1901 #ifndef CONFIG_NO_RADIUS
1902 	struct hostapd_data *hapd = ctx;
1903 	struct sta_info *sta = sta_ctx;
1904 
1905 	ieee802_1x_encapsulate_radius(hapd, sta, data, datalen);
1906 #endif /* CONFIG_NO_RADIUS */
1907 }
1908 
1909 
1910 static void _ieee802_1x_finished(void *ctx, void *sta_ctx, int success,
1911 				 int preauth, int remediation)
1912 {
1913 	struct hostapd_data *hapd = ctx;
1914 	struct sta_info *sta = sta_ctx;
1915 	if (preauth)
1916 		rsn_preauth_finished(hapd, sta, success);
1917 	else
1918 		ieee802_1x_finished(hapd, sta, success, remediation);
1919 }
1920 
1921 
1922 static int ieee802_1x_get_eap_user(void *ctx, const u8 *identity,
1923 				   size_t identity_len, int phase2,
1924 				   struct eap_user *user)
1925 {
1926 	struct hostapd_data *hapd = ctx;
1927 	const struct hostapd_eap_user *eap_user;
1928 	int i;
1929 
1930 	eap_user = hostapd_get_eap_user(hapd, identity, identity_len, phase2);
1931 	if (eap_user == NULL)
1932 		return -1;
1933 
1934 	os_memset(user, 0, sizeof(*user));
1935 	user->phase2 = phase2;
1936 	for (i = 0; i < EAP_MAX_METHODS; i++) {
1937 		user->methods[i].vendor = eap_user->methods[i].vendor;
1938 		user->methods[i].method = eap_user->methods[i].method;
1939 	}
1940 
1941 	if (eap_user->password) {
1942 		user->password = os_malloc(eap_user->password_len);
1943 		if (user->password == NULL)
1944 			return -1;
1945 		os_memcpy(user->password, eap_user->password,
1946 			  eap_user->password_len);
1947 		user->password_len = eap_user->password_len;
1948 		user->password_hash = eap_user->password_hash;
1949 	}
1950 	user->force_version = eap_user->force_version;
1951 	user->macacl = eap_user->macacl;
1952 	user->ttls_auth = eap_user->ttls_auth;
1953 	user->remediation = eap_user->remediation;
1954 
1955 	return 0;
1956 }
1957 
1958 
1959 static int ieee802_1x_sta_entry_alive(void *ctx, const u8 *addr)
1960 {
1961 	struct hostapd_data *hapd = ctx;
1962 	struct sta_info *sta;
1963 	sta = ap_get_sta(hapd, addr);
1964 	if (sta == NULL || sta->eapol_sm == NULL)
1965 		return 0;
1966 	return 1;
1967 }
1968 
1969 
1970 static void ieee802_1x_logger(void *ctx, const u8 *addr,
1971 			      eapol_logger_level level, const char *txt)
1972 {
1973 #ifndef CONFIG_NO_HOSTAPD_LOGGER
1974 	struct hostapd_data *hapd = ctx;
1975 	int hlevel;
1976 
1977 	switch (level) {
1978 	case EAPOL_LOGGER_WARNING:
1979 		hlevel = HOSTAPD_LEVEL_WARNING;
1980 		break;
1981 	case EAPOL_LOGGER_INFO:
1982 		hlevel = HOSTAPD_LEVEL_INFO;
1983 		break;
1984 	case EAPOL_LOGGER_DEBUG:
1985 	default:
1986 		hlevel = HOSTAPD_LEVEL_DEBUG;
1987 		break;
1988 	}
1989 
1990 	hostapd_logger(hapd, addr, HOSTAPD_MODULE_IEEE8021X, hlevel, "%s",
1991 		       txt);
1992 #endif /* CONFIG_NO_HOSTAPD_LOGGER */
1993 }
1994 
1995 
1996 static void ieee802_1x_set_port_authorized(void *ctx, void *sta_ctx,
1997 					   int authorized)
1998 {
1999 	struct hostapd_data *hapd = ctx;
2000 	struct sta_info *sta = sta_ctx;
2001 	ieee802_1x_set_sta_authorized(hapd, sta, authorized);
2002 }
2003 
2004 
2005 static void _ieee802_1x_abort_auth(void *ctx, void *sta_ctx)
2006 {
2007 	struct hostapd_data *hapd = ctx;
2008 	struct sta_info *sta = sta_ctx;
2009 	ieee802_1x_abort_auth(hapd, sta);
2010 }
2011 
2012 
2013 static void _ieee802_1x_tx_key(void *ctx, void *sta_ctx)
2014 {
2015 	struct hostapd_data *hapd = ctx;
2016 	struct sta_info *sta = sta_ctx;
2017 	ieee802_1x_tx_key(hapd, sta);
2018 }
2019 
2020 
2021 static void ieee802_1x_eapol_event(void *ctx, void *sta_ctx,
2022 				   enum eapol_event type)
2023 {
2024 	/* struct hostapd_data *hapd = ctx; */
2025 	struct sta_info *sta = sta_ctx;
2026 	switch (type) {
2027 	case EAPOL_AUTH_SM_CHANGE:
2028 		wpa_auth_sm_notify(sta->wpa_sm);
2029 		break;
2030 	case EAPOL_AUTH_REAUTHENTICATE:
2031 		wpa_auth_sm_event(sta->wpa_sm, WPA_REAUTH_EAPOL);
2032 		break;
2033 	}
2034 }
2035 
2036 
2037 #ifdef CONFIG_ERP
2038 
2039 static struct eap_server_erp_key *
2040 ieee802_1x_erp_get_key(void *ctx, const char *keyname)
2041 {
2042 	struct hostapd_data *hapd = ctx;
2043 	struct eap_server_erp_key *erp;
2044 
2045 	dl_list_for_each(erp, &hapd->erp_keys, struct eap_server_erp_key,
2046 			 list) {
2047 		if (os_strcmp(erp->keyname_nai, keyname) == 0)
2048 			return erp;
2049 	}
2050 
2051 	return NULL;
2052 }
2053 
2054 
2055 static int ieee802_1x_erp_add_key(void *ctx, struct eap_server_erp_key *erp)
2056 {
2057 	struct hostapd_data *hapd = ctx;
2058 
2059 	dl_list_add(&hapd->erp_keys, &erp->list);
2060 	return 0;
2061 }
2062 
2063 #endif /* CONFIG_ERP */
2064 
2065 
2066 int ieee802_1x_init(struct hostapd_data *hapd)
2067 {
2068 	int i;
2069 	struct eapol_auth_config conf;
2070 	struct eapol_auth_cb cb;
2071 
2072 	dl_list_init(&hapd->erp_keys);
2073 
2074 	os_memset(&conf, 0, sizeof(conf));
2075 	conf.ctx = hapd;
2076 	conf.eap_reauth_period = hapd->conf->eap_reauth_period;
2077 	conf.wpa = hapd->conf->wpa;
2078 	conf.individual_wep_key_len = hapd->conf->individual_wep_key_len;
2079 	conf.eap_server = hapd->conf->eap_server;
2080 	conf.ssl_ctx = hapd->ssl_ctx;
2081 	conf.msg_ctx = hapd->msg_ctx;
2082 	conf.eap_sim_db_priv = hapd->eap_sim_db_priv;
2083 	conf.eap_req_id_text = hapd->conf->eap_req_id_text;
2084 	conf.eap_req_id_text_len = hapd->conf->eap_req_id_text_len;
2085 	conf.erp_send_reauth_start = hapd->conf->erp_send_reauth_start;
2086 	conf.erp_domain = hapd->conf->erp_domain;
2087 	conf.erp = hapd->conf->eap_server_erp;
2088 	conf.pac_opaque_encr_key = hapd->conf->pac_opaque_encr_key;
2089 	conf.eap_fast_a_id = hapd->conf->eap_fast_a_id;
2090 	conf.eap_fast_a_id_len = hapd->conf->eap_fast_a_id_len;
2091 	conf.eap_fast_a_id_info = hapd->conf->eap_fast_a_id_info;
2092 	conf.eap_fast_prov = hapd->conf->eap_fast_prov;
2093 	conf.pac_key_lifetime = hapd->conf->pac_key_lifetime;
2094 	conf.pac_key_refresh_time = hapd->conf->pac_key_refresh_time;
2095 	conf.eap_sim_aka_result_ind = hapd->conf->eap_sim_aka_result_ind;
2096 	conf.tnc = hapd->conf->tnc;
2097 	conf.wps = hapd->wps;
2098 	conf.fragment_size = hapd->conf->fragment_size;
2099 	conf.pwd_group = hapd->conf->pwd_group;
2100 	conf.pbc_in_m1 = hapd->conf->pbc_in_m1;
2101 	if (hapd->conf->server_id) {
2102 		conf.server_id = (const u8 *) hapd->conf->server_id;
2103 		conf.server_id_len = os_strlen(hapd->conf->server_id);
2104 	} else {
2105 		conf.server_id = (const u8 *) "hostapd";
2106 		conf.server_id_len = 7;
2107 	}
2108 
2109 	os_memset(&cb, 0, sizeof(cb));
2110 	cb.eapol_send = ieee802_1x_eapol_send;
2111 	cb.aaa_send = ieee802_1x_aaa_send;
2112 	cb.finished = _ieee802_1x_finished;
2113 	cb.get_eap_user = ieee802_1x_get_eap_user;
2114 	cb.sta_entry_alive = ieee802_1x_sta_entry_alive;
2115 	cb.logger = ieee802_1x_logger;
2116 	cb.set_port_authorized = ieee802_1x_set_port_authorized;
2117 	cb.abort_auth = _ieee802_1x_abort_auth;
2118 	cb.tx_key = _ieee802_1x_tx_key;
2119 	cb.eapol_event = ieee802_1x_eapol_event;
2120 #ifdef CONFIG_ERP
2121 	cb.erp_get_key = ieee802_1x_erp_get_key;
2122 	cb.erp_add_key = ieee802_1x_erp_add_key;
2123 #endif /* CONFIG_ERP */
2124 
2125 	hapd->eapol_auth = eapol_auth_init(&conf, &cb);
2126 	if (hapd->eapol_auth == NULL)
2127 		return -1;
2128 
2129 	if ((hapd->conf->ieee802_1x || hapd->conf->wpa) &&
2130 	    hostapd_set_drv_ieee8021x(hapd, hapd->conf->iface, 1))
2131 		return -1;
2132 
2133 #ifndef CONFIG_NO_RADIUS
2134 	if (radius_client_register(hapd->radius, RADIUS_AUTH,
2135 				   ieee802_1x_receive_auth, hapd))
2136 		return -1;
2137 #endif /* CONFIG_NO_RADIUS */
2138 
2139 	if (hapd->conf->default_wep_key_len) {
2140 		for (i = 0; i < 4; i++)
2141 			hostapd_drv_set_key(hapd->conf->iface, hapd,
2142 					    WPA_ALG_NONE, NULL, i, 0, NULL, 0,
2143 					    NULL, 0);
2144 
2145 		ieee802_1x_rekey(hapd, NULL);
2146 
2147 		if (hapd->eapol_auth->default_wep_key == NULL)
2148 			return -1;
2149 	}
2150 
2151 	return 0;
2152 }
2153 
2154 
2155 void ieee802_1x_erp_flush(struct hostapd_data *hapd)
2156 {
2157 	struct eap_server_erp_key *erp;
2158 
2159 	while ((erp = dl_list_first(&hapd->erp_keys, struct eap_server_erp_key,
2160 				    list)) != NULL) {
2161 		dl_list_del(&erp->list);
2162 		bin_clear_free(erp, sizeof(*erp));
2163 	}
2164 }
2165 
2166 
2167 void ieee802_1x_deinit(struct hostapd_data *hapd)
2168 {
2169 	eloop_cancel_timeout(ieee802_1x_rekey, hapd, NULL);
2170 
2171 	if (hapd->driver != NULL &&
2172 	    (hapd->conf->ieee802_1x || hapd->conf->wpa))
2173 		hostapd_set_drv_ieee8021x(hapd, hapd->conf->iface, 0);
2174 
2175 	eapol_auth_deinit(hapd->eapol_auth);
2176 	hapd->eapol_auth = NULL;
2177 
2178 	ieee802_1x_erp_flush(hapd);
2179 }
2180 
2181 
2182 int ieee802_1x_tx_status(struct hostapd_data *hapd, struct sta_info *sta,
2183 			 const u8 *buf, size_t len, int ack)
2184 {
2185 	struct ieee80211_hdr *hdr;
2186 	u8 *pos;
2187 	const unsigned char rfc1042_hdr[ETH_ALEN] =
2188 		{ 0xaa, 0xaa, 0x03, 0x00, 0x00, 0x00 };
2189 
2190 	if (sta == NULL)
2191 		return -1;
2192 	if (len < sizeof(*hdr) + sizeof(rfc1042_hdr) + 2)
2193 		return 0;
2194 
2195 	hdr = (struct ieee80211_hdr *) buf;
2196 	pos = (u8 *) (hdr + 1);
2197 	if (os_memcmp(pos, rfc1042_hdr, sizeof(rfc1042_hdr)) != 0)
2198 		return 0;
2199 	pos += sizeof(rfc1042_hdr);
2200 	if (WPA_GET_BE16(pos) != ETH_P_PAE)
2201 		return 0;
2202 	pos += 2;
2203 
2204 	return ieee802_1x_eapol_tx_status(hapd, sta, pos, buf + len - pos,
2205 					  ack);
2206 }
2207 
2208 
2209 int ieee802_1x_eapol_tx_status(struct hostapd_data *hapd, struct sta_info *sta,
2210 			       const u8 *buf, int len, int ack)
2211 {
2212 	const struct ieee802_1x_hdr *xhdr =
2213 		(const struct ieee802_1x_hdr *) buf;
2214 	const u8 *pos = buf + sizeof(*xhdr);
2215 	struct ieee802_1x_eapol_key *key;
2216 
2217 	if (len < (int) sizeof(*xhdr))
2218 		return 0;
2219 	wpa_printf(MSG_DEBUG, "IEEE 802.1X: " MACSTR " TX status - version=%d "
2220 		   "type=%d length=%d - ack=%d",
2221 		   MAC2STR(sta->addr), xhdr->version, xhdr->type,
2222 		   be_to_host16(xhdr->length), ack);
2223 
2224 	if (xhdr->type != IEEE802_1X_TYPE_EAPOL_KEY)
2225 		return 0;
2226 
2227 	if (pos + sizeof(struct wpa_eapol_key) <= buf + len) {
2228 		const struct wpa_eapol_key *wpa;
2229 		wpa = (const struct wpa_eapol_key *) pos;
2230 		if (wpa->type == EAPOL_KEY_TYPE_RSN ||
2231 		    wpa->type == EAPOL_KEY_TYPE_WPA)
2232 			wpa_auth_eapol_key_tx_status(hapd->wpa_auth,
2233 						     sta->wpa_sm, ack);
2234 	}
2235 
2236 	/* EAPOL EAP-Packet packets are eventually re-sent by either Supplicant
2237 	 * or Authenticator state machines, but EAPOL-Key packets are not
2238 	 * retransmitted in case of failure. Try to re-send failed EAPOL-Key
2239 	 * packets couple of times because otherwise STA keys become
2240 	 * unsynchronized with AP. */
2241 	if (!ack && pos + sizeof(*key) <= buf + len) {
2242 		key = (struct ieee802_1x_eapol_key *) pos;
2243 		hostapd_logger(hapd, sta->addr, HOSTAPD_MODULE_IEEE8021X,
2244 			       HOSTAPD_LEVEL_DEBUG, "did not Ack EAPOL-Key "
2245 			       "frame (%scast index=%d)",
2246 			       key->key_index & BIT(7) ? "uni" : "broad",
2247 			       key->key_index & ~BIT(7));
2248 		/* TODO: re-send EAPOL-Key couple of times (with short delay
2249 		 * between them?). If all attempt fail, report error and
2250 		 * deauthenticate STA so that it will get new keys when
2251 		 * authenticating again (e.g., after returning in range).
2252 		 * Separate limit/transmit state needed both for unicast and
2253 		 * broadcast keys(?) */
2254 	}
2255 	/* TODO: could move unicast key configuration from ieee802_1x_tx_key()
2256 	 * to here and change the key only if the EAPOL-Key packet was Acked.
2257 	 */
2258 
2259 	return 1;
2260 }
2261 
2262 
2263 u8 * ieee802_1x_get_identity(struct eapol_state_machine *sm, size_t *len)
2264 {
2265 	if (sm == NULL || sm->identity == NULL)
2266 		return NULL;
2267 
2268 	*len = sm->identity_len;
2269 	return sm->identity;
2270 }
2271 
2272 
2273 u8 * ieee802_1x_get_radius_class(struct eapol_state_machine *sm, size_t *len,
2274 				 int idx)
2275 {
2276 	if (sm == NULL || sm->radius_class.attr == NULL ||
2277 	    idx >= (int) sm->radius_class.count)
2278 		return NULL;
2279 
2280 	*len = sm->radius_class.attr[idx].len;
2281 	return sm->radius_class.attr[idx].data;
2282 }
2283 
2284 
2285 struct wpabuf * ieee802_1x_get_radius_cui(struct eapol_state_machine *sm)
2286 {
2287 	if (sm == NULL)
2288 		return NULL;
2289 	return sm->radius_cui;
2290 }
2291 
2292 
2293 const u8 * ieee802_1x_get_key(struct eapol_state_machine *sm, size_t *len)
2294 {
2295 	*len = 0;
2296 	if (sm == NULL)
2297 		return NULL;
2298 
2299 	*len = sm->eap_if->eapKeyDataLen;
2300 	return sm->eap_if->eapKeyData;
2301 }
2302 
2303 
2304 void ieee802_1x_notify_port_enabled(struct eapol_state_machine *sm,
2305 				    int enabled)
2306 {
2307 	if (sm == NULL)
2308 		return;
2309 	sm->eap_if->portEnabled = enabled ? TRUE : FALSE;
2310 	eapol_auth_step(sm);
2311 }
2312 
2313 
2314 void ieee802_1x_notify_port_valid(struct eapol_state_machine *sm,
2315 				  int valid)
2316 {
2317 	if (sm == NULL)
2318 		return;
2319 	sm->portValid = valid ? TRUE : FALSE;
2320 	eapol_auth_step(sm);
2321 }
2322 
2323 
2324 void ieee802_1x_notify_pre_auth(struct eapol_state_machine *sm, int pre_auth)
2325 {
2326 	if (sm == NULL)
2327 		return;
2328 	if (pre_auth)
2329 		sm->flags |= EAPOL_SM_PREAUTH;
2330 	else
2331 		sm->flags &= ~EAPOL_SM_PREAUTH;
2332 }
2333 
2334 
2335 static const char * bool_txt(Boolean bool)
2336 {
2337 	return bool ? "TRUE" : "FALSE";
2338 }
2339 
2340 
2341 int ieee802_1x_get_mib(struct hostapd_data *hapd, char *buf, size_t buflen)
2342 {
2343 	/* TODO */
2344 	return 0;
2345 }
2346 
2347 
2348 int ieee802_1x_get_mib_sta(struct hostapd_data *hapd, struct sta_info *sta,
2349 			   char *buf, size_t buflen)
2350 {
2351 	int len = 0, ret;
2352 	struct eapol_state_machine *sm = sta->eapol_sm;
2353 	struct os_reltime diff;
2354 	const char *name1;
2355 	const char *name2;
2356 
2357 	if (sm == NULL)
2358 		return 0;
2359 
2360 	ret = os_snprintf(buf + len, buflen - len,
2361 			  "dot1xPaePortNumber=%d\n"
2362 			  "dot1xPaePortProtocolVersion=%d\n"
2363 			  "dot1xPaePortCapabilities=1\n"
2364 			  "dot1xPaePortInitialize=%d\n"
2365 			  "dot1xPaePortReauthenticate=FALSE\n",
2366 			  sta->aid,
2367 			  EAPOL_VERSION,
2368 			  sm->initialize);
2369 	if (os_snprintf_error(buflen - len, ret))
2370 		return len;
2371 	len += ret;
2372 
2373 	/* dot1xAuthConfigTable */
2374 	ret = os_snprintf(buf + len, buflen - len,
2375 			  "dot1xAuthPaeState=%d\n"
2376 			  "dot1xAuthBackendAuthState=%d\n"
2377 			  "dot1xAuthAdminControlledDirections=%d\n"
2378 			  "dot1xAuthOperControlledDirections=%d\n"
2379 			  "dot1xAuthAuthControlledPortStatus=%d\n"
2380 			  "dot1xAuthAuthControlledPortControl=%d\n"
2381 			  "dot1xAuthQuietPeriod=%u\n"
2382 			  "dot1xAuthServerTimeout=%u\n"
2383 			  "dot1xAuthReAuthPeriod=%u\n"
2384 			  "dot1xAuthReAuthEnabled=%s\n"
2385 			  "dot1xAuthKeyTxEnabled=%s\n",
2386 			  sm->auth_pae_state + 1,
2387 			  sm->be_auth_state + 1,
2388 			  sm->adminControlledDirections,
2389 			  sm->operControlledDirections,
2390 			  sm->authPortStatus,
2391 			  sm->portControl,
2392 			  sm->quietPeriod,
2393 			  sm->serverTimeout,
2394 			  sm->reAuthPeriod,
2395 			  bool_txt(sm->reAuthEnabled),
2396 			  bool_txt(sm->keyTxEnabled));
2397 	if (os_snprintf_error(buflen - len, ret))
2398 		return len;
2399 	len += ret;
2400 
2401 	/* dot1xAuthStatsTable */
2402 	ret = os_snprintf(buf + len, buflen - len,
2403 			  "dot1xAuthEapolFramesRx=%u\n"
2404 			  "dot1xAuthEapolFramesTx=%u\n"
2405 			  "dot1xAuthEapolStartFramesRx=%u\n"
2406 			  "dot1xAuthEapolLogoffFramesRx=%u\n"
2407 			  "dot1xAuthEapolRespIdFramesRx=%u\n"
2408 			  "dot1xAuthEapolRespFramesRx=%u\n"
2409 			  "dot1xAuthEapolReqIdFramesTx=%u\n"
2410 			  "dot1xAuthEapolReqFramesTx=%u\n"
2411 			  "dot1xAuthInvalidEapolFramesRx=%u\n"
2412 			  "dot1xAuthEapLengthErrorFramesRx=%u\n"
2413 			  "dot1xAuthLastEapolFrameVersion=%u\n"
2414 			  "dot1xAuthLastEapolFrameSource=" MACSTR "\n",
2415 			  sm->dot1xAuthEapolFramesRx,
2416 			  sm->dot1xAuthEapolFramesTx,
2417 			  sm->dot1xAuthEapolStartFramesRx,
2418 			  sm->dot1xAuthEapolLogoffFramesRx,
2419 			  sm->dot1xAuthEapolRespIdFramesRx,
2420 			  sm->dot1xAuthEapolRespFramesRx,
2421 			  sm->dot1xAuthEapolReqIdFramesTx,
2422 			  sm->dot1xAuthEapolReqFramesTx,
2423 			  sm->dot1xAuthInvalidEapolFramesRx,
2424 			  sm->dot1xAuthEapLengthErrorFramesRx,
2425 			  sm->dot1xAuthLastEapolFrameVersion,
2426 			  MAC2STR(sm->addr));
2427 	if (os_snprintf_error(buflen - len, ret))
2428 		return len;
2429 	len += ret;
2430 
2431 	/* dot1xAuthDiagTable */
2432 	ret = os_snprintf(buf + len, buflen - len,
2433 			  "dot1xAuthEntersConnecting=%u\n"
2434 			  "dot1xAuthEapLogoffsWhileConnecting=%u\n"
2435 			  "dot1xAuthEntersAuthenticating=%u\n"
2436 			  "dot1xAuthAuthSuccessesWhileAuthenticating=%u\n"
2437 			  "dot1xAuthAuthTimeoutsWhileAuthenticating=%u\n"
2438 			  "dot1xAuthAuthFailWhileAuthenticating=%u\n"
2439 			  "dot1xAuthAuthEapStartsWhileAuthenticating=%u\n"
2440 			  "dot1xAuthAuthEapLogoffWhileAuthenticating=%u\n"
2441 			  "dot1xAuthAuthReauthsWhileAuthenticated=%u\n"
2442 			  "dot1xAuthAuthEapStartsWhileAuthenticated=%u\n"
2443 			  "dot1xAuthAuthEapLogoffWhileAuthenticated=%u\n"
2444 			  "dot1xAuthBackendResponses=%u\n"
2445 			  "dot1xAuthBackendAccessChallenges=%u\n"
2446 			  "dot1xAuthBackendOtherRequestsToSupplicant=%u\n"
2447 			  "dot1xAuthBackendAuthSuccesses=%u\n"
2448 			  "dot1xAuthBackendAuthFails=%u\n",
2449 			  sm->authEntersConnecting,
2450 			  sm->authEapLogoffsWhileConnecting,
2451 			  sm->authEntersAuthenticating,
2452 			  sm->authAuthSuccessesWhileAuthenticating,
2453 			  sm->authAuthTimeoutsWhileAuthenticating,
2454 			  sm->authAuthFailWhileAuthenticating,
2455 			  sm->authAuthEapStartsWhileAuthenticating,
2456 			  sm->authAuthEapLogoffWhileAuthenticating,
2457 			  sm->authAuthReauthsWhileAuthenticated,
2458 			  sm->authAuthEapStartsWhileAuthenticated,
2459 			  sm->authAuthEapLogoffWhileAuthenticated,
2460 			  sm->backendResponses,
2461 			  sm->backendAccessChallenges,
2462 			  sm->backendOtherRequestsToSupplicant,
2463 			  sm->backendAuthSuccesses,
2464 			  sm->backendAuthFails);
2465 	if (os_snprintf_error(buflen - len, ret))
2466 		return len;
2467 	len += ret;
2468 
2469 	/* dot1xAuthSessionStatsTable */
2470 	os_reltime_age(&sta->acct_session_start, &diff);
2471 	ret = os_snprintf(buf + len, buflen - len,
2472 			  /* TODO: dot1xAuthSessionOctetsRx */
2473 			  /* TODO: dot1xAuthSessionOctetsTx */
2474 			  /* TODO: dot1xAuthSessionFramesRx */
2475 			  /* TODO: dot1xAuthSessionFramesTx */
2476 			  "dot1xAuthSessionId=%08X-%08X\n"
2477 			  "dot1xAuthSessionAuthenticMethod=%d\n"
2478 			  "dot1xAuthSessionTime=%u\n"
2479 			  "dot1xAuthSessionTerminateCause=999\n"
2480 			  "dot1xAuthSessionUserName=%s\n",
2481 			  sta->acct_session_id_hi, sta->acct_session_id_lo,
2482 			  (wpa_key_mgmt_wpa_ieee8021x(
2483 				   wpa_auth_sta_key_mgmt(sta->wpa_sm))) ?
2484 			  1 : 2,
2485 			  (unsigned int) diff.sec,
2486 			  sm->identity);
2487 	if (os_snprintf_error(buflen - len, ret))
2488 		return len;
2489 	len += ret;
2490 
2491 	if (sm->acct_multi_session_id_hi) {
2492 		ret = os_snprintf(buf + len, buflen - len,
2493 				  "authMultiSessionId=%08X+%08X\n",
2494 				  sm->acct_multi_session_id_hi,
2495 				  sm->acct_multi_session_id_lo);
2496 		if (os_snprintf_error(buflen - len, ret))
2497 			return len;
2498 		len += ret;
2499 	}
2500 
2501 	name1 = eap_server_get_name(0, sm->eap_type_authsrv);
2502 	name2 = eap_server_get_name(0, sm->eap_type_supp);
2503 	ret = os_snprintf(buf + len, buflen - len,
2504 			  "last_eap_type_as=%d (%s)\n"
2505 			  "last_eap_type_sta=%d (%s)\n",
2506 			  sm->eap_type_authsrv, name1,
2507 			  sm->eap_type_supp, name2);
2508 	if (os_snprintf_error(buflen - len, ret))
2509 		return len;
2510 	len += ret;
2511 
2512 	return len;
2513 }
2514 
2515 
2516 static void ieee802_1x_finished(struct hostapd_data *hapd,
2517 				struct sta_info *sta, int success,
2518 				int remediation)
2519 {
2520 	const u8 *key;
2521 	size_t len;
2522 	/* TODO: get PMKLifetime from WPA parameters */
2523 	static const int dot11RSNAConfigPMKLifetime = 43200;
2524 	unsigned int session_timeout;
2525 
2526 #ifdef CONFIG_HS20
2527 	if (remediation && !sta->remediation) {
2528 		sta->remediation = 1;
2529 		os_free(sta->remediation_url);
2530 		sta->remediation_url =
2531 			os_strdup(hapd->conf->subscr_remediation_url);
2532 		sta->remediation_method = 1; /* SOAP-XML SPP */
2533 	}
2534 
2535 	if (success) {
2536 		if (sta->remediation) {
2537 			wpa_printf(MSG_DEBUG, "HS 2.0: Send WNM-Notification "
2538 				   "to " MACSTR " to indicate Subscription "
2539 				   "Remediation",
2540 				   MAC2STR(sta->addr));
2541 			hs20_send_wnm_notification(hapd, sta->addr,
2542 						   sta->remediation_method,
2543 						   sta->remediation_url);
2544 			os_free(sta->remediation_url);
2545 			sta->remediation_url = NULL;
2546 		}
2547 
2548 		if (sta->hs20_deauth_req) {
2549 			wpa_printf(MSG_DEBUG, "HS 2.0: Send WNM-Notification "
2550 				   "to " MACSTR " to indicate imminent "
2551 				   "deauthentication", MAC2STR(sta->addr));
2552 			hs20_send_wnm_notification_deauth_req(
2553 				hapd, sta->addr, sta->hs20_deauth_req);
2554 		}
2555 	}
2556 #endif /* CONFIG_HS20 */
2557 
2558 	key = ieee802_1x_get_key(sta->eapol_sm, &len);
2559 	if (sta->session_timeout_set)
2560 		session_timeout = sta->session_timeout;
2561 	else
2562 		session_timeout = dot11RSNAConfigPMKLifetime;
2563 	if (success && key && len >= PMK_LEN && !sta->remediation &&
2564 	    !sta->hs20_deauth_requested &&
2565 	    wpa_auth_pmksa_add(sta->wpa_sm, key, session_timeout,
2566 			       sta->eapol_sm) == 0) {
2567 		hostapd_logger(hapd, sta->addr, HOSTAPD_MODULE_WPA,
2568 			       HOSTAPD_LEVEL_DEBUG,
2569 			       "Added PMKSA cache entry (IEEE 802.1X)");
2570 	}
2571 
2572 	if (!success) {
2573 		/*
2574 		 * Many devices require deauthentication after WPS provisioning
2575 		 * and some may not be be able to do that themselves, so
2576 		 * disconnect the client here. In addition, this may also
2577 		 * benefit IEEE 802.1X/EAPOL authentication cases, too since
2578 		 * the EAPOL PAE state machine would remain in HELD state for
2579 		 * considerable amount of time and some EAP methods, like
2580 		 * EAP-FAST with anonymous provisioning, may require another
2581 		 * EAPOL authentication to be started to complete connection.
2582 		 */
2583 		wpa_dbg(hapd->msg_ctx, MSG_DEBUG, "IEEE 802.1X: Force "
2584 			"disconnection after EAP-Failure");
2585 		/* Add a small sleep to increase likelihood of previously
2586 		 * requested EAP-Failure TX getting out before this should the
2587 		 * driver reorder operations.
2588 		 */
2589 		os_sleep(0, 10000);
2590 		ap_sta_disconnect(hapd, sta, sta->addr,
2591 				  WLAN_REASON_IEEE_802_1X_AUTH_FAILED);
2592 		hostapd_wps_eap_completed(hapd);
2593 	}
2594 }
2595