In EVP_PKEY_assign[_...], return 0 for an error when they
[openssl.git] / crypto / evp / p_lib.c
index 3422b77de6e36c3c2f83ab6541f6523df1457698..5dcbbc84a5d150b6ea63f927a42a24946991b8f7 100644 (file)
@@ -202,8 +202,66 @@ int EVP_PKEY_assign(EVP_PKEY *pkey, int type, char *key)
        pkey->type=EVP_PKEY_type(type);
        pkey->save_type=type;
        pkey->pkey.ptr=key;
-       return(1);
+       return(key != NULL);
+       }
+
+#ifndef NO_RSA
+int EVP_PKEY_rset_RSA(EVP_PKEY *pkey, RSA *key)
+{
+       int ret = EVP_PKEY_assign_RSA(pkey, key);
+       if(ret) CRYPTO_add(&key->references, 1, CRYPTO_LOCK_RSA);
+       return ret;
+}
+
+RSA *EVP_PKEY_rget_RSA(EVP_PKEY *pkey)
+       {
+       if(pkey->type != EVP_PKEY_RSA) {
+               EVPerr(EVP_F_EVP_PKEY_RGET_RSA, EVP_R_EXPECTING_AN_RSA_KEY);
+               return NULL;
+       }
+       CRYPTO_add(&pkey->pkey.rsa->references, 1, CRYPTO_LOCK_RSA);
+       return pkey->pkey.rsa;
+}
+#endif
+
+#ifndef NO_DSA
+int EVP_PKEY_rset_DSA(EVP_PKEY *pkey, DSA *key)
+{
+       int ret = EVP_PKEY_assign_DSA(pkey, key);
+       if(ret) CRYPTO_add(&key->references, 1, CRYPTO_LOCK_DSA);
+       return ret;
+}
+
+DSA *EVP_PKEY_rget_DSA(EVP_PKEY *pkey)
+       {
+       if(pkey->type != EVP_PKEY_DSA) {
+               EVPerr(EVP_F_EVP_PKEY_RGET_DSA, EVP_R_EXPECTING_A_DSA_KEY);
+               return NULL;
+       }
+       CRYPTO_add(&pkey->pkey.dsa->references, 1, CRYPTO_LOCK_DSA);
+       return pkey->pkey.dsa;
+}
+#endif
+
+#ifndef NO_DH
+
+int EVP_PKEY_rset_DH(EVP_PKEY *pkey, DH *key)
+{
+       int ret = EVP_PKEY_assign_DH(pkey, key);
+       if(ret) CRYPTO_add(&key->references, 1, CRYPTO_LOCK_DH);
+       return ret;
+}
+
+DH *EVP_PKEY_rget_DH(EVP_PKEY *pkey)
+       {
+       if(pkey->type != EVP_PKEY_DH) {
+               EVPerr(EVP_F_EVP_PKEY_RGET_DH, EVP_R_EXPECTING_A_DH_KEY);
+               return NULL;
        }
+       CRYPTO_add(&pkey->pkey.dh->references, 1, CRYPTO_LOCK_DH);
+       return pkey->pkey.dh;
+}
+#endif
 
 int EVP_PKEY_type(int type)
        {