X-Git-Url: https://git.openssl.org/?a=blobdiff_plain;f=crypto%2Fevp%2Fkdf_meth.c;h=94af5d40a091e682d318a277aa992eefdf72c64c;hb=cd770738796c591f93b2db630bab57cd8d3d5796;hp=576dde68055ba2123ab245f4bd352c927ed3a3ef;hpb=251e610ce4479913e593f9f7a9a711115e6cf1a3;p=openssl.git diff --git a/crypto/evp/kdf_meth.c b/crypto/evp/kdf_meth.c index 576dde6805..94af5d40a0 100644 --- a/crypto/evp/kdf_meth.c +++ b/crypto/evp/kdf_meth.c @@ -1,5 +1,5 @@ /* - * Copyright 2019 The OpenSSL Project Authors. All Rights Reserved. + * Copyright 2019-2021 The OpenSSL Project Authors. All Rights Reserved. * * Licensed under the Apache License 2.0 (the "License"). You may not use * this file except in compliance with the License. You can obtain a copy @@ -10,10 +10,11 @@ #include #include #include -#include +#include #include -#include "crypto/evp.h" #include "internal/provider.h" +#include "internal/core.h" +#include "crypto/evp.h" #include "evp_local.h" static int evp_kdf_up_ref(void *vkdf) @@ -25,18 +26,21 @@ static int evp_kdf_up_ref(void *vkdf) return 1; } -static void evp_kdf_free(void *vkdf){ +static void evp_kdf_free(void *vkdf) +{ EVP_KDF *kdf = (EVP_KDF *)vkdf; int ref = 0; - if (kdf != NULL) { - CRYPTO_DOWN_REF(&kdf->refcnt, &ref, kdf->lock); - if (ref <= 0) { - ossl_provider_free(kdf->prov); - CRYPTO_THREAD_lock_free(kdf->lock); - OPENSSL_free(kdf); - } - } + if (kdf == NULL) + return; + + CRYPTO_DOWN_REF(&kdf->refcnt, &ref, kdf->lock); + if (ref > 0) + return; + OPENSSL_free(kdf->type_name); + ossl_provider_free(kdf->prov); + CRYPTO_THREAD_lock_free(kdf->lock); + OPENSSL_free(kdf); } static void *evp_kdf_new(void) @@ -52,82 +56,87 @@ static void *evp_kdf_new(void) return kdf; } -static void *evp_kdf_from_dispatch(int name_id, - const OSSL_DISPATCH *fns, - OSSL_PROVIDER *prov, - void *method_data) +static void *evp_kdf_from_algorithm(int name_id, + const OSSL_ALGORITHM *algodef, + OSSL_PROVIDER *prov) { + const OSSL_DISPATCH *fns = algodef->implementation; EVP_KDF *kdf = NULL; int fnkdfcnt = 0, fnctxcnt = 0; if ((kdf = evp_kdf_new()) == NULL) { - EVPerr(0, ERR_R_MALLOC_FAILURE); + ERR_raise(ERR_LIB_EVP, ERR_R_MALLOC_FAILURE); return NULL; } kdf->name_id = name_id; + if ((kdf->type_name = ossl_algorithm_get1_first_name(algodef)) == NULL) { + evp_kdf_free(kdf); + return NULL; + } + kdf->description = algodef->algorithm_description; for (; fns->function_id != 0; fns++) { switch (fns->function_id) { case OSSL_FUNC_KDF_NEWCTX: if (kdf->newctx != NULL) break; - kdf->newctx = OSSL_get_OP_kdf_newctx(fns); + kdf->newctx = OSSL_FUNC_kdf_newctx(fns); fnctxcnt++; break; case OSSL_FUNC_KDF_DUPCTX: if (kdf->dupctx != NULL) break; - kdf->dupctx = OSSL_get_OP_kdf_dupctx(fns); + kdf->dupctx = OSSL_FUNC_kdf_dupctx(fns); break; case OSSL_FUNC_KDF_FREECTX: if (kdf->freectx != NULL) break; - kdf->freectx = OSSL_get_OP_kdf_freectx(fns); + kdf->freectx = OSSL_FUNC_kdf_freectx(fns); fnctxcnt++; break; case OSSL_FUNC_KDF_RESET: if (kdf->reset != NULL) break; - kdf->reset = OSSL_get_OP_kdf_reset(fns); + kdf->reset = OSSL_FUNC_kdf_reset(fns); break; case OSSL_FUNC_KDF_DERIVE: if (kdf->derive != NULL) break; - kdf->derive = OSSL_get_OP_kdf_derive(fns); + kdf->derive = OSSL_FUNC_kdf_derive(fns); fnkdfcnt++; break; case OSSL_FUNC_KDF_GETTABLE_PARAMS: if (kdf->gettable_params != NULL) break; kdf->gettable_params = - OSSL_get_OP_kdf_gettable_params(fns); + OSSL_FUNC_kdf_gettable_params(fns); break; case OSSL_FUNC_KDF_GETTABLE_CTX_PARAMS: if (kdf->gettable_ctx_params != NULL) break; kdf->gettable_ctx_params = - OSSL_get_OP_kdf_gettable_ctx_params(fns); + OSSL_FUNC_kdf_gettable_ctx_params(fns); break; case OSSL_FUNC_KDF_SETTABLE_CTX_PARAMS: if (kdf->settable_ctx_params != NULL) break; kdf->settable_ctx_params = - OSSL_get_OP_kdf_settable_ctx_params(fns); + OSSL_FUNC_kdf_settable_ctx_params(fns); break; case OSSL_FUNC_KDF_GET_PARAMS: if (kdf->get_params != NULL) break; - kdf->get_params = OSSL_get_OP_kdf_get_params(fns); + kdf->get_params = OSSL_FUNC_kdf_get_params(fns); break; case OSSL_FUNC_KDF_GET_CTX_PARAMS: if (kdf->get_ctx_params != NULL) break; - kdf->get_ctx_params = OSSL_get_OP_kdf_get_ctx_params(fns); + kdf->get_ctx_params = OSSL_FUNC_kdf_get_ctx_params(fns); break; case OSSL_FUNC_KDF_SET_CTX_PARAMS: if (kdf->set_ctx_params != NULL) break; - kdf->set_ctx_params = OSSL_get_OP_kdf_set_ctx_params(fns); + kdf->set_ctx_params = OSSL_FUNC_kdf_set_ctx_params(fns); break; } } @@ -148,11 +157,11 @@ static void *evp_kdf_from_dispatch(int name_id, return kdf; } -EVP_KDF *EVP_KDF_fetch(OPENSSL_CTX *libctx, const char *algorithm, +EVP_KDF *EVP_KDF_fetch(OSSL_LIB_CTX *libctx, const char *algorithm, const char *properties) { return evp_generic_fetch(libctx, OSSL_OP_KDF, algorithm, properties, - evp_kdf_from_dispatch, NULL, evp_kdf_up_ref, + evp_kdf_from_algorithm, evp_kdf_up_ref, evp_kdf_free); } @@ -170,28 +179,54 @@ const OSSL_PARAM *EVP_KDF_gettable_params(const EVP_KDF *kdf) { if (kdf->gettable_params == NULL) return NULL; - return kdf->gettable_params(); + return kdf->gettable_params(ossl_provider_ctx(EVP_KDF_get0_provider(kdf))); } const OSSL_PARAM *EVP_KDF_gettable_ctx_params(const EVP_KDF *kdf) { + void *alg; + if (kdf->gettable_ctx_params == NULL) return NULL; - return kdf->gettable_ctx_params(); + alg = ossl_provider_ctx(EVP_KDF_get0_provider(kdf)); + return kdf->gettable_ctx_params(NULL, alg); } const OSSL_PARAM *EVP_KDF_settable_ctx_params(const EVP_KDF *kdf) { + void *alg; + if (kdf->settable_ctx_params == NULL) return NULL; - return kdf->settable_ctx_params(); + alg = ossl_provider_ctx(EVP_KDF_get0_provider(kdf)); + return kdf->settable_ctx_params(NULL, alg); +} + +const OSSL_PARAM *EVP_KDF_CTX_gettable_params(EVP_KDF_CTX *ctx) +{ + void *alg; + + if (ctx->meth->gettable_ctx_params == NULL) + return NULL; + alg = ossl_provider_ctx(EVP_KDF_get0_provider(ctx->meth)); + return ctx->meth->gettable_ctx_params(ctx->algctx, alg); +} + +const OSSL_PARAM *EVP_KDF_CTX_settable_params(EVP_KDF_CTX *ctx) +{ + void *alg; + + if (ctx->meth->settable_ctx_params == NULL) + return NULL; + alg = ossl_provider_ctx(EVP_KDF_get0_provider(ctx->meth)); + return ctx->meth->settable_ctx_params(ctx->algctx, alg); } -void EVP_KDF_do_all_provided(OPENSSL_CTX *libctx, +void EVP_KDF_do_all_provided(OSSL_LIB_CTX *libctx, void (*fn)(EVP_KDF *kdf, void *arg), void *arg) { evp_generic_do_all(libctx, OSSL_OP_KDF, (void (*)(void *, void *))fn, arg, - evp_kdf_from_dispatch, NULL, evp_kdf_free); + evp_kdf_from_algorithm, evp_kdf_up_ref, evp_kdf_free); }