From fbbf28e7c25d4d15b5db4b43da43da49ec2e7bae Mon Sep 17 00:00:00 2001 From: "Dr. Stephen Henson" Date: Sun, 3 Apr 2011 16:26:14 +0000 Subject: [PATCH] PR: 2458 Submitted by: Robin Seggelmann Reviewed by: steve Don't change state when answering DTLS ClientHello. --- ssl/d1_both.c | 14 ++++++++++---- ssl/d1_srvr.c | 9 ++++++--- 2 files changed, 16 insertions(+), 7 deletions(-) diff --git a/ssl/d1_both.c b/ssl/d1_both.c index 2569bb7d67..c195159967 100644 --- a/ssl/d1_both.c +++ b/ssl/d1_both.c @@ -464,7 +464,10 @@ again: memset(msg_hdr, 0x00, sizeof(struct hm_header_st)); - s->d1->handshake_read_seq++; + /* Don't change sequence numbers while listening */ + if (!s->d1->listen) + s->d1->handshake_read_seq++; + /* we just read a handshake message from the other side: * this means that we don't need to retransmit of the * buffered messages. @@ -813,9 +816,11 @@ dtls1_get_message_fragment(SSL *s, int st1, int stn, long max, int *ok) /* * if this is a future (or stale) message it gets buffered - * (or dropped)--no further processing at this time + * (or dropped)--no further processing at this time + * While listening, we accept seq 1 (ClientHello with cookie) + * although we're still expecting seq 0 (ClientHello) */ - if ( msg_hdr.seq != s->d1->handshake_read_seq) + if (msg_hdr.seq != s->d1->handshake_read_seq && !(s->d1->listen && msg_hdr.seq == 1)) return dtls1_process_out_of_seq_message(s, &msg_hdr, ok); len = msg_hdr.msg_len; @@ -1322,7 +1327,8 @@ unsigned char * dtls1_set_message_header(SSL *s, unsigned char *p, unsigned char mt, unsigned long len, unsigned long frag_off, unsigned long frag_len) { - if ( frag_off == 0) + /* Don't change sequence numbers while listening */ + if (frag_off == 0 && !s->d1->listen) { s->d1->handshake_write_seq = s->d1->next_handshake_write_seq; s->d1->next_handshake_write_seq++; diff --git a/ssl/d1_srvr.c b/ssl/d1_srvr.c index 301ceda7a5..27ca887dc8 100644 --- a/ssl/d1_srvr.c +++ b/ssl/d1_srvr.c @@ -278,6 +278,12 @@ int dtls1_accept(SSL *s) { ret = 2; s->d1->listen = 0; + /* Set expected sequence numbers + * to continue the handshake. + */ + s->d1->handshake_read_seq = 2; + s->d1->handshake_write_seq = 1; + s->d1->next_handshake_write_seq = 1; goto end; } @@ -736,9 +742,6 @@ int dtls1_send_hello_verify_request(SSL *s) /* number of bytes to write */ s->init_num=p-buf; s->init_off=0; - - /* buffer the message to handle re-xmits */ - dtls1_buffer_message(s, 0); } /* s->state = DTLS1_ST_SW_HELLO_VERIFY_REQUEST_B */ -- 2.25.1