Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
freebsd
GitHub Repository: freebsd/freebsd-src
Path: blob/main/crypto/openssl/providers/common/include/prov/provider_util.h
48534 views
1
/*
2
* Copyright 2019-2025 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
#include <openssl/provider.h>
11
#include <openssl/types.h>
12
13
typedef struct {
14
/*
15
* References to the underlying cipher implementation. |cipher| caches
16
* the cipher, always. |alloc_cipher| only holds a reference to an
17
* explicitly fetched cipher.
18
*/
19
const EVP_CIPHER *cipher; /* cipher */
20
EVP_CIPHER *alloc_cipher; /* fetched cipher */
21
22
/* Conditions for legacy EVP_CIPHER uses */
23
ENGINE *engine; /* cipher engine */
24
} PROV_CIPHER;
25
26
typedef struct {
27
/*
28
* References to the underlying digest implementation. |md| caches
29
* the digest, always. |alloc_md| only holds a reference to an explicitly
30
* fetched digest.
31
*/
32
const EVP_MD *md; /* digest */
33
EVP_MD *alloc_md; /* fetched digest */
34
35
/* Conditions for legacy EVP_MD uses */
36
ENGINE *engine; /* digest engine */
37
} PROV_DIGEST;
38
39
/* Cipher functions */
40
/*
41
* Load a cipher from the specified parameters with the specified context.
42
* The params "properties", "engine" and "cipher" are used to determine the
43
* implementation used. If a provider cannot be found, it falls back to trying
44
* non-provider based implementations.
45
*/
46
int ossl_prov_cipher_load_from_params(PROV_CIPHER *pc,
47
const OSSL_PARAM params[],
48
OSSL_LIB_CTX *ctx);
49
50
/* Reset the PROV_CIPHER fields and free any allocated cipher reference */
51
void ossl_prov_cipher_reset(PROV_CIPHER *pc);
52
53
/* Clone a PROV_CIPHER structure into a second */
54
int ossl_prov_cipher_copy(PROV_CIPHER *dst, const PROV_CIPHER *src);
55
56
/* Query the cipher and associated engine (if any) */
57
const EVP_CIPHER *ossl_prov_cipher_cipher(const PROV_CIPHER *pc);
58
ENGINE *ossl_prov_cipher_engine(const PROV_CIPHER *pc);
59
60
/* Digest functions */
61
62
/*
63
* Fetch a digest from the specified libctx using the provided mdname and
64
* propquery. Store the result in the PROV_DIGEST and return the fetched md.
65
*/
66
const EVP_MD *ossl_prov_digest_fetch(PROV_DIGEST *pd, OSSL_LIB_CTX *libctx,
67
const char *mdname, const char *propquery);
68
69
/*
70
* Load a digest from the specified parameters with the specified context.
71
* The params "properties", "engine" and "digest" are used to determine the
72
* implementation used. If a provider cannot be found, it falls back to trying
73
* non-provider based implementations.
74
*/
75
int ossl_prov_digest_load_from_params(PROV_DIGEST *pd,
76
const OSSL_PARAM params[],
77
OSSL_LIB_CTX *ctx);
78
79
/* Reset the PROV_DIGEST fields and free any allocated digest reference */
80
void ossl_prov_digest_reset(PROV_DIGEST *pd);
81
82
/* Clone a PROV_DIGEST structure into a second */
83
int ossl_prov_digest_copy(PROV_DIGEST *dst, const PROV_DIGEST *src);
84
85
/* Query the digest and associated engine (if any) */
86
const EVP_MD *ossl_prov_digest_md(const PROV_DIGEST *pd);
87
ENGINE *ossl_prov_digest_engine(const PROV_DIGEST *pd);
88
89
/* Set a specific md, resets current digests first */
90
void ossl_prov_digest_set_md(PROV_DIGEST *pd, EVP_MD *md);
91
92
/*
93
* Set the various parameters on an EVP_MAC_CTX from the supplied arguments.
94
* If any of the supplied ciphername/mdname etc are NULL then the values
95
* from the supplied params (if non NULL) are used instead.
96
*/
97
int ossl_prov_set_macctx(EVP_MAC_CTX *macctx,
98
const OSSL_PARAM params[],
99
const char *ciphername,
100
const char *mdname,
101
const char *engine,
102
const char *properties,
103
const unsigned char *key,
104
size_t keylen);
105
106
/* MAC functions */
107
/*
108
* Load an EVP_MAC_CTX* from the specified parameters with the specified
109
* library context.
110
* The params "mac" and "properties" are used to determine the implementation
111
* used, and the parameters "digest", "cipher", "engine" and "properties" are
112
* passed to the MAC via the created MAC context if they are given.
113
* If there is already a created MAC context, it will be replaced if the "mac"
114
* parameter is found, otherwise it will simply be used as is, and passed the
115
* parameters to pilfer as it sees fit.
116
*
117
* As an option, a MAC name may be explicitly given, and if it is, the "mac"
118
* parameter will be ignored.
119
* Similarly, as an option, a cipher name or a digest name may be explicitly
120
* given, and if any of them is, the "digest" and "cipher" parameters are
121
* ignored.
122
*/
123
int ossl_prov_macctx_load_from_params(EVP_MAC_CTX **macctx,
124
const OSSL_PARAM params[],
125
const char *macname,
126
const char *ciphername,
127
const char *mdname,
128
OSSL_LIB_CTX *ctx);
129
130
typedef struct ag_capable_st {
131
OSSL_ALGORITHM alg;
132
int (*capable)(void);
133
} OSSL_ALGORITHM_CAPABLE;
134
135
/*
136
* Dynamically select algorithms by calling a capable() method.
137
* If this method is NULL or the method returns 1 then the algorithm is added.
138
*/
139
void ossl_prov_cache_exported_algorithms(const OSSL_ALGORITHM_CAPABLE *in,
140
OSSL_ALGORITHM *out);
141
142
/* Duplicate a lump of memory safely */
143
int ossl_prov_memdup(const void *src, size_t src_len,
144
unsigned char **dest, size_t *dest_len);
145
146