Commit 4cb00457 authored by Matt Caswell's avatar Matt Caswell
Browse files

Remove TLSv1.3 tickets from the client cache as we use them



Tickets are supposed to be single use so we remove them from the cache on
use.

Fixes #6377

Reviewed-by: default avatarPaul Dale <paul.dale@oracle.com>
(Merged from https://github.com/openssl/openssl/pull/6601)
parent 1f156321
Loading
Loading
Loading
Loading
+1 −0
Original line number Diff line number Diff line
@@ -2682,6 +2682,7 @@ MSG_PROCESS_RETURN tls_process_new_session_ticket(SSL *s, PACKET *pkt)
        goto err;
    }
    s->session->session_id_length = sess_len;
    s->session->not_resumable = 0;

    /* This is a standalone message in TLSv1.3, so there is no more to read */
    if (SSL_IS_TLS13(s)) {
+14 −5
Original line number Diff line number Diff line
@@ -1067,13 +1067,22 @@ WORK_STATE tls_finish_handshake(SSL *s, WORK_STATE wst, int clearbufs, int stop)
                 */
                dtls1_start_timer(s);
            }
        } else {
            if (SSL_IS_TLS13(s)) {
                /*
                 * We encourage applications to only use TLSv1.3 tickets once,
                 * so we remove this one from the cache.
                 */
                if ((s->session_ctx->session_cache_mode
                     & SSL_SESS_CACHE_CLIENT) != 0)
                    SSL_CTX_remove_session(s->session_ctx, s->session);
            } else {
                /*
                 * In TLSv1.3 we update the cache as part of processing the
                 * NewSessionTicket
                 */
            if (!SSL_IS_TLS13(s))
                ssl_update_cache(s, SSL_SESS_CACHE_CLIENT);
            }
            if (s->hit)
                CRYPTO_atomic_add(&s->session_ctx->stats.sess_hit, 1, &discard,
                                  s->session_ctx->lock);
+3 −2
Original line number Diff line number Diff line
@@ -944,11 +944,12 @@ static int execute_test_session(int maxprot, int use_int_cache,
    if (maxprot == TLS1_3_VERSION) {
        /*
         * In TLSv1.3 we should have created a new session even though we have
         * resumed.
         * resumed. Since we attempted a resume we should also have removed the
         * old ticket from the cache so that we try to only use tickets once.
         */
        if (use_ext_cache
                && (!TEST_int_eq(new_called, 1)
                    || !TEST_int_eq(remove_called, 0)))
                    || !TEST_int_eq(remove_called, 1)))
            goto end;
    } else {
        /*