2 * Example application showing how EAP peer code from wpa_supplicant can be
4 * Copyright (c) 2007, Jouni Malinen <j@w1.fi>
6 * This software may be distributed under the terms of the BSD license.
7 * See README for more details.
13 #include "eap_peer/eap.h"
14 #include "eap_peer/eap_config.h"
17 void eap_example_server_rx(const u8 *data, size_t data_len);
28 Boolean altAccept; /* for EAP */
29 Boolean altReject; /* for EAP */
31 struct wpabuf *eapReqData; /* for EAP */
33 unsigned int idleWhile; /* for EAP state machine */
35 struct eap_peer_config eap_config;
40 static struct eap_peer_ctx eap_ctx;
43 static struct eap_peer_config * peer_get_config(void *ctx)
45 struct eap_peer_ctx *peer = ctx;
46 return &peer->eap_config;
50 static Boolean peer_get_bool(void *ctx, enum eapol_bool_var variable)
52 struct eap_peer_ctx *peer = ctx;
56 case EAPOL_eapSuccess:
57 return peer->eapSuccess;
58 case EAPOL_eapRestart:
59 return peer->eapRestart;
65 return peer->eapNoResp;
68 case EAPOL_portEnabled:
69 return peer->portEnabled;
71 return peer->altAccept;
73 return peer->altReject;
79 static void peer_set_bool(void *ctx, enum eapol_bool_var variable,
82 struct eap_peer_ctx *peer = ctx;
86 case EAPOL_eapSuccess:
87 peer->eapSuccess = value;
89 case EAPOL_eapRestart:
90 peer->eapRestart = value;
93 peer->eapFail = value;
96 peer->eapResp = value;
99 peer->eapNoResp = value;
102 peer->eapReq = value;
104 case EAPOL_portEnabled:
105 peer->portEnabled = value;
107 case EAPOL_altAccept:
108 peer->altAccept = value;
110 case EAPOL_altReject:
111 peer->altReject = value;
117 static unsigned int peer_get_int(void *ctx, enum eapol_int_var variable)
119 struct eap_peer_ctx *peer = ctx;
123 case EAPOL_idleWhile:
124 return peer->idleWhile;
130 static void peer_set_int(void *ctx, enum eapol_int_var variable,
133 struct eap_peer_ctx *peer = ctx;
137 case EAPOL_idleWhile:
138 peer->idleWhile = value;
144 static struct wpabuf * peer_get_eapReqData(void *ctx)
146 struct eap_peer_ctx *peer = ctx;
147 if (peer == NULL || peer->eapReqData == NULL)
150 return peer->eapReqData;
154 static void peer_set_config_blob(void *ctx, struct wpa_config_blob *blob)
156 printf("TODO: %s\n", __func__);
160 static const struct wpa_config_blob *
161 peer_get_config_blob(void *ctx, const char *name)
163 printf("TODO: %s\n", __func__);
168 static void peer_notify_pending(void *ctx)
170 printf("TODO: %s\n", __func__);
174 static int eap_peer_register_methods(void)
180 ret = eap_peer_md5_register();
185 ret = eap_peer_tls_register();
190 ret = eap_peer_mschapv2_register();
191 #endif /* EAP_MSCHAPv2 */
195 ret = eap_peer_peap_register();
196 #endif /* EAP_PEAP */
200 ret = eap_peer_ttls_register();
201 #endif /* EAP_TTLS */
205 ret = eap_peer_gtc_register();
210 ret = eap_peer_otp_register();
215 ret = eap_peer_sim_register();
220 ret = eap_peer_leap_register();
221 #endif /* EAP_LEAP */
225 ret = eap_peer_psk_register();
230 ret = eap_peer_aka_register();
235 ret = eap_peer_aka_prime_register();
236 #endif /* EAP_AKA_PRIME */
240 ret = eap_peer_fast_register();
241 #endif /* EAP_FAST */
245 ret = eap_peer_pax_register();
250 ret = eap_peer_sake_register();
251 #endif /* EAP_SAKE */
255 ret = eap_peer_gpsk_register();
256 #endif /* EAP_GPSK */
260 ret = eap_peer_wsc_register();
265 ret = eap_peer_ikev2_register();
266 #endif /* EAP_IKEV2 */
268 #ifdef EAP_VENDOR_TEST
270 ret = eap_peer_vendor_test_register();
271 #endif /* EAP_VENDOR_TEST */
275 ret = eap_peer_tnc_register();
282 static struct eapol_callbacks eap_cb;
283 static struct eap_config eap_conf;
285 int eap_example_peer_init(void)
287 if (eap_peer_register_methods() < 0)
290 os_memset(&eap_ctx, 0, sizeof(eap_ctx));
292 eap_ctx.eap_config.identity = (u8 *) os_strdup("user");
293 eap_ctx.eap_config.identity_len = 4;
294 eap_ctx.eap_config.password = (u8 *) os_strdup("password");
295 eap_ctx.eap_config.password_len = 8;
296 eap_ctx.eap_config.ca_cert = (u8 *) os_strdup("ca.pem");
297 eap_ctx.eap_config.fragment_size = 1398;
299 os_memset(&eap_cb, 0, sizeof(eap_cb));
300 eap_cb.get_config = peer_get_config;
301 eap_cb.get_bool = peer_get_bool;
302 eap_cb.set_bool = peer_set_bool;
303 eap_cb.get_int = peer_get_int;
304 eap_cb.set_int = peer_set_int;
305 eap_cb.get_eapReqData = peer_get_eapReqData;
306 eap_cb.set_config_blob = peer_set_config_blob;
307 eap_cb.get_config_blob = peer_get_config_blob;
308 eap_cb.notify_pending = peer_notify_pending;
310 os_memset(&eap_conf, 0, sizeof(eap_conf));
311 eap_ctx.eap = eap_peer_sm_init(&eap_ctx, &eap_cb, &eap_ctx, &eap_conf);
312 if (eap_ctx.eap == NULL)
315 /* Enable "port" to allow authentication */
316 eap_ctx.portEnabled = TRUE;
322 void eap_example_peer_deinit(void)
324 eap_peer_sm_deinit(eap_ctx.eap);
325 eap_peer_unregister_methods();
326 wpabuf_free(eap_ctx.eapReqData);
327 os_free(eap_ctx.eap_config.identity);
328 os_free(eap_ctx.eap_config.password);
329 os_free(eap_ctx.eap_config.ca_cert);
333 int eap_example_peer_step(void)
336 res = eap_peer_sm_step(eap_ctx.eap);
338 if (eap_ctx.eapResp) {
340 printf("==> Response\n");
341 eap_ctx.eapResp = FALSE;
342 resp = eap_get_eapRespData(eap_ctx.eap);
344 /* Send EAP response to the server */
345 eap_example_server_rx(wpabuf_head(resp),
351 if (eap_ctx.eapSuccess) {
353 if (eap_key_available(eap_ctx.eap)) {
356 key = eap_get_eapKeyData(eap_ctx.eap, &key_len);
357 wpa_hexdump(MSG_DEBUG, "EAP keying material",
366 void eap_example_peer_rx(const u8 *data, size_t data_len)
368 /* Make received EAP message available to the EAP library */
369 eap_ctx.eapReq = TRUE;
370 wpabuf_free(eap_ctx.eapReqData);
371 eap_ctx.eapReqData = wpabuf_alloc_copy(data, data_len);