]>
git.ipfire.org Git - thirdparty/openssl.git/blob - crypto/evp/kdf_lib.c
2 * Copyright 2018-2021 The OpenSSL Project Authors. All Rights Reserved.
3 * Copyright (c) 2018-2019, Oracle and/or its affiliates. All rights reserved.
5 * Licensed under the Apache License 2.0 (the "License"). You may not use
6 * this file except in compliance with the License. You can obtain a copy
7 * in the file LICENSE in the source distribution or at
8 * https://www.openssl.org/source/license.html
13 #include "internal/cryptlib.h"
14 #include <openssl/evp.h>
15 #include <openssl/kdf.h>
16 #include <openssl/core.h>
17 #include <openssl/core_names.h>
18 #include "crypto/evp.h"
19 #include "internal/numbers.h"
20 #include "internal/provider.h"
21 #include "evp_local.h"
23 EVP_KDF_CTX
*EVP_KDF_CTX_new(EVP_KDF
*kdf
)
25 EVP_KDF_CTX
*ctx
= NULL
;
30 ctx
= OPENSSL_zalloc(sizeof(EVP_KDF_CTX
));
32 || (ctx
->algctx
= kdf
->newctx(ossl_provider_ctx(kdf
->prov
))) == NULL
33 || !EVP_KDF_up_ref(kdf
)) {
34 ERR_raise(ERR_LIB_EVP
, ERR_R_EVP_LIB
);
36 kdf
->freectx(ctx
->algctx
);
45 void EVP_KDF_CTX_free(EVP_KDF_CTX
*ctx
)
49 ctx
->meth
->freectx(ctx
->algctx
);
51 EVP_KDF_free(ctx
->meth
);
55 EVP_KDF_CTX
*EVP_KDF_CTX_dup(const EVP_KDF_CTX
*src
)
59 if (src
== NULL
|| src
->algctx
== NULL
|| src
->meth
->dupctx
== NULL
)
62 dst
= OPENSSL_malloc(sizeof(*dst
));
66 memcpy(dst
, src
, sizeof(*dst
));
67 if (!EVP_KDF_up_ref(dst
->meth
)) {
68 ERR_raise(ERR_LIB_EVP
, ERR_R_EVP_LIB
);
73 dst
->algctx
= src
->meth
->dupctx(src
->algctx
);
74 if (dst
->algctx
== NULL
) {
75 EVP_KDF_CTX_free(dst
);
81 int evp_kdf_get_number(const EVP_KDF
*kdf
)
86 const char *EVP_KDF_get0_name(const EVP_KDF
*kdf
)
88 return kdf
->type_name
;
91 const char *EVP_KDF_get0_description(const EVP_KDF
*kdf
)
93 return kdf
->description
;
96 int EVP_KDF_is_a(const EVP_KDF
*kdf
, const char *name
)
98 return kdf
!= NULL
&& evp_is_a(kdf
->prov
, kdf
->name_id
, NULL
, name
);
101 const OSSL_PROVIDER
*EVP_KDF_get0_provider(const EVP_KDF
*kdf
)
106 const EVP_KDF
*EVP_KDF_CTX_kdf(EVP_KDF_CTX
*ctx
)
111 void EVP_KDF_CTX_reset(EVP_KDF_CTX
*ctx
)
116 if (ctx
->meth
->reset
!= NULL
)
117 ctx
->meth
->reset(ctx
->algctx
);
120 size_t EVP_KDF_CTX_get_kdf_size(EVP_KDF_CTX
*ctx
)
122 OSSL_PARAM params
[2] = { OSSL_PARAM_END
, OSSL_PARAM_END
};
128 *params
= OSSL_PARAM_construct_size_t(OSSL_KDF_PARAM_SIZE
, &s
);
129 if (ctx
->meth
->get_ctx_params
!= NULL
130 && ctx
->meth
->get_ctx_params(ctx
->algctx
, params
))
132 if (ctx
->meth
->get_params
!= NULL
133 && ctx
->meth
->get_params(params
))
138 int EVP_KDF_derive(EVP_KDF_CTX
*ctx
, unsigned char *key
, size_t keylen
,
139 const OSSL_PARAM params
[])
144 return ctx
->meth
->derive(ctx
->algctx
, key
, keylen
, params
);
148 * The {get,set}_params functions return 1 if there is no corresponding
149 * function in the implementation. This is the same as if there was one,
150 * but it didn't recognise any of the given params, i.e. nothing in the
151 * bag of parameters was useful.
153 int EVP_KDF_get_params(EVP_KDF
*kdf
, OSSL_PARAM params
[])
155 if (kdf
->get_params
!= NULL
)
156 return kdf
->get_params(params
);
160 int EVP_KDF_CTX_get_params(EVP_KDF_CTX
*ctx
, OSSL_PARAM params
[])
162 if (ctx
->meth
->get_ctx_params
!= NULL
)
163 return ctx
->meth
->get_ctx_params(ctx
->algctx
, params
);
167 int EVP_KDF_CTX_set_params(EVP_KDF_CTX
*ctx
, const OSSL_PARAM params
[])
169 if (ctx
->meth
->set_ctx_params
!= NULL
)
170 return ctx
->meth
->set_ctx_params(ctx
->algctx
, params
);
174 int EVP_KDF_names_do_all(const EVP_KDF
*kdf
,
175 void (*fn
)(const char *name
, void *data
),
178 if (kdf
->prov
!= NULL
)
179 return evp_names_do_all(kdf
->prov
, kdf
->name_id
, fn
, data
);