diff options
Diffstat (limited to 'src/charon/encoding')
-rw-r--r-- | src/charon/encoding/generator.c | 428 | ||||
-rw-r--r-- | src/charon/encoding/generator.h | 6 | ||||
-rw-r--r-- | src/charon/encoding/parser.c | 250 | ||||
-rw-r--r-- | src/charon/encoding/payloads/configuration_attribute.c | 7 | ||||
-rw-r--r-- | src/charon/encoding/payloads/configuration_attribute.h | 7 | ||||
-rw-r--r-- | src/charon/encoding/payloads/nonce_payload.h | 4 | ||||
-rw-r--r-- | src/charon/encoding/payloads/notify_payload.c | 18 | ||||
-rw-r--r-- | src/charon/encoding/payloads/notify_payload.h | 5 | ||||
-rw-r--r-- | src/charon/encoding/payloads/payload.h | 4 |
9 files changed, 234 insertions, 495 deletions
diff --git a/src/charon/encoding/generator.c b/src/charon/encoding/generator.c index 3b68af84e..dea4f0e21 100644 --- a/src/charon/encoding/generator.c +++ b/src/charon/encoding/generator.c @@ -13,7 +13,7 @@ * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License * for more details. * - * $Id: generator.c 3589 2008-03-13 14:14:44Z martin $ + * $Id: generator.c 4702 2008-11-26 10:42:54Z martin $ */ #include <stdlib.h> @@ -56,125 +56,6 @@ struct private_generator_t { * Public part of a generator_t object. */ generator_t public; - - /** - * Generates a U_INT-Field type and writes it to buffer. - * - * @param this private_generator_t object - * @param int_type type of U_INT field (U_INT_4, U_INT_8, etc.) - * ATTRIBUTE_TYPE is also generated in this function - * @param offset offset of value in data struct - * @param generator_contexts generator_contexts_t object where the context is written or read from - * @return - * - SUCCESS - * - FAILED if allignment is wrong - */ - void (*generate_u_int_type) (private_generator_t *this,encoding_type_t int_type,u_int32_t offset); - - /** - * Get size of current buffer in bytes. - * - * @param this private_generator_t object - * @return Size of buffer in bytes - */ - size_t (*get_current_buffer_size) (private_generator_t *this); - - /** - * Get free space of current buffer in bytes. - * - * @param this private_generator_t object - * @return space in buffer in bytes - */ - size_t (*get_current_buffer_space) (private_generator_t *this); - - /** - * Get length of data in buffer (in bytes). - * - * @param this private_generator_t object - * @return length of data in bytes - */ - size_t (*get_current_data_length) (private_generator_t *this); - - /** - * Get current offset in buffer (in bytes). - * - * @param this private_generator_t object - * @return offset in bytes - */ - u_int32_t (*get_current_buffer_offset) (private_generator_t *this); - - /** - * Generates a RESERVED BIT field or a RESERVED BYTE field and writes - * it to the buffer. - * - * @param this private_generator_t object - * @param generator_contexts generator_contexts_t object where the context is written or read from - * @param bits number of bits to generate - */ - void (*generate_reserved_field) (private_generator_t *this,int bits); - - /** - * Generates a FLAG field. - * - * @param this private_generator_t object - * @param generator_contexts generator_contexts_t object where the context is written or read from - * @param offset offset of flag value in data struct - */ - void (*generate_flag) (private_generator_t *this,u_int32_t offset); - - /** - * Writes the current buffer content into a chunk_t. - * - * Memory of specific chunk_t gets allocated. - * - * @param this calling private_generator_t object - * @param data pointer of chunk_t to write to - */ - void (*write_chunk) (private_generator_t *this,chunk_t *data); - - /** - * Generates a bytestream from a chunk_t. - * - * @param this private_generator_t object - * @param offset offset of chunk_t value in data struct - */ - void (*generate_from_chunk) (private_generator_t *this,u_int32_t offset); - - /** - * Makes sure enough space is available in buffer to store amount of bits. - * - * If buffer is to small to hold the specific amount of bits it - * is increased using reallocation function of allocator. - * - * @param this calling private_generator_t object - * @param bits number of bits to make available in buffer - */ - void (*make_space_available) (private_generator_t *this,size_t bits); - - /** - * Writes a specific amount of byte into the buffer. - * - * If buffer is to small to hold the specific amount of bytes it - * is increased. - * - * @param this calling private_generator_t object - * @param bytes pointer to bytes to write - * @param number_of_bytes number of bytes to write into buffer - */ - void (*write_bytes_to_buffer) (private_generator_t *this,void * bytes,size_t number_of_bytes); - - - /** - * Writes a specific amount of byte into the buffer at a specific offset. - * - * @warning buffer size is not check to hold the data if offset is to large. - * - * @param this calling private_generator_t object - * @param bytes pointer to bytes to write - * @param number_of_bytes number of bytes to write into buffer - * @param offset offset to write the data into - */ - void (*write_bytes_to_buffer_at_offset) (private_generator_t *this,void * bytes,size_t number_of_bytes,u_int32_t offset); /** * Buffer used to generate the data into. @@ -232,43 +113,116 @@ struct private_generator_t { }; /** - * Implementation of private_generator_t.get_current_buffer_size. + * Get size of current buffer in bytes. */ -static size_t get_current_buffer_size (private_generator_t *this) +static size_t get_current_buffer_size(private_generator_t *this) { - return ((this->roof_position) - (this->buffer)); + return this->roof_position - this->buffer; } /** - * Implementation of private_generator_t.get_current_buffer_space. + * Get free space of current buffer in bytes. */ -static size_t get_current_buffer_space (private_generator_t *this) +static size_t get_current_buffer_space(private_generator_t *this) { - /* we know, one byte more */ - size_t space = (this->roof_position) - (this->out_position); - return (space); + return this->roof_position - this->out_position; } /** - * Implementation of private_generator_t.get_current_data_length. + * Get length of data in buffer (in bytes). */ -static size_t get_current_data_length (private_generator_t *this) +static size_t get_current_data_length(private_generator_t *this) { - return (this->out_position - this->buffer); + return this->out_position - this->buffer; } /** - * Implementation of private_generator_t.get_current_buffer_offset. + * Get current offset in buffer (in bytes). */ -static u_int32_t get_current_buffer_offset (private_generator_t *this) +static u_int32_t get_current_buffer_offset(private_generator_t *this) { - return (this->out_position - this->buffer); + return this->out_position - this->buffer; } /** - * Implementation of private_generator_t.generate_u_int_type. + * Makes sure enough space is available in buffer to store amount of bits. */ -static void generate_u_int_type (private_generator_t *this,encoding_type_t int_type,u_int32_t offset) +static void make_space_available (private_generator_t *this, size_t bits) +{ + while ((get_current_buffer_space(this) * 8 - this->current_bit) < bits) + { + /* must increase buffer */ + size_t old_buffer_size = get_current_buffer_size(this); + size_t new_buffer_size = old_buffer_size + GENERATOR_DATA_BUFFER_INCREASE_VALUE; + size_t out_position_offset = ((this->out_position) - (this->buffer)); + + DBG2(DBG_ENC, "increased gen buffer from %d to %d byte", + old_buffer_size, new_buffer_size); + + /* Reallocate space for new buffer */ + this->buffer = realloc(this->buffer,new_buffer_size); + + this->out_position = (this->buffer + out_position_offset); + this->roof_position = (this->buffer + new_buffer_size); + } +} + +/** + * Writes a specific amount of byte into the buffer. + */ +static void write_bytes_to_buffer(private_generator_t *this, void * bytes, + size_t number_of_bytes) +{ + int i; + u_int8_t *read_position = (u_int8_t *) bytes; + + make_space_available(this, number_of_bytes * 8); + + for (i = 0; i < number_of_bytes; i++) + { + *(this->out_position) = *(read_position); + read_position++; + this->out_position++; + } +} + +/** + * Writes a specific amount of byte into the buffer at a specific offset. + */ +static void write_bytes_to_buffer_at_offset (private_generator_t *this, + void *bytes, size_t number_of_bytes, u_int32_t offset) +{ + int i; + u_int8_t *read_position = (u_int8_t *) bytes; + u_int8_t *write_position; + u_int32_t free_space_after_offset = get_current_buffer_size(this) - offset; + + /* check first if enough space for new data is available */ + if (number_of_bytes > free_space_after_offset) + { + make_space_available(this, (number_of_bytes - free_space_after_offset) * 8); + } + + write_position = this->buffer + offset; + for (i = 0; i < number_of_bytes; i++) + { + *write_position = *read_position; + read_position++; + write_position++; + } +} + +/** + * Generates a U_INT-Field type and writes it to buffer. + * + * @param this private_generator_t object + * @param int_type type of U_INT field (U_INT_4, U_INT_8, etc.) + * ATTRIBUTE_TYPE is also generated in this function + * @param offset offset of value in data struct + * @param generator_contexts generator_contexts_t object where the context is written or read from + */ +static void generate_u_int_type(private_generator_t *this, + encoding_type_t int_type,u_int32_t offset) { size_t number_of_bits = 0; @@ -316,7 +270,7 @@ static void generate_u_int_type (private_generator_t *this,encoding_type_t int_t } /* make sure enough space is available in buffer */ - this->make_space_available(this,number_of_bits); + make_space_available(this, number_of_bits); /* now handle each u int type differently */ switch (int_type) { @@ -386,7 +340,7 @@ static void generate_u_int_type (private_generator_t *this,encoding_type_t int_t int16_val = htons(int16_val); DBG3(DBG_ENC, " => %d", int16_val); /* write bytes to buffer (set bit is overwritten)*/ - this->write_bytes_to_buffer(this,&int16_val,sizeof(u_int16_t)); + write_bytes_to_buffer(this, &int16_val, sizeof(u_int16_t)); this->current_bit = 0; break; @@ -396,14 +350,14 @@ static void generate_u_int_type (private_generator_t *this,encoding_type_t int_t { u_int16_t int16_val = htons(*((u_int16_t*)(this->data_struct + offset))); DBG3(DBG_ENC, " => %b", (void*)&int16_val, sizeof(int16_val)); - this->write_bytes_to_buffer(this,&int16_val,sizeof(u_int16_t)); + write_bytes_to_buffer(this, &int16_val, sizeof(u_int16_t)); break; } case U_INT_32: { u_int32_t int32_val = htonl(*((u_int32_t*)(this->data_struct + offset))); DBG3(DBG_ENC, " => %b", (void*)&int32_val, sizeof(int32_val)); - this->write_bytes_to_buffer(this,&int32_val,sizeof(u_int32_t)); + write_bytes_to_buffer(this, &int32_val, sizeof(u_int32_t)); break; } case U_INT_64: @@ -415,15 +369,15 @@ static void generate_u_int_type (private_generator_t *this,encoding_type_t int_t (void*)&int32_val_low, sizeof(int32_val_low), (void*)&int32_val_high, sizeof(int32_val_high)); /* TODO add support for big endian machines */ - this->write_bytes_to_buffer(this,&int32_val_high,sizeof(u_int32_t)); - this->write_bytes_to_buffer(this,&int32_val_low,sizeof(u_int32_t)); + write_bytes_to_buffer(this, &int32_val_high, sizeof(u_int32_t)); + write_bytes_to_buffer(this, &int32_val_low, sizeof(u_int32_t)); break; } case IKE_SPI: { /* 64 bit are written as they come :-) */ - this->write_bytes_to_buffer(this,(this->data_struct + offset),sizeof(u_int64_t)); + write_bytes_to_buffer(this, this->data_struct + offset, sizeof(u_int64_t)); DBG3(DBG_ENC, " => %b", (void*)(this->data_struct + offset), sizeof(u_int64_t)); break; } @@ -437,9 +391,9 @@ static void generate_u_int_type (private_generator_t *this,encoding_type_t int_t } /** - * Implementation of private_generator_t.generate_reserved_field. + * Generate a reserved bit or byte */ -static void generate_reserved_field(private_generator_t *this,int bits) +static void generate_reserved_field(private_generator_t *this, int bits) { /* only one bit or 8 bit fields are supported */ if ((bits != 1) && (bits != 8)) @@ -448,7 +402,7 @@ static void generate_reserved_field(private_generator_t *this,int bits) return ; } /* make sure enough space is available in buffer */ - this->make_space_available(this,bits); + make_space_available(this, bits); if (bits == 1) { @@ -460,8 +414,6 @@ static void generate_reserved_field(private_generator_t *this,int bits) /* memory must be zero */ *(this->out_position) = 0x00; } - - this->current_bit++; if (this->current_bit >= 8) { @@ -484,9 +436,9 @@ static void generate_reserved_field(private_generator_t *this,int bits) } /** - * Implementation of private_generator_t.generate_flag. + * Generate a FLAG filed */ -static void generate_flag (private_generator_t *this,u_int32_t offset) +static void generate_flag(private_generator_t *this, u_int32_t offset) { /* value of current flag */ u_int8_t flag_value; @@ -499,7 +451,7 @@ static void generate_flag (private_generator_t *this,u_int32_t offset) flag = (flag_value << (7 - this->current_bit)); /* make sure one bit is available in buffer */ - this->make_space_available(this,1); + make_space_available(this, 1); if (this->current_bit == 0) { /* memory must be zero */ @@ -520,9 +472,9 @@ static void generate_flag (private_generator_t *this,u_int32_t offset) } /** - * Implementation of private_generator_t.generate_from_chunk. + * Generates a bytestream from a chunk_t. */ -static void generate_from_chunk (private_generator_t *this,u_int32_t offset) +static void generate_from_chunk(private_generator_t *this, u_int32_t offset) { if (this->current_bit != 0) { @@ -536,73 +488,7 @@ static void generate_from_chunk (private_generator_t *this,u_int32_t offset) DBG3(DBG_ENC, " => %B", attribute_value); /* use write_bytes_to_buffer function to do the job */ - this->write_bytes_to_buffer(this,attribute_value->ptr,attribute_value->len); -} - -/** - * Implementation of private_generator_t.make_space_available. - */ -static void make_space_available (private_generator_t *this, size_t bits) -{ - while (((this->get_current_buffer_space(this) * 8) - this->current_bit) < bits) - { - /* must increase buffer */ - size_t old_buffer_size = this->get_current_buffer_size(this); - size_t new_buffer_size = old_buffer_size + GENERATOR_DATA_BUFFER_INCREASE_VALUE; - size_t out_position_offset = ((this->out_position) - (this->buffer)); - - DBG2(DBG_ENC, "increased gen buffer from %d to %d byte", - old_buffer_size, new_buffer_size); - - /* Reallocate space for new buffer */ - this->buffer = realloc(this->buffer,new_buffer_size); - - this->out_position = (this->buffer + out_position_offset); - this->roof_position = (this->buffer + new_buffer_size); - } -} - -/** - * Implementation of private_generator_t.write_bytes_to_buffer. - */ -static void write_bytes_to_buffer (private_generator_t *this,void * bytes, size_t number_of_bytes) -{ - int i; - u_int8_t *read_position = (u_int8_t *) bytes; - - this->make_space_available(this,number_of_bytes * 8); - - for (i = 0; i < number_of_bytes; i++) - { - *(this->out_position) = *(read_position); - read_position++; - this->out_position++; - } -} - -/** - * Implementation of private_generator_t.write_bytes_to_buffer_at_offset. - */ -static void write_bytes_to_buffer_at_offset (private_generator_t *this,void * bytes,size_t number_of_bytes,u_int32_t offset) -{ - int i; - u_int8_t *read_position = (u_int8_t *) bytes; - u_int8_t *write_position; - u_int32_t free_space_after_offset = (this->get_current_buffer_size(this) - offset); - - /* check first if enough space for new data is available */ - if (number_of_bytes > free_space_after_offset) - { - this->make_space_available(this,(number_of_bytes - free_space_after_offset) * 8); - } - - write_position = this->buffer + offset; - for (i = 0; i < number_of_bytes; i++) - { - *(write_position) = *(read_position); - read_position++; - write_position++; - } + write_bytes_to_buffer(this, attribute_value->ptr, attribute_value->len); } /** @@ -610,14 +496,15 @@ static void write_bytes_to_buffer_at_offset (private_generator_t *this,void * by */ static void write_to_chunk (private_generator_t *this,chunk_t *data) { - size_t data_length = this->get_current_data_length(this); + size_t data_length = get_current_data_length(this); u_int32_t header_length_field = data_length; /* write length into header length field */ if (this->header_length_position_offset > 0) { u_int32_t int32_val = htonl(header_length_field); - this->write_bytes_to_buffer_at_offset(this,&int32_val,sizeof(u_int32_t),this->header_length_position_offset); + write_bytes_to_buffer_at_offset(this, &int32_val, sizeof(u_int32_t), + this->header_length_position_offset); } if (this->current_bit > 0) @@ -660,7 +547,6 @@ static void generate_payload (private_generator_t *this,payload_t *payload) i, encoding_type_names, rules[i].type); switch (rules[i].type) { - /* all u int values, IKE_SPI,TS_TYPE and ATTRIBUTE_TYPE are generated in generate_u_int_type */ case U_INT_4: case U_INT_8: case U_INT_16: @@ -671,56 +557,56 @@ static void generate_payload (private_generator_t *this,payload_t *payload) case ATTRIBUTE_TYPE: case CONFIGURATION_ATTRIBUTE_LENGTH: { - this->generate_u_int_type(this,rules[i].type,rules[i].offset); + generate_u_int_type(this, rules[i].type,rules[i].offset); break; } case RESERVED_BIT: { - this->generate_reserved_field(this,1); + generate_reserved_field(this, 1); break; } case RESERVED_BYTE: { - this->generate_reserved_field(this,8); + generate_reserved_field(this, 8); break; } case FLAG: { - this->generate_flag(this,rules[i].offset); + generate_flag(this, rules[i].offset); break; } case PAYLOAD_LENGTH: { /* position of payload lenght field is temporary stored */ - this->last_payload_length_position_offset = this->get_current_buffer_offset(this); + this->last_payload_length_position_offset = get_current_buffer_offset(this); /* payload length is generated like an U_INT_16 */ - this->generate_u_int_type(this,U_INT_16,rules[i].offset); + generate_u_int_type(this, U_INT_16,rules[i].offset); break; } case HEADER_LENGTH: { /* position of header length field is temporary stored */ - this->header_length_position_offset = this->get_current_buffer_offset(this); + this->header_length_position_offset = get_current_buffer_offset(this); /* header length is generated like an U_INT_32 */ - this->generate_u_int_type(this,U_INT_32,rules[i].offset); + generate_u_int_type(this ,U_INT_32, rules[i].offset); break; } case SPI_SIZE: /* spi size is handled as 8 bit unsigned integer */ - this->generate_u_int_type(this,U_INT_8,rules[i].offset); + generate_u_int_type(this, U_INT_8, rules[i].offset); /* last spi size is temporary stored */ this->last_spi_size = *((u_int8_t *)(this->data_struct + rules[i].offset)); break; case ADDRESS: { /* the Address value is generated from chunk */ - this->generate_from_chunk(this,rules[i].offset); + generate_from_chunk(this, rules[i].offset); break; } case SPI: { /* the SPI value is generated from chunk */ - this->generate_from_chunk(this,rules[i].offset); + generate_from_chunk(this, rules[i].offset); break; } case KEY_EXCHANGE_DATA: @@ -780,16 +666,17 @@ static void generate_payload (private_generator_t *this,payload_t *payload) } /* the data value is generated from chunk */ - this->generate_from_chunk(this,rules[i].offset); - + generate_from_chunk(this, rules[i].offset); + payload_length_position_offset = this->last_payload_length_position_offset; /* Length of payload is calculated */ length_of_payload = header_length + ((chunk_t *)(this->data_struct + rules[i].offset))->len; - + length_in_network_order = htons(length_of_payload); - this->write_bytes_to_buffer_at_offset(this,&length_in_network_order,sizeof(u_int16_t),payload_length_position_offset); + write_bytes_to_buffer_at_offset(this, &length_in_network_order, + sizeof(u_int16_t),payload_length_position_offset); break; } case PROPOSALS: @@ -812,9 +699,9 @@ static void generate_payload (private_generator_t *this,payload_t *payload) u_int32_t before_generate_position_offset; u_int32_t after_generate_position_offset; - before_generate_position_offset = this->get_current_buffer_offset(this); + before_generate_position_offset = get_current_buffer_offset(this); this->public.generate_payload(&(this->public),current_proposal); - after_generate_position_offset = this->get_current_buffer_offset(this); + after_generate_position_offset = get_current_buffer_offset(this); /* increase size of transform */ length_of_sa_payload += (after_generate_position_offset - before_generate_position_offset); @@ -822,7 +709,8 @@ static void generate_payload (private_generator_t *this,payload_t *payload) iterator->destroy(iterator); int16_val = htons(length_of_sa_payload); - this->write_bytes_to_buffer_at_offset(this,&int16_val,sizeof(u_int16_t),payload_length_position_offset); + write_bytes_to_buffer_at_offset(this, &int16_val, + sizeof(u_int16_t),payload_length_position_offset); break; } case TRANSFORMS: @@ -842,9 +730,9 @@ static void generate_payload (private_generator_t *this,payload_t *payload) u_int32_t before_generate_position_offset; u_int32_t after_generate_position_offset; - before_generate_position_offset = this->get_current_buffer_offset(this); + before_generate_position_offset = get_current_buffer_offset(this); this->public.generate_payload(&(this->public),current_transform); - after_generate_position_offset = this->get_current_buffer_offset(this); + after_generate_position_offset = get_current_buffer_offset(this); /* increase size of transform */ length_of_proposal += (after_generate_position_offset - before_generate_position_offset); @@ -853,7 +741,8 @@ static void generate_payload (private_generator_t *this,payload_t *payload) iterator->destroy(iterator); int16_val = htons(length_of_proposal); - this->write_bytes_to_buffer_at_offset(this,&int16_val,sizeof(u_int16_t),payload_length_position_offset); + write_bytes_to_buffer_at_offset(this, &int16_val, + sizeof(u_int16_t), payload_length_position_offset); break; } @@ -874,9 +763,9 @@ static void generate_payload (private_generator_t *this,payload_t *payload) u_int32_t before_generate_position_offset; u_int32_t after_generate_position_offset; - before_generate_position_offset = this->get_current_buffer_offset(this); + before_generate_position_offset = get_current_buffer_offset(this); this->public.generate_payload(&(this->public),current_attribute); - after_generate_position_offset = this->get_current_buffer_offset(this); + after_generate_position_offset = get_current_buffer_offset(this); /* increase size of transform */ length_of_transform += (after_generate_position_offset - before_generate_position_offset); @@ -885,7 +774,8 @@ static void generate_payload (private_generator_t *this,payload_t *payload) iterator->destroy(iterator); int16_val = htons(length_of_transform); - this->write_bytes_to_buffer_at_offset(this,&int16_val,sizeof(u_int16_t),transform_length_position_offset); + write_bytes_to_buffer_at_offset(this, &int16_val, + sizeof(u_int16_t),transform_length_position_offset); break; } @@ -906,9 +796,9 @@ static void generate_payload (private_generator_t *this,payload_t *payload) u_int32_t before_generate_position_offset; u_int32_t after_generate_position_offset; - before_generate_position_offset = this->get_current_buffer_offset(this); + before_generate_position_offset = get_current_buffer_offset(this); this->public.generate_payload(&(this->public),current_attribute); - after_generate_position_offset = this->get_current_buffer_offset(this); + after_generate_position_offset = get_current_buffer_offset(this); /* increase size of transform */ length_of_configurations += (after_generate_position_offset - before_generate_position_offset); @@ -917,13 +807,14 @@ static void generate_payload (private_generator_t *this,payload_t *payload) iterator->destroy(iterator); int16_val = htons(length_of_configurations); - this->write_bytes_to_buffer_at_offset(this,&int16_val,sizeof(u_int16_t),configurations_length_position_offset); + write_bytes_to_buffer_at_offset(this, &int16_val, + sizeof(u_int16_t),configurations_length_position_offset); break; } case ATTRIBUTE_FORMAT: { - this->generate_flag(this,rules[i].offset); + generate_flag(this, rules[i].offset); /* Attribute format is a flag which is stored in context*/ this->attribute_format = *((bool *) (this->data_struct + rules[i].offset)); break; @@ -933,13 +824,13 @@ static void generate_payload (private_generator_t *this,payload_t *payload) { if (this->attribute_format == FALSE) { - this->generate_u_int_type(this,U_INT_16,rules[i].offset); + generate_u_int_type(this, U_INT_16, rules[i].offset); /* this field hold the length of the attribute */ this->attribute_length = *((u_int16_t *)(this->data_struct + rules[i].offset)); } else { - this->generate_u_int_type(this,U_INT_16,rules[i].offset); + generate_u_int_type(this, U_INT_16, rules[i].offset); } break; } @@ -949,7 +840,7 @@ static void generate_payload (private_generator_t *this,payload_t *payload) { DBG2(DBG_ENC, "attribute value has not fixed size"); /* the attribute value is generated */ - this->generate_from_chunk(this,rules[i].offset); + generate_from_chunk(this, rules[i].offset); } break; } @@ -973,9 +864,9 @@ static void generate_payload (private_generator_t *this,payload_t *payload) u_int32_t before_generate_position_offset; u_int32_t after_generate_position_offset; - before_generate_position_offset = this->get_current_buffer_offset(this); + before_generate_position_offset = get_current_buffer_offset(this); this->public.generate_payload(&(this->public),current_traffic_selector_substructure); - after_generate_position_offset = this->get_current_buffer_offset(this); + after_generate_position_offset = get_current_buffer_offset(this); /* increase size of transform */ length_of_ts_payload += (after_generate_position_offset - before_generate_position_offset); @@ -983,13 +874,14 @@ static void generate_payload (private_generator_t *this,payload_t *payload) iterator->destroy(iterator); int16_val = htons(length_of_ts_payload); - this->write_bytes_to_buffer_at_offset(this,&int16_val,sizeof(u_int16_t),payload_length_position_offset); + write_bytes_to_buffer_at_offset(this, &int16_val, + sizeof(u_int16_t),payload_length_position_offset); break; } case ENCRYPTED_DATA: { - this->generate_from_chunk(this, rules[i].offset); + generate_from_chunk(this, rules[i].offset); break; } default: @@ -1028,24 +920,9 @@ generator_t *generator_create() this->public.destroy = (void(*)(generator_t*)) destroy; this->public.write_to_chunk = (void (*) (generator_t *,chunk_t *)) write_to_chunk; - - /* initiate private functions */ - this->get_current_buffer_size = get_current_buffer_size; - this->get_current_buffer_space = get_current_buffer_space; - this->get_current_data_length = get_current_data_length; - this->get_current_buffer_offset = get_current_buffer_offset; - this->generate_u_int_type = generate_u_int_type; - this->generate_reserved_field = generate_reserved_field; - this->generate_flag = generate_flag; - this->generate_from_chunk = generate_from_chunk; - this->make_space_available = make_space_available; - this->write_bytes_to_buffer = write_bytes_to_buffer; - this->write_bytes_to_buffer_at_offset = write_bytes_to_buffer_at_offset; - - /* allocate memory for buffer */ this->buffer = malloc(GENERATOR_DATA_BUFFER_SIZE); - + /* initiate private variables */ this->out_position = this->buffer; this->roof_position = this->buffer + GENERATOR_DATA_BUFFER_SIZE; @@ -1053,6 +930,7 @@ generator_t *generator_create() this->current_bit = 0; this->last_payload_length_position_offset = 0; this->header_length_position_offset = 0; - + return &(this->public); } + diff --git a/src/charon/encoding/generator.h b/src/charon/encoding/generator.h index b6f2af2cb..d1d3522d0 100644 --- a/src/charon/encoding/generator.h +++ b/src/charon/encoding/generator.h @@ -13,7 +13,7 @@ * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License * for more details. * - * $Id: generator.h 3589 2008-03-13 14:14:44Z martin $ + * $Id: generator.h 4702 2008-11-26 10:42:54Z martin $ */ /** @@ -32,12 +32,12 @@ typedef struct generator_t generator_t; /** * Generating is done in a data buffer. - * This is thehe start size of this buffer in bytes. + * This is the start size of this buffer in bytes. */ #define GENERATOR_DATA_BUFFER_SIZE 500 /** - * Number of bytes to increase the buffer, if it is to small. + * Number of bytes to increase the buffer, if it is too small. */ #define GENERATOR_DATA_BUFFER_INCREASE_VALUE 500 diff --git a/src/charon/encoding/parser.c b/src/charon/encoding/parser.c index 1b03aacb2..396054810 100644 --- a/src/charon/encoding/parser.c +++ b/src/charon/encoding/parser.c @@ -13,7 +13,7 @@ * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License * for more details. * - * $Id: parser.c 4010 2008-05-23 18:23:17Z martin $ + * $Id: parser.c 4703 2008-11-26 10:54:08Z martin $ */ #include <stdlib.h> @@ -62,147 +62,6 @@ struct private_parser_t { parser_t public; /** - * Parse a 4-Bit unsigned integer from the current parsing position. - * - * @param this parser_t object - * @param rule_number number of current rule - * @param[out] output_pos pointer where to write the parsed result - * @return - * - SUCCESS or - * - PARSE_ERROR when not successful - */ - status_t (*parse_uint4) (private_parser_t *this, int rule_number, u_int8_t *output_pos); - - /** - * Parse a 8-Bit unsigned integer from the current parsing position. - * - * @param this parser_t object - * @param rule_number number of current rule - * @param[out] output_pos pointer where to write the parsed result - * @return - * - SUCCESS or - * - PARSE_ERROR when not successful - */ - status_t (*parse_uint8) (private_parser_t *this, int rule_number, u_int8_t *output_pos); - - /** - * Parse a 15-Bit unsigned integer from the current parsing position. - * - * This is a special case used for ATTRIBUTE_TYPE. - * Big-/Little-endian conversion is done here. - * - * @param this parser_t object - * @param rule_number number of current rule - * @param[out] output_pos pointer where to write the parsed result - * @return - * - SUCCESS or - * - PARSE_ERROR when not successful - */ - status_t (*parse_uint15) (private_parser_t *this, int rule_number, u_int16_t *output_pos); - - /** - * Parse a 16-Bit unsigned integer from the current parsing position. - * - * Big-/Little-endian conversion is done here. - * - * @param this parser_t object - * @param rule_number number of current rule - * @param[out] output_pos pointer where to write the parsed result - * @return - * - SUCCESS or - * - PARSE_ERROR when not successful - */ - status_t (*parse_uint16) (private_parser_t *this, int rule_number, u_int16_t *output_pos); - - /** - * Parse a 32-Bit unsigned integer from the current parsing position. - * - * Big-/Little-endian conversion is done here. - * - * @param this parser_t object - * @param rule_number number of current rule - * @param[out] output_pos pointer where to write the parsed result - * @return - * - SUCCESS or - * - PARSE_ERROR when not successful - */ - status_t (*parse_uint32) (private_parser_t *this, int rule_number, u_int32_t *output_pos); - - /** - * Parse a 64-Bit unsigned integer from the current parsing position. - * - * @todo add support for big-endian machines. - * - * @param this parser_t object - * @param rule_number number of current rule - * @param[out] output_pos pointer where to write the parsed result - * @return - * - SUCCESS or - * - PARSE_ERROR when not successful - */ - status_t (*parse_uint64) (private_parser_t *this, int rule_number, u_int64_t *output_pos); - - /** - * Parse a given amount of bytes and writes them to a specific location - * - * @param this parser_t object - * @param rule_number number of current rule - * @param[out] output_pos pointer where to write the parsed result - * @param bytes number of bytes to parse - * @return - * - SUCCESS or - * - PARSE_ERROR when not successful - */ - status_t (*parse_bytes) (private_parser_t *this, int rule_number, u_int8_t *output_pos,size_t bytes); - - /** - * Parse a single Bit from the current parsing position - * - * @param this parser_t object - * @param rule_number number of current rule - * @param[out] output_pos pointer where to write the parsed result - * @return - * - SUCCESS or - * - PARSE_ERROR when not successful - */ - status_t (*parse_bit) (private_parser_t *this, int rule_number, bool *output_pos); - - /** - * Parse substructures in a list - * - * This function calls the parser recursively to parse contained substructures - * in a linked_list_t. The list must already be created. Payload defines - * the type of the substructures. parsing is continued until the specified length - * is completely parsed. - * - * @param this parser_t object - * @param rule_number number of current rule - * @param[out] output_pos pointer of a linked_list where substructures are added - * @param payload_type type of the contained substructures to parse - * @param length number of bytes to parse in this list - * @return - * - SUCCESS or - * - PARSE_ERROR when not successful - */ - status_t (*parse_list) (private_parser_t *this, int rule_number, linked_list_t **output_pos, payload_type_t payload_ype, size_t length); - - /** - * Parse data from current parsing position in a chunk. - * - * This function clones length number of bytes to output_pos, without - * modifiyng them. Space will be allocated and must be freed by caller. - * - * @param this parser_t object - * @param rule_number number of current rule - * @param[out] output_pos pointer of a chunk which will point to the allocated data - * @param length number of bytes to clone - * @return - * - SUCCESS or - * - PARSE_ERROR when not successful - */ - status_t (*parse_chunk) (private_parser_t *this, int rule_number, chunk_t *output_pos, size_t length); - - /** * Current bit for reading in input data. */ u_int8_t bit_pos; @@ -229,7 +88,7 @@ struct private_parser_t { }; /** - * Implementation of private_parser_t.parse_uint4. + * Parse a 4-Bit unsigned integer from the current parsing position. */ static status_t parse_uint4(private_parser_t *this, int rule_number, u_int8_t *output_pos) { @@ -274,7 +133,7 @@ static status_t parse_uint4(private_parser_t *this, int rule_number, u_int8_t *o } /** - * Implementation of private_parser_t.parse_uint8. + * Parse a 8-Bit unsigned integer from the current parsing position. */ static status_t parse_uint8(private_parser_t *this, int rule_number, u_int8_t *output_pos) { @@ -304,7 +163,7 @@ static status_t parse_uint8(private_parser_t *this, int rule_number, u_int8_t *o } /** - * Implementation of private_parser_t.parse_uint15. + * Parse a 15-Bit unsigned integer from the current parsing position. */ static status_t parse_uint15(private_parser_t *this, int rule_number, u_int16_t *output_pos) { @@ -333,7 +192,7 @@ static status_t parse_uint15(private_parser_t *this, int rule_number, u_int16_t } /** - * Implementation of private_parser_t.parse_uint16. + * Parse a 16-Bit unsigned integer from the current parsing position. */ static status_t parse_uint16(private_parser_t *this, int rule_number, u_int16_t *output_pos) { @@ -361,7 +220,7 @@ static status_t parse_uint16(private_parser_t *this, int rule_number, u_int16_t return SUCCESS; } /** - * Implementation of private_parser_t.parse_uint32. + * Parse a 32-Bit unsigned integer from the current parsing position. */ static status_t parse_uint32(private_parser_t *this, int rule_number, u_int32_t *output_pos) { @@ -390,7 +249,7 @@ static status_t parse_uint32(private_parser_t *this, int rule_number, u_int32_t } /** - * Implementation of private_parser_t.parse_uint64. + * Parse a 64-Bit unsigned integer from the current parsing position. */ static status_t parse_uint64(private_parser_t *this, int rule_number, u_int64_t *output_pos) { @@ -421,7 +280,7 @@ static status_t parse_uint64(private_parser_t *this, int rule_number, u_int64_t } /** - * Implementation of private_parser_t.parse_bytes. + * Parse a given amount of bytes and writes them to a specific location */ static status_t parse_bytes (private_parser_t *this, int rule_number, u_int8_t *output_pos,size_t bytes) { @@ -451,7 +310,7 @@ static status_t parse_bytes (private_parser_t *this, int rule_number, u_int8_t * } /** - * Implementation of private_parser_t.parse_bit. + * Parse a single Bit from the current parsing position */ static status_t parse_bit(private_parser_t *this, int rule_number, bool *output_pos) { @@ -486,7 +345,7 @@ static status_t parse_bit(private_parser_t *this, int rule_number, bool *output_ } /** - * Implementation of private_parser_t.parse_list. + * Parse substructures in a list. */ static status_t parse_list(private_parser_t *this, int rule_number, linked_list_t **output_pos, payload_type_t payload_type, size_t length) { @@ -528,7 +387,7 @@ static status_t parse_list(private_parser_t *this, int rule_number, linked_list_ } /** - * Implementation of private_parser_t.parse_chunk. + * Parse data from current parsing position in a chunk. */ static status_t parse_chunk(private_parser_t *this, int rule_number, chunk_t *output_pos, size_t length) { @@ -598,7 +457,7 @@ static status_t parse_payload(private_parser_t *this, payload_type_t payload_typ { case U_INT_4: { - if (this->parse_uint4(this, rule_number, output + rule->offset) != SUCCESS) + if (parse_uint4(this, rule_number, output + rule->offset) != SUCCESS) { pld->destroy(pld); return PARSE_ERROR; @@ -607,7 +466,7 @@ static status_t parse_payload(private_parser_t *this, payload_type_t payload_typ } case U_INT_8: { - if (this->parse_uint8(this, rule_number, output + rule->offset) != SUCCESS) + if (parse_uint8(this, rule_number, output + rule->offset) != SUCCESS) { pld->destroy(pld); return PARSE_ERROR; @@ -616,7 +475,7 @@ static status_t parse_payload(private_parser_t *this, payload_type_t payload_typ } case U_INT_16: { - if (this->parse_uint16(this, rule_number, output + rule->offset) != SUCCESS) + if (parse_uint16(this, rule_number, output + rule->offset) != SUCCESS) { pld->destroy(pld); return PARSE_ERROR; @@ -625,7 +484,7 @@ static status_t parse_payload(private_parser_t *this, payload_type_t payload_typ } case U_INT_32: { - if (this->parse_uint32(this, rule_number, output + rule->offset) != SUCCESS) + if (parse_uint32(this, rule_number, output + rule->offset) != SUCCESS) { pld->destroy(pld); return PARSE_ERROR; @@ -634,7 +493,7 @@ static status_t parse_payload(private_parser_t *this, payload_type_t payload_typ } case U_INT_64: { - if (this->parse_uint64(this, rule_number, output + rule->offset) != SUCCESS) + if (parse_uint64(this, rule_number, output + rule->offset) != SUCCESS) { pld->destroy(pld); return PARSE_ERROR; @@ -643,7 +502,7 @@ static status_t parse_payload(private_parser_t *this, payload_type_t payload_typ } case IKE_SPI: { - if (this->parse_bytes(this, rule_number, output + rule->offset,8) != SUCCESS) + if (parse_bytes(this, rule_number, output + rule->offset,8) != SUCCESS) { pld->destroy(pld); return PARSE_ERROR; @@ -652,7 +511,7 @@ static status_t parse_payload(private_parser_t *this, payload_type_t payload_typ } case RESERVED_BIT: { - if (this->parse_bit(this, rule_number, NULL) != SUCCESS) + if (parse_bit(this, rule_number, NULL) != SUCCESS) { pld->destroy(pld); return PARSE_ERROR; @@ -661,7 +520,7 @@ static status_t parse_payload(private_parser_t *this, payload_type_t payload_typ } case RESERVED_BYTE: { - if (this->parse_uint8(this, rule_number, NULL) != SUCCESS) + if (parse_uint8(this, rule_number, NULL) != SUCCESS) { pld->destroy(pld); return PARSE_ERROR; @@ -670,7 +529,7 @@ static status_t parse_payload(private_parser_t *this, payload_type_t payload_typ } case FLAG: { - if (this->parse_bit(this, rule_number, output + rule->offset) != SUCCESS) + if (parse_bit(this, rule_number, output + rule->offset) != SUCCESS) { pld->destroy(pld); return PARSE_ERROR; @@ -679,7 +538,7 @@ static status_t parse_payload(private_parser_t *this, payload_type_t payload_typ } case PAYLOAD_LENGTH: { - if (this->parse_uint16(this, rule_number, output + rule->offset) != SUCCESS) + if (parse_uint16(this, rule_number, output + rule->offset) != SUCCESS) { pld->destroy(pld); return PARSE_ERROR; @@ -694,7 +553,7 @@ static status_t parse_payload(private_parser_t *this, payload_type_t payload_typ } case HEADER_LENGTH: { - if (this->parse_uint32(this, rule_number, output + rule->offset) != SUCCESS) + if (parse_uint32(this, rule_number, output + rule->offset) != SUCCESS) { pld->destroy(pld); return PARSE_ERROR; @@ -703,7 +562,7 @@ static status_t parse_payload(private_parser_t *this, payload_type_t payload_typ } case SPI_SIZE: { - if (this->parse_uint8(this, rule_number, output + rule->offset) != SUCCESS) + if (parse_uint8(this, rule_number, output + rule->offset) != SUCCESS) { pld->destroy(pld); return PARSE_ERROR; @@ -713,7 +572,7 @@ static status_t parse_payload(private_parser_t *this, payload_type_t payload_typ } case SPI: { - if (this->parse_chunk(this, rule_number, output + rule->offset, spi_size) != SUCCESS) + if (parse_chunk(this, rule_number, output + rule->offset, spi_size) != SUCCESS) { pld->destroy(pld); return PARSE_ERROR; @@ -723,7 +582,7 @@ static status_t parse_payload(private_parser_t *this, payload_type_t payload_typ case PROPOSALS: { if (payload_length < SA_PAYLOAD_HEADER_LENGTH || - this->parse_list(this, rule_number, output + rule->offset, PROPOSAL_SUBSTRUCTURE, + parse_list(this, rule_number, output + rule->offset, PROPOSAL_SUBSTRUCTURE, payload_length - SA_PAYLOAD_HEADER_LENGTH) != SUCCESS) { pld->destroy(pld); @@ -734,7 +593,7 @@ static status_t parse_payload(private_parser_t *this, payload_type_t payload_typ case TRANSFORMS: { if (payload_length < spi_size + PROPOSAL_SUBSTRUCTURE_HEADER_LENGTH || - this->parse_list(this, rule_number, output + rule->offset, TRANSFORM_SUBSTRUCTURE, + parse_list(this, rule_number, output + rule->offset, TRANSFORM_SUBSTRUCTURE, payload_length - spi_size - PROPOSAL_SUBSTRUCTURE_HEADER_LENGTH) != SUCCESS) { pld->destroy(pld); @@ -745,7 +604,7 @@ static status_t parse_payload(private_parser_t *this, payload_type_t payload_typ case TRANSFORM_ATTRIBUTES: { if (payload_length < TRANSFORM_SUBSTRUCTURE_HEADER_LENGTH || - this->parse_list(this, rule_number, output + rule->offset, TRANSFORM_ATTRIBUTE, + parse_list(this, rule_number, output + rule->offset, TRANSFORM_ATTRIBUTE, payload_length - TRANSFORM_SUBSTRUCTURE_HEADER_LENGTH) != SUCCESS) { pld->destroy(pld); @@ -756,7 +615,7 @@ static status_t parse_payload(private_parser_t *this, payload_type_t payload_typ case CONFIGURATION_ATTRIBUTES: { if (payload_length < CP_PAYLOAD_HEADER_LENGTH || - this->parse_list(this, rule_number, output + rule->offset, CONFIGURATION_ATTRIBUTE, + parse_list(this, rule_number, output + rule->offset, CONFIGURATION_ATTRIBUTE, payload_length - CP_PAYLOAD_HEADER_LENGTH) != SUCCESS) { pld->destroy(pld); @@ -766,7 +625,7 @@ static status_t parse_payload(private_parser_t *this, payload_type_t payload_typ } case ATTRIBUTE_FORMAT: { - if (this->parse_bit(this, rule_number, output + rule->offset) != SUCCESS) + if (parse_bit(this, rule_number, output + rule->offset) != SUCCESS) { pld->destroy(pld); return PARSE_ERROR; @@ -776,7 +635,7 @@ static status_t parse_payload(private_parser_t *this, payload_type_t payload_typ } case ATTRIBUTE_TYPE: { - if (this->parse_uint15(this, rule_number, output + rule->offset) != SUCCESS) + if (parse_uint15(this, rule_number, output + rule->offset) != SUCCESS) { pld->destroy(pld); return PARSE_ERROR; @@ -786,7 +645,7 @@ static status_t parse_payload(private_parser_t *this, payload_type_t payload_typ } case CONFIGURATION_ATTRIBUTE_LENGTH: { - if (this->parse_uint16(this, rule_number, output + rule->offset) != SUCCESS) + if (parse_uint16(this, rule_number, output + rule->offset) != SUCCESS) { pld->destroy(pld); return PARSE_ERROR; @@ -796,7 +655,7 @@ static status_t parse_payload(private_parser_t *this, payload_type_t payload_typ } case ATTRIBUTE_LENGTH_OR_VALUE: { - if (this->parse_uint16(this, rule_number, output + rule->offset) != SUCCESS) + if (parse_uint16(this, rule_number, output + rule->offset) != SUCCESS) { pld->destroy(pld); return PARSE_ERROR; @@ -808,7 +667,7 @@ static status_t parse_payload(private_parser_t *this, payload_type_t payload_typ { if (attribute_format == FALSE) { - if (this->parse_chunk(this, rule_number, output + rule->offset, attribute_length) != SUCCESS) + if (parse_chunk(this, rule_number, output + rule->offset, attribute_length) != SUCCESS) { pld->destroy(pld); return PARSE_ERROR; @@ -819,7 +678,7 @@ static status_t parse_payload(private_parser_t *this, payload_type_t payload_typ case NONCE_DATA: { if (payload_length < NONCE_PAYLOAD_HEADER_LENGTH || - this->parse_chunk(this, rule_number, output + rule->offset, + parse_chunk(this, rule_number, output + rule->offset, payload_length - NONCE_PAYLOAD_HEADER_LENGTH) != SUCCESS) { pld->destroy(pld); @@ -830,7 +689,7 @@ static status_t parse_payload(private_parser_t *this, payload_type_t payload_typ case ID_DATA: { if (payload_length < ID_PAYLOAD_HEADER_LENGTH || - this->parse_chunk(this, rule_number, output + rule->offset, + parse_chunk(this, rule_number, output + rule->offset, payload_length - ID_PAYLOAD_HEADER_LENGTH) != SUCCESS) { pld->destroy(pld); @@ -841,7 +700,7 @@ static status_t parse_payload(private_parser_t *this, payload_type_t payload_typ case AUTH_DATA: { if (payload_length < AUTH_PAYLOAD_HEADER_LENGTH || - this->parse_chunk(this, rule_number, output + rule->offset, + parse_chunk(this, rule_number, output + rule->offset, payload_length - AUTH_PAYLOAD_HEADER_LENGTH) != SUCCESS) { pld->destroy(pld); @@ -852,7 +711,7 @@ static status_t parse_payload(private_parser_t *this, payload_type_t payload_typ case CERT_DATA: { if (payload_length < CERT_PAYLOAD_HEADER_LENGTH || - this->parse_chunk(this, rule_number, output + rule->offset, + parse_chunk(this, rule_number, output + rule->offset, payload_length - CERT_PAYLOAD_HEADER_LENGTH) != SUCCESS) { pld->destroy(pld); @@ -863,7 +722,7 @@ static status_t parse_payload(private_parser_t *this, payload_type_t payload_typ case CERTREQ_DATA: { if (payload_length < CERTREQ_PAYLOAD_HEADER_LENGTH || - this->parse_chunk(this, rule_number, output + rule->offset, + parse_chunk(this, rule_number, output + rule->offset, payload_length - CERTREQ_PAYLOAD_HEADER_LENGTH) != SUCCESS) { pld->destroy(pld); @@ -874,7 +733,7 @@ static status_t parse_payload(private_parser_t *this, payload_type_t payload_typ case EAP_DATA: { if (payload_length < EAP_PAYLOAD_HEADER_LENGTH || - this->parse_chunk(this, rule_number, output + rule->offset, + parse_chunk(this, rule_number, output + rule->offset, payload_length - EAP_PAYLOAD_HEADER_LENGTH) != SUCCESS) { pld->destroy(pld); @@ -885,7 +744,7 @@ static status_t parse_payload(private_parser_t *this, payload_type_t payload_typ case SPIS: { if (payload_length < DELETE_PAYLOAD_HEADER_LENGTH || - this->parse_chunk(this, rule_number, output + rule->offset, + parse_chunk(this, rule_number, output + rule->offset, payload_length - DELETE_PAYLOAD_HEADER_LENGTH) != SUCCESS) { pld->destroy(pld); @@ -896,7 +755,7 @@ static status_t parse_payload(private_parser_t *this, payload_type_t payload_typ case VID_DATA: { if (payload_length < VENDOR_ID_PAYLOAD_HEADER_LENGTH || - this->parse_chunk(this, rule_number, output + rule->offset, + parse_chunk(this, rule_number, output + rule->offset, payload_length - VENDOR_ID_PAYLOAD_HEADER_LENGTH) != SUCCESS) { pld->destroy(pld); @@ -907,7 +766,7 @@ static status_t parse_payload(private_parser_t *this, payload_type_t payload_typ case CONFIGURATION_ATTRIBUTE_VALUE: { size_t data_length = attribute_length; - if (this->parse_chunk(this, rule_number, output + rule->offset, data_length) != SUCCESS) + if (parse_chunk(this, rule_number, output + rule->offset, data_length) != SUCCESS) { pld->destroy(pld); return PARSE_ERROR; @@ -917,7 +776,7 @@ static status_t parse_payload(private_parser_t *this, payload_type_t payload_typ case KEY_EXCHANGE_DATA: { if (payload_length < KE_PAYLOAD_HEADER_LENGTH || - this->parse_chunk(this, rule_number, output + rule->offset, + parse_chunk(this, rule_number, output + rule->offset, payload_length - KE_PAYLOAD_HEADER_LENGTH) != SUCCESS) { pld->destroy(pld); @@ -928,7 +787,7 @@ static status_t parse_payload(private_parser_t *this, payload_type_t payload_typ case NOTIFICATION_DATA: { if (payload_length < NOTIFY_PAYLOAD_HEADER_LENGTH + spi_size || - this->parse_chunk(this, rule_number, output + rule->offset, + parse_chunk(this, rule_number, output + rule->offset, payload_length - NOTIFY_PAYLOAD_HEADER_LENGTH - spi_size) != SUCCESS) { pld->destroy(pld); @@ -939,7 +798,7 @@ static status_t parse_payload(private_parser_t *this, payload_type_t payload_typ case ENCRYPTED_DATA: { if (payload_length < ENCRYPTION_PAYLOAD_HEADER_LENGTH || - this->parse_chunk(this, rule_number, output + rule->offset, + parse_chunk(this, rule_number, output + rule->offset, payload_length - ENCRYPTION_PAYLOAD_HEADER_LENGTH) != SUCCESS) { pld->destroy(pld); @@ -949,7 +808,7 @@ static status_t parse_payload(private_parser_t *this, payload_type_t payload_typ } case TS_TYPE: { - if (this->parse_uint8(this, rule_number, output + rule->offset) != SUCCESS) + if (parse_uint8(this, rule_number, output + rule->offset) != SUCCESS) { pld->destroy(pld); return PARSE_ERROR; @@ -960,7 +819,7 @@ static status_t parse_payload(private_parser_t *this, payload_type_t payload_typ case ADDRESS: { size_t address_length = (ts_type == TS_IPV4_ADDR_RANGE) ? 4 : 16; - if (this->parse_chunk(this, rule_number, output + rule->offset,address_length) != SUCCESS) + if (parse_chunk(this, rule_number, output + rule->offset,address_length) != SUCCESS) { pld->destroy(pld); return PARSE_ERROR; @@ -970,7 +829,7 @@ static status_t parse_payload(private_parser_t *this, payload_type_t payload_typ case TRAFFIC_SELECTORS: { if (payload_length < TS_PAYLOAD_HEADER_LENGTH || - this->parse_list(this, rule_number, output + rule->offset, TRAFFIC_SELECTOR_SUBSTRUCTURE, + parse_list(this, rule_number, output + rule->offset, TRAFFIC_SELECTOR_SUBSTRUCTURE, payload_length - TS_PAYLOAD_HEADER_LENGTH) != SUCCESS) { pld->destroy(pld); @@ -981,7 +840,7 @@ static status_t parse_payload(private_parser_t *this, payload_type_t payload_typ case UNKNOWN_DATA: { if (payload_length < UNKNOWN_PAYLOAD_HEADER_LENGTH || - this->parse_chunk(this, rule_number, output + rule->offset, + parse_chunk(this, rule_number, output + rule->offset, payload_length - UNKNOWN_PAYLOAD_HEADER_LENGTH) != SUCCESS) { pld->destroy(pld); @@ -1045,17 +904,6 @@ parser_t *parser_create(chunk_t data) this->public.get_remaining_byte_count = (int (*) (parser_t *))get_remaining_byte_count; this->public.destroy = (void(*)(parser_t*)) destroy; - this->parse_uint4 = parse_uint4; - this->parse_uint8 = parse_uint8; - this->parse_uint15 = parse_uint15; - this->parse_uint16 = parse_uint16; - this->parse_uint32 = parse_uint32; - this->parse_uint64 = parse_uint64; - this->parse_bytes = parse_bytes; - this->parse_bit = parse_bit; - this->parse_list = parse_list; - this->parse_chunk = parse_chunk; - this->input = data.ptr; this->byte_pos = data.ptr; this->bit_pos = 0; diff --git a/src/charon/encoding/payloads/configuration_attribute.c b/src/charon/encoding/payloads/configuration_attribute.c index 6b1cbffb4..ad8177e1f 100644 --- a/src/charon/encoding/payloads/configuration_attribute.c +++ b/src/charon/encoding/payloads/configuration_attribute.c @@ -13,7 +13,7 @@ * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License * for more details. * - * $Id: configuration_attribute.c 3589 2008-03-13 14:14:44Z martin $ + * $Id: configuration_attribute.c 4844 2009-01-20 22:55:13Z andreas $ */ #include <stddef.h> @@ -69,7 +69,10 @@ ENUM_NEXT(configuration_attribute_type_names, INTERNAL_IP6_DNS, INTERNAL_IP6_SUB "INTERNAL_IP4_SUBNET", "SUPPORTED_ATTRIBUTES", "INTERNAL_IP6_SUBNET"); -ENUM_END(configuration_attribute_type_names, INTERNAL_IP6_SUBNET); +ENUM_NEXT(configuration_attribute_type_names, INTERNAL_IP4_SERVER, INTERNAL_IP6_SERVER, INTERNAL_IP6_SUBNET, + "INTERNAL_IP4_SERVER", + "INTERNAL_IP6_SERVER"); +ENUM_END(configuration_attribute_type_names, INTERNAL_IP6_SERVER); /** * Encoding rules to parse or generate a configuration attribute. diff --git a/src/charon/encoding/payloads/configuration_attribute.h b/src/charon/encoding/payloads/configuration_attribute.h index ade837107..4c8673a26 100644 --- a/src/charon/encoding/payloads/configuration_attribute.h +++ b/src/charon/encoding/payloads/configuration_attribute.h @@ -13,7 +13,7 @@ * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License * for more details. * - * $Id: configuration_attribute.h 3589 2008-03-13 14:14:44Z martin $ + * $Id: configuration_attribute.h 4844 2009-01-20 22:55:13Z andreas $ */ /** @@ -53,7 +53,10 @@ enum configuration_attribute_type_t { INTERNAL_IP6_DHCP = 12, INTERNAL_IP4_SUBNET = 13, SUPPORTED_ATTRIBUTES = 14, - INTERNAL_IP6_SUBNET = 15 + INTERNAL_IP6_SUBNET = 15, + /* proprietary Microsoft attributes */ + INTERNAL_IP4_SERVER = 23456, + INTERNAL_IP6_SERVER = 23457 }; /** diff --git a/src/charon/encoding/payloads/nonce_payload.h b/src/charon/encoding/payloads/nonce_payload.h index f1679834e..f1e49491d 100644 --- a/src/charon/encoding/payloads/nonce_payload.h +++ b/src/charon/encoding/payloads/nonce_payload.h @@ -13,7 +13,7 @@ * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License * for more details. * - * $Id: nonce_payload.h 3589 2008-03-13 14:14:44Z martin $ + * $Id: nonce_payload.h 4819 2008-12-31 08:58:49Z martin $ */ /** @@ -32,7 +32,7 @@ typedef struct nonce_payload_t nonce_payload_t; /** * Nonce size in bytes for nonces sending to other peer. */ -#define NONCE_SIZE 16 +#define NONCE_SIZE 32 /** * Length of a nonce payload without a nonce in bytes. diff --git a/src/charon/encoding/payloads/notify_payload.c b/src/charon/encoding/payloads/notify_payload.c index defb0b98a..a4377c275 100644 --- a/src/charon/encoding/payloads/notify_payload.c +++ b/src/charon/encoding/payloads/notify_payload.c @@ -15,7 +15,7 @@ * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License * for more details. * - * $Id: notify_payload.c 3920 2008-05-08 16:19:11Z tobias $ + * $Id: notify_payload.c 4842 2009-01-19 12:32:42Z andreas $ */ #include <stddef.h> @@ -54,7 +54,7 @@ ENUM_NEXT(notify_type_names, SINGLE_PAIR_REQUIRED, UNEXPECTED_NAT_DETECTED, AUTH "UNEXPECTED_NAT_DETECTED"); ENUM_NEXT(notify_type_names, ME_CONNECT_FAILED, ME_CONNECT_FAILED, UNEXPECTED_NAT_DETECTED, "ME_CONNECT_FAILED"); -ENUM_NEXT(notify_type_names, INITIAL_CONTACT, AUTH_LIFETIME, ME_CONNECT_FAILED, +ENUM_NEXT(notify_type_names, INITIAL_CONTACT, ANOTHER_AUTH_FOLLOWS, ME_CONNECT_FAILED, "INITIAL_CONTACT", "SET_WINDOW_SIZE", "ADDITIONAL_TS_POSSIBLE", @@ -74,8 +74,10 @@ ENUM_NEXT(notify_type_names, INITIAL_CONTACT, AUTH_LIFETIME, ME_CONNECT_FAILED, "UPDATE_SA_ADDRESSES", "COOKIE2", "NO_NATS_ALLOWED", - "AUTH_LIFETIME"); -ENUM_NEXT(notify_type_names, EAP_ONLY_AUTHENTICATION, EAP_ONLY_AUTHENTICATION, AUTH_LIFETIME, + "AUTH_LIFETIME", + "MULTIPLE_AUTH_SUPPORTED", + "ANOTHER_AUTH_FOLLOWS"); +ENUM_NEXT(notify_type_names, EAP_ONLY_AUTHENTICATION, EAP_ONLY_AUTHENTICATION, ANOTHER_AUTH_FOLLOWS, "EAP_ONLY_AUTHENTICATION"); ENUM_NEXT(notify_type_names, USE_BEET_MODE, USE_BEET_MODE, EAP_ONLY_AUTHENTICATION, "USE_BEET_MODE"); @@ -118,7 +120,7 @@ ENUM_NEXT(notify_type_short_names, SINGLE_PAIR_REQUIRED, UNEXPECTED_NAT_DETECTED "UNEXPECT_NAT"); ENUM_NEXT(notify_type_short_names, ME_CONNECT_FAILED, ME_CONNECT_FAILED, UNEXPECTED_NAT_DETECTED, "ME_CONN_FAIL"); -ENUM_NEXT(notify_type_short_names, INITIAL_CONTACT, AUTH_LIFETIME, ME_CONNECT_FAILED, +ENUM_NEXT(notify_type_short_names, INITIAL_CONTACT, ANOTHER_AUTH_FOLLOWS, ME_CONNECT_FAILED, "INIT_CONTACT", "SET_WINSIZE", "ADD_TS_POSS", @@ -138,8 +140,10 @@ ENUM_NEXT(notify_type_short_names, INITIAL_CONTACT, AUTH_LIFETIME, ME_CONNECT_FA "UPD_SA_ADDR", "COOKIE2", "NO_NATS", - "AUTH_LFT"); -ENUM_NEXT(notify_type_short_names, EAP_ONLY_AUTHENTICATION, EAP_ONLY_AUTHENTICATION, AUTH_LIFETIME, + "AUTH_LFT", + "MULT_AUTH", + "AUTH_FOLLOWS"); +ENUM_NEXT(notify_type_short_names, EAP_ONLY_AUTHENTICATION, EAP_ONLY_AUTHENTICATION, ANOTHER_AUTH_FOLLOWS, "EAP_ONLY"); ENUM_NEXT(notify_type_short_names, USE_BEET_MODE, USE_BEET_MODE, EAP_ONLY_AUTHENTICATION, "BEET_MODE"); diff --git a/src/charon/encoding/payloads/notify_payload.h b/src/charon/encoding/payloads/notify_payload.h index f4a3bf27c..6ee137543 100644 --- a/src/charon/encoding/payloads/notify_payload.h +++ b/src/charon/encoding/payloads/notify_payload.h @@ -15,7 +15,7 @@ * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License * for more details. * - * $Id: notify_payload.h 3670 2008-03-27 09:54:09Z tobias $ + * $Id: notify_payload.h 4842 2009-01-19 12:32:42Z andreas $ */ /** @@ -89,6 +89,9 @@ enum notify_type_t { NO_NATS_ALLOWED = 16402, /* repeated authentication extension, RFC4478 */ AUTH_LIFETIME = 16403, + /* multiple authentication exchanges, RFC 4739 */ + MULTIPLE_AUTH_SUPPORTED = 16404, + ANOTHER_AUTH_FOLLOWS = 16405, /* draft-eronen-ipsec-ikev2-eap-auth, not assigned by IANA yet */ EAP_ONLY_AUTHENTICATION = 40960, /* BEET mode, not even a draft yet. private use */ diff --git a/src/charon/encoding/payloads/payload.h b/src/charon/encoding/payloads/payload.h index abc79259a..7a19cc76c 100644 --- a/src/charon/encoding/payloads/payload.h +++ b/src/charon/encoding/payloads/payload.h @@ -14,7 +14,7 @@ * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License * for more details. * - * $Id: payload.h 3666 2008-03-26 18:40:19Z tobias $ + * $Id: payload.h 4875 2009-02-17 17:14:15Z tobias $ */ /** @@ -86,7 +86,7 @@ enum payload_type_t{ NONCE = 40, /** - * Notif paylaod (N). + * Notify paylaod (N). */ NOTIFY = 41, |