summaryrefslogtreecommitdiff
path: root/providers/implementations/kdfs/krb5kdf.c
diff options
context:
space:
mode:
authorPauli <pauli@openssl.org>2022-01-24 17:02:29 +1100
committerPauli <pauli@openssl.org>2022-02-01 16:17:24 +1100
commit4c1a841c3de645674ed2af92da25f7f5736fae1c (patch)
tree56a37d1d3e26ba1ed11b118213db09f809db1c06 /providers/implementations/kdfs/krb5kdf.c
parentd54c52c28ebb780e2ffc5b7752d35359215cf0a6 (diff)
downloadopenssl-new-4c1a841c3de645674ed2af92da25f7f5736fae1c.tar.gz
krb5kdf: implement ctx dup operation
Reviewed-by: Shane Lontis <shane.lontis@oracle.com> (Merged from https://github.com/openssl/openssl/pull/17572)
Diffstat (limited to 'providers/implementations/kdfs/krb5kdf.c')
-rw-r--r--providers/implementations/kdfs/krb5kdf.c23
1 files changed, 23 insertions, 0 deletions
diff --git a/providers/implementations/kdfs/krb5kdf.c b/providers/implementations/kdfs/krb5kdf.c
index 2c887f0eb9..1e86f9a6d7 100644
--- a/providers/implementations/kdfs/krb5kdf.c
+++ b/providers/implementations/kdfs/krb5kdf.c
@@ -34,6 +34,7 @@
/* KRB5 KDF defined in RFC 3961, Section 5.1 */
static OSSL_FUNC_kdf_newctx_fn krb5kdf_new;
+static OSSL_FUNC_kdf_dupctx_fn krb5kdf_dup;
static OSSL_FUNC_kdf_freectx_fn krb5kdf_free;
static OSSL_FUNC_kdf_reset_fn krb5kdf_reset;
static OSSL_FUNC_kdf_derive_fn krb5kdf_derive;
@@ -102,6 +103,27 @@ static int krb5kdf_set_membuf(unsigned char **dst, size_t *dst_len,
return OSSL_PARAM_get_octet_string(p, (void **)dst, 0, dst_len);
}
+static void *krb5kdf_dup(void *vctx)
+{
+ const KRB5KDF_CTX *src = (const KRB5KDF_CTX *)vctx;
+ KRB5KDF_CTX *dest;
+
+ dest = krb5kdf_new(src->provctx);
+ if (dest != NULL) {
+ if (!ossl_prov_memdup(src->key, src->key_len,
+ &dest->key, &dest->key_len)
+ || !ossl_prov_memdup(src->constant, src->constant_len,
+ &dest->constant , &dest->constant_len)
+ || !ossl_prov_cipher_copy(&dest->cipher, &src->cipher))
+ goto err;
+ }
+ return dest;
+
+ err:
+ krb5kdf_free(dest);
+ return NULL;
+}
+
static int krb5kdf_derive(void *vctx, unsigned char *key, size_t keylen,
const OSSL_PARAM params[])
{
@@ -198,6 +220,7 @@ static const OSSL_PARAM *krb5kdf_gettable_ctx_params(ossl_unused void *ctx,
const OSSL_DISPATCH ossl_kdf_krb5kdf_functions[] = {
{ OSSL_FUNC_KDF_NEWCTX, (void(*)(void))krb5kdf_new },
+ { OSSL_FUNC_KDF_DUPCTX, (void(*)(void))krb5kdf_dup },
{ OSSL_FUNC_KDF_FREECTX, (void(*)(void))krb5kdf_free },
{ OSSL_FUNC_KDF_RESET, (void(*)(void))krb5kdf_reset },
{ OSSL_FUNC_KDF_DERIVE, (void(*)(void))krb5kdf_derive },