wpa.h

Go to the documentation of this file.
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]; /* Reserved */
00039         u8 key_mic[16];
00040         u16 key_data_length;
00041         /* followed by key_data_length bytes of key_data */
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) /* 1 = Pairwise, 0 = Group key */
00048 /* bit4..5 is used in WPA, but is reserved in IEEE 802.11i/RSN */
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) /* pairwise */
00052 #define WPA_KEY_INFO_TXRX BIT(6) /* group */
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 /* per STA state machine data */
00063 
00064 struct wpa_ptk {
00065         u8 mic_key[16]; /* EAPOL-Key MIC Key (MK) */
00066         u8 encr_key[16]; /* EAPOL-Key Encryption Key (EK) */
00067         u8 tk1[16]; /* Temporal Key 1 (TK1) */
00068         union {
00069                 u8 tk2[16]; /* Temporal Key 2 (TK2) */
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 /* CONFIG_IEEE80211W */
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 /* WPA_H */
00188 

Generated on Sun Dec 31 13:43:29 2006 for hostapd by  doxygen 1.4.2