This commit is contained in:
Jan Hutter
2005-11-29 10:02:34 +00:00
parent db6e764580
commit 45c3d18680
3 changed files with 492 additions and 120 deletions
@@ -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));
}
@@ -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, "[email protected]". 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_
-120
View File
@@ -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"};