summaryrefslogtreecommitdiffstats
path: root/crypto/evp/keymgmt_lib.c
diff options
context:
space:
mode:
authorRichard Levitte <levitte@openssl.org>2019-07-10 14:30:55 +0200
committerRichard Levitte <levitte@openssl.org>2019-07-22 06:19:42 +0200
commit4cae07fef3b24bee1646f6085c52175ef3755d5b (patch)
tree084300563983a7a7010c5237520b075e2642c962 /crypto/evp/keymgmt_lib.c
parentd0ea49a820e02713bbe8892a333f2552da633b16 (diff)
Add evp_keymgmt_clear_pkey_cache() and use it
This function clears the cache of provider key references, and is used in evp_keymgmt_export_to_provider() when the internal key is dirty, as well as by EVP_PKEY_free_it(). Reviewed-by: Matt Caswell <matt@openssl.org> (Merged from https://github.com/openssl/openssl/pull/9312)
Diffstat (limited to 'crypto/evp/keymgmt_lib.c')
-rw-r--r--crypto/evp/keymgmt_lib.c27
1 files changed, 20 insertions, 7 deletions
diff --git a/crypto/evp/keymgmt_lib.c b/crypto/evp/keymgmt_lib.c
index 76c4a30a1c..7169f4270e 100644
--- a/crypto/evp/keymgmt_lib.c
+++ b/crypto/evp/keymgmt_lib.c
@@ -80,13 +80,7 @@ void *evp_keymgmt_export_to_provider(EVP_PKEY *pk, EVP_KEYMGMT *keymgmt)
return NULL;
if (pk->ameth->dirty_cnt(pk) != pk->dirty_cnt_copy)
- for (i = 0;
- i < OSSL_NELEM(pk->pkeys) && pk->pkeys[i].keymgmt != NULL;
- i++) {
- pk->pkeys[i].keymgmt->freekey(pk->pkeys[i].provkey);
- pk->pkeys[i].keymgmt = NULL;
- pk->pkeys[i].provkey = NULL;
- }
+ evp_keymgmt_clear_pkey_cache(pk);
}
/*
@@ -186,3 +180,22 @@ void *evp_keymgmt_export_to_provider(EVP_PKEY *pk, EVP_KEYMGMT *keymgmt)
}
return provkey;
}
+
+void evp_keymgmt_clear_pkey_cache(EVP_PKEY *pk)
+{
+ size_t i;
+
+ if (pk != NULL) {
+ for (i = 0;
+ i < OSSL_NELEM(pk->pkeys) && pk->pkeys[i].keymgmt != NULL;
+ i++) {
+ EVP_KEYMGMT *keymgmt = pk->pkeys[i].keymgmt;
+ void *provkey = pk->pkeys[i].provkey;
+
+ pk->pkeys[i].keymgmt = NULL;
+ pk->pkeys[i].provkey = NULL;
+ keymgmt->freekey(provkey);
+ EVP_KEYMGMT_free(keymgmt);
+ }
+ }
+}