- removed memory allocation checks!!!

This commit is contained in:
Jan Hutter 2005-11-28 18:24:10 +00:00
parent 297c889cf3
commit 3fe058703f
24 changed files with 722 additions and 1197 deletions

View File

@ -214,7 +214,6 @@ static status_t get_proposals_for_host(private_configuration_manager_t *this, ho
static status_t select_proposals_for_host(private_configuration_manager_t *this, host_t *host, iterator_t *in, iterator_t *out) static status_t select_proposals_for_host(private_configuration_manager_t *this, host_t *host, iterator_t *in, iterator_t *out)
{ {
/* Currently the first suggested proposal is selected, cloned and then returned*/ /* Currently the first suggested proposal is selected, cloned and then returned*/
status_t status;
proposal_substructure_t *first_suggested_proposal; proposal_substructure_t *first_suggested_proposal;
proposal_substructure_t *selected_proposal; proposal_substructure_t *selected_proposal;
@ -226,12 +225,12 @@ static status_t select_proposals_for_host(private_configuration_manager_t *this,
return FAILED; return FAILED;
} }
status = in->current(in,(void **) &first_suggested_proposal); in->current(in,(void **) &first_suggested_proposal);
status = first_suggested_proposal->clone(first_suggested_proposal,&selected_proposal); first_suggested_proposal->clone(first_suggested_proposal,&selected_proposal);
status = out->insert_after(out,selected_proposal); out->insert_after(out,selected_proposal);
return status; return SUCCESS;
} }
/** /**

View File

@ -60,6 +60,25 @@
#endif #endif
/**
* @addtogroup config
*
* Configuration stuff.
*/
/**
* @addtogroup encoding
*
* Classes used to encode and decode IKEv2 Messages.
*/
/**
* @addtogroup payloads
*
* Classes representing a specific IKEv2 Payload type.
*
* @ingroup encoding
*/
/** /**
* @addtogroup transforms * @addtogroup transforms

View File

@ -41,7 +41,7 @@
typedef struct generator_t generator_t; typedef struct generator_t generator_t;
/** /**
*A generator_t object which generates payloads of specific type. * A generator_t class used to generate IKEv2 payloads.
* *
* @ingroup encoding * @ingroup encoding
*/ */

View File

@ -1,8 +1,7 @@
/** /**
* @file encodings.c * @file encodings.c
* *
* @brief Type definitions for parser and generator, * @brief Encoding types of fields in a IKEv2 payload.
* also payload types are defined here.
* *
*/ */
@ -51,4 +50,3 @@ mapping_t encoding_type_m[] = {
{NONCE_DATA, "NONCE_DATA"}, {NONCE_DATA, "NONCE_DATA"},
{MAPPING_END, NULL} {MAPPING_END, NULL}
}; };

View File

@ -1,13 +1,7 @@
/** /**
* @file encodings.h * @file encodings.h
* *
* @brief Type definitions for parser and generator, * @brief Encoding types of fields in a IKEv2 payload.
* also payload types are defined here.
*
* Header is parsed like a payload and gets its one payload_id
* from PRIVATE USE space. Also the substructures
* of specific payload types get their own payload_id
* from PRIVATE_USE space. See RFC for mor informations.
* *
*/ */
@ -41,10 +35,17 @@ typedef enum encoding_type_t encoding_type_t;
* Each field of an IKEv2-Message (in header or payload) * Each field of an IKEv2-Message (in header or payload)
* which has to be parsed or generated differently has its own * which has to be parsed or generated differently has its own
* type defined here. * type defined here.
*
* Header is parsed like a payload and gets its one payload_id
* from PRIVATE USE space. Also the substructures
* of specific payload types get their own payload_id
* from PRIVATE_USE space. See IKEv2-Draft for more informations.
*
* @ingroup payloads
*/ */
enum encoding_type_t{ enum encoding_type_t{
/** /**
* Representing a 4 Bit unsigned int value * Representing a 4 Bit unsigned int value.
* *
* *
* When generating it must be changed from host to network order. * When generating it must be changed from host to network order.
@ -57,7 +58,7 @@ enum encoding_type_t{
*/ */
U_INT_4, U_INT_4,
/** /**
* Representing a 8 Bit unsigned int value * Representing a 8 Bit unsigned int value.
* *
* *
* When generating it must be changed from host to network order. * When generating it must be changed from host to network order.
@ -70,7 +71,7 @@ enum encoding_type_t{
*/ */
U_INT_8, U_INT_8,
/** /**
* Representing a 16 Bit unsigned int value * Representing a 16 Bit unsigned int value.
* *
* *
* When generating it must be changed from host to network order. * When generating it must be changed from host to network order.
@ -83,7 +84,7 @@ enum encoding_type_t{
*/ */
U_INT_16, U_INT_16,
/** /**
* Representing a 32 Bit unsigned int value * Representing a 32 Bit unsigned int value.
* *
* When generating it must be changed from host to network order. * When generating it must be changed from host to network order.
* The value is read from the associated data struct. * The value is read from the associated data struct.
@ -96,7 +97,7 @@ enum encoding_type_t{
U_INT_32, U_INT_32,
/** /**
* Representing a 64 Bit unsigned int value * Representing a 64 Bit unsigned int value.
* *
* When generating it must be changed from host to network order. * When generating it must be changed from host to network order.
* The value is read from the associated data struct. * The value is read from the associated data struct.
@ -108,7 +109,7 @@ enum encoding_type_t{
*/ */
U_INT_64, U_INT_64,
/** /**
* @brief represents a RESERVED_BIT used in FLAG-Bytes * @brief represents a RESERVED_BIT used in FLAG-Bytes.
* *
* When generating, the next bit is set to zero and the current write * When generating, the next bit is set to zero and the current write
* position is moved one bit forward. * position is moved one bit forward.
@ -121,7 +122,7 @@ enum encoding_type_t{
*/ */
RESERVED_BIT, RESERVED_BIT,
/** /**
* @brief represents a RESERVED_BYTE * @brief represents a RESERVED_BYTE.
* *
* When generating, the next byte is set to zero and the current write * When generating, the next byte is set to zero and the current write
* position is moved one byte forward. * position is moved one byte forward.
@ -146,7 +147,7 @@ enum encoding_type_t{
*/ */
FLAG, FLAG,
/** /**
* Representating a length field of a payload * Representating a length field of a payload.
* *
* When generating it must be changed from host to network order. * When generating it must be changed from host to network order.
* The value is read from the associated data struct. * The value is read from the associated data struct.
@ -158,7 +159,7 @@ enum encoding_type_t{
*/ */
PAYLOAD_LENGTH, PAYLOAD_LENGTH,
/** /**
* Representating a length field of a header * Representating a length field of a header.
* *
* When generating it must be changed from host to network order. * When generating it must be changed from host to network order.
* The value is read from the associated data struct. * The value is read from the associated data struct.
@ -170,7 +171,7 @@ enum encoding_type_t{
*/ */
HEADER_LENGTH, HEADER_LENGTH,
/** /**
* Representating a spi size field * Representating a spi size field.
* *
* When generating it must be changed from host to network order. * When generating it must be changed from host to network order.
* The value is read from the associated data struct. * The value is read from the associated data struct.
@ -182,7 +183,7 @@ enum encoding_type_t{
*/ */
SPI_SIZE, SPI_SIZE,
/** /**
* Representating a spi field * Representating a spi field.
* *
* When generating the content of the chunkt pointing to * When generating the content of the chunkt pointing to
* is written. * is written.
@ -191,7 +192,7 @@ enum encoding_type_t{
*/ */
SPI, SPI,
/** /**
* Representating a Key Exchange Data field * Representating a Key Exchange Data field.
* *
* When generating the content of the chunkt pointing to * When generating the content of the chunkt pointing to
* is written. * is written.
@ -200,7 +201,7 @@ enum encoding_type_t{
*/ */
KEY_EXCHANGE_DATA, KEY_EXCHANGE_DATA,
/** /**
* Representating a Notification field * Representating a Notification field.
* *
* When generating the content of the chunkt pointing to * When generating the content of the chunkt pointing to
* is written. * is written.
@ -209,7 +210,7 @@ enum encoding_type_t{
*/ */
NOTIFICATION_DATA, NOTIFICATION_DATA,
/** /**
* Representating one or more proposal substructures * Representating one or more proposal substructures.
* *
* The offset points to a linked_list_t pointer. * The offset points to a linked_list_t pointer.
* *
@ -221,7 +222,7 @@ enum encoding_type_t{
*/ */
PROPOSALS, PROPOSALS,
/** /**
* Representating one or more transform substructures * Representating one or more transform substructures.
* *
* The offset points to a linked_list_t pointer. * The offset points to a linked_list_t pointer.
* *
@ -233,7 +234,7 @@ enum encoding_type_t{
*/ */
TRANSFORMS, TRANSFORMS,
/** /**
* Representating one or more Attributes of a transform substructure * Representating one or more Attributes of a transform substructure.
* *
* The offset points to a linked_list_t pointer. * The offset points to a linked_list_t pointer.
* *
@ -258,7 +259,7 @@ enum encoding_type_t{
ATTRIBUTE_FORMAT, ATTRIBUTE_FORMAT,
/** /**
* Representing a 15 Bit unsigned int value used as attribute type * Representing a 15 Bit unsigned int value used as attribute type
* in an attribute transform * in an attribute transform.
* *
* *
* When generating it must be changed from host to network order. * When generating it must be changed from host to network order.
@ -274,7 +275,7 @@ enum encoding_type_t{
/** /**
* Depending on the field of type ATTRIBUTE_FORMAT * Depending on the field of type ATTRIBUTE_FORMAT
* this field contains the length or the value of an transform attribute. * this field contains the length or the value of an transform attribute.
* Its stored in a 16 unsigned integer field * Its stored in a 16 unsigned integer field.
* *
* When generating it must be changed from host to network order. * When generating it must be changed from host to network order.
* The value is read from the associated data struct. * The value is read from the associated data struct.
@ -289,7 +290,7 @@ enum encoding_type_t{
/** /**
* Depending on the field of type ATTRIBUTE_FORMAT * Depending on the field of type ATTRIBUTE_FORMAT
* this field is available or missing and so parsed/generated * this field is available or missing and so parsed/generated
* or not parsed/not generated * or not parsed/not generated.
* *
* When generating the content of the chunkt pointing to * When generating the content of the chunkt pointing to
* is written. * is written.
@ -299,7 +300,7 @@ enum encoding_type_t{
ATTRIBUTE_VALUE, ATTRIBUTE_VALUE,
/** /**
* Representating a Nonce Data field * Representating a Nonce Data field.
* *
* When generating the content of the chunkt pointing to * When generating the content of the chunkt pointing to
* is written. * is written.
@ -309,7 +310,7 @@ enum encoding_type_t{
NONCE_DATA, NONCE_DATA,
/** /**
* Representating an IKE_SPI field in an IKEv2 Header * Representating an IKE_SPI field in an IKEv2 Header.
* *
* When generating the value of the u_int64_t pointing to * When generating the value of the u_int64_t pointing to
* is written (host and networ order is not changed). * is written (host and networ order is not changed).
@ -327,24 +328,27 @@ enum encoding_type_t{
*/ */
extern mapping_t encoding_type_m[]; extern mapping_t encoding_type_m[];
typedef struct encoding_rule_t encoding_rule_t;
/** /**
* An encoding rule is a mapping of a specific encoding type to * An encoding rule is a mapping of a specific encoding type to
* a location in the data struct where the current field is stored to * a location in the data struct where the current field is stored to
* or read from. * or read from.
* *
* For examples see directory encodings/. * For examples see files in this directory.
* *
* This rules are used by parser and generator. * This rules are used by parser and generator.
*
* @ingroup payloads
*/ */
typedef struct encoding_rule_t encoding_rule_t;
struct encoding_rule_t { struct encoding_rule_t {
/** /**
* Encoding type * Encoding type.
*/ */
encoding_type_t type; encoding_type_t type;
/** /**
* Offset in the data struct * Offset in the data struct.
* *
* When parsing, data are written to this offset of the * When parsing, data are written to this offset of the
* data struct. * data struct.
@ -355,8 +359,4 @@ struct encoding_rule_t {
u_int32_t offset; u_int32_t offset;
}; };
#endif /*ENCODINGS_H_*/ #endif /*ENCODINGS_H_*/

View File

@ -40,12 +40,12 @@
typedef struct private_encryption_payload_t private_encryption_payload_t; typedef struct private_encryption_payload_t private_encryption_payload_t;
/** /**
* Private data of an encryption_payload_t' Object * Private data of an encryption_payload_t' Object.
* *
*/ */
struct private_encryption_payload_t { struct private_encryption_payload_t {
/** /**
* public encryption_payload_t interface * Public encryption_payload_t interface.
*/ */
encryption_payload_t public; encryption_payload_t public;
@ -58,7 +58,7 @@ struct private_encryption_payload_t {
u_int8_t next_payload; u_int8_t next_payload;
/** /**
* Critical flag * Critical flag.
*/ */
bool critical; bool critical;
@ -68,33 +68,33 @@ struct private_encryption_payload_t {
u_int16_t payload_length; u_int16_t payload_length;
/** /**
* initialization vector * Initialization vector.
*/ */
chunk_t iv; chunk_t iv;
/** /**
* integrity checksum * Integrity checksum.
*/ */
chunk_t checksum; chunk_t checksum;
/** /**
* chunk containing the iv, data, padding, * Chunk containing the iv, data, padding,
* and (an eventually not calculated) signature * and (an eventually not calculated) signature.
*/ */
chunk_t encrypted; chunk_t encrypted;
/** /**
* chunk containing the data in decrypted (unpadded) form * Chunk containing the data in decrypted (unpadded) form.
*/ */
chunk_t decrypted; chunk_t decrypted;
/** /**
* signer set by set_signer * Signer set by set_signer.
*/ */
signer_t *signer; signer_t *signer;
/** /**
* Contained payloads of this encrpytion_payload * Contained payloads of this encrpytion_payload.
*/ */
linked_list_t *payloads; linked_list_t *payloads;
@ -102,24 +102,20 @@ struct private_encryption_payload_t {
* @brief Computes the length of this payload. * @brief Computes the length of this payload.
* *
* @param this calling private_encryption_payload_t object * @param this calling private_encryption_payload_t object
* @return
* SUCCESS in any case
*/ */
status_t (*compute_length) (private_encryption_payload_t *this); void (*compute_length) (private_encryption_payload_t *this);
/** /**
* @brief Generate payloads (unencrypted) in chunk decrypted. * @brief Generate payloads (unencrypted) in chunk decrypted.
* *
* @param this calling private_encryption_payload_t object * @param this calling private_encryption_payload_t object
* @return
* SUCCESS in any case
*/ */
status_t (*generate) (private_encryption_payload_t *this); void (*generate) (private_encryption_payload_t *this);
status_t (*parse) (private_encryption_payload_t *this); status_t (*parse) (private_encryption_payload_t *this);
}; };
/** /**
* Encoding rules to parse or generate a IKEv2-Encryption Payload * Encoding rules to parse or generate a IKEv2-Encryption Payload.
* *
* The defined offsets are the positions in a object of type * The defined offsets are the positions in a object of type
* private_encryption_payload_t. * private_encryption_payload_t.
@ -164,8 +160,7 @@ encoding_rule_t encryption_payload_encodings[] = {
*/ */
/** /**
* Implements payload_t's verify function. * Implementation of payload_t.verify.
* See #payload_s.verify for description.
*/ */
static status_t verify(private_encryption_payload_t *this) static status_t verify(private_encryption_payload_t *this)
{ {
@ -225,18 +220,15 @@ static status_t verify(private_encryption_payload_t *this)
} }
/** /**
* implements payload_t.destroy * Implementation of payload_t.destroy.
*/ */
static status_t destroy(private_encryption_payload_t *this) static void destroy(private_encryption_payload_t *this)
{ {
/* all proposals are getting destroyed */ /* all proposals are getting destroyed */
while (this->payloads->get_count(this->payloads) > 0) while (this->payloads->get_count(this->payloads) > 0)
{ {
payload_t *current_payload; payload_t *current_payload;
if (this->payloads->remove_last(this->payloads,(void **)&current_payload) != SUCCESS) this->payloads->remove_last(this->payloads,(void **)&current_payload);
{
break;
}
current_payload->destroy(current_payload); current_payload->destroy(current_payload);
} }
this->payloads->destroy(this->payloads); this->payloads->destroy(this->payloads);
@ -246,23 +238,19 @@ static status_t destroy(private_encryption_payload_t *this)
allocator_free(this->decrypted.ptr); allocator_free(this->decrypted.ptr);
allocator_free(this->checksum.ptr); allocator_free(this->checksum.ptr);
allocator_free(this); allocator_free(this);
return SUCCESS;
} }
/** /**
* implements payload_t.get_encoding_rules * Implementation of payload_t.get_encoding_rules.
*/ */
static status_t get_encoding_rules(private_encryption_payload_t *this, encoding_rule_t **rules, size_t *rule_count) static void get_encoding_rules(private_encryption_payload_t *this, encoding_rule_t **rules, size_t *rule_count)
{ {
*rules = encryption_payload_encodings; *rules = encryption_payload_encodings;
*rule_count = sizeof(encryption_payload_encodings) / sizeof(encoding_rule_t); *rule_count = sizeof(encryption_payload_encodings) / sizeof(encoding_rule_t);
return SUCCESS;
} }
/** /**
* implements payload_t.get_type * Implementation of payload_t.get_type.
*/ */
static payload_type_t get_type(private_encryption_payload_t *this) static payload_type_t get_type(private_encryption_payload_t *this)
{ {
@ -270,7 +258,7 @@ static payload_type_t get_type(private_encryption_payload_t *this)
} }
/** /**
* implements payload_t.get_next_type * Implementation of payload_t.get_next_type.
*/ */
static payload_type_t get_next_type(private_encryption_payload_t *this) static payload_type_t get_next_type(private_encryption_payload_t *this)
{ {
@ -279,16 +267,16 @@ static payload_type_t get_next_type(private_encryption_payload_t *this)
} }
/** /**
* implements payload_t.set_next_type * Implementation of payload_t.set_next_type.
*/ */
static status_t set_next_type(private_encryption_payload_t *this, payload_type_t type) static void set_next_type(private_encryption_payload_t *this, payload_type_t type)
{ {
/* set next type is not allowed, since this payload MUST be the last one */ /* set next type is not allowed, since this payload MUST be the last one
return FAILED; * and so nothing is done in here*/
} }
/** /**
* implements payload_t.get_length * Implementation of payload_t.get_length.
*/ */
static size_t get_length(private_encryption_payload_t *this) static size_t get_length(private_encryption_payload_t *this)
{ {
@ -297,7 +285,7 @@ static size_t get_length(private_encryption_payload_t *this)
} }
/** /**
* implements encryption_payload_t.create_payload_iterator * Implementation of payload_t.create_payload_iterator.
*/ */
static status_t create_payload_iterator (private_encryption_payload_t *this, iterator_t **iterator, bool forward) static status_t create_payload_iterator (private_encryption_payload_t *this, iterator_t **iterator, bool forward)
{ {
@ -305,21 +293,16 @@ static status_t create_payload_iterator (private_encryption_payload_t *this, ite
} }
/** /**
* implements encryption_payload_t.add_payload * Implementation of payload_t.add_payload.
*/ */
static status_t add_payload(private_encryption_payload_t *this, payload_t *payload) static void add_payload(private_encryption_payload_t *this, payload_t *payload)
{ {
payload_t *last_payload; payload_t *last_payload;
if ((this->payloads->get_count(this->payloads) > 0) && if (this->payloads->get_count(this->payloads) > 0)
(this->payloads->get_last(this->payloads,(void **) &last_payload) != SUCCESS))
{ {
return OUT_OF_RES; this->payloads->get_last(this->payloads,(void **) &last_payload);
} }
if (this->payloads->insert_last(this->payloads, payload) != SUCCESS)
{
return OUT_OF_RES;
}
if (this->payloads->get_count(this->payloads) == 1) if (this->payloads->get_count(this->payloads) == 1)
{ {
this->next_payload = payload->get_type(payload); this->next_payload = payload->get_type(payload);
@ -330,11 +313,10 @@ static status_t add_payload(private_encryption_payload_t *this, payload_t *paylo
} }
payload->set_next_type(payload, NO_PAYLOAD); payload->set_next_type(payload, NO_PAYLOAD);
this->compute_length(this); this->compute_length(this);
return SUCCESS;
} }
/** /**
* implements encryption_payload_t.encrypt * Implementation of encryption_payload_t.encrypt.
*/ */
static status_t encrypt(private_encryption_payload_t *this, crypter_t *crypter) static status_t encrypt(private_encryption_payload_t *this, crypter_t *crypter)
{ {
@ -349,18 +331,9 @@ static status_t encrypt(private_encryption_payload_t *this, crypter_t *crypter)
/* for random data in iv and padding */ /* for random data in iv and padding */
randomizer = randomizer_create(); randomizer = randomizer_create();
if (randomizer == NULL)
{
return OUT_OF_RES;
}
/* build payload chunk */ /* build payload chunk */
status = this->generate(this); this->generate(this);
if (status != SUCCESS)
{
randomizer->destroy(randomizer);
return status;
}
/* build padding */ /* build padding */
padding.len = (this->decrypted.len + 1) % crypter->get_block_size(crypter); padding.len = (this->decrypted.len + 1) % crypter->get_block_size(crypter);
@ -374,12 +347,7 @@ static status_t encrypt(private_encryption_payload_t *this, crypter_t *crypter)
/* concatenate payload data, padding, padding len */ /* concatenate payload data, padding, padding len */
concatenated.len = this->decrypted.len + padding.len + 1; concatenated.len = this->decrypted.len + padding.len + 1;
concatenated.ptr = allocator_alloc(concatenated.len); concatenated.ptr = allocator_alloc(concatenated.len);
if (concatenated.ptr == NULL)
{
randomizer->destroy(randomizer);
allocator_free(padding.ptr);
return OUT_OF_RES;
}
memcpy(concatenated.ptr, this->decrypted.ptr, this->decrypted.len); memcpy(concatenated.ptr, this->decrypted.ptr, this->decrypted.len);
memcpy(concatenated.ptr + this->decrypted.len, padding.ptr, padding.len); memcpy(concatenated.ptr + this->decrypted.len, padding.ptr, padding.len);
*(concatenated.ptr + concatenated.len - 1) = padding.len; *(concatenated.ptr + concatenated.len - 1) = padding.len;
@ -387,15 +355,8 @@ static status_t encrypt(private_encryption_payload_t *this, crypter_t *crypter)
/* build iv */ /* build iv */
iv.len = crypter->get_block_size(crypter); iv.len = crypter->get_block_size(crypter);
status = randomizer->allocate_pseudo_random_bytes(randomizer, iv.len, &iv); randomizer->allocate_pseudo_random_bytes(randomizer, iv.len, &iv);
randomizer->destroy(randomizer); randomizer->destroy(randomizer);
if (status != SUCCESS)
{
allocator_free(padding.ptr);
allocator_free(concatenated.ptr);
return status;
}
/* encrypt concatenated chunk */ /* encrypt concatenated chunk */
allocator_free(this->encrypted.ptr); allocator_free(this->encrypted.ptr);
@ -411,16 +372,11 @@ static status_t encrypt(private_encryption_payload_t *this, crypter_t *crypter)
/* append an empty signature */ /* append an empty signature */
this->encrypted.len += this->signer->get_block_size(this->signer); this->encrypted.len += this->signer->get_block_size(this->signer);
allocator_realloc(this->encrypted.ptr, this->encrypted.len); allocator_realloc(this->encrypted.ptr, this->encrypted.len);
if (this->encrypted.ptr == NULL)
{
return OUT_OF_RES;
}
return SUCCESS; return SUCCESS;
} }
/** /**
* implements encryption_payload_t.decrypt * Implementation of encryption_payload_t.encrypt.
*/ */
static status_t decrypt(private_encryption_payload_t *this, crypter_t *crypter) static status_t decrypt(private_encryption_payload_t *this, crypter_t *crypter)
{ {
@ -480,16 +436,15 @@ static status_t decrypt(private_encryption_payload_t *this, crypter_t *crypter)
} }
/** /**
* implements encryption_payload_t.set_signer * Implementation of encryption_payload_t.set_signer.
*/ */
static status_t set_signer(private_encryption_payload_t *this, signer_t* signer) static void set_signer(private_encryption_payload_t *this, signer_t* signer)
{ {
this->signer = signer; this->signer = signer;
return SUCCESS;
} }
/** /**
* implements encryption_payload_t.build_signature * Implementation of encryption_payload_t.build_signature.
*/ */
static status_t build_signature(private_encryption_payload_t *this, chunk_t data) static status_t build_signature(private_encryption_payload_t *this, chunk_t data)
{ {
@ -509,7 +464,7 @@ static status_t build_signature(private_encryption_payload_t *this, chunk_t data
} }
/** /**
* implements encryption_payload_t.verify_signature * Implementation of encryption_payload_t.verify_signature.
*/ */
static status_t verify_signature(private_encryption_payload_t *this, chunk_t data) static status_t verify_signature(private_encryption_payload_t *this, chunk_t data)
{ {
@ -542,21 +497,16 @@ static status_t verify_signature(private_encryption_payload_t *this, chunk_t dat
} }
/** /**
* implements private_encryption_payload_t.generate * Implementation of private_encryption_payload_t.generate.
*/ */
static status_t generate(private_encryption_payload_t *this) static void generate(private_encryption_payload_t *this)
{ {
status_t status;
payload_t *current_payload, *next_payload; payload_t *current_payload, *next_payload;
generator_t *generator; generator_t *generator;
iterator_t *iterator; iterator_t *iterator;
/* create iterator */ /* create iterator */
status = this->payloads->create_iterator(this->payloads, &iterator, TRUE); this->payloads->create_iterator(this->payloads, &iterator, TRUE);
if (status != SUCCESS)
{
return status;
}
/* get first payload */ /* get first payload */
if (iterator->has_next(iterator)) if (iterator->has_next(iterator))
@ -570,15 +520,10 @@ static status_t generate(private_encryption_payload_t *this)
allocator_free(this->decrypted.ptr); allocator_free(this->decrypted.ptr);
this->decrypted = CHUNK_INITIALIZER; this->decrypted = CHUNK_INITIALIZER;
iterator->destroy(iterator); iterator->destroy(iterator);
return SUCCESS; return;
} }
generator = generator_create(); generator = generator_create();
if (generator == NULL)
{
iterator->destroy(iterator);
return OUT_OF_RES;
}
/* build all payload, except last */ /* build all payload, except last */
while(iterator->has_next(iterator)) while(iterator->has_next(iterator))
@ -600,9 +545,11 @@ static status_t generate(private_encryption_payload_t *this)
generator->write_to_chunk(generator, &(this->decrypted)); generator->write_to_chunk(generator, &(this->decrypted));
generator->destroy(generator); generator->destroy(generator);
return SUCCESS;
} }
/**
* Implementation of private_encryption_payload_t.parse.
*/
static status_t parse(private_encryption_payload_t *this) static status_t parse(private_encryption_payload_t *this)
{ {
parser_t *parser; parser_t *parser;
@ -617,11 +564,6 @@ static status_t parse(private_encryption_payload_t *this)
/* build a parser on the decrypted data */ /* build a parser on the decrypted data */
parser = parser_create(this->decrypted); parser = parser_create(this->decrypted);
if (parser == NULL)
{
return OUT_OF_RES;
}
current_payload_type = this->next_payload; current_payload_type = this->next_payload;
/* parse all payloads */ /* parse all payloads */
@ -644,28 +586,20 @@ static status_t parse(private_encryption_payload_t *this)
/* get next payload type */ /* get next payload type */
current_payload_type = current_payload->get_next_type(current_payload); current_payload_type = current_payload->get_next_type(current_payload);
status = this->payloads->insert_last(this->payloads,current_payload); this->payloads->insert_last(this->payloads,current_payload);
if (status != SUCCESS)
{
return OUT_OF_RES;
}
} }
return SUCCESS; return SUCCESS;
} }
/** /**
* implements private_encryption_payload_t.compute_length * Implementation of private_encryption_payload_t.compute_length.
*/ */
static status_t compute_length(private_encryption_payload_t *this) static void compute_length(private_encryption_payload_t *this)
{ {
iterator_t *iterator; iterator_t *iterator;
status_t status;
size_t length = ENCRYPTION_PAYLOAD_HEADER_LENGTH; size_t length = ENCRYPTION_PAYLOAD_HEADER_LENGTH;
status = this->payloads->create_iterator(this->payloads, &iterator, TRUE); this->payloads->create_iterator(this->payloads, &iterator, TRUE);
if (status != SUCCESS)
{
return status;
}
while (iterator->has_next(iterator)) while (iterator->has_next(iterator))
{ {
payload_t *current_payload; payload_t *current_payload;
@ -675,8 +609,7 @@ static status_t compute_length(private_encryption_payload_t *this)
iterator->destroy(iterator); iterator->destroy(iterator);
this->payload_length = length; this->payload_length = length;
return SUCCESS;
} }
/* /*
@ -685,29 +618,25 @@ static status_t compute_length(private_encryption_payload_t *this)
encryption_payload_t *encryption_payload_create() encryption_payload_t *encryption_payload_create()
{ {
private_encryption_payload_t *this = allocator_alloc_thing(private_encryption_payload_t); private_encryption_payload_t *this = allocator_alloc_thing(private_encryption_payload_t);
if (this == NULL)
{
return NULL;
}
/* payload_t interface functions */ /* payload_t interface functions */
this->public.payload_interface.verify = (status_t (*) (payload_t *))verify; this->public.payload_interface.verify = (status_t (*) (payload_t *))verify;
this->public.payload_interface.get_encoding_rules = (status_t (*) (payload_t *, encoding_rule_t **, size_t *) ) get_encoding_rules; this->public.payload_interface.get_encoding_rules = (void (*) (payload_t *, encoding_rule_t **, size_t *) ) get_encoding_rules;
this->public.payload_interface.get_length = (size_t (*) (payload_t *)) get_length; this->public.payload_interface.get_length = (size_t (*) (payload_t *)) get_length;
this->public.payload_interface.get_next_type = (payload_type_t (*) (payload_t *)) get_next_type; this->public.payload_interface.get_next_type = (payload_type_t (*) (payload_t *)) get_next_type;
this->public.payload_interface.set_next_type = (status_t (*) (payload_t *,payload_type_t)) set_next_type; this->public.payload_interface.set_next_type = (void (*) (payload_t *,payload_type_t)) set_next_type;
this->public.payload_interface.get_type = (payload_type_t (*) (payload_t *)) get_type; this->public.payload_interface.get_type = (payload_type_t (*) (payload_t *)) get_type;
this->public.payload_interface.destroy = (status_t (*) (payload_t *))destroy; this->public.payload_interface.destroy = (void (*) (payload_t *))destroy;
/* public functions */ /* public functions */
this->public.create_payload_iterator = (status_t (*) (encryption_payload_t *,iterator_t **,bool)) create_payload_iterator; this->public.create_payload_iterator = (void (*) (encryption_payload_t *,iterator_t **,bool)) create_payload_iterator;
this->public.add_payload = (status_t (*) (encryption_payload_t *,payload_t *)) add_payload; this->public.add_payload = (void (*) (encryption_payload_t *,payload_t *)) add_payload;
this->public.encrypt = (status_t (*) (encryption_payload_t *, crypter_t*)) encrypt; this->public.encrypt = (status_t (*) (encryption_payload_t *, crypter_t*)) encrypt;
this->public.decrypt = (status_t (*) (encryption_payload_t *, crypter_t*)) decrypt; this->public.decrypt = (status_t (*) (encryption_payload_t *, crypter_t*)) decrypt;
this->public.set_signer = (status_t (*) (encryption_payload_t *,signer_t*)) set_signer; this->public.set_signer = (void (*) (encryption_payload_t *,signer_t*)) set_signer;
this->public.build_signature = (status_t (*) (encryption_payload_t*, chunk_t)) build_signature; this->public.build_signature = (status_t (*) (encryption_payload_t*, chunk_t)) build_signature;
this->public.verify_signature = (status_t (*) (encryption_payload_t*, chunk_t)) verify_signature; this->public.verify_signature = (status_t (*) (encryption_payload_t*, chunk_t)) verify_signature;
this->public.destroy = (status_t (*) (encryption_payload_t *)) destroy; this->public.destroy = (void (*) (encryption_payload_t *)) destroy;
/* private functions */ /* private functions */
this->compute_length = compute_length; this->compute_length = compute_length;
@ -723,14 +652,8 @@ encryption_payload_t *encryption_payload_create()
this->decrypted = CHUNK_INITIALIZER; this->decrypted = CHUNK_INITIALIZER;
this->checksum = CHUNK_INITIALIZER; this->checksum = CHUNK_INITIALIZER;
this->signer = NULL; this->signer = NULL;
this->payloads = linked_list_create(); this->payloads = linked_list_create();
if (this->payloads == NULL)
{
allocator_free(this);
return NULL;
}
return (&(this->public)); return (&(this->public));
} }

View File

@ -29,7 +29,7 @@
#include <utils/linked_list.h> #include <utils/linked_list.h>
/** /**
* encrpytion payload length in bytes without IV and following data * Encrpytion payload length in bytes without IV and following data.
*/ */
#define ENCRYPTION_PAYLOAD_HEADER_LENGTH 4 #define ENCRYPTION_PAYLOAD_HEADER_LENGTH 4
@ -39,10 +39,11 @@ typedef struct encryption_payload_t encryption_payload_t;
/** /**
* @brief The encryption payload as described in RFC section 3.14. * @brief The encryption payload as described in RFC section 3.14.
* *
* @ingroup payloads
*/ */
struct encryption_payload_t { struct encryption_payload_t {
/** /**
* implements payload_t interface * Implements payload_t interface.
*/ */
payload_t payload_interface; payload_t payload_interface;
@ -52,21 +53,16 @@ struct encryption_payload_t {
* @param this calling encryption_payload_t object * @param this calling encryption_payload_t object
* @param iterator the created iterator is stored at the pointed pointer * @param iterator the created iterator is stored at the pointed pointer
* @param[in] forward iterator direction (TRUE: front to end) * @param[in] forward iterator direction (TRUE: front to end)
* @return
* - SUCCESS or
* - OUT_OF_RES if iterator could not be created
*/ */
status_t (*create_payload_iterator) (encryption_payload_t *this, iterator_t **iterator, bool forward); void (*create_payload_iterator) (encryption_payload_t *this, iterator_t **iterator, bool forward);
/** /**
* @brief Adds a payload to this encryption payload. * @brief Adds a payload to this encryption payload.
* *
* @param this calling encryption_payload_t object * @param this calling encryption_payload_t object
* @param payload payload_t object to add * @param payload payload_t object to add
* @return - SUCCESS if succeeded
* - FAILED otherwise
*/ */
status_t (*add_payload) (encryption_payload_t *this, payload_t *payload); void (*add_payload) (encryption_payload_t *this, payload_t *payload);
/** /**
* @brief Decrypt and return contained data. * @brief Decrypt and return contained data.
@ -81,7 +77,7 @@ struct encryption_payload_t {
* - FAILED if crypter does not match data * - FAILED if crypter does not match data
*/ */
status_t (*set_signer) (encryption_payload_t *this, signer_t *signer); void (*set_signer) (encryption_payload_t *this, signer_t *signer);
status_t (*encrypt) (encryption_payload_t *this, crypter_t *crypter); status_t (*encrypt) (encryption_payload_t *this, crypter_t *crypter);
status_t (*decrypt) (encryption_payload_t *this, crypter_t *crypter); status_t (*decrypt) (encryption_payload_t *this, crypter_t *crypter);
@ -93,21 +89,18 @@ struct encryption_payload_t {
* @brief Destroys an encryption_payload_t object. * @brief Destroys an encryption_payload_t object.
* *
* @param this encryption_payload_t object to destroy * @param this encryption_payload_t object to destroy
* @return
* - SUCCESS in any case
*/ */
status_t (*destroy) (encryption_payload_t *this); void (*destroy) (encryption_payload_t *this);
}; };
/** /**
* @brief Creates an empty encryption_payload_t object. * @brief Creates an empty encryption_payload_t object.
* *
* @return * @return created encryption_payload_t object
* - created encryption_payload_t object, or *
* - NULL if failed * @ingroup payloads
*/ */
encryption_payload_t *encryption_payload_create(); encryption_payload_t *encryption_payload_create();
#endif /*ENCRYPTION_PAYLOAD_H_*/ #endif /*ENCRYPTION_PAYLOAD_H_*/

View File

@ -1,10 +1,7 @@
/** /**
* @file ike_header.c * @file ike_header.c
* *
* @brief Declaration of the class ike_header_t. * @brief Implementation of ike_header_t.
*
* An object of this type represents an ike header and is used to
* generate and parse ike headers.
* *
*/ */
@ -35,72 +32,78 @@
typedef struct private_ike_header_t private_ike_header_t; typedef struct private_ike_header_t private_ike_header_t;
/** /**
* Private data of an ike_header_t Object * Private data of an ike_header_t object.
* *
*/ */
struct private_ike_header_t { struct private_ike_header_t {
/** /**
* public interface * Public interface.
*/ */
ike_header_t public; ike_header_t public;
/** /**
* SPI of the initiator * SPI of the initiator.
*/ */
u_int64_t initiator_spi; u_int64_t initiator_spi;
/** /**
* SPI of the responder * SPI of the responder.
*/ */
u_int64_t responder_spi; u_int64_t responder_spi;
/** /**
* next payload type * Next payload type.
*/ */
u_int8_t next_payload; u_int8_t next_payload;
/** /**
* IKE major version * IKE major version.
*/ */
u_int8_t maj_version; u_int8_t maj_version;
/** /**
* IKE minor version * IKE minor version.
*/ */
u_int8_t min_version; u_int8_t min_version;
/** /**
* Exchange type * Exchange type .
*/ */
u_int8_t exchange_type; u_int8_t exchange_type;
/** /**
* Flags of the Message * Flags of the Message.
* *
*/ */
struct { struct {
/** /**
* Sender is initiator of the associated IKE_SA_INIT-Exchange * Sender is initiator of the associated IKE_SA_INIT-Exchange.
*/ */
bool initiator; bool initiator;
/** /**
* is protocol supporting higher version? * Is protocol supporting higher version?
*/ */
bool version; bool version;
/** /**
* TRUE, if this is a response, FALSE if its a Request * TRUE, if this is a response, FALSE if its a Request.
*/ */
bool response; bool response;
} flags; } flags;
/** /**
* Associated Message-ID * Associated Message-ID.
*/ */
u_int32_t message_id; u_int32_t message_id;
/** /**
* Length of the whole IKEv2-Message (header and all payloads) * Length of the whole IKEv2-Message (header and all payloads).
*/ */
u_int32_t length; u_int32_t length;
}; };
/** /**
* mappings used to get strings for exchange_type_t * Mappings used to get strings for exchange_type_t.
*/ */
mapping_t exchange_type_m[] = { mapping_t exchange_type_m[] = {
{EXCHANGE_TYPE_UNDEFINED, "EXCHANGE_TYPE_UNDEFINED"}, {EXCHANGE_TYPE_UNDEFINED, "EXCHANGE_TYPE_UNDEFINED"},
@ -112,7 +115,7 @@ mapping_t exchange_type_m[] = {
/** /**
* Encoding rules to parse or generate a IKEv2-Header * Encoding rules to parse or generate a IKEv2-Header.
* *
* The defined offsets are the positions in a object of type * The defined offsets are the positions in a object of type
* ike_header_t. * ike_header_t.
@ -168,8 +171,7 @@ encoding_rule_t ike_header_encodings[] = {
/** /**
* Implements payload_t's verify function. * Implementation of payload_t.verify.
* See #payload_s.verify for description.
*/ */
static status_t verify(private_ike_header_t *this) static status_t verify(private_ike_header_t *this)
{ {
@ -202,17 +204,14 @@ static status_t verify(private_ike_header_t *this)
} }
/** /**
* Implements payload_t's set_next_type function. * Implementation of payload_t.set_next_type.
* See #payload_s.set_next_type for description.
*/ */
static status_t set_next_type(payload_t *this,payload_type_t type) static void set_next_type(payload_t *this,payload_type_t type)
{ {
((private_ike_header_t *)this)->next_payload = type; ((private_ike_header_t *)this)->next_payload = type;
return SUCCESS;
} }
/** /**
* Implements ike_header_t's get_initiator_spi fuction. * Implementation of ike_header_t.get_initiator_spi.
* See #ike_header_t.get_initiator_spi for description.
*/ */
static u_int64_t get_initiator_spi(private_ike_header_t *this) static u_int64_t get_initiator_spi(private_ike_header_t *this)
{ {
@ -220,8 +219,7 @@ static u_int64_t get_initiator_spi(private_ike_header_t *this)
} }
/** /**
* Implements ike_header_t's set_initiator_spi fuction. * Implementation of ike_header_t.set_initiator_spi.
* See #ike_header_t.set_initiator_spi for description.
*/ */
static void set_initiator_spi(private_ike_header_t *this, u_int64_t initiator_spi) static void set_initiator_spi(private_ike_header_t *this, u_int64_t initiator_spi)
{ {
@ -229,8 +227,7 @@ static void set_initiator_spi(private_ike_header_t *this, u_int64_t initiator_sp
} }
/** /**
* Implements ike_header_t's get_responder_spi fuction. * Implementation of ike_header_t.get_responder_spi.
* See #ike_header_t.get_responder_spi for description.
*/ */
static u_int64_t get_responder_spi(private_ike_header_t *this) static u_int64_t get_responder_spi(private_ike_header_t *this)
{ {
@ -238,8 +235,7 @@ static u_int64_t get_responder_spi(private_ike_header_t *this)
} }
/** /**
* Implements ike_header_t's set_responder_spi fuction. * Implementation of ike_header_t.set_responder_spi.
* See #ike_header_t.set_responder_spi for description.
*/ */
static void set_responder_spi(private_ike_header_t *this, u_int64_t responder_spi) static void set_responder_spi(private_ike_header_t *this, u_int64_t responder_spi)
{ {
@ -247,8 +243,7 @@ static void set_responder_spi(private_ike_header_t *this, u_int64_t responder_sp
} }
/** /**
* Implements ike_header_t's get_maj_version fuction. * Implementation of ike_header_t.get_maj_version.
* See #ike_header_t.get_maj_version for description.
*/ */
static u_int8_t get_maj_version(private_ike_header_t *this) static u_int8_t get_maj_version(private_ike_header_t *this)
{ {
@ -256,8 +251,7 @@ static u_int8_t get_maj_version(private_ike_header_t *this)
} }
/** /**
* Implements ike_header_t's get_min_version fuction. * Implementation of ike_header_t.get_min_version.
* See #ike_header_t.get_min_version for description.
*/ */
static u_int8_t get_min_version(private_ike_header_t *this) static u_int8_t get_min_version(private_ike_header_t *this)
{ {
@ -265,8 +259,7 @@ static u_int8_t get_min_version(private_ike_header_t *this)
} }
/** /**
* Implements ike_header_t's get_response_flag fuction. * Implementation of ike_header_t.get_response_flag.
* See #ike_header_t.get_response_flag for description.
*/ */
static bool get_response_flag(private_ike_header_t *this) static bool get_response_flag(private_ike_header_t *this)
{ {
@ -274,8 +267,7 @@ static bool get_response_flag(private_ike_header_t *this)
} }
/** /**
* Implements ike_header_t's set_response_flag fuction. * Implementation of ike_header_t.set_response_flag.
* See #ike_header_t.set_response_flag for description.
*/ */
static void set_response_flag(private_ike_header_t *this, bool response) static void set_response_flag(private_ike_header_t *this, bool response)
{ {
@ -283,8 +275,7 @@ static void set_response_flag(private_ike_header_t *this, bool response)
} }
/** /**
* Implements ike_header_t's get_version_flag fuction. * Implementation of ike_header_t.get_version_flag.
* See #ike_header_t.get_version_flag for description.
*/ */
static bool get_version_flag(private_ike_header_t *this) static bool get_version_flag(private_ike_header_t *this)
{ {
@ -292,8 +283,7 @@ static bool get_version_flag(private_ike_header_t *this)
} }
/** /**
* Implements ike_header_t's get_initiator_flag fuction. * Implementation of ike_header_t.get_initiator_flag.
* See #ike_header_t.get_initiator_flag for description.
*/ */
static bool get_initiator_flag(private_ike_header_t *this) static bool get_initiator_flag(private_ike_header_t *this)
{ {
@ -301,8 +291,7 @@ static bool get_initiator_flag(private_ike_header_t *this)
} }
/** /**
* Implements ike_header_t's set_initiator_flag fuction. * Implementation of ike_header_t.set_initiator_flag.
* See #ike_header_t.set_initiator_flag for description.
*/ */
static void set_initiator_flag(private_ike_header_t *this, bool initiator) static void set_initiator_flag(private_ike_header_t *this, bool initiator)
{ {
@ -310,8 +299,7 @@ static void set_initiator_flag(private_ike_header_t *this, bool initiator)
} }
/** /**
* Implements ike_header_t's get_exchange_type function * Implementation of ike_header_t.get_exchange_type.
* See #ike_header_t.get_exchange_type for description.
*/ */
static u_int8_t get_exchange_type(private_ike_header_t *this) static u_int8_t get_exchange_type(private_ike_header_t *this)
{ {
@ -319,8 +307,7 @@ static u_int8_t get_exchange_type(private_ike_header_t *this)
} }
/** /**
* Implements ike_header_t's set_exchange_type function. * Implementation of ike_header_t.set_exchange_type.
* See #ike_header_t.set_exchange_type for description.
*/ */
static void set_exchange_type(private_ike_header_t *this, u_int8_t exchange_type) static void set_exchange_type(private_ike_header_t *this, u_int8_t exchange_type)
{ {
@ -337,8 +324,7 @@ static u_int32_t get_message_id(private_ike_header_t *this)
} }
/** /**
* Implements ike_header_t's set_message_id function. * Implementation of ike_header_t.set_message_id.
* See #ike_header_t.set_message_id for description.
*/ */
static void set_message_id(private_ike_header_t *this, u_int32_t message_id) static void set_message_id(private_ike_header_t *this, u_int32_t message_id)
{ {
@ -346,31 +332,24 @@ static void set_message_id(private_ike_header_t *this, u_int32_t message_id)
} }
/** /**
* Implements payload_t's and ike_header_t's destroy function. * Implementation of ike_header_t.destroy and payload_t.destroy.
* See #payload_s.destroy or ike_header_s.destroy for description.
*/ */
static status_t destroy(ike_header_t *this) static void destroy(ike_header_t *this)
{ {
allocator_free(this); allocator_free(this);
return SUCCESS;
} }
/** /**
* Implements payload_t's get_encoding_rules function. * Implementation of payload_t.get_encoding_rules.
* See #payload_s.get_encoding_rules for description.
*/ */
static status_t get_encoding_rules(payload_t *this, encoding_rule_t **rules, size_t *rule_count) static void get_encoding_rules(payload_t *this, encoding_rule_t **rules, size_t *rule_count)
{ {
*rules = ike_header_encodings; *rules = ike_header_encodings;
*rule_count = sizeof(ike_header_encodings) / sizeof(encoding_rule_t); *rule_count = sizeof(ike_header_encodings) / sizeof(encoding_rule_t);
return SUCCESS;
} }
/** /**
* Implements payload_t's get_type function. * Implementation of payload_t.get_type.
* See #payload_s.get_type for description.
*/ */
static payload_type_t get_type(payload_t *this) static payload_type_t get_type(payload_t *this)
{ {
@ -378,8 +357,7 @@ static payload_type_t get_type(payload_t *this)
} }
/** /**
* Implements payload_t's get_next_type function. * Implementation of payload_t.get_next_type.
* See #payload_s.get_next_type for description.
*/ */
static payload_type_t get_next_type(payload_t *this) static payload_type_t get_next_type(payload_t *this)
{ {
@ -387,8 +365,7 @@ static payload_type_t get_next_type(payload_t *this)
} }
/** /**
* Implements payload_t's get_length function. * Implementation of payload_t.get_length.
* See #payload_s.get_length for description.
*/ */
static size_t get_length(payload_t *this) static size_t get_length(payload_t *this)
{ {
@ -396,15 +373,11 @@ static size_t get_length(payload_t *this)
} }
/* /*
* Described in header * Described in header.
*/ */
ike_header_t *ike_header_create() ike_header_t *ike_header_create()
{ {
private_ike_header_t *this = allocator_alloc_thing(private_ike_header_t); private_ike_header_t *this = allocator_alloc_thing(private_ike_header_t);
if (this == NULL)
{
return NULL;
}
this->public.payload_interface.verify = (status_t (*) (payload_t *))verify; this->public.payload_interface.verify = (status_t (*) (payload_t *))verify;
this->public.payload_interface.get_encoding_rules = get_encoding_rules; this->public.payload_interface.get_encoding_rules = get_encoding_rules;
@ -412,7 +385,7 @@ ike_header_t *ike_header_create()
this->public.payload_interface.get_next_type = get_next_type; this->public.payload_interface.get_next_type = get_next_type;
this->public.payload_interface.set_next_type = set_next_type; this->public.payload_interface.set_next_type = set_next_type;
this->public.payload_interface.get_type = get_type; this->public.payload_interface.get_type = get_type;
this->public.payload_interface.destroy = (status_t (*) (payload_t *))destroy; this->public.payload_interface.destroy = (void (*) (payload_t *))destroy;
this->public.destroy = destroy; this->public.destroy = destroy;
this->public.get_initiator_spi = (u_int64_t (*) (ike_header_t*))get_initiator_spi; this->public.get_initiator_spi = (u_int64_t (*) (ike_header_t*))get_initiator_spi;
@ -444,8 +417,5 @@ ike_header_t *ike_header_create()
this->message_id = 0; this->message_id = 0;
this->length = IKE_HEADER_LENGTH; this->length = IKE_HEADER_LENGTH;
return (ike_header_t*)this; return (ike_header_t*)this;
} }

View File

@ -1,10 +1,7 @@
/** /**
* @file ike_header.h * @file ike_header.h
* *
* @brief Declaration of the class ike_header_t. * @brief Interface of ike_header_t.
*
* An object of this type represents an ike header and is used to
* generate and parse ike headers.
* *
*/ */
@ -30,22 +27,30 @@
#include <encoding/payloads/payload.h> #include <encoding/payloads/payload.h>
/** /**
* Major Version of IKEv2 * Major Version of IKEv2.
*
* @ingroup payloads
*/ */
#define IKE_MAJOR_VERSION 2 #define IKE_MAJOR_VERSION 2
/** /**
* Minor Version of IKEv2 * Minor Version of IKEv2.
*
* @ingroup payloads
*/ */
#define IKE_MINOR_VERSION 0 #define IKE_MINOR_VERSION 0
/** /**
* Flag in IKEv2-Header. Always 0 * Flag in IKEv2-Header. Always 0.
*
* @ingroup payloads
*/ */
#define HIGHER_VERSION_SUPPORTED_FLAG 0 #define HIGHER_VERSION_SUPPORTED_FLAG 0
/** /**
* Length of IKE Header in Bytes * Length of IKE Header in Bytes.
*
* @ingroup payloads
*/ */
#define IKE_HEADER_LENGTH 28 #define IKE_HEADER_LENGTH 28
@ -54,28 +59,34 @@ typedef enum exchange_type_t exchange_type_t;
/** /**
* @brief Different types of IKE-Exchanges. * @brief Different types of IKE-Exchanges.
* *
* See RFC for different types. * See Draft for different types.
*
* @ingroup payloads
*/ */
enum exchange_type_t{ enum exchange_type_t{
/** /**
* EXCHANGE_TYPE_UNDEFINED, not a official message type :-) * EXCHANGE_TYPE_UNDEFINED, not a official message type :-).
*/ */
EXCHANGE_TYPE_UNDEFINED = 240, EXCHANGE_TYPE_UNDEFINED = 240,
/** /**
* IKE_SA_INIT * IKE_SA_INIT.
*/ */
IKE_SA_INIT = 34, IKE_SA_INIT = 34,
/** /**
* IKE_AUTH * IKE_AUTH.
*/ */
IKE_AUTH = 35, IKE_AUTH = 35,
/** /**
* CREATE_CHILD_SA * CREATE_CHILD_SA.
*/ */
CREATE_CHILD_SA = 36, CREATE_CHILD_SA = 36,
/** /**
* INFORMATIONAL * INFORMATIONAL.
*/ */
INFORMATIONAL = 37 INFORMATIONAL = 37
}; };
@ -85,21 +96,24 @@ extern mapping_t exchange_type_m[];
typedef struct ike_header_t ike_header_t; typedef struct ike_header_t ike_header_t;
/** /**
* Object representing an IKEv2-Header * An object of this type represents an IKEv2 header and is used to
* generate and parse IKEv2 headers.
*
* *
* The header format of an IKEv2-Message is compatible to the * The header format of an IKEv2-Message is compatible to the
* ISAKMP-Header format to allow implementations supporting * ISAKMP-Header format to allow implementations supporting
* both versions of the IKE-protocol. * both versions of the IKE-protocol.
* *
* @ingroup payloads
*/ */
struct ike_header_t { struct ike_header_t {
/** /**
* implements payload_t interface * The payload_t interface.
*/ */
payload_t payload_interface; payload_t payload_interface;
/** /**
* @brief get the initiator spi * @brief Get the initiator spi.
* *
* @param this ike_header_t object * @param this ike_header_t object
* @return initiator_spi * @return initiator_spi
@ -107,7 +121,7 @@ struct ike_header_t {
u_int64_t (*get_initiator_spi) (ike_header_t *this); u_int64_t (*get_initiator_spi) (ike_header_t *this);
/** /**
* @brief set the initiator spi * @brief Set the initiator spi.
* *
* @param this ike_header_t object * @param this ike_header_t object
* @param initiator_spi initiator_spi * @param initiator_spi initiator_spi
@ -115,7 +129,7 @@ struct ike_header_t {
void (*set_initiator_spi) (ike_header_t *this, u_int64_t initiator_spi); void (*set_initiator_spi) (ike_header_t *this, u_int64_t initiator_spi);
/** /**
* @brief get the responder spi * @brief Get the responder spi.
* *
* @param this ike_header_t object * @param this ike_header_t object
* @return responder_spi * @return responder_spi
@ -123,7 +137,7 @@ struct ike_header_t {
u_int64_t (*get_responder_spi) (ike_header_t *this); u_int64_t (*get_responder_spi) (ike_header_t *this);
/** /**
* @brief set the responder spi * @brief Set the responder spi.
* *
* @param this ike_header_t object * @param this ike_header_t object
* @param responder_spi responder_spi * @param responder_spi responder_spi
@ -131,7 +145,7 @@ struct ike_header_t {
void (*set_responder_spi) (ike_header_t *this, u_int64_t responder_spi); void (*set_responder_spi) (ike_header_t *this, u_int64_t responder_spi);
/** /**
* @brief get the major version * @brief Get the major version.
* *
* @param this ike_header_t object * @param this ike_header_t object
* @return major version * @return major version
@ -139,7 +153,7 @@ struct ike_header_t {
u_int8_t (*get_maj_version) (ike_header_t *this); u_int8_t (*get_maj_version) (ike_header_t *this);
/** /**
* @brief get the mainor version * @brief Get the minor version.
* *
* @param this ike_header_t object * @param this ike_header_t object
* @return minor version * @return minor version
@ -147,7 +161,7 @@ struct ike_header_t {
u_int8_t (*get_min_version) (ike_header_t *this); u_int8_t (*get_min_version) (ike_header_t *this);
/** /**
* @brief get the response flag * @brief Get the response flag.
* *
* @param this ike_header_t object * @param this ike_header_t object
* @return response flag * @return response flag
@ -155,7 +169,7 @@ struct ike_header_t {
bool (*get_response_flag) (ike_header_t *this); bool (*get_response_flag) (ike_header_t *this);
/** /**
* @brief Set the response flag * @brief Set the response flag-
* *
* @param this ike_header_t object * @param this ike_header_t object
* @param response response flag * @param response response flag
@ -163,7 +177,7 @@ struct ike_header_t {
*/ */
void (*set_response_flag) (ike_header_t *this, bool response); void (*set_response_flag) (ike_header_t *this, bool response);
/** /**
* @brief get "higher version supported"-flag * @brief Get "higher version supported"-flag.
* *
* @param this ike_header_t object * @param this ike_header_t object
* @return version flag * @return version flag
@ -171,7 +185,7 @@ struct ike_header_t {
bool (*get_version_flag) (ike_header_t *this); bool (*get_version_flag) (ike_header_t *this);
/** /**
* @brief get the initiator flag * @brief Get the initiator flag.
* *
* @param this ike_header_t object * @param this ike_header_t object
* @return initiator flag * @return initiator flag
@ -179,7 +193,7 @@ struct ike_header_t {
bool (*get_initiator_flag) (ike_header_t *this); bool (*get_initiator_flag) (ike_header_t *this);
/** /**
* @brief Set the initiator flag * @brief Set the initiator flag.
* *
* @param this ike_header_t object * @param this ike_header_t object
* @param initiator initiator flag * @param initiator initiator flag
@ -188,7 +202,7 @@ struct ike_header_t {
void (*set_initiator_flag) (ike_header_t *this, bool initiator); void (*set_initiator_flag) (ike_header_t *this, bool initiator);
/** /**
* @brief get the exchange type * @brief Get the exchange type.
* *
* @param this ike_header_t object * @param this ike_header_t object
* @return exchange type * @return exchange type
@ -196,7 +210,7 @@ struct ike_header_t {
u_int8_t (*get_exchange_type) (ike_header_t *this); u_int8_t (*get_exchange_type) (ike_header_t *this);
/** /**
* @brief set the exchange type * @brief Set the exchange type.
* *
* @param this ike_header_t object * @param this ike_header_t object
* @param exchange_type exchange type * @param exchange_type exchange type
@ -204,7 +218,7 @@ struct ike_header_t {
void (*set_exchange_type) (ike_header_t *this, u_int8_t exchange_type); void (*set_exchange_type) (ike_header_t *this, u_int8_t exchange_type);
/** /**
* @brief get the message id * @brief Get the message id.
* *
* @param this ike_header_t object * @param this ike_header_t object
* @return message id * @return message id
@ -212,7 +226,7 @@ struct ike_header_t {
u_int32_t (*get_message_id) (ike_header_t *this); u_int32_t (*get_message_id) (ike_header_t *this);
/** /**
* @brief set the message id * @brief Set the message id.
* *
* @param this ike_header_t object * @param this ike_header_t object
* @param initiator_spi message id * @param initiator_spi message id
@ -223,20 +237,17 @@ struct ike_header_t {
* @brief Destroys a ike_header_t object. * @brief Destroys a ike_header_t object.
* *
* @param this ike_header_t object to destroy * @param this ike_header_t object to destroy
* @return
* SUCCESS in any case
*/ */
status_t (*destroy) (ike_header_t *this); void (*destroy) (ike_header_t *this);
}; };
/** /**
* @brief Create an ike_header_t object * @brief Create an ike_header_t object
* *
* @return * @return created ike_header_t object
* - created ike_header, or *
* - NULL if failed * @ingroup payloads
*/ */
ike_header_t *ike_header_create(); ike_header_t *ike_header_create();
#endif /*IKE_HEADER_H_*/ #endif /*IKE_HEADER_H_*/

View File

@ -1,11 +1,7 @@
/** /**
* @file ke_payload.c * @file ke_payload.c
* *
* @brief Declaration of the class ke_payload_t. * @brief Implementation of ke_payload_t.
*
* An object of this type represents an IKEv2 KE-Payload.
*
* See section 3.4 of RFC for details of this payload type.
* *
*/ */
@ -36,38 +32,38 @@
typedef struct private_ke_payload_t private_ke_payload_t; typedef struct private_ke_payload_t private_ke_payload_t;
/** /**
* Private data of an ke_payload_t Object * Private data of an ke_payload_t object.
* *
*/ */
struct private_ke_payload_t { struct private_ke_payload_t {
/** /**
* public ke_payload_t interface * Public ke_payload_t interface.
*/ */
ke_payload_t public; ke_payload_t public;
/** /**
* next payload type * Next payload type.
*/ */
u_int8_t next_payload; u_int8_t next_payload;
/** /**
* Critical flag * Critical flag.
*/ */
bool critical; bool critical;
/** /**
* Length of this payload * Length of this payload.
*/ */
u_int16_t payload_length; u_int16_t payload_length;
/** /**
* DH Group Number * DH Group Number.
*/ */
diffie_hellman_group_t dh_group_number; diffie_hellman_group_t dh_group_number;
/** /**
* Key Exchange Data of this KE payload * Key Exchange Data of this KE payload.
*/ */
chunk_t key_exchange_data; chunk_t key_exchange_data;
@ -75,14 +71,12 @@ struct private_ke_payload_t {
* @brief Computes the length of this payload. * @brief Computes the length of this payload.
* *
* @param this calling private_ke_payload_t object * @param this calling private_ke_payload_t object
* @return
* SUCCESS in any case
*/ */
status_t (*compute_length) (private_ke_payload_t *this); void (*compute_length) (private_ke_payload_t *this);
}; };
/** /**
* Encoding rules to parse or generate a IKEv2-KE Payload * Encoding rules to parse or generate a IKEv2-KE Payload.
* *
* The defined offsets are the positions in a object of type * The defined offsets are the positions in a object of type
* private_ke_payload_t. * private_ke_payload_t.
@ -126,8 +120,7 @@ encoding_rule_t ke_payload_encodings[] = {
*/ */
/** /**
* Implements payload_t's verify function. * Implementation of payload_t.verify.
* See #payload_s.verify for description.
*/ */
static status_t verify(private_ke_payload_t *this) static status_t verify(private_ke_payload_t *this)
{ {
@ -142,34 +135,28 @@ static status_t verify(private_ke_payload_t *this)
} }
/** /**
* Implements payload_t's and ke_payload_t's destroy function. * Implementation of payload_t.destroy.
* See #payload_s.destroy or ke_payload_s.destroy for description.
*/ */
static status_t destroy(private_ke_payload_t *this) static void destroy(private_ke_payload_t *this)
{ {
if (this->key_exchange_data.ptr != NULL) if (this->key_exchange_data.ptr != NULL)
{ {
allocator_free(this->key_exchange_data.ptr); allocator_free(this->key_exchange_data.ptr);
} }
allocator_free(this); allocator_free(this);
return SUCCESS;
} }
/** /**
* Implements payload_t's get_encoding_rules function. * Implementation of payload_t.get_encoding_rules.
* See #payload_s.get_encoding_rules for description.
*/ */
static status_t get_encoding_rules(private_ke_payload_t *this, encoding_rule_t **rules, size_t *rule_count) static void get_encoding_rules(private_ke_payload_t *this, encoding_rule_t **rules, size_t *rule_count)
{ {
*rules = ke_payload_encodings; *rules = ke_payload_encodings;
*rule_count = sizeof(ke_payload_encodings) / sizeof(encoding_rule_t); *rule_count = sizeof(ke_payload_encodings) / sizeof(encoding_rule_t);
return SUCCESS;
} }
/** /**
* Implements payload_t's get_type function. * Implementation of payload_t.get_type.
* See #payload_s.get_type for description.
*/ */
static payload_type_t get_type(private_ke_payload_t *this) static payload_type_t get_type(private_ke_payload_t *this)
{ {
@ -177,8 +164,7 @@ static payload_type_t get_type(private_ke_payload_t *this)
} }
/** /**
* Implements payload_t's get_next_type function. * Implementation of payload_t.get_next_type.
* See #payload_s.get_next_type for description.
*/ */
static payload_type_t get_next_type(private_ke_payload_t *this) static payload_type_t get_next_type(private_ke_payload_t *this)
{ {
@ -186,18 +172,15 @@ static payload_type_t get_next_type(private_ke_payload_t *this)
} }
/** /**
* Implements payload_t's set_next_type function. * Implementation of payload_t.set_next_type.
* See #payload_s.set_next_type for description.
*/ */
static status_t set_next_type(private_ke_payload_t *this,payload_type_t type) static void set_next_type(private_ke_payload_t *this,payload_type_t type)
{ {
this->next_payload = type; this->next_payload = type;
return SUCCESS;
} }
/** /**
* Implements payload_t's get_length function. * Implementation of payload_t.get_length.
* See #payload_s.get_length for description.
*/ */
static size_t get_length(private_ke_payload_t *this) static size_t get_length(private_ke_payload_t *this)
{ {
@ -206,37 +189,31 @@ static size_t get_length(private_ke_payload_t *this)
} }
/** /**
* Implements private_ke_payload_t's compute_length function. * Implementation of private_ke_payload_t.compute_length.
* See #private_ke_payload_s.compute_length for description.
*/ */
static status_t compute_length (private_ke_payload_t *this) static void compute_length (private_ke_payload_t *this)
{ {
size_t length = KE_PAYLOAD_HEADER_LENGTH; size_t length = KE_PAYLOAD_HEADER_LENGTH;
if (this->key_exchange_data.ptr != NULL) if (this->key_exchange_data.ptr != NULL)
{ {
length += this->key_exchange_data.len; length += this->key_exchange_data.len;
} }
this->payload_length = length; this->payload_length = length;
return SUCCESS;
} }
/** /**
* Implements ke_payload_t's get_key_exchange_data function. * Implementation of ke_payload_t.get_key_exchange_data.
* See #ke_payload_t.get_key_exchange_data for description.
*/ */
chunk_t get_key_exchange_data(private_ke_payload_t *this) static chunk_t get_key_exchange_data(private_ke_payload_t *this)
{ {
return (this->key_exchange_data); return (this->key_exchange_data);
} }
/** /**
* Implements ke_payload_t's set_key_exchange_data function. * Implementation of ke_payload_t.set_key_exchange_data.
* See #ke_payload_t.set_key_exchange_data for description.
*/ */
status_t set_key_exchange_data(private_ke_payload_t *this, chunk_t key_exchange_data) static void set_key_exchange_data(private_ke_payload_t *this, chunk_t key_exchange_data)
{ {
/* destroy existing data first */ /* destroy existing data first */
if (this->key_exchange_data.ptr != NULL) if (this->key_exchange_data.ptr != NULL)
@ -249,33 +226,25 @@ status_t set_key_exchange_data(private_ke_payload_t *this, chunk_t key_exchange_
} }
this->key_exchange_data.ptr = allocator_clone_bytes(key_exchange_data.ptr,key_exchange_data.len); this->key_exchange_data.ptr = allocator_clone_bytes(key_exchange_data.ptr,key_exchange_data.len);
if (this->key_exchange_data.ptr == NULL)
{
return OUT_OF_RES;
}
this->key_exchange_data.len = key_exchange_data.len; this->key_exchange_data.len = key_exchange_data.len;
this->compute_length(this); this->compute_length(this);
return SUCCESS;
} }
/** /**
* Implements ke_payload_t's get_dh_group_number function. * Implementation of ke_payload_t.get_dh_group_number.
* See #ke_payload_t.get_dh_group_number for description.
*/ */
diffie_hellman_group_t get_dh_group_number(private_ke_payload_t *this) static diffie_hellman_group_t get_dh_group_number(private_ke_payload_t *this)
{ {
return this->dh_group_number; return this->dh_group_number;
} }
/** /**
* Implements ke_payload_t's set_dh_group_number function. * Implementation of ke_payload_t.set_dh_group_number.
* See #ke_payload_t.set_dh_group_number for description.
*/ */
status_t set_dh_group_number(private_ke_payload_t *this, diffie_hellman_group_t dh_group_number) static void set_dh_group_number(private_ke_payload_t *this, diffie_hellman_group_t dh_group_number)
{ {
this->dh_group_number = dh_group_number; this->dh_group_number = dh_group_number;
return SUCCESS;
} }
/* /*
@ -284,25 +253,22 @@ status_t set_dh_group_number(private_ke_payload_t *this, diffie_hellman_group_t
ke_payload_t *ke_payload_create() ke_payload_t *ke_payload_create()
{ {
private_ke_payload_t *this = allocator_alloc_thing(private_ke_payload_t); private_ke_payload_t *this = allocator_alloc_thing(private_ke_payload_t);
if (this == NULL)
{
return NULL;
}
/* interface functions */ /* interface functions */
this->public.payload_interface.verify = (status_t (*) (payload_t *))verify; this->public.payload_interface.verify = (status_t (*) (payload_t *))verify;
this->public.payload_interface.get_encoding_rules = (status_t (*) (payload_t *, encoding_rule_t **, size_t *) ) get_encoding_rules; this->public.payload_interface.get_encoding_rules = (void (*) (payload_t *, encoding_rule_t **, size_t *) ) get_encoding_rules;
this->public.payload_interface.get_length = (size_t (*) (payload_t *)) get_length; this->public.payload_interface.get_length = (size_t (*) (payload_t *)) get_length;
this->public.payload_interface.get_next_type = (payload_type_t (*) (payload_t *)) get_next_type; this->public.payload_interface.get_next_type = (payload_type_t (*) (payload_t *)) get_next_type;
this->public.payload_interface.set_next_type = (status_t (*) (payload_t *,payload_type_t)) set_next_type; this->public.payload_interface.set_next_type = (void (*) (payload_t *,payload_type_t)) set_next_type;
this->public.payload_interface.get_type = (payload_type_t (*) (payload_t *)) get_type; this->public.payload_interface.get_type = (payload_type_t (*) (payload_t *)) get_type;
this->public.payload_interface.destroy = (status_t (*) (payload_t *))destroy; this->public.payload_interface.destroy = (void (*) (payload_t *))destroy;
/* public functions */ /* public functions */
this->public.get_key_exchange_data = (chunk_t (*) (ke_payload_t *)) get_key_exchange_data; this->public.get_key_exchange_data = (chunk_t (*) (ke_payload_t *)) get_key_exchange_data;
this->public.set_key_exchange_data = (status_t (*) (ke_payload_t *,chunk_t)) set_key_exchange_data; this->public.set_key_exchange_data = (void (*) (ke_payload_t *,chunk_t)) set_key_exchange_data;
this->public.get_dh_group_number = (diffie_hellman_group_t (*) (ke_payload_t *)) get_dh_group_number; this->public.get_dh_group_number = (diffie_hellman_group_t (*) (ke_payload_t *)) get_dh_group_number;
this->public.set_dh_group_number =(status_t (*) (ke_payload_t *,diffie_hellman_group_t)) set_dh_group_number; this->public.set_dh_group_number =(void (*) (ke_payload_t *,diffie_hellman_group_t)) set_dh_group_number;
this->public.destroy = (status_t (*) (ke_payload_t *)) destroy; this->public.destroy = (void (*) (ke_payload_t *)) destroy;
/* private functions */ /* private functions */
this->compute_length = compute_length; this->compute_length = compute_length;

View File

@ -1,11 +1,7 @@
/** /**
* @file ke_payload.h * @file ke_payload.h
* *
* @brief Declaration of the class ke_payload_t. * @brief Interface of ke_payload_t.
*
* An object of this type represents an IKEv2 KE-Payload.
*
* See section 3.4 of RFC for details of this payload type.
* *
*/ */
@ -33,12 +29,16 @@
#include <utils/linked_list.h> #include <utils/linked_list.h>
/** /**
* Critical flag must not be set * Critical flag must not be set.
*
* @ingroup payloads
*/ */
#define KE_PAYLOAD_CRITICAL_FLAG FALSE; #define KE_PAYLOAD_CRITICAL_FLAG FALSE;
/** /**
* KE payload length in bytes without any key exchange data * KE payload length in bytes without any key exchange data.
*
* @ingroup payloads
*/ */
#define KE_PAYLOAD_HEADER_LENGTH 8 #define KE_PAYLOAD_HEADER_LENGTH 8
@ -46,14 +46,15 @@
typedef struct ke_payload_t ke_payload_t; typedef struct ke_payload_t ke_payload_t;
/** /**
* Object representing an IKEv2-KE Payload * Object representing an IKEv2-KE Payload.
* *
* The KE Payload format is described in RFC section 3.4. * The KE Payload format is described in RFC section 3.4.
* *
* @ingroup payloads
*/ */
struct ke_payload_t { struct ke_payload_t {
/** /**
* implements payload_t interface * The payload_t interface.
*/ */
payload_t payload_interface; payload_t payload_interface;
@ -74,11 +75,8 @@ struct ke_payload_t {
* *
* @param this calling ke_payload_t object * @param this calling ke_payload_t object
* @param key_exchange_data chunk_t pointing to the value to set * @param key_exchange_data chunk_t pointing to the value to set
* @return
* - SUCCESS or
* - OUT_OF_RES
*/ */
status_t (*set_key_exchange_data) (ke_payload_t *this, chunk_t key_exchange_data); void (*set_key_exchange_data) (ke_payload_t *this, chunk_t key_exchange_data);
/** /**
* @brief Gets the Diffie-Hellman Group Number of this KE payload. * @brief Gets the Diffie-Hellman Group Number of this KE payload.
@ -93,28 +91,24 @@ struct ke_payload_t {
* *
* @param this calling ke_payload_t object * @param this calling ke_payload_t object
* @param dh_group_number DH Group to set * @param dh_group_number DH Group to set
* @return SUCCESS
*/ */
status_t (*set_dh_group_number) (ke_payload_t *this, diffie_hellman_group_t dh_group_number); void (*set_dh_group_number) (ke_payload_t *this, diffie_hellman_group_t dh_group_number);
/** /**
* @brief Destroys an ke_payload_t object. * @brief Destroys an ke_payload_t object.
* *
* @param this ke_payload_t object to destroy * @param this ke_payload_t object to destroy
* @return
* SUCCESS in any case
*/ */
status_t (*destroy) (ke_payload_t *this); void (*destroy) (ke_payload_t *this);
}; };
/** /**
* @brief Creates an empty ke_payload_t object * @brief Creates an empty ke_payload_t object
* *
* @return * @return created ke_payload_t object
* - created ke_payload_t object, or *
* - NULL if failed * @ingroup payloads
*/ */
ke_payload_t *ke_payload_create(); ke_payload_t *ke_payload_create();

View File

@ -1,9 +1,7 @@
/** /**
* @file nonce_payload.h * @file nonce_payload.h
* *
* @brief Declaration of the class nonce_payload_t. * @brief Implementation of nonce_payload_t.
*
* An object of this type represents an IKEv2 Nonce-Payload.
* *
*/ */
@ -34,32 +32,32 @@
typedef struct private_nonce_payload_t private_nonce_payload_t; typedef struct private_nonce_payload_t private_nonce_payload_t;
/** /**
* Private data of an nonce_payload_t' Object * Private data of an nonce_payload_t object.
* *
*/ */
struct private_nonce_payload_t { struct private_nonce_payload_t {
/** /**
* public nonce_payload_t interface * Public nonce_payload_t interface.
*/ */
nonce_payload_t public; nonce_payload_t public;
/** /**
* next payload type * Next payload type.
*/ */
u_int8_t next_payload; u_int8_t next_payload;
/** /**
* Critical flag * Critical flag.
*/ */
bool critical; bool critical;
/** /**
* Length of this payload * Length of this payload.
*/ */
u_int16_t payload_length; u_int16_t payload_length;
/** /**
* the contained nonce value * The contained nonce value.
*/ */
chunk_t nonce; chunk_t nonce;
@ -67,10 +65,8 @@ struct private_nonce_payload_t {
* @brief Computes the length of this payload. * @brief Computes the length of this payload.
* *
* @param this calling private_nonce_payload_t object * @param this calling private_nonce_payload_t object
* @return
* SUCCESS in any case
*/ */
status_t (*compute_length) (private_nonce_payload_t *this); void (*compute_length) (private_nonce_payload_t *this);
}; };
/** /**
@ -111,8 +107,7 @@ encoding_rule_t nonce_payload_encodings[] = {
*/ */
/** /**
* Implements payload_t's verify function. * Implementation of payload_t.verify.
* See #payload_s.verify for description.
*/ */
static status_t verify(private_nonce_payload_t *this) static status_t verify(private_nonce_payload_t *this)
{ {
@ -131,8 +126,7 @@ static status_t verify(private_nonce_payload_t *this)
} }
/** /**
* Implements nonce_payload_t's set_nonce function. * Implementation of nonce_payload_t.set_nonce.
* See #nonce_payload_t.set_nonce for description.
*/ */
static status_t set_nonce(private_nonce_payload_t *this, chunk_t nonce) static status_t set_nonce(private_nonce_payload_t *this, chunk_t nonce)
{ {
@ -140,10 +134,6 @@ static status_t set_nonce(private_nonce_payload_t *this, chunk_t nonce)
{ {
this->nonce.ptr = allocator_clone_bytes(nonce.ptr, nonce.len); this->nonce.ptr = allocator_clone_bytes(nonce.ptr, nonce.len);
if (this->nonce.ptr == NULL)
{
return OUT_OF_RES;
}
this->nonce.len = nonce.len; this->nonce.len = nonce.len;
this->payload_length = NONCE_PAYLOAD_HEADER_LENGTH + nonce.len; this->payload_length = NONCE_PAYLOAD_HEADER_LENGTH + nonce.len;
return SUCCESS; return SUCCESS;
@ -152,36 +142,25 @@ static status_t set_nonce(private_nonce_payload_t *this, chunk_t nonce)
} }
/** /**
* Implements nonce_payload_t's get_nonce function. * Implementation of nonce_payload_t.get_nonce.
* See #nonce_payload_t.get_nonce for description.
*/ */
static status_t get_nonce(private_nonce_payload_t *this, chunk_t *nonce) static void get_nonce(private_nonce_payload_t *this, chunk_t *nonce)
{ {
nonce->ptr = allocator_clone_bytes(this->nonce.ptr,this->nonce.len); nonce->ptr = allocator_clone_bytes(this->nonce.ptr,this->nonce.len);
if (nonce->ptr == NULL)
{
return OUT_OF_RES;
}
nonce->len = this->nonce.len; nonce->len = this->nonce.len;
return SUCCESS;
} }
/** /**
* Implements payload_t's get_encoding_rules function. * Implementation of nonce_payload_t.get_encoding_rules.
* See #payload_s.get_encoding_rules for description.
*/ */
static status_t get_encoding_rules(private_nonce_payload_t *this, encoding_rule_t **rules, size_t *rule_count) static void get_encoding_rules(private_nonce_payload_t *this, encoding_rule_t **rules, size_t *rule_count)
{ {
*rules = nonce_payload_encodings; *rules = nonce_payload_encodings;
*rule_count = sizeof(nonce_payload_encodings) / sizeof(encoding_rule_t); *rule_count = sizeof(nonce_payload_encodings) / sizeof(encoding_rule_t);
return SUCCESS;
} }
/** /**
* Implements payload_t's get_type function. * Implementation of payload_t.get_type.
* See #payload_s.get_type for description.
*/ */
static payload_type_t get_type(private_nonce_payload_t *this) static payload_type_t get_type(private_nonce_payload_t *this)
{ {
@ -189,8 +168,7 @@ static payload_type_t get_type(private_nonce_payload_t *this)
} }
/** /**
* Implements payload_t's get_next_type function. * Implementation of payload_t.get_next_type.
* See #payload_s.get_next_type for description.
*/ */
static payload_type_t get_next_type(private_nonce_payload_t *this) static payload_type_t get_next_type(private_nonce_payload_t *this)
{ {
@ -198,18 +176,15 @@ static payload_type_t get_next_type(private_nonce_payload_t *this)
} }
/** /**
* Implements payload_t's set_next_type function. * Implementation of payload_t.set_next_type.
* See #payload_s.set_next_type for description.
*/ */
static status_t set_next_type(private_nonce_payload_t *this,payload_type_t type) static void set_next_type(private_nonce_payload_t *this,payload_type_t type)
{ {
this->next_payload = type; this->next_payload = type;
return SUCCESS;
} }
/** /**
* Implements payload_t's get_length function. * Implementation of payload_t.get_length.
* See #payload_s.get_length for description.
*/ */
static size_t get_length(private_nonce_payload_t *this) static size_t get_length(private_nonce_payload_t *this)
{ {
@ -218,10 +193,9 @@ static size_t get_length(private_nonce_payload_t *this)
} }
/** /**
* Implements payload_t's and nonce_payload_t's destroy function. * Implementation of payload_t.destroy and nonce_payload_t.destroy.
* See #payload_s.destroy or nonce_payload_s.destroy for description.
*/ */
static status_t destroy(private_nonce_payload_t *this) static void destroy(private_nonce_payload_t *this)
{ {
if (this->nonce.ptr != NULL) if (this->nonce.ptr != NULL)
{ {
@ -229,7 +203,6 @@ static status_t destroy(private_nonce_payload_t *this)
} }
allocator_free(this); allocator_free(this);
return SUCCESS;
} }
/* /*
@ -238,24 +211,20 @@ static status_t destroy(private_nonce_payload_t *this)
nonce_payload_t *nonce_payload_create() nonce_payload_t *nonce_payload_create()
{ {
private_nonce_payload_t *this = allocator_alloc_thing(private_nonce_payload_t); private_nonce_payload_t *this = allocator_alloc_thing(private_nonce_payload_t);
if (this == NULL)
{
return NULL;
}
/* interface functions */ /* interface functions */
this->public.payload_interface.verify = (status_t (*) (payload_t *))verify; this->public.payload_interface.verify = (status_t (*) (payload_t *))verify;
this->public.payload_interface.get_encoding_rules = (status_t (*) (payload_t *, encoding_rule_t **, size_t *) ) get_encoding_rules; this->public.payload_interface.get_encoding_rules = (void (*) (payload_t *, encoding_rule_t **, size_t *) ) get_encoding_rules;
this->public.payload_interface.get_length = (size_t (*) (payload_t *)) get_length; this->public.payload_interface.get_length = (size_t (*) (payload_t *)) get_length;
this->public.payload_interface.get_next_type = (payload_type_t (*) (payload_t *)) get_next_type; this->public.payload_interface.get_next_type = (payload_type_t (*) (payload_t *)) get_next_type;
this->public.payload_interface.set_next_type = (status_t (*) (payload_t *,payload_type_t)) set_next_type; this->public.payload_interface.set_next_type = (void (*) (payload_t *,payload_type_t)) set_next_type;
this->public.payload_interface.get_type = (payload_type_t (*) (payload_t *)) get_type; this->public.payload_interface.get_type = (payload_type_t (*) (payload_t *)) get_type;
this->public.payload_interface.destroy = (status_t (*) (payload_t *))destroy; this->public.payload_interface.destroy = (void (*) (payload_t *))destroy;
/* public functions */ /* public functions */
this->public.destroy = (status_t (*) (nonce_payload_t *)) destroy; this->public.destroy = (void (*) (nonce_payload_t *)) destroy;
this->public.set_nonce = (status_t (*) (nonce_payload_t *,chunk_t)) set_nonce; this->public.set_nonce = (status_t (*) (nonce_payload_t *,chunk_t)) set_nonce;
this->public.get_nonce = (status_t (*) (nonce_payload_t *,chunk_t*)) get_nonce; this->public.get_nonce = (void (*) (nonce_payload_t *,chunk_t*)) get_nonce;
/* private variables */ /* private variables */
this->critical = FALSE; this->critical = FALSE;

View File

@ -1,9 +1,7 @@
/** /**
* @file nonce_payload.h * @file nonce_payload.h
* *
* @brief Declaration of the class nonce_payload_t. * @brief Interface of nonce_payload_t.
*
* An object of this type represents an IKEv2 Nonce-Payload.
* *
*/ */
@ -29,28 +27,32 @@
#include <encoding/payloads/payload.h> #include <encoding/payloads/payload.h>
/** /**
* length of a nonce payload without a nonce in int * Length of a nonce payload without a nonce in bytes.
*
* @ingroup payloads
*/ */
#define NONCE_PAYLOAD_HEADER_LENGTH 4 #define NONCE_PAYLOAD_HEADER_LENGTH 4
typedef struct nonce_payload_t nonce_payload_t; typedef struct nonce_payload_t nonce_payload_t;
/** /**
* Object representing an IKEv2 Nonce payload * Object representing an IKEv2 Nonce payload.
* *
* The Nonce payload format is described in draft section 3.3. * The Nonce payload format is described in draft section 3.3.
* *
* @ingroup payloads
*
*/ */
struct nonce_payload_t { struct nonce_payload_t {
/** /**
* implements payload_t interface * The payload_t interface.
*/ */
payload_t payload_interface; payload_t payload_interface;
/** /**
* @brief Set the nonce value. * @brief Set the nonce value.
* *
* The nonce must have length between 16 and 256 bytes * The nonce must have length between 16 and 256 bytes.
* *
* @param this calling nonce_payload_t object * @param this calling nonce_payload_t object
* @param nonce chunk containing the nonce, will be cloned * @param nonce chunk containing the nonce, will be cloned
@ -65,26 +67,23 @@ struct nonce_payload_t {
* *
* @param this calling nonce_payload_t object * @param this calling nonce_payload_t object
* @param[out] nonce chunk where nonce data is located (cloned) * @param[out] nonce chunk where nonce data is located (cloned)
* @return SUCCESS in any case
*/ */
status_t (*get_nonce) (nonce_payload_t *this, chunk_t *nonce); void (*get_nonce) (nonce_payload_t *this, chunk_t *nonce);
/** /**
* @brief Destroys an nonce_payload_t object. * @brief Destroys an nonce_payload_t object.
* *
* @param this nonce_payload_t object to destroy * @param this nonce_payload_t object to destroy
* @return
* SUCCESS in any case
*/ */
status_t (*destroy) (nonce_payload_t *this); void (*destroy) (nonce_payload_t *this);
}; };
/** /**
* @brief Creates an empty nonce_payload_t object * @brief Creates an empty nonce_payload_t object
* *
* @return * @return created nonce_payload_t object
* - created nonce_payload_t object, or *
* - NULL if failed * @ingroup payloads
*/ */
nonce_payload_t *nonce_payload_create(); nonce_payload_t *nonce_payload_create();

View File

@ -1,11 +1,7 @@
/** /**
* @file notify_payload.c * @file notify_payload.c
* *
* @brief Declaration of the class notify_payload_t. * @brief Implementation of notify_payload_t.
*
* An object of this type represents an IKEv2 Notify-Payload.
*
* See section 3.10 of Draft for details of this payload type.
* *
*/ */
@ -36,52 +32,52 @@
typedef struct private_notify_payload_t private_notify_payload_t; typedef struct private_notify_payload_t private_notify_payload_t;
/** /**
* Private data of an notify_payload_t Object * Private data of an notify_payload_t object.
* *
*/ */
struct private_notify_payload_t { struct private_notify_payload_t {
/** /**
* public notify_payload_t interface * Public notify_payload_t interface.
*/ */
notify_payload_t public; notify_payload_t public;
/** /**
* next payload type * Next payload type.
*/ */
u_int8_t next_payload; u_int8_t next_payload;
/** /**
* Critical flag * Critical flag.
*/ */
bool critical; bool critical;
/** /**
* Length of this payload * Length of this payload.
*/ */
u_int16_t payload_length; u_int16_t payload_length;
/** /**
* protocol id * Protocol id.
*/ */
u_int8_t protocol_id; u_int8_t protocol_id;
/** /**
* spi size * Spi size.
*/ */
u_int8_t spi_size; u_int8_t spi_size;
/** /**
* notify message type * Notify message type.
*/ */
u_int16_t notify_message_type; u_int16_t notify_message_type;
/** /**
* Security parameter index (spi) * Security parameter index (spi).
*/ */
chunk_t spi; chunk_t spi;
/** /**
* Notification data * Notification data.
*/ */
chunk_t notification_data; chunk_t notification_data;
@ -89,14 +85,12 @@ struct private_notify_payload_t {
* @brief Computes the length of this payload. * @brief Computes the length of this payload.
* *
* @param this calling private_ke_payload_t object * @param this calling private_ke_payload_t object
* @return
* SUCCESS in any case
*/ */
status_t (*compute_length) (private_notify_payload_t *this); void (*compute_length) (private_notify_payload_t *this);
}; };
/** /**
* Encoding rules to parse or generate a IKEv2-Notify Payload * Encoding rules to parse or generate a IKEv2-Notify Payload.
* *
* The defined offsets are the positions in a object of type * The defined offsets are the positions in a object of type
* private_notify_payload_t. * private_notify_payload_t.
@ -148,8 +142,7 @@ encoding_rule_t notify_payload_encodings[] = {
*/ */
/** /**
* Implements payload_t's verify function. * Implementation of payload_t.verify.
* See #payload_s.verify for description.
*/ */
static status_t verify(private_notify_payload_t *this) static status_t verify(private_notify_payload_t *this)
{ {
@ -170,19 +163,16 @@ static status_t verify(private_notify_payload_t *this)
} }
/** /**
* Implements payload_t's get_encoding_rules function. * Implementation of payload_t.get_encoding_rules.
* See #payload_s.get_encoding_rules for description.
*/ */
static status_t get_encoding_rules(private_notify_payload_t *this, encoding_rule_t **rules, size_t *rule_count) static void get_encoding_rules(private_notify_payload_t *this, encoding_rule_t **rules, size_t *rule_count)
{ {
*rules = notify_payload_encodings; *rules = notify_payload_encodings;
*rule_count = sizeof(notify_payload_encodings) / sizeof(encoding_rule_t); *rule_count = sizeof(notify_payload_encodings) / sizeof(encoding_rule_t);
return SUCCESS;
} }
/** /**
* Implements payload_t's get_type function. * Implementation of payload_t.get_type.
* See #payload_s.get_type for description.
*/ */
static payload_type_t get_type(private_notify_payload_t *this) static payload_type_t get_type(private_notify_payload_t *this)
{ {
@ -190,8 +180,7 @@ static payload_type_t get_type(private_notify_payload_t *this)
} }
/** /**
* Implements payload_t's get_next_type function. * Implementation of payload_t.get_next_type.
* See #payload_s.get_next_type for description.
*/ */
static payload_type_t get_next_type(private_notify_payload_t *this) static payload_type_t get_next_type(private_notify_payload_t *this)
{ {
@ -199,18 +188,15 @@ static payload_type_t get_next_type(private_notify_payload_t *this)
} }
/** /**
* Implements payload_t's set_next_type function. * Implementation of payload_t.set_next_type.
* See #payload_s.set_next_type for description.
*/ */
static status_t set_next_type(private_notify_payload_t *this,payload_type_t type) static void set_next_type(private_notify_payload_t *this,payload_type_t type)
{ {
this->next_payload = type; this->next_payload = type;
return SUCCESS;
} }
/** /**
* Implements payload_t's get_length function. * Implementation of payload_t.get_length.
* See #payload_s.get_length for description.
*/ */
static size_t get_length(private_notify_payload_t *this) static size_t get_length(private_notify_payload_t *this)
{ {
@ -219,10 +205,9 @@ static size_t get_length(private_notify_payload_t *this)
} }
/** /**
* Implements private_ke_payload_t's compute_length function. * Implementation of private_notify_payload_t.compute_length.
* See #private_ke_payload_s.compute_length for description.
*/ */
static status_t compute_length (private_notify_payload_t *this) static void compute_length (private_notify_payload_t *this)
{ {
size_t length = NOTIFY_PAYLOAD_HEADER_LENGTH; size_t length = NOTIFY_PAYLOAD_HEADER_LENGTH;
if (this->notification_data.ptr != NULL) if (this->notification_data.ptr != NULL)
@ -235,63 +220,53 @@ static status_t compute_length (private_notify_payload_t *this)
} }
this->payload_length = length; this->payload_length = length;
return SUCCESS;
} }
/** /**
* Implements notify_payload_t's get_protocol_id function. * Implementation of notify_payload_t.get_protocol_id.
* See #notify_payload_s.get_protocol_id for description.
*/ */
u_int8_t get_protocol_id(private_notify_payload_t *this) static u_int8_t get_protocol_id(private_notify_payload_t *this)
{ {
return this->protocol_id; return this->protocol_id;
} }
/** /**
* Implements notify_payload_t's set_protocol_id function. * Implementation of notify_payload_t.set_protocol_id.
* See #notify_payload_s.set_protocol_id for description.
*/ */
status_t set_protocol_id(private_notify_payload_t *this, u_int8_t protocol_id) static void set_protocol_id(private_notify_payload_t *this, u_int8_t protocol_id)
{ {
this->protocol_id = protocol_id; this->protocol_id = protocol_id;
return SUCCESS;
} }
/** /**
* Implements notify_payload_t's get_notification_data function. * Implementation of notify_payload_t.get_notify_message_type.
* See #notify_payload_s.get_notification_data for description.
*/ */
u_int16_t get_notify_message_type(private_notify_payload_t *this) static u_int16_t get_notify_message_type(private_notify_payload_t *this)
{ {
return this->notify_message_type; return this->notify_message_type;
} }
/** /**
* Implements notify_payload_t's get_notification_data function. * Implementation of notify_payload_t.set_notify_message_type.
* See #notify_payload_s.get_notification_data for description.
*/ */
status_t set_notify_message_type(private_notify_payload_t *this, u_int16_t notify_message_type) static void set_notify_message_type(private_notify_payload_t *this, u_int16_t notify_message_type)
{ {
this->notify_message_type = notify_message_type; this->notify_message_type = notify_message_type;
return SUCCESS;
} }
/** /**
* Implements notify_payload_t's get_spi function. * Implementation of notify_payload_t.get_spi.
* See #notify_payload_s.get_spi for description.
*/ */
chunk_t get_spi(private_notify_payload_t *this) static chunk_t get_spi(private_notify_payload_t *this)
{ {
return (this->spi); return (this->spi);
} }
/** /**
* Implements notify_payload_t's set_spi function. * Implementation of notify_payload_t.set_spi.
* See #notify_payload_s.set_spi for description.
*/ */
status_t set_spi(private_notify_payload_t *this, chunk_t spi) static void set_spi(private_notify_payload_t *this, chunk_t spi)
{ {
/* destroy existing data first */ /* destroy existing data first */
if (this->spi.ptr != NULL) if (this->spi.ptr != NULL)
@ -304,32 +279,25 @@ status_t set_spi(private_notify_payload_t *this, chunk_t spi)
} }
this->spi.ptr = allocator_clone_bytes(spi.ptr,spi.len); this->spi.ptr = allocator_clone_bytes(spi.ptr,spi.len);
if (this->spi.ptr == NULL)
{
return OUT_OF_RES;
}
this->spi.len = spi.len; this->spi.len = spi.len;
this->spi_size = spi.len; this->spi_size = spi.len;
this->compute_length(this); this->compute_length(this);
return SUCCESS;
} }
/** /**
* Implements notify_payload_t's get_notification_data function. * Implementation of notify_payload_t.get_notification_data.
* See #notify_payload_s.get_notification_data for description.
*/ */
chunk_t get_notification_data(private_notify_payload_t *this) static chunk_t get_notification_data(private_notify_payload_t *this)
{ {
return (this->notification_data); return (this->notification_data);
} }
/** /**
* Implements notify_payload_t's get_notification_data function. * Implementation of notify_payload_t.set_notification_data.
* See #notify_payload_s.get_notification_data for description.
*/ */
status_t set_notification_data(private_notify_payload_t *this, chunk_t notification_data) static status_t set_notification_data(private_notify_payload_t *this, chunk_t notification_data)
{ {
/* destroy existing data first */ /* destroy existing data first */
if (this->notification_data.ptr != NULL) if (this->notification_data.ptr != NULL)
@ -342,10 +310,6 @@ status_t set_notification_data(private_notify_payload_t *this, chunk_t notificat
} }
this->notification_data.ptr = allocator_clone_bytes(notification_data.ptr,notification_data.len); this->notification_data.ptr = allocator_clone_bytes(notification_data.ptr,notification_data.len);
if (this->notification_data.ptr == NULL)
{
return OUT_OF_RES;
}
this->notification_data.len = notification_data.len; this->notification_data.len = notification_data.len;
this->compute_length(this); this->compute_length(this);
@ -353,8 +317,7 @@ status_t set_notification_data(private_notify_payload_t *this, chunk_t notificat
} }
/** /**
* Implements payload_t's and notify_payload_t's destroy function. * Implementation of notify_payload_t.destroy and notify_payload_t.destroy.
* See #payload_s.destroy or notify_payload_s.destroy for description.
*/ */
static status_t destroy(private_notify_payload_t *this) static status_t destroy(private_notify_payload_t *this)
{ {
@ -377,29 +340,26 @@ static status_t destroy(private_notify_payload_t *this)
notify_payload_t *notify_payload_create() notify_payload_t *notify_payload_create()
{ {
private_notify_payload_t *this = allocator_alloc_thing(private_notify_payload_t); private_notify_payload_t *this = allocator_alloc_thing(private_notify_payload_t);
if (this == NULL)
{
return NULL;
}
/* interface functions */ /* interface functions */
this->public.payload_interface.verify = (status_t (*) (payload_t *))verify; this->public.payload_interface.verify = (status_t (*) (payload_t *))verify;
this->public.payload_interface.get_encoding_rules = (status_t (*) (payload_t *, encoding_rule_t **, size_t *) ) get_encoding_rules; this->public.payload_interface.get_encoding_rules = (void (*) (payload_t *, encoding_rule_t **, size_t *) ) get_encoding_rules;
this->public.payload_interface.get_length = (size_t (*) (payload_t *)) get_length; this->public.payload_interface.get_length = (size_t (*) (payload_t *)) get_length;
this->public.payload_interface.get_next_type = (payload_type_t (*) (payload_t *)) get_next_type; this->public.payload_interface.get_next_type = (payload_type_t (*) (payload_t *)) get_next_type;
this->public.payload_interface.set_next_type = (status_t (*) (payload_t *,payload_type_t)) set_next_type; this->public.payload_interface.set_next_type = (void (*) (payload_t *,payload_type_t)) set_next_type;
this->public.payload_interface.get_type = (payload_type_t (*) (payload_t *)) get_type; this->public.payload_interface.get_type = (payload_type_t (*) (payload_t *)) get_type;
this->public.payload_interface.destroy = (status_t (*) (payload_t *))destroy; this->public.payload_interface.destroy = (void (*) (payload_t *))destroy;
/* public functions */ /* public functions */
this->public.get_protocol_id = (u_int8_t (*) (notify_payload_t *)) get_protocol_id; this->public.get_protocol_id = (u_int8_t (*) (notify_payload_t *)) get_protocol_id;
this->public.set_protocol_id = (status_t (*) (notify_payload_t *,u_int8_t)) set_protocol_id; this->public.set_protocol_id = (void (*) (notify_payload_t *,u_int8_t)) set_protocol_id;
this->public.get_notify_message_type = (u_int16_t (*) (notify_payload_t *)) get_notify_message_type; this->public.get_notify_message_type = (u_int16_t (*) (notify_payload_t *)) get_notify_message_type;
this->public.set_notify_message_type = (status_t (*) (notify_payload_t *,u_int16_t)) set_notify_message_type; this->public.set_notify_message_type = (void (*) (notify_payload_t *,u_int16_t)) set_notify_message_type;
this->public.get_spi = (chunk_t (*) (notify_payload_t *)) get_spi; this->public.get_spi = (chunk_t (*) (notify_payload_t *)) get_spi;
this->public.set_spi = (status_t (*) (notify_payload_t *,chunk_t)) set_spi; this->public.set_spi = (void (*) (notify_payload_t *,chunk_t)) set_spi;
this->public.get_notification_data = (chunk_t (*) (notify_payload_t *)) get_notification_data; this->public.get_notification_data = (chunk_t (*) (notify_payload_t *)) get_notification_data;
this->public.set_notification_data = (status_t (*) (notify_payload_t *,chunk_t)) set_notification_data; this->public.set_notification_data = (void (*) (notify_payload_t *,chunk_t)) set_notification_data;
this->public.destroy = (status_t (*) (notify_payload_t *)) destroy; this->public.destroy = (void (*) (notify_payload_t *)) destroy;
/* private functions */ /* private functions */
this->compute_length = compute_length; this->compute_length = compute_length;

View File

@ -1,11 +1,7 @@
/** /**
* @file notify_payload.h * @file notify_payload.h
* *
* @brief Declaration of the class notify_payload_t. * @brief Interface of notify_payload_t.
*
* An object of this type represents an IKEv2 Notify-Payload.
*
* See section 3.10 of Draft for details of this payload type.
* *
*/ */
@ -33,26 +29,32 @@
#include <utils/linked_list.h> #include <utils/linked_list.h>
/** /**
* Critical flag must not be set * Critical flag must not be set.
*
* @ingroup payloads
*/ */
#define NOTIFY_PAYLOAD_CRITICAL_FLAG FALSE; #define NOTIFY_PAYLOAD_CRITICAL_FLAG FALSE;
/** /**
* Notify payload length in bytes without any spi and notification data * Notify payload length in bytes without any spi and notification data.
*
* @ingroup payloads
*/ */
#define NOTIFY_PAYLOAD_HEADER_LENGTH 8 #define NOTIFY_PAYLOAD_HEADER_LENGTH 8
typedef struct notify_payload_t notify_payload_t; typedef struct notify_payload_t notify_payload_t;
/** /**
* Object representing an IKEv2-Notify Payload * Object representing an IKEv2-Notify Payload.
* *
* The Notify Payload format is described in Draft section 3.10. * The Notify Payload format is described in Draft section 3.10.
* *
*
* @ingroup payloads
*/ */
struct notify_payload_t { struct notify_payload_t {
/** /**
* implements payload_t interface * The payload_t interface.
*/ */
payload_t payload_interface; payload_t payload_interface;
@ -69,9 +71,8 @@ struct notify_payload_t {
* *
* @param this calling notify_payload_t object * @param this calling notify_payload_t object
* @param protocol_id protocol id to set * @param protocol_id protocol id to set
* @return SUCCESS
*/ */
status_t (*set_protocol_id) (notify_payload_t *this, u_int8_t protocol_id); void (*set_protocol_id) (notify_payload_t *this, u_int8_t protocol_id);
/** /**
* @brief Gets the notify message type of this payload. * @brief Gets the notify message type of this payload.
@ -86,9 +87,8 @@ struct notify_payload_t {
* *
* @param this calling notify_payload_t object * @param this calling notify_payload_t object
* @param notify_message_type notify message type to set * @param notify_message_type notify message type to set
* @return SUCCESS
*/ */
status_t (*set_notify_message_type) (notify_payload_t *this, u_int16_t notify_message_type); void (*set_notify_message_type) (notify_payload_t *this, u_int16_t notify_message_type);
/** /**
* @brief Returns the currently set spi of this payload. * @brief Returns the currently set spi of this payload.
@ -107,11 +107,8 @@ struct notify_payload_t {
* *
* @param this calling notify_payload_t object * @param this calling notify_payload_t object
* @param spi chunk_t pointing to the value to set * @param spi chunk_t pointing to the value to set
* @return
* - SUCCESS or
* - OUT_OF_RES
*/ */
status_t (*set_spi) (notify_payload_t *this, chunk_t spi); void (*set_spi) (notify_payload_t *this, chunk_t spi);
/** /**
* @brief Returns the currently set notification data of payload. * @brief Returns the currently set notification data of payload.
@ -130,28 +127,23 @@ struct notify_payload_t {
* *
* @param this calling notify_payload_t object * @param this calling notify_payload_t object
* @param notification_data chunk_t pointing to the value to set * @param notification_data chunk_t pointing to the value to set
* @return
* - SUCCESS or
* - OUT_OF_RES
*/ */
status_t (*set_notification_data) (notify_payload_t *this, chunk_t notification_data); void (*set_notification_data) (notify_payload_t *this, chunk_t notification_data);
/** /**
* @brief Destroys an notify_payload_t object. * @brief Destroys an notify_payload_t object.
* *
* @param this notify_payload_t object to destroy * @param this notify_payload_t object to destroy
* @return
* SUCCESS in any case
*/ */
status_t (*destroy) (notify_payload_t *this); void (*destroy) (notify_payload_t *this);
}; };
/** /**
* @brief Creates an empty notify_payload_t object * @brief Creates an empty notify_payload_t object
* *
* @return * @return created notify_payload_t object
* - created notify_payload_t object, or *
* - NULL if failed * @ingroup payloads
*/ */
notify_payload_t *notify_payload_create(); notify_payload_t *notify_payload_create();

View File

@ -1,7 +1,7 @@
/** /**
* @file payload.h * @file payload.h
* *
* @brief Generic payload interface * @brief Generic payload interface.
* *
* *
*/ */
@ -32,11 +32,13 @@
typedef enum payload_type_t payload_type_t; typedef enum payload_type_t payload_type_t;
/** /**
* Payload-Types of a IKEv2-Message * Payload-Types of a IKEv2-Message.
* *
* *
* Header and substructures are also defined as * Header and substructures are also defined as
* payload types with values from PRIVATE USE space. * payload types with values from PRIVATE USE space.
*
* @ingroup payloads
*/ */
enum payload_type_t{ enum payload_type_t{
@ -49,69 +51,84 @@ enum payload_type_t{
* SA * SA
*/ */
SECURITY_ASSOCIATION = 33, SECURITY_ASSOCIATION = 33,
/** /**
* KE * KE
*/ */
KEY_EXCHANGE = 34, KEY_EXCHANGE = 34,
/** /**
* IDi * IDi
*/ */
ID_INITIATOR = 35, ID_INITIATOR = 35,
/** /**
* IDr * IDr
*/ */
ID_RESPONDER = 36, ID_RESPONDER = 36,
/** /**
* CERT * CERT
*/ */
CERTIFICATE = 37, CERTIFICATE = 37,
/** /**
* CERTREQ * CERTREQ
*/ */
CERTIFICATE_REQUEST = 38, CERTIFICATE_REQUEST = 38,
/** /**
* AUTH * AUTH
*/ */
AUTHENTICATION = 39, AUTHENTICATION = 39,
/** /**
* Ni, Nr * Ni, Nr
*/ */
NONCE = 40, NONCE = 40,
/** /**
* N * N
*/ */
NOTIFY = 41, NOTIFY = 41,
/** /**
* D * D
*/ */
DELETE = 42, DELETE = 42,
/** /**
* V * V
*/ */
VENDOR_ID = 43, VENDOR_ID = 43,
/** /**
* TSi * TSi
*/ */
TRAFFIC_SELECTOR_INITIATOR = 44, TRAFFIC_SELECTOR_INITIATOR = 44,
/** /**
* TSr * TSr
*/ */
TRAFFIC_SELECTOR_RESPONDER = 45, TRAFFIC_SELECTOR_RESPONDER = 45,
/** /**
* E * E
*/ */
ENCRYPTED = 46, ENCRYPTED = 46,
/** /**
* CP * CP
*/ */
CONFIGURATION = 47, CONFIGURATION = 47,
/** /**
* EAP * EAP
*/ */
EXTENSIBLE_AUTHENTICATION = 48, EXTENSIBLE_AUTHENTICATION = 48,
/** /**
* Header has a value of PRIVATE USE space * Header has a value of PRIVATE USE space.
* *
* This payload type is not send over wire and just * This payload type is not send over wire and just
* used internally to handle IKEv2-Header like a payload. * used internally to handle IKEv2-Header like a payload.
@ -119,7 +136,7 @@ enum payload_type_t{
HEADER = 140, HEADER = 140,
/** /**
* PROPOSAL_SUBSTRUCTURE has a value of PRIVATE USE space * PROPOSAL_SUBSTRUCTURE has a value of PRIVATE USE space.
* *
* This payload type is not send over wire and just * This payload type is not send over wire and just
* used internally to handle a proposal substructure like a payload. * used internally to handle a proposal substructure like a payload.
@ -127,7 +144,7 @@ enum payload_type_t{
PROPOSAL_SUBSTRUCTURE = 141, PROPOSAL_SUBSTRUCTURE = 141,
/** /**
* TRANSFORM_SUBSTRUCTURE has a value of PRIVATE USE space * TRANSFORM_SUBSTRUCTURE has a value of PRIVATE USE space.
* *
* This payload type is not send over wire and just * This payload type is not send over wire and just
* used internally to handle a transform substructure like a payload. * used internally to handle a transform substructure like a payload.
@ -135,7 +152,7 @@ enum payload_type_t{
TRANSFORM_SUBSTRUCTURE = 142, TRANSFORM_SUBSTRUCTURE = 142,
/** /**
* TRANSFORM_ATTRIBUTE has a value of PRIVATE USE space * TRANSFORM_ATTRIBUTE has a value of PRIVATE USE space.
* *
* This payload type is not send over wire and just * This payload type is not send over wire and just
* used internally to handle a transform attribute like a payload. * used internally to handle a transform attribute like a payload.
@ -145,7 +162,7 @@ enum payload_type_t{
/* /*
* build string mapping array for payload_type_t * Build string mapping array for payload_type_t.
*/ */
extern mapping_t payload_type_m[]; extern mapping_t payload_type_m[];
@ -154,19 +171,17 @@ typedef struct payload_t payload_t;
/** /**
* @brief Generic interface for all payload types (inclusive * @brief Generic interface for all payload types (inclusive
* header and substructures) * header and substructures).
*
* *
* @ingroup payloads
*/ */
struct payload_t { struct payload_t {
/** /**
* @brief Destroys a payload and all included substructures. * @brief Destroys a payload and all included substructures.
* *
* @param this payload to destroy * @param this payload to destroy
* @return
* SUCCESS in any case
*/ */
status_t (*destroy) (payload_t *this); void (*destroy) (payload_t *this);
/** /**
* @brief Get encoding rules for this payload * @brief Get encoding rules for this payload
@ -174,10 +189,8 @@ struct payload_t {
* @param this calling object * @param this calling object
* @param[out] rules location to store pointer of first rule * @param[out] rules location to store pointer of first rule
* @param[out] rule_count location to store number of rules * @param[out] rule_count location to store number of rules
* @return
* SUCCESS in any case
*/ */
status_t (*get_encoding_rules) (payload_t *this, encoding_rule_t **rules, size_t *rule_count); void (*get_encoding_rules) (payload_t *this, encoding_rule_t **rules, size_t *rule_count);
/** /**
* @brief get type of payload * @brief get type of payload
@ -200,9 +213,8 @@ struct payload_t {
* *
* @param this calling object * @param this calling object
* @param type type of next payload * @param type type of next payload
* @return SUCCESS in any case
*/ */
status_t (*set_next_type) (payload_t *this,payload_type_t type); void (*set_next_type) (payload_t *this,payload_type_t type);
/** /**
* @brief get length of payload * @brief get length of payload
@ -230,9 +242,7 @@ struct payload_t {
* It supports all payload_t methods. * It supports all payload_t methods.
* *
* @param type type of the payload to create * @param type type of the payload to create
* @return * @return created payload
* - created payload, or
* - NULL if failed
*/ */
payload_t *payload_create(payload_type_t type); payload_t *payload_create(payload_type_t type);

View File

@ -1,9 +1,7 @@
/** /**
* @file proposal_substructure.h * @file proposal_substructure.h
* *
* @brief Declaration of the class proposal_substructure_t. * @brief Implementation of proposal_substructure_t.
*
* An object of this type represents an IKEv2 PROPOSAL Substructure and contains transforms.
* *
*/ */
@ -36,54 +34,52 @@
typedef struct private_proposal_substructure_t private_proposal_substructure_t; typedef struct private_proposal_substructure_t private_proposal_substructure_t;
/** /**
* Private data of an proposal_substructure_t' Object * Private data of an proposal_substructure_t object.
* *
*/ */
struct private_proposal_substructure_t { struct private_proposal_substructure_t {
/** /**
* public proposal_substructure_t interface * Public proposal_substructure_t interface.
*/ */
proposal_substructure_t public; proposal_substructure_t public;
/** /**
* next payload type * Next payload type.
*/ */
u_int8_t next_payload; u_int8_t next_payload;
/** /**
* Length of this payload * Length of this payload.
*/ */
u_int16_t proposal_length; u_int16_t proposal_length;
/** /**
* Proposal number * Proposal number.
*/ */
u_int8_t proposal_number; u_int8_t proposal_number;
/** /**
* Protocol ID * Protocol ID.
*/ */
u_int8_t protocol_id; u_int8_t protocol_id;
/** /**
* SPI size of the following SPI * SPI size of the following SPI.
*/ */
u_int8_t spi_size; u_int8_t spi_size;
/** /**
* Number of transforms * Number of transforms.
*/ */
u_int8_t transforms_count; u_int8_t transforms_count;
/** /**
* SPI is stored as chunk * SPI is stored as chunk.
*/ */
chunk_t spi; chunk_t spi;
/** /**
* Transforms are stored in a linked_list_t * Transforms are stored in a linked_list_t.
*/ */
linked_list_t * transforms; linked_list_t * transforms;
@ -91,14 +87,12 @@ struct private_proposal_substructure_t {
* @brief Computes the length of this substructure. * @brief Computes the length of this substructure.
* *
* @param this calling private_proposal_substructure_t object * @param this calling private_proposal_substructure_t object
* @return
* SUCCESS in any case
*/ */
status_t (*compute_length) (private_proposal_substructure_t *this); void (*compute_length) (private_proposal_substructure_t *this);
}; };
/** /**
* Encoding rules to parse or generate a Proposal substructure * Encoding rules to parse or generate a Proposal substructure.
* *
* The defined offsets are the positions in a object of type * The defined offsets are the positions in a object of type
* private_proposal_substructure_t. * private_proposal_substructure_t.
@ -143,8 +137,7 @@ encoding_rule_t proposal_substructure_encodings[] = {
*/ */
/** /**
* Implements payload_t's verify function. * Implementation of payload_t.verify.
* See #payload_s.verify for description.
*/ */
static status_t verify(private_proposal_substructure_t *this) static status_t verify(private_proposal_substructure_t *this)
{ {
@ -170,20 +163,16 @@ static status_t verify(private_proposal_substructure_t *this)
} }
/** /**
* Implements payload_t's get_encoding_rules function. * Implementation of payload_t.get_encoding_rules.
* See #payload_s.get_encoding_rules for description.
*/ */
static status_t get_encoding_rules(private_proposal_substructure_t *this, encoding_rule_t **rules, size_t *rule_count) static void get_encoding_rules(private_proposal_substructure_t *this, encoding_rule_t **rules, size_t *rule_count)
{ {
*rules = proposal_substructure_encodings; *rules = proposal_substructure_encodings;
*rule_count = sizeof(proposal_substructure_encodings) / sizeof(encoding_rule_t); *rule_count = sizeof(proposal_substructure_encodings) / sizeof(encoding_rule_t);
return SUCCESS;
} }
/** /**
* Implements payload_t's get_type function. * Implementation of payload_t.get_type.
* See #payload_s.get_type for description.
*/ */
static payload_type_t get_type(private_proposal_substructure_t *this) static payload_type_t get_type(private_proposal_substructure_t *this)
{ {
@ -191,8 +180,7 @@ static payload_type_t get_type(private_proposal_substructure_t *this)
} }
/** /**
* Implements payload_t's get_next_type function. * Implementation of payload_t.get_next_type.
* See #payload_s.get_next_type for description.
*/ */
static payload_type_t get_next_type(private_proposal_substructure_t *this) static payload_type_t get_next_type(private_proposal_substructure_t *this)
{ {
@ -200,17 +188,14 @@ static payload_type_t get_next_type(private_proposal_substructure_t *this)
} }
/** /**
* Implements payload_t's set_next_type function. * Implementation of payload_t.set_next_type.
* See #payload_s.set_next_type for description.
*/ */
static status_t set_next_type(private_proposal_substructure_t *this,payload_type_t type) static void set_next_type(private_proposal_substructure_t *this,payload_type_t type)
{ {
return SUCCESS;
} }
/** /**
* Implements payload_t's get_length function. * Implementation of payload_t.get_length.
* See #payload_s.get_length for description.
*/ */
static size_t get_length(private_proposal_substructure_t *this) static size_t get_length(private_proposal_substructure_t *this)
{ {
@ -218,19 +203,17 @@ static size_t get_length(private_proposal_substructure_t *this)
} }
/** /**
* Implements proposal_substructure_t's create_transform_substructure_iterator function. * Implementation of proposal_substructure_t.create_transform_substructure_iterator.
* See #proposal_substructure_s.create_transform_substructure_iterator for description.
*/ */
static status_t create_transform_substructure_iterator (private_proposal_substructure_t *this,iterator_t **iterator,bool forward) static void create_transform_substructure_iterator (private_proposal_substructure_t *this,iterator_t **iterator,bool forward)
{ {
return (this->transforms->create_iterator(this->transforms,iterator,forward)); this->transforms->create_iterator(this->transforms,iterator,forward);
} }
/** /**
* Implements proposal_substructure_t's add_transform_substructure function. * Implementation of proposal_substructure_t.add_transform_substructure.
* See #proposal_substructure_s.add_transform_substructure for description.
*/ */
static status_t add_transform_substructure (private_proposal_substructure_t *this,transform_substructure_t *transform) static void add_transform_substructure (private_proposal_substructure_t *this,transform_substructure_t *transform)
{ {
status_t status; status_t status;
if (this->transforms->get_count(this->transforms) > 0) if (this->transforms->get_count(this->transforms) > 0)
@ -243,24 +226,20 @@ static status_t add_transform_substructure (private_proposal_substructure_t *thi
} }
transform->set_is_last_transform(transform,TRUE); transform->set_is_last_transform(transform,TRUE);
status = this->transforms->insert_last(this->transforms,(void *) transform); this->transforms->insert_last(this->transforms,(void *) transform);
this->compute_length(this); this->compute_length(this);
return status;
} }
/** /**
* Implements proposal_substructure_t's set_proposal_number function. * Implementation of proposal_substructure_t.set_proposal_number.
* See #proposal_substructure_s.set_proposal_number for description.
*/ */
static status_t set_proposal_number(private_proposal_substructure_t *this,u_int8_t proposal_number) static void set_proposal_number(private_proposal_substructure_t *this,u_int8_t proposal_number)
{ {
this->proposal_number = proposal_number; this->proposal_number = proposal_number;
return SUCCESS;
} }
/** /**
* Implements proposal_substructure_t's get_proposal_number function. * Implementation of proposal_substructure_t.get_proposal_number.
* See #proposal_substructure_s.get_proposal_number for description.
*/ */
static u_int8_t get_proposal_number (private_proposal_substructure_t *this) static u_int8_t get_proposal_number (private_proposal_substructure_t *this)
{ {
@ -268,30 +247,25 @@ static u_int8_t get_proposal_number (private_proposal_substructure_t *this)
} }
/** /**
* Implements proposal_substructure_t's set_protocol_id function. * Implementation of proposal_substructure_t.set_protocol_id.
* See #proposal_substructure_s.set_protocol_id for description.
*/ */
static status_t set_protocol_id(private_proposal_substructure_t *this,u_int8_t protocol_id) static void set_protocol_id(private_proposal_substructure_t *this,u_int8_t protocol_id)
{ {
this->protocol_id = protocol_id; this->protocol_id = protocol_id;
return SUCCESS;
} }
/** /**
* Implements proposal_substructure_t's get_protocol_id function. * Implementation of proposal_substructure_t.get_protocol_id.
* See #proposal_substructure_s.get_protocol_id for description.
*/ */
static u_int8_t get_protocol_id (private_proposal_substructure_t *this) static u_int8_t get_protocol_id (private_proposal_substructure_t *this)
{ {
return (this->protocol_id); return (this->protocol_id);
} }
/** /**
* Implements proposal_substructure_t's set_spi function. * Implementation of proposal_substructure_t.set_spi.
* See #proposal_substructure_s.set_spi for description.
*/ */
static status_t set_spi (private_proposal_substructure_t *this, chunk_t spi) static void set_spi (private_proposal_substructure_t *this, chunk_t spi)
{ {
/* first delete already set spi value */ /* first delete already set spi value */
if (this->spi.ptr != NULL) if (this->spi.ptr != NULL)
@ -303,20 +277,13 @@ static status_t set_spi (private_proposal_substructure_t *this, chunk_t spi)
} }
this->spi.ptr = allocator_clone_bytes(spi.ptr,spi.len); this->spi.ptr = allocator_clone_bytes(spi.ptr,spi.len);
if (this->spi.ptr == NULL)
{
return OUT_OF_RES;
}
this->spi.len = spi.len; this->spi.len = spi.len;
this->spi_size = spi.len; this->spi_size = spi.len;
this->compute_length(this); this->compute_length(this);
return SUCCESS;
} }
/** /**
* Implements proposal_substructure_t's get_spi function. * Implementation of proposal_substructure_t.get_spi.
* See #proposal_substructure_s.get_spi for description.
*/ */
static chunk_t get_spi (private_proposal_substructure_t *this) static chunk_t get_spi (private_proposal_substructure_t *this)
{ {
@ -327,6 +294,9 @@ static chunk_t get_spi (private_proposal_substructure_t *this)
return spi; return spi;
} }
/**
* Implementation of proposal_substructure_t.get_info_for_transform_type.
*/
static status_t get_info_for_transform_type (private_proposal_substructure_t *this,transform_type_t type, u_int16_t *transform_id, u_int16_t *key_length) static status_t get_info_for_transform_type (private_proposal_substructure_t *this,transform_type_t type, u_int16_t *transform_id, u_int16_t *key_length)
{ {
iterator_t *iterator; iterator_t *iterator;
@ -334,11 +304,8 @@ static status_t get_info_for_transform_type (private_proposal_substructure_t *th
u_int16_t found_transform_id; u_int16_t found_transform_id;
u_int16_t found_key_length; u_int16_t found_key_length;
status = this->transforms->create_iterator(this->transforms,&iterator,TRUE); this->transforms->create_iterator(this->transforms,&iterator,TRUE);
if (status != SUCCESS)
{
return status;
}
while (iterator->has_next(iterator)) while (iterator->has_next(iterator))
{ {
transform_substructure_t *current_transform; transform_substructure_t *current_transform;
@ -359,24 +326,18 @@ static status_t get_info_for_transform_type (private_proposal_substructure_t *th
} }
} }
iterator->destroy(iterator); iterator->destroy(iterator);
return FAILED; return NOT_FOUND;
} }
/** /**
* Implements private_proposal_substructure_t's compute_length function. * Implementation of private_proposal_substructure_t.compute_length.
* See #private_proposal_substructure_s.compute_length for description.
*/ */
static status_t compute_length (private_proposal_substructure_t *this) static void compute_length (private_proposal_substructure_t *this)
{ {
iterator_t *iterator; iterator_t *iterator;
status_t status;
size_t transforms_count = 0; size_t transforms_count = 0;
size_t length = PROPOSAL_SUBSTRUCTURE_HEADER_LENGTH; size_t length = PROPOSAL_SUBSTRUCTURE_HEADER_LENGTH;
status = this->transforms->create_iterator(this->transforms,&iterator,TRUE); this->transforms->create_iterator(this->transforms,&iterator,TRUE);
if (status != SUCCESS)
{
return length;
}
while (iterator->has_next(iterator)) while (iterator->has_next(iterator))
{ {
payload_t * current_transform; payload_t * current_transform;
@ -390,18 +351,15 @@ static status_t compute_length (private_proposal_substructure_t *this)
this->transforms_count= transforms_count; this->transforms_count= transforms_count;
this->proposal_length = length; this->proposal_length = length;
return SUCCESS;
} }
/** /**
* Implements proposal_substructure_t's clone function. * Implementation of proposal_substructure_t.clone.
* See #proposal_substructure_s.clone for description.
*/ */
static status_t clone(private_proposal_substructure_t *this, private_proposal_substructure_t **clone) static void clone(private_proposal_substructure_t *this, private_proposal_substructure_t **clone)
{ {
private_proposal_substructure_t * new_clone; private_proposal_substructure_t * new_clone;
iterator_t *transforms; iterator_t *transforms;
status_t status;
new_clone = (private_proposal_substructure_t *) proposal_substructure_create(); new_clone = (private_proposal_substructure_t *) proposal_substructure_create();
@ -412,55 +370,26 @@ static status_t clone(private_proposal_substructure_t *this, private_proposal_su
if (this->spi.ptr != NULL) if (this->spi.ptr != NULL)
{ {
new_clone->spi.ptr = allocator_clone_bytes(this->spi.ptr,this->spi.len); new_clone->spi.ptr = allocator_clone_bytes(this->spi.ptr,this->spi.len);
if (new_clone->spi.ptr == NULL)
{
new_clone->public.destroy(&(new_clone->public));
return OUT_OF_RES;
}
new_clone->spi.len = this->spi.len; new_clone->spi.len = this->spi.len;
} }
status = this->transforms->create_iterator(this->transforms,&transforms,FALSE); this->transforms->create_iterator(this->transforms,&transforms,FALSE);
if (status != SUCCESS)
{
new_clone->public.destroy(&(new_clone->public));
return status;
}
while (transforms->has_next(transforms)) while (transforms->has_next(transforms))
{ {
transform_substructure_t *current_transform; transform_substructure_t *current_transform;
transform_substructure_t *current_transform_clone; transform_substructure_t *current_transform_clone;
status = transforms->current(transforms,(void **) &current_transform);
if (status != SUCCESS) transforms->current(transforms,(void **) &current_transform);
{
transforms->destroy(transforms); current_transform->clone(current_transform,&current_transform_clone);
new_clone->public.destroy(&(new_clone->public));
return status;
}
status = current_transform->clone(current_transform,&current_transform_clone);
if (status != SUCCESS)
{
transforms->destroy(transforms);
new_clone->public.destroy(&(new_clone->public));
return status;
}
status = new_clone->public.add_transform_substructure(&(new_clone->public),current_transform_clone); new_clone->public.add_transform_substructure(&(new_clone->public),current_transform_clone);
if (status != SUCCESS)
{
transforms->destroy(transforms);
current_transform_clone->destroy(current_transform_clone);
new_clone->public.destroy(&(new_clone->public));
return status;
}
} }
transforms->destroy(transforms); transforms->destroy(transforms);
*clone = new_clone; *clone = new_clone;
return SUCCESS;
} }
/** /**
@ -492,37 +421,33 @@ static status_t destroy(private_proposal_substructure_t *this)
} }
/* /*
* Described in header * Described in header.
*/ */
proposal_substructure_t *proposal_substructure_create() proposal_substructure_t *proposal_substructure_create()
{ {
private_proposal_substructure_t *this = allocator_alloc_thing(private_proposal_substructure_t); private_proposal_substructure_t *this = allocator_alloc_thing(private_proposal_substructure_t);
if (this == NULL)
{
return NULL;
}
/* interface functions */ /* interface functions */
this->public.payload_interface.verify = (status_t (*) (payload_t *))verify; this->public.payload_interface.verify = (status_t (*) (payload_t *))verify;
this->public.payload_interface.get_encoding_rules = (status_t (*) (payload_t *, encoding_rule_t **, size_t *) ) get_encoding_rules; this->public.payload_interface.get_encoding_rules = (void (*) (payload_t *, encoding_rule_t **, size_t *) ) get_encoding_rules;
this->public.payload_interface.get_length = (size_t (*) (payload_t *)) get_length; this->public.payload_interface.get_length = (size_t (*) (payload_t *)) get_length;
this->public.payload_interface.get_next_type = (payload_type_t (*) (payload_t *)) get_next_type; this->public.payload_interface.get_next_type = (payload_type_t (*) (payload_t *)) get_next_type;
this->public.payload_interface.set_next_type = (status_t (*) (payload_t *,payload_type_t)) set_next_type; this->public.payload_interface.set_next_type = (void (*) (payload_t *,payload_type_t)) set_next_type;
this->public.payload_interface.get_type = (payload_type_t (*) (payload_t *)) get_type; this->public.payload_interface.get_type = (payload_type_t (*) (payload_t *)) get_type;
this->public.payload_interface.destroy = (status_t (*) (payload_t *))destroy; this->public.payload_interface.destroy = (void (*) (payload_t *))destroy;
/* public functions */ /* public functions */
this->public.create_transform_substructure_iterator = (status_t (*) (proposal_substructure_t *,iterator_t **,bool)) create_transform_substructure_iterator; this->public.create_transform_substructure_iterator = (void (*) (proposal_substructure_t *,iterator_t **,bool)) create_transform_substructure_iterator;
this->public.add_transform_substructure = (status_t (*) (proposal_substructure_t *,transform_substructure_t *)) add_transform_substructure; this->public.add_transform_substructure = (void (*) (proposal_substructure_t *,transform_substructure_t *)) add_transform_substructure;
this->public.set_proposal_number = (status_t (*) (proposal_substructure_t *,u_int8_t))set_proposal_number; this->public.set_proposal_number = (void (*) (proposal_substructure_t *,u_int8_t))set_proposal_number;
this->public.get_proposal_number = (u_int8_t (*) (proposal_substructure_t *)) get_proposal_number; this->public.get_proposal_number = (u_int8_t (*) (proposal_substructure_t *)) get_proposal_number;
this->public.set_protocol_id = (status_t (*) (proposal_substructure_t *,u_int8_t))set_protocol_id; this->public.set_protocol_id = (void (*) (proposal_substructure_t *,u_int8_t))set_protocol_id;
this->public.get_protocol_id = (u_int8_t (*) (proposal_substructure_t *)) get_protocol_id; this->public.get_protocol_id = (u_int8_t (*) (proposal_substructure_t *)) get_protocol_id;
this->public.get_info_for_transform_type = (status_t (*) (proposal_substructure_t *,transform_type_t,u_int16_t *, u_int16_t *))get_info_for_transform_type; this->public.get_info_for_transform_type = (status_t (*) (proposal_substructure_t *,transform_type_t,u_int16_t *, u_int16_t *))get_info_for_transform_type;
this->public.set_spi = (status_t (*) (proposal_substructure_t *,chunk_t))set_spi; this->public.set_spi = (void (*) (proposal_substructure_t *,chunk_t))set_spi;
this->public.get_spi = (chunk_t (*) (proposal_substructure_t *)) get_spi; this->public.get_spi = (chunk_t (*) (proposal_substructure_t *)) get_spi;
this->public.clone = (status_t (*) (proposal_substructure_t *, proposal_substructure_t **)) clone; this->public.clone = (void (*) (proposal_substructure_t *, proposal_substructure_t **)) clone;
this->public.destroy = (status_t (*) (proposal_substructure_t *)) destroy; this->public.destroy = (void (*) (proposal_substructure_t *)) destroy;
/* private functions */ /* private functions */
@ -539,11 +464,6 @@ proposal_substructure_t *proposal_substructure_create()
this->spi.len = 0; this->spi.len = 0;
this->transforms = linked_list_create(); this->transforms = linked_list_create();
if (this->transforms == NULL)
{
allocator_free(this);
return NULL;
}
return (&(this->public)); return (&(this->public));
} }

View File

@ -1,9 +1,7 @@
/** /**
* @file proposal_substructure.h * @file proposal_substructure.h
* *
* @brief Declaration of the class proposal_substructure_t. * @brief Interface of proposal_substructure_t.
*
* An object of this type represents an IKEv2 PROPOSAL Substructure and contains transforms.
* *
*/ */
@ -32,7 +30,9 @@
/** /**
* Length of the proposal substructure header * Length of the proposal substructure header
* (without spi) * (without spi).
*
* @ingroup payloads
*/ */
#define PROPOSAL_SUBSTRUCTURE_HEADER_LENGTH 8 #define PROPOSAL_SUBSTRUCTURE_HEADER_LENGTH 8
@ -40,7 +40,9 @@
typedef enum protocol_id_t protocol_id_t; typedef enum protocol_id_t protocol_id_t;
/** /**
* Protocol ID of a proposal * Protocol ID of a proposal.
*
* @ingroup payloads
*/ */
enum protocol_id_t { enum protocol_id_t {
UNDEFINED_PROTOCOL_ID = 201, UNDEFINED_PROTOCOL_ID = 201,
@ -52,14 +54,15 @@ enum protocol_id_t {
typedef struct proposal_substructure_t proposal_substructure_t; typedef struct proposal_substructure_t proposal_substructure_t;
/** /**
* Object representing an IKEv2- PROPOSAL SUBSTRUCTURE * Object representing an IKEv2-PROPOSAL SUBSTRUCTURE.
* *
* The PROPOSAL SUBSTRUCTURE format is described in RFC section 3.3.1. * The PROPOSAL SUBSTRUCTURE format is described in RFC section 3.3.1.
* *
* @ingroup payloads
*/ */
struct proposal_substructure_t { struct proposal_substructure_t {
/** /**
* implements payload_t interface * The payload_t interface.
*/ */
payload_t payload_interface; payload_t payload_interface;
@ -73,11 +76,8 @@ struct proposal_substructure_t {
* @param this calling proposal_substructure_t object * @param this calling proposal_substructure_t object
* @param iterator the created iterator is stored at the pointed pointer * @param iterator the created iterator is stored at the pointed pointer
* @param[in] forward iterator direction (TRUE: front to end) * @param[in] forward iterator direction (TRUE: front to end)
* @return
* - SUCCESS or
* - OUT_OF_RES if iterator could not be created
*/ */
status_t (*create_transform_substructure_iterator) (proposal_substructure_t *this,iterator_t **iterator, bool forward); void (*create_transform_substructure_iterator) (proposal_substructure_t *this,iterator_t **iterator, bool forward);
/** /**
* @brief Adds a transform_substructure_t object to this object. * @brief Adds a transform_substructure_t object to this object.
@ -87,19 +87,16 @@ struct proposal_substructure_t {
* *
* @param this calling proposal_substructure_t object * @param this calling proposal_substructure_t object
* @param transform transform_substructure_t object to add * @param transform transform_substructure_t object to add
* @return - SUCCESS if succeeded
* - FAILED otherwise
*/ */
status_t (*add_transform_substructure) (proposal_substructure_t *this,transform_substructure_t *transform); void (*add_transform_substructure) (proposal_substructure_t *this,transform_substructure_t *transform);
/** /**
* @brief Sets the proposal number of current proposal. * @brief Sets the proposal number of current proposal.
* *
* @param this calling proposal_substructure_t object * @param this calling proposal_substructure_t object
* @param id proposal number to set * @param id proposal number to set
* @return - SUCCESS
*/ */
status_t (*set_proposal_number) (proposal_substructure_t *this,u_int8_t proposal_number); void (*set_proposal_number) (proposal_substructure_t *this,u_int8_t proposal_number);
/** /**
* @brief get proposal number of current proposal. * @brief get proposal number of current proposal.
@ -114,9 +111,8 @@ struct proposal_substructure_t {
* *
* @param this calling proposal_substructure_t object * @param this calling proposal_substructure_t object
* @param id protocol id to set * @param id protocol id to set
* @return - SUCCESS
*/ */
status_t (*set_protocol_id) (proposal_substructure_t *this,u_int8_t protocol_id); void (*set_protocol_id) (proposal_substructure_t *this,u_int8_t protocol_id);
/** /**
* @brief get protocol id of current proposal. * @brief get protocol id of current proposal.
@ -136,8 +132,7 @@ struct proposal_substructure_t {
* @return * @return
* - SUCCESS if transform type is part of this proposal and * - SUCCESS if transform type is part of this proposal and
* all data (incl. key length) could be fetched * all data (incl. key length) could be fetched
* - FAILED if transform type is not part of this proposal * - NOT_FOUND if transform type is not part of this proposal
* - OUT_OF_RES
*/ */
status_t (*get_info_for_transform_type) (proposal_substructure_t *this,transform_type_t type, u_int16_t *transform_id, u_int16_t *key_length); status_t (*get_info_for_transform_type) (proposal_substructure_t *this,transform_type_t type, u_int16_t *transform_id, u_int16_t *key_length);
@ -159,41 +154,32 @@ struct proposal_substructure_t {
* *
* @param this calling proposal_substructure_t object * @param this calling proposal_substructure_t object
* @param spi chunk_t pointing to the value to set * @param spi chunk_t pointing to the value to set
* @return
* - SUCCESS or
* - OUT_OF_RES
*/ */
status_t (*set_spi) (proposal_substructure_t *this, chunk_t spi); void (*set_spi) (proposal_substructure_t *this, chunk_t spi);
/** /**
* @brief Clones an proposal_substructure_t object. * @brief Clones an proposal_substructure_t object.
* *
* @param this proposal_substructure_t object to clone * @param this proposal_substructure_t object to clone
* @param clone cloned object will be written there * @param clone cloned object will be written there
* @return
* - SUCCESS
* - OUT_OF_RES
*/ */
status_t (*clone) (proposal_substructure_t *this,proposal_substructure_t **clone); void (*clone) (proposal_substructure_t *this,proposal_substructure_t **clone);
/** /**
* @brief Destroys an proposal_substructure_t object. * @brief Destroys an proposal_substructure_t object.
* *
* @param this proposal_substructure_t object to destroy * @param this proposal_substructure_t object to destroy
* @return
* SUCCESS in any case
*/ */
status_t (*destroy) (proposal_substructure_t *this); void (*destroy) (proposal_substructure_t *this);
}; };
/** /**
* @brief Creates an empty proposal_substructure_t object * @brief Creates an empty proposal_substructure_t object
* *
* @return * @return created proposal_substructure_t object
* - created proposal_substructure_t object, or *
* - NULL if failed * @ingroup payloads
*/ */
proposal_substructure_t *proposal_substructure_create(); proposal_substructure_t *proposal_substructure_create();

View File

@ -1,10 +1,7 @@
/** /**
* @file sa_payload.c * @file sa_payload.c
* *
* @brief Declaration of the class sa_payload_t. * @brief Implementation of sa_payload_t.
*
* An object of this type represents an IKEv2 SA-Payload and contains proposal
* substructures.
* *
*/ */
@ -36,32 +33,32 @@
typedef struct private_sa_payload_t private_sa_payload_t; typedef struct private_sa_payload_t private_sa_payload_t;
/** /**
* Private data of an sa_payload_t' Object * Private data of an sa_payload_t object.
* *
*/ */
struct private_sa_payload_t { struct private_sa_payload_t {
/** /**
* public sa_payload_t interface * Public sa_payload_t interface.
*/ */
sa_payload_t public; sa_payload_t public;
/** /**
* next payload type * Next payload type.
*/ */
u_int8_t next_payload; u_int8_t next_payload;
/** /**
* Critical flag * Critical flag.
*/ */
bool critical; bool critical;
/** /**
* Length of this payload * Length of this payload.
*/ */
u_int16_t payload_length; u_int16_t payload_length;
/** /**
* Proposals in this payload are stored in a linked_list_t * Proposals in this payload are stored in a linked_list_t.
*/ */
linked_list_t * proposals; linked_list_t * proposals;
@ -69,10 +66,8 @@ struct private_sa_payload_t {
* @brief Computes the length of this payload. * @brief Computes the length of this payload.
* *
* @param this calling private_sa_payload_t object * @param this calling private_sa_payload_t object
* @return
* SUCCESS in any case
*/ */
status_t (*compute_length) (private_sa_payload_t *this); void (*compute_length) (private_sa_payload_t *this);
}; };
/** /**
@ -115,8 +110,7 @@ encoding_rule_t sa_payload_encodings[] = {
*/ */
/** /**
* Implements payload_t's verify function. * Implementation of payload_t.verify.
* See #payload_s.verify for description.
*/ */
static status_t verify(private_sa_payload_t *this) static status_t verify(private_sa_payload_t *this)
{ {
@ -177,8 +171,7 @@ static status_t verify(private_sa_payload_t *this)
/** /**
* Implements payload_t's and sa_payload_t's destroy function. * Implementation of payload_t.destroy and sa_payload_t.destroy.
* See #payload_s.destroy or sa_payload_s.destroy for description.
*/ */
static status_t destroy(private_sa_payload_t *this) static status_t destroy(private_sa_payload_t *this)
{ {
@ -186,10 +179,7 @@ static status_t destroy(private_sa_payload_t *this)
while (this->proposals->get_count(this->proposals) > 0) while (this->proposals->get_count(this->proposals) > 0)
{ {
proposal_substructure_t *current_proposal; proposal_substructure_t *current_proposal;
if (this->proposals->remove_last(this->proposals,(void **)&current_proposal) != SUCCESS) this->proposals->remove_last(this->proposals,(void **)&current_proposal);
{
break;
}
current_proposal->destroy(current_proposal); current_proposal->destroy(current_proposal);
} }
this->proposals->destroy(this->proposals); this->proposals->destroy(this->proposals);
@ -200,20 +190,16 @@ static status_t destroy(private_sa_payload_t *this)
} }
/** /**
* Implements payload_t's get_encoding_rules function. * Implementation of payload_t.get_encoding_rules.
* See #payload_s.get_encoding_rules for description.
*/ */
static status_t get_encoding_rules(private_sa_payload_t *this, encoding_rule_t **rules, size_t *rule_count) static void get_encoding_rules(private_sa_payload_t *this, encoding_rule_t **rules, size_t *rule_count)
{ {
*rules = sa_payload_encodings; *rules = sa_payload_encodings;
*rule_count = sizeof(sa_payload_encodings) / sizeof(encoding_rule_t); *rule_count = sizeof(sa_payload_encodings) / sizeof(encoding_rule_t);
return SUCCESS;
} }
/** /**
* Implements payload_t's get_type function. * Implementation of payload_t.get_type.
* See #payload_s.get_type for description.
*/ */
static payload_type_t get_type(private_sa_payload_t *this) static payload_type_t get_type(private_sa_payload_t *this)
{ {
@ -221,8 +207,7 @@ static payload_type_t get_type(private_sa_payload_t *this)
} }
/** /**
* Implements payload_t's get_next_type function. * Implementation of payload_t.get_next_type.
* See #payload_s.get_next_type for description.
*/ */
static payload_type_t get_next_type(private_sa_payload_t *this) static payload_type_t get_next_type(private_sa_payload_t *this)
{ {
@ -230,18 +215,15 @@ static payload_type_t get_next_type(private_sa_payload_t *this)
} }
/** /**
* Implements payload_t's set_next_type function. * Implementation of payload_t.set_next_type.
* See #payload_s.set_next_type for description.
*/ */
static status_t set_next_type(private_sa_payload_t *this,payload_type_t type) static void set_next_type(private_sa_payload_t *this,payload_type_t type)
{ {
this->next_payload = type; this->next_payload = type;
return SUCCESS;
} }
/** /**
* Implements payload_t's get_length function. * Implementation of payload_t.get_length.
* See #payload_s.get_length for description.
*/ */
static size_t get_length(private_sa_payload_t *this) static size_t get_length(private_sa_payload_t *this)
{ {
@ -250,40 +232,30 @@ static size_t get_length(private_sa_payload_t *this)
} }
/** /**
* Implements sa_payload_t's create_proposal_substructure_iterator function. * Implementation of sa_payload_t.create_proposal_substructure_iterator.
* See #sa_payload_s.create_proposal_substructure_iterator for description.
*/ */
static status_t create_proposal_substructure_iterator (private_sa_payload_t *this,iterator_t **iterator,bool forward) static void create_proposal_substructure_iterator (private_sa_payload_t *this,iterator_t **iterator,bool forward)
{ {
return (this->proposals->create_iterator(this->proposals,iterator,forward)); this->proposals->create_iterator(this->proposals,iterator,forward);
} }
/** /**
* Implements sa_payload_t's add_proposal_substructure function. * Implementation of sa_payload_t.add_proposal_substructure.
* See #sa_payload_s.add_proposal_substructure for description.
*/ */
static status_t add_proposal_substructure (private_sa_payload_t *this,proposal_substructure_t *proposal) static void add_proposal_substructure (private_sa_payload_t *this,proposal_substructure_t *proposal)
{ {
status_t status; this->proposals->insert_last(this->proposals,(void *) proposal);
status = this->proposals->insert_last(this->proposals,(void *) proposal);
this->compute_length(this); this->compute_length(this);
return status;
} }
/** /**
* Implements private_sa_payload_t's compute_length function. * Implementation of private_sa_payload_t.compute_length.
* See #private_sa_payload_s.compute_length for description.
*/ */
static status_t compute_length (private_sa_payload_t *this) static void compute_length (private_sa_payload_t *this)
{ {
iterator_t *iterator; iterator_t *iterator;
status_t status;
size_t length = SA_PAYLOAD_HEADER_LENGTH; size_t length = SA_PAYLOAD_HEADER_LENGTH;
status = this->proposals->create_iterator(this->proposals,&iterator,TRUE); this->proposals->create_iterator(this->proposals,&iterator,TRUE);
if (status != SUCCESS)
{
return length;
}
while (iterator->has_next(iterator)) while (iterator->has_next(iterator))
{ {
payload_t *current_proposal; payload_t *current_proposal;
@ -293,34 +265,28 @@ static status_t compute_length (private_sa_payload_t *this)
iterator->destroy(iterator); iterator->destroy(iterator);
this->payload_length = length; this->payload_length = length;
return SUCCESS;
} }
/* /*
* Described in header * Described in header.
*/ */
sa_payload_t *sa_payload_create() sa_payload_t *sa_payload_create()
{ {
private_sa_payload_t *this = allocator_alloc_thing(private_sa_payload_t); private_sa_payload_t *this = allocator_alloc_thing(private_sa_payload_t);
if (this == NULL)
{
return NULL;
}
/* public interface */ /* public interface */
this->public.payload_interface.verify = (status_t (*) (payload_t *))verify; this->public.payload_interface.verify = (status_t (*) (payload_t *))verify;
this->public.payload_interface.get_encoding_rules = (status_t (*) (payload_t *, encoding_rule_t **, size_t *) ) get_encoding_rules; this->public.payload_interface.get_encoding_rules = (void (*) (payload_t *, encoding_rule_t **, size_t *) ) get_encoding_rules;
this->public.payload_interface.get_length = (size_t (*) (payload_t *)) get_length; this->public.payload_interface.get_length = (size_t (*) (payload_t *)) get_length;
this->public.payload_interface.get_next_type = (payload_type_t (*) (payload_t *)) get_next_type; this->public.payload_interface.get_next_type = (payload_type_t (*) (payload_t *)) get_next_type;
this->public.payload_interface.set_next_type = (status_t (*) (payload_t *,payload_type_t)) set_next_type; this->public.payload_interface.set_next_type = (void (*) (payload_t *,payload_type_t)) set_next_type;
this->public.payload_interface.get_type = (payload_type_t (*) (payload_t *)) get_type; this->public.payload_interface.get_type = (payload_type_t (*) (payload_t *)) get_type;
this->public.payload_interface.destroy = (status_t (*) (payload_t *))destroy; this->public.payload_interface.destroy = (void (*) (payload_t *))destroy;
/* public functions */ /* public functions */
this->public.create_proposal_substructure_iterator = (status_t (*) (sa_payload_t *,iterator_t **,bool)) create_proposal_substructure_iterator; this->public.create_proposal_substructure_iterator = (void (*) (sa_payload_t *,iterator_t **,bool)) create_proposal_substructure_iterator;
this->public.add_proposal_substructure = (status_t (*) (sa_payload_t *,proposal_substructure_t *)) add_proposal_substructure; this->public.add_proposal_substructure = (void (*) (sa_payload_t *,proposal_substructure_t *)) add_proposal_substructure;
this->public.destroy = (status_t (*) (sa_payload_t *)) destroy; this->public.destroy = (void (*) (sa_payload_t *)) destroy;
/* private functions */ /* private functions */
this->compute_length = compute_length; this->compute_length = compute_length;
@ -331,12 +297,6 @@ sa_payload_t *sa_payload_create()
this->payload_length = SA_PAYLOAD_HEADER_LENGTH; this->payload_length = SA_PAYLOAD_HEADER_LENGTH;
this->proposals = linked_list_create(); this->proposals = linked_list_create();
if (this->proposals == NULL)
{
allocator_free(this);
return NULL;
}
return (&(this->public)); return (&(this->public));
} }

View File

@ -1,10 +1,7 @@
/** /**
* @file sa_payload.h * @file sa_payload.h
* *
* @brief Declaration of the class sa_payload_t. * @brief Interface of sa_payload_t.
*
* An object of this type represents an IKEv2 SA-Payload and contains proposal
* substructures.
* *
*/ */
@ -32,26 +29,31 @@
#include <utils/linked_list.h> #include <utils/linked_list.h>
/** /**
* Critical flag must not be set * Critical flag must not be set.
*
* @ingroup payloads
*/ */
#define SA_PAYLOAD_CRITICAL_FLAG FALSE; #define SA_PAYLOAD_CRITICAL_FLAG FALSE;
/** /**
* SA_PAYLOAD length in bytes without any proposal substructure * SA_PAYLOAD length in bytes without any proposal substructure.
*
* @ingroup payloads
*/ */
#define SA_PAYLOAD_HEADER_LENGTH 4 #define SA_PAYLOAD_HEADER_LENGTH 4
typedef struct sa_payload_t sa_payload_t; typedef struct sa_payload_t sa_payload_t;
/** /**
* Object representing an IKEv2-SA Payload * Class representing an IKEv2-SA Payload.
* *
* The SA Payload format is described in RFC section 3.3. * The SA Payload format is described in RFC section 3.3.
* *
* @ingroup payloads
*/ */
struct sa_payload_t { struct sa_payload_t {
/** /**
* implements payload_t interface * The payload_t interface.
*/ */
payload_t payload_interface; payload_t payload_interface;
@ -67,11 +69,8 @@ struct sa_payload_t {
* @param this calling sa_payload_t object * @param this calling sa_payload_t object
* @param iterator the created iterator is stored at the pointed pointer * @param iterator the created iterator is stored at the pointed pointer
* @param[in] forward iterator direction (TRUE: front to end) * @param[in] forward iterator direction (TRUE: front to end)
* @return
* - SUCCESS or
* - OUT_OF_RES if iterator could not be created
*/ */
status_t (*create_proposal_substructure_iterator) (sa_payload_t *this,iterator_t **iterator, bool forward); void (*create_proposal_substructure_iterator) (sa_payload_t *this,iterator_t **iterator, bool forward);
/** /**
* @brief Adds a proposal_substructure_t object to this object. * @brief Adds a proposal_substructure_t object to this object.
@ -81,29 +80,24 @@ struct sa_payload_t {
* *
* @param this calling sa_payload_t object * @param this calling sa_payload_t object
* @param proposal proposal_substructure_t object to add * @param proposal proposal_substructure_t object to add
* @return - SUCCESS if succeeded
* - FAILED otherwise
*/ */
status_t (*add_proposal_substructure) (sa_payload_t *this,proposal_substructure_t *proposal); void (*add_proposal_substructure) (sa_payload_t *this,proposal_substructure_t *proposal);
/** /**
* @brief Destroys an sa_payload_t object. * @brief Destroys an sa_payload_t object.
* *
* @param this sa_payload_t object to destroy * @param this sa_payload_t object to destroy
* @return
* SUCCESS in any case
*/ */
status_t (*destroy) (sa_payload_t *this); void (*destroy) (sa_payload_t *this);
}; };
/** /**
* @brief Creates an empty sa_payload_t object * @brief Creates an empty sa_payload_t object
* *
* @return * @return created sa_payload_t object
* - created sa_payload_t object, or *
* - NULL if failed * @ingroup payloads
*/ */
sa_payload_t *sa_payload_create(); sa_payload_t *sa_payload_create();

View File

@ -1,9 +1,7 @@
/** /**
* @file transform_attribute.c * @file transform_attribute.c
* *
* @brief Declaration of the class transform_attribute_t. * @brief Implementation of transform_attribute_t.
*
* An object of this type represents an IKEv2 TRANSFORM attribute.
* *
*/ */
@ -34,17 +32,17 @@
typedef struct private_transform_attribute_t private_transform_attribute_t; typedef struct private_transform_attribute_t private_transform_attribute_t;
/** /**
* Private data of an transform_attribute_t Object * Private data of an transform_attribute_t object.
* *
*/ */
struct private_transform_attribute_t { struct private_transform_attribute_t {
/** /**
* public transform_attribute_t interface * Public transform_attribute_t interface.
*/ */
transform_attribute_t public; transform_attribute_t public;
/** /**
* Attribute Format Flag * Attribute Format Flag.
* *
* - TRUE means value is stored in attribute_length_or_value * - TRUE means value is stored in attribute_length_or_value
* - FALSE means value is stored in attribute_value * - FALSE means value is stored in attribute_value
@ -52,25 +50,23 @@ struct private_transform_attribute_t {
bool attribute_format; bool attribute_format;
/** /**
* Type of the attribute * Type of the attribute.
*/ */
u_int16_t attribute_type; u_int16_t attribute_type;
/** /**
* Attribute Length if attribute_format is 0, attribute Value otherwise * Attribute Length if attribute_format is 0, attribute Value otherwise.
*/ */
u_int16_t attribute_length_or_value; u_int16_t attribute_length_or_value;
/** /**
* Attribute value as chunk if attribute_format is 0 (FALSE) * Attribute value as chunk if attribute_format is 0 (FALSE).
*/ */
chunk_t attribute_value; chunk_t attribute_value;
}; };
/** /**
* string mappings for transform_attribute_type_t * String mappings for transform_attribute_type_t.
*/ */
mapping_t transform_attribute_type_m[] = { mapping_t transform_attribute_type_m[] = {
{ATTRIBUTE_UNDEFINED, "ATTRIBUTE_UNDEFINED"}, {ATTRIBUTE_UNDEFINED, "ATTRIBUTE_UNDEFINED"},
@ -79,7 +75,7 @@ mapping_t transform_attribute_type_m[] = {
}; };
/** /**
* Encoding rules to parse or generate a Transform attribute * Encoding rules to parse or generate a Transform attribute.
* *
* The defined offsets are the positions in a object of type * The defined offsets are the positions in a object of type
* private_transform_attribute_t. * private_transform_attribute_t.
@ -109,8 +105,7 @@ encoding_rule_t transform_attribute_encodings[] = {
*/ */
/** /**
* Implements payload_t's verify function. * Implementation of payload_t.verify.
* See #payload_s.verify for description.
*/ */
static status_t verify(private_transform_attribute_t *this) static status_t verify(private_transform_attribute_t *this)
{ {
@ -123,20 +118,16 @@ static status_t verify(private_transform_attribute_t *this)
} }
/** /**
* Implements payload_t's get_encoding_rules function. * Implementation of payload_t.get_encoding_rules.
* See #payload_s.get_encoding_rules for description.
*/ */
static status_t get_encoding_rules(private_transform_attribute_t *this, encoding_rule_t **rules, size_t *rule_count) static void get_encoding_rules(private_transform_attribute_t *this, encoding_rule_t **rules, size_t *rule_count)
{ {
*rules = transform_attribute_encodings; *rules = transform_attribute_encodings;
*rule_count = sizeof(transform_attribute_encodings) / sizeof(encoding_rule_t); *rule_count = sizeof(transform_attribute_encodings) / sizeof(encoding_rule_t);
return SUCCESS;
} }
/** /**
* Implements payload_t's get_type function. * Implementation of payload_t.get_type.
* See #payload_s.get_type for description.
*/ */
static payload_type_t get_type(private_transform_attribute_t *this) static payload_type_t get_type(private_transform_attribute_t *this)
{ {
@ -144,8 +135,7 @@ static payload_type_t get_type(private_transform_attribute_t *this)
} }
/** /**
* Implements payload_t's get_next_type function. * Implementation of payload_t.get_next_type.
* See #payload_s.get_next_type for description.
*/ */
static payload_type_t get_next_type(private_transform_attribute_t *this) static payload_type_t get_next_type(private_transform_attribute_t *this)
{ {
@ -153,17 +143,14 @@ static payload_type_t get_next_type(private_transform_attribute_t *this)
} }
/** /**
* Implements payload_t's set_next_type function. * Implementation of payload_t.set_next_type.
* See #payload_s.set_next_type for description.
*/ */
static status_t set_next_type(private_transform_attribute_t *this,payload_type_t type) static void set_next_type(private_transform_attribute_t *this,payload_type_t type)
{ {
return SUCCESS;
} }
/** /**
* Implements payload_t's get_length function. * Implementation of transform_attribute_t.get_length.
* See #payload_s.get_length for description.
*/ */
static size_t get_length(private_transform_attribute_t *this) static size_t get_length(private_transform_attribute_t *this)
{ {
@ -174,11 +161,11 @@ static size_t get_length(private_transform_attribute_t *this)
} }
return (this->attribute_length_or_value + 4); return (this->attribute_length_or_value + 4);
} }
/** /**
* Implements transform_attribute_t's set_value function. * Implementation of transform_attribute_t.set_value_chunk.
* See #transform_attribute_s.set_value for description.
*/ */
static status_t set_value_chunk(private_transform_attribute_t *this, chunk_t value) static void set_value_chunk(private_transform_attribute_t *this, chunk_t value)
{ {
if (this->attribute_value.ptr != NULL) if (this->attribute_value.ptr != NULL)
{ {
@ -192,10 +179,6 @@ static status_t set_value_chunk(private_transform_attribute_t *this, chunk_t val
if (value.len > 2) if (value.len > 2)
{ {
this->attribute_value.ptr = allocator_clone_bytes(value.ptr,value.len); this->attribute_value.ptr = allocator_clone_bytes(value.ptr,value.len);
if (this->attribute_value.ptr == NULL)
{
return OUT_OF_RES;
}
this->attribute_value.len = value.len; this->attribute_value.len = value.len;
this->attribute_length_or_value = value.len; this->attribute_length_or_value = value.len;
/* attribute has not a fixed length */ /* attribute has not a fixed length */
@ -205,14 +188,12 @@ static status_t set_value_chunk(private_transform_attribute_t *this, chunk_t val
{ {
memcpy(&(this->attribute_length_or_value),value.ptr,value.len); memcpy(&(this->attribute_length_or_value),value.ptr,value.len);
} }
return SUCCESS;
} }
/** /**
* Implements transform_attribute_t's set_value function. * Implementation of transform_attribute_t.set_value.
* See #transform_attribute_s.set_value for description.
*/ */
static status_t set_value(private_transform_attribute_t *this, u_int16_t value) static void set_value(private_transform_attribute_t *this, u_int16_t value)
{ {
if (this->attribute_value.ptr != NULL) if (this->attribute_value.ptr != NULL)
{ {
@ -223,12 +204,10 @@ static status_t set_value(private_transform_attribute_t *this, u_int16_t value)
} }
this->attribute_length_or_value = value; this->attribute_length_or_value = value;
return SUCCESS;
} }
/** /**
* Implements transform_attribute_t's get_value_chunk function. * Implementation of transform_attribute_t.get_value_chunk.
* See #transform_attribute_s.get_value_chunk for description.
*/ */
static chunk_t get_value_chunk (private_transform_attribute_t *this) static chunk_t get_value_chunk (private_transform_attribute_t *this)
{ {
@ -249,8 +228,7 @@ static chunk_t get_value_chunk (private_transform_attribute_t *this)
} }
/** /**
* Implements transform_attribute_t's get_value function. * Implementation of transform_attribute_t.get_value.
* See #transform_attribute_s.get_value for description.
*/ */
static u_int16_t get_value (private_transform_attribute_t *this) static u_int16_t get_value (private_transform_attribute_t *this)
{ {
@ -259,18 +237,15 @@ static u_int16_t get_value (private_transform_attribute_t *this)
/** /**
* Implements transform_attribute_t's set_attribute_type function. * Implementation of transform_attribute_t.set_attribute_type.
* See #transform_attribute_s.set_attribute_type for description.
*/ */
static status_t set_attribute_type (private_transform_attribute_t *this, u_int16_t type) static void set_attribute_type (private_transform_attribute_t *this, u_int16_t type)
{ {
this->attribute_type = type & 0x7FFF; this->attribute_type = type & 0x7FFF;
return SUCCESS;
} }
/** /**
* Implements transform_attribute_t's get_attribute_type function. * Implementation of transform_attribute_t.get_attribute_type.
* See #transform_attribute_s.get_attribute_type for description.
*/ */
static u_int16_t get_attribute_type (private_transform_attribute_t *this) static u_int16_t get_attribute_type (private_transform_attribute_t *this)
{ {
@ -278,10 +253,9 @@ static u_int16_t get_attribute_type (private_transform_attribute_t *this)
} }
/** /**
* Implements transform_attribute_t's clone function. * Implementation of transform_attribute_t.clone.
* See transform_attribute_s.clone for description.
*/ */
static status_t clone(private_transform_attribute_t *this,transform_attribute_t **clone) static void clone(private_transform_attribute_t *this,transform_attribute_t **clone)
{ {
private_transform_attribute_t *new_clone; private_transform_attribute_t *new_clone;
@ -295,61 +269,48 @@ static status_t clone(private_transform_attribute_t *this,transform_attribute_t
{ {
new_clone->attribute_value.ptr = allocator_clone_bytes(this->attribute_value.ptr,this->attribute_value.len); new_clone->attribute_value.ptr = allocator_clone_bytes(this->attribute_value.ptr,this->attribute_value.len);
new_clone->attribute_value.len = this->attribute_value.len; new_clone->attribute_value.len = this->attribute_value.len;
if (new_clone->attribute_value.ptr == NULL)
{
new_clone->public.destroy(&(new_clone->public));
return OUT_OF_RES;
}
} }
*clone = (transform_attribute_t *) new_clone; *clone = (transform_attribute_t *) new_clone;
return SUCCESS;
} }
/** /**
* Implements payload_t's and transform_attribute_t's destroy function. * Implementation of transform_attribute_t.destroy and payload_t.destroy.
* See #payload_s.destroy or transform_attribute_s.destroy for description.
*/ */
static status_t destroy(private_transform_attribute_t *this) static void destroy(private_transform_attribute_t *this)
{ {
if (this->attribute_value.ptr != NULL) if (this->attribute_value.ptr != NULL)
{ {
allocator_free(this->attribute_value.ptr); allocator_free(this->attribute_value.ptr);
} }
allocator_free(this); allocator_free(this);
return SUCCESS;
} }
/* /*
* Described in header * Described in header.
*/ */
transform_attribute_t *transform_attribute_create() transform_attribute_t *transform_attribute_create()
{ {
private_transform_attribute_t *this = allocator_alloc_thing(private_transform_attribute_t); private_transform_attribute_t *this = allocator_alloc_thing(private_transform_attribute_t);
if (this == NULL)
{
return NULL;
}
/* payload interface */ /* payload interface */
this->public.payload_interface.verify = (status_t (*) (payload_t *))verify; this->public.payload_interface.verify = (status_t (*) (payload_t *))verify;
this->public.payload_interface.get_encoding_rules = (status_t (*) (payload_t *, encoding_rule_t **, size_t *) ) get_encoding_rules; this->public.payload_interface.get_encoding_rules = (void (*) (payload_t *, encoding_rule_t **, size_t *) ) get_encoding_rules;
this->public.payload_interface.get_length = (size_t (*) (payload_t *)) get_length; this->public.payload_interface.get_length = (size_t (*) (payload_t *)) get_length;
this->public.payload_interface.get_next_type = (payload_type_t (*) (payload_t *)) get_next_type; this->public.payload_interface.get_next_type = (payload_type_t (*) (payload_t *)) get_next_type;
this->public.payload_interface.set_next_type = (status_t (*) (payload_t *,payload_type_t)) set_next_type; this->public.payload_interface.set_next_type = (void (*) (payload_t *,payload_type_t)) set_next_type;
this->public.payload_interface.get_type = (payload_type_t (*) (payload_t *)) get_type; this->public.payload_interface.get_type = (payload_type_t (*) (payload_t *)) get_type;
this->public.payload_interface.destroy = (status_t (*) (payload_t *))destroy; this->public.payload_interface.destroy = (void (*) (payload_t *))destroy;
/* public functions */ /* public functions */
this->public.set_value_chunk = (status_t (*) (transform_attribute_t *,chunk_t)) set_value_chunk; this->public.set_value_chunk = (void (*) (transform_attribute_t *,chunk_t)) set_value_chunk;
this->public.set_value = (status_t (*) (transform_attribute_t *,u_int16_t)) set_value; this->public.set_value = (void (*) (transform_attribute_t *,u_int16_t)) set_value;
this->public.get_value_chunk = (chunk_t (*) (transform_attribute_t *)) get_value_chunk; this->public.get_value_chunk = (chunk_t (*) (transform_attribute_t *)) get_value_chunk;
this->public.get_value = (u_int16_t (*) (transform_attribute_t *)) get_value; this->public.get_value = (u_int16_t (*) (transform_attribute_t *)) get_value;
this->public.set_attribute_type = (status_t (*) (transform_attribute_t *,u_int16_t type)) set_attribute_type; this->public.set_attribute_type = (void (*) (transform_attribute_t *,u_int16_t type)) set_attribute_type;
this->public.get_attribute_type = (u_int16_t (*) (transform_attribute_t *)) get_attribute_type; this->public.get_attribute_type = (u_int16_t (*) (transform_attribute_t *)) get_attribute_type;
this->public.clone = (status_t (*) (transform_attribute_t *,transform_attribute_t **)) clone; this->public.clone = (void (*) (transform_attribute_t *,transform_attribute_t **)) clone;
this->public.destroy = (status_t (*) (transform_attribute_t *)) destroy; this->public.destroy = (void (*) (transform_attribute_t *)) destroy;
/* set default values of the fields */ /* set default values of the fields */
this->attribute_format = TRUE; this->attribute_format = TRUE;

View File

@ -1,9 +1,7 @@
/** /**
* @file transform_attribute.h * @file transform_attribute.h
* *
* @brief Declaration of the class transform_attribute_t. * @brief Interface of transform_attribute_t.
*
* An object of this type represents an IKEv2 TRANSFORM attribute.
* *
*/ */
@ -32,7 +30,9 @@
typedef enum transform_attribute_type_t transform_attribute_type_t; typedef enum transform_attribute_type_t transform_attribute_type_t;
/** /**
* Type of the attribute, as in IKEv2 draft 3.3.5 * Type of the attribute, as in IKEv2 draft 3.3.5.
*
* @ingroup payloads
*/ */
enum transform_attribute_type_t { enum transform_attribute_type_t {
ATTRIBUTE_UNDEFINED = 16384, ATTRIBUTE_UNDEFINED = 16384,
@ -40,28 +40,31 @@ enum transform_attribute_type_t {
}; };
/** /**
* string mappings for transform_attribute_type_t * String mappings for transform_attribute_type_t.
*
* @ingroup payloads
*/ */
extern mapping_t transform_attribute_type_m[]; extern mapping_t transform_attribute_type_m[];
typedef struct transform_attribute_t transform_attribute_t; typedef struct transform_attribute_t transform_attribute_t;
/** /**
* Object representing an IKEv2- TRANSFORM Attribute * Object representing an IKEv2- TRANSFORM Attribute.
* *
* The TRANSFORM ATTRIBUTE format is described in RFC section 3.3.5. * The TRANSFORM ATTRIBUTE format is described in RFC section 3.3.5.
* *
* @ingroup payloads
*/ */
struct transform_attribute_t { struct transform_attribute_t {
/** /**
* implements payload_t interface * The payload_t interface.
*/ */
payload_t payload_interface; payload_t payload_interface;
/** /**
* @brief Returns the currently set value of the attribute * @brief Returns the currently set value of the attribute.
* *
* @warning Returned data are not copied * @warning Returned data are not copied.
* *
* @param this calling transform_attribute_t object * @param this calling transform_attribute_t object
* @return chunk_t pointing to the value * @return chunk_t pointing to the value
@ -69,9 +72,9 @@ struct transform_attribute_t {
chunk_t (*get_value_chunk) (transform_attribute_t *this); chunk_t (*get_value_chunk) (transform_attribute_t *this);
/** /**
* @brief Returns the currently set value of the attribute * @brief Returns the currently set value of the attribute.
* *
* @warning Returned data are not copied * @warning Returned data are not copied.
* *
* @param this calling transform_attribute_t object * @param this calling transform_attribute_t object
* @return value * @return value
@ -81,35 +84,28 @@ struct transform_attribute_t {
/** /**
* @brief Sets the value of the attribute. * @brief Sets the value of the attribute.
* *
* @warning Value is getting copied * @warning Value is getting copied.
* *
* @param this calling transform_attribute_t object * @param this calling transform_attribute_t object
* @param value chunk_t pointing to the value to set * @param value chunk_t pointing to the value to set
* @return
* - SUCCESS or
* - OUT_OF_RES
*/ */
status_t (*set_value_chunk) (transform_attribute_t *this, chunk_t value); void (*set_value_chunk) (transform_attribute_t *this, chunk_t value);
/** /**
* @brief Sets the value of the attribute. * @brief Sets the value of the attribute.
* *
* @param this calling transform_attribute_t object * @param this calling transform_attribute_t object
* @param value value to set * @param value value to set
* @return
* - SUCCESS or
* - OUT_OF_RES
*/ */
status_t (*set_value) (transform_attribute_t *this, u_int16_t value); void (*set_value) (transform_attribute_t *this, u_int16_t value);
/** /**
* @brief Sets the type of the attribute. * @brief Sets the type of the attribute.
* *
* @param this calling transform_attribute_t object * @param this calling transform_attribute_t object
* @param type type to set (most significant bit is set to zero) * @param type type to set (most significant bit is set to zero)
* @return SUCCESS
*/ */
status_t (*set_attribute_type) (transform_attribute_t *this, u_int16_t type); void (*set_attribute_type) (transform_attribute_t *this, u_int16_t type);
/** /**
* @brief get the type of the attribute. * @brief get the type of the attribute.
@ -124,30 +120,23 @@ struct transform_attribute_t {
* *
* @param this transform_attribute_t object to clone * @param this transform_attribute_t object to clone
* @param clone the new clone will be written there * @param clone the new clone will be written there
* @return
* - OUT_OF_RES
* - SUCCESS
*/ */
status_t (*clone) (transform_attribute_t *this,transform_attribute_t **clone); void (*clone) (transform_attribute_t *this,transform_attribute_t **clone);
/** /**
* @brief Destroys an transform_attribute_t object. * @brief Destroys an transform_attribute_t object.
* *
* @param this transform_attribute_t object to destroy * @param this transform_attribute_t object to destroy
* @return
* SUCCESS in any case
*/ */
status_t (*destroy) (transform_attribute_t *this); void (*destroy) (transform_attribute_t *this);
}; };
/** /**
* @brief Creates an empty transform_attribute_t object * @brief Creates an empty transform_attribute_t object
* *
* @return * @return created transform_attribute_t object
* - created transform_attribute_t object, or * @ingroup payloads
* - NULL if failed
*/ */
transform_attribute_t *transform_attribute_create(); transform_attribute_t *transform_attribute_create();
#endif /*TRANSFORM_ATTRIBUTE_H_*/ #endif /*TRANSFORM_ATTRIBUTE_H_*/

View File

@ -1,9 +1,7 @@
/** /**
* @file transform_substructure.h * @file transform_substructure.h
* *
* @brief Declaration of the class transform_substructure_t. * @brief Implementation of transform_substructure_t.
*
* An object of this type represents an IKEv2 TRANSFORM Substructure and contains Attributes.
* *
*/ */
@ -37,39 +35,39 @@
typedef struct private_transform_substructure_t private_transform_substructure_t; typedef struct private_transform_substructure_t private_transform_substructure_t;
/** /**
* Private data of an transform_substructure_t' Object * Private data of an transform_substructure_t object.
* *
*/ */
struct private_transform_substructure_t { struct private_transform_substructure_t {
/** /**
* public transform_substructure_t interface * Public transform_substructure_t interface.
*/ */
transform_substructure_t public; transform_substructure_t public;
/** /**
* next payload type * Next payload type.
*/ */
u_int8_t next_payload; u_int8_t next_payload;
/** /**
* Length of this payload * Length of this payload.
*/ */
u_int16_t transform_length; u_int16_t transform_length;
/** /**
* Type of the transform * Type of the transform.
*/ */
u_int8_t transform_type; u_int8_t transform_type;
/** /**
* Transform ID * Transform ID.
*/ */
u_int16_t transform_id; u_int16_t transform_id;
/** /**
* Transforms Attributes are stored in a linked_list_t * Transforms Attributes are stored in a linked_list_t.
*/ */
linked_list_t *attributes; linked_list_t *attributes;
@ -77,15 +75,13 @@ struct private_transform_substructure_t {
* @brief Computes the length of this substructure. * @brief Computes the length of this substructure.
* *
* @param this calling private_transform_substructure_t object * @param this calling private_transform_substructure_t object
* @return
* SUCCESS in any case
*/ */
status_t (*compute_length) (private_transform_substructure_t *this); void (*compute_length) (private_transform_substructure_t *this);
}; };
/** /**
* string mappings for transform_type_t * String mappings for transform_type_t.
*/ */
mapping_t transform_type_m[] = { mapping_t transform_type_m[] = {
{UNDEFINED_TRANSFORM_TYPE, "UNDEFINED_TRANSFORM_TYPE"}, {UNDEFINED_TRANSFORM_TYPE, "UNDEFINED_TRANSFORM_TYPE"},
@ -99,7 +95,7 @@ mapping_t transform_type_m[] = {
/** /**
* string mappings for extended_sequence_numbers_t * String mappings for extended_sequence_numbers_t.
*/ */
mapping_t extended_sequence_numbers_m[] = { mapping_t extended_sequence_numbers_m[] = {
{NO_EXT_SEQ_NUMBERS, "NO_EXT_SEQ_NUMBERS"}, {NO_EXT_SEQ_NUMBERS, "NO_EXT_SEQ_NUMBERS"},
@ -108,7 +104,7 @@ mapping_t extended_sequence_numbers_m[] = {
}; };
/** /**
* Encoding rules to parse or generate a Transform substructure * Encoding rules to parse or generate a Transform substructure.
* *
* The defined offsets are the positions in a object of type * The defined offsets are the positions in a object of type
* private_transform_substructure_t. * private_transform_substructure_t.
@ -148,8 +144,7 @@ encoding_rule_t transform_substructure_encodings[] = {
/** /**
* Implements payload_t's verify function. * Implementation of payload_t.verify.
* See #payload_s.verify for description.
*/ */
static status_t verify(private_transform_substructure_t *this) static status_t verify(private_transform_substructure_t *this)
{ {
@ -229,20 +224,16 @@ static status_t verify(private_transform_substructure_t *this)
} }
/** /**
* Implements payload_t's get_encoding_rules function. * Implementation of payload_t.get_encoding_rules.
* See #payload_s.get_encoding_rules for description.
*/ */
static status_t get_encoding_rules(private_transform_substructure_t *this, encoding_rule_t **rules, size_t *rule_count) static void get_encoding_rules(private_transform_substructure_t *this, encoding_rule_t **rules, size_t *rule_count)
{ {
*rules = transform_substructure_encodings; *rules = transform_substructure_encodings;
*rule_count = sizeof(transform_substructure_encodings) / sizeof(encoding_rule_t); *rule_count = sizeof(transform_substructure_encodings) / sizeof(encoding_rule_t);
return SUCCESS;
} }
/** /**
* Implements payload_t's get_type function. * Implementation of payload_t.get_type.
* See #payload_s.get_type for description.
*/ */
static payload_type_t get_type(private_transform_substructure_t *this) static payload_type_t get_type(private_transform_substructure_t *this)
{ {
@ -250,8 +241,7 @@ static payload_type_t get_type(private_transform_substructure_t *this)
} }
/** /**
* Implements payload_t's get_next_type function. * Implementation of payload_t.get_next_type.
* See #payload_s.get_next_type for description.
*/ */
static payload_type_t get_next_type(private_transform_substructure_t *this) static payload_type_t get_next_type(private_transform_substructure_t *this)
{ {
@ -259,8 +249,7 @@ static payload_type_t get_next_type(private_transform_substructure_t *this)
} }
/** /**
* Implements payload_t's get_length function. * Implementation of payload_t.get_length.
* See #payload_s.get_length for description.
*/ */
static size_t get_length(private_transform_substructure_t *this) static size_t get_length(private_transform_substructure_t *this)
{ {
@ -270,39 +259,32 @@ static size_t get_length(private_transform_substructure_t *this)
} }
/** /**
* Implements transform_substructure_t's create_transform_attribute_iterator function. * Implementation of transform_substructure_t.create_transform_attribute_iterator.
* See #transform_substructure_s.create_transform_attribute_iterator for description.
*/ */
static status_t create_transform_attribute_iterator (private_transform_substructure_t *this,iterator_t **iterator,bool forward) static void create_transform_attribute_iterator (private_transform_substructure_t *this,iterator_t **iterator,bool forward)
{ {
return (this->attributes->create_iterator(this->attributes,iterator,forward)); this->attributes->create_iterator(this->attributes,iterator,forward);
} }
/** /**
* Implements transform_substructure_t's add_transform_attribute function. * Implementation of transform_substructure_t.add_transform_attribute.
* See #transform_substructure_s.add_transform_attribute for description.
*/ */
static status_t add_transform_attribute (private_transform_substructure_t *this,transform_attribute_t *attribute) static void add_transform_attribute (private_transform_substructure_t *this,transform_attribute_t *attribute)
{ {
status_t status; this->attributes->insert_last(this->attributes,(void *) attribute);
status = this->attributes->insert_last(this->attributes,(void *) attribute);
this->compute_length(this); this->compute_length(this);
return status;
} }
/** /**
* Implements transform_substructure_t's set_is_last_transform function. * Implementation of transform_substructure_t.set_is_last_transform.
* See #transform_substructure_s.set_is_last_transform for description.
*/ */
static status_t set_is_last_transform (private_transform_substructure_t *this, bool is_last) static void set_is_last_transform (private_transform_substructure_t *this, bool is_last)
{ {
this->next_payload = (is_last) ? 0: TRANSFORM_TYPE_VALUE; this->next_payload = (is_last) ? 0: TRANSFORM_TYPE_VALUE;
return SUCCESS;
} }
/** /**
* Implements transform_substructure_t's get_is_last_transform function. * Implementation of transform_substructure_t.get_is_last_transform.
* See #transform_substructure_s.get_is_last_transform for description.
*/ */
static bool get_is_last_transform (private_transform_substructure_t *this) static bool get_is_last_transform (private_transform_substructure_t *this)
{ {
@ -310,27 +292,22 @@ static bool get_is_last_transform (private_transform_substructure_t *this)
} }
/** /**
* Implements payload_t's set_next_type function. * Implementation of payload_t.set_next_type.
* See #payload_s.set_next_type for description.
*/ */
static status_t set_next_type(private_transform_substructure_t *this,payload_type_t type) static void set_next_type(private_transform_substructure_t *this,payload_type_t type)
{ {
return SUCCESS;
} }
/** /**
* Implements transform_substructure_t's set_transform_type function. * Implementation of transform_substructure_t.set_transform_type.
* See #transform_substructure_s.set_transform_type for description.
*/ */
static status_t set_transform_type (private_transform_substructure_t *this,u_int8_t type) static void set_transform_type (private_transform_substructure_t *this,u_int8_t type)
{ {
this->transform_type = type; this->transform_type = type;
return SUCCESS;
} }
/** /**
* Implements transform_substructure_t's get_transform_type function. * Implementation of transform_substructure_t.get_transform_type.
* See #transform_substructure_s.get_transform_type for description.
*/ */
static u_int8_t get_transform_type (private_transform_substructure_t *this) static u_int8_t get_transform_type (private_transform_substructure_t *this)
{ {
@ -338,18 +315,15 @@ static u_int8_t get_transform_type (private_transform_substructure_t *this)
} }
/** /**
* Implements transform_substructure_t's set_transform_id function. * Implementation of transform_substructure_t.set_transform_id.
* See #transform_substructure_s.set_transform_id for description.
*/ */
static status_t set_transform_id (private_transform_substructure_t *this,u_int16_t id) static void set_transform_id (private_transform_substructure_t *this,u_int16_t id)
{ {
this->transform_id = id; this->transform_id = id;
return SUCCESS;
} }
/** /**
* Implements transform_substructure_t's get_transform_id function. * Implementation of transform_substructure_t.get_transform_id.
* See #transform_substructure_s.get_transform_id for description.
*/ */
static u_int16_t get_transform_id (private_transform_substructure_t *this) static u_int16_t get_transform_id (private_transform_substructure_t *this)
{ {
@ -357,19 +331,13 @@ static u_int16_t get_transform_id (private_transform_substructure_t *this)
} }
/** /**
* Implements private_transform_substructure_t's compute_length function. * Implementation of private_transform_substructure_t.compute_length.
* See #private_transform_substructure_s.compute_length for description.
*/ */
static status_t compute_length (private_transform_substructure_t *this) static void compute_length (private_transform_substructure_t *this)
{ {
iterator_t *iterator; iterator_t *iterator;
status_t status;
size_t length = TRANSFORM_SUBSTRUCTURE_HEADER_LENGTH; size_t length = TRANSFORM_SUBSTRUCTURE_HEADER_LENGTH;
status = this->attributes->create_iterator(this->attributes,&iterator,TRUE); this->attributes->create_iterator(this->attributes,&iterator,TRUE);
if (status != SUCCESS)
{
return length;
}
while (iterator->has_next(iterator)) while (iterator->has_next(iterator))
{ {
payload_t * current_attribute; payload_t * current_attribute;
@ -380,18 +348,15 @@ static status_t compute_length (private_transform_substructure_t *this)
this->transform_length = length; this->transform_length = length;
return SUCCESS;
} }
/** /**
* Implements transform_substructure_t's clone function. * Implementation of transform_substructure_t.clone.
* See transform_substructure_s.clone for description.
*/ */
static status_t clone(private_transform_substructure_t *this,transform_substructure_t **clone) static void clone(private_transform_substructure_t *this,transform_substructure_t **clone)
{ {
private_transform_substructure_t *new_clone; private_transform_substructure_t *new_clone;
iterator_t *attributes; iterator_t *attributes;
status_t status;
new_clone = (private_transform_substructure_t *) transform_substructure_create(); new_clone = (private_transform_substructure_t *) transform_substructure_create();
@ -399,46 +364,22 @@ static status_t clone(private_transform_substructure_t *this,transform_substruct
new_clone->transform_type = this->transform_type; new_clone->transform_type = this->transform_type;
new_clone->transform_id = this->transform_id; new_clone->transform_id = this->transform_id;
status = this->attributes->create_iterator(this->attributes,&attributes,FALSE); this->attributes->create_iterator(this->attributes,&attributes,FALSE);
if (status != SUCCESS)
{
new_clone->public.destroy(&(new_clone->public));
return status;
}
while (attributes->has_next(attributes)) while (attributes->has_next(attributes))
{ {
transform_attribute_t *current_attribute; transform_attribute_t *current_attribute;
transform_attribute_t *current_attribute_clone; transform_attribute_t *current_attribute_clone;
status = attributes->current(attributes,(void **) &current_attribute); attributes->current(attributes,(void **) &current_attribute);
if (status != SUCCESS)
{ current_attribute->clone(current_attribute,&current_attribute_clone);
attributes->destroy(attributes);
new_clone->public.destroy(&(new_clone->public));
return status;
}
status = current_attribute->clone(current_attribute,&current_attribute_clone);
if (status != SUCCESS)
{
attributes->destroy(attributes);
new_clone->public.destroy(&(new_clone->public));
return status;
}
status = new_clone->public.add_transform_attribute(&(new_clone->public),current_attribute_clone); new_clone->public.add_transform_attribute(&(new_clone->public),current_attribute_clone);
if (status != SUCCESS)
{
attributes->destroy(attributes);
current_attribute_clone->destroy(current_attribute_clone);
new_clone->public.destroy(&(new_clone->public));
return status;
}
} }
attributes->destroy(attributes); attributes->destroy(attributes);
*clone = &(new_clone->public); *clone = &(new_clone->public);
return SUCCESS;
} }
@ -448,23 +389,14 @@ static status_t clone(private_transform_substructure_t *this,transform_substruct
static status_t get_key_length(private_transform_substructure_t *this, u_int16_t *key_length) static status_t get_key_length(private_transform_substructure_t *this, u_int16_t *key_length)
{ {
iterator_t *attributes; iterator_t *attributes;
status_t status;
status = this->attributes->create_iterator(this->attributes,&attributes,TRUE);
if (status != SUCCESS)
{
return status;
}
this->attributes->create_iterator(this->attributes,&attributes,TRUE);
while (attributes->has_next(attributes)) while (attributes->has_next(attributes))
{ {
transform_attribute_t *current_attribute; transform_attribute_t *current_attribute;
status = attributes->current(attributes,(void **) &current_attribute); attributes->current(attributes,(void **) &current_attribute);
if (status != SUCCESS)
{
attributes->destroy(attributes);
return status;
}
if (current_attribute->get_attribute_type(current_attribute) == KEY_LENGTH) if (current_attribute->get_attribute_type(current_attribute) == KEY_LENGTH)
{ {
*key_length = current_attribute->get_value(current_attribute); *key_length = current_attribute->get_value(current_attribute);
@ -480,26 +412,20 @@ static status_t get_key_length(private_transform_substructure_t *this, u_int16_t
/** /**
* Implements payload_t's and transform_substructure_t's destroy function. * Implementation of transform_substructure_t.destroy and payload_t.destroy.
* See #payload_s.destroy or transform_substructure_s.destroy for description.
*/ */
static status_t destroy(private_transform_substructure_t *this) static void destroy(private_transform_substructure_t *this)
{ {
/* all proposals are getting destroyed */ /* all proposals are getting destroyed */
while (this->attributes->get_count(this->attributes) > 0) while (this->attributes->get_count(this->attributes) > 0)
{ {
transform_attribute_t *current_attribute; transform_attribute_t *current_attribute;
if (this->attributes->remove_last(this->attributes,(void **)&current_attribute) != SUCCESS) this->attributes->remove_last(this->attributes,(void **)&current_attribute);
{
break;
}
current_attribute->destroy(current_attribute); current_attribute->destroy(current_attribute);
} }
this->attributes->destroy(this->attributes); this->attributes->destroy(this->attributes);
allocator_free(this); allocator_free(this);
return SUCCESS;
} }
/* /*
@ -508,32 +434,28 @@ static status_t destroy(private_transform_substructure_t *this)
transform_substructure_t *transform_substructure_create() transform_substructure_t *transform_substructure_create()
{ {
private_transform_substructure_t *this = allocator_alloc_thing(private_transform_substructure_t); private_transform_substructure_t *this = allocator_alloc_thing(private_transform_substructure_t);
if (this == NULL)
{
return NULL;
}
/* payload interface */ /* payload interface */
this->public.payload_interface.verify = (status_t (*) (payload_t *))verify; this->public.payload_interface.verify = (status_t (*) (payload_t *))verify;
this->public.payload_interface.get_encoding_rules = (status_t (*) (payload_t *, encoding_rule_t **, size_t *) ) get_encoding_rules; this->public.payload_interface.get_encoding_rules = (void (*) (payload_t *, encoding_rule_t **, size_t *) ) get_encoding_rules;
this->public.payload_interface.get_length = (size_t (*) (payload_t *)) get_length; this->public.payload_interface.get_length = (size_t (*) (payload_t *)) get_length;
this->public.payload_interface.get_next_type = (payload_type_t (*) (payload_t *)) get_next_type; this->public.payload_interface.get_next_type = (payload_type_t (*) (payload_t *)) get_next_type;
this->public.payload_interface.set_next_type = (status_t (*) (payload_t *,payload_type_t)) set_next_type; this->public.payload_interface.set_next_type = (void (*) (payload_t *,payload_type_t)) set_next_type;
this->public.payload_interface.get_type = (payload_type_t (*) (payload_t *)) get_type; this->public.payload_interface.get_type = (payload_type_t (*) (payload_t *)) get_type;
this->public.payload_interface.destroy = (status_t (*) (payload_t *))destroy; this->public.payload_interface.destroy = (void (*) (payload_t *))destroy;
/* public functions */ /* public functions */
this->public.create_transform_attribute_iterator = (status_t (*) (transform_substructure_t *,iterator_t **,bool)) create_transform_attribute_iterator; this->public.create_transform_attribute_iterator = (void (*) (transform_substructure_t *,iterator_t **,bool)) create_transform_attribute_iterator;
this->public.add_transform_attribute = (status_t (*) (transform_substructure_t *,transform_attribute_t *)) add_transform_attribute; this->public.add_transform_attribute = (void (*) (transform_substructure_t *,transform_attribute_t *)) add_transform_attribute;
this->public.set_is_last_transform = (status_t (*) (transform_substructure_t *,bool)) set_is_last_transform; this->public.set_is_last_transform = (void (*) (transform_substructure_t *,bool)) set_is_last_transform;
this->public.get_is_last_transform = (bool (*) (transform_substructure_t *)) get_is_last_transform; this->public.get_is_last_transform = (bool (*) (transform_substructure_t *)) get_is_last_transform;
this->public.set_transform_type = (status_t (*) (transform_substructure_t *,u_int8_t)) set_transform_type; this->public.set_transform_type = (void (*) (transform_substructure_t *,u_int8_t)) set_transform_type;
this->public.get_transform_type = (u_int8_t (*) (transform_substructure_t *)) get_transform_type; this->public.get_transform_type = (u_int8_t (*) (transform_substructure_t *)) get_transform_type;
this->public.set_transform_id = (status_t (*) (transform_substructure_t *,u_int16_t)) set_transform_id; this->public.set_transform_id = (void (*) (transform_substructure_t *,u_int16_t)) set_transform_id;
this->public.get_transform_id = (u_int16_t (*) (transform_substructure_t *)) get_transform_id; this->public.get_transform_id = (u_int16_t (*) (transform_substructure_t *)) get_transform_id;
this->public.get_key_length = (status_t (*) (transform_substructure_t *,u_int16_t *)) get_key_length; this->public.get_key_length = (status_t (*) (transform_substructure_t *,u_int16_t *)) get_key_length;
this->public.clone = (status_t (*) (transform_substructure_t *,transform_substructure_t **)) clone; this->public.clone = (void (*) (transform_substructure_t *,transform_substructure_t **)) clone;
this->public.destroy = (status_t (*) (transform_substructure_t *)) destroy; this->public.destroy = (void (*) (transform_substructure_t *)) destroy;
/* private functions */ /* private functions */
this->compute_length = compute_length; this->compute_length = compute_length;
@ -543,13 +465,7 @@ transform_substructure_t *transform_substructure_create()
this->transform_length = TRANSFORM_SUBSTRUCTURE_HEADER_LENGTH; this->transform_length = TRANSFORM_SUBSTRUCTURE_HEADER_LENGTH;
this->transform_id = 0; this->transform_id = 0;
this->transform_type = 0; this->transform_type = 0;
this->attributes = linked_list_create(); this->attributes = linked_list_create();
if (this->attributes == NULL)
{
allocator_free(this);
return NULL;
}
return (&(this->public)); return (&(this->public));
} }

View File

@ -1,9 +1,7 @@
/** /**
* @file transform_substructure.h * @file transform_substructure.h
* *
* @brief Declaration of the class transform_substructure_t. * @brief Interface of transform_substructure_t.
*
* An object of this type represents an IKEv2 TRANSFORM Substructure and contains Attributes.
* *
*/ */
@ -37,12 +35,16 @@
/** /**
* IKEv1 Value for a transform payload * IKEv1 Value for a transform payload.
*
* @ingroup payloads
*/ */
#define TRANSFORM_TYPE_VALUE 3 #define TRANSFORM_TYPE_VALUE 3
/** /**
* Length of the transform substructure header in bytes * Length of the transform substructure header in bytes.
*
* @ingroup payloads
*/ */
#define TRANSFORM_SUBSTRUCTURE_HEADER_LENGTH 8 #define TRANSFORM_SUBSTRUCTURE_HEADER_LENGTH 8
@ -50,7 +52,9 @@
typedef enum transform_type_t transform_type_t; typedef enum transform_type_t transform_type_t;
/** /**
* Type of a transform, as in IKEv2 draft 3.3.2 * Type of a transform, as in IKEv2 draft 3.3.2.
*
* @ingroup payloads
*/ */
enum transform_type_t { enum transform_type_t {
UNDEFINED_TRANSFORM_TYPE = 241, UNDEFINED_TRANSFORM_TYPE = 241,
@ -62,7 +66,9 @@ enum transform_type_t {
}; };
/** /**
* string mappings for transform_type_t * String mappings for transform_type_t.
*
* @ingroup payloads
*/ */
extern mapping_t transform_type_m[]; extern mapping_t transform_type_m[];
@ -70,7 +76,9 @@ extern mapping_t transform_type_m[];
typedef enum extended_sequence_numbers_t extended_sequence_numbers_t; typedef enum extended_sequence_numbers_t extended_sequence_numbers_t;
/** /**
* Extended sequence numbers, as in IKEv2 draft 3.3.2 * Extended sequence numbers, as in IKEv2 draft 3.3.2.
*
* @ingroup payloads
*/ */
enum extended_sequence_numbers_t { enum extended_sequence_numbers_t {
NO_EXT_SEQ_NUMBERS = 0, NO_EXT_SEQ_NUMBERS = 0,
@ -78,21 +86,24 @@ enum extended_sequence_numbers_t {
}; };
/** /**
* string mappings for extended_sequence_numbers_t * String mappings for extended_sequence_numbers_t.
*
* @ingroup payloads
*/ */
extern mapping_t extended_sequence_numbers_m[]; extern mapping_t extended_sequence_numbers_m[];
typedef struct transform_substructure_t transform_substructure_t; typedef struct transform_substructure_t transform_substructure_t;
/** /**
* Object representing an IKEv2- TRANSFORM SUBSTRUCTURE * Object representing an IKEv2- TRANSFORM SUBSTRUCTURE.
* *
* The TRANSFORM SUBSTRUCTURE format is described in RFC section 3.3.2. * The TRANSFORM SUBSTRUCTURE format is described in RFC section 3.3.2.
* *
* @ingroup payloads
*/ */
struct transform_substructure_t { struct transform_substructure_t {
/** /**
* implements payload_t interface * The payload_t interface.
*/ */
payload_t payload_interface; payload_t payload_interface;
@ -108,11 +119,8 @@ struct transform_substructure_t {
* @param this calling transform_substructure_t object * @param this calling transform_substructure_t object
* @param iterator the created iterator is stored at the pointed pointer * @param iterator the created iterator is stored at the pointed pointer
* @param[in] forward iterator direction (TRUE: front to end) * @param[in] forward iterator direction (TRUE: front to end)
* @return
* - SUCCESS or
* - OUT_OF_RES if iterator could not be created
*/ */
status_t (*create_transform_attribute_iterator) (transform_substructure_t *this,iterator_t **iterator, bool forward); void (*create_transform_attribute_iterator) (transform_substructure_t *this,iterator_t **iterator, bool forward);
/** /**
* @brief Adds a transform_attribute_t object to this object. * @brief Adds a transform_attribute_t object to this object.
@ -122,10 +130,8 @@ struct transform_substructure_t {
* *
* @param this calling transform_substructure_t object * @param this calling transform_substructure_t object
* @param proposal transform_attribute_t object to add * @param proposal transform_attribute_t object to add
* @return - SUCCESS if succeeded
* - FAILED otherwise
*/ */
status_t (*add_transform_attribute) (transform_substructure_t *this,transform_attribute_t *attribute); void (*add_transform_attribute) (transform_substructure_t *this,transform_attribute_t *attribute);
/** /**
* @brief Sets the next_payload field of this substructure * @brief Sets the next_payload field of this substructure
@ -135,9 +141,8 @@ struct transform_substructure_t {
* *
* @param this calling transform_substructure_t object * @param this calling transform_substructure_t object
* @param is_last When TRUE, next payload field is set to 0, otherwise to 3 * @param is_last When TRUE, next payload field is set to 0, otherwise to 3
* @return - SUCCESS
*/ */
status_t (*set_is_last_transform) (transform_substructure_t *this, bool is_last); void (*set_is_last_transform) (transform_substructure_t *this, bool is_last);
/** /**
* @brief Checks if this is the last transform. * @brief Checks if this is the last transform.
@ -152,9 +157,8 @@ struct transform_substructure_t {
* *
* @param this calling transform_substructure_t object * @param this calling transform_substructure_t object
* @param type type value to set * @param type type value to set
* @return - SUCCESS
*/ */
status_t (*set_transform_type) (transform_substructure_t *this,u_int8_t type); void (*set_transform_type) (transform_substructure_t *this,u_int8_t type);
/** /**
* @brief get transform type of the current transform. * @brief get transform type of the current transform.
@ -169,9 +173,8 @@ struct transform_substructure_t {
* *
* @param this calling transform_substructure_t object * @param this calling transform_substructure_t object
* @param id transform id to set * @param id transform id to set
* @return - SUCCESS
*/ */
status_t (*set_transform_id) (transform_substructure_t *this,u_int16_t id); void (*set_transform_id) (transform_substructure_t *this,u_int16_t id);
/** /**
* @brief get transform id of the current transform. * @brief get transform id of the current transform.
@ -190,7 +193,6 @@ struct transform_substructure_t {
* - SUCCESS if a key length attribute is contained * - SUCCESS if a key length attribute is contained
* - FAILED if no key length attribute is part of this * - FAILED if no key length attribute is part of this
* transform or key length uses more then 16 bit! * transform or key length uses more then 16 bit!
* - OUT_OF_RES
*/ */
status_t (*get_key_length) (transform_substructure_t *this,u_int16_t *key_length); status_t (*get_key_length) (transform_substructure_t *this,u_int16_t *key_length);
@ -200,30 +202,24 @@ struct transform_substructure_t {
* @param this transform_substructure_t object to clone * @param this transform_substructure_t object to clone
* @param clone pointer to a transform_substructure_t object pointer * @param clone pointer to a transform_substructure_t object pointer
* where the new object is stored to. * where the new object is stored to.
* @return
* - OUT_OF_RES
* - SUCCESS in any case
*/ */
status_t (*clone) (transform_substructure_t *this,transform_substructure_t **clone); void (*clone) (transform_substructure_t *this,transform_substructure_t **clone);
/** /**
* @brief Destroys an transform_substructure_t object. * @brief Destroys an transform_substructure_t object.
* *
* @param this transform_substructure_t object to destroy * @param this transform_substructure_t object to destroy
* @return
* SUCCESS in any case
*/ */
status_t (*destroy) (transform_substructure_t *this); void (*destroy) (transform_substructure_t *this);
}; };
/** /**
* @brief Creates an empty transform_substructure_t object * @brief Creates an empty transform_substructure_t object
* *
* @return * @return created transform_substructure_t object
* - created transform_substructure_t object, or *
* - NULL if failed * @ingroup payloads
*/ */
transform_substructure_t *transform_substructure_create(); transform_substructure_t *transform_substructure_create();
#endif /*TRANSFORM_SUBSTRUCTURE_H_*/ #endif /*TRANSFORM_SUBSTRUCTURE_H_*/