From 2bcd51b3893b50acaad80ed2cc9c86e2e01f2f62 Mon Sep 17 00:00:00 2001 From: Martin Willi Date: Wed, 16 Nov 2011 18:23:37 +0100 Subject: Added SA payload IKEv1 encoding types to generator --- src/libcharon/encoding/generator.c | 3 +++ 1 file changed, 3 insertions(+) (limited to 'src/libcharon/encoding/generator.c') diff --git a/src/libcharon/encoding/generator.c b/src/libcharon/encoding/generator.c index ce3844361..329b1c15f 100644 --- a/src/libcharon/encoding/generator.c +++ b/src/libcharon/encoding/generator.c @@ -465,8 +465,11 @@ METHOD(generator_t, generate_payload, void, generate_from_chunk(this, rules[i].offset); break; case PROPOSALS: + case PROPOSALS_V1: case TRANSFORMS: + case TRANSFORMS_V1: case TRANSFORM_ATTRIBUTES: + case TRANSFORM_ATTRIBUTES_V1: case CONFIGURATION_ATTRIBUTES: case TRAFFIC_SELECTORS: { -- cgit v1.2.3 From 683d83ed3ef6c920a59f6d23d0f44c66fc6ded42 Mon Sep 17 00:00:00 2001 From: Martin Willi Date: Thu, 17 Nov 2011 11:16:02 +0100 Subject: Extended KE payload for IKEv1 support --- src/libcharon/encoding/generator.c | 1 + 1 file changed, 1 insertion(+) (limited to 'src/libcharon/encoding/generator.c') diff --git a/src/libcharon/encoding/generator.c b/src/libcharon/encoding/generator.c index 329b1c15f..662ebf977 100644 --- a/src/libcharon/encoding/generator.c +++ b/src/libcharon/encoding/generator.c @@ -450,6 +450,7 @@ METHOD(generator_t, generate_payload, void, case ADDRESS: case SPI: case KEY_EXCHANGE_DATA: + case KEY_EXCHANGE_DATA_V1: case NOTIFICATION_DATA: case NONCE_DATA: case ID_DATA: -- cgit v1.2.3 From e9b55b832546d05f464bdddbe779ed21cd17b624 Mon Sep 17 00:00:00 2001 From: Martin Willi Date: Thu, 17 Nov 2011 11:27:55 +0100 Subject: Simplify signature of get_encoding_rules(), make all rules static --- src/libcharon/encoding/generator.c | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) (limited to 'src/libcharon/encoding/generator.c') diff --git a/src/libcharon/encoding/generator.c b/src/libcharon/encoding/generator.c index 662ebf977..5f1a5e8a4 100644 --- a/src/libcharon/encoding/generator.c +++ b/src/libcharon/encoding/generator.c @@ -404,8 +404,7 @@ METHOD(generator_t, get_chunk, chunk_t, METHOD(generator_t, generate_payload, void, private_generator_t *this,payload_t *payload) { - int i, offset_start; - size_t rule_count; + int i, offset_start, rule_count; encoding_rule_t *rules; payload_type_t payload_type; @@ -418,7 +417,7 @@ METHOD(generator_t, generate_payload, void, payload_type_names, payload_type); /* each payload has its own encoding rules */ - payload->get_encoding_rules(payload, &rules, &rule_count); + rule_count = payload->get_encoding_rules(payload, &rules); for (i = 0; i < rule_count;i++) { -- cgit v1.2.3 From ee50a2938557c4fa67a76304dbeb37abfe6ad253 Mon Sep 17 00:00:00 2001 From: Martin Willi Date: Thu, 17 Nov 2011 15:00:04 +0100 Subject: Implemented IKEv1 hash payload --- src/libcharon/encoding/generator.c | 1 + 1 file changed, 1 insertion(+) (limited to 'src/libcharon/encoding/generator.c') diff --git a/src/libcharon/encoding/generator.c b/src/libcharon/encoding/generator.c index 5f1a5e8a4..9cb1cdc5b 100644 --- a/src/libcharon/encoding/generator.c +++ b/src/libcharon/encoding/generator.c @@ -452,6 +452,7 @@ METHOD(generator_t, generate_payload, void, case KEY_EXCHANGE_DATA_V1: case NOTIFICATION_DATA: case NONCE_DATA: + case HASH_DATA: case ID_DATA: case AUTH_DATA: case CERT_DATA: -- cgit v1.2.3 From 95a26523afc0d2a997cd1d4f738c287ae045ae4e Mon Sep 17 00:00:00 2001 From: Martin Willi Date: Thu, 17 Nov 2011 14:20:16 +0000 Subject: Use a generic encoding type for all variable length chunks --- src/libcharon/encoding/generator.c | 16 +--------------- 1 file changed, 1 insertion(+), 15 deletions(-) (limited to 'src/libcharon/encoding/generator.c') diff --git a/src/libcharon/encoding/generator.c b/src/libcharon/encoding/generator.c index 9cb1cdc5b..d6828e7f9 100644 --- a/src/libcharon/encoding/generator.c +++ b/src/libcharon/encoding/generator.c @@ -448,21 +448,7 @@ METHOD(generator_t, generate_payload, void, break; case ADDRESS: case SPI: - case KEY_EXCHANGE_DATA: - case KEY_EXCHANGE_DATA_V1: - case NOTIFICATION_DATA: - case NONCE_DATA: - case HASH_DATA: - case ID_DATA: - case AUTH_DATA: - case CERT_DATA: - case CERTREQ_DATA: - case SPIS: - case CONFIGURATION_ATTRIBUTE_VALUE: - case VID_DATA: - case EAP_DATA: - case ENCRYPTED_DATA: - case UNKNOWN_DATA: + case CHUNK_DATA: generate_from_chunk(this, rules[i].offset); break; case PROPOSALS: -- cgit v1.2.3 From f62a7c7c7192d791eb4c10e7ff4d09cf54c7d4da Mon Sep 17 00:00:00 2001 From: Martin Willi Date: Thu, 17 Nov 2011 15:44:42 +0100 Subject: Use a generic list encoding rule we can use to specify the wrapped payload type --- src/libcharon/encoding/generator.c | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) (limited to 'src/libcharon/encoding/generator.c') diff --git a/src/libcharon/encoding/generator.c b/src/libcharon/encoding/generator.c index d6828e7f9..a378426ab 100644 --- a/src/libcharon/encoding/generator.c +++ b/src/libcharon/encoding/generator.c @@ -451,14 +451,14 @@ METHOD(generator_t, generate_payload, void, case CHUNK_DATA: generate_from_chunk(this, rules[i].offset); break; - case PROPOSALS: - case PROPOSALS_V1: - case TRANSFORMS: - case TRANSFORMS_V1: - case TRANSFORM_ATTRIBUTES: - case TRANSFORM_ATTRIBUTES_V1: - case CONFIGURATION_ATTRIBUTES: - case TRAFFIC_SELECTORS: + case PAYLOAD_LIST + PROPOSAL_SUBSTRUCTURE: + case PAYLOAD_LIST + PROPOSAL_SUBSTRUCTURE_V1: + case PAYLOAD_LIST + TRANSFORM_SUBSTRUCTURE: + case PAYLOAD_LIST + TRANSFORM_SUBSTRUCTURE_V1: + case PAYLOAD_LIST + TRANSFORM_ATTRIBUTE: + case PAYLOAD_LIST + TRANSFORM_ATTRIBUTE_V1: + case PAYLOAD_LIST + CONFIGURATION_ATTRIBUTE: + case PAYLOAD_LIST + TRAFFIC_SELECTOR_SUBSTRUCTURE: { linked_list_t *proposals; enumerator_t *enumerator; -- cgit v1.2.3 From 50d493808c84fb042244119d41f65ee9fa76f358 Mon Sep 17 00:00:00 2001 From: Tobias Brunner Date: Mon, 21 Nov 2011 11:05:43 +0100 Subject: Avoid compiler warnings due to extended enums. --- src/libcharon/encoding/generator.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'src/libcharon/encoding/generator.c') diff --git a/src/libcharon/encoding/generator.c b/src/libcharon/encoding/generator.c index a378426ab..c6819292a 100644 --- a/src/libcharon/encoding/generator.c +++ b/src/libcharon/encoding/generator.c @@ -423,7 +423,7 @@ METHOD(generator_t, generate_payload, void, { DBG2(DBG_ENC, " generating rule %d %N", i, encoding_type_names, rules[i].type); - switch (rules[i].type) + switch ((int)rules[i].type) { case U_INT_4: case U_INT_8: -- cgit v1.2.3 From 6f5f8ee4b59484e15cc1cba356cfe37b6c4a9c23 Mon Sep 17 00:00:00 2001 From: Tobias Brunner Date: Mon, 21 Nov 2011 11:53:23 +0100 Subject: Use modified encryption payload to encrypt/decrypt complete IKEv1 messages. --- src/libcharon/encoding/generator.c | 1 + 1 file changed, 1 insertion(+) (limited to 'src/libcharon/encoding/generator.c') diff --git a/src/libcharon/encoding/generator.c b/src/libcharon/encoding/generator.c index c6819292a..2c9298e11 100644 --- a/src/libcharon/encoding/generator.c +++ b/src/libcharon/encoding/generator.c @@ -449,6 +449,7 @@ METHOD(generator_t, generate_payload, void, case ADDRESS: case SPI: case CHUNK_DATA: + case ENCRYPTED_DATA: generate_from_chunk(this, rules[i].offset); break; case PAYLOAD_LIST + PROPOSAL_SUBSTRUCTURE: -- cgit v1.2.3 From 97265a8927c290466eb8899d99da9b3cf921969f Mon Sep 17 00:00:00 2001 From: Tobias Brunner Date: Wed, 23 Nov 2011 15:30:41 +0100 Subject: Removed redundant '=>' when logging binary data in parser and generator. --- src/libcharon/encoding/generator.c | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) (limited to 'src/libcharon/encoding/generator.c') diff --git a/src/libcharon/encoding/generator.c b/src/libcharon/encoding/generator.c index 2c9298e11..077648224 100644 --- a/src/libcharon/encoding/generator.c +++ b/src/libcharon/encoding/generator.c @@ -311,14 +311,14 @@ static void generate_u_int_type(private_generator_t *this, case CONFIGURATION_ATTRIBUTE_LENGTH: { u_int16_t val = htons(*((u_int16_t*)(this->data_struct + offset))); - DBG3(DBG_ENC, " => %b", &val, sizeof(u_int16_t)); + DBG3(DBG_ENC, " %b", &val, sizeof(u_int16_t)); write_bytes_to_buffer(this, &val, sizeof(u_int16_t)); break; } case U_INT_32: { u_int32_t val = htonl(*((u_int32_t*)(this->data_struct + offset))); - DBG3(DBG_ENC, " => %b", &val, sizeof(u_int32_t)); + DBG3(DBG_ENC, " %b", &val, sizeof(u_int32_t)); write_bytes_to_buffer(this, &val, sizeof(u_int32_t)); break; } @@ -327,7 +327,7 @@ static void generate_u_int_type(private_generator_t *this, /* 64 bit are written as-is, no host order conversion */ write_bytes_to_buffer(this, this->data_struct + offset, sizeof(u_int64_t)); - DBG3(DBG_ENC, " => %b", this->data_struct + offset, + DBG3(DBG_ENC, " %b", this->data_struct + offset, sizeof(u_int64_t)); break; } @@ -385,7 +385,7 @@ static void generate_from_chunk(private_generator_t *this, u_int32_t offset) } value = (chunk_t *)(this->data_struct + offset); - DBG3(DBG_ENC, " => %B", value); + DBG3(DBG_ENC, " %B", value); write_bytes_to_buffer(this, value->ptr, value->len); } -- cgit v1.2.3 From 0b6811b4a7a26176b8fc102ef6ee398edaa289cb Mon Sep 17 00:00:00 2001 From: Clavister OpenSource Date: Thu, 24 Nov 2011 11:30:19 +0100 Subject: IKEv1 ConfigMode: Fixed cp_payload to use CONFIGURATION_ATTRIBUTE_V1 in all appropriate places, so the parsing is done correctly. --- src/libcharon/encoding/generator.c | 1 + 1 file changed, 1 insertion(+) (limited to 'src/libcharon/encoding/generator.c') diff --git a/src/libcharon/encoding/generator.c b/src/libcharon/encoding/generator.c index 077648224..43b157cc1 100644 --- a/src/libcharon/encoding/generator.c +++ b/src/libcharon/encoding/generator.c @@ -459,6 +459,7 @@ METHOD(generator_t, generate_payload, void, case PAYLOAD_LIST + TRANSFORM_ATTRIBUTE: case PAYLOAD_LIST + TRANSFORM_ATTRIBUTE_V1: case PAYLOAD_LIST + CONFIGURATION_ATTRIBUTE: + case PAYLOAD_LIST + CONFIGURATION_ATTRIBUTE_V1: case PAYLOAD_LIST + TRAFFIC_SELECTOR_SUBSTRUCTURE: { linked_list_t *proposals; -- cgit v1.2.3 From 24ddf03f52839c9aa68df8cdebda37ac2c0162c0 Mon Sep 17 00:00:00 2001 From: Tobias Brunner Date: Fri, 25 Nov 2011 18:57:03 +0100 Subject: Added an option to create a generator that does not log debug messages. --- src/libcharon/encoding/generator.c | 112 +++++++++++++++++++++++++++++-------- 1 file changed, 88 insertions(+), 24 deletions(-) (limited to 'src/libcharon/encoding/generator.c') diff --git a/src/libcharon/encoding/generator.c b/src/libcharon/encoding/generator.c index 43b157cc1..823a4ec10 100644 --- a/src/libcharon/encoding/generator.c +++ b/src/libcharon/encoding/generator.c @@ -1,4 +1,5 @@ /* + * Copyright (C) 2011 Tobias Brunner * Copyright (C) 2005-2009 Martin Willi * Copyright (C) 2005 Jan Hutter * Hochschule fuer Technik Rapperswil @@ -108,6 +109,11 @@ struct private_generator_t { * to hold the length of the transform attribute in bytes. */ u_int16_t attribute_length; + + /** + * TRUE, if debug messages should be logged during generation. + */ + bool debug; }; /** @@ -155,8 +161,11 @@ static void make_space_available(private_generator_t *this, int bits) new_buffer_size = old_buffer_size + GENERATOR_DATA_BUFFER_INCREASE_VALUE; out_position_offset = this->out_position - this->buffer; - DBG2(DBG_ENC, "increasing gen buffer from %d to %d byte", - old_buffer_size, new_buffer_size); + if (this->debug) + { + DBG2(DBG_ENC, "increasing gen buffer from %d to %d byte", + old_buffer_size, new_buffer_size); + } this->buffer = realloc(this->buffer,new_buffer_size); this->out_position = (this->buffer + out_position_offset); @@ -244,7 +253,10 @@ static void generate_u_int_type(private_generator_t *this, low = *(this->out_position) & 0x0F; /* high is set, low_val is not changed */ *(this->out_position) = high | low; - DBG3(DBG_ENC, " => %d", *(this->out_position)); + if (this->debug) + { + DBG3(DBG_ENC, " => %d", *(this->out_position)); + } /* write position is not changed, just bit position is moved */ this->current_bit = 4; } @@ -255,7 +267,10 @@ static void generate_u_int_type(private_generator_t *this, /* low of current byte in buffer has to be set to the new value*/ low = *((u_int8_t *)(this->data_struct + offset)) & 0x0F; *(this->out_position) = high | low; - DBG3(DBG_ENC, " => %d", *(this->out_position)); + if (this->debug) + { + DBG3(DBG_ENC, " => %d", *(this->out_position)); + } this->out_position++; this->current_bit = 0; } @@ -274,7 +289,10 @@ static void generate_u_int_type(private_generator_t *this, { /* 8 bit values are written as they are */ *this->out_position = *((u_int8_t *)(this->data_struct + offset)); - DBG3(DBG_ENC, " => %d", *(this->out_position)); + if (this->debug) + { + DBG3(DBG_ENC, " => %d", *(this->out_position)); + } this->out_position++; break; } @@ -299,7 +317,10 @@ static void generate_u_int_type(private_generator_t *this, val |= 0x8000; } val = htons(val); - DBG3(DBG_ENC, " => %d", val); + if (this->debug) + { + DBG3(DBG_ENC, " => %d", val); + } /* write bytes to buffer (set bit is overwritten) */ write_bytes_to_buffer(this, &val, sizeof(u_int16_t)); this->current_bit = 0; @@ -311,14 +332,20 @@ static void generate_u_int_type(private_generator_t *this, case CONFIGURATION_ATTRIBUTE_LENGTH: { u_int16_t val = htons(*((u_int16_t*)(this->data_struct + offset))); - DBG3(DBG_ENC, " %b", &val, sizeof(u_int16_t)); + if (this->debug) + { + DBG3(DBG_ENC, " %b", &val, sizeof(u_int16_t)); + } write_bytes_to_buffer(this, &val, sizeof(u_int16_t)); break; } case U_INT_32: { u_int32_t val = htonl(*((u_int32_t*)(this->data_struct + offset))); - DBG3(DBG_ENC, " %b", &val, sizeof(u_int32_t)); + if (this->debug) + { + DBG3(DBG_ENC, " %b", &val, sizeof(u_int32_t)); + } write_bytes_to_buffer(this, &val, sizeof(u_int32_t)); break; } @@ -327,8 +354,11 @@ static void generate_u_int_type(private_generator_t *this, /* 64 bit are written as-is, no host order conversion */ write_bytes_to_buffer(this, this->data_struct + offset, sizeof(u_int64_t)); - DBG3(DBG_ENC, " %b", this->data_struct + offset, - sizeof(u_int64_t)); + if (this->debug) + { + DBG3(DBG_ENC, " %b", this->data_struct + offset, + sizeof(u_int64_t)); + } break; } default: @@ -361,7 +391,10 @@ static void generate_flag(private_generator_t *this, u_int32_t offset) } *(this->out_position) = *(this->out_position) | flag; - DBG3(DBG_ENC, " => %d", *this->out_position); + if (this->debug) + { + DBG3(DBG_ENC, " => %d", *this->out_position); + } this->current_bit++; if (this->current_bit >= 8) @@ -380,12 +413,16 @@ static void generate_from_chunk(private_generator_t *this, u_int32_t offset) if (this->current_bit != 0) { - DBG1(DBG_ENC, "can not generate a chunk at Bitpos %d", this->current_bit); + DBG1(DBG_ENC, "can not generate a chunk at bitpos %d", + this->current_bit); return ; } value = (chunk_t *)(this->data_struct + offset); - DBG3(DBG_ENC, " %B", value); + if (this->debug) + { + DBG3(DBG_ENC, " %B", value); + } write_bytes_to_buffer(this, value->ptr, value->len); } @@ -397,7 +434,10 @@ METHOD(generator_t, get_chunk, chunk_t, *lenpos = (u_int32_t*)(this->buffer + this->header_length_offset); data = chunk_create(this->buffer, get_length(this)); - DBG3(DBG_ENC, "generated data of this generator %B", &data); + if (this->debug) + { + DBG3(DBG_ENC, "generated data of this generator %B", &data); + } return data; } @@ -413,16 +453,22 @@ METHOD(generator_t, generate_payload, void, offset_start = this->out_position - this->buffer; - DBG2(DBG_ENC, "generating payload of type %N", - payload_type_names, payload_type); + if (this->debug) + { + DBG2(DBG_ENC, "generating payload of type %N", + payload_type_names, payload_type); + } /* each payload has its own encoding rules */ rule_count = payload->get_encoding_rules(payload, &rules); for (i = 0; i < rule_count;i++) { - DBG2(DBG_ENC, " generating rule %d %N", - i, encoding_type_names, rules[i].type); + if (this->debug) + { + DBG2(DBG_ENC, " generating rule %d %N", + i, encoding_type_names, rules[i].type); + } switch ((int)rules[i].type) { case U_INT_4: @@ -499,7 +545,10 @@ METHOD(generator_t, generate_payload, void, { if (!this->attribute_format) { - DBG2(DBG_ENC, "attribute value has not fixed size"); + if (this->debug) + { + DBG2(DBG_ENC, "attribute value has not fixed size"); + } /* the attribute value is generated */ generate_from_chunk(this, rules[i].offset); } @@ -511,11 +560,14 @@ METHOD(generator_t, generate_payload, void, return; } } - DBG2(DBG_ENC, "generating %N payload finished", - payload_type_names, payload_type); - DBG3(DBG_ENC, "generated data for this payload %b", - this->buffer + offset_start, - this->out_position - this->buffer - offset_start); + if (this->debug) + { + DBG2(DBG_ENC, "generating %N payload finished", + payload_type_names, payload_type); + DBG3(DBG_ENC, "generated data for this payload %b", + this->buffer + offset_start, + this->out_position - this->buffer - offset_start); + } } METHOD(generator_t, destroy, void, @@ -539,6 +591,7 @@ generator_t *generator_create() .destroy = _destroy, }, .buffer = malloc(GENERATOR_DATA_BUFFER_SIZE), + .debug = TRUE, ); this->out_position = this->buffer; @@ -547,3 +600,14 @@ generator_t *generator_create() return &this->public; } +/* + * Described in header + */ +generator_t *generator_create_no_dbg() +{ + private_generator_t *this = (private_generator_t*)generator_create(); + + this->debug = FALSE; + + return &this->public; +} -- cgit v1.2.3 From c390569a76524a72e25a8885f3f8dc920700207d Mon Sep 17 00:00:00 2001 From: Martin Willi Date: Fri, 20 Jan 2012 15:00:06 +0100 Subject: Renamed CONFIGURATION_ATTRIBUTE_LENGTH to streamline it with other ATTRIBUTE rules --- src/libcharon/encoding/generator.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) (limited to 'src/libcharon/encoding/generator.c') diff --git a/src/libcharon/encoding/generator.c b/src/libcharon/encoding/generator.c index 823a4ec10..bf4480193 100644 --- a/src/libcharon/encoding/generator.c +++ b/src/libcharon/encoding/generator.c @@ -214,7 +214,7 @@ static void generate_u_int_type(private_generator_t *this, break; case U_INT_16: case PAYLOAD_LENGTH: - case CONFIGURATION_ATTRIBUTE_LENGTH: + case ATTRIBUTE_LENGTH: number_of_bits = 16; break; case U_INT_32: @@ -329,7 +329,7 @@ static void generate_u_int_type(private_generator_t *this, } case U_INT_16: case PAYLOAD_LENGTH: - case CONFIGURATION_ATTRIBUTE_LENGTH: + case ATTRIBUTE_LENGTH: { u_int16_t val = htons(*((u_int16_t*)(this->data_struct + offset))); if (this->debug) @@ -481,7 +481,7 @@ METHOD(generator_t, generate_payload, void, case SPI_SIZE: case TS_TYPE: case ATTRIBUTE_TYPE: - case CONFIGURATION_ATTRIBUTE_LENGTH: + case ATTRIBUTE_LENGTH: generate_u_int_type(this, rules[i].type, rules[i].offset); break; case RESERVED_BIT: -- cgit v1.2.3