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 u8 * eap_vendor_test_process(struct eap_sm *sm, void *priv,
71
struct eap_method_ret *ret,
72
const u8 *reqData, size_t reqDataLen,
75
struct eap_vendor_test_data *data = priv;
76
const struct eap_hdr *req;
82
pos = eap_hdr_validate(EAP_VENDOR_ID, EAP_VENDOR_TYPE,
83
reqData, reqDataLen, &len);
84
if (pos == NULL || len < 1) {
89
if (data->state == INIT && *pos != 1) {
90
wpa_printf(MSG_DEBUG, "EAP-VENDOR-TEST: Unexpected message "
91
"%d in INIT state", *pos);
96
if (data->state == CONFIRM && *pos != 3) {
97
wpa_printf(MSG_DEBUG, "EAP-VENDOR-TEST: Unexpected message "
98
"%d in CONFIRM state", *pos);
103
if (data->state == SUCCESS) {
104
wpa_printf(MSG_DEBUG, "EAP-VENDOR-TEST: Unexpected message "
110
if (data->state == CONFIRM) {
111
#ifdef TEST_PENDING_REQUEST
112
if (data->first_try) {
114
wpa_printf(MSG_DEBUG, "EAP-VENDOR-TEST: Testing "
117
eloop_register_timeout(1, 0, eap_vendor_ready, sm,
121
#endif /* TEST_PENDING_REQUEST */
125
req = (const struct eap_hdr *) reqData;
127
wpa_printf(MSG_DEBUG, "EAP-VENDOR-TEST: Generating Response");
128
ret->allowNotifications = TRUE;
130
resp = eap_msg_alloc(EAP_VENDOR_ID, EAP_VENDOR_TYPE, respDataLen, 1,
131
EAP_CODE_RESPONSE, req->identifier, &rpos);
135
if (data->state == INIT) {
137
data->state = CONFIRM;
138
ret->methodState = METHOD_CONT;
139
ret->decision = DECISION_FAIL;
142
data->state = SUCCESS;
143
ret->methodState = METHOD_DONE;
144
ret->decision = DECISION_UNCOND_SUCC;
151
static Boolean eap_vendor_test_isKeyAvailable(struct eap_sm *sm, void *priv)
153
struct eap_vendor_test_data *data = priv;
154
return data->state == SUCCESS;
158
static u8 * eap_vendor_test_getKey(struct eap_sm *sm, void *priv, size_t *len)
160
struct eap_vendor_test_data *data = priv;
162
const int key_len = 64;
164
if (data->state != SUCCESS)
167
key = os_malloc(key_len);
171
os_memset(key, 0x11, key_len / 2);
172
os_memset(key + key_len / 2, 0x22, key_len / 2);
179
int eap_peer_vendor_test_register(void)
181
struct eap_method *eap;
184
eap = eap_peer_method_alloc(EAP_PEER_METHOD_INTERFACE_VERSION,
185
EAP_VENDOR_ID, EAP_VENDOR_TYPE,
190
eap->init = eap_vendor_test_init;
191
eap->deinit = eap_vendor_test_deinit;
192
eap->process = eap_vendor_test_process;
193
eap->isKeyAvailable = eap_vendor_test_isKeyAvailable;
194
eap->getKey = eap_vendor_test_getKey;
196
ret = eap_peer_method_register(eap);
198
eap_peer_method_free(eap);