]> git.ipfire.org Git - thirdparty/openssl.git/blame - providers/common/include/internal/core_mkdigest.h
Rework the provider digest constructor to provide implementation get_params
[thirdparty/openssl.git] / providers / common / include / internal / core_mkdigest.h
CommitLineData
d5e5e2ff
SL
1/*
2 * Copyright 2019 The OpenSSL Project Authors. All Rights Reserved.
3 *
4 * Licensed under the Apache License 2.0 (the "License"). You may not use
5 * this file except in compliance with the License. You can obtain a copy
6 * in the file LICENSE in the source distribution or at
7 * https://www.openssl.org/source/license.html
8 */
9
10#ifndef OSSL_CORE_MKDIGEST_H
11# define OSSL_CORE_MKDIGEST_H
12
13# include <openssl/core_numbers.h>
3d214461
RL
14# include <openssl/core_names.h>
15# include <openssl/params.h>
d5e5e2ff
SL
16
17# ifdef __cplusplus
18extern "C" {
19# endif
20
21# define OSSL_FUNC_DIGEST_ALLOC_METHODS(name, CTX_NAME) \
22static OSSL_OP_digest_newctx_fn name##_newctx; \
23static OSSL_OP_digest_freectx_fn name##_freectx; \
24static OSSL_OP_digest_dupctx_fn name##_dupctx; \
25static void *name##_newctx(void *prov_ctx) \
26{ \
27 CTX_NAME *ctx = OPENSSL_zalloc(sizeof(*ctx)); \
28 return ctx; \
29} \
30static void name##_freectx(void *vctx) \
31{ \
32 CTX_NAME *ctx = (CTX_NAME *)vctx; \
33 OPENSSL_clear_free(ctx, sizeof(*ctx)); \
34} \
35static void *name##_dupctx(void *ctx) \
36{ \
37 CTX_NAME *in = (CTX_NAME *)ctx; \
38 CTX_NAME *ret = OPENSSL_malloc(sizeof(*ret)); \
39 *ret = *in; \
40 return ret; \
41}
42
3d214461
RL
43# define OSSL_FUNC_DIGEST_GET_PARAM(name, blksize, dgstsize, flags) \
44static OSSL_OP_digest_get_params_fn name##_get_params; \
45static int name##_get_params(OSSL_PARAM params[]) \
46{ \
47 OSSL_PARAM *p = NULL; \
48 \
49 p = OSSL_PARAM_locate(params, OSSL_DIGEST_PARAM_BLOCK_SIZE); \
50 if (p != NULL && !OSSL_PARAM_set_int(p, (blksize))) \
51 return 0; \
52 p = OSSL_PARAM_locate(params, OSSL_DIGEST_PARAM_SIZE); \
53 if (p != NULL && !OSSL_PARAM_set_int(p, (dgstsize))) \
54 return 0; \
55 p = OSSL_PARAM_locate(params, OSSL_DIGEST_PARAM_FLAGS); \
56 if (p != NULL && !OSSL_PARAM_set_ulong(p, (flags))) \
57 return 0; \
58 return 1; \
59}
60
d5e5e2ff
SL
61# define OSSL_FUNC_DIGEST_SET_FINAL(name, dgstsize, fin) \
62static OSSL_OP_digest_final_fn name##_wrapfinal; \
63static int name##_wrapfinal(void *ctx, unsigned char *out, size_t *outl, size_t outsz) \
64{ \
65 if (outsz >= dgstsize && fin(out, ctx)) { \
66 *outl = dgstsize; \
67 return 1; \
68 } \
69 return 0; \
70}
71
3d214461 72# define OSSL_FUNC_DIGEST_COMMON(name, init, upd) \
d5e5e2ff
SL
73const OSSL_DISPATCH name##_functions[] = { \
74 { OSSL_FUNC_DIGEST_NEWCTX, (void (*)(void))name##_newctx }, \
75 { OSSL_FUNC_DIGEST_INIT, (void (*)(void))init }, \
76 { OSSL_FUNC_DIGEST_UPDATE, (void (*)(void))upd }, \
77 { OSSL_FUNC_DIGEST_FINAL, (void (*)(void))name##_wrapfinal }, \
78 { OSSL_FUNC_DIGEST_FREECTX, (void (*)(void))name##_freectx }, \
79 { OSSL_FUNC_DIGEST_DUPCTX, (void (*)(void))name##_dupctx }, \
3d214461 80 { OSSL_FUNC_DIGEST_GET_PARAMS, (void (*)(void))name##_get_params },
d5e5e2ff
SL
81
82# define OSSL_FUNC_DIGEST_CONSTRUCT_END \
83 { 0, NULL } \
84};
85
3d214461
RL
86# define OSSL_FUNC_DIGEST_CONSTRUCT_START(name, CTX, \
87 blksize, dgstsize, flags, \
88 init, upd, fin) \
89OSSL_FUNC_DIGEST_ALLOC_METHODS(name, CTX) \
90OSSL_FUNC_DIGEST_SET_FINAL(name, dgstsize, fin) \
91OSSL_FUNC_DIGEST_GET_PARAM(name, blksize, dgstsize, flags) \
92OSSL_FUNC_DIGEST_COMMON(name, init, upd)
93
94# define OSSL_FUNC_DIGEST_CONSTRUCT(name, CTX, blksize, dgstsize, flags, \
95 init, upd, fin) \
96OSSL_FUNC_DIGEST_CONSTRUCT_START(name, CTX, blksize, dgstsize, flags, \
97 init, upd, fin) \
d5e5e2ff
SL
98OSSL_FUNC_DIGEST_CONSTRUCT_END
99
3d214461
RL
100# define OSSL_FUNC_DIGEST_CONSTRUCT_PARAMS(name, CTX, \
101 blksize, dgstsize, flags, \
102 init, upd, fin, setparams) \
103OSSL_FUNC_DIGEST_CONSTRUCT_START(name, CTX, blksize, dgstsize, flags, \
104 init, upd, fin) \
105 { OSSL_FUNC_DIGEST_CTX_SET_PARAMS, (void (*)(void))setparams }, \
d5e5e2ff
SL
106OSSL_FUNC_DIGEST_CONSTRUCT_END
107
108# ifdef __cplusplus
109}
110# endif
111
112#endif /* OSSL_CORE_MKDIGEST_H */