2 * EAP peer method: EAP-OTP (RFC 3748)
3 * Copyright (c) 2004-2006, Jouni Malinen <j@w1.fi>
5 * This software may be distributed under the terms of the BSD license.
6 * See README for more details.
15 static void * eap_otp_init(struct eap_sm *sm)
17 /* No need for private data. However, must return non-NULL to indicate
23 static void eap_otp_deinit(struct eap_sm *sm, void *priv)
28 static struct wpabuf * eap_otp_process(struct eap_sm *sm, void *priv,
29 struct eap_method_ret *ret,
30 const struct wpabuf *reqData)
33 const u8 *pos, *password;
34 size_t password_len, len;
37 pos = eap_hdr_validate(EAP_VENDOR_IETF, EAP_TYPE_OTP, reqData, &len);
42 wpa_hexdump_ascii(MSG_MSGDUMP, "EAP-OTP: Request message",
45 password = eap_get_config_otp(sm, &password_len);
49 password = eap_get_config_password(sm, &password_len);
53 if (password == NULL) {
54 wpa_printf(MSG_INFO, "EAP-OTP: Password not configured");
55 eap_sm_request_otp(sm, (const char *) pos, len);
62 ret->methodState = METHOD_DONE;
63 ret->decision = DECISION_COND_SUCC;
64 ret->allowNotifications = FALSE;
66 resp = eap_msg_alloc(EAP_VENDOR_IETF, EAP_TYPE_OTP, password_len,
67 EAP_CODE_RESPONSE, eap_get_id(reqData));
70 wpabuf_put_data(resp, password, password_len);
71 wpa_hexdump_ascii_key(MSG_MSGDUMP, "EAP-OTP: Response",
72 password, password_len);
75 wpa_printf(MSG_DEBUG, "EAP-OTP: Forgetting used password");
76 eap_clear_config_otp(sm);
83 int eap_peer_otp_register(void)
85 struct eap_method *eap;
88 eap = eap_peer_method_alloc(EAP_PEER_METHOD_INTERFACE_VERSION,
89 EAP_VENDOR_IETF, EAP_TYPE_OTP, "OTP");
93 eap->init = eap_otp_init;
94 eap->deinit = eap_otp_deinit;
95 eap->process = eap_otp_process;
97 ret = eap_peer_method_register(eap);
99 eap_peer_method_free(eap);