X-Git-Url: https://git.openssl.org/gitweb/?p=openssl.git;a=blobdiff_plain;f=crypto%2Fevp%2Fexchange.c;h=a47a0f0367f6195be3ae058c4d3e98dfb7c2d093;hp=28e1f88db9f13693b8694bfe7e8d0753136ab6aa;hb=ac2d58c72b4dc4a8c74eef893000306bf78a30fd;hpb=23f04372f45f8c9e3865c3bcfee3f77a9cc10673 diff --git a/crypto/evp/exchange.c b/crypto/evp/exchange.c index 28e1f88db9..a47a0f0367 100644 --- a/crypto/evp/exchange.c +++ b/crypto/evp/exchange.c @@ -202,11 +202,31 @@ int EVP_PKEY_derive_init(EVP_PKEY_CTX *ctx) /* * Ensure that the key is provided, either natively, or as a cached export. - * If not, go legacy + * If not, goto legacy */ tmp_keymgmt = ctx->keymgmt; - provkey = evp_pkey_export_to_provider(ctx->pkey, ctx->libctx, - &tmp_keymgmt, ctx->propquery); + if (ctx->pkey == NULL) { + /* + * Some algorithms (e.g. legacy KDFs) don't have a pkey - so we create + * a blank one. + */ + EVP_PKEY *pkey = EVP_PKEY_new(); + + if (pkey == NULL || !EVP_PKEY_set_type_by_keymgmt(pkey, tmp_keymgmt)) { + ERR_clear_last_mark(); + EVP_PKEY_free(pkey); + ERR_raise(ERR_LIB_EVP, EVP_R_INITIALIZATION_ERROR); + goto err; + } + provkey = pkey->keydata = evp_keymgmt_newdata(tmp_keymgmt); + if (provkey == NULL) + EVP_PKEY_free(pkey); + else + ctx->pkey = pkey; + } else { + provkey = evp_pkey_export_to_provider(ctx->pkey, ctx->libctx, + &tmp_keymgmt, ctx->propquery); + } if (provkey == NULL) goto legacy; if (!EVP_KEYMGMT_up_ref(tmp_keymgmt)) {