2
* EAP peer method: EAP-GPSK (draft-ietf-emu-eap-gpsk-01.txt)
2
* EAP peer method: EAP-GPSK (draft-clancy-emu-eap-shared-secret-00.txt)
3
3
* Copyright (c) 2006, Jouni Malinen <jkmaline@cc.hut.fi>
5
5
* This program is free software; you can redistribute it and/or modify
91
data = os_zalloc(sizeof(*data));
89
data = wpa_zalloc(sizeof(*data));
94
92
data->state = GPSK_1;
97
data->id_client = os_malloc(config->nai_len);
95
data->id_client = malloc(config->nai_len);
98
96
if (data->id_client == NULL) {
99
97
eap_gpsk_deinit(sm, data);
102
os_memcpy(data->id_client, config->nai, config->nai_len);
100
memcpy(data->id_client, config->nai, config->nai_len);
103
101
data->id_client_len = config->nai_len;
106
data->psk = os_malloc(config->eappsk_len);
104
data->psk = malloc(config->eappsk_len);
107
105
if (data->psk == NULL) {
108
106
eap_gpsk_deinit(sm, data);
111
os_memcpy(data->psk, config->eappsk, config->eappsk_len);
109
memcpy(data->psk, config->eappsk, config->eappsk_len);
112
110
data->psk_len = config->eappsk_len;
118
116
static void eap_gpsk_deinit(struct eap_sm *sm, void *priv)
120
118
struct eap_gpsk_data *data = priv;
121
os_free(data->id_server);
122
os_free(data->id_client);
119
free(data->id_server);
120
free(data->id_client);
162
160
wpa_printf(MSG_DEBUG, "EAP-GPSK: ID_Server overflow");
165
os_free(data->id_server);
166
data->id_server = os_malloc(alen);
163
free(data->id_server);
164
data->id_server = malloc(alen);
167
165
if (data->id_server == NULL) {
168
166
wpa_printf(MSG_DEBUG, "EAP-GPSK: No memory for ID_Server");
171
os_memcpy(data->id_server, pos, alen);
169
memcpy(data->id_server, pos, alen);
172
170
data->id_server_len = alen;
173
171
wpa_hexdump_ascii(MSG_DEBUG, "EAP-GPSK: ID_Server",
174
172
data->id_server, data->id_server_len);
178
176
wpa_printf(MSG_DEBUG, "EAP-GPSK: RAND_Server overflow");
181
os_memcpy(data->rand_server, pos, EAP_GPSK_RAND_LEN);
179
memcpy(data->rand_server, pos, EAP_GPSK_RAND_LEN);
182
180
wpa_hexdump(MSG_DEBUG, "EAP-GPSK: RAND_Server",
183
181
data->rand_server, EAP_GPSK_RAND_LEN);
184
182
pos += EAP_GPSK_RAND_LEN;
249
247
WPA_PUT_BE16(rpos, data->id_client_len);
251
249
if (data->id_client)
252
os_memcpy(rpos, data->id_client, data->id_client_len);
250
memcpy(rpos, data->id_client, data->id_client_len);
253
251
rpos += data->id_client_len;
255
253
WPA_PUT_BE16(rpos, data->id_server_len);
257
255
if (data->id_server)
258
os_memcpy(rpos, data->id_server, data->id_server_len);
256
memcpy(rpos, data->id_server, data->id_server_len);
259
257
rpos += data->id_server_len;
261
259
if (os_get_random(data->rand_client, EAP_GPSK_RAND_LEN)) {
262
260
wpa_printf(MSG_DEBUG, "EAP-GPSK: Failed to get random data "
263
261
"for RAND_Client");
264
262
eap_gpsk_state(data, FAILURE);
268
266
wpa_hexdump(MSG_DEBUG, "EAP-GPSK: RAND_Client",
269
267
data->rand_client, EAP_GPSK_RAND_LEN);
270
os_memcpy(rpos, data->rand_client, EAP_GPSK_RAND_LEN);
268
memcpy(rpos, data->rand_client, EAP_GPSK_RAND_LEN);
271
269
rpos += EAP_GPSK_RAND_LEN;
273
os_memcpy(rpos, data->rand_server, EAP_GPSK_RAND_LEN);
271
memcpy(rpos, data->rand_server, EAP_GPSK_RAND_LEN);
274
272
rpos += EAP_GPSK_RAND_LEN;
276
274
WPA_PUT_BE16(rpos, csuite_list_len);
278
os_memcpy(rpos, csuite_list, csuite_list_len);
276
memcpy(rpos, csuite_list, csuite_list_len);
279
277
rpos += csuite_list_len;
281
279
csuite = (struct eap_gpsk_csuite *) rpos;
288
286
data->rand_client, data->rand_server,
289
287
data->id_client, data->id_client_len,
290
288
data->id_server, data->id_server_len,
291
data->msk, data->emsk,
292
data->sk, &data->sk_len,
289
data->msk, data->sk, &data->sk_len,
293
290
data->pk, &data->pk_len) < 0) {
294
291
wpa_printf(MSG_DEBUG, "EAP-GPSK: Failed to derive keys");
295
292
eap_gpsk_state(data, FAILURE);
351
if (os_memcmp(pos, data->rand_client, EAP_GPSK_RAND_LEN) != 0) {
348
if (memcmp(pos, data->rand_client, EAP_GPSK_RAND_LEN) != 0) {
352
349
wpa_printf(MSG_DEBUG, "EAP-GPSK: RAND_Client in GPSK-2 and "
353
350
"GPSK-3 did not match");
354
351
wpa_hexdump(MSG_DEBUG, "EAP-GPSK: RAND_Client in GPSK-2",
368
if (os_memcmp(pos, data->rand_server, EAP_GPSK_RAND_LEN) != 0) {
365
if (memcmp(pos, data->rand_server, EAP_GPSK_RAND_LEN) != 0) {
369
366
wpa_printf(MSG_DEBUG, "EAP-GPSK: RAND_Server in GPSK-1 and "
370
367
"GPSK-3 did not match");
371
368
wpa_hexdump(MSG_DEBUG, "EAP-GPSK: RAND_Server in GPSK-1",
378
375
pos += EAP_GPSK_RAND_LEN;
380
if (end - pos < (int) sizeof(*csuite)) {
377
if (end - pos < sizeof(*csuite)) {
381
378
wpa_printf(MSG_DEBUG, "EAP-GPSK: Message too short for "
411
408
wpa_hexdump(MSG_DEBUG, "EAP-GPSK: PD_Payload_2", pos, alen);
413
410
miclen = eap_gpsk_mic_len(data->vendor, data->specifier);
414
if (end - pos < (int) miclen) {
411
if (end - pos < miclen) {
415
412
wpa_printf(MSG_DEBUG, "EAP-GPSK: Message too short for MIC "
416
413
"(left=%d miclen=%d)", end - pos, miclen);
417
414
eap_gpsk_state(data, FAILURE);
424
421
eap_gpsk_state(data, FAILURE);
427
if (os_memcmp(mic, pos, miclen) != 0) {
424
if (memcmp(mic, pos, miclen) != 0) {
428
425
wpa_printf(MSG_INFO, "EAP-GPSK: Incorrect MIC in GPSK-3");
429
426
wpa_hexdump(MSG_DEBUG, "EAP-GPSK: Received MIC", pos, miclen);
430
427
wpa_hexdump(MSG_DEBUG, "EAP-GPSK: Computed MIC", mic, miclen);
531
528
if (data->state != SUCCESS)
534
key = os_malloc(EAP_MSK_LEN);
531
key = malloc(EAP_MSK_LEN);
537
os_memcpy(key, data->msk, EAP_MSK_LEN);
534
memcpy(key, data->msk, EAP_MSK_LEN);
538
535
*len = EAP_MSK_LEN;
544
static u8 * eap_gpsk_get_emsk(struct eap_sm *sm, void *priv, size_t *len)
546
struct eap_gpsk_data *data = priv;
549
if (data->state != SUCCESS)
552
key = os_malloc(EAP_EMSK_LEN);
555
os_memcpy(key, data->emsk, EAP_EMSK_LEN);
562
541
int eap_peer_gpsk_register(void)
564
543
struct eap_method *eap;
574
553
eap->process = eap_gpsk_process;
575
554
eap->isKeyAvailable = eap_gpsk_isKeyAvailable;
576
555
eap->getKey = eap_gpsk_getKey;
577
eap->get_emsk = eap_gpsk_get_emsk;
579
557
ret = eap_peer_method_register(eap);