1 | /*
|
---|
2 | * Copyright 2019-2021 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_PROVIDERS_DIGESTCOMMON_H
|
---|
11 | # define OSSL_PROVIDERS_DIGESTCOMMON_H
|
---|
12 |
|
---|
13 | # include <openssl/core_dispatch.h>
|
---|
14 | # include <openssl/core_names.h>
|
---|
15 | # include <openssl/params.h>
|
---|
16 | # include "prov/providercommon.h"
|
---|
17 |
|
---|
18 | /* Internal flags that can be queried */
|
---|
19 | #define PROV_DIGEST_FLAG_XOF 0x0001
|
---|
20 | #define PROV_DIGEST_FLAG_ALGID_ABSENT 0x0002
|
---|
21 |
|
---|
22 | # ifdef __cplusplus
|
---|
23 | extern "C" {
|
---|
24 | # endif
|
---|
25 |
|
---|
26 | #define PROV_FUNC_DIGEST_GET_PARAM(name, blksize, dgstsize, flags) \
|
---|
27 | static OSSL_FUNC_digest_get_params_fn name##_get_params; \
|
---|
28 | static int name##_get_params(OSSL_PARAM params[]) \
|
---|
29 | { \
|
---|
30 | return ossl_digest_default_get_params(params, blksize, dgstsize, flags); \
|
---|
31 | }
|
---|
32 |
|
---|
33 | #define PROV_DISPATCH_FUNC_DIGEST_GET_PARAMS(name) \
|
---|
34 | { OSSL_FUNC_DIGEST_GET_PARAMS, (void (*)(void))name##_get_params }, \
|
---|
35 | { OSSL_FUNC_DIGEST_GETTABLE_PARAMS, \
|
---|
36 | (void (*)(void))ossl_digest_default_gettable_params }
|
---|
37 |
|
---|
38 | # define PROV_FUNC_DIGEST_FINAL(name, dgstsize, fin) \
|
---|
39 | static OSSL_FUNC_digest_final_fn name##_internal_final; \
|
---|
40 | static int name##_internal_final(void *ctx, unsigned char *out, size_t *outl, \
|
---|
41 | size_t outsz) \
|
---|
42 | { \
|
---|
43 | if (ossl_prov_is_running() && outsz >= dgstsize && fin(out, ctx)) { \
|
---|
44 | *outl = dgstsize; \
|
---|
45 | return 1; \
|
---|
46 | } \
|
---|
47 | return 0; \
|
---|
48 | }
|
---|
49 |
|
---|
50 | # define PROV_DISPATCH_FUNC_DIGEST_CONSTRUCT_START( \
|
---|
51 | name, CTX, blksize, dgstsize, flags, upd, fin) \
|
---|
52 | static OSSL_FUNC_digest_newctx_fn name##_newctx; \
|
---|
53 | static OSSL_FUNC_digest_freectx_fn name##_freectx; \
|
---|
54 | static OSSL_FUNC_digest_dupctx_fn name##_dupctx; \
|
---|
55 | static void *name##_newctx(void *prov_ctx) \
|
---|
56 | { \
|
---|
57 | CTX *ctx = ossl_prov_is_running() ? OPENSSL_zalloc(sizeof(*ctx)) : NULL; \
|
---|
58 | return ctx; \
|
---|
59 | } \
|
---|
60 | static void name##_freectx(void *vctx) \
|
---|
61 | { \
|
---|
62 | CTX *ctx = (CTX *)vctx; \
|
---|
63 | OPENSSL_clear_free(ctx, sizeof(*ctx)); \
|
---|
64 | } \
|
---|
65 | static void *name##_dupctx(void *ctx) \
|
---|
66 | { \
|
---|
67 | CTX *in = (CTX *)ctx; \
|
---|
68 | CTX *ret = ossl_prov_is_running() ? OPENSSL_malloc(sizeof(*ret)) : NULL; \
|
---|
69 | if (ret != NULL) \
|
---|
70 | *ret = *in; \
|
---|
71 | return ret; \
|
---|
72 | } \
|
---|
73 | PROV_FUNC_DIGEST_FINAL(name, dgstsize, fin) \
|
---|
74 | PROV_FUNC_DIGEST_GET_PARAM(name, blksize, dgstsize, flags) \
|
---|
75 | const OSSL_DISPATCH ossl_##name##_functions[] = { \
|
---|
76 | { OSSL_FUNC_DIGEST_NEWCTX, (void (*)(void))name##_newctx }, \
|
---|
77 | { OSSL_FUNC_DIGEST_UPDATE, (void (*)(void))upd }, \
|
---|
78 | { OSSL_FUNC_DIGEST_FINAL, (void (*)(void))name##_internal_final }, \
|
---|
79 | { OSSL_FUNC_DIGEST_FREECTX, (void (*)(void))name##_freectx }, \
|
---|
80 | { OSSL_FUNC_DIGEST_DUPCTX, (void (*)(void))name##_dupctx }, \
|
---|
81 | PROV_DISPATCH_FUNC_DIGEST_GET_PARAMS(name)
|
---|
82 |
|
---|
83 | # define PROV_DISPATCH_FUNC_DIGEST_CONSTRUCT_END \
|
---|
84 | { 0, NULL } \
|
---|
85 | };
|
---|
86 |
|
---|
87 | # define IMPLEMENT_digest_functions( \
|
---|
88 | name, CTX, blksize, dgstsize, flags, init, upd, fin) \
|
---|
89 | static OSSL_FUNC_digest_init_fn name##_internal_init; \
|
---|
90 | static int name##_internal_init(void *ctx, \
|
---|
91 | ossl_unused const OSSL_PARAM params[]) \
|
---|
92 | { \
|
---|
93 | return ossl_prov_is_running() && init(ctx); \
|
---|
94 | } \
|
---|
95 | PROV_DISPATCH_FUNC_DIGEST_CONSTRUCT_START(name, CTX, blksize, dgstsize, flags, \
|
---|
96 | upd, fin), \
|
---|
97 | { OSSL_FUNC_DIGEST_INIT, (void (*)(void))name##_internal_init }, \
|
---|
98 | PROV_DISPATCH_FUNC_DIGEST_CONSTRUCT_END
|
---|
99 |
|
---|
100 | # define IMPLEMENT_digest_functions_with_settable_ctx( \
|
---|
101 | name, CTX, blksize, dgstsize, flags, init, upd, fin, \
|
---|
102 | settable_ctx_params, set_ctx_params) \
|
---|
103 | static OSSL_FUNC_digest_init_fn name##_internal_init; \
|
---|
104 | static int name##_internal_init(void *ctx, const OSSL_PARAM params[]) \
|
---|
105 | { \
|
---|
106 | return ossl_prov_is_running() \
|
---|
107 | && init(ctx) \
|
---|
108 | && set_ctx_params(ctx, params); \
|
---|
109 | } \
|
---|
110 | PROV_DISPATCH_FUNC_DIGEST_CONSTRUCT_START(name, CTX, blksize, dgstsize, flags, \
|
---|
111 | upd, fin), \
|
---|
112 | { OSSL_FUNC_DIGEST_INIT, (void (*)(void))name##_internal_init }, \
|
---|
113 | { OSSL_FUNC_DIGEST_SETTABLE_CTX_PARAMS, (void (*)(void))settable_ctx_params }, \
|
---|
114 | { OSSL_FUNC_DIGEST_SET_CTX_PARAMS, (void (*)(void))set_ctx_params }, \
|
---|
115 | PROV_DISPATCH_FUNC_DIGEST_CONSTRUCT_END
|
---|
116 |
|
---|
117 |
|
---|
118 | const OSSL_PARAM *ossl_digest_default_gettable_params(void *provctx);
|
---|
119 | int ossl_digest_default_get_params(OSSL_PARAM params[], size_t blksz,
|
---|
120 | size_t paramsz, unsigned long flags);
|
---|
121 |
|
---|
122 | # ifdef __cplusplus
|
---|
123 | }
|
---|
124 | # endif
|
---|
125 |
|
---|
126 | #endif /* OSSL_PROVIDERS_DIGESTCOMMON_H */
|
---|