summaryrefslogtreecommitdiff
path: root/usr/src/lib/libipsecutil/common/ipsec_libssl_setup.c
diff options
context:
space:
mode:
authorJason King <jason.king@joyent.com>2018-02-27 00:07:42 -0600
committerDan McDonald <danmcd@joyent.com>2018-10-03 20:33:59 -0400
commitbdc560ab289d67ddebad9a2146fd36c2662d88b1 (patch)
treed0d0bdc16fb36e61e2d36eff46624d22123fa04d /usr/src/lib/libipsecutil/common/ipsec_libssl_setup.c
parent15aeb4d1148772724cf568e1f7a13fbb99f11ab8 (diff)
downloadillumos-gate-bdc560ab289d67ddebad9a2146fd36c2662d88b1.tar.gz
5159 ipsec_libssl_setup.c loads libcrypto
Reviewed by: Andy Fiddaman <andy@omniosce.org> Reviewed by: Igor Kozhukhov <igor@dilos.org> Reviewed by: Toomas Soome <tsoome@me.com> Approved by: Dan McDonald <danmcd@joyent.com>
Diffstat (limited to 'usr/src/lib/libipsecutil/common/ipsec_libssl_setup.c')
-rw-r--r--usr/src/lib/libipsecutil/common/ipsec_libssl_setup.c326
1 files changed, 0 insertions, 326 deletions
diff --git a/usr/src/lib/libipsecutil/common/ipsec_libssl_setup.c b/usr/src/lib/libipsecutil/common/ipsec_libssl_setup.c
deleted file mode 100644
index e63c1b51be..0000000000
--- a/usr/src/lib/libipsecutil/common/ipsec_libssl_setup.c
+++ /dev/null
@@ -1,326 +0,0 @@
-/*
- * Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com)
- * All rights reserved.
- *
- * This package is an SSL implementation written
- * by Eric Young (eay@cryptsoft.com).
- * The implementation was written so as to conform with Netscapes SSL.
- *
- * This library is free for commercial and non-commercial use as long as
- * the following conditions are aheared to. The following conditions
- * apply to all code found in this distribution, be it the RC4, RSA,
- * lhash, DES, etc., code; not just the SSL code. The SSL documentation
- * included with this distribution is covered by the same copyright terms
- * except that the holder is Tim Hudson (tjh@cryptsoft.com).
- *
- * Copyright remains Eric Young's, and as such any Copyright notices in
- * the code are not to be removed.
- * If this package is used in a product, Eric Young should be given attribution
- * as the author of the parts of the library used.
- * This can be in the form of a textual message at program startup or
- * in documentation (online or textual) provided with the package.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. All advertising materials mentioning features or use of this software
- * must display the following acknowledgement:
- * "This product includes cryptographic software written by
- * Eric Young (eay@cryptsoft.com)"
- * The word 'cryptographic' can be left out if the rouines from the library
- * being used are not cryptographic related :-).
- * 4. If you include any Windows specific code (or a derivative thereof) from
- * the apps directory (application code) you must include an acknowledgement:
- * "This product includes software written by Tim Hudson (tjh@cryptsoft.com)"
- *
- * THIS SOFTWARE IS PROVIDED BY ERIC YOUNG ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- *
- * The licence and distribution terms for any publically available version or
- * derivative of this code cannot be changed. i.e. this code cannot simply be
- * copied and put under another distribution licence
- * [including the GNU Public Licence.]
- */
-
-/*
- * Copyright 2009 Sun Microsystems, Inc. All rights reserved.
- * Use is subject to license terms.
- */
-
-/*
- * Thread setup portions of this code derived from
- * OpenSSL 0.9.x file mt/mttest.c examples
- */
-
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-#include <errno.h>
-#include <libintl.h>
-#include <synch.h>
-#include <thread.h>
-#include <dlfcn.h>
-#include <openssl/lhash.h>
-#include <openssl/crypto.h>
-#include <openssl/ssl.h>
-#include <openssl/err.h>
-#include "ipsec_util.h"
-
-/* OpenSSL function pointers */
-static X509_NAME *(*d2i_X509_NAME_fn)() = NULL;
-static int (*X509_NAME_print_ex_fp_fn)() = NULL;
-static char *(*ERR_get_error_fn)() = NULL;
-static char *(*ERR_error_string_fn)() = NULL;
-static void (*SSL_load_error_strings_fn)() = NULL;
-static void (*ERR_free_strings_fn)() = NULL;
-static void (*CRYPTO_set_locking_callback_fn)() = NULL;
-static void (*CRYPTO_set_id_callback_fn)() = NULL;
-static void (*X509_NAME_free_fn)() = NULL;
-static int (*CRYPTO_num_locks_fn)() = NULL;
-static void *(*OPENSSL_malloc_fn)() = NULL;
-static void (*OPENSSL_free_fn)() = NULL;
-
-static void solaris_locking_callback(int, int, char *, int);
-static unsigned long solaris_thread_id(void);
-static boolean_t thread_setup(void);
-/* LINTED E_STATIC_UNUSED */
-static void thread_cleanup(void);
-
-mutex_t init_lock = DEFAULTMUTEX;
-static mutex_t *lock_cs;
-static long *lock_count;
-
-static boolean_t libssl_loaded = B_FALSE;
-static boolean_t libcrypto_loaded = B_FALSE;
-
-void
-libssl_load()
-{
- void *dldesc;
-
- (void) mutex_lock(&init_lock);
- if (libssl_loaded) {
- (void) mutex_unlock(&init_lock);
- return;
- }
-
- dldesc = dlopen(LIBSSL, RTLD_LAZY);
- if (dldesc != NULL) {
- d2i_X509_NAME_fn = (X509_NAME*(*)())dlsym(dldesc,
- "d2i_X509_NAME");
- if (d2i_X509_NAME_fn == NULL)
- goto libssl_err;
-
- X509_NAME_print_ex_fp_fn = (int(*)())dlsym(dldesc,
- "X509_NAME_print_ex_fp");
- if (X509_NAME_print_ex_fp_fn == NULL)
- goto libssl_err;
-
- ERR_get_error_fn = (char *(*)())dlsym(dldesc,
- "ERR_get_error");
- if (ERR_get_error_fn == NULL)
- goto libssl_err;
-
- ERR_error_string_fn = (char *(*)())dlsym(dldesc,
- "ERR_error_string");
- if (ERR_error_string_fn == NULL)
- goto libssl_err;
-
- SSL_load_error_strings_fn = (void(*)())dlsym(dldesc,
- "SSL_load_error_strings");
- if (SSL_load_error_strings_fn == NULL)
- goto libssl_err;
-
- ERR_free_strings_fn = (void(*)())dlsym(dldesc,
- "ERR_free_strings");
- if (ERR_free_strings_fn == NULL)
- goto libssl_err;
-
- CRYPTO_set_locking_callback_fn = (void(*)())dlsym(dldesc,
- "CRYPTO_set_locking_callback");
- if (CRYPTO_set_locking_callback_fn == NULL)
- goto libssl_err;
-
- CRYPTO_set_id_callback_fn = (void(*)())dlsym(dldesc,
- "CRYPTO_set_id_callback");
- if (CRYPTO_set_id_callback_fn == NULL)
- goto libssl_err;
-
- X509_NAME_free_fn = (void(*)())dlsym(dldesc,
- "X509_NAME_free");
- if (X509_NAME_free_fn == NULL)
- goto libssl_err;
-
- if (thread_setup() == B_FALSE)
- goto libssl_err;
-
- libssl_loaded = B_TRUE;
- }
- (void) mutex_unlock(&init_lock);
- return;
-libssl_err:
- (void) dlclose(dldesc);
- (void) mutex_unlock(&init_lock);
-}
-
-void
-libcrypto_load()
-{
- void *dldesc;
-
- (void) mutex_lock(&init_lock);
- if (libcrypto_loaded) {
- (void) mutex_unlock(&init_lock);
- return;
- }
-
- dldesc = dlopen(LIBCRYPTO, RTLD_LAZY);
- if (dldesc != NULL) {
- CRYPTO_num_locks_fn = (int(*)())dlsym(dldesc,
- "CRYPTO_num_locks");
- if (CRYPTO_num_locks_fn == NULL)
- goto libcrypto_err;
-
- /*
- * OPENSSL_free is really a macro, so we
- * need to reference the actual symbol,
- * which is CRYPTO_free.
- */
- OPENSSL_free_fn = (void(*)())dlsym(dldesc,
- "CRYPTO_free");
- if (OPENSSL_free_fn == NULL)
- goto libcrypto_err;
-
- /*
- * OPENSSL_malloc is really a macro, so we
- * need to reference the actual symbol,
- * which is CRYPTO_malloc.
- */
- OPENSSL_malloc_fn = (void *(*)())dlsym(dldesc,
- "CRYPTO_malloc");
- if (OPENSSL_malloc_fn == NULL)
- goto libcrypto_err;
-
- libcrypto_loaded = B_TRUE;
- }
- (void) mutex_unlock(&init_lock);
- return;
-libcrypto_err:
- (void) dlclose(dldesc);
- (void) mutex_unlock(&init_lock);
-}
-
-static boolean_t
-thread_setup(void)
-{
- int i;
-
- if ((lock_cs = OPENSSL_malloc_fn(CRYPTO_num_locks_fn() *
- sizeof (mutex_t))) == NULL)
- return (B_FALSE);
- if ((lock_count = OPENSSL_malloc_fn(CRYPTO_num_locks_fn() *
- sizeof (long))) == NULL) {
- OPENSSL_free_fn(lock_cs);
- return (B_FALSE);
- }
-
- for (i = 0; i < CRYPTO_num_locks_fn(); i++) {
- lock_count[i] = 0;
- (void) mutex_init(&(lock_cs[i]), USYNC_THREAD, NULL);
- }
-
- CRYPTO_set_id_callback_fn((unsigned long (*)())solaris_thread_id);
- CRYPTO_set_locking_callback_fn((void (*)())solaris_locking_callback);
- return (B_TRUE);
-}
-
-static void
-thread_cleanup(void)
-{
- int i;
-
- (void) mutex_lock(&init_lock);
- CRYPTO_set_locking_callback_fn(NULL);
- CRYPTO_set_id_callback_fn(NULL);
- for (i = 0; i < CRYPTO_num_locks_fn(); i++)
- (void) mutex_destroy(&(lock_cs[i]));
- OPENSSL_free_fn(lock_cs);
- OPENSSL_free_fn(lock_count);
- (void) mutex_unlock(&init_lock);
-}
-
-/* ARGSUSED */
-static void
-solaris_locking_callback(int mode, int type, char *file, int line)
-{
- if (mode & CRYPTO_LOCK) {
- (void) mutex_lock(&(lock_cs[type]));
- lock_count[type]++;
- } else {
- (void) mutex_unlock(&(lock_cs[type]));
- }
-}
-
-static unsigned long
-solaris_thread_id(void)
-{
- unsigned long ret;
-
- ret = (unsigned long)thr_self();
- return (ret);
-}
-
-void
-print_asn1_name(FILE *file, const unsigned char *buf, long buflen)
-{
- libcrypto_load();
- if (libcrypto_loaded)
- libssl_load();
-
- if (libssl_loaded && libcrypto_loaded) {
- X509_NAME *x509name = NULL;
- const unsigned char *p;
-
- /* Make an effort to decode the ASN1 encoded name */
- SSL_load_error_strings_fn();
-
- /*
- * Temporary variable is mandatory per d2i_X509(3). Upcoming
- * call to d2i_X509_NAME_fn() will change the 'p' pointer.
- */
- p = buf;
-
- x509name = d2i_X509_NAME_fn(NULL, &p, buflen);
- if (x509name != NULL) {
- (void) X509_NAME_print_ex_fp_fn(file, x509name, 0,
- (ASN1_STRFLGS_RFC2253 | ASN1_STRFLGS_ESC_QUOTE |
- XN_FLAG_SEP_CPLUS_SPC | XN_FLAG_FN_SN));
- X509_NAME_free_fn(x509name);
- (void) fprintf(file, "\n");
- } else {
- char errbuf[80];
-
- (void) fprintf(file, "\n# %s\n",
- ERR_error_string_fn(ERR_get_error_fn(), errbuf));
- (void) fprintf(file, dgettext(TEXT_DOMAIN,
- "<cannot interpret>\n"));
- }
- ERR_free_strings_fn();
- } else {
- (void) fprintf(file, dgettext(TEXT_DOMAIN, "<cannot print>\n"));
- }
-}