From: Pauli Date: Mon, 24 Jan 2022 06:08:58 +0000 (+1100) Subject: pvk kdf: implement ctx dup operation X-Git-Tag: openssl-3.2.0-alpha1~2996 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=fe01052f775d1b5dff86ff9b405b6b0df5efd3cf;p=thirdparty%2Fopenssl.git pvk kdf: implement ctx dup operation Reviewed-by: Shane Lontis (Merged from https://github.com/openssl/openssl/pull/17572) --- diff --git a/providers/implementations/kdfs/pvkkdf.c b/providers/implementations/kdfs/pvkkdf.c index e953911c836..e96ff29b3b3 100644 --- a/providers/implementations/kdfs/pvkkdf.c +++ b/providers/implementations/kdfs/pvkkdf.c @@ -17,6 +17,7 @@ #include "prov/provider_util.h" static OSSL_FUNC_kdf_newctx_fn kdf_pvk_new; +static OSSL_FUNC_kdf_dupctx_fn kdf_pvk_dup; static OSSL_FUNC_kdf_freectx_fn kdf_pvk_free; static OSSL_FUNC_kdf_reset_fn kdf_pvk_reset; static OSSL_FUNC_kdf_derive_fn kdf_pvk_derive; @@ -71,6 +72,26 @@ static void kdf_pvk_free(void *vctx) } } +static void *kdf_pvk_dup(void *vctx) +{ + const KDF_PVK *src = (const KDF_PVK *)vctx; + KDF_PVK *dest; + + dest = kdf_pvk_new(src->provctx); + if (dest != NULL) + if (!ossl_prov_memdup(src->salt, src->salt_len, + &dest->salt, &dest->salt_len) + || !ossl_prov_memdup(src->pass, src->pass_len, + &dest->pass , &dest->pass_len) + || !ossl_prov_digest_copy(&dest->digest, &src->digest)) + goto err; + return dest; + + err: + kdf_pvk_free(dest); + return NULL; +} + static void kdf_pvk_reset(void *vctx) { KDF_PVK *ctx = (KDF_PVK *)vctx; @@ -216,6 +237,7 @@ static const OSSL_PARAM *kdf_pvk_gettable_ctx_params(ossl_unused void *ctx, const OSSL_DISPATCH ossl_kdf_pvk_functions[] = { { OSSL_FUNC_KDF_NEWCTX, (void(*)(void))kdf_pvk_new }, + { OSSL_FUNC_KDF_DUPCTX, (void(*)(void))kdf_pvk_dup }, { OSSL_FUNC_KDF_FREECTX, (void(*)(void))kdf_pvk_free }, { OSSL_FUNC_KDF_RESET, (void(*)(void))kdf_pvk_reset }, { OSSL_FUNC_KDF_DERIVE, (void(*)(void))kdf_pvk_derive },