| 
									
										
										
										
											2016-02-09 19:26:14 +08:00
										 |  |  | /*
 | 
					
						
							| 
									
										
										
										
											2016-05-18 02:18:30 +08:00
										 |  |  |  * Copyright 2016 The OpenSSL Project Authors. All Rights Reserved. | 
					
						
							| 
									
										
										
										
											2016-02-09 19:26:14 +08:00
										 |  |  |  * | 
					
						
							| 
									
										
										
										
											2016-05-18 02:18:30 +08:00
										 |  |  |  * Licensed under the OpenSSL license (the "License").  You may not use | 
					
						
							|  |  |  |  * 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
										 |  |  |  */ | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-02-09 21:12:34 +08:00
										 |  |  | #include "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>
 | 
					
						
							| 
									
										
										
										
											2016-02-10 13:39:29 +08:00
										 |  |  | #include <assert.h>
 | 
					
						
							| 
									
										
										
										
											2016-02-09 19:26:14 +08:00
										 |  |  | #include "ssl_locl.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
										 |  |  | { | 
					
						
							|  |  |  | #ifdef OPENSSL_INIT_DEBUG
 | 
					
						
							|  |  |  |     fprintf(stderr, "OPENSSL_INIT: ossl_init_ssl_base: " | 
					
						
							| 
									
										
										
										
											2016-08-06 01:03:17 +08:00
										 |  |  |             "Adding SSL ciphers and digests\n"); | 
					
						
							| 
									
										
										
										
											2016-02-09 19:26:14 +08:00
										 |  |  | #endif
 | 
					
						
							|  |  |  | #ifndef OPENSSL_NO_DES
 | 
					
						
							|  |  |  |     EVP_add_cipher(EVP_des_cbc()); | 
					
						
							|  |  |  |     EVP_add_cipher(EVP_des_ede3_cbc()); | 
					
						
							|  |  |  | #endif
 | 
					
						
							|  |  |  | #ifndef OPENSSL_NO_IDEA
 | 
					
						
							|  |  |  |     EVP_add_cipher(EVP_idea_cbc()); | 
					
						
							|  |  |  | #endif
 | 
					
						
							|  |  |  | #ifndef OPENSSL_NO_RC4
 | 
					
						
							|  |  |  |     EVP_add_cipher(EVP_rc4()); | 
					
						
							|  |  |  | # ifndef OPENSSL_NO_MD5
 | 
					
						
							|  |  |  |     EVP_add_cipher(EVP_rc4_hmac_md5()); | 
					
						
							|  |  |  | # endif
 | 
					
						
							|  |  |  | #endif
 | 
					
						
							|  |  |  | #ifndef OPENSSL_NO_RC2
 | 
					
						
							|  |  |  |     EVP_add_cipher(EVP_rc2_cbc()); | 
					
						
							|  |  |  |     /*
 | 
					
						
							|  |  |  |      * Not actually used for SSL/TLS but this makes PKCS#12 work if an | 
					
						
							|  |  |  |      * application only calls SSL_library_init(). | 
					
						
							|  |  |  |      */ | 
					
						
							|  |  |  |     EVP_add_cipher(EVP_rc2_40_cbc()); | 
					
						
							|  |  |  | #endif
 | 
					
						
							|  |  |  |     EVP_add_cipher(EVP_aes_128_cbc()); | 
					
						
							|  |  |  |     EVP_add_cipher(EVP_aes_192_cbc()); | 
					
						
							|  |  |  |     EVP_add_cipher(EVP_aes_256_cbc()); | 
					
						
							|  |  |  |     EVP_add_cipher(EVP_aes_128_gcm()); | 
					
						
							|  |  |  |     EVP_add_cipher(EVP_aes_256_gcm()); | 
					
						
							|  |  |  |     EVP_add_cipher(EVP_aes_128_ccm()); | 
					
						
							|  |  |  |     EVP_add_cipher(EVP_aes_256_ccm()); | 
					
						
							|  |  |  |     EVP_add_cipher(EVP_aes_128_cbc_hmac_sha1()); | 
					
						
							|  |  |  |     EVP_add_cipher(EVP_aes_256_cbc_hmac_sha1()); | 
					
						
							|  |  |  |     EVP_add_cipher(EVP_aes_128_cbc_hmac_sha256()); | 
					
						
							|  |  |  |     EVP_add_cipher(EVP_aes_256_cbc_hmac_sha256()); | 
					
						
							|  |  |  | #ifndef OPENSSL_NO_CAMELLIA
 | 
					
						
							|  |  |  |     EVP_add_cipher(EVP_camellia_128_cbc()); | 
					
						
							|  |  |  |     EVP_add_cipher(EVP_camellia_256_cbc()); | 
					
						
							|  |  |  | #endif
 | 
					
						
							|  |  |  | #if !defined(OPENSSL_NO_CHACHA) && !defined(OPENSSL_NO_POLY1305)
 | 
					
						
							|  |  |  |     EVP_add_cipher(EVP_chacha20_poly1305()); | 
					
						
							|  |  |  | #endif
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | #ifndef OPENSSL_NO_SEED
 | 
					
						
							|  |  |  |     EVP_add_cipher(EVP_seed_cbc()); | 
					
						
							|  |  |  | #endif
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | #ifndef OPENSSL_NO_MD5
 | 
					
						
							|  |  |  |     EVP_add_digest(EVP_md5()); | 
					
						
							|  |  |  |     EVP_add_digest_alias(SN_md5, "ssl3-md5"); | 
					
						
							|  |  |  |     EVP_add_digest(EVP_md5_sha1()); | 
					
						
							|  |  |  | #endif
 | 
					
						
							|  |  |  |     EVP_add_digest(EVP_sha1()); /* RSA with sha1 */ | 
					
						
							|  |  |  |     EVP_add_digest_alias(SN_sha1, "ssl3-sha1"); | 
					
						
							|  |  |  |     EVP_add_digest_alias(SN_sha1WithRSAEncryption, SN_sha1WithRSA); | 
					
						
							|  |  |  |     EVP_add_digest(EVP_sha224()); | 
					
						
							|  |  |  |     EVP_add_digest(EVP_sha256()); | 
					
						
							|  |  |  |     EVP_add_digest(EVP_sha384()); | 
					
						
							|  |  |  |     EVP_add_digest(EVP_sha512()); | 
					
						
							|  |  |  | #ifndef OPENSSL_NO_COMP
 | 
					
						
							| 
									
										
										
										
											2016-08-06 01:03:17 +08:00
										 |  |  | # ifdef OPENSSL_INIT_DEBUG
 | 
					
						
							| 
									
										
										
										
											2016-02-09 19:26:14 +08:00
										 |  |  |     fprintf(stderr, "OPENSSL_INIT: ossl_init_ssl_base: " | 
					
						
							| 
									
										
										
										
											2016-08-06 01:03:17 +08:00
										 |  |  |             "SSL_COMP_get_compression_methods()\n"); | 
					
						
							|  |  |  | # endif
 | 
					
						
							| 
									
										
										
										
											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
 | 
					
						
							|  |  |  |     /* initialize cipher/digest methods table */ | 
					
						
							|  |  |  |     ssl_load_ciphers(); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | #ifdef OPENSSL_INIT_DEBUG
 | 
					
						
							|  |  |  |     fprintf(stderr, "OPENSSL_INIT: ossl_init_ssl_base: " | 
					
						
							| 
									
										
										
										
											2016-08-06 01:03:17 +08:00
										 |  |  |             "SSL_add_ssl_module()\n"); | 
					
						
							| 
									
										
										
										
											2016-02-09 19:26:14 +08:00
										 |  |  | #endif
 | 
					
						
							|  |  |  |     SSL_add_ssl_module(); | 
					
						
							|  |  |  |     /*
 | 
					
						
							|  |  |  |      * 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; | 
					
						
							| 
									
										
										
										
											2016-02-09 19:26:14 +08:00
										 |  |  | static int ssl_strings_inited = 0; | 
					
						
							| 
									
										
										
										
											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)
 | 
					
						
							|  |  |  | # ifdef OPENSSL_INIT_DEBUG
 | 
					
						
							| 
									
										
										
										
											2016-08-06 01:03:17 +08:00
										 |  |  |     fprintf(stderr, "OPENSSL_INIT: ossl_init_load_ssl_strings: " | 
					
						
							|  |  |  |             "ERR_load_SSL_strings()\n"); | 
					
						
							| 
									
										
										
										
											2016-02-09 17:39:07 +08:00
										 |  |  | # endif
 | 
					
						
							| 
									
										
										
										
											2016-02-09 19:26:14 +08:00
										 |  |  |     ERR_load_SSL_strings(); | 
					
						
							| 
									
										
										
										
											2016-02-09 17:39:07 +08:00
										 |  |  | #endif
 | 
					
						
							| 
									
										
										
										
											2016-02-09 19:26:14 +08:00
										 |  |  |     ssl_strings_inited = 1; | 
					
						
							| 
									
										
										
										
											2016-07-20 01:42:11 +08:00
										 |  |  |     return 1; | 
					
						
							| 
									
										
										
										
											2016-02-09 19:26:14 +08:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-07-20 01:42:11 +08:00
										 |  |  | DEFINE_RUN_ONCE_STATIC(ossl_init_no_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
 | 
					
						
							| 
									
										
										
										
											2016-08-06 01:03:17 +08:00
										 |  |  | # ifdef OPENSSL_INIT_DEBUG
 | 
					
						
							| 
									
										
										
										
											2016-02-09 19:26:14 +08:00
										 |  |  |         fprintf(stderr, "OPENSSL_INIT: ssl_library_stop: " | 
					
						
							| 
									
										
										
										
											2016-08-06 01:03:17 +08:00
										 |  |  |                 "ssl_comp_free_compression_methods_int()\n"); | 
					
						
							|  |  |  | # endif
 | 
					
						
							| 
									
										
										
										
											2016-04-12 19:20:16 +08:00
										 |  |  |         ssl_comp_free_compression_methods_int(); | 
					
						
							| 
									
										
										
										
											2016-02-09 19:26:14 +08:00
										 |  |  | #endif
 | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     if (ssl_strings_inited) { | 
					
						
							|  |  |  | #ifdef OPENSSL_INIT_DEBUG
 | 
					
						
							|  |  |  |         fprintf(stderr, "OPENSSL_INIT: ssl_library_stop: " | 
					
						
							| 
									
										
										
										
											2016-08-06 01:03:17 +08:00
										 |  |  |                 "err_free_strings_int()\n"); | 
					
						
							| 
									
										
										
										
											2016-02-09 19:26:14 +08:00
										 |  |  | #endif
 | 
					
						
							|  |  |  |         /*
 | 
					
						
							|  |  |  |          * If both crypto and ssl error strings are inited we will end up | 
					
						
							| 
									
										
										
										
											2016-04-12 19:20:16 +08:00
										 |  |  |          * calling err_free_strings_int() twice - but that's ok. The second | 
					
						
							| 
									
										
										
										
											2016-04-04 20:43:58 +08:00
										 |  |  |          * time will be a no-op. It's easier to do that than to try and track | 
					
						
							| 
									
										
										
										
											2016-02-09 19:26:14 +08:00
										 |  |  |          * between the two libraries whether they have both been inited. | 
					
						
							|  |  |  |          */ | 
					
						
							| 
									
										
										
										
											2016-04-12 19:20:16 +08:00
										 |  |  |         err_free_strings_int(); | 
					
						
							| 
									
										
										
										
											2016-02-09 19:26:14 +08:00
										 |  |  |     } | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | /*
 | 
					
						
							|  |  |  |  * 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; | 
					
						
							| 
									
										
										
										
											2016-02-11 04:20:48 +08:00
										 |  |  |             SSLerr(SSL_F_OPENSSL_INIT_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
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-02-10 21:59:15 +08:00
										 |  |  |     if (!OPENSSL_init_crypto(opts | OPENSSL_INIT_ADD_ALL_CIPHERS | 
					
						
							|  |  |  |                              | OPENSSL_INIT_ADD_ALL_DIGESTS, settings)) | 
					
						
							|  |  |  |         return 0; | 
					
						
							| 
									
										
										
										
											2016-02-09 19:26:14 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-07-20 01:42:11 +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) | 
					
						
							| 
									
										
										
										
											2016-08-06 01:03:17 +08:00
										 |  |  |         && !RUN_ONCE(&ssl_strings, ossl_init_no_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
										 |  |  | } |