Generate payload to rebuild_auth, works with injected unknown payloads
This commit is contained in:
@@ -15,6 +15,7 @@
|
|||||||
|
|
||||||
#include "hook.h"
|
#include "hook.h"
|
||||||
|
|
||||||
|
#include <encoding/generator.h>
|
||||||
#include <encoding/payloads/nonce_payload.h>
|
#include <encoding/payloads/nonce_payload.h>
|
||||||
#include <encoding/payloads/auth_payload.h>
|
#include <encoding/payloads/auth_payload.h>
|
||||||
#include <encoding/payloads/id_payload.h>
|
#include <encoding/payloads/id_payload.h>
|
||||||
@@ -58,28 +59,31 @@ static bool rebuild_auth(private_rebuild_auth_t *this, ike_sa_t *ike_sa,
|
|||||||
signature_scheme_t scheme;
|
signature_scheme_t scheme;
|
||||||
keymat_t *keymat;
|
keymat_t *keymat;
|
||||||
identification_t *id;
|
identification_t *id;
|
||||||
id_payload_t *id_payload;
|
|
||||||
char reserved[3];
|
char reserved[3];
|
||||||
u_int8_t *byte;
|
generator_t *generator;
|
||||||
int i;
|
chunk_t data;
|
||||||
|
u_int32_t *lenpos;
|
||||||
|
|
||||||
id_payload = (id_payload_t*)message->get_payload(message,
|
payload = message->get_payload(message,
|
||||||
message->get_request(message) ? ID_INITIATOR : ID_RESPONDER);
|
message->get_request(message) ? ID_INITIATOR : ID_RESPONDER);
|
||||||
if (!id_payload)
|
if (!payload)
|
||||||
{
|
{
|
||||||
DBG1(DBG_CFG, "ID payload not found to rebuild AUTH");
|
DBG1(DBG_CFG, "ID payload not found to rebuild AUTH");
|
||||||
return FALSE;
|
return FALSE;
|
||||||
}
|
}
|
||||||
id = id_payload->get_identification(id_payload);
|
|
||||||
for (i = 0; i < countof(reserved); i++)
|
generator = generator_create();
|
||||||
|
generator->generate_payload(generator, payload);
|
||||||
|
data = generator->get_chunk(generator, &lenpos);
|
||||||
|
if (data.len < 8)
|
||||||
{
|
{
|
||||||
byte = payload_get_field(&id_payload->payload_interface,
|
DBG1(DBG_CFG, "ID payload invalid to rebuild AUTH");
|
||||||
RESERVED_BYTE, i);
|
generator->destroy(generator);
|
||||||
if (byte)
|
return FALSE;
|
||||||
{
|
|
||||||
reserved[i] = *byte;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
memcpy(reserved, data.ptr + 5, 3);
|
||||||
|
id = identification_create_from_encoding(data.ptr[4], chunk_skip(data, 8));
|
||||||
|
generator->destroy(generator);
|
||||||
|
|
||||||
auth = auth_cfg_create();
|
auth = auth_cfg_create();
|
||||||
private = lib->credmgr->get_private(lib->credmgr, KEY_ANY, id, auth);
|
private = lib->credmgr->get_private(lib->credmgr, KEY_ANY, id, auth);
|
||||||
|
|||||||
Reference in New Issue
Block a user