aboutsummaryrefslogtreecommitdiffstats
path: root/src/libstrongswan/plugins/gcrypt/gcrypt_rsa_public_key.c
diff options
context:
space:
mode:
authorMartin Willi <martin@strongswan.org>2009-08-14 17:21:03 +0200
committerMartin Willi <martin@strongswan.org>2009-08-26 11:23:50 +0200
commit4e3d1e804e834b961ca488407f24d6f4a39312cd (patch)
treec23204138680ec884839b3bedb2376cc248e77f4 /src/libstrongswan/plugins/gcrypt/gcrypt_rsa_public_key.c
parent3044774323eeb3ba0305f3d49bbaa07353fc8777 (diff)
downloadstrongswan-4e3d1e804e834b961ca488407f24d6f4a39312cd.tar.bz2
strongswan-4e3d1e804e834b961ca488407f24d6f4a39312cd.tar.xz
make use of the pkcs1 plugin in gcrypt rsa key parsing
Diffstat (limited to 'src/libstrongswan/plugins/gcrypt/gcrypt_rsa_public_key.c')
-rw-r--r--src/libstrongswan/plugins/gcrypt/gcrypt_rsa_public_key.c87
1 files changed, 21 insertions, 66 deletions
diff --git a/src/libstrongswan/plugins/gcrypt/gcrypt_rsa_public_key.c b/src/libstrongswan/plugins/gcrypt/gcrypt_rsa_public_key.c
index d6426e4d6..f574b7186 100644
--- a/src/libstrongswan/plugins/gcrypt/gcrypt_rsa_public_key.c
+++ b/src/libstrongswan/plugins/gcrypt/gcrypt_rsa_public_key.c
@@ -375,53 +375,13 @@ public_key_t *gcrypt_rsa_public_key_create_from_sexp(gcry_sexp_t key)
}
/**
- * ASN.1 definition of RSApublicKey
+ * Load a public key from components
*/
-static const asn1Object_t pubkeyObjects[] = {
- { 0, "RSAPublicKey", ASN1_SEQUENCE, ASN1_OBJ }, /* 0 */
- { 1, "modulus", ASN1_INTEGER, ASN1_BODY }, /* 1 */
- { 1, "publicExponent", ASN1_INTEGER, ASN1_BODY }, /* 2 */
- { 0, "exit", ASN1_EOC, ASN1_EXIT }
-};
-#define PUB_KEY_RSA_PUBLIC_KEY 0
-#define PUB_KEY_MODULUS 1
-#define PUB_KEY_EXPONENT 2
-
-/**
- * Load a public key from an ASN1 encoded blob
- */
-static gcrypt_rsa_public_key_t *load(chunk_t blob)
+static gcrypt_rsa_public_key_t *load(chunk_t n, chunk_t e)
{
private_gcrypt_rsa_public_key_t *this;
- asn1_parser_t *parser;
- chunk_t object, n, e;
- int objectID;
- bool success = FALSE;
gcry_error_t err;
- n = e = chunk_empty;
-
- parser = asn1_parser_create(pubkeyObjects, blob);
- while (parser->iterate(parser, &objectID, &object))
- {
- switch (objectID)
- {
- case PUB_KEY_MODULUS:
- n = object;
- break;
- case PUB_KEY_EXPONENT:
- e = object;
- break;
- }
- }
- success = parser->success(parser);
- parser->destroy(parser);
-
- if (!success)
- {
- return NULL;
- }
-
this = gcrypt_rsa_public_key_create_empty();
err = gcry_sexp_build(&this->key, NULL, "(public-key(rsa(n %b)(e %b)))",
n.len, n.ptr, e.len, e.ptr);
@@ -446,8 +406,8 @@ typedef struct private_builder_t private_builder_t;
struct private_builder_t {
/** implements the builder interface */
builder_t public;
- /** loaded public key */
- gcrypt_rsa_public_key_t *key;
+ /** rsa key parameters */
+ chunk_t n, e;
};
/**
@@ -455,8 +415,9 @@ struct private_builder_t {
*/
static gcrypt_rsa_public_key_t *build(private_builder_t *this)
{
- gcrypt_rsa_public_key_t *key = this->key;
+ gcrypt_rsa_public_key_t *key;
+ key = load(this->n, this->e);
free(this);
return key;
}
@@ -466,28 +427,22 @@ static gcrypt_rsa_public_key_t *build(private_builder_t *this)
*/
static void add(private_builder_t *this, builder_part_t part, ...)
{
- if (!this->key)
- {
- va_list args;
-
- switch (part)
- {
- case BUILD_BLOB_ASN1_DER:
- {
- va_start(args, part);
- this->key = load(va_arg(args, chunk_t));
- va_end(args);
- return;
- }
- default:
- break;
- }
- }
- if (this->key)
+ va_list args;
+
+ va_start(args, part);
+ switch (part)
{
- destroy((private_gcrypt_rsa_public_key_t*)this->key);
+ case BUILD_RSA_MODULUS:
+ this->n = va_arg(args, chunk_t);
+ break;
+ case BUILD_RSA_PUB_EXP:
+ this->e = va_arg(args, chunk_t);
+ break;
+ default:
+ builder_cancel(&this->public);
+ break;
}
- builder_cancel(&this->public);
+ va_end(args);
}
/**
@@ -504,7 +459,7 @@ builder_t *gcrypt_rsa_public_key_builder(key_type_t type)
this = malloc_thing(private_builder_t);
- this->key = NULL;
+ this->n = this->e = chunk_empty;
this->public.add = (void(*)(builder_t *this, builder_part_t part, ...))add;
this->public.build = (void*(*)(builder_t *this))build;