Skip any payloads in front of SA to extract initiators SA bytes
This commit is contained in:
@@ -133,20 +133,34 @@ static auth_cfg_t *get_auth_cfg(private_main_mode_t *this, bool local)
|
|||||||
/**
|
/**
|
||||||
* Save the encoded SA payload of a message
|
* Save the encoded SA payload of a message
|
||||||
*/
|
*/
|
||||||
static bool save_sa_payload(private_main_mode_t *this, message_t *message,
|
static bool save_sa_payload(private_main_mode_t *this, message_t *message)
|
||||||
sa_payload_t *sa_payload)
|
|
||||||
{
|
{
|
||||||
payload_t *payload;
|
enumerator_t *enumerator;
|
||||||
|
payload_t *payload, *sa = NULL;
|
||||||
chunk_t data;
|
chunk_t data;
|
||||||
|
size_t offset = IKE_HEADER_LENGTH;
|
||||||
|
|
||||||
|
enumerator = message->create_payload_enumerator(message);
|
||||||
|
while (enumerator->enumerate(enumerator, &payload))
|
||||||
|
{
|
||||||
|
if (payload->get_type(payload) == SECURITY_ASSOCIATION_V1)
|
||||||
|
{
|
||||||
|
sa = payload;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
offset += payload->get_length(payload);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
enumerator->destroy(enumerator);
|
||||||
|
|
||||||
/* TODO-IKEv1: handle other payloads in front of SA? */
|
|
||||||
payload = &sa_payload->payload_interface;
|
|
||||||
data = message->get_packet_data(message);
|
data = message->get_packet_data(message);
|
||||||
if (data.len >= IKE_HEADER_LENGTH + payload->get_length(payload))
|
if (sa && data.len >= offset + sa->get_length(sa))
|
||||||
{
|
{
|
||||||
/* Get SA payload without 4 byte fixed header */
|
/* Get SA payload without 4 byte fixed header */
|
||||||
data = chunk_skip(data, IKE_HEADER_LENGTH);
|
data = chunk_skip(data, offset);
|
||||||
data.len = payload->get_length(payload);
|
data.len = sa->get_length(sa);
|
||||||
data = chunk_skip(data, 4);
|
data = chunk_skip(data, 4);
|
||||||
this->sa_payload = chunk_clone(data);
|
this->sa_payload = chunk_clone(data);
|
||||||
return TRUE;
|
return TRUE;
|
||||||
@@ -188,7 +202,7 @@ METHOD(task_t, build_i, status_t,
|
|||||||
return FAILED;
|
return FAILED;
|
||||||
}
|
}
|
||||||
packet->destroy(packet);
|
packet->destroy(packet);
|
||||||
if (!save_sa_payload(this, message, sa_payload))
|
if (!save_sa_payload(this, message))
|
||||||
{
|
{
|
||||||
DBG1(DBG_IKE, "SA payload invalid");
|
DBG1(DBG_IKE, "SA payload invalid");
|
||||||
return FAILED;
|
return FAILED;
|
||||||
@@ -305,7 +319,7 @@ METHOD(task_t, process_r, status_t,
|
|||||||
|
|
||||||
sa_payload = (sa_payload_t*)message->get_payload(message,
|
sa_payload = (sa_payload_t*)message->get_payload(message,
|
||||||
SECURITY_ASSOCIATION_V1);
|
SECURITY_ASSOCIATION_V1);
|
||||||
if (!sa_payload || !save_sa_payload(this, message, sa_payload))
|
if (!sa_payload || !save_sa_payload(this, message))
|
||||||
{
|
{
|
||||||
DBG1(DBG_IKE, "SA payload missing or invalid");
|
DBG1(DBG_IKE, "SA payload missing or invalid");
|
||||||
return FAILED;
|
return FAILED;
|
||||||
|
|||||||
Reference in New Issue
Block a user