]>
git.ipfire.org Git - thirdparty/openssl.git/blob - crypto/evp/kdf_lib.c
2 * Copyright 2018-2020 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/engine.h>
15 #include <openssl/evp.h>
16 #include <openssl/x509v3.h>
17 #include <openssl/kdf.h>
18 #include <openssl/core.h>
19 #include <openssl/core_names.h>
20 #include "crypto/asn1.h"
21 #include "crypto/evp.h"
22 #include "internal/numbers.h"
23 #include "internal/provider.h"
24 #include "evp_local.h"
26 EVP_KDF_CTX
*EVP_KDF_CTX_new(EVP_KDF
*kdf
)
28 EVP_KDF_CTX
*ctx
= NULL
;
33 ctx
= OPENSSL_zalloc(sizeof(EVP_KDF_CTX
));
35 || (ctx
->data
= kdf
->newctx(ossl_provider_ctx(kdf
->prov
))) == NULL
36 || !EVP_KDF_up_ref(kdf
)) {
37 EVPerr(EVP_F_EVP_KDF_CTX_NEW
, ERR_R_MALLOC_FAILURE
);
39 kdf
->freectx(ctx
->data
);
48 void EVP_KDF_CTX_free(EVP_KDF_CTX
*ctx
)
51 ctx
->meth
->freectx(ctx
->data
);
53 EVP_KDF_free(ctx
->meth
);
58 EVP_KDF_CTX
*EVP_KDF_CTX_dup(const EVP_KDF_CTX
*src
)
62 if (src
== NULL
|| src
->data
== NULL
|| src
->meth
->dupctx
== NULL
)
65 dst
= OPENSSL_malloc(sizeof(*dst
));
67 EVPerr(EVP_F_EVP_KDF_CTX_DUP
, ERR_R_MALLOC_FAILURE
);
71 memcpy(dst
, src
, sizeof(*dst
));
72 if (!EVP_KDF_up_ref(dst
->meth
)) {
73 EVPerr(EVP_F_EVP_KDF_CTX_DUP
, ERR_R_MALLOC_FAILURE
);
78 dst
->data
= src
->meth
->dupctx(src
->data
);
79 if (dst
->data
== NULL
) {
80 EVP_KDF_CTX_free(dst
);
86 int EVP_KDF_number(const EVP_KDF
*kdf
)
91 int EVP_KDF_is_a(const EVP_KDF
*kdf
, const char *name
)
93 return evp_is_a(kdf
->prov
, kdf
->name_id
, NULL
, name
);
96 const OSSL_PROVIDER
*EVP_KDF_provider(const EVP_KDF
*kdf
)
101 const EVP_KDF
*EVP_KDF_CTX_kdf(EVP_KDF_CTX
*ctx
)
106 void EVP_KDF_reset(EVP_KDF_CTX
*ctx
)
111 if (ctx
->meth
->reset
!= NULL
)
112 ctx
->meth
->reset(ctx
->data
);
115 size_t EVP_KDF_size(EVP_KDF_CTX
*ctx
)
117 OSSL_PARAM params
[2] = { OSSL_PARAM_END
, OSSL_PARAM_END
};
123 *params
= OSSL_PARAM_construct_size_t(OSSL_KDF_PARAM_SIZE
, &s
);
124 if (ctx
->meth
->get_ctx_params
!= NULL
125 && ctx
->meth
->get_ctx_params(ctx
->data
, params
))
127 if (ctx
->meth
->get_params
!= NULL
128 && ctx
->meth
->get_params(params
))
133 int EVP_KDF_derive(EVP_KDF_CTX
*ctx
, unsigned char *key
, size_t keylen
)
138 return ctx
->meth
->derive(ctx
->data
, key
, keylen
);
142 * The {get,set}_params functions return 1 if there is no corresponding
143 * function in the implementation. This is the same as if there was one,
144 * but it didn't recognise any of the given params, i.e. nothing in the
145 * bag of parameters was useful.
147 int EVP_KDF_get_params(EVP_KDF
*kdf
, OSSL_PARAM params
[])
149 if (kdf
->get_params
!= NULL
)
150 return kdf
->get_params(params
);
154 int EVP_KDF_CTX_get_params(EVP_KDF_CTX
*ctx
, OSSL_PARAM params
[])
156 if (ctx
->meth
->get_ctx_params
!= NULL
)
157 return ctx
->meth
->get_ctx_params(ctx
->data
, params
);
161 int EVP_KDF_CTX_set_params(EVP_KDF_CTX
*ctx
, const OSSL_PARAM params
[])
163 if (ctx
->meth
->set_ctx_params
!= NULL
)
164 return ctx
->meth
->set_ctx_params(ctx
->data
, params
);
168 void EVP_KDF_names_do_all(const EVP_KDF
*kdf
,
169 void (*fn
)(const char *name
, void *data
),
172 if (kdf
->prov
!= NULL
)
173 evp_names_do_all(kdf
->prov
, kdf
->name_id
, fn
, data
);