Home | History | Annotate | Line # | Download | only in ssl
      1 /*
      2  * Copyright 2016-2025 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 "internal/e_os.h"
     11 
     12 #include "internal/err.h"
     13 #include <openssl/crypto.h>
     14 #include <openssl/evp.h>
     15 #include <openssl/trace.h>
     16 #include "ssl_local.h"
     17 #include "internal/thread_once.h"
     18 #include "internal/rio_notifier.h" /* for ossl_wsa_cleanup() */
     19 
     20 static int stopped;
     21 
     22 static CRYPTO_ONCE ssl_base = CRYPTO_ONCE_STATIC_INIT;
     23 static int ssl_base_inited = 0;
     24 DEFINE_RUN_ONCE_STATIC(ossl_init_ssl_base)
     25 {
     26 #ifndef OPENSSL_NO_COMP
     27     OSSL_TRACE(INIT, "ossl_init_ssl_base: "
     28                      "SSL_COMP_get_compression_methods()\n");
     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
     35     ssl_sort_cipher_list();
     36     OSSL_TRACE(INIT, "ossl_init_ssl_base: SSL_add_ssl_module()\n");
     37     ssl_base_inited = 1;
     38     return 1;
     39 }
     40 
     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  */
     46 int OPENSSL_init_ssl(uint64_t opts, const OPENSSL_INIT_SETTINGS *settings)
     47 {
     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;
     58             ERR_raise(ERR_LIB_SSL, ERR_R_INIT_FAIL);
     59         }
     60         return 0;
     61     }
     62 
     63     opts |= OPENSSL_INIT_ADD_ALL_CIPHERS
     64         | OPENSSL_INIT_ADD_ALL_DIGESTS;
     65 #ifndef OPENSSL_NO_AUTOLOAD_CONFIG
     66     if ((opts & OPENSSL_INIT_NO_LOAD_CONFIG) == 0)
     67         opts |= OPENSSL_INIT_LOAD_CONFIG;
     68 #endif
     69 
     70     if (!OPENSSL_init_crypto(opts, settings))
     71         return 0;
     72 
     73     if (!RUN_ONCE(&ssl_base, ossl_init_ssl_base))
     74         return 0;
     75 
     76     return 1;
     77 }
     78