- moved ike_header fields to private

- added getter/setters
This commit is contained in:
Martin Willi 2005-11-15 08:09:58 +00:00
parent 6c55be346a
commit a9d0fa62c0
3 changed files with 325 additions and 79 deletions

View file

@ -31,6 +31,71 @@
#include "encodings.h"
#include "../utils/allocator.h"
typedef struct private_ike_header_s private_ike_header_t;
struct private_ike_header_s {
/**
* public interface
*/
ike_header_t public;
/**
* SPI of the initiator
*/
u_int64_t initiator_spi;
/**
* SPI of the responder
*/
u_int64_t responder_spi;
/**
* next payload type
*/
u_int8_t next_payload;
/**
* IKE major version
*/
u_int8_t maj_version;
/**
* IKE minor version
*/
u_int8_t min_version;
/**
* Exchange type
*/
u_int8_t exchange_type;
/**
* Flags of the Message
*
*/
struct {
/**
* Sender is initiator of the associated IKE_SA_INIT-Exchange
*/
bool initiator;
/**
* is protocol supporting higher version?
*/
bool version;
/**
* TRUE, if this is a response, FALSE if its a Request
*/
bool response;
} flags;
/**
* Associated Message-ID
*/
u_int32_t message_id;
/**
* Length of the whole IKEv2-Message (header and all payloads)
*/
u_int32_t length;
};
/**
* Encoding rules to parse or generate a IKEv2-Header
*
@ -40,34 +105,150 @@
*/
encoding_rule_t ike_header_encodings[] = {
/* 8 Byte SPI, stored in the field initiator_spi */
{ U_INT_64, offsetof(ike_header_t, initiator_spi) },
{ U_INT_64, offsetof(private_ike_header_t, initiator_spi) },
/* 8 Byte SPI, stored in the field responder_spi */
{ U_INT_64, offsetof(ike_header_t, responder_spi) },
{ U_INT_64, offsetof(private_ike_header_t, responder_spi) },
/* 1 Byte next payload type, stored in the field next_payload */
{ U_INT_8, offsetof(ike_header_t, next_payload) },
{ U_INT_8, offsetof(private_ike_header_t, next_payload) },
/* 4 Bit major version, stored in the field maj_version */
{ U_INT_4, offsetof(ike_header_t, maj_version) },
{ U_INT_4, offsetof(private_ike_header_t, maj_version) },
/* 4 Bit minor version, stored in the field min_version */
{ U_INT_4, offsetof(ike_header_t, min_version) },
{ U_INT_4, offsetof(private_ike_header_t, min_version) },
/* 8 Bit for the exchange type */
{ U_INT_8, offsetof(ike_header_t, exchange_type) },
{ U_INT_8, offsetof(private_ike_header_t, exchange_type) },
/* 2 Bit reserved bits, nowhere stored */
{ RESERVED_BIT, 0 },
{ RESERVED_BIT, 0 },
/* 3 Bit flags, stored in the fields response, version and initiator */
{ FLAG, offsetof(ike_header_t, flags.response) },
{ FLAG, offsetof(ike_header_t, flags.version) },
{ FLAG, offsetof(ike_header_t, flags.initiator) },
{ FLAG, offsetof(private_ike_header_t, flags.response) },
{ FLAG, offsetof(private_ike_header_t, flags.version) },
{ FLAG, offsetof(private_ike_header_t, flags.initiator) },
/* 3 Bit reserved bits, nowhere stored */
{ RESERVED_BIT, 0 },
{ RESERVED_BIT, 0 },
{ RESERVED_BIT, 0 },
/* 4 Byte message id, stored in the field message_id */
{ U_INT_32, offsetof(ike_header_t, message_id) },
{ U_INT_32, offsetof(private_ike_header_t, message_id) },
/* 4 Byte length fied, stored in the field length */
{ HEADER_LENGTH, offsetof(ike_header_t, length) }
{ HEADER_LENGTH, offsetof(private_ike_header_t, length) }
};
/**
* Implements ike_header_t's get_initiator_spi fuction.
* See #ike_header_t.get_initiator_spi for description.
*/
static u_int64_t get_initiator_spi(private_ike_header_t *this)
{
return this->initiator_spi;
}
/**
* Implements ike_header_t's set_initiator_spi fuction.
* See #ike_header_t.set_initiator_spi for description.
*/
static void set_initiator_spi(private_ike_header_t *this, u_int64_t initiator_spi)
{
this->initiator_spi = initiator_spi;
}
/**
* Implements ike_header_t's get_responder_spi fuction.
* See #ike_header_t.get_responder_spi for description.
*/
static u_int64_t get_responder_spi(private_ike_header_t *this)
{
return this->responder_spi;
}
/**
* Implements ike_header_t's set_responder_spi fuction.
* See #ike_header_t.set_responder_spi for description.
*/
static void set_responder_spi(private_ike_header_t *this, u_int64_t responder_spi)
{
this->responder_spi = responder_spi;
}
/**
* Implements ike_header_t's get_maj_version fuction.
* See #ike_header_t.get_maj_version for description.
*/
static u_int8_t get_maj_version(private_ike_header_t *this)
{
return this->maj_version;
}
/**
* Implements ike_header_t's get_min_version fuction.
* See #ike_header_t.get_min_version for description.
*/
static u_int8_t get_min_version(private_ike_header_t *this)
{
return this->min_version;
}
/**
* Implements ike_header_t's get_response_flag fuction.
* See #ike_header_t.get_response_flag for description.
*/
static bool get_response_flag(private_ike_header_t *this)
{
return this->flags.response;
}
/**
* Implements ike_header_t's get_version_flag fuction.
* See #ike_header_t.get_version_flag for description.
*/
static bool get_version_flag(private_ike_header_t *this)
{
return this->flags.version;
}
/**
* Implements ike_header_t's get_initiator_flag fuction.
* See #ike_header_t.get_initiator_flag for description.
*/
static bool get_initiator_flag(private_ike_header_t *this)
{
return this->flags.initiator;
}
/**
* Implements ike_header_t's get_exchange_type function
* See #ike_header_t.get_exchange_type for description.
*/
static u_int8_t get_exchange_type(private_ike_header_t *this)
{
return this->exchange_type;
}
/**
* Implements ike_header_t's set_exchange_type function.
* See #ike_header_t.set_exchange_type for description.
*/
static void set_exchange_type(private_ike_header_t *this, u_int8_t exchange_type)
{
this->exchange_type = exchange_type;
}
/**
* Implements ike_header_t's get_message_id function.
* See #ike_header_t.get_message_id for description.
*/
static u_int32_t get_message_id(private_ike_header_t *this)
{
return this->message_id;
}
/**
* Implements ike_header_t's set_message_id function.
* See #ike_header_t.set_message_id for description.
*/
static void set_message_id(private_ike_header_t *this, u_int32_t message_id)
{
this->message_id = message_id;
}
/**
* Implements payload_t's and ike_header_t's destroy function.
@ -107,7 +288,7 @@ static payload_type_t get_type(payload_t *this)
*/
static payload_type_t get_next_type(payload_t *this)
{
return (((ike_header_t*)this)->next_payload);
return (((private_ike_header_t*)this)->next_payload);
}
/**
@ -116,7 +297,7 @@ static payload_type_t get_next_type(payload_t *this)
*/
static size_t get_length(payload_t *this)
{
return IKE_HEADER_LENGTH;
return (((private_ike_header_t*)this)->length);
}
/*
@ -124,18 +305,32 @@ static size_t get_length(payload_t *this)
*/
ike_header_t *ike_header_create()
{
ike_header_t *this = allocator_alloc_thing(ike_header_t);
private_ike_header_t *this = allocator_alloc_thing(private_ike_header_t);
if (this == NULL)
{
return NULL;
}
this->payload_interface.get_encoding_rules = get_encoding_rules;
this->payload_interface.get_length = get_length;
this->payload_interface.get_next_type = get_next_type;
this->payload_interface.get_type = get_type;
this->payload_interface.destroy = (status_t (*) (payload_t *))destroy;
this->destroy = destroy;
this->public.payload_interface.get_encoding_rules = get_encoding_rules;
this->public.payload_interface.get_length = get_length;
this->public.payload_interface.get_next_type = get_next_type;
this->public.payload_interface.get_type = get_type;
this->public.payload_interface.destroy = (status_t (*) (payload_t *))destroy;
this->public.destroy = destroy;
this->public.get_initiator_spi = (u_int64_t (*) (ike_header_t*))get_initiator_spi;
this->public.set_initiator_spi = (void (*) (ike_header_t*,u_int64_t))set_initiator_spi;
this->public.get_responder_spi = (u_int64_t (*) (ike_header_t*))get_responder_spi;
this->public.set_responder_spi = (void (*) (ike_header_t *,u_int64_t))set_responder_spi;
this->public.get_maj_version = (u_int8_t (*) (ike_header_t*))get_maj_version;
this->public.get_min_version = (u_int8_t (*) (ike_header_t*))get_min_version;
this->public.get_response_flag = (bool (*) (ike_header_t*))get_response_flag;
this->public.get_version_flag = (bool (*) (ike_header_t*))get_version_flag;
this->public.get_initiator_flag = (bool (*) (ike_header_t*))get_initiator_flag;
this->public.get_exchange_type = (u_int8_t (*) (ike_header_t*))get_exchange_type;
this->public.set_exchange_type = (void (*) (ike_header_t*,u_int8_t))set_exchange_type;
this->public.get_message_id = (u_int32_t (*) (ike_header_t*))get_message_id;
this->public.set_message_id = (void (*) (ike_header_t*,u_int32_t))set_message_id;
/* set default values of the fields */
this->initiator_spi = 0;
@ -151,7 +346,7 @@ ike_header_t *ike_header_create()
this->length = IKE_HEADER_LENGTH;
return this;
return (ike_header_t*)this;
}

View file

@ -96,59 +96,110 @@ struct ike_header_s {
* implements payload_t interface
*/
payload_t payload_interface;
/**
* SPI of the initiator
*/
u_int64_t initiator_spi;
/**
* SPI of the responder
*/
u_int64_t responder_spi;
/**
* next payload type
*/
u_int8_t next_payload;
/**
* IKE major version
*/
u_int8_t maj_version;
/**
* IKE minor version
*/
u_int8_t min_version;
/**
* Exchange type
*/
u_int8_t exchange_type;
/**
* Flags of the Message
*
* @brief get the initiator spi
*
* @param this ike_header_t object
* @return initiator_spi
*/
struct {
/**
* Sender is initiator of the associated IKE_SA_INIT-Exchange
*/
bool initiator;
/**
* is protocol supporting higher version?
*/
bool version;
/**
* TRUE, if this is a response, FALSE if its a Request
*/
bool response;
} flags;
u_int64_t (*get_initiator_spi) (ike_header_t *this);
/**
* Associated Message-ID
* @brief set the initiator spi
*
* @param this ike_header_t object
* @param initiator_spi initiator_spi
*/
u_int32_t message_id;
void (*set_initiator_spi) (ike_header_t *this, u_int64_t initiator_spi);
/**
* Length of the whole IKEv2-Message (header and all payloads)
* @brief get the responder spi
*
* @param this ike_header_t object
* @return responder_spi
*/
u_int32_t length;
u_int64_t (*get_responder_spi) (ike_header_t *this);
/**
* @brief set the responder spi
*
* @param this ike_header_t object
* @param responder_spi responder_spi
*/
void (*set_responder_spi) (ike_header_t *this, u_int64_t responder_spi);
/**
* @brief get the major version
*
* @param this ike_header_t object
* @return major version
*/
u_int8_t (*get_maj_version) (ike_header_t *this);
/**
* @brief get the mainor version
*
* @param this ike_header_t object
* @return minor version
*/
u_int8_t (*get_min_version) (ike_header_t *this);
/**
* @brief get the response flag
*
* @param this ike_header_t object
* @return response flag
*/
bool (*get_response_flag) (ike_header_t *this);
/**
* @brief get "higher version supported"-flag
*
* @param this ike_header_t object
* @return version flag
*/
bool (*get_version_flag) (ike_header_t *this);
/**
* @brief get the initiator flag
*
* @param this ike_header_t object
* @return initiator flag
*/
bool (*get_initiator_flag) (ike_header_t *this);
/**
* @brief get the exchange type
*
* @param this ike_header_t object
* @return exchange type
*/
u_int8_t (*get_exchange_type) (ike_header_t *this);
/**
* @brief set the exchange type
*
* @param this ike_header_t object
* @param exchange_type exchange type
*/
void (*set_exchange_type) (ike_header_t *this, u_int8_t exchange_type);
/**
* @brief get the message id
*
* @param this ike_header_t object
* @return message id
*/
u_int32_t (*get_message_id) (ike_header_t *this);
/**
* @brief set the message id
*
* @param this ike_header_t object
* @param initiator_spi message id
*/
void (*set_message_id) (ike_header_t *this, u_int32_t message_id);
/**
* @brief Destroys a ike_header_t object.

View file

@ -52,7 +52,7 @@ void test_parser_with_header_payload(tester_t *tester)
0x00,0x00,0x00,0x02,
0x03,0x45,0x06,0x28,
0x00,0x00,0x00,0x07,
0x00,0x00,0x00,0x08,
0x00,0x00,0x00,0x1C,
};
header_chunk.ptr = header_bytes;
header_chunk.len = sizeof(header_bytes);
@ -69,17 +69,17 @@ void test_parser_with_header_payload(tester_t *tester)
return;
}
tester->assert_true(tester,(ike_header->initiator_spi == 1),"parsed initiator_spi value");
tester->assert_true(tester,(ike_header->responder_spi == 2),"parsed responder_spi value");
tester->assert_true(tester,(ike_header->next_payload == 3),"parsed next_payload value");
tester->assert_true(tester,(ike_header->maj_version == 4),"parsed maj_version value");
tester->assert_true(tester,(ike_header->min_version == 5),"parsed min_version value");
tester->assert_true(tester,(ike_header->exchange_type == 6),"parsed exchange_type value");
tester->assert_true(tester,(ike_header->flags.initiator == TRUE),"parsed flags.initiator value");
tester->assert_true(tester,(ike_header->flags.version == FALSE),"parsed flags.version value");
tester->assert_true(tester,(ike_header->flags.response == TRUE),"parsed flags.response value");
tester->assert_true(tester,(ike_header->message_id == 7),"parsed message_id value");
tester->assert_true(tester,(ike_header->length == 8),"parsed length value");
tester->assert_true(tester,(ike_header->get_initiator_spi(ike_header) == 1),"parsed initiator_spi value");
tester->assert_true(tester,(ike_header->get_responder_spi(ike_header) == 2),"parsed responder_spi value");
tester->assert_true(tester,(ike_header->payload_interface.get_next_type((payload_t*)ike_header) == 3),"parsed next_payload value");
tester->assert_true(tester,(ike_header->get_maj_version(ike_header) == 4),"parsed maj_version value");
tester->assert_true(tester,(ike_header->get_min_version(ike_header) == 5),"parsed min_version value");
tester->assert_true(tester,(ike_header->get_exchange_type(ike_header) == 6),"parsed exchange_type value");
tester->assert_true(tester,(ike_header->get_initiator_flag(ike_header) == TRUE),"parsed flags.initiator value");
tester->assert_true(tester,(ike_header->get_version_flag(ike_header) == FALSE),"parsed flags.version value");
tester->assert_true(tester,(ike_header->get_response_flag(ike_header) == TRUE),"parsed flags.response value");
tester->assert_true(tester,(ike_header->get_message_id(ike_header) == 7),"parsed message_id value");
tester->assert_true(tester,(ike_header->payload_interface.get_length((payload_t*)ike_header) == 0x1C),"parsed length value");
ike_header->destroy(ike_header);
}