xref: /dflybsd-src/contrib/wpa_supplicant/src/eap_peer/eap_i.h (revision 6d49e1aea1f916afb9e202b8d2ad09cfab6e48c3)
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