annotate usr/src/lib/libkmsagent/common/k_setupssl.c @ 12720:3db6e0082404

PSARC 2010/195 PKCS11 KMS Provider 6944296 Solaris needs a PKCS#11 provider to allow access to KMS keystore functionality
author Wyllys Ingersoll <Wyllys.Ingersoll@Sun.COM>
date Mon, 28 Jun 2010 16:04:11 -0700
parents
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
12720
3db6e0082404 PSARC 2010/195 PKCS11 KMS Provider
Wyllys Ingersoll <Wyllys.Ingersoll@Sun.COM>
parents:
diff changeset
1 /*
3db6e0082404 PSARC 2010/195 PKCS11 KMS Provider
Wyllys Ingersoll <Wyllys.Ingersoll@Sun.COM>
parents:
diff changeset
2 * CDDL HEADER START
3db6e0082404 PSARC 2010/195 PKCS11 KMS Provider
Wyllys Ingersoll <Wyllys.Ingersoll@Sun.COM>
parents:
diff changeset
3 *
3db6e0082404 PSARC 2010/195 PKCS11 KMS Provider
Wyllys Ingersoll <Wyllys.Ingersoll@Sun.COM>
parents:
diff changeset
4 * The contents of this file are subject to the terms of the
3db6e0082404 PSARC 2010/195 PKCS11 KMS Provider
Wyllys Ingersoll <Wyllys.Ingersoll@Sun.COM>
parents:
diff changeset
5 * Common Development and Distribution License (the "License").
3db6e0082404 PSARC 2010/195 PKCS11 KMS Provider
Wyllys Ingersoll <Wyllys.Ingersoll@Sun.COM>
parents:
diff changeset
6 * You may not use this file except in compliance with the License.
3db6e0082404 PSARC 2010/195 PKCS11 KMS Provider
Wyllys Ingersoll <Wyllys.Ingersoll@Sun.COM>
parents:
diff changeset
7 *
3db6e0082404 PSARC 2010/195 PKCS11 KMS Provider
Wyllys Ingersoll <Wyllys.Ingersoll@Sun.COM>
parents:
diff changeset
8 * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
3db6e0082404 PSARC 2010/195 PKCS11 KMS Provider
Wyllys Ingersoll <Wyllys.Ingersoll@Sun.COM>
parents:
diff changeset
9 * or http://www.opensolaris.org/os/licensing.
3db6e0082404 PSARC 2010/195 PKCS11 KMS Provider
Wyllys Ingersoll <Wyllys.Ingersoll@Sun.COM>
parents:
diff changeset
10 * See the License for the specific language governing permissions
3db6e0082404 PSARC 2010/195 PKCS11 KMS Provider
Wyllys Ingersoll <Wyllys.Ingersoll@Sun.COM>
parents:
diff changeset
11 * and limitations under the License.
3db6e0082404 PSARC 2010/195 PKCS11 KMS Provider
Wyllys Ingersoll <Wyllys.Ingersoll@Sun.COM>
parents:
diff changeset
12 *
3db6e0082404 PSARC 2010/195 PKCS11 KMS Provider
Wyllys Ingersoll <Wyllys.Ingersoll@Sun.COM>
parents:
diff changeset
13 * When distributing Covered Code, include this CDDL HEADER in each
3db6e0082404 PSARC 2010/195 PKCS11 KMS Provider
Wyllys Ingersoll <Wyllys.Ingersoll@Sun.COM>
parents:
diff changeset
14 * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
3db6e0082404 PSARC 2010/195 PKCS11 KMS Provider
Wyllys Ingersoll <Wyllys.Ingersoll@Sun.COM>
parents:
diff changeset
15 * If applicable, add the following below this CDDL HEADER, with the
3db6e0082404 PSARC 2010/195 PKCS11 KMS Provider
Wyllys Ingersoll <Wyllys.Ingersoll@Sun.COM>
parents:
diff changeset
16 * fields enclosed by brackets "[]" replaced with your own identifying
3db6e0082404 PSARC 2010/195 PKCS11 KMS Provider
Wyllys Ingersoll <Wyllys.Ingersoll@Sun.COM>
parents:
diff changeset
17 * information: Portions Copyright [yyyy] [name of copyright owner]
3db6e0082404 PSARC 2010/195 PKCS11 KMS Provider
Wyllys Ingersoll <Wyllys.Ingersoll@Sun.COM>
parents:
diff changeset
18 *
3db6e0082404 PSARC 2010/195 PKCS11 KMS Provider
Wyllys Ingersoll <Wyllys.Ingersoll@Sun.COM>
parents:
diff changeset
19 * CDDL HEADER END
3db6e0082404 PSARC 2010/195 PKCS11 KMS Provider
Wyllys Ingersoll <Wyllys.Ingersoll@Sun.COM>
parents:
diff changeset
20 */
3db6e0082404 PSARC 2010/195 PKCS11 KMS Provider
Wyllys Ingersoll <Wyllys.Ingersoll@Sun.COM>
parents:
diff changeset
21
3db6e0082404 PSARC 2010/195 PKCS11 KMS Provider
Wyllys Ingersoll <Wyllys.Ingersoll@Sun.COM>
parents:
diff changeset
22 /*
3db6e0082404 PSARC 2010/195 PKCS11 KMS Provider
Wyllys Ingersoll <Wyllys.Ingersoll@Sun.COM>
parents:
diff changeset
23 * Copyright (c) 2010, Oracle and/or its affiliates. All rights reserved.
3db6e0082404 PSARC 2010/195 PKCS11 KMS Provider
Wyllys Ingersoll <Wyllys.Ingersoll@Sun.COM>
parents:
diff changeset
24 */
3db6e0082404 PSARC 2010/195 PKCS11 KMS Provider
Wyllys Ingersoll <Wyllys.Ingersoll@Sun.COM>
parents:
diff changeset
25
3db6e0082404 PSARC 2010/195 PKCS11 KMS Provider
Wyllys Ingersoll <Wyllys.Ingersoll@Sun.COM>
parents:
diff changeset
26 /*---------------------------------------------------------------------------
3db6e0082404 PSARC 2010/195 PKCS11 KMS Provider
Wyllys Ingersoll <Wyllys.Ingersoll@Sun.COM>
parents:
diff changeset
27 * Module: k_setupssl.c
3db6e0082404 PSARC 2010/195 PKCS11 KMS Provider
Wyllys Ingersoll <Wyllys.Ingersoll@Sun.COM>
parents:
diff changeset
28 * Operating System: Linux, Win32
3db6e0082404 PSARC 2010/195 PKCS11 KMS Provider
Wyllys Ingersoll <Wyllys.Ingersoll@Sun.COM>
parents:
diff changeset
29 *
3db6e0082404 PSARC 2010/195 PKCS11 KMS Provider
Wyllys Ingersoll <Wyllys.Ingersoll@Sun.COM>
parents:
diff changeset
30 * Description:
3db6e0082404 PSARC 2010/195 PKCS11 KMS Provider
Wyllys Ingersoll <Wyllys.Ingersoll@Sun.COM>
parents:
diff changeset
31 * This is the C Implementation file for setting up OpenSSL muti-threading environment
3db6e0082404 PSARC 2010/195 PKCS11 KMS Provider
Wyllys Ingersoll <Wyllys.Ingersoll@Sun.COM>
parents:
diff changeset
32 *
3db6e0082404 PSARC 2010/195 PKCS11 KMS Provider
Wyllys Ingersoll <Wyllys.Ingersoll@Sun.COM>
parents:
diff changeset
33 *-------------------------------------------------------------------------*/
3db6e0082404 PSARC 2010/195 PKCS11 KMS Provider
Wyllys Ingersoll <Wyllys.Ingersoll@Sun.COM>
parents:
diff changeset
34
3db6e0082404 PSARC 2010/195 PKCS11 KMS Provider
Wyllys Ingersoll <Wyllys.Ingersoll@Sun.COM>
parents:
diff changeset
35 #ifndef WIN32
3db6e0082404 PSARC 2010/195 PKCS11 KMS Provider
Wyllys Ingersoll <Wyllys.Ingersoll@Sun.COM>
parents:
diff changeset
36 #include <signal.h>
3db6e0082404 PSARC 2010/195 PKCS11 KMS Provider
Wyllys Ingersoll <Wyllys.Ingersoll@Sun.COM>
parents:
diff changeset
37 #include <openssl/evp.h> /* UNIX */
3db6e0082404 PSARC 2010/195 PKCS11 KMS Provider
Wyllys Ingersoll <Wyllys.Ingersoll@Sun.COM>
parents:
diff changeset
38 #include <openssl/engine.h>
3db6e0082404 PSARC 2010/195 PKCS11 KMS Provider
Wyllys Ingersoll <Wyllys.Ingersoll@Sun.COM>
parents:
diff changeset
39 #endif
3db6e0082404 PSARC 2010/195 PKCS11 KMS Provider
Wyllys Ingersoll <Wyllys.Ingersoll@Sun.COM>
parents:
diff changeset
40
3db6e0082404 PSARC 2010/195 PKCS11 KMS Provider
Wyllys Ingersoll <Wyllys.Ingersoll@Sun.COM>
parents:
diff changeset
41 #include "k_setupssl.h"
3db6e0082404 PSARC 2010/195 PKCS11 KMS Provider
Wyllys Ingersoll <Wyllys.Ingersoll@Sun.COM>
parents:
diff changeset
42 #include "stdsoap2.h"
3db6e0082404 PSARC 2010/195 PKCS11 KMS Provider
Wyllys Ingersoll <Wyllys.Ingersoll@Sun.COM>
parents:
diff changeset
43 #include <openssl/crypto.h>
3db6e0082404 PSARC 2010/195 PKCS11 KMS Provider
Wyllys Ingersoll <Wyllys.Ingersoll@Sun.COM>
parents:
diff changeset
44
3db6e0082404 PSARC 2010/195 PKCS11 KMS Provider
Wyllys Ingersoll <Wyllys.Ingersoll@Sun.COM>
parents:
diff changeset
45 #if defined(WIN32)
3db6e0082404 PSARC 2010/195 PKCS11 KMS Provider
Wyllys Ingersoll <Wyllys.Ingersoll@Sun.COM>
parents:
diff changeset
46
3db6e0082404 PSARC 2010/195 PKCS11 KMS Provider
Wyllys Ingersoll <Wyllys.Ingersoll@Sun.COM>
parents:
diff changeset
47 #include <windows.h>
3db6e0082404 PSARC 2010/195 PKCS11 KMS Provider
Wyllys Ingersoll <Wyllys.Ingersoll@Sun.COM>
parents:
diff changeset
48 #define MUTEX_TYPE HANDLE
3db6e0082404 PSARC 2010/195 PKCS11 KMS Provider
Wyllys Ingersoll <Wyllys.Ingersoll@Sun.COM>
parents:
diff changeset
49 #define MUTEX_SETUP(x) (x) = CreateMutex(NULL, FALSE, NULL)
3db6e0082404 PSARC 2010/195 PKCS11 KMS Provider
Wyllys Ingersoll <Wyllys.Ingersoll@Sun.COM>
parents:
diff changeset
50 #define MUTEX_CLEANUP(x) CloseHandle(x)
3db6e0082404 PSARC 2010/195 PKCS11 KMS Provider
Wyllys Ingersoll <Wyllys.Ingersoll@Sun.COM>
parents:
diff changeset
51 #define MUTEX_LOCK(x) WaitForSingleObject((x), INFINITE)
3db6e0082404 PSARC 2010/195 PKCS11 KMS Provider
Wyllys Ingersoll <Wyllys.Ingersoll@Sun.COM>
parents:
diff changeset
52 #define MUTEX_UNLOCK(x) ReleaseMutex(x)
3db6e0082404 PSARC 2010/195 PKCS11 KMS Provider
Wyllys Ingersoll <Wyllys.Ingersoll@Sun.COM>
parents:
diff changeset
53 #define THREAD_ID GetCurrentThreadId()
3db6e0082404 PSARC 2010/195 PKCS11 KMS Provider
Wyllys Ingersoll <Wyllys.Ingersoll@Sun.COM>
parents:
diff changeset
54
3db6e0082404 PSARC 2010/195 PKCS11 KMS Provider
Wyllys Ingersoll <Wyllys.Ingersoll@Sun.COM>
parents:
diff changeset
55 #else
3db6e0082404 PSARC 2010/195 PKCS11 KMS Provider
Wyllys Ingersoll <Wyllys.Ingersoll@Sun.COM>
parents:
diff changeset
56
3db6e0082404 PSARC 2010/195 PKCS11 KMS Provider
Wyllys Ingersoll <Wyllys.Ingersoll@Sun.COM>
parents:
diff changeset
57 #include <pthread.h>
3db6e0082404 PSARC 2010/195 PKCS11 KMS Provider
Wyllys Ingersoll <Wyllys.Ingersoll@Sun.COM>
parents:
diff changeset
58
3db6e0082404 PSARC 2010/195 PKCS11 KMS Provider
Wyllys Ingersoll <Wyllys.Ingersoll@Sun.COM>
parents:
diff changeset
59 # define MUTEX_TYPE pthread_mutex_t
3db6e0082404 PSARC 2010/195 PKCS11 KMS Provider
Wyllys Ingersoll <Wyllys.Ingersoll@Sun.COM>
parents:
diff changeset
60 # define MUTEX_SETUP(x) pthread_mutex_init(&(x), NULL)
3db6e0082404 PSARC 2010/195 PKCS11 KMS Provider
Wyllys Ingersoll <Wyllys.Ingersoll@Sun.COM>
parents:
diff changeset
61 # define MUTEX_CLEANUP(x) pthread_mutex_destroy(&(x))
3db6e0082404 PSARC 2010/195 PKCS11 KMS Provider
Wyllys Ingersoll <Wyllys.Ingersoll@Sun.COM>
parents:
diff changeset
62 # define MUTEX_LOCK(x) pthread_mutex_lock(&(x))
3db6e0082404 PSARC 2010/195 PKCS11 KMS Provider
Wyllys Ingersoll <Wyllys.Ingersoll@Sun.COM>
parents:
diff changeset
63 # define MUTEX_UNLOCK(x) pthread_mutex_unlock(&(x))
3db6e0082404 PSARC 2010/195 PKCS11 KMS Provider
Wyllys Ingersoll <Wyllys.Ingersoll@Sun.COM>
parents:
diff changeset
64 # define THREAD_ID pthread_self()
3db6e0082404 PSARC 2010/195 PKCS11 KMS Provider
Wyllys Ingersoll <Wyllys.Ingersoll@Sun.COM>
parents:
diff changeset
65
3db6e0082404 PSARC 2010/195 PKCS11 KMS Provider
Wyllys Ingersoll <Wyllys.Ingersoll@Sun.COM>
parents:
diff changeset
66 #ifdef K_SOLARIS_PLATFORM
3db6e0082404 PSARC 2010/195 PKCS11 KMS Provider
Wyllys Ingersoll <Wyllys.Ingersoll@Sun.COM>
parents:
diff changeset
67 MUTEX_TYPE init_ssl_mutex = PTHREAD_MUTEX_INITIALIZER;
3db6e0082404 PSARC 2010/195 PKCS11 KMS Provider
Wyllys Ingersoll <Wyllys.Ingersoll@Sun.COM>
parents:
diff changeset
68 static int ssl_initialized = 0;
3db6e0082404 PSARC 2010/195 PKCS11 KMS Provider
Wyllys Ingersoll <Wyllys.Ingersoll@Sun.COM>
parents:
diff changeset
69 #endif
3db6e0082404 PSARC 2010/195 PKCS11 KMS Provider
Wyllys Ingersoll <Wyllys.Ingersoll@Sun.COM>
parents:
diff changeset
70 #endif
3db6e0082404 PSARC 2010/195 PKCS11 KMS Provider
Wyllys Ingersoll <Wyllys.Ingersoll@Sun.COM>
parents:
diff changeset
71
3db6e0082404 PSARC 2010/195 PKCS11 KMS Provider
Wyllys Ingersoll <Wyllys.Ingersoll@Sun.COM>
parents:
diff changeset
72 struct CRYPTO_dynlock_value
3db6e0082404 PSARC 2010/195 PKCS11 KMS Provider
Wyllys Ingersoll <Wyllys.Ingersoll@Sun.COM>
parents:
diff changeset
73 { MUTEX_TYPE mutex;
3db6e0082404 PSARC 2010/195 PKCS11 KMS Provider
Wyllys Ingersoll <Wyllys.Ingersoll@Sun.COM>
parents:
diff changeset
74 };
3db6e0082404 PSARC 2010/195 PKCS11 KMS Provider
Wyllys Ingersoll <Wyllys.Ingersoll@Sun.COM>
parents:
diff changeset
75
3db6e0082404 PSARC 2010/195 PKCS11 KMS Provider
Wyllys Ingersoll <Wyllys.Ingersoll@Sun.COM>
parents:
diff changeset
76 void sigpipe_handle(int x)
3db6e0082404 PSARC 2010/195 PKCS11 KMS Provider
Wyllys Ingersoll <Wyllys.Ingersoll@Sun.COM>
parents:
diff changeset
77 {
3db6e0082404 PSARC 2010/195 PKCS11 KMS Provider
Wyllys Ingersoll <Wyllys.Ingersoll@Sun.COM>
parents:
diff changeset
78 }
3db6e0082404 PSARC 2010/195 PKCS11 KMS Provider
Wyllys Ingersoll <Wyllys.Ingersoll@Sun.COM>
parents:
diff changeset
79
3db6e0082404 PSARC 2010/195 PKCS11 KMS Provider
Wyllys Ingersoll <Wyllys.Ingersoll@Sun.COM>
parents:
diff changeset
80 static MUTEX_TYPE *mutex_buf;
3db6e0082404 PSARC 2010/195 PKCS11 KMS Provider
Wyllys Ingersoll <Wyllys.Ingersoll@Sun.COM>
parents:
diff changeset
81
3db6e0082404 PSARC 2010/195 PKCS11 KMS Provider
Wyllys Ingersoll <Wyllys.Ingersoll@Sun.COM>
parents:
diff changeset
82 static struct CRYPTO_dynlock_value *dyn_create_function(const char *file, int line)
3db6e0082404 PSARC 2010/195 PKCS11 KMS Provider
Wyllys Ingersoll <Wyllys.Ingersoll@Sun.COM>
parents:
diff changeset
83 { struct CRYPTO_dynlock_value *value;
3db6e0082404 PSARC 2010/195 PKCS11 KMS Provider
Wyllys Ingersoll <Wyllys.Ingersoll@Sun.COM>
parents:
diff changeset
84 value = (struct CRYPTO_dynlock_value*)malloc(sizeof(struct CRYPTO_dynlock_value));
3db6e0082404 PSARC 2010/195 PKCS11 KMS Provider
Wyllys Ingersoll <Wyllys.Ingersoll@Sun.COM>
parents:
diff changeset
85 if (value)
3db6e0082404 PSARC 2010/195 PKCS11 KMS Provider
Wyllys Ingersoll <Wyllys.Ingersoll@Sun.COM>
parents:
diff changeset
86 MUTEX_SETUP(value->mutex);
3db6e0082404 PSARC 2010/195 PKCS11 KMS Provider
Wyllys Ingersoll <Wyllys.Ingersoll@Sun.COM>
parents:
diff changeset
87 return value;
3db6e0082404 PSARC 2010/195 PKCS11 KMS Provider
Wyllys Ingersoll <Wyllys.Ingersoll@Sun.COM>
parents:
diff changeset
88 }
3db6e0082404 PSARC 2010/195 PKCS11 KMS Provider
Wyllys Ingersoll <Wyllys.Ingersoll@Sun.COM>
parents:
diff changeset
89
3db6e0082404 PSARC 2010/195 PKCS11 KMS Provider
Wyllys Ingersoll <Wyllys.Ingersoll@Sun.COM>
parents:
diff changeset
90 static void dyn_lock_function(int mode, struct CRYPTO_dynlock_value *l, const char *file, int line)
3db6e0082404 PSARC 2010/195 PKCS11 KMS Provider
Wyllys Ingersoll <Wyllys.Ingersoll@Sun.COM>
parents:
diff changeset
91 { if (mode & CRYPTO_LOCK)
3db6e0082404 PSARC 2010/195 PKCS11 KMS Provider
Wyllys Ingersoll <Wyllys.Ingersoll@Sun.COM>
parents:
diff changeset
92 MUTEX_LOCK(l->mutex);
3db6e0082404 PSARC 2010/195 PKCS11 KMS Provider
Wyllys Ingersoll <Wyllys.Ingersoll@Sun.COM>
parents:
diff changeset
93 else
3db6e0082404 PSARC 2010/195 PKCS11 KMS Provider
Wyllys Ingersoll <Wyllys.Ingersoll@Sun.COM>
parents:
diff changeset
94 MUTEX_UNLOCK(l->mutex);
3db6e0082404 PSARC 2010/195 PKCS11 KMS Provider
Wyllys Ingersoll <Wyllys.Ingersoll@Sun.COM>
parents:
diff changeset
95 }
3db6e0082404 PSARC 2010/195 PKCS11 KMS Provider
Wyllys Ingersoll <Wyllys.Ingersoll@Sun.COM>
parents:
diff changeset
96
3db6e0082404 PSARC 2010/195 PKCS11 KMS Provider
Wyllys Ingersoll <Wyllys.Ingersoll@Sun.COM>
parents:
diff changeset
97 static void dyn_destroy_function(struct CRYPTO_dynlock_value *l, const char *file, int line)
3db6e0082404 PSARC 2010/195 PKCS11 KMS Provider
Wyllys Ingersoll <Wyllys.Ingersoll@Sun.COM>
parents:
diff changeset
98 { MUTEX_CLEANUP(l->mutex);
3db6e0082404 PSARC 2010/195 PKCS11 KMS Provider
Wyllys Ingersoll <Wyllys.Ingersoll@Sun.COM>
parents:
diff changeset
99 free(l);
3db6e0082404 PSARC 2010/195 PKCS11 KMS Provider
Wyllys Ingersoll <Wyllys.Ingersoll@Sun.COM>
parents:
diff changeset
100 }
3db6e0082404 PSARC 2010/195 PKCS11 KMS Provider
Wyllys Ingersoll <Wyllys.Ingersoll@Sun.COM>
parents:
diff changeset
101
3db6e0082404 PSARC 2010/195 PKCS11 KMS Provider
Wyllys Ingersoll <Wyllys.Ingersoll@Sun.COM>
parents:
diff changeset
102 void kms_locking_function(int mode, int n, const char *file, int line)
3db6e0082404 PSARC 2010/195 PKCS11 KMS Provider
Wyllys Ingersoll <Wyllys.Ingersoll@Sun.COM>
parents:
diff changeset
103 { if (mode & CRYPTO_LOCK)
3db6e0082404 PSARC 2010/195 PKCS11 KMS Provider
Wyllys Ingersoll <Wyllys.Ingersoll@Sun.COM>
parents:
diff changeset
104 MUTEX_LOCK(mutex_buf[n]);
3db6e0082404 PSARC 2010/195 PKCS11 KMS Provider
Wyllys Ingersoll <Wyllys.Ingersoll@Sun.COM>
parents:
diff changeset
105 else
3db6e0082404 PSARC 2010/195 PKCS11 KMS Provider
Wyllys Ingersoll <Wyllys.Ingersoll@Sun.COM>
parents:
diff changeset
106 MUTEX_UNLOCK(mutex_buf[n]);
3db6e0082404 PSARC 2010/195 PKCS11 KMS Provider
Wyllys Ingersoll <Wyllys.Ingersoll@Sun.COM>
parents:
diff changeset
107 }
3db6e0082404 PSARC 2010/195 PKCS11 KMS Provider
Wyllys Ingersoll <Wyllys.Ingersoll@Sun.COM>
parents:
diff changeset
108
3db6e0082404 PSARC 2010/195 PKCS11 KMS Provider
Wyllys Ingersoll <Wyllys.Ingersoll@Sun.COM>
parents:
diff changeset
109
3db6e0082404 PSARC 2010/195 PKCS11 KMS Provider
Wyllys Ingersoll <Wyllys.Ingersoll@Sun.COM>
parents:
diff changeset
110 unsigned long id_function(void )
3db6e0082404 PSARC 2010/195 PKCS11 KMS Provider
Wyllys Ingersoll <Wyllys.Ingersoll@Sun.COM>
parents:
diff changeset
111 { return (unsigned long)THREAD_ID;
3db6e0082404 PSARC 2010/195 PKCS11 KMS Provider
Wyllys Ingersoll <Wyllys.Ingersoll@Sun.COM>
parents:
diff changeset
112 }
3db6e0082404 PSARC 2010/195 PKCS11 KMS Provider
Wyllys Ingersoll <Wyllys.Ingersoll@Sun.COM>
parents:
diff changeset
113
3db6e0082404 PSARC 2010/195 PKCS11 KMS Provider
Wyllys Ingersoll <Wyllys.Ingersoll@Sun.COM>
parents:
diff changeset
114 #ifdef WIN32
3db6e0082404 PSARC 2010/195 PKCS11 KMS Provider
Wyllys Ingersoll <Wyllys.Ingersoll@Sun.COM>
parents:
diff changeset
115 void OpenSSL_add_all_ciphers(void); // UNIX
3db6e0082404 PSARC 2010/195 PKCS11 KMS Provider
Wyllys Ingersoll <Wyllys.Ingersoll@Sun.COM>
parents:
diff changeset
116 void OpenSSL_add_all_digests(void);
3db6e0082404 PSARC 2010/195 PKCS11 KMS Provider
Wyllys Ingersoll <Wyllys.Ingersoll@Sun.COM>
parents:
diff changeset
117 #endif
3db6e0082404 PSARC 2010/195 PKCS11 KMS Provider
Wyllys Ingersoll <Wyllys.Ingersoll@Sun.COM>
parents:
diff changeset
118
3db6e0082404 PSARC 2010/195 PKCS11 KMS Provider
Wyllys Ingersoll <Wyllys.Ingersoll@Sun.COM>
parents:
diff changeset
119 #ifdef K_HPUX_PLATFORM
3db6e0082404 PSARC 2010/195 PKCS11 KMS Provider
Wyllys Ingersoll <Wyllys.Ingersoll@Sun.COM>
parents:
diff changeset
120 extern void allow_unaligned_data_access();
3db6e0082404 PSARC 2010/195 PKCS11 KMS Provider
Wyllys Ingersoll <Wyllys.Ingersoll@Sun.COM>
parents:
diff changeset
121 #endif
3db6e0082404 PSARC 2010/195 PKCS11 KMS Provider
Wyllys Ingersoll <Wyllys.Ingersoll@Sun.COM>
parents:
diff changeset
122
3db6e0082404 PSARC 2010/195 PKCS11 KMS Provider
Wyllys Ingersoll <Wyllys.Ingersoll@Sun.COM>
parents:
diff changeset
123 // gSOAP 2.7e:
3db6e0082404 PSARC 2010/195 PKCS11 KMS Provider
Wyllys Ingersoll <Wyllys.Ingersoll@Sun.COM>
parents:
diff changeset
124 // The function ssl_init is defined in stdsoap2.cpp and is not exported by
3db6e0082404 PSARC 2010/195 PKCS11 KMS Provider
Wyllys Ingersoll <Wyllys.Ingersoll@Sun.COM>
parents:
diff changeset
125 // default by gSOAP.
3db6e0082404 PSARC 2010/195 PKCS11 KMS Provider
Wyllys Ingersoll <Wyllys.Ingersoll@Sun.COM>
parents:
diff changeset
126 // gSOAP 2.7.12:
3db6e0082404 PSARC 2010/195 PKCS11 KMS Provider
Wyllys Ingersoll <Wyllys.Ingersoll@Sun.COM>
parents:
diff changeset
127 // The function soap_ssl_init is defined in stdsoap2.cpp. It replaces
3db6e0082404 PSARC 2010/195 PKCS11 KMS Provider
Wyllys Ingersoll <Wyllys.Ingersoll@Sun.COM>
parents:
diff changeset
128 // ssl_init and is exported by gSOAP. gSOAP 2.7.13 also supports a new
3db6e0082404 PSARC 2010/195 PKCS11 KMS Provider
Wyllys Ingersoll <Wyllys.Ingersoll@Sun.COM>
parents:
diff changeset
129 // SOAP_SSL_SKIP_HOST_CHECK flag.
3db6e0082404 PSARC 2010/195 PKCS11 KMS Provider
Wyllys Ingersoll <Wyllys.Ingersoll@Sun.COM>
parents:
diff changeset
130 #ifndef SOAP_SSL_SKIP_HOST_CHECK
3db6e0082404 PSARC 2010/195 PKCS11 KMS Provider
Wyllys Ingersoll <Wyllys.Ingersoll@Sun.COM>
parents:
diff changeset
131 extern int ssl_init();
3db6e0082404 PSARC 2010/195 PKCS11 KMS Provider
Wyllys Ingersoll <Wyllys.Ingersoll@Sun.COM>
parents:
diff changeset
132 #endif
3db6e0082404 PSARC 2010/195 PKCS11 KMS Provider
Wyllys Ingersoll <Wyllys.Ingersoll@Sun.COM>
parents:
diff changeset
133
3db6e0082404 PSARC 2010/195 PKCS11 KMS Provider
Wyllys Ingersoll <Wyllys.Ingersoll@Sun.COM>
parents:
diff changeset
134 int K_SetupSSL()
3db6e0082404 PSARC 2010/195 PKCS11 KMS Provider
Wyllys Ingersoll <Wyllys.Ingersoll@Sun.COM>
parents:
diff changeset
135 { int i;
3db6e0082404 PSARC 2010/195 PKCS11 KMS Provider
Wyllys Ingersoll <Wyllys.Ingersoll@Sun.COM>
parents:
diff changeset
136 #ifdef K_SOLARIS_PLATFORM
3db6e0082404 PSARC 2010/195 PKCS11 KMS Provider
Wyllys Ingersoll <Wyllys.Ingersoll@Sun.COM>
parents:
diff changeset
137 if (ssl_initialized)
3db6e0082404 PSARC 2010/195 PKCS11 KMS Provider
Wyllys Ingersoll <Wyllys.Ingersoll@Sun.COM>
parents:
diff changeset
138 return 1;
3db6e0082404 PSARC 2010/195 PKCS11 KMS Provider
Wyllys Ingersoll <Wyllys.Ingersoll@Sun.COM>
parents:
diff changeset
139 MUTEX_LOCK(init_ssl_mutex);
3db6e0082404 PSARC 2010/195 PKCS11 KMS Provider
Wyllys Ingersoll <Wyllys.Ingersoll@Sun.COM>
parents:
diff changeset
140 #endif
3db6e0082404 PSARC 2010/195 PKCS11 KMS Provider
Wyllys Ingersoll <Wyllys.Ingersoll@Sun.COM>
parents:
diff changeset
141 mutex_buf = (MUTEX_TYPE*)OPENSSL_malloc(CRYPTO_num_locks() * sizeof(MUTEX_TYPE));
3db6e0082404 PSARC 2010/195 PKCS11 KMS Provider
Wyllys Ingersoll <Wyllys.Ingersoll@Sun.COM>
parents:
diff changeset
142 if (!mutex_buf) {
3db6e0082404 PSARC 2010/195 PKCS11 KMS Provider
Wyllys Ingersoll <Wyllys.Ingersoll@Sun.COM>
parents:
diff changeset
143 #ifdef K_SOLARIS_PLATFORM
3db6e0082404 PSARC 2010/195 PKCS11 KMS Provider
Wyllys Ingersoll <Wyllys.Ingersoll@Sun.COM>
parents:
diff changeset
144 MUTEX_UNLOCK(init_ssl_mutex);
3db6e0082404 PSARC 2010/195 PKCS11 KMS Provider
Wyllys Ingersoll <Wyllys.Ingersoll@Sun.COM>
parents:
diff changeset
145 #endif
3db6e0082404 PSARC 2010/195 PKCS11 KMS Provider
Wyllys Ingersoll <Wyllys.Ingersoll@Sun.COM>
parents:
diff changeset
146 return 0;
3db6e0082404 PSARC 2010/195 PKCS11 KMS Provider
Wyllys Ingersoll <Wyllys.Ingersoll@Sun.COM>
parents:
diff changeset
147 }
3db6e0082404 PSARC 2010/195 PKCS11 KMS Provider
Wyllys Ingersoll <Wyllys.Ingersoll@Sun.COM>
parents:
diff changeset
148 for (i = 0; i < CRYPTO_num_locks(); i++)
3db6e0082404 PSARC 2010/195 PKCS11 KMS Provider
Wyllys Ingersoll <Wyllys.Ingersoll@Sun.COM>
parents:
diff changeset
149 MUTEX_SETUP(mutex_buf[i]);
3db6e0082404 PSARC 2010/195 PKCS11 KMS Provider
Wyllys Ingersoll <Wyllys.Ingersoll@Sun.COM>
parents:
diff changeset
150 if (CRYPTO_get_id_callback() == NULL)
3db6e0082404 PSARC 2010/195 PKCS11 KMS Provider
Wyllys Ingersoll <Wyllys.Ingersoll@Sun.COM>
parents:
diff changeset
151 CRYPTO_set_id_callback(id_function);
3db6e0082404 PSARC 2010/195 PKCS11 KMS Provider
Wyllys Ingersoll <Wyllys.Ingersoll@Sun.COM>
parents:
diff changeset
152 if (CRYPTO_get_locking_callback() == NULL)
3db6e0082404 PSARC 2010/195 PKCS11 KMS Provider
Wyllys Ingersoll <Wyllys.Ingersoll@Sun.COM>
parents:
diff changeset
153 CRYPTO_set_locking_callback(kms_locking_function);
3db6e0082404 PSARC 2010/195 PKCS11 KMS Provider
Wyllys Ingersoll <Wyllys.Ingersoll@Sun.COM>
parents:
diff changeset
154
3db6e0082404 PSARC 2010/195 PKCS11 KMS Provider
Wyllys Ingersoll <Wyllys.Ingersoll@Sun.COM>
parents:
diff changeset
155 CRYPTO_set_dynlock_create_callback(dyn_create_function);
3db6e0082404 PSARC 2010/195 PKCS11 KMS Provider
Wyllys Ingersoll <Wyllys.Ingersoll@Sun.COM>
parents:
diff changeset
156 CRYPTO_set_dynlock_lock_callback(dyn_lock_function);
3db6e0082404 PSARC 2010/195 PKCS11 KMS Provider
Wyllys Ingersoll <Wyllys.Ingersoll@Sun.COM>
parents:
diff changeset
157 CRYPTO_set_dynlock_destroy_callback(dyn_destroy_function);
3db6e0082404 PSARC 2010/195 PKCS11 KMS Provider
Wyllys Ingersoll <Wyllys.Ingersoll@Sun.COM>
parents:
diff changeset
158
3db6e0082404 PSARC 2010/195 PKCS11 KMS Provider
Wyllys Ingersoll <Wyllys.Ingersoll@Sun.COM>
parents:
diff changeset
159 #ifndef WIN32
3db6e0082404 PSARC 2010/195 PKCS11 KMS Provider
Wyllys Ingersoll <Wyllys.Ingersoll@Sun.COM>
parents:
diff changeset
160 /* Need SIGPIPE handler on Unix/Linux systems to catch broken pipes: */
3db6e0082404 PSARC 2010/195 PKCS11 KMS Provider
Wyllys Ingersoll <Wyllys.Ingersoll@Sun.COM>
parents:
diff changeset
161 signal(SIGPIPE, sigpipe_handle);
3db6e0082404 PSARC 2010/195 PKCS11 KMS Provider
Wyllys Ingersoll <Wyllys.Ingersoll@Sun.COM>
parents:
diff changeset
162 #endif
3db6e0082404 PSARC 2010/195 PKCS11 KMS Provider
Wyllys Ingersoll <Wyllys.Ingersoll@Sun.COM>
parents:
diff changeset
163 #ifdef K_HPUX_PLATFORM
3db6e0082404 PSARC 2010/195 PKCS11 KMS Provider
Wyllys Ingersoll <Wyllys.Ingersoll@Sun.COM>
parents:
diff changeset
164 // signal(SIGBUS, sigpipe_handle);
3db6e0082404 PSARC 2010/195 PKCS11 KMS Provider
Wyllys Ingersoll <Wyllys.Ingersoll@Sun.COM>
parents:
diff changeset
165 allow_unaligned_data_access();
3db6e0082404 PSARC 2010/195 PKCS11 KMS Provider
Wyllys Ingersoll <Wyllys.Ingersoll@Sun.COM>
parents:
diff changeset
166 #endif
3db6e0082404 PSARC 2010/195 PKCS11 KMS Provider
Wyllys Ingersoll <Wyllys.Ingersoll@Sun.COM>
parents:
diff changeset
167 OpenSSL_add_all_ciphers();
3db6e0082404 PSARC 2010/195 PKCS11 KMS Provider
Wyllys Ingersoll <Wyllys.Ingersoll@Sun.COM>
parents:
diff changeset
168 OpenSSL_add_all_digests();
3db6e0082404 PSARC 2010/195 PKCS11 KMS Provider
Wyllys Ingersoll <Wyllys.Ingersoll@Sun.COM>
parents:
diff changeset
169
3db6e0082404 PSARC 2010/195 PKCS11 KMS Provider
Wyllys Ingersoll <Wyllys.Ingersoll@Sun.COM>
parents:
diff changeset
170 // call gSOAP's OpenSSL initialization, which initializes SSL algorithms and seeds RAND
3db6e0082404 PSARC 2010/195 PKCS11 KMS Provider
Wyllys Ingersoll <Wyllys.Ingersoll@Sun.COM>
parents:
diff changeset
171
3db6e0082404 PSARC 2010/195 PKCS11 KMS Provider
Wyllys Ingersoll <Wyllys.Ingersoll@Sun.COM>
parents:
diff changeset
172 // gSOAP 2.7e:
3db6e0082404 PSARC 2010/195 PKCS11 KMS Provider
Wyllys Ingersoll <Wyllys.Ingersoll@Sun.COM>
parents:
diff changeset
173 // The function ssl_init is defined in stdsoap2.cpp and is not exported by
3db6e0082404 PSARC 2010/195 PKCS11 KMS Provider
Wyllys Ingersoll <Wyllys.Ingersoll@Sun.COM>
parents:
diff changeset
174 // default by gSOAP.
3db6e0082404 PSARC 2010/195 PKCS11 KMS Provider
Wyllys Ingersoll <Wyllys.Ingersoll@Sun.COM>
parents:
diff changeset
175 // gSOAP 2.7.13:
3db6e0082404 PSARC 2010/195 PKCS11 KMS Provider
Wyllys Ingersoll <Wyllys.Ingersoll@Sun.COM>
parents:
diff changeset
176 // The function soap_ssl_init is defined in stdsoap2.cpp. It replaces
3db6e0082404 PSARC 2010/195 PKCS11 KMS Provider
Wyllys Ingersoll <Wyllys.Ingersoll@Sun.COM>
parents:
diff changeset
177 // ssl_init and is exported by gSOAP. gSOAP 2.7.13 also supports a new
3db6e0082404 PSARC 2010/195 PKCS11 KMS Provider
Wyllys Ingersoll <Wyllys.Ingersoll@Sun.COM>
parents:
diff changeset
178 // SOAP_SSL_SKIP_HOST_CHECK flag.
3db6e0082404 PSARC 2010/195 PKCS11 KMS Provider
Wyllys Ingersoll <Wyllys.Ingersoll@Sun.COM>
parents:
diff changeset
179 #ifdef SOAP_SSL_SKIP_HOST_CHECK
3db6e0082404 PSARC 2010/195 PKCS11 KMS Provider
Wyllys Ingersoll <Wyllys.Ingersoll@Sun.COM>
parents:
diff changeset
180 soap_ssl_init();
3db6e0082404 PSARC 2010/195 PKCS11 KMS Provider
Wyllys Ingersoll <Wyllys.Ingersoll@Sun.COM>
parents:
diff changeset
181 #else
3db6e0082404 PSARC 2010/195 PKCS11 KMS Provider
Wyllys Ingersoll <Wyllys.Ingersoll@Sun.COM>
parents:
diff changeset
182 ssl_init();
3db6e0082404 PSARC 2010/195 PKCS11 KMS Provider
Wyllys Ingersoll <Wyllys.Ingersoll@Sun.COM>
parents:
diff changeset
183 #endif
3db6e0082404 PSARC 2010/195 PKCS11 KMS Provider
Wyllys Ingersoll <Wyllys.Ingersoll@Sun.COM>
parents:
diff changeset
184
3db6e0082404 PSARC 2010/195 PKCS11 KMS Provider
Wyllys Ingersoll <Wyllys.Ingersoll@Sun.COM>
parents:
diff changeset
185 #ifdef K_SOLARIS_PLATFORM
3db6e0082404 PSARC 2010/195 PKCS11 KMS Provider
Wyllys Ingersoll <Wyllys.Ingersoll@Sun.COM>
parents:
diff changeset
186 ssl_initialized = 1;
3db6e0082404 PSARC 2010/195 PKCS11 KMS Provider
Wyllys Ingersoll <Wyllys.Ingersoll@Sun.COM>
parents:
diff changeset
187 MUTEX_UNLOCK(init_ssl_mutex);
3db6e0082404 PSARC 2010/195 PKCS11 KMS Provider
Wyllys Ingersoll <Wyllys.Ingersoll@Sun.COM>
parents:
diff changeset
188 #endif
3db6e0082404 PSARC 2010/195 PKCS11 KMS Provider
Wyllys Ingersoll <Wyllys.Ingersoll@Sun.COM>
parents:
diff changeset
189
3db6e0082404 PSARC 2010/195 PKCS11 KMS Provider
Wyllys Ingersoll <Wyllys.Ingersoll@Sun.COM>
parents:
diff changeset
190 return 1;
3db6e0082404 PSARC 2010/195 PKCS11 KMS Provider
Wyllys Ingersoll <Wyllys.Ingersoll@Sun.COM>
parents:
diff changeset
191 }
3db6e0082404 PSARC 2010/195 PKCS11 KMS Provider
Wyllys Ingersoll <Wyllys.Ingersoll@Sun.COM>
parents:
diff changeset
192
3db6e0082404 PSARC 2010/195 PKCS11 KMS Provider
Wyllys Ingersoll <Wyllys.Ingersoll@Sun.COM>
parents:
diff changeset
193 void K_CleanupSSL()
3db6e0082404 PSARC 2010/195 PKCS11 KMS Provider
Wyllys Ingersoll <Wyllys.Ingersoll@Sun.COM>
parents:
diff changeset
194 { int i;
3db6e0082404 PSARC 2010/195 PKCS11 KMS Provider
Wyllys Ingersoll <Wyllys.Ingersoll@Sun.COM>
parents:
diff changeset
195 if (!mutex_buf)
3db6e0082404 PSARC 2010/195 PKCS11 KMS Provider
Wyllys Ingersoll <Wyllys.Ingersoll@Sun.COM>
parents:
diff changeset
196 return;
3db6e0082404 PSARC 2010/195 PKCS11 KMS Provider
Wyllys Ingersoll <Wyllys.Ingersoll@Sun.COM>
parents:
diff changeset
197 #ifdef K_SOLARIS_PLATFORM
3db6e0082404 PSARC 2010/195 PKCS11 KMS Provider
Wyllys Ingersoll <Wyllys.Ingersoll@Sun.COM>
parents:
diff changeset
198 {
3db6e0082404 PSARC 2010/195 PKCS11 KMS Provider
Wyllys Ingersoll <Wyllys.Ingersoll@Sun.COM>
parents:
diff changeset
199 unsigned long (*id_func)();
3db6e0082404 PSARC 2010/195 PKCS11 KMS Provider
Wyllys Ingersoll <Wyllys.Ingersoll@Sun.COM>
parents:
diff changeset
200
3db6e0082404 PSARC 2010/195 PKCS11 KMS Provider
Wyllys Ingersoll <Wyllys.Ingersoll@Sun.COM>
parents:
diff changeset
201 if ((id_func = CRYPTO_get_id_callback()) == id_function) {
3db6e0082404 PSARC 2010/195 PKCS11 KMS Provider
Wyllys Ingersoll <Wyllys.Ingersoll@Sun.COM>
parents:
diff changeset
202 ENGINE_cleanup();
3db6e0082404 PSARC 2010/195 PKCS11 KMS Provider
Wyllys Ingersoll <Wyllys.Ingersoll@Sun.COM>
parents:
diff changeset
203 /* EVP_cleanup(); */
3db6e0082404 PSARC 2010/195 PKCS11 KMS Provider
Wyllys Ingersoll <Wyllys.Ingersoll@Sun.COM>
parents:
diff changeset
204 ERR_free_strings();
3db6e0082404 PSARC 2010/195 PKCS11 KMS Provider
Wyllys Ingersoll <Wyllys.Ingersoll@Sun.COM>
parents:
diff changeset
205 CRYPTO_set_id_callback(NULL);
3db6e0082404 PSARC 2010/195 PKCS11 KMS Provider
Wyllys Ingersoll <Wyllys.Ingersoll@Sun.COM>
parents:
diff changeset
206 CRYPTO_set_locking_callback(NULL);
3db6e0082404 PSARC 2010/195 PKCS11 KMS Provider
Wyllys Ingersoll <Wyllys.Ingersoll@Sun.COM>
parents:
diff changeset
207 }
3db6e0082404 PSARC 2010/195 PKCS11 KMS Provider
Wyllys Ingersoll <Wyllys.Ingersoll@Sun.COM>
parents:
diff changeset
208 }
3db6e0082404 PSARC 2010/195 PKCS11 KMS Provider
Wyllys Ingersoll <Wyllys.Ingersoll@Sun.COM>
parents:
diff changeset
209 #endif
3db6e0082404 PSARC 2010/195 PKCS11 KMS Provider
Wyllys Ingersoll <Wyllys.Ingersoll@Sun.COM>
parents:
diff changeset
210 CRYPTO_set_dynlock_create_callback(NULL);
3db6e0082404 PSARC 2010/195 PKCS11 KMS Provider
Wyllys Ingersoll <Wyllys.Ingersoll@Sun.COM>
parents:
diff changeset
211 CRYPTO_set_dynlock_lock_callback(NULL);
3db6e0082404 PSARC 2010/195 PKCS11 KMS Provider
Wyllys Ingersoll <Wyllys.Ingersoll@Sun.COM>
parents:
diff changeset
212 CRYPTO_set_dynlock_destroy_callback(NULL);
3db6e0082404 PSARC 2010/195 PKCS11 KMS Provider
Wyllys Ingersoll <Wyllys.Ingersoll@Sun.COM>
parents:
diff changeset
213 for (i = 0; i < CRYPTO_num_locks(); i++)
3db6e0082404 PSARC 2010/195 PKCS11 KMS Provider
Wyllys Ingersoll <Wyllys.Ingersoll@Sun.COM>
parents:
diff changeset
214 MUTEX_CLEANUP(mutex_buf[i]);
3db6e0082404 PSARC 2010/195 PKCS11 KMS Provider
Wyllys Ingersoll <Wyllys.Ingersoll@Sun.COM>
parents:
diff changeset
215 OPENSSL_free(mutex_buf);
3db6e0082404 PSARC 2010/195 PKCS11 KMS Provider
Wyllys Ingersoll <Wyllys.Ingersoll@Sun.COM>
parents:
diff changeset
216 mutex_buf = NULL;
3db6e0082404 PSARC 2010/195 PKCS11 KMS Provider
Wyllys Ingersoll <Wyllys.Ingersoll@Sun.COM>
parents:
diff changeset
217 }
3db6e0082404 PSARC 2010/195 PKCS11 KMS Provider
Wyllys Ingersoll <Wyllys.Ingersoll@Sun.COM>
parents:
diff changeset
218
3db6e0082404 PSARC 2010/195 PKCS11 KMS Provider
Wyllys Ingersoll <Wyllys.Ingersoll@Sun.COM>
parents:
diff changeset
219 // TODO: what should 'struct soap' really be?
3db6e0082404 PSARC 2010/195 PKCS11 KMS Provider
Wyllys Ingersoll <Wyllys.Ingersoll@Sun.COM>
parents:
diff changeset
220 int K_SetupCallbacks( struct soap *i_pSoap )
3db6e0082404 PSARC 2010/195 PKCS11 KMS Provider
Wyllys Ingersoll <Wyllys.Ingersoll@Sun.COM>
parents:
diff changeset
221 {
3db6e0082404 PSARC 2010/195 PKCS11 KMS Provider
Wyllys Ingersoll <Wyllys.Ingersoll@Sun.COM>
parents:
diff changeset
222 return 1;
3db6e0082404 PSARC 2010/195 PKCS11 KMS Provider
Wyllys Ingersoll <Wyllys.Ingersoll@Sun.COM>
parents:
diff changeset
223 }