00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015 #ifndef EAPOL_SUPP_SM_H
00016 #define EAPOL_SUPP_SM_H
00017
00018 #include "common/defs.h"
00019
00020 typedef enum { Unauthorized, Authorized } PortStatus;
00021 typedef enum { Auto, ForceUnauthorized, ForceAuthorized } PortControl;
00022
00026 struct eapol_config {
00035 int accept_802_1x_keys;
00036
00037 #define EAPOL_REQUIRE_KEY_UNICAST BIT(0)
00038 #define EAPOL_REQUIRE_KEY_BROADCAST BIT(1)
00039
00046 int required_keys;
00047
00051 int fast_reauth;
00052
00056 unsigned int workaround;
00057
00061 int eap_disabled;
00062 };
00063
00064 struct eapol_sm;
00065 struct wpa_config_blob;
00066
00070 struct eapol_ctx {
00074 void *ctx;
00075
00082 int preauth;
00083
00095 void (*cb)(struct eapol_sm *eapol, int success, void *ctx);
00096
00100 void *cb_ctx;
00101
00105 void *msg_ctx;
00106
00112 void *scard_ctx;
00113
00117 void *eapol_send_ctx;
00118
00127 void (*eapol_done_cb)(void *ctx);
00128
00137 int (*eapol_send)(void *ctx, int type, const u8 *buf, size_t len);
00138
00148 int (*set_wep_key)(void *ctx, int unicast, int keyidx,
00149 const u8 *key, size_t keylen);
00150
00159 void (*set_config_blob)(void *ctx, struct wpa_config_blob *blob);
00160
00167 const struct wpa_config_blob * (*get_config_blob)(void *ctx,
00168 const char *name);
00169
00174 void (*aborted_cached)(void *ctx);
00175
00182 const char *opensc_engine_path;
00183
00190 const char *pkcs11_engine_path;
00191
00199 const char *pkcs11_module_path;
00200
00206 struct wps_context *wps;
00207
00214 void (*eap_param_needed)(void *ctx, const char *field,
00215 const char *txt);
00216
00222 void (*port_cb)(void *ctx, int authorized);
00223 };
00224
00225
00226 struct eap_peer_config;
00227
00228 #ifdef IEEE8021X_EAPOL
00229 struct eapol_sm *eapol_sm_init(struct eapol_ctx *ctx);
00230 void eapol_sm_deinit(struct eapol_sm *sm);
00231 void eapol_sm_step(struct eapol_sm *sm);
00232 int eapol_sm_get_status(struct eapol_sm *sm, char *buf, size_t buflen,
00233 int verbose);
00234 int eapol_sm_get_mib(struct eapol_sm *sm, char *buf, size_t buflen);
00235 void eapol_sm_configure(struct eapol_sm *sm, int heldPeriod, int authPeriod,
00236 int startPeriod, int maxStart);
00237 int eapol_sm_rx_eapol(struct eapol_sm *sm, const u8 *src, const u8 *buf,
00238 size_t len);
00239 void eapol_sm_notify_tx_eapol_key(struct eapol_sm *sm);
00240 void eapol_sm_notify_portEnabled(struct eapol_sm *sm, Boolean enabled);
00241 void eapol_sm_notify_portValid(struct eapol_sm *sm, Boolean valid);
00242 void eapol_sm_notify_eap_success(struct eapol_sm *sm, Boolean success);
00243 void eapol_sm_notify_eap_fail(struct eapol_sm *sm, Boolean fail);
00244 void eapol_sm_notify_config(struct eapol_sm *sm,
00245 struct eap_peer_config *config,
00246 const struct eapol_config *conf);
00247 int eapol_sm_get_key(struct eapol_sm *sm, u8 *key, size_t len);
00248 void eapol_sm_notify_logoff(struct eapol_sm *sm, Boolean logoff);
00249 void eapol_sm_notify_cached(struct eapol_sm *sm);
00250 void eapol_sm_notify_pmkid_attempt(struct eapol_sm *sm, int attempt);
00251 void eapol_sm_register_scard_ctx(struct eapol_sm *sm, void *ctx);
00252 void eapol_sm_notify_portControl(struct eapol_sm *sm, PortControl portControl);
00253 void eapol_sm_notify_ctrl_attached(struct eapol_sm *sm);
00254 void eapol_sm_notify_ctrl_response(struct eapol_sm *sm);
00255 void eapol_sm_request_reauth(struct eapol_sm *sm);
00256 void eapol_sm_notify_lower_layer_success(struct eapol_sm *sm, int in_eapol_sm);
00257 void eapol_sm_invalidate_cached_session(struct eapol_sm *sm);
00258 #else
00259 static inline struct eapol_sm *eapol_sm_init(struct eapol_ctx *ctx)
00260 {
00261 free(ctx);
00262 return (struct eapol_sm *) 1;
00263 }
00264 static inline void eapol_sm_deinit(struct eapol_sm *sm)
00265 {
00266 }
00267 static inline void eapol_sm_step(struct eapol_sm *sm)
00268 {
00269 }
00270 static inline int eapol_sm_get_status(struct eapol_sm *sm, char *buf,
00271 size_t buflen, int verbose)
00272 {
00273 return 0;
00274 }
00275 static inline int eapol_sm_get_mib(struct eapol_sm *sm, char *buf,
00276 size_t buflen)
00277 {
00278 return 0;
00279 }
00280 static inline void eapol_sm_configure(struct eapol_sm *sm, int heldPeriod,
00281 int authPeriod, int startPeriod,
00282 int maxStart)
00283 {
00284 }
00285 static inline int eapol_sm_rx_eapol(struct eapol_sm *sm, const u8 *src,
00286 const u8 *buf, size_t len)
00287 {
00288 return 0;
00289 }
00290 static inline void eapol_sm_notify_tx_eapol_key(struct eapol_sm *sm)
00291 {
00292 }
00293 static inline void eapol_sm_notify_portEnabled(struct eapol_sm *sm,
00294 Boolean enabled)
00295 {
00296 }
00297 static inline void eapol_sm_notify_portValid(struct eapol_sm *sm,
00298 Boolean valid)
00299 {
00300 }
00301 static inline void eapol_sm_notify_eap_success(struct eapol_sm *sm,
00302 Boolean success)
00303 {
00304 }
00305 static inline void eapol_sm_notify_eap_fail(struct eapol_sm *sm, Boolean fail)
00306 {
00307 }
00308 static inline void eapol_sm_notify_config(struct eapol_sm *sm,
00309 struct eap_peer_config *config,
00310 struct eapol_config *conf)
00311 {
00312 }
00313 static inline int eapol_sm_get_key(struct eapol_sm *sm, u8 *key, size_t len)
00314 {
00315 return -1;
00316 }
00317 static inline void eapol_sm_notify_logoff(struct eapol_sm *sm, Boolean logoff)
00318 {
00319 }
00320 static inline void eapol_sm_notify_cached(struct eapol_sm *sm)
00321 {
00322 }
00323 #define eapol_sm_notify_pmkid_attempt(sm, attempt) do { } while (0)
00324 #define eapol_sm_register_scard_ctx(sm, ctx) do { } while (0)
00325 static inline void eapol_sm_notify_portControl(struct eapol_sm *sm,
00326 PortControl portControl)
00327 {
00328 }
00329 static inline void eapol_sm_notify_ctrl_attached(struct eapol_sm *sm)
00330 {
00331 }
00332 static inline void eapol_sm_notify_ctrl_response(struct eapol_sm *sm)
00333 {
00334 }
00335 static inline void eapol_sm_request_reauth(struct eapol_sm *sm)
00336 {
00337 }
00338 static inline void eapol_sm_notify_lower_layer_success(struct eapol_sm *sm,
00339 int in_eapol_sm)
00340 {
00341 }
00342 static inline void eapol_sm_invalidate_cached_session(struct eapol_sm *sm)
00343 {
00344 }
00345 #endif
00346
00347 #endif