]> git.ipfire.org Git - thirdparty/openssl.git/blob - providers/fips/fipsprov.c
Add aes_xts cipher to providers
[thirdparty/openssl.git] / providers / fips / fipsprov.c
1 /*
2 * Copyright 2019 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 <string.h>
11 #include <stdio.h>
12 #include <openssl/core.h>
13 #include <openssl/core_numbers.h>
14 #include <openssl/core_names.h>
15 #include <openssl/params.h>
16 #include <openssl/err.h>
17 #include <openssl/evp.h>
18 #include <openssl/kdf.h>
19
20 /* TODO(3.0): Needed for dummy_evp_call(). To be removed */
21 #include <openssl/sha.h>
22 #include <openssl/rand_drbg.h>
23 #include <openssl/ec.h>
24 #include <openssl/fips_names.h>
25
26 #include "internal/cryptlib.h"
27 #include "internal/property.h"
28 #include "internal/evp_int.h"
29 #include "internal/provider_algs.h"
30 #include "internal/provider_ctx.h"
31 #include "internal/providercommon.h"
32 #include "selftest.h"
33
34 extern OSSL_core_thread_start_fn *c_thread_start;
35
36 /*
37 * TODO(3.0): Should these be stored in the provider side provctx? Could they
38 * ever be different from one init to the next? Unfortunately we can't do this
39 * at the moment because c_put_error/c_add_error_vdata do not provide
40 * us with the OPENSSL_CTX as a parameter.
41 */
42
43 static SELF_TEST_POST_PARAMS selftest_params;
44
45 /* Functions provided by the core */
46 static OSSL_core_gettable_params_fn *c_gettable_params;
47 static OSSL_core_get_params_fn *c_get_params;
48 OSSL_core_thread_start_fn *c_thread_start;
49 static OSSL_core_new_error_fn *c_new_error;
50 static OSSL_core_set_error_debug_fn *c_set_error_debug;
51 static OSSL_core_vset_error_fn *c_vset_error;
52 static OSSL_CRYPTO_malloc_fn *c_CRYPTO_malloc;
53 static OSSL_CRYPTO_zalloc_fn *c_CRYPTO_zalloc;
54 static OSSL_CRYPTO_free_fn *c_CRYPTO_free;
55 static OSSL_CRYPTO_clear_free_fn *c_CRYPTO_clear_free;
56 static OSSL_CRYPTO_realloc_fn *c_CRYPTO_realloc;
57 static OSSL_CRYPTO_clear_realloc_fn *c_CRYPTO_clear_realloc;
58 static OSSL_CRYPTO_secure_malloc_fn *c_CRYPTO_secure_malloc;
59 static OSSL_CRYPTO_secure_zalloc_fn *c_CRYPTO_secure_zalloc;
60 static OSSL_CRYPTO_secure_free_fn *c_CRYPTO_secure_free;
61 static OSSL_CRYPTO_secure_clear_free_fn *c_CRYPTO_secure_clear_free;
62 static OSSL_CRYPTO_secure_allocated_fn *c_CRYPTO_secure_allocated;
63
64 typedef struct fips_global_st {
65 const OSSL_PROVIDER *prov;
66 } FIPS_GLOBAL;
67
68 static void *fips_prov_ossl_ctx_new(OPENSSL_CTX *libctx)
69 {
70 FIPS_GLOBAL *fgbl = OPENSSL_zalloc(sizeof(*fgbl));
71
72 return fgbl;
73 }
74
75 static void fips_prov_ossl_ctx_free(void *fgbl)
76 {
77 OPENSSL_free(fgbl);
78 }
79
80 static const OPENSSL_CTX_METHOD fips_prov_ossl_ctx_method = {
81 fips_prov_ossl_ctx_new,
82 fips_prov_ossl_ctx_free,
83 };
84
85
86 /* Parameters we provide to the core */
87 static const OSSL_PARAM fips_param_types[] = {
88 OSSL_PARAM_DEFN(OSSL_PROV_PARAM_NAME, OSSL_PARAM_UTF8_PTR, NULL, 0),
89 OSSL_PARAM_DEFN(OSSL_PROV_PARAM_VERSION, OSSL_PARAM_UTF8_PTR, NULL, 0),
90 OSSL_PARAM_DEFN(OSSL_PROV_PARAM_BUILDINFO, OSSL_PARAM_UTF8_PTR, NULL, 0),
91 OSSL_PARAM_END
92 };
93
94 /*
95 * Parameters to retrieve from the core provider - required for self testing.
96 * NOTE: inside core_get_params() these will be loaded from config items
97 * stored inside prov->parameters (except for OSSL_PROV_PARAM_MODULE_FILENAME).
98 */
99 static OSSL_PARAM core_params[] =
100 {
101 OSSL_PARAM_utf8_ptr(OSSL_PROV_PARAM_MODULE_FILENAME,
102 selftest_params.module_filename,
103 sizeof(selftest_params.module_filename)),
104 OSSL_PARAM_utf8_ptr(OSSL_PROV_FIPS_PARAM_MODULE_MAC,
105 selftest_params.module_checksum_data,
106 sizeof(selftest_params.module_checksum_data)),
107 OSSL_PARAM_utf8_ptr(OSSL_PROV_FIPS_PARAM_INSTALL_MAC,
108 selftest_params.indicator_checksum_data,
109 sizeof(selftest_params.indicator_checksum_data)),
110 OSSL_PARAM_utf8_ptr(OSSL_PROV_FIPS_PARAM_INSTALL_STATUS,
111 selftest_params.indicator_data,
112 sizeof(selftest_params.indicator_data)),
113 OSSL_PARAM_utf8_ptr(OSSL_PROV_FIPS_PARAM_INSTALL_VERSION,
114 selftest_params.indicator_version,
115 sizeof(selftest_params.indicator_version)),
116 OSSL_PARAM_END
117 };
118
119 /* TODO(3.0): To be removed */
120 static int dummy_evp_call(void *provctx)
121 {
122 OPENSSL_CTX *libctx = PROV_LIBRARY_CONTEXT_OF(provctx);
123 EVP_MD_CTX *ctx = EVP_MD_CTX_new();
124 EVP_MD *sha256 = EVP_MD_fetch(libctx, "SHA256", NULL);
125 EVP_KDF *kdf = EVP_KDF_fetch(libctx, OSSL_KDF_NAME_PBKDF2, NULL);
126 char msg[] = "Hello World!";
127 const unsigned char exptd[] = {
128 0x7f, 0x83, 0xb1, 0x65, 0x7f, 0xf1, 0xfc, 0x53, 0xb9, 0x2d, 0xc1, 0x81,
129 0x48, 0xa1, 0xd6, 0x5d, 0xfc, 0x2d, 0x4b, 0x1f, 0xa3, 0xd6, 0x77, 0x28,
130 0x4a, 0xdd, 0xd2, 0x00, 0x12, 0x6d, 0x90, 0x69
131 };
132 unsigned int dgstlen = 0;
133 unsigned char dgst[SHA256_DIGEST_LENGTH];
134 int ret = 0;
135 BN_CTX *bnctx = NULL;
136 BIGNUM *a = NULL, *b = NULL;
137 unsigned char randbuf[128];
138 RAND_DRBG *drbg = OPENSSL_CTX_get0_public_drbg(libctx);
139 #ifndef OPENSSL_NO_EC
140 EC_KEY *key = NULL;
141 #endif
142
143 if (ctx == NULL || sha256 == NULL || drbg == NULL || kdf == NULL)
144 goto err;
145
146 if (!EVP_DigestInit_ex(ctx, sha256, NULL))
147 goto err;
148 if (!EVP_DigestUpdate(ctx, msg, sizeof(msg) - 1))
149 goto err;
150 if (!EVP_DigestFinal(ctx, dgst, &dgstlen))
151 goto err;
152 if (dgstlen != sizeof(exptd) || memcmp(dgst, exptd, sizeof(exptd)) != 0)
153 goto err;
154
155 bnctx = BN_CTX_new_ex(libctx);
156 if (bnctx == NULL)
157 goto err;
158 BN_CTX_start(bnctx);
159 a = BN_CTX_get(bnctx);
160 b = BN_CTX_get(bnctx);
161 if (b == NULL)
162 goto err;
163 BN_zero(a);
164 if (!BN_one(b)
165 || !BN_add(a, a, b)
166 || BN_cmp(a, b) != 0)
167 goto err;
168
169 if (RAND_DRBG_bytes(drbg, randbuf, sizeof(randbuf)) <= 0)
170 goto err;
171
172 if (!BN_rand_ex(a, 256, BN_RAND_TOP_ANY, BN_RAND_BOTTOM_ANY, bnctx))
173 goto err;
174
175 #ifndef OPENSSL_NO_EC
176 /* Do some dummy EC calls */
177 key = EC_KEY_new_by_curve_name_ex(libctx, NID_X9_62_prime256v1);
178 if (key == NULL)
179 goto err;
180
181 if (!EC_KEY_generate_key(key))
182 goto err;
183 #endif
184
185 ret = 1;
186 err:
187 BN_CTX_end(bnctx);
188 BN_CTX_free(bnctx);
189
190 EVP_KDF_free(kdf);
191 EVP_MD_CTX_free(ctx);
192 EVP_MD_free(sha256);
193
194 #ifndef OPENSSL_NO_EC
195 EC_KEY_free(key);
196 #endif
197 return ret;
198 }
199
200 static const OSSL_PARAM *fips_gettable_params(const OSSL_PROVIDER *prov)
201 {
202 return fips_param_types;
203 }
204
205 static int fips_get_params(const OSSL_PROVIDER *prov, OSSL_PARAM params[])
206 {
207 OSSL_PARAM *p;
208
209 p = OSSL_PARAM_locate(params, OSSL_PROV_PARAM_NAME);
210 if (p != NULL && !OSSL_PARAM_set_utf8_ptr(p, "OpenSSL FIPS Provider"))
211 return 0;
212 p = OSSL_PARAM_locate(params, OSSL_PROV_PARAM_VERSION);
213 if (p != NULL && !OSSL_PARAM_set_utf8_ptr(p, OPENSSL_VERSION_STR))
214 return 0;
215 p = OSSL_PARAM_locate(params, OSSL_PROV_PARAM_BUILDINFO);
216 if (p != NULL && !OSSL_PARAM_set_utf8_ptr(p, OPENSSL_FULL_VERSION_STR))
217 return 0;
218
219 return 1;
220 }
221
222 /* FIPS specific version of the function of the same name in provlib.c */
223 const char *ossl_prov_util_nid_to_name(int nid)
224 {
225 /* We don't have OBJ_nid2n() in FIPS_MODE so we have an explicit list */
226
227 switch (nid) {
228 /* Digests */
229 case NID_sha1:
230 return "SHA224";
231 case NID_sha224:
232 return "SHA224";
233 case NID_sha256:
234 return "SHA256";
235 case NID_sha384:
236 return "SHA384";
237 case NID_sha512:
238 return "SHA512";
239 case NID_sha512_224:
240 return "SHA512-224";
241 case NID_sha512_256:
242 return "SHA512-256";
243 case NID_sha3_224:
244 return "SHA3-224";
245 case NID_sha3_256:
246 return "SHA3-256";
247 case NID_sha3_384:
248 return "SHA3-384";
249 case NID_sha3_512:
250 return "SHA3-512";
251
252 /* Ciphers */
253 case NID_aes_256_ecb:
254 return "AES-256-ECB";
255 case NID_aes_192_ecb:
256 return "AES-192-ECB";
257 case NID_aes_128_ecb:
258 return "AES-128-ECB";
259 case NID_aes_256_cbc:
260 return "AES-256-CBC";
261 case NID_aes_192_cbc:
262 return "AES-192-CBC";
263 case NID_aes_128_cbc:
264 return "AES-128-CBC";
265 case NID_aes_256_ctr:
266 return "AES-256-CTR";
267 case NID_aes_192_ctr:
268 return "AES-192-CTR";
269 case NID_aes_128_ctr:
270 return "AES-128-CTR";
271 case NID_aes_256_xts:
272 return "AES-256-XTS";
273 case NID_aes_128_xts:
274 return "AES-128-XTS";
275 /* TODO(3.0) Change these when we have aliases */
276 case NID_aes_256_gcm:
277 return "id-aes256-GCM";
278 case NID_aes_192_gcm:
279 return "id-aes192-GCM";
280 case NID_aes_128_gcm:
281 return "id-aes128-GCM";
282 case NID_aes_256_ccm:
283 return "id-aes256-CCM";
284 case NID_aes_192_ccm:
285 return "id-aes192-CCM";
286 case NID_aes_128_ccm:
287 return "id-aes128-CCM";
288 default:
289 break;
290 }
291
292 return NULL;
293 }
294
295 static const OSSL_ALGORITHM fips_digests[] = {
296 { "SHA1", "fips=yes", sha1_functions },
297 { "SHA224", "fips=yes", sha224_functions },
298 { "SHA256", "fips=yes", sha256_functions },
299 { "SHA384", "fips=yes", sha384_functions },
300 { "SHA512", "fips=yes", sha512_functions },
301 { "SHA512-224", "fips=yes", sha512_224_functions },
302 { "SHA512-256", "fips=yes", sha512_256_functions },
303 { "SHA3-224", "fips=yes", sha3_224_functions },
304 { "SHA3-256", "fips=yes", sha3_256_functions },
305 { "SHA3-384", "fips=yes", sha3_384_functions },
306 { "SHA3-512", "fips=yes", sha3_512_functions },
307 /*
308 * KECCAK_KMAC128 and KECCAK_KMAC256 as hashes are mostly useful for
309 * the KMAC128 and KMAC256.
310 */
311 { "KECCAK_KMAC128", "fips=yes", keccak_kmac_128_functions },
312 { "KECCAK_KMAC256", "fips=yes", keccak_kmac_256_functions },
313
314 { NULL, NULL, NULL }
315 };
316
317 static const OSSL_ALGORITHM fips_ciphers[] = {
318 { "AES-256-ECB", "fips=yes", aes256ecb_functions },
319 { "AES-192-ECB", "fips=yes", aes192ecb_functions },
320 { "AES-128-ECB", "fips=yes", aes128ecb_functions },
321 { "AES-256-CBC", "fips=yes", aes256cbc_functions },
322 { "AES-192-CBC", "fips=yes", aes192cbc_functions },
323 { "AES-128-CBC", "fips=yes", aes128cbc_functions },
324 { "AES-256-CTR", "fips=yes", aes256ctr_functions },
325 { "AES-192-CTR", "fips=yes", aes192ctr_functions },
326 { "AES-128-CTR", "fips=yes", aes128ctr_functions },
327 { "AES-256-XTS", "fips=yes", aes256xts_functions },
328 { "AES-128-XTS", "fips=yes", aes128xts_functions },
329 /* TODO(3.0) Add aliases for these ciphers */
330 { "id-aes256-GCM", "fips=yes", aes256gcm_functions },
331 { "id-aes192-GCM", "fips=yes", aes192gcm_functions },
332 { "id-aes128-GCM", "fips=yes", aes128gcm_functions },
333 { "id-aes256-CCM", "fips=yes", aes256ccm_functions },
334 { "id-aes192-CCM", "fips=yes", aes192ccm_functions },
335 { "id-aes128-CCM", "fips=yes", aes128ccm_functions },
336 #ifndef OPENSSL_NO_DES
337 { "DES-EDE3", "fips=yes", tdes_ede3_ecb_functions },
338 { "DES-EDE3-CBC", "fips=yes", tdes_ede3_cbc_functions },
339 #endif /* OPENSSL_NO_DES */
340 { NULL, NULL, NULL }
341 };
342
343 static const OSSL_ALGORITHM fips_macs[] = {
344 #ifndef OPENSSL_NO_CMAC
345 { "CMAC", "fips=yes", cmac_functions },
346 #endif
347 { "GMAC", "fips=yes", gmac_functions },
348 { "HMAC", "fips=yes", hmac_functions },
349 { "KMAC128", "fips=yes", kmac128_functions },
350 { "KMAC256", "fips=yes", kmac256_functions },
351 { NULL, NULL, NULL }
352 };
353
354 static const OSSL_ALGORITHM fips_kdfs[] = {
355 { OSSL_KDF_NAME_HKDF, "fips=yes", kdf_hkdf_functions },
356 { OSSL_KDF_NAME_SSKDF, "fips=yes", kdf_sskdf_functions },
357 { OSSL_KDF_NAME_PBKDF2, "fips=yes", kdf_pbkdf2_functions },
358 { OSSL_KDF_NAME_TLS1_PRF, "fips=yes", kdf_tls1_prf_functions },
359 { NULL, NULL, NULL }
360 };
361
362 static const OSSL_ALGORITHM *fips_query(OSSL_PROVIDER *prov,
363 int operation_id,
364 int *no_cache)
365 {
366 *no_cache = 0;
367 switch (operation_id) {
368 case OSSL_OP_DIGEST:
369 return fips_digests;
370 case OSSL_OP_CIPHER:
371 return fips_ciphers;
372 case OSSL_OP_MAC:
373 return fips_macs;
374 case OSSL_OP_KDF:
375 return fips_kdfs;
376 }
377 return NULL;
378 }
379
380 /* Functions we provide to the core */
381 static const OSSL_DISPATCH fips_dispatch_table[] = {
382 /*
383 * To release our resources we just need to free the OPENSSL_CTX so we just
384 * use OPENSSL_CTX_free directly as our teardown function
385 */
386 { OSSL_FUNC_PROVIDER_TEARDOWN, (void (*)(void))OPENSSL_CTX_free },
387 { OSSL_FUNC_PROVIDER_GETTABLE_PARAMS, (void (*)(void))fips_gettable_params },
388 { OSSL_FUNC_PROVIDER_GET_PARAMS, (void (*)(void))fips_get_params },
389 { OSSL_FUNC_PROVIDER_QUERY_OPERATION, (void (*)(void))fips_query },
390 { 0, NULL }
391 };
392
393 /* Functions we provide to ourself */
394 static const OSSL_DISPATCH intern_dispatch_table[] = {
395 { OSSL_FUNC_PROVIDER_QUERY_OPERATION, (void (*)(void))fips_query },
396 { 0, NULL }
397 };
398
399
400 int OSSL_provider_init(const OSSL_PROVIDER *provider,
401 const OSSL_DISPATCH *in,
402 const OSSL_DISPATCH **out,
403 void **provctx)
404 {
405 FIPS_GLOBAL *fgbl;
406 OPENSSL_CTX *ctx;
407
408 for (; in->function_id != 0; in++) {
409 switch (in->function_id) {
410 case OSSL_FUNC_CORE_GETTABLE_PARAMS:
411 c_gettable_params = OSSL_get_core_gettable_params(in);
412 break;
413 case OSSL_FUNC_CORE_GET_PARAMS:
414 c_get_params = OSSL_get_core_get_params(in);
415 break;
416 case OSSL_FUNC_CORE_THREAD_START:
417 c_thread_start = OSSL_get_core_thread_start(in);
418 break;
419 case OSSL_FUNC_CORE_NEW_ERROR:
420 c_new_error = OSSL_get_core_new_error(in);
421 break;
422 case OSSL_FUNC_CORE_SET_ERROR_DEBUG:
423 c_set_error_debug = OSSL_get_core_set_error_debug(in);
424 break;
425 case OSSL_FUNC_CORE_VSET_ERROR:
426 c_vset_error = OSSL_get_core_vset_error(in);
427 break;
428 case OSSL_FUNC_CRYPTO_MALLOC:
429 c_CRYPTO_malloc = OSSL_get_CRYPTO_malloc(in);
430 break;
431 case OSSL_FUNC_CRYPTO_ZALLOC:
432 c_CRYPTO_zalloc = OSSL_get_CRYPTO_zalloc(in);
433 break;
434 case OSSL_FUNC_CRYPTO_FREE:
435 c_CRYPTO_free = OSSL_get_CRYPTO_free(in);
436 break;
437 case OSSL_FUNC_CRYPTO_CLEAR_FREE:
438 c_CRYPTO_clear_free = OSSL_get_CRYPTO_clear_free(in);
439 break;
440 case OSSL_FUNC_CRYPTO_REALLOC:
441 c_CRYPTO_realloc = OSSL_get_CRYPTO_realloc(in);
442 break;
443 case OSSL_FUNC_CRYPTO_CLEAR_REALLOC:
444 c_CRYPTO_clear_realloc = OSSL_get_CRYPTO_clear_realloc(in);
445 break;
446 case OSSL_FUNC_CRYPTO_SECURE_MALLOC:
447 c_CRYPTO_secure_malloc = OSSL_get_CRYPTO_secure_malloc(in);
448 break;
449 case OSSL_FUNC_CRYPTO_SECURE_ZALLOC:
450 c_CRYPTO_secure_zalloc = OSSL_get_CRYPTO_secure_zalloc(in);
451 break;
452 case OSSL_FUNC_CRYPTO_SECURE_FREE:
453 c_CRYPTO_secure_free = OSSL_get_CRYPTO_secure_free(in);
454 break;
455 case OSSL_FUNC_CRYPTO_SECURE_CLEAR_FREE:
456 c_CRYPTO_secure_clear_free = OSSL_get_CRYPTO_secure_clear_free(in);
457 break;
458 case OSSL_FUNC_CRYPTO_SECURE_ALLOCATED:
459 c_CRYPTO_secure_allocated = OSSL_get_CRYPTO_secure_allocated(in);
460 break;
461 case OSSL_FUNC_BIO_NEW_FILE:
462 selftest_params.bio_new_file_cb = OSSL_get_BIO_new_file(in);
463 break;
464 case OSSL_FUNC_BIO_NEW_MEMBUF:
465 selftest_params.bio_new_buffer_cb = OSSL_get_BIO_new_membuf(in);
466 break;
467 case OSSL_FUNC_BIO_READ:
468 selftest_params.bio_read_cb = OSSL_get_BIO_read(in);
469 break;
470 case OSSL_FUNC_BIO_FREE:
471 selftest_params.bio_free_cb = OSSL_get_BIO_free(in);
472 break;
473 default:
474 /* Just ignore anything we don't understand */
475 break;
476 }
477 }
478
479 if (!c_get_params(provider, core_params))
480 return 0;
481
482 /* Create a context. */
483 if ((ctx = OPENSSL_CTX_new()) == NULL)
484 return 0;
485 if ((fgbl = openssl_ctx_get_data(ctx, OPENSSL_CTX_FIPS_PROV_INDEX,
486 &fips_prov_ossl_ctx_method)) == NULL) {
487 OPENSSL_CTX_free(ctx);
488 return 0;
489 }
490 fgbl->prov = provider;
491 *out = fips_dispatch_table;
492 *provctx = ctx;
493
494 /*
495 * TODO(3.0): Remove me. This is just a dummy call to demonstrate making
496 * EVP calls from within the FIPS module.
497 */
498 if (!dummy_evp_call(*provctx)) {
499 OPENSSL_CTX_free(*provctx);
500 *provctx = NULL;
501 return 0;
502 }
503
504 return 1;
505 }
506
507 /*
508 * The internal init function used when the FIPS module uses EVP to call
509 * another algorithm also in the FIPS module. This is a recursive call that has
510 * been made from within the FIPS module itself. To make this work, we populate
511 * the provider context of this inner instance with the same library context
512 * that was used in the EVP call that initiated this recursive call.
513 */
514 OSSL_provider_init_fn fips_intern_provider_init;
515 int fips_intern_provider_init(const OSSL_PROVIDER *provider,
516 const OSSL_DISPATCH *in,
517 const OSSL_DISPATCH **out,
518 void **provctx)
519 {
520 OSSL_core_get_library_context_fn *c_get_libctx = NULL;
521
522 for (; in->function_id != 0; in++) {
523 switch (in->function_id) {
524 case OSSL_FUNC_CORE_GET_LIBRARY_CONTEXT:
525 c_get_libctx = OSSL_get_core_get_library_context(in);
526 break;
527 default:
528 break;
529 }
530 }
531
532 if (c_get_libctx == NULL)
533 return 0;
534
535 *provctx = c_get_libctx(provider);
536
537 /*
538 * Safety measure... we should get the library context that was
539 * created up in OSSL_provider_init().
540 */
541 if (*provctx == NULL)
542 return 0;
543
544 *out = intern_dispatch_table;
545 return 1;
546 }
547
548 void ERR_new(void)
549 {
550 c_new_error(NULL);
551 }
552
553 void ERR_set_debug(const char *file, int line, const char *func)
554 {
555 c_set_error_debug(NULL, file, line, func);
556 }
557
558 void ERR_set_error(int lib, int reason, const char *fmt, ...)
559 {
560 va_list args;
561
562 va_start(args, fmt);
563 c_vset_error(NULL, ERR_PACK(lib, 0, reason), fmt, args);
564 va_end(args);
565 }
566
567 void ERR_vset_error(int lib, int reason, const char *fmt, va_list args)
568 {
569 c_vset_error(NULL, ERR_PACK(lib, 0, reason), fmt, args);
570 }
571
572 const OSSL_PROVIDER *FIPS_get_provider(OPENSSL_CTX *ctx)
573 {
574 FIPS_GLOBAL *fgbl = openssl_ctx_get_data(ctx, OPENSSL_CTX_FIPS_PROV_INDEX,
575 &fips_prov_ossl_ctx_method);
576
577 if (fgbl == NULL)
578 return NULL;
579
580 return fgbl->prov;
581 }
582
583 void *CRYPTO_malloc(size_t num, const char *file, int line)
584 {
585 return c_CRYPTO_malloc(num, file, line);
586 }
587
588 void *CRYPTO_zalloc(size_t num, const char *file, int line)
589 {
590 return c_CRYPTO_zalloc(num, file, line);
591 }
592
593 void CRYPTO_free(void *ptr, const char *file, int line)
594 {
595 c_CRYPTO_free(ptr, file, line);
596 }
597
598 void CRYPTO_clear_free(void *ptr, size_t num, const char *file, int line)
599 {
600 c_CRYPTO_clear_free(ptr, num, file, line);
601 }
602
603 void *CRYPTO_realloc(void *addr, size_t num, const char *file, int line)
604 {
605 return c_CRYPTO_realloc(addr, num, file, line);
606 }
607
608 void *CRYPTO_clear_realloc(void *addr, size_t old_num, size_t num,
609 const char *file, int line)
610 {
611 return c_CRYPTO_clear_realloc(addr, old_num, num, file, line);
612 }
613
614 void *CRYPTO_secure_malloc(size_t num, const char *file, int line)
615 {
616 return c_CRYPTO_secure_malloc(num, file, line);
617 }
618
619 void *CRYPTO_secure_zalloc(size_t num, const char *file, int line)
620 {
621 return c_CRYPTO_secure_zalloc(num, file, line);
622 }
623
624 void CRYPTO_secure_free(void *ptr, const char *file, int line)
625 {
626 c_CRYPTO_secure_free(ptr, file, line);
627 }
628
629 void CRYPTO_secure_clear_free(void *ptr, size_t num, const char *file, int line)
630 {
631 c_CRYPTO_secure_clear_free(ptr, num, file, line);
632 }
633
634 int CRYPTO_secure_allocated(const void *ptr)
635 {
636 return c_CRYPTO_secure_allocated(ptr);
637 }