blob: 3bd8d158c90e2c3a7245735d1a6082914a840dbb [file] [log] [blame]
Ben Laurie4f43d0e1999-02-28 12:41:50 +00001/*! \file ssl/ssl_lib.c
2 * \brief Version independent SSL functions.
3 */
Ralf S. Engelschall58964a41998-12-21 10:56:39 +00004/* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com)
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +00005 * All rights reserved.
6 *
7 * This package is an SSL implementation written
8 * by Eric Young (eay@cryptsoft.com).
9 * The implementation was written so as to conform with Netscapes SSL.
10 *
11 * This library is free for commercial and non-commercial use as long as
12 * the following conditions are aheared to. The following conditions
13 * apply to all code found in this distribution, be it the RC4, RSA,
14 * lhash, DES, etc., code; not just the SSL code. The SSL documentation
15 * included with this distribution is covered by the same copyright terms
16 * except that the holder is Tim Hudson (tjh@cryptsoft.com).
17 *
18 * Copyright remains Eric Young's, and as such any Copyright notices in
19 * the code are not to be removed.
20 * If this package is used in a product, Eric Young should be given attribution
21 * as the author of the parts of the library used.
22 * This can be in the form of a textual message at program startup or
23 * in documentation (online or textual) provided with the package.
24 *
25 * Redistribution and use in source and binary forms, with or without
26 * modification, are permitted provided that the following conditions
27 * are met:
28 * 1. Redistributions of source code must retain the copyright
29 * notice, this list of conditions and the following disclaimer.
30 * 2. Redistributions in binary form must reproduce the above copyright
31 * notice, this list of conditions and the following disclaimer in the
32 * documentation and/or other materials provided with the distribution.
33 * 3. All advertising materials mentioning features or use of this software
34 * must display the following acknowledgement:
35 * "This product includes cryptographic software written by
36 * Eric Young (eay@cryptsoft.com)"
37 * The word 'cryptographic' can be left out if the rouines from the library
38 * being used are not cryptographic related :-).
39 * 4. If you include any Windows specific code (or a derivative thereof) from
40 * the apps directory (application code) you must include an acknowledgement:
41 * "This product includes software written by Tim Hudson (tjh@cryptsoft.com)"
42 *
43 * THIS SOFTWARE IS PROVIDED BY ERIC YOUNG ``AS IS'' AND
44 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
45 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
46 * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
47 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
48 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
49 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
50 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
51 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
52 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
53 * SUCH DAMAGE.
54 *
55 * The licence and distribution terms for any publically available version or
56 * derivative of this code cannot be changed. i.e. this code cannot simply be
57 * copied and put under another distribution licence
58 * [including the GNU Public Licence.]
59 */
60
61#include <stdio.h>
Bodo Möllerec577821999-04-23 22:13:45 +000062#include <openssl/objects.h>
63#include <openssl/lhash.h>
Dr. Stephen Hensonbb7cd4e1999-11-29 22:35:00 +000064#include <openssl/x509v3.h>
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +000065#include "ssl_locl.h"
66
Ben Laurieb4cadc61999-03-22 12:22:14 +000067char *SSL_version_str=OPENSSL_VERSION_TEXT;
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +000068
Ralf S. Engelschall58964a41998-12-21 10:56:39 +000069static STACK *ssl_meth=NULL;
70static STACK *ssl_ctx_meth=NULL;
71static int ssl_meth_num=0;
72static int ssl_ctx_meth_num=0;
73
Bodo Möller7f0dae31999-05-15 14:23:29 +000074OPENSSL_GLOBAL SSL3_ENC_METHOD ssl3_undef_enc_method={
Ralf S. Engelschall58964a41998-12-21 10:56:39 +000075 ssl_undefined_function,
76 ssl_undefined_function,
77 ssl_undefined_function,
78 ssl_undefined_function,
79 ssl_undefined_function,
80 ssl_undefined_function,
81 };
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +000082
Ben Laurie4f43d0e1999-02-28 12:41:50 +000083int SSL_clear(SSL *s)
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +000084 {
85 int state;
86
Mark J. Cox413c4f41999-02-16 09:22:21 +000087 if (s->method == NULL)
88 {
89 SSLerr(SSL_F_SSL_CLEAR,SSL_R_NO_METHOD_SPECIFIED);
90 return(0);
91 }
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +000092
93 s->error=0;
94 s->hit=0;
Mark J. Cox413c4f41999-02-16 09:22:21 +000095 s->shutdown=0;
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +000096
Mark J. Cox413c4f41999-02-16 09:22:21 +000097#if 0
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +000098 /* This is set if we are doing dynamic renegotiation so keep
99 * the old cipher. It is sort of a SSL_clear_lite :-) */
Mark J. Cox413c4f41999-02-16 09:22:21 +0000100 if (s->new_session) return(1);
101#endif
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +0000102
103 state=s->state; /* Keep to check if we throw away the session-id */
104 s->type=0;
105
Mark J. Cox413c4f41999-02-16 09:22:21 +0000106 s->state=SSL_ST_BEFORE|((s->server)?SSL_ST_ACCEPT:SSL_ST_CONNECT);
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +0000107
Mark J. Cox413c4f41999-02-16 09:22:21 +0000108 s->version=s->method->version;
109 s->client_version=s->version;
110 s->rwstate=SSL_NOTHING;
111 s->rstate=SSL_ST_READ_HEADER;
112 s->read_ahead=s->ctx->read_ahead;
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +0000113
114 if (s->init_buf != NULL)
115 {
116 BUF_MEM_free(s->init_buf);
117 s->init_buf=NULL;
118 }
119
120 ssl_clear_cipher_ctx(s);
121
122 if (ssl_clear_bad_session(s))
123 {
124 SSL_SESSION_free(s->session);
125 s->session=NULL;
126 }
127
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +0000128 s->first_packet=0;
129
Mark J. Cox413c4f41999-02-16 09:22:21 +0000130#if 1
131 /* Check to see if we were changed into a different method, if
132 * so, revert back if we are not doing session-id reuse. */
133 if ((s->session == NULL) && (s->method != s->ctx->method))
134 {
135 s->method->ssl_free(s);
136 s->method=s->ctx->method;
137 if (!s->method->ssl_new(s))
138 return(0);
139 }
140 else
141#endif
142 s->method->ssl_clear(s);
143 return(1);
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +0000144 }
145
Ben Laurie4f43d0e1999-02-28 12:41:50 +0000146/** Used to change an SSL_CTXs default SSL method type */
147int SSL_CTX_set_ssl_version(SSL_CTX *ctx,SSL_METHOD *meth)
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +0000148 {
Ben Laurief73e07c1999-04-12 17:23:57 +0000149 STACK_OF(SSL_CIPHER) *sk;
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +0000150
151 ctx->method=meth;
152
153 sk=ssl_create_cipher_list(ctx->method,&(ctx->cipher_list),
154 &(ctx->cipher_list_by_id),SSL_DEFAULT_CIPHER_LIST);
Ben Laurief73e07c1999-04-12 17:23:57 +0000155 if ((sk == NULL) || (sk_SSL_CIPHER_num(sk) <= 0))
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +0000156 {
157 SSLerr(SSL_F_SSL_CTX_SET_SSL_VERSION,SSL_R_SSL_LIBRARY_HAS_NO_CIPHERS);
158 return(0);
159 }
160 return(1);
161 }
162
Ben Laurie4f43d0e1999-02-28 12:41:50 +0000163SSL *SSL_new(SSL_CTX *ctx)
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +0000164 {
165 SSL *s;
166
167 if (ctx == NULL)
168 {
169 SSLerr(SSL_F_SSL_NEW,SSL_R_NULL_SSL_CTX);
170 return(NULL);
171 }
172 if (ctx->method == NULL)
173 {
174 SSLerr(SSL_F_SSL_NEW,SSL_R_SSL_CTX_HAS_NO_DEFAULT_SSL_VERSION);
175 return(NULL);
176 }
177
178 s=(SSL *)Malloc(sizeof(SSL));
179 if (s == NULL) goto err;
180 memset(s,0,sizeof(SSL));
181
Bodo Möllerca8e5b91999-05-09 20:12:44 +0000182 if (ctx->cert != NULL)
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +0000183 {
Bodo Möllerca8e5b91999-05-09 20:12:44 +0000184 /* Earlier library versions used to copy the pointer to
185 * the CERT, not its contents; only when setting new
186 * parameters for the per-SSL copy, ssl_cert_new would be
187 * called (and the direct reference to the per-SSL_CTX
188 * settings would be lost, but those still were indirectly
189 * accessed for various purposes, and for that reason they
190 * used to be known as s->ctx->default_cert).
191 * Now we don't look at the SSL_CTX's CERT after having
192 * duplicated it once. */
193
194 s->cert = ssl_cert_dup(ctx->cert);
195 if (s->cert == NULL)
196 goto err;
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +0000197 }
198 else
Bodo Möllerca8e5b91999-05-09 20:12:44 +0000199 s->cert=NULL; /* Cannot really happen (see SSL_CTX_new) */
Bodo Möller4eb77b21999-04-30 17:15:56 +0000200 s->sid_ctx_length=ctx->sid_ctx_length;
201 memcpy(&s->sid_ctx,&ctx->sid_ctx,sizeof(s->sid_ctx));
Mark J. Cox413c4f41999-02-16 09:22:21 +0000202 s->verify_mode=ctx->verify_mode;
Bodo Möller7f897141999-05-01 03:20:40 +0000203 s->verify_depth=ctx->verify_depth;
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +0000204 s->verify_callback=ctx->default_verify_callback;
Dr. Stephen Henson13938ac1999-11-29 01:09:25 +0000205 s->purpose = ctx->purpose;
206 s->trust = ctx->trust;
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +0000207 CRYPTO_add(&ctx->references,1,CRYPTO_LOCK_SSL_CTX);
208 s->ctx=ctx;
209
210 s->verify_result=X509_V_OK;
211
212 s->method=ctx->method;
213
214 if (!s->method->ssl_new(s))
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +0000215 goto err;
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +0000216
217 s->quiet_shutdown=ctx->quiet_shutdown;
Ralf S. Engelschall58964a41998-12-21 10:56:39 +0000218 s->references=1;
Mark J. Cox413c4f41999-02-16 09:22:21 +0000219 s->server=(ctx->method->ssl_accept == ssl_undefined_function)?0:1;
Ralf S. Engelschall58964a41998-12-21 10:56:39 +0000220 s->options=ctx->options;
Bodo Möllere1056431999-07-02 13:55:32 +0000221 s->mode=ctx->mode;
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +0000222 SSL_clear(s);
Ralf S. Engelschall58964a41998-12-21 10:56:39 +0000223
224 CRYPTO_new_ex_data(ssl_meth,(char *)s,&s->ex_data);
225
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +0000226 return(s);
227err:
Bodo Möllerca8e5b91999-05-09 20:12:44 +0000228 if (s != NULL)
229 {
230 if (s->cert != NULL)
231 ssl_cert_free(s->cert);
232 if (s->ctx != NULL)
233 SSL_CTX_free(s->ctx); /* decrement reference count */
234 Free(s);
235 }
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +0000236 SSLerr(SSL_F_SSL_NEW,ERR_R_MALLOC_FAILURE);
237 return(NULL);
238 }
239
Bodo Möller4eb77b21999-04-30 17:15:56 +0000240int SSL_CTX_set_session_id_context(SSL_CTX *ctx,const unsigned char *sid_ctx,
241 unsigned int sid_ctx_len)
242 {
243 if(sid_ctx_len > SSL_MAX_SID_CTX_LENGTH)
244 {
245 SSLerr(SSL_F_SSL_CTX_SET_SESSION_ID_CONTEXT,SSL_R_SSL_SESSION_ID_CONTEXT_TOO_LONG);
246 return 0;
247 }
248 ctx->sid_ctx_length=sid_ctx_len;
249 memcpy(ctx->sid_ctx,sid_ctx,sid_ctx_len);
250
251 return 1;
252 }
253
Ben Laurieb4cadc61999-03-22 12:22:14 +0000254int SSL_set_session_id_context(SSL *ssl,const unsigned char *sid_ctx,
255 unsigned int sid_ctx_len)
256 {
257 if(sid_ctx_len > SSL_MAX_SID_CTX_LENGTH)
258 {
259 SSLerr(SSL_F_SSL_SET_SESSION_ID_CONTEXT,SSL_R_SSL_SESSION_ID_CONTEXT_TOO_LONG);
260 return 0;
261 }
262 ssl->sid_ctx_length=sid_ctx_len;
263 memcpy(ssl->sid_ctx,sid_ctx,sid_ctx_len);
264
265 return 1;
266 }
267
Dr. Stephen Hensonbb7cd4e1999-11-29 22:35:00 +0000268int SSL_CTX_set_purpose(SSL_CTX *s, int purpose)
269{
270 if(X509_PURPOSE_get_by_id(purpose) == -1) {
271 SSLerr(SSL_F_SSL_CTX_SET_PURPOSE, SSL_R_INVALID_PURPOSE);
272 return 0;
273 }
274 s->purpose = purpose;
275 return 1;
276}
277
278int SSL_set_purpose(SSL *s, int purpose)
279{
280 if(X509_PURPOSE_get_by_id(purpose) == -1) {
281 SSLerr(SSL_F_SSL_SET_PURPOSE, SSL_R_INVALID_PURPOSE);
282 return 0;
283 }
284 s->purpose = purpose;
285 return 1;
286}
287
288int SSL_CTX_set_trust(SSL_CTX *s, int trust)
289{
290 if(X509_TRUST_get_by_id(trust) == -1) {
291 SSLerr(SSL_F_SSL_CTX_SET_TRUST, SSL_R_INVALID_TRUST);
292 return 0;
293 }
294 s->trust = trust;
295 return 1;
296}
297
298int SSL_set_trust(SSL *s, int trust)
299{
300 if(X509_TRUST_get_by_id(trust) == -1) {
301 SSLerr(SSL_F_SSL_SET_TRUST, SSL_R_INVALID_TRUST);
302 return 0;
303 }
304 s->trust = trust;
305 return 1;
306}
307
Ben Laurie4f43d0e1999-02-28 12:41:50 +0000308void SSL_free(SSL *s)
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +0000309 {
Ralf S. Engelschall58964a41998-12-21 10:56:39 +0000310 int i;
311
Ben Lauriee03ddfa1999-01-07 19:15:59 +0000312 if(s == NULL)
313 return;
314
Ralf S. Engelschall58964a41998-12-21 10:56:39 +0000315 i=CRYPTO_add(&s->references,-1,CRYPTO_LOCK_SSL);
316#ifdef REF_PRINT
317 REF_PRINT("SSL",s);
318#endif
319 if (i > 0) return;
320#ifdef REF_CHECK
321 if (i < 0)
322 {
323 fprintf(stderr,"SSL_free, bad reference count\n");
324 abort(); /* ok */
325 }
326#endif
327
328 CRYPTO_free_ex_data(ssl_meth,(char *)s,&s->ex_data);
329
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +0000330 if (s->bbio != NULL)
331 {
332 /* If the buffering BIO is in place, pop it off */
333 if (s->bbio == s->wbio)
334 {
335 s->wbio=BIO_pop(s->wbio);
336 }
337 BIO_free(s->bbio);
Ralf S. Engelschall58964a41998-12-21 10:56:39 +0000338 s->bbio=NULL;
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +0000339 }
340 if (s->rbio != NULL)
341 BIO_free_all(s->rbio);
342 if ((s->wbio != NULL) && (s->wbio != s->rbio))
343 BIO_free_all(s->wbio);
344
345 if (s->init_buf != NULL) BUF_MEM_free(s->init_buf);
346
347 /* add extra stuff */
Ben Laurief73e07c1999-04-12 17:23:57 +0000348 if (s->cipher_list != NULL) sk_SSL_CIPHER_free(s->cipher_list);
349 if (s->cipher_list_by_id != NULL) sk_SSL_CIPHER_free(s->cipher_list_by_id);
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +0000350
351 /* Make the next call work :-) */
352 if (s->session != NULL)
353 {
354 ssl_clear_bad_session(s);
355 SSL_SESSION_free(s->session);
356 }
357
358 ssl_clear_cipher_ctx(s);
359
360 if (s->cert != NULL) ssl_cert_free(s->cert);
361 /* Free up if allocated */
362
363 if (s->ctx) SSL_CTX_free(s->ctx);
364
365 if (s->client_CA != NULL)
Ben Laurief73e07c1999-04-12 17:23:57 +0000366 sk_X509_NAME_pop_free(s->client_CA,X509_NAME_free);
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +0000367
368 if (s->method != NULL) s->method->ssl_free(s);
369
370 Free((char *)s);
371 }
372
Ben Laurie4f43d0e1999-02-28 12:41:50 +0000373void SSL_set_bio(SSL *s,BIO *rbio,BIO *wbio)
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +0000374 {
375 /* If the output buffering BIO is still in place, remove it
376 */
377 if (s->bbio != NULL)
378 {
379 if (s->wbio == s->bbio)
380 {
381 s->wbio=s->wbio->next_bio;
382 s->bbio->next_bio=NULL;
383 }
384 }
385 if ((s->rbio != NULL) && (s->rbio != rbio))
386 BIO_free_all(s->rbio);
387 if ((s->wbio != NULL) && (s->wbio != wbio) && (s->rbio != s->wbio))
388 BIO_free_all(s->wbio);
389 s->rbio=rbio;
390 s->wbio=wbio;
391 }
392
Ben Laurie4f43d0e1999-02-28 12:41:50 +0000393BIO *SSL_get_rbio(SSL *s)
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +0000394 { return(s->rbio); }
395
Ben Laurie4f43d0e1999-02-28 12:41:50 +0000396BIO *SSL_get_wbio(SSL *s)
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +0000397 { return(s->wbio); }
398
Ben Laurie4f43d0e1999-02-28 12:41:50 +0000399int SSL_get_fd(SSL *s)
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +0000400 {
401 int ret= -1;
402 BIO *b,*r;
403
404 b=SSL_get_rbio(s);
405 r=BIO_find_type(b,BIO_TYPE_DESCRIPTOR);
406 if (r != NULL)
407 BIO_get_fd(r,&ret);
408 return(ret);
409 }
410
411#ifndef NO_SOCK
Ben Laurie4f43d0e1999-02-28 12:41:50 +0000412int SSL_set_fd(SSL *s,int fd)
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +0000413 {
414 int ret=0;
415 BIO *bio=NULL;
416
417 bio=BIO_new(BIO_s_socket());
418
419 if (bio == NULL)
420 {
421 SSLerr(SSL_F_SSL_SET_FD,ERR_R_BUF_LIB);
422 goto err;
423 }
424 BIO_set_fd(bio,fd,BIO_NOCLOSE);
425 SSL_set_bio(s,bio,bio);
426 ret=1;
427err:
428 return(ret);
429 }
430
Ben Laurie4f43d0e1999-02-28 12:41:50 +0000431int SSL_set_wfd(SSL *s,int fd)
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +0000432 {
433 int ret=0;
434 BIO *bio=NULL;
435
Ralf S. Engelschall58964a41998-12-21 10:56:39 +0000436 if ((s->rbio == NULL) || (BIO_method_type(s->rbio) != BIO_TYPE_SOCKET)
437 || ((int)BIO_get_fd(s->rbio,NULL) != fd))
438 {
439 bio=BIO_new(BIO_s_socket());
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +0000440
Ralf S. Engelschall58964a41998-12-21 10:56:39 +0000441 if (bio == NULL)
442 { SSLerr(SSL_F_SSL_SET_WFD,ERR_R_BUF_LIB); goto err; }
443 BIO_set_fd(bio,fd,BIO_NOCLOSE);
444 SSL_set_bio(s,SSL_get_rbio(s),bio);
445 }
446 else
447 SSL_set_bio(s,SSL_get_rbio(s),SSL_get_rbio(s));
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +0000448 ret=1;
449err:
450 return(ret);
451 }
452
Ben Laurie4f43d0e1999-02-28 12:41:50 +0000453int SSL_set_rfd(SSL *s,int fd)
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +0000454 {
455 int ret=0;
456 BIO *bio=NULL;
457
Ralf S. Engelschall58964a41998-12-21 10:56:39 +0000458 if ((s->wbio == NULL) || (BIO_method_type(s->wbio) != BIO_TYPE_SOCKET)
459 || ((int)BIO_get_fd(s->wbio,NULL) != fd))
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +0000460 {
Ralf S. Engelschall58964a41998-12-21 10:56:39 +0000461 bio=BIO_new(BIO_s_socket());
462
463 if (bio == NULL)
464 {
465 SSLerr(SSL_F_SSL_SET_RFD,ERR_R_BUF_LIB);
466 goto err;
467 }
468 BIO_set_fd(bio,fd,BIO_NOCLOSE);
469 SSL_set_bio(s,bio,SSL_get_wbio(s));
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +0000470 }
Ralf S. Engelschall58964a41998-12-21 10:56:39 +0000471 else
472 SSL_set_bio(s,SSL_get_wbio(s),SSL_get_wbio(s));
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +0000473 ret=1;
474err:
475 return(ret);
476 }
477#endif
478
Ben Laurie4f43d0e1999-02-28 12:41:50 +0000479int SSL_get_verify_mode(SSL *s)
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +0000480 {
481 return(s->verify_mode);
482 }
483
Bodo Möller7f897141999-05-01 03:20:40 +0000484int SSL_get_verify_depth(SSL *s)
485 {
486 return(s->verify_depth);
487 }
488
Ralf S. Engelschalla06c6021999-03-04 07:54:01 +0000489int (*SSL_get_verify_callback(SSL *s))(int,X509_STORE_CTX *)
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +0000490 {
491 return(s->verify_callback);
492 }
493
Ben Laurie4f43d0e1999-02-28 12:41:50 +0000494int SSL_CTX_get_verify_mode(SSL_CTX *ctx)
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +0000495 {
Mark J. Cox413c4f41999-02-16 09:22:21 +0000496 return(ctx->verify_mode);
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +0000497 }
498
Bodo Möller7f897141999-05-01 03:20:40 +0000499int SSL_CTX_get_verify_depth(SSL_CTX *ctx)
500 {
501 return(ctx->verify_depth);
502 }
503
Ralf S. Engelschalla06c6021999-03-04 07:54:01 +0000504int (*SSL_CTX_get_verify_callback(SSL_CTX *ctx))(int,X509_STORE_CTX *)
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +0000505 {
506 return(ctx->default_verify_callback);
507 }
508
Ben Laurie49bc2621999-02-28 14:39:18 +0000509void SSL_set_verify(SSL *s,int mode,
510 int (*callback)(int ok,X509_STORE_CTX *ctx))
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +0000511 {
512 s->verify_mode=mode;
513 if (callback != NULL)
514 s->verify_callback=callback;
515 }
516
Bodo Möller7f897141999-05-01 03:20:40 +0000517void SSL_set_verify_depth(SSL *s,int depth)
518 {
519 s->verify_depth=depth;
520 }
521
Ben Laurie4f43d0e1999-02-28 12:41:50 +0000522void SSL_set_read_ahead(SSL *s,int yes)
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +0000523 {
524 s->read_ahead=yes;
525 }
526
Ben Laurie4f43d0e1999-02-28 12:41:50 +0000527int SSL_get_read_ahead(SSL *s)
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +0000528 {
529 return(s->read_ahead);
530 }
531
Ben Laurie4f43d0e1999-02-28 12:41:50 +0000532int SSL_pending(SSL *s)
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +0000533 {
534 return(s->method->ssl_pending(s));
535 }
536
Ben Laurie4f43d0e1999-02-28 12:41:50 +0000537X509 *SSL_get_peer_certificate(SSL *s)
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +0000538 {
539 X509 *r;
540
541 if ((s == NULL) || (s->session == NULL))
542 r=NULL;
543 else
544 r=s->session->peer;
545
546 if (r == NULL) return(r);
547
548 CRYPTO_add(&r->references,1,CRYPTO_LOCK_X509);
549
550 return(r);
551 }
552
Ben Laurief73e07c1999-04-12 17:23:57 +0000553STACK_OF(X509) *SSL_get_peer_cert_chain(SSL *s)
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +0000554 {
Ben Laurief73e07c1999-04-12 17:23:57 +0000555 STACK_OF(X509) *r;
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +0000556
Bodo Möller9d5ccea1999-05-09 21:22:45 +0000557 if ((s == NULL) || (s->session == NULL) || (s->session->sess_cert == NULL))
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +0000558 r=NULL;
559 else
Bodo Möller9d5ccea1999-05-09 21:22:45 +0000560 r=s->session->sess_cert->cert_chain;
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +0000561
562 return(r);
563 }
564
565/* Now in theory, since the calling process own 't' it should be safe to
566 * modify. We need to be able to read f without being hassled */
Ben Laurie4f43d0e1999-02-28 12:41:50 +0000567void SSL_copy_session_id(SSL *t,SSL *f)
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +0000568 {
569 CERT *tmp;
570
571 /* Do we need to to SSL locking? */
572 SSL_set_session(t,SSL_get_session(f));
573
574 /* what if we are setup as SSLv2 but want to talk SSLv3 or
575 * vice-versa */
576 if (t->method != f->method)
577 {
578 t->method->ssl_free(t); /* cleanup current */
579 t->method=f->method; /* change method */
580 t->method->ssl_new(t); /* setup new */
581 }
582
583 tmp=t->cert;
584 if (f->cert != NULL)
585 {
586 CRYPTO_add(&f->cert->references,1,CRYPTO_LOCK_SSL_CERT);
587 t->cert=f->cert;
588 }
589 else
590 t->cert=NULL;
591 if (tmp != NULL) ssl_cert_free(tmp);
Ben Laurieb4cadc61999-03-22 12:22:14 +0000592 SSL_set_session_id_context(t,f->sid_ctx,f->sid_ctx_length);
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +0000593 }
594
Ralf S. Engelschall58964a41998-12-21 10:56:39 +0000595/* Fix this so it checks all the valid key/cert options */
Ben Laurie4f43d0e1999-02-28 12:41:50 +0000596int SSL_CTX_check_private_key(SSL_CTX *ctx)
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +0000597 {
598 if ( (ctx == NULL) ||
Bodo Möllerca8e5b91999-05-09 20:12:44 +0000599 (ctx->cert == NULL) ||
600 (ctx->cert->key->x509 == NULL))
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +0000601 {
602 SSLerr(SSL_F_SSL_CTX_CHECK_PRIVATE_KEY,SSL_R_NO_CERTIFICATE_ASSIGNED);
603 return(0);
604 }
Bodo Möllerca8e5b91999-05-09 20:12:44 +0000605 if (ctx->cert->key->privatekey == NULL)
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +0000606 {
607 SSLerr(SSL_F_SSL_CTX_CHECK_PRIVATE_KEY,SSL_R_NO_PRIVATE_KEY_ASSIGNED);
608 return(0);
609 }
Bodo Möllerca8e5b91999-05-09 20:12:44 +0000610 return(X509_check_private_key(ctx->cert->key->x509, ctx->cert->key->privatekey));
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +0000611 }
612
Ralf S. Engelschall58964a41998-12-21 10:56:39 +0000613/* Fix this function so that it takes an optional type parameter */
Ben Laurie4f43d0e1999-02-28 12:41:50 +0000614int SSL_check_private_key(SSL *ssl)
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +0000615 {
616 if (ssl == NULL)
617 {
618 SSLerr(SSL_F_SSL_CHECK_PRIVATE_KEY,ERR_R_PASSED_NULL_PARAMETER);
619 return(0);
620 }
Bodo Möllerf3e67ac1999-08-02 20:09:23 +0000621 if (ssl->cert == NULL)
Bodo Möller2b8e4951999-08-02 21:41:46 +0000622 {
623 SSLerr(SSL_F_SSL_CHECK_PRIVATE_KEY,SSL_R_NO_CERTIFICATE_ASSIGNED);
Bodo Möllerf3e67ac1999-08-02 20:09:23 +0000624 return 0;
Bodo Möller2b8e4951999-08-02 21:41:46 +0000625 }
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +0000626 if (ssl->cert->key->x509 == NULL)
627 {
628 SSLerr(SSL_F_SSL_CHECK_PRIVATE_KEY,SSL_R_NO_CERTIFICATE_ASSIGNED);
629 return(0);
630 }
631 if (ssl->cert->key->privatekey == NULL)
632 {
633 SSLerr(SSL_F_SSL_CHECK_PRIVATE_KEY,SSL_R_NO_PRIVATE_KEY_ASSIGNED);
634 return(0);
635 }
636 return(X509_check_private_key(ssl->cert->key->x509,
637 ssl->cert->key->privatekey));
638 }
639
Ben Laurie4f43d0e1999-02-28 12:41:50 +0000640int SSL_accept(SSL *s)
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +0000641 {
Bodo Möllerb31b04d1999-05-11 07:43:16 +0000642 if (s->handshake_func == 0)
643 /* Not properly initialized yet */
644 SSL_set_accept_state(s);
645
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +0000646 return(s->method->ssl_accept(s));
647 }
648
Ben Laurie4f43d0e1999-02-28 12:41:50 +0000649int SSL_connect(SSL *s)
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +0000650 {
Bodo Möllerb31b04d1999-05-11 07:43:16 +0000651 if (s->handshake_func == 0)
652 /* Not properly initialized yet */
653 SSL_set_connect_state(s);
654
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +0000655 return(s->method->ssl_connect(s));
656 }
657
Ben Laurie4f43d0e1999-02-28 12:41:50 +0000658long SSL_get_default_timeout(SSL *s)
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +0000659 {
660 return(s->method->get_timeout());
661 }
662
Ben Laurie4f43d0e1999-02-28 12:41:50 +0000663int SSL_read(SSL *s,char *buf,int num)
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +0000664 {
Bodo Möllerb31b04d1999-05-11 07:43:16 +0000665 if (s->handshake_func == 0)
666 {
Bodo Möllerff712221999-05-11 07:54:38 +0000667 SSLerr(SSL_F_SSL_READ, SSL_R_UNINITIALIZED);
Bodo Möllerb31b04d1999-05-11 07:43:16 +0000668 return -1;
669 }
670
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +0000671 if (s->shutdown & SSL_RECEIVED_SHUTDOWN)
672 {
673 s->rwstate=SSL_NOTHING;
674 return(0);
675 }
676 return(s->method->ssl_read(s,buf,num));
677 }
678
Ben Laurie4f43d0e1999-02-28 12:41:50 +0000679int SSL_peek(SSL *s,char *buf,int num)
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +0000680 {
681 if (s->shutdown & SSL_RECEIVED_SHUTDOWN)
682 {
683 return(0);
684 }
685 return(s->method->ssl_peek(s,buf,num));
686 }
687
Ben Laurie4f43d0e1999-02-28 12:41:50 +0000688int SSL_write(SSL *s,const char *buf,int num)
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +0000689 {
Bodo Möllerb31b04d1999-05-11 07:43:16 +0000690 if (s->handshake_func == 0)
691 {
Bodo Möllerff712221999-05-11 07:54:38 +0000692 SSLerr(SSL_F_SSL_WRITE, SSL_R_UNINITIALIZED);
Bodo Möllerb31b04d1999-05-11 07:43:16 +0000693 return -1;
694 }
695
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +0000696 if (s->shutdown & SSL_SENT_SHUTDOWN)
697 {
698 s->rwstate=SSL_NOTHING;
699 SSLerr(SSL_F_SSL_WRITE,SSL_R_PROTOCOL_IS_SHUTDOWN);
700 return(-1);
701 }
702 return(s->method->ssl_write(s,buf,num));
703 }
704
Ben Laurie4f43d0e1999-02-28 12:41:50 +0000705int SSL_shutdown(SSL *s)
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +0000706 {
Bodo Möllerd3407351999-05-15 10:40:02 +0000707 /* Note that this function behaves differently from what one might
Bodo Möllere2e3d5c1999-05-15 00:00:28 +0000708 * expect. Return values are 0 for no success (yet),
709 * 1 for success; but calling it once is usually not enough,
710 * even if blocking I/O is used (see ssl3_shutdown).
711 */
712
Bodo Möllerb31b04d1999-05-11 07:43:16 +0000713 if (s->handshake_func == 0)
714 {
Bodo Möllerff712221999-05-11 07:54:38 +0000715 SSLerr(SSL_F_SSL_SHUTDOWN, SSL_R_UNINITIALIZED);
Bodo Möllerb31b04d1999-05-11 07:43:16 +0000716 return -1;
717 }
718
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +0000719 if ((s != NULL) && !SSL_in_init(s))
720 return(s->method->ssl_shutdown(s));
721 else
722 return(1);
723 }
724
Ben Laurie4f43d0e1999-02-28 12:41:50 +0000725int SSL_renegotiate(SSL *s)
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +0000726 {
Ralf S. Engelschall58964a41998-12-21 10:56:39 +0000727 s->new_session=1;
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +0000728 return(s->method->ssl_renegotiate(s));
729 }
730
Ben Laurie4f43d0e1999-02-28 12:41:50 +0000731long SSL_ctrl(SSL *s,int cmd,long larg,char *parg)
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +0000732 {
Mark J. Cox413c4f41999-02-16 09:22:21 +0000733 long l;
734
735 switch (cmd)
736 {
737 case SSL_CTRL_GET_READ_AHEAD:
738 return(s->read_ahead);
739 case SSL_CTRL_SET_READ_AHEAD:
740 l=s->read_ahead;
741 s->read_ahead=larg;
742 return(l);
743 case SSL_CTRL_OPTIONS:
744 return(s->options|=larg);
Bodo Möllere1056431999-07-02 13:55:32 +0000745 case SSL_CTRL_MODE:
746 return(s->mode|=larg);
Mark J. Cox413c4f41999-02-16 09:22:21 +0000747 default:
748 return(s->method->ssl_ctrl(s,cmd,larg,parg));
749 }
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +0000750 }
751
Ben Laurie4f43d0e1999-02-28 12:41:50 +0000752long SSL_CTX_ctrl(SSL_CTX *ctx,int cmd,long larg,char *parg)
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +0000753 {
Mark J. Cox413c4f41999-02-16 09:22:21 +0000754 long l;
755
756 switch (cmd)
757 {
758 case SSL_CTRL_GET_READ_AHEAD:
759 return(ctx->read_ahead);
760 case SSL_CTRL_SET_READ_AHEAD:
761 l=ctx->read_ahead;
762 ctx->read_ahead=larg;
763 return(l);
764
765 case SSL_CTRL_SET_SESS_CACHE_SIZE:
766 l=ctx->session_cache_size;
767 ctx->session_cache_size=larg;
768 return(l);
769 case SSL_CTRL_GET_SESS_CACHE_SIZE:
770 return(ctx->session_cache_size);
771 case SSL_CTRL_SET_SESS_CACHE_MODE:
772 l=ctx->session_cache_mode;
773 ctx->session_cache_mode=larg;
774 return(l);
775 case SSL_CTRL_GET_SESS_CACHE_MODE:
776 return(ctx->session_cache_mode);
777
778 case SSL_CTRL_SESS_NUMBER:
779 return(ctx->sessions->num_items);
780 case SSL_CTRL_SESS_CONNECT:
781 return(ctx->stats.sess_connect);
782 case SSL_CTRL_SESS_CONNECT_GOOD:
783 return(ctx->stats.sess_connect_good);
784 case SSL_CTRL_SESS_CONNECT_RENEGOTIATE:
785 return(ctx->stats.sess_connect_renegotiate);
786 case SSL_CTRL_SESS_ACCEPT:
787 return(ctx->stats.sess_accept);
788 case SSL_CTRL_SESS_ACCEPT_GOOD:
789 return(ctx->stats.sess_accept_good);
790 case SSL_CTRL_SESS_ACCEPT_RENEGOTIATE:
791 return(ctx->stats.sess_accept_renegotiate);
792 case SSL_CTRL_SESS_HIT:
793 return(ctx->stats.sess_hit);
794 case SSL_CTRL_SESS_CB_HIT:
795 return(ctx->stats.sess_cb_hit);
796 case SSL_CTRL_SESS_MISSES:
797 return(ctx->stats.sess_miss);
798 case SSL_CTRL_SESS_TIMEOUTS:
799 return(ctx->stats.sess_timeout);
800 case SSL_CTRL_SESS_CACHE_FULL:
801 return(ctx->stats.sess_cache_full);
802 case SSL_CTRL_OPTIONS:
803 return(ctx->options|=larg);
Bodo Möllere1056431999-07-02 13:55:32 +0000804 case SSL_CTRL_MODE:
805 return(ctx->mode|=larg);
Mark J. Cox413c4f41999-02-16 09:22:21 +0000806 default:
807 return(ctx->method->ssl_ctx_ctrl(ctx,cmd,larg,parg));
808 }
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +0000809 }
810
Ben Laurie4f43d0e1999-02-28 12:41:50 +0000811int ssl_cipher_id_cmp(SSL_CIPHER *a,SSL_CIPHER *b)
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +0000812 {
813 long l;
814
815 l=a->id-b->id;
816 if (l == 0L)
817 return(0);
818 else
819 return((l > 0)?1:-1);
820 }
821
Ben Laurie4f43d0e1999-02-28 12:41:50 +0000822int ssl_cipher_ptr_id_cmp(SSL_CIPHER **ap,SSL_CIPHER **bp)
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +0000823 {
824 long l;
825
826 l=(*ap)->id-(*bp)->id;
827 if (l == 0L)
828 return(0);
829 else
830 return((l > 0)?1:-1);
831 }
832
Ben Laurie4f43d0e1999-02-28 12:41:50 +0000833/** return a STACK of the ciphers available for the SSL and in order of
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +0000834 * preference */
Ben Laurief73e07c1999-04-12 17:23:57 +0000835STACK_OF(SSL_CIPHER) *SSL_get_ciphers(SSL *s)
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +0000836 {
837 if ((s != NULL) && (s->cipher_list != NULL))
838 {
839 return(s->cipher_list);
840 }
Ralf S. Engelschall58964a41998-12-21 10:56:39 +0000841 else if ((s->ctx != NULL) &&
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +0000842 (s->ctx->cipher_list != NULL))
843 {
844 return(s->ctx->cipher_list);
845 }
846 return(NULL);
847 }
848
Ben Laurie4f43d0e1999-02-28 12:41:50 +0000849/** return a STACK of the ciphers available for the SSL and in order of
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +0000850 * algorithm id */
Ben Laurief73e07c1999-04-12 17:23:57 +0000851STACK_OF(SSL_CIPHER) *ssl_get_ciphers_by_id(SSL *s)
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +0000852 {
853 if ((s != NULL) && (s->cipher_list_by_id != NULL))
854 {
855 return(s->cipher_list_by_id);
856 }
857 else if ((s != NULL) && (s->ctx != NULL) &&
858 (s->ctx->cipher_list_by_id != NULL))
859 {
860 return(s->ctx->cipher_list_by_id);
861 }
862 return(NULL);
863 }
864
Ben Laurie4f43d0e1999-02-28 12:41:50 +0000865/** The old interface to get the same thing as SSL_get_ciphers() */
Ben Lauriee7788021999-04-17 21:25:43 +0000866const char *SSL_get_cipher_list(SSL *s,int n)
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +0000867 {
868 SSL_CIPHER *c;
Ben Laurief73e07c1999-04-12 17:23:57 +0000869 STACK_OF(SSL_CIPHER) *sk;
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +0000870
871 if (s == NULL) return(NULL);
872 sk=SSL_get_ciphers(s);
Ben Laurief73e07c1999-04-12 17:23:57 +0000873 if ((sk == NULL) || (sk_SSL_CIPHER_num(sk) <= n))
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +0000874 return(NULL);
Ben Laurief73e07c1999-04-12 17:23:57 +0000875 c=sk_SSL_CIPHER_value(sk,n);
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +0000876 if (c == NULL) return(NULL);
877 return(c->name);
878 }
879
Ben Laurie4f43d0e1999-02-28 12:41:50 +0000880/** specify the ciphers to be used by defaut by the SSL_CTX */
881int SSL_CTX_set_cipher_list(SSL_CTX *ctx,char *str)
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +0000882 {
Ben Laurief73e07c1999-04-12 17:23:57 +0000883 STACK_OF(SSL_CIPHER) *sk;
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +0000884
885 sk=ssl_create_cipher_list(ctx->method,&ctx->cipher_list,
886 &ctx->cipher_list_by_id,str);
887/* XXXX */
888 return((sk == NULL)?0:1);
889 }
890
Ben Laurie4f43d0e1999-02-28 12:41:50 +0000891/** specify the ciphers to be used by the SSL */
892int SSL_set_cipher_list(SSL *s,char *str)
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +0000893 {
Ben Laurief73e07c1999-04-12 17:23:57 +0000894 STACK_OF(SSL_CIPHER) *sk;
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +0000895
896 sk=ssl_create_cipher_list(s->ctx->method,&s->cipher_list,
897 &s->cipher_list_by_id,str);
898/* XXXX */
899 return((sk == NULL)?0:1);
900 }
901
902/* works well for SSLv2, not so good for SSLv3 */
Ben Laurie4f43d0e1999-02-28 12:41:50 +0000903char *SSL_get_shared_ciphers(SSL *s,char *buf,int len)
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +0000904 {
Ben Lauriee7788021999-04-17 21:25:43 +0000905 char *p;
906 const char *cp;
Ben Laurief73e07c1999-04-12 17:23:57 +0000907 STACK_OF(SSL_CIPHER) *sk;
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +0000908 SSL_CIPHER *c;
909 int i;
910
911 if ((s->session == NULL) || (s->session->ciphers == NULL) ||
912 (len < 2))
913 return(NULL);
914
915 p=buf;
916 sk=s->session->ciphers;
Ben Laurief73e07c1999-04-12 17:23:57 +0000917 for (i=0; i<sk_SSL_CIPHER_num(sk); i++)
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +0000918 {
Ralf S. Engelschall58964a41998-12-21 10:56:39 +0000919 /* Decrement for either the ':' or a '\0' */
920 len--;
Ben Laurief73e07c1999-04-12 17:23:57 +0000921 c=sk_SSL_CIPHER_value(sk,i);
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +0000922 for (cp=c->name; *cp; )
923 {
Ralf S. Engelschall58964a41998-12-21 10:56:39 +0000924 if (len-- == 0)
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +0000925 {
926 *p='\0';
927 return(buf);
928 }
929 else
930 *(p++)= *(cp++);
931 }
932 *(p++)=':';
933 }
934 p[-1]='\0';
935 return(buf);
936 }
937
Ben Laurief73e07c1999-04-12 17:23:57 +0000938int ssl_cipher_list_to_bytes(SSL *s,STACK_OF(SSL_CIPHER) *sk,unsigned char *p)
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +0000939 {
940 int i,j=0;
941 SSL_CIPHER *c;
942 unsigned char *q;
943
944 if (sk == NULL) return(0);
945 q=p;
946
Ben Laurief73e07c1999-04-12 17:23:57 +0000947 for (i=0; i<sk_SSL_CIPHER_num(sk); i++)
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +0000948 {
Ben Laurief73e07c1999-04-12 17:23:57 +0000949 c=sk_SSL_CIPHER_value(sk,i);
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +0000950 j=ssl_put_cipher_by_char(s,c,p);
951 p+=j;
952 }
953 return(p-q);
954 }
955
Ben Laurief73e07c1999-04-12 17:23:57 +0000956STACK_OF(SSL_CIPHER) *ssl_bytes_to_cipher_list(SSL *s,unsigned char *p,int num,
957 STACK_OF(SSL_CIPHER) **skp)
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +0000958 {
959 SSL_CIPHER *c;
Ben Laurief73e07c1999-04-12 17:23:57 +0000960 STACK_OF(SSL_CIPHER) *sk;
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +0000961 int i,n;
962
963 n=ssl_put_cipher_by_char(s,NULL,NULL);
964 if ((num%n) != 0)
965 {
966 SSLerr(SSL_F_SSL_BYTES_TO_CIPHER_LIST,SSL_R_ERROR_IN_RECEIVED_CIPHER_LIST);
967 return(NULL);
968 }
969 if ((skp == NULL) || (*skp == NULL))
Ben Laurief73e07c1999-04-12 17:23:57 +0000970 sk=sk_SSL_CIPHER_new(NULL); /* change perhaps later */
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +0000971 else
972 {
973 sk= *skp;
Ben Laurief73e07c1999-04-12 17:23:57 +0000974 sk_SSL_CIPHER_zero(sk);
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +0000975 }
976
977 for (i=0; i<num; i+=n)
978 {
979 c=ssl_get_cipher_by_char(s,p);
980 p+=n;
981 if (c != NULL)
982 {
Ben Laurief73e07c1999-04-12 17:23:57 +0000983 if (!sk_SSL_CIPHER_push(sk,c))
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +0000984 {
985 SSLerr(SSL_F_SSL_BYTES_TO_CIPHER_LIST,ERR_R_MALLOC_FAILURE);
986 goto err;
987 }
988 }
989 }
990
991 if (skp != NULL)
992 *skp=sk;
993 return(sk);
994err:
995 if ((skp == NULL) || (*skp == NULL))
Ben Laurief73e07c1999-04-12 17:23:57 +0000996 sk_SSL_CIPHER_free(sk);
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +0000997 return(NULL);
998 }
999
Ben Laurie4f43d0e1999-02-28 12:41:50 +00001000unsigned long SSL_SESSION_hash(SSL_SESSION *a)
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +00001001 {
1002 unsigned long l;
1003
Ralf S. Engelschalldfeab061998-12-21 11:00:56 +00001004 l=(unsigned long)
1005 ((unsigned int) a->session_id[0] )|
1006 ((unsigned int) a->session_id[1]<< 8L)|
1007 ((unsigned long)a->session_id[2]<<16L)|
1008 ((unsigned long)a->session_id[3]<<24L);
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +00001009 return(l);
1010 }
1011
Ben Laurie4f43d0e1999-02-28 12:41:50 +00001012int SSL_SESSION_cmp(SSL_SESSION *a,SSL_SESSION *b)
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +00001013 {
Ralf S. Engelschall58964a41998-12-21 10:56:39 +00001014 if (a->ssl_version != b->ssl_version)
1015 return(1);
1016 if (a->session_id_length != b->session_id_length)
1017 return(1);
1018 return(memcmp(a->session_id,b->session_id,a->session_id_length));
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +00001019 }
1020
Ben Laurie4f43d0e1999-02-28 12:41:50 +00001021SSL_CTX *SSL_CTX_new(SSL_METHOD *meth)
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +00001022 {
Ralf S. Engelschalldfeab061998-12-21 11:00:56 +00001023 SSL_CTX *ret=NULL;
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +00001024
1025 if (meth == NULL)
1026 {
1027 SSLerr(SSL_F_SSL_CTX_NEW,SSL_R_NULL_SSL_METHOD_PASSED);
1028 return(NULL);
1029 }
Ralf S. Engelschalldfeab061998-12-21 11:00:56 +00001030
1031 if (SSL_get_ex_data_X509_STORE_CTX_idx() < 0)
1032 {
1033 SSLerr(SSL_F_SSL_CTX_NEW,SSL_R_X509_VERIFICATION_SETUP_PROBLEMS);
1034 goto err;
1035 }
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +00001036 ret=(SSL_CTX *)Malloc(sizeof(SSL_CTX));
1037 if (ret == NULL)
1038 goto err;
1039
1040 memset(ret,0,sizeof(SSL_CTX));
1041
1042 ret->method=meth;
1043
1044 ret->cert_store=NULL;
1045 ret->session_cache_mode=SSL_SESS_CACHE_SERVER;
Ralf S. Engelschall58964a41998-12-21 10:56:39 +00001046 ret->session_cache_size=SSL_SESSION_CACHE_MAX_SIZE_DEFAULT;
1047 ret->session_cache_head=NULL;
1048 ret->session_cache_tail=NULL;
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +00001049
1050 /* We take the system default */
1051 ret->session_timeout=meth->get_timeout();
1052
1053 ret->new_session_cb=NULL;
1054 ret->remove_session_cb=NULL;
1055 ret->get_session_cb=NULL;
1056
Mark J. Cox413c4f41999-02-16 09:22:21 +00001057 memset((char *)&ret->stats,0,sizeof(ret->stats));
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +00001058
1059 ret->references=1;
1060 ret->quiet_shutdown=0;
1061
1062/* ret->cipher=NULL;*/
1063/* ret->s2->challenge=NULL;
1064 ret->master_key=NULL;
1065 ret->key_arg=NULL;
1066 ret->s2->conn_id=NULL; */
1067
1068 ret->info_callback=NULL;
1069
1070 ret->app_verify_callback=NULL;
1071 ret->app_verify_arg=NULL;
1072
Mark J. Cox413c4f41999-02-16 09:22:21 +00001073 ret->read_ahead=0;
1074 ret->verify_mode=SSL_VERIFY_NONE;
Bodo Möller7f897141999-05-01 03:20:40 +00001075 ret->verify_depth=-1; /* Don't impose a limit (but x509_lu.c does) */
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +00001076 ret->default_verify_callback=NULL;
Bodo Möllerca8e5b91999-05-09 20:12:44 +00001077 if ((ret->cert=ssl_cert_new()) == NULL)
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +00001078 goto err;
1079
1080 ret->default_passwd_callback=NULL;
Bodo Möller74678cc1999-07-21 20:57:16 +00001081 ret->default_passwd_callback_userdata=NULL;
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +00001082 ret->client_cert_cb=NULL;
1083
Ralf S. Engelschall58964a41998-12-21 10:56:39 +00001084 ret->sessions=lh_new(SSL_SESSION_hash,SSL_SESSION_cmp);
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +00001085 if (ret->sessions == NULL) goto err;
1086 ret->cert_store=X509_STORE_new();
1087 if (ret->cert_store == NULL) goto err;
1088
1089 ssl_create_cipher_list(ret->method,
1090 &ret->cipher_list,&ret->cipher_list_by_id,
1091 SSL_DEFAULT_CIPHER_LIST);
Ben Laurief73e07c1999-04-12 17:23:57 +00001092 if (ret->cipher_list == NULL
1093 || sk_SSL_CIPHER_num(ret->cipher_list) <= 0)
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +00001094 {
1095 SSLerr(SSL_F_SSL_CTX_NEW,SSL_R_LIBRARY_HAS_NO_CIPHERS);
1096 goto err2;
1097 }
1098
Ralf S. Engelschall58964a41998-12-21 10:56:39 +00001099 if ((ret->rsa_md5=EVP_get_digestbyname("ssl2-md5")) == NULL)
1100 {
1101 SSLerr(SSL_F_SSL_CTX_NEW,SSL_R_UNABLE_TO_LOAD_SSL2_MD5_ROUTINES);
1102 goto err2;
1103 }
1104 if ((ret->md5=EVP_get_digestbyname("ssl3-md5")) == NULL)
1105 {
1106 SSLerr(SSL_F_SSL_CTX_NEW,SSL_R_UNABLE_TO_LOAD_SSL3_MD5_ROUTINES);
1107 goto err2;
1108 }
1109 if ((ret->sha1=EVP_get_digestbyname("ssl3-sha1")) == NULL)
1110 {
1111 SSLerr(SSL_F_SSL_CTX_NEW,SSL_R_UNABLE_TO_LOAD_SSL3_SHA1_ROUTINES);
1112 goto err2;
1113 }
1114
Ben Laurief73e07c1999-04-12 17:23:57 +00001115 if ((ret->client_CA=sk_X509_NAME_new_null()) == NULL)
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +00001116 goto err;
1117
Ralf S. Engelschall58964a41998-12-21 10:56:39 +00001118 CRYPTO_new_ex_data(ssl_ctx_meth,(char *)ret,&ret->ex_data);
1119
Ralf S. Engelschalldfeab061998-12-21 11:00:56 +00001120 ret->extra_certs=NULL;
Mark J. Cox413c4f41999-02-16 09:22:21 +00001121 ret->comp_methods=SSL_COMP_get_compression_methods();
Ralf S. Engelschalldfeab061998-12-21 11:00:56 +00001122
Dr. Stephen Hensonbb7cd4e1999-11-29 22:35:00 +00001123 /* Initialise X509 tables: otherwise some certificate operations
1124 * wont work. This is a non op if called more than once.
1125 */
1126
1127 X509_init();
1128
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +00001129 return(ret);
1130err:
1131 SSLerr(SSL_F_SSL_CTX_NEW,ERR_R_MALLOC_FAILURE);
1132err2:
1133 if (ret != NULL) SSL_CTX_free(ret);
1134 return(NULL);
1135 }
1136
Ben Laurief73e07c1999-04-12 17:23:57 +00001137static void SSL_COMP_free(SSL_COMP *comp)
1138 { Free(comp); }
1139
Ben Laurie4f43d0e1999-02-28 12:41:50 +00001140void SSL_CTX_free(SSL_CTX *a)
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +00001141 {
1142 int i;
1143
1144 if (a == NULL) return;
1145
1146 i=CRYPTO_add(&a->references,-1,CRYPTO_LOCK_SSL_CTX);
Ralf S. Engelschall58964a41998-12-21 10:56:39 +00001147#ifdef REF_PRINT
1148 REF_PRINT("SSL_CTX",a);
1149#endif
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +00001150 if (i > 0) return;
1151#ifdef REF_CHECK
1152 if (i < 0)
1153 {
1154 fprintf(stderr,"SSL_CTX_free, bad reference count\n");
1155 abort(); /* ok */
1156 }
1157#endif
Ralf S. Engelschall58964a41998-12-21 10:56:39 +00001158 CRYPTO_free_ex_data(ssl_ctx_meth,(char *)a,&a->ex_data);
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +00001159
1160 if (a->sessions != NULL)
1161 {
1162 SSL_CTX_flush_sessions(a,0);
1163 lh_free(a->sessions);
1164 }
1165 if (a->cert_store != NULL)
1166 X509_STORE_free(a->cert_store);
1167 if (a->cipher_list != NULL)
Ben Laurief73e07c1999-04-12 17:23:57 +00001168 sk_SSL_CIPHER_free(a->cipher_list);
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +00001169 if (a->cipher_list_by_id != NULL)
Ben Laurief73e07c1999-04-12 17:23:57 +00001170 sk_SSL_CIPHER_free(a->cipher_list_by_id);
Bodo Möllerca8e5b91999-05-09 20:12:44 +00001171 if (a->cert != NULL)
1172 ssl_cert_free(a->cert);
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +00001173 if (a->client_CA != NULL)
Ben Laurief73e07c1999-04-12 17:23:57 +00001174 sk_X509_NAME_pop_free(a->client_CA,X509_NAME_free);
Ralf S. Engelschalldfeab061998-12-21 11:00:56 +00001175 if (a->extra_certs != NULL)
Ben Laurief73e07c1999-04-12 17:23:57 +00001176 sk_X509_pop_free(a->extra_certs,X509_free);
Mark J. Cox413c4f41999-02-16 09:22:21 +00001177 if (a->comp_methods != NULL)
Ben Laurief73e07c1999-04-12 17:23:57 +00001178 sk_SSL_COMP_pop_free(a->comp_methods,SSL_COMP_free);
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +00001179 Free((char *)a);
1180 }
1181
Bodo Möller3ae76671999-05-14 11:52:49 +00001182void SSL_CTX_set_default_passwd_cb(SSL_CTX *ctx, pem_password_cb *cb)
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +00001183 {
1184 ctx->default_passwd_callback=cb;
1185 }
1186
Bodo Möller74678cc1999-07-21 20:57:16 +00001187void SSL_CTX_set_default_passwd_cb_userdata(SSL_CTX *ctx,void *u)
1188 {
1189 ctx->default_passwd_callback_userdata=u;
1190 }
1191
Dr. Stephen Hensona74c55c1999-05-15 20:33:15 +00001192void SSL_CTX_set_cert_verify_callback(SSL_CTX *ctx,int (*cb)(),char *arg)
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +00001193 {
Bodo Möller204cf1a1999-08-08 14:21:04 +00001194 /* now
1195 * int (*cb)(X509_STORE_CTX *),
1196 * but should be
1197 * int (*cb)(X509_STORE_CTX *, void *arg)
1198 */
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +00001199 ctx->app_verify_callback=cb;
Bodo Möller5e636911999-08-08 14:07:30 +00001200 ctx->app_verify_arg=arg; /* never used */
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +00001201 }
1202
Ben Laurie4f43d0e1999-02-28 12:41:50 +00001203void SSL_CTX_set_verify(SSL_CTX *ctx,int mode,int (*cb)(int, X509_STORE_CTX *))
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +00001204 {
Mark J. Cox413c4f41999-02-16 09:22:21 +00001205 ctx->verify_mode=mode;
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +00001206 ctx->default_verify_callback=cb;
1207 /* This needs cleaning up EAY EAY EAY */
1208 X509_STORE_set_verify_cb_func(ctx->cert_store,cb);
1209 }
1210
Bodo Möller7f897141999-05-01 03:20:40 +00001211void SSL_CTX_set_verify_depth(SSL_CTX *ctx,int depth)
1212 {
1213 ctx->verify_depth=depth;
1214 }
1215
Bodo Möllerca8e5b91999-05-09 20:12:44 +00001216void ssl_set_cert_masks(CERT *c, SSL_CIPHER *cipher)
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +00001217 {
1218 CERT_PKEY *cpk;
1219 int rsa_enc,rsa_tmp,rsa_sign,dh_tmp,dh_rsa,dh_dsa,dsa_sign;
1220 int rsa_enc_export,dh_rsa_export,dh_dsa_export;
Ben Laurie60e31c31999-02-21 21:58:59 +00001221 int rsa_tmp_export,dh_tmp_export,kl;
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +00001222 unsigned long mask,emask;
1223
Ben Laurief415fa31999-03-06 14:09:36 +00001224 if (c == NULL) return;
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +00001225
Ben Laurie60e31c31999-02-21 21:58:59 +00001226 kl=SSL_C_EXPORT_PKEYLENGTH(cipher);
1227
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +00001228#ifndef NO_RSA
Bodo Möllerca8e5b91999-05-09 20:12:44 +00001229 rsa_tmp=(c->rsa_tmp != NULL || c->rsa_tmp_cb != NULL);
1230 rsa_tmp_export=(c->rsa_tmp_cb != NULL ||
Ben Laurie60e31c31999-02-21 21:58:59 +00001231 (rsa_tmp && RSA_size(c->rsa_tmp)*8 <= kl));
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +00001232#else
1233 rsa_tmp=rsa_tmp_export=0;
1234#endif
1235#ifndef NO_DH
Bodo Möllerca8e5b91999-05-09 20:12:44 +00001236 dh_tmp=(c->dh_tmp != NULL || c->dh_tmp_cb != NULL);
1237 dh_tmp_export=(c->dh_tmp_cb != NULL ||
Ben Laurie60e31c31999-02-21 21:58:59 +00001238 (dh_tmp && DH_size(c->dh_tmp)*8 <= kl));
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +00001239#else
1240 dh_tmp=dh_tmp_export=0;
1241#endif
1242
1243 cpk= &(c->pkeys[SSL_PKEY_RSA_ENC]);
Ben Laurie60e31c31999-02-21 21:58:59 +00001244 rsa_enc= (cpk->x509 != NULL && cpk->privatekey != NULL);
1245 rsa_enc_export=(rsa_enc && EVP_PKEY_size(cpk->privatekey)*8 <= kl);
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +00001246 cpk= &(c->pkeys[SSL_PKEY_RSA_SIGN]);
Ben Laurie60e31c31999-02-21 21:58:59 +00001247 rsa_sign=(cpk->x509 != NULL && cpk->privatekey != NULL);
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +00001248 cpk= &(c->pkeys[SSL_PKEY_DSA_SIGN]);
Ben Laurie60e31c31999-02-21 21:58:59 +00001249 dsa_sign=(cpk->x509 != NULL && cpk->privatekey != NULL);
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +00001250 cpk= &(c->pkeys[SSL_PKEY_DH_RSA]);
Ben Laurie60e31c31999-02-21 21:58:59 +00001251 dh_rsa= (cpk->x509 != NULL && cpk->privatekey != NULL);
1252 dh_rsa_export=(dh_rsa && EVP_PKEY_size(cpk->privatekey)*8 <= kl);
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +00001253 cpk= &(c->pkeys[SSL_PKEY_DH_DSA]);
1254/* FIX THIS EAY EAY EAY */
Ben Laurie60e31c31999-02-21 21:58:59 +00001255 dh_dsa= (cpk->x509 != NULL && cpk->privatekey != NULL);
1256 dh_dsa_export=(dh_dsa && EVP_PKEY_size(cpk->privatekey)*8 <= kl);
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +00001257
1258 mask=0;
1259 emask=0;
1260
1261#ifdef CIPHER_DEBUG
Ben Laurief415fa31999-03-06 14:09:36 +00001262 printf("rt=%d rte=%d dht=%d re=%d ree=%d rs=%d ds=%d dhr=%d dhd=%d\n",
1263 rsa_tmp,rsa_tmp_export,dh_tmp,
1264 rsa_enc,rsa_enc_export,rsa_sign,dsa_sign,dh_rsa,dh_dsa);
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +00001265#endif
1266
1267 if (rsa_enc || (rsa_tmp && rsa_sign))
1268 mask|=SSL_kRSA;
Ben Laurief415fa31999-03-06 14:09:36 +00001269 if (rsa_enc_export || (rsa_tmp_export && (rsa_sign || rsa_enc)))
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +00001270 emask|=SSL_kRSA;
1271
1272#if 0
1273 /* The match needs to be both kEDH and aRSA or aDSA, so don't worry */
1274 if ( (dh_tmp || dh_rsa || dh_dsa) &&
1275 (rsa_enc || rsa_sign || dsa_sign))
1276 mask|=SSL_kEDH;
1277 if ((dh_tmp_export || dh_rsa_export || dh_dsa_export) &&
1278 (rsa_enc || rsa_sign || dsa_sign))
1279 emask|=SSL_kEDH;
1280#endif
1281
1282 if (dh_tmp_export)
1283 emask|=SSL_kEDH;
1284
1285 if (dh_tmp)
1286 mask|=SSL_kEDH;
1287
1288 if (dh_rsa) mask|=SSL_kDHr;
1289 if (dh_rsa_export) emask|=SSL_kDHr;
1290
1291 if (dh_dsa) mask|=SSL_kDHd;
1292 if (dh_dsa_export) emask|=SSL_kDHd;
1293
1294 if (rsa_enc || rsa_sign)
1295 {
1296 mask|=SSL_aRSA;
1297 emask|=SSL_aRSA;
1298 }
1299
1300 if (dsa_sign)
1301 {
1302 mask|=SSL_aDSS;
1303 emask|=SSL_aDSS;
1304 }
1305
1306#ifdef SSL_ALLOW_ADH
1307 mask|=SSL_aNULL;
1308 emask|=SSL_aNULL;
1309#endif
1310
1311 c->mask=mask;
1312 c->export_mask=emask;
1313 c->valid=1;
1314 }
1315
1316/* THIS NEEDS CLEANING UP */
Ben Laurie4f43d0e1999-02-28 12:41:50 +00001317X509 *ssl_get_server_send_cert(SSL *s)
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +00001318 {
1319 unsigned long alg,mask,kalg;
1320 CERT *c;
Ulf Möllerdf63a381999-06-09 16:33:18 +00001321 int i,is_export;
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +00001322
1323 c=s->cert;
Bodo Möllerca8e5b91999-05-09 20:12:44 +00001324 ssl_set_cert_masks(c, s->s3->tmp.new_cipher);
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +00001325 alg=s->s3->tmp.new_cipher->algorithms;
Ulf Möllerdf63a381999-06-09 16:33:18 +00001326 is_export=SSL_IS_EXPORT(alg);
1327 mask=is_export?c->export_mask:c->mask;
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +00001328 kalg=alg&(SSL_MKEY_MASK|SSL_AUTH_MASK);
1329
1330 if (kalg & SSL_kDHr)
1331 i=SSL_PKEY_DH_RSA;
1332 else if (kalg & SSL_kDHd)
1333 i=SSL_PKEY_DH_DSA;
1334 else if (kalg & SSL_aDSS)
1335 i=SSL_PKEY_DSA_SIGN;
1336 else if (kalg & SSL_aRSA)
1337 {
1338 if (c->pkeys[SSL_PKEY_RSA_ENC].x509 == NULL)
1339 i=SSL_PKEY_RSA_SIGN;
1340 else
1341 i=SSL_PKEY_RSA_ENC;
1342 }
1343 else /* if (kalg & SSL_aNULL) */
1344 {
1345 SSLerr(SSL_F_SSL_GET_SERVER_SEND_CERT,SSL_R_INTERNAL_ERROR);
1346 return(NULL);
1347 }
1348 if (c->pkeys[i].x509 == NULL) return(NULL);
1349 return(c->pkeys[i].x509);
1350 }
1351
Ben Laurie4f43d0e1999-02-28 12:41:50 +00001352EVP_PKEY *ssl_get_sign_pkey(SSL *s,SSL_CIPHER *cipher)
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +00001353 {
1354 unsigned long alg;
1355 CERT *c;
1356
1357 alg=cipher->algorithms;
1358 c=s->cert;
1359
1360 if ((alg & SSL_aDSS) &&
1361 (c->pkeys[SSL_PKEY_DSA_SIGN].privatekey != NULL))
1362 return(c->pkeys[SSL_PKEY_DSA_SIGN].privatekey);
1363 else if (alg & SSL_aRSA)
1364 {
1365 if (c->pkeys[SSL_PKEY_RSA_SIGN].privatekey != NULL)
1366 return(c->pkeys[SSL_PKEY_RSA_SIGN].privatekey);
1367 else if (c->pkeys[SSL_PKEY_RSA_ENC].privatekey != NULL)
1368 return(c->pkeys[SSL_PKEY_RSA_ENC].privatekey);
1369 else
1370 return(NULL);
1371 }
1372 else /* if (alg & SSL_aNULL) */
1373 {
1374 SSLerr(SSL_F_SSL_GET_SIGN_PKEY,SSL_R_INTERNAL_ERROR);
1375 return(NULL);
1376 }
1377 }
1378
Ben Laurie4f43d0e1999-02-28 12:41:50 +00001379void ssl_update_cache(SSL *s,int mode)
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +00001380 {
Ralf S. Engelschall58964a41998-12-21 10:56:39 +00001381 int i;
1382
1383 /* If the session_id_length is 0, we are not supposed to cache it,
1384 * and it would be rather hard to do anyway :-) */
1385 if (s->session->session_id_length == 0) return;
1386
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +00001387 if ((s->ctx->session_cache_mode & mode)
1388 && (!s->hit)
1389 && SSL_CTX_add_session(s->ctx,s->session)
1390 && (s->ctx->new_session_cb != NULL))
1391 {
Ralf S. Engelschall58964a41998-12-21 10:56:39 +00001392 CRYPTO_add(&s->session->references,1,CRYPTO_LOCK_SSL_SESSION);
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +00001393 if (!s->ctx->new_session_cb(s,s->session))
1394 SSL_SESSION_free(s->session);
1395 }
1396
1397 /* auto flush every 255 connections */
Ralf S. Engelschall58964a41998-12-21 10:56:39 +00001398 i=s->ctx->session_cache_mode;
1399 if ((!(i & SSL_SESS_CACHE_NO_AUTO_CLEAR)) &&
1400 ((i & mode) == mode))
1401 {
1402 if ( (((mode & SSL_SESS_CACHE_CLIENT)
Mark J. Cox413c4f41999-02-16 09:22:21 +00001403 ?s->ctx->stats.sess_connect_good
1404 :s->ctx->stats.sess_accept_good) & 0xff) == 0xff)
Ralf S. Engelschall58964a41998-12-21 10:56:39 +00001405 {
1406 SSL_CTX_flush_sessions(s->ctx,time(NULL));
1407 }
1408 }
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +00001409 }
1410
Ben Laurie4f43d0e1999-02-28 12:41:50 +00001411SSL_METHOD *SSL_get_ssl_method(SSL *s)
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +00001412 {
1413 return(s->method);
1414 }
1415
Ben Laurie4f43d0e1999-02-28 12:41:50 +00001416int SSL_set_ssl_method(SSL *s,SSL_METHOD *meth)
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +00001417 {
1418 int conn= -1;
1419 int ret=1;
1420
1421 if (s->method != meth)
1422 {
1423 if (s->handshake_func != NULL)
1424 conn=(s->handshake_func == s->method->ssl_connect);
1425
1426 if (s->method->version == meth->version)
1427 s->method=meth;
1428 else
1429 {
1430 s->method->ssl_free(s);
1431 s->method=meth;
1432 ret=s->method->ssl_new(s);
1433 }
1434
1435 if (conn == 1)
1436 s->handshake_func=meth->ssl_connect;
1437 else if (conn == 0)
1438 s->handshake_func=meth->ssl_accept;
1439 }
1440 return(ret);
1441 }
1442
Ben Laurie4f43d0e1999-02-28 12:41:50 +00001443int SSL_get_error(SSL *s,int i)
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +00001444 {
1445 int reason;
Mark J. Cox413c4f41999-02-16 09:22:21 +00001446 unsigned long l;
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +00001447 BIO *bio;
1448
1449 if (i > 0) return(SSL_ERROR_NONE);
1450
Mark J. Cox413c4f41999-02-16 09:22:21 +00001451 /* Make things return SSL_ERROR_SYSCALL when doing SSL_do_handshake
1452 * etc, where we do encode the error */
1453 if ((l=ERR_peek_error()) != 0)
1454 {
1455 if (ERR_GET_LIB(l) == ERR_LIB_SYS)
1456 return(SSL_ERROR_SYSCALL);
1457 else
1458 return(SSL_ERROR_SSL);
1459 }
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +00001460
1461 if ((i < 0) && SSL_want_read(s))
1462 {
1463 bio=SSL_get_rbio(s);
1464 if (BIO_should_read(bio))
1465 return(SSL_ERROR_WANT_READ);
1466 else if (BIO_should_write(bio))
Bodo Möller3a66e301999-06-07 12:49:47 +00001467 /* This one doesn't make too much sense ... We never try
1468 * to write to the rbio, and an application program where
1469 * rbio and wbio are separate couldn't even know what it
1470 * should wait for.
1471 * However if we ever set s->rwstate incorrectly
1472 * (so that we have SSL_want_read(s) instead of
1473 * SSL_want_write(s)) and rbio and wbio *are* the same,
1474 * this test works around that bug; so it might be safer
1475 * to keep it. */
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +00001476 return(SSL_ERROR_WANT_WRITE);
1477 else if (BIO_should_io_special(bio))
1478 {
1479 reason=BIO_get_retry_reason(bio);
1480 if (reason == BIO_RR_CONNECT)
1481 return(SSL_ERROR_WANT_CONNECT);
1482 else
1483 return(SSL_ERROR_SYSCALL); /* unknown */
1484 }
1485 }
1486
1487 if ((i < 0) && SSL_want_write(s))
1488 {
1489 bio=SSL_get_wbio(s);
1490 if (BIO_should_write(bio))
1491 return(SSL_ERROR_WANT_WRITE);
1492 else if (BIO_should_read(bio))
Bodo Möller3a66e301999-06-07 12:49:47 +00001493 /* See above (SSL_want_read(s) with BIO_should_write(bio)) */
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +00001494 return(SSL_ERROR_WANT_READ);
1495 else if (BIO_should_io_special(bio))
1496 {
1497 reason=BIO_get_retry_reason(bio);
1498 if (reason == BIO_RR_CONNECT)
1499 return(SSL_ERROR_WANT_CONNECT);
1500 else
1501 return(SSL_ERROR_SYSCALL);
1502 }
1503 }
1504 if ((i < 0) && SSL_want_x509_lookup(s))
1505 {
1506 return(SSL_ERROR_WANT_X509_LOOKUP);
1507 }
1508
1509 if (i == 0)
1510 {
Ralf S. Engelschall58964a41998-12-21 10:56:39 +00001511 if (s->version == SSL2_VERSION)
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +00001512 {
1513 /* assume it is the socket being closed */
1514 return(SSL_ERROR_ZERO_RETURN);
1515 }
1516 else
1517 {
1518 if ((s->shutdown & SSL_RECEIVED_SHUTDOWN) &&
Ralf S. Engelschall58964a41998-12-21 10:56:39 +00001519 (s->s3->warn_alert == SSL_AD_CLOSE_NOTIFY))
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +00001520 return(SSL_ERROR_ZERO_RETURN);
1521 }
1522 }
1523 return(SSL_ERROR_SYSCALL);
1524 }
1525
Ben Laurie4f43d0e1999-02-28 12:41:50 +00001526int SSL_do_handshake(SSL *s)
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +00001527 {
Ralf S. Engelschall58964a41998-12-21 10:56:39 +00001528 int ret=1;
1529
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +00001530 if (s->handshake_func == NULL)
1531 {
Ralf S. Engelschall58964a41998-12-21 10:56:39 +00001532 SSLerr(SSL_F_SSL_DO_HANDSHAKE,SSL_R_CONNECTION_TYPE_NOT_SET);
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +00001533 return(-1);
1534 }
Ralf S. Engelschalldfeab061998-12-21 11:00:56 +00001535
1536 s->method->ssl_renegotiate_check(s);
1537
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +00001538 if (SSL_in_init(s) || SSL_in_before(s))
Ralf S. Engelschall58964a41998-12-21 10:56:39 +00001539 {
1540 ret=s->handshake_func(s);
1541 }
1542 return(ret);
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +00001543 }
1544
1545/* For the next 2 functions, SSL_clear() sets shutdown and so
1546 * one of these calls will reset it */
Ben Laurie4f43d0e1999-02-28 12:41:50 +00001547void SSL_set_accept_state(SSL *s)
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +00001548 {
Mark J. Cox413c4f41999-02-16 09:22:21 +00001549 s->server=1;
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +00001550 s->shutdown=0;
1551 s->state=SSL_ST_ACCEPT|SSL_ST_BEFORE;
1552 s->handshake_func=s->method->ssl_accept;
1553 /* clear the current cipher */
1554 ssl_clear_cipher_ctx(s);
1555 }
1556
Ben Laurie4f43d0e1999-02-28 12:41:50 +00001557void SSL_set_connect_state(SSL *s)
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +00001558 {
Mark J. Cox413c4f41999-02-16 09:22:21 +00001559 s->server=0;
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +00001560 s->shutdown=0;
1561 s->state=SSL_ST_CONNECT|SSL_ST_BEFORE;
1562 s->handshake_func=s->method->ssl_connect;
1563 /* clear the current cipher */
1564 ssl_clear_cipher_ctx(s);
1565 }
1566
Ben Laurie4f43d0e1999-02-28 12:41:50 +00001567int ssl_undefined_function(SSL *s)
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +00001568 {
1569 SSLerr(SSL_F_SSL_UNDEFINED_FUNCTION,ERR_R_SHOULD_NOT_HAVE_BEEN_CALLED);
1570 return(0);
1571 }
1572
Ben Laurie4f43d0e1999-02-28 12:41:50 +00001573SSL_METHOD *ssl_bad_method(int ver)
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +00001574 {
1575 SSLerr(SSL_F_SSL_BAD_METHOD,ERR_R_SHOULD_NOT_HAVE_BEEN_CALLED);
1576 return(NULL);
1577 }
1578
Ben Laurie4f43d0e1999-02-28 12:41:50 +00001579char *SSL_get_version(SSL *s)
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +00001580 {
Ralf S. Engelschall58964a41998-12-21 10:56:39 +00001581 if (s->version == TLS1_VERSION)
1582 return("TLSv1");
1583 else if (s->version == SSL3_VERSION)
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +00001584 return("SSLv3");
Ralf S. Engelschall58964a41998-12-21 10:56:39 +00001585 else if (s->version == SSL2_VERSION)
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +00001586 return("SSLv2");
1587 else
1588 return("unknown");
1589 }
1590
Ben Laurie4f43d0e1999-02-28 12:41:50 +00001591SSL *SSL_dup(SSL *s)
Bodo Möller8a41eb71999-05-13 10:32:04 +00001592 {
Ben Laurief73e07c1999-04-12 17:23:57 +00001593 STACK_OF(X509_NAME) *sk;
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +00001594 X509_NAME *xn;
Bodo Möllerb1c4fe31999-06-07 20:26:51 +00001595 SSL *ret;
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +00001596 int i;
1597
Ben Laurieb4cadc61999-03-22 12:22:14 +00001598 if ((ret=SSL_new(SSL_get_SSL_CTX(s))) == NULL)
1599 return(NULL);
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +00001600
Bodo Möller8a41eb71999-05-13 10:32:04 +00001601 if (s->session != NULL)
1602 {
1603 /* This copies session-id, SSL_METHOD, sid_ctx, and 'cert' */
1604 SSL_copy_session_id(ret,s);
1605 }
1606 else
1607 {
1608 /* No session has been established yet, so we have to expect
1609 * that s->cert or ret->cert will be changed later --
1610 * they should not both point to the same object,
1611 * and thus we can't use SSL_copy_session_id. */
1612
1613 ret->method = s->method;
1614 ret->method->ssl_new(ret);
1615
1616 if (s->cert != NULL)
1617 {
1618 ret->cert = ssl_cert_dup(s->cert);
1619 if (ret->cert == NULL)
1620 goto err;
1621 }
1622
1623 SSL_set_session_id_context(ret,
1624 s->sid_ctx, s->sid_ctx_length);
1625 }
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +00001626
1627 SSL_set_read_ahead(ret,SSL_get_read_ahead(s));
1628 SSL_set_verify(ret,SSL_get_verify_mode(s),
1629 SSL_get_verify_callback(s));
Bodo Möller7f897141999-05-01 03:20:40 +00001630 SSL_set_verify_depth(ret,SSL_get_verify_depth(s));
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +00001631
1632 SSL_set_info_callback(ret,SSL_get_info_callback(s));
1633
1634 ret->debug=s->debug;
Ralf S. Engelschall58964a41998-12-21 10:56:39 +00001635 ret->options=s->options;
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +00001636
1637 /* copy app data, a little dangerous perhaps */
Ralf S. Engelschall58964a41998-12-21 10:56:39 +00001638 if (!CRYPTO_dup_ex_data(ssl_meth,&ret->ex_data,&s->ex_data))
1639 goto err;
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +00001640
1641 /* setup rbio, and wbio */
1642 if (s->rbio != NULL)
1643 {
1644 if (!BIO_dup_state(s->rbio,(char *)&ret->rbio))
1645 goto err;
1646 }
1647 if (s->wbio != NULL)
1648 {
1649 if (s->wbio != s->rbio)
1650 {
Ralf S. Engelschall58964a41998-12-21 10:56:39 +00001651 if (!BIO_dup_state(s->wbio,(char *)&ret->wbio))
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +00001652 goto err;
1653 }
1654 else
1655 ret->wbio=ret->rbio;
1656 }
1657
1658 /* dup the cipher_list and cipher_list_by_id stacks */
1659 if (s->cipher_list != NULL)
1660 {
Ben Laurief73e07c1999-04-12 17:23:57 +00001661 if ((ret->cipher_list=sk_SSL_CIPHER_dup(s->cipher_list)) == NULL)
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +00001662 goto err;
1663 }
1664 if (s->cipher_list_by_id != NULL)
Ben Laurief73e07c1999-04-12 17:23:57 +00001665 if ((ret->cipher_list_by_id=sk_SSL_CIPHER_dup(s->cipher_list_by_id))
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +00001666 == NULL)
1667 goto err;
1668
1669 /* Dup the client_CA list */
1670 if (s->client_CA != NULL)
1671 {
Ben Laurief73e07c1999-04-12 17:23:57 +00001672 if ((sk=sk_X509_NAME_dup(s->client_CA)) == NULL) goto err;
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +00001673 ret->client_CA=sk;
Ben Laurief73e07c1999-04-12 17:23:57 +00001674 for (i=0; i<sk_X509_NAME_num(sk); i++)
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +00001675 {
Ben Laurief73e07c1999-04-12 17:23:57 +00001676 xn=sk_X509_NAME_value(sk,i);
1677 if (sk_X509_NAME_set(sk,i,X509_NAME_dup(xn)) == NULL)
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +00001678 {
1679 X509_NAME_free(xn);
1680 goto err;
1681 }
1682 }
1683 }
1684
1685 ret->shutdown=s->shutdown;
1686 ret->state=s->state;
1687 ret->handshake_func=s->handshake_func;
Mark J. Cox413c4f41999-02-16 09:22:21 +00001688 ret->server=s->server;
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +00001689
1690 if (0)
1691 {
1692err:
1693 if (ret != NULL) SSL_free(ret);
1694 ret=NULL;
1695 }
1696 return(ret);
1697 }
1698
Ben Laurie4f43d0e1999-02-28 12:41:50 +00001699void ssl_clear_cipher_ctx(SSL *s)
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +00001700 {
Bodo Möller8a41eb71999-05-13 10:32:04 +00001701 if (s->enc_read_ctx != NULL)
1702 {
1703 EVP_CIPHER_CTX_cleanup(s->enc_read_ctx);
1704 Free(s->enc_read_ctx);
1705 s->enc_read_ctx=NULL;
1706 }
1707 if (s->enc_write_ctx != NULL)
1708 {
1709 EVP_CIPHER_CTX_cleanup(s->enc_write_ctx);
1710 Free(s->enc_write_ctx);
1711 s->enc_write_ctx=NULL;
1712 }
Mark J. Cox413c4f41999-02-16 09:22:21 +00001713 if (s->expand != NULL)
1714 {
1715 COMP_CTX_free(s->expand);
1716 s->expand=NULL;
1717 }
1718 if (s->compress != NULL)
1719 {
1720 COMP_CTX_free(s->compress);
1721 s->compress=NULL;
1722 }
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +00001723 }
1724
Ralf S. Engelschall58964a41998-12-21 10:56:39 +00001725/* Fix this function so that it takes an optional type parameter */
Ben Laurie4f43d0e1999-02-28 12:41:50 +00001726X509 *SSL_get_certificate(SSL *s)
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +00001727 {
1728 if (s->cert != NULL)
1729 return(s->cert->key->x509);
1730 else
1731 return(NULL);
1732 }
1733
Ralf S. Engelschall58964a41998-12-21 10:56:39 +00001734/* Fix this function so that it takes an optional type parameter */
Ben Laurie4f43d0e1999-02-28 12:41:50 +00001735EVP_PKEY *SSL_get_privatekey(SSL *s)
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +00001736 {
1737 if (s->cert != NULL)
1738 return(s->cert->key->privatekey);
1739 else
1740 return(NULL);
1741 }
1742
Ben Laurie4f43d0e1999-02-28 12:41:50 +00001743SSL_CIPHER *SSL_get_current_cipher(SSL *s)
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +00001744 {
Bodo Möllerb1c4fe31999-06-07 20:26:51 +00001745 if ((s->session != NULL) && (s->session->cipher != NULL))
1746 return(s->session->cipher);
1747 return(NULL);
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +00001748 }
1749
Ben Laurie4f43d0e1999-02-28 12:41:50 +00001750int ssl_init_wbio_buffer(SSL *s,int push)
Ralf S. Engelschall58964a41998-12-21 10:56:39 +00001751 {
1752 BIO *bbio;
1753
1754 if (s->bbio == NULL)
1755 {
1756 bbio=BIO_new(BIO_f_buffer());
1757 if (bbio == NULL) return(0);
1758 s->bbio=bbio;
1759 }
1760 else
1761 {
1762 bbio=s->bbio;
1763 if (s->bbio == s->wbio)
1764 s->wbio=BIO_pop(s->wbio);
1765 }
Bodo Möllerd58d0921999-06-10 16:29:32 +00001766 (void)BIO_reset(bbio);
Ralf S. Engelschall58964a41998-12-21 10:56:39 +00001767/* if (!BIO_set_write_buffer_size(bbio,16*1024)) */
1768 if (!BIO_set_read_buffer_size(bbio,1))
1769 {
1770 SSLerr(SSL_F_SSL_INIT_WBIO_BUFFER,ERR_R_BUF_LIB);
1771 return(0);
1772 }
1773 if (push)
1774 {
1775 if (s->wbio != bbio)
1776 s->wbio=BIO_push(bbio,s->wbio);
1777 }
1778 else
1779 {
1780 if (s->wbio == bbio)
1781 s->wbio=BIO_pop(bbio);
1782 }
1783 return(1);
1784 }
Mark J. Cox413c4f41999-02-16 09:22:21 +00001785
Ben Laurie4f43d0e1999-02-28 12:41:50 +00001786void ssl_free_wbio_buffer(SSL *s)
Mark J. Cox413c4f41999-02-16 09:22:21 +00001787 {
1788 BIO *under;
1789
1790 if (s->bbio == NULL) return;
1791
1792 if (s->bbio == s->wbio)
1793 {
1794 /* remove buffering */
1795 under=BIO_pop(s->wbio);
1796 if (under != NULL)
1797 s->wbio=under;
1798 else
1799 abort(); /* ok */
1800 }
1801 BIO_free(s->bbio);
1802 s->bbio=NULL;
1803 }
Ralf S. Engelschall58964a41998-12-21 10:56:39 +00001804
Ben Laurie4f43d0e1999-02-28 12:41:50 +00001805void SSL_CTX_set_quiet_shutdown(SSL_CTX *ctx,int mode)
Ralf S. Engelschall58964a41998-12-21 10:56:39 +00001806 {
1807 ctx->quiet_shutdown=mode;
1808 }
1809
Ben Laurie4f43d0e1999-02-28 12:41:50 +00001810int SSL_CTX_get_quiet_shutdown(SSL_CTX *ctx)
Ralf S. Engelschall58964a41998-12-21 10:56:39 +00001811 {
1812 return(ctx->quiet_shutdown);
1813 }
1814
Ben Laurie4f43d0e1999-02-28 12:41:50 +00001815void SSL_set_quiet_shutdown(SSL *s,int mode)
Ralf S. Engelschall58964a41998-12-21 10:56:39 +00001816 {
1817 s->quiet_shutdown=mode;
1818 }
1819
Ben Laurie4f43d0e1999-02-28 12:41:50 +00001820int SSL_get_quiet_shutdown(SSL *s)
Ralf S. Engelschall58964a41998-12-21 10:56:39 +00001821 {
1822 return(s->quiet_shutdown);
1823 }
1824
Ben Laurie4f43d0e1999-02-28 12:41:50 +00001825void SSL_set_shutdown(SSL *s,int mode)
Ralf S. Engelschall58964a41998-12-21 10:56:39 +00001826 {
1827 s->shutdown=mode;
1828 }
1829
Ben Laurie4f43d0e1999-02-28 12:41:50 +00001830int SSL_get_shutdown(SSL *s)
Ralf S. Engelschall58964a41998-12-21 10:56:39 +00001831 {
1832 return(s->shutdown);
1833 }
1834
Ben Laurie4f43d0e1999-02-28 12:41:50 +00001835int SSL_version(SSL *s)
Ralf S. Engelschall58964a41998-12-21 10:56:39 +00001836 {
1837 return(s->version);
1838 }
1839
Ben Laurie4f43d0e1999-02-28 12:41:50 +00001840SSL_CTX *SSL_get_SSL_CTX(SSL *ssl)
Ralf S. Engelschall58964a41998-12-21 10:56:39 +00001841 {
1842 return(ssl->ctx);
1843 }
1844
Ralf S. Engelschalldfeab061998-12-21 11:00:56 +00001845#ifndef NO_STDIO
Ben Laurie4f43d0e1999-02-28 12:41:50 +00001846int SSL_CTX_set_default_verify_paths(SSL_CTX *ctx)
Ralf S. Engelschall58964a41998-12-21 10:56:39 +00001847 {
1848 return(X509_STORE_set_default_paths(ctx->cert_store));
1849 }
1850
Bodo Möller303c0021999-05-09 10:12:10 +00001851int SSL_CTX_load_verify_locations(SSL_CTX *ctx, const char *CAfile,
1852 const char *CApath)
Ralf S. Engelschall58964a41998-12-21 10:56:39 +00001853 {
1854 return(X509_STORE_load_locations(ctx->cert_store,CAfile,CApath));
1855 }
Ralf S. Engelschalldfeab061998-12-21 11:00:56 +00001856#endif
Ralf S. Engelschall58964a41998-12-21 10:56:39 +00001857
Ben Laurie4f43d0e1999-02-28 12:41:50 +00001858void SSL_set_info_callback(SSL *ssl,void (*cb)())
Ralf S. Engelschall58964a41998-12-21 10:56:39 +00001859 {
1860 ssl->info_callback=cb;
1861 }
1862
Ulf Möller6b691a51999-04-19 21:31:43 +00001863void (*SSL_get_info_callback(SSL *ssl))(void)
Ralf S. Engelschall58964a41998-12-21 10:56:39 +00001864 {
Ralf S. Engelschalldfeab061998-12-21 11:00:56 +00001865 return((void (*)())ssl->info_callback);
Ralf S. Engelschall58964a41998-12-21 10:56:39 +00001866 }
1867
Ben Laurie4f43d0e1999-02-28 12:41:50 +00001868int SSL_state(SSL *ssl)
Ralf S. Engelschall58964a41998-12-21 10:56:39 +00001869 {
1870 return(ssl->state);
1871 }
1872
Ben Laurie4f43d0e1999-02-28 12:41:50 +00001873void SSL_set_verify_result(SSL *ssl,long arg)
Ralf S. Engelschall58964a41998-12-21 10:56:39 +00001874 {
1875 ssl->verify_result=arg;
1876 }
1877
Ben Laurie4f43d0e1999-02-28 12:41:50 +00001878long SSL_get_verify_result(SSL *ssl)
Ralf S. Engelschall58964a41998-12-21 10:56:39 +00001879 {
1880 return(ssl->verify_result);
1881 }
1882
Ben Laurie4f43d0e1999-02-28 12:41:50 +00001883int SSL_get_ex_new_index(long argl,char *argp,int (*new_func)(),
1884 int (*dup_func)(),void (*free_func)())
Bodo Möllerb1c4fe31999-06-07 20:26:51 +00001885 {
Ralf S. Engelschall58964a41998-12-21 10:56:39 +00001886 ssl_meth_num++;
1887 return(CRYPTO_get_ex_new_index(ssl_meth_num-1,
1888 &ssl_meth,argl,argp,new_func,dup_func,free_func));
Bodo Möllerb1c4fe31999-06-07 20:26:51 +00001889 }
Ralf S. Engelschall58964a41998-12-21 10:56:39 +00001890
Ben Laurie4f43d0e1999-02-28 12:41:50 +00001891int SSL_set_ex_data(SSL *s,int idx,void *arg)
Ralf S. Engelschall58964a41998-12-21 10:56:39 +00001892 {
1893 return(CRYPTO_set_ex_data(&s->ex_data,idx,arg));
1894 }
1895
Ben Laurie4f43d0e1999-02-28 12:41:50 +00001896void *SSL_get_ex_data(SSL *s,int idx)
Ralf S. Engelschall58964a41998-12-21 10:56:39 +00001897 {
1898 return(CRYPTO_get_ex_data(&s->ex_data,idx));
1899 }
1900
Ben Laurie4f43d0e1999-02-28 12:41:50 +00001901int SSL_CTX_get_ex_new_index(long argl,char *argp,int (*new_func)(),
1902 int (*dup_func)(),void (*free_func)())
Bodo Möllerb1c4fe31999-06-07 20:26:51 +00001903 {
Ralf S. Engelschall58964a41998-12-21 10:56:39 +00001904 ssl_ctx_meth_num++;
1905 return(CRYPTO_get_ex_new_index(ssl_ctx_meth_num-1,
1906 &ssl_ctx_meth,argl,argp,new_func,dup_func,free_func));
Bodo Möllerb1c4fe31999-06-07 20:26:51 +00001907 }
Ralf S. Engelschall58964a41998-12-21 10:56:39 +00001908
Ben Laurie4f43d0e1999-02-28 12:41:50 +00001909int SSL_CTX_set_ex_data(SSL_CTX *s,int idx,void *arg)
Ralf S. Engelschall58964a41998-12-21 10:56:39 +00001910 {
1911 return(CRYPTO_set_ex_data(&s->ex_data,idx,arg));
1912 }
1913
Ben Laurie4f43d0e1999-02-28 12:41:50 +00001914void *SSL_CTX_get_ex_data(SSL_CTX *s,int idx)
Ralf S. Engelschall58964a41998-12-21 10:56:39 +00001915 {
1916 return(CRYPTO_get_ex_data(&s->ex_data,idx));
1917 }
1918
Ben Laurie4f43d0e1999-02-28 12:41:50 +00001919int ssl_ok(SSL *s)
Ralf S. Engelschalldfeab061998-12-21 11:00:56 +00001920 {
1921 return(1);
1922 }
1923
Ben Laurie4f43d0e1999-02-28 12:41:50 +00001924X509_STORE *SSL_CTX_get_cert_store(SSL_CTX *ctx)
Mark J. Cox413c4f41999-02-16 09:22:21 +00001925 {
1926 return(ctx->cert_store);
1927 }
1928
Ben Laurie4f43d0e1999-02-28 12:41:50 +00001929void SSL_CTX_set_cert_store(SSL_CTX *ctx,X509_STORE *store)
Mark J. Cox413c4f41999-02-16 09:22:21 +00001930 {
1931 if (ctx->cert_store != NULL)
1932 X509_STORE_free(ctx->cert_store);
1933 ctx->cert_store=store;
1934 }
1935
Ben Laurie4f43d0e1999-02-28 12:41:50 +00001936int SSL_want(SSL *s)
Mark J. Cox413c4f41999-02-16 09:22:21 +00001937 {
1938 return(s->rwstate);
1939 }
1940
Ben Laurie4f43d0e1999-02-28 12:41:50 +00001941/*!
1942 * \brief Set the callback for generating temporary RSA keys.
1943 * \param ctx the SSL context.
1944 * \param cb the callback
1945 */
1946
Ulf Möller79df9d61999-04-27 03:19:12 +00001947#ifndef NO_RSA
Ulf Möllerdf63a381999-06-09 16:33:18 +00001948void SSL_CTX_set_tmp_rsa_callback(SSL_CTX *ctx,RSA *(*cb)(SSL *ssl,
1949 int is_export,
Ben Laurie60e31c31999-02-21 21:58:59 +00001950 int keylength))
Ben Laurief8c3c051999-01-06 22:53:34 +00001951 { SSL_CTX_ctrl(ctx,SSL_CTRL_SET_TMP_RSA_CB,0,(char *)cb); }
Ulf Möller79df9d61999-04-27 03:19:12 +00001952#endif
1953
1954#ifndef NO_RSA
Ulf Möllerdf63a381999-06-09 16:33:18 +00001955void SSL_set_tmp_rsa_callback(SSL *ssl,RSA *(*cb)(SSL *ssl,int is_export,
Ulf Möller79df9d61999-04-27 03:19:12 +00001956 int keylength))
1957 { SSL_ctrl(ssl,SSL_CTRL_SET_TMP_RSA_CB,0,(char *)cb); }
1958#endif
Ben Laurief8c3c051999-01-06 22:53:34 +00001959
Ben Laurie4f43d0e1999-02-28 12:41:50 +00001960#ifdef DOXYGEN
1961/*!
1962 * \brief The RSA temporary key callback function.
1963 * \param ssl the SSL session.
Ulf Möllerdf63a381999-06-09 16:33:18 +00001964 * \param is_export \c TRUE if the temp RSA key is for an export ciphersuite.
1965 * \param keylength if \c is_export is \c TRUE, then \c keylength is the size
1966 * of the required key in bits.
Ben Laurie4f43d0e1999-02-28 12:41:50 +00001967 * \return the temporary RSA key.
1968 * \sa SSL_CTX_set_tmp_rsa_callback, SSL_set_tmp_rsa_callback
1969 */
1970
Ulf Möllerdf63a381999-06-09 16:33:18 +00001971RSA *cb(SSL *ssl,int is_export,int keylength)
Ben Laurie4f43d0e1999-02-28 12:41:50 +00001972 {}
1973#endif
1974
1975/*!
1976 * \brief Set the callback for generating temporary DH keys.
1977 * \param ctx the SSL context.
1978 * \param dh the callback
1979 */
1980
Ulf Möller79df9d61999-04-27 03:19:12 +00001981#ifndef NO_DH
Ulf Möllerdf63a381999-06-09 16:33:18 +00001982void SSL_CTX_set_tmp_dh_callback(SSL_CTX *ctx,DH *(*dh)(SSL *ssl,int is_export,
Ben Laurie60e31c31999-02-21 21:58:59 +00001983 int keylength))
Ben Laurief8c3c051999-01-06 22:53:34 +00001984 { SSL_CTX_ctrl(ctx,SSL_CTRL_SET_TMP_DH_CB,0,(char *)dh); }
1985
Ulf Möllerdf63a381999-06-09 16:33:18 +00001986void SSL_set_tmp_dh_callback(SSL *ssl,DH *(*dh)(SSL *ssl,int is_export,
Ralf S. Engelschall15d21c21999-02-25 14:40:29 +00001987 int keylength))
1988 { SSL_ctrl(ssl,SSL_CTRL_SET_TMP_DH_CB,0,(char *)dh); }
Ulf Möller79df9d61999-04-27 03:19:12 +00001989#endif
Ralf S. Engelschall15d21c21999-02-25 14:40:29 +00001990
Ralf S. Engelschall58964a41998-12-21 10:56:39 +00001991#if defined(_WINDLL) && defined(WIN16)
1992#include "../crypto/bio/bss_file.c"
1993#endif
Ben Laurief73e07c1999-04-12 17:23:57 +00001994
1995IMPLEMENT_STACK_OF(SSL_CIPHER)
1996IMPLEMENT_STACK_OF(SSL_COMP)