diff options
author | Martin Willi <martin@strongswan.org> | 2009-08-24 14:09:18 +0200 |
---|---|---|
committer | Martin Willi <martin@strongswan.org> | 2009-08-26 11:23:52 +0200 |
commit | e35c3e2a032975d1accf04376d880127f7743889 (patch) | |
tree | 84e362daf1982d836b25f347bad74de5440e86ee /src/libstrongswan/plugins/openssl/openssl_rsa_private_key.c | |
parent | cbd51389481b0b0ce11261cb16ae2a2e9c3939bb (diff) | |
download | strongswan-e35c3e2a032975d1accf04376d880127f7743889.tar.bz2 strongswan-e35c3e2a032975d1accf04376d880127f7743889.tar.xz |
updated openssl plugin to new private/public key API, use encoder framework
Diffstat (limited to 'src/libstrongswan/plugins/openssl/openssl_rsa_private_key.c')
-rw-r--r-- | src/libstrongswan/plugins/openssl/openssl_rsa_private_key.c | 192 |
1 files changed, 59 insertions, 133 deletions
diff --git a/src/libstrongswan/plugins/openssl/openssl_rsa_private_key.c b/src/libstrongswan/plugins/openssl/openssl_rsa_private_key.c index 95c0ffdc8..c61cae71f 100644 --- a/src/libstrongswan/plugins/openssl/openssl_rsa_private_key.c +++ b/src/libstrongswan/plugins/openssl/openssl_rsa_private_key.c @@ -1,4 +1,5 @@ /* + * Copyright (C) 2009 Martin Willi * Copyright (C) 2008 Tobias Brunner * Hochschule fuer Technik Rapperswil * @@ -47,34 +48,14 @@ struct private_openssl_rsa_private_key_t { * TRUE if the key is from an OpenSSL ENGINE and might not be readable */ bool engine; - - /** - * Keyid formed as a SHA-1 hash of a privateKey object - */ - identification_t* keyid; - - /** - * Keyid formed as a SHA-1 hash of a privateKeyInfo object - */ - identification_t* keyid_info; /** * reference count */ - refcount_t ref; + refcount_t ref; }; /** - * shared functions, implemented in openssl_rsa_public_key.c - */ -bool openssl_rsa_public_key_build_id(RSA *rsa, identification_t **keyid, - identification_t **keyid_info); - - -openssl_rsa_public_key_t *openssl_rsa_public_key_create_from_n_e(BIGNUM *n, BIGNUM *e); - - -/** * Build an EMPSA PKCS1 signature described in PKCS#1 */ static bool build_emsa_pkcs1_signature(private_openssl_rsa_private_key_t *this, @@ -98,13 +79,13 @@ static bool build_emsa_pkcs1_signature(private_openssl_rsa_private_key_t *this, EVP_PKEY *key; const EVP_MD *hasher; u_int len; - + hasher = EVP_get_digestbynid(type); if (!hasher) { return FALSE; } - + ctx = EVP_MD_CTX_create(); key = EVP_PKEY_new(); if (!ctx || !key) @@ -201,95 +182,67 @@ static size_t get_keysize(private_openssl_rsa_private_key_t *this) } /** - * Implementation of openssl_rsa_private_key.get_id. - */ -static identification_t* get_id(private_openssl_rsa_private_key_t *this, - id_type_t type) -{ - switch (type) - { - case ID_PUBKEY_INFO_SHA1: - return this->keyid_info; - case ID_PUBKEY_SHA1: - return this->keyid; - default: - return NULL; - } -} - -/** * Implementation of openssl_rsa_private_key.get_public_key. */ -static openssl_rsa_public_key_t* get_public_key(private_openssl_rsa_private_key_t *this) -{ - return openssl_rsa_public_key_create_from_n_e(this->rsa->n, this->rsa->e); -} - -/** - * Implementation of openssl_rsa_private_key.equals. - */ -static bool equals(private_openssl_rsa_private_key_t *this, private_key_t *other) +static public_key_t* get_public_key(private_openssl_rsa_private_key_t *this) { - identification_t *keyid; - - if (&this->public.interface == other) - { - return TRUE; - } - if (other->get_type(other) != KEY_RSA) - { - return FALSE; - } - keyid = other->get_id(other, ID_PUBKEY_SHA1); - if (keyid && keyid->equals(keyid, this->keyid)) - { - return TRUE; - } - keyid = other->get_id(other, ID_PUBKEY_INFO_SHA1); - if (keyid && keyid->equals(keyid, this->keyid_info)) - { - return TRUE; - } - return FALSE; + chunk_t enc; + public_key_t *key; + u_char *p; + + enc = chunk_alloc(i2d_RSAPublicKey(this->rsa, NULL)); + p = enc.ptr; + i2d_RSAPublicKey(this->rsa, &p); + key = lib->creds->create(lib->creds, CRED_PUBLIC_KEY, KEY_RSA, + BUILD_BLOB_ASN1_DER, enc, BUILD_END); + free(enc.ptr); + return key; } /** - * Implementation of openssl_rsa_private_key.belongs_to. + * Implementation of public_key_t.get_fingerprint. */ -static bool belongs_to(private_openssl_rsa_private_key_t *this, public_key_t *public) +static bool get_fingerprint(private_openssl_rsa_private_key_t *this, + key_encoding_type_t type, chunk_t *fingerprint) { - identification_t *keyid; - - if (public->get_type(public) != KEY_RSA) - { - return FALSE; - } - keyid = public->get_id(public, ID_PUBKEY_SHA1); - if (keyid && keyid->equals(keyid, this->keyid)) - { - return TRUE; - } - keyid = public->get_id(public, ID_PUBKEY_INFO_SHA1); - if (keyid && keyid->equals(keyid, this->keyid_info)) + chunk_t enc; + bool success; + u_char *p; + + if (lib->encoding->get_cache(lib->encoding, type, this, fingerprint)) { return TRUE; } - return FALSE; + enc = chunk_alloc(i2d_RSAPublicKey(this->rsa, NULL)); + p = enc.ptr; + i2d_RSAPublicKey(this->rsa, &p); + success = lib->encoding->encode(lib->encoding, type, this, fingerprint, + KEY_PART_RSA_PUB_ASN1_DER, enc, KEY_PART_END); + free(enc.ptr); + return success; } -/** - * Implementation of private_key_t.get_encoding. +/* + * Implementation of public_key_t.get_encoding. */ -static chunk_t get_encoding(private_openssl_rsa_private_key_t *this) +static bool get_encoding(private_openssl_rsa_private_key_t *this, + key_encoding_type_t type, chunk_t *encoding) { - chunk_t enc = chunk_empty; + chunk_t enc; + bool success; + u_char *p; + if (!this->engine) { - enc = chunk_alloc(i2d_RSAPrivateKey(this->rsa, NULL)); - u_char *p = enc.ptr; - i2d_RSAPrivateKey(this->rsa, &p); + return FALSE; } - return enc; + enc = chunk_alloc(i2d_RSAPrivateKey(this->rsa, NULL)); + p = enc.ptr; + i2d_RSAPrivateKey(this->rsa, &p); + success = lib->encoding->encode(lib->encoding, type, NULL, encoding, + KEY_PART_RSA_PUB_ASN1_DER, enc, KEY_PART_END); + free(enc.ptr); + return success; } /** @@ -299,7 +252,6 @@ static private_openssl_rsa_private_key_t* get_ref(private_openssl_rsa_private_ke { ref_get(&this->ref); return this; - } /** @@ -313,8 +265,7 @@ static void destroy(private_openssl_rsa_private_key_t *this) { RSA_free(this->rsa); } - DESTROY_IF(this->keyid); - DESTROY_IF(this->keyid_info); + lib->encoding->clear_cache(lib->encoding, this); free(this); } } @@ -322,7 +273,7 @@ static void destroy(private_openssl_rsa_private_key_t *this) /** * Internal generic constructor */ -static private_openssl_rsa_private_key_t *openssl_rsa_private_key_create_empty(void) +static private_openssl_rsa_private_key_t *create_empty(void) { private_openssl_rsa_private_key_t *this = malloc_thing(private_openssl_rsa_private_key_t); @@ -330,17 +281,15 @@ static private_openssl_rsa_private_key_t *openssl_rsa_private_key_create_empty(v this->public.interface.sign = (bool (*) (private_key_t*, signature_scheme_t, chunk_t, chunk_t*))sign; this->public.interface.decrypt = (bool (*) (private_key_t*, chunk_t, chunk_t*))decrypt; this->public.interface.get_keysize = (size_t (*) (private_key_t*))get_keysize; - this->public.interface.get_id = (identification_t* (*) (private_key_t*, id_type_t))get_id; this->public.interface.get_public_key = (public_key_t* (*) (private_key_t*))get_public_key; - this->public.interface.equals = (bool (*) (private_key_t*, private_key_t*))equals; - this->public.interface.belongs_to = (bool (*) (private_key_t*, public_key_t*))belongs_to; - this->public.interface.get_encoding = (chunk_t(*) (private_key_t*))get_encoding; + this->public.interface.equals = private_key_equals; + this->public.interface.belongs_to = private_key_belongs_to; + this->public.interface.get_fingerprint = (bool(*)(private_key_t*, key_encoding_type_t type, chunk_t *fp))get_fingerprint; + this->public.interface.get_encoding = (bool(*)(private_key_t*, key_encoding_type_t type, chunk_t *encoding))get_encoding; this->public.interface.get_ref = (private_key_t* (*) (private_key_t*))get_ref; this->public.interface.destroy = (void (*) (private_key_t*))destroy; this->engine = FALSE; - this->keyid = NULL; - this->keyid_info = NULL; this->ref = 1; return this; @@ -351,16 +300,10 @@ static private_openssl_rsa_private_key_t *openssl_rsa_private_key_create_empty(v */ static openssl_rsa_private_key_t *generate(size_t key_size) { - private_openssl_rsa_private_key_t *this = openssl_rsa_private_key_create_empty(); + private_openssl_rsa_private_key_t *this = create_empty(); this->rsa = RSA_generate_key(key_size, PUBLIC_EXPONENT, NULL, NULL); - if (!openssl_rsa_public_key_build_id(this->rsa, &this->keyid, &this->keyid_info)) - { - destroy(this); - return NULL; - } - return &this->public; } @@ -370,30 +313,19 @@ static openssl_rsa_private_key_t *generate(size_t key_size) static openssl_rsa_private_key_t *load(chunk_t blob) { u_char *p = blob.ptr; - private_openssl_rsa_private_key_t *this = openssl_rsa_private_key_create_empty(); + private_openssl_rsa_private_key_t *this = create_empty(); this->rsa = d2i_RSAPrivateKey(NULL, (const u_char**)&p, blob.len); - - chunk_clear(&blob); - if (!this->rsa) { destroy(this); return NULL; } - - if (!openssl_rsa_public_key_build_id(this->rsa, &this->keyid, &this->keyid_info)) - { - destroy(this); - return NULL; - } - if (!RSA_check_key(this->rsa)) { destroy(this); return NULL; } - return &this->public; } @@ -436,15 +368,10 @@ static openssl_rsa_private_key_t *load_from_smartcard(char *keyid, char *pin) } ENGINE_free(engine); - this = openssl_rsa_private_key_create_empty(); + this = create_empty(); this->rsa = EVP_PKEY_get1_RSA(key); this->engine = TRUE; - if (!openssl_rsa_public_key_build_id(this->rsa, &this->keyid, &this->keyid_info)) - { - destroy(this); - return NULL; - } return &this->public; error: @@ -453,6 +380,7 @@ error: } typedef struct private_builder_t private_builder_t; + /** * Builder implementation for key loading/generation */ @@ -490,15 +418,13 @@ static void add(private_builder_t *this, builder_part_t part, ...) if (!this->key) { va_list args; - chunk_t chunk; - + switch (part) { case BUILD_BLOB_ASN1_DER: { va_start(args, part); - chunk = va_arg(args, chunk_t); - this->key = load(chunk_clone(chunk)); + this->key = load(va_arg(args, chunk_t)); va_end(args); return; } |