xref: /freebsd/crypto/openssl/providers/implementations/include/prov/digestcommon.h (revision dece5b05f577fc4c6b89af7ad48dfbdf7cc4945c)
1 /*
2  * Copyright 2019-2026 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     {                                                                   \
36         OSSL_FUNC_DIGEST_GETTABLE_PARAMS,                               \
37             (void (*)(void))ossl_digest_default_gettable_params         \
38     }
39 
40 #ifdef FIPS_MODULE
41 #define PROV_DISPATCH_FUNC_DIGEST_GET_CTX_PARAMS                   \
42     { OSSL_FUNC_DIGEST_GETTABLE_CTX_PARAMS,                        \
43         (void (*)(void))ossl_digest_default_gettable_ctx_params }, \
44     {                                                              \
45         OSSL_FUNC_DIGEST_GET_CTX_PARAMS,                           \
46             (void (*)(void))ossl_digest_default_get_ctx_params     \
47     }
48 #define PROV_DISPATCH_FUNC_DIGEST_GET_CTX_PARAMS_APPEND \
49     , PROV_DISPATCH_FUNC_DIGEST_GET_CTX_PARAMS
50 #else
51 #define PROV_DISPATCH_FUNC_DIGEST_GET_CTX_PARAMS
52 #define PROV_DISPATCH_FUNC_DIGEST_GET_CTX_PARAMS_APPEND
53 #endif
54 
55 #define PROV_FUNC_DIGEST_FINAL(name, dgstsize, fin)                               \
56     static OSSL_FUNC_digest_final_fn name##_internal_final;                       \
57     static int name##_internal_final(void *ctx, unsigned char *out, size_t *outl, \
58         size_t outsz)                                                             \
59     {                                                                             \
60         if (ossl_prov_is_running() && outsz >= dgstsize && fin(out, ctx)) {       \
61             *outl = dgstsize;                                                     \
62             return 1;                                                             \
63         }                                                                         \
64         return 0;                                                                 \
65     }
66 
67 #define PROV_DISPATCH_FUNC_DIGEST_CONSTRUCT_START(                               \
68     name, CTX, blksize, dgstsize, flags, upd, fin)                               \
69     static OSSL_FUNC_digest_newctx_fn name##_newctx;                             \
70     static OSSL_FUNC_digest_freectx_fn name##_freectx;                           \
71     static OSSL_FUNC_digest_dupctx_fn name##_dupctx;                             \
72     static void *name##_newctx(void *prov_ctx)                                   \
73     {                                                                            \
74         CTX *ctx = ossl_prov_is_running() ? OPENSSL_zalloc(sizeof(*ctx)) : NULL; \
75         return ctx;                                                              \
76     }                                                                            \
77     static void name##_freectx(void *vctx)                                       \
78     {                                                                            \
79         CTX *ctx = (CTX *)vctx;                                                  \
80         OPENSSL_clear_free(ctx, sizeof(*ctx));                                   \
81     }                                                                            \
82     static void *name##_dupctx(void *ctx)                                        \
83     {                                                                            \
84         CTX *in = (CTX *)ctx;                                                    \
85         CTX *ret = ossl_prov_is_running() ? OPENSSL_malloc(sizeof(*ret)) : NULL; \
86         if (ret != NULL)                                                         \
87             *ret = *in;                                                          \
88         return ret;                                                              \
89     }                                                                            \
90     static void name##_copyctx(void *voutctx, void *vinctx)                      \
91     {                                                                            \
92         CTX *outctx = (CTX *)voutctx;                                            \
93         CTX *inctx = (CTX *)vinctx;                                              \
94         *outctx = *inctx;                                                        \
95     }                                                                            \
96     PROV_FUNC_DIGEST_FINAL(name, dgstsize, fin)                                  \
97     PROV_FUNC_DIGEST_GET_PARAM(name, blksize, dgstsize, flags)                   \
98     const OSSL_DISPATCH ossl_##name##_functions[] = {                            \
99         { OSSL_FUNC_DIGEST_NEWCTX, (void (*)(void))name##_newctx },              \
100         { OSSL_FUNC_DIGEST_UPDATE, (void (*)(void))upd },                        \
101         { OSSL_FUNC_DIGEST_FINAL, (void (*)(void))name##_internal_final },       \
102         { OSSL_FUNC_DIGEST_FREECTX, (void (*)(void))name##_freectx },            \
103         { OSSL_FUNC_DIGEST_DUPCTX, (void (*)(void))name##_dupctx },              \
104         { OSSL_FUNC_DIGEST_COPYCTX, (void (*)(void))name##_copyctx },            \
105         PROV_DISPATCH_FUNC_DIGEST_GET_PARAMS(name)                               \
106             PROV_DISPATCH_FUNC_DIGEST_GET_CTX_PARAMS_APPEND
107 
108 #define PROV_DISPATCH_FUNC_DIGEST_CONSTRUCT_END \
109     {                                           \
110         0, NULL                                 \
111     }                                           \
112     }                                           \
113     ;
114 
115 #define IMPLEMENT_digest_functions(                                                \
116     name, CTX, blksize, dgstsize, flags, init, upd, fin)                           \
117     static OSSL_FUNC_digest_init_fn name##_internal_init;                          \
118     static int name##_internal_init(void *ctx,                                     \
119         ossl_unused const OSSL_PARAM params[])                                     \
120     {                                                                              \
121         return ossl_prov_is_running() && init(ctx);                                \
122     }                                                                              \
123     PROV_DISPATCH_FUNC_DIGEST_CONSTRUCT_START(name, CTX, blksize, dgstsize, flags, \
124         upd, fin),                                                                 \
125         { OSSL_FUNC_DIGEST_INIT, (void (*)(void))name##_internal_init },           \
126         PROV_DISPATCH_FUNC_DIGEST_CONSTRUCT_END
127 
128 #define IMPLEMENT_digest_functions_with_settable_ctx(                                  \
129     name, CTX, blksize, dgstsize, flags, init, upd, fin,                               \
130     settable_ctx_params, set_ctx_params)                                               \
131     static OSSL_FUNC_digest_init_fn name##_internal_init;                              \
132     static int name##_internal_init(void *ctx, const OSSL_PARAM params[])              \
133     {                                                                                  \
134         return ossl_prov_is_running()                                                  \
135             && init(ctx)                                                               \
136             && set_ctx_params(ctx, params);                                            \
137     }                                                                                  \
138     PROV_DISPATCH_FUNC_DIGEST_CONSTRUCT_START(name, CTX, blksize, dgstsize, flags,     \
139         upd, fin),                                                                     \
140         { OSSL_FUNC_DIGEST_INIT, (void (*)(void))name##_internal_init },               \
141         { OSSL_FUNC_DIGEST_SETTABLE_CTX_PARAMS, (void (*)(void))settable_ctx_params }, \
142         { OSSL_FUNC_DIGEST_SET_CTX_PARAMS, (void (*)(void))set_ctx_params },           \
143         PROV_DISPATCH_FUNC_DIGEST_CONSTRUCT_END
144 
145 const OSSL_PARAM *ossl_digest_default_gettable_params(void *provctx);
146 int ossl_digest_default_get_params(OSSL_PARAM params[], size_t blksz,
147     size_t paramsz, unsigned long flags);
148 const OSSL_PARAM *ossl_digest_default_gettable_ctx_params(void *ctx,
149     void *provctx);
150 int ossl_digest_default_get_ctx_params(void *ctx, OSSL_PARAM params[]);
151 
152 #ifdef __cplusplus
153 }
154 #endif
155 
156 #endif /* OSSL_PROVIDERS_DIGESTCOMMON_H */
157