00001
00016 #ifndef WPA_H
00017 #define WPA_H
00018
00019 #include "wpa_common.h"
00020
00021 #define WPA_PMK_LEN PMK_LEN
00022 #define WPA_GMK_LEN 32
00023 #define WPA_GTK_MAX_LEN 32
00024 #define PMKID_LEN 16
00025
00026 #define WPA_CAPABILITY_PREAUTH BIT(0)
00027 #define WPA_CAPABILITY_MGMT_FRAME_PROTECTION BIT(6)
00028 #define WPA_CAPABILITY_PEERKEY_ENABLED BIT(9)
00029
00030 struct wpa_eapol_key {
00031 u8 type;
00032 u16 key_info;
00033 u16 key_length;
00034 u8 replay_counter[WPA_REPLAY_COUNTER_LEN];
00035 u8 key_nonce[WPA_NONCE_LEN];
00036 u8 key_iv[16];
00037 u8 key_rsc[WPA_KEY_RSC_LEN];
00038 u8 key_id[8];
00039 u8 key_mic[16];
00040 u16 key_data_length;
00041
00042 } __attribute__ ((packed));
00043
00044 #define WPA_KEY_INFO_TYPE_MASK (BIT(0) | BIT(1) | BIT(2))
00045 #define WPA_KEY_INFO_TYPE_HMAC_MD5_RC4 BIT(0)
00046 #define WPA_KEY_INFO_TYPE_HMAC_SHA1_AES BIT(1)
00047 #define WPA_KEY_INFO_KEY_TYPE BIT(3)
00048
00049 #define WPA_KEY_INFO_KEY_INDEX_MASK (BIT(4) | BIT(5))
00050 #define WPA_KEY_INFO_KEY_INDEX_SHIFT 4
00051 #define WPA_KEY_INFO_INSTALL BIT(6)
00052 #define WPA_KEY_INFO_TXRX BIT(6)
00053 #define WPA_KEY_INFO_ACK BIT(7)
00054 #define WPA_KEY_INFO_MIC BIT(8)
00055 #define WPA_KEY_INFO_SECURE BIT(9)
00056 #define WPA_KEY_INFO_ERROR BIT(10)
00057 #define WPA_KEY_INFO_REQUEST BIT(11)
00058 #define WPA_KEY_INFO_ENCR_KEY_DATA BIT(12)
00059 #define WPA_KEY_INFO_SMK_MESSAGE BIT(13)
00060
00061
00062
00063
00064 struct wpa_ptk {
00065 u8 mic_key[16];
00066 u8 encr_key[16];
00067 u8 tk1[16];
00068 union {
00069 u8 tk2[16];
00070 struct {
00071 u8 tx_mic_key[8];
00072 u8 rx_mic_key[8];
00073 } auth;
00074 } u;
00075 } __attribute__ ((packed));
00076
00077 struct wpa_authenticator;
00078 struct wpa_state_machine;
00079 struct rsn_pmksa_cache_entry;
00080
00081
00082 struct wpa_auth_config {
00083 int wpa;
00084 int wpa_key_mgmt;
00085 int wpa_pairwise;
00086 int wpa_group;
00087 int wpa_group_rekey;
00088 int wpa_strict_rekey;
00089 int wpa_gmk_rekey;
00090 int rsn_preauth;
00091 int eapol_version;
00092 int peerkey;
00093 int wme_enabled;
00094 #ifdef CONFIG_IEEE80211W
00095 enum {
00096 WPA_NO_IEEE80211W = 0,
00097 WPA_IEEE80211W_OPTIONAL = 1,
00098 WPA_IEEE80211W_REQUIRED = 2
00099 } ieee80211w;
00100 #endif
00101 };
00102
00103 typedef enum {
00104 LOGGER_DEBUG, LOGGER_INFO, LOGGER_WARNING
00105 } logger_level;
00106
00107 typedef enum {
00108 WPA_EAPOL_portEnabled, WPA_EAPOL_portValid, WPA_EAPOL_authorized,
00109 WPA_EAPOL_portControl_Auto, WPA_EAPOL_keyRun, WPA_EAPOL_keyAvailable,
00110 WPA_EAPOL_keyDone, WPA_EAPOL_inc_EapolFramesTx
00111 } wpa_eapol_variable;
00112
00113 struct wpa_auth_callbacks {
00114 void *ctx;
00115 void (*logger)(void *ctx, const u8 *addr, logger_level level,
00116 const char *txt);
00117 void (*disconnect)(void *ctx, const u8 *addr, u16 reason);
00118 void (*mic_failure_report)(void *ctx, const u8 *addr);
00119 void (*set_eapol)(void *ctx, const u8 *addr, wpa_eapol_variable var,
00120 int value);
00121 int (*get_eapol)(void *ctx, const u8 *addr, wpa_eapol_variable var);
00122 const u8 * (*get_psk)(void *ctx, const u8 *addr, const u8 *prev_psk);
00123 int (*get_pmk)(void *ctx, const u8 *addr, u8 *pmk, size_t *len);
00124 int (*set_key)(void *ctx, int vlan_id, const char *alg, const u8 *addr,
00125 int idx, u8 *key, size_t key_len);
00126 int (*get_seqnum)(void *ctx, const u8 *addr, int idx, u8 *seq);
00127 int (*get_seqnum_igtk)(void *ctx, const u8 *addr, int idx, u8 *seq);
00128 int (*send_eapol)(void *ctx, const u8 *addr, const u8 *data,
00129 size_t data_len, int encrypt);
00130 int (*for_each_sta)(void *ctx, int (*cb)(struct wpa_state_machine *sm,
00131 void *ctx), void *cb_ctx);
00132 };
00133
00134 struct wpa_authenticator * wpa_init(const u8 *addr,
00135 struct wpa_auth_config *conf,
00136 struct wpa_auth_callbacks *cb);
00137 void wpa_deinit(struct wpa_authenticator *wpa_auth);
00138 int wpa_reconfig(struct wpa_authenticator *wpa_auth,
00139 struct wpa_auth_config *conf);
00140
00141 enum {
00142 WPA_IE_OK, WPA_INVALID_IE, WPA_INVALID_GROUP, WPA_INVALID_PAIRWISE,
00143 WPA_INVALID_AKMP, WPA_NOT_ENABLED, WPA_ALLOC_FAIL,
00144 WPA_MGMT_FRAME_PROTECTION_VIOLATION, WPA_INVALID_MGMT_GROUP_CIPHER
00145 };
00146
00147 int wpa_validate_wpa_ie(struct wpa_authenticator *wpa_auth,
00148 struct wpa_state_machine *sm,
00149 const u8 *wpa_ie, size_t wpa_ie_len);
00150 struct wpa_state_machine *
00151 wpa_auth_sta_init(struct wpa_authenticator *wpa_auth, const u8 *addr);
00152 void wpa_auth_sta_associated(struct wpa_authenticator *wpa_auth,
00153 struct wpa_state_machine *sm);
00154 void wpa_auth_sta_deinit(struct wpa_state_machine *sm);
00155 void wpa_receive(struct wpa_authenticator *wpa_auth,
00156 struct wpa_state_machine *sm,
00157 u8 *data, size_t data_len);
00158 typedef enum {
00159 WPA_AUTH, WPA_ASSOC, WPA_DISASSOC, WPA_DEAUTH, WPA_REAUTH,
00160 WPA_REAUTH_EAPOL
00161 } wpa_event;
00162 void wpa_remove_ptk(struct wpa_state_machine *sm);
00163 void wpa_auth_sm_event(struct wpa_state_machine *sm, wpa_event event);
00164 void wpa_auth_sm_notify(struct wpa_state_machine *sm);
00165 void wpa_gtk_rekey(struct wpa_authenticator *wpa_auth);
00166 int wpa_get_mib(struct wpa_authenticator *wpa_auth, char *buf, size_t buflen);
00167 int wpa_get_mib_sta(struct wpa_state_machine *sm, char *buf, size_t buflen);
00168 void wpa_auth_countermeasures_start(struct wpa_authenticator *wpa_auth);
00169 int wpa_auth_pairwise_set(struct wpa_state_machine *sm);
00170 int wpa_auth_sta_key_mgmt(struct wpa_state_machine *sm);
00171 int wpa_auth_sta_wpa_version(struct wpa_state_machine *sm);
00172 int wpa_auth_sta_clear_pmksa(struct wpa_state_machine *sm,
00173 struct rsn_pmksa_cache_entry *entry);
00174 struct rsn_pmksa_cache_entry *
00175 wpa_auth_sta_get_pmksa(struct wpa_state_machine *sm);
00176 void wpa_auth_sta_local_mic_failure_report(struct wpa_state_machine *sm);
00177 const u8 * wpa_auth_get_wpa_ie(struct wpa_authenticator *wpa_auth,
00178 size_t *len);
00179 int wpa_auth_pmksa_add(struct wpa_state_machine *sm, const u8 *pmk,
00180 int session_timeout, struct eapol_state_machine *eapol);
00181 int wpa_auth_pmksa_add_preauth(struct wpa_authenticator *wpa_auth,
00182 const u8 *pmk, size_t len, const u8 *sta_addr,
00183 int session_timeout,
00184 struct eapol_state_machine *eapol);
00185 int wpa_auth_sta_set_vlan(struct wpa_state_machine *sm, int vlan_id);
00186
00187 #endif
00188