From f0e39acb58990d7fe659770674261cd6829bdc02 Mon Sep 17 00:00:00 2001 From: Paul Bakker Date: Thu, 15 Aug 2013 11:40:48 +0200 Subject: [PATCH 1/2] Fixed unitialized n when resuming a session --- library/ssl_srv.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/library/ssl_srv.c b/library/ssl_srv.c index 0dbcdb5ed..9ae25f5f7 100644 --- a/library/ssl_srv.c +++ b/library/ssl_srv.c @@ -1484,7 +1484,7 @@ static int ssl_write_server_hello( ssl_context *ssl ) } else { - ssl->session_negotiate->length = 0; + ssl->session_negotiate->length = n = 0; memset( ssl->session_negotiate->id, 0, 32 ); } #else @@ -1499,6 +1499,7 @@ static int ssl_write_server_hello( ssl_context *ssl ) /* * Resuming a session */ + n = ssl->session_negotiate->length; ssl->state = SSL_SERVER_CHANGE_CIPHER_SPEC; if( ( ret = ssl_derive_keys( ssl ) ) != 0 ) From 606b4ba20f0d95d4fd3d0965601b3aaa380c744d Mon Sep 17 00:00:00 2001 From: Paul Bakker Date: Wed, 14 Aug 2013 16:52:14 +0200 Subject: [PATCH 2/2] Session ticket expiration checked on server --- include/polarssl/config.h | 1 + include/polarssl/error.h | 2 +- include/polarssl/ssl.h | 17 +++++++++++++++++ library/error.c | 2 ++ library/ssl_srv.c | 10 ++++++++++ library/ssl_tls.c | 11 +++++++++++ 6 files changed, 42 insertions(+), 1 deletion(-) diff --git a/include/polarssl/config.h b/include/polarssl/config.h index 6fa95c433..22faf0438 100644 --- a/include/polarssl/config.h +++ b/include/polarssl/config.h @@ -1332,6 +1332,7 @@ // SSL options // #define SSL_MAX_CONTENT_LEN 16384 /**< Size of the input / output buffer */ +#define SSL_DEFAULT_TICKET_LIFETIME 86400 /**< Lifetime of session tickets (if enabled) */ #endif /* POLARSSL_CONFIG_OPTIONS */ diff --git a/include/polarssl/error.h b/include/polarssl/error.h index 48de009ee..45a66401a 100644 --- a/include/polarssl/error.h +++ b/include/polarssl/error.h @@ -84,7 +84,7 @@ * ECP 4 4 (Started from top) * MD 5 4 * CIPHER 6 5 - * SSL 6 4 (Started from top) + * SSL 6 5 (Started from top) * SSL 7 31 * * Module dependent error code (5 bits 0x.08.-0x.F8.) diff --git a/include/polarssl/ssl.h b/include/polarssl/ssl.h index f45d00e55..ed11e1e4a 100644 --- a/include/polarssl/ssl.h +++ b/include/polarssl/ssl.h @@ -109,6 +109,7 @@ #define POLARSSL_ERR_SSL_COMPRESSION_FAILED -0x6F00 /**< Processing of the compression / decompression failed */ #define POLARSSL_ERR_SSL_BAD_HS_PROTOCOL_VERSION -0x6E80 /**< Handshake protocol not within min/max boundaries */ #define POLARSSL_ERR_SSL_BAD_HS_NEW_SESSION_TICKET -0x6E00 /**< Processing of the NewSessionTicket handshake message failed. */ +#define POLARSSL_ERR_SSL_SESSION_TICKET_EXPIRED -0x6D80 /**< Session ticket has expired. */ /* @@ -158,6 +159,10 @@ #define SSL_SESSION_TICKETS_DISABLED 0 #define SSL_SESSION_TICKETS_ENABLED 1 +#if !defined(POLARSSL_CONFIG_OPTIONS) +#define SSL_DEFAULT_TICKET_LIFETIME 86400 /**< Lifetime of session tickets (if enabled) */ +#endif /* !POLARSSL_CONFIG_OPTIONS */ + /* * Size of the input / output buffer. * Note: the RFC defines the default size of SSL / TLS messages. If you @@ -592,7 +597,10 @@ struct _ssl_context int allow_legacy_renegotiation; /*!< allow legacy renegotiation */ const int *ciphersuite_list[4]; /*!< allowed ciphersuites / version */ int trunc_hmac; /*!< negotiate truncated hmac? */ +#if defined(POLARSSL_SSL_SESSION_TICKETS) int session_tickets; /*!< use session tickets? */ + int ticket_lifetime; /*!< session ticket lifetime */ +#endif #if defined(POLARSSL_DHM_C) mpi dhm_P; /*!< prime modulus for DHM */ @@ -1065,6 +1073,15 @@ int ssl_set_truncated_hmac( ssl_context *ssl, int truncate ); * or a specific error code (server only). */ int ssl_set_session_tickets( ssl_context *ssl, int use_tickets ); + +/** + * \brief Set session ticket lifetime (server only) + * (Default: SSL_DEFAULT_TICKET_LIFETIME (86400 secs / 1 day)) + * + * \param ssl SSL context + * \param lifetime session ticket lifetime + */ +void ssl_set_session_ticket_lifetime( ssl_context *ssl, int lifetime ); #endif /* POLARSSL_SSL_SESSION_TICKETS */ /** diff --git a/library/error.c b/library/error.c index 94d8dc11d..23f4a85d7 100644 --- a/library/error.c +++ b/library/error.c @@ -371,6 +371,8 @@ void polarssl_strerror( int ret, char *buf, size_t buflen ) snprintf( buf, buflen, "SSL - Handshake protocol not within min/max boundaries" ); if( use_ret == -(POLARSSL_ERR_SSL_BAD_HS_NEW_SESSION_TICKET) ) snprintf( buf, buflen, "SSL - Processing of the NewSessionTicket handshake message failed" ); + if( use_ret == -(POLARSSL_ERR_SSL_SESSION_TICKET_EXPIRED) ) + snprintf( buf, buflen, "SSL - Session ticket has expired" ); #endif /* POLARSSL_SSL_TLS_C */ #if defined(POLARSSL_X509_PARSE_C) diff --git a/library/ssl_srv.c b/library/ssl_srv.c index 9ae25f5f7..7de15779a 100644 --- a/library/ssl_srv.c +++ b/library/ssl_srv.c @@ -288,6 +288,16 @@ static int ssl_parse_ticket( ssl_context *ssl, return( ret ); } +#if defined(POLARSSL_HAVE_TIME) + /* Check if still valid */ + if( (int) ( time( NULL) - session.start ) > ssl->ticket_lifetime ) + { + SSL_DEBUG_MSG( 1, ( "session ticket expired" ) ); + memset( &session, 0, sizeof( ssl_session ) ); + return( POLARSSL_ERR_SSL_SESSION_TICKET_EXPIRED ); + } +#endif + /* * Keep the session ID sent by the client, since we MUST send it back to * inform him we're accepting the ticket (RFC 5077 section 3.4) diff --git a/library/ssl_tls.c b/library/ssl_tls.c index 2585d6e23..bb605b91a 100644 --- a/library/ssl_tls.c +++ b/library/ssl_tls.c @@ -2898,6 +2898,10 @@ int ssl_init( ssl_context *ssl ) ssl->hostname = NULL; ssl->hostname_len = 0; +#if defined(POLARSSL_SSL_SESSION_TICKETS) + ssl->ticket_lifetime = SSL_DEFAULT_TICKET_LIFETIME; +#endif + if( ( ret = ssl_handshake_init( ssl ) ) != 0 ) return( ret ); @@ -3016,8 +3020,10 @@ void ssl_set_endpoint( ssl_context *ssl, int endpoint ) { ssl->endpoint = endpoint; +#if defined(POLARSSL_SSL_SESSION_TICKETS) if( endpoint == SSL_IS_CLIENT ) ssl->session_tickets = SSL_SESSION_TICKETS_ENABLED; +#endif } void ssl_set_authmode( ssl_context *ssl, int authmode ) @@ -3278,6 +3284,11 @@ int ssl_set_session_tickets( ssl_context *ssl, int use_tickets ) return( ssl_ticket_keys_init( ssl ) ); } + +void ssl_set_session_ticket_lifetime( ssl_context *ssl, int lifetime ) +{ + ssl->ticket_lifetime = lifetime; +} #endif /* POLARSSL_SSL_SESSION_TICKETS */ /*