From 60182ef9892acf4d5492fbb65545f8dc8c551484 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Manuel=20P=C3=A9gouri=C3=A9-Gonnard?= Date: Fri, 2 Aug 2013 14:44:54 +0200 Subject: [PATCH] ssl_cli: write & parse session ticket extension --- include/polarssl/ssl.h | 2 ++ library/ssl_cli.c | 56 ++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 58 insertions(+) diff --git a/include/polarssl/ssl.h b/include/polarssl/ssl.h index 2ffb549770..48263e554a 100644 --- a/include/polarssl/ssl.h +++ b/include/polarssl/ssl.h @@ -262,6 +262,8 @@ #define TLS_EXT_SIG_ALG 13 +#define TLS_EXT_SESSION_TICKET 35 + #define TLS_EXT_RENEGOTIATION_INFO 0xFF01 /* diff --git a/library/ssl_cli.c b/library/ssl_cli.c index 877d6cdddb..9b64c9a3de 100644 --- a/library/ssl_cli.c +++ b/library/ssl_cli.c @@ -315,6 +315,35 @@ static void ssl_write_truncated_hmac_ext( ssl_context *ssl, *olen = 4; } +static void ssl_write_session_ticket_ext( ssl_context *ssl, + unsigned char *buf, size_t *olen ) +{ + unsigned char *p = buf; + size_t tlen = ssl->session_negotiate->ticket_len; + + SSL_DEBUG_MSG( 3, ( "client hello, adding session ticket extension" ) ); + + *p++ = (unsigned char)( ( TLS_EXT_SESSION_TICKET >> 8 ) & 0xFF ); + *p++ = (unsigned char)( ( TLS_EXT_SESSION_TICKET ) & 0xFF ); + + *p++ = (unsigned char)( ( tlen >> 8 ) & 0xFF ); + *p++ = (unsigned char)( ( tlen ) & 0xFF ); + + *olen = 4; + + if( ssl->session_negotiate->ticket == NULL || + ssl->session_negotiate->ticket_len == 0 ) + { + return; + } + + SSL_DEBUG_MSG( 3, ( "sending session ticket of length %d", tlen ) ); + + memcpy( p, ssl->session_negotiate->ticket, tlen ); + + *olen += tlen; +} + static int ssl_write_client_hello( ssl_context *ssl ) { int ret; @@ -488,6 +517,9 @@ static int ssl_write_client_hello( ssl_context *ssl ) ssl_write_truncated_hmac_ext( ssl, p + 2 + ext_len, &olen ); ext_len += olen; + ssl_write_session_ticket_ext( ssl, p + 2 + ext_len, &olen ); + ext_len += olen; + SSL_DEBUG_MSG( 3, ( "client hello, total extension length: %d", ext_len ) ); @@ -587,6 +619,19 @@ static int ssl_parse_truncated_hmac_ext( ssl_context *ssl, return( 0 ); } +static int ssl_parse_session_ticket_ext( ssl_context *ssl, + const unsigned char *buf, + size_t len ) +{ + if( len != 0 ) + return( POLARSSL_ERR_SSL_BAD_HS_SERVER_HELLO ); + + ((void) buf); + ((void) ssl); + + return( 0 ); +} + static int ssl_parse_server_hello( ssl_context *ssl ) { uint32_t t; @@ -825,6 +870,17 @@ static int ssl_parse_server_hello( ssl_context *ssl ) break; + case TLS_EXT_SESSION_TICKET: + SSL_DEBUG_MSG( 3, ( "found session_ticket extension" ) ); + + if( ( ret = ssl_parse_session_ticket_ext( ssl, + ext + 4, ext_size ) ) != 0 ) + { + return( ret ); + } + + break; + default: SSL_DEBUG_MSG( 3, ( "unknown extension found: %d (ignoring)", ext_id ) );