Remove src/crypto from default include path
[libeap.git] / hostapd / ieee802_1x.c
index 985e9bf..9336750 100644 (file)
 #include "includes.h"
 
 #include "common.h"
+#include "eloop.h"
+#include "crypto/md5.h"
+#include "crypto/crypto.h"
+#include "common/ieee802_11_defs.h"
+#include "common/wpa_ctrl.h"
+#include "radius/radius.h"
+#include "radius/radius_client.h"
+#include "eapol_auth/eapol_auth_sm.h"
 #include "hostapd.h"
 #include "ieee802_1x.h"
 #include "accounting.h"
-#include "radius/radius.h"
-#include "radius/radius_client.h"
-#include "eapol_sm.h"
-#include "md5.h"
-#include "crypto.h"
-#include "eloop.h"
 #include "sta_flags.h"
 #include "sta_info.h"
 #include "wpa.h"
@@ -32,8 +34,6 @@
 #include "driver_i.h"
 #include "hw_features.h"
 #include "eap_server/eap.h"
-#include "common/ieee802_11_defs.h"
-#include "common/wpa_ctrl.h"
 
 
 static void ieee802_1x_finished(struct hostapd_data *hapd,
@@ -563,28 +563,6 @@ static void ieee802_1x_encapsulate_radius(struct hostapd_data *hapd,
 #endif /* CONFIG_NO_RADIUS */
 
 
-char *eap_type_text(u8 type)
-{
-       switch (type) {
-       case EAP_TYPE_IDENTITY: return "Identity";
-       case EAP_TYPE_NOTIFICATION: return "Notification";
-       case EAP_TYPE_NAK: return "Nak";
-       case EAP_TYPE_MD5: return "MD5-Challenge";
-       case EAP_TYPE_OTP: return "One-Time Password";
-       case EAP_TYPE_GTC: return "Generic Token Card";
-       case EAP_TYPE_TLS: return "TLS";
-       case EAP_TYPE_TTLS: return "TTLS";
-       case EAP_TYPE_PEAP: return "PEAP";
-       case EAP_TYPE_SIM: return "SIM";
-       case EAP_TYPE_FAST: return "FAST";
-       case EAP_TYPE_SAKE: return "SAKE";
-       case EAP_TYPE_PSK: return "PSK";
-       case EAP_TYPE_PAX: return "PAX";
-       default: return "Unknown";
-       }
-}
-
-
 static void handle_eap_response(struct hostapd_data *hapd,
                                struct sta_info *sta, struct eap_hdr *eap,
                                size_t len)
@@ -607,7 +585,7 @@ static void handle_eap_response(struct hostapd_data *hapd,
                       HOSTAPD_LEVEL_DEBUG, "received EAP packet (code=%d "
                       "id=%d len=%d) from STA: EAP Response-%s (%d)",
                       eap->code, eap->identifier, be_to_host16(eap->length),
-                      eap_type_text(type), type);
+                      eap_server_get_name(0, type), type);
 
        sm->dot1xAuthEapolRespFramesRx++;
 
@@ -667,6 +645,23 @@ static void handle_eap(struct hostapd_data *hapd, struct sta_info *sta,
 }
 
 
+static struct eapol_state_machine *
+ieee802_1x_alloc_eapol_sm(struct hostapd_data *hapd, struct sta_info *sta)
+{
+       int flags = 0;
+       if (sta->flags & WLAN_STA_PREAUTH)
+               flags |= EAPOL_SM_PREAUTH;
+       if (sta->wpa_sm) {
+               if (wpa_auth_sta_get_pmksa(sta->wpa_sm))
+                       flags |= EAPOL_SM_USES_WPA;
+               if (wpa_auth_sta_get_pmksa(sta->wpa_sm))
+                       flags |= EAPOL_SM_FROM_PMKSA_CACHE;
+       }
+       return eapol_auth_alloc(hapd->eapol_auth, sta->addr, flags,
+                               sta->wps_ie, sta);
+}
+
+
 /**
  * ieee802_1x_receive - Process the EAPOL frames from the Supplicant
  * @hapd: hostapd BSS data
@@ -741,9 +736,7 @@ void ieee802_1x_receive(struct hostapd_data *hapd, const u8 *sa, const u8 *buf,
                return;
 
        if (!sta->eapol_sm) {
-               sta->eapol_sm = eapol_auth_alloc(hapd->eapol_auth, sta->addr,
-                                                sta->flags & WLAN_STA_PREAUTH,
-                                                sta);
+               sta->eapol_sm = ieee802_1x_alloc_eapol_sm(hapd, sta);
                if (!sta->eapol_sm)
                        return;
 
@@ -860,9 +853,7 @@ void ieee802_1x_new_station(struct hostapd_data *hapd, struct sta_info *sta)
        if (sta->eapol_sm == NULL) {
                hostapd_logger(hapd, sta->addr, HOSTAPD_MODULE_IEEE8021X,
                               HOSTAPD_LEVEL_DEBUG, "start authentication");
-               sta->eapol_sm = eapol_auth_alloc(hapd->eapol_auth, sta->addr,
-                                                sta->flags & WLAN_STA_PREAUTH,
-                                                sta);
+               sta->eapol_sm = ieee802_1x_alloc_eapol_sm(hapd, sta);
                if (sta->eapol_sm == NULL) {
                        hostapd_logger(hapd, sta->addr,
                                       HOSTAPD_MODULE_IEEE8021X,
@@ -993,12 +984,14 @@ static void ieee802_1x_decapsulate_radius(struct hostapd_data *hapd,
                if (eap_type >= 0)
                        sm->eap_type_authsrv = eap_type;
                os_snprintf(buf, sizeof(buf), "EAP-Request-%s (%d)",
-                           eap_type >= 0 ? eap_type_text(eap_type) : "??",
+                           eap_type >= 0 ? eap_server_get_name(0, eap_type) :
+                           "??",
                            eap_type);
                break;
        case EAP_CODE_RESPONSE:
                os_snprintf(buf, sizeof(buf), "EAP Response-%s (%d)",
-                           eap_type >= 0 ? eap_type_text(eap_type) : "??",
+                           eap_type >= 0 ? eap_server_get_name(0, eap_type) :
+                           "??",
                            eap_type);
                break;
        case EAP_CODE_SUCCESS:
@@ -1396,45 +1389,6 @@ void ieee802_1x_abort_auth(struct hostapd_data *hapd, struct sta_info *sta)
 }
 
 
-#ifdef HOSTAPD_DUMP_STATE
-static void fprint_char(FILE *f, char c)
-{
-       if (c >= 32 && c < 127)
-               fprintf(f, "%c", c);
-       else
-               fprintf(f, "<%02x>", c);
-}
-
-
-void ieee802_1x_dump_state(FILE *f, const char *prefix, struct sta_info *sta)
-{
-       struct eapol_state_machine *sm = sta->eapol_sm;
-       if (sm == NULL)
-               return;
-
-       fprintf(f, "%sIEEE 802.1X:\n", prefix);
-
-       if (sm->identity) {
-               size_t i;
-               fprintf(f, "%sidentity=", prefix);
-               for (i = 0; i < sm->identity_len; i++)
-                       fprint_char(f, sm->identity[i]);
-               fprintf(f, "\n");
-       }
-
-       fprintf(f, "%slast EAP type: Authentication Server: %d (%s) "
-               "Supplicant: %d (%s)\n", prefix,
-               sm->eap_type_authsrv, eap_type_text(sm->eap_type_authsrv),
-               sm->eap_type_supp, eap_type_text(sm->eap_type_supp));
-
-       fprintf(f, "%scached_packets=%s\n", prefix,
-               sm->last_recv_radius ? "[RX RADIUS]" : "");
-
-       eapol_auth_dump_state(f, prefix, sm);
-}
-#endif /* HOSTAPD_DUMP_STATE */
-
-
 static int ieee802_1x_rekey_broadcast(struct hostapd_data *hapd)
 {
        struct eapol_authenticator *eapol = hapd->eapol_auth;
@@ -1649,6 +1603,22 @@ static void _ieee802_1x_tx_key(void *ctx, void *sta_ctx)
 }
 
 
+static void ieee802_1x_eapol_event(void *ctx, void *sta_ctx,
+                                  enum eapol_event type)
+{
+       /* struct hostapd_data *hapd = ctx; */
+       struct sta_info *sta = sta_ctx;
+       switch (type) {
+       case EAPOL_AUTH_SM_CHANGE:
+               wpa_auth_sm_notify(sta->wpa_sm);
+               break;
+       case EAPOL_AUTH_REAUTHENTICATE:
+               wpa_auth_sm_event(sta->wpa_sm, WPA_REAUTH_EAPOL);
+               break;
+       }
+}
+
+
 int ieee802_1x_init(struct hostapd_data *hapd)
 {
        int i;
@@ -1656,7 +1626,7 @@ int ieee802_1x_init(struct hostapd_data *hapd)
        struct eapol_auth_cb cb;
 
        os_memset(&conf, 0, sizeof(conf));
-       conf.hapd = hapd;
+       conf.ctx = hapd;
        conf.eap_reauth_period = hapd->conf->eap_reauth_period;
        conf.wpa = hapd->conf->wpa;
        conf.individual_wep_key_len = hapd->conf->individual_wep_key_len;
@@ -1686,6 +1656,7 @@ int ieee802_1x_init(struct hostapd_data *hapd)
        cb.set_port_authorized = ieee802_1x_set_port_authorized;
        cb.abort_auth = _ieee802_1x_abort_auth;
        cb.tx_key = _ieee802_1x_tx_key;
+       cb.eapol_event = ieee802_1x_eapol_event;
 
        hapd->eapol_auth = eapol_auth_init(&conf, &cb);
        if (hapd->eapol_auth == NULL)