eap: Drop method's .probe, rename .remove
The EAP-method's .probe methods only checked the method name so do that in eap.c instead and allocate method state in .load_settings. Rename method's .remove method to .free to improve the naming.
This commit is contained in:
parent
af124da544
commit
70518fad5f
|
@ -119,37 +119,7 @@ struct eap_aka_handle {
|
||||||
uint8_t k_re[EAP_AKA_K_RE_LEN];
|
uint8_t k_re[EAP_AKA_K_RE_LEN];
|
||||||
};
|
};
|
||||||
|
|
||||||
static int eap_aka_probe(struct eap_state *eap, const char *name)
|
static void eap_aka_free(struct eap_state *eap)
|
||||||
{
|
|
||||||
struct eap_aka_handle *aka;
|
|
||||||
|
|
||||||
if (strcasecmp(name, "AKA"))
|
|
||||||
return -ENOTSUP;
|
|
||||||
|
|
||||||
aka = l_new(struct eap_aka_handle, 1);
|
|
||||||
aka->type = EAP_TYPE_AKA;
|
|
||||||
|
|
||||||
eap_set_data(eap, aka);
|
|
||||||
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
static int eap_aka_prime_probe(struct eap_state *eap, const char *name)
|
|
||||||
{
|
|
||||||
struct eap_aka_handle *aka;
|
|
||||||
|
|
||||||
if (strcasecmp(name, "AKA'"))
|
|
||||||
return -ENOTSUP;
|
|
||||||
|
|
||||||
aka = l_new(struct eap_aka_handle, 1);
|
|
||||||
aka->type = EAP_TYPE_AKA_PRIME;
|
|
||||||
|
|
||||||
eap_set_data(eap, aka);
|
|
||||||
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
static void eap_aka_remove(struct eap_state *eap)
|
|
||||||
{
|
{
|
||||||
struct eap_aka_handle *aka = eap_get_data(eap);
|
struct eap_aka_handle *aka = eap_get_data(eap);
|
||||||
|
|
||||||
|
@ -573,11 +543,10 @@ req_error:
|
||||||
eap_sim_client_error(eap, aka->type, EAP_SIM_ERROR_PROCESS);
|
eap_sim_client_error(eap, aka->type, EAP_SIM_ERROR_PROCESS);
|
||||||
}
|
}
|
||||||
|
|
||||||
static bool eap_aka_load_settings(struct eap_state *eap,
|
static bool eap_aka_common_load_settings(struct eap_aka_handle *aka,
|
||||||
struct l_settings *settings,
|
struct l_settings *settings,
|
||||||
const char *prefix)
|
const char *prefix)
|
||||||
{
|
{
|
||||||
struct eap_aka_handle *aka = eap_get_data(eap);
|
|
||||||
char setting[64];
|
char setting[64];
|
||||||
const char *imsi;
|
const char *imsi;
|
||||||
const char *ki;
|
const char *ki;
|
||||||
|
@ -630,12 +599,35 @@ static bool eap_aka_load_settings(struct eap_state *eap,
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static bool eap_aka_load_settings(struct eap_state *eap,
|
||||||
|
struct l_settings *settings,
|
||||||
|
const char *prefix)
|
||||||
|
{
|
||||||
|
struct eap_aka_handle *aka = l_new(struct eap_aka_handle, 1);
|
||||||
|
|
||||||
|
aka->type = EAP_TYPE_AKA;
|
||||||
|
eap_set_data(eap, aka);
|
||||||
|
|
||||||
|
return eap_aka_common_load_settings(aka, settings, prefix);
|
||||||
|
}
|
||||||
|
|
||||||
|
static bool eap_aka_prime_load_settings(struct eap_state *eap,
|
||||||
|
struct l_settings *settings,
|
||||||
|
const char *prefix)
|
||||||
|
{
|
||||||
|
struct eap_aka_handle *aka = l_new(struct eap_aka_handle, 1);
|
||||||
|
|
||||||
|
aka->type = EAP_TYPE_AKA_PRIME;
|
||||||
|
eap_set_data(eap, aka);
|
||||||
|
|
||||||
|
return eap_aka_common_load_settings(aka, settings, prefix);
|
||||||
|
}
|
||||||
|
|
||||||
static struct eap_method eap_aka = {
|
static struct eap_method eap_aka = {
|
||||||
.request_type = EAP_TYPE_AKA,
|
.request_type = EAP_TYPE_AKA,
|
||||||
.exports_msk = true,
|
.exports_msk = true,
|
||||||
.name = "AKA",
|
.name = "AKA",
|
||||||
.probe = eap_aka_probe,
|
.free = eap_aka_free,
|
||||||
.remove = eap_aka_remove,
|
|
||||||
.handle_request = eap_aka_handle_request,
|
.handle_request = eap_aka_handle_request,
|
||||||
.load_settings = eap_aka_load_settings,
|
.load_settings = eap_aka_load_settings,
|
||||||
};
|
};
|
||||||
|
@ -644,10 +636,9 @@ static struct eap_method eap_aka_prime = {
|
||||||
.request_type = EAP_TYPE_AKA_PRIME,
|
.request_type = EAP_TYPE_AKA_PRIME,
|
||||||
.exports_msk = true,
|
.exports_msk = true,
|
||||||
.name = "AKA'",
|
.name = "AKA'",
|
||||||
.probe = eap_aka_prime_probe,
|
.free = eap_aka_free,
|
||||||
.remove = eap_aka_remove,
|
|
||||||
.handle_request = eap_aka_handle_request,
|
.handle_request = eap_aka_handle_request,
|
||||||
.load_settings = eap_aka_load_settings,
|
.load_settings = eap_aka_prime_load_settings,
|
||||||
};
|
};
|
||||||
|
|
||||||
static int eap_aka_init(void)
|
static int eap_aka_init(void)
|
||||||
|
|
|
@ -34,21 +34,7 @@ struct eap_md5_state {
|
||||||
char *secret;
|
char *secret;
|
||||||
};
|
};
|
||||||
|
|
||||||
static int eap_md5_probe(struct eap_state *eap, const char *name)
|
static void eap_md5_free(struct eap_state *eap)
|
||||||
{
|
|
||||||
struct eap_md5_state *md5;
|
|
||||||
|
|
||||||
if (strcasecmp(name, "MD5"))
|
|
||||||
return -ENOTSUP;
|
|
||||||
|
|
||||||
md5 = l_new(struct eap_md5_state, 1);
|
|
||||||
|
|
||||||
eap_set_data(eap, md5);
|
|
||||||
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
static void eap_md5_remove(struct eap_state *eap)
|
|
||||||
{
|
{
|
||||||
struct eap_md5_state *md5 = eap_get_data(eap);
|
struct eap_md5_state *md5 = eap_get_data(eap);
|
||||||
|
|
||||||
|
@ -104,18 +90,22 @@ static bool eap_md5_load_settings(struct eap_state *eap,
|
||||||
struct l_settings *settings,
|
struct l_settings *settings,
|
||||||
const char *prefix)
|
const char *prefix)
|
||||||
{
|
{
|
||||||
struct eap_md5_state *md5 = eap_get_data(eap);
|
struct eap_md5_state *md5;
|
||||||
char setting[64];
|
char setting[64];
|
||||||
|
char *secret;
|
||||||
|
|
||||||
snprintf(setting, sizeof(setting), "%sMD5-Secret", prefix);
|
snprintf(setting, sizeof(setting), "%sMD5-Secret", prefix);
|
||||||
md5->secret = l_strdup(l_settings_get_value(settings,
|
secret = l_strdup(l_settings_get_value(settings, "Security", setting));
|
||||||
"Security", setting));
|
|
||||||
|
|
||||||
if (!md5->secret) {
|
if (!secret) {
|
||||||
l_error("EAP-MD5 secret is missing");
|
l_error("EAP-MD5 secret is missing");
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
md5 = l_new(struct eap_md5_state, 1);
|
||||||
|
md5->secret = secret;
|
||||||
|
eap_set_data(eap, md5);
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -124,8 +114,7 @@ static struct eap_method eap_md5 = {
|
||||||
.exports_msk = false,
|
.exports_msk = false,
|
||||||
.name = "MD5",
|
.name = "MD5",
|
||||||
|
|
||||||
.probe = eap_md5_probe,
|
.free = eap_md5_free,
|
||||||
.remove = eap_md5_remove,
|
|
||||||
.handle_request = eap_md5_handle_request,
|
.handle_request = eap_md5_handle_request,
|
||||||
.load_settings = eap_md5_load_settings,
|
.load_settings = eap_md5_load_settings,
|
||||||
};
|
};
|
||||||
|
|
|
@ -404,35 +404,21 @@ bool mschapv2_generate_authenticator_response(
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int eap_mschapv2_probe(struct eap_state *eap, const char *name)
|
static void eap_mschapv2_state_free(struct eap_mschapv2_state *state)
|
||||||
{
|
|
||||||
struct eap_mschapv2_state *state;
|
|
||||||
|
|
||||||
if (strcasecmp(name, "MSCHAPV2"))
|
|
||||||
return -ENOTSUP;
|
|
||||||
|
|
||||||
state = l_new(struct eap_mschapv2_state, 1);
|
|
||||||
|
|
||||||
eap_set_data(eap, state);
|
|
||||||
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
static void eap_mschapv2_free(struct eap_mschapv2_state *state)
|
|
||||||
{
|
{
|
||||||
l_free(state->user);
|
l_free(state->user);
|
||||||
|
|
||||||
l_free(state);
|
l_free(state);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void eap_mschapv2_remove(struct eap_state *eap)
|
static void eap_mschapv2_free(struct eap_state *eap)
|
||||||
{
|
{
|
||||||
struct eap_mschapv2_state *state;
|
struct eap_mschapv2_state *state;
|
||||||
|
|
||||||
state = eap_get_data(eap);
|
state = eap_get_data(eap);
|
||||||
eap_set_data(eap, NULL);
|
eap_set_data(eap, NULL);
|
||||||
|
|
||||||
eap_mschapv2_free(state);
|
eap_mschapv2_state_free(state);
|
||||||
}
|
}
|
||||||
|
|
||||||
static bool eap_mschapv2_send_response(struct eap_state *eap)
|
static bool eap_mschapv2_send_response(struct eap_state *eap)
|
||||||
|
@ -659,16 +645,18 @@ static bool eap_mschapv2_load_settings(struct eap_state *eap,
|
||||||
struct l_settings *settings,
|
struct l_settings *settings,
|
||||||
const char *prefix)
|
const char *prefix)
|
||||||
{
|
{
|
||||||
struct eap_mschapv2_state *state = eap_get_data(eap);
|
struct eap_mschapv2_state *state;
|
||||||
const char *password;
|
const char *password;
|
||||||
char setting[64];
|
char setting[64];
|
||||||
|
|
||||||
|
state = l_new(struct eap_mschapv2_state, 1);
|
||||||
|
|
||||||
snprintf(setting, sizeof(setting), "%sIdentity", prefix);
|
snprintf(setting, sizeof(setting), "%sIdentity", prefix);
|
||||||
set_user_name(state,
|
set_user_name(state,
|
||||||
l_settings_get_value(settings, "Security", setting));
|
l_settings_get_value(settings, "Security", setting));
|
||||||
|
|
||||||
if (!state->user)
|
if (!state->user)
|
||||||
return false;
|
goto err;
|
||||||
|
|
||||||
state->user_len = strlen(state->user);
|
state->user_len = strlen(state->user);
|
||||||
|
|
||||||
|
@ -683,7 +671,7 @@ static bool eap_mschapv2_load_settings(struct eap_state *eap,
|
||||||
if (len != 16) {
|
if (len != 16) {
|
||||||
l_error("Read an impossible password hash");
|
l_error("Read an impossible password hash");
|
||||||
l_free(tmp);
|
l_free(tmp);
|
||||||
return false;
|
goto err;
|
||||||
}
|
}
|
||||||
|
|
||||||
memcpy(state->password_hash, tmp, 16);
|
memcpy(state->password_hash, tmp, 16);
|
||||||
|
@ -693,10 +681,18 @@ static bool eap_mschapv2_load_settings(struct eap_state *eap,
|
||||||
password = l_settings_get_value(settings, "Security",
|
password = l_settings_get_value(settings, "Security",
|
||||||
setting);
|
setting);
|
||||||
if (!password || !set_password_from_string(state, password))
|
if (!password || !set_password_from_string(state, password))
|
||||||
return false;
|
goto err;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
eap_set_data(eap, state);
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
|
|
||||||
|
err:
|
||||||
|
l_free(state->user);
|
||||||
|
l_free(state);
|
||||||
|
|
||||||
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
static struct eap_method eap_mschapv2 = {
|
static struct eap_method eap_mschapv2 = {
|
||||||
|
@ -704,8 +700,7 @@ static struct eap_method eap_mschapv2 = {
|
||||||
.exports_msk = true,
|
.exports_msk = true,
|
||||||
.name = "MSCHAPV2",
|
.name = "MSCHAPV2",
|
||||||
|
|
||||||
.probe = eap_mschapv2_probe,
|
.free = eap_mschapv2_free,
|
||||||
.remove = eap_mschapv2_remove,
|
|
||||||
.handle_request = eap_mschapv2_handle_request,
|
.handle_request = eap_mschapv2_handle_request,
|
||||||
.load_settings = eap_mschapv2_load_settings,
|
.load_settings = eap_mschapv2_load_settings,
|
||||||
};
|
};
|
||||||
|
|
|
@ -125,21 +125,7 @@ struct eap_sim_handle {
|
||||||
bool protected : 1;
|
bool protected : 1;
|
||||||
};
|
};
|
||||||
|
|
||||||
static int eap_sim_probe(struct eap_state *eap, const char *name)
|
static void eap_sim_free(struct eap_state *eap)
|
||||||
{
|
|
||||||
struct eap_sim_handle *sim;
|
|
||||||
|
|
||||||
if (strcasecmp(name, "SIM"))
|
|
||||||
return -ENOTSUP;
|
|
||||||
|
|
||||||
sim = l_new(struct eap_sim_handle, 1);
|
|
||||||
|
|
||||||
eap_set_data(eap, sim);
|
|
||||||
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
static void eap_sim_remove(struct eap_state *eap)
|
|
||||||
{
|
{
|
||||||
struct eap_sim_handle *sim = eap_get_data(eap);
|
struct eap_sim_handle *sim = eap_get_data(eap);
|
||||||
|
|
||||||
|
@ -577,13 +563,16 @@ static bool eap_sim_load_settings(struct eap_state *eap,
|
||||||
struct l_settings *settings,
|
struct l_settings *settings,
|
||||||
const char *prefix)
|
const char *prefix)
|
||||||
{
|
{
|
||||||
struct eap_sim_handle *sim = eap_get_data(eap);
|
struct eap_sim_handle *sim;
|
||||||
char setting[64];
|
char setting[64];
|
||||||
const char *kcs;
|
const char *kcs;
|
||||||
const char *imsi;
|
const char *imsi;
|
||||||
const char *sres;
|
const char *sres;
|
||||||
size_t len;
|
size_t len;
|
||||||
|
|
||||||
|
sim = l_new(struct eap_sim_handle, 1);
|
||||||
|
eap_set_data(eap, sim);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* TODO: These values will be loaded from a SIM card. Kc and SRES
|
* TODO: These values will be loaded from a SIM card. Kc and SRES
|
||||||
* values should be kept secret and crucial to the security of EAP-SIM.
|
* values should be kept secret and crucial to the security of EAP-SIM.
|
||||||
|
@ -620,8 +609,7 @@ static struct eap_method eap_sim = {
|
||||||
.request_type = EAP_TYPE_SIM,
|
.request_type = EAP_TYPE_SIM,
|
||||||
.exports_msk = true,
|
.exports_msk = true,
|
||||||
.name = "SIM",
|
.name = "SIM",
|
||||||
.probe = eap_sim_probe,
|
.free = eap_sim_free,
|
||||||
.remove = eap_sim_remove,
|
|
||||||
.handle_request = eap_sim_handle_request,
|
.handle_request = eap_sim_handle_request,
|
||||||
.load_settings = eap_sim_load_settings,
|
.load_settings = eap_sim_load_settings,
|
||||||
};
|
};
|
||||||
|
|
|
@ -46,21 +46,7 @@ struct eap_tls_state {
|
||||||
bool completed;
|
bool completed;
|
||||||
};
|
};
|
||||||
|
|
||||||
static int eap_tls_probe(struct eap_state *eap, const char *name)
|
static void eap_tls_free(struct eap_state *eap)
|
||||||
{
|
|
||||||
struct eap_tls_state *tls;
|
|
||||||
|
|
||||||
if (strcasecmp(name, "TLS"))
|
|
||||||
return -ENOTSUP;
|
|
||||||
|
|
||||||
tls = l_new(struct eap_tls_state, 1);
|
|
||||||
|
|
||||||
eap_set_data(eap, tls);
|
|
||||||
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
static void eap_tls_remove(struct eap_state *eap)
|
|
||||||
{
|
{
|
||||||
struct eap_tls_state *tls = eap_get_data(eap);
|
struct eap_tls_state *tls = eap_get_data(eap);
|
||||||
|
|
||||||
|
@ -387,9 +373,11 @@ static bool eap_tls_load_settings(struct eap_state *eap,
|
||||||
struct l_settings *settings,
|
struct l_settings *settings,
|
||||||
const char *prefix)
|
const char *prefix)
|
||||||
{
|
{
|
||||||
struct eap_tls_state *tls = eap_get_data(eap);
|
struct eap_tls_state *tls;
|
||||||
char setting[64];
|
char setting[64];
|
||||||
|
|
||||||
|
tls = l_new(struct eap_tls_state, 1);
|
||||||
|
|
||||||
snprintf(setting, sizeof(setting), "%sTLS-CACert", prefix);
|
snprintf(setting, sizeof(setting), "%sTLS-CACert", prefix);
|
||||||
tls->ca_cert = l_strdup(l_settings_get_value(settings,
|
tls->ca_cert = l_strdup(l_settings_get_value(settings,
|
||||||
"Security", setting));
|
"Security", setting));
|
||||||
|
@ -408,15 +396,26 @@ static bool eap_tls_load_settings(struct eap_state *eap,
|
||||||
|
|
||||||
if (!tls->client_cert && tls->client_key) {
|
if (!tls->client_cert && tls->client_key) {
|
||||||
l_error("Client key present but no client certificate");
|
l_error("Client key present but no client certificate");
|
||||||
return false;
|
goto err;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!tls->client_key && tls->passphrase) {
|
if (!tls->client_key && tls->passphrase) {
|
||||||
l_error("Passphrase present but no client private key");
|
l_error("Passphrase present but no client private key");
|
||||||
return false;
|
goto err;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
eap_set_data(eap, tls);
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
|
|
||||||
|
err:
|
||||||
|
l_free(tls->ca_cert);
|
||||||
|
l_free(tls->client_cert);
|
||||||
|
l_free(tls->client_key);
|
||||||
|
l_free(tls->passphrase);
|
||||||
|
l_free(tls);
|
||||||
|
|
||||||
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
static struct eap_method eap_tls = {
|
static struct eap_method eap_tls = {
|
||||||
|
@ -424,8 +423,7 @@ static struct eap_method eap_tls = {
|
||||||
.exports_msk = true,
|
.exports_msk = true,
|
||||||
.name = "TLS",
|
.name = "TLS",
|
||||||
|
|
||||||
.probe = eap_tls_probe,
|
.free = eap_tls_free,
|
||||||
.remove = eap_tls_remove,
|
|
||||||
.handle_request = eap_tls_handle_request,
|
.handle_request = eap_tls_handle_request,
|
||||||
.load_settings = eap_tls_load_settings,
|
.load_settings = eap_tls_load_settings,
|
||||||
};
|
};
|
||||||
|
|
|
@ -51,21 +51,7 @@ struct eap_ttls_state {
|
||||||
uint8_t negotiated_version;
|
uint8_t negotiated_version;
|
||||||
};
|
};
|
||||||
|
|
||||||
static int eap_ttls_probe(struct eap_state *eap, const char *name)
|
static void eap_ttls_free(struct eap_state *eap)
|
||||||
{
|
|
||||||
struct eap_ttls_state *ttls;
|
|
||||||
|
|
||||||
if (strcasecmp(name, "TTLS"))
|
|
||||||
return -ENOTSUP;
|
|
||||||
|
|
||||||
ttls = l_new(struct eap_ttls_state, 1);
|
|
||||||
|
|
||||||
eap_set_data(eap, ttls);
|
|
||||||
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
static void eap_ttls_remove(struct eap_state *eap)
|
|
||||||
{
|
{
|
||||||
struct eap_ttls_state *ttls = eap_get_data(eap);
|
struct eap_ttls_state *ttls = eap_get_data(eap);
|
||||||
|
|
||||||
|
@ -648,9 +634,11 @@ static bool eap_ttls_load_settings(struct eap_state *eap,
|
||||||
struct l_settings *settings,
|
struct l_settings *settings,
|
||||||
const char *prefix)
|
const char *prefix)
|
||||||
{
|
{
|
||||||
struct eap_ttls_state *ttls = eap_get_data(eap);
|
struct eap_ttls_state *ttls;
|
||||||
char setting[64];
|
char setting[64];
|
||||||
|
|
||||||
|
ttls = l_new(struct eap_ttls_state, 1);
|
||||||
|
|
||||||
snprintf(setting, sizeof(setting), "%sTTLS-CACert", prefix);
|
snprintf(setting, sizeof(setting), "%sTTLS-CACert", prefix);
|
||||||
ttls->ca_cert = l_strdup(l_settings_get_value(settings,
|
ttls->ca_cert = l_strdup(l_settings_get_value(settings,
|
||||||
"Security", setting));
|
"Security", setting));
|
||||||
|
@ -670,24 +658,40 @@ static bool eap_ttls_load_settings(struct eap_state *eap,
|
||||||
|
|
||||||
if (!ttls->client_cert && ttls->client_key) {
|
if (!ttls->client_cert && ttls->client_key) {
|
||||||
l_error("Client key present but no client certificate");
|
l_error("Client key present but no client certificate");
|
||||||
return false;
|
goto err;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!ttls->client_key && ttls->passphrase) {
|
if (!ttls->client_key && ttls->passphrase) {
|
||||||
l_error("Passphrase present but no client private key");
|
l_error("Passphrase present but no client private key");
|
||||||
return false;
|
goto err;
|
||||||
}
|
}
|
||||||
|
|
||||||
ttls->eap = eap_new(eap_ttls_eap_tx_packet,
|
ttls->eap = eap_new(eap_ttls_eap_tx_packet,
|
||||||
eap_ttls_eap_complete, eap);
|
eap_ttls_eap_complete, eap);
|
||||||
if (!ttls->eap) {
|
if (!ttls->eap) {
|
||||||
l_error("Could not create the TTLS inner EAP instance");
|
l_error("Could not create the TTLS inner EAP instance");
|
||||||
return false;
|
goto err;
|
||||||
}
|
}
|
||||||
|
|
||||||
snprintf(setting, sizeof(setting), "%sTTLS-Phase2-", prefix);
|
snprintf(setting, sizeof(setting), "%sTTLS-Phase2-", prefix);
|
||||||
|
|
||||||
return eap_load_settings(ttls->eap, settings, setting);
|
if (!eap_load_settings(ttls->eap, settings, setting)) {
|
||||||
|
eap_free(ttls->eap);
|
||||||
|
goto err;
|
||||||
|
}
|
||||||
|
|
||||||
|
eap_set_data(eap, ttls);
|
||||||
|
|
||||||
|
return true;
|
||||||
|
|
||||||
|
err:
|
||||||
|
l_free(ttls->ca_cert);
|
||||||
|
l_free(ttls->client_cert);
|
||||||
|
l_free(ttls->client_key);
|
||||||
|
l_free(ttls->passphrase);
|
||||||
|
l_free(ttls);
|
||||||
|
|
||||||
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
static struct eap_method eap_ttls = {
|
static struct eap_method eap_ttls = {
|
||||||
|
@ -695,8 +699,7 @@ static struct eap_method eap_ttls = {
|
||||||
.exports_msk = true,
|
.exports_msk = true,
|
||||||
.name = "TTLS",
|
.name = "TTLS",
|
||||||
|
|
||||||
.probe = eap_ttls_probe,
|
.free = eap_ttls_free,
|
||||||
.remove = eap_ttls_remove,
|
|
||||||
.handle_request = eap_ttls_handle_request,
|
.handle_request = eap_ttls_handle_request,
|
||||||
.load_settings = eap_ttls_load_settings,
|
.load_settings = eap_ttls_load_settings,
|
||||||
};
|
};
|
||||||
|
|
|
@ -269,21 +269,7 @@ static bool encrypted_settings_encrypt(struct eap_wsc_state *wsc,
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int eap_wsc_probe(struct eap_state *eap, const char *name)
|
static void eap_wsc_free(struct eap_state *eap)
|
||||||
{
|
|
||||||
struct eap_wsc_state *wsc;
|
|
||||||
|
|
||||||
if (strcasecmp(name, "WSC"))
|
|
||||||
return -ENOTSUP;
|
|
||||||
|
|
||||||
wsc = l_new(struct eap_wsc_state, 1);
|
|
||||||
|
|
||||||
eap_set_data(eap, wsc);
|
|
||||||
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
static void eap_wsc_remove(struct eap_state *eap)
|
|
||||||
{
|
{
|
||||||
struct eap_wsc_state *wsc = eap_get_data(eap);
|
struct eap_wsc_state *wsc = eap_get_data(eap);
|
||||||
|
|
||||||
|
@ -1167,25 +1153,27 @@ static bool eap_wsc_load_settings(struct eap_state *eap,
|
||||||
struct l_settings *settings,
|
struct l_settings *settings,
|
||||||
const char *prefix)
|
const char *prefix)
|
||||||
{
|
{
|
||||||
struct eap_wsc_state *wsc = eap_get_data(eap);
|
struct eap_wsc_state *wsc;
|
||||||
const char *v;
|
const char *v;
|
||||||
uint8_t private_key[192];
|
uint8_t private_key[192];
|
||||||
size_t len;
|
size_t len;
|
||||||
unsigned int u32;
|
unsigned int u32;
|
||||||
const char *device_password;
|
const char *device_password;
|
||||||
|
|
||||||
|
wsc = l_new(struct eap_wsc_state, 1);
|
||||||
|
|
||||||
wsc->m1 = l_new(struct wsc_m1, 1);
|
wsc->m1 = l_new(struct wsc_m1, 1);
|
||||||
wsc->m1->version2 = true;
|
wsc->m1->version2 = true;
|
||||||
|
|
||||||
v = l_settings_get_value(settings, "WSC", "EnrolleeMAC");
|
v = l_settings_get_value(settings, "WSC", "EnrolleeMAC");
|
||||||
if (!v)
|
if (!v)
|
||||||
return false;
|
goto err;
|
||||||
|
|
||||||
if (!util_string_to_address(v, wsc->m1->addr))
|
if (!util_string_to_address(v, wsc->m1->addr))
|
||||||
return false;
|
goto err;
|
||||||
|
|
||||||
if (!wsc_uuid_from_addr(wsc->m1->addr, wsc->m1->uuid_e))
|
if (!wsc_uuid_from_addr(wsc->m1->addr, wsc->m1->uuid_e))
|
||||||
return false;
|
goto err;
|
||||||
|
|
||||||
if (!load_hexencoded(settings, "EnrolleeNonce",
|
if (!load_hexencoded(settings, "EnrolleeNonce",
|
||||||
wsc->m1->enrollee_nonce, 16))
|
wsc->m1->enrollee_nonce, 16))
|
||||||
|
@ -1198,15 +1186,15 @@ static bool eap_wsc_load_settings(struct eap_state *eap,
|
||||||
memset(private_key, 0, 192);
|
memset(private_key, 0, 192);
|
||||||
|
|
||||||
if (!wsc->private)
|
if (!wsc->private)
|
||||||
return false;
|
goto err;
|
||||||
|
|
||||||
len = sizeof(wsc->m1->public_key);
|
len = sizeof(wsc->m1->public_key);
|
||||||
if (!l_key_compute_dh_public(dh5_generator, wsc->private, dh5_prime,
|
if (!l_key_compute_dh_public(dh5_generator, wsc->private, dh5_prime,
|
||||||
wsc->m1->public_key, &len))
|
wsc->m1->public_key, &len))
|
||||||
return false;
|
goto err;
|
||||||
|
|
||||||
if (len != sizeof(wsc->m1->public_key))
|
if (len != sizeof(wsc->m1->public_key))
|
||||||
return false;
|
goto err;
|
||||||
|
|
||||||
wsc->m1->auth_type_flags = WSC_AUTHENTICATION_TYPE_WPA2_PERSONAL |
|
wsc->m1->auth_type_flags = WSC_AUTHENTICATION_TYPE_WPA2_PERSONAL |
|
||||||
WSC_AUTHENTICATION_TYPE_WPA_PERSONAL |
|
WSC_AUTHENTICATION_TYPE_WPA_PERSONAL |
|
||||||
|
@ -1252,7 +1240,7 @@ static bool eap_wsc_load_settings(struct eap_state *eap,
|
||||||
strcpy(wsc->m1->device_name, " ");
|
strcpy(wsc->m1->device_name, " ");
|
||||||
|
|
||||||
if (!l_settings_get_uint(settings, "WSC", "RFBand", &u32))
|
if (!l_settings_get_uint(settings, "WSC", "RFBand", &u32))
|
||||||
return false;
|
goto err;
|
||||||
|
|
||||||
switch (u32) {
|
switch (u32) {
|
||||||
case WSC_RF_BAND_2_4_GHZ:
|
case WSC_RF_BAND_2_4_GHZ:
|
||||||
|
@ -1261,7 +1249,7 @@ static bool eap_wsc_load_settings(struct eap_state *eap,
|
||||||
wsc->m1->rf_bands = u32;
|
wsc->m1->rf_bands = u32;
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
return false;
|
goto err;
|
||||||
}
|
}
|
||||||
|
|
||||||
wsc->m1->association_state = WSC_ASSOCIATION_STATE_NOT_ASSOCIATED;
|
wsc->m1->association_state = WSC_ASSOCIATION_STATE_NOT_ASSOCIATED;
|
||||||
|
@ -1285,11 +1273,11 @@ static bool eap_wsc_load_settings(struct eap_state *eap,
|
||||||
|
|
||||||
for (i = 0; device_password[i]; i++) {
|
for (i = 0; device_password[i]; i++) {
|
||||||
if (!l_ascii_isxdigit(device_password[i]))
|
if (!l_ascii_isxdigit(device_password[i]))
|
||||||
return false;
|
goto err;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (i < 8)
|
if (i < 8)
|
||||||
return false;
|
goto err;
|
||||||
|
|
||||||
wsc->device_password = strdup(device_password);
|
wsc->device_password = strdup(device_password);
|
||||||
/*
|
/*
|
||||||
|
@ -1320,7 +1308,20 @@ static bool eap_wsc_load_settings(struct eap_state *eap,
|
||||||
if (!load_hexencoded(settings, "IV2", wsc->iv2, 16))
|
if (!load_hexencoded(settings, "IV2", wsc->iv2, 16))
|
||||||
l_getrandom(wsc->iv2, 16);
|
l_getrandom(wsc->iv2, 16);
|
||||||
|
|
||||||
|
eap_set_data(eap, wsc);
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
|
|
||||||
|
err:
|
||||||
|
l_free(wsc->device_password);
|
||||||
|
|
||||||
|
if (wsc->private)
|
||||||
|
l_key_free(wsc->private);
|
||||||
|
|
||||||
|
l_free(wsc->m1);
|
||||||
|
l_free(wsc);
|
||||||
|
|
||||||
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
static struct eap_method eap_wsc = {
|
static struct eap_method eap_wsc = {
|
||||||
|
@ -1329,8 +1330,7 @@ static struct eap_method eap_wsc = {
|
||||||
.request_type = EAP_TYPE_EXPANDED,
|
.request_type = EAP_TYPE_EXPANDED,
|
||||||
.exports_msk = true,
|
.exports_msk = true,
|
||||||
.name = "WSC",
|
.name = "WSC",
|
||||||
.probe = eap_wsc_probe,
|
.free = eap_wsc_free,
|
||||||
.remove = eap_wsc_remove,
|
|
||||||
.handle_request = eap_wsc_handle_request,
|
.handle_request = eap_wsc_handle_request,
|
||||||
.handle_retransmit = eap_wsc_handle_retransmit,
|
.handle_retransmit = eap_wsc_handle_retransmit,
|
||||||
.load_settings = eap_wsc_load_settings,
|
.load_settings = eap_wsc_load_settings,
|
||||||
|
|
10
src/eap.c
10
src/eap.c
|
@ -87,7 +87,7 @@ void eap_set_event_func(struct eap_state *eap, eap_event_func_t func)
|
||||||
void eap_free(struct eap_state *eap)
|
void eap_free(struct eap_state *eap)
|
||||||
{
|
{
|
||||||
if (eap->method_state)
|
if (eap->method_state)
|
||||||
eap->method->remove(eap);
|
eap->method->free(eap);
|
||||||
|
|
||||||
if (eap->identity)
|
if (eap->identity)
|
||||||
l_free(eap->identity);
|
l_free(eap->identity);
|
||||||
|
@ -319,7 +319,7 @@ void eap_rx_packet(struct eap_state *eap, const uint8_t *pkt, size_t len)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
if (eap->method_state)
|
if (eap->method_state)
|
||||||
eap->method->remove(eap);
|
eap->method->free(eap);
|
||||||
|
|
||||||
eap->method = NULL;
|
eap->method = NULL;
|
||||||
|
|
||||||
|
@ -351,7 +351,7 @@ bool eap_load_settings(struct eap_state *eap, struct l_settings *settings,
|
||||||
entry = entry->next) {
|
entry = entry->next) {
|
||||||
method = entry->data;
|
method = entry->data;
|
||||||
|
|
||||||
if (method->probe(eap, method_name) == 0) {
|
if (!strcasecmp(method_name, method->name)) {
|
||||||
eap->method = method;
|
eap->method = method;
|
||||||
|
|
||||||
break;
|
break;
|
||||||
|
@ -387,8 +387,8 @@ bool eap_load_settings(struct eap_state *eap, struct l_settings *settings,
|
||||||
return true;
|
return true;
|
||||||
|
|
||||||
err:
|
err:
|
||||||
if (eap->method->remove)
|
if (eap->method_state)
|
||||||
eap->method->remove(eap);
|
eap->method->free(eap);
|
||||||
|
|
||||||
eap->method = NULL;
|
eap->method = NULL;
|
||||||
|
|
||||||
|
|
|
@ -93,12 +93,10 @@ struct eap_method {
|
||||||
bool exports_msk;
|
bool exports_msk;
|
||||||
const char *name;
|
const char *name;
|
||||||
|
|
||||||
int (*probe)(struct eap_state *eap, const char *method_string);
|
|
||||||
void (*remove)(struct eap_state *eap);
|
|
||||||
|
|
||||||
bool (*load_settings)(struct eap_state *eap,
|
bool (*load_settings)(struct eap_state *eap,
|
||||||
struct l_settings *settings,
|
struct l_settings *settings,
|
||||||
const char *prefix);
|
const char *prefix);
|
||||||
|
void (*free)(struct eap_state *eap);
|
||||||
|
|
||||||
void (*handle_request)(struct eap_state *eap,
|
void (*handle_request)(struct eap_state *eap,
|
||||||
const uint8_t *pkt, size_t len);
|
const uint8_t *pkt, size_t len);
|
||||||
|
|
Loading…
Reference in New Issue