Make sure to remove bad sessions in SSL_clear() (found by Yoram Zahavi).
[openssl.git] / ssl / ssl_lib.c
1 /*! \file ssl/ssl_lib.c
2  *  \brief Version independent SSL functions.
3  */
4 /* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com)
5  * 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  * Copyright (c) 1998-2001 The OpenSSL Project.  All rights reserved.
62  *
63  * Redistribution and use in source and binary forms, with or without
64  * modification, are permitted provided that the following conditions
65  * are met:
66  *
67  * 1. Redistributions of source code must retain the above copyright
68  *    notice, this list of conditions and the following disclaimer. 
69  *
70  * 2. Redistributions in binary form must reproduce the above copyright
71  *    notice, this list of conditions and the following disclaimer in
72  *    the documentation and/or other materials provided with the
73  *    distribution.
74  *
75  * 3. All advertising materials mentioning features or use of this
76  *    software must display the following acknowledgment:
77  *    "This product includes software developed by the OpenSSL Project
78  *    for use in the OpenSSL Toolkit. (http://www.openssl.org/)"
79  *
80  * 4. The names "OpenSSL Toolkit" and "OpenSSL Project" must not be used to
81  *    endorse or promote products derived from this software without
82  *    prior written permission. For written permission, please contact
83  *    openssl-core@openssl.org.
84  *
85  * 5. Products derived from this software may not be called "OpenSSL"
86  *    nor may "OpenSSL" appear in their names without prior written
87  *    permission of the OpenSSL Project.
88  *
89  * 6. Redistributions of any form whatsoever must retain the following
90  *    acknowledgment:
91  *    "This product includes software developed by the OpenSSL Project
92  *    for use in the OpenSSL Toolkit (http://www.openssl.org/)"
93  *
94  * THIS SOFTWARE IS PROVIDED BY THE OpenSSL PROJECT ``AS IS'' AND ANY
95  * EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
96  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
97  * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE OpenSSL PROJECT OR
98  * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
99  * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
100  * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
101  * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
102  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
103  * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
104  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
105  * OF THE POSSIBILITY OF SUCH DAMAGE.
106  * ====================================================================
107  *
108  * This product includes cryptographic software written by Eric Young
109  * (eay@cryptsoft.com).  This product includes software written by Tim
110  * Hudson (tjh@cryptsoft.com).
111  *
112  */
113
114
115 #ifdef REF_CHECK
116 #  include <assert.h>
117 #endif
118 #include <stdio.h>
119 #include <openssl/objects.h>
120 #include <openssl/lhash.h>
121 #include <openssl/x509v3.h>
122 #include "ssl_locl.h"
123 #include "kssl_lcl.h"
124
125 const char *SSL_version_str=OPENSSL_VERSION_TEXT;
126
127 OPENSSL_GLOBAL SSL3_ENC_METHOD ssl3_undef_enc_method={
128         /* evil casts, but these functions are only called if there's a library bug */
129         (int (*)(SSL *,int))ssl_undefined_function,
130         (int (*)(SSL *, unsigned char *, int))ssl_undefined_function,
131         ssl_undefined_function,
132         (int (*)(SSL *, unsigned char *, unsigned char *, int))ssl_undefined_function,
133         (int (*)(SSL*, int))ssl_undefined_function,
134         (int (*)(SSL *, EVP_MD_CTX *, EVP_MD_CTX *, const char*, int, unsigned char *))ssl_undefined_function
135         };
136
137 int SSL_clear(SSL *s)
138         {
139
140         if (s->method == NULL)
141                 {
142                 SSLerr(SSL_F_SSL_CLEAR,SSL_R_NO_METHOD_SPECIFIED);
143                 return(0);
144                 }
145
146         s->error=0;
147         s->hit=0;
148         s->shutdown=0;
149
150 #if 0 /* Disabled since version 1.10 of this file (early return not
151        * needed because SSL_clear is not called when doing renegotiation) */
152         /* This is set if we are doing dynamic renegotiation so keep
153          * the old cipher.  It is sort of a SSL_clear_lite :-) */
154         if (s->new_session) return(1);
155 #else
156         if (s->new_session)
157                 {
158                 SSLerr(SSL_F_SSL_CLEAR,ERR_R_INTERNAL_ERROR);
159                 return 0;
160                 }
161 #endif
162
163         s->type=0;
164
165         if (ssl_clear_bad_session(s))
166                 {
167                 SSL_SESSION_free(s->session);
168                 s->session=NULL;
169                 }
170
171         s->state=SSL_ST_BEFORE|((s->server)?SSL_ST_ACCEPT:SSL_ST_CONNECT);
172
173         s->version=s->method->version;
174         s->client_version=s->version;
175         s->rwstate=SSL_NOTHING;
176         s->rstate=SSL_ST_READ_HEADER;
177 #if 0
178         s->read_ahead=s->ctx->read_ahead;
179 #endif
180
181         if (s->init_buf != NULL)
182                 {
183                 BUF_MEM_free(s->init_buf);
184                 s->init_buf=NULL;
185                 }
186
187         ssl_clear_cipher_ctx(s);
188
189         s->first_packet=0;
190
191 #if 1
192         /* Check to see if we were changed into a different method, if
193          * so, revert back if we are not doing session-id reuse. */
194         if (!s->in_handshake && (s->session == NULL) && (s->method != s->ctx->method))
195                 {
196                 s->method->ssl_free(s);
197                 s->method=s->ctx->method;
198                 if (!s->method->ssl_new(s))
199                         return(0);
200                 }
201         else
202 #endif
203                 s->method->ssl_clear(s);
204         return(1);
205         }
206
207 /** Used to change an SSL_CTXs default SSL method type */
208 int SSL_CTX_set_ssl_version(SSL_CTX *ctx,SSL_METHOD *meth)
209         {
210         STACK_OF(SSL_CIPHER) *sk;
211
212         ctx->method=meth;
213
214         sk=ssl_create_cipher_list(ctx->method,&(ctx->cipher_list),
215                 &(ctx->cipher_list_by_id),SSL_DEFAULT_CIPHER_LIST);
216         if ((sk == NULL) || (sk_SSL_CIPHER_num(sk) <= 0))
217                 {
218                 SSLerr(SSL_F_SSL_CTX_SET_SSL_VERSION,SSL_R_SSL_LIBRARY_HAS_NO_CIPHERS);
219                 return(0);
220                 }
221         return(1);
222         }
223
224 SSL *SSL_new(SSL_CTX *ctx)
225         {
226         SSL *s;
227
228         if (ctx == NULL)
229                 {
230                 SSLerr(SSL_F_SSL_NEW,SSL_R_NULL_SSL_CTX);
231                 return(NULL);
232                 }
233         if (ctx->method == NULL)
234                 {
235                 SSLerr(SSL_F_SSL_NEW,SSL_R_SSL_CTX_HAS_NO_DEFAULT_SSL_VERSION);
236                 return(NULL);
237                 }
238
239         s=(SSL *)OPENSSL_malloc(sizeof(SSL));
240         if (s == NULL) goto err;
241         memset(s,0,sizeof(SSL));
242
243 #ifndef OPENSSL_NO_KRB5
244         s->kssl_ctx = kssl_ctx_new();
245 #endif  /* OPENSSL_NO_KRB5 */
246
247         s->options=ctx->options;
248         s->mode=ctx->mode;
249         s->max_cert_list=ctx->max_cert_list;
250
251         if (ctx->cert != NULL)
252                 {
253                 /* Earlier library versions used to copy the pointer to
254                  * the CERT, not its contents; only when setting new
255                  * parameters for the per-SSL copy, ssl_cert_new would be
256                  * called (and the direct reference to the per-SSL_CTX
257                  * settings would be lost, but those still were indirectly
258                  * accessed for various purposes, and for that reason they
259                  * used to be known as s->ctx->default_cert).
260                  * Now we don't look at the SSL_CTX's CERT after having
261                  * duplicated it once. */
262
263                 s->cert = ssl_cert_dup(ctx->cert);
264                 if (s->cert == NULL)
265                         goto err;
266                 }
267         else
268                 s->cert=NULL; /* Cannot really happen (see SSL_CTX_new) */
269
270         s->read_ahead=ctx->read_ahead;
271         s->msg_callback=ctx->msg_callback;
272         s->msg_callback_arg=ctx->msg_callback_arg;
273         s->verify_mode=ctx->verify_mode;
274         s->verify_depth=ctx->verify_depth;
275         s->sid_ctx_length=ctx->sid_ctx_length;
276         memcpy(&s->sid_ctx,&ctx->sid_ctx,sizeof(s->sid_ctx));
277         s->verify_callback=ctx->default_verify_callback;
278         s->generate_session_id=ctx->generate_session_id;
279         s->purpose = ctx->purpose;
280         s->trust = ctx->trust;
281         s->quiet_shutdown=ctx->quiet_shutdown;
282
283         CRYPTO_add(&ctx->references,1,CRYPTO_LOCK_SSL_CTX);
284         s->ctx=ctx;
285
286         s->verify_result=X509_V_OK;
287
288         s->method=ctx->method;
289
290         if (!s->method->ssl_new(s))
291                 goto err;
292
293         s->references=1;
294         s->server=(ctx->method->ssl_accept == ssl_undefined_function)?0:1;
295
296         SSL_clear(s);
297
298         CRYPTO_new_ex_data(CRYPTO_EX_INDEX_SSL, s, &s->ex_data);
299
300         return(s);
301 err:
302         if (s != NULL)
303                 {
304                 if (s->cert != NULL)
305                         ssl_cert_free(s->cert);
306                 if (s->ctx != NULL)
307                         SSL_CTX_free(s->ctx); /* decrement reference count */
308                 OPENSSL_free(s);
309                 }
310         SSLerr(SSL_F_SSL_NEW,ERR_R_MALLOC_FAILURE);
311         return(NULL);
312         }
313
314 int SSL_CTX_set_session_id_context(SSL_CTX *ctx,const unsigned char *sid_ctx,
315                                    unsigned int sid_ctx_len)
316     {
317     if(sid_ctx_len > SSL_MAX_SID_CTX_LENGTH)
318         {
319         SSLerr(SSL_F_SSL_CTX_SET_SESSION_ID_CONTEXT,SSL_R_SSL_SESSION_ID_CONTEXT_TOO_LONG);
320         return 0;
321         }
322     ctx->sid_ctx_length=sid_ctx_len;
323     memcpy(ctx->sid_ctx,sid_ctx,sid_ctx_len);
324
325     return 1;
326     }
327
328 int SSL_set_session_id_context(SSL *ssl,const unsigned char *sid_ctx,
329                                unsigned int sid_ctx_len)
330     {
331     if(sid_ctx_len > SSL_MAX_SID_CTX_LENGTH)
332         {
333         SSLerr(SSL_F_SSL_SET_SESSION_ID_CONTEXT,SSL_R_SSL_SESSION_ID_CONTEXT_TOO_LONG);
334         return 0;
335         }
336     ssl->sid_ctx_length=sid_ctx_len;
337     memcpy(ssl->sid_ctx,sid_ctx,sid_ctx_len);
338
339     return 1;
340     }
341
342 int SSL_CTX_set_generate_session_id(SSL_CTX *ctx, GEN_SESSION_CB cb)
343         {
344         CRYPTO_w_lock(CRYPTO_LOCK_SSL_CTX);
345         ctx->generate_session_id = cb;
346         CRYPTO_w_unlock(CRYPTO_LOCK_SSL_CTX);
347         return 1;
348         }
349
350 int SSL_set_generate_session_id(SSL *ssl, GEN_SESSION_CB cb)
351         {
352         CRYPTO_w_lock(CRYPTO_LOCK_SSL);
353         ssl->generate_session_id = cb;
354         CRYPTO_w_unlock(CRYPTO_LOCK_SSL);
355         return 1;
356         }
357
358 int SSL_has_matching_session_id(const SSL *ssl, const unsigned char *id,
359                                 unsigned int id_len)
360         {
361         /* A quick examination of SSL_SESSION_hash and SSL_SESSION_cmp shows how
362          * we can "construct" a session to give us the desired check - ie. to
363          * find if there's a session in the hash table that would conflict with
364          * any new session built out of this id/id_len and the ssl_version in
365          * use by this SSL. */
366         SSL_SESSION r, *p;
367         r.ssl_version = ssl->version;
368         r.session_id_length = id_len;
369         memcpy(r.session_id, id, id_len);
370         /* NB: SSLv2 always uses a fixed 16-byte session ID, so even if a
371          * callback is calling us to check the uniqueness of a shorter ID, it
372          * must be compared as a padded-out ID because that is what it will be
373          * converted to when the callback has finished choosing it. */
374         if((r.ssl_version == SSL2_VERSION) &&
375                         (id_len < SSL2_SSL_SESSION_ID_LENGTH))
376                 {
377                 memset(r.session_id + id_len, 0,
378                         SSL2_SSL_SESSION_ID_LENGTH - id_len);
379                 r.session_id_length = SSL2_SSL_SESSION_ID_LENGTH;
380                 }
381
382         CRYPTO_r_lock(CRYPTO_LOCK_SSL_CTX);
383         p = (SSL_SESSION *)lh_retrieve(ssl->ctx->sessions, &r);
384         CRYPTO_r_unlock(CRYPTO_LOCK_SSL_CTX);
385         return (p != NULL);
386         }
387
388 int SSL_CTX_set_purpose(SSL_CTX *s, int purpose)
389         {
390         return X509_PURPOSE_set(&s->purpose, purpose);
391         }
392
393 int SSL_set_purpose(SSL *s, int purpose)
394         {
395         return X509_PURPOSE_set(&s->purpose, purpose);
396         }
397
398 int SSL_CTX_set_trust(SSL_CTX *s, int trust)
399         {
400         return X509_TRUST_set(&s->trust, trust);
401         }
402
403 int SSL_set_trust(SSL *s, int trust)
404         {
405         return X509_TRUST_set(&s->trust, trust);
406         }
407
408 void SSL_free(SSL *s)
409         {
410         int i;
411
412         if(s == NULL)
413             return;
414
415         i=CRYPTO_add(&s->references,-1,CRYPTO_LOCK_SSL);
416 #ifdef REF_PRINT
417         REF_PRINT("SSL",s);
418 #endif
419         if (i > 0) return;
420 #ifdef REF_CHECK
421         if (i < 0)
422                 {
423                 fprintf(stderr,"SSL_free, bad reference count\n");
424                 abort(); /* ok */
425                 }
426 #endif
427
428         CRYPTO_free_ex_data(CRYPTO_EX_INDEX_SSL, s, &s->ex_data);
429
430         if (s->bbio != NULL)
431                 {
432                 /* If the buffering BIO is in place, pop it off */
433                 if (s->bbio == s->wbio)
434                         {
435                         s->wbio=BIO_pop(s->wbio);
436                         }
437                 BIO_free(s->bbio);
438                 s->bbio=NULL;
439                 }
440         if (s->rbio != NULL)
441                 BIO_free_all(s->rbio);
442         if ((s->wbio != NULL) && (s->wbio != s->rbio))
443                 BIO_free_all(s->wbio);
444
445         if (s->init_buf != NULL) BUF_MEM_free(s->init_buf);
446
447         /* add extra stuff */
448         if (s->cipher_list != NULL) sk_SSL_CIPHER_free(s->cipher_list);
449         if (s->cipher_list_by_id != NULL) sk_SSL_CIPHER_free(s->cipher_list_by_id);
450
451         /* Make the next call work :-) */
452         if (s->session != NULL)
453                 {
454                 ssl_clear_bad_session(s);
455                 SSL_SESSION_free(s->session);
456                 }
457
458         ssl_clear_cipher_ctx(s);
459
460         if (s->cert != NULL) ssl_cert_free(s->cert);
461         /* Free up if allocated */
462
463         if (s->ctx) SSL_CTX_free(s->ctx);
464
465         if (s->client_CA != NULL)
466                 sk_X509_NAME_pop_free(s->client_CA,X509_NAME_free);
467
468         if (s->method != NULL) s->method->ssl_free(s);
469
470         OPENSSL_free(s);
471         }
472
473 void SSL_set_bio(SSL *s,BIO *rbio,BIO *wbio)
474         {
475         /* If the output buffering BIO is still in place, remove it
476          */
477         if (s->bbio != NULL)
478                 {
479                 if (s->wbio == s->bbio)
480                         {
481                         s->wbio=s->wbio->next_bio;
482                         s->bbio->next_bio=NULL;
483                         }
484                 }
485         if ((s->rbio != NULL) && (s->rbio != rbio))
486                 BIO_free_all(s->rbio);
487         if ((s->wbio != NULL) && (s->wbio != wbio) && (s->rbio != s->wbio))
488                 BIO_free_all(s->wbio);
489         s->rbio=rbio;
490         s->wbio=wbio;
491         }
492
493 BIO *SSL_get_rbio(SSL *s)
494         { return(s->rbio); }
495
496 BIO *SSL_get_wbio(SSL *s)
497         { return(s->wbio); }
498
499 int SSL_get_fd(SSL *s)
500         {
501         return(SSL_get_rfd(s));
502         }
503
504 int SSL_get_rfd(SSL *s)
505         {
506         int ret= -1;
507         BIO *b,*r;
508
509         b=SSL_get_rbio(s);
510         r=BIO_find_type(b,BIO_TYPE_DESCRIPTOR);
511         if (r != NULL)
512                 BIO_get_fd(r,&ret);
513         return(ret);
514         }
515
516 int SSL_get_wfd(SSL *s)
517         {
518         int ret= -1;
519         BIO *b,*r;
520
521         b=SSL_get_wbio(s);
522         r=BIO_find_type(b,BIO_TYPE_DESCRIPTOR);
523         if (r != NULL)
524                 BIO_get_fd(r,&ret);
525         return(ret);
526         }
527
528 #ifndef OPENSSL_NO_SOCK
529 int SSL_set_fd(SSL *s,int fd)
530         {
531         int ret=0;
532         BIO *bio=NULL;
533
534         bio=BIO_new(BIO_s_socket());
535
536         if (bio == NULL)
537                 {
538                 SSLerr(SSL_F_SSL_SET_FD,ERR_R_BUF_LIB);
539                 goto err;
540                 }
541         BIO_set_fd(bio,fd,BIO_NOCLOSE);
542         SSL_set_bio(s,bio,bio);
543         ret=1;
544 err:
545         return(ret);
546         }
547
548 int SSL_set_wfd(SSL *s,int fd)
549         {
550         int ret=0;
551         BIO *bio=NULL;
552
553         if ((s->rbio == NULL) || (BIO_method_type(s->rbio) != BIO_TYPE_SOCKET)
554                 || ((int)BIO_get_fd(s->rbio,NULL) != fd))
555                 {
556                 bio=BIO_new(BIO_s_socket());
557
558                 if (bio == NULL)
559                         { SSLerr(SSL_F_SSL_SET_WFD,ERR_R_BUF_LIB); goto err; }
560                 BIO_set_fd(bio,fd,BIO_NOCLOSE);
561                 SSL_set_bio(s,SSL_get_rbio(s),bio);
562                 }
563         else
564                 SSL_set_bio(s,SSL_get_rbio(s),SSL_get_rbio(s));
565         ret=1;
566 err:
567         return(ret);
568         }
569
570 int SSL_set_rfd(SSL *s,int fd)
571         {
572         int ret=0;
573         BIO *bio=NULL;
574
575         if ((s->wbio == NULL) || (BIO_method_type(s->wbio) != BIO_TYPE_SOCKET)
576                 || ((int)BIO_get_fd(s->wbio,NULL) != fd))
577                 {
578                 bio=BIO_new(BIO_s_socket());
579
580                 if (bio == NULL)
581                         {
582                         SSLerr(SSL_F_SSL_SET_RFD,ERR_R_BUF_LIB);
583                         goto err;
584                         }
585                 BIO_set_fd(bio,fd,BIO_NOCLOSE);
586                 SSL_set_bio(s,bio,SSL_get_wbio(s));
587                 }
588         else
589                 SSL_set_bio(s,SSL_get_wbio(s),SSL_get_wbio(s));
590         ret=1;
591 err:
592         return(ret);
593         }
594 #endif
595
596
597 /* return length of latest Finished message we sent, copy to 'buf' */
598 size_t SSL_get_finished(SSL *s, void *buf, size_t count)
599         {
600         size_t ret = 0;
601         
602         if (s->s3 != NULL)
603                 {
604                 ret = s->s3->tmp.finish_md_len;
605                 if (count > ret)
606                         count = ret;
607                 memcpy(buf, s->s3->tmp.finish_md, count);
608                 }
609         return ret;
610         }
611
612 /* return length of latest Finished message we expected, copy to 'buf' */
613 size_t SSL_get_peer_finished(SSL *s, void *buf, size_t count)
614         {
615         size_t ret = 0;
616         
617         if (s->s3 != NULL)
618                 {
619                 ret = s->s3->tmp.peer_finish_md_len;
620                 if (count > ret)
621                         count = ret;
622                 memcpy(buf, s->s3->tmp.peer_finish_md, count);
623                 }
624         return ret;
625         }
626
627
628 int SSL_get_verify_mode(SSL *s)
629         {
630         return(s->verify_mode);
631         }
632
633 int SSL_get_verify_depth(SSL *s)
634         {
635         return(s->verify_depth);
636         }
637
638 int (*SSL_get_verify_callback(SSL *s))(int,X509_STORE_CTX *)
639         {
640         return(s->verify_callback);
641         }
642
643 int SSL_CTX_get_verify_mode(SSL_CTX *ctx)
644         {
645         return(ctx->verify_mode);
646         }
647
648 int SSL_CTX_get_verify_depth(SSL_CTX *ctx)
649         {
650         return(ctx->verify_depth);
651         }
652
653 int (*SSL_CTX_get_verify_callback(SSL_CTX *ctx))(int,X509_STORE_CTX *)
654         {
655         return(ctx->default_verify_callback);
656         }
657
658 void SSL_set_verify(SSL *s,int mode,
659                     int (*callback)(int ok,X509_STORE_CTX *ctx))
660         {
661         s->verify_mode=mode;
662         if (callback != NULL)
663                 s->verify_callback=callback;
664         }
665
666 void SSL_set_verify_depth(SSL *s,int depth)
667         {
668         s->verify_depth=depth;
669         }
670
671 void SSL_set_read_ahead(SSL *s,int yes)
672         {
673         s->read_ahead=yes;
674         }
675
676 int SSL_get_read_ahead(SSL *s)
677         {
678         return(s->read_ahead);
679         }
680
681 int SSL_pending(SSL *s)
682         {
683         /* SSL_pending cannot work properly if read-ahead is enabled
684          * (SSL_[CTX_]ctrl(..., SSL_CTRL_SET_READ_AHEAD, 1, NULL)),
685          * and it is impossible to fix since SSL_pending cannot report
686          * errors that may be observed while scanning the new data.
687          * (Note that SSL_pending() is often used as a boolean value,
688          * so we'd better not return -1.)
689          */
690         return(s->method->ssl_pending(s));
691         }
692
693 X509 *SSL_get_peer_certificate(SSL *s)
694         {
695         X509 *r;
696         
697         if ((s == NULL) || (s->session == NULL))
698                 r=NULL;
699         else
700                 r=s->session->peer;
701
702         if (r == NULL) return(r);
703
704         CRYPTO_add(&r->references,1,CRYPTO_LOCK_X509);
705
706         return(r);
707         }
708
709 STACK_OF(X509) *SSL_get_peer_cert_chain(SSL *s)
710         {
711         STACK_OF(X509) *r;
712         
713         if ((s == NULL) || (s->session == NULL) || (s->session->sess_cert == NULL))
714                 r=NULL;
715         else
716                 r=s->session->sess_cert->cert_chain;
717
718         /* If we are a client, cert_chain includes the peer's own
719          * certificate; if we are a server, it does not. */
720         
721         return(r);
722         }
723
724 /* Now in theory, since the calling process own 't' it should be safe to
725  * modify.  We need to be able to read f without being hassled */
726 void SSL_copy_session_id(SSL *t,SSL *f)
727         {
728         CERT *tmp;
729
730         /* Do we need to to SSL locking? */
731         SSL_set_session(t,SSL_get_session(f));
732
733         /* what if we are setup as SSLv2 but want to talk SSLv3 or
734          * vice-versa */
735         if (t->method != f->method)
736                 {
737                 t->method->ssl_free(t); /* cleanup current */
738                 t->method=f->method;    /* change method */
739                 t->method->ssl_new(t);  /* setup new */
740                 }
741
742         tmp=t->cert;
743         if (f->cert != NULL)
744                 {
745                 CRYPTO_add(&f->cert->references,1,CRYPTO_LOCK_SSL_CERT);
746                 t->cert=f->cert;
747                 }
748         else
749                 t->cert=NULL;
750         if (tmp != NULL) ssl_cert_free(tmp);
751         SSL_set_session_id_context(t,f->sid_ctx,f->sid_ctx_length);
752         }
753
754 /* Fix this so it checks all the valid key/cert options */
755 int SSL_CTX_check_private_key(SSL_CTX *ctx)
756         {
757         if (    (ctx == NULL) ||
758                 (ctx->cert == NULL) ||
759                 (ctx->cert->key->x509 == NULL))
760                 {
761                 SSLerr(SSL_F_SSL_CTX_CHECK_PRIVATE_KEY,SSL_R_NO_CERTIFICATE_ASSIGNED);
762                 return(0);
763                 }
764         if      (ctx->cert->key->privatekey == NULL)
765                 {
766                 SSLerr(SSL_F_SSL_CTX_CHECK_PRIVATE_KEY,SSL_R_NO_PRIVATE_KEY_ASSIGNED);
767                 return(0);
768                 }
769         return(X509_check_private_key(ctx->cert->key->x509, ctx->cert->key->privatekey));
770         }
771
772 /* Fix this function so that it takes an optional type parameter */
773 int SSL_check_private_key(SSL *ssl)
774         {
775         if (ssl == NULL)
776                 {
777                 SSLerr(SSL_F_SSL_CHECK_PRIVATE_KEY,ERR_R_PASSED_NULL_PARAMETER);
778                 return(0);
779                 }
780         if (ssl->cert == NULL)
781                 {
782                 SSLerr(SSL_F_SSL_CHECK_PRIVATE_KEY,SSL_R_NO_CERTIFICATE_ASSIGNED);
783                 return 0;
784                 }
785         if (ssl->cert->key->x509 == NULL)
786                 {
787                 SSLerr(SSL_F_SSL_CHECK_PRIVATE_KEY,SSL_R_NO_CERTIFICATE_ASSIGNED);
788                 return(0);
789                 }
790         if (ssl->cert->key->privatekey == NULL)
791                 {
792                 SSLerr(SSL_F_SSL_CHECK_PRIVATE_KEY,SSL_R_NO_PRIVATE_KEY_ASSIGNED);
793                 return(0);
794                 }
795         return(X509_check_private_key(ssl->cert->key->x509,
796                 ssl->cert->key->privatekey));
797         }
798
799 int SSL_accept(SSL *s)
800         {
801         if (s->handshake_func == 0)
802                 /* Not properly initialized yet */
803                 SSL_set_accept_state(s);
804
805         return(s->method->ssl_accept(s));
806         }
807
808 int SSL_connect(SSL *s)
809         {
810         if (s->handshake_func == 0)
811                 /* Not properly initialized yet */
812                 SSL_set_connect_state(s);
813
814         return(s->method->ssl_connect(s));
815         }
816
817 long SSL_get_default_timeout(SSL *s)
818         {
819         return(s->method->get_timeout());
820         }
821
822 int SSL_read(SSL *s,void *buf,int num)
823         {
824         if (s->handshake_func == 0)
825                 {
826                 SSLerr(SSL_F_SSL_READ, SSL_R_UNINITIALIZED);
827                 return -1;
828                 }
829
830         if (s->shutdown & SSL_RECEIVED_SHUTDOWN)
831                 {
832                 s->rwstate=SSL_NOTHING;
833                 return(0);
834                 }
835         return(s->method->ssl_read(s,buf,num));
836         }
837
838 int SSL_peek(SSL *s,void *buf,int num)
839         {
840         if (s->handshake_func == 0)
841                 {
842                 SSLerr(SSL_F_SSL_READ, SSL_R_UNINITIALIZED);
843                 return -1;
844                 }
845
846         if (s->shutdown & SSL_RECEIVED_SHUTDOWN)
847                 {
848                 return(0);
849                 }
850         return(s->method->ssl_peek(s,buf,num));
851         }
852
853 int SSL_write(SSL *s,const void *buf,int num)
854         {
855         if (s->handshake_func == 0)
856                 {
857                 SSLerr(SSL_F_SSL_WRITE, SSL_R_UNINITIALIZED);
858                 return -1;
859                 }
860
861         if (s->shutdown & SSL_SENT_SHUTDOWN)
862                 {
863                 s->rwstate=SSL_NOTHING;
864                 SSLerr(SSL_F_SSL_WRITE,SSL_R_PROTOCOL_IS_SHUTDOWN);
865                 return(-1);
866                 }
867         return(s->method->ssl_write(s,buf,num));
868         }
869
870 int SSL_shutdown(SSL *s)
871         {
872         /* Note that this function behaves differently from what one might
873          * expect.  Return values are 0 for no success (yet),
874          * 1 for success; but calling it once is usually not enough,
875          * even if blocking I/O is used (see ssl3_shutdown).
876          */
877
878         if (s->handshake_func == 0)
879                 {
880                 SSLerr(SSL_F_SSL_SHUTDOWN, SSL_R_UNINITIALIZED);
881                 return -1;
882                 }
883
884         if ((s != NULL) && !SSL_in_init(s))
885                 return(s->method->ssl_shutdown(s));
886         else
887                 return(1);
888         }
889
890 int SSL_renegotiate(SSL *s)
891         {
892         if (s->new_session == 0)
893                 {
894                 s->new_session=1;
895                 }
896         return(s->method->ssl_renegotiate(s));
897         }
898
899 int SSL_renegotiate_pending(SSL *s)
900         {
901         /* becomes true when negotiation is requested;
902          * false again once a handshake has finished */
903         return (s->new_session != 0);
904         }
905
906 long SSL_ctrl(SSL *s,int cmd,long larg,void *parg)
907         {
908         long l;
909
910         switch (cmd)
911                 {
912         case SSL_CTRL_GET_READ_AHEAD:
913                 return(s->read_ahead);
914         case SSL_CTRL_SET_READ_AHEAD:
915                 l=s->read_ahead;
916                 s->read_ahead=larg;
917                 return(l);
918
919         case SSL_CTRL_SET_MSG_CALLBACK_ARG:
920                 s->msg_callback_arg = parg;
921                 return 1;
922
923         case SSL_CTRL_OPTIONS:
924                 return(s->options|=larg);
925         case SSL_CTRL_MODE:
926                 return(s->mode|=larg);
927         case SSL_CTRL_GET_MAX_CERT_LIST:
928                 return(s->max_cert_list);
929         case SSL_CTRL_SET_MAX_CERT_LIST:
930                 l=s->max_cert_list;
931                 s->max_cert_list=larg;
932                 return(l);
933         default:
934                 return(s->method->ssl_ctrl(s,cmd,larg,parg));
935                 }
936         }
937
938 long SSL_callback_ctrl(SSL *s, int cmd, void (*fp)())
939         {
940         switch(cmd)
941                 {
942         case SSL_CTRL_SET_MSG_CALLBACK:
943                 s->msg_callback = (void (*)(int write_p, int version, int content_type, const void *buf, size_t len, SSL *ssl, void *arg))(fp);
944                 return 1;
945                 
946         default:
947                 return(s->method->ssl_callback_ctrl(s,cmd,fp));
948                 }
949         }
950
951 struct lhash_st *SSL_CTX_sessions(SSL_CTX *ctx)
952         {
953         return ctx->sessions;
954         }
955
956 long SSL_CTX_ctrl(SSL_CTX *ctx,int cmd,long larg,void *parg)
957         {
958         long l;
959
960         switch (cmd)
961                 {
962         case SSL_CTRL_GET_READ_AHEAD:
963                 return(ctx->read_ahead);
964         case SSL_CTRL_SET_READ_AHEAD:
965                 l=ctx->read_ahead;
966                 ctx->read_ahead=larg;
967                 return(l);
968                 
969         case SSL_CTRL_SET_MSG_CALLBACK_ARG:
970                 ctx->msg_callback_arg = parg;
971                 return 1;
972
973         case SSL_CTRL_GET_MAX_CERT_LIST:
974                 return(ctx->max_cert_list);
975         case SSL_CTRL_SET_MAX_CERT_LIST:
976                 l=ctx->max_cert_list;
977                 ctx->max_cert_list=larg;
978                 return(l);
979
980         case SSL_CTRL_SET_SESS_CACHE_SIZE:
981                 l=ctx->session_cache_size;
982                 ctx->session_cache_size=larg;
983                 return(l);
984         case SSL_CTRL_GET_SESS_CACHE_SIZE:
985                 return(ctx->session_cache_size);
986         case SSL_CTRL_SET_SESS_CACHE_MODE:
987                 l=ctx->session_cache_mode;
988                 ctx->session_cache_mode=larg;
989                 return(l);
990         case SSL_CTRL_GET_SESS_CACHE_MODE:
991                 return(ctx->session_cache_mode);
992
993         case SSL_CTRL_SESS_NUMBER:
994                 return(ctx->sessions->num_items);
995         case SSL_CTRL_SESS_CONNECT:
996                 return(ctx->stats.sess_connect);
997         case SSL_CTRL_SESS_CONNECT_GOOD:
998                 return(ctx->stats.sess_connect_good);
999         case SSL_CTRL_SESS_CONNECT_RENEGOTIATE:
1000                 return(ctx->stats.sess_connect_renegotiate);
1001         case SSL_CTRL_SESS_ACCEPT:
1002                 return(ctx->stats.sess_accept);
1003         case SSL_CTRL_SESS_ACCEPT_GOOD:
1004                 return(ctx->stats.sess_accept_good);
1005         case SSL_CTRL_SESS_ACCEPT_RENEGOTIATE:
1006                 return(ctx->stats.sess_accept_renegotiate);
1007         case SSL_CTRL_SESS_HIT:
1008                 return(ctx->stats.sess_hit);
1009         case SSL_CTRL_SESS_CB_HIT:
1010                 return(ctx->stats.sess_cb_hit);
1011         case SSL_CTRL_SESS_MISSES:
1012                 return(ctx->stats.sess_miss);
1013         case SSL_CTRL_SESS_TIMEOUTS:
1014                 return(ctx->stats.sess_timeout);
1015         case SSL_CTRL_SESS_CACHE_FULL:
1016                 return(ctx->stats.sess_cache_full);
1017         case SSL_CTRL_OPTIONS:
1018                 return(ctx->options|=larg);
1019         case SSL_CTRL_MODE:
1020                 return(ctx->mode|=larg);
1021         default:
1022                 return(ctx->method->ssl_ctx_ctrl(ctx,cmd,larg,parg));
1023                 }
1024         }
1025
1026 long SSL_CTX_callback_ctrl(SSL_CTX *ctx, int cmd, void (*fp)())
1027         {
1028         switch(cmd)
1029                 {
1030         case SSL_CTRL_SET_MSG_CALLBACK:
1031                 ctx->msg_callback = (void (*)(int write_p, int version, int content_type, const void *buf, size_t len, SSL *ssl, void *arg))(fp);
1032                 return 1;
1033
1034         default:
1035                 return(ctx->method->ssl_ctx_callback_ctrl(ctx,cmd,fp));
1036                 }
1037         }
1038
1039 int ssl_cipher_id_cmp(const SSL_CIPHER *a, const SSL_CIPHER *b)
1040         {
1041         long l;
1042
1043         l=a->id-b->id;
1044         if (l == 0L)
1045                 return(0);
1046         else
1047                 return((l > 0)?1:-1);
1048         }
1049
1050 int ssl_cipher_ptr_id_cmp(const SSL_CIPHER * const *ap,
1051                         const SSL_CIPHER * const *bp)
1052         {
1053         long l;
1054
1055         l=(*ap)->id-(*bp)->id;
1056         if (l == 0L)
1057                 return(0);
1058         else
1059                 return((l > 0)?1:-1);
1060         }
1061
1062 /** return a STACK of the ciphers available for the SSL and in order of
1063  * preference */
1064 STACK_OF(SSL_CIPHER) *SSL_get_ciphers(SSL *s)
1065         {
1066         if ((s != NULL) && (s->cipher_list != NULL))
1067                 {
1068                 return(s->cipher_list);
1069                 }
1070         else if ((s->ctx != NULL) &&
1071                 (s->ctx->cipher_list != NULL))
1072                 {
1073                 return(s->ctx->cipher_list);
1074                 }
1075         return(NULL);
1076         }
1077
1078 /** return a STACK of the ciphers available for the SSL and in order of
1079  * algorithm id */
1080 STACK_OF(SSL_CIPHER) *ssl_get_ciphers_by_id(SSL *s)
1081         {
1082         if ((s != NULL) && (s->cipher_list_by_id != NULL))
1083                 {
1084                 return(s->cipher_list_by_id);
1085                 }
1086         else if ((s != NULL) && (s->ctx != NULL) &&
1087                 (s->ctx->cipher_list_by_id != NULL))
1088                 {
1089                 return(s->ctx->cipher_list_by_id);
1090                 }
1091         return(NULL);
1092         }
1093
1094 /** The old interface to get the same thing as SSL_get_ciphers() */
1095 const char *SSL_get_cipher_list(SSL *s,int n)
1096         {
1097         SSL_CIPHER *c;
1098         STACK_OF(SSL_CIPHER) *sk;
1099
1100         if (s == NULL) return(NULL);
1101         sk=SSL_get_ciphers(s);
1102         if ((sk == NULL) || (sk_SSL_CIPHER_num(sk) <= n))
1103                 return(NULL);
1104         c=sk_SSL_CIPHER_value(sk,n);
1105         if (c == NULL) return(NULL);
1106         return(c->name);
1107         }
1108
1109 /** specify the ciphers to be used by default by the SSL_CTX */
1110 int SSL_CTX_set_cipher_list(SSL_CTX *ctx, const char *str)
1111         {
1112         STACK_OF(SSL_CIPHER) *sk;
1113         
1114         sk=ssl_create_cipher_list(ctx->method,&ctx->cipher_list,
1115                 &ctx->cipher_list_by_id,str);
1116 /* XXXX */
1117         return((sk == NULL)?0:1);
1118         }
1119
1120 /** specify the ciphers to be used by the SSL */
1121 int SSL_set_cipher_list(SSL *s,const char *str)
1122         {
1123         STACK_OF(SSL_CIPHER) *sk;
1124         
1125         sk=ssl_create_cipher_list(s->ctx->method,&s->cipher_list,
1126                 &s->cipher_list_by_id,str);
1127 /* XXXX */
1128         return((sk == NULL)?0:1);
1129         }
1130
1131 /* works well for SSLv2, not so good for SSLv3 */
1132 char *SSL_get_shared_ciphers(SSL *s,char *buf,int len)
1133         {
1134         char *p;
1135         const char *cp;
1136         STACK_OF(SSL_CIPHER) *sk;
1137         SSL_CIPHER *c;
1138         int i;
1139
1140         if ((s->session == NULL) || (s->session->ciphers == NULL) ||
1141                 (len < 2))
1142                 return(NULL);
1143
1144         p=buf;
1145         sk=s->session->ciphers;
1146         for (i=0; i<sk_SSL_CIPHER_num(sk); i++)
1147                 {
1148                 /* Decrement for either the ':' or a '\0' */
1149                 len--;
1150                 c=sk_SSL_CIPHER_value(sk,i);
1151                 for (cp=c->name; *cp; )
1152                         {
1153                         if (len-- == 0)
1154                                 {
1155                                 *p='\0';
1156                                 return(buf);
1157                                 }
1158                         else
1159                                 *(p++)= *(cp++);
1160                         }
1161                 *(p++)=':';
1162                 }
1163         p[-1]='\0';
1164         return(buf);
1165         }
1166
1167 int ssl_cipher_list_to_bytes(SSL *s,STACK_OF(SSL_CIPHER) *sk,unsigned char *p)
1168         {
1169         int i,j=0;
1170         SSL_CIPHER *c;
1171         unsigned char *q;
1172 #ifndef OPENSSL_NO_KRB5
1173         int nokrb5 = !kssl_tgt_is_available(s->kssl_ctx);
1174 #endif /* OPENSSL_NO_KRB5 */
1175
1176         if (sk == NULL) return(0);
1177         q=p;
1178
1179         for (i=0; i<sk_SSL_CIPHER_num(sk); i++)
1180                 {
1181                 c=sk_SSL_CIPHER_value(sk,i);
1182 #ifndef OPENSSL_NO_KRB5
1183                 if ((c->algorithms & SSL_KRB5) && nokrb5)
1184                     continue;
1185 #endif /* OPENSSL_NO_KRB5 */                    
1186                 j=ssl_put_cipher_by_char(s,c,p);
1187                 p+=j;
1188                 }
1189         return(p-q);
1190         }
1191
1192 STACK_OF(SSL_CIPHER) *ssl_bytes_to_cipher_list(SSL *s,unsigned char *p,int num,
1193                                                STACK_OF(SSL_CIPHER) **skp)
1194         {
1195         SSL_CIPHER *c;
1196         STACK_OF(SSL_CIPHER) *sk;
1197         int i,n;
1198
1199         n=ssl_put_cipher_by_char(s,NULL,NULL);
1200         if ((num%n) != 0)
1201                 {
1202                 SSLerr(SSL_F_SSL_BYTES_TO_CIPHER_LIST,SSL_R_ERROR_IN_RECEIVED_CIPHER_LIST);
1203                 return(NULL);
1204                 }
1205         if ((skp == NULL) || (*skp == NULL))
1206                 sk=sk_SSL_CIPHER_new_null(); /* change perhaps later */
1207         else
1208                 {
1209                 sk= *skp;
1210                 sk_SSL_CIPHER_zero(sk);
1211                 }
1212
1213         for (i=0; i<num; i+=n)
1214                 {
1215                 c=ssl_get_cipher_by_char(s,p);
1216                 p+=n;
1217                 if (c != NULL)
1218                         {
1219                         if (!sk_SSL_CIPHER_push(sk,c))
1220                                 {
1221                                 SSLerr(SSL_F_SSL_BYTES_TO_CIPHER_LIST,ERR_R_MALLOC_FAILURE);
1222                                 goto err;
1223                                 }
1224                         }
1225                 }
1226
1227         if (skp != NULL)
1228                 *skp=sk;
1229         return(sk);
1230 err:
1231         if ((skp == NULL) || (*skp == NULL))
1232                 sk_SSL_CIPHER_free(sk);
1233         return(NULL);
1234         }
1235
1236 unsigned long SSL_SESSION_hash(SSL_SESSION *a)
1237         {
1238         unsigned long l;
1239
1240         l=(unsigned long)
1241                 ((unsigned int) a->session_id[0]     )|
1242                 ((unsigned int) a->session_id[1]<< 8L)|
1243                 ((unsigned long)a->session_id[2]<<16L)|
1244                 ((unsigned long)a->session_id[3]<<24L);
1245         return(l);
1246         }
1247
1248 /* NB: If this function (or indeed the hash function which uses a sort of
1249  * coarser function than this one) is changed, ensure
1250  * SSL_CTX_has_matching_session_id() is checked accordingly. It relies on being
1251  * able to construct an SSL_SESSION that will collide with any existing session
1252  * with a matching session ID. */
1253 int SSL_SESSION_cmp(SSL_SESSION *a,SSL_SESSION *b)
1254         {
1255         if (a->ssl_version != b->ssl_version)
1256                 return(1);
1257         if (a->session_id_length != b->session_id_length)
1258                 return(1);
1259         return(memcmp(a->session_id,b->session_id,a->session_id_length));
1260         }
1261
1262 /* These wrapper functions should remain rather than redeclaring
1263  * SSL_SESSION_hash and SSL_SESSION_cmp for void* types and casting each
1264  * variable. The reason is that the functions aren't static, they're exposed via
1265  * ssl.h. */
1266 static IMPLEMENT_LHASH_HASH_FN(SSL_SESSION_hash, SSL_SESSION *)
1267 static IMPLEMENT_LHASH_COMP_FN(SSL_SESSION_cmp, SSL_SESSION *)
1268
1269 SSL_CTX *SSL_CTX_new(SSL_METHOD *meth)
1270         {
1271         SSL_CTX *ret=NULL;
1272         
1273         if (meth == NULL)
1274                 {
1275                 SSLerr(SSL_F_SSL_CTX_NEW,SSL_R_NULL_SSL_METHOD_PASSED);
1276                 return(NULL);
1277                 }
1278
1279         if (SSL_get_ex_data_X509_STORE_CTX_idx() < 0)
1280                 {
1281                 SSLerr(SSL_F_SSL_CTX_NEW,SSL_R_X509_VERIFICATION_SETUP_PROBLEMS);
1282                 goto err;
1283                 }
1284         ret=(SSL_CTX *)OPENSSL_malloc(sizeof(SSL_CTX));
1285         if (ret == NULL)
1286                 goto err;
1287
1288         memset(ret,0,sizeof(SSL_CTX));
1289
1290         ret->method=meth;
1291
1292         ret->cert_store=NULL;
1293         ret->session_cache_mode=SSL_SESS_CACHE_SERVER;
1294         ret->session_cache_size=SSL_SESSION_CACHE_MAX_SIZE_DEFAULT;
1295         ret->session_cache_head=NULL;
1296         ret->session_cache_tail=NULL;
1297
1298         /* We take the system default */
1299         ret->session_timeout=meth->get_timeout();
1300
1301         ret->new_session_cb=0;
1302         ret->remove_session_cb=0;
1303         ret->get_session_cb=0;
1304         ret->generate_session_id=0;
1305
1306         memset((char *)&ret->stats,0,sizeof(ret->stats));
1307
1308         ret->references=1;
1309         ret->quiet_shutdown=0;
1310
1311 /*      ret->cipher=NULL;*/
1312 /*      ret->s2->challenge=NULL;
1313         ret->master_key=NULL;
1314         ret->key_arg=NULL;
1315         ret->s2->conn_id=NULL; */
1316
1317         ret->info_callback=NULL;
1318
1319         ret->app_verify_callback=0;
1320         ret->app_verify_arg=NULL;
1321
1322         ret->max_cert_list=SSL_MAX_CERT_LIST_DEFAULT;
1323         ret->read_ahead=0;
1324         ret->msg_callback=0;
1325         ret->msg_callback_arg=NULL;
1326         ret->verify_mode=SSL_VERIFY_NONE;
1327         ret->verify_depth=-1; /* Don't impose a limit (but x509_lu.c does) */
1328         ret->sid_ctx_length=0;
1329         ret->default_verify_callback=NULL;
1330         if ((ret->cert=ssl_cert_new()) == NULL)
1331                 goto err;
1332
1333         ret->default_passwd_callback=0;
1334         ret->default_passwd_callback_userdata=NULL;
1335         ret->client_cert_cb=0;
1336
1337         ret->sessions=lh_new(LHASH_HASH_FN(SSL_SESSION_hash),
1338                         LHASH_COMP_FN(SSL_SESSION_cmp));
1339         if (ret->sessions == NULL) goto err;
1340         ret->cert_store=X509_STORE_new();
1341         if (ret->cert_store == NULL) goto err;
1342
1343         ssl_create_cipher_list(ret->method,
1344                 &ret->cipher_list,&ret->cipher_list_by_id,
1345                 SSL_DEFAULT_CIPHER_LIST);
1346         if (ret->cipher_list == NULL
1347             || sk_SSL_CIPHER_num(ret->cipher_list) <= 0)
1348                 {
1349                 SSLerr(SSL_F_SSL_CTX_NEW,SSL_R_LIBRARY_HAS_NO_CIPHERS);
1350                 goto err2;
1351                 }
1352
1353         if ((ret->rsa_md5=EVP_get_digestbyname("ssl2-md5")) == NULL)
1354                 {
1355                 SSLerr(SSL_F_SSL_CTX_NEW,SSL_R_UNABLE_TO_LOAD_SSL2_MD5_ROUTINES);
1356                 goto err2;
1357                 }
1358         if ((ret->md5=EVP_get_digestbyname("ssl3-md5")) == NULL)
1359                 {
1360                 SSLerr(SSL_F_SSL_CTX_NEW,SSL_R_UNABLE_TO_LOAD_SSL3_MD5_ROUTINES);
1361                 goto err2;
1362                 }
1363         if ((ret->sha1=EVP_get_digestbyname("ssl3-sha1")) == NULL)
1364                 {
1365                 SSLerr(SSL_F_SSL_CTX_NEW,SSL_R_UNABLE_TO_LOAD_SSL3_SHA1_ROUTINES);
1366                 goto err2;
1367                 }
1368
1369         if ((ret->client_CA=sk_X509_NAME_new_null()) == NULL)
1370                 goto err;
1371
1372         CRYPTO_new_ex_data(CRYPTO_EX_INDEX_SSL_CTX, ret, &ret->ex_data);
1373
1374         ret->extra_certs=NULL;
1375         ret->comp_methods=SSL_COMP_get_compression_methods();
1376
1377         return(ret);
1378 err:
1379         SSLerr(SSL_F_SSL_CTX_NEW,ERR_R_MALLOC_FAILURE);
1380 err2:
1381         if (ret != NULL) SSL_CTX_free(ret);
1382         return(NULL);
1383         }
1384
1385 #if 0
1386 static void SSL_COMP_free(SSL_COMP *comp)
1387     { OPENSSL_free(comp); }
1388 #endif
1389
1390 void SSL_CTX_free(SSL_CTX *a)
1391         {
1392         int i;
1393
1394         if (a == NULL) return;
1395
1396         i=CRYPTO_add(&a->references,-1,CRYPTO_LOCK_SSL_CTX);
1397 #ifdef REF_PRINT
1398         REF_PRINT("SSL_CTX",a);
1399 #endif
1400         if (i > 0) return;
1401 #ifdef REF_CHECK
1402         if (i < 0)
1403                 {
1404                 fprintf(stderr,"SSL_CTX_free, bad reference count\n");
1405                 abort(); /* ok */
1406                 }
1407 #endif
1408         CRYPTO_free_ex_data(CRYPTO_EX_INDEX_SSL_CTX, a, &a->ex_data);
1409
1410         if (a->sessions != NULL)
1411                 {
1412                 SSL_CTX_flush_sessions(a,0);
1413                 lh_free(a->sessions);
1414                 }
1415         if (a->cert_store != NULL)
1416                 X509_STORE_free(a->cert_store);
1417         if (a->cipher_list != NULL)
1418                 sk_SSL_CIPHER_free(a->cipher_list);
1419         if (a->cipher_list_by_id != NULL)
1420                 sk_SSL_CIPHER_free(a->cipher_list_by_id);
1421         if (a->cert != NULL)
1422                 ssl_cert_free(a->cert);
1423         if (a->client_CA != NULL)
1424                 sk_X509_NAME_pop_free(a->client_CA,X509_NAME_free);
1425         if (a->extra_certs != NULL)
1426                 sk_X509_pop_free(a->extra_certs,X509_free);
1427 #if 0 /* This should never be done, since it removes a global database */
1428         if (a->comp_methods != NULL)
1429                 sk_SSL_COMP_pop_free(a->comp_methods,SSL_COMP_free);
1430 #else
1431         a->comp_methods = NULL;
1432 #endif
1433         OPENSSL_free(a);
1434         }
1435
1436 void SSL_CTX_set_default_passwd_cb(SSL_CTX *ctx, pem_password_cb *cb)
1437         {
1438         ctx->default_passwd_callback=cb;
1439         }
1440
1441 void SSL_CTX_set_default_passwd_cb_userdata(SSL_CTX *ctx,void *u)
1442         {
1443         ctx->default_passwd_callback_userdata=u;
1444         }
1445
1446 void SSL_CTX_set_cert_verify_callback(SSL_CTX *ctx,int (*cb)(),char *arg)
1447         {
1448         /* now
1449          *     int (*cb)(X509_STORE_CTX *),
1450          * but should be
1451          *     int (*cb)(X509_STORE_CTX *, void *arg)
1452          */
1453         ctx->app_verify_callback=cb;
1454         ctx->app_verify_arg=arg; /* never used */
1455         }
1456
1457 void SSL_CTX_set_verify(SSL_CTX *ctx,int mode,int (*cb)(int, X509_STORE_CTX *))
1458         {
1459         ctx->verify_mode=mode;
1460         ctx->default_verify_callback=cb;
1461         }
1462
1463 void SSL_CTX_set_verify_depth(SSL_CTX *ctx,int depth)
1464         {
1465         ctx->verify_depth=depth;
1466         }
1467
1468 void ssl_set_cert_masks(CERT *c, SSL_CIPHER *cipher)
1469         {
1470         CERT_PKEY *cpk;
1471         int rsa_enc,rsa_tmp,rsa_sign,dh_tmp,dh_rsa,dh_dsa,dsa_sign;
1472         int rsa_enc_export,dh_rsa_export,dh_dsa_export;
1473         int rsa_tmp_export,dh_tmp_export,kl;
1474         unsigned long mask,emask;
1475
1476         if (c == NULL) return;
1477
1478         kl=SSL_C_EXPORT_PKEYLENGTH(cipher);
1479
1480 #ifndef OPENSSL_NO_RSA
1481         rsa_tmp=(c->rsa_tmp != NULL || c->rsa_tmp_cb != NULL);
1482         rsa_tmp_export=(c->rsa_tmp_cb != NULL ||
1483                 (rsa_tmp && RSA_size(c->rsa_tmp)*8 <= kl));
1484 #else
1485         rsa_tmp=rsa_tmp_export=0;
1486 #endif
1487 #ifndef OPENSSL_NO_DH
1488         dh_tmp=(c->dh_tmp != NULL || c->dh_tmp_cb != NULL);
1489         dh_tmp_export=(c->dh_tmp_cb != NULL ||
1490                 (dh_tmp && DH_size(c->dh_tmp)*8 <= kl));
1491 #else
1492         dh_tmp=dh_tmp_export=0;
1493 #endif
1494
1495         cpk= &(c->pkeys[SSL_PKEY_RSA_ENC]);
1496         rsa_enc= (cpk->x509 != NULL && cpk->privatekey != NULL);
1497         rsa_enc_export=(rsa_enc && EVP_PKEY_size(cpk->privatekey)*8 <= kl);
1498         cpk= &(c->pkeys[SSL_PKEY_RSA_SIGN]);
1499         rsa_sign=(cpk->x509 != NULL && cpk->privatekey != NULL);
1500         cpk= &(c->pkeys[SSL_PKEY_DSA_SIGN]);
1501         dsa_sign=(cpk->x509 != NULL && cpk->privatekey != NULL);
1502         cpk= &(c->pkeys[SSL_PKEY_DH_RSA]);
1503         dh_rsa=  (cpk->x509 != NULL && cpk->privatekey != NULL);
1504         dh_rsa_export=(dh_rsa && EVP_PKEY_size(cpk->privatekey)*8 <= kl);
1505         cpk= &(c->pkeys[SSL_PKEY_DH_DSA]);
1506 /* FIX THIS EAY EAY EAY */
1507         dh_dsa=  (cpk->x509 != NULL && cpk->privatekey != NULL);
1508         dh_dsa_export=(dh_dsa && EVP_PKEY_size(cpk->privatekey)*8 <= kl);
1509
1510         mask=0;
1511         emask=0;
1512
1513 #ifdef CIPHER_DEBUG
1514         printf("rt=%d rte=%d dht=%d re=%d ree=%d rs=%d ds=%d dhr=%d dhd=%d\n",
1515                 rsa_tmp,rsa_tmp_export,dh_tmp,
1516                 rsa_enc,rsa_enc_export,rsa_sign,dsa_sign,dh_rsa,dh_dsa);
1517 #endif
1518
1519         if (rsa_enc || (rsa_tmp && rsa_sign))
1520                 mask|=SSL_kRSA;
1521         if (rsa_enc_export || (rsa_tmp_export && (rsa_sign || rsa_enc)))
1522                 emask|=SSL_kRSA;
1523
1524 #if 0
1525         /* The match needs to be both kEDH and aRSA or aDSA, so don't worry */
1526         if (    (dh_tmp || dh_rsa || dh_dsa) && 
1527                 (rsa_enc || rsa_sign || dsa_sign))
1528                 mask|=SSL_kEDH;
1529         if ((dh_tmp_export || dh_rsa_export || dh_dsa_export) &&
1530                 (rsa_enc || rsa_sign || dsa_sign))
1531                 emask|=SSL_kEDH;
1532 #endif
1533
1534         if (dh_tmp_export) 
1535                 emask|=SSL_kEDH;
1536
1537         if (dh_tmp)
1538                 mask|=SSL_kEDH;
1539
1540         if (dh_rsa) mask|=SSL_kDHr;
1541         if (dh_rsa_export) emask|=SSL_kDHr;
1542
1543         if (dh_dsa) mask|=SSL_kDHd;
1544         if (dh_dsa_export) emask|=SSL_kDHd;
1545
1546         if (rsa_enc || rsa_sign)
1547                 {
1548                 mask|=SSL_aRSA;
1549                 emask|=SSL_aRSA;
1550                 }
1551
1552         if (dsa_sign)
1553                 {
1554                 mask|=SSL_aDSS;
1555                 emask|=SSL_aDSS;
1556                 }
1557
1558         mask|=SSL_aNULL;
1559         emask|=SSL_aNULL;
1560
1561 #ifndef OPENSSL_NO_KRB5
1562         mask|=SSL_kKRB5|SSL_aKRB5;
1563         emask|=SSL_kKRB5|SSL_aKRB5;
1564 #endif
1565
1566         c->mask=mask;
1567         c->export_mask=emask;
1568         c->valid=1;
1569         }
1570
1571 /* THIS NEEDS CLEANING UP */
1572 X509 *ssl_get_server_send_cert(SSL *s)
1573         {
1574         unsigned long alg,mask,kalg;
1575         CERT *c;
1576         int i,is_export;
1577
1578         c=s->cert;
1579         ssl_set_cert_masks(c, s->s3->tmp.new_cipher);
1580         alg=s->s3->tmp.new_cipher->algorithms;
1581         is_export=SSL_C_IS_EXPORT(s->s3->tmp.new_cipher);
1582         mask=is_export?c->export_mask:c->mask;
1583         kalg=alg&(SSL_MKEY_MASK|SSL_AUTH_MASK);
1584
1585         if      (kalg & SSL_kDHr)
1586                 i=SSL_PKEY_DH_RSA;
1587         else if (kalg & SSL_kDHd)
1588                 i=SSL_PKEY_DH_DSA;
1589         else if (kalg & SSL_aDSS)
1590                 i=SSL_PKEY_DSA_SIGN;
1591         else if (kalg & SSL_aRSA)
1592                 {
1593                 if (c->pkeys[SSL_PKEY_RSA_ENC].x509 == NULL)
1594                         i=SSL_PKEY_RSA_SIGN;
1595                 else
1596                         i=SSL_PKEY_RSA_ENC;
1597                 }
1598         else if (kalg & SSL_aKRB5)
1599                 {
1600                 /* VRS something else here? */
1601                 return(NULL);
1602                 }
1603         else /* if (kalg & SSL_aNULL) */
1604                 {
1605                 SSLerr(SSL_F_SSL_GET_SERVER_SEND_CERT,ERR_R_INTERNAL_ERROR);
1606                 return(NULL);
1607                 }
1608         if (c->pkeys[i].x509 == NULL) return(NULL);
1609         return(c->pkeys[i].x509);
1610         }
1611
1612 EVP_PKEY *ssl_get_sign_pkey(SSL *s,SSL_CIPHER *cipher)
1613         {
1614         unsigned long alg;
1615         CERT *c;
1616
1617         alg=cipher->algorithms;
1618         c=s->cert;
1619
1620         if ((alg & SSL_aDSS) &&
1621                 (c->pkeys[SSL_PKEY_DSA_SIGN].privatekey != NULL))
1622                 return(c->pkeys[SSL_PKEY_DSA_SIGN].privatekey);
1623         else if (alg & SSL_aRSA)
1624                 {
1625                 if (c->pkeys[SSL_PKEY_RSA_SIGN].privatekey != NULL)
1626                         return(c->pkeys[SSL_PKEY_RSA_SIGN].privatekey);
1627                 else if (c->pkeys[SSL_PKEY_RSA_ENC].privatekey != NULL)
1628                         return(c->pkeys[SSL_PKEY_RSA_ENC].privatekey);
1629                 else
1630                         return(NULL);
1631                 }
1632         else /* if (alg & SSL_aNULL) */
1633                 {
1634                 SSLerr(SSL_F_SSL_GET_SIGN_PKEY,ERR_R_INTERNAL_ERROR);
1635                 return(NULL);
1636                 }
1637         }
1638
1639 void ssl_update_cache(SSL *s,int mode)
1640         {
1641         int i;
1642
1643         /* If the session_id_length is 0, we are not supposed to cache it,
1644          * and it would be rather hard to do anyway :-) */
1645         if (s->session->session_id_length == 0) return;
1646
1647         i=s->ctx->session_cache_mode;
1648         if ((i & mode) && (!s->hit)
1649                 && ((i & SSL_SESS_CACHE_NO_INTERNAL_LOOKUP)
1650                     || SSL_CTX_add_session(s->ctx,s->session))
1651                 && (s->ctx->new_session_cb != NULL))
1652                 {
1653                 CRYPTO_add(&s->session->references,1,CRYPTO_LOCK_SSL_SESSION);
1654                 if (!s->ctx->new_session_cb(s,s->session))
1655                         SSL_SESSION_free(s->session);
1656                 }
1657
1658         /* auto flush every 255 connections */
1659         if ((!(i & SSL_SESS_CACHE_NO_AUTO_CLEAR)) &&
1660                 ((i & mode) == mode))
1661                 {
1662                 if (  (((mode & SSL_SESS_CACHE_CLIENT)
1663                         ?s->ctx->stats.sess_connect_good
1664                         :s->ctx->stats.sess_accept_good) & 0xff) == 0xff)
1665                         {
1666                         SSL_CTX_flush_sessions(s->ctx,time(NULL));
1667                         }
1668                 }
1669         }
1670
1671 SSL_METHOD *SSL_get_ssl_method(SSL *s)
1672         {
1673         return(s->method);
1674         }
1675
1676 int SSL_set_ssl_method(SSL *s,SSL_METHOD *meth)
1677         {
1678         int conn= -1;
1679         int ret=1;
1680
1681         if (s->method != meth)
1682                 {
1683                 if (s->handshake_func != NULL)
1684                         conn=(s->handshake_func == s->method->ssl_connect);
1685
1686                 if (s->method->version == meth->version)
1687                         s->method=meth;
1688                 else
1689                         {
1690                         s->method->ssl_free(s);
1691                         s->method=meth;
1692                         ret=s->method->ssl_new(s);
1693                         }
1694
1695                 if (conn == 1)
1696                         s->handshake_func=meth->ssl_connect;
1697                 else if (conn == 0)
1698                         s->handshake_func=meth->ssl_accept;
1699                 }
1700         return(ret);
1701         }
1702
1703 int SSL_get_error(SSL *s,int i)
1704         {
1705         int reason;
1706         unsigned long l;
1707         BIO *bio;
1708
1709         if (i > 0) return(SSL_ERROR_NONE);
1710
1711         /* Make things return SSL_ERROR_SYSCALL when doing SSL_do_handshake
1712          * etc, where we do encode the error */
1713         if ((l=ERR_peek_error()) != 0)
1714                 {
1715                 if (ERR_GET_LIB(l) == ERR_LIB_SYS)
1716                         return(SSL_ERROR_SYSCALL);
1717                 else
1718                         return(SSL_ERROR_SSL);
1719                 }
1720
1721         if ((i < 0) && SSL_want_read(s))
1722                 {
1723                 bio=SSL_get_rbio(s);
1724                 if (BIO_should_read(bio))
1725                         return(SSL_ERROR_WANT_READ);
1726                 else if (BIO_should_write(bio))
1727                         /* This one doesn't make too much sense ... We never try
1728                          * to write to the rbio, and an application program where
1729                          * rbio and wbio are separate couldn't even know what it
1730                          * should wait for.
1731                          * However if we ever set s->rwstate incorrectly
1732                          * (so that we have SSL_want_read(s) instead of
1733                          * SSL_want_write(s)) and rbio and wbio *are* the same,
1734                          * this test works around that bug; so it might be safer
1735                          * to keep it. */
1736                         return(SSL_ERROR_WANT_WRITE);
1737                 else if (BIO_should_io_special(bio))
1738                         {
1739                         reason=BIO_get_retry_reason(bio);
1740                         if (reason == BIO_RR_CONNECT)
1741                                 return(SSL_ERROR_WANT_CONNECT);
1742                         else if (reason == BIO_RR_ACCEPT)
1743                                 return(SSL_ERROR_WANT_ACCEPT);
1744                         else
1745                                 return(SSL_ERROR_SYSCALL); /* unknown */
1746                         }
1747                 }
1748
1749         if ((i < 0) && SSL_want_write(s))
1750                 {
1751                 bio=SSL_get_wbio(s);
1752                 if (BIO_should_write(bio))
1753                         return(SSL_ERROR_WANT_WRITE);
1754                 else if (BIO_should_read(bio))
1755                         /* See above (SSL_want_read(s) with BIO_should_write(bio)) */
1756                         return(SSL_ERROR_WANT_READ);
1757                 else if (BIO_should_io_special(bio))
1758                         {
1759                         reason=BIO_get_retry_reason(bio);
1760                         if (reason == BIO_RR_CONNECT)
1761                                 return(SSL_ERROR_WANT_CONNECT);
1762                         else if (reason == BIO_RR_ACCEPT)
1763                                 return(SSL_ERROR_WANT_ACCEPT);
1764                         else
1765                                 return(SSL_ERROR_SYSCALL);
1766                         }
1767                 }
1768         if ((i < 0) && SSL_want_x509_lookup(s))
1769                 {
1770                 return(SSL_ERROR_WANT_X509_LOOKUP);
1771                 }
1772
1773         if (i == 0)
1774                 {
1775                 if (s->version == SSL2_VERSION)
1776                         {
1777                         /* assume it is the socket being closed */
1778                         return(SSL_ERROR_ZERO_RETURN);
1779                         }
1780                 else
1781                         {
1782                         if ((s->shutdown & SSL_RECEIVED_SHUTDOWN) &&
1783                                 (s->s3->warn_alert == SSL_AD_CLOSE_NOTIFY))
1784                                 return(SSL_ERROR_ZERO_RETURN);
1785                         }
1786                 }
1787         return(SSL_ERROR_SYSCALL);
1788         }
1789
1790 int SSL_do_handshake(SSL *s)
1791         {
1792         int ret=1;
1793
1794         if (s->handshake_func == NULL)
1795                 {
1796                 SSLerr(SSL_F_SSL_DO_HANDSHAKE,SSL_R_CONNECTION_TYPE_NOT_SET);
1797                 return(-1);
1798                 }
1799
1800         s->method->ssl_renegotiate_check(s);
1801
1802         if (SSL_in_init(s) || SSL_in_before(s))
1803                 {
1804                 ret=s->handshake_func(s);
1805                 }
1806         return(ret);
1807         }
1808
1809 /* For the next 2 functions, SSL_clear() sets shutdown and so
1810  * one of these calls will reset it */
1811 void SSL_set_accept_state(SSL *s)
1812         {
1813         s->server=1;
1814         s->shutdown=0;
1815         s->state=SSL_ST_ACCEPT|SSL_ST_BEFORE;
1816         s->handshake_func=s->method->ssl_accept;
1817         /* clear the current cipher */
1818         ssl_clear_cipher_ctx(s);
1819         }
1820
1821 void SSL_set_connect_state(SSL *s)
1822         {
1823         s->server=0;
1824         s->shutdown=0;
1825         s->state=SSL_ST_CONNECT|SSL_ST_BEFORE;
1826         s->handshake_func=s->method->ssl_connect;
1827         /* clear the current cipher */
1828         ssl_clear_cipher_ctx(s);
1829         }
1830
1831 int ssl_undefined_function(SSL *s)
1832         {
1833         SSLerr(SSL_F_SSL_UNDEFINED_FUNCTION,ERR_R_SHOULD_NOT_HAVE_BEEN_CALLED);
1834         return(0);
1835         }
1836
1837 SSL_METHOD *ssl_bad_method(int ver)
1838         {
1839         SSLerr(SSL_F_SSL_BAD_METHOD,ERR_R_SHOULD_NOT_HAVE_BEEN_CALLED);
1840         return(NULL);
1841         }
1842
1843 const char *SSL_get_version(SSL *s)
1844         {
1845         if (s->version == TLS1_VERSION)
1846                 return("TLSv1");
1847         else if (s->version == SSL3_VERSION)
1848                 return("SSLv3");
1849         else if (s->version == SSL2_VERSION)
1850                 return("SSLv2");
1851         else
1852                 return("unknown");
1853         }
1854
1855 SSL *SSL_dup(SSL *s)
1856         {
1857         STACK_OF(X509_NAME) *sk;
1858         X509_NAME *xn;
1859         SSL *ret;
1860         int i;
1861                  
1862         if ((ret=SSL_new(SSL_get_SSL_CTX(s))) == NULL)
1863             return(NULL);
1864
1865         ret->version = s->version;
1866         ret->type = s->type;
1867         ret->method = s->method;
1868
1869         if (s->session != NULL)
1870                 {
1871                 /* This copies session-id, SSL_METHOD, sid_ctx, and 'cert' */
1872                 SSL_copy_session_id(ret,s);
1873                 }
1874         else
1875                 {
1876                 /* No session has been established yet, so we have to expect
1877                  * that s->cert or ret->cert will be changed later --
1878                  * they should not both point to the same object,
1879                  * and thus we can't use SSL_copy_session_id. */
1880
1881                 ret->method = s->method;
1882                 ret->method->ssl_new(ret);
1883
1884                 if (s->cert != NULL)
1885                         {
1886                         if (ret->cert != NULL)
1887                                 {
1888                                 ssl_cert_free(ret->cert);
1889                                 }
1890                         ret->cert = ssl_cert_dup(s->cert);
1891                         if (ret->cert == NULL)
1892                                 goto err;
1893                         }
1894                                 
1895                 SSL_set_session_id_context(ret,
1896                         s->sid_ctx, s->sid_ctx_length);
1897                 }
1898
1899         ret->options=s->options;
1900         ret->mode=s->mode;
1901         SSL_set_max_cert_list(ret,SSL_get_max_cert_list(s));
1902         SSL_set_read_ahead(ret,SSL_get_read_ahead(s));
1903         ret->msg_callback = s->msg_callback;
1904         ret->msg_callback_arg = s->msg_callback_arg;
1905         SSL_set_verify(ret,SSL_get_verify_mode(s),
1906                 SSL_get_verify_callback(s));
1907         SSL_set_verify_depth(ret,SSL_get_verify_depth(s));
1908         ret->generate_session_id = s->generate_session_id;
1909
1910         SSL_set_info_callback(ret,SSL_get_info_callback(s));
1911         
1912         ret->debug=s->debug;
1913
1914         /* copy app data, a little dangerous perhaps */
1915         if (!CRYPTO_dup_ex_data(CRYPTO_EX_INDEX_SSL, &ret->ex_data, &s->ex_data))
1916                 goto err;
1917
1918         /* setup rbio, and wbio */
1919         if (s->rbio != NULL)
1920                 {
1921                 if (!BIO_dup_state(s->rbio,(char *)&ret->rbio))
1922                         goto err;
1923                 }
1924         if (s->wbio != NULL)
1925                 {
1926                 if (s->wbio != s->rbio)
1927                         {
1928                         if (!BIO_dup_state(s->wbio,(char *)&ret->wbio))
1929                                 goto err;
1930                         }
1931                 else
1932                         ret->wbio=ret->rbio;
1933                 }
1934         ret->rwstate = s->rwstate;
1935         ret->in_handshake = s->in_handshake;
1936         ret->handshake_func = s->handshake_func;
1937         ret->server = s->server;
1938         ret->new_session = s->new_session;
1939         ret->quiet_shutdown = s->quiet_shutdown;
1940         ret->shutdown=s->shutdown;
1941         ret->state=s->state; /* SSL_dup does not really work at any state, though */
1942         ret->rstate=s->rstate;
1943         ret->init_num = 0; /* would have to copy ret->init_buf, ret->init_msg, ret->init_num, ret->init_off */
1944         ret->hit=s->hit;
1945         ret->purpose=s->purpose;
1946         ret->trust=s->trust;
1947
1948         /* dup the cipher_list and cipher_list_by_id stacks */
1949         if (s->cipher_list != NULL)
1950                 {
1951                 if ((ret->cipher_list=sk_SSL_CIPHER_dup(s->cipher_list)) == NULL)
1952                         goto err;
1953                 }
1954         if (s->cipher_list_by_id != NULL)
1955                 if ((ret->cipher_list_by_id=sk_SSL_CIPHER_dup(s->cipher_list_by_id))
1956                         == NULL)
1957                         goto err;
1958
1959         /* Dup the client_CA list */
1960         if (s->client_CA != NULL)
1961                 {
1962                 if ((sk=sk_X509_NAME_dup(s->client_CA)) == NULL) goto err;
1963                 ret->client_CA=sk;
1964                 for (i=0; i<sk_X509_NAME_num(sk); i++)
1965                         {
1966                         xn=sk_X509_NAME_value(sk,i);
1967                         if (sk_X509_NAME_set(sk,i,X509_NAME_dup(xn)) == NULL)
1968                                 {
1969                                 X509_NAME_free(xn);
1970                                 goto err;
1971                                 }
1972                         }
1973                 }
1974
1975         if (0)
1976                 {
1977 err:
1978                 if (ret != NULL) SSL_free(ret);
1979                 ret=NULL;
1980                 }
1981         return(ret);
1982         }
1983
1984 void ssl_clear_cipher_ctx(SSL *s)
1985         {
1986         if (s->enc_read_ctx != NULL)
1987                 {
1988                 EVP_CIPHER_CTX_cleanup(s->enc_read_ctx);
1989                 OPENSSL_free(s->enc_read_ctx);
1990                 s->enc_read_ctx=NULL;
1991                 }
1992         if (s->enc_write_ctx != NULL)
1993                 {
1994                 EVP_CIPHER_CTX_cleanup(s->enc_write_ctx);
1995                 OPENSSL_free(s->enc_write_ctx);
1996                 s->enc_write_ctx=NULL;
1997                 }
1998         if (s->expand != NULL)
1999                 {
2000                 COMP_CTX_free(s->expand);
2001                 s->expand=NULL;
2002                 }
2003         if (s->compress != NULL)
2004                 {
2005                 COMP_CTX_free(s->compress);
2006                 s->compress=NULL;
2007                 }
2008         }
2009
2010 /* Fix this function so that it takes an optional type parameter */
2011 X509 *SSL_get_certificate(SSL *s)
2012         {
2013         if (s->cert != NULL)
2014                 return(s->cert->key->x509);
2015         else
2016                 return(NULL);
2017         }
2018
2019 /* Fix this function so that it takes an optional type parameter */
2020 EVP_PKEY *SSL_get_privatekey(SSL *s)
2021         {
2022         if (s->cert != NULL)
2023                 return(s->cert->key->privatekey);
2024         else
2025                 return(NULL);
2026         }
2027
2028 SSL_CIPHER *SSL_get_current_cipher(SSL *s)
2029         {
2030         if ((s->session != NULL) && (s->session->cipher != NULL))
2031                 return(s->session->cipher);
2032         return(NULL);
2033         }
2034
2035 int ssl_init_wbio_buffer(SSL *s,int push)
2036         {
2037         BIO *bbio;
2038
2039         if (s->bbio == NULL)
2040                 {
2041                 bbio=BIO_new(BIO_f_buffer());
2042                 if (bbio == NULL) return(0);
2043                 s->bbio=bbio;
2044                 }
2045         else
2046                 {
2047                 bbio=s->bbio;
2048                 if (s->bbio == s->wbio)
2049                         s->wbio=BIO_pop(s->wbio);
2050                 }
2051         (void)BIO_reset(bbio);
2052 /*      if (!BIO_set_write_buffer_size(bbio,16*1024)) */
2053         if (!BIO_set_read_buffer_size(bbio,1))
2054                 {
2055                 SSLerr(SSL_F_SSL_INIT_WBIO_BUFFER,ERR_R_BUF_LIB);
2056                 return(0);
2057                 }
2058         if (push)
2059                 {
2060                 if (s->wbio != bbio)
2061                         s->wbio=BIO_push(bbio,s->wbio);
2062                 }
2063         else
2064                 {
2065                 if (s->wbio == bbio)
2066                         s->wbio=BIO_pop(bbio);
2067                 }
2068         return(1);
2069         }
2070
2071 void ssl_free_wbio_buffer(SSL *s)
2072         {
2073         if (s->bbio == NULL) return;
2074
2075         if (s->bbio == s->wbio)
2076                 {
2077                 /* remove buffering */
2078                 s->wbio=BIO_pop(s->wbio);
2079 #ifdef REF_CHECK /* not the usual REF_CHECK, but this avoids adding one more preprocessor symbol */
2080                 assert(s->wbio != NULL);
2081 #endif  
2082         }
2083         BIO_free(s->bbio);
2084         s->bbio=NULL;
2085         }
2086         
2087 void SSL_CTX_set_quiet_shutdown(SSL_CTX *ctx,int mode)
2088         {
2089         ctx->quiet_shutdown=mode;
2090         }
2091
2092 int SSL_CTX_get_quiet_shutdown(SSL_CTX *ctx)
2093         {
2094         return(ctx->quiet_shutdown);
2095         }
2096
2097 void SSL_set_quiet_shutdown(SSL *s,int mode)
2098         {
2099         s->quiet_shutdown=mode;
2100         }
2101
2102 int SSL_get_quiet_shutdown(SSL *s)
2103         {
2104         return(s->quiet_shutdown);
2105         }
2106
2107 void SSL_set_shutdown(SSL *s,int mode)
2108         {
2109         s->shutdown=mode;
2110         }
2111
2112 int SSL_get_shutdown(SSL *s)
2113         {
2114         return(s->shutdown);
2115         }
2116
2117 int SSL_version(SSL *s)
2118         {
2119         return(s->version);
2120         }
2121
2122 SSL_CTX *SSL_get_SSL_CTX(SSL *ssl)
2123         {
2124         return(ssl->ctx);
2125         }
2126
2127 #ifndef OPENSSL_NO_STDIO
2128 int SSL_CTX_set_default_verify_paths(SSL_CTX *ctx)
2129         {
2130         return(X509_STORE_set_default_paths(ctx->cert_store));
2131         }
2132
2133 int SSL_CTX_load_verify_locations(SSL_CTX *ctx, const char *CAfile,
2134                 const char *CApath)
2135         {
2136         return(X509_STORE_load_locations(ctx->cert_store,CAfile,CApath));
2137         }
2138 #endif
2139
2140 void SSL_set_info_callback(SSL *ssl,
2141                            void (*cb)(const SSL *ssl,int type,int val))
2142         {
2143         ssl->info_callback=cb;
2144         }
2145
2146 void (*SSL_get_info_callback(SSL *ssl))(const SSL *ssl,int type,int val)
2147         {
2148         return ssl->info_callback;
2149         }
2150
2151 int SSL_state(SSL *ssl)
2152         {
2153         return(ssl->state);
2154         }
2155
2156 void SSL_set_verify_result(SSL *ssl,long arg)
2157         {
2158         ssl->verify_result=arg;
2159         }
2160
2161 long SSL_get_verify_result(SSL *ssl)
2162         {
2163         return(ssl->verify_result);
2164         }
2165
2166 int SSL_get_ex_new_index(long argl,void *argp,CRYPTO_EX_new *new_func,
2167                          CRYPTO_EX_dup *dup_func,CRYPTO_EX_free *free_func)
2168         {
2169         return CRYPTO_get_ex_new_index(CRYPTO_EX_INDEX_SSL, argl, argp,
2170                                 new_func, dup_func, free_func);
2171         }
2172
2173 int SSL_set_ex_data(SSL *s,int idx,void *arg)
2174         {
2175         return(CRYPTO_set_ex_data(&s->ex_data,idx,arg));
2176         }
2177
2178 void *SSL_get_ex_data(SSL *s,int idx)
2179         {
2180         return(CRYPTO_get_ex_data(&s->ex_data,idx));
2181         }
2182
2183 int SSL_CTX_get_ex_new_index(long argl,void *argp,CRYPTO_EX_new *new_func,
2184                              CRYPTO_EX_dup *dup_func,CRYPTO_EX_free *free_func)
2185         {
2186         return CRYPTO_get_ex_new_index(CRYPTO_EX_INDEX_SSL_CTX, argl, argp,
2187                                 new_func, dup_func, free_func);
2188         }
2189
2190 int SSL_CTX_set_ex_data(SSL_CTX *s,int idx,void *arg)
2191         {
2192         return(CRYPTO_set_ex_data(&s->ex_data,idx,arg));
2193         }
2194
2195 void *SSL_CTX_get_ex_data(SSL_CTX *s,int idx)
2196         {
2197         return(CRYPTO_get_ex_data(&s->ex_data,idx));
2198         }
2199
2200 int ssl_ok(SSL *s)
2201         {
2202         return(1);
2203         }
2204
2205 X509_STORE *SSL_CTX_get_cert_store(SSL_CTX *ctx)
2206         {
2207         return(ctx->cert_store);
2208         }
2209
2210 void SSL_CTX_set_cert_store(SSL_CTX *ctx,X509_STORE *store)
2211         {
2212         if (ctx->cert_store != NULL)
2213                 X509_STORE_free(ctx->cert_store);
2214         ctx->cert_store=store;
2215         }
2216
2217 int SSL_want(SSL *s)
2218         {
2219         return(s->rwstate);
2220         }
2221
2222 /*!
2223  * \brief Set the callback for generating temporary RSA keys.
2224  * \param ctx the SSL context.
2225  * \param cb the callback
2226  */
2227
2228 #ifndef OPENSSL_NO_RSA
2229 void SSL_CTX_set_tmp_rsa_callback(SSL_CTX *ctx,RSA *(*cb)(SSL *ssl,
2230                                                           int is_export,
2231                                                           int keylength))
2232     {
2233     SSL_CTX_callback_ctrl(ctx,SSL_CTRL_SET_TMP_RSA_CB,(void (*)())cb);
2234     }
2235
2236 void SSL_set_tmp_rsa_callback(SSL *ssl,RSA *(*cb)(SSL *ssl,
2237                                                   int is_export,
2238                                                   int keylength))
2239     {
2240     SSL_callback_ctrl(ssl,SSL_CTRL_SET_TMP_RSA_CB,(void (*)())cb);
2241     }
2242 #endif
2243
2244 #ifdef DOXYGEN
2245 /*!
2246  * \brief The RSA temporary key callback function.
2247  * \param ssl the SSL session.
2248  * \param is_export \c TRUE if the temp RSA key is for an export ciphersuite.
2249  * \param keylength if \c is_export is \c TRUE, then \c keylength is the size
2250  * of the required key in bits.
2251  * \return the temporary RSA key.
2252  * \sa SSL_CTX_set_tmp_rsa_callback, SSL_set_tmp_rsa_callback
2253  */
2254
2255 RSA *cb(SSL *ssl,int is_export,int keylength)
2256     {}
2257 #endif
2258
2259 /*!
2260  * \brief Set the callback for generating temporary DH keys.
2261  * \param ctx the SSL context.
2262  * \param dh the callback
2263  */
2264
2265 #ifndef OPENSSL_NO_DH
2266 void SSL_CTX_set_tmp_dh_callback(SSL_CTX *ctx,DH *(*dh)(SSL *ssl,int is_export,
2267                                                         int keylength))
2268         {
2269         SSL_CTX_callback_ctrl(ctx,SSL_CTRL_SET_TMP_DH_CB,(void (*)())dh);
2270         }
2271
2272 void SSL_set_tmp_dh_callback(SSL *ssl,DH *(*dh)(SSL *ssl,int is_export,
2273                                                 int keylength))
2274         {
2275         SSL_callback_ctrl(ssl,SSL_CTRL_SET_TMP_DH_CB,(void (*)())dh);
2276         }
2277 #endif
2278
2279
2280 void SSL_CTX_set_msg_callback(SSL_CTX *ctx, void (*cb)(int write_p, int version, int content_type, const void *buf, size_t len, SSL *ssl, void *arg))
2281         {
2282         SSL_CTX_callback_ctrl(ctx, SSL_CTRL_SET_MSG_CALLBACK, (void (*)())cb);
2283         }
2284 void SSL_set_msg_callback(SSL *ssl, void (*cb)(int write_p, int version, int content_type, const void *buf, size_t len, SSL *ssl, void *arg))
2285         {
2286         SSL_callback_ctrl(ssl, SSL_CTRL_SET_MSG_CALLBACK, (void (*)())cb);
2287         }
2288
2289
2290
2291 #if defined(_WINDLL) && defined(OPENSSL_SYS_WIN16)
2292 #include "../crypto/bio/bss_file.c"
2293 #endif
2294
2295 IMPLEMENT_STACK_OF(SSL_CIPHER)
2296 IMPLEMENT_STACK_OF(SSL_COMP)