diff --git a/library/ssl_misc.h b/library/ssl_misc.h index 2408fd1211..1eccb5e97b 100644 --- a/library/ssl_misc.h +++ b/library/ssl_misc.h @@ -1070,6 +1070,9 @@ int mbedtls_ssl_handshake_client_step( mbedtls_ssl_context *ssl ); int mbedtls_ssl_handshake_server_step( mbedtls_ssl_context *ssl ); void mbedtls_ssl_handshake_wrapup( mbedtls_ssl_context *ssl ); #if defined(MBEDTLS_SSL_PROTO_TLS1_3_EXPERIMENTAL) + +void mbedtls_ssl_tls13_handshake_wrapup( mbedtls_ssl_context *ssl ); + /** * \brief TLS 1.3 client side state machine entry * diff --git a/library/ssl_tls13_client.c b/library/ssl_tls13_client.c index a2e5f33a0d..d848415316 100644 --- a/library/ssl_tls13_client.c +++ b/library/ssl_tls13_client.c @@ -1636,7 +1636,7 @@ static int ssl_tls13_write_client_finished( mbedtls_ssl_context *ssl ) */ static int ssl_tls1_3_flush_buffers( mbedtls_ssl_context *ssl ) { - MBEDTLS_SSL_DEBUG_MSG( 1, ( "%s hasn't been implemented", __func__ ) ); + MBEDTLS_SSL_DEBUG_MSG( 2, ( "handshake: done" ) ); mbedtls_ssl_handshake_set_state( ssl, MBEDTLS_SSL_HANDSHAKE_WRAPUP ); return( 0 ); } @@ -1646,9 +1646,16 @@ static int ssl_tls1_3_flush_buffers( mbedtls_ssl_context *ssl ) */ static int ssl_tls1_3_handshake_wrapup( mbedtls_ssl_context *ssl ) { - ((void) ssl); - MBEDTLS_SSL_DEBUG_MSG( 1, ( "%s hasn't been implemented", __func__ ) ); - return( MBEDTLS_ERR_SSL_FEATURE_UNAVAILABLE ); + MBEDTLS_SSL_DEBUG_MSG( 1, ( "Switch to application keys for inbound traffic" ) ); + mbedtls_ssl_set_inbound_transform ( ssl, ssl->transform_application ); + + MBEDTLS_SSL_DEBUG_MSG( 1, ( "Switch to application keys for outbound traffic" ) ); + mbedtls_ssl_set_outbound_transform( ssl, ssl->transform_application ); + + mbedtls_ssl_tls13_handshake_wrapup( ssl ); + + mbedtls_ssl_handshake_set_state( ssl, MBEDTLS_SSL_HANDSHAKE_OVER ); + return( 0 ); } int mbedtls_ssl_tls13_handshake_client_step( mbedtls_ssl_context *ssl ) diff --git a/library/ssl_tls13_generic.c b/library/ssl_tls13_generic.c index f17bf994c2..48678ff8ea 100644 --- a/library/ssl_tls13_generic.c +++ b/library/ssl_tls13_generic.c @@ -1103,6 +1103,26 @@ cleanup: return( ret ); } +void mbedtls_ssl_tls13_handshake_wrapup( mbedtls_ssl_context *ssl ) +{ + + MBEDTLS_SSL_DEBUG_MSG( 3, ( "=> handshake wrapup" ) ); + + /* + * Free the previous session and switch in the current one + */ + if( ssl->session ) + { + + mbedtls_ssl_session_free( ssl->session ); + mbedtls_free( ssl->session ); + } + ssl->session = ssl->session_negotiate; + ssl->session_negotiate = NULL; + + MBEDTLS_SSL_DEBUG_MSG( 3, ( "<= handshake wrapup" ) ); +} + #endif /* MBEDTLS_SSL_PROTO_TLS1_3_EXPERIMENTAL */ #endif /* MBEDTLS_SSL_TLS_C */