diff options
author | Jan Hutter <jhutter@hsr.ch> | 2005-11-30 17:21:33 +0000 |
---|---|---|
committer | Jan Hutter <jhutter@hsr.ch> | 2005-11-30 17:21:33 +0000 |
commit | 2ef11339c720d06215f44555de020ea5ebdfd641 (patch) | |
tree | a321b18986035416e2ec85fbd6a54ee72c063dd6 /Source/charon/config | |
parent | 1e54ebfac4625ef359ec5a061088bd5966882dd8 (diff) | |
download | strongswan-2ef11339c720d06215f44555de020ea5ebdfd641.tar.bz2 strongswan-2ef11339c720d06215f44555de020ea5ebdfd641.tar.xz |
created class init_config_t encapsulating configuration issues of
IKE_SA_INIT phase
Diffstat (limited to 'Source/charon/config')
-rw-r--r-- | Source/charon/config/Makefile.config | 4 | ||||
-rw-r--r-- | Source/charon/config/init_config.c | 210 | ||||
-rw-r--r-- | Source/charon/config/init_config.h | 165 |
3 files changed, 379 insertions, 0 deletions
diff --git a/Source/charon/config/Makefile.config b/Source/charon/config/Makefile.config index 977a272b0..1333a24eb 100644 --- a/Source/charon/config/Makefile.config +++ b/Source/charon/config/Makefile.config @@ -18,3 +18,7 @@ CONFIG_DIR= $(MAIN_DIR)config/ OBJS+= $(BUILD_DIR)configuration_manager.o $(BUILD_DIR)configuration_manager.o : $(CONFIG_DIR)configuration_manager.c $(CONFIG_DIR)configuration_manager.h $(CC) $(CFLAGS) -c -o $@ $< + +OBJS+= $(BUILD_DIR)init_config.o +$(BUILD_DIR)init_config.o : $(CONFIG_DIR)init_config.c $(CONFIG_DIR)init_config.h + $(CC) $(CFLAGS) -c -o $@ $< diff --git a/Source/charon/config/init_config.c b/Source/charon/config/init_config.c index e69de29bb..495feb7ab 100644 --- a/Source/charon/config/init_config.c +++ b/Source/charon/config/init_config.c @@ -0,0 +1,210 @@ +/** + * @file init_config.c + * + * @brief Implementation of init_config_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 "init_config.h" + +#include <utils/allocator.h> +#include <utils/linked_list.h> + +typedef struct private_init_config_t private_init_config_t; + +/** + * Private data of an init_config_t object + */ +struct private_init_config_t { + + /** + * Public part + */ + init_config_t public; + + /** + * Host information of my host. + */ + host_t *my_host; + + /** + * Host information of other host. + */ + host_t *other_host; + + /** + * Supported proposals + */ + linked_list_t *proposals; +}; + +/** + * Implementation of init_config_t.get_my_host. + */ +static host_t * get_my_host (private_init_config_t *this) +{ + return this->my_host->clone(this->my_host); +} + +/** + * Implementation of init_config_t.get_other_host. + */ +static host_t * get_other_host (private_init_config_t *this) +{ + return this->other_host->clone(this->other_host); +} + +/** + * Implementation of init_config_t.get_dh_group_number. + */ +static diffie_hellman_group_t get_dh_group_number (private_init_config_t *this,size_t priority) +{ + ike_proposal_t *ike_proposal; + + if ((this->proposals->get_count(this->proposals) == 0) || (this->proposals->get_count(this->proposals) < priority)) + { + return MODP_UNDEFINED; + } + + this->proposals->get_at_position(this->proposals,(priority -1),(void **) &ike_proposal); + + return (ike_proposal->diffie_hellman_group); +} + +/** + * Implementation of init_config_t.get_proposals. + */ +static size_t get_proposals (private_init_config_t *this,ike_proposal_t **proposals) +{ + iterator_t *iterator; + ike_proposal_t *current_proposal; + int i = 0; + ike_proposal_t *proposal_array; + + proposal_array = allocator_alloc(this->proposals->get_count(this->proposals) * sizeof(ike_proposal_t)); + + iterator = this->proposals->create_iterator(this->proposals,TRUE); + + while (iterator->has_next(iterator)) + { + iterator->current(iterator,(void **) ¤t_proposal); + proposal_array[i] = (*current_proposal); + i++; + } + iterator->destroy(iterator); + + *proposals = proposal_array; + return this->proposals->get_count(this->proposals); +} + +/** + * Implementation of init_config_t.select_proposal. + */ +static status_t select_proposal (private_init_config_t *this, ike_proposal_t *proposals, size_t proposal_count, ike_proposal_t *selected_proposal) +{ + iterator_t * my_iterator; + int i; + ike_proposal_t *my_current_proposal; + + my_iterator = this->proposals->create_iterator(this->proposals,TRUE); + + + for (i = 0; i < proposal_count; i++) + { + my_iterator->reset(my_iterator); + while (my_iterator->has_next(my_iterator)) + { + my_iterator->current(my_iterator,(void **) &my_current_proposal); + + if (memcmp(my_current_proposal,&proposals[i],sizeof(ike_proposal_t)) == 0) + { + /* found a matching proposal */ + *selected_proposal = *my_current_proposal; + my_iterator->destroy(my_iterator); + return SUCCESS; + } + } + } + + my_iterator->destroy(my_iterator); + return NOT_FOUND; +} + +/** + * Implementation of init_config_t.destroy. + */ +static void add_proposal (private_init_config_t *this,size_t priority, ike_proposal_t proposal) +{ + ike_proposal_t * new_proposal = allocator_alloc(sizeof(ike_proposal_t)); + + *new_proposal = proposal; + + + if (priority > this->proposals->get_count(this->proposals)) + { + this->proposals->insert_last(this->proposals,new_proposal); + return; + } + + this->proposals->insert_at_position(this->proposals,(priority - 1),new_proposal); +} + +/** + * Implementation of init_config_t.destroy. + */ +static void destroy (private_init_config_t *this) +{ + ike_proposal_t *proposal; + + while (this->proposals->get_count(this->proposals) > 0) + { + this->proposals->remove_first(this->proposals,(void **) &proposal); + allocator_free(proposal); + } + this->proposals->destroy(this->proposals); + + this->my_host->destroy(this->my_host); + this->other_host->destroy(this->other_host); + + allocator_free(this); +} + +/** + * Described in header. + */ +init_config_t * init_config_create(char * my_ip, char *other_ip, u_int16_t my_port, u_int16_t other_port) +{ + private_init_config_t *this = allocator_alloc_thing(private_init_config_t); + + /* public functions */ + this->public.get_my_host = (host_t*(*)(init_config_t*))get_my_host; + this->public.get_other_host = (host_t*(*)(init_config_t*))get_other_host; + this->public.get_dh_group_number = (diffie_hellman_group_t (*)(init_config_t*,size_t))get_dh_group_number; + this->public.get_proposals = (size_t(*)(init_config_t*,ike_proposal_t**))get_proposals; + this->public.select_proposal = (status_t(*)(init_config_t*,ike_proposal_t*,size_t,ike_proposal_t*))select_proposal; + this->public.add_proposal = (void(*)(init_config_t*, size_t, ike_proposal_t)) add_proposal; + this->public.destroy = (void(*)(init_config_t*))destroy; + + /* private variables */ + this->my_host = host_create(AF_INET,my_ip, my_port); + this->other_host = host_create(AF_INET,other_ip, other_port); + + this->proposals = linked_list_create(); + + return (&this->public); +} diff --git a/Source/charon/config/init_config.h b/Source/charon/config/init_config.h index 4cf98609c..876ead887 100644 --- a/Source/charon/config/init_config.h +++ b/Source/charon/config/init_config.h @@ -1,4 +1,169 @@ +/** + * @file init_config.h + * + * @brief Interface of init_config_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 _INIT_CONFIG_H_ #define _INIT_CONFIG_H_ +#include <types.h> +#include <network/host.h> +#include <encoding/payloads/sa_payload.h> +#include <utils/iterator.h> + +typedef struct ike_proposal_t ike_proposal_t; + +/** + * Represents a Proposal used in IKE_SA_INIT phase. + */ +struct ike_proposal_t { + /** + * Encryption algorithm. + * */ + encryption_algorithm_t encryption_algorithm; + + /** + * Key length of encryption algorithm in bytes. + */ + u_int16_t encryption_algorithm_key_length; + + /** + * Integrity algorithm. + */ + integrity_algorithm_t integrity_algorithm; + + /** + * Key length of integrity algorithm + */ + u_int16_t integrity_algorithm_key_length; + + /** + * Pseudo random function (prf). + */ + pseudo_random_function_t pseudo_random_function; + + /** + * Key length of prf. + */ + u_int16_t pseudo_random_function_key_length; + + /** + * Diffie hellman group + */ + diffie_hellman_group_t diffie_hellman_group; +}; + +typedef struct init_config_t init_config_t; + +/** + * Represents a configuration class holding all needed informations for IKE_SA_INIT phase. + * + * @ingroup config + * + */ +struct init_config_t { + + /** + * Get my host information as host_t object. + * + * @warning Object is getting cloned and has to get destroyed by caller. + * + * @param this calling object + * @return host information as host_t object + */ + host_t * (*get_my_host) (init_config_t *this); + + /** + * Get other host information as host_t object. + * + * @warning Object is getting cloned and has to get destroyed by caller. + * + * @param this calling object + * @return host information as host_t object + */ + host_t * (*get_other_host) (init_config_t *this); + + /** + * Get the diffie hellman group to use as initiator with given priority. + * + * + * @param this calling object + * @param priority priority of dh group number (starting at 1) + * @return diffie hellman group number for given priority or + * MODP_UNDEFINED for not supported priorities + */ + diffie_hellman_group_t (*get_dh_group_number) (init_config_t *this,size_t priority); + + /** + * Returns a list of all supported ike_proposals of type ike_proposal_t *. + * + * @warning array of ike_proposal_t has to get destroyed by the caller + * + * @param this calling object + * @param proposals first proposal in a array + * @return number of proposals in array + */ + size_t (*get_proposals) (init_config_t *this,ike_proposal_t **proposals); + + /** + * Adds a proposal with given priority to the current stored proposals + * + * If allready a proposal with given priority is stored the other one is + * moved one priority back. If priority is higher then all other stored + * proposals, it is inserted as last one. + * + * @param this calling object + * @param priority priority of adding proposal + * @param proposal proposal to add + */ + void (*add_proposal) (init_config_t *this,size_t priority, ike_proposal_t proposal); + + /** + * Select a proposed from suggested proposals. + * + * + * @param this calling object + * @param suggested_proposals first proposal in a array + * @param proposal_count number of suggested proposals in array + * @param selected_proposal the ike_proposal_t pointing to is set + * @return + * - SUCCESS if a proposal was selected + * - NOT_FOUND if none of suggested proposals is supported + */ + status_t (*select_proposal) (init_config_t *this, ike_proposal_t *proposals, size_t proposal_count, ike_proposal_t *selected_proposal); + + /** + * Destroys a init_config_t object. + * + * @param this calling object + */ + void (*destroy) (init_config_t *this); +}; + +/** + * Creates a init_config_t object. + * + * @return pointer to created init_config_t object. + * + * @ingroup config + */ +init_config_t * init_config_create(char * my_ip, char *other_ip, u_int16_t my_port, u_int16_t other_port); + #endif //_INIT_CONFIG_H_ |