Add a return value to simaka_message_t.generate()
This commit is contained in:
@@ -80,13 +80,31 @@ struct private_eap_aka_peer_t {
|
||||
u_int16_t counter;
|
||||
};
|
||||
|
||||
/**
|
||||
* Generate a payload from a message, destroy message
|
||||
*/
|
||||
static bool generate_payload(simaka_message_t *message, chunk_t data,
|
||||
eap_payload_t **out)
|
||||
{
|
||||
chunk_t chunk;
|
||||
bool ok;
|
||||
|
||||
ok = message->generate(message, data, &chunk);
|
||||
if (ok)
|
||||
{
|
||||
*out = eap_payload_create_data_own(chunk);
|
||||
}
|
||||
message->destroy(message);
|
||||
return ok;
|
||||
}
|
||||
|
||||
/**
|
||||
* Create a AKA_CLIENT_ERROR: "Unable to process"
|
||||
*/
|
||||
static eap_payload_t* create_client_error(private_eap_aka_peer_t *this)
|
||||
static bool create_client_error(private_eap_aka_peer_t *this,
|
||||
eap_payload_t **out)
|
||||
{
|
||||
simaka_message_t *message;
|
||||
eap_payload_t *out;
|
||||
u_int16_t encoded;
|
||||
|
||||
DBG1(DBG_IKE, "sending client error '%N'",
|
||||
@@ -97,9 +115,8 @@ static eap_payload_t* create_client_error(private_eap_aka_peer_t *this)
|
||||
encoded = htons(AKA_UNABLE_TO_PROCESS);
|
||||
message->add_attribute(message, AT_CLIENT_ERROR_CODE,
|
||||
chunk_create((char*)&encoded, sizeof(encoded)));
|
||||
out = eap_payload_create_data_own(message->generate(message, chunk_empty));
|
||||
message->destroy(message);
|
||||
return out;
|
||||
|
||||
return generate_payload(message, chunk_empty, out);
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -134,8 +151,11 @@ static status_t process_identity(private_eap_aka_peer_t *this,
|
||||
default:
|
||||
if (!simaka_attribute_skippable(type))
|
||||
{
|
||||
*out = create_client_error(this);
|
||||
enumerator->destroy(enumerator);
|
||||
if (!create_client_error(this, out))
|
||||
{
|
||||
return FAILED;
|
||||
}
|
||||
return NEED_MORE;
|
||||
}
|
||||
break;
|
||||
@@ -175,9 +195,10 @@ static status_t process_identity(private_eap_aka_peer_t *this,
|
||||
{
|
||||
message->add_attribute(message, AT_IDENTITY, id);
|
||||
}
|
||||
*out = eap_payload_create_data_own(message->generate(message, chunk_empty));
|
||||
message->destroy(message);
|
||||
|
||||
if (!generate_payload(message, chunk_empty, out))
|
||||
{
|
||||
return FAILED;
|
||||
}
|
||||
return NEED_MORE;
|
||||
}
|
||||
|
||||
@@ -210,8 +231,11 @@ static status_t process_challenge(private_eap_aka_peer_t *this,
|
||||
default:
|
||||
if (!simaka_attribute_skippable(type))
|
||||
{
|
||||
*out = create_client_error(this);
|
||||
enumerator->destroy(enumerator);
|
||||
if (!create_client_error(this, out))
|
||||
{
|
||||
return FAILED;
|
||||
}
|
||||
return NEED_MORE;
|
||||
}
|
||||
break;
|
||||
@@ -222,7 +246,10 @@ static status_t process_challenge(private_eap_aka_peer_t *this,
|
||||
if (!rand.len || !autn.len)
|
||||
{
|
||||
DBG1(DBG_IKE, "received invalid EAP-AKA challenge message");
|
||||
*out = create_client_error(this);
|
||||
if (!create_client_error(this, out))
|
||||
{
|
||||
return FAILED;
|
||||
}
|
||||
return NEED_MORE;
|
||||
}
|
||||
|
||||
@@ -237,9 +264,10 @@ static status_t process_challenge(private_eap_aka_peer_t *this,
|
||||
AKA_SYNCHRONIZATION_FAILURE, this->crypto);
|
||||
message->add_attribute(message, AT_AUTS,
|
||||
chunk_create(auts, AKA_AUTS_LEN));
|
||||
*out = eap_payload_create_data_own(message->generate(message,
|
||||
chunk_empty));
|
||||
message->destroy(message);
|
||||
if (!generate_payload(message, chunk_empty, out))
|
||||
{
|
||||
return FAILED;
|
||||
}
|
||||
return NEED_MORE;
|
||||
}
|
||||
if (status != SUCCESS)
|
||||
@@ -248,9 +276,10 @@ static status_t process_challenge(private_eap_aka_peer_t *this,
|
||||
this->permanent, simaka_subtype_names, AKA_AUTHENTICATION_REJECT);
|
||||
message = simaka_message_create(FALSE, in->get_identifier(in), EAP_AKA,
|
||||
AKA_AUTHENTICATION_REJECT, this->crypto);
|
||||
*out = eap_payload_create_data_own(message->generate(message,
|
||||
chunk_empty));
|
||||
message->destroy(message);
|
||||
if (!generate_payload(message, chunk_empty, out))
|
||||
{
|
||||
return FAILED;
|
||||
}
|
||||
return NEED_MORE;
|
||||
}
|
||||
|
||||
@@ -270,7 +299,10 @@ static status_t process_challenge(private_eap_aka_peer_t *this,
|
||||
* reading encrypted attributes */
|
||||
if (!in->verify(in, chunk_empty) || !in->parse(in))
|
||||
{
|
||||
*out = create_client_error(this);
|
||||
if (!create_client_error(this, out))
|
||||
{
|
||||
return FAILED;
|
||||
}
|
||||
return NEED_MORE;
|
||||
}
|
||||
|
||||
@@ -300,8 +332,10 @@ static status_t process_challenge(private_eap_aka_peer_t *this,
|
||||
message = simaka_message_create(FALSE, this->identifier, EAP_AKA,
|
||||
AKA_CHALLENGE, this->crypto);
|
||||
message->add_attribute(message, AT_RES, chunk_create(res, res_len));
|
||||
*out = eap_payload_create_data_own(message->generate(message, chunk_empty));
|
||||
message->destroy(message);
|
||||
if (!generate_payload(message, chunk_empty, out))
|
||||
{
|
||||
return FAILED;
|
||||
}
|
||||
return NEED_MORE;
|
||||
}
|
||||
|
||||
@@ -332,7 +366,10 @@ static status_t process_reauthentication(private_eap_aka_peer_t *this,
|
||||
{
|
||||
DBG1(DBG_IKE, "received %N, but not expected",
|
||||
simaka_subtype_names, AKA_REAUTHENTICATION);
|
||||
*out = create_client_error(this);
|
||||
if (!create_client_error(this, out))
|
||||
{
|
||||
return FAILED;
|
||||
}
|
||||
return NEED_MORE;
|
||||
}
|
||||
|
||||
@@ -342,7 +379,10 @@ static status_t process_reauthentication(private_eap_aka_peer_t *this,
|
||||
/* verify MAC and parse again with decryption key */
|
||||
if (!in->verify(in, chunk_empty) || !in->parse(in))
|
||||
{
|
||||
*out = create_client_error(this);
|
||||
if (!create_client_error(this, out))
|
||||
{
|
||||
return FAILED;
|
||||
}
|
||||
return NEED_MORE;
|
||||
}
|
||||
|
||||
@@ -363,8 +403,11 @@ static status_t process_reauthentication(private_eap_aka_peer_t *this,
|
||||
default:
|
||||
if (!simaka_attribute_skippable(type))
|
||||
{
|
||||
*out = create_client_error(this);
|
||||
enumerator->destroy(enumerator);
|
||||
if (!create_client_error(this, out))
|
||||
{
|
||||
return FAILED;
|
||||
}
|
||||
return NEED_MORE;
|
||||
}
|
||||
break;
|
||||
@@ -375,7 +418,10 @@ static status_t process_reauthentication(private_eap_aka_peer_t *this,
|
||||
if (!nonce.len || !counter.len)
|
||||
{
|
||||
DBG1(DBG_IKE, "EAP-AKA/Request/Reauthentication message incomplete");
|
||||
*out = create_client_error(this);
|
||||
if (!create_client_error(this, out))
|
||||
{
|
||||
return FAILED;
|
||||
}
|
||||
return NEED_MORE;
|
||||
}
|
||||
|
||||
@@ -403,8 +449,10 @@ static status_t process_reauthentication(private_eap_aka_peer_t *this,
|
||||
}
|
||||
}
|
||||
message->add_attribute(message, AT_COUNTER, counter);
|
||||
*out = eap_payload_create_data_own(message->generate(message, nonce));
|
||||
message->destroy(message);
|
||||
if (!generate_payload(message, nonce, out))
|
||||
{
|
||||
return FAILED;
|
||||
}
|
||||
return NEED_MORE;
|
||||
}
|
||||
|
||||
@@ -454,13 +502,17 @@ static status_t process_notification(private_eap_aka_peer_t *this,
|
||||
{ /* empty notification reply */
|
||||
message = simaka_message_create(FALSE, this->identifier, EAP_AKA,
|
||||
AKA_NOTIFICATION, this->crypto);
|
||||
*out = eap_payload_create_data_own(message->generate(message,
|
||||
chunk_empty));
|
||||
message->destroy(message);
|
||||
if (!generate_payload(message, chunk_empty, out))
|
||||
{
|
||||
return FAILED;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
*out = create_client_error(this);
|
||||
if (!create_client_error(this, out))
|
||||
{
|
||||
return FAILED;
|
||||
}
|
||||
}
|
||||
return NEED_MORE;
|
||||
}
|
||||
@@ -478,13 +530,19 @@ METHOD(eap_method_t, process, status_t,
|
||||
message = simaka_message_create_from_payload(in->get_data(in), this->crypto);
|
||||
if (!message)
|
||||
{
|
||||
*out = create_client_error(this);
|
||||
if (!create_client_error(this, out))
|
||||
{
|
||||
return FAILED;
|
||||
}
|
||||
return NEED_MORE;
|
||||
}
|
||||
if (!message->parse(message))
|
||||
{
|
||||
message->destroy(message);
|
||||
*out = create_client_error(this);
|
||||
if (!create_client_error(this, out))
|
||||
{
|
||||
return FAILED;
|
||||
}
|
||||
return NEED_MORE;
|
||||
}
|
||||
switch (message->get_subtype(message))
|
||||
@@ -504,8 +562,14 @@ METHOD(eap_method_t, process, status_t,
|
||||
default:
|
||||
DBG1(DBG_IKE, "unable to process EAP-AKA subtype %N",
|
||||
simaka_subtype_names, message->get_subtype(message));
|
||||
*out = create_client_error(this);
|
||||
status = NEED_MORE;
|
||||
if (!create_client_error(this, out))
|
||||
{
|
||||
status = FAILED;
|
||||
}
|
||||
else
|
||||
{
|
||||
status = NEED_MORE;
|
||||
}
|
||||
break;
|
||||
}
|
||||
message->destroy(message);
|
||||
|
||||
@@ -118,6 +118,24 @@ struct private_eap_aka_server_t {
|
||||
bool synchronized;
|
||||
};
|
||||
|
||||
/**
|
||||
* Generate a payload from a message, destroy message
|
||||
*/
|
||||
static bool generate_payload(simaka_message_t *message, chunk_t data,
|
||||
eap_payload_t **out)
|
||||
{
|
||||
chunk_t chunk;
|
||||
bool ok;
|
||||
|
||||
ok = message->generate(message, data, &chunk);
|
||||
if (ok)
|
||||
{
|
||||
*out = eap_payload_create_data_own(chunk);
|
||||
}
|
||||
message->destroy(message);
|
||||
return ok;
|
||||
}
|
||||
|
||||
/**
|
||||
* Create EAP-AKA/Request/Identity message
|
||||
*/
|
||||
@@ -139,9 +157,10 @@ static status_t identity(private_eap_aka_server_t *this, eap_payload_t **out)
|
||||
{
|
||||
message->add_attribute(message, AT_PERMANENT_ID_REQ, chunk_empty);
|
||||
}
|
||||
*out = eap_payload_create_data_own(message->generate(message, chunk_empty));
|
||||
message->destroy(message);
|
||||
|
||||
if (!generate_payload(message, chunk_empty, out))
|
||||
{
|
||||
return FAILED;
|
||||
}
|
||||
this->pending = AKA_IDENTITY;
|
||||
return NEED_MORE;
|
||||
}
|
||||
@@ -190,6 +209,7 @@ static status_t challenge(private_eap_aka_server_t *this, eap_payload_t **out)
|
||||
message->add_attribute(message, AT_RAND, this->rand);
|
||||
message->add_attribute(message, AT_AUTN, chunk_create(autn, AKA_AUTN_LEN));
|
||||
id = this->mgr->provider_gen_reauth(this->mgr, this->permanent, mk.ptr);
|
||||
free(mk.ptr);
|
||||
if (id)
|
||||
{
|
||||
message->add_attribute(message, AT_NEXT_REAUTH_ID,
|
||||
@@ -203,10 +223,10 @@ static status_t challenge(private_eap_aka_server_t *this, eap_payload_t **out)
|
||||
id->get_encoding(id));
|
||||
id->destroy(id);
|
||||
}
|
||||
*out = eap_payload_create_data_own(message->generate(message, chunk_empty));
|
||||
message->destroy(message);
|
||||
|
||||
free(mk.ptr);
|
||||
if (!generate_payload(message, chunk_empty, out))
|
||||
{
|
||||
return FAILED;
|
||||
}
|
||||
this->pending = AKA_CHALLENGE;
|
||||
return NEED_MORE;
|
||||
}
|
||||
@@ -247,9 +267,10 @@ static status_t reauthenticate(private_eap_aka_server_t *this,
|
||||
next->get_encoding(next));
|
||||
next->destroy(next);
|
||||
}
|
||||
*out = eap_payload_create_data_own(message->generate(message, chunk_empty));
|
||||
message->destroy(message);
|
||||
|
||||
if (!generate_payload(message, chunk_empty, out))
|
||||
{
|
||||
return FAILED;
|
||||
}
|
||||
this->pending = SIM_REAUTHENTICATION;
|
||||
return NEED_MORE;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user