implemented get|set_identifier() for eap_sim_t

This commit is contained in:
Andreas Steffen
2011-04-05 17:01:28 +02:00
parent 125fadb3e0
commit dcfb8177b3
2 changed files with 56 additions and 34 deletions
+42 -34
View File
@@ -55,6 +55,11 @@ struct private_eap_sim_peer_t {
*/ */
identification_t *reauth; identification_t *reauth;
/**
* EAP message identifier
*/
u_int8_t identifier;
/** /**
* EAP-SIM crypto helper * EAP-SIM crypto helper
*/ */
@@ -98,7 +103,7 @@ static chunk_t version = chunk_from_chars(0x00,0x01);
* Create a SIM_CLIENT_ERROR * Create a SIM_CLIENT_ERROR
*/ */
static eap_payload_t* create_client_error(private_eap_sim_peer_t *this, static eap_payload_t* create_client_error(private_eap_sim_peer_t *this,
u_int8_t identifier, simaka_client_error_t code) simaka_client_error_t code)
{ {
simaka_message_t *message; simaka_message_t *message;
eap_payload_t *out; eap_payload_t *out;
@@ -106,7 +111,7 @@ static eap_payload_t* create_client_error(private_eap_sim_peer_t *this,
DBG1(DBG_IKE, "sending client error '%N'", simaka_client_error_names, code); DBG1(DBG_IKE, "sending client error '%N'", simaka_client_error_names, code);
message = simaka_message_create(FALSE, identifier, EAP_SIM, message = simaka_message_create(FALSE, this->identifier, EAP_SIM,
SIM_CLIENT_ERROR, this->crypto); SIM_CLIENT_ERROR, this->crypto);
encoded = htons(code); encoded = htons(code);
message->add_attribute(message, AT_CLIENT_ERROR_CODE, message->add_attribute(message, AT_CLIENT_ERROR_CODE,
@@ -164,8 +169,7 @@ static status_t process_start(private_eap_sim_peer_t *this,
default: default:
if (!simaka_attribute_skippable(type)) if (!simaka_attribute_skippable(type))
{ {
*out = create_client_error(this, in->get_identifier(in), *out = create_client_error(this, SIM_UNABLE_TO_PROCESS);
SIM_UNABLE_TO_PROCESS);
enumerator->destroy(enumerator); enumerator->destroy(enumerator);
return NEED_MORE; return NEED_MORE;
} }
@@ -177,8 +181,7 @@ static status_t process_start(private_eap_sim_peer_t *this,
if (!supported) if (!supported)
{ {
DBG1(DBG_IKE, "server does not support EAP-SIM version number 1"); DBG1(DBG_IKE, "server does not support EAP-SIM version number 1");
*out = create_client_error(this, in->get_identifier(in), *out = create_client_error(this, SIM_UNSUPPORTED_VERSION);
SIM_UNSUPPORTED_VERSION);
return NEED_MORE; return NEED_MORE;
} }
@@ -214,7 +217,7 @@ static status_t process_start(private_eap_sim_peer_t *this,
free(this->nonce.ptr); free(this->nonce.ptr);
rng->allocate_bytes(rng, NONCE_LEN, &this->nonce); rng->allocate_bytes(rng, NONCE_LEN, &this->nonce);
message = simaka_message_create(FALSE, in->get_identifier(in), EAP_SIM, message = simaka_message_create(FALSE, this->identifier, EAP_SIM,
SIM_START, this->crypto); SIM_START, this->crypto);
if (!this->reauth) if (!this->reauth)
{ {
@@ -261,8 +264,7 @@ static status_t process_challenge(private_eap_sim_peer_t *this,
default: default:
if (!simaka_attribute_skippable(type)) if (!simaka_attribute_skippable(type))
{ {
*out = create_client_error(this, in->get_identifier(in), *out = create_client_error(this, SIM_UNABLE_TO_PROCESS);
SIM_UNABLE_TO_PROCESS);
enumerator->destroy(enumerator); enumerator->destroy(enumerator);
return NEED_MORE; return NEED_MORE;
} }
@@ -277,8 +279,7 @@ static status_t process_challenge(private_eap_sim_peer_t *this,
memeq(rands.ptr, rands.ptr + SIM_RAND_LEN, SIM_RAND_LEN)) memeq(rands.ptr, rands.ptr + SIM_RAND_LEN, SIM_RAND_LEN))
{ {
DBG1(DBG_IKE, "no valid AT_RAND received"); DBG1(DBG_IKE, "no valid AT_RAND received");
*out = create_client_error(this, in->get_identifier(in), *out = create_client_error(this, SIM_INSUFFICIENT_CHALLENGES);
SIM_INSUFFICIENT_CHALLENGES);
return NEED_MORE; return NEED_MORE;
} }
/* get two or three KCs/SRESes from SIM using RANDs */ /* get two or three KCs/SRESes from SIM using RANDs */
@@ -290,8 +291,7 @@ static status_t process_challenge(private_eap_sim_peer_t *this,
rands.ptr, sres.ptr, kc.ptr)) rands.ptr, sres.ptr, kc.ptr))
{ {
DBG1(DBG_IKE, "unable to get EAP-SIM triplet"); DBG1(DBG_IKE, "unable to get EAP-SIM triplet");
*out = create_client_error(this, in->get_identifier(in), *out = create_client_error(this, SIM_UNABLE_TO_PROCESS);
SIM_UNABLE_TO_PROCESS);
return NEED_MORE; return NEED_MORE;
} }
DBG3(DBG_IKE, "got triplet for RAND %b\n Kc %b\n SRES %b", DBG3(DBG_IKE, "got triplet for RAND %b\n Kc %b\n SRES %b",
@@ -316,8 +316,7 @@ static status_t process_challenge(private_eap_sim_peer_t *this,
* parse() again after key derivation, reading encrypted attributes */ * parse() again after key derivation, reading encrypted attributes */
if (!in->verify(in, this->nonce) || !in->parse(in)) if (!in->verify(in, this->nonce) || !in->parse(in))
{ {
*out = create_client_error(this, in->get_identifier(in), *out = create_client_error(this, SIM_UNABLE_TO_PROCESS);
SIM_UNABLE_TO_PROCESS);
return NEED_MORE; return NEED_MORE;
} }
@@ -345,7 +344,7 @@ static status_t process_challenge(private_eap_sim_peer_t *this,
enumerator->destroy(enumerator); enumerator->destroy(enumerator);
/* build response with AT_MAC, built over "EAP packet | n*SRES" */ /* build response with AT_MAC, built over "EAP packet | n*SRES" */
message = simaka_message_create(FALSE, in->get_identifier(in), EAP_SIM, message = simaka_message_create(FALSE, this->identifier, EAP_SIM,
SIM_CHALLENGE, this->crypto); SIM_CHALLENGE, this->crypto);
*out = message->generate(message, sreses); *out = message->generate(message, sreses);
message->destroy(message); message->destroy(message);
@@ -379,8 +378,7 @@ static status_t process_reauthentication(private_eap_sim_peer_t *this,
{ {
DBG1(DBG_IKE, "received %N, but not expected", DBG1(DBG_IKE, "received %N, but not expected",
simaka_subtype_names, SIM_REAUTHENTICATION); simaka_subtype_names, SIM_REAUTHENTICATION);
*out = create_client_error(this, in->get_identifier(in), *out = create_client_error(this, SIM_UNABLE_TO_PROCESS);
SIM_UNABLE_TO_PROCESS);
return NEED_MORE; return NEED_MORE;
} }
@@ -390,8 +388,7 @@ static status_t process_reauthentication(private_eap_sim_peer_t *this,
/* verify MAC and parse again with decryption key */ /* verify MAC and parse again with decryption key */
if (!in->verify(in, chunk_empty) || !in->parse(in)) if (!in->verify(in, chunk_empty) || !in->parse(in))
{ {
*out = create_client_error(this, in->get_identifier(in), *out = create_client_error(this, SIM_UNABLE_TO_PROCESS);
SIM_UNABLE_TO_PROCESS);
return NEED_MORE; return NEED_MORE;
} }
@@ -412,8 +409,7 @@ static status_t process_reauthentication(private_eap_sim_peer_t *this,
default: default:
if (!simaka_attribute_skippable(type)) if (!simaka_attribute_skippable(type))
{ {
*out = create_client_error(this, in->get_identifier(in), *out = create_client_error(this, SIM_UNABLE_TO_PROCESS);
SIM_UNABLE_TO_PROCESS);
enumerator->destroy(enumerator); enumerator->destroy(enumerator);
return NEED_MORE; return NEED_MORE;
} }
@@ -425,12 +421,11 @@ static status_t process_reauthentication(private_eap_sim_peer_t *this,
if (!nonce.len || !counter.len) if (!nonce.len || !counter.len)
{ {
DBG1(DBG_IKE, "EAP-SIM/Request/Re-Authentication message incomplete"); DBG1(DBG_IKE, "EAP-SIM/Request/Re-Authentication message incomplete");
*out = create_client_error(this, in->get_identifier(in), *out = create_client_error(this, SIM_UNABLE_TO_PROCESS);
SIM_UNABLE_TO_PROCESS);
return NEED_MORE; return NEED_MORE;
} }
message = simaka_message_create(FALSE, in->get_identifier(in), EAP_SIM, message = simaka_message_create(FALSE, this->identifier, EAP_SIM,
SIM_REAUTHENTICATION, this->crypto); SIM_REAUTHENTICATION, this->crypto);
if (counter_too_small(this, counter)) if (counter_too_small(this, counter))
{ {
@@ -503,15 +498,14 @@ static status_t process_notification(private_eap_sim_peer_t *this,
if (success) if (success)
{ /* empty notification reply */ { /* empty notification reply */
message = simaka_message_create(FALSE, in->get_identifier(in), EAP_SIM, message = simaka_message_create(FALSE, this->identifier, EAP_SIM,
SIM_NOTIFICATION, this->crypto); SIM_NOTIFICATION, this->crypto);
*out = message->generate(message, chunk_empty); *out = message->generate(message, chunk_empty);
message->destroy(message); message->destroy(message);
} }
else else
{ {
*out = create_client_error(this, in->get_identifier(in), *out = create_client_error(this, SIM_UNABLE_TO_PROCESS);
SIM_UNABLE_TO_PROCESS);
} }
return NEED_MORE; return NEED_MORE;
} }
@@ -522,18 +516,19 @@ METHOD(eap_method_t, process, status_t,
simaka_message_t *message; simaka_message_t *message;
status_t status; status_t status;
/* store received EAP message identifier */
this->identifier = in->get_identifier(in);
message = simaka_message_create_from_payload(in, this->crypto); message = simaka_message_create_from_payload(in, this->crypto);
if (!message) if (!message)
{ {
*out = create_client_error(this, in->get_identifier(in), *out = create_client_error(this, SIM_UNABLE_TO_PROCESS);
SIM_UNABLE_TO_PROCESS);
return NEED_MORE; return NEED_MORE;
} }
if (!message->parse(message)) if (!message->parse(message))
{ {
message->destroy(message); message->destroy(message);
*out = create_client_error(this, in->get_identifier(in), *out = create_client_error(this, SIM_UNABLE_TO_PROCESS);
SIM_UNABLE_TO_PROCESS);
return NEED_MORE; return NEED_MORE;
} }
switch (message->get_subtype(message)) switch (message->get_subtype(message))
@@ -553,8 +548,7 @@ METHOD(eap_method_t, process, status_t,
default: default:
DBG1(DBG_IKE, "unable to process EAP-SIM subtype %N", DBG1(DBG_IKE, "unable to process EAP-SIM subtype %N",
simaka_subtype_names, message->get_subtype(message)); simaka_subtype_names, message->get_subtype(message));
*out = create_client_error(this, in->get_identifier(in), *out = create_client_error(this, SIM_UNABLE_TO_PROCESS);
SIM_UNABLE_TO_PROCESS);
status = NEED_MORE; status = NEED_MORE;
break; break;
} }
@@ -587,6 +581,18 @@ METHOD(eap_method_t, get_msk, status_t,
return FAILED; return FAILED;
} }
METHOD(eap_method_t, get_identifier, u_int8_t,
private_eap_sim_peer_t *this)
{
return this->identifier;
}
METHOD(eap_method_t, set_identifier, void,
private_eap_sim_peer_t *this, u_int8_t identifier)
{
this->identifier = identifier;
}
METHOD(eap_method_t, is_mutual, bool, METHOD(eap_method_t, is_mutual, bool,
private_eap_sim_peer_t *this) private_eap_sim_peer_t *this)
{ {
@@ -622,6 +628,8 @@ eap_sim_peer_t *eap_sim_peer_create(identification_t *server,
.get_type = _get_type, .get_type = _get_type,
.is_mutual = _is_mutual, .is_mutual = _is_mutual,
.get_msk = _get_msk, .get_msk = _get_msk,
.get_identifier = _get_identifier,
.set_identifier = _set_identifier,
.destroy = _destroy, .destroy = _destroy,
}, },
}, },
@@ -535,6 +535,18 @@ METHOD(eap_method_t, get_msk, status_t,
return FAILED; return FAILED;
} }
METHOD(eap_method_t, get_identifier, u_int8_t,
private_eap_sim_server_t *this)
{
return this->identifier;
}
METHOD(eap_method_t, set_identifier, void,
private_eap_sim_server_t *this, u_int8_t identifier)
{
this->identifier = identifier;
}
METHOD(eap_method_t, is_mutual, bool, METHOD(eap_method_t, is_mutual, bool,
private_eap_sim_server_t *this) private_eap_sim_server_t *this)
{ {
@@ -571,6 +583,8 @@ eap_sim_server_t *eap_sim_server_create(identification_t *server,
.get_type = _get_type, .get_type = _get_type,
.is_mutual = _is_mutual, .is_mutual = _is_mutual,
.get_msk = _get_msk, .get_msk = _get_msk,
.get_identifier = _get_identifier,
.set_identifier = _set_identifier,
.destroy = _destroy, .destroy = _destroy,
}, },
}, },