diff options
author | Martin Willi <martin@strongswan.org> | 2009-09-09 16:19:44 +0200 |
---|---|---|
committer | Martin Willi <martin@strongswan.org> | 2009-09-10 16:20:18 +0200 |
commit | 26135ed9bb0f54e870b9afd2a256e5fbe370c92f (patch) | |
tree | 98bfbcd619be372e59bdb96c157e6fc0406527a0 /src | |
parent | 0a139eeac98c8ce19def7be80a131ca6656d802d (diff) | |
download | strongswan-26135ed9bb0f54e870b9afd2a256e5fbe370c92f.tar.bz2 strongswan-26135ed9bb0f54e870b9afd2a256e5fbe370c92f.tar.xz |
Updated dnskey plugin to the new builder API
Diffstat (limited to 'src')
-rw-r--r-- | src/libstrongswan/plugins/dnskey/dnskey_builder.c | 94 | ||||
-rw-r--r-- | src/libstrongswan/plugins/dnskey/dnskey_builder.h | 25 | ||||
-rw-r--r-- | src/libstrongswan/plugins/dnskey/dnskey_plugin.c | 6 |
3 files changed, 49 insertions, 76 deletions
diff --git a/src/libstrongswan/plugins/dnskey/dnskey_builder.c b/src/libstrongswan/plugins/dnskey/dnskey_builder.c index 792e7c160..ba20e7158 100644 --- a/src/libstrongswan/plugins/dnskey/dnskey_builder.c +++ b/src/libstrongswan/plugins/dnskey/dnskey_builder.c @@ -46,7 +46,7 @@ enum dnskey_algorithm_t { /** * Load a generic public key from a DNSKEY RR blob */ -static public_key_t *parse_public_key(chunk_t blob) +static dnskey_public_key_t *parse_public_key(chunk_t blob) { dnskey_rr_t *rr = (dnskey_rr_t*)blob.ptr; @@ -71,7 +71,7 @@ static public_key_t *parse_public_key(chunk_t blob) /** * Load a RSA public key from DNSKEY RR data */ -static public_key_t *parse_rsa_public_key(chunk_t blob) +static dnskey_public_key_t *parse_rsa_public_key(chunk_t blob) { chunk_t n, e; @@ -104,83 +104,39 @@ static public_key_t *parse_rsa_public_key(chunk_t blob) BUILD_END); } -typedef struct private_builder_t private_builder_t; - -/** - * Builder implementation for private/public key loading - */ -struct private_builder_t { - /** implements the builder interface */ - builder_t public; - /** dnskey packet data */ - chunk_t blob; - /** type of key to build */ - key_type_t type; -}; - -/** - * Implementation of builder_t.build for public keys - */ -static public_key_t *build_public(private_builder_t *this) -{ - public_key_t *key = NULL; - - switch (this->type) - { - case KEY_ANY: - key = parse_public_key(this->blob); - break; - case KEY_RSA: - key = parse_rsa_public_key(this->blob); - break; - default: - break; - } - free(this); - return key; -} - /** - * Implementation of builder_t.add for public keys + * See header. */ -static void add_public(private_builder_t *this, builder_part_t part, ...) +dnskey_public_key_t *dnskey_public_key_load(key_type_t type, va_list args) { - va_list args; + chunk_t blob = chunk_empty; - switch (part) + while (TRUE) { - case BUILD_BLOB_DNSKEY: + switch (va_arg(args, builder_part_t)) { - va_start(args, part); - this->blob = va_arg(args, chunk_t); - va_end(args); - break; + case BUILD_BLOB_DNSKEY: + blob = va_arg(args, chunk_t); + continue; + case BUILD_END: + break; + default: + return NULL; } - default: - builder_cancel(&this->public); - break; + break; } -} - -/** - * Builder construction function for public keys - */ -builder_t *dnskey_public_key_builder(key_type_t type) -{ - private_builder_t *this; - - if (type != KEY_ANY && type != KEY_RSA) + if (!blob.ptr) { return NULL; } - - this = malloc_thing(private_builder_t); - - this->blob = chunk_empty; - this->type = type; - this->public.add = (void(*)(builder_t *this, builder_part_t part, ...))add_public; - this->public.build = (void*(*)(builder_t *this))build_public; - - return &this->public; + switch (type) + { + case KEY_ANY: + return parse_public_key(blob); + case KEY_RSA: + return parse_rsa_public_key(blob); + default: + return NULL; + } } diff --git a/src/libstrongswan/plugins/dnskey/dnskey_builder.h b/src/libstrongswan/plugins/dnskey/dnskey_builder.h index aa4a1692a..16eff3269 100644 --- a/src/libstrongswan/plugins/dnskey/dnskey_builder.h +++ b/src/libstrongswan/plugins/dnskey/dnskey_builder.h @@ -21,14 +21,31 @@ #ifndef DNSKEY_BUILDER_H_ #define DNSKEY_BUILDER_H_ +#include <credentials/builder.h> #include <credentials/keys/public_key.h> +typedef struct dnskey_public_key_t dnskey_public_key_t; + +/** + * Public key implementation supporting RFC4034 decoding. + */ +struct dnskey_public_key_t { + + /** + * Implements public_key_t interface. + */ + public_key_t interface; +}; + /** - * Create the builder for a generic or an RSA public key. + * Load a public key in RFC4034 format. + * + * Takes a BUILD_BLOB_DNSKEY to parse the public key. * - * @param type type of the key, either KEY_ANY or KEY_RSA - * @return builder instance + * @param type type of the key, must be KEY_RSA or KEY_ANY + * @param args builder_part_t argument list + * @return built key, NULL on failure */ -builder_t *dnskey_public_key_builder(key_type_t type); +dnskey_public_key_t *dnskey_public_key_load(key_type_t type, va_list args); #endif /** DNSKEY_BUILDER_H_ @}*/ diff --git a/src/libstrongswan/plugins/dnskey/dnskey_plugin.c b/src/libstrongswan/plugins/dnskey/dnskey_plugin.c index d2cf6e4b5..83dbe31a1 100644 --- a/src/libstrongswan/plugins/dnskey/dnskey_plugin.c +++ b/src/libstrongswan/plugins/dnskey/dnskey_plugin.c @@ -37,7 +37,7 @@ struct private_dnskey_plugin_t { static void destroy(private_dnskey_plugin_t *this) { lib->creds->remove_builder(lib->creds, - (builder_constructor_t)dnskey_public_key_builder); + (builder_function_t)dnskey_public_key_load); free(this); } @@ -51,9 +51,9 @@ plugin_t *plugin_create() this->public.plugin.destroy = (void(*)(plugin_t*))destroy; lib->creds->add_builder(lib->creds, CRED_PUBLIC_KEY, KEY_ANY, - (builder_constructor_t)dnskey_public_key_builder); + (builder_function_t)dnskey_public_key_load); lib->creds->add_builder(lib->creds, CRED_PUBLIC_KEY, KEY_RSA, - (builder_constructor_t)dnskey_public_key_builder); + (builder_function_t)dnskey_public_key_load); return &this->public.plugin; } |