Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
freebsd
GitHub Repository: freebsd/freebsd-src
Path: blob/main/crypto/openssl/providers/implementations/include/prov/digestcommon.h
48534 views
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
static void name##_copyctx(void *voutctx, void *vinctx) \
74
{ \
75
CTX *outctx = (CTX *)voutctx; \
76
CTX *inctx = (CTX *)vinctx; \
77
*outctx = *inctx; \
78
} \
79
PROV_FUNC_DIGEST_FINAL(name, dgstsize, fin) \
80
PROV_FUNC_DIGEST_GET_PARAM(name, blksize, dgstsize, flags) \
81
const OSSL_DISPATCH ossl_##name##_functions[] = { \
82
{ OSSL_FUNC_DIGEST_NEWCTX, (void (*)(void))name##_newctx }, \
83
{ OSSL_FUNC_DIGEST_UPDATE, (void (*)(void))upd }, \
84
{ OSSL_FUNC_DIGEST_FINAL, (void (*)(void))name##_internal_final }, \
85
{ OSSL_FUNC_DIGEST_FREECTX, (void (*)(void))name##_freectx }, \
86
{ OSSL_FUNC_DIGEST_DUPCTX, (void (*)(void))name##_dupctx }, \
87
{ OSSL_FUNC_DIGEST_COPYCTX, (void (*)(void))name##_copyctx }, \
88
PROV_DISPATCH_FUNC_DIGEST_GET_PARAMS(name)
89
90
# define PROV_DISPATCH_FUNC_DIGEST_CONSTRUCT_END \
91
{ 0, NULL } \
92
};
93
94
# define IMPLEMENT_digest_functions( \
95
name, CTX, blksize, dgstsize, flags, init, upd, fin) \
96
static OSSL_FUNC_digest_init_fn name##_internal_init; \
97
static int name##_internal_init(void *ctx, \
98
ossl_unused const OSSL_PARAM params[]) \
99
{ \
100
return ossl_prov_is_running() && init(ctx); \
101
} \
102
PROV_DISPATCH_FUNC_DIGEST_CONSTRUCT_START(name, CTX, blksize, dgstsize, flags, \
103
upd, fin), \
104
{ OSSL_FUNC_DIGEST_INIT, (void (*)(void))name##_internal_init }, \
105
PROV_DISPATCH_FUNC_DIGEST_CONSTRUCT_END
106
107
# define IMPLEMENT_digest_functions_with_settable_ctx( \
108
name, CTX, blksize, dgstsize, flags, init, upd, fin, \
109
settable_ctx_params, set_ctx_params) \
110
static OSSL_FUNC_digest_init_fn name##_internal_init; \
111
static int name##_internal_init(void *ctx, const OSSL_PARAM params[]) \
112
{ \
113
return ossl_prov_is_running() \
114
&& init(ctx) \
115
&& set_ctx_params(ctx, params); \
116
} \
117
PROV_DISPATCH_FUNC_DIGEST_CONSTRUCT_START(name, CTX, blksize, dgstsize, flags, \
118
upd, fin), \
119
{ OSSL_FUNC_DIGEST_INIT, (void (*)(void))name##_internal_init }, \
120
{ OSSL_FUNC_DIGEST_SETTABLE_CTX_PARAMS, (void (*)(void))settable_ctx_params }, \
121
{ OSSL_FUNC_DIGEST_SET_CTX_PARAMS, (void (*)(void))set_ctx_params }, \
122
PROV_DISPATCH_FUNC_DIGEST_CONSTRUCT_END
123
124
125
const OSSL_PARAM *ossl_digest_default_gettable_params(void *provctx);
126
int ossl_digest_default_get_params(OSSL_PARAM params[], size_t blksz,
127
size_t paramsz, unsigned long flags);
128
129
# ifdef __cplusplus
130
}
131
# endif
132
133
#endif /* OSSL_PROVIDERS_DIGESTCOMMON_H */
134
135