2
* EAP peer method: Test method for vendor specific (expanded) EAP type
3
* Copyright (c) 2005-2006, Jouni Malinen <j@w1.fi>
5
* This program is free software; you can redistribute it and/or modify
6
* it under the terms of the GNU General Public License version 2 as
7
* published by the Free Software Foundation.
9
* Alternatively, this software may be distributed under the terms of BSD
12
* See README and COPYING for more details.
14
* This file implements a vendor specific test method using EAP expanded types.
15
* This is only for test use and must not be used for authentication since no
16
* security is provided.
23
#ifdef TEST_PENDING_REQUEST
25
#endif /* TEST_PENDING_REQUEST */
28
#define EAP_VENDOR_ID 0xfffefd
29
#define EAP_VENDOR_TYPE 0xfcfbfaf9
32
/* #define TEST_PENDING_REQUEST */
34
struct eap_vendor_test_data {
35
enum { INIT, CONFIRM, SUCCESS } state;
40
static void * eap_vendor_test_init(struct eap_sm *sm)
42
struct eap_vendor_test_data *data;
43
data = os_zalloc(sizeof(*data));
52
static void eap_vendor_test_deinit(struct eap_sm *sm, void *priv)
54
struct eap_vendor_test_data *data = priv;
59
#ifdef TEST_PENDING_REQUEST
60
static void eap_vendor_ready(void *eloop_ctx, void *timeout_ctx)
62
struct eap_sm *sm = eloop_ctx;
63
wpa_printf(MSG_DEBUG, "EAP-VENDOR-TEST: Ready to re-process pending "
65
eap_notify_pending(sm);
67
#endif /* TEST_PENDING_REQUEST */
70
static struct wpabuf * eap_vendor_test_process(struct eap_sm *sm, void *priv,
71
struct eap_method_ret *ret,
72
const struct wpabuf *reqData)
74
struct eap_vendor_test_data *data = priv;
79
pos = eap_hdr_validate(EAP_VENDOR_ID, EAP_VENDOR_TYPE, reqData, &len);
80
if (pos == NULL || len < 1) {
85
if (data->state == INIT && *pos != 1) {
86
wpa_printf(MSG_DEBUG, "EAP-VENDOR-TEST: Unexpected message "
87
"%d in INIT state", *pos);
92
if (data->state == CONFIRM && *pos != 3) {
93
wpa_printf(MSG_DEBUG, "EAP-VENDOR-TEST: Unexpected message "
94
"%d in CONFIRM state", *pos);
99
if (data->state == SUCCESS) {
100
wpa_printf(MSG_DEBUG, "EAP-VENDOR-TEST: Unexpected message "
106
if (data->state == CONFIRM) {
107
#ifdef TEST_PENDING_REQUEST
108
if (data->first_try) {
110
wpa_printf(MSG_DEBUG, "EAP-VENDOR-TEST: Testing "
113
eloop_register_timeout(1, 0, eap_vendor_ready, sm,
117
#endif /* TEST_PENDING_REQUEST */
122
wpa_printf(MSG_DEBUG, "EAP-VENDOR-TEST: Generating Response");
123
ret->allowNotifications = TRUE;
125
resp = eap_msg_alloc(EAP_VENDOR_ID, EAP_VENDOR_TYPE, 1,
126
EAP_CODE_RESPONSE, eap_get_id(reqData));
130
if (data->state == INIT) {
131
wpabuf_put_u8(resp, 2);
132
data->state = CONFIRM;
133
ret->methodState = METHOD_CONT;
134
ret->decision = DECISION_FAIL;
136
wpabuf_put_u8(resp, 4);
137
data->state = SUCCESS;
138
ret->methodState = METHOD_DONE;
139
ret->decision = DECISION_UNCOND_SUCC;
146
static Boolean eap_vendor_test_isKeyAvailable(struct eap_sm *sm, void *priv)
148
struct eap_vendor_test_data *data = priv;
149
return data->state == SUCCESS;
153
static u8 * eap_vendor_test_getKey(struct eap_sm *sm, void *priv, size_t *len)
155
struct eap_vendor_test_data *data = priv;
157
const int key_len = 64;
159
if (data->state != SUCCESS)
162
key = os_malloc(key_len);
166
os_memset(key, 0x11, key_len / 2);
167
os_memset(key + key_len / 2, 0x22, key_len / 2);
174
int eap_peer_vendor_test_register(void)
176
struct eap_method *eap;
179
eap = eap_peer_method_alloc(EAP_PEER_METHOD_INTERFACE_VERSION,
180
EAP_VENDOR_ID, EAP_VENDOR_TYPE,
185
eap->init = eap_vendor_test_init;
186
eap->deinit = eap_vendor_test_deinit;
187
eap->process = eap_vendor_test_process;
188
eap->isKeyAvailable = eap_vendor_test_isKeyAvailable;
189
eap->getKey = eap_vendor_test_getKey;
191
ret = eap_peer_method_register(eap);
193
eap_peer_method_free(eap);