Add ex_data to EVP_PKEY.
authorAaron Thompson <dev@aaront.org>
Tue, 7 Apr 2020 00:18:09 +0000 (00:18 +0000)
committerDmitry Belyavskiy <beldmit@gmail.com>
Tue, 14 Apr 2020 14:58:17 +0000 (17:58 +0300)
Reviewed-by: Matt Caswell <matt@openssl.org>
Reviewed-by: Dmitry Belyavskiy <beldmit@gmail.com>
(Merged from https://github.com/openssl/openssl/pull/11515)

crypto/evp/p_lib.c
doc/man3/BIO_get_ex_new_index.pod
doc/man3/CRYPTO_get_ex_new_index.pod
include/crypto/evp.h
include/openssl/crypto.h
include/openssl/evp.h
util/libcrypto.num

index 85b5cc8127df84bdf0a05b66618658034768b8bb..c1a8a8804df5337798e9bb5c960a3a46a6f2b68c 100644 (file)
@@ -96,6 +96,16 @@ int EVP_PKEY_save_parameters(EVP_PKEY *pkey, int mode)
     return 0;
 }
 
+int EVP_PKEY_set_ex_data(EVP_PKEY *key, int idx, void *arg)
+{
+    return CRYPTO_set_ex_data(&key->ex_data, idx, arg);
+}
+
+void *EVP_PKEY_get_ex_data(const EVP_PKEY *key, int idx)
+{
+    return CRYPTO_get_ex_data(&key->ex_data, idx);
+}
+
 int EVP_PKEY_copy_parameters(EVP_PKEY *to, const EVP_PKEY *from)
 {
     /*
@@ -1090,10 +1100,20 @@ EVP_PKEY *EVP_PKEY_new(void)
     ret->lock = CRYPTO_THREAD_lock_new();
     if (ret->lock == NULL) {
         EVPerr(EVP_F_EVP_PKEY_NEW, ERR_R_MALLOC_FAILURE);
-        OPENSSL_free(ret);
-        return NULL;
+        goto err;
+    }
+#ifndef FIPS_MODE
+    if (!CRYPTO_new_ex_data(CRYPTO_EX_INDEX_EVP_PKEY, ret, &ret->ex_data)) {
+        EVPerr(EVP_F_EVP_PKEY_NEW, ERR_R_MALLOC_FAILURE);
+        goto err;
     }
+#endif
     return ret;
+
+ err:
+    CRYPTO_THREAD_lock_free(ret->lock);
+    OPENSSL_free(ret);
+    return NULL;
 }
 
 /*
@@ -1328,6 +1348,9 @@ void EVP_PKEY_free(EVP_PKEY *x)
         return;
     REF_ASSERT_ISNT(i < 0);
     evp_pkey_free_it(x);
+#ifndef FIPS_MODE
+    CRYPTO_free_ex_data(CRYPTO_EX_INDEX_EVP_PKEY, x, &x->ex_data);
+#endif
     CRYPTO_THREAD_lock_free(x->lock);
 #ifndef FIPS_MODE
     sk_X509_ATTRIBUTE_pop_free(x->attributes, X509_ATTRIBUTE_free);
index 71de3e6848e1a708dd8ccab856f6955ef3c40fd7..365c08405a1cbf59b213a520d7dad93ab67bc7c1 100644 (file)
@@ -9,6 +9,7 @@ DSA_get_ex_new_index, DSA_set_ex_data, DSA_get_ex_data,
 ECDH_get_ex_new_index, ECDH_set_ex_data, ECDH_get_ex_data,
 EC_KEY_get_ex_new_index, EC_KEY_set_ex_data, EC_KEY_get_ex_data,
 ENGINE_get_ex_new_index, ENGINE_set_ex_data, ENGINE_get_ex_data,
+EVP_PKEY_get_ex_new_index, EVP_PKEY_set_ex_data, EVP_PKEY_get_ex_data,
 RAND_DRBG_set_ex_data, RAND_DRBG_get_ex_data, RAND_DRBG_get_ex_new_index,
 RSA_get_ex_new_index, RSA_set_ex_data, RSA_get_ex_data,
 RSA_set_app_data, RSA_get_app_data,
index d8cecccdb1443cbf986d034cadaa14e4dcc80535..10f7feb5cd1e7221f1f3868f28c3aa500e02965a 100644 (file)
@@ -49,6 +49,7 @@ The specific structures are:
     DSA
     EC_KEY
     ENGINE
+    EVP_PKEY
     RAND_DRBG
     RSA
     SSL
index 63b6dad9c61b6ee53c49b9a4a27b538a5fd984f9..8acbc6a73ecdf45c7addcf87998fcceea5bdaf60 100644 (file)
@@ -557,6 +557,9 @@ struct evp_pkey_st {
     CRYPTO_RWLOCK *lock;
     STACK_OF(X509_ATTRIBUTE) *attributes; /* [ 0 ] */
     int save_parameters;
+#ifndef FIPS_MODE
+    CRYPTO_EX_DATA ex_data;
+#endif
 
     /* == Provider attributes == */
 
index 3508144b4ab541fc41ffd0dc6796fb60b04e34fc..c184d847f8bb01f8ddc02ef6c8f913301b607f73 100644 (file)
@@ -192,7 +192,8 @@ DEFINE_STACK_OF(void)
 # define CRYPTO_EX_INDEX_RAND_DRBG       15
 # define CRYPTO_EX_INDEX_DRBG            CRYPTO_EX_INDEX_RAND_DRBG
 # define CRYPTO_EX_INDEX_OPENSSL_CTX     16
-# define CRYPTO_EX_INDEX__COUNT          17
+# define CRYPTO_EX_INDEX_EVP_PKEY        17
+# define CRYPTO_EX_INDEX__COUNT          18
 
 typedef void CRYPTO_EX_new (void *parent, void *ptr, CRYPTO_EX_DATA *ad,
                            int idx, long argl, void *argp);
index a14e89920289b37d88c42fafa883be8dbec3cda6..3945e43fac53ed24184e1dc2fd43e0bce9bcc22e 100644 (file)
@@ -1616,6 +1616,11 @@ int EVP_PKEY_param_check(EVP_PKEY_CTX *ctx);
 int EVP_PKEY_private_check(EVP_PKEY_CTX *ctx);
 int EVP_PKEY_pairwise_check(EVP_PKEY_CTX *ctx);
 
+# define EVP_PKEY_get_ex_new_index(l, p, newf, dupf, freef) \
+    CRYPTO_get_ex_new_index(CRYPTO_EX_INDEX_EVP_PKEY, l, p, newf, dupf, freef)
+int EVP_PKEY_set_ex_data(EVP_PKEY *key, int idx, void *arg);
+void *EVP_PKEY_get_ex_data(const EVP_PKEY *key, int idx);
+
 void EVP_PKEY_CTX_set_cb(EVP_PKEY_CTX *ctx, EVP_PKEY_gen_cb *cb);
 EVP_PKEY_gen_cb *EVP_PKEY_CTX_get_cb(EVP_PKEY_CTX *ctx);
 
index 71d08750be3471281c76e752a527748519f04269..983c74a6bf97e37d61d0211d9c54d48cdde8d23e 100644 (file)
@@ -5045,3 +5045,5 @@ CT_POLICY_EVAL_CTX_new_with_libctx      ? 3_0_0   EXIST::FUNCTION:CT
 CTLOG_new_with_libctx                   ?      3_0_0   EXIST::FUNCTION:CT
 CTLOG_new_from_base64_with_libctx       ?      3_0_0   EXIST::FUNCTION:CT
 CTLOG_STORE_new_with_libctx             ?      3_0_0   EXIST::FUNCTION:CT
+EVP_PKEY_set_ex_data                    ?      3_0_0   EXIST::FUNCTION:
+EVP_PKEY_get_ex_data                    ?      3_0_0   EXIST::FUNCTION: