xref: /openbsd-src/lib/libcrypto/crypto_init.c (revision b761d24c0b5d0d9ad512e141f454aa88f53007e5)
1*b761d24cSjsing /*	$OpenBSD: crypto_init.c,v 1.22 2024/10/17 14:27:57 jsing Exp $ */
2e68eaf89Sbeck /*
3e68eaf89Sbeck  * Copyright (c) 2018 Bob Beck <beck@openbsd.org>
4e68eaf89Sbeck  *
5e68eaf89Sbeck  * Permission to use, copy, modify, and distribute this software for any
6e68eaf89Sbeck  * purpose with or without fee is hereby granted, provided that the above
7e68eaf89Sbeck  * copyright notice and this permission notice appear in all copies.
8e68eaf89Sbeck  *
9e68eaf89Sbeck  * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
10e68eaf89Sbeck  * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
11e68eaf89Sbeck  * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
12e68eaf89Sbeck  * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
13e68eaf89Sbeck  * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
14e68eaf89Sbeck  * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
15e68eaf89Sbeck  * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
16e68eaf89Sbeck  */
17e68eaf89Sbeck 
18e68eaf89Sbeck /* OpenSSL style init */
19e68eaf89Sbeck 
20e68eaf89Sbeck #include <pthread.h>
21e68eaf89Sbeck #include <stdio.h>
22e68eaf89Sbeck 
2368270c64Stb #include <openssl/asn1.h>
24e68eaf89Sbeck #include <openssl/conf.h>
25e68eaf89Sbeck #include <openssl/err.h>
267a1f0687Sjsing #include <openssl/evp.h>
277a1f0687Sjsing #include <openssl/objects.h>
2868270c64Stb #include <openssl/x509v3.h>
29512ef2b0Sjsing 
30*b761d24cSjsing #include "crypto_internal.h"
317a1f0687Sjsing #include "x509_issuer_cache.h"
32e68eaf89Sbeck 
3364e6c0c8Sbeck int OpenSSL_config(const char *);
3464e6c0c8Sbeck int OpenSSL_no_config(void);
352c91f55fSbeck 
367a1f0687Sjsing static pthread_once_t crypto_init_once = PTHREAD_ONCE_INIT;
37e68eaf89Sbeck static pthread_t crypto_init_thread;
387a1f0687Sjsing static int crypto_init_cleaned_up;
39e68eaf89Sbeck 
4090aaecc0Stb void
4190aaecc0Stb OPENSSL_init(void)
4290aaecc0Stb {
4390aaecc0Stb }
4403e44f6bSbeck LCRYPTO_ALIAS(OPENSSL_init);
4590aaecc0Stb 
46e68eaf89Sbeck static void
47e68eaf89Sbeck OPENSSL_init_crypto_internal(void)
48e68eaf89Sbeck {
49e68eaf89Sbeck 	crypto_init_thread = pthread_self();
50512ef2b0Sjsing 
51*b761d24cSjsing 	crypto_cpu_caps_init();
52*b761d24cSjsing 
53e68eaf89Sbeck 	ERR_load_crypto_strings();
54e68eaf89Sbeck }
55e68eaf89Sbeck 
56e68eaf89Sbeck int
57e68eaf89Sbeck OPENSSL_init_crypto(uint64_t opts, const void *settings)
58e68eaf89Sbeck {
597a1f0687Sjsing 	if (crypto_init_cleaned_up) {
607a1f0687Sjsing 		CRYPTOerror(ERR_R_INIT_FAIL);
617a1f0687Sjsing 		return 0;
627a1f0687Sjsing 	}
63e68eaf89Sbeck 
64e68eaf89Sbeck 	if (pthread_equal(pthread_self(), crypto_init_thread))
65e68eaf89Sbeck 		return 1; /* don't recurse */
66e68eaf89Sbeck 
677a1f0687Sjsing 	if (pthread_once(&crypto_init_once, OPENSSL_init_crypto_internal) != 0)
68e68eaf89Sbeck 		return 0;
69e68eaf89Sbeck 
702c91f55fSbeck 	if ((opts & OPENSSL_INIT_NO_LOAD_CONFIG) &&
7164e6c0c8Sbeck 	    (OpenSSL_no_config() == 0))
722c91f55fSbeck 		return 0;
732c91f55fSbeck 
742c91f55fSbeck 	if ((opts & OPENSSL_INIT_LOAD_CONFIG) &&
752c91f55fSbeck 	    (OpenSSL_config(NULL) == 0))
762c91f55fSbeck 		return 0;
772c91f55fSbeck 
78e68eaf89Sbeck 	return 1;
79e68eaf89Sbeck }
802117f69dSbeck LCRYPTO_ALIAS(OPENSSL_init_crypto);
817a1f0687Sjsing 
827a1f0687Sjsing void
837a1f0687Sjsing OPENSSL_cleanup(void)
847a1f0687Sjsing {
857a1f0687Sjsing 	/* This currently calls init... */
867a1f0687Sjsing 	ERR_free_strings();
877a1f0687Sjsing 
883e826b62Sjsing 	CRYPTO_cleanup_all_ex_data();
897a1f0687Sjsing 	EVP_cleanup();
9068270c64Stb 
9168270c64Stb 	X509_VERIFY_PARAM_table_cleanup();
9268270c64Stb 
937a1f0687Sjsing 	x509_issuer_cache_free();
947a1f0687Sjsing 
957a1f0687Sjsing 	crypto_init_cleaned_up = 1;
967a1f0687Sjsing }
972117f69dSbeck LCRYPTO_ALIAS(OPENSSL_cleanup);
987dcd30d8Stb 
997dcd30d8Stb void
1007dcd30d8Stb OpenSSL_add_all_ciphers(void)
1017dcd30d8Stb {
1027dcd30d8Stb }
1039bac3682Sbeck LCRYPTO_ALIAS(OpenSSL_add_all_ciphers);
1047dcd30d8Stb 
1057dcd30d8Stb void
1067dcd30d8Stb OpenSSL_add_all_digests(void)
1077dcd30d8Stb {
1087dcd30d8Stb }
1099bac3682Sbeck LCRYPTO_ALIAS(OpenSSL_add_all_digests);
1107dcd30d8Stb 
1117dcd30d8Stb void
1127dcd30d8Stb OPENSSL_add_all_algorithms_noconf(void)
1137dcd30d8Stb {
1147dcd30d8Stb }
1159bac3682Sbeck LCRYPTO_ALIAS(OPENSSL_add_all_algorithms_noconf);
1167dcd30d8Stb 
1177dcd30d8Stb void
1187dcd30d8Stb OPENSSL_add_all_algorithms_conf(void)
1197dcd30d8Stb {
1207dcd30d8Stb 	OPENSSL_config(NULL);
1217dcd30d8Stb }
1229bac3682Sbeck LCRYPTO_ALIAS(OPENSSL_add_all_algorithms_conf);
123