aboutsummaryrefslogtreecommitdiffstats
path: root/src/libstrongswan/plugins/openssl/openssl_rsa_public_key.c
diff options
context:
space:
mode:
authorMartin Willi <martin@strongswan.org>2009-09-14 14:29:10 +0200
committerMartin Willi <martin@strongswan.org>2009-09-14 14:29:10 +0200
commitb9fbd66587d720975104074bda197bc2efcf3c77 (patch)
treeca0b0b7a0abaa71f9db173e308e7ad21d2b189e5 /src/libstrongswan/plugins/openssl/openssl_rsa_public_key.c
parent341af94dc655279dd9bf9de276ccf1141d02f9f3 (diff)
downloadstrongswan-b9fbd66587d720975104074bda197bc2efcf3c77.tar.bz2
strongswan-b9fbd66587d720975104074bda197bc2efcf3c77.tar.xz
Added support to build RSA keys from components in openssl
Diffstat (limited to 'src/libstrongswan/plugins/openssl/openssl_rsa_public_key.c')
-rw-r--r--src/libstrongswan/plugins/openssl/openssl_rsa_public_key.c29
1 files changed, 23 insertions, 6 deletions
diff --git a/src/libstrongswan/plugins/openssl/openssl_rsa_public_key.c b/src/libstrongswan/plugins/openssl/openssl_rsa_public_key.c
index 67c2e47d4..689dc27f6 100644
--- a/src/libstrongswan/plugins/openssl/openssl_rsa_public_key.c
+++ b/src/libstrongswan/plugins/openssl/openssl_rsa_public_key.c
@@ -304,8 +304,9 @@ openssl_rsa_public_key_t *openssl_rsa_public_key_load(key_type_t type,
va_list args)
{
private_openssl_rsa_public_key_t *this;
- chunk_t blob;
+ chunk_t blob, n, e;
+ n = e = blob = chunk_empty;
while (TRUE)
{
switch (va_arg(args, builder_part_t))
@@ -313,6 +314,12 @@ openssl_rsa_public_key_t *openssl_rsa_public_key_load(key_type_t type,
case BUILD_BLOB_ASN1_DER:
blob = va_arg(args, chunk_t);
continue;
+ case BUILD_RSA_MODULUS:
+ n = va_arg(args, chunk_t);
+ continue;
+ case BUILD_RSA_PUB_EXP:
+ e = va_arg(args, chunk_t);
+ continue;
case BUILD_END:
break;
default:
@@ -322,12 +329,22 @@ openssl_rsa_public_key_t *openssl_rsa_public_key_load(key_type_t type,
}
this = create_empty();
- this->rsa = d2i_RSAPublicKey(NULL, (const u_char**)&blob.ptr, blob.len);
- if (!this->rsa)
+ if (blob.ptr)
+ {
+ this->rsa = d2i_RSAPublicKey(NULL, (const u_char**)&blob.ptr, blob.len);
+ if (this->rsa)
+ {
+ return &this->public;
+ }
+ }
+ else if (n.ptr && e.ptr)
{
- destroy(this);
- return NULL;
+ this->rsa = RSA_new();
+ this->rsa->n = BN_bin2bn((const u_char*)n.ptr, n.len, NULL);
+ this->rsa->e = BN_bin2bn((const u_char*)e.ptr, e.len, NULL);
+ return &this->public;
}
- return &this->public;
+ destroy(this);
+ return NULL;
}