diff options
author | Tobias Brunner <tobias@strongswan.org> | 2012-09-13 14:22:08 +0200 |
---|---|---|
committer | Tobias Brunner <tobias@strongswan.org> | 2012-09-13 15:44:46 +0200 |
commit | 4c57c6306235e566f1738cfb7edf582e824b31c6 (patch) | |
tree | 747a380203ea558d44804203453e6c4ff1828aea /src/libstrongswan/crypto | |
parent | 995875210acb70ba2b12c9368ce892325abb64f2 (diff) | |
download | strongswan-4c57c6306235e566f1738cfb7edf582e824b31c6.tar.bz2 strongswan-4c57c6306235e566f1738cfb7edf582e824b31c6.tar.xz |
Added possibility to register custom proposal keywords
Keyword lookup and registration are handled via the new lib->proposal object.
Diffstat (limited to 'src/libstrongswan/crypto')
-rw-r--r-- | src/libstrongswan/crypto/proposal/proposal_keywords.c | 120 | ||||
-rw-r--r-- | src/libstrongswan/crypto/proposal/proposal_keywords.h | 62 | ||||
-rw-r--r-- | src/libstrongswan/crypto/transform.h | 2 |
3 files changed, 172 insertions, 12 deletions
diff --git a/src/libstrongswan/crypto/proposal/proposal_keywords.c b/src/libstrongswan/crypto/proposal/proposal_keywords.c index bb6353ded..7356dc367 100644 --- a/src/libstrongswan/crypto/proposal/proposal_keywords.c +++ b/src/libstrongswan/crypto/proposal/proposal_keywords.c @@ -1,4 +1,19 @@ /* + * Copyright (C) 2012 Tobias Brunner + * 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. + */ + +/* * Copyright (c) 2012 Nanoteq Pty Ltd * * Permission is hereby granted, free of charge, to any person obtaining a copy @@ -23,10 +38,109 @@ #include "proposal_keywords.h" #include "proposal_keywords_static.h" +#include <utils/linked_list.h> +#include <threading/rwlock.h> + +typedef struct private_proposal_keywords_t private_proposal_keywords_t; + +struct private_proposal_keywords_t { + + /** + * public interface + */ + proposal_keywords_t public; + + /** + * registered tokens, as proposal_token_t + */ + linked_list_t * tokens; + + /** + * rwlock to lock access to modules + */ + rwlock_t *lock; +}; + +/** + * Find the token object for the algorithm specified. + */ +static const proposal_token_t* find_token(private_proposal_keywords_t *this, + const char *str) +{ + proposal_token_t *token, *found = NULL; + enumerator_t *enumerator; + + this->lock->read_lock(this->lock); + enumerator = this->tokens->create_enumerator(this->tokens); + while (enumerator->enumerate(enumerator, &token)) + { + if (streq(token->name, str)) + { + found = token; + break; + } + } + enumerator->destroy(enumerator); + this->lock->unlock(this->lock); + return found; +} + +METHOD(proposal_keywords_t, get_token, const proposal_token_t*, + private_proposal_keywords_t *this, const char *str) +{ + const proposal_token_t *token = proposal_get_token_static(str, strlen(str)); + return token ?: find_token(this, str); +} + +METHOD(proposal_keywords_t, register_token, void, + private_proposal_keywords_t *this, const char *name, transform_type_t type, + u_int16_t algorithm, u_int16_t keysize) +{ + proposal_token_t *token; + + INIT(token, + .name = strdup(name), + .type = type, + .algorithm = algorithm, + .keysize = keysize, + ); + + this->lock->write_lock(this->lock); + this->tokens->insert_first(this->tokens, token); + this->lock->unlock(this->lock); +} + +METHOD(proposal_keywords_t, destroy, void, + private_proposal_keywords_t *this) +{ + proposal_token_t *token; + + while (this->tokens->remove_first(this->tokens, (void**)&token) == SUCCESS) + { + free(token->name); + free(token); + } + this->tokens->destroy(this->tokens); + this->lock->destroy(this->lock); + free(this); +} + /* - * see header file + * Described in header. */ -const proposal_token_t* proposal_get_token(const char *str) +proposal_keywords_t *proposal_keywords_create() { - return proposal_get_token_static(str, strlen(str)); + private_proposal_keywords_t *this; + + INIT(this, + .public = { + .get_token = _get_token, + .register_token = _register_token, + .destroy = _destroy, + }, + .tokens = linked_list_create(), + .lock = rwlock_create(RWLOCK_TYPE_DEFAULT), + ); + + return &this->public; } diff --git a/src/libstrongswan/crypto/proposal/proposal_keywords.h b/src/libstrongswan/crypto/proposal/proposal_keywords.h index ad9e82a36..05f8958e0 100644 --- a/src/libstrongswan/crypto/proposal/proposal_keywords.h +++ b/src/libstrongswan/crypto/proposal/proposal_keywords.h @@ -1,4 +1,19 @@ /* + * Copyright (C) 2012 Tobias Brunner + * 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. + */ + +/* * Copyright (c) 2012 Nanoteq Pty Ltd * * Permission is hereby granted, free of charge, to any person obtaining a copy @@ -28,14 +43,16 @@ #ifndef PROPOSAL_KEYWORDS_H_ #define PROPOSAL_KEYWORDS_H_ -#include <crypto/transform.h> +typedef struct proposal_token_t proposal_token_t; +typedef struct proposal_keywords_t proposal_keywords_t; -typedef struct proposal_token proposal_token_t; +#include <library.h> +#include <crypto/transform.h> /** * Class representing a proposal token.. */ -struct proposal_token { +struct proposal_token_t { /** * The name of the token. @@ -59,11 +76,40 @@ struct proposal_token { }; /** - * Returns a proposal token for the specified string if a token exists. - * - * @param str the string containing the name of the token - * @return proposal_tolen if found otherwise NULL + * Class to manage proposal keywords + */ +struct proposal_keywords_t { + + /** + * Returns the proposal token for the specified string if a token exists. + * + * @param str the string containing the name of the token + * @return proposal_token if found, NULL otherwise + */ + const proposal_token_t *(*get_token)(proposal_keywords_t *this, + const char *str); + + /** + * Register a new proposal token for an algorithm. + * + * @param name the string containing the name of the token + * @param type the transform_type_t for the token + * @param algorithm the IKE id of the algorithm + * @param keysize the key size associated with the specific algorithm + */ + void (*register_token)(proposal_keywords_t *this, const char *name, + transform_type_t type, u_int16_t algorithm, + u_int16_t keysize); + + /** + * Destroy a proposal_keywords_t instance. + */ + void (*destroy)(proposal_keywords_t *this); +}; + +/** + * Create a proposal_keywords_t instance. */ -const proposal_token_t* proposal_get_token(const char *str); +proposal_keywords_t *proposal_keywords_create(); #endif /** PROPOSAL_KEYWORDS_H_ @}*/ diff --git a/src/libstrongswan/crypto/transform.h b/src/libstrongswan/crypto/transform.h index 1393c674c..7469a371d 100644 --- a/src/libstrongswan/crypto/transform.h +++ b/src/libstrongswan/crypto/transform.h @@ -23,7 +23,7 @@ typedef enum transform_type_t transform_type_t; -#include <library.h> +#include <enum.h> /** * Type of a transform, as in IKEv2 RFC 3.3.2. |