]> CyberLeo.Net >> Repos - FreeBSD/FreeBSD.git/blob - contrib/wpa/src/ap/ieee802_1x.c
MFV ntp-4.2.8p3 (r284990).
[FreeBSD/FreeBSD.git] / contrib / wpa / src / ap / ieee802_1x.c
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 }