summaryrefslogtreecommitdiff
path: root/src/lib/libcrypto/cryptlib.c
diff options
context:
space:
mode:
authorryker <>1998-10-05 20:13:14 +0000
committerryker <>1998-10-05 20:13:14 +0000
commitaeeae06a79815dc190061534d47236cec09f9e32 (patch)
tree851692b9c2f9c04f077666855641900f19fdb217 /src/lib/libcrypto/cryptlib.c
parenta4f79641824cbf9f60ca9d1168d1fcc46717a82a (diff)
downloadopenbsd-aeeae06a79815dc190061534d47236cec09f9e32.tar.gz
openbsd-aeeae06a79815dc190061534d47236cec09f9e32.tar.bz2
openbsd-aeeae06a79815dc190061534d47236cec09f9e32.zip
Import of SSLeay-0.9.0b with RSA and IDEA stubbed + OpenBSD build
functionality for shared libs. Note that routines such as sslv2_init and friends that use RSA will not work due to lack of RSA in this library. Needs documentation and help from ports for easy upgrade to full functionality where legally possible.
Diffstat (limited to 'src/lib/libcrypto/cryptlib.c')
-rw-r--r--src/lib/libcrypto/cryptlib.c307
1 files changed, 307 insertions, 0 deletions
diff --git a/src/lib/libcrypto/cryptlib.c b/src/lib/libcrypto/cryptlib.c
new file mode 100644
index 0000000000..9a7e80b7f8
--- /dev/null
+++ b/src/lib/libcrypto/cryptlib.c
@@ -0,0 +1,307 @@
1/* crypto/cryptlib.c */
2/* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com)
3 * All rights reserved.
4 *
5 * This package is an SSL implementation written
6 * by Eric Young (eay@cryptsoft.com).
7 * The implementation was written so as to conform with Netscapes SSL.
8 *
9 * This library is free for commercial and non-commercial use as long as
10 * the following conditions are aheared to. The following conditions
11 * apply to all code found in this distribution, be it the RC4, RSA,
12 * lhash, DES, etc., code; not just the SSL code. The SSL documentation
13 * included with this distribution is covered by the same copyright terms
14 * except that the holder is Tim Hudson (tjh@cryptsoft.com).
15 *
16 * Copyright remains Eric Young's, and as such any Copyright notices in
17 * the code are not to be removed.
18 * If this package is used in a product, Eric Young should be given attribution
19 * as the author of the parts of the library used.
20 * This can be in the form of a textual message at program startup or
21 * in documentation (online or textual) provided with the package.
22 *
23 * Redistribution and use in source and binary forms, with or without
24 * modification, are permitted provided that the following conditions
25 * are met:
26 * 1. Redistributions of source code must retain the copyright
27 * notice, this list of conditions and the following disclaimer.
28 * 2. Redistributions in binary form must reproduce the above copyright
29 * notice, this list of conditions and the following disclaimer in the
30 * documentation and/or other materials provided with the distribution.
31 * 3. All advertising materials mentioning features or use of this software
32 * must display the following acknowledgement:
33 * "This product includes cryptographic software written by
34 * Eric Young (eay@cryptsoft.com)"
35 * The word 'cryptographic' can be left out if the rouines from the library
36 * being used are not cryptographic related :-).
37 * 4. If you include any Windows specific code (or a derivative thereof) from
38 * the apps directory (application code) you must include an acknowledgement:
39 * "This product includes software written by Tim Hudson (tjh@cryptsoft.com)"
40 *
41 * THIS SOFTWARE IS PROVIDED BY ERIC YOUNG ``AS IS'' AND
42 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
43 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
44 * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
45 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
46 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
47 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
48 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
49 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
50 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
51 * SUCH DAMAGE.
52 *
53 * The licence and distribution terms for any publically available version or
54 * derivative of this code cannot be changed. i.e. this code cannot simply be
55 * copied and put under another distribution licence
56 * [including the GNU Public Licence.]
57 */
58
59#include <stdio.h>
60#include <string.h>
61#include "cryptlib.h"
62#include "crypto.h"
63#include "date.h"
64
65#if defined(WIN32) || defined(WIN16)
66static double SSLeay_MSVC5_hack=0.0; /* and for VC1.5 */
67#endif
68
69/* real #defines in crypto.h, keep these upto date */
70static char* lock_names[CRYPTO_NUM_LOCKS] =
71 {
72 "<<ERROR>>",
73 "err",
74 "err_hash",
75 "x509",
76 "x509_info",
77 "x509_pkey",
78 "x509_crl",
79 "x509_req",
80 "dsa",
81 "rsa",
82 "evp_pkey",
83 "x509_store",
84 "ssl_ctx",
85 "ssl_cert",
86 "ssl_session",
87 "ssl",
88 "rand",
89 "debug_malloc",
90 "BIO",
91 "bio_gethostbyname",
92 "RSA_blinding",
93 };
94
95static STACK *app_locks=NULL;
96
97#ifndef NOPROTO
98static void (MS_FAR *locking_callback)(int mode,int type,
99 char *file,int line)=NULL;
100static int (MS_FAR *add_lock_callback)(int *pointer,int amount,
101 int type,char *file,int line)=NULL;
102static unsigned long (MS_FAR *id_callback)(void)=NULL;
103#else
104static void (MS_FAR *locking_callback)()=NULL;
105static int (MS_FAR *add_lock_callback)()=NULL;
106static unsigned long (MS_FAR *id_callback)()=NULL;
107#endif
108
109int CRYPTO_get_new_lockid(name)
110char *name;
111 {
112 char *str;
113 int i;
114
115 /* A hack to make Visual C++ 5.0 work correctly when linking as
116 * a DLL using /MT. Without this, the application cannot use
117 * and floating point printf's.
118 * It also seems to be needed for Visual C 1.5 (win16) */
119#if defined(WIN32) || defined(WIN16)
120 SSLeay_MSVC5_hack=(double)name[0]*(double)name[1];
121#endif
122
123 if (app_locks == NULL)
124 if ((app_locks=sk_new_null()) == NULL)
125 CRYPTOerr(CRYPTO_F_CRYPTO_GET_NEW_LOCKID,ERR_R_MALLOC_FAILURE);
126 return(0);
127 if ((str=BUF_strdup(name)) == NULL)
128 return(0);
129 i=sk_push(app_locks,str);
130 if (!i)
131 Free(str);
132 else
133 i+=CRYPTO_NUM_LOCKS; /* gap of one :-) */
134 return(i);
135 }
136
137void (*CRYPTO_get_locking_callback(P_V))(P_I_I_P_I)
138 {
139 return(locking_callback);
140 }
141
142int (*CRYPTO_get_add_lock_callback(P_V))(P_IP_I_I_P_I)
143 {
144 return(add_lock_callback);
145 }
146
147void CRYPTO_set_locking_callback(func)
148void (*func)(P_I_I_P_I);
149 {
150 locking_callback=func;
151 }
152
153void CRYPTO_set_add_lock_callback(func)
154int (*func)(P_IP_I_I_P_I);
155 {
156 add_lock_callback=func;
157 }
158
159unsigned long (*CRYPTO_get_id_callback(P_V))(P_V)
160 {
161 return(id_callback);
162 }
163
164void CRYPTO_set_id_callback(func)
165unsigned long (*func)(P_V);
166 {
167 id_callback=func;
168 }
169
170unsigned long CRYPTO_thread_id()
171 {
172 unsigned long ret=0;
173
174 if (id_callback == NULL)
175 {
176#ifdef WIN16
177 ret=(unsigned long)GetCurrentTask();
178#elif defined(WIN32)
179 ret=(unsigned long)GetCurrentThreadId();
180#elif defined(MSDOS)
181 ret=1L;
182#else
183 ret=(unsigned long)getpid();
184#endif
185 }
186 else
187 ret=id_callback();
188 return(ret);
189 }
190
191void CRYPTO_lock(mode,type,file,line)
192int mode;
193int type;
194char *file;
195int line;
196 {
197#ifdef LOCK_DEBUG
198 {
199 char *rw_text,*operation_text;
200
201 if (mode & CRYPTO_LOCK)
202 operation_text="lock ";
203 else if (mode & CRYPTO_UNLOCK)
204 operation_text="unlock";
205 else
206 operation_text="ERROR ";
207
208 if (mode & CRYPTO_READ)
209 rw_text="r";
210 else if (mode & CRYPTO_WRITE)
211 rw_text="w";
212 else
213 rw_text="ERROR";
214
215 fprintf(stderr,"lock:%08lx:(%s)%s %-18s %s:%d\n",
216 CRYPTO_thread_id(), rw_text, operation_text,
217 CRYPTO_get_lock_name(type), file, line);
218 }
219#endif
220 if (locking_callback != NULL)
221 locking_callback(mode,type,file,line);
222 }
223
224int CRYPTO_add_lock(pointer,amount,type,file,line)
225int *pointer;
226int amount;
227int type;
228char *file;
229int line;
230 {
231 int ret;
232
233 if (add_lock_callback != NULL)
234 {
235#ifdef LOCK_DEBUG
236 int before= *pointer;
237#endif
238
239 ret=add_lock_callback(pointer,amount,type,file,line);
240#ifdef LOCK_DEBUG
241 fprintf(stderr,"ladd:%08lx:%2d+%2d->%2d %-18s %s:%d\n",
242 CRYPTO_thread_id(),
243 before,amount,ret,
244 CRYPTO_get_lock_name(type),
245 file,line);
246#endif
247 *pointer=ret;
248 }
249 else
250 {
251 CRYPTO_lock(CRYPTO_LOCK|CRYPTO_WRITE,type,file,line);
252
253 ret= *pointer+amount;
254#ifdef LOCK_DEBUG
255 fprintf(stderr,"ladd:%08lx:%2d+%2d->%2d %-18s %s:%d\n",
256 CRYPTO_thread_id(),
257 *pointer,amount,ret,
258 CRYPTO_get_lock_name(type),
259 file,line);
260#endif
261 *pointer=ret;
262 CRYPTO_lock(CRYPTO_UNLOCK|CRYPTO_WRITE,type,file,line);
263 }
264 return(ret);
265 }
266
267char *CRYPTO_get_lock_name(type)
268int type;
269 {
270 if (type < 0)
271 return("ERROR");
272 else if (type < CRYPTO_NUM_LOCKS)
273 return(lock_names[type]);
274 else if (type-CRYPTO_NUM_LOCKS >= sk_num(app_locks))
275 return("ERROR");
276 else
277 return(sk_value(app_locks,type-CRYPTO_NUM_LOCKS));
278 }
279
280#ifdef _DLL
281#ifdef WIN32
282
283/* All we really need to do is remove the 'error' state when a thread
284 * detaches */
285
286BOOL WINAPI DLLEntryPoint(hinstDLL,fdwReason,lpvReserved)
287HINSTANCE hinstDLL;
288DWORD fdwReason;
289LPVOID lpvReserved;
290 {
291 switch(fdwReason)
292 {
293 case DLL_PROCESS_ATTACH:
294 break;
295 case DLL_THREAD_ATTACH:
296 break;
297 case DLL_THREAD_DETACH:
298 ERR_remove_state(0);
299 break;
300 case DLL_PROCESS_DETACH:
301 break;
302 }
303 return(TRUE);
304 }
305#endif
306
307#endif