Home | History | Annotate | Line # | Download | only in ssl
      1 /*
      2  * Copyright 1995-2026 The OpenSSL Project Authors. All Rights Reserved.
      3  * Copyright 2005 Nokia. All rights reserved.
      4  *
      5  * Licensed under the Apache License 2.0 (the "License").  You may not use
      6  * this file except in compliance with the License.  You can obtain a copy
      7  * in the file LICENSE in the source distribution or at
      8  * https://www.openssl.org/source/license.html
      9  */
     10 
     11 #if defined(__TANDEM) && defined(_SPT_MODEL_)
     12 #include <spthread.h>
     13 #include <spt_extensions.h> /* timeval */
     14 #endif
     15 #include <stdio.h>
     16 #include <openssl/rand.h>
     17 #include <openssl/engine.h>
     18 #include "internal/refcount.h"
     19 #include "internal/cryptlib.h"
     20 #include "internal/ssl_unwrap.h"
     21 #include "ssl_local.h"
     22 #include "statem/statem_local.h"
     23 
     24 static void SSL_SESSION_list_remove(SSL_CTX *ctx, SSL_SESSION *s);
     25 static void SSL_SESSION_list_add(SSL_CTX *ctx, SSL_SESSION *s);
     26 static int remove_session_lock(SSL_CTX *ctx, SSL_SESSION *c, int lck);
     27 
     28 DEFINE_STACK_OF(SSL_SESSION)
     29 
     30 __owur static ossl_inline int sess_timedout(OSSL_TIME t, SSL_SESSION *ss)
     31 {
     32     return ossl_time_compare(t, ss->calc_timeout) > 0;
     33 }
     34 
     35 /*
     36  * Returns -1/0/+1 as other XXXcmp-type functions
     37  * Takes calculated timeout into consideration
     38  */
     39 __owur static ossl_inline int timeoutcmp(SSL_SESSION *a, SSL_SESSION *b)
     40 {
     41     return ossl_time_compare(a->calc_timeout, b->calc_timeout);
     42 }
     43 
     44 /*
     45  * Calculates effective timeout
     46  * Locking must be done by the caller of this function
     47  */
     48 void ssl_session_calculate_timeout(SSL_SESSION *ss)
     49 {
     50     ss->calc_timeout = ossl_time_add(ss->time, ss->timeout);
     51 }
     52 
     53 /*
     54  * SSL_get_session() and SSL_get1_session() are problematic in TLS1.3 because,
     55  * unlike in earlier protocol versions, the session ticket may not have been
     56  * sent yet even though a handshake has finished. The session ticket data could
     57  * come in sometime later...or even change if multiple session ticket messages
     58  * are sent from the server. The preferred way for applications to obtain
     59  * a resumable session is to use SSL_CTX_sess_set_new_cb().
     60  */
     61 
     62 SSL_SESSION *SSL_get_session(const SSL *ssl)
     63 /* aka SSL_get0_session; gets 0 objects, just returns a copy of the pointer */
     64 {
     65     const SSL_CONNECTION *sc = SSL_CONNECTION_FROM_SSL(ssl);
     66 
     67     if (sc == NULL)
     68         return NULL;
     69 
     70     return sc->session;
     71 }
     72 
     73 SSL_SESSION *SSL_get1_session(SSL *ssl)
     74 /* variant of SSL_get_session: caller really gets something */
     75 {
     76     SSL_SESSION *sess;
     77 
     78     /*
     79      * Need to lock this all up rather than just use CRYPTO_add so that
     80      * somebody doesn't free ssl->session between when we check it's non-null
     81      * and when we up the reference count.
     82      */
     83     if (!CRYPTO_THREAD_read_lock(ssl->lock))
     84         return NULL;
     85     sess = SSL_get_session(ssl);
     86     if (sess != NULL && !SSL_SESSION_up_ref(sess))
     87         sess = NULL;
     88     CRYPTO_THREAD_unlock(ssl->lock);
     89     return sess;
     90 }
     91 
     92 int SSL_SESSION_set_ex_data(SSL_SESSION *s, int idx, void *arg)
     93 {
     94     return CRYPTO_set_ex_data(&s->ex_data, idx, arg);
     95 }
     96 
     97 void *SSL_SESSION_get_ex_data(const SSL_SESSION *s, int idx)
     98 {
     99     return CRYPTO_get_ex_data(&s->ex_data, idx);
    100 }
    101 
    102 SSL_SESSION *SSL_SESSION_new(void)
    103 {
    104     SSL_SESSION *ss;
    105 
    106     if (!OPENSSL_init_ssl(OPENSSL_INIT_LOAD_SSL_STRINGS, NULL))
    107         return NULL;
    108 
    109     ss = OPENSSL_zalloc(sizeof(*ss));
    110     if (ss == NULL)
    111         return NULL;
    112 
    113     ss->ext.max_fragment_len_mode = TLSEXT_max_fragment_length_UNSPECIFIED;
    114     ss->verify_result = 1; /* avoid 0 (= X509_V_OK) just in case */
    115     /* 5 minute timeout by default */
    116     ss->timeout = ossl_seconds2time(60 * 5 + 4);
    117     ss->time = ossl_time_now();
    118     ssl_session_calculate_timeout(ss);
    119     if (!CRYPTO_NEW_REF(&ss->references, 1)) {
    120         OPENSSL_free(ss);
    121         return NULL;
    122     }
    123 
    124     if (!CRYPTO_new_ex_data(CRYPTO_EX_INDEX_SSL_SESSION, ss, &ss->ex_data)) {
    125         CRYPTO_FREE_REF(&ss->references);
    126         OPENSSL_free(ss);
    127         return NULL;
    128     }
    129     return ss;
    130 }
    131 
    132 /*
    133  * Create a new SSL_SESSION and duplicate the contents of |src| into it. If
    134  * ticket == 0 then no ticket information is duplicated, otherwise it is.
    135  */
    136 static SSL_SESSION *ssl_session_dup_intern(const SSL_SESSION *src, int ticket)
    137 {
    138     SSL_SESSION *dest;
    139 
    140     dest = OPENSSL_malloc(sizeof(*dest));
    141     if (dest == NULL)
    142         return NULL;
    143 
    144     /*
    145      * src is logically read-only but the prev/next pointers are not, they are
    146      * part of the session cache and can be modified concurrently.
    147      */
    148     memcpy(dest, src, offsetof(SSL_SESSION, prev));
    149 
    150     /*
    151      * Set the various pointers to NULL so that we can call SSL_SESSION_free in
    152      * the case of an error whilst halfway through constructing dest
    153      */
    154 #ifndef OPENSSL_NO_PSK
    155     dest->psk_identity_hint = NULL;
    156     dest->psk_identity = NULL;
    157 #endif
    158     dest->ext.hostname = NULL;
    159     dest->ext.tick = NULL;
    160     dest->ext.alpn_selected = NULL;
    161 #ifndef OPENSSL_NO_SRP
    162     dest->srp_username = NULL;
    163 #endif
    164     dest->peer_chain = NULL;
    165     dest->peer = NULL;
    166     dest->peer_rpk = NULL;
    167     dest->ticket_appdata = NULL;
    168     memset(&dest->ex_data, 0, sizeof(dest->ex_data));
    169 
    170     /* As the copy is not in the cache, we remove the associated pointers */
    171     dest->prev = NULL;
    172     dest->next = NULL;
    173     dest->owner = NULL;
    174 
    175     if (!CRYPTO_NEW_REF(&dest->references, 1)) {
    176         OPENSSL_free(dest);
    177         return NULL;
    178     }
    179 
    180     if (!CRYPTO_new_ex_data(CRYPTO_EX_INDEX_SSL_SESSION, dest, &dest->ex_data)) {
    181         ERR_raise(ERR_LIB_SSL, ERR_R_CRYPTO_LIB);
    182         goto err;
    183     }
    184 
    185     if (src->peer != NULL) {
    186         if (!X509_up_ref(src->peer)) {
    187             ERR_raise(ERR_LIB_SSL, ERR_R_X509_LIB);
    188             goto err;
    189         }
    190         dest->peer = src->peer;
    191     }
    192 
    193     if (src->peer_chain != NULL) {
    194         dest->peer_chain = X509_chain_up_ref(src->peer_chain);
    195         if (dest->peer_chain == NULL) {
    196             ERR_raise(ERR_LIB_SSL, ERR_R_X509_LIB);
    197             goto err;
    198         }
    199     }
    200 
    201     if (src->peer_rpk != NULL) {
    202         if (!EVP_PKEY_up_ref(src->peer_rpk))
    203             goto err;
    204         dest->peer_rpk = src->peer_rpk;
    205     }
    206 
    207 #ifndef OPENSSL_NO_PSK
    208     if (src->psk_identity_hint) {
    209         dest->psk_identity_hint = OPENSSL_strdup(src->psk_identity_hint);
    210         if (dest->psk_identity_hint == NULL)
    211             goto err;
    212     }
    213     if (src->psk_identity) {
    214         dest->psk_identity = OPENSSL_strdup(src->psk_identity);
    215         if (dest->psk_identity == NULL)
    216             goto err;
    217     }
    218 #endif
    219 
    220     if (!CRYPTO_dup_ex_data(CRYPTO_EX_INDEX_SSL_SESSION,
    221             &dest->ex_data, &src->ex_data)) {
    222         ERR_raise(ERR_LIB_SSL, ERR_R_CRYPTO_LIB);
    223         goto err;
    224     }
    225 
    226     if (src->ext.hostname) {
    227         dest->ext.hostname = OPENSSL_strdup(src->ext.hostname);
    228         if (dest->ext.hostname == NULL)
    229             goto err;
    230     }
    231 
    232     if (ticket != 0 && src->ext.tick != NULL) {
    233         dest->ext.tick = OPENSSL_memdup(src->ext.tick, src->ext.ticklen);
    234         if (dest->ext.tick == NULL)
    235             goto err;
    236     } else {
    237         dest->ext.tick_lifetime_hint = 0;
    238         dest->ext.ticklen = 0;
    239     }
    240 
    241     if (src->ext.alpn_selected != NULL) {
    242         dest->ext.alpn_selected = OPENSSL_memdup(src->ext.alpn_selected,
    243             src->ext.alpn_selected_len);
    244         if (dest->ext.alpn_selected == NULL)
    245             goto err;
    246     }
    247 
    248 #ifndef OPENSSL_NO_SRP
    249     if (src->srp_username) {
    250         dest->srp_username = OPENSSL_strdup(src->srp_username);
    251         if (dest->srp_username == NULL)
    252             goto err;
    253     }
    254 #endif
    255 
    256     if (src->ticket_appdata != NULL) {
    257         dest->ticket_appdata = OPENSSL_memdup(src->ticket_appdata, src->ticket_appdata_len);
    258         if (dest->ticket_appdata == NULL)
    259             goto err;
    260     }
    261 
    262     return dest;
    263 err:
    264     SSL_SESSION_free(dest);
    265     return NULL;
    266 }
    267 
    268 SSL_SESSION *SSL_SESSION_dup(const SSL_SESSION *src)
    269 {
    270     return ssl_session_dup_intern(src, 1);
    271 }
    272 
    273 /*
    274  * Used internally when duplicating a session which might be already shared.
    275  * We will have resumed the original session. Subsequently we might have marked
    276  * it as non-resumable (e.g. in another thread) - but this copy should be ok to
    277  * resume from.
    278  */
    279 SSL_SESSION *ssl_session_dup(const SSL_SESSION *src, int ticket)
    280 {
    281     SSL_SESSION *sess = ssl_session_dup_intern(src, ticket);
    282 
    283     if (sess != NULL)
    284         sess->not_resumable = 0;
    285 
    286     return sess;
    287 }
    288 
    289 const unsigned char *SSL_SESSION_get_id(const SSL_SESSION *s, unsigned int *len)
    290 {
    291     if (len)
    292         *len = (unsigned int)s->session_id_length;
    293     return s->session_id;
    294 }
    295 
    296 const unsigned char *SSL_SESSION_get0_id_context(const SSL_SESSION *s,
    297     unsigned int *len)
    298 {
    299     if (len != NULL)
    300         *len = (unsigned int)s->sid_ctx_length;
    301     return s->sid_ctx;
    302 }
    303 
    304 unsigned int SSL_SESSION_get_compress_id(const SSL_SESSION *s)
    305 {
    306     return s->compress_meth;
    307 }
    308 
    309 /*
    310  * SSLv3/TLSv1 has 32 bytes (256 bits) of session ID space. As such, filling
    311  * the ID with random junk repeatedly until we have no conflict is going to
    312  * complete in one iteration pretty much "most" of the time (btw:
    313  * understatement). So, if it takes us 10 iterations and we still can't avoid
    314  * a conflict - well that's a reasonable point to call it quits. Either the
    315  * RAND code is broken or someone is trying to open roughly very close to
    316  * 2^256 SSL sessions to our server. How you might store that many sessions
    317  * is perhaps a more interesting question ...
    318  */
    319 
    320 #define MAX_SESS_ID_ATTEMPTS 10
    321 static int def_generate_session_id(SSL *ssl, unsigned char *id,
    322     unsigned int *id_len)
    323 {
    324     unsigned int retry = 0;
    325     do {
    326         if (RAND_bytes_ex(ssl->ctx->libctx, id, *id_len, 0) <= 0)
    327             return 0;
    328 #ifdef FUZZING_BUILD_MODE_UNSAFE_FOR_PRODUCTION
    329         if (retry > 0) {
    330             id[0]++;
    331         }
    332 #endif
    333     } while (SSL_has_matching_session_id(ssl, id, *id_len) && (++retry < MAX_SESS_ID_ATTEMPTS));
    334     if (retry < MAX_SESS_ID_ATTEMPTS)
    335         return 1;
    336     /* else - woops a session_id match */
    337     /*
    338      * XXX We should also check the external cache -- but the probability of
    339      * a collision is negligible, and we could not prevent the concurrent
    340      * creation of sessions with identical IDs since we currently don't have
    341      * means to atomically check whether a session ID already exists and make
    342      * a reservation for it if it does not (this problem applies to the
    343      * internal cache as well).
    344      */
    345     return 0;
    346 }
    347 
    348 int ssl_generate_session_id(SSL_CONNECTION *s, SSL_SESSION *ss)
    349 {
    350     unsigned int tmp;
    351     GEN_SESSION_CB cb = def_generate_session_id;
    352     SSL *ssl = SSL_CONNECTION_GET_SSL(s);
    353 
    354     switch (s->version) {
    355     case SSL3_VERSION:
    356     case TLS1_VERSION:
    357     case TLS1_1_VERSION:
    358     case TLS1_2_VERSION:
    359     case TLS1_3_VERSION:
    360     case DTLS1_BAD_VER:
    361     case DTLS1_VERSION:
    362     case DTLS1_2_VERSION:
    363         ss->session_id_length = SSL3_SSL_SESSION_ID_LENGTH;
    364         break;
    365     default:
    366         SSLfatal(s, SSL_AD_INTERNAL_ERROR, SSL_R_UNSUPPORTED_SSL_VERSION);
    367         return 0;
    368     }
    369 
    370     /*-
    371      * If RFC5077 ticket, use empty session ID (as server).
    372      * Note that:
    373      * (a) ssl_get_prev_session() does lookahead into the
    374      *     ClientHello extensions to find the session ticket.
    375      *     When ssl_get_prev_session() fails, statem_srvr.c calls
    376      *     ssl_get_new_session() in tls_process_client_hello().
    377      *     At that point, it has not yet parsed the extensions,
    378      *     however, because of the lookahead, it already knows
    379      *     whether a ticket is expected or not.
    380      *
    381      * (b) statem_clnt.c calls ssl_get_new_session() before parsing
    382      *     ServerHello extensions, and before recording the session
    383      *     ID received from the server, so this block is a noop.
    384      */
    385     if (s->ext.ticket_expected) {
    386         ss->session_id_length = 0;
    387         return 1;
    388     }
    389 
    390     /* Choose which callback will set the session ID */
    391     if (!CRYPTO_THREAD_read_lock(SSL_CONNECTION_GET_SSL(s)->lock))
    392         return 0;
    393     if (!CRYPTO_THREAD_read_lock(s->session_ctx->lock)) {
    394         CRYPTO_THREAD_unlock(ssl->lock);
    395         SSLfatal(s, SSL_AD_INTERNAL_ERROR,
    396             SSL_R_SESSION_ID_CONTEXT_UNINITIALIZED);
    397         return 0;
    398     }
    399     if (s->generate_session_id)
    400         cb = s->generate_session_id;
    401     else if (s->session_ctx->generate_session_id)
    402         cb = s->session_ctx->generate_session_id;
    403     CRYPTO_THREAD_unlock(s->session_ctx->lock);
    404     CRYPTO_THREAD_unlock(ssl->lock);
    405     /* Choose a session ID */
    406     memset(ss->session_id, 0, ss->session_id_length);
    407     tmp = (int)ss->session_id_length;
    408     if (!cb(ssl, ss->session_id, &tmp)) {
    409         /* The callback failed */
    410         SSLfatal(s, SSL_AD_INTERNAL_ERROR,
    411             SSL_R_SSL_SESSION_ID_CALLBACK_FAILED);
    412         return 0;
    413     }
    414     /*
    415      * Don't allow the callback to set the session length to zero. nor
    416      * set it higher than it was.
    417      */
    418     if (tmp == 0 || tmp > ss->session_id_length) {
    419         /* The callback set an illegal length */
    420         SSLfatal(s, SSL_AD_INTERNAL_ERROR,
    421             SSL_R_SSL_SESSION_ID_HAS_BAD_LENGTH);
    422         return 0;
    423     }
    424     ss->session_id_length = tmp;
    425     /* Finally, check for a conflict */
    426     if (SSL_has_matching_session_id(ssl, ss->session_id,
    427             (unsigned int)ss->session_id_length)) {
    428         SSLfatal(s, SSL_AD_INTERNAL_ERROR, SSL_R_SSL_SESSION_ID_CONFLICT);
    429         return 0;
    430     }
    431 
    432     return 1;
    433 }
    434 
    435 int ssl_get_new_session(SSL_CONNECTION *s, int session)
    436 {
    437     /* This gets used by clients and servers. */
    438 
    439     SSL_SESSION *ss = NULL;
    440 
    441     if ((ss = SSL_SESSION_new()) == NULL) {
    442         SSLfatal(s, SSL_AD_INTERNAL_ERROR, ERR_R_SSL_LIB);
    443         return 0;
    444     }
    445 
    446     /* If the context has a default timeout, use it */
    447     if (ossl_time_is_zero(s->session_ctx->session_timeout))
    448         ss->timeout = SSL_CONNECTION_GET_SSL(s)->method->get_timeout();
    449     else
    450         ss->timeout = s->session_ctx->session_timeout;
    451     ssl_session_calculate_timeout(ss);
    452 
    453     SSL_SESSION_free(s->session);
    454     s->session = NULL;
    455 
    456     if (session) {
    457         if (SSL_CONNECTION_IS_TLS13(s)) {
    458             /*
    459              * We generate the session id while constructing the
    460              * NewSessionTicket in TLSv1.3.
    461              */
    462             ss->session_id_length = 0;
    463         } else if (!ssl_generate_session_id(s, ss)) {
    464             /* SSLfatal() already called */
    465             SSL_SESSION_free(ss);
    466             return 0;
    467         }
    468 
    469     } else {
    470         ss->session_id_length = 0;
    471     }
    472 
    473     if (s->sid_ctx_length > sizeof(ss->sid_ctx)) {
    474         SSLfatal(s, SSL_AD_INTERNAL_ERROR, ERR_R_INTERNAL_ERROR);
    475         SSL_SESSION_free(ss);
    476         return 0;
    477     }
    478     memcpy(ss->sid_ctx, s->sid_ctx, s->sid_ctx_length);
    479     ss->sid_ctx_length = s->sid_ctx_length;
    480     s->session = ss;
    481     ss->ssl_version = s->version;
    482     ss->verify_result = X509_V_OK;
    483 
    484     /* If client supports extended master secret set it in session */
    485     if (s->s3.flags & TLS1_FLAGS_RECEIVED_EXTMS)
    486         ss->flags |= SSL_SESS_FLAG_EXTMS;
    487 
    488     return 1;
    489 }
    490 
    491 SSL_SESSION *lookup_sess_in_cache(SSL_CONNECTION *s,
    492     const unsigned char *sess_id,
    493     size_t sess_id_len)
    494 {
    495     SSL_SESSION *ret = NULL;
    496 
    497     if ((s->session_ctx->session_cache_mode
    498             & SSL_SESS_CACHE_NO_INTERNAL_LOOKUP)
    499         == 0) {
    500         SSL_SESSION data;
    501 
    502         data.ssl_version = s->version;
    503         if (!ossl_assert(sess_id_len <= SSL_MAX_SSL_SESSION_ID_LENGTH))
    504             return NULL;
    505 
    506         memcpy(data.session_id, sess_id, sess_id_len);
    507         data.session_id_length = sess_id_len;
    508 
    509         if (!CRYPTO_THREAD_read_lock(s->session_ctx->lock))
    510             return NULL;
    511         ret = lh_SSL_SESSION_retrieve(s->session_ctx->sessions, &data);
    512         if (ret != NULL) {
    513             /* don't allow other threads to steal it: */
    514             if (!SSL_SESSION_up_ref(ret)) {
    515                 CRYPTO_THREAD_unlock(s->session_ctx->lock);
    516                 return NULL;
    517             }
    518         }
    519         CRYPTO_THREAD_unlock(s->session_ctx->lock);
    520         if (ret == NULL)
    521             ssl_tsan_counter(s->session_ctx, &s->session_ctx->stats.sess_miss);
    522     }
    523 
    524     if (ret == NULL && s->session_ctx->get_session_cb != NULL) {
    525         int copy = 1;
    526 
    527         ret = s->session_ctx->get_session_cb(SSL_CONNECTION_GET_USER_SSL(s),
    528             sess_id, sess_id_len, &copy);
    529 
    530         if (ret != NULL) {
    531             if (ret->not_resumable) {
    532                 /* If its not resumable then ignore this session */
    533                 if (!copy)
    534                     SSL_SESSION_free(ret);
    535                 return NULL;
    536             }
    537             ssl_tsan_counter(s->session_ctx,
    538                 &s->session_ctx->stats.sess_cb_hit);
    539 
    540             /*
    541              * Increment reference count now if the session callback asks us
    542              * to do so (note that if the session structures returned by the
    543              * callback are shared between threads, it must handle the
    544              * reference count itself [i.e. copy == 0], or things won't be
    545              * thread-safe).
    546              */
    547             if (copy && !SSL_SESSION_up_ref(ret))
    548                 return NULL;
    549 
    550             /*
    551              * Add the externally cached session to the internal cache as
    552              * well if and only if we are supposed to.
    553              */
    554             if ((s->session_ctx->session_cache_mode & SSL_SESS_CACHE_NO_INTERNAL_STORE) == 0) {
    555                 /*
    556                  * Either return value of SSL_CTX_add_session should not
    557                  * interrupt the session resumption process. The return
    558                  * value is intentionally ignored.
    559                  */
    560                 (void)SSL_CTX_add_session(s->session_ctx, ret);
    561             }
    562         }
    563     }
    564 
    565     return ret;
    566 }
    567 
    568 /*-
    569  * ssl_get_prev attempts to find an SSL_SESSION to be used to resume this
    570  * connection. It is only called by servers.
    571  *
    572  *   hello: The parsed ClientHello data
    573  *
    574  * Returns:
    575  *   -1: fatal error
    576  *    0: no session found
    577  *    1: a session may have been found.
    578  *
    579  * Side effects:
    580  *   - If a session is found then s->session is pointed at it (after freeing an
    581  *     existing session if need be) and s->verify_result is set from the session.
    582  *   - Both for new and resumed sessions, s->ext.ticket_expected is set to 1
    583  *     if the server should issue a new session ticket (to 0 otherwise).
    584  */
    585 int ssl_get_prev_session(SSL_CONNECTION *s, CLIENTHELLO_MSG *hello)
    586 {
    587     /* This is used only by servers. */
    588 
    589     SSL_SESSION *ret = NULL;
    590     int fatal = 0;
    591     int try_session_cache = 0;
    592     SSL_TICKET_STATUS r;
    593 
    594     if (SSL_CONNECTION_IS_TLS13(s)) {
    595         SSL_SESSION_free(s->session);
    596         s->session = NULL;
    597         /*
    598          * By default we will send a new ticket. This can be overridden in the
    599          * ticket processing.
    600          */
    601         s->ext.ticket_expected = 1;
    602         if (!tls_parse_extension(s, TLSEXT_IDX_psk_kex_modes,
    603                 SSL_EXT_CLIENT_HELLO, hello->pre_proc_exts,
    604                 NULL, 0)
    605             || !tls_parse_extension(s, TLSEXT_IDX_psk, SSL_EXT_CLIENT_HELLO,
    606                 hello->pre_proc_exts, NULL, 0))
    607             return -1;
    608 
    609         /* If we resumed, s->session will now be set */
    610         ret = s->session;
    611     } else {
    612         /* sets s->ext.ticket_expected */
    613         r = tls_get_ticket_from_client(s, hello, &ret);
    614         switch (r) {
    615         case SSL_TICKET_FATAL_ERR_MALLOC:
    616         case SSL_TICKET_FATAL_ERR_OTHER:
    617             fatal = 1;
    618             SSLfatal(s, SSL_AD_INTERNAL_ERROR, ERR_R_INTERNAL_ERROR);
    619             goto err;
    620         case SSL_TICKET_NONE:
    621         case SSL_TICKET_EMPTY:
    622             if (hello->session_id_len > 0) {
    623                 try_session_cache = 1;
    624                 ret = lookup_sess_in_cache(s, hello->session_id,
    625                     hello->session_id_len);
    626             }
    627             break;
    628         case SSL_TICKET_NO_DECRYPT:
    629         case SSL_TICKET_SUCCESS:
    630         case SSL_TICKET_SUCCESS_RENEW:
    631             break;
    632         }
    633     }
    634 
    635     if (ret == NULL)
    636         goto err;
    637 
    638     /* Now ret is non-NULL and we own one of its reference counts. */
    639 
    640     /* Check TLS version consistency */
    641     if (ret->ssl_version != s->version)
    642         goto err;
    643 
    644     if (ret->sid_ctx_length != s->sid_ctx_length
    645         || memcmp(ret->sid_ctx, s->sid_ctx, ret->sid_ctx_length)) {
    646         /*
    647          * We have the session requested by the client, but we don't want to
    648          * use it in this context.
    649          */
    650         goto err; /* treat like cache miss */
    651     }
    652 
    653     if ((s->verify_mode & SSL_VERIFY_PEER) && s->sid_ctx_length == 0) {
    654         /*
    655          * We can't be sure if this session is being used out of context,
    656          * which is especially important for SSL_VERIFY_PEER. The application
    657          * should have used SSL[_CTX]_set_session_id_context. For this error
    658          * case, we generate an error instead of treating the event like a
    659          * cache miss (otherwise it would be easy for applications to
    660          * effectively disable the session cache by accident without anyone
    661          * noticing).
    662          */
    663 
    664         SSLfatal(s, SSL_AD_INTERNAL_ERROR,
    665             SSL_R_SESSION_ID_CONTEXT_UNINITIALIZED);
    666         fatal = 1;
    667         goto err;
    668     }
    669 
    670     if (sess_timedout(ossl_time_now(), ret)) {
    671         ssl_tsan_counter(s->session_ctx, &s->session_ctx->stats.sess_timeout);
    672         if (try_session_cache) {
    673             /* session was from the cache, so remove it */
    674             SSL_CTX_remove_session(s->session_ctx, ret);
    675         }
    676         goto err;
    677     }
    678 
    679     /* Check extended master secret extension consistency */
    680     if (ret->flags & SSL_SESS_FLAG_EXTMS) {
    681         /* If old session includes extms, but new does not: abort handshake */
    682         if (!(s->s3.flags & TLS1_FLAGS_RECEIVED_EXTMS)) {
    683             SSLfatal(s, SSL_AD_HANDSHAKE_FAILURE, SSL_R_INCONSISTENT_EXTMS);
    684             fatal = 1;
    685             goto err;
    686         }
    687     } else if (s->s3.flags & TLS1_FLAGS_RECEIVED_EXTMS) {
    688         /* If new session includes extms, but old does not: do not resume */
    689         goto err;
    690     }
    691 
    692     if (!SSL_CONNECTION_IS_TLS13(s)) {
    693         /* We already did this for TLS1.3 */
    694         SSL_SESSION_free(s->session);
    695         s->session = ret;
    696     }
    697 
    698     ssl_tsan_counter(s->session_ctx, &s->session_ctx->stats.sess_hit);
    699     s->verify_result = s->session->verify_result;
    700     return 1;
    701 
    702 err:
    703     if (ret != NULL) {
    704         SSL_SESSION_free(ret);
    705         /* In TLSv1.3 s->session was already set to ret, so we NULL it out */
    706         if (SSL_CONNECTION_IS_TLS13(s))
    707             s->session = NULL;
    708 
    709         if (!try_session_cache) {
    710             /*
    711              * The session was from a ticket, so we should issue a ticket for
    712              * the new session
    713              */
    714             s->ext.ticket_expected = 1;
    715         }
    716     }
    717     if (fatal)
    718         return -1;
    719 
    720     return 0;
    721 }
    722 
    723 int SSL_CTX_add_session(SSL_CTX *ctx, SSL_SESSION *c)
    724 {
    725     int ret = 0;
    726     SSL_SESSION *s;
    727 
    728     /*
    729      * add just 1 reference count for the SSL_CTX's session cache even though
    730      * it has two ways of access: each session is in a doubly linked list and
    731      * an lhash
    732      */
    733     if (!SSL_SESSION_up_ref(c))
    734         return 0;
    735     /*
    736      * if session c is in already in cache, we take back the increment later
    737      */
    738 
    739     if (!CRYPTO_THREAD_write_lock(ctx->lock)) {
    740         SSL_SESSION_free(c);
    741         return 0;
    742     }
    743     s = lh_SSL_SESSION_insert(ctx->sessions, c);
    744 
    745     /*
    746      * s != NULL iff we already had a session with the given PID. In this
    747      * case, s == c should hold (then we did not really modify
    748      * ctx->sessions), or we're in trouble.
    749      */
    750     if (s != NULL && s != c) {
    751         /* We *are* in trouble ... */
    752         SSL_SESSION_list_remove(ctx, s);
    753         SSL_SESSION_free(s);
    754         /*
    755          * ... so pretend the other session did not exist in cache (we cannot
    756          * handle two SSL_SESSION structures with identical session ID in the
    757          * same cache, which could happen e.g. when two threads concurrently
    758          * obtain the same session from an external cache)
    759          */
    760         s = NULL;
    761     } else if (s == NULL && lh_SSL_SESSION_retrieve(ctx->sessions, c) == NULL) {
    762         /* s == NULL can also mean OOM error in lh_SSL_SESSION_insert ... */
    763 
    764         /*
    765          * ... so take back the extra reference and also don't add
    766          * the session to the SSL_SESSION_list at this time
    767          */
    768         s = c;
    769     }
    770 
    771     /* Adjust last used time, and add back into the cache at the appropriate spot */
    772     if (ctx->session_cache_mode & SSL_SESS_CACHE_UPDATE_TIME) {
    773         c->time = ossl_time_now();
    774         ssl_session_calculate_timeout(c);
    775     }
    776 
    777     if (s == NULL) {
    778         /*
    779          * new cache entry -- remove old ones if cache has become too large
    780          * delete cache entry *before* add, so we don't remove the one we're adding!
    781          */
    782 
    783         ret = 1;
    784 
    785         if (SSL_CTX_sess_get_cache_size(ctx) > 0) {
    786             while (SSL_CTX_sess_number(ctx) >= SSL_CTX_sess_get_cache_size(ctx)) {
    787                 if (!remove_session_lock(ctx, ctx->session_cache_tail, 0))
    788                     break;
    789                 else
    790                     ssl_tsan_counter(ctx, &ctx->stats.sess_cache_full);
    791             }
    792         }
    793     }
    794 
    795     SSL_SESSION_list_add(ctx, c);
    796 
    797     if (s != NULL) {
    798         /*
    799          * existing cache entry -- decrement previously incremented reference
    800          * count because it already takes into account the cache
    801          */
    802 
    803         SSL_SESSION_free(s); /* s == c */
    804         ret = 0;
    805     }
    806     CRYPTO_THREAD_unlock(ctx->lock);
    807     return ret;
    808 }
    809 
    810 int SSL_CTX_remove_session(SSL_CTX *ctx, SSL_SESSION *c)
    811 {
    812     return remove_session_lock(ctx, c, 1);
    813 }
    814 
    815 static int remove_session_lock(SSL_CTX *ctx, SSL_SESSION *c, int lck)
    816 {
    817     SSL_SESSION *r;
    818     int ret = 0;
    819 
    820     if ((c != NULL) && (c->session_id_length != 0)) {
    821         if (lck) {
    822             if (!CRYPTO_THREAD_write_lock(ctx->lock))
    823                 return 0;
    824         }
    825         if ((r = lh_SSL_SESSION_retrieve(ctx->sessions, c)) != NULL) {
    826             ret = 1;
    827             r = lh_SSL_SESSION_delete(ctx->sessions, r);
    828             SSL_SESSION_list_remove(ctx, r);
    829         }
    830         c->not_resumable = 1;
    831 
    832         if (lck)
    833             CRYPTO_THREAD_unlock(ctx->lock);
    834 
    835         if (ctx->remove_session_cb != NULL)
    836             ctx->remove_session_cb(ctx, c);
    837 
    838         if (ret)
    839             SSL_SESSION_free(r);
    840     }
    841     return ret;
    842 }
    843 
    844 void SSL_SESSION_free(SSL_SESSION *ss)
    845 {
    846     int i;
    847 
    848     if (ss == NULL)
    849         return;
    850     CRYPTO_DOWN_REF(&ss->references, &i);
    851     REF_PRINT_COUNT("SSL_SESSION", i, ss);
    852     if (i > 0)
    853         return;
    854     REF_ASSERT_ISNT(i < 0);
    855 
    856     CRYPTO_free_ex_data(CRYPTO_EX_INDEX_SSL_SESSION, ss, &ss->ex_data);
    857 
    858     OPENSSL_cleanse(ss->master_key, sizeof(ss->master_key));
    859     OPENSSL_cleanse(ss->session_id, sizeof(ss->session_id));
    860     X509_free(ss->peer);
    861     EVP_PKEY_free(ss->peer_rpk);
    862     OSSL_STACK_OF_X509_free(ss->peer_chain);
    863     OPENSSL_free(ss->ext.hostname);
    864     OPENSSL_free(ss->ext.tick);
    865 #ifndef OPENSSL_NO_PSK
    866     OPENSSL_free(ss->psk_identity_hint);
    867     OPENSSL_free(ss->psk_identity);
    868 #endif
    869 #ifndef OPENSSL_NO_SRP
    870     OPENSSL_free(ss->srp_username);
    871 #endif
    872     OPENSSL_free(ss->ext.alpn_selected);
    873     OPENSSL_free(ss->ticket_appdata);
    874     CRYPTO_FREE_REF(&ss->references);
    875     OPENSSL_clear_free(ss, sizeof(*ss));
    876 }
    877 
    878 int SSL_SESSION_up_ref(SSL_SESSION *ss)
    879 {
    880     int i;
    881 
    882     if (CRYPTO_UP_REF(&ss->references, &i) <= 0)
    883         return 0;
    884 
    885     REF_PRINT_COUNT("SSL_SESSION", i, ss);
    886     REF_ASSERT_ISNT(i < 2);
    887     return ((i > 1) ? 1 : 0);
    888 }
    889 
    890 int SSL_set_session(SSL *s, SSL_SESSION *session)
    891 {
    892     SSL_CONNECTION *sc = SSL_CONNECTION_FROM_SSL(s);
    893 
    894     if (sc == NULL)
    895         return 0;
    896 
    897     if (session != NULL && !SSL_SESSION_up_ref(session))
    898         return 0;
    899 
    900     ssl_clear_bad_session(sc);
    901     if (s->defltmeth != s->method) {
    902         if (!SSL_set_ssl_method(s, s->defltmeth)) {
    903             SSL_SESSION_free(session);
    904             return 0;
    905         }
    906     }
    907 
    908     if (session != NULL)
    909         sc->verify_result = session->verify_result;
    910 
    911     SSL_SESSION_free(sc->session);
    912     sc->session = session;
    913 
    914     return 1;
    915 }
    916 
    917 int SSL_SESSION_set1_id(SSL_SESSION *s, const unsigned char *sid,
    918     unsigned int sid_len)
    919 {
    920     if (sid_len > SSL_MAX_SSL_SESSION_ID_LENGTH) {
    921         ERR_raise(ERR_LIB_SSL, SSL_R_SSL_SESSION_ID_TOO_LONG);
    922         return 0;
    923     }
    924     s->session_id_length = sid_len;
    925     if (sid != s->session_id && sid_len > 0)
    926         memcpy(s->session_id, sid, sid_len);
    927 
    928     return 1;
    929 }
    930 
    931 long SSL_SESSION_set_timeout(SSL_SESSION *s, long t)
    932 {
    933     OSSL_TIME new_timeout = ossl_seconds2time(t);
    934 
    935     if (s == NULL || t < 0)
    936         return 0;
    937     if (s->owner != NULL) {
    938         if (!CRYPTO_THREAD_write_lock(s->owner->lock))
    939             return 0;
    940         s->timeout = new_timeout;
    941         ssl_session_calculate_timeout(s);
    942         SSL_SESSION_list_add(s->owner, s);
    943         CRYPTO_THREAD_unlock(s->owner->lock);
    944     } else {
    945         s->timeout = new_timeout;
    946         ssl_session_calculate_timeout(s);
    947     }
    948     return 1;
    949 }
    950 
    951 long SSL_SESSION_get_timeout(const SSL_SESSION *s)
    952 {
    953     if (s == NULL)
    954         return 0;
    955     return (long)ossl_time_to_time_t(s->timeout);
    956 }
    957 
    958 #ifndef OPENSSL_NO_DEPRECATED_3_4
    959 long SSL_SESSION_get_time(const SSL_SESSION *s)
    960 {
    961     return (long)SSL_SESSION_get_time_ex(s);
    962 }
    963 #endif
    964 
    965 time_t SSL_SESSION_get_time_ex(const SSL_SESSION *s)
    966 {
    967     if (s == NULL)
    968         return 0;
    969     return ossl_time_to_time_t(s->time);
    970 }
    971 
    972 time_t SSL_SESSION_set_time_ex(SSL_SESSION *s, time_t t)
    973 {
    974     OSSL_TIME new_time = ossl_time_from_time_t(t);
    975 
    976     if (s == NULL)
    977         return 0;
    978     if (s->owner != NULL) {
    979         if (!CRYPTO_THREAD_write_lock(s->owner->lock))
    980             return 0;
    981         s->time = new_time;
    982         ssl_session_calculate_timeout(s);
    983         SSL_SESSION_list_add(s->owner, s);
    984         CRYPTO_THREAD_unlock(s->owner->lock);
    985     } else {
    986         s->time = new_time;
    987         ssl_session_calculate_timeout(s);
    988     }
    989     return t;
    990 }
    991 
    992 #ifndef OPENSSL_NO_DEPRECATED_3_4
    993 long SSL_SESSION_set_time(SSL_SESSION *s, long t)
    994 {
    995     return (long)SSL_SESSION_set_time_ex(s, (time_t)t);
    996 }
    997 #endif
    998 
    999 int SSL_SESSION_get_protocol_version(const SSL_SESSION *s)
   1000 {
   1001     return s->ssl_version;
   1002 }
   1003 
   1004 int SSL_SESSION_set_protocol_version(SSL_SESSION *s, int version)
   1005 {
   1006     s->ssl_version = version;
   1007     return 1;
   1008 }
   1009 
   1010 const SSL_CIPHER *SSL_SESSION_get0_cipher(const SSL_SESSION *s)
   1011 {
   1012     return s->cipher;
   1013 }
   1014 
   1015 int SSL_SESSION_set_cipher(SSL_SESSION *s, const SSL_CIPHER *cipher)
   1016 {
   1017     s->cipher = cipher;
   1018     return 1;
   1019 }
   1020 
   1021 const char *SSL_SESSION_get0_hostname(const SSL_SESSION *s)
   1022 {
   1023     return s->ext.hostname;
   1024 }
   1025 
   1026 int SSL_SESSION_set1_hostname(SSL_SESSION *s, const char *hostname)
   1027 {
   1028     OPENSSL_free(s->ext.hostname);
   1029     if (hostname == NULL) {
   1030         s->ext.hostname = NULL;
   1031         return 1;
   1032     }
   1033     s->ext.hostname = OPENSSL_strdup(hostname);
   1034 
   1035     return s->ext.hostname != NULL;
   1036 }
   1037 
   1038 int SSL_SESSION_has_ticket(const SSL_SESSION *s)
   1039 {
   1040     return (s->ext.ticklen > 0) ? 1 : 0;
   1041 }
   1042 
   1043 unsigned long SSL_SESSION_get_ticket_lifetime_hint(const SSL_SESSION *s)
   1044 {
   1045     return s->ext.tick_lifetime_hint;
   1046 }
   1047 
   1048 void SSL_SESSION_get0_ticket(const SSL_SESSION *s, const unsigned char **tick,
   1049     size_t *len)
   1050 {
   1051     *len = s->ext.ticklen;
   1052     if (tick != NULL)
   1053         *tick = s->ext.tick;
   1054 }
   1055 
   1056 uint32_t SSL_SESSION_get_max_early_data(const SSL_SESSION *s)
   1057 {
   1058     return s->ext.max_early_data;
   1059 }
   1060 
   1061 int SSL_SESSION_set_max_early_data(SSL_SESSION *s, uint32_t max_early_data)
   1062 {
   1063     s->ext.max_early_data = max_early_data;
   1064 
   1065     return 1;
   1066 }
   1067 
   1068 void SSL_SESSION_get0_alpn_selected(const SSL_SESSION *s,
   1069     const unsigned char **alpn,
   1070     size_t *len)
   1071 {
   1072     *alpn = s->ext.alpn_selected;
   1073     *len = s->ext.alpn_selected_len;
   1074 }
   1075 
   1076 int SSL_SESSION_set1_alpn_selected(SSL_SESSION *s, const unsigned char *alpn,
   1077     size_t len)
   1078 {
   1079     OPENSSL_free(s->ext.alpn_selected);
   1080     if (alpn == NULL || len == 0) {
   1081         s->ext.alpn_selected = NULL;
   1082         s->ext.alpn_selected_len = 0;
   1083         return 1;
   1084     }
   1085     s->ext.alpn_selected = OPENSSL_memdup(alpn, len);
   1086     if (s->ext.alpn_selected == NULL) {
   1087         s->ext.alpn_selected_len = 0;
   1088         return 0;
   1089     }
   1090     s->ext.alpn_selected_len = len;
   1091 
   1092     return 1;
   1093 }
   1094 
   1095 X509 *SSL_SESSION_get0_peer(SSL_SESSION *s)
   1096 {
   1097     return s->peer;
   1098 }
   1099 
   1100 EVP_PKEY *SSL_SESSION_get0_peer_rpk(SSL_SESSION *s)
   1101 {
   1102     return s->peer_rpk;
   1103 }
   1104 
   1105 int SSL_SESSION_set1_id_context(SSL_SESSION *s, const unsigned char *sid_ctx,
   1106     unsigned int sid_ctx_len)
   1107 {
   1108     if (sid_ctx_len > SSL_MAX_SID_CTX_LENGTH) {
   1109         ERR_raise(ERR_LIB_SSL, SSL_R_SSL_SESSION_ID_CONTEXT_TOO_LONG);
   1110         return 0;
   1111     }
   1112     s->sid_ctx_length = sid_ctx_len;
   1113     if (sid_ctx != s->sid_ctx)
   1114         memcpy(s->sid_ctx, sid_ctx, sid_ctx_len);
   1115 
   1116     return 1;
   1117 }
   1118 
   1119 int SSL_SESSION_is_resumable(const SSL_SESSION *s)
   1120 {
   1121     /*
   1122      * In the case of EAP-FAST, we can have a pre-shared "ticket" without a
   1123      * session ID.
   1124      */
   1125     return !s->not_resumable
   1126         && (s->session_id_length > 0 || s->ext.ticklen > 0);
   1127 }
   1128 
   1129 long SSL_CTX_set_timeout(SSL_CTX *s, long t)
   1130 {
   1131     long l;
   1132 
   1133     if (s == NULL)
   1134         return 0;
   1135     l = (long)ossl_time2seconds(s->session_timeout);
   1136     s->session_timeout = ossl_seconds2time(t);
   1137     return l;
   1138 }
   1139 
   1140 long SSL_CTX_get_timeout(const SSL_CTX *s)
   1141 {
   1142     if (s == NULL)
   1143         return 0;
   1144     return (long)ossl_time2seconds(s->session_timeout);
   1145 }
   1146 
   1147 int SSL_set_session_secret_cb(SSL *s,
   1148     tls_session_secret_cb_fn tls_session_secret_cb,
   1149     void *arg)
   1150 {
   1151     SSL_CONNECTION *sc = SSL_CONNECTION_FROM_SSL(s);
   1152 
   1153     if (sc == NULL)
   1154         return 0;
   1155 
   1156     sc->ext.session_secret_cb = tls_session_secret_cb;
   1157     sc->ext.session_secret_cb_arg = arg;
   1158     return 1;
   1159 }
   1160 
   1161 int SSL_set_session_ticket_ext_cb(SSL *s, tls_session_ticket_ext_cb_fn cb,
   1162     void *arg)
   1163 {
   1164     SSL_CONNECTION *sc = SSL_CONNECTION_FROM_SSL(s);
   1165 
   1166     if (sc == NULL)
   1167         return 0;
   1168 
   1169     sc->ext.session_ticket_cb = cb;
   1170     sc->ext.session_ticket_cb_arg = arg;
   1171     return 1;
   1172 }
   1173 
   1174 int SSL_set_session_ticket_ext(SSL *s, void *ext_data, int ext_len)
   1175 {
   1176     SSL_CONNECTION *sc = SSL_CONNECTION_FROM_SSL(s);
   1177 
   1178     if (sc == NULL)
   1179         return 0;
   1180 
   1181     if (sc->version >= TLS1_VERSION) {
   1182         OPENSSL_free(sc->ext.session_ticket);
   1183         sc->ext.session_ticket = NULL;
   1184         sc->ext.session_ticket = OPENSSL_malloc(sizeof(TLS_SESSION_TICKET_EXT) + ext_len);
   1185         if (sc->ext.session_ticket == NULL)
   1186             return 0;
   1187 
   1188         if (ext_data != NULL) {
   1189             sc->ext.session_ticket->length = ext_len;
   1190             sc->ext.session_ticket->data = sc->ext.session_ticket + 1;
   1191             memcpy(sc->ext.session_ticket->data, ext_data, ext_len);
   1192         } else {
   1193             sc->ext.session_ticket->length = 0;
   1194             sc->ext.session_ticket->data = NULL;
   1195         }
   1196 
   1197         return 1;
   1198     }
   1199 
   1200     return 0;
   1201 }
   1202 
   1203 #ifndef OPENSSL_NO_DEPRECATED_3_4
   1204 void SSL_CTX_flush_sessions(SSL_CTX *s, long t)
   1205 {
   1206     SSL_CTX_flush_sessions_ex(s, (time_t)t);
   1207 }
   1208 #endif
   1209 
   1210 void SSL_CTX_flush_sessions_ex(SSL_CTX *s, time_t t)
   1211 {
   1212     STACK_OF(SSL_SESSION) *sk;
   1213     SSL_SESSION *current;
   1214     unsigned long i;
   1215     const OSSL_TIME timeout = ossl_time_from_time_t(t);
   1216 
   1217     if (!CRYPTO_THREAD_write_lock(s->lock))
   1218         return;
   1219 
   1220     sk = sk_SSL_SESSION_new_null();
   1221     i = lh_SSL_SESSION_get_down_load(s->sessions);
   1222     lh_SSL_SESSION_set_down_load(s->sessions, 0);
   1223 
   1224     /*
   1225      * Iterate over the list from the back (oldest), and stop
   1226      * when a session can no longer be removed.
   1227      * Add the session to a temporary list to be freed outside
   1228      * the SSL_CTX lock.
   1229      * But still do the remove_session_cb() within the lock.
   1230      */
   1231     while (s->session_cache_tail != NULL) {
   1232         current = s->session_cache_tail;
   1233         if (t == 0 || sess_timedout(timeout, current)) {
   1234             lh_SSL_SESSION_delete(s->sessions, current);
   1235             SSL_SESSION_list_remove(s, current);
   1236             current->not_resumable = 1;
   1237             if (s->remove_session_cb != NULL)
   1238                 s->remove_session_cb(s, current);
   1239             /*
   1240              * Throw the session on a stack, it's entirely plausible
   1241              * that while freeing outside the critical section, the
   1242              * session could be re-added, so avoid using the next/prev
   1243              * pointers. If the stack failed to create, or the session
   1244              * couldn't be put on the stack, just free it here
   1245              */
   1246             if (sk == NULL || !sk_SSL_SESSION_push(sk, current))
   1247                 SSL_SESSION_free(current);
   1248         } else {
   1249             break;
   1250         }
   1251     }
   1252 
   1253     lh_SSL_SESSION_set_down_load(s->sessions, i);
   1254     CRYPTO_THREAD_unlock(s->lock);
   1255 
   1256     sk_SSL_SESSION_pop_free(sk, SSL_SESSION_free);
   1257 }
   1258 
   1259 int ssl_clear_bad_session(SSL_CONNECTION *s)
   1260 {
   1261     if ((s->session != NULL) && !(s->shutdown & SSL_SENT_SHUTDOWN) && !(SSL_in_init(SSL_CONNECTION_GET_SSL(s)) || SSL_in_before(SSL_CONNECTION_GET_SSL(s)))) {
   1262         SSL_CTX_remove_session(s->session_ctx, s->session);
   1263         return 1;
   1264     } else
   1265         return 0;
   1266 }
   1267 
   1268 /* locked by SSL_CTX in the calling function */
   1269 static void SSL_SESSION_list_remove(SSL_CTX *ctx, SSL_SESSION *s)
   1270 {
   1271     if ((s->next == NULL) || (s->prev == NULL))
   1272         return;
   1273 
   1274     if (s->next == (SSL_SESSION *)&(ctx->session_cache_tail)) {
   1275         /* last element in list */
   1276         if (s->prev == (SSL_SESSION *)&(ctx->session_cache_head)) {
   1277             /* only one element in list */
   1278             ctx->session_cache_head = NULL;
   1279             ctx->session_cache_tail = NULL;
   1280         } else {
   1281             ctx->session_cache_tail = s->prev;
   1282             s->prev->next = (SSL_SESSION *)&(ctx->session_cache_tail);
   1283         }
   1284     } else {
   1285         if (s->prev == (SSL_SESSION *)&(ctx->session_cache_head)) {
   1286             /* first element in list */
   1287             ctx->session_cache_head = s->next;
   1288             s->next->prev = (SSL_SESSION *)&(ctx->session_cache_head);
   1289         } else {
   1290             /* middle of list */
   1291             s->next->prev = s->prev;
   1292             s->prev->next = s->next;
   1293         }
   1294     }
   1295     s->prev = s->next = NULL;
   1296     s->owner = NULL;
   1297 }
   1298 
   1299 static void SSL_SESSION_list_add(SSL_CTX *ctx, SSL_SESSION *s)
   1300 {
   1301     SSL_SESSION *next;
   1302 
   1303     if ((s->next != NULL) && (s->prev != NULL))
   1304         SSL_SESSION_list_remove(ctx, s);
   1305 
   1306     if (ctx->session_cache_head == NULL) {
   1307         ctx->session_cache_head = s;
   1308         ctx->session_cache_tail = s;
   1309         s->prev = (SSL_SESSION *)&(ctx->session_cache_head);
   1310         s->next = (SSL_SESSION *)&(ctx->session_cache_tail);
   1311     } else {
   1312         if (timeoutcmp(s, ctx->session_cache_head) >= 0) {
   1313             /*
   1314              * if we timeout after (or the same time as) the first
   1315              * session, put us first - usual case
   1316              */
   1317             s->next = ctx->session_cache_head;
   1318             s->next->prev = s;
   1319             s->prev = (SSL_SESSION *)&(ctx->session_cache_head);
   1320             ctx->session_cache_head = s;
   1321         } else if (timeoutcmp(s, ctx->session_cache_tail) < 0) {
   1322             /* if we timeout before the last session, put us last */
   1323             s->prev = ctx->session_cache_tail;
   1324             s->prev->next = s;
   1325             s->next = (SSL_SESSION *)&(ctx->session_cache_tail);
   1326             ctx->session_cache_tail = s;
   1327         } else {
   1328             /*
   1329              * we timeout somewhere in-between - if there is only
   1330              * one session in the cache it will be caught above
   1331              */
   1332             next = ctx->session_cache_head->next;
   1333             while (next != (SSL_SESSION *)&(ctx->session_cache_tail)) {
   1334                 if (timeoutcmp(s, next) >= 0) {
   1335                     s->next = next;
   1336                     s->prev = next->prev;
   1337                     next->prev->next = s;
   1338                     next->prev = s;
   1339                     break;
   1340                 }
   1341                 next = next->next;
   1342             }
   1343         }
   1344     }
   1345     s->owner = ctx;
   1346 }
   1347 
   1348 void SSL_CTX_sess_set_new_cb(SSL_CTX *ctx,
   1349     int (*cb)(struct ssl_st *ssl, SSL_SESSION *sess))
   1350 {
   1351     ctx->new_session_cb = cb;
   1352 }
   1353 
   1354 int (*SSL_CTX_sess_get_new_cb(SSL_CTX *ctx))(SSL *ssl, SSL_SESSION *sess)
   1355 {
   1356     return ctx->new_session_cb;
   1357 }
   1358 
   1359 void SSL_CTX_sess_set_remove_cb(SSL_CTX *ctx,
   1360     void (*cb)(SSL_CTX *ctx, SSL_SESSION *sess))
   1361 {
   1362     ctx->remove_session_cb = cb;
   1363 }
   1364 
   1365 void (*SSL_CTX_sess_get_remove_cb(SSL_CTX *ctx))(SSL_CTX *ctx,
   1366     SSL_SESSION *sess)
   1367 {
   1368     return ctx->remove_session_cb;
   1369 }
   1370 
   1371 void SSL_CTX_sess_set_get_cb(SSL_CTX *ctx,
   1372     SSL_SESSION *(*cb)(SSL *ssl,
   1373         const unsigned char *data,
   1374         int len, int *copy))
   1375 {
   1376     ctx->get_session_cb = cb;
   1377 }
   1378 
   1379 SSL_SESSION *(*SSL_CTX_sess_get_get_cb(SSL_CTX *ctx))(SSL *ssl,
   1380     const unsigned char
   1381         *data,
   1382     int len,
   1383     int *copy)
   1384 {
   1385     return ctx->get_session_cb;
   1386 }
   1387 
   1388 void SSL_CTX_set_info_callback(SSL_CTX *ctx,
   1389     void (*cb)(const SSL *ssl, int type, int val))
   1390 {
   1391     ctx->info_callback = cb;
   1392 }
   1393 
   1394 void (*SSL_CTX_get_info_callback(SSL_CTX *ctx))(const SSL *ssl, int type,
   1395     int val)
   1396 {
   1397     return ctx->info_callback;
   1398 }
   1399 
   1400 void SSL_CTX_set_client_cert_cb(SSL_CTX *ctx,
   1401     int (*cb)(SSL *ssl, X509 **x509,
   1402         EVP_PKEY **pkey))
   1403 {
   1404     ctx->client_cert_cb = cb;
   1405 }
   1406 
   1407 int (*SSL_CTX_get_client_cert_cb(SSL_CTX *ctx))(SSL *ssl, X509 **x509,
   1408     EVP_PKEY **pkey)
   1409 {
   1410     return ctx->client_cert_cb;
   1411 }
   1412 
   1413 void SSL_CTX_set_cookie_generate_cb(SSL_CTX *ctx,
   1414     int (*cb)(SSL *ssl,
   1415         unsigned char *cookie,
   1416         unsigned int *cookie_len))
   1417 {
   1418     ctx->app_gen_cookie_cb = cb;
   1419 }
   1420 
   1421 void SSL_CTX_set_cookie_verify_cb(SSL_CTX *ctx,
   1422     int (*cb)(SSL *ssl,
   1423         const unsigned char *cookie,
   1424         unsigned int cookie_len))
   1425 {
   1426     ctx->app_verify_cookie_cb = cb;
   1427 }
   1428 
   1429 int SSL_SESSION_set1_ticket_appdata(SSL_SESSION *ss, const void *data, size_t len)
   1430 {
   1431     OPENSSL_free(ss->ticket_appdata);
   1432     ss->ticket_appdata_len = 0;
   1433     if (data == NULL || len == 0) {
   1434         ss->ticket_appdata = NULL;
   1435         return 1;
   1436     }
   1437     ss->ticket_appdata = OPENSSL_memdup(data, len);
   1438     if (ss->ticket_appdata != NULL) {
   1439         ss->ticket_appdata_len = len;
   1440         return 1;
   1441     }
   1442     return 0;
   1443 }
   1444 
   1445 int SSL_SESSION_get0_ticket_appdata(SSL_SESSION *ss, void **data, size_t *len)
   1446 {
   1447     *data = ss->ticket_appdata;
   1448     *len = ss->ticket_appdata_len;
   1449     return 1;
   1450 }
   1451 
   1452 void SSL_CTX_set_stateless_cookie_generate_cb(
   1453     SSL_CTX *ctx,
   1454     int (*cb)(SSL *ssl,
   1455         unsigned char *cookie,
   1456         size_t *cookie_len))
   1457 {
   1458     ctx->gen_stateless_cookie_cb = cb;
   1459 }
   1460 
   1461 void SSL_CTX_set_stateless_cookie_verify_cb(
   1462     SSL_CTX *ctx,
   1463     int (*cb)(SSL *ssl,
   1464         const unsigned char *cookie,
   1465         size_t cookie_len))
   1466 {
   1467     ctx->verify_stateless_cookie_cb = cb;
   1468 }
   1469 
   1470 IMPLEMENT_PEM_rw(SSL_SESSION, SSL_SESSION, PEM_STRING_SSL_SESSION, SSL_SESSION)
   1471