If EVP_PKEY structure contains an ENGINE the key is ENGINE specific and
[openssl.git] / crypto / evp / pmeth_lib.c
index 9a85f60737258021e5a06da9fe76df65b46345d9..bc7c8305a0e160133446a44468336288e5e72d6f 100644 (file)
@@ -73,15 +73,24 @@ DECLARE_STACK_OF(EVP_PKEY_METHOD)
 STACK_OF(EVP_PKEY_METHOD) *app_pkey_methods = NULL;
 
 extern const EVP_PKEY_METHOD rsa_pkey_meth, dh_pkey_meth, dsa_pkey_meth;
-extern const EVP_PKEY_METHOD ec_pkey_meth, hmac_pkey_meth;
+extern const EVP_PKEY_METHOD ec_pkey_meth, hmac_pkey_meth, cmac_pkey_meth;
 
 static const EVP_PKEY_METHOD *standard_methods[] =
        {
+#ifndef OPENSSL_NO_RSA
        &rsa_pkey_meth,
+#endif
+#ifndef OPENSSL_NO_DH
        &dh_pkey_meth,
+#endif
+#ifndef OPENSSL_NO_DSA
        &dsa_pkey_meth,
+#endif
+#ifndef OPENSSL_NO_EC
        &ec_pkey_meth,
+#endif
        &hmac_pkey_meth,
+       &cmac_pkey_meth
        };
 
 DECLARE_OBJ_BSEARCH_CMP_FN(const EVP_PKEY_METHOD *, const EVP_PKEY_METHOD *,
@@ -126,6 +135,8 @@ static EVP_PKEY_CTX *int_ctx_new(EVP_PKEY *pkey, ENGINE *e, int id)
                id = pkey->ameth->pkey_id;
                }
 #ifndef OPENSSL_NO_ENGINE
+       if (pkey && pkey->engine)
+               e = pkey->engine;
        /* Try to find an ENGINE which implements this method */
        if (e)
                {
@@ -169,6 +180,7 @@ static EVP_PKEY_CTX *int_ctx_new(EVP_PKEY *pkey, ENGINE *e, int id)
        ret->operation = EVP_PKEY_OP_UNDEFINED;
        ret->pkey = pkey;
        ret->peerkey = NULL;
+       ret->pkey_gencb = 0;
        if (pkey)
                CRYPTO_add(&pkey->references,1,CRYPTO_LOCK_EVP_PKEY);
        ret->data = NULL;