00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015 #include "includes.h"
00016
00017 #include "common.h"
00018 #include "eap_i.h"
00019
00020
00021 static void * eap_otp_init(struct eap_sm *sm)
00022 {
00023
00024
00025 return (void *) 1;
00026 }
00027
00028
00029 static void eap_otp_deinit(struct eap_sm *sm, void *priv)
00030 {
00031 }
00032
00033
00034 static struct wpabuf * eap_otp_process(struct eap_sm *sm, void *priv,
00035 struct eap_method_ret *ret,
00036 const struct wpabuf *reqData)
00037 {
00038 struct wpabuf *resp;
00039 const u8 *pos, *password;
00040 size_t password_len, len;
00041 int otp;
00042
00043 pos = eap_hdr_validate(EAP_VENDOR_IETF, EAP_TYPE_OTP, reqData, &len);
00044 if (pos == NULL) {
00045 ret->ignore = TRUE;
00046 return NULL;
00047 }
00048 wpa_hexdump_ascii(MSG_MSGDUMP, "EAP-OTP: Request message",
00049 pos, len);
00050
00051 password = eap_get_config_otp(sm, &password_len);
00052 if (password)
00053 otp = 1;
00054 else {
00055 password = eap_get_config_password(sm, &password_len);
00056 otp = 0;
00057 }
00058
00059 if (password == NULL) {
00060 wpa_printf(MSG_INFO, "EAP-OTP: Password not configured");
00061 eap_sm_request_otp(sm, (const char *) pos, len);
00062 ret->ignore = TRUE;
00063 return NULL;
00064 }
00065
00066 ret->ignore = FALSE;
00067
00068 ret->methodState = METHOD_DONE;
00069 ret->decision = DECISION_COND_SUCC;
00070 ret->allowNotifications = FALSE;
00071
00072 resp = eap_msg_alloc(EAP_VENDOR_IETF, EAP_TYPE_OTP, password_len,
00073 EAP_CODE_RESPONSE, eap_get_id(reqData));
00074 if (resp == NULL)
00075 return NULL;
00076 wpabuf_put_data(resp, password, password_len);
00077 wpa_hexdump_ascii_key(MSG_MSGDUMP, "EAP-OTP: Response",
00078 password, password_len);
00079
00080 if (otp) {
00081 wpa_printf(MSG_DEBUG, "EAP-OTP: Forgetting used password");
00082 eap_clear_config_otp(sm);
00083 }
00084
00085 return resp;
00086 }
00087
00088
00089 int eap_peer_otp_register(void)
00090 {
00091 struct eap_method *eap;
00092 int ret;
00093
00094 eap = eap_peer_method_alloc(EAP_PEER_METHOD_INTERFACE_VERSION,
00095 EAP_VENDOR_IETF, EAP_TYPE_OTP, "OTP");
00096 if (eap == NULL)
00097 return -1;
00098
00099 eap->init = eap_otp_init;
00100 eap->deinit = eap_otp_deinit;
00101 eap->process = eap_otp_process;
00102
00103 ret = eap_peer_method_register(eap);
00104 if (ret)
00105 eap_peer_method_free(eap);
00106 return ret;
00107 }