summaryrefslogtreecommitdiffstats
path: root/crypto/evp/keymgmt_lib.c
diff options
context:
space:
mode:
authorRichard Levitte <levitte@openssl.org>2020-03-21 06:14:25 +0100
committerRichard Levitte <levitte@openssl.org>2020-03-25 17:01:10 +0100
commit8243d8d1a17b700c9c48fc5660ff61245b1d14d2 (patch)
tree6a69820ee31fb35da529491f75ed097e9e60fbf4 /crypto/evp/keymgmt_lib.c
parentadc9f7312665f14ec5c73b60090a4df933e6556d (diff)
EVP: Add EVP_PKEY_set_type_by_keymgmt() and use it
This function intialises an EVP_PKEY to contain a provider side internal key. We take the opportunity to also document the older EVP_PKEY_set_type() and EVP_PKEY_set_type_str(). Reviewed-by: Matt Caswell <matt@openssl.org> (Merged from https://github.com/openssl/openssl/pull/11375)
Diffstat (limited to 'crypto/evp/keymgmt_lib.c')
-rw-r--r--crypto/evp/keymgmt_lib.c36
1 files changed, 15 insertions, 21 deletions
diff --git a/crypto/evp/keymgmt_lib.c b/crypto/evp/keymgmt_lib.c
index 6e63c5ab2d..6c66bfa72d 100644
--- a/crypto/evp/keymgmt_lib.c
+++ b/crypto/evp/keymgmt_lib.c
@@ -206,17 +206,15 @@ void evp_keymgmt_util_cache_keyinfo(EVP_PKEY *pk)
void *evp_keymgmt_util_fromdata(EVP_PKEY *target, EVP_KEYMGMT *keymgmt,
int selection, const OSSL_PARAM params[])
{
- void *keydata = evp_keymgmt_newdata(keymgmt);
+ void *keydata = NULL;
+ if ((keydata = evp_keymgmt_newdata(keymgmt)) == NULL
+ || !evp_keymgmt_import(keymgmt, keydata, selection, params)
+ || !EVP_PKEY_set_type_by_keymgmt(target, keymgmt)) {
+ evp_keymgmt_freedata(keymgmt, keydata);
+ keydata = NULL;
+ }
if (keydata != NULL) {
- if (!evp_keymgmt_import(keymgmt, keydata, selection, params)
- || !EVP_KEYMGMT_up_ref(keymgmt)) {
- evp_keymgmt_freedata(keymgmt, keydata);
- return NULL;
- }
-
- evp_keymgmt_util_clear_operation_cache(target);
- target->keymgmt = keymgmt;
target->keydata = keydata;
evp_keymgmt_util_cache_keyinfo(target);
}
@@ -303,7 +301,7 @@ int evp_keymgmt_util_match(EVP_PKEY *pk1, EVP_PKEY *pk2, int selection)
}
}
/*
- * If we've successfully cross exported one way, there's not point
+ * If we've successfully cross exported one way, there's no point
* doing it the other way, hence the |!ok| check.
*/
if (!ok
@@ -387,12 +385,10 @@ int evp_keymgmt_util_copy(EVP_PKEY *to, EVP_PKEY *from, int selection)
}
if (to->keymgmt == NULL
- && !EVP_KEYMGMT_up_ref(to_keymgmt)) {
+ && !EVP_PKEY_set_type_by_keymgmt(to, to_keymgmt)) {
evp_keymgmt_freedata(to_keymgmt, alloc_keydata);
return 0;
}
- evp_keymgmt_util_clear_operation_cache(to);
- to->keymgmt = to_keymgmt;
to->keydata = to_keydata;
evp_keymgmt_util_cache_keyinfo(to);
@@ -402,16 +398,14 @@ int evp_keymgmt_util_copy(EVP_PKEY *to, EVP_PKEY *from, int selection)
void *evp_keymgmt_util_gen(EVP_PKEY *target, EVP_KEYMGMT *keymgmt,
void *genctx, OSSL_CALLBACK *cb, void *cbarg)
{
- void *keydata = evp_keymgmt_gen(keymgmt, genctx, cb, cbarg);
+ void *keydata = NULL;
+ if ((keydata = evp_keymgmt_gen(keymgmt, genctx, cb, cbarg)) == NULL
+ || !EVP_PKEY_set_type_by_keymgmt(target, keymgmt)) {
+ evp_keymgmt_freedata(keymgmt, keydata);
+ keydata = NULL;
+ }
if (keydata != NULL) {
- if (!EVP_KEYMGMT_up_ref(keymgmt)) {
- evp_keymgmt_freedata(keymgmt, keydata);
- return NULL;
- }
-
- evp_keymgmt_util_clear_operation_cache(target);
- target->keymgmt = keymgmt;
target->keydata = keydata;
evp_keymgmt_util_cache_keyinfo(target);
}