Support decoding of subjectPublicKeyInfo in openssl without pkcs1 plugin
authorMartin Willi <martin@revosec.ch>
Wed, 5 May 2010 11:48:10 +0000 (13:48 +0200)
committerMartin Willi <martin@revosec.ch>
Wed, 5 May 2010 11:49:56 +0000 (13:49 +0200)
src/libstrongswan/plugins/openssl/openssl_plugin.c
src/libstrongswan/plugins/openssl/openssl_rsa_public_key.c

index c1545ff..558eba0 100644 (file)
@@ -306,6 +306,8 @@ plugin_t *openssl_plugin_create()
                                        (builder_function_t)openssl_rsa_private_key_connect);
        lib->creds->add_builder(lib->creds, CRED_PUBLIC_KEY, KEY_RSA,
                                        (builder_function_t)openssl_rsa_public_key_load);
+       lib->creds->add_builder(lib->creds, CRED_PUBLIC_KEY, KEY_ANY,
+                                       (builder_function_t)openssl_rsa_public_key_load);
 
        /* ec */
        lib->creds->add_builder(lib->creds, CRED_PRIVATE_KEY, KEY_ECDSA,
index ffa575a..7d88a23 100644 (file)
@@ -345,13 +345,25 @@ openssl_rsa_public_key_t *openssl_rsa_public_key_load(key_type_t type,
        this = create_empty();
        if (blob.ptr)
        {
-               this->rsa = d2i_RSAPublicKey(NULL, (const u_char**)&blob.ptr, blob.len);
+               switch (type)
+               {
+                       case KEY_ANY:
+                               this->rsa = d2i_RSA_PUBKEY(NULL, (const u_char**)&blob.ptr,
+                                                                                  blob.len);
+                               break;
+                       case KEY_RSA:
+                               this->rsa = d2i_RSAPublicKey(NULL, (const u_char**)&blob.ptr,
+                                                                                        blob.len);
+                               break;
+                       default:
+                               break;
+               }
                if (this->rsa)
                {
                        return &this->public;
                }
        }
-       else if (n.ptr && e.ptr)
+       else if (n.ptr && e.ptr && type == KEY_RSA)
        {
                this->rsa = RSA_new();
                this->rsa->n = BN_bin2bn((const u_char*)n.ptr, n.len, NULL);