]> CyberLeo.Net >> Repos - FreeBSD/releng/10.1.git/blob - crypto/openssl/ssl/ssl_sess.c
Fix OpenSSL multiple vulnerabilities.
[FreeBSD/releng/10.1.git] / crypto / openssl / ssl / ssl_sess.c
1 /* ssl/ssl_sess.c */
2 /* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com)
3  * All rights reserved.
4  *
5  * This package is an SSL implementation written
6  * by Eric Young (eay@cryptsoft.com).
7  * The implementation was written so as to conform with Netscapes SSL.
8  * 
9  * This library is free for commercial and non-commercial use as long as
10  * the following conditions are aheared to.  The following conditions
11  * apply to all code found in this distribution, be it the RC4, RSA,
12  * lhash, DES, etc., code; not just the SSL code.  The SSL documentation
13  * included with this distribution is covered by the same copyright terms
14  * except that the holder is Tim Hudson (tjh@cryptsoft.com).
15  * 
16  * Copyright remains Eric Young's, and as such any Copyright notices in
17  * the code are not to be removed.
18  * If this package is used in a product, Eric Young should be given attribution
19  * as the author of the parts of the library used.
20  * This can be in the form of a textual message at program startup or
21  * in documentation (online or textual) provided with the package.
22  * 
23  * Redistribution and use in source and binary forms, with or without
24  * modification, are permitted provided that the following conditions
25  * are met:
26  * 1. Redistributions of source code must retain the copyright
27  *    notice, this list of conditions and the following disclaimer.
28  * 2. Redistributions in binary form must reproduce the above copyright
29  *    notice, this list of conditions and the following disclaimer in the
30  *    documentation and/or other materials provided with the distribution.
31  * 3. All advertising materials mentioning features or use of this software
32  *    must display the following acknowledgement:
33  *    "This product includes cryptographic software written by
34  *     Eric Young (eay@cryptsoft.com)"
35  *    The word 'cryptographic' can be left out if the rouines from the library
36  *    being used are not cryptographic related :-).
37  * 4. If you include any Windows specific code (or a derivative thereof) from 
38  *    the apps directory (application code) you must include an acknowledgement:
39  *    "This product includes software written by Tim Hudson (tjh@cryptsoft.com)"
40  * 
41  * THIS SOFTWARE IS PROVIDED BY ERIC YOUNG ``AS IS'' AND
42  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
43  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
44  * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
45  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
46  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
47  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
48  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
49  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
50  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
51  * SUCH DAMAGE.
52  * 
53  * The licence and distribution terms for any publically available version or
54  * derivative of this code cannot be changed.  i.e. this code cannot simply be
55  * copied and put under another distribution licence
56  * [including the GNU Public Licence.]
57  */
58 /* ====================================================================
59  * Copyright (c) 1998-2006 The OpenSSL Project.  All rights reserved.
60  *
61  * Redistribution and use in source and binary forms, with or without
62  * modification, are permitted provided that the following conditions
63  * are met:
64  *
65  * 1. Redistributions of source code must retain the above copyright
66  *    notice, this list of conditions and the following disclaimer. 
67  *
68  * 2. Redistributions in binary form must reproduce the above copyright
69  *    notice, this list of conditions and the following disclaimer in
70  *    the documentation and/or other materials provided with the
71  *    distribution.
72  *
73  * 3. All advertising materials mentioning features or use of this
74  *    software must display the following acknowledgment:
75  *    "This product includes software developed by the OpenSSL Project
76  *    for use in the OpenSSL Toolkit. (http://www.openssl.org/)"
77  *
78  * 4. The names "OpenSSL Toolkit" and "OpenSSL Project" must not be used to
79  *    endorse or promote products derived from this software without
80  *    prior written permission. For written permission, please contact
81  *    openssl-core@openssl.org.
82  *
83  * 5. Products derived from this software may not be called "OpenSSL"
84  *    nor may "OpenSSL" appear in their names without prior written
85  *    permission of the OpenSSL Project.
86  *
87  * 6. Redistributions of any form whatsoever must retain the following
88  *    acknowledgment:
89  *    "This product includes software developed by the OpenSSL Project
90  *    for use in the OpenSSL Toolkit (http://www.openssl.org/)"
91  *
92  * THIS SOFTWARE IS PROVIDED BY THE OpenSSL PROJECT ``AS IS'' AND ANY
93  * EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
94  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
95  * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE OpenSSL PROJECT OR
96  * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
97  * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
98  * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
99  * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
100  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
101  * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
102  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
103  * OF THE POSSIBILITY OF SUCH DAMAGE.
104  * ====================================================================
105  *
106  * This product includes cryptographic software written by Eric Young
107  * (eay@cryptsoft.com).  This product includes software written by Tim
108  * Hudson (tjh@cryptsoft.com).
109  *
110  */
111 /* ====================================================================
112  * Copyright 2005 Nokia. All rights reserved.
113  *
114  * The portions of the attached software ("Contribution") is developed by
115  * Nokia Corporation and is licensed pursuant to the OpenSSL open source
116  * license.
117  *
118  * The Contribution, originally written by Mika Kousa and Pasi Eronen of
119  * Nokia Corporation, consists of the "PSK" (Pre-Shared Key) ciphersuites
120  * support (see RFC 4279) to OpenSSL.
121  *
122  * No patent licenses or other rights except those expressly stated in
123  * the OpenSSL open source license shall be deemed granted or received
124  * expressly, by implication, estoppel, or otherwise.
125  *
126  * No assurances are provided by Nokia that the Contribution does not
127  * infringe the patent or other intellectual property rights of any third
128  * party or that the license provides you with all the necessary rights
129  * to make use of the Contribution.
130  *
131  * THE SOFTWARE IS PROVIDED "AS IS" WITHOUT WARRANTY OF ANY KIND. IN
132  * ADDITION TO THE DISCLAIMERS INCLUDED IN THE LICENSE, NOKIA
133  * SPECIFICALLY DISCLAIMS ANY LIABILITY FOR CLAIMS BROUGHT BY YOU OR ANY
134  * OTHER ENTITY BASED ON INFRINGEMENT OF INTELLECTUAL PROPERTY RIGHTS OR
135  * OTHERWISE.
136  */
137
138 #include <stdio.h>
139 #include <openssl/lhash.h>
140 #include <openssl/rand.h>
141 #ifndef OPENSSL_NO_ENGINE
142 #include <openssl/engine.h>
143 #endif
144 #include "ssl_locl.h"
145
146 static void SSL_SESSION_list_remove(SSL_CTX *ctx, SSL_SESSION *s);
147 static void SSL_SESSION_list_add(SSL_CTX *ctx,SSL_SESSION *s);
148 static int remove_session_lock(SSL_CTX *ctx, SSL_SESSION *c, int lck);
149
150 SSL_SESSION *SSL_get_session(const SSL *ssl)
151 /* aka SSL_get0_session; gets 0 objects, just returns a copy of the pointer */
152         {
153         return(ssl->session);
154         }
155
156 SSL_SESSION *SSL_get1_session(SSL *ssl)
157 /* variant of SSL_get_session: caller really gets something */
158         {
159         SSL_SESSION *sess;
160         /* Need to lock this all up rather than just use CRYPTO_add so that
161          * somebody doesn't free ssl->session between when we check it's
162          * non-null and when we up the reference count. */
163         CRYPTO_w_lock(CRYPTO_LOCK_SSL_SESSION);
164         sess = ssl->session;
165         if(sess)
166                 sess->references++;
167         CRYPTO_w_unlock(CRYPTO_LOCK_SSL_SESSION);
168         return(sess);
169         }
170
171 int SSL_SESSION_get_ex_new_index(long argl, void *argp, CRYPTO_EX_new *new_func,
172              CRYPTO_EX_dup *dup_func, CRYPTO_EX_free *free_func)
173         {
174         return CRYPTO_get_ex_new_index(CRYPTO_EX_INDEX_SSL_SESSION, argl, argp,
175                         new_func, dup_func, free_func);
176         }
177
178 int SSL_SESSION_set_ex_data(SSL_SESSION *s, int idx, void *arg)
179         {
180         return(CRYPTO_set_ex_data(&s->ex_data,idx,arg));
181         }
182
183 void *SSL_SESSION_get_ex_data(const SSL_SESSION *s, int idx)
184         {
185         return(CRYPTO_get_ex_data(&s->ex_data,idx));
186         }
187
188 SSL_SESSION *SSL_SESSION_new(void)
189         {
190         SSL_SESSION *ss;
191
192         ss=(SSL_SESSION *)OPENSSL_malloc(sizeof(SSL_SESSION));
193         if (ss == NULL)
194                 {
195                 SSLerr(SSL_F_SSL_SESSION_NEW,ERR_R_MALLOC_FAILURE);
196                 return(0);
197                 }
198         memset(ss,0,sizeof(SSL_SESSION));
199
200         ss->verify_result = 1; /* avoid 0 (= X509_V_OK) just in case */
201         ss->references=1;
202         ss->timeout=60*5+4; /* 5 minute timeout by default */
203         ss->time=(unsigned long)time(NULL);
204         ss->prev=NULL;
205         ss->next=NULL;
206         ss->compress_meth=0;
207 #ifndef OPENSSL_NO_TLSEXT
208         ss->tlsext_hostname = NULL; 
209 #ifndef OPENSSL_NO_EC
210         ss->tlsext_ecpointformatlist_length = 0;
211         ss->tlsext_ecpointformatlist = NULL;
212         ss->tlsext_ellipticcurvelist_length = 0;
213         ss->tlsext_ellipticcurvelist = NULL;
214 #endif
215 #endif
216         CRYPTO_new_ex_data(CRYPTO_EX_INDEX_SSL_SESSION, ss, &ss->ex_data);
217 #ifndef OPENSSL_NO_PSK
218         ss->psk_identity_hint=NULL;
219         ss->psk_identity=NULL;
220 #endif
221 #ifndef OPENSSL_NO_SRP
222         ss->srp_username=NULL;
223 #endif
224         return(ss);
225         }
226
227 /*
228  * Create a new SSL_SESSION and duplicate the contents of |src| into it. If
229  * ticket == 0 then no ticket information is duplicated, otherwise it is.
230  */
231 SSL_SESSION *ssl_session_dup(SSL_SESSION *src, int ticket)
232 {
233     SSL_SESSION *dest;
234
235     dest = OPENSSL_malloc(sizeof(*src));
236     if (dest == NULL) {
237         goto err;
238     }
239     memcpy(dest, src, sizeof(*dest));
240
241     /*
242      * Set the various pointers to NULL so that we can call SSL_SESSION_free in
243      * the case of an error whilst halfway through constructing dest
244      */
245 #ifndef OPENSSL_NO_PSK
246     dest->psk_identity_hint = NULL;
247     dest->psk_identity = NULL;
248 #endif
249     dest->ciphers = NULL;
250 #ifndef OPENSSL_NO_TLSEXT
251     dest->tlsext_hostname = NULL;
252 # ifndef OPENSSL_NO_EC
253     dest->tlsext_ecpointformatlist = NULL;
254     dest->tlsext_ellipticcurvelist = NULL;
255 # endif
256 #endif
257     dest->tlsext_tick = NULL;
258 #ifndef OPENSSL_NO_SRP
259     dest->srp_username = NULL;
260 #endif
261     memset(&dest->ex_data, 0, sizeof(dest->ex_data));
262
263     /* We deliberately don't copy the prev and next pointers */
264     dest->prev = NULL;
265     dest->next = NULL;
266
267     dest->references = 1;
268
269     if (src->sess_cert != NULL)
270         CRYPTO_add(&src->sess_cert->references, 1, CRYPTO_LOCK_SSL_SESS_CERT);
271
272     if (src->peer != NULL)
273         CRYPTO_add(&src->peer->references, 1, CRYPTO_LOCK_X509);
274
275 #ifndef OPENSSL_NO_PSK
276     if (src->psk_identity_hint) {
277         dest->psk_identity_hint = BUF_strdup(src->psk_identity_hint);
278         if (dest->psk_identity_hint == NULL) {
279             goto err;
280         }
281     }
282     if (src->psk_identity) {
283         dest->psk_identity = BUF_strdup(src->psk_identity);
284         if (dest->psk_identity == NULL) {
285             goto err;
286         }
287     }
288 #endif
289
290     if(src->ciphers != NULL) {
291         dest->ciphers = sk_SSL_CIPHER_dup(src->ciphers);
292         if (dest->ciphers == NULL)
293             goto err;
294     }
295
296     if (!CRYPTO_dup_ex_data(CRYPTO_EX_INDEX_SSL_SESSION,
297                                             &dest->ex_data, &src->ex_data)) {
298         goto err;
299     }
300
301 #ifndef OPENSSL_NO_TLSEXT
302     if (src->tlsext_hostname) {
303         dest->tlsext_hostname = BUF_strdup(src->tlsext_hostname);
304         if (dest->tlsext_hostname == NULL) {
305             goto err;
306         }
307     }
308 # ifndef OPENSSL_NO_EC
309     if (src->tlsext_ecpointformatlist) {
310         dest->tlsext_ecpointformatlist =
311             BUF_memdup(src->tlsext_ecpointformatlist,
312                        src->tlsext_ecpointformatlist_length);
313         if (dest->tlsext_ecpointformatlist == NULL)
314             goto err;
315     }
316     if (src->tlsext_ellipticcurvelist) {
317         dest->tlsext_ellipticcurvelist =
318             BUF_memdup(src->tlsext_ellipticcurvelist,
319                        src->tlsext_ellipticcurvelist_length);
320         if (dest->tlsext_ellipticcurvelist == NULL)
321             goto err;
322     }
323 # endif
324 #endif
325
326     if (ticket != 0) {
327         dest->tlsext_tick = BUF_memdup(src->tlsext_tick, src->tlsext_ticklen);
328         if(dest->tlsext_tick == NULL)
329             goto err;
330     } else {
331         dest->tlsext_tick_lifetime_hint = 0;
332         dest->tlsext_ticklen = 0;
333     }
334
335 #ifndef OPENSSL_NO_SRP
336     if (src->srp_username) {
337         dest->srp_username = BUF_strdup(src->srp_username);
338         if (dest->srp_username == NULL) {
339             goto err;
340         }
341     }
342 #endif
343
344     return dest;
345 err:
346     SSLerr(SSL_F_SSL_SESSION_DUP, ERR_R_MALLOC_FAILURE);
347     SSL_SESSION_free(dest);
348     return NULL;
349 }
350
351 const unsigned char *SSL_SESSION_get_id(const SSL_SESSION *s, unsigned int *len)
352         {
353         if(len)
354                 *len = s->session_id_length;
355         return s->session_id;
356         }
357
358 unsigned int SSL_SESSION_get_compress_id(const SSL_SESSION *s)
359         {
360         return s->compress_meth;
361         }
362
363 /* Even with SSLv2, we have 16 bytes (128 bits) of session ID space. SSLv3/TLSv1
364  * has 32 bytes (256 bits). As such, filling the ID with random gunk repeatedly
365  * until we have no conflict is going to complete in one iteration pretty much
366  * "most" of the time (btw: understatement). So, if it takes us 10 iterations
367  * and we still can't avoid a conflict - well that's a reasonable point to call
368  * it quits. Either the RAND code is broken or someone is trying to open roughly
369  * very close to 2^128 (or 2^256) SSL sessions to our server. How you might
370  * store that many sessions is perhaps a more interesting question ... */
371
372 #define MAX_SESS_ID_ATTEMPTS 10
373 static int def_generate_session_id(const SSL *ssl, unsigned char *id,
374                                 unsigned int *id_len)
375 {
376         unsigned int retry = 0;
377         do
378                 if (RAND_pseudo_bytes(id, *id_len) <= 0)
379                         return 0;
380         while(SSL_has_matching_session_id(ssl, id, *id_len) &&
381                 (++retry < MAX_SESS_ID_ATTEMPTS));
382         if(retry < MAX_SESS_ID_ATTEMPTS)
383                 return 1;
384         /* else - woops a session_id match */
385         /* XXX We should also check the external cache --
386          * but the probability of a collision is negligible, and
387          * we could not prevent the concurrent creation of sessions
388          * with identical IDs since we currently don't have means
389          * to atomically check whether a session ID already exists
390          * and make a reservation for it if it does not
391          * (this problem applies to the internal cache as well).
392          */
393         return 0;
394 }
395
396 int ssl_get_new_session(SSL *s, int session)
397         {
398         /* This gets used by clients and servers. */
399
400         unsigned int tmp;
401         SSL_SESSION *ss=NULL;
402         GEN_SESSION_CB cb = def_generate_session_id;
403
404         if ((ss=SSL_SESSION_new()) == NULL) return(0);
405
406         /* If the context has a default timeout, use it */
407         if (s->session_ctx->session_timeout == 0)
408                 ss->timeout=SSL_get_default_timeout(s);
409         else
410                 ss->timeout=s->session_ctx->session_timeout;
411
412         if (s->session != NULL)
413                 {
414                 SSL_SESSION_free(s->session);
415                 s->session=NULL;
416                 }
417
418         if (session)
419                 {
420                 if (s->version == SSL2_VERSION)
421                         {
422                         ss->ssl_version=SSL2_VERSION;
423                         ss->session_id_length=SSL2_SSL_SESSION_ID_LENGTH;
424                         }
425                 else if (s->version == SSL3_VERSION)
426                         {
427                         ss->ssl_version=SSL3_VERSION;
428                         ss->session_id_length=SSL3_SSL_SESSION_ID_LENGTH;
429                         }
430                 else if (s->version == TLS1_VERSION)
431                         {
432                         ss->ssl_version=TLS1_VERSION;
433                         ss->session_id_length=SSL3_SSL_SESSION_ID_LENGTH;
434                         }
435                 else if (s->version == TLS1_1_VERSION)
436                         {
437                         ss->ssl_version=TLS1_1_VERSION;
438                         ss->session_id_length=SSL3_SSL_SESSION_ID_LENGTH;
439                         }
440                 else if (s->version == TLS1_2_VERSION)
441                         {
442                         ss->ssl_version=TLS1_2_VERSION;
443                         ss->session_id_length=SSL3_SSL_SESSION_ID_LENGTH;
444                         }
445                 else if (s->version == DTLS1_BAD_VER)
446                         {
447                         ss->ssl_version=DTLS1_BAD_VER;
448                         ss->session_id_length=SSL3_SSL_SESSION_ID_LENGTH;
449                         }
450                 else if (s->version == DTLS1_VERSION)
451                         {
452                         ss->ssl_version=DTLS1_VERSION;
453                         ss->session_id_length=SSL3_SSL_SESSION_ID_LENGTH;
454                         }
455                 else
456                         {
457                         SSLerr(SSL_F_SSL_GET_NEW_SESSION,SSL_R_UNSUPPORTED_SSL_VERSION);
458                         SSL_SESSION_free(ss);
459                         return(0);
460                         }
461 #ifndef OPENSSL_NO_TLSEXT
462                 /*
463                  * If RFC5077 ticket, use empty session ID (as server).
464                  * Note that:
465                  * (a) ssl_get_prev_session() does lookahead into the
466                  *     ClientHello extensions to find the session ticket.
467                  *     When ssl_get_prev_session() fails, s3_srvr.c calls
468                  *     ssl_get_new_session() in ssl3_get_client_hello().
469                  *     At that point, it has not yet parsed the extensions,
470                  *     however, because of the lookahead, it already knows
471                  *     whether a ticket is expected or not.
472                  *
473                  * (b) s3_clnt.c calls ssl_get_new_session() before parsing
474                  *     ServerHello extensions, and before recording the session
475                  *     ID received from the server, so this block is a noop.
476                  */
477                 if (s->tlsext_ticket_expected)
478                         {
479                         ss->session_id_length = 0;
480                         goto sess_id_done;
481                         }
482 #endif
483                 /* Choose which callback will set the session ID */
484                 CRYPTO_r_lock(CRYPTO_LOCK_SSL_CTX);
485                 if(s->generate_session_id)
486                         cb = s->generate_session_id;
487                 else if(s->session_ctx->generate_session_id)
488                         cb = s->session_ctx->generate_session_id;
489                 CRYPTO_r_unlock(CRYPTO_LOCK_SSL_CTX);
490                 /* Choose a session ID */
491                 tmp = ss->session_id_length;
492                 if(!cb(s, ss->session_id, &tmp))
493                         {
494                         /* The callback failed */
495                         SSLerr(SSL_F_SSL_GET_NEW_SESSION,
496                                 SSL_R_SSL_SESSION_ID_CALLBACK_FAILED);
497                         SSL_SESSION_free(ss);
498                         return(0);
499                         }
500                 /* Don't allow the callback to set the session length to zero.
501                  * nor set it higher than it was. */
502                 if(!tmp || (tmp > ss->session_id_length))
503                         {
504                         /* The callback set an illegal length */
505                         SSLerr(SSL_F_SSL_GET_NEW_SESSION,
506                                 SSL_R_SSL_SESSION_ID_HAS_BAD_LENGTH);
507                         SSL_SESSION_free(ss);
508                         return(0);
509                         }
510                 /* If the session length was shrunk and we're SSLv2, pad it */
511                 if((tmp < ss->session_id_length) && (s->version == SSL2_VERSION))
512                         memset(ss->session_id + tmp, 0, ss->session_id_length - tmp);
513                 else
514                         ss->session_id_length = tmp;
515                 /* Finally, check for a conflict */
516                 if(SSL_has_matching_session_id(s, ss->session_id,
517                                                 ss->session_id_length))
518                         {
519                         SSLerr(SSL_F_SSL_GET_NEW_SESSION,
520                                 SSL_R_SSL_SESSION_ID_CONFLICT);
521                         SSL_SESSION_free(ss);
522                         return(0);
523                         }
524 #ifndef OPENSSL_NO_TLSEXT
525                 sess_id_done:
526                 if (s->tlsext_hostname) {
527                         ss->tlsext_hostname = BUF_strdup(s->tlsext_hostname);
528                         if (ss->tlsext_hostname == NULL) {
529                                 SSLerr(SSL_F_SSL_GET_NEW_SESSION, ERR_R_INTERNAL_ERROR);
530                                 SSL_SESSION_free(ss);
531                                 return 0;
532                                 }
533                         }
534 #ifndef OPENSSL_NO_EC
535                 if (s->tlsext_ecpointformatlist)
536                         {
537                         if (ss->tlsext_ecpointformatlist != NULL) OPENSSL_free(ss->tlsext_ecpointformatlist);
538                         if ((ss->tlsext_ecpointformatlist = OPENSSL_malloc(s->tlsext_ecpointformatlist_length)) == NULL)
539                                 {
540                                 SSLerr(SSL_F_SSL_GET_NEW_SESSION, ERR_R_MALLOC_FAILURE);
541                                 SSL_SESSION_free(ss);
542                                 return 0;
543                                 }
544                         ss->tlsext_ecpointformatlist_length = s->tlsext_ecpointformatlist_length;
545                         memcpy(ss->tlsext_ecpointformatlist, s->tlsext_ecpointformatlist, s->tlsext_ecpointformatlist_length);
546                         }
547                 if (s->tlsext_ellipticcurvelist)
548                         {
549                         if (ss->tlsext_ellipticcurvelist != NULL) OPENSSL_free(ss->tlsext_ellipticcurvelist);
550                         if ((ss->tlsext_ellipticcurvelist = OPENSSL_malloc(s->tlsext_ellipticcurvelist_length)) == NULL)
551                                 {
552                                 SSLerr(SSL_F_SSL_GET_NEW_SESSION, ERR_R_MALLOC_FAILURE);
553                                 SSL_SESSION_free(ss);
554                                 return 0;
555                                 }
556                         ss->tlsext_ellipticcurvelist_length = s->tlsext_ellipticcurvelist_length;
557                         memcpy(ss->tlsext_ellipticcurvelist, s->tlsext_ellipticcurvelist, s->tlsext_ellipticcurvelist_length);
558                         }
559 #endif
560 #endif
561                 }
562         else
563                 {
564                 ss->session_id_length=0;
565                 }
566
567         if (s->sid_ctx_length > sizeof ss->sid_ctx)
568                 {
569                 SSLerr(SSL_F_SSL_GET_NEW_SESSION, ERR_R_INTERNAL_ERROR);
570                 SSL_SESSION_free(ss);
571                 return 0;
572                 }
573         memcpy(ss->sid_ctx,s->sid_ctx,s->sid_ctx_length);
574         ss->sid_ctx_length=s->sid_ctx_length;
575         s->session=ss;
576         ss->ssl_version=s->version;
577         ss->verify_result = X509_V_OK;
578
579         return(1);
580         }
581
582 /* ssl_get_prev attempts to find an SSL_SESSION to be used to resume this
583  * connection. It is only called by servers.
584  *
585  *   session_id: points at the session ID in the ClientHello. This code will
586  *       read past the end of this in order to parse out the session ticket
587  *       extension, if any.
588  *   len: the length of the session ID.
589  *   limit: a pointer to the first byte after the ClientHello.
590  *
591  * Returns:
592  *   -1: error
593  *    0: a session may have been found.
594  *
595  * Side effects:
596  *   - If a session is found then s->session is pointed at it (after freeing an
597  *     existing session if need be) and s->verify_result is set from the session.
598  *   - Both for new and resumed sessions, s->tlsext_ticket_expected is set to 1
599  *     if the server should issue a new session ticket (to 0 otherwise).
600  */
601 int ssl_get_prev_session(SSL *s, unsigned char *session_id, int len,
602                         const unsigned char *limit)
603         {
604         /* This is used only by servers. */
605
606         SSL_SESSION *ret=NULL;
607         int fatal = 0;
608         int try_session_cache = 1;
609 #ifndef OPENSSL_NO_TLSEXT
610         int r;
611 #endif
612
613         if (len > SSL_MAX_SSL_SESSION_ID_LENGTH)
614                 goto err;
615
616         if (len == 0)
617                 try_session_cache = 0;
618
619 #ifndef OPENSSL_NO_TLSEXT
620         r = tls1_process_ticket(s, session_id, len, limit, &ret); /* sets s->tlsext_ticket_expected */
621         switch (r)
622                 {
623         case -1: /* Error during processing */
624                 fatal = 1;
625                 goto err;
626         case 0: /* No ticket found */
627         case 1: /* Zero length ticket found */
628                 break; /* Ok to carry on processing session id. */
629         case 2: /* Ticket found but not decrypted. */
630         case 3: /* Ticket decrypted, *ret has been set. */
631                 try_session_cache = 0;
632                 break;
633         default:
634                 abort();
635                 }
636 #endif
637
638         if (try_session_cache &&
639             ret == NULL &&
640             !(s->session_ctx->session_cache_mode & SSL_SESS_CACHE_NO_INTERNAL_LOOKUP))
641                 {
642                 SSL_SESSION data;
643                 data.ssl_version=s->version;
644                 data.session_id_length=len;
645                 if (len == 0)
646                         return 0;
647                 memcpy(data.session_id,session_id,len);
648                 CRYPTO_r_lock(CRYPTO_LOCK_SSL_CTX);
649                 ret=lh_SSL_SESSION_retrieve(s->session_ctx->sessions,&data);
650                 if (ret != NULL)
651                         {
652                         /* don't allow other threads to steal it: */
653                         CRYPTO_add(&ret->references,1,CRYPTO_LOCK_SSL_SESSION);
654                         }
655                 CRYPTO_r_unlock(CRYPTO_LOCK_SSL_CTX);
656                 if (ret == NULL)
657                         s->session_ctx->stats.sess_miss++;
658                 }
659
660         if (try_session_cache &&
661             ret == NULL &&
662             s->session_ctx->get_session_cb != NULL)
663                 {
664                 int copy=1;
665         
666                 if ((ret=s->session_ctx->get_session_cb(s,session_id,len,&copy)))
667                         {
668                         s->session_ctx->stats.sess_cb_hit++;
669
670                         /* Increment reference count now if the session callback
671                          * asks us to do so (note that if the session structures
672                          * returned by the callback are shared between threads,
673                          * it must handle the reference count itself [i.e. copy == 0],
674                          * or things won't be thread-safe). */
675                         if (copy)
676                                 CRYPTO_add(&ret->references,1,CRYPTO_LOCK_SSL_SESSION);
677
678                         /* Add the externally cached session to the internal
679                          * cache as well if and only if we are supposed to. */
680                         if(!(s->session_ctx->session_cache_mode & SSL_SESS_CACHE_NO_INTERNAL_STORE))
681                                 /* The following should not return 1, otherwise,
682                                  * things are very strange */
683                                 SSL_CTX_add_session(s->session_ctx,ret);
684                         }
685                 }
686
687         if (ret == NULL)
688                 goto err;
689
690         /* Now ret is non-NULL and we own one of its reference counts. */
691
692         if (ret->sid_ctx_length != s->sid_ctx_length
693             || memcmp(ret->sid_ctx,s->sid_ctx,ret->sid_ctx_length))
694                 {
695                 /* We have the session requested by the client, but we don't
696                  * want to use it in this context. */
697                 goto err; /* treat like cache miss */
698                 }
699         
700         if((s->verify_mode & SSL_VERIFY_PEER) && s->sid_ctx_length == 0)
701                 {
702                 /* We can't be sure if this session is being used out of
703                  * context, which is especially important for SSL_VERIFY_PEER.
704                  * The application should have used SSL[_CTX]_set_session_id_context.
705                  *
706                  * For this error case, we generate an error instead of treating
707                  * the event like a cache miss (otherwise it would be easy for
708                  * applications to effectively disable the session cache by
709                  * accident without anyone noticing).
710                  */
711                 
712                 SSLerr(SSL_F_SSL_GET_PREV_SESSION,SSL_R_SESSION_ID_CONTEXT_UNINITIALIZED);
713                 fatal = 1;
714                 goto err;
715                 }
716
717         if (ret->cipher == NULL)
718                 {
719                 unsigned char buf[5],*p;
720                 unsigned long l;
721
722                 p=buf;
723                 l=ret->cipher_id;
724                 l2n(l,p);
725                 if ((ret->ssl_version>>8) >= SSL3_VERSION_MAJOR)
726                         ret->cipher=ssl_get_cipher_by_char(s,&(buf[2]));
727                 else 
728                         ret->cipher=ssl_get_cipher_by_char(s,&(buf[1]));
729                 if (ret->cipher == NULL)
730                         goto err;
731                 }
732
733         if (ret->timeout < (long)(time(NULL) - ret->time)) /* timeout */
734                 {
735                 s->session_ctx->stats.sess_timeout++;
736                 if (try_session_cache)
737                         {
738                         /* session was from the cache, so remove it */
739                         SSL_CTX_remove_session(s->session_ctx,ret);
740                         }
741                 goto err;
742                 }
743
744         s->session_ctx->stats.sess_hit++;
745
746         if (s->session != NULL)
747                 SSL_SESSION_free(s->session);
748         s->session=ret;
749         s->verify_result = s->session->verify_result;
750         return 1;
751
752  err:
753         if (ret != NULL)
754                 {
755                 SSL_SESSION_free(ret);
756 #ifndef OPENSSL_NO_TLSEXT
757                 if (!try_session_cache)
758                         {
759                         /* The session was from a ticket, so we should
760                          * issue a ticket for the new session */
761                         s->tlsext_ticket_expected = 1;
762                         }
763 #endif
764                 }
765         if (fatal)
766                 return -1;
767         else
768                 return 0;
769         }
770
771 int SSL_CTX_add_session(SSL_CTX *ctx, SSL_SESSION *c)
772         {
773         int ret=0;
774         SSL_SESSION *s;
775
776         /* add just 1 reference count for the SSL_CTX's session cache
777          * even though it has two ways of access: each session is in a
778          * doubly linked list and an lhash */
779         CRYPTO_add(&c->references,1,CRYPTO_LOCK_SSL_SESSION);
780         /* if session c is in already in cache, we take back the increment later */
781
782         CRYPTO_w_lock(CRYPTO_LOCK_SSL_CTX);
783         s=lh_SSL_SESSION_insert(ctx->sessions,c);
784         
785         /* s != NULL iff we already had a session with the given PID.
786          * In this case, s == c should hold (then we did not really modify
787          * ctx->sessions), or we're in trouble. */
788         if (s != NULL && s != c)
789                 {
790                 /* We *are* in trouble ... */
791                 SSL_SESSION_list_remove(ctx,s);
792                 SSL_SESSION_free(s);
793                 /* ... so pretend the other session did not exist in cache
794                  * (we cannot handle two SSL_SESSION structures with identical
795                  * session ID in the same cache, which could happen e.g. when
796                  * two threads concurrently obtain the same session from an external
797                  * cache) */
798                 s = NULL;
799                 }
800
801         /* Put at the head of the queue unless it is already in the cache */
802         if (s == NULL)
803                 SSL_SESSION_list_add(ctx,c);
804
805         if (s != NULL)
806                 {
807                 /* existing cache entry -- decrement previously incremented reference
808                  * count because it already takes into account the cache */
809
810                 SSL_SESSION_free(s); /* s == c */
811                 ret=0;
812                 }
813         else
814                 {
815                 /* new cache entry -- remove old ones if cache has become too large */
816                 
817                 ret=1;
818
819                 if (SSL_CTX_sess_get_cache_size(ctx) > 0)
820                         {
821                         while (SSL_CTX_sess_number(ctx) >
822                                 SSL_CTX_sess_get_cache_size(ctx))
823                                 {
824                                 if (!remove_session_lock(ctx,
825                                         ctx->session_cache_tail, 0))
826                                         break;
827                                 else
828                                         ctx->stats.sess_cache_full++;
829                                 }
830                         }
831                 }
832         CRYPTO_w_unlock(CRYPTO_LOCK_SSL_CTX);
833         return(ret);
834         }
835
836 int SSL_CTX_remove_session(SSL_CTX *ctx, SSL_SESSION *c)
837 {
838         return remove_session_lock(ctx, c, 1);
839 }
840
841 static int remove_session_lock(SSL_CTX *ctx, SSL_SESSION *c, int lck)
842         {
843         SSL_SESSION *r;
844         int ret=0;
845
846         if ((c != NULL) && (c->session_id_length != 0))
847                 {
848                 if(lck) CRYPTO_w_lock(CRYPTO_LOCK_SSL_CTX);
849                 if ((r = lh_SSL_SESSION_retrieve(ctx->sessions,c)) == c)
850                         {
851                         ret=1;
852                         r=lh_SSL_SESSION_delete(ctx->sessions,c);
853                         SSL_SESSION_list_remove(ctx,c);
854                         }
855
856                 if(lck) CRYPTO_w_unlock(CRYPTO_LOCK_SSL_CTX);
857
858                 if (ret)
859                         {
860                         r->not_resumable=1;
861                         if (ctx->remove_session_cb != NULL)
862                                 ctx->remove_session_cb(ctx,r);
863                         SSL_SESSION_free(r);
864                         }
865                 }
866         else
867                 ret=0;
868         return(ret);
869         }
870
871 void SSL_SESSION_free(SSL_SESSION *ss)
872         {
873         int i;
874
875         if(ss == NULL)
876             return;
877
878         i=CRYPTO_add(&ss->references,-1,CRYPTO_LOCK_SSL_SESSION);
879 #ifdef REF_PRINT
880         REF_PRINT("SSL_SESSION",ss);
881 #endif
882         if (i > 0) return;
883 #ifdef REF_CHECK
884         if (i < 0)
885                 {
886                 fprintf(stderr,"SSL_SESSION_free, bad reference count\n");
887                 abort(); /* ok */
888                 }
889 #endif
890
891         CRYPTO_free_ex_data(CRYPTO_EX_INDEX_SSL_SESSION, ss, &ss->ex_data);
892
893         OPENSSL_cleanse(ss->key_arg,sizeof ss->key_arg);
894         OPENSSL_cleanse(ss->master_key,sizeof ss->master_key);
895         OPENSSL_cleanse(ss->session_id,sizeof ss->session_id);
896         if (ss->sess_cert != NULL) ssl_sess_cert_free(ss->sess_cert);
897         if (ss->peer != NULL) X509_free(ss->peer);
898         if (ss->ciphers != NULL) sk_SSL_CIPHER_free(ss->ciphers);
899 #ifndef OPENSSL_NO_TLSEXT
900         if (ss->tlsext_hostname != NULL) OPENSSL_free(ss->tlsext_hostname);
901         if (ss->tlsext_tick != NULL) OPENSSL_free(ss->tlsext_tick);
902 #ifndef OPENSSL_NO_EC
903         ss->tlsext_ecpointformatlist_length = 0;
904         if (ss->tlsext_ecpointformatlist != NULL) OPENSSL_free(ss->tlsext_ecpointformatlist);
905         ss->tlsext_ellipticcurvelist_length = 0;
906         if (ss->tlsext_ellipticcurvelist != NULL) OPENSSL_free(ss->tlsext_ellipticcurvelist);
907 #endif /* OPENSSL_NO_EC */
908 #endif
909 #ifndef OPENSSL_NO_PSK
910         if (ss->psk_identity_hint != NULL)
911                 OPENSSL_free(ss->psk_identity_hint);
912         if (ss->psk_identity != NULL)
913                 OPENSSL_free(ss->psk_identity);
914 #endif
915 #ifndef OPENSSL_NO_SRP
916         if (ss->srp_username != NULL)
917                 OPENSSL_free(ss->srp_username);
918 #endif
919         OPENSSL_cleanse(ss,sizeof(*ss));
920         OPENSSL_free(ss);
921         }
922
923 int SSL_set_session(SSL *s, SSL_SESSION *session)
924         {
925         int ret=0;
926         const SSL_METHOD *meth;
927
928         if (session != NULL)
929                 {
930                 meth=s->ctx->method->get_ssl_method(session->ssl_version);
931                 if (meth == NULL)
932                         meth=s->method->get_ssl_method(session->ssl_version);
933                 if (meth == NULL)
934                         {
935                         SSLerr(SSL_F_SSL_SET_SESSION,SSL_R_UNABLE_TO_FIND_SSL_METHOD);
936                         return(0);
937                         }
938
939                 if (meth != s->method)
940                         {
941                         if (!SSL_set_ssl_method(s,meth))
942                                 return(0);
943                         }
944
945 #ifndef OPENSSL_NO_KRB5
946                 if (s->kssl_ctx && !s->kssl_ctx->client_princ &&
947                     session->krb5_client_princ_len > 0)
948                 {
949                     s->kssl_ctx->client_princ = (char *)OPENSSL_malloc(session->krb5_client_princ_len + 1);
950                     memcpy(s->kssl_ctx->client_princ,session->krb5_client_princ,
951                             session->krb5_client_princ_len);
952                     s->kssl_ctx->client_princ[session->krb5_client_princ_len] = '\0';
953                 }
954 #endif /* OPENSSL_NO_KRB5 */
955
956                 /* CRYPTO_w_lock(CRYPTO_LOCK_SSL);*/
957                 CRYPTO_add(&session->references,1,CRYPTO_LOCK_SSL_SESSION);
958                 if (s->session != NULL)
959                         SSL_SESSION_free(s->session);
960                 s->session=session;
961                 s->verify_result = s->session->verify_result;
962                 /* CRYPTO_w_unlock(CRYPTO_LOCK_SSL);*/
963                 ret=1;
964                 }
965         else
966                 {
967                 if (s->session != NULL)
968                         {
969                         SSL_SESSION_free(s->session);
970                         s->session=NULL;
971                         }
972
973                 meth=s->ctx->method;
974                 if (meth != s->method)
975                         {
976                         if (!SSL_set_ssl_method(s,meth))
977                                 return(0);
978                         }
979                 ret=1;
980                 }
981         return(ret);
982         }
983
984 long SSL_SESSION_set_timeout(SSL_SESSION *s, long t)
985         {
986         if (s == NULL) return(0);
987         s->timeout=t;
988         return(1);
989         }
990
991 long SSL_SESSION_get_timeout(const SSL_SESSION *s)
992         {
993         if (s == NULL) return(0);
994         return(s->timeout);
995         }
996
997 long SSL_SESSION_get_time(const SSL_SESSION *s)
998         {
999         if (s == NULL) return(0);
1000         return(s->time);
1001         }
1002
1003 long SSL_SESSION_set_time(SSL_SESSION *s, long t)
1004         {
1005         if (s == NULL) return(0);
1006         s->time=t;
1007         return(t);
1008         }
1009
1010 X509 *SSL_SESSION_get0_peer(SSL_SESSION *s)
1011         {
1012         return s->peer;
1013         }
1014
1015 int SSL_SESSION_set1_id_context(SSL_SESSION *s,const unsigned char *sid_ctx,
1016                                unsigned int sid_ctx_len)
1017         {
1018         if(sid_ctx_len > SSL_MAX_SID_CTX_LENGTH)
1019                 {
1020                 SSLerr(SSL_F_SSL_SESSION_SET1_ID_CONTEXT,SSL_R_SSL_SESSION_ID_CONTEXT_TOO_LONG);
1021                 return 0;
1022                 }
1023         s->sid_ctx_length=sid_ctx_len;
1024         memcpy(s->sid_ctx,sid_ctx,sid_ctx_len);
1025
1026         return 1;
1027         }
1028
1029 long SSL_CTX_set_timeout(SSL_CTX *s, long t)
1030         {
1031         long l;
1032         if (s == NULL) return(0);
1033         l=s->session_timeout;
1034         s->session_timeout=t;
1035         return(l);
1036         }
1037
1038 long SSL_CTX_get_timeout(const SSL_CTX *s)
1039         {
1040         if (s == NULL) return(0);
1041         return(s->session_timeout);
1042         }
1043
1044 #ifndef OPENSSL_NO_TLSEXT
1045 int SSL_set_session_secret_cb(SSL *s, int (*tls_session_secret_cb)(SSL *s, void *secret, int *secret_len,
1046         STACK_OF(SSL_CIPHER) *peer_ciphers, SSL_CIPHER **cipher, void *arg), void *arg)
1047         {
1048         if (s == NULL) return(0);
1049         s->tls_session_secret_cb = tls_session_secret_cb;
1050         s->tls_session_secret_cb_arg = arg;
1051         return(1);
1052         }
1053
1054 int SSL_set_session_ticket_ext_cb(SSL *s, tls_session_ticket_ext_cb_fn cb,
1055                                   void *arg)
1056         {
1057         if (s == NULL) return(0);
1058         s->tls_session_ticket_ext_cb = cb;
1059         s->tls_session_ticket_ext_cb_arg = arg;
1060         return(1);
1061         }
1062
1063 int SSL_set_session_ticket_ext(SSL *s, void *ext_data, int ext_len)
1064         {
1065         if (s->version >= TLS1_VERSION)
1066                 {
1067                 if (s->tlsext_session_ticket)
1068                         {
1069                         OPENSSL_free(s->tlsext_session_ticket);
1070                         s->tlsext_session_ticket = NULL;
1071                         }
1072
1073                 s->tlsext_session_ticket = OPENSSL_malloc(sizeof(TLS_SESSION_TICKET_EXT) + ext_len);
1074                 if (!s->tlsext_session_ticket)
1075                         {
1076                         SSLerr(SSL_F_SSL_SET_SESSION_TICKET_EXT, ERR_R_MALLOC_FAILURE);
1077                         return 0;
1078                         }
1079
1080                 if (ext_data)
1081                         {
1082                         s->tlsext_session_ticket->length = ext_len;
1083                         s->tlsext_session_ticket->data = s->tlsext_session_ticket + 1;
1084                         memcpy(s->tlsext_session_ticket->data, ext_data, ext_len);
1085                         }
1086                 else
1087                         {
1088                         s->tlsext_session_ticket->length = 0;
1089                         s->tlsext_session_ticket->data = NULL;
1090                         }
1091
1092                 return 1;
1093                 }
1094
1095         return 0;
1096         }
1097 #endif /* OPENSSL_NO_TLSEXT */
1098
1099 typedef struct timeout_param_st
1100         {
1101         SSL_CTX *ctx;
1102         long time;
1103         LHASH_OF(SSL_SESSION) *cache;
1104         } TIMEOUT_PARAM;
1105
1106 static void timeout_doall_arg(SSL_SESSION *s, TIMEOUT_PARAM *p)
1107         {
1108         if ((p->time == 0) || (p->time > (s->time+s->timeout))) /* timeout */
1109                 {
1110                 /* The reason we don't call SSL_CTX_remove_session() is to
1111                  * save on locking overhead */
1112                 (void)lh_SSL_SESSION_delete(p->cache,s);
1113                 SSL_SESSION_list_remove(p->ctx,s);
1114                 s->not_resumable=1;
1115                 if (p->ctx->remove_session_cb != NULL)
1116                         p->ctx->remove_session_cb(p->ctx,s);
1117                 SSL_SESSION_free(s);
1118                 }
1119         }
1120
1121 static IMPLEMENT_LHASH_DOALL_ARG_FN(timeout, SSL_SESSION, TIMEOUT_PARAM)
1122
1123 void SSL_CTX_flush_sessions(SSL_CTX *s, long t)
1124         {
1125         unsigned long i;
1126         TIMEOUT_PARAM tp;
1127
1128         tp.ctx=s;
1129         tp.cache=s->sessions;
1130         if (tp.cache == NULL) return;
1131         tp.time=t;
1132         CRYPTO_w_lock(CRYPTO_LOCK_SSL_CTX);
1133         i=CHECKED_LHASH_OF(SSL_SESSION, tp.cache)->down_load;
1134         CHECKED_LHASH_OF(SSL_SESSION, tp.cache)->down_load=0;
1135         lh_SSL_SESSION_doall_arg(tp.cache, LHASH_DOALL_ARG_FN(timeout),
1136                                  TIMEOUT_PARAM, &tp);
1137         CHECKED_LHASH_OF(SSL_SESSION, tp.cache)->down_load=i;
1138         CRYPTO_w_unlock(CRYPTO_LOCK_SSL_CTX);
1139         }
1140
1141 int ssl_clear_bad_session(SSL *s)
1142         {
1143         if (    (s->session != NULL) &&
1144                 !(s->shutdown & SSL_SENT_SHUTDOWN) &&
1145                 !(SSL_in_init(s) || SSL_in_before(s)))
1146                 {
1147                 SSL_CTX_remove_session(s->ctx,s->session);
1148                 return(1);
1149                 }
1150         else
1151                 return(0);
1152         }
1153
1154 /* locked by SSL_CTX in the calling function */
1155 static void SSL_SESSION_list_remove(SSL_CTX *ctx, SSL_SESSION *s)
1156         {
1157         if ((s->next == NULL) || (s->prev == NULL)) return;
1158
1159         if (s->next == (SSL_SESSION *)&(ctx->session_cache_tail))
1160                 { /* last element in list */
1161                 if (s->prev == (SSL_SESSION *)&(ctx->session_cache_head))
1162                         { /* only one element in list */
1163                         ctx->session_cache_head=NULL;
1164                         ctx->session_cache_tail=NULL;
1165                         }
1166                 else
1167                         {
1168                         ctx->session_cache_tail=s->prev;
1169                         s->prev->next=(SSL_SESSION *)&(ctx->session_cache_tail);
1170                         }
1171                 }
1172         else
1173                 {
1174                 if (s->prev == (SSL_SESSION *)&(ctx->session_cache_head))
1175                         { /* first element in list */
1176                         ctx->session_cache_head=s->next;
1177                         s->next->prev=(SSL_SESSION *)&(ctx->session_cache_head);
1178                         }
1179                 else
1180                         { /* middle of list */
1181                         s->next->prev=s->prev;
1182                         s->prev->next=s->next;
1183                         }
1184                 }
1185         s->prev=s->next=NULL;
1186         }
1187
1188 static void SSL_SESSION_list_add(SSL_CTX *ctx, SSL_SESSION *s)
1189         {
1190         if ((s->next != NULL) && (s->prev != NULL))
1191                 SSL_SESSION_list_remove(ctx,s);
1192
1193         if (ctx->session_cache_head == NULL)
1194                 {
1195                 ctx->session_cache_head=s;
1196                 ctx->session_cache_tail=s;
1197                 s->prev=(SSL_SESSION *)&(ctx->session_cache_head);
1198                 s->next=(SSL_SESSION *)&(ctx->session_cache_tail);
1199                 }
1200         else
1201                 {
1202                 s->next=ctx->session_cache_head;
1203                 s->next->prev=s;
1204                 s->prev=(SSL_SESSION *)&(ctx->session_cache_head);
1205                 ctx->session_cache_head=s;
1206                 }
1207         }
1208
1209 void SSL_CTX_sess_set_new_cb(SSL_CTX *ctx,
1210         int (*cb)(struct ssl_st *ssl,SSL_SESSION *sess))
1211         {
1212         ctx->new_session_cb=cb;
1213         }
1214
1215 int (*SSL_CTX_sess_get_new_cb(SSL_CTX *ctx))(SSL *ssl, SSL_SESSION *sess)
1216         {
1217         return ctx->new_session_cb;
1218         }
1219
1220 void SSL_CTX_sess_set_remove_cb(SSL_CTX *ctx,
1221         void (*cb)(SSL_CTX *ctx,SSL_SESSION *sess))
1222         {
1223         ctx->remove_session_cb=cb;
1224         }
1225
1226 void (*SSL_CTX_sess_get_remove_cb(SSL_CTX *ctx))(SSL_CTX * ctx,SSL_SESSION *sess)
1227         {
1228         return ctx->remove_session_cb;
1229         }
1230
1231 void SSL_CTX_sess_set_get_cb(SSL_CTX *ctx,
1232         SSL_SESSION *(*cb)(struct ssl_st *ssl,
1233                  unsigned char *data,int len,int *copy))
1234         {
1235         ctx->get_session_cb=cb;
1236         }
1237
1238 SSL_SESSION * (*SSL_CTX_sess_get_get_cb(SSL_CTX *ctx))(SSL *ssl,
1239                  unsigned char *data,int len,int *copy)
1240         {
1241         return ctx->get_session_cb;
1242         }
1243
1244 void SSL_CTX_set_info_callback(SSL_CTX *ctx, 
1245         void (*cb)(const SSL *ssl,int type,int val))
1246         {
1247         ctx->info_callback=cb;
1248         }
1249
1250 void (*SSL_CTX_get_info_callback(SSL_CTX *ctx))(const SSL *ssl,int type,int val)
1251         {
1252         return ctx->info_callback;
1253         }
1254
1255 void SSL_CTX_set_client_cert_cb(SSL_CTX *ctx,
1256         int (*cb)(SSL *ssl, X509 **x509, EVP_PKEY **pkey))
1257         {
1258         ctx->client_cert_cb=cb;
1259         }
1260
1261 int (*SSL_CTX_get_client_cert_cb(SSL_CTX *ctx))(SSL * ssl, X509 ** x509 , EVP_PKEY **pkey)
1262         {
1263         return ctx->client_cert_cb;
1264         }
1265
1266 #ifndef OPENSSL_NO_ENGINE
1267 int SSL_CTX_set_client_cert_engine(SSL_CTX *ctx, ENGINE *e)
1268         {
1269         if (!ENGINE_init(e))
1270                 {
1271                 SSLerr(SSL_F_SSL_CTX_SET_CLIENT_CERT_ENGINE, ERR_R_ENGINE_LIB);
1272                 return 0;
1273                 }
1274         if(!ENGINE_get_ssl_client_cert_function(e))
1275                 {
1276                 SSLerr(SSL_F_SSL_CTX_SET_CLIENT_CERT_ENGINE, SSL_R_NO_CLIENT_CERT_METHOD);
1277                 ENGINE_finish(e);
1278                 return 0;
1279                 }
1280         ctx->client_cert_engine = e;
1281         return 1;
1282         }
1283 #endif
1284
1285 void SSL_CTX_set_cookie_generate_cb(SSL_CTX *ctx,
1286         int (*cb)(SSL *ssl, unsigned char *cookie, unsigned int *cookie_len))
1287         {
1288         ctx->app_gen_cookie_cb=cb;
1289         }
1290
1291 void SSL_CTX_set_cookie_verify_cb(SSL_CTX *ctx,
1292         int (*cb)(SSL *ssl, unsigned char *cookie, unsigned int cookie_len))
1293         {
1294         ctx->app_verify_cookie_cb=cb;
1295         }
1296
1297 IMPLEMENT_PEM_rw(SSL_SESSION, SSL_SESSION, PEM_STRING_SSL_SESSION, SSL_SESSION)