- 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
@@ -40,12 +40,12 @@
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 {
/**
* public encryption_payload_t interface
* Public encryption_payload_t interface.
*/
encryption_payload_t public;
@@ -58,7 +58,7 @@ struct private_encryption_payload_t {
u_int8_t next_payload;
/**
* Critical flag
* Critical flag.
*/
bool critical;
@@ -68,33 +68,33 @@ struct private_encryption_payload_t {
u_int16_t payload_length;
/**
* initialization vector
* Initialization vector.
*/
chunk_t iv;
/**
* integrity checksum
* Integrity checksum.
*/
chunk_t checksum;
/**
* chunk containing the iv, data, padding,
* and (an eventually not calculated) signature
* Chunk containing the iv, data, padding,
* and (an eventually not calculated) signature.
*/
chunk_t encrypted;
/**
* chunk containing the data in decrypted (unpadded) form
* Chunk containing the data in decrypted (unpadded) form.
*/
chunk_t decrypted;
/**
* signer set by set_signer
* Signer set by set_signer.
*/
signer_t *signer;
/**
* Contained payloads of this encrpytion_payload
* Contained payloads of this encrpytion_payload.
*/
linked_list_t *payloads;
@@ -102,24 +102,20 @@ struct private_encryption_payload_t {
* @brief Computes the length of this payload.
*
* @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.
*
* @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);
};
/**
* 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
* private_encryption_payload_t.
@@ -164,8 +160,7 @@ encoding_rule_t encryption_payload_encodings[] = {
*/
/**
* Implements payload_t's verify function.
* See #payload_s.verify for description.
* Implementation of payload_t.verify.
*/
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 */
while (this->payloads->get_count(this->payloads) > 0)
{
payload_t *current_payload;
if (this->payloads->remove_last(this->payloads,(void **)&current_payload) != SUCCESS)
{
break;
}
this->payloads->remove_last(this->payloads,(void **)&current_payload);
current_payload->destroy(current_payload);
}
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->checksum.ptr);
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;
*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)
{
@@ -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)
{
@@ -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 */
return FAILED;
/* set next type is not allowed, since this payload MUST be the last one
* 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)
{
@@ -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)
{
@@ -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;
if ((this->payloads->get_count(this->payloads) > 0) &&
(this->payloads->get_last(this->payloads,(void **) &last_payload) != SUCCESS))
if (this->payloads->get_count(this->payloads) > 0)
{
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)
{
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);
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)
{
@@ -349,18 +331,9 @@ static status_t encrypt(private_encryption_payload_t *this, crypter_t *crypter)
/* for random data in iv and padding */
randomizer = randomizer_create();
if (randomizer == NULL)
{
return OUT_OF_RES;
}
/* build payload chunk */
status = this->generate(this);
if (status != SUCCESS)
{
randomizer->destroy(randomizer);
return status;
}
this->generate(this);
/* build padding */
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 */
concatenated.len = this->decrypted.len + padding.len + 1;
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.len, padding.ptr, 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 */
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);
if (status != SUCCESS)
{
allocator_free(padding.ptr);
allocator_free(concatenated.ptr);
return status;
}
/* encrypt concatenated chunk */
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 */
this->encrypted.len += this->signer->get_block_size(this->signer);
allocator_realloc(this->encrypted.ptr, this->encrypted.len);
if (this->encrypted.ptr == NULL)
{
return OUT_OF_RES;
}
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)
{
@@ -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;
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)
{
@@ -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)
{
@@ -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;
generator_t *generator;
iterator_t *iterator;
/* create iterator */
status = this->payloads->create_iterator(this->payloads, &iterator, TRUE);
if (status != SUCCESS)
{
return status;
}
this->payloads->create_iterator(this->payloads, &iterator, TRUE);
/* get first payload */
if (iterator->has_next(iterator))
@@ -570,15 +520,10 @@ static status_t generate(private_encryption_payload_t *this)
allocator_free(this->decrypted.ptr);
this->decrypted = CHUNK_INITIALIZER;
iterator->destroy(iterator);
return SUCCESS;
return;
}
generator = generator_create();
if (generator == NULL)
{
iterator->destroy(iterator);
return OUT_OF_RES;
}
/* build all payload, except last */
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->destroy(generator);
return SUCCESS;
}
/**
* Implementation of private_encryption_payload_t.parse.
*/
static status_t parse(private_encryption_payload_t *this)
{
parser_t *parser;
@@ -617,11 +564,6 @@ static status_t parse(private_encryption_payload_t *this)
/* build a parser on the decrypted data */
parser = parser_create(this->decrypted);
if (parser == NULL)
{
return OUT_OF_RES;
}
current_payload_type = this->next_payload;
/* parse all payloads */
@@ -644,28 +586,20 @@ static status_t parse(private_encryption_payload_t *this)
/* get next payload type */
current_payload_type = current_payload->get_next_type(current_payload);
status = this->payloads->insert_last(this->payloads,current_payload);
if (status != SUCCESS)
{
return OUT_OF_RES;
}
this->payloads->insert_last(this->payloads,current_payload);
}
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;
status_t status;
size_t length = ENCRYPTION_PAYLOAD_HEADER_LENGTH;
status = this->payloads->create_iterator(this->payloads, &iterator, TRUE);
if (status != SUCCESS)
{
return status;
}
this->payloads->create_iterator(this->payloads, &iterator, TRUE);
while (iterator->has_next(iterator))
{
payload_t *current_payload;
@@ -675,8 +609,7 @@ static status_t compute_length(private_encryption_payload_t *this)
iterator->destroy(iterator);
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()
{
private_encryption_payload_t *this = allocator_alloc_thing(private_encryption_payload_t);
if (this == NULL)
{
return NULL;
}
/* payload_t interface functions */
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_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.destroy = (status_t (*) (payload_t *))destroy;
this->public.payload_interface.destroy = (void (*) (payload_t *))destroy;
/* public functions */
this->public.create_payload_iterator = (status_t (*) (encryption_payload_t *,iterator_t **,bool)) create_payload_iterator;
this->public.add_payload = (status_t (*) (encryption_payload_t *,payload_t *)) add_payload;
this->public.create_payload_iterator = (void (*) (encryption_payload_t *,iterator_t **,bool)) create_payload_iterator;
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.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.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 */
this->compute_length = compute_length;
@@ -723,14 +652,8 @@ encryption_payload_t *encryption_payload_create()
this->decrypted = CHUNK_INITIALIZER;
this->checksum = CHUNK_INITIALIZER;
this->signer = NULL;
this->payloads = linked_list_create();
if (this->payloads == NULL)
{
allocator_free(this);
return NULL;
}
return (&(this->public));
}