From: Matt Caswell Date: Thu, 13 Aug 2015 09:06:30 +0000 (+0100) Subject: Fix DTLS session ticket renewal X-Git-Tag: OpenSSL_1_1_0-pre1~784 X-Git-Url: https://git.openssl.org/gitweb/?p=openssl.git;a=commitdiff_plain;h=ee4ffd6fccd169775ba74afb1dbfecff48ee413d;hp=d6dfa55038fdb948cb214adf634f379eeb859f5d Fix DTLS session ticket renewal A DTLS client will abort a handshake if the server attempts to renew the session ticket. This is caused by a state machine discrepancy between DTLS and TLS discovered during the state machine rewrite work. The bug can be demonstrated as follows: Start a DTLS s_server instance: openssl s_server -dtls Start a client and obtain a session but no ticket: openssl s_client -dtls -sess_out session.pem -no_ticket Now start a client reusing the session, but allow a ticket: openssl s_client -dtls -sess_in session.pem The client will abort the handshake. Reviewed-by: Tim Hudson --- diff --git a/ssl/d1_clnt.c b/ssl/d1_clnt.c index d4116147b4..083333eedb 100644 --- a/ssl/d1_clnt.c +++ b/ssl/d1_clnt.c @@ -380,6 +380,10 @@ int dtls1_connect(SSL *s) #endif s->state = SSL3_ST_CR_CHANGE_A; + if (s->tlsext_ticket_expected) { + /* receive renewed session ticket */ + s->state = SSL3_ST_CR_SESSION_TICKET_A; + } } else s->state = DTLS1_ST_CR_HELLO_VERIFY_REQUEST_A; }