diff options
author | Richard Levitte <levitte@openssl.org> | 2020-03-21 06:14:25 +0100 |
---|---|---|
committer | Richard Levitte <levitte@openssl.org> | 2020-03-25 17:01:10 +0100 |
commit | 8243d8d1a17b700c9c48fc5660ff61245b1d14d2 (patch) | |
tree | 6a69820ee31fb35da529491f75ed097e9e60fbf4 /crypto/evp/keymgmt_lib.c | |
parent | adc9f7312665f14ec5c73b60090a4df933e6556d (diff) | |
download | openssl-new-8243d8d1a17b700c9c48fc5660ff61245b1d14d2.tar.gz |
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.c | 36 |
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); } |