From 6d8404d6ba64aef87aaebf56db37779354e96acb Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Manuel=20P=C3=A9gouri=C3=A9-Gonnard?= Date: Wed, 30 Oct 2013 16:41:45 +0100 Subject: [PATCH] Server: enforce renegotiation --- include/polarssl/ssl.h | 1 + library/ssl_tls.c | 8 ++++++++ programs/ssl/ssl_server2.c | 7 ++++++- 3 files changed, 15 insertions(+), 1 deletion(-) diff --git a/include/polarssl/ssl.h b/include/polarssl/ssl.h index 50ff9864e..e5ca9d571 100644 --- a/include/polarssl/ssl.h +++ b/include/polarssl/ssl.h @@ -202,6 +202,7 @@ #define SSL_INITIAL_HANDSHAKE 0 #define SSL_RENEGOTIATION 1 /* In progress */ #define SSL_RENEGOTIATION_DONE 2 /* Done */ +#define SSL_RENEGOTIATION_PENDING 3 /* Requested (server only) */ #define SSL_LEGACY_RENEGOTIATION 0 #define SSL_SECURE_RENEGOTIATION 1 diff --git a/library/ssl_tls.c b/library/ssl_tls.c index 94d9edf27..1205947bb 100644 --- a/library/ssl_tls.c +++ b/library/ssl_tls.c @@ -3990,6 +3990,8 @@ static int ssl_write_hello_request( ssl_context *ssl ) return( ret ); } + ssl->renegotiation = SSL_RENEGOTIATION_PENDING; + SSL_DEBUG_MSG( 2, ( "<= write hello request" ) ); return( 0 ); @@ -4175,6 +4177,12 @@ int ssl_read( ssl_context *ssl, unsigned char *buf, size_t len ) return( POLARSSL_ERR_NET_WANT_READ ); } } + else if( ssl->renegotiation == SSL_RENEGOTIATION_PENDING ) + { + SSL_DEBUG_MSG( 1, ( "renegotiation requested, " + "but not honored by client" ) ); + return( POLARSSL_ERR_SSL_UNEXPECTED_MESSAGE ); + } else if( ssl->in_msgtype != SSL_MSG_APPLICATION_DATA ) { SSL_DEBUG_MSG( 1, ( "bad application data message" ) ); diff --git a/programs/ssl/ssl_server2.c b/programs/ssl/ssl_server2.c index d35ab77d7..2a046a77f 100644 --- a/programs/ssl/ssl_server2.c +++ b/programs/ssl/ssl_server2.c @@ -967,7 +967,12 @@ reset: if( ret != POLARSSL_ERR_NET_WANT_READ && ret != POLARSSL_ERR_NET_WANT_WRITE ) { printf( " failed\n ! ssl_read returned %d\n\n", ret ); - goto exit; + + /* Unexpected message probably means client didn't renegotiate */ + if( ret == POLARSSL_ERR_SSL_UNEXPECTED_MESSAGE ) + goto reset; + else + goto exit; } }