From ff2269889d2460663d3998454ede15009c7feb19 Mon Sep 17 00:00:00 2001 From: Jerry Yu Date: Sat, 16 Apr 2022 16:52:57 +0800 Subject: [PATCH] Add client finished Signed-off-by: Jerry Yu --- library/ssl_tls13_generic.c | 17 +++++++++++++++++ library/ssl_tls13_keys.c | 9 +++++++++ library/ssl_tls13_keys.h | 13 +++++++++++++ library/ssl_tls13_server.c | 13 +++++++++++-- 4 files changed, 50 insertions(+), 2 deletions(-) diff --git a/library/ssl_tls13_generic.c b/library/ssl_tls13_generic.c index f5e38abf53..b687ad125e 100644 --- a/library/ssl_tls13_generic.c +++ b/library/ssl_tls13_generic.c @@ -1182,6 +1182,23 @@ cleanup: static int ssl_tls13_postprocess_finished_message( mbedtls_ssl_context *ssl ) { +#if defined(MBEDTLS_SSL_SRV_C) + int ret; + if( ssl->conf->endpoint == MBEDTLS_SSL_IS_SERVER ) + { + /* Compute resumption_master_secret */ + ret = mbedtls_ssl_tls13_generate_resumption_master_secret( ssl ); + if( ret != 0 ) + { + MBEDTLS_SSL_DEBUG_RET( 1, + "mbedtls_ssl_tls13_generate_resumption_master_secret ", ret ); + return( ret ); + } + + return( 0 ); + } +#endif /* MBEDTLS_SSL_SRV_C */ + #if defined(MBEDTLS_SSL_CLI_C) if( ssl->conf->endpoint == MBEDTLS_SSL_IS_CLIENT ) { diff --git a/library/ssl_tls13_keys.c b/library/ssl_tls13_keys.c index 072c8693ad..3e62617a07 100644 --- a/library/ssl_tls13_keys.c +++ b/library/ssl_tls13_keys.c @@ -1565,4 +1565,13 @@ cleanup: return( ret ); } +int mbedtls_ssl_tls13_generate_resumption_master_secret( + mbedtls_ssl_context *ssl ) +{ + /* Erase master secrets */ + mbedtls_platform_zeroize( &ssl->handshake->tls13_master_secrets, + sizeof( ssl->handshake->tls13_master_secrets ) ); + return( 0 ); +} + #endif /* MBEDTLS_SSL_PROTO_TLS1_3 */ diff --git a/library/ssl_tls13_keys.h b/library/ssl_tls13_keys.h index 676ebae8d0..479bb4e27b 100644 --- a/library/ssl_tls13_keys.h +++ b/library/ssl_tls13_keys.h @@ -610,6 +610,19 @@ int mbedtls_ssl_tls13_key_schedule_stage_application( mbedtls_ssl_context *ssl ) int mbedtls_ssl_tls13_generate_application_keys( mbedtls_ssl_context* ssl, mbedtls_ssl_key_set *traffic_keys ); +/** + * \brief Compute TLS 1.3 resumption master secret. + * + * \param ssl The SSL context to operate on. This must be in + * key schedule stage \c Application, see + * mbedtls_ssl_tls13_key_schedule_stage_application(). + * + * \returns \c 0 on success. + * \returns A negative error code on failure. + */ +int mbedtls_ssl_tls13_generate_resumption_master_secret( + mbedtls_ssl_context* ssl ); + /** * \brief Calculate the verify_data value for the client or server TLS 1.3 * Finished message. diff --git a/library/ssl_tls13_server.c b/library/ssl_tls13_server.c index c9d7ececc1..df3221d8bb 100644 --- a/library/ssl_tls13_server.c +++ b/library/ssl_tls13_server.c @@ -1496,8 +1496,17 @@ int ssl_tls13_write_server_finished( mbedtls_ssl_context *ssl ) */ int ssl_tls13_process_client_finished( mbedtls_ssl_context *ssl ) { - ((void) ssl); - return( MBEDTLS_ERR_SSL_FEATURE_UNAVAILABLE ); + int ret; + MBEDTLS_SSL_DEBUG_MSG( 1, + ( "Switch to handshake traffic keys for outbound traffic" ) ); + mbedtls_ssl_set_inbound_transform( ssl, ssl->handshake->transform_handshake ); + ret = mbedtls_ssl_tls13_process_finished_message( ssl ); + if( ret != 0 ) + return( ret ); + + mbedtls_ssl_handshake_set_state( ssl, MBEDTLS_SSL_FLUSH_BUFFERS ); + return( 0 ); + } /*