Only call ssl3_init_finished_mac once for DTLS
authorMatt Caswell <matt@openssl.org>
Tue, 3 Nov 2015 15:49:08 +0000 (15:49 +0000)
committerMatt Caswell <matt@openssl.org>
Tue, 10 Nov 2015 18:47:57 +0000 (18:47 +0000)
In DTLS if an IO retry occurs during writing of a fragmented ClientHello
then we can end up reseting the finish mac variables on the retry, which
causes a handshake failure. We should only reset on the first attempt not
on retries.

Thanks to BoringSSL for reporting this issue.

RT#4119

Reviewed-by: Tim Hudson <tjh@openssl.org>
(cherry picked from commit 15a7164eb7d4d031608fcec2801d7f7b11b16923)

ssl/d1_clnt.c

index 20ed02cbaee5d1260043d472f2209f85b96b0cb1..eb371a255f89bf3a6bfe9442830853ac48be94de 100644 (file)
@@ -299,13 +299,12 @@ int dtls1_connect(SSL *s)
 #endif
 
         case SSL3_ST_CW_CLNT_HELLO_A:
-        case SSL3_ST_CW_CLNT_HELLO_B:
-
             s->shutdown = 0;
 
             /* every DTLS ClientHello resets Finished MAC */
             ssl3_init_finished_mac(s);
 
+        case SSL3_ST_CW_CLNT_HELLO_B:
             dtls1_start_timer(s);
             ret = dtls1_client_hello(s);
             if (ret <= 0)