Fix client-initiated renegotiation with DTLS
diff --git a/library/ssl_srv.c b/library/ssl_srv.c
index fbdf984..e97bd2a 100644
--- a/library/ssl_srv.c
+++ b/library/ssl_srv.c
@@ -1253,6 +1253,14 @@
SSL_DEBUG_RET( 1, "ssl_fetch_input", ret );
return( ret );
}
+
+ /* Done reading this record, get ready for the next one */
+#if defined(POLARSSL_SSL_PROTO_DTLS)
+ if( ssl->transport == SSL_TRANSPORT_DATAGRAM )
+ ssl->next_record_offset = msg_len + ssl_hdr_len( ssl );
+ else
+#endif
+ ssl->in_left = 0;
}
else
{
@@ -1441,7 +1449,8 @@
buf + cookie_offset + 1, cookie_len );
#if defined(POLARSSL_SSL_DTLS_HELLO_VERIFY)
- if( ssl->f_cookie_check != NULL )
+ if( ssl->f_cookie_check != NULL &&
+ ssl->renegotiation == SSL_INITIAL_HANDSHAKE )
{
if( ssl->f_cookie_check( ssl->p_cookie,
buf + cookie_offset + 1, cookie_len,
@@ -1784,8 +1793,6 @@
ssl->transform_negotiate->ciphersuite_info = ciphersuite_info;
ssl_optimize_checksum( ssl, ssl->transform_negotiate->ciphersuite_info );
- /* ClientHello can't be bundled with another record in same datagram */
- ssl->in_left = 0;
ssl->state++;
SSL_DEBUG_MSG( 2, ( "<= parse client hello" ) );
diff --git a/library/ssl_tls.c b/library/ssl_tls.c
index a2539d7..977a5b2 100644
--- a/library/ssl_tls.c
+++ b/library/ssl_tls.c
@@ -2141,7 +2141,8 @@
* TLS handshake format to other functions.
*/
#if defined(POLARSSL_SSL_PROTO_DTLS)
- if( ssl->transport == SSL_TRANSPORT_DATAGRAM )
+ if( ssl->transport == SSL_TRANSPORT_DATAGRAM &&
+ ssl->state != SSL_HANDSHAKE_OVER )
{
// TODO: DTLS: check message_seq
@@ -2289,11 +2290,13 @@
return( ret );
}
-#if defined(POLARSSL_SSL_PROTO_DTLS)
/* Done reading this record, get ready for the next one */
+#if defined(POLARSSL_SSL_PROTO_DTLS)
if( ssl->transport == SSL_TRANSPORT_DATAGRAM )
ssl->next_record_offset = ssl->in_msglen + ssl_hdr_len( ssl );
+ else
#endif
+ ssl->in_left = 0;
SSL_DEBUG_BUF( 4, "input record from network",
ssl->in_hdr, ssl_hdr_len( ssl ) + ssl->in_msglen );
@@ -2402,12 +2405,6 @@
}
}
- /* With DTLS there might be other records in the same datagram */
-#if defined(POLARSSL_SSL_PROTO_DTLS)
- if( ssl->transport != SSL_TRANSPORT_DATAGRAM )
-#endif
- ssl->in_left = 0;
-
SSL_DEBUG_MSG( 2, ( "<= read record" ) );
return( 0 );
diff --git a/tests/ssl-opt.sh b/tests/ssl-opt.sh
index 1456338..cea5790 100755
--- a/tests/ssl-opt.sh
+++ b/tests/ssl-opt.sh
@@ -855,6 +855,19 @@
-C "error" \
-c "HTTP/1.0 200 [Oo][Kk]"
+run_test "Renegotiation: DTLS, client-initiated" \
+ "$P_SRV debug_level=3 dtls=1 exchanges=2 renegotiation=1" \
+ "$P_CLI debug_level=3 dtls=1 exchanges=2 renegotiation=1 renegotiate=1" \
+ 0 \
+ -c "client hello, adding renegotiation extension" \
+ -s "received TLS_EMPTY_RENEGOTIATION_INFO" \
+ -s "found renegotiation extension" \
+ -s "server hello, secure renegotiation extension" \
+ -c "found renegotiation extension" \
+ -c "=> renegotiate" \
+ -s "=> renegotiate" \
+ -S "write hello request"
+
# Tests for auth_mode
run_test "Authentication: server badcert, client required" \