xref: /netbsd-src/crypto/external/bsd/openssl/dist/providers/defltprov.c (revision b0d1725196a7921d003d2c66a14f186abda4176b)
1*b0d17251Schristos /*
2*b0d17251Schristos  * Copyright 2019-2022 The OpenSSL Project Authors. All Rights Reserved.
3*b0d17251Schristos  *
4*b0d17251Schristos  * Licensed under the Apache License 2.0 (the "License").  You may not use
5*b0d17251Schristos  * this file except in compliance with the License.  You can obtain a copy
6*b0d17251Schristos  * in the file LICENSE in the source distribution or at
7*b0d17251Schristos  * https://www.openssl.org/source/license.html
8*b0d17251Schristos  */
9*b0d17251Schristos 
10*b0d17251Schristos #include <string.h>
11*b0d17251Schristos #include <stdio.h>
12*b0d17251Schristos #include <openssl/opensslconf.h>
13*b0d17251Schristos #include <openssl/core.h>
14*b0d17251Schristos #include <openssl/core_dispatch.h>
15*b0d17251Schristos #include <openssl/core_names.h>
16*b0d17251Schristos #include <openssl/params.h>
17*b0d17251Schristos #include "prov/bio.h"
18*b0d17251Schristos #include "prov/provider_ctx.h"
19*b0d17251Schristos #include "prov/providercommon.h"
20*b0d17251Schristos #include "prov/implementations.h"
21*b0d17251Schristos #include "prov/names.h"
22*b0d17251Schristos #include "prov/provider_util.h"
23*b0d17251Schristos #include "prov/seeding.h"
24*b0d17251Schristos #include "internal/nelem.h"
25*b0d17251Schristos 
26*b0d17251Schristos /*
27*b0d17251Schristos  * Forward declarations to ensure that interface functions are correctly
28*b0d17251Schristos  * defined.
29*b0d17251Schristos  */
30*b0d17251Schristos static OSSL_FUNC_provider_gettable_params_fn deflt_gettable_params;
31*b0d17251Schristos static OSSL_FUNC_provider_get_params_fn deflt_get_params;
32*b0d17251Schristos static OSSL_FUNC_provider_query_operation_fn deflt_query;
33*b0d17251Schristos 
34*b0d17251Schristos #define ALGC(NAMES, FUNC, CHECK) { { NAMES, "provider=default", FUNC }, CHECK }
35*b0d17251Schristos #define ALG(NAMES, FUNC) ALGC(NAMES, FUNC, NULL)
36*b0d17251Schristos 
37*b0d17251Schristos /* Functions provided by the core */
38*b0d17251Schristos static OSSL_FUNC_core_gettable_params_fn *c_gettable_params = NULL;
39*b0d17251Schristos static OSSL_FUNC_core_get_params_fn *c_get_params = NULL;
40*b0d17251Schristos 
41*b0d17251Schristos /* Parameters we provide to the core */
42*b0d17251Schristos static const OSSL_PARAM deflt_param_types[] = {
43*b0d17251Schristos     OSSL_PARAM_DEFN(OSSL_PROV_PARAM_NAME, OSSL_PARAM_UTF8_PTR, NULL, 0),
44*b0d17251Schristos     OSSL_PARAM_DEFN(OSSL_PROV_PARAM_VERSION, OSSL_PARAM_UTF8_PTR, NULL, 0),
45*b0d17251Schristos     OSSL_PARAM_DEFN(OSSL_PROV_PARAM_BUILDINFO, OSSL_PARAM_UTF8_PTR, NULL, 0),
46*b0d17251Schristos     OSSL_PARAM_DEFN(OSSL_PROV_PARAM_STATUS, OSSL_PARAM_INTEGER, NULL, 0),
47*b0d17251Schristos     OSSL_PARAM_END
48*b0d17251Schristos };
49*b0d17251Schristos 
deflt_gettable_params(void * provctx)50*b0d17251Schristos static const OSSL_PARAM *deflt_gettable_params(void *provctx)
51*b0d17251Schristos {
52*b0d17251Schristos     return deflt_param_types;
53*b0d17251Schristos }
54*b0d17251Schristos 
deflt_get_params(void * provctx,OSSL_PARAM params[])55*b0d17251Schristos static int deflt_get_params(void *provctx, OSSL_PARAM params[])
56*b0d17251Schristos {
57*b0d17251Schristos     OSSL_PARAM *p;
58*b0d17251Schristos 
59*b0d17251Schristos     p = OSSL_PARAM_locate(params, OSSL_PROV_PARAM_NAME);
60*b0d17251Schristos     if (p != NULL && !OSSL_PARAM_set_utf8_ptr(p, "OpenSSL Default Provider"))
61*b0d17251Schristos         return 0;
62*b0d17251Schristos     p = OSSL_PARAM_locate(params, OSSL_PROV_PARAM_VERSION);
63*b0d17251Schristos     if (p != NULL && !OSSL_PARAM_set_utf8_ptr(p, OPENSSL_VERSION_STR))
64*b0d17251Schristos         return 0;
65*b0d17251Schristos     p = OSSL_PARAM_locate(params, OSSL_PROV_PARAM_BUILDINFO);
66*b0d17251Schristos     if (p != NULL && !OSSL_PARAM_set_utf8_ptr(p, OPENSSL_FULL_VERSION_STR))
67*b0d17251Schristos         return 0;
68*b0d17251Schristos     p = OSSL_PARAM_locate(params, OSSL_PROV_PARAM_STATUS);
69*b0d17251Schristos     if (p != NULL && !OSSL_PARAM_set_int(p, ossl_prov_is_running()))
70*b0d17251Schristos         return 0;
71*b0d17251Schristos     return 1;
72*b0d17251Schristos }
73*b0d17251Schristos 
74*b0d17251Schristos /*
75*b0d17251Schristos  * For the algorithm names, we use the following formula for our primary
76*b0d17251Schristos  * names:
77*b0d17251Schristos  *
78*b0d17251Schristos  *     ALGNAME[VERSION?][-SUBNAME[VERSION?]?][-SIZE?][-MODE?]
79*b0d17251Schristos  *
80*b0d17251Schristos  *     VERSION is only present if there are multiple versions of
81*b0d17251Schristos  *     an alg (MD2, MD4, MD5).  It may be omitted if there is only
82*b0d17251Schristos  *     one version (if a subsequent version is released in the future,
83*b0d17251Schristos  *     we can always change the canonical name, and add the old name
84*b0d17251Schristos  *     as an alias).
85*b0d17251Schristos  *
86*b0d17251Schristos  *     SUBNAME may be present where we are combining multiple
87*b0d17251Schristos  *     algorithms together, e.g. MD5-SHA1.
88*b0d17251Schristos  *
89*b0d17251Schristos  *     SIZE is only present if multiple versions of an algorithm exist
90*b0d17251Schristos  *     with different sizes (e.g. AES-128-CBC, AES-256-CBC)
91*b0d17251Schristos  *
92*b0d17251Schristos  *     MODE is only present where applicable.
93*b0d17251Schristos  *
94*b0d17251Schristos  * We add diverse other names where applicable, such as the names that
95*b0d17251Schristos  * NIST uses, or that are used for ASN.1 OBJECT IDENTIFIERs, or names
96*b0d17251Schristos  * we have used historically.
97*b0d17251Schristos  *
98*b0d17251Schristos  * Algorithm names are case insensitive, but we use all caps in our "canonical"
99*b0d17251Schristos  * names for consistency.
100*b0d17251Schristos  */
101*b0d17251Schristos static const OSSL_ALGORITHM deflt_digests[] = {
102*b0d17251Schristos     /* Our primary name:NIST name[:our older names] */
103*b0d17251Schristos     { PROV_NAMES_SHA1, "provider=default", ossl_sha1_functions },
104*b0d17251Schristos     { PROV_NAMES_SHA2_224, "provider=default", ossl_sha224_functions },
105*b0d17251Schristos     { PROV_NAMES_SHA2_256, "provider=default", ossl_sha256_functions },
106*b0d17251Schristos     { PROV_NAMES_SHA2_384, "provider=default", ossl_sha384_functions },
107*b0d17251Schristos     { PROV_NAMES_SHA2_512, "provider=default", ossl_sha512_functions },
108*b0d17251Schristos     { PROV_NAMES_SHA2_512_224, "provider=default", ossl_sha512_224_functions },
109*b0d17251Schristos     { PROV_NAMES_SHA2_512_256, "provider=default", ossl_sha512_256_functions },
110*b0d17251Schristos 
111*b0d17251Schristos     /* We agree with NIST here, so one name only */
112*b0d17251Schristos     { PROV_NAMES_SHA3_224, "provider=default", ossl_sha3_224_functions },
113*b0d17251Schristos     { PROV_NAMES_SHA3_256, "provider=default", ossl_sha3_256_functions },
114*b0d17251Schristos     { PROV_NAMES_SHA3_384, "provider=default", ossl_sha3_384_functions },
115*b0d17251Schristos     { PROV_NAMES_SHA3_512, "provider=default", ossl_sha3_512_functions },
116*b0d17251Schristos 
117*b0d17251Schristos     /*
118*b0d17251Schristos      * KECCAK-KMAC-128 and KECCAK-KMAC-256 as hashes are mostly useful for
119*b0d17251Schristos      * the KMAC-128 and KMAC-256.
120*b0d17251Schristos      */
121*b0d17251Schristos     { PROV_NAMES_KECCAK_KMAC_128, "provider=default",
122*b0d17251Schristos       ossl_keccak_kmac_128_functions },
123*b0d17251Schristos     { PROV_NAMES_KECCAK_KMAC_256, "provider=default",
124*b0d17251Schristos       ossl_keccak_kmac_256_functions },
125*b0d17251Schristos 
126*b0d17251Schristos     /* Our primary name:NIST name */
127*b0d17251Schristos     { PROV_NAMES_SHAKE_128, "provider=default", ossl_shake_128_functions },
128*b0d17251Schristos     { PROV_NAMES_SHAKE_256, "provider=default", ossl_shake_256_functions },
129*b0d17251Schristos 
130*b0d17251Schristos #ifndef OPENSSL_NO_BLAKE2
131*b0d17251Schristos     /*
132*b0d17251Schristos      * https://blake2.net/ doesn't specify size variants,
133*b0d17251Schristos      * but mentions that Bouncy Castle uses the names
134*b0d17251Schristos      * BLAKE2b-160, BLAKE2b-256, BLAKE2b-384, and BLAKE2b-512
135*b0d17251Schristos      * If we assume that "2b" and "2s" are versions, that pattern
136*b0d17251Schristos      * fits with ours.  We also add our historical names.
137*b0d17251Schristos      */
138*b0d17251Schristos     { PROV_NAMES_BLAKE2S_256, "provider=default", ossl_blake2s256_functions },
139*b0d17251Schristos     { PROV_NAMES_BLAKE2B_512, "provider=default", ossl_blake2b512_functions },
140*b0d17251Schristos #endif /* OPENSSL_NO_BLAKE2 */
141*b0d17251Schristos 
142*b0d17251Schristos #ifndef OPENSSL_NO_SM3
143*b0d17251Schristos     { PROV_NAMES_SM3, "provider=default", ossl_sm3_functions },
144*b0d17251Schristos #endif /* OPENSSL_NO_SM3 */
145*b0d17251Schristos 
146*b0d17251Schristos #ifndef OPENSSL_NO_MD5
147*b0d17251Schristos     { PROV_NAMES_MD5, "provider=default", ossl_md5_functions },
148*b0d17251Schristos     { PROV_NAMES_MD5_SHA1, "provider=default", ossl_md5_sha1_functions },
149*b0d17251Schristos #endif /* OPENSSL_NO_MD5 */
150*b0d17251Schristos 
151*b0d17251Schristos #ifndef OPENSSL_NO_RMD160
152*b0d17251Schristos     { PROV_NAMES_RIPEMD_160, "provider=default", ossl_ripemd160_functions },
153*b0d17251Schristos #endif /* OPENSSL_NO_RMD160 */
154*b0d17251Schristos 
155*b0d17251Schristos     { PROV_NAMES_NULL, "provider=default", ossl_nullmd_functions },
156*b0d17251Schristos     { NULL, NULL, NULL }
157*b0d17251Schristos };
158*b0d17251Schristos 
159*b0d17251Schristos static const OSSL_ALGORITHM_CAPABLE deflt_ciphers[] = {
160*b0d17251Schristos     ALG(PROV_NAMES_NULL, ossl_null_functions),
161*b0d17251Schristos     ALG(PROV_NAMES_AES_256_ECB, ossl_aes256ecb_functions),
162*b0d17251Schristos     ALG(PROV_NAMES_AES_192_ECB, ossl_aes192ecb_functions),
163*b0d17251Schristos     ALG(PROV_NAMES_AES_128_ECB, ossl_aes128ecb_functions),
164*b0d17251Schristos     ALG(PROV_NAMES_AES_256_CBC, ossl_aes256cbc_functions),
165*b0d17251Schristos     ALG(PROV_NAMES_AES_192_CBC, ossl_aes192cbc_functions),
166*b0d17251Schristos     ALG(PROV_NAMES_AES_128_CBC, ossl_aes128cbc_functions),
167*b0d17251Schristos     ALG(PROV_NAMES_AES_128_CBC_CTS, ossl_aes128cbc_cts_functions),
168*b0d17251Schristos     ALG(PROV_NAMES_AES_192_CBC_CTS, ossl_aes192cbc_cts_functions),
169*b0d17251Schristos     ALG(PROV_NAMES_AES_256_CBC_CTS, ossl_aes256cbc_cts_functions),
170*b0d17251Schristos     ALG(PROV_NAMES_AES_256_OFB, ossl_aes256ofb_functions),
171*b0d17251Schristos     ALG(PROV_NAMES_AES_192_OFB, ossl_aes192ofb_functions),
172*b0d17251Schristos     ALG(PROV_NAMES_AES_128_OFB, ossl_aes128ofb_functions),
173*b0d17251Schristos     ALG(PROV_NAMES_AES_256_CFB, ossl_aes256cfb_functions),
174*b0d17251Schristos     ALG(PROV_NAMES_AES_192_CFB, ossl_aes192cfb_functions),
175*b0d17251Schristos     ALG(PROV_NAMES_AES_128_CFB, ossl_aes128cfb_functions),
176*b0d17251Schristos     ALG(PROV_NAMES_AES_256_CFB1, ossl_aes256cfb1_functions),
177*b0d17251Schristos     ALG(PROV_NAMES_AES_192_CFB1, ossl_aes192cfb1_functions),
178*b0d17251Schristos     ALG(PROV_NAMES_AES_128_CFB1, ossl_aes128cfb1_functions),
179*b0d17251Schristos     ALG(PROV_NAMES_AES_256_CFB8, ossl_aes256cfb8_functions),
180*b0d17251Schristos     ALG(PROV_NAMES_AES_192_CFB8, ossl_aes192cfb8_functions),
181*b0d17251Schristos     ALG(PROV_NAMES_AES_128_CFB8, ossl_aes128cfb8_functions),
182*b0d17251Schristos     ALG(PROV_NAMES_AES_256_CTR, ossl_aes256ctr_functions),
183*b0d17251Schristos     ALG(PROV_NAMES_AES_192_CTR, ossl_aes192ctr_functions),
184*b0d17251Schristos     ALG(PROV_NAMES_AES_128_CTR, ossl_aes128ctr_functions),
185*b0d17251Schristos     ALG(PROV_NAMES_AES_256_XTS, ossl_aes256xts_functions),
186*b0d17251Schristos     ALG(PROV_NAMES_AES_128_XTS, ossl_aes128xts_functions),
187*b0d17251Schristos #ifndef OPENSSL_NO_OCB
188*b0d17251Schristos     ALG(PROV_NAMES_AES_256_OCB, ossl_aes256ocb_functions),
189*b0d17251Schristos     ALG(PROV_NAMES_AES_192_OCB, ossl_aes192ocb_functions),
190*b0d17251Schristos     ALG(PROV_NAMES_AES_128_OCB, ossl_aes128ocb_functions),
191*b0d17251Schristos #endif /* OPENSSL_NO_OCB */
192*b0d17251Schristos #ifndef OPENSSL_NO_SIV
193*b0d17251Schristos     ALG(PROV_NAMES_AES_128_SIV, ossl_aes128siv_functions),
194*b0d17251Schristos     ALG(PROV_NAMES_AES_192_SIV, ossl_aes192siv_functions),
195*b0d17251Schristos     ALG(PROV_NAMES_AES_256_SIV, ossl_aes256siv_functions),
196*b0d17251Schristos #endif /* OPENSSL_NO_SIV */
197*b0d17251Schristos     ALG(PROV_NAMES_AES_256_GCM, ossl_aes256gcm_functions),
198*b0d17251Schristos     ALG(PROV_NAMES_AES_192_GCM, ossl_aes192gcm_functions),
199*b0d17251Schristos     ALG(PROV_NAMES_AES_128_GCM, ossl_aes128gcm_functions),
200*b0d17251Schristos     ALG(PROV_NAMES_AES_256_CCM, ossl_aes256ccm_functions),
201*b0d17251Schristos     ALG(PROV_NAMES_AES_192_CCM, ossl_aes192ccm_functions),
202*b0d17251Schristos     ALG(PROV_NAMES_AES_128_CCM, ossl_aes128ccm_functions),
203*b0d17251Schristos     ALG(PROV_NAMES_AES_256_WRAP, ossl_aes256wrap_functions),
204*b0d17251Schristos     ALG(PROV_NAMES_AES_192_WRAP, ossl_aes192wrap_functions),
205*b0d17251Schristos     ALG(PROV_NAMES_AES_128_WRAP, ossl_aes128wrap_functions),
206*b0d17251Schristos     ALG(PROV_NAMES_AES_256_WRAP_PAD, ossl_aes256wrappad_functions),
207*b0d17251Schristos     ALG(PROV_NAMES_AES_192_WRAP_PAD, ossl_aes192wrappad_functions),
208*b0d17251Schristos     ALG(PROV_NAMES_AES_128_WRAP_PAD, ossl_aes128wrappad_functions),
209*b0d17251Schristos     ALG(PROV_NAMES_AES_256_WRAP_INV, ossl_aes256wrapinv_functions),
210*b0d17251Schristos     ALG(PROV_NAMES_AES_192_WRAP_INV, ossl_aes192wrapinv_functions),
211*b0d17251Schristos     ALG(PROV_NAMES_AES_128_WRAP_INV, ossl_aes128wrapinv_functions),
212*b0d17251Schristos     ALG(PROV_NAMES_AES_256_WRAP_PAD_INV, ossl_aes256wrappadinv_functions),
213*b0d17251Schristos     ALG(PROV_NAMES_AES_192_WRAP_PAD_INV, ossl_aes192wrappadinv_functions),
214*b0d17251Schristos     ALG(PROV_NAMES_AES_128_WRAP_PAD_INV, ossl_aes128wrappadinv_functions),
215*b0d17251Schristos     ALGC(PROV_NAMES_AES_128_CBC_HMAC_SHA1, ossl_aes128cbc_hmac_sha1_functions,
216*b0d17251Schristos          ossl_cipher_capable_aes_cbc_hmac_sha1),
217*b0d17251Schristos     ALGC(PROV_NAMES_AES_256_CBC_HMAC_SHA1, ossl_aes256cbc_hmac_sha1_functions,
218*b0d17251Schristos          ossl_cipher_capable_aes_cbc_hmac_sha1),
219*b0d17251Schristos     ALGC(PROV_NAMES_AES_128_CBC_HMAC_SHA256, ossl_aes128cbc_hmac_sha256_functions,
220*b0d17251Schristos         ossl_cipher_capable_aes_cbc_hmac_sha256),
221*b0d17251Schristos     ALGC(PROV_NAMES_AES_256_CBC_HMAC_SHA256, ossl_aes256cbc_hmac_sha256_functions,
222*b0d17251Schristos          ossl_cipher_capable_aes_cbc_hmac_sha256),
223*b0d17251Schristos #ifndef OPENSSL_NO_ARIA
224*b0d17251Schristos     ALG(PROV_NAMES_ARIA_256_GCM, ossl_aria256gcm_functions),
225*b0d17251Schristos     ALG(PROV_NAMES_ARIA_192_GCM, ossl_aria192gcm_functions),
226*b0d17251Schristos     ALG(PROV_NAMES_ARIA_128_GCM, ossl_aria128gcm_functions),
227*b0d17251Schristos     ALG(PROV_NAMES_ARIA_256_CCM, ossl_aria256ccm_functions),
228*b0d17251Schristos     ALG(PROV_NAMES_ARIA_192_CCM, ossl_aria192ccm_functions),
229*b0d17251Schristos     ALG(PROV_NAMES_ARIA_128_CCM, ossl_aria128ccm_functions),
230*b0d17251Schristos     ALG(PROV_NAMES_ARIA_256_ECB, ossl_aria256ecb_functions),
231*b0d17251Schristos     ALG(PROV_NAMES_ARIA_192_ECB, ossl_aria192ecb_functions),
232*b0d17251Schristos     ALG(PROV_NAMES_ARIA_128_ECB, ossl_aria128ecb_functions),
233*b0d17251Schristos     ALG(PROV_NAMES_ARIA_256_CBC, ossl_aria256cbc_functions),
234*b0d17251Schristos     ALG(PROV_NAMES_ARIA_192_CBC, ossl_aria192cbc_functions),
235*b0d17251Schristos     ALG(PROV_NAMES_ARIA_128_CBC, ossl_aria128cbc_functions),
236*b0d17251Schristos     ALG(PROV_NAMES_ARIA_256_OFB, ossl_aria256ofb_functions),
237*b0d17251Schristos     ALG(PROV_NAMES_ARIA_192_OFB, ossl_aria192ofb_functions),
238*b0d17251Schristos     ALG(PROV_NAMES_ARIA_128_OFB, ossl_aria128ofb_functions),
239*b0d17251Schristos     ALG(PROV_NAMES_ARIA_256_CFB, ossl_aria256cfb_functions),
240*b0d17251Schristos     ALG(PROV_NAMES_ARIA_192_CFB, ossl_aria192cfb_functions),
241*b0d17251Schristos     ALG(PROV_NAMES_ARIA_128_CFB, ossl_aria128cfb_functions),
242*b0d17251Schristos     ALG(PROV_NAMES_ARIA_256_CFB1, ossl_aria256cfb1_functions),
243*b0d17251Schristos     ALG(PROV_NAMES_ARIA_192_CFB1, ossl_aria192cfb1_functions),
244*b0d17251Schristos     ALG(PROV_NAMES_ARIA_128_CFB1, ossl_aria128cfb1_functions),
245*b0d17251Schristos     ALG(PROV_NAMES_ARIA_256_CFB8, ossl_aria256cfb8_functions),
246*b0d17251Schristos     ALG(PROV_NAMES_ARIA_192_CFB8, ossl_aria192cfb8_functions),
247*b0d17251Schristos     ALG(PROV_NAMES_ARIA_128_CFB8, ossl_aria128cfb8_functions),
248*b0d17251Schristos     ALG(PROV_NAMES_ARIA_256_CTR, ossl_aria256ctr_functions),
249*b0d17251Schristos     ALG(PROV_NAMES_ARIA_192_CTR, ossl_aria192ctr_functions),
250*b0d17251Schristos     ALG(PROV_NAMES_ARIA_128_CTR, ossl_aria128ctr_functions),
251*b0d17251Schristos #endif /* OPENSSL_NO_ARIA */
252*b0d17251Schristos #ifndef OPENSSL_NO_CAMELLIA
253*b0d17251Schristos     ALG(PROV_NAMES_CAMELLIA_256_ECB, ossl_camellia256ecb_functions),
254*b0d17251Schristos     ALG(PROV_NAMES_CAMELLIA_192_ECB, ossl_camellia192ecb_functions),
255*b0d17251Schristos     ALG(PROV_NAMES_CAMELLIA_128_ECB, ossl_camellia128ecb_functions),
256*b0d17251Schristos     ALG(PROV_NAMES_CAMELLIA_256_CBC, ossl_camellia256cbc_functions),
257*b0d17251Schristos     ALG(PROV_NAMES_CAMELLIA_192_CBC, ossl_camellia192cbc_functions),
258*b0d17251Schristos     ALG(PROV_NAMES_CAMELLIA_128_CBC, ossl_camellia128cbc_functions),
259*b0d17251Schristos     ALG(PROV_NAMES_CAMELLIA_128_CBC_CTS, ossl_camellia128cbc_cts_functions),
260*b0d17251Schristos     ALG(PROV_NAMES_CAMELLIA_192_CBC_CTS, ossl_camellia192cbc_cts_functions),
261*b0d17251Schristos     ALG(PROV_NAMES_CAMELLIA_256_CBC_CTS, ossl_camellia256cbc_cts_functions),
262*b0d17251Schristos     ALG(PROV_NAMES_CAMELLIA_256_OFB, ossl_camellia256ofb_functions),
263*b0d17251Schristos     ALG(PROV_NAMES_CAMELLIA_192_OFB, ossl_camellia192ofb_functions),
264*b0d17251Schristos     ALG(PROV_NAMES_CAMELLIA_128_OFB, ossl_camellia128ofb_functions),
265*b0d17251Schristos     ALG(PROV_NAMES_CAMELLIA_256_CFB, ossl_camellia256cfb_functions),
266*b0d17251Schristos     ALG(PROV_NAMES_CAMELLIA_192_CFB, ossl_camellia192cfb_functions),
267*b0d17251Schristos     ALG(PROV_NAMES_CAMELLIA_128_CFB, ossl_camellia128cfb_functions),
268*b0d17251Schristos     ALG(PROV_NAMES_CAMELLIA_256_CFB1, ossl_camellia256cfb1_functions),
269*b0d17251Schristos     ALG(PROV_NAMES_CAMELLIA_192_CFB1, ossl_camellia192cfb1_functions),
270*b0d17251Schristos     ALG(PROV_NAMES_CAMELLIA_128_CFB1, ossl_camellia128cfb1_functions),
271*b0d17251Schristos     ALG(PROV_NAMES_CAMELLIA_256_CFB8, ossl_camellia256cfb8_functions),
272*b0d17251Schristos     ALG(PROV_NAMES_CAMELLIA_192_CFB8, ossl_camellia192cfb8_functions),
273*b0d17251Schristos     ALG(PROV_NAMES_CAMELLIA_128_CFB8, ossl_camellia128cfb8_functions),
274*b0d17251Schristos     ALG(PROV_NAMES_CAMELLIA_256_CTR, ossl_camellia256ctr_functions),
275*b0d17251Schristos     ALG(PROV_NAMES_CAMELLIA_192_CTR, ossl_camellia192ctr_functions),
276*b0d17251Schristos     ALG(PROV_NAMES_CAMELLIA_128_CTR, ossl_camellia128ctr_functions),
277*b0d17251Schristos #endif /* OPENSSL_NO_CAMELLIA */
278*b0d17251Schristos #ifndef OPENSSL_NO_DES
279*b0d17251Schristos     ALG(PROV_NAMES_DES_EDE3_ECB, ossl_tdes_ede3_ecb_functions),
280*b0d17251Schristos     ALG(PROV_NAMES_DES_EDE3_CBC, ossl_tdes_ede3_cbc_functions),
281*b0d17251Schristos     ALG(PROV_NAMES_DES_EDE3_OFB, ossl_tdes_ede3_ofb_functions),
282*b0d17251Schristos     ALG(PROV_NAMES_DES_EDE3_CFB, ossl_tdes_ede3_cfb_functions),
283*b0d17251Schristos     ALG(PROV_NAMES_DES_EDE3_CFB8, ossl_tdes_ede3_cfb8_functions),
284*b0d17251Schristos     ALG(PROV_NAMES_DES_EDE3_CFB1, ossl_tdes_ede3_cfb1_functions),
285*b0d17251Schristos     ALG(PROV_NAMES_DES3_WRAP, ossl_tdes_wrap_cbc_functions),
286*b0d17251Schristos     ALG(PROV_NAMES_DES_EDE_ECB, ossl_tdes_ede2_ecb_functions),
287*b0d17251Schristos     ALG(PROV_NAMES_DES_EDE_CBC, ossl_tdes_ede2_cbc_functions),
288*b0d17251Schristos     ALG(PROV_NAMES_DES_EDE_OFB, ossl_tdes_ede2_ofb_functions),
289*b0d17251Schristos     ALG(PROV_NAMES_DES_EDE_CFB, ossl_tdes_ede2_cfb_functions),
290*b0d17251Schristos #endif /* OPENSSL_NO_DES */
291*b0d17251Schristos #ifndef OPENSSL_NO_SM4
292*b0d17251Schristos     ALG(PROV_NAMES_SM4_ECB, ossl_sm4128ecb_functions),
293*b0d17251Schristos     ALG(PROV_NAMES_SM4_CBC, ossl_sm4128cbc_functions),
294*b0d17251Schristos     ALG(PROV_NAMES_SM4_CTR, ossl_sm4128ctr_functions),
295*b0d17251Schristos     ALG(PROV_NAMES_SM4_OFB, ossl_sm4128ofb128_functions),
296*b0d17251Schristos     ALG(PROV_NAMES_SM4_CFB, ossl_sm4128cfb128_functions),
297*b0d17251Schristos #endif /* OPENSSL_NO_SM4 */
298*b0d17251Schristos #ifndef OPENSSL_NO_CHACHA
299*b0d17251Schristos     ALG(PROV_NAMES_ChaCha20, ossl_chacha20_functions),
300*b0d17251Schristos # ifndef OPENSSL_NO_POLY1305
301*b0d17251Schristos     ALG(PROV_NAMES_ChaCha20_Poly1305, ossl_chacha20_ossl_poly1305_functions),
302*b0d17251Schristos # endif /* OPENSSL_NO_POLY1305 */
303*b0d17251Schristos #endif /* OPENSSL_NO_CHACHA */
304*b0d17251Schristos     { { NULL, NULL, NULL }, NULL }
305*b0d17251Schristos };
306*b0d17251Schristos static OSSL_ALGORITHM exported_ciphers[OSSL_NELEM(deflt_ciphers)];
307*b0d17251Schristos 
308*b0d17251Schristos static const OSSL_ALGORITHM deflt_macs[] = {
309*b0d17251Schristos #ifndef OPENSSL_NO_BLAKE2
310*b0d17251Schristos     { PROV_NAMES_BLAKE2BMAC, "provider=default", ossl_blake2bmac_functions },
311*b0d17251Schristos     { PROV_NAMES_BLAKE2SMAC, "provider=default", ossl_blake2smac_functions },
312*b0d17251Schristos #endif
313*b0d17251Schristos #ifndef OPENSSL_NO_CMAC
314*b0d17251Schristos     { PROV_NAMES_CMAC, "provider=default", ossl_cmac_functions },
315*b0d17251Schristos #endif
316*b0d17251Schristos     { PROV_NAMES_GMAC, "provider=default", ossl_gmac_functions },
317*b0d17251Schristos     { PROV_NAMES_HMAC, "provider=default", ossl_hmac_functions },
318*b0d17251Schristos     { PROV_NAMES_KMAC_128, "provider=default", ossl_kmac128_functions },
319*b0d17251Schristos     { PROV_NAMES_KMAC_256, "provider=default", ossl_kmac256_functions },
320*b0d17251Schristos #ifndef OPENSSL_NO_SIPHASH
321*b0d17251Schristos     { PROV_NAMES_SIPHASH, "provider=default", ossl_siphash_functions },
322*b0d17251Schristos #endif
323*b0d17251Schristos #ifndef OPENSSL_NO_POLY1305
324*b0d17251Schristos     { PROV_NAMES_POLY1305, "provider=default", ossl_poly1305_functions },
325*b0d17251Schristos #endif
326*b0d17251Schristos     { NULL, NULL, NULL }
327*b0d17251Schristos };
328*b0d17251Schristos 
329*b0d17251Schristos static const OSSL_ALGORITHM deflt_kdfs[] = {
330*b0d17251Schristos     { PROV_NAMES_HKDF, "provider=default", ossl_kdf_hkdf_functions },
331*b0d17251Schristos     { PROV_NAMES_TLS1_3_KDF, "provider=default",
332*b0d17251Schristos       ossl_kdf_tls1_3_kdf_functions },
333*b0d17251Schristos     { PROV_NAMES_SSKDF, "provider=default", ossl_kdf_sskdf_functions },
334*b0d17251Schristos     { PROV_NAMES_PBKDF2, "provider=default", ossl_kdf_pbkdf2_functions },
335*b0d17251Schristos     { PROV_NAMES_PKCS12KDF, "provider=default", ossl_kdf_pkcs12_functions },
336*b0d17251Schristos     { PROV_NAMES_SSHKDF, "provider=default", ossl_kdf_sshkdf_functions },
337*b0d17251Schristos     { PROV_NAMES_X963KDF, "provider=default", ossl_kdf_x963_kdf_functions },
338*b0d17251Schristos     { PROV_NAMES_TLS1_PRF, "provider=default", ossl_kdf_tls1_prf_functions },
339*b0d17251Schristos     { PROV_NAMES_KBKDF, "provider=default", ossl_kdf_kbkdf_functions },
340*b0d17251Schristos     { PROV_NAMES_X942KDF_ASN1, "provider=default", ossl_kdf_x942_kdf_functions },
341*b0d17251Schristos #ifndef OPENSSL_NO_SCRYPT
342*b0d17251Schristos     { PROV_NAMES_SCRYPT, "provider=default", ossl_kdf_scrypt_functions },
343*b0d17251Schristos #endif
344*b0d17251Schristos     { PROV_NAMES_KRB5KDF, "provider=default", ossl_kdf_krb5kdf_functions },
345*b0d17251Schristos     { NULL, NULL, NULL }
346*b0d17251Schristos };
347*b0d17251Schristos 
348*b0d17251Schristos static const OSSL_ALGORITHM deflt_keyexch[] = {
349*b0d17251Schristos #ifndef OPENSSL_NO_DH
350*b0d17251Schristos     { PROV_NAMES_DH, "provider=default", ossl_dh_keyexch_functions },
351*b0d17251Schristos #endif
352*b0d17251Schristos #ifndef OPENSSL_NO_EC
353*b0d17251Schristos     { PROV_NAMES_ECDH, "provider=default", ossl_ecdh_keyexch_functions },
354*b0d17251Schristos     { PROV_NAMES_X25519, "provider=default", ossl_x25519_keyexch_functions },
355*b0d17251Schristos     { PROV_NAMES_X448, "provider=default", ossl_x448_keyexch_functions },
356*b0d17251Schristos #endif
357*b0d17251Schristos     { PROV_NAMES_TLS1_PRF, "provider=default", ossl_kdf_tls1_prf_keyexch_functions },
358*b0d17251Schristos     { PROV_NAMES_HKDF, "provider=default", ossl_kdf_hkdf_keyexch_functions },
359*b0d17251Schristos     { PROV_NAMES_SCRYPT, "provider=default",
360*b0d17251Schristos       ossl_kdf_scrypt_keyexch_functions },
361*b0d17251Schristos     { NULL, NULL, NULL }
362*b0d17251Schristos };
363*b0d17251Schristos 
364*b0d17251Schristos static const OSSL_ALGORITHM deflt_rands[] = {
365*b0d17251Schristos     { PROV_NAMES_CTR_DRBG, "provider=default", ossl_drbg_ctr_functions },
366*b0d17251Schristos     { PROV_NAMES_HASH_DRBG, "provider=default", ossl_drbg_hash_functions },
367*b0d17251Schristos     { PROV_NAMES_HMAC_DRBG, "provider=default", ossl_drbg_ossl_hmac_functions },
368*b0d17251Schristos     { PROV_NAMES_SEED_SRC, "provider=default", ossl_seed_src_functions },
369*b0d17251Schristos     { PROV_NAMES_TEST_RAND, "provider=default", ossl_test_rng_functions },
370*b0d17251Schristos     { NULL, NULL, NULL }
371*b0d17251Schristos };
372*b0d17251Schristos 
373*b0d17251Schristos static const OSSL_ALGORITHM deflt_signature[] = {
374*b0d17251Schristos #ifndef OPENSSL_NO_DSA
375*b0d17251Schristos     { PROV_NAMES_DSA, "provider=default", ossl_dsa_signature_functions },
376*b0d17251Schristos #endif
377*b0d17251Schristos     { PROV_NAMES_RSA, "provider=default", ossl_rsa_signature_functions },
378*b0d17251Schristos #ifndef OPENSSL_NO_EC
379*b0d17251Schristos     { PROV_NAMES_ED25519, "provider=default", ossl_ed25519_signature_functions },
380*b0d17251Schristos     { PROV_NAMES_ED448, "provider=default", ossl_ed448_signature_functions },
381*b0d17251Schristos     { PROV_NAMES_ECDSA, "provider=default", ossl_ecdsa_signature_functions },
382*b0d17251Schristos # ifndef OPENSSL_NO_SM2
383*b0d17251Schristos     { PROV_NAMES_SM2, "provider=default", ossl_sm2_signature_functions },
384*b0d17251Schristos # endif
385*b0d17251Schristos #endif
386*b0d17251Schristos     { PROV_NAMES_HMAC, "provider=default", ossl_mac_legacy_hmac_signature_functions },
387*b0d17251Schristos     { PROV_NAMES_SIPHASH, "provider=default",
388*b0d17251Schristos       ossl_mac_legacy_siphash_signature_functions },
389*b0d17251Schristos #ifndef OPENSSL_NO_POLY1305
390*b0d17251Schristos     { PROV_NAMES_POLY1305, "provider=default",
391*b0d17251Schristos       ossl_mac_legacy_poly1305_signature_functions },
392*b0d17251Schristos #endif
393*b0d17251Schristos #ifndef OPENSSL_NO_CMAC
394*b0d17251Schristos     { PROV_NAMES_CMAC, "provider=default", ossl_mac_legacy_cmac_signature_functions },
395*b0d17251Schristos #endif
396*b0d17251Schristos     { NULL, NULL, NULL }
397*b0d17251Schristos };
398*b0d17251Schristos 
399*b0d17251Schristos static const OSSL_ALGORITHM deflt_asym_cipher[] = {
400*b0d17251Schristos     { PROV_NAMES_RSA, "provider=default", ossl_rsa_asym_cipher_functions },
401*b0d17251Schristos #ifndef OPENSSL_NO_SM2
402*b0d17251Schristos     { PROV_NAMES_SM2, "provider=default", ossl_sm2_asym_cipher_functions },
403*b0d17251Schristos #endif
404*b0d17251Schristos     { NULL, NULL, NULL }
405*b0d17251Schristos };
406*b0d17251Schristos 
407*b0d17251Schristos static const OSSL_ALGORITHM deflt_asym_kem[] = {
408*b0d17251Schristos     { PROV_NAMES_RSA, "provider=default", ossl_rsa_asym_kem_functions },
409*b0d17251Schristos     { NULL, NULL, NULL }
410*b0d17251Schristos };
411*b0d17251Schristos 
412*b0d17251Schristos static const OSSL_ALGORITHM deflt_keymgmt[] = {
413*b0d17251Schristos #ifndef OPENSSL_NO_DH
414*b0d17251Schristos     { PROV_NAMES_DH, "provider=default", ossl_dh_keymgmt_functions,
415*b0d17251Schristos       PROV_DESCS_DH },
416*b0d17251Schristos     { PROV_NAMES_DHX, "provider=default", ossl_dhx_keymgmt_functions,
417*b0d17251Schristos       PROV_DESCS_DHX },
418*b0d17251Schristos #endif
419*b0d17251Schristos #ifndef OPENSSL_NO_DSA
420*b0d17251Schristos     { PROV_NAMES_DSA, "provider=default", ossl_dsa_keymgmt_functions,
421*b0d17251Schristos       PROV_DESCS_DSA},
422*b0d17251Schristos #endif
423*b0d17251Schristos     { PROV_NAMES_RSA, "provider=default", ossl_rsa_keymgmt_functions,
424*b0d17251Schristos       PROV_DESCS_RSA },
425*b0d17251Schristos     { PROV_NAMES_RSA_PSS, "provider=default", ossl_rsapss_keymgmt_functions,
426*b0d17251Schristos       PROV_DESCS_RSA_PSS },
427*b0d17251Schristos #ifndef OPENSSL_NO_EC
428*b0d17251Schristos     { PROV_NAMES_EC, "provider=default", ossl_ec_keymgmt_functions,
429*b0d17251Schristos       PROV_DESCS_EC },
430*b0d17251Schristos     { PROV_NAMES_X25519, "provider=default", ossl_x25519_keymgmt_functions,
431*b0d17251Schristos       PROV_DESCS_X25519 },
432*b0d17251Schristos     { PROV_NAMES_X448, "provider=default", ossl_x448_keymgmt_functions,
433*b0d17251Schristos       PROV_DESCS_X448 },
434*b0d17251Schristos     { PROV_NAMES_ED25519, "provider=default", ossl_ed25519_keymgmt_functions,
435*b0d17251Schristos       PROV_DESCS_ED25519 },
436*b0d17251Schristos     { PROV_NAMES_ED448, "provider=default", ossl_ed448_keymgmt_functions,
437*b0d17251Schristos       PROV_DESCS_ED448 },
438*b0d17251Schristos #endif
439*b0d17251Schristos     { PROV_NAMES_TLS1_PRF, "provider=default", ossl_kdf_keymgmt_functions,
440*b0d17251Schristos       PROV_DESCS_TLS1_PRF_SIGN },
441*b0d17251Schristos     { PROV_NAMES_HKDF, "provider=default", ossl_kdf_keymgmt_functions,
442*b0d17251Schristos       PROV_DESCS_HKDF_SIGN },
443*b0d17251Schristos     { PROV_NAMES_SCRYPT, "provider=default", ossl_kdf_keymgmt_functions,
444*b0d17251Schristos       PROV_DESCS_SCRYPT_SIGN },
445*b0d17251Schristos     { PROV_NAMES_HMAC, "provider=default", ossl_mac_legacy_keymgmt_functions,
446*b0d17251Schristos       PROV_DESCS_HMAC_SIGN },
447*b0d17251Schristos     { PROV_NAMES_SIPHASH, "provider=default", ossl_mac_legacy_keymgmt_functions,
448*b0d17251Schristos       PROV_DESCS_SIPHASH_SIGN },
449*b0d17251Schristos #ifndef OPENSSL_NO_POLY1305
450*b0d17251Schristos     { PROV_NAMES_POLY1305, "provider=default", ossl_mac_legacy_keymgmt_functions,
451*b0d17251Schristos       PROV_DESCS_POLY1305_SIGN },
452*b0d17251Schristos #endif
453*b0d17251Schristos #ifndef OPENSSL_NO_CMAC
454*b0d17251Schristos     { PROV_NAMES_CMAC, "provider=default", ossl_cmac_legacy_keymgmt_functions,
455*b0d17251Schristos       PROV_DESCS_CMAC_SIGN },
456*b0d17251Schristos #endif
457*b0d17251Schristos #ifndef OPENSSL_NO_SM2
458*b0d17251Schristos     { PROV_NAMES_SM2, "provider=default", ossl_sm2_keymgmt_functions,
459*b0d17251Schristos       PROV_DESCS_SM2 },
460*b0d17251Schristos #endif
461*b0d17251Schristos     { NULL, NULL, NULL }
462*b0d17251Schristos };
463*b0d17251Schristos 
464*b0d17251Schristos static const OSSL_ALGORITHM deflt_encoder[] = {
465*b0d17251Schristos #define ENCODER_PROVIDER "default"
466*b0d17251Schristos #include "encoders.inc"
467*b0d17251Schristos     { NULL, NULL, NULL }
468*b0d17251Schristos #undef ENCODER_PROVIDER
469*b0d17251Schristos };
470*b0d17251Schristos 
471*b0d17251Schristos static const OSSL_ALGORITHM deflt_decoder[] = {
472*b0d17251Schristos #define DECODER_PROVIDER "default"
473*b0d17251Schristos #include "decoders.inc"
474*b0d17251Schristos     { NULL, NULL, NULL }
475*b0d17251Schristos #undef DECODER_PROVIDER
476*b0d17251Schristos };
477*b0d17251Schristos 
478*b0d17251Schristos static const OSSL_ALGORITHM deflt_store[] = {
479*b0d17251Schristos #define STORE(name, _fips, func_table)                           \
480*b0d17251Schristos     { name, "provider=default,fips=" _fips, (func_table) },
481*b0d17251Schristos 
482*b0d17251Schristos #include "stores.inc"
483*b0d17251Schristos     { NULL, NULL, NULL }
484*b0d17251Schristos #undef STORE
485*b0d17251Schristos };
486*b0d17251Schristos 
deflt_query(void * provctx,int operation_id,int * no_cache)487*b0d17251Schristos static const OSSL_ALGORITHM *deflt_query(void *provctx, int operation_id,
488*b0d17251Schristos                                          int *no_cache)
489*b0d17251Schristos {
490*b0d17251Schristos     *no_cache = 0;
491*b0d17251Schristos     switch (operation_id) {
492*b0d17251Schristos     case OSSL_OP_DIGEST:
493*b0d17251Schristos         return deflt_digests;
494*b0d17251Schristos     case OSSL_OP_CIPHER:
495*b0d17251Schristos         return exported_ciphers;
496*b0d17251Schristos     case OSSL_OP_MAC:
497*b0d17251Schristos         return deflt_macs;
498*b0d17251Schristos     case OSSL_OP_KDF:
499*b0d17251Schristos         return deflt_kdfs;
500*b0d17251Schristos     case OSSL_OP_RAND:
501*b0d17251Schristos         return deflt_rands;
502*b0d17251Schristos     case OSSL_OP_KEYMGMT:
503*b0d17251Schristos         return deflt_keymgmt;
504*b0d17251Schristos     case OSSL_OP_KEYEXCH:
505*b0d17251Schristos         return deflt_keyexch;
506*b0d17251Schristos     case OSSL_OP_SIGNATURE:
507*b0d17251Schristos         return deflt_signature;
508*b0d17251Schristos     case OSSL_OP_ASYM_CIPHER:
509*b0d17251Schristos         return deflt_asym_cipher;
510*b0d17251Schristos     case OSSL_OP_KEM:
511*b0d17251Schristos         return deflt_asym_kem;
512*b0d17251Schristos     case OSSL_OP_ENCODER:
513*b0d17251Schristos         return deflt_encoder;
514*b0d17251Schristos     case OSSL_OP_DECODER:
515*b0d17251Schristos         return deflt_decoder;
516*b0d17251Schristos     case OSSL_OP_STORE:
517*b0d17251Schristos         return deflt_store;
518*b0d17251Schristos     }
519*b0d17251Schristos     return NULL;
520*b0d17251Schristos }
521*b0d17251Schristos 
522*b0d17251Schristos 
deflt_teardown(void * provctx)523*b0d17251Schristos static void deflt_teardown(void *provctx)
524*b0d17251Schristos {
525*b0d17251Schristos     BIO_meth_free(ossl_prov_ctx_get0_core_bio_method(provctx));
526*b0d17251Schristos     ossl_prov_ctx_free(provctx);
527*b0d17251Schristos }
528*b0d17251Schristos 
529*b0d17251Schristos /* Functions we provide to the core */
530*b0d17251Schristos static const OSSL_DISPATCH deflt_dispatch_table[] = {
531*b0d17251Schristos     { OSSL_FUNC_PROVIDER_TEARDOWN, (void (*)(void))deflt_teardown },
532*b0d17251Schristos     { OSSL_FUNC_PROVIDER_GETTABLE_PARAMS, (void (*)(void))deflt_gettable_params },
533*b0d17251Schristos     { OSSL_FUNC_PROVIDER_GET_PARAMS, (void (*)(void))deflt_get_params },
534*b0d17251Schristos     { OSSL_FUNC_PROVIDER_QUERY_OPERATION, (void (*)(void))deflt_query },
535*b0d17251Schristos     { OSSL_FUNC_PROVIDER_GET_CAPABILITIES,
536*b0d17251Schristos       (void (*)(void))ossl_prov_get_capabilities },
537*b0d17251Schristos     { 0, NULL }
538*b0d17251Schristos };
539*b0d17251Schristos 
540*b0d17251Schristos OSSL_provider_init_fn ossl_default_provider_init;
541*b0d17251Schristos 
ossl_default_provider_init(const OSSL_CORE_HANDLE * handle,const OSSL_DISPATCH * in,const OSSL_DISPATCH ** out,void ** provctx)542*b0d17251Schristos int ossl_default_provider_init(const OSSL_CORE_HANDLE *handle,
543*b0d17251Schristos                                const OSSL_DISPATCH *in,
544*b0d17251Schristos                                const OSSL_DISPATCH **out,
545*b0d17251Schristos                                void **provctx)
546*b0d17251Schristos {
547*b0d17251Schristos     OSSL_FUNC_core_get_libctx_fn *c_get_libctx = NULL;
548*b0d17251Schristos     BIO_METHOD *corebiometh;
549*b0d17251Schristos 
550*b0d17251Schristos     if (!ossl_prov_bio_from_dispatch(in)
551*b0d17251Schristos             || !ossl_prov_seeding_from_dispatch(in))
552*b0d17251Schristos         return 0;
553*b0d17251Schristos     for (; in->function_id != 0; in++) {
554*b0d17251Schristos         switch (in->function_id) {
555*b0d17251Schristos         case OSSL_FUNC_CORE_GETTABLE_PARAMS:
556*b0d17251Schristos             c_gettable_params = OSSL_FUNC_core_gettable_params(in);
557*b0d17251Schristos             break;
558*b0d17251Schristos         case OSSL_FUNC_CORE_GET_PARAMS:
559*b0d17251Schristos             c_get_params = OSSL_FUNC_core_get_params(in);
560*b0d17251Schristos             break;
561*b0d17251Schristos         case OSSL_FUNC_CORE_GET_LIBCTX:
562*b0d17251Schristos             c_get_libctx = OSSL_FUNC_core_get_libctx(in);
563*b0d17251Schristos             break;
564*b0d17251Schristos         default:
565*b0d17251Schristos             /* Just ignore anything we don't understand */
566*b0d17251Schristos             break;
567*b0d17251Schristos         }
568*b0d17251Schristos     }
569*b0d17251Schristos 
570*b0d17251Schristos     if (c_get_libctx == NULL)
571*b0d17251Schristos         return 0;
572*b0d17251Schristos 
573*b0d17251Schristos     /*
574*b0d17251Schristos      * We want to make sure that all calls from this provider that requires
575*b0d17251Schristos      * a library context use the same context as the one used to call our
576*b0d17251Schristos      * functions.  We do that by passing it along in the provider context.
577*b0d17251Schristos      *
578*b0d17251Schristos      * This only works for built-in providers.  Most providers should
579*b0d17251Schristos      * create their own library context.
580*b0d17251Schristos      */
581*b0d17251Schristos     if ((*provctx = ossl_prov_ctx_new()) == NULL
582*b0d17251Schristos             || (corebiometh = ossl_bio_prov_init_bio_method()) == NULL) {
583*b0d17251Schristos         ossl_prov_ctx_free(*provctx);
584*b0d17251Schristos         *provctx = NULL;
585*b0d17251Schristos         return 0;
586*b0d17251Schristos     }
587*b0d17251Schristos     ossl_prov_ctx_set0_libctx(*provctx,
588*b0d17251Schristos                                        (OSSL_LIB_CTX *)c_get_libctx(handle));
589*b0d17251Schristos     ossl_prov_ctx_set0_handle(*provctx, handle);
590*b0d17251Schristos     ossl_prov_ctx_set0_core_bio_method(*provctx, corebiometh);
591*b0d17251Schristos 
592*b0d17251Schristos     *out = deflt_dispatch_table;
593*b0d17251Schristos     ossl_prov_cache_exported_algorithms(deflt_ciphers, exported_ciphers);
594*b0d17251Schristos 
595*b0d17251Schristos     return 1;
596*b0d17251Schristos }
597