Commit f7506416 authored by Matt Caswell's avatar Matt Caswell
Browse files

Keep the DTLS timer running after the end of the handshake if appropriate



During a full handshake the server is the last one to "speak". The timer
should continue to run until we know that the client has received our last
flight (e.g. because we receive some application data).

Reviewed-by: default avatarRich Salz <rsalz@openssl.org>
(Merged from https://github.com/openssl/openssl/pull/6170)
parent ad962252
Loading
Loading
Loading
Loading
+13 −0
Original line number Diff line number Diff line
@@ -444,6 +444,19 @@ int dtls1_read_bytes(SSL *s, int type, int *recvd_type, unsigned char *buf,
            && SSL3_RECORD_get_length(rr) != 0)
        s->rlayer.alert_count = 0;

    if (SSL3_RECORD_get_type(rr) != SSL3_RT_HANDSHAKE
            && SSL3_RECORD_get_type(rr) != SSL3_RT_CHANGE_CIPHER_SPEC
            && !SSL_in_init(s)
            && (s->d1->next_timeout.tv_sec != 0
                || s->d1->next_timeout.tv_usec != 0)) {
        /*
         * The timer is still running but we've received something that isn't
         * handshake data - so the peer must have finished processing our
         * last handshake flight. Stop the timer.
         */
        dtls1_stop_timer(s);
    }

    /* we now have a packet which can be read and processed */

    if (s->s3->change_cipher_spec /* set when we receive ChangeCipherSpec,
+18 −0
Original line number Diff line number Diff line
@@ -1057,6 +1057,15 @@ WORK_STATE tls_finish_handshake(SSL *s, WORK_STATE wst, int clearbufs, int stop)
            CRYPTO_atomic_add(&s->ctx->stats.sess_accept_good, 1, &discard,
                              s->ctx->lock);
            s->handshake_func = ossl_statem_accept;

            if (SSL_IS_DTLS(s) && !s->hit) {
                /*
                 * We are finishing after the client. We start the timer going
                 * in case there are any retransmits of our final flight
                 * required.
                 */
                dtls1_start_timer(s);
            }
        } else {
            /*
             * In TLSv1.3 we update the cache as part of processing the
@@ -1071,6 +1080,15 @@ WORK_STATE tls_finish_handshake(SSL *s, WORK_STATE wst, int clearbufs, int stop)
            s->handshake_func = ossl_statem_connect;
            CRYPTO_atomic_add(&s->session_ctx->stats.sess_connect_good, 1,
                              &discard, s->session_ctx->lock);

            if (SSL_IS_DTLS(s) && s->hit) {
                /*
                 * We are finishing after the server. We start the timer going
                 * in case there are any retransmits of our final flight
                 * required.
                 */
                dtls1_start_timer(s);
            }
        }

        if (SSL_IS_DTLS(s)) {