On Tue, 2015-02-17 at 22:48 +0100, David Woodhouse via RT wrote:
> Commit 9cf0f187 in HEAD, and 68039af3 in 1.0.2, removed a version check
> from dtls1_buffer_message() which was needed to distinguish between DTLS
> 1.x and Cisco's pre-standard version of DTLS.

Further testing shows that simply reverting the offending commit isn't
sufficient — as the commit comment hinted. We need to treat DTLS v1.2
the same as DTLS v1.0. So invert it to check explicitly for
DTLS1_BAD_VER instead. And in fact we might as well clean it up a little
to look like this:

diff --git a/ssl/d1_both.c b/ssl/d1_both.c
index 7d48cc4..0216d14 100644
--- a/ssl/d1_both.c
+++ b/ssl/d1_both.c
@@ -1072,6 +1072,7 @@ int dtls1_buffer_message(SSL *s, int is_ccs)
     pitem *item;
     hm_fragment *frag;
     unsigned char seq64be[8];
+    unsigned int expected_hdr_len;
 
     /*
      * this function is called immediately after a message has been
@@ -1085,13 +1086,15 @@ int dtls1_buffer_message(SSL *s, int is_ccs)
 
     memcpy(frag->fragment, s->init_buf->data, s->init_num);
 
-    if (is_ccs) {
-        OPENSSL_assert(s->d1->w_msg_hdr.msg_len +
-                       DTLS1_CCS_HEADER_LENGTH == (unsigned int)s->init_num);
-    } else {
-        OPENSSL_assert(s->d1->w_msg_hdr.msg_len +
-                       DTLS1_HM_HEADER_LENGTH == (unsigned int)s->init_num);
-    }
+    if (!is_ccs)
+        expected_hdr_len = DTLS1_HM_HEADER_LENGTH;
+    else if (s->version == DTLS1_BAD_VER)
+        expected_hdr_len = 3;
+    else
+        expected_hdr_len = DTLS1_CCS_HEADER_LENGTH;
+
+    OPENSSL_assert(s->d1->w_msg_hdr.msg_len +
+                   expected_hdr_len == (unsigned int)s->init_num);
 
     frag->msg_header.msg_len = s->d1->w_msg_hdr.msg_len;
     frag->msg_header.seq = s->d1->w_msg_hdr.seq;


-- 
dwmw2

Attachment: smime.p7s
Description: S/MIME cryptographic signature

_______________________________________________
openssl-dev mailing list
To unsubscribe: https://mta.openssl.org/mailman/listinfo/openssl-dev

Reply via email to