2 * Example application showing how EAP peer code from wpa_supplicant can be
4 * Copyright (c) 2007, Jouni Malinen <j@w1.fi>
6 * This program is free software; you can redistribute it and/or modify
7 * it under the terms of the GNU General Public License version 2 as
8 * published by the Free Software Foundation.
10 * Alternatively, this software may be distributed under the terms of BSD
13 * See README and COPYING for more details.
19 #include "eap_peer/eap.h"
20 #include "eap_peer/eap_config.h"
23 void eap_example_server_rx(const u8
*data
, size_t data_len
);
34 Boolean altAccept
; /* for EAP */
35 Boolean altReject
; /* for EAP */
37 struct wpabuf
*eapReqData
; /* for EAP */
39 unsigned int idleWhile
; /* for EAP state machine */
41 struct eap_peer_config eap_config
;
46 static struct eap_peer_ctx eap_ctx
;
49 static struct eap_peer_config
* peer_get_config(void *ctx
)
51 struct eap_peer_ctx
*peer
= ctx
;
52 return &peer
->eap_config
;
56 static Boolean
peer_get_bool(void *ctx
, enum eapol_bool_var variable
)
58 struct eap_peer_ctx
*peer
= ctx
;
62 case EAPOL_eapSuccess
:
63 return peer
->eapSuccess
;
64 case EAPOL_eapRestart
:
65 return peer
->eapRestart
;
71 return peer
->eapNoResp
;
74 case EAPOL_portEnabled
:
75 return peer
->portEnabled
;
77 return peer
->altAccept
;
79 return peer
->altReject
;
85 static void peer_set_bool(void *ctx
, enum eapol_bool_var variable
,
88 struct eap_peer_ctx
*peer
= ctx
;
92 case EAPOL_eapSuccess
:
93 peer
->eapSuccess
= value
;
95 case EAPOL_eapRestart
:
96 peer
->eapRestart
= value
;
99 peer
->eapFail
= value
;
102 peer
->eapResp
= value
;
104 case EAPOL_eapNoResp
:
105 peer
->eapNoResp
= value
;
108 peer
->eapReq
= value
;
110 case EAPOL_portEnabled
:
111 peer
->portEnabled
= value
;
113 case EAPOL_altAccept
:
114 peer
->altAccept
= value
;
116 case EAPOL_altReject
:
117 peer
->altReject
= value
;
123 static unsigned int peer_get_int(void *ctx
, enum eapol_int_var variable
)
125 struct eap_peer_ctx
*peer
= ctx
;
129 case EAPOL_idleWhile
:
130 return peer
->idleWhile
;
136 static void peer_set_int(void *ctx
, enum eapol_int_var variable
,
139 struct eap_peer_ctx
*peer
= ctx
;
143 case EAPOL_idleWhile
:
144 peer
->idleWhile
= value
;
150 static struct wpabuf
* peer_get_eapReqData(void *ctx
)
152 struct eap_peer_ctx
*peer
= ctx
;
153 if (peer
== NULL
|| peer
->eapReqData
== NULL
)
156 return peer
->eapReqData
;
160 static void peer_set_config_blob(void *ctx
, struct wpa_config_blob
*blob
)
162 printf("TODO: %s\n", __func__
);
166 static const struct wpa_config_blob
*
167 peer_get_config_blob(void *ctx
, const char *name
)
169 printf("TODO: %s\n", __func__
);
174 static void peer_notify_pending(void *ctx
)
176 printf("TODO: %s\n", __func__
);
180 static struct eapol_callbacks eap_cb
;
181 static struct eap_config eap_conf
;
183 int eap_example_peer_init(void)
185 if (eap_peer_register_methods() < 0)
188 os_memset(&eap_ctx
, 0, sizeof(eap_ctx
));
190 eap_ctx
.eap_config
.identity
= (u8
*) os_strdup("user");
191 eap_ctx
.eap_config
.identity_len
= 4;
192 eap_ctx
.eap_config
.password
= (u8
*) os_strdup("password");
193 eap_ctx
.eap_config
.password_len
= 8;
194 eap_ctx
.eap_config
.ca_cert
= (u8
*) os_strdup("ca.pem");
195 eap_ctx
.eap_config
.fragment_size
= 1398;
197 os_memset(&eap_cb
, 0, sizeof(eap_cb
));
198 eap_cb
.get_config
= peer_get_config
;
199 eap_cb
.get_bool
= peer_get_bool
;
200 eap_cb
.set_bool
= peer_set_bool
;
201 eap_cb
.get_int
= peer_get_int
;
202 eap_cb
.set_int
= peer_set_int
;
203 eap_cb
.get_eapReqData
= peer_get_eapReqData
;
204 eap_cb
.set_config_blob
= peer_set_config_blob
;
205 eap_cb
.get_config_blob
= peer_get_config_blob
;
206 eap_cb
.notify_pending
= peer_notify_pending
;
208 os_memset(&eap_conf
, 0, sizeof(eap_conf
));
209 eap_ctx
.eap
= eap_peer_sm_init(&eap_ctx
, &eap_cb
, &eap_ctx
, &eap_conf
);
210 if (eap_ctx
.eap
== NULL
)
213 /* Enable "port" to allow authentication */
214 eap_ctx
.portEnabled
= TRUE
;
220 void eap_example_peer_deinit(void)
222 eap_peer_sm_deinit(eap_ctx
.eap
);
223 eap_peer_unregister_methods();
224 wpabuf_free(eap_ctx
.eapReqData
);
225 os_free(eap_ctx
.eap_config
.identity
);
226 os_free(eap_ctx
.eap_config
.password
);
227 os_free(eap_ctx
.eap_config
.ca_cert
);
231 int eap_example_peer_step(void)
234 res
= eap_peer_sm_step(eap_ctx
.eap
);
236 if (eap_ctx
.eapResp
) {
238 printf("==> Response\n");
239 eap_ctx
.eapResp
= FALSE
;
240 resp
= eap_get_eapRespData(eap_ctx
.eap
);
242 /* Send EAP response to the server */
243 eap_example_server_rx(wpabuf_head(resp
),
249 if (eap_ctx
.eapSuccess
) {
251 if (eap_key_available(eap_ctx
.eap
)) {
254 key
= eap_get_eapKeyData(eap_ctx
.eap
, &key_len
);
255 wpa_hexdump(MSG_DEBUG
, "EAP keying material",
264 void eap_example_peer_rx(const u8
*data
, size_t data_len
)
266 /* Make received EAP message available to the EAP library */
267 eap_ctx
.eapReq
= TRUE
;
268 wpabuf_free(eap_ctx
.eapReqData
);
269 eap_ctx
.eapReqData
= wpabuf_alloc_copy(data
, data_len
);