| 
									
										
										
										
											2016-10-18 21:16:35 +08:00
										 |  |  | /*
 | 
					
						
							| 
									
										
										
										
											2017-06-17 04:10:11 +08:00
										 |  |  |  * Copyright 2016-2017 The OpenSSL Project Authors. All Rights Reserved. | 
					
						
							| 
									
										
										
										
											2016-10-18 21:16:35 +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
 | 
					
						
							|  |  |  |  */ | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | #include <stdio.h>
 | 
					
						
							|  |  |  | #include <string.h>
 | 
					
						
							|  |  |  | #include <stdlib.h>
 | 
					
						
							|  |  |  | #include <openssl/opensslv.h>
 | 
					
						
							| 
									
										
										
										
											2017-05-06 05:39:13 +08:00
										 |  |  | #include <openssl/ssl.h>
 | 
					
						
							|  |  |  | #include <openssl/ossl_typ.h>
 | 
					
						
							|  |  |  | #include "testutil.h"
 | 
					
						
							| 
									
										
										
										
											2016-10-18 21:16:35 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  | typedef const SSL_METHOD * (*TLS_method_t)(void); | 
					
						
							|  |  |  | typedef SSL_CTX * (*SSL_CTX_new_t)(const SSL_METHOD *meth); | 
					
						
							|  |  |  | typedef void (*SSL_CTX_free_t)(SSL_CTX *); | 
					
						
							|  |  |  | typedef unsigned long (*ERR_get_error_t)(void); | 
					
						
							|  |  |  | typedef unsigned long (*OpenSSL_version_num_t)(void); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-05-06 19:59:18 +08:00
										 |  |  | typedef enum test_types_en { | 
					
						
							|  |  |  |     CRYPTO_FIRST, | 
					
						
							|  |  |  |     SSL_FIRST, | 
					
						
							|  |  |  |     JUST_CRYPTO | 
					
						
							|  |  |  | } TEST_TYPE; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | static TEST_TYPE test_type; | 
					
						
							|  |  |  | static const char *path_crypto; | 
					
						
							|  |  |  | static const char *path_ssl; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-10-18 21:16:35 +08:00
										 |  |  | #ifdef DSO_DLFCN
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | # include <dlfcn.h>
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-05-06 19:59:18 +08:00
										 |  |  | # define SHLIB_INIT NULL
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-05-06 05:39:13 +08:00
										 |  |  | typedef void *SHLIB; | 
					
						
							|  |  |  | typedef void *SHLIB_SYM; | 
					
						
							| 
									
										
										
										
											2016-10-18 21:16:35 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-11-04 01:48:23 +08:00
										 |  |  | static int shlib_load(const char *filename, SHLIB *lib) | 
					
						
							| 
									
										
										
										
											2016-10-18 21:16:35 +08:00
										 |  |  | { | 
					
						
							| 
									
										
										
										
											2016-11-04 01:48:23 +08:00
										 |  |  |     *lib = dlopen(filename, RTLD_GLOBAL | RTLD_LAZY); | 
					
						
							| 
									
										
										
										
											2017-05-06 05:39:13 +08:00
										 |  |  |     return *lib == NULL ? 0 : 1; | 
					
						
							| 
									
										
										
										
											2016-10-18 21:16:35 +08:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | static int shlib_sym(SHLIB lib, const char *symname, SHLIB_SYM *sym) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |     *sym = dlsym(lib, symname); | 
					
						
							|  |  |  |     return *sym != NULL; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-05-06 19:59:18 +08:00
										 |  |  | # ifdef OPENSSL_USE_NODELETE
 | 
					
						
							| 
									
										
										
										
											2016-10-18 21:16:35 +08:00
										 |  |  | static int shlib_close(SHLIB lib) | 
					
						
							|  |  |  | { | 
					
						
							| 
									
										
										
										
											2017-05-06 05:39:13 +08:00
										 |  |  |     return dlclose(lib) != 0 ? 0 : 1; | 
					
						
							| 
									
										
										
										
											2016-10-18 21:16:35 +08:00
										 |  |  | } | 
					
						
							| 
									
										
										
										
											2017-05-06 19:59:18 +08:00
										 |  |  | # endif
 | 
					
						
							| 
									
										
										
										
											2017-05-06 05:39:13 +08:00
										 |  |  | #endif
 | 
					
						
							| 
									
										
										
										
											2016-10-18 21:16:35 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-05-06 05:39:13 +08:00
										 |  |  | #ifdef DSO_WIN32
 | 
					
						
							| 
									
										
										
										
											2016-10-18 21:16:35 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  | # include <windows.h>
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-05-06 19:59:18 +08:00
										 |  |  | # define SHLIB_INIT 0
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-10-18 21:16:35 +08:00
										 |  |  | typedef HINSTANCE SHLIB; | 
					
						
							| 
									
										
										
										
											2017-05-06 05:39:13 +08:00
										 |  |  | typedef void *SHLIB_SYM; | 
					
						
							| 
									
										
										
										
											2016-10-18 21:16:35 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-11-04 01:48:23 +08:00
										 |  |  | static int shlib_load(const char *filename, SHLIB *lib) | 
					
						
							| 
									
										
										
										
											2016-10-18 21:16:35 +08:00
										 |  |  | { | 
					
						
							|  |  |  |     *lib = LoadLibraryA(filename); | 
					
						
							| 
									
										
										
										
											2017-05-06 05:39:13 +08:00
										 |  |  |     return *lib == NULL ? 0 : 1; | 
					
						
							| 
									
										
										
										
											2016-10-18 21:16:35 +08:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | static int shlib_sym(SHLIB lib, const char *symname, SHLIB_SYM *sym) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |     *sym = (SHLIB_SYM)GetProcAddress(lib, symname); | 
					
						
							|  |  |  |     return *sym != NULL; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-05-06 19:59:18 +08:00
										 |  |  | # ifdef OPENSSL_USE_NODELETE
 | 
					
						
							| 
									
										
										
										
											2016-10-18 21:16:35 +08:00
										 |  |  | static int shlib_close(SHLIB lib) | 
					
						
							|  |  |  | { | 
					
						
							| 
									
										
										
										
											2017-05-06 05:39:13 +08:00
										 |  |  |     return FreeLibrary(lib) == 0 ? 0 : 1; | 
					
						
							| 
									
										
										
										
											2016-10-18 21:16:35 +08:00
										 |  |  | } | 
					
						
							| 
									
										
										
										
											2017-05-06 19:59:18 +08:00
										 |  |  | # endif
 | 
					
						
							| 
									
										
										
										
											2016-10-18 21:16:35 +08:00
										 |  |  | #endif
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-05-06 19:59:18 +08:00
										 |  |  | #if defined(DSO_DLFCN) || defined(DSO_WIN32)
 | 
					
						
							| 
									
										
										
										
											2017-05-06 05:39:13 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  | static int test_lib(void) | 
					
						
							| 
									
										
										
										
											2016-10-18 21:16:35 +08:00
										 |  |  | { | 
					
						
							| 
									
										
										
										
											2017-05-06 05:39:13 +08:00
										 |  |  |     SHLIB ssllib = SHLIB_INIT; | 
					
						
							|  |  |  |     SHLIB cryptolib = SHLIB_INIT; | 
					
						
							| 
									
										
										
										
											2016-10-18 21:16:35 +08:00
										 |  |  |     SSL_CTX *ctx; | 
					
						
							|  |  |  |     union { | 
					
						
							| 
									
										
										
										
											2017-05-06 05:39:13 +08:00
										 |  |  |         void (*func)(void); | 
					
						
							| 
									
										
										
										
											2016-10-18 21:16:35 +08:00
										 |  |  |         SHLIB_SYM sym; | 
					
						
							| 
									
										
										
										
											2017-05-06 05:39:13 +08:00
										 |  |  |     } symbols[3]; | 
					
						
							|  |  |  |     TLS_method_t myTLS_method; | 
					
						
							|  |  |  |     SSL_CTX_new_t mySSL_CTX_new; | 
					
						
							|  |  |  |     SSL_CTX_free_t mySSL_CTX_free; | 
					
						
							|  |  |  |     ERR_get_error_t myERR_get_error; | 
					
						
							|  |  |  |     OpenSSL_version_num_t myOpenSSL_version_num; | 
					
						
							|  |  |  |     int result = 0; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     switch (test_type) { | 
					
						
							|  |  |  |     case JUST_CRYPTO: | 
					
						
							|  |  |  |         if (!TEST_true(shlib_load(path_crypto, &cryptolib))) | 
					
						
							|  |  |  |             goto end; | 
					
						
							|  |  |  |         break; | 
					
						
							|  |  |  |     case CRYPTO_FIRST: | 
					
						
							|  |  |  |         if (!TEST_true(shlib_load(path_crypto, &cryptolib)) | 
					
						
							|  |  |  |                 || !TEST_true(shlib_load(path_ssl, &ssllib))) | 
					
						
							|  |  |  |             goto end; | 
					
						
							| 
									
										
										
										
											2017-06-17 04:10:11 +08:00
										 |  |  |         break; | 
					
						
							| 
									
										
										
										
											2017-05-06 05:39:13 +08:00
										 |  |  |     case SSL_FIRST: | 
					
						
							|  |  |  |         if (!TEST_true(shlib_load(path_ssl, &ssllib)) | 
					
						
							|  |  |  |                 || !TEST_true(shlib_load(path_crypto, &cryptolib))) | 
					
						
							|  |  |  |             goto end; | 
					
						
							|  |  |  |         break; | 
					
						
							| 
									
										
										
										
											2016-10-18 21:16:35 +08:00
										 |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     if (test_type != JUST_CRYPTO) { | 
					
						
							| 
									
										
										
										
											2017-05-06 05:39:13 +08:00
										 |  |  |         if (!TEST_true(shlib_sym(ssllib, "TLS_method", &symbols[0].sym)) | 
					
						
							|  |  |  |                 || !TEST_true(shlib_sym(ssllib, "SSL_CTX_new", &symbols[1].sym)) | 
					
						
							|  |  |  |                 || !TEST_true(shlib_sym(ssllib, "SSL_CTX_free", &symbols[2].sym))) | 
					
						
							|  |  |  |             goto end; | 
					
						
							|  |  |  |         myTLS_method = (TLS_method_t)symbols[0].func; | 
					
						
							|  |  |  |         mySSL_CTX_new = (SSL_CTX_new_t)symbols[1].func; | 
					
						
							|  |  |  |         mySSL_CTX_free = (SSL_CTX_free_t)symbols[2].func; | 
					
						
							|  |  |  |         if (!TEST_ptr(ctx = mySSL_CTX_new(myTLS_method()))) | 
					
						
							|  |  |  |             goto end; | 
					
						
							|  |  |  |         mySSL_CTX_free(ctx); | 
					
						
							| 
									
										
										
										
											2016-10-18 21:16:35 +08:00
										 |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-05-06 05:39:13 +08:00
										 |  |  |     if (!TEST_true(shlib_sym(cryptolib, "ERR_get_error", &symbols[0].sym)) | 
					
						
							|  |  |  |             || !TEST_true(shlib_sym(cryptolib, "OpenSSL_version_num", | 
					
						
							|  |  |  |                                     &symbols[1].sym))) | 
					
						
							|  |  |  |         goto end; | 
					
						
							|  |  |  |     myERR_get_error = (ERR_get_error_t)symbols[0].func; | 
					
						
							|  |  |  |     if (!TEST_int_eq(myERR_get_error(), 0)) | 
					
						
							|  |  |  |         goto end; | 
					
						
							|  |  |  |     myOpenSSL_version_num = (OpenSSL_version_num_t)symbols[1].func; | 
					
						
							|  |  |  |     if (!TEST_int_eq(myOpenSSL_version_num(), OPENSSL_VERSION_NUMBER)) | 
					
						
							|  |  |  |         goto end; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-05-06 19:59:18 +08:00
										 |  |  | #ifdef OPENSSL_USE_NODELETE
 | 
					
						
							| 
									
										
										
										
											2017-05-06 05:39:13 +08:00
										 |  |  |     switch (test_type) { | 
					
						
							|  |  |  |     case JUST_CRYPTO: | 
					
						
							|  |  |  |         if (!TEST_true(shlib_close(cryptolib))) | 
					
						
							|  |  |  |             goto end; | 
					
						
							|  |  |  |         break; | 
					
						
							|  |  |  |     case CRYPTO_FIRST: | 
					
						
							|  |  |  |         if (!TEST_true(shlib_close(cryptolib)) | 
					
						
							|  |  |  |                 || !TEST_true(shlib_close(ssllib))) | 
					
						
							|  |  |  |             goto end; | 
					
						
							| 
									
										
										
										
											2017-06-17 04:10:11 +08:00
										 |  |  |         break; | 
					
						
							| 
									
										
										
										
											2017-05-06 05:39:13 +08:00
										 |  |  |     case SSL_FIRST: | 
					
						
							|  |  |  |         if (!TEST_true(shlib_close(ssllib)) | 
					
						
							|  |  |  |                 || !TEST_true(shlib_close(cryptolib))) | 
					
						
							|  |  |  |             goto end; | 
					
						
							|  |  |  |         break; | 
					
						
							| 
									
										
										
										
											2016-10-18 21:16:35 +08:00
										 |  |  |     } | 
					
						
							| 
									
										
										
										
											2017-05-06 19:59:18 +08:00
										 |  |  | #endif
 | 
					
						
							| 
									
										
										
										
											2016-10-18 21:16:35 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-05-06 05:39:13 +08:00
										 |  |  |     result = 1; | 
					
						
							|  |  |  | end: | 
					
						
							|  |  |  |     return result; | 
					
						
							|  |  |  | } | 
					
						
							| 
									
										
										
										
											2017-05-06 19:59:18 +08:00
										 |  |  | #endif
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-10-18 21:16:35 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-07-18 09:48:27 +08:00
										 |  |  | int setup_tests(void) | 
					
						
							| 
									
										
										
										
											2017-05-06 05:39:13 +08:00
										 |  |  | { | 
					
						
							| 
									
										
										
										
											2017-07-18 09:48:27 +08:00
										 |  |  |     const char *p = test_get_argument(0); | 
					
						
							| 
									
										
										
										
											2016-10-18 21:16:35 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-07-18 09:48:27 +08:00
										 |  |  |     if (strcmp(p, "-crypto_first") == 0) { | 
					
						
							| 
									
										
										
										
											2017-05-06 05:39:13 +08:00
										 |  |  |         test_type = CRYPTO_FIRST; | 
					
						
							| 
									
										
										
										
											2017-07-18 09:48:27 +08:00
										 |  |  |     } else if (strcmp(p, "-ssl_first") == 0) { | 
					
						
							| 
									
										
										
										
											2017-05-06 05:39:13 +08:00
										 |  |  |         test_type = SSL_FIRST; | 
					
						
							| 
									
										
										
										
											2017-07-18 09:48:27 +08:00
										 |  |  |     } else if (strcmp(p, "-just_crypto") == 0) { | 
					
						
							| 
									
										
										
										
											2017-05-06 05:39:13 +08:00
										 |  |  |         test_type = JUST_CRYPTO; | 
					
						
							|  |  |  |     } else { | 
					
						
							|  |  |  |         TEST_error("Unrecognised argument"); | 
					
						
							| 
									
										
										
										
											2017-07-18 09:48:27 +08:00
										 |  |  |         return 0; | 
					
						
							| 
									
										
										
										
											2016-10-18 21:16:35 +08:00
										 |  |  |     } | 
					
						
							| 
									
										
										
										
											2017-07-18 09:48:27 +08:00
										 |  |  |     if (!TEST_ptr(path_crypto = test_get_argument(1)) | 
					
						
							|  |  |  |             || !TEST_ptr(path_ssl = test_get_argument(2))) | 
					
						
							|  |  |  |         return 0; | 
					
						
							| 
									
										
										
										
											2016-10-18 21:16:35 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-05-06 19:59:18 +08:00
										 |  |  | #if defined(DSO_DLFCN) || defined(DSO_WIN32)
 | 
					
						
							| 
									
										
										
										
											2017-05-06 05:39:13 +08:00
										 |  |  |     ADD_TEST(test_lib); | 
					
						
							| 
									
										
										
										
											2017-05-06 19:59:18 +08:00
										 |  |  | #endif
 | 
					
						
							| 
									
										
										
										
											2017-07-18 09:48:27 +08:00
										 |  |  |     return 1; | 
					
						
							| 
									
										
										
										
											2016-10-18 21:16:35 +08:00
										 |  |  | } |