From 45c3d18680255d35441777ce5fbd3b05bd3503e0 Mon Sep 17 00:00:00 2001 From: Jan Hutter Date: Tue, 29 Nov 2005 10:02:34 +0000 Subject: [PATCH] --- Source/charon/encoding/payloads/id_payload.c | 300 +++++++++++++++++++++++++++ Source/charon/encoding/payloads/id_payload.h | 192 +++++++++++++++++ Source/charon/testcases/testcases.c | 120 ----------- 3 files changed, 492 insertions(+), 120 deletions(-) create mode 100644 Source/charon/encoding/payloads/id_payload.c create mode 100644 Source/charon/encoding/payloads/id_payload.h diff --git a/Source/charon/encoding/payloads/id_payload.c b/Source/charon/encoding/payloads/id_payload.c new file mode 100644 index 0000000..708aa61 --- /dev/null +++ b/Source/charon/encoding/payloads/id_payload.c @@ -0,0 +1,300 @@ +/** + * @file id_payload.h + * + * @brief Interface of id_payload_t. + * + */ + +/* + * Copyright (C) 2005 Jan Hutter, Martin Willi + * Hochschule fuer Technik Rapperswil + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License as published by the + * Free Software Foundation; either version 2 of the License, or (at your + * option) any later version. See . + * + * This program is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY + * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * for more details. + */ + +#include "id_payload.h" + +#include +#include + +/** + * String mappings for id_type_t. + */ +mapping_t id_type_m[] = { +{ID_IPV4_ADDR, "ID_IPV4_ADDR"}, +{ID_FQDN, "ID_FQDN"}, +{ID_RFC822_ADDR, "ID_RFC822_ADDR"}, +{ID_IPV6_ADDR, "ID_IPV6_ADDR"}, +{ID_DER_ASN1_DN, "ID_DER_ASN1_DN"}, +{ID_DER_ASN1_GN, "ID_DER_ASN1_GN"}, +{ID_KEY_ID, "ID_KEY_ID"}, +{MAPPING_END, NULL} +}; + + +typedef struct private_id_payload_t private_id_payload_t; + +/** + * Private data of an id_payload_t object. + * + */ +struct private_id_payload_t { + /** + * Public id_payload_t interface. + */ + id_payload_t public; + + /** + * TRUE if this ID payload is of type IDi, FALSE for IDr + */ + bool is_initiator; + + /** + * Next payload type. + */ + u_int8_t next_payload; + + /** + * Critical flag. + */ + bool critical; + + /** + * Length of this payload. + */ + u_int16_t payload_length; + + /** + * Type of the ID Data. + */ + u_int8_t id_type; + + /** + * The contained id data value. + */ + chunk_t id_data; + + /** + * @brief Computes the length of this payload. + * + * @param this calling private_id_payload_t object + */ + void (*compute_length) (private_id_payload_t *this); +}; + +/** + * Encoding rules to parse or generate a ID payload + * + * The defined offsets are the positions in a object of type + * private_id_payload_t. + * + */ +encoding_rule_t id_payload_encodings[] = { + /* 1 Byte next payload type, stored in the field next_payload */ + { U_INT_8, offsetof(private_id_payload_t, next_payload) }, + /* the critical bit */ + { FLAG, offsetof(private_id_payload_t, critical) }, + /* 7 Bit reserved bits, nowhere stored */ + { RESERVED_BIT, 0 }, + { RESERVED_BIT, 0 }, + { RESERVED_BIT, 0 }, + { RESERVED_BIT, 0 }, + { RESERVED_BIT, 0 }, + { RESERVED_BIT, 0 }, + { RESERVED_BIT, 0 }, + /* Length of the whole payload*/ + { PAYLOAD_LENGTH, offsetof(private_id_payload_t, payload_length) }, + /* 1 Byte ID type*/ + { U_INT_8, offsetof(private_id_payload_t, id_type) }, + /* 3 reserved bytes */ + { RESERVED_BYTE, 0 }, + { RESERVED_BYTE, 0 }, + { RESERVED_BYTE, 0 }, + /* some id data bytes, length is defined in PAYLOAD_LENGTH */ + { ID_DATA, offsetof(private_id_payload_t, id_data) } +}; + +/* + 1 2 3 + 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 + +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ + ! Next Payload !C! RESERVED ! Payload Length ! + +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ + ! ID Type ! RESERVED | + +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ + ! ! + ~ Identification Data ~ + ! ! + +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ +*/ + +/** + * Implementation of payload_t.verify. + */ +static status_t verify(private_id_payload_t *this) +{ + if (this->critical) + { + /* critical bit is set! */ + return FAILED; + } + return SUCCESS; +} + +/** + * Implementation of id_payload_t.get_encoding_rules. + */ +static void get_encoding_rules(private_id_payload_t *this, encoding_rule_t **rules, size_t *rule_count) +{ + *rules = id_payload_encodings; + *rule_count = sizeof(id_payload_encodings) / sizeof(encoding_rule_t); +} + +/** + * Implementation of payload_t.get_type. + */ +static payload_type_t get_payload_type(private_id_payload_t *this) +{ + return ((this->is_initiator) ? ID_INITIATOR : ID_RESPONDER); +} + +/** + * Implementation of payload_t.get_next_type. + */ +static payload_type_t get_next_type(private_id_payload_t *this) +{ + return (this->next_payload); +} + +/** + * Implementation of payload_t.set_next_type. + */ +static void set_next_type(private_id_payload_t *this,payload_type_t type) +{ + this->next_payload = type; +} + +/** + * Implementation of payload_t.get_length. + */ +static size_t get_length(private_id_payload_t *this) +{ + this->compute_length(this); + return this->payload_length; +} + +/** + * Implementation of id_payload_t.set_type. + */ +static void set_id_type (private_id_payload_t *this, id_type_t type) +{ + this->id_type = type; +} + +/** + * Implementation of id_payload_t.get_id_type. + */ +static id_type_t get_id_type (private_id_payload_t *this) +{ + return (this->id_type); +} + +/** + * Implementation of id_payload_t.set_data. + */ +static void set_data (private_id_payload_t *this, chunk_t data) +{ + if (this->id_data.ptr != NULL) + { + allocator_free_chunk(&(this->id_data)); + } + this->id_data.ptr = allocator_clone_bytes(data.ptr,data.len); + this->id_data.len = data.len; +} + +/** + * Implementation of id_payload_t.get_data. + */ +static chunk_t get_data (private_id_payload_t *this) +{ + chunk_t cloned_data; + if (this->id_data.ptr == NULL) + { + return (this->id_data); + } + cloned_data.ptr = allocator_clone_bytes(this->id_data.ptr,this->id_data.len); + cloned_data.len = this->id_data.len; + return cloned_data; +} + +/** + * Implementation of id_payload_t.get_initiator. + */ +static bool get_initiator (private_id_payload_t *this) +{ + return (this->is_initiator); +} + +/** + * Implementation of id_payload_t.set_initiator. + */ +static void set_initiator (private_id_payload_t *this,bool is_initiator) +{ + this->is_initiator = is_initiator; +} + +/** + * Implementation of payload_t.destroy and id_payload_t.destroy. + */ +static void destroy(private_id_payload_t *this) +{ + if (this->id_data.ptr != NULL) + { + allocator_free_chunk(&(this->id_data)); + } + + allocator_free(this); +} + +/* + * Described in header + */ +id_payload_t *id_payload_create(bool is_initiator) +{ + private_id_payload_t *this = allocator_alloc_thing(private_id_payload_t); + + /* interface functions */ + this->public.payload_interface.verify = (status_t (*) (payload_t *))verify; + 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 = (void (*) (payload_t *,payload_type_t)) set_next_type; + this->public.payload_interface.get_type = (payload_type_t (*) (payload_t *)) get_payload_type; + this->public.payload_interface.destroy = (void (*) (payload_t *))destroy; + + /* public functions */ + this->public.destroy = (void (*) (id_payload_t *)) destroy; + this->public.set_id_type = (void (*) (id_payload_t *,id_type_t)) set_id_type; + this->public.get_id_type = (id_type_t (*) (id_payload_t *)) get_id_type; + this->public.set_data = (void (*) (id_payload_t *,chunk_t)) set_data; + this->public.get_data = (chunk_t (*) (id_payload_t *)) get_data; + this->public.get_initiator = (bool (*) (id_payload_t *)) get_initiator; + this->public.set_initiator = (void (*) (id_payload_t *,bool)) set_initiator; + + /* private variables */ + this->critical = FALSE; + this->next_payload = NO_PAYLOAD; + this->payload_length =ID_PAYLOAD_HEADER_LENGTH; + this->id_data = CHUNK_INITIALIZER; + this->is_initiator = is_initiator; + + return (&(this->public)); +} diff --git a/Source/charon/encoding/payloads/id_payload.h b/Source/charon/encoding/payloads/id_payload.h new file mode 100644 index 0000000..b4cb304 --- /dev/null +++ b/Source/charon/encoding/payloads/id_payload.h @@ -0,0 +1,192 @@ +/** + * @file id_payload.h + * + * @brief Interface of id_payload_t. + * + */ + +/* + * Copyright (C) 2005 Jan Hutter, Martin Willi + * Hochschule fuer Technik Rapperswil + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License as published by the + * Free Software Foundation; either version 2 of the License, or (at your + * option) any later version. See . + * + * This program is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY + * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * for more details. + */ + + +#ifndef _ID_PAYLOAD_H_ +#define _ID_PAYLOAD_H_ + +#include +#include + +/** + * Length of a nonce payload without a nonce in bytes. + * + * @ingroup payloads + */ +#define ID_PAYLOAD_HEADER_LENGTH 8 + + +typedef enum id_type_t id_type_t; + +/** + * ID Types of a ID payload. + * + * @ingroup payloads + */ +enum id_type_t { + /** + * ID data is a single four (4) octet IPv4 address. + */ + ID_IPV4_ADDR = 1, + + /** + * ID data is a fully-qualified domain name string. + * An example of a ID_FQDN is, "example.com". + * The string MUST not contain any terminators (e.g., NULL, CR, etc.). + */ + ID_FQDN = 2, + + /** + * ID data is a fully-qualified RFC822 email address string, An example of + * a ID_RFC822_ADDR is, "jsmith@example.com". The string MUST + * not contain any terminators. + */ + ID_RFC822_ADDR = 3, + + /** + * ID data is a single sixteen (16) octet IPv6 address. + */ + ID_IPV6_ADDR = 5, + + /** + * ID data is the binary DER encoding of an ASN.1 X.500 Distinguished Name + * [X.501]. + */ + ID_DER_ASN1_DN = 9, + + /** + * ID data is the binary DER encoding of an ASN.1 X.500 GeneralName + * [X.509]. + */ + ID_DER_ASN1_GN = 10, + + /** + * ID data is an opaque octet stream which may be used to pass vendor- + * specific information necessary to do certain proprietary + * types of identification. + */ + ID_KEY_ID = 11 +}; + +extern mapping_t id_type_m[]; + + +typedef struct id_payload_t id_payload_t; + +/** + * Object representing an IKEv2 ID payload. + * + * The ID payload format is described in draft section 3.5. + * + * @ingroup payloads + * + */ +struct id_payload_t { + /** + * The payload_t interface. + */ + payload_t payload_interface; + + /** + * @brief Set the ID type. + * + * + * @param this calling id_payload_t object + * @param type Type of ID + */ + void (*set_id_type) (id_payload_t *this, id_type_t type); + + /** + * @brief Get the ID type. + * + * @param this calling id_payload_t object + * @return type of the ID + */ + id_type_t (*get_id_type) (id_payload_t *this); + + /** + * @brief Set the ID data. + * + * Data are getting cloned. + * + * @param this calling id_payload_t object + * @param data ID data as chunk_t + */ + void (*set_data) (id_payload_t *this, chunk_t data); + + /** + * @brief Get the ID data. + * + * Returned data are a copy of the internal one + * + * @param this calling id_payload_t object + * @return ID data as chunk_t + */ + chunk_t (*get_data) (id_payload_t *this); + + /** + * @brief Get the type of ID payload (IDi or IDr). + * + * @param this calling id_payload_t object + * @return + * - TRUE if this payload is of type IDi + * - FALSE if this payload is of type IDr + * + */ + bool (*get_initiator) (id_payload_t *this); + + /** + * @brief Set the type of ID payload (IDi or IDr). + * + * @param this calling id_payload_t object + * @param is_initiator + * - TRUE if this payload is of type IDi + * - FALSE if this payload is of type IDr + * + */ + void (*set_initiator) (id_payload_t *this,bool is_initiator); + + /** + * @brief Destroys an id_payload_t object. + * + * @param this id_payload_t object to destroy + */ + void (*destroy) (id_payload_t *this); +}; + +/** + * @brief Creates an empty id_payload_t object. + * + * As default a ID payload of type IDi is created. + * + * @param is_initiator + * - TRUE if this payload is of type IDi + * - FALSE if this payload is of type IDr + * + * @return created id_payload_t object + * + * @ingroup payloads + */ +id_payload_t *id_payload_create(bool is_initiator); + + +#endif //_ID_PAYLOAD_H_ diff --git a/Source/charon/testcases/testcases.c b/Source/charon/testcases/testcases.c index a672b15..2a41f46 100644 --- a/Source/charon/testcases/testcases.c +++ b/Source/charon/testcases/testcases.c @@ -57,77 +57,20 @@ /* output for test messages */ extern FILE * stderr; -/** - * Test for linked_list_t - */ test_t linked_list_test = {test_linked_list,"Linked List"}; - -/** - * Test for linked_list_t with iterator - */ test_t iterator_test = {test_linked_list_iterator,"Linked List Iterator"}; - -/** - * Test for linked_list_t insert and remove - */ test_t linked_list_insert_and_remove_test = {test_linked_list_insert_and_remove,"Linked List Insert and remove"}; - -/** - * Test for event_queue_t - */ test_t event_queue_test = {test_event_queue,"Event-Queue"}; - -/** - * Test 1 for job_queue_t - */ test_t job_queue_test1 = {test_job_queue,"Job-Queue"}; - -/** - * Test 1 for linked_list_t - */ test_t send_queue_test = {test_send_queue,"Send-Queue"}; - -/** - * Test for socket_t - */ test_t socket_test = {test_socket,"Socket"}; - -/** - * Test for thread_pool_t - */ test_t thread_pool_test = {test_thread_pool,"Thread Pool"}; - -/** - * Test for sender_t - */ test_t sender_test = {test_sender,"Sender"}; - -/** - * Test for scheduler_t - */ test_t scheduler_test = {test_scheduler,"Scheduler"}; - -/** - * Test for receiver_t - */ test_t receiver_test = {test_receiver,"Receiver"}; - -/** - * Test for ike_sa_id_t - */ test_t ike_sa_id_test = {test_ike_sa_id,"IKE_SA-Identifier"}; - -/** - * Test for ike_sa_t - */ test_t ike_sa_test = {test_ike_sa,"IKE_SA"}; - - -/** - * Test for ike_sa_manager_t - */ test_t ike_sa_manager_test = {test_ike_sa_manager, "IKE_SA-Manager"}; - test_t generator_test1 = {test_generator_with_header_payload,"Generator: header payload"}; test_t generator_test2 = {test_generator_with_transform_attribute,"Generator: transform attribute"}; test_t generator_test3 = {test_generator_with_transform_substructure,"Generator: transform substructure"}; @@ -137,84 +80,21 @@ test_t generator_test6 = {test_generator_with_ke_payload,"Generator: KE Payload" test_t generator_test7 = {test_generator_with_notify_payload,"Generator: Notify Payload"}; test_t generator_test8 = {test_generator_with_nonce_payload,"Generator: Nonce Payload"}; test_t generator_test9 = {test_generator_with_id_payload,"Generator: ID Payload"}; - - -/** - * Parser test for ike header - */ test_t parser_test1 = {test_parser_with_header_payload, "Parser: header payload"}; - - -/** - * Parser test for ike security association - */ test_t parser_test2 = {test_parser_with_sa_payload, "Parser: sa payload"}; - -/** - * Parser test for ike nonce payload - */ test_t parser_test3 = {test_parser_with_nonce_payload, "Parser: nonce payload"}; - -/** - * Parser test for ike nonce payload - */ test_t parser_test4 = {test_parser_with_ke_payload, "Parser: key exchange payload"}; - -/** - * Parser test for ike notify payload - */ test_t parser_test5 = {test_parser_with_notify_payload, "Parser: notify payload"}; - -/** - * Parser test for ike notify payload - */ test_t parser_test6 = {test_parser_with_id_payload, "Parser: ID payload"}; - -/** - * Test for packet_t - */ test_t packet_test = {test_packet,"Packet"}; - - -/** - * Test for packet_t - */ test_t diffie_hellman_test = {test_diffie_hellman,"Diffie Hellman"}; - -/** - * Test for sha1 hasher - */ test_t sha1_hasher_test = {test_sha1_hasher,"SHA1 hasher"}; - -/** - * Test for md5 hasher - */ test_t md5_hasher_test = {test_md5_hasher,"MD5 hasher"}; - -/** - * Test for hmac - */ test_t hmac_test1 = {test_hmac_sha1, "HMAC using SHA1"}; test_t hmac_test2 = {test_hmac_md5, "HMAC using MD5"}; - -/** - * Test for prf_plus - */ test_t prf_plus_test = {test_prf_plus, "prf+"}; - -/** - * Test for AES CBC crypter - */ test_t aes_cbc_crypter_test = {test_aes_cbc_crypter, "AES CBC"}; - -/** - * Test for hmac signer with MD5 - */ test_t hmac_signer_test1 = {test_hmac_md5_signer, "HMAC MD5 signer test"}; - -/** - * Test for hmac signer with SHA1 - */ test_t hmac_signer_test2 = {test_hmac_sha1_signer, "HMAC SHA1 signer test"}; -- 2.7.4