| 
									
										
										
										
											2016-02-09 19:26:14 +08:00
										 |  |  | /*
 | 
					
						
							| 
									
										
										
										
											2022-05-03 18:52:38 +08:00
										 |  |  |  * Copyright 2016-2022 The OpenSSL Project Authors. All Rights Reserved. | 
					
						
							| 
									
										
										
										
											2016-02-09 19:26:14 +08:00
										 |  |  |  * | 
					
						
							| 
									
										
										
										
											2018-12-06 20:08:51 +08:00
										 |  |  |  * Licensed under the Apache License 2.0 (the "License").  You may not use | 
					
						
							| 
									
										
										
										
											2016-05-18 02:18:30 +08:00
										 |  |  |  * this file except in compliance with the License.  You can obtain a copy | 
					
						
							|  |  |  |  * in the file LICENSE in the source distribution or at | 
					
						
							|  |  |  |  * https://www.openssl.org/source/license.html
 | 
					
						
							| 
									
										
										
										
											2016-02-09 19:26:14 +08:00
										 |  |  |  */ | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-02-04 22:13:01 +08:00
										 |  |  | #include "internal/e_os.h"
 | 
					
						
							| 
									
										
										
										
											2016-02-09 19:26:14 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-04-04 20:43:58 +08:00
										 |  |  | #include "internal/err.h"
 | 
					
						
							| 
									
										
										
										
											2016-02-09 19:26:14 +08:00
										 |  |  | #include <openssl/crypto.h>
 | 
					
						
							|  |  |  | #include <openssl/evp.h>
 | 
					
						
							| 
									
										
										
										
											2018-12-13 07:32:57 +08:00
										 |  |  | #include <openssl/trace.h>
 | 
					
						
							| 
									
										
										
										
											2019-09-28 06:45:40 +08:00
										 |  |  | #include "ssl_local.h"
 | 
					
						
							| 
									
										
										
										
											2020-11-12 16:19:24 +08:00
										 |  |  | #include "sslerr.h"
 | 
					
						
							| 
									
										
										
										
											2016-07-20 01:42:11 +08:00
										 |  |  | #include "internal/thread_once.h"
 | 
					
						
							| 
									
										
										
										
											2016-02-09 19:26:14 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-02-10 13:39:29 +08:00
										 |  |  | static int stopped; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-02-09 19:26:14 +08:00
										 |  |  | static void ssl_library_stop(void); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-03-02 22:51:00 +08:00
										 |  |  | static CRYPTO_ONCE ssl_base = CRYPTO_ONCE_STATIC_INIT; | 
					
						
							| 
									
										
										
										
											2016-02-09 19:26:14 +08:00
										 |  |  | static int ssl_base_inited = 0; | 
					
						
							| 
									
										
										
										
											2016-07-20 01:42:11 +08:00
										 |  |  | DEFINE_RUN_ONCE_STATIC(ossl_init_ssl_base) | 
					
						
							| 
									
										
										
										
											2016-02-09 19:26:14 +08:00
										 |  |  | { | 
					
						
							|  |  |  | #ifndef OPENSSL_NO_COMP
 | 
					
						
							| 
									
										
										
										
											2018-12-13 07:32:57 +08:00
										 |  |  |     OSSL_TRACE(INIT, "ossl_init_ssl_base: " | 
					
						
							|  |  |  |                "SSL_COMP_get_compression_methods()\n"); | 
					
						
							| 
									
										
										
										
											2016-02-09 19:26:14 +08:00
										 |  |  |     /*
 | 
					
						
							|  |  |  |      * This will initialise the built-in compression algorithms. The value | 
					
						
							|  |  |  |      * returned is a STACK_OF(SSL_COMP), but that can be discarded safely | 
					
						
							|  |  |  |      */ | 
					
						
							|  |  |  |     SSL_COMP_get_compression_methods(); | 
					
						
							|  |  |  | #endif
 | 
					
						
							| 
									
										
										
										
											2020-01-16 20:14:27 +08:00
										 |  |  |     ssl_sort_cipher_list(); | 
					
						
							| 
									
										
										
										
											2021-10-26 15:16:18 +08:00
										 |  |  |     OSSL_TRACE(INIT, "ossl_init_ssl_base: SSL_add_ssl_module()\n"); | 
					
						
							| 
									
										
										
										
											2016-02-09 19:26:14 +08:00
										 |  |  |     /*
 | 
					
						
							|  |  |  |      * We ignore an error return here. Not much we can do - but not that bad | 
					
						
							|  |  |  |      * either. We can still safely continue. | 
					
						
							|  |  |  |      */ | 
					
						
							| 
									
										
										
										
											2016-02-10 00:52:40 +08:00
										 |  |  |     OPENSSL_atexit(ssl_library_stop); | 
					
						
							| 
									
										
										
										
											2016-02-09 19:26:14 +08:00
										 |  |  |     ssl_base_inited = 1; | 
					
						
							| 
									
										
										
										
											2016-07-20 01:42:11 +08:00
										 |  |  |     return 1; | 
					
						
							| 
									
										
										
										
											2016-02-09 19:26:14 +08:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-03-02 22:51:00 +08:00
										 |  |  | static CRYPTO_ONCE ssl_strings = CRYPTO_ONCE_STATIC_INIT; | 
					
						
							| 
									
										
										
										
											2022-03-30 03:50:21 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-07-20 01:42:11 +08:00
										 |  |  | DEFINE_RUN_ONCE_STATIC(ossl_init_load_ssl_strings) | 
					
						
							| 
									
										
										
										
											2016-02-09 19:26:14 +08:00
										 |  |  | { | 
					
						
							| 
									
										
										
										
											2016-02-09 17:39:07 +08:00
										 |  |  |     /*
 | 
					
						
							|  |  |  |      * OPENSSL_NO_AUTOERRINIT is provided here to prevent at compile time | 
					
						
							|  |  |  |      * pulling in all the error strings during static linking | 
					
						
							|  |  |  |      */ | 
					
						
							|  |  |  | #if !defined(OPENSSL_NO_ERR) && !defined(OPENSSL_NO_AUTOERRINIT)
 | 
					
						
							| 
									
										
										
										
											2021-05-25 10:04:22 +08:00
										 |  |  |     OSSL_TRACE(INIT, "ossl_init_load_ssl_strings: ossl_err_load_SSL_strings()\n"); | 
					
						
							|  |  |  |     ossl_err_load_SSL_strings(); | 
					
						
							| 
									
										
										
										
											2018-08-08 03:08:03 +08:00
										 |  |  | #endif
 | 
					
						
							| 
									
										
										
										
											2016-07-20 01:42:11 +08:00
										 |  |  |     return 1; | 
					
						
							| 
									
										
										
										
											2016-02-09 19:26:14 +08:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-11-20 23:32:55 +08:00
										 |  |  | DEFINE_RUN_ONCE_STATIC_ALT(ossl_init_no_load_ssl_strings, | 
					
						
							|  |  |  |                            ossl_init_load_ssl_strings) | 
					
						
							| 
									
										
										
										
											2016-02-09 19:26:14 +08:00
										 |  |  | { | 
					
						
							|  |  |  |     /* Do nothing in this case */ | 
					
						
							| 
									
										
										
										
											2016-07-20 01:42:11 +08:00
										 |  |  |     return 1; | 
					
						
							| 
									
										
										
										
											2016-02-09 19:26:14 +08:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | static void ssl_library_stop(void) | 
					
						
							|  |  |  | { | 
					
						
							| 
									
										
										
										
											2016-02-10 13:39:29 +08:00
										 |  |  |     /* Might be explicitly called and also by atexit */ | 
					
						
							|  |  |  |     if (stopped) | 
					
						
							|  |  |  |         return; | 
					
						
							|  |  |  |     stopped = 1; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-02-09 19:26:14 +08:00
										 |  |  |     if (ssl_base_inited) { | 
					
						
							|  |  |  | #ifndef OPENSSL_NO_COMP
 | 
					
						
							| 
									
										
										
										
											2018-12-13 07:32:57 +08:00
										 |  |  |         OSSL_TRACE(INIT, "ssl_library_stop: " | 
					
						
							|  |  |  |                    "ssl_comp_free_compression_methods_int()\n"); | 
					
						
							| 
									
										
										
										
											2016-04-12 19:20:16 +08:00
										 |  |  |         ssl_comp_free_compression_methods_int(); | 
					
						
							| 
									
										
										
										
											2016-02-09 19:26:14 +08:00
										 |  |  | #endif
 | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | /*
 | 
					
						
							|  |  |  |  * If this function is called with a non NULL settings value then it must be | 
					
						
							|  |  |  |  * called prior to any threads making calls to any OpenSSL functions, | 
					
						
							|  |  |  |  * i.e. passing a non-null settings value is assumed to be single-threaded. | 
					
						
							|  |  |  |  */ | 
					
						
							| 
									
										
										
										
											2016-08-06 01:03:17 +08:00
										 |  |  | int OPENSSL_init_ssl(uint64_t opts, const OPENSSL_INIT_SETTINGS * settings) | 
					
						
							| 
									
										
										
										
											2016-02-09 19:26:14 +08:00
										 |  |  | { | 
					
						
							| 
									
										
										
										
											2016-02-10 23:16:06 +08:00
										 |  |  |     static int stoperrset = 0; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     if (stopped) { | 
					
						
							|  |  |  |         if (!stoperrset) { | 
					
						
							|  |  |  |             /*
 | 
					
						
							|  |  |  |              * We only ever set this once to avoid getting into an infinite | 
					
						
							|  |  |  |              * loop where the error system keeps trying to init and fails so | 
					
						
							|  |  |  |              * sets an error etc | 
					
						
							|  |  |  |              */ | 
					
						
							|  |  |  |             stoperrset = 1; | 
					
						
							| 
									
										
										
										
											2020-11-04 19:18:33 +08:00
										 |  |  |             ERR_raise(ERR_LIB_SSL, ERR_R_INIT_FAIL); | 
					
						
							| 
									
										
										
										
											2016-02-10 23:16:06 +08:00
										 |  |  |         } | 
					
						
							| 
									
										
										
										
											2016-02-10 21:59:15 +08:00
										 |  |  |         return 0; | 
					
						
							| 
									
										
										
										
											2016-02-10 23:16:06 +08:00
										 |  |  |     } | 
					
						
							| 
									
										
										
										
											2016-02-10 13:39:29 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-01-01 15:53:24 +08:00
										 |  |  |     opts |= OPENSSL_INIT_ADD_ALL_CIPHERS | 
					
						
							| 
									
										
										
										
											2019-05-07 18:39:58 +08:00
										 |  |  |          |  OPENSSL_INIT_ADD_ALL_DIGESTS; | 
					
						
							| 
									
										
										
										
											2018-04-15 18:02:25 +08:00
										 |  |  | #ifndef OPENSSL_NO_AUTOLOAD_CONFIG
 | 
					
						
							| 
									
										
										
										
											2019-01-01 15:53:24 +08:00
										 |  |  |     if ((opts & OPENSSL_INIT_NO_LOAD_CONFIG) == 0) | 
					
						
							|  |  |  |         opts |= OPENSSL_INIT_LOAD_CONFIG; | 
					
						
							| 
									
										
										
										
											2018-04-15 18:02:25 +08:00
										 |  |  | #endif
 | 
					
						
							| 
									
										
										
										
											2019-01-01 15:53:24 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  |     if (!OPENSSL_init_crypto(opts, settings)) | 
					
						
							| 
									
										
										
										
											2016-02-10 21:59:15 +08:00
										 |  |  |         return 0; | 
					
						
							| 
									
										
										
										
											2016-02-09 19:26:14 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-03-31 02:19:56 +08:00
										 |  |  |     if (!RUN_ONCE(&ssl_base, ossl_init_ssl_base)) | 
					
						
							| 
									
										
										
										
											2016-03-02 22:51:00 +08:00
										 |  |  |         return 0; | 
					
						
							| 
									
										
										
										
											2016-02-09 19:26:14 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-03-02 22:51:00 +08:00
										 |  |  |     if ((opts & OPENSSL_INIT_NO_LOAD_SSL_STRINGS) | 
					
						
							| 
									
										
										
										
											2018-11-20 23:32:55 +08:00
										 |  |  |         && !RUN_ONCE_ALT(&ssl_strings, ossl_init_no_load_ssl_strings, | 
					
						
							|  |  |  |                          ossl_init_load_ssl_strings)) | 
					
						
							| 
									
										
										
										
											2016-03-02 22:51:00 +08:00
										 |  |  |         return 0; | 
					
						
							| 
									
										
										
										
											2016-02-09 19:26:14 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-03-02 22:51:00 +08:00
										 |  |  |     if ((opts & OPENSSL_INIT_LOAD_SSL_STRINGS) | 
					
						
							| 
									
										
										
										
											2016-08-06 01:03:17 +08:00
										 |  |  |         && !RUN_ONCE(&ssl_strings, ossl_init_load_ssl_strings)) | 
					
						
							| 
									
										
										
										
											2016-03-02 22:51:00 +08:00
										 |  |  |         return 0; | 
					
						
							| 
									
										
										
										
											2016-02-10 21:59:15 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  |     return 1; | 
					
						
							| 
									
										
										
										
											2016-02-09 19:26:14 +08:00
										 |  |  | } |