eap_i.h

Go to the documentation of this file.
00001 
00016 #ifndef EAP_I_H
00017 #define EAP_I_H
00018 
00019 #include "eap.h"
00020 
00021 /* RFC 4137 - EAP Peer state machine */
00022 
00023 typedef enum {
00024         DECISION_FAIL, DECISION_COND_SUCC, DECISION_UNCOND_SUCC
00025 } EapDecision;
00026 
00027 typedef enum {
00028         METHOD_NONE, METHOD_INIT, METHOD_CONT, METHOD_MAY_CONT, METHOD_DONE
00029 } EapMethodState;
00030 
00040 struct eap_method_ret {
00045         Boolean ignore;
00046 
00051         EapMethodState methodState;
00052 
00057         EapDecision decision;
00058 
00063         Boolean allowNotifications;
00064 };
00065 
00066 
00074 struct eap_method {
00079         int vendor;
00080 
00085         EapType method;
00086 
00091         const char *name;
00092 
00104         void * (*init)(struct eap_sm *sm);
00105 
00114         void (*deinit)(struct eap_sm *sm, void *priv);
00115 
00134         u8 * (*process)(struct eap_sm *sm, void *priv,
00135                         struct eap_method_ret *ret,
00136                         const u8 *reqData, size_t reqDataLen,
00137                         size_t *respDataLen);
00138 
00146         Boolean (*isKeyAvailable)(struct eap_sm *sm, void *priv);
00147 
00160         u8 * (*getKey)(struct eap_sm *sm, void *priv, size_t *len);
00161 
00177         int (*get_status)(struct eap_sm *sm, void *priv, char *buf,
00178                           size_t buflen, int verbose);
00179 
00191         Boolean (*has_reauth_data)(struct eap_sm *sm, void *priv);
00192 
00205         void (*deinit_for_reauth)(struct eap_sm *sm, void *priv);
00206 
00218         void * (*init_for_reauth)(struct eap_sm *sm, void *priv);
00219 
00232         const u8 * (*get_identity)(struct eap_sm *sm, void *priv, size_t *len);
00233 
00248         void (*free)(struct eap_method *method);
00249 
00250 #define EAP_PEER_METHOD_INTERFACE_VERSION 1
00251 
00260         int version;
00261 
00269         struct eap_method *next;
00270 
00271 #ifdef CONFIG_DYNAMIC_EAP_METHODS
00272 
00280         void *dl_handle;
00281 #endif /* CONFIG_DYNAMIC_EAP_METHODS */
00282 
00295         u8 * (*get_emsk)(struct eap_sm *sm, void *priv, size_t *len);
00296 };
00297 
00298 
00303 struct eap_sm {
00304         enum {
00305                 EAP_INITIALIZE, EAP_DISABLED, EAP_IDLE, EAP_RECEIVED,
00306                 EAP_GET_METHOD, EAP_METHOD, EAP_SEND_RESPONSE, EAP_DISCARD,
00307                 EAP_IDENTITY, EAP_NOTIFICATION, EAP_RETRANSMIT, EAP_SUCCESS,
00308                 EAP_FAILURE
00309         } EAP_state;
00310         /* Long-term local variables */
00311         EapType selectedMethod;
00312         EapMethodState methodState;
00313         int lastId;
00314         u8 *lastRespData;
00315         size_t lastRespDataLen;
00316         EapDecision decision;
00317         /* Short-term local variables */
00318         Boolean rxReq;
00319         Boolean rxSuccess;
00320         Boolean rxFailure;
00321         int reqId;
00322         EapType reqMethod;
00323         int reqVendor;
00324         u32 reqVendorMethod;
00325         Boolean ignore;
00326         /* Constants */
00327         int ClientTimeout;
00328 
00329         /* Miscellaneous variables */
00330         Boolean allowNotifications; /* peer state machine <-> methods */
00331         u8 *eapRespData; /* peer to lower layer */
00332         size_t eapRespDataLen; /* peer to lower layer */
00333         Boolean eapKeyAvailable; /* peer to lower layer */
00334         u8 *eapKeyData; /* peer to lower layer */
00335         size_t eapKeyDataLen; /* peer to lower layer */
00336         const struct eap_method *m; /* selected EAP method */
00337         /* not defined in RFC 4137 */
00338         Boolean changed;
00339         void *eapol_ctx;
00340         struct eapol_callbacks *eapol_cb;
00341         void *eap_method_priv;
00342         int init_phase2;
00343         int fast_reauth;
00344 
00345         Boolean rxResp /* LEAP only */;
00346         Boolean leap_done;
00347         Boolean peap_done;
00348         u8 req_md5[16]; /* MD5() of the current EAP packet */
00349         u8 last_md5[16]; /* MD5() of the previously received EAP packet; used
00350                           * in duplicate request detection. */
00351 
00352         void *msg_ctx;
00353         void *scard_ctx;
00354         void *ssl_ctx;
00355 
00356         unsigned int workaround;
00357 
00358         /* Optional challenges generated in Phase 1 (EAP-FAST) */
00359         u8 *peer_challenge, *auth_challenge;
00360         int mschapv2_full_key; /* Request full MSCHAPv2 key */
00361 
00362         int num_rounds;
00363         int force_disabled;
00364 };
00365 
00366 const u8 * eap_hdr_validate(int vendor, EapType eap_type,
00367                             const u8 *msg, size_t msglen, size_t *plen);
00368 const u8 * eap_get_config_identity(struct eap_sm *sm, size_t *len);
00369 const u8 * eap_get_config_password(struct eap_sm *sm, size_t *len);
00370 const u8 * eap_get_config_new_password(struct eap_sm *sm, size_t *len);
00371 const u8 * eap_get_config_otp(struct eap_sm *sm, size_t *len);
00372 void eap_clear_config_otp(struct eap_sm *sm);
00373 struct wpa_ssid * eap_get_config(struct eap_sm *sm);
00374 void eap_set_config_blob(struct eap_sm *sm, struct wpa_config_blob *blob);
00375 const struct wpa_config_blob *
00376 eap_get_config_blob(struct eap_sm *sm, const char *name);
00377 struct eap_hdr * eap_msg_alloc(int vendor, EapType type, size_t *len,
00378                                size_t payload_len, u8 code, u8 identifier,
00379                                u8 **payload);
00380 void eap_notify_pending(struct eap_sm *sm);
00381 
00382 #endif /* EAP_I_H */
00383 

Generated on Sun Dec 31 13:48:53 2006 for wpa_supplicant by  doxygen 1.4.2