Lines Matching +full:vendor +full:- +full:id
2 * hostapd / EAP-GPSK (RFC 5433) server
3 * Copyright (c) 2006-2007, Jouni Malinen <j@w1.fi>
34 int vendor; /* CSuite/Vendor */ member
43 return "GPSK-1"; in eap_gpsk_state_txt()
45 return "GPSK-3"; in eap_gpsk_state_txt()
58 wpa_printf(MSG_DEBUG, "EAP-GPSK: %s -> %s", in eap_gpsk_state()
59 eap_gpsk_state_txt(data->state), in eap_gpsk_state()
61 data->state = state; in eap_gpsk_state()
72 data->state = GPSK_1; in eap_gpsk_init()
74 data->csuite_count = 0; in eap_gpsk_init()
77 WPA_PUT_BE32(data->csuite_list[data->csuite_count].vendor, in eap_gpsk_init()
79 WPA_PUT_BE16(data->csuite_list[data->csuite_count].specifier, in eap_gpsk_init()
81 data->csuite_count++; in eap_gpsk_init()
85 WPA_PUT_BE32(data->csuite_list[data->csuite_count].vendor, in eap_gpsk_init()
87 WPA_PUT_BE16(data->csuite_list[data->csuite_count].specifier, in eap_gpsk_init()
89 data->csuite_count++; in eap_gpsk_init()
99 os_free(data->id_peer); in eap_gpsk_reset()
105 struct eap_gpsk_data *data, u8 id) in eap_gpsk_build_gpsk_1() argument
110 wpa_printf(MSG_DEBUG, "EAP-GPSK: Request/GPSK-1"); in eap_gpsk_build_gpsk_1()
112 if (random_get_bytes(data->rand_server, EAP_GPSK_RAND_LEN)) { in eap_gpsk_build_gpsk_1()
113 wpa_printf(MSG_ERROR, "EAP-GPSK: Failed to get random data"); in eap_gpsk_build_gpsk_1()
117 wpa_hexdump(MSG_MSGDUMP, "EAP-GPSK: RAND_Server", in eap_gpsk_build_gpsk_1()
118 data->rand_server, EAP_GPSK_RAND_LEN); in eap_gpsk_build_gpsk_1()
120 len = 1 + 2 + sm->cfg->server_id_len + EAP_GPSK_RAND_LEN + 2 + in eap_gpsk_build_gpsk_1()
121 data->csuite_count * sizeof(struct eap_gpsk_csuite); in eap_gpsk_build_gpsk_1()
123 EAP_CODE_REQUEST, id); in eap_gpsk_build_gpsk_1()
125 wpa_printf(MSG_ERROR, "EAP-GPSK: Failed to allocate memory " in eap_gpsk_build_gpsk_1()
126 "for request/GPSK-1"); in eap_gpsk_build_gpsk_1()
132 wpabuf_put_be16(req, sm->cfg->server_id_len); in eap_gpsk_build_gpsk_1()
133 wpabuf_put_data(req, sm->cfg->server_id, sm->cfg->server_id_len); in eap_gpsk_build_gpsk_1()
134 wpabuf_put_data(req, data->rand_server, EAP_GPSK_RAND_LEN); in eap_gpsk_build_gpsk_1()
136 data->csuite_count * sizeof(struct eap_gpsk_csuite)); in eap_gpsk_build_gpsk_1()
137 wpabuf_put_data(req, data->csuite_list, in eap_gpsk_build_gpsk_1()
138 data->csuite_count * sizeof(struct eap_gpsk_csuite)); in eap_gpsk_build_gpsk_1()
145 struct eap_gpsk_data *data, u8 id) in eap_gpsk_build_gpsk_3() argument
152 wpa_printf(MSG_DEBUG, "EAP-GPSK: Request/GPSK-3"); in eap_gpsk_build_gpsk_3()
154 miclen = eap_gpsk_mic_len(data->vendor, data->specifier); in eap_gpsk_build_gpsk_3()
155 len = 1 + 2 * EAP_GPSK_RAND_LEN + 2 + sm->cfg->server_id_len + in eap_gpsk_build_gpsk_3()
158 EAP_CODE_REQUEST, id); in eap_gpsk_build_gpsk_3()
160 wpa_printf(MSG_ERROR, "EAP-GPSK: Failed to allocate memory " in eap_gpsk_build_gpsk_3()
161 "for request/GPSK-3"); in eap_gpsk_build_gpsk_3()
169 wpabuf_put_data(req, data->rand_peer, EAP_GPSK_RAND_LEN); in eap_gpsk_build_gpsk_3()
170 wpabuf_put_data(req, data->rand_server, EAP_GPSK_RAND_LEN); in eap_gpsk_build_gpsk_3()
171 wpabuf_put_be16(req, sm->cfg->server_id_len); in eap_gpsk_build_gpsk_3()
172 wpabuf_put_data(req, sm->cfg->server_id, sm->cfg->server_id_len); in eap_gpsk_build_gpsk_3()
174 WPA_PUT_BE32(csuite->vendor, data->vendor); in eap_gpsk_build_gpsk_3()
175 WPA_PUT_BE16(csuite->specifier, data->specifier); in eap_gpsk_build_gpsk_3()
181 if (eap_gpsk_compute_mic(data->sk, data->sk_len, data->vendor, in eap_gpsk_build_gpsk_3()
182 data->specifier, start, pos - start, pos) < 0) in eap_gpsk_build_gpsk_3()
193 static struct wpabuf * eap_gpsk_buildReq(struct eap_sm *sm, void *priv, u8 id) in eap_gpsk_buildReq() argument
197 switch (data->state) { in eap_gpsk_buildReq()
199 return eap_gpsk_build_gpsk_1(sm, data, id); in eap_gpsk_buildReq()
201 return eap_gpsk_build_gpsk_3(sm, data, id); in eap_gpsk_buildReq()
203 wpa_printf(MSG_DEBUG, "EAP-GPSK: Unknown state %d in buildReq", in eap_gpsk_buildReq()
204 data->state); in eap_gpsk_buildReq()
220 wpa_printf(MSG_INFO, "EAP-GPSK: Invalid frame"); in eap_gpsk_check()
224 wpa_printf(MSG_DEBUG, "EAP-GPSK: Received frame: opcode=%d", *pos); in eap_gpsk_check()
226 if (data->state == GPSK_1 && *pos == EAP_GPSK_OPCODE_GPSK_2) in eap_gpsk_check()
229 if (data->state == GPSK_3 && *pos == EAP_GPSK_OPCODE_GPSK_4) in eap_gpsk_check()
232 wpa_printf(MSG_INFO, "EAP-GPSK: Unexpected opcode=%d in state=%d", in eap_gpsk_check()
233 *pos, data->state); in eap_gpsk_check()
249 if (data->state != GPSK_1) in eap_gpsk_process_gpsk_2()
252 wpa_printf(MSG_DEBUG, "EAP-GPSK: Received Response/GPSK-2"); in eap_gpsk_process_gpsk_2()
257 if (end - pos < 2) { in eap_gpsk_process_gpsk_2()
258 wpa_printf(MSG_DEBUG, "EAP-GPSK: Too short message for " in eap_gpsk_process_gpsk_2()
265 if (end - pos < alen) { in eap_gpsk_process_gpsk_2()
266 wpa_printf(MSG_DEBUG, "EAP-GPSK: Too short message for " in eap_gpsk_process_gpsk_2()
271 os_free(data->id_peer); in eap_gpsk_process_gpsk_2()
272 data->id_peer = os_memdup(pos, alen); in eap_gpsk_process_gpsk_2()
273 if (data->id_peer == NULL) { in eap_gpsk_process_gpsk_2()
274 wpa_printf(MSG_DEBUG, "EAP-GPSK: Not enough memory to store " in eap_gpsk_process_gpsk_2()
275 "%d-octet ID_Peer", alen); in eap_gpsk_process_gpsk_2()
278 data->id_peer_len = alen; in eap_gpsk_process_gpsk_2()
279 wpa_hexdump_ascii(MSG_DEBUG, "EAP-GPSK: ID_Peer", in eap_gpsk_process_gpsk_2()
280 data->id_peer, data->id_peer_len); in eap_gpsk_process_gpsk_2()
283 if (end - pos < 2) { in eap_gpsk_process_gpsk_2()
284 wpa_printf(MSG_DEBUG, "EAP-GPSK: Too short message for " in eap_gpsk_process_gpsk_2()
291 if (end - pos < alen) { in eap_gpsk_process_gpsk_2()
292 wpa_printf(MSG_DEBUG, "EAP-GPSK: Too short message for " in eap_gpsk_process_gpsk_2()
297 if (alen != sm->cfg->server_id_len || in eap_gpsk_process_gpsk_2()
298 os_memcmp(pos, sm->cfg->server_id, alen) != 0) { in eap_gpsk_process_gpsk_2()
299 wpa_printf(MSG_DEBUG, "EAP-GPSK: ID_Server in GPSK-1 and " in eap_gpsk_process_gpsk_2()
300 "GPSK-2 did not match"); in eap_gpsk_process_gpsk_2()
306 if (end - pos < EAP_GPSK_RAND_LEN) { in eap_gpsk_process_gpsk_2()
307 wpa_printf(MSG_DEBUG, "EAP-GPSK: Too short message for " in eap_gpsk_process_gpsk_2()
312 os_memcpy(data->rand_peer, pos, EAP_GPSK_RAND_LEN); in eap_gpsk_process_gpsk_2()
313 wpa_hexdump(MSG_DEBUG, "EAP-GPSK: RAND_Peer", in eap_gpsk_process_gpsk_2()
314 data->rand_peer, EAP_GPSK_RAND_LEN); in eap_gpsk_process_gpsk_2()
317 if (end - pos < EAP_GPSK_RAND_LEN) { in eap_gpsk_process_gpsk_2()
318 wpa_printf(MSG_DEBUG, "EAP-GPSK: Too short message for " in eap_gpsk_process_gpsk_2()
323 if (os_memcmp(data->rand_server, pos, EAP_GPSK_RAND_LEN) != 0) { in eap_gpsk_process_gpsk_2()
324 wpa_printf(MSG_DEBUG, "EAP-GPSK: RAND_Server in GPSK-1 and " in eap_gpsk_process_gpsk_2()
325 "GPSK-2 did not match"); in eap_gpsk_process_gpsk_2()
326 wpa_hexdump(MSG_DEBUG, "EAP-GPSK: RAND_Server in GPSK-1", in eap_gpsk_process_gpsk_2()
327 data->rand_server, EAP_GPSK_RAND_LEN); in eap_gpsk_process_gpsk_2()
328 wpa_hexdump(MSG_DEBUG, "EAP-GPSK: RAND_Server in GPSK-2", in eap_gpsk_process_gpsk_2()
335 if (end - pos < 2) { in eap_gpsk_process_gpsk_2()
336 wpa_printf(MSG_DEBUG, "EAP-GPSK: Too short message for " in eap_gpsk_process_gpsk_2()
343 if (end - pos < alen) { in eap_gpsk_process_gpsk_2()
344 wpa_printf(MSG_DEBUG, "EAP-GPSK: Too short message for " in eap_gpsk_process_gpsk_2()
349 if (alen != data->csuite_count * sizeof(struct eap_gpsk_csuite) || in eap_gpsk_process_gpsk_2()
350 os_memcmp(pos, data->csuite_list, alen) != 0) { in eap_gpsk_process_gpsk_2()
351 wpa_printf(MSG_DEBUG, "EAP-GPSK: CSuite_List in GPSK-1 and " in eap_gpsk_process_gpsk_2()
352 "GPSK-2 did not match"); in eap_gpsk_process_gpsk_2()
358 if (end - pos < (int) sizeof(*csuite)) { in eap_gpsk_process_gpsk_2()
359 wpa_printf(MSG_DEBUG, "EAP-GPSK: Too short message for " in eap_gpsk_process_gpsk_2()
365 for (i = 0; i < data->csuite_count; i++) { in eap_gpsk_process_gpsk_2()
366 if (os_memcmp(csuite, &data->csuite_list[i], sizeof(*csuite)) in eap_gpsk_process_gpsk_2()
370 if (i == data->csuite_count) { in eap_gpsk_process_gpsk_2()
371 wpa_printf(MSG_DEBUG, "EAP-GPSK: Peer selected unsupported " in eap_gpsk_process_gpsk_2()
373 WPA_GET_BE32(csuite->vendor), in eap_gpsk_process_gpsk_2()
374 WPA_GET_BE16(csuite->specifier)); in eap_gpsk_process_gpsk_2()
378 data->vendor = WPA_GET_BE32(csuite->vendor); in eap_gpsk_process_gpsk_2()
379 data->specifier = WPA_GET_BE16(csuite->specifier); in eap_gpsk_process_gpsk_2()
380 wpa_printf(MSG_DEBUG, "EAP-GPSK: CSuite_Sel %d:%d", in eap_gpsk_process_gpsk_2()
381 data->vendor, data->specifier); in eap_gpsk_process_gpsk_2()
384 if (end - pos < 2) { in eap_gpsk_process_gpsk_2()
385 wpa_printf(MSG_DEBUG, "EAP-GPSK: Too short message for " in eap_gpsk_process_gpsk_2()
392 if (end - pos < alen) { in eap_gpsk_process_gpsk_2()
393 wpa_printf(MSG_DEBUG, "EAP-GPSK: Too short message for " in eap_gpsk_process_gpsk_2()
398 wpa_hexdump(MSG_DEBUG, "EAP-GPSK: PD_Payload_1", pos, alen); in eap_gpsk_process_gpsk_2()
401 if (sm->user == NULL || sm->user->password == NULL) { in eap_gpsk_process_gpsk_2()
402 wpa_printf(MSG_INFO, "EAP-GPSK: No PSK/password configured " in eap_gpsk_process_gpsk_2()
408 if (eap_gpsk_derive_keys(sm->user->password, sm->user->password_len, in eap_gpsk_process_gpsk_2()
409 data->vendor, data->specifier, in eap_gpsk_process_gpsk_2()
410 data->rand_peer, data->rand_server, in eap_gpsk_process_gpsk_2()
411 data->id_peer, data->id_peer_len, in eap_gpsk_process_gpsk_2()
412 sm->cfg->server_id, sm->cfg->server_id_len, in eap_gpsk_process_gpsk_2()
413 data->msk, data->emsk, in eap_gpsk_process_gpsk_2()
414 data->sk, &data->sk_len, in eap_gpsk_process_gpsk_2()
415 data->pk, &data->pk_len) < 0) { in eap_gpsk_process_gpsk_2()
416 wpa_printf(MSG_DEBUG, "EAP-GPSK: Failed to derive keys"); in eap_gpsk_process_gpsk_2()
421 if (eap_gpsk_derive_session_id(sm->user->password, in eap_gpsk_process_gpsk_2()
422 sm->user->password_len, in eap_gpsk_process_gpsk_2()
423 data->vendor, data->specifier, in eap_gpsk_process_gpsk_2()
424 data->rand_peer, data->rand_server, in eap_gpsk_process_gpsk_2()
425 data->id_peer, data->id_peer_len, in eap_gpsk_process_gpsk_2()
426 sm->cfg->server_id, in eap_gpsk_process_gpsk_2()
427 sm->cfg->server_id_len, in eap_gpsk_process_gpsk_2()
429 data->session_id, &data->id_len) < 0) { in eap_gpsk_process_gpsk_2()
430 wpa_printf(MSG_DEBUG, "EAP-GPSK: Failed to derive Session-Id"); in eap_gpsk_process_gpsk_2()
434 wpa_hexdump(MSG_DEBUG, "EAP-GPSK: Derived Session-Id", in eap_gpsk_process_gpsk_2()
435 data->session_id, data->id_len); in eap_gpsk_process_gpsk_2()
437 miclen = eap_gpsk_mic_len(data->vendor, data->specifier); in eap_gpsk_process_gpsk_2()
438 if (end - pos < (int) miclen) { in eap_gpsk_process_gpsk_2()
439 wpa_printf(MSG_DEBUG, "EAP-GPSK: Message too short for MIC " in eap_gpsk_process_gpsk_2()
441 (unsigned long) (end - pos), in eap_gpsk_process_gpsk_2()
446 if (eap_gpsk_compute_mic(data->sk, data->sk_len, data->vendor, in eap_gpsk_process_gpsk_2()
447 data->specifier, payload, pos - payload, mic) in eap_gpsk_process_gpsk_2()
449 wpa_printf(MSG_DEBUG, "EAP-GPSK: Failed to compute MIC"); in eap_gpsk_process_gpsk_2()
454 wpa_printf(MSG_INFO, "EAP-GPSK: Incorrect MIC in GPSK-2"); in eap_gpsk_process_gpsk_2()
455 wpa_hexdump(MSG_DEBUG, "EAP-GPSK: Received MIC", pos, miclen); in eap_gpsk_process_gpsk_2()
456 wpa_hexdump(MSG_DEBUG, "EAP-GPSK: Computed MIC", mic, miclen); in eap_gpsk_process_gpsk_2()
463 wpa_printf(MSG_DEBUG, "EAP-GPSK: Ignored %lu bytes of extra " in eap_gpsk_process_gpsk_2()
464 "data in the end of GPSK-2", in eap_gpsk_process_gpsk_2()
465 (unsigned long) (end - pos)); in eap_gpsk_process_gpsk_2()
481 if (data->state != GPSK_3) in eap_gpsk_process_gpsk_4()
484 wpa_printf(MSG_DEBUG, "EAP-GPSK: Received Response/GPSK-4"); in eap_gpsk_process_gpsk_4()
489 if (end - pos < 2) { in eap_gpsk_process_gpsk_4()
490 wpa_printf(MSG_DEBUG, "EAP-GPSK: Too short message for " in eap_gpsk_process_gpsk_4()
497 if (end - pos < alen) { in eap_gpsk_process_gpsk_4()
498 wpa_printf(MSG_DEBUG, "EAP-GPSK: Too short message for " in eap_gpsk_process_gpsk_4()
503 wpa_hexdump(MSG_DEBUG, "EAP-GPSK: PD_Payload_1", pos, alen); in eap_gpsk_process_gpsk_4()
506 miclen = eap_gpsk_mic_len(data->vendor, data->specifier); in eap_gpsk_process_gpsk_4()
507 if (end - pos < (int) miclen) { in eap_gpsk_process_gpsk_4()
508 wpa_printf(MSG_DEBUG, "EAP-GPSK: Message too short for MIC " in eap_gpsk_process_gpsk_4()
510 (unsigned long) (end - pos), in eap_gpsk_process_gpsk_4()
515 if (eap_gpsk_compute_mic(data->sk, data->sk_len, data->vendor, in eap_gpsk_process_gpsk_4()
516 data->specifier, payload, pos - payload, mic) in eap_gpsk_process_gpsk_4()
518 wpa_printf(MSG_DEBUG, "EAP-GPSK: Failed to compute MIC"); in eap_gpsk_process_gpsk_4()
523 wpa_printf(MSG_INFO, "EAP-GPSK: Incorrect MIC in GPSK-4"); in eap_gpsk_process_gpsk_4()
524 wpa_hexdump(MSG_DEBUG, "EAP-GPSK: Received MIC", pos, miclen); in eap_gpsk_process_gpsk_4()
525 wpa_hexdump(MSG_DEBUG, "EAP-GPSK: Computed MIC", mic, miclen); in eap_gpsk_process_gpsk_4()
532 wpa_printf(MSG_DEBUG, "EAP-GPSK: Ignored %lu bytes of extra " in eap_gpsk_process_gpsk_4()
533 "data in the end of GPSK-4", in eap_gpsk_process_gpsk_4()
534 (unsigned long) (end - pos)); in eap_gpsk_process_gpsk_4()
554 eap_gpsk_process_gpsk_2(sm, data, pos + 1, len - 1); in eap_gpsk_process()
557 eap_gpsk_process_gpsk_4(sm, data, pos + 1, len - 1); in eap_gpsk_process()
566 return data->state == SUCCESS || data->state == FAILURE; in eap_gpsk_isDone()
575 if (data->state != SUCCESS) in eap_gpsk_getKey()
578 key = os_memdup(data->msk, EAP_MSK_LEN); in eap_gpsk_getKey()
592 if (data->state != SUCCESS) in eap_gpsk_get_emsk()
595 key = os_memdup(data->emsk, EAP_EMSK_LEN); in eap_gpsk_get_emsk()
607 return data->state == SUCCESS; in eap_gpsk_isSuccess()
616 if (data->state != SUCCESS) in eap_gpsk_get_session_id()
619 sid = os_memdup(data->session_id, data->id_len); in eap_gpsk_get_session_id()
622 *len = data->id_len; in eap_gpsk_get_session_id()
635 return -1; in eap_server_gpsk_register()
637 eap->init = eap_gpsk_init; in eap_server_gpsk_register()
638 eap->reset = eap_gpsk_reset; in eap_server_gpsk_register()
639 eap->buildReq = eap_gpsk_buildReq; in eap_server_gpsk_register()
640 eap->check = eap_gpsk_check; in eap_server_gpsk_register()
641 eap->process = eap_gpsk_process; in eap_server_gpsk_register()
642 eap->isDone = eap_gpsk_isDone; in eap_server_gpsk_register()
643 eap->getKey = eap_gpsk_getKey; in eap_server_gpsk_register()
644 eap->isSuccess = eap_gpsk_isSuccess; in eap_server_gpsk_register()
645 eap->get_emsk = eap_gpsk_get_emsk; in eap_server_gpsk_register()
646 eap->getSessionId = eap_gpsk_get_session_id; in eap_server_gpsk_register()