1*6d49e1aeSJan Lentfer /* 2*6d49e1aeSJan Lentfer * EAP peer state machines internal structures (RFC 4137) 3*6d49e1aeSJan Lentfer * Copyright (c) 2004-2007, Jouni Malinen <j@w1.fi> 4*6d49e1aeSJan Lentfer * 5*6d49e1aeSJan Lentfer * This program is free software; you can redistribute it and/or modify 6*6d49e1aeSJan Lentfer * it under the terms of the GNU General Public License version 2 as 7*6d49e1aeSJan Lentfer * published by the Free Software Foundation. 8*6d49e1aeSJan Lentfer * 9*6d49e1aeSJan Lentfer * Alternatively, this software may be distributed under the terms of BSD 10*6d49e1aeSJan Lentfer * license. 11*6d49e1aeSJan Lentfer * 12*6d49e1aeSJan Lentfer * See README and COPYING for more details. 13*6d49e1aeSJan Lentfer */ 14*6d49e1aeSJan Lentfer 15*6d49e1aeSJan Lentfer #ifndef EAP_I_H 16*6d49e1aeSJan Lentfer #define EAP_I_H 17*6d49e1aeSJan Lentfer 18*6d49e1aeSJan Lentfer #include "wpabuf.h" 19*6d49e1aeSJan Lentfer #include "eap_peer/eap.h" 20*6d49e1aeSJan Lentfer #include "eap_common/eap_common.h" 21*6d49e1aeSJan Lentfer 22*6d49e1aeSJan Lentfer /* RFC 4137 - EAP Peer state machine */ 23*6d49e1aeSJan Lentfer 24*6d49e1aeSJan Lentfer typedef enum { 25*6d49e1aeSJan Lentfer DECISION_FAIL, DECISION_COND_SUCC, DECISION_UNCOND_SUCC 26*6d49e1aeSJan Lentfer } EapDecision; 27*6d49e1aeSJan Lentfer 28*6d49e1aeSJan Lentfer typedef enum { 29*6d49e1aeSJan Lentfer METHOD_NONE, METHOD_INIT, METHOD_CONT, METHOD_MAY_CONT, METHOD_DONE 30*6d49e1aeSJan Lentfer } EapMethodState; 31*6d49e1aeSJan Lentfer 32*6d49e1aeSJan Lentfer /** 33*6d49e1aeSJan Lentfer * struct eap_method_ret - EAP return values from struct eap_method::process() 34*6d49e1aeSJan Lentfer * 35*6d49e1aeSJan Lentfer * These structure contains OUT variables for the interface between peer state 36*6d49e1aeSJan Lentfer * machine and methods (RFC 4137, Sect. 4.2). eapRespData will be returned as 37*6d49e1aeSJan Lentfer * the return value of struct eap_method::process() so it is not included in 38*6d49e1aeSJan Lentfer * this structure. 39*6d49e1aeSJan Lentfer */ 40*6d49e1aeSJan Lentfer struct eap_method_ret { 41*6d49e1aeSJan Lentfer /** 42*6d49e1aeSJan Lentfer * ignore - Whether method decided to drop the current packed (OUT) 43*6d49e1aeSJan Lentfer */ 44*6d49e1aeSJan Lentfer Boolean ignore; 45*6d49e1aeSJan Lentfer 46*6d49e1aeSJan Lentfer /** 47*6d49e1aeSJan Lentfer * methodState - Method-specific state (IN/OUT) 48*6d49e1aeSJan Lentfer */ 49*6d49e1aeSJan Lentfer EapMethodState methodState; 50*6d49e1aeSJan Lentfer 51*6d49e1aeSJan Lentfer /** 52*6d49e1aeSJan Lentfer * decision - Authentication decision (OUT) 53*6d49e1aeSJan Lentfer */ 54*6d49e1aeSJan Lentfer EapDecision decision; 55*6d49e1aeSJan Lentfer 56*6d49e1aeSJan Lentfer /** 57*6d49e1aeSJan Lentfer * allowNotifications - Whether method allows notifications (OUT) 58*6d49e1aeSJan Lentfer */ 59*6d49e1aeSJan Lentfer Boolean allowNotifications; 60*6d49e1aeSJan Lentfer }; 61*6d49e1aeSJan Lentfer 62*6d49e1aeSJan Lentfer 63*6d49e1aeSJan Lentfer /** 64*6d49e1aeSJan Lentfer * struct eap_method - EAP method interface 65*6d49e1aeSJan Lentfer * This structure defines the EAP method interface. Each method will need to 66*6d49e1aeSJan Lentfer * register its own EAP type, EAP name, and set of function pointers for method 67*6d49e1aeSJan Lentfer * specific operations. This interface is based on section 4.4 of RFC 4137. 68*6d49e1aeSJan Lentfer */ 69*6d49e1aeSJan Lentfer struct eap_method { 70*6d49e1aeSJan Lentfer /** 71*6d49e1aeSJan Lentfer * vendor - EAP Vendor-ID (EAP_VENDOR_*) (0 = IETF) 72*6d49e1aeSJan Lentfer */ 73*6d49e1aeSJan Lentfer int vendor; 74*6d49e1aeSJan Lentfer 75*6d49e1aeSJan Lentfer /** 76*6d49e1aeSJan Lentfer * method - EAP type number (EAP_TYPE_*) 77*6d49e1aeSJan Lentfer */ 78*6d49e1aeSJan Lentfer EapType method; 79*6d49e1aeSJan Lentfer 80*6d49e1aeSJan Lentfer /** 81*6d49e1aeSJan Lentfer * name - Name of the method (e.g., "TLS") 82*6d49e1aeSJan Lentfer */ 83*6d49e1aeSJan Lentfer const char *name; 84*6d49e1aeSJan Lentfer 85*6d49e1aeSJan Lentfer /** 86*6d49e1aeSJan Lentfer * init - Initialize an EAP method 87*6d49e1aeSJan Lentfer * @sm: Pointer to EAP state machine allocated with eap_peer_sm_init() 88*6d49e1aeSJan Lentfer * Returns: Pointer to allocated private data, or %NULL on failure 89*6d49e1aeSJan Lentfer * 90*6d49e1aeSJan Lentfer * This function is used to initialize the EAP method explicitly 91*6d49e1aeSJan Lentfer * instead of using METHOD_INIT state as specific in RFC 4137. The 92*6d49e1aeSJan Lentfer * method is expected to initialize it method-specific state and return 93*6d49e1aeSJan Lentfer * a pointer that will be used as the priv argument to other calls. 94*6d49e1aeSJan Lentfer */ 95*6d49e1aeSJan Lentfer void * (*init)(struct eap_sm *sm); 96*6d49e1aeSJan Lentfer 97*6d49e1aeSJan Lentfer /** 98*6d49e1aeSJan Lentfer * deinit - Deinitialize an EAP method 99*6d49e1aeSJan Lentfer * @sm: Pointer to EAP state machine allocated with eap_peer_sm_init() 100*6d49e1aeSJan Lentfer * @priv: Pointer to private EAP method data from eap_method::init() 101*6d49e1aeSJan Lentfer * 102*6d49e1aeSJan Lentfer * Deinitialize the EAP method and free any allocated private data. 103*6d49e1aeSJan Lentfer */ 104*6d49e1aeSJan Lentfer void (*deinit)(struct eap_sm *sm, void *priv); 105*6d49e1aeSJan Lentfer 106*6d49e1aeSJan Lentfer /** 107*6d49e1aeSJan Lentfer * process - Process an EAP request 108*6d49e1aeSJan Lentfer * @sm: Pointer to EAP state machine allocated with eap_peer_sm_init() 109*6d49e1aeSJan Lentfer * @priv: Pointer to private EAP method data from eap_method::init() 110*6d49e1aeSJan Lentfer * @ret: Return values from EAP request validation and processing 111*6d49e1aeSJan Lentfer * @reqData: EAP request to be processed (eapReqData) 112*6d49e1aeSJan Lentfer * Returns: Pointer to allocated EAP response packet (eapRespData) 113*6d49e1aeSJan Lentfer * 114*6d49e1aeSJan Lentfer * This function is a combination of m.check(), m.process(), and 115*6d49e1aeSJan Lentfer * m.buildResp() procedures defined in section 4.4 of RFC 4137 In other 116*6d49e1aeSJan Lentfer * words, this function validates the incoming request, processes it, 117*6d49e1aeSJan Lentfer * and build a response packet. m.check() and m.process() return values 118*6d49e1aeSJan Lentfer * are returned through struct eap_method_ret *ret variable. Caller is 119*6d49e1aeSJan Lentfer * responsible for freeing the returned EAP response packet. 120*6d49e1aeSJan Lentfer */ 121*6d49e1aeSJan Lentfer struct wpabuf * (*process)(struct eap_sm *sm, void *priv, 122*6d49e1aeSJan Lentfer struct eap_method_ret *ret, 123*6d49e1aeSJan Lentfer const struct wpabuf *reqData); 124*6d49e1aeSJan Lentfer 125*6d49e1aeSJan Lentfer /** 126*6d49e1aeSJan Lentfer * isKeyAvailable - Find out whether EAP method has keying material 127*6d49e1aeSJan Lentfer * @sm: Pointer to EAP state machine allocated with eap_peer_sm_init() 128*6d49e1aeSJan Lentfer * @priv: Pointer to private EAP method data from eap_method::init() 129*6d49e1aeSJan Lentfer * Returns: %TRUE if key material (eapKeyData) is available 130*6d49e1aeSJan Lentfer */ 131*6d49e1aeSJan Lentfer Boolean (*isKeyAvailable)(struct eap_sm *sm, void *priv); 132*6d49e1aeSJan Lentfer 133*6d49e1aeSJan Lentfer /** 134*6d49e1aeSJan Lentfer * getKey - Get EAP method specific keying material (eapKeyData) 135*6d49e1aeSJan Lentfer * @sm: Pointer to EAP state machine allocated with eap_peer_sm_init() 136*6d49e1aeSJan Lentfer * @priv: Pointer to private EAP method data from eap_method::init() 137*6d49e1aeSJan Lentfer * @len: Pointer to variable to store key length (eapKeyDataLen) 138*6d49e1aeSJan Lentfer * Returns: Keying material (eapKeyData) or %NULL if not available 139*6d49e1aeSJan Lentfer * 140*6d49e1aeSJan Lentfer * This function can be used to get the keying material from the EAP 141*6d49e1aeSJan Lentfer * method. The key may already be stored in the method-specific private 142*6d49e1aeSJan Lentfer * data or this function may derive the key. 143*6d49e1aeSJan Lentfer */ 144*6d49e1aeSJan Lentfer u8 * (*getKey)(struct eap_sm *sm, void *priv, size_t *len); 145*6d49e1aeSJan Lentfer 146*6d49e1aeSJan Lentfer /** 147*6d49e1aeSJan Lentfer * get_status - Get EAP method status 148*6d49e1aeSJan Lentfer * @sm: Pointer to EAP state machine allocated with eap_peer_sm_init() 149*6d49e1aeSJan Lentfer * @priv: Pointer to private EAP method data from eap_method::init() 150*6d49e1aeSJan Lentfer * @buf: Buffer for status information 151*6d49e1aeSJan Lentfer * @buflen: Maximum buffer length 152*6d49e1aeSJan Lentfer * @verbose: Whether to include verbose status information 153*6d49e1aeSJan Lentfer * Returns: Number of bytes written to buf 154*6d49e1aeSJan Lentfer * 155*6d49e1aeSJan Lentfer * Query EAP method for status information. This function fills in a 156*6d49e1aeSJan Lentfer * text area with current status information from the EAP method. If 157*6d49e1aeSJan Lentfer * the buffer (buf) is not large enough, status information will be 158*6d49e1aeSJan Lentfer * truncated to fit the buffer. 159*6d49e1aeSJan Lentfer */ 160*6d49e1aeSJan Lentfer int (*get_status)(struct eap_sm *sm, void *priv, char *buf, 161*6d49e1aeSJan Lentfer size_t buflen, int verbose); 162*6d49e1aeSJan Lentfer 163*6d49e1aeSJan Lentfer /** 164*6d49e1aeSJan Lentfer * has_reauth_data - Whether method is ready for fast reauthentication 165*6d49e1aeSJan Lentfer * @sm: Pointer to EAP state machine allocated with eap_peer_sm_init() 166*6d49e1aeSJan Lentfer * @priv: Pointer to private EAP method data from eap_method::init() 167*6d49e1aeSJan Lentfer * Returns: %TRUE or %FALSE based on whether fast reauthentication is 168*6d49e1aeSJan Lentfer * possible 169*6d49e1aeSJan Lentfer * 170*6d49e1aeSJan Lentfer * This function is an optional handler that only EAP methods 171*6d49e1aeSJan Lentfer * supporting fast re-authentication need to implement. 172*6d49e1aeSJan Lentfer */ 173*6d49e1aeSJan Lentfer Boolean (*has_reauth_data)(struct eap_sm *sm, void *priv); 174*6d49e1aeSJan Lentfer 175*6d49e1aeSJan Lentfer /** 176*6d49e1aeSJan Lentfer * deinit_for_reauth - Release data that is not needed for fast re-auth 177*6d49e1aeSJan Lentfer * @sm: Pointer to EAP state machine allocated with eap_peer_sm_init() 178*6d49e1aeSJan Lentfer * @priv: Pointer to private EAP method data from eap_method::init() 179*6d49e1aeSJan Lentfer * 180*6d49e1aeSJan Lentfer * This function is an optional handler that only EAP methods 181*6d49e1aeSJan Lentfer * supporting fast re-authentication need to implement. This is called 182*6d49e1aeSJan Lentfer * when authentication has been completed and EAP state machine is 183*6d49e1aeSJan Lentfer * requesting that enough state information is maintained for fast 184*6d49e1aeSJan Lentfer * re-authentication 185*6d49e1aeSJan Lentfer */ 186*6d49e1aeSJan Lentfer void (*deinit_for_reauth)(struct eap_sm *sm, void *priv); 187*6d49e1aeSJan Lentfer 188*6d49e1aeSJan Lentfer /** 189*6d49e1aeSJan Lentfer * init_for_reauth - Prepare for start of fast re-authentication 190*6d49e1aeSJan Lentfer * @sm: Pointer to EAP state machine allocated with eap_peer_sm_init() 191*6d49e1aeSJan Lentfer * @priv: Pointer to private EAP method data from eap_method::init() 192*6d49e1aeSJan Lentfer * 193*6d49e1aeSJan Lentfer * This function is an optional handler that only EAP methods 194*6d49e1aeSJan Lentfer * supporting fast re-authentication need to implement. This is called 195*6d49e1aeSJan Lentfer * when EAP authentication is started and EAP state machine is 196*6d49e1aeSJan Lentfer * requesting fast re-authentication to be used. 197*6d49e1aeSJan Lentfer */ 198*6d49e1aeSJan Lentfer void * (*init_for_reauth)(struct eap_sm *sm, void *priv); 199*6d49e1aeSJan Lentfer 200*6d49e1aeSJan Lentfer /** 201*6d49e1aeSJan Lentfer * get_identity - Get method specific identity for re-authentication 202*6d49e1aeSJan Lentfer * @sm: Pointer to EAP state machine allocated with eap_peer_sm_init() 203*6d49e1aeSJan Lentfer * @priv: Pointer to private EAP method data from eap_method::init() 204*6d49e1aeSJan Lentfer * @len: Length of the returned identity 205*6d49e1aeSJan Lentfer * Returns: Pointer to the method specific identity or %NULL if default 206*6d49e1aeSJan Lentfer * identity is to be used 207*6d49e1aeSJan Lentfer * 208*6d49e1aeSJan Lentfer * This function is an optional handler that only EAP methods 209*6d49e1aeSJan Lentfer * that use method specific identity need to implement. 210*6d49e1aeSJan Lentfer */ 211*6d49e1aeSJan Lentfer const u8 * (*get_identity)(struct eap_sm *sm, void *priv, size_t *len); 212*6d49e1aeSJan Lentfer 213*6d49e1aeSJan Lentfer /** 214*6d49e1aeSJan Lentfer * free - Free EAP method data 215*6d49e1aeSJan Lentfer * @method: Pointer to the method data registered with 216*6d49e1aeSJan Lentfer * eap_peer_method_register(). 217*6d49e1aeSJan Lentfer * 218*6d49e1aeSJan Lentfer * This function will be called when the EAP method is being 219*6d49e1aeSJan Lentfer * unregistered. If the EAP method allocated resources during 220*6d49e1aeSJan Lentfer * registration (e.g., allocated struct eap_method), they should be 221*6d49e1aeSJan Lentfer * freed in this function. No other method functions will be called 222*6d49e1aeSJan Lentfer * after this call. If this function is not defined (i.e., function 223*6d49e1aeSJan Lentfer * pointer is %NULL), a default handler is used to release the method 224*6d49e1aeSJan Lentfer * data with free(method). This is suitable for most cases. 225*6d49e1aeSJan Lentfer */ 226*6d49e1aeSJan Lentfer void (*free)(struct eap_method *method); 227*6d49e1aeSJan Lentfer 228*6d49e1aeSJan Lentfer #define EAP_PEER_METHOD_INTERFACE_VERSION 1 229*6d49e1aeSJan Lentfer /** 230*6d49e1aeSJan Lentfer * version - Version of the EAP peer method interface 231*6d49e1aeSJan Lentfer * 232*6d49e1aeSJan Lentfer * The EAP peer method implementation should set this variable to 233*6d49e1aeSJan Lentfer * EAP_PEER_METHOD_INTERFACE_VERSION. This is used to verify that the 234*6d49e1aeSJan Lentfer * EAP method is using supported API version when using dynamically 235*6d49e1aeSJan Lentfer * loadable EAP methods. 236*6d49e1aeSJan Lentfer */ 237*6d49e1aeSJan Lentfer int version; 238*6d49e1aeSJan Lentfer 239*6d49e1aeSJan Lentfer /** 240*6d49e1aeSJan Lentfer * next - Pointer to the next EAP method 241*6d49e1aeSJan Lentfer * 242*6d49e1aeSJan Lentfer * This variable is used internally in the EAP method registration code 243*6d49e1aeSJan Lentfer * to create a linked list of registered EAP methods. 244*6d49e1aeSJan Lentfer */ 245*6d49e1aeSJan Lentfer struct eap_method *next; 246*6d49e1aeSJan Lentfer 247*6d49e1aeSJan Lentfer #ifdef CONFIG_DYNAMIC_EAP_METHODS 248*6d49e1aeSJan Lentfer /** 249*6d49e1aeSJan Lentfer * dl_handle - Handle for the dynamic library 250*6d49e1aeSJan Lentfer * 251*6d49e1aeSJan Lentfer * This variable is used internally in the EAP method registration code 252*6d49e1aeSJan Lentfer * to store a handle for the dynamic library. If the method is linked 253*6d49e1aeSJan Lentfer * in statically, this is %NULL. 254*6d49e1aeSJan Lentfer */ 255*6d49e1aeSJan Lentfer void *dl_handle; 256*6d49e1aeSJan Lentfer #endif /* CONFIG_DYNAMIC_EAP_METHODS */ 257*6d49e1aeSJan Lentfer 258*6d49e1aeSJan Lentfer /** 259*6d49e1aeSJan Lentfer * get_emsk - Get EAP method specific keying extended material (EMSK) 260*6d49e1aeSJan Lentfer * @sm: Pointer to EAP state machine allocated with eap_peer_sm_init() 261*6d49e1aeSJan Lentfer * @priv: Pointer to private EAP method data from eap_method::init() 262*6d49e1aeSJan Lentfer * @len: Pointer to a variable to store EMSK length 263*6d49e1aeSJan Lentfer * Returns: EMSK or %NULL if not available 264*6d49e1aeSJan Lentfer * 265*6d49e1aeSJan Lentfer * This function can be used to get the extended keying material from 266*6d49e1aeSJan Lentfer * the EAP method. The key may already be stored in the method-specific 267*6d49e1aeSJan Lentfer * private data or this function may derive the key. 268*6d49e1aeSJan Lentfer */ 269*6d49e1aeSJan Lentfer u8 * (*get_emsk)(struct eap_sm *sm, void *priv, size_t *len); 270*6d49e1aeSJan Lentfer }; 271*6d49e1aeSJan Lentfer 272*6d49e1aeSJan Lentfer 273*6d49e1aeSJan Lentfer /** 274*6d49e1aeSJan Lentfer * struct eap_sm - EAP state machine data 275*6d49e1aeSJan Lentfer */ 276*6d49e1aeSJan Lentfer struct eap_sm { 277*6d49e1aeSJan Lentfer enum { 278*6d49e1aeSJan Lentfer EAP_INITIALIZE, EAP_DISABLED, EAP_IDLE, EAP_RECEIVED, 279*6d49e1aeSJan Lentfer EAP_GET_METHOD, EAP_METHOD, EAP_SEND_RESPONSE, EAP_DISCARD, 280*6d49e1aeSJan Lentfer EAP_IDENTITY, EAP_NOTIFICATION, EAP_RETRANSMIT, EAP_SUCCESS, 281*6d49e1aeSJan Lentfer EAP_FAILURE 282*6d49e1aeSJan Lentfer } EAP_state; 283*6d49e1aeSJan Lentfer /* Long-term local variables */ 284*6d49e1aeSJan Lentfer EapType selectedMethod; 285*6d49e1aeSJan Lentfer EapMethodState methodState; 286*6d49e1aeSJan Lentfer int lastId; 287*6d49e1aeSJan Lentfer struct wpabuf *lastRespData; 288*6d49e1aeSJan Lentfer EapDecision decision; 289*6d49e1aeSJan Lentfer /* Short-term local variables */ 290*6d49e1aeSJan Lentfer Boolean rxReq; 291*6d49e1aeSJan Lentfer Boolean rxSuccess; 292*6d49e1aeSJan Lentfer Boolean rxFailure; 293*6d49e1aeSJan Lentfer int reqId; 294*6d49e1aeSJan Lentfer EapType reqMethod; 295*6d49e1aeSJan Lentfer int reqVendor; 296*6d49e1aeSJan Lentfer u32 reqVendorMethod; 297*6d49e1aeSJan Lentfer Boolean ignore; 298*6d49e1aeSJan Lentfer /* Constants */ 299*6d49e1aeSJan Lentfer int ClientTimeout; 300*6d49e1aeSJan Lentfer 301*6d49e1aeSJan Lentfer /* Miscellaneous variables */ 302*6d49e1aeSJan Lentfer Boolean allowNotifications; /* peer state machine <-> methods */ 303*6d49e1aeSJan Lentfer struct wpabuf *eapRespData; /* peer to lower layer */ 304*6d49e1aeSJan Lentfer Boolean eapKeyAvailable; /* peer to lower layer */ 305*6d49e1aeSJan Lentfer u8 *eapKeyData; /* peer to lower layer */ 306*6d49e1aeSJan Lentfer size_t eapKeyDataLen; /* peer to lower layer */ 307*6d49e1aeSJan Lentfer const struct eap_method *m; /* selected EAP method */ 308*6d49e1aeSJan Lentfer /* not defined in RFC 4137 */ 309*6d49e1aeSJan Lentfer Boolean changed; 310*6d49e1aeSJan Lentfer void *eapol_ctx; 311*6d49e1aeSJan Lentfer struct eapol_callbacks *eapol_cb; 312*6d49e1aeSJan Lentfer void *eap_method_priv; 313*6d49e1aeSJan Lentfer int init_phase2; 314*6d49e1aeSJan Lentfer int fast_reauth; 315*6d49e1aeSJan Lentfer 316*6d49e1aeSJan Lentfer Boolean rxResp /* LEAP only */; 317*6d49e1aeSJan Lentfer Boolean leap_done; 318*6d49e1aeSJan Lentfer Boolean peap_done; 319*6d49e1aeSJan Lentfer u8 req_md5[16]; /* MD5() of the current EAP packet */ 320*6d49e1aeSJan Lentfer u8 last_md5[16]; /* MD5() of the previously received EAP packet; used 321*6d49e1aeSJan Lentfer * in duplicate request detection. */ 322*6d49e1aeSJan Lentfer 323*6d49e1aeSJan Lentfer void *msg_ctx; 324*6d49e1aeSJan Lentfer void *scard_ctx; 325*6d49e1aeSJan Lentfer void *ssl_ctx; 326*6d49e1aeSJan Lentfer 327*6d49e1aeSJan Lentfer unsigned int workaround; 328*6d49e1aeSJan Lentfer 329*6d49e1aeSJan Lentfer /* Optional challenges generated in Phase 1 (EAP-FAST) */ 330*6d49e1aeSJan Lentfer u8 *peer_challenge, *auth_challenge; 331*6d49e1aeSJan Lentfer 332*6d49e1aeSJan Lentfer int num_rounds; 333*6d49e1aeSJan Lentfer int force_disabled; 334*6d49e1aeSJan Lentfer 335*6d49e1aeSJan Lentfer struct wps_context *wps; 336*6d49e1aeSJan Lentfer 337*6d49e1aeSJan Lentfer int prev_failure; 338*6d49e1aeSJan Lentfer }; 339*6d49e1aeSJan Lentfer 340*6d49e1aeSJan Lentfer const u8 * eap_get_config_identity(struct eap_sm *sm, size_t *len); 341*6d49e1aeSJan Lentfer const u8 * eap_get_config_password(struct eap_sm *sm, size_t *len); 342*6d49e1aeSJan Lentfer const u8 * eap_get_config_password2(struct eap_sm *sm, size_t *len, int *hash); 343*6d49e1aeSJan Lentfer const u8 * eap_get_config_new_password(struct eap_sm *sm, size_t *len); 344*6d49e1aeSJan Lentfer const u8 * eap_get_config_otp(struct eap_sm *sm, size_t *len); 345*6d49e1aeSJan Lentfer void eap_clear_config_otp(struct eap_sm *sm); 346*6d49e1aeSJan Lentfer const char * eap_get_config_phase1(struct eap_sm *sm); 347*6d49e1aeSJan Lentfer const char * eap_get_config_phase2(struct eap_sm *sm); 348*6d49e1aeSJan Lentfer struct eap_peer_config * eap_get_config(struct eap_sm *sm); 349*6d49e1aeSJan Lentfer void eap_set_config_blob(struct eap_sm *sm, struct wpa_config_blob *blob); 350*6d49e1aeSJan Lentfer const struct wpa_config_blob * 351*6d49e1aeSJan Lentfer eap_get_config_blob(struct eap_sm *sm, const char *name); 352*6d49e1aeSJan Lentfer void eap_notify_pending(struct eap_sm *sm); 353*6d49e1aeSJan Lentfer int eap_allowed_method(struct eap_sm *sm, int vendor, u32 method); 354*6d49e1aeSJan Lentfer 355*6d49e1aeSJan Lentfer #endif /* EAP_I_H */ 356