Make {RSA,DSA,DH}_new_method obtain and release an ENGINE
[openssl.git] / crypto / dsa / dsa_lib.c
index 900e0098fa876024733112c465c5cc9433d65591..da2cdfa3d642fccb751dc6a923be83597b75f765 100644 (file)
@@ -110,19 +110,28 @@ DSA *DSA_new_method(ENGINE *engine)
        ret=(DSA *)OPENSSL_malloc(sizeof(DSA));
        if (ret == NULL)
                {
-               DSAerr(DSA_F_DSA_NEW,ERR_R_MALLOC_FAILURE);
+               DSAerr(DSA_F_DSA_NEW_METHOD,ERR_R_MALLOC_FAILURE);
                return(NULL);
                }
        ret->meth = DSA_get_default_method();
-       ret->engine = engine;
-       if(!ret->engine)
+       if (engine)
+               {
+               if (!ENGINE_init(engine))
+                       {
+                       DSAerr(DSA_F_DSA_NEW_METHOD, ERR_R_ENGINE_LIB);
+                       OPENSSL_free(ret);
+                       return NULL;
+                       }
+               ret->engine = engine;
+               }
+       else
                ret->engine = ENGINE_get_default_DSA();
        if(ret->engine)
                {
                ret->meth = ENGINE_get_DSA(ret->engine);
                if(!ret->meth)
                        {
-                       DSAerr(DSA_F_DSA_NEW,
+                       DSAerr(DSA_F_DSA_NEW_METHOD,
                                ERR_R_ENGINE_LIB);
                        ENGINE_finish(ret->engine);
                        OPENSSL_free(ret);
@@ -149,6 +158,8 @@ DSA *DSA_new_method(ENGINE *engine)
        CRYPTO_new_ex_data(CRYPTO_EX_INDEX_DSA, ret, &ret->ex_data);
        if ((ret->meth->init != NULL) && !ret->meth->init(ret))
                {
+               if (ret->engine)
+                       ENGINE_finish(ret->engine);
                CRYPTO_free_ex_data(CRYPTO_EX_INDEX_DSA, ret, &ret->ex_data);
                OPENSSL_free(ret);
                ret=NULL;