Matt Caswell | b184e3e | 2016-02-09 11:26:14 +0000 | [diff] [blame] | 1 | /* |
| 2 | * Written by Matt Caswell for the OpenSSL project. |
| 3 | */ |
| 4 | /* ==================================================================== |
| 5 | * Copyright (c) 2016 The OpenSSL Project. All rights reserved. |
| 6 | * |
| 7 | * Redistribution and use in source and binary forms, with or without |
| 8 | * modification, are permitted provided that the following conditions |
| 9 | * are met: |
| 10 | * |
| 11 | * 1. Redistributions of source code must retain the above copyright |
| 12 | * notice, this list of conditions and the following disclaimer. |
| 13 | * |
| 14 | * 2. Redistributions in binary form must reproduce the above copyright |
| 15 | * notice, this list of conditions and the following disclaimer in |
| 16 | * the documentation and/or other materials provided with the |
| 17 | * distribution. |
| 18 | * |
| 19 | * 3. All advertising materials mentioning features or use of this |
| 20 | * software must display the following acknowledgment: |
| 21 | * "This product includes software developed by the OpenSSL Project |
| 22 | * for use in the OpenSSL Toolkit. (http://www.openssl.org/)" |
| 23 | * |
| 24 | * 4. The names "OpenSSL Toolkit" and "OpenSSL Project" must not be used to |
| 25 | * endorse or promote products derived from this software without |
| 26 | * prior written permission. For written permission, please contact |
| 27 | * openssl-core@openssl.org. |
| 28 | * |
| 29 | * 5. Products derived from this software may not be called "OpenSSL" |
| 30 | * nor may "OpenSSL" appear in their names without prior written |
| 31 | * permission of the OpenSSL Project. |
| 32 | * |
| 33 | * 6. Redistributions of any form whatsoever must retain the following |
| 34 | * acknowledgment: |
| 35 | * "This product includes software developed by the OpenSSL Project |
| 36 | * for use in the OpenSSL Toolkit (http://www.openssl.org/)" |
| 37 | * |
| 38 | * THIS SOFTWARE IS PROVIDED BY THE OpenSSL PROJECT ``AS IS'' AND ANY |
| 39 | * EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE |
| 40 | * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR |
| 41 | * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE OpenSSL PROJECT OR |
| 42 | * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, |
| 43 | * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
| 44 | * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; |
| 45 | * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) |
| 46 | * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, |
| 47 | * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) |
| 48 | * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED |
| 49 | * OF THE POSSIBILITY OF SUCH DAMAGE. |
| 50 | * ==================================================================== |
| 51 | * |
| 52 | * This product includes cryptographic software written by Eric Young |
| 53 | * (eay@cryptsoft.com). This product includes software written by Tim |
| 54 | * Hudson (tjh@cryptsoft.com). |
| 55 | * |
| 56 | */ |
| 57 | |
Matt Caswell | b1f1e7a | 2016-03-02 14:51:00 +0000 | [diff] [blame] | 58 | #include <internal/threads.h> |
Matt Caswell | b184e3e | 2016-02-09 11:26:14 +0000 | [diff] [blame] | 59 | #include <internal/cryptlib_int.h> |
| 60 | #include <openssl/err.h> |
Viktor Dukhovni | 31305cd | 2016-02-14 15:25:54 -0500 | [diff] [blame] | 61 | #include <openssl/rand.h> |
Matt Caswell | b184e3e | 2016-02-09 11:26:14 +0000 | [diff] [blame] | 62 | #include <openssl/evp.h> |
Matt Caswell | b184e3e | 2016-02-09 11:26:14 +0000 | [diff] [blame] | 63 | #include <internal/evp_int.h> |
| 64 | #include <internal/conf.h> |
| 65 | #include <internal/async.h> |
Rich Salz | 1288f26 | 2016-02-17 13:33:51 -0500 | [diff] [blame] | 66 | #ifndef OPENSSL_NO_ENGINE |
Matt Caswell | b184e3e | 2016-02-09 11:26:14 +0000 | [diff] [blame] | 67 | #include <internal/engine.h> |
Rich Salz | 1288f26 | 2016-02-17 13:33:51 -0500 | [diff] [blame] | 68 | #endif |
Matt Caswell | b184e3e | 2016-02-09 11:26:14 +0000 | [diff] [blame] | 69 | #include <openssl/comp.h> |
Matt Caswell | b184e3e | 2016-02-09 11:26:14 +0000 | [diff] [blame] | 70 | #include <internal/err.h> |
Matt Caswell | b184e3e | 2016-02-09 11:26:14 +0000 | [diff] [blame] | 71 | #include <stdlib.h> |
Rich Salz | dd27f16 | 2016-02-10 00:39:29 -0500 | [diff] [blame] | 72 | #include <assert.h> |
| 73 | |
| 74 | static int stopped = 0; |
Matt Caswell | b184e3e | 2016-02-09 11:26:14 +0000 | [diff] [blame] | 75 | |
Matt Caswell | 71567a6 | 2016-02-09 09:13:45 +0000 | [diff] [blame] | 76 | static void ossl_init_thread_stop(struct thread_local_inits_st *locals); |
| 77 | |
Matt Caswell | a072ed0 | 2016-03-02 15:23:57 +0000 | [diff] [blame] | 78 | static CRYPTO_THREAD_LOCAL threadstopkey; |
Matt Caswell | b184e3e | 2016-02-09 11:26:14 +0000 | [diff] [blame] | 79 | |
Matt Caswell | b184e3e | 2016-02-09 11:26:14 +0000 | [diff] [blame] | 80 | static void ossl_init_thread_stop_wrap(void *local) |
| 81 | { |
| 82 | ossl_init_thread_stop((struct thread_local_inits_st *)local); |
| 83 | } |
| 84 | |
Matt Caswell | b7326ea | 2016-02-09 23:09:44 +0000 | [diff] [blame] | 85 | static struct thread_local_inits_st *ossl_init_get_thread_local(int alloc) |
Matt Caswell | b184e3e | 2016-02-09 11:26:14 +0000 | [diff] [blame] | 86 | { |
Matt Caswell | a072ed0 | 2016-03-02 15:23:57 +0000 | [diff] [blame] | 87 | struct thread_local_inits_st *local = |
| 88 | CRYPTO_THREAD_get_local(&threadstopkey); |
Matt Caswell | b184e3e | 2016-02-09 11:26:14 +0000 | [diff] [blame] | 89 | |
| 90 | if (local == NULL && alloc) { |
| 91 | local = OPENSSL_zalloc(sizeof *local); |
Matt Caswell | a072ed0 | 2016-03-02 15:23:57 +0000 | [diff] [blame] | 92 | CRYPTO_THREAD_set_local(&threadstopkey, local); |
Matt Caswell | b184e3e | 2016-02-09 11:26:14 +0000 | [diff] [blame] | 93 | } |
Matt Caswell | b7326ea | 2016-02-09 23:09:44 +0000 | [diff] [blame] | 94 | if (!alloc) { |
Matt Caswell | a072ed0 | 2016-03-02 15:23:57 +0000 | [diff] [blame] | 95 | CRYPTO_THREAD_set_local(&threadstopkey, NULL); |
Matt Caswell | b7326ea | 2016-02-09 23:09:44 +0000 | [diff] [blame] | 96 | } |
Matt Caswell | b184e3e | 2016-02-09 11:26:14 +0000 | [diff] [blame] | 97 | |
| 98 | return local; |
| 99 | } |
| 100 | |
Rich Salz | 7253fd5 | 2016-02-10 09:55:48 -0500 | [diff] [blame] | 101 | typedef struct ossl_init_stop_st OPENSSL_INIT_STOP; |
Matt Caswell | b184e3e | 2016-02-09 11:26:14 +0000 | [diff] [blame] | 102 | struct ossl_init_stop_st { |
| 103 | void (*handler)(void); |
| 104 | OPENSSL_INIT_STOP *next; |
| 105 | }; |
| 106 | |
| 107 | static OPENSSL_INIT_STOP *stop_handlers = NULL; |
Matt Caswell | c292b10 | 2016-03-07 14:39:22 +0000 | [diff] [blame] | 108 | static CRYPTO_RWLOCK *init_lock = NULL; |
Matt Caswell | b184e3e | 2016-02-09 11:26:14 +0000 | [diff] [blame] | 109 | |
Matt Caswell | b1f1e7a | 2016-03-02 14:51:00 +0000 | [diff] [blame] | 110 | static CRYPTO_ONCE base = CRYPTO_ONCE_STATIC_INIT; |
Matt Caswell | b184e3e | 2016-02-09 11:26:14 +0000 | [diff] [blame] | 111 | static int base_inited = 0; |
| 112 | static void ossl_init_base(void) |
| 113 | { |
| 114 | #ifdef OPENSSL_INIT_DEBUG |
| 115 | fprintf(stderr, "OPENSSL_INIT: ossl_init_base: Setting up stop handlers\n"); |
| 116 | #endif |
Matt Caswell | a072ed0 | 2016-03-02 15:23:57 +0000 | [diff] [blame] | 117 | /* |
| 118 | * We use a dummy thread local key here. We use the destructor to detect |
| 119 | * when the thread is going to stop (where that feature is available) |
| 120 | */ |
| 121 | CRYPTO_THREAD_init_local(&threadstopkey, ossl_init_thread_stop_wrap); |
David Woodhouse | c7b7938 | 2016-02-17 14:54:33 +0000 | [diff] [blame] | 122 | #ifndef OPENSSL_SYS_UEFI |
Rich Salz | f672aee | 2016-02-09 11:52:40 -0500 | [diff] [blame] | 123 | atexit(OPENSSL_cleanup); |
David Woodhouse | c7b7938 | 2016-02-17 14:54:33 +0000 | [diff] [blame] | 124 | #endif |
Matt Caswell | c292b10 | 2016-03-07 14:39:22 +0000 | [diff] [blame] | 125 | init_lock = CRYPTO_THREAD_lock_new(); |
Matt Caswell | b184e3e | 2016-02-09 11:26:14 +0000 | [diff] [blame] | 126 | OPENSSL_cpuid_setup(); |
| 127 | base_inited = 1; |
| 128 | } |
| 129 | |
Matt Caswell | b1f1e7a | 2016-03-02 14:51:00 +0000 | [diff] [blame] | 130 | static CRYPTO_ONCE load_crypto_strings = CRYPTO_ONCE_STATIC_INIT; |
Matt Caswell | b184e3e | 2016-02-09 11:26:14 +0000 | [diff] [blame] | 131 | static int load_crypto_strings_inited = 0; |
| 132 | static void ossl_init_no_load_crypto_strings(void) |
| 133 | { |
| 134 | /* Do nothing in this case */ |
| 135 | return; |
| 136 | } |
| 137 | |
| 138 | static void ossl_init_load_crypto_strings(void) |
| 139 | { |
Matt Caswell | 498abff | 2016-02-09 09:39:07 +0000 | [diff] [blame] | 140 | /* |
| 141 | * OPENSSL_NO_AUTOERRINIT is provided here to prevent at compile time |
| 142 | * pulling in all the error strings during static linking |
| 143 | */ |
| 144 | #if !defined(OPENSSL_NO_ERR) && !defined(OPENSSL_NO_AUTOERRINIT) |
Matt Caswell | b184e3e | 2016-02-09 11:26:14 +0000 | [diff] [blame] | 145 | # ifdef OPENSSL_INIT_DEBUG |
| 146 | fprintf(stderr, "OPENSSL_INIT: ossl_init_load_crypto_strings: " |
| 147 | "err_load_crypto_strings_intern()\n"); |
| 148 | # endif |
Matt Caswell | b184e3e | 2016-02-09 11:26:14 +0000 | [diff] [blame] | 149 | err_load_crypto_strings_intern(); |
| 150 | #endif |
Matt Caswell | b184e3e | 2016-02-09 11:26:14 +0000 | [diff] [blame] | 151 | load_crypto_strings_inited = 1; |
| 152 | } |
| 153 | |
Matt Caswell | b1f1e7a | 2016-03-02 14:51:00 +0000 | [diff] [blame] | 154 | static CRYPTO_ONCE add_all_ciphers = CRYPTO_ONCE_STATIC_INIT; |
Matt Caswell | b184e3e | 2016-02-09 11:26:14 +0000 | [diff] [blame] | 155 | static void ossl_init_add_all_ciphers(void) |
| 156 | { |
| 157 | /* |
| 158 | * OPENSSL_NO_AUTOALGINIT is provided here to prevent at compile time |
| 159 | * pulling in all the ciphers during static linking |
| 160 | */ |
| 161 | #ifndef OPENSSL_NO_AUTOALGINIT |
| 162 | # ifdef OPENSSL_INIT_DEBUG |
| 163 | fprintf(stderr, "OPENSSL_INIT: ossl_init_add_all_ciphers: " |
| 164 | "openssl_add_all_ciphers_internal()\n"); |
| 165 | # endif |
Matt Caswell | b184e3e | 2016-02-09 11:26:14 +0000 | [diff] [blame] | 166 | openssl_add_all_ciphers_internal(); |
Matt Caswell | b184e3e | 2016-02-09 11:26:14 +0000 | [diff] [blame] | 167 | # ifndef OPENSSL_NO_ENGINE |
| 168 | # if defined(__OpenBSD__) || defined(__FreeBSD__) || defined(HAVE_CRYPTODEV) |
| 169 | ENGINE_setup_bsd_cryptodev(); |
| 170 | # endif |
| 171 | # endif |
| 172 | #endif |
| 173 | } |
| 174 | |
Matt Caswell | b1f1e7a | 2016-03-02 14:51:00 +0000 | [diff] [blame] | 175 | static CRYPTO_ONCE add_all_digests = CRYPTO_ONCE_STATIC_INIT; |
Matt Caswell | b184e3e | 2016-02-09 11:26:14 +0000 | [diff] [blame] | 176 | static void ossl_init_add_all_digests(void) |
| 177 | { |
| 178 | /* |
| 179 | * OPENSSL_NO_AUTOALGINIT is provided here to prevent at compile time |
| 180 | * pulling in all the ciphers during static linking |
| 181 | */ |
| 182 | #ifndef OPENSSL_NO_AUTOALGINIT |
| 183 | # ifdef OPENSSL_INIT_DEBUG |
| 184 | fprintf(stderr, "OPENSSL_INIT: ossl_init_add_all_digests: " |
| 185 | "openssl_add_all_digests_internal()\n"); |
| 186 | # endif |
Matt Caswell | b184e3e | 2016-02-09 11:26:14 +0000 | [diff] [blame] | 187 | openssl_add_all_digests_internal(); |
Matt Caswell | b184e3e | 2016-02-09 11:26:14 +0000 | [diff] [blame] | 188 | # ifndef OPENSSL_NO_ENGINE |
| 189 | # if defined(__OpenBSD__) || defined(__FreeBSD__) || defined(HAVE_CRYPTODEV) |
| 190 | ENGINE_setup_bsd_cryptodev(); |
| 191 | # endif |
| 192 | # endif |
| 193 | #endif |
| 194 | } |
| 195 | |
| 196 | static void ossl_init_no_add_algs(void) |
| 197 | { |
| 198 | /* Do nothing */ |
| 199 | return; |
| 200 | } |
| 201 | |
Matt Caswell | b1f1e7a | 2016-03-02 14:51:00 +0000 | [diff] [blame] | 202 | static CRYPTO_ONCE config = CRYPTO_ONCE_STATIC_INIT; |
Matt Caswell | b184e3e | 2016-02-09 11:26:14 +0000 | [diff] [blame] | 203 | static int config_inited = 0; |
| 204 | static const char *config_filename; |
| 205 | static void ossl_init_config(void) |
| 206 | { |
| 207 | #ifdef OPENSSL_INIT_DEBUG |
| 208 | fprintf(stderr, |
| 209 | "OPENSSL_INIT: ossl_init_config: openssl_config_internal(%s)\n", |
| 210 | config_filename==NULL?"NULL":config_filename); |
| 211 | #endif |
Matt Caswell | b184e3e | 2016-02-09 11:26:14 +0000 | [diff] [blame] | 212 | openssl_config_internal(config_filename); |
Matt Caswell | b184e3e | 2016-02-09 11:26:14 +0000 | [diff] [blame] | 213 | config_inited = 1; |
| 214 | } |
| 215 | static void ossl_init_no_config(void) |
| 216 | { |
| 217 | #ifdef OPENSSL_INIT_DEBUG |
| 218 | fprintf(stderr, |
| 219 | "OPENSSL_INIT: ossl_init_config: openssl_no_config_internal()\n"); |
| 220 | #endif |
Matt Caswell | b184e3e | 2016-02-09 11:26:14 +0000 | [diff] [blame] | 221 | openssl_no_config_internal(); |
Matt Caswell | b184e3e | 2016-02-09 11:26:14 +0000 | [diff] [blame] | 222 | config_inited = 1; |
| 223 | } |
| 224 | |
Rich Salz | 1288f26 | 2016-02-17 13:33:51 -0500 | [diff] [blame] | 225 | #ifndef OPENSSL_NO_ASYNC |
Matt Caswell | b1f1e7a | 2016-03-02 14:51:00 +0000 | [diff] [blame] | 226 | static CRYPTO_ONCE async = CRYPTO_ONCE_STATIC_INIT; |
Matt Caswell | b184e3e | 2016-02-09 11:26:14 +0000 | [diff] [blame] | 227 | static int async_inited = 0; |
| 228 | static void ossl_init_async(void) |
| 229 | { |
| 230 | #ifdef OPENSSL_INIT_DEBUG |
| 231 | fprintf(stderr, "OPENSSL_INIT: ossl_init_async: async_init()\n"); |
| 232 | #endif |
Matt Caswell | b184e3e | 2016-02-09 11:26:14 +0000 | [diff] [blame] | 233 | async_init(); |
Matt Caswell | b184e3e | 2016-02-09 11:26:14 +0000 | [diff] [blame] | 234 | async_inited = 1; |
| 235 | } |
Rich Salz | 1288f26 | 2016-02-17 13:33:51 -0500 | [diff] [blame] | 236 | #endif |
Matt Caswell | b184e3e | 2016-02-09 11:26:14 +0000 | [diff] [blame] | 237 | |
| 238 | #ifndef OPENSSL_NO_ENGINE |
Matt Caswell | b1f1e7a | 2016-03-02 14:51:00 +0000 | [diff] [blame] | 239 | static CRYPTO_ONCE engine_openssl = CRYPTO_ONCE_STATIC_INIT; |
Matt Caswell | b184e3e | 2016-02-09 11:26:14 +0000 | [diff] [blame] | 240 | static void ossl_init_engine_openssl(void) |
| 241 | { |
| 242 | # ifdef OPENSSL_INIT_DEBUG |
| 243 | fprintf(stderr, "OPENSSL_INIT: ossl_init_engine_openssl: " |
| 244 | "engine_load_openssl_internal()\n"); |
| 245 | # endif |
Matt Caswell | b184e3e | 2016-02-09 11:26:14 +0000 | [diff] [blame] | 246 | engine_load_openssl_internal(); |
Matt Caswell | b184e3e | 2016-02-09 11:26:14 +0000 | [diff] [blame] | 247 | } |
| 248 | # if !defined(OPENSSL_NO_HW) && \ |
| 249 | (defined(__OpenBSD__) || defined(__FreeBSD__) || defined(HAVE_CRYPTODEV)) |
Matt Caswell | b1f1e7a | 2016-03-02 14:51:00 +0000 | [diff] [blame] | 250 | static CRYPTO_ONCE engine_cryptodev = CRYPTO_ONCE_STATIC_INIT; |
Matt Caswell | b184e3e | 2016-02-09 11:26:14 +0000 | [diff] [blame] | 251 | static void ossl_init_engine_cryptodev(void) |
| 252 | { |
| 253 | # ifdef OPENSSL_INIT_DEBUG |
| 254 | fprintf(stderr, "OPENSSL_INIT: ossl_init_engine_cryptodev: " |
| 255 | "engine_load_cryptodev_internal()\n"); |
| 256 | # endif |
Matt Caswell | b184e3e | 2016-02-09 11:26:14 +0000 | [diff] [blame] | 257 | engine_load_cryptodev_internal(); |
Matt Caswell | b184e3e | 2016-02-09 11:26:14 +0000 | [diff] [blame] | 258 | } |
| 259 | # endif |
| 260 | |
| 261 | # ifndef OPENSSL_NO_RDRAND |
Matt Caswell | b1f1e7a | 2016-03-02 14:51:00 +0000 | [diff] [blame] | 262 | static CRYPTO_ONCE engine_rdrand = CRYPTO_ONCE_STATIC_INIT; |
Matt Caswell | b184e3e | 2016-02-09 11:26:14 +0000 | [diff] [blame] | 263 | static void ossl_init_engine_rdrand(void) |
| 264 | { |
| 265 | # ifdef OPENSSL_INIT_DEBUG |
| 266 | fprintf(stderr, "OPENSSL_INIT: ossl_init_engine_rdrand: " |
| 267 | "engine_load_rdrand_internal()\n"); |
| 268 | # endif |
Matt Caswell | b184e3e | 2016-02-09 11:26:14 +0000 | [diff] [blame] | 269 | engine_load_rdrand_internal(); |
Matt Caswell | b184e3e | 2016-02-09 11:26:14 +0000 | [diff] [blame] | 270 | } |
| 271 | # endif |
Matt Caswell | b1f1e7a | 2016-03-02 14:51:00 +0000 | [diff] [blame] | 272 | static CRYPTO_ONCE engine_dynamic = CRYPTO_ONCE_STATIC_INIT; |
Matt Caswell | b184e3e | 2016-02-09 11:26:14 +0000 | [diff] [blame] | 273 | static void ossl_init_engine_dynamic(void) |
| 274 | { |
| 275 | # ifdef OPENSSL_INIT_DEBUG |
| 276 | fprintf(stderr, "OPENSSL_INIT: ossl_init_engine_dynamic: " |
| 277 | "engine_load_dynamic_internal()\n"); |
| 278 | # endif |
Matt Caswell | b184e3e | 2016-02-09 11:26:14 +0000 | [diff] [blame] | 279 | engine_load_dynamic_internal(); |
Matt Caswell | b184e3e | 2016-02-09 11:26:14 +0000 | [diff] [blame] | 280 | } |
| 281 | # ifndef OPENSSL_NO_STATIC_ENGINE |
| 282 | # if !defined(OPENSSL_NO_HW) && !defined(OPENSSL_NO_HW_PADLOCK) |
Matt Caswell | b1f1e7a | 2016-03-02 14:51:00 +0000 | [diff] [blame] | 283 | static CRYPTO_ONCE engine_padlock = CRYPTO_ONCE_STATIC_INIT; |
Matt Caswell | b184e3e | 2016-02-09 11:26:14 +0000 | [diff] [blame] | 284 | static void ossl_init_engine_padlock(void) |
| 285 | { |
| 286 | # ifdef OPENSSL_INIT_DEBUG |
| 287 | fprintf(stderr, "OPENSSL_INIT: ossl_init_engine_padlock: " |
| 288 | "engine_load_padlock_internal()\n"); |
| 289 | # endif |
Matt Caswell | b184e3e | 2016-02-09 11:26:14 +0000 | [diff] [blame] | 290 | engine_load_padlock_internal(); |
Matt Caswell | b184e3e | 2016-02-09 11:26:14 +0000 | [diff] [blame] | 291 | } |
| 292 | # endif |
| 293 | # if defined(OPENSSL_SYS_WIN32) && !defined(OPENSSL_NO_CAPIENG) |
Matt Caswell | b1f1e7a | 2016-03-02 14:51:00 +0000 | [diff] [blame] | 294 | static CRYPTO_ONCE engine_capi = CRYPTO_ONCE_STATIC_INIT; |
Matt Caswell | b184e3e | 2016-02-09 11:26:14 +0000 | [diff] [blame] | 295 | static void ossl_init_engine_capi(void) |
| 296 | { |
| 297 | # ifdef OPENSSL_INIT_DEBUG |
| 298 | fprintf(stderr, "OPENSSL_INIT: ossl_init_engine_capi: " |
| 299 | "engine_load_capi_internal()\n"); |
| 300 | # endif |
Matt Caswell | b184e3e | 2016-02-09 11:26:14 +0000 | [diff] [blame] | 301 | engine_load_capi_internal(); |
Matt Caswell | b184e3e | 2016-02-09 11:26:14 +0000 | [diff] [blame] | 302 | } |
| 303 | # endif |
Matt Caswell | b1f1e7a | 2016-03-02 14:51:00 +0000 | [diff] [blame] | 304 | static CRYPTO_ONCE engine_dasync = CRYPTO_ONCE_STATIC_INIT; |
Matt Caswell | b184e3e | 2016-02-09 11:26:14 +0000 | [diff] [blame] | 305 | static void ossl_init_engine_dasync(void) |
| 306 | { |
| 307 | # ifdef OPENSSL_INIT_DEBUG |
| 308 | fprintf(stderr, "OPENSSL_INIT: ossl_init_engine_dasync: " |
| 309 | "engine_load_dasync_internal()\n"); |
| 310 | # endif |
Matt Caswell | b184e3e | 2016-02-09 11:26:14 +0000 | [diff] [blame] | 311 | engine_load_dasync_internal(); |
Matt Caswell | b184e3e | 2016-02-09 11:26:14 +0000 | [diff] [blame] | 312 | } |
clucey | 6cba4a6 | 2016-02-23 08:01:01 +0000 | [diff] [blame] | 313 | # if !defined(OPENSSL_NO_AFALGENG) |
| 314 | static OPENSSL_INIT_ONCE engine_afalg = OPENSSL_INIT_ONCE_STATIC_INIT; |
| 315 | static void ossl_init_engine_afalg(void) |
| 316 | { |
| 317 | # ifdef OPENSSL_INIT_DEBUG |
| 318 | fprintf(stderr, "OPENSSL_INIT: ossl_init_engine_afalg: " |
| 319 | "engine_load_afalg_internal()\n"); |
| 320 | # endif |
| 321 | engine_load_afalg_internal(); |
clucey | 6cba4a6 | 2016-02-23 08:01:01 +0000 | [diff] [blame] | 322 | } |
| 323 | # endif |
Matt Caswell | b184e3e | 2016-02-09 11:26:14 +0000 | [diff] [blame] | 324 | # endif |
| 325 | #endif |
| 326 | |
Matt Caswell | b1f1e7a | 2016-03-02 14:51:00 +0000 | [diff] [blame] | 327 | static CRYPTO_ONCE zlib = CRYPTO_ONCE_STATIC_INIT; |
Matt Caswell | b184e3e | 2016-02-09 11:26:14 +0000 | [diff] [blame] | 328 | static int zlib_inited = 0; |
| 329 | static void ossl_init_zlib(void) |
| 330 | { |
| 331 | /* Do nothing - we need to know about this for the later cleanup */ |
| 332 | zlib_inited = 1; |
| 333 | } |
| 334 | |
Matt Caswell | 71567a6 | 2016-02-09 09:13:45 +0000 | [diff] [blame] | 335 | static void ossl_init_thread_stop(struct thread_local_inits_st *locals) |
Matt Caswell | b184e3e | 2016-02-09 11:26:14 +0000 | [diff] [blame] | 336 | { |
| 337 | /* Can't do much about this */ |
| 338 | if (locals == NULL) |
| 339 | return; |
| 340 | |
Rich Salz | 1288f26 | 2016-02-17 13:33:51 -0500 | [diff] [blame] | 341 | #ifndef OPENSSL_NO_ASYNC |
Matt Caswell | b184e3e | 2016-02-09 11:26:14 +0000 | [diff] [blame] | 342 | if (locals->async) { |
| 343 | #ifdef OPENSSL_INIT_DEBUG |
| 344 | fprintf(stderr, "OPENSSL_INIT: ossl_init_thread_stop: " |
| 345 | "ASYNC_cleanup_thread()\n"); |
| 346 | #endif |
| 347 | ASYNC_cleanup_thread(); |
| 348 | } |
Rich Salz | 1288f26 | 2016-02-17 13:33:51 -0500 | [diff] [blame] | 349 | #endif |
Matt Caswell | b184e3e | 2016-02-09 11:26:14 +0000 | [diff] [blame] | 350 | |
| 351 | if (locals->err_state) { |
| 352 | #ifdef OPENSSL_INIT_DEBUG |
| 353 | fprintf(stderr, "OPENSSL_INIT: ossl_init_thread_stop: " |
Alessandro Ghedini | 8509dcc | 2016-03-02 17:36:17 +0000 | [diff] [blame] | 354 | "ERR_remove_thread_state()\n"); |
Matt Caswell | b184e3e | 2016-02-09 11:26:14 +0000 | [diff] [blame] | 355 | #endif |
Alessandro Ghedini | 8509dcc | 2016-03-02 17:36:17 +0000 | [diff] [blame] | 356 | ERR_remove_thread_state(); |
Matt Caswell | b184e3e | 2016-02-09 11:26:14 +0000 | [diff] [blame] | 357 | } |
| 358 | |
| 359 | OPENSSL_free(locals); |
Matt Caswell | b184e3e | 2016-02-09 11:26:14 +0000 | [diff] [blame] | 360 | } |
| 361 | |
Rich Salz | f672aee | 2016-02-09 11:52:40 -0500 | [diff] [blame] | 362 | void OPENSSL_thread_stop(void) |
Matt Caswell | 71567a6 | 2016-02-09 09:13:45 +0000 | [diff] [blame] | 363 | { |
| 364 | ossl_init_thread_stop( |
| 365 | (struct thread_local_inits_st *)ossl_init_get_thread_local(0)); |
| 366 | } |
| 367 | |
Matt Caswell | b184e3e | 2016-02-09 11:26:14 +0000 | [diff] [blame] | 368 | int ossl_init_thread_start(uint64_t opts) |
| 369 | { |
| 370 | struct thread_local_inits_st *locals = ossl_init_get_thread_local(1); |
| 371 | |
| 372 | if (locals == NULL) |
| 373 | return 0; |
| 374 | |
| 375 | if (opts & OPENSSL_INIT_THREAD_ASYNC) { |
| 376 | #ifdef OPENSSL_INIT_DEBUG |
| 377 | fprintf(stderr, "OPENSSL_INIT: ossl_init_thread_start: " |
| 378 | "marking thread for async\n"); |
| 379 | #endif |
| 380 | locals->async = 1; |
| 381 | } |
| 382 | |
| 383 | if (opts & OPENSSL_INIT_THREAD_ERR_STATE) { |
| 384 | #ifdef OPENSSL_INIT_DEBUG |
| 385 | fprintf(stderr, "OPENSSL_INIT: ossl_init_thread_start: " |
| 386 | "marking thread for err_state\n"); |
| 387 | #endif |
| 388 | locals->err_state = 1; |
| 389 | } |
| 390 | |
| 391 | return 1; |
| 392 | } |
| 393 | |
Rich Salz | f672aee | 2016-02-09 11:52:40 -0500 | [diff] [blame] | 394 | void OPENSSL_cleanup(void) |
Matt Caswell | b184e3e | 2016-02-09 11:26:14 +0000 | [diff] [blame] | 395 | { |
| 396 | OPENSSL_INIT_STOP *currhandler, *lasthandler; |
| 397 | |
Matt Caswell | deca5df | 2016-02-10 09:47:51 +0000 | [diff] [blame] | 398 | /* If we've not been inited then no need to deinit */ |
| 399 | if (!base_inited) |
| 400 | return; |
| 401 | |
Rich Salz | dd27f16 | 2016-02-10 00:39:29 -0500 | [diff] [blame] | 402 | /* Might be explicitly called and also by atexit */ |
| 403 | if (stopped) |
| 404 | return; |
| 405 | stopped = 1; |
| 406 | |
Matt Caswell | b184e3e | 2016-02-09 11:26:14 +0000 | [diff] [blame] | 407 | /* |
| 408 | * Thread stop may not get automatically called by the thread library for |
| 409 | * the very last thread in some situations, so call it directly. |
| 410 | */ |
| 411 | ossl_init_thread_stop(ossl_init_get_thread_local(0)); |
| 412 | |
| 413 | currhandler = stop_handlers; |
| 414 | while (currhandler != NULL) { |
| 415 | currhandler->handler(); |
| 416 | lasthandler = currhandler; |
| 417 | currhandler = currhandler->next; |
| 418 | OPENSSL_free(lasthandler); |
| 419 | } |
| 420 | stop_handlers = NULL; |
Matt Caswell | c292b10 | 2016-03-07 14:39:22 +0000 | [diff] [blame] | 421 | |
| 422 | CRYPTO_THREAD_lock_free(init_lock); |
| 423 | |
Matt Caswell | b184e3e | 2016-02-09 11:26:14 +0000 | [diff] [blame] | 424 | /* |
| 425 | * We assume we are single-threaded for this function, i.e. no race |
| 426 | * conditions for the various "*_inited" vars below. |
| 427 | */ |
| 428 | |
| 429 | if (zlib_inited) { |
| 430 | #ifdef OPENSSL_INIT_DEBUG |
Rich Salz | f672aee | 2016-02-09 11:52:40 -0500 | [diff] [blame] | 431 | fprintf(stderr, "OPENSSL_INIT: OPENSSL_cleanup: " |
Matt Caswell | b184e3e | 2016-02-09 11:26:14 +0000 | [diff] [blame] | 432 | "COMP_zlib_cleanup()\n"); |
| 433 | #endif |
| 434 | COMP_zlib_cleanup(); |
Matt Caswell | b184e3e | 2016-02-09 11:26:14 +0000 | [diff] [blame] | 435 | } |
| 436 | |
Matt Caswell | ed49f43 | 2016-03-02 16:52:43 +0000 | [diff] [blame] | 437 | #ifndef OPENSSL_NO_ASYNC |
| 438 | if (async_inited) { |
| 439 | # ifdef OPENSSL_INIT_DEBUG |
| 440 | fprintf(stderr, "OPENSSL_INIT: OPENSSL_cleanup: " |
| 441 | "async_deinit()\n"); |
| 442 | # endif |
| 443 | async_deinit(); |
| 444 | } |
| 445 | #endif |
| 446 | |
Matt Caswell | b184e3e | 2016-02-09 11:26:14 +0000 | [diff] [blame] | 447 | if (load_crypto_strings_inited) { |
| 448 | #ifdef OPENSSL_INIT_DEBUG |
Rich Salz | f672aee | 2016-02-09 11:52:40 -0500 | [diff] [blame] | 449 | fprintf(stderr, "OPENSSL_INIT: OPENSSL_cleanup: " |
Matt Caswell | b184e3e | 2016-02-09 11:26:14 +0000 | [diff] [blame] | 450 | "ERR_free_strings()\n"); |
| 451 | #endif |
| 452 | ERR_free_strings(); |
Matt Caswell | b184e3e | 2016-02-09 11:26:14 +0000 | [diff] [blame] | 453 | } |
| 454 | |
Matt Caswell | a072ed0 | 2016-03-02 15:23:57 +0000 | [diff] [blame] | 455 | CRYPTO_THREAD_cleanup_local(&threadstopkey); |
Matt Caswell | 6bc7bad | 2016-02-18 12:24:09 +0000 | [diff] [blame] | 456 | |
Matt Caswell | b184e3e | 2016-02-09 11:26:14 +0000 | [diff] [blame] | 457 | #ifdef OPENSSL_INIT_DEBUG |
Richard Levitte | 9749a07 | 2016-03-09 12:52:50 +0100 | [diff] [blame] | 458 | #ifndef OPENSSL_NO_ENGINE |
Matt Caswell | ae6412f | 2016-03-09 00:53:38 +0000 | [diff] [blame] | 459 | fprintf(stderr, "OPENSSL_INIT: OPENSSL_cleanup: " |
| 460 | "ENGINE_cleanup()\n"); |
Richard Levitte | 9749a07 | 2016-03-09 12:52:50 +0100 | [diff] [blame] | 461 | #endif |
Matt Caswell | deca5df | 2016-02-10 09:47:51 +0000 | [diff] [blame] | 462 | fprintf(stderr, "OPENSSL_INIT: OPENSSL_INIT_library_stop: " |
| 463 | "CRYPTO_cleanup_all_ex_data()\n"); |
| 464 | fprintf(stderr, "OPENSSL_INIT: OPENSSL_INIT_library_stop: " |
| 465 | "EVP_cleanup()\n"); |
| 466 | fprintf(stderr, "OPENSSL_INIT: OPENSSL_INIT_library_stop: " |
| 467 | "CONF_modules_free()\n"); |
| 468 | fprintf(stderr, "OPENSSL_INIT: OPENSSL_INIT_library_stop: " |
| 469 | "RAND_cleanup()\n"); |
Matt Caswell | ae6412f | 2016-03-09 00:53:38 +0000 | [diff] [blame] | 470 | |
Matt Caswell | b184e3e | 2016-02-09 11:26:14 +0000 | [diff] [blame] | 471 | #endif |
Richard Levitte | 9749a07 | 2016-03-09 12:52:50 +0100 | [diff] [blame] | 472 | #ifndef OPENSSL_NO_ENGINE |
Matt Caswell | ae6412f | 2016-03-09 00:53:38 +0000 | [diff] [blame] | 473 | ENGINE_cleanup(); |
Richard Levitte | 9749a07 | 2016-03-09 12:52:50 +0100 | [diff] [blame] | 474 | #endif |
Matt Caswell | deca5df | 2016-02-10 09:47:51 +0000 | [diff] [blame] | 475 | CRYPTO_cleanup_all_ex_data(); |
| 476 | EVP_cleanup(); |
| 477 | CONF_modules_free(); |
| 478 | RAND_cleanup(); |
| 479 | base_inited = 0; |
Matt Caswell | b184e3e | 2016-02-09 11:26:14 +0000 | [diff] [blame] | 480 | } |
| 481 | |
Matt Caswell | b184e3e | 2016-02-09 11:26:14 +0000 | [diff] [blame] | 482 | /* |
| 483 | * If this function is called with a non NULL settings value then it must be |
| 484 | * called prior to any threads making calls to any OpenSSL functions, |
| 485 | * i.e. passing a non-null settings value is assumed to be single-threaded. |
| 486 | */ |
Matt Caswell | 0fc32b0 | 2016-02-10 13:59:15 +0000 | [diff] [blame] | 487 | int OPENSSL_init_crypto(uint64_t opts, const OPENSSL_INIT_SETTINGS *settings) |
Matt Caswell | b184e3e | 2016-02-09 11:26:14 +0000 | [diff] [blame] | 488 | { |
Matt Caswell | 302f758 | 2016-02-10 15:16:06 +0000 | [diff] [blame] | 489 | static int stoperrset = 0; |
| 490 | |
| 491 | if (stopped) { |
| 492 | if (!stoperrset) { |
| 493 | /* |
| 494 | * We only ever set this once to avoid getting into an infinite |
| 495 | * loop where the error system keeps trying to init and fails so |
| 496 | * sets an error etc |
| 497 | */ |
| 498 | stoperrset = 1; |
Rich Salz | a462529 | 2016-02-10 15:20:48 -0500 | [diff] [blame] | 499 | CRYPTOerr(CRYPTO_F_OPENSSL_INIT_CRYPTO, ERR_R_INIT_FAIL); |
Matt Caswell | 302f758 | 2016-02-10 15:16:06 +0000 | [diff] [blame] | 500 | } |
Matt Caswell | 0fc32b0 | 2016-02-10 13:59:15 +0000 | [diff] [blame] | 501 | return 0; |
Matt Caswell | 302f758 | 2016-02-10 15:16:06 +0000 | [diff] [blame] | 502 | } |
Rich Salz | dd27f16 | 2016-02-10 00:39:29 -0500 | [diff] [blame] | 503 | |
Matt Caswell | b1f1e7a | 2016-03-02 14:51:00 +0000 | [diff] [blame] | 504 | if (!CRYPTO_THREAD_run_once(&base, ossl_init_base)) |
| 505 | return 0; |
Matt Caswell | b184e3e | 2016-02-09 11:26:14 +0000 | [diff] [blame] | 506 | |
Matt Caswell | b1f1e7a | 2016-03-02 14:51:00 +0000 | [diff] [blame] | 507 | if ((opts & OPENSSL_INIT_NO_LOAD_CRYPTO_STRINGS) |
| 508 | && !CRYPTO_THREAD_run_once(&load_crypto_strings, |
| 509 | ossl_init_no_load_crypto_strings)) |
| 510 | return 0; |
Matt Caswell | b184e3e | 2016-02-09 11:26:14 +0000 | [diff] [blame] | 511 | |
Matt Caswell | b1f1e7a | 2016-03-02 14:51:00 +0000 | [diff] [blame] | 512 | if ((opts & OPENSSL_INIT_LOAD_CRYPTO_STRINGS) |
| 513 | && !CRYPTO_THREAD_run_once(&load_crypto_strings, |
| 514 | ossl_init_load_crypto_strings)) |
| 515 | return 0; |
Matt Caswell | b184e3e | 2016-02-09 11:26:14 +0000 | [diff] [blame] | 516 | |
Matt Caswell | b1f1e7a | 2016-03-02 14:51:00 +0000 | [diff] [blame] | 517 | if ((opts & OPENSSL_INIT_NO_ADD_ALL_CIPHERS) |
| 518 | && !CRYPTO_THREAD_run_once(&add_all_ciphers, ossl_init_no_add_algs)) |
| 519 | return 0; |
Matt Caswell | b184e3e | 2016-02-09 11:26:14 +0000 | [diff] [blame] | 520 | |
Matt Caswell | b1f1e7a | 2016-03-02 14:51:00 +0000 | [diff] [blame] | 521 | if ((opts & OPENSSL_INIT_ADD_ALL_CIPHERS) |
| 522 | && !CRYPTO_THREAD_run_once(&add_all_ciphers, |
| 523 | ossl_init_add_all_ciphers)) |
| 524 | return 0; |
Matt Caswell | b184e3e | 2016-02-09 11:26:14 +0000 | [diff] [blame] | 525 | |
Matt Caswell | b1f1e7a | 2016-03-02 14:51:00 +0000 | [diff] [blame] | 526 | if ((opts & OPENSSL_INIT_NO_ADD_ALL_DIGESTS) |
| 527 | && !CRYPTO_THREAD_run_once(&add_all_digests, ossl_init_no_add_algs)) |
| 528 | return 0; |
Matt Caswell | b184e3e | 2016-02-09 11:26:14 +0000 | [diff] [blame] | 529 | |
Matt Caswell | b1f1e7a | 2016-03-02 14:51:00 +0000 | [diff] [blame] | 530 | if ((opts & OPENSSL_INIT_ADD_ALL_DIGESTS) |
| 531 | && !CRYPTO_THREAD_run_once(&add_all_digests, |
| 532 | ossl_init_add_all_digests)) |
| 533 | return 0; |
Matt Caswell | b184e3e | 2016-02-09 11:26:14 +0000 | [diff] [blame] | 534 | |
Matt Caswell | b1f1e7a | 2016-03-02 14:51:00 +0000 | [diff] [blame] | 535 | if ((opts & OPENSSL_INIT_NO_LOAD_CONFIG) |
| 536 | && !CRYPTO_THREAD_run_once(&config, ossl_init_no_config)) |
| 537 | return 0; |
Matt Caswell | b184e3e | 2016-02-09 11:26:14 +0000 | [diff] [blame] | 538 | |
| 539 | if (opts & OPENSSL_INIT_LOAD_CONFIG) { |
Matt Caswell | b1f1e7a | 2016-03-02 14:51:00 +0000 | [diff] [blame] | 540 | int ret; |
Matt Caswell | c292b10 | 2016-03-07 14:39:22 +0000 | [diff] [blame] | 541 | CRYPTO_THREAD_write_lock(init_lock); |
Rich Salz | 7253fd5 | 2016-02-10 09:55:48 -0500 | [diff] [blame] | 542 | config_filename = (settings == NULL) ? NULL : settings->config_name; |
Matt Caswell | b1f1e7a | 2016-03-02 14:51:00 +0000 | [diff] [blame] | 543 | ret = CRYPTO_THREAD_run_once(&config, ossl_init_config); |
Matt Caswell | c292b10 | 2016-03-07 14:39:22 +0000 | [diff] [blame] | 544 | CRYPTO_THREAD_unlock(init_lock); |
Matt Caswell | b1f1e7a | 2016-03-02 14:51:00 +0000 | [diff] [blame] | 545 | if (!ret) |
| 546 | return 0; |
Matt Caswell | b184e3e | 2016-02-09 11:26:14 +0000 | [diff] [blame] | 547 | } |
| 548 | |
Rich Salz | 1288f26 | 2016-02-17 13:33:51 -0500 | [diff] [blame] | 549 | #ifndef OPENSSL_NO_ASYNC |
Matt Caswell | b1f1e7a | 2016-03-02 14:51:00 +0000 | [diff] [blame] | 550 | if ((opts & OPENSSL_INIT_ASYNC) |
| 551 | && !CRYPTO_THREAD_run_once(&async, ossl_init_async)) |
| 552 | return 0; |
Rich Salz | 1288f26 | 2016-02-17 13:33:51 -0500 | [diff] [blame] | 553 | #endif |
Matt Caswell | b184e3e | 2016-02-09 11:26:14 +0000 | [diff] [blame] | 554 | #ifndef OPENSSL_NO_ENGINE |
Matt Caswell | b1f1e7a | 2016-03-02 14:51:00 +0000 | [diff] [blame] | 555 | if ((opts & OPENSSL_INIT_ENGINE_OPENSSL) |
| 556 | && !CRYPTO_THREAD_run_once(&engine_openssl, |
| 557 | ossl_init_engine_openssl)) |
| 558 | return 0; |
Matt Caswell | b184e3e | 2016-02-09 11:26:14 +0000 | [diff] [blame] | 559 | # if !defined(OPENSSL_NO_HW) && \ |
| 560 | (defined(__OpenBSD__) || defined(__FreeBSD__) || defined(HAVE_CRYPTODEV)) |
Matt Caswell | b1f1e7a | 2016-03-02 14:51:00 +0000 | [diff] [blame] | 561 | if ((opts & OPENSSL_INIT_ENGINE_CRYPTODEV) |
| 562 | && !CRYPTO_THREAD_run_once(&engine_cryptodev, |
| 563 | ossl_init_engine_cryptodev)) |
| 564 | return 0; |
Matt Caswell | b184e3e | 2016-02-09 11:26:14 +0000 | [diff] [blame] | 565 | # endif |
| 566 | # ifndef OPENSSL_NO_RDRAND |
Matt Caswell | b1f1e7a | 2016-03-02 14:51:00 +0000 | [diff] [blame] | 567 | if ((opts & OPENSSL_INIT_ENGINE_RDRAND) |
| 568 | && !CRYPTO_THREAD_run_once(&engine_rdrand, ossl_init_engine_rdrand)) |
| 569 | return 0; |
Matt Caswell | b184e3e | 2016-02-09 11:26:14 +0000 | [diff] [blame] | 570 | # endif |
Matt Caswell | b1f1e7a | 2016-03-02 14:51:00 +0000 | [diff] [blame] | 571 | if ((opts & OPENSSL_INIT_ENGINE_DYNAMIC) |
| 572 | && !CRYPTO_THREAD_run_once(&engine_dynamic, |
| 573 | ossl_init_engine_dynamic)) |
| 574 | return 0; |
Matt Caswell | b184e3e | 2016-02-09 11:26:14 +0000 | [diff] [blame] | 575 | # ifndef OPENSSL_NO_STATIC_ENGINE |
| 576 | # if !defined(OPENSSL_NO_HW) && !defined(OPENSSL_NO_HW_PADLOCK) |
Matt Caswell | b1f1e7a | 2016-03-02 14:51:00 +0000 | [diff] [blame] | 577 | if ((opts & OPENSSL_INIT_ENGINE_PADLOCK) |
| 578 | && CRYPTO_THREAD_run_once(&engine_padlock, |
| 579 | ossl_init_engine_padlock)) |
| 580 | return 0; |
Matt Caswell | b184e3e | 2016-02-09 11:26:14 +0000 | [diff] [blame] | 581 | # endif |
| 582 | # if defined(OPENSSL_SYS_WIN32) && !defined(OPENSSL_NO_CAPIENG) |
Matt Caswell | b1f1e7a | 2016-03-02 14:51:00 +0000 | [diff] [blame] | 583 | if ((opts & OPENSSL_INIT_ENGINE_CAPI) |
| 584 | && CRYPTO_THREAD_run_once(&engine_capi, ossl_init_engine_capi)) |
| 585 | return 0; |
Matt Caswell | b184e3e | 2016-02-09 11:26:14 +0000 | [diff] [blame] | 586 | # endif |
Matt Caswell | b1f1e7a | 2016-03-02 14:51:00 +0000 | [diff] [blame] | 587 | if ((opts & OPENSSL_INIT_ENGINE_DASYNC) |
| 588 | && !CRYPTO_THREAD_run_once(&engine_dasync, ossl_init_engine_dasync)) |
| 589 | return 0; |
clucey | 6cba4a6 | 2016-02-23 08:01:01 +0000 | [diff] [blame] | 590 | # if !defined(OPENSSL_NO_AFALGENG) |
Matt Caswell | b1f1e7a | 2016-03-02 14:51:00 +0000 | [diff] [blame] | 591 | if ((opts & OPENSSL_INIT_ENGINE_AFALG) |
| 592 | && !CRYPTO_THREAD_run_once(&engine_afalg, ossl_init_engine_afalg)) |
| 593 | return 0; |
clucey | 6cba4a6 | 2016-02-23 08:01:01 +0000 | [diff] [blame] | 594 | # endif |
Matt Caswell | b184e3e | 2016-02-09 11:26:14 +0000 | [diff] [blame] | 595 | # endif |
| 596 | if (opts & (OPENSSL_INIT_ENGINE_ALL_BUILTIN |
clucey | 6cba4a6 | 2016-02-23 08:01:01 +0000 | [diff] [blame] | 597 | | OPENSSL_INIT_ENGINE_DASYNC | OPENSSL_INIT_ENGINE_OPENSSL |
| 598 | | OPENSSL_INIT_ENGINE_AFALG)) { |
Matt Caswell | b184e3e | 2016-02-09 11:26:14 +0000 | [diff] [blame] | 599 | ENGINE_register_all_complete(); |
| 600 | } |
| 601 | #endif |
| 602 | |
Matt Caswell | b1f1e7a | 2016-03-02 14:51:00 +0000 | [diff] [blame] | 603 | if ((opts & OPENSSL_INIT_ZLIB) |
| 604 | && CRYPTO_THREAD_run_once(&zlib, ossl_init_zlib)) |
| 605 | return 0; |
Matt Caswell | 0fc32b0 | 2016-02-10 13:59:15 +0000 | [diff] [blame] | 606 | |
| 607 | return 1; |
Matt Caswell | b184e3e | 2016-02-09 11:26:14 +0000 | [diff] [blame] | 608 | } |
| 609 | |
Rich Salz | f672aee | 2016-02-09 11:52:40 -0500 | [diff] [blame] | 610 | int OPENSSL_atexit(void (*handler)(void)) |
Matt Caswell | b184e3e | 2016-02-09 11:26:14 +0000 | [diff] [blame] | 611 | { |
| 612 | OPENSSL_INIT_STOP *newhand; |
| 613 | |
| 614 | newhand = OPENSSL_malloc(sizeof(*newhand)); |
| 615 | if (newhand == NULL) |
| 616 | return 0; |
| 617 | |
| 618 | newhand->handler = handler; |
| 619 | newhand->next = stop_handlers; |
| 620 | stop_handlers = newhand; |
| 621 | |
| 622 | return 1; |
| 623 | } |
| 624 | |
| 625 | |