]>
Commit | Line | Data |
---|---|---|
b184e3ef | 1 | /* |
0c679f55 | 2 | * Copyright 2016-2025 The OpenSSL Project Authors. All Rights Reserved. |
b184e3ef | 3 | * |
2c18d164 | 4 | * Licensed under the Apache License 2.0 (the "License"). You may not use |
846e33c7 RS |
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 | |
b184e3ef MC |
8 | */ |
9 | ||
d5f9166b | 10 | #include "internal/e_os.h" |
b184e3ef | 11 | |
6827cb36 | 12 | #include "internal/err.h" |
b184e3ef MC |
13 | #include <openssl/crypto.h> |
14 | #include <openssl/evp.h> | |
5c641735 | 15 | #include <openssl/trace.h> |
706457b7 | 16 | #include "ssl_local.h" |
c2e4e5d2 | 17 | #include "internal/thread_once.h" |
44aab1ff | 18 | #include "internal/rio_notifier.h" /* for ossl_wsa_cleanup() */ |
b184e3ef | 19 | |
dd27f16e RS |
20 | static int stopped; |
21 | ||
b1f1e7ae | 22 | static CRYPTO_ONCE ssl_base = CRYPTO_ONCE_STATIC_INIT; |
b184e3ef | 23 | static int ssl_base_inited = 0; |
c2e4e5d2 | 24 | DEFINE_RUN_ONCE_STATIC(ossl_init_ssl_base) |
b184e3ef | 25 | { |
b184e3ef | 26 | #ifndef OPENSSL_NO_COMP |
5c641735 RL |
27 | OSSL_TRACE(INIT, "ossl_init_ssl_base: " |
28 | "SSL_COMP_get_compression_methods()\n"); | |
b184e3ef MC |
29 | /* |
30 | * This will initialise the built-in compression algorithms. The value | |
31 | * returned is a STACK_OF(SSL_COMP), but that can be discarded safely | |
32 | */ | |
33 | SSL_COMP_get_compression_methods(); | |
34 | #endif | |
c8f6c28a | 35 | ssl_sort_cipher_list(); |
1287dabd | 36 | OSSL_TRACE(INIT, "ossl_init_ssl_base: SSL_add_ssl_module()\n"); |
b184e3ef | 37 | ssl_base_inited = 1; |
c2e4e5d2 | 38 | return 1; |
b184e3ef MC |
39 | } |
40 | ||
b184e3ef MC |
41 | /* |
42 | * If this function is called with a non NULL settings value then it must be | |
43 | * called prior to any threads making calls to any OpenSSL functions, | |
44 | * i.e. passing a non-null settings value is assumed to be single-threaded. | |
45 | */ | |
bbaeadb0 | 46 | int OPENSSL_init_ssl(uint64_t opts, const OPENSSL_INIT_SETTINGS *settings) |
b184e3ef | 47 | { |
302f7588 MC |
48 | static int stoperrset = 0; |
49 | ||
50 | if (stopped) { | |
51 | if (!stoperrset) { | |
52 | /* | |
53 | * We only ever set this once to avoid getting into an infinite | |
54 | * loop where the error system keeps trying to init and fails so | |
55 | * sets an error etc | |
56 | */ | |
57 | stoperrset = 1; | |
6849b73c | 58 | ERR_raise(ERR_LIB_SSL, ERR_R_INIT_FAIL); |
302f7588 | 59 | } |
0fc32b07 | 60 | return 0; |
302f7588 | 61 | } |
dd27f16e | 62 | |
df1f538f | 63 | opts |= OPENSSL_INIT_ADD_ALL_CIPHERS |
e74bd290 | 64 | | OPENSSL_INIT_ADD_ALL_DIGESTS; |
dbabc862 | 65 | #ifndef OPENSSL_NO_AUTOLOAD_CONFIG |
df1f538f VD |
66 | if ((opts & OPENSSL_INIT_NO_LOAD_CONFIG) == 0) |
67 | opts |= OPENSSL_INIT_LOAD_CONFIG; | |
dbabc862 | 68 | #endif |
df1f538f VD |
69 | |
70 | if (!OPENSSL_init_crypto(opts, settings)) | |
0fc32b07 | 71 | return 0; |
b184e3ef | 72 | |
d8f031e8 | 73 | if (!RUN_ONCE(&ssl_base, ossl_init_ssl_base)) |
b1f1e7ae | 74 | return 0; |
b184e3ef | 75 | |
0fc32b07 | 76 | return 1; |
b184e3ef | 77 | } |