(no commit message)
authorJan Hutter <jhutter@hsr.ch>
Tue, 29 Nov 2005 10:02:34 +0000 (10:02 -0000)
committerJan Hutter <jhutter@hsr.ch>
Tue, 29 Nov 2005 10:02:34 +0000 (10:02 -0000)
Source/charon/encoding/payloads/id_payload.c [new file with mode: 0644]
Source/charon/encoding/payloads/id_payload.h [new file with mode: 0644]
Source/charon/testcases/testcases.c

diff --git a/Source/charon/encoding/payloads/id_payload.c b/Source/charon/encoding/payloads/id_payload.c
new file mode 100644 (file)
index 0000000..708aa61
--- /dev/null
@@ -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 <http://www.fsf.org/copyleft/gpl.txt>.
+ *
+ * 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 <encoding/payloads/encodings.h>
+#include <utils/allocator.h>
+
+/** 
+ * 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 (file)
index 0000000..b4cb304
--- /dev/null
@@ -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 <http://www.fsf.org/copyleft/gpl.txt>.
+ *
+ * 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 <types.h>
+#include <encoding/payloads/payload.h>
+
+/**
+ * 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_
index a672b15..2a41f46 100644 (file)
 /* output for test messages */
 extern FILE * stderr;
 
 /* output for test messages */
 extern FILE * stderr;
 
-/**
- * Test for linked_list_t
- */
 test_t linked_list_test = {test_linked_list,"Linked List"};
 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_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_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_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_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_t send_queue_test = {test_send_queue,"Send-Queue"};
-
-/**
- * Test for socket_t
- */
 test_t socket_test = {test_socket,"Socket"};
 test_t socket_test = {test_socket,"Socket"};
-
-/**
- * Test for thread_pool_t
- */
 test_t thread_pool_test = {test_thread_pool,"Thread Pool"};
 test_t thread_pool_test = {test_thread_pool,"Thread Pool"};
-
-/**
- * Test for sender_t
- */
 test_t sender_test = {test_sender,"Sender"};
 test_t sender_test = {test_sender,"Sender"};
-
-/**
- * Test for scheduler_t
- */
 test_t scheduler_test = {test_scheduler,"Scheduler"};
 test_t scheduler_test = {test_scheduler,"Scheduler"};
-
-/**
- * Test for receiver_t
- */
 test_t receiver_test = {test_receiver,"Receiver"};
 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_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_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 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"};
 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"};
 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"};
 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"};
 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"};
 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"};
 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"};
 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_t parser_test6 = {test_parser_with_id_payload, "Parser: ID payload"};
-
-/**
- * Test for packet_t
- */
 test_t packet_test = {test_packet,"Packet"};
 test_t packet_test = {test_packet,"Packet"};
-
-
-/**
- * Test for packet_t
- */
 test_t diffie_hellman_test = {test_diffie_hellman,"Diffie Hellman"};
 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_t sha1_hasher_test = {test_sha1_hasher,"SHA1 hasher"};
-
-/**
- * Test for md5 hasher
- */
 test_t md5_hasher_test = {test_md5_hasher,"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_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_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_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_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"};
 
 
 test_t hmac_signer_test2 = {test_hmac_sha1_signer, "HMAC SHA1 signer test"};