diff --git a/library/ssl_msg.c b/library/ssl_msg.c index 3795c65475..3c7700bab3 100644 --- a/library/ssl_msg.c +++ b/library/ssl_msg.c @@ -2560,9 +2560,15 @@ int mbedtls_ssl_write_record( mbedtls_ssl_context *ssl, uint8_t force_flush ) #endif /* Skip writing the record content type to after the encryption, * as it may change when using the CID extension. */ - - mbedtls_ssl_write_version( ssl->major_ver, ssl->minor_ver, - ssl->conf->transport, ssl->out_hdr + 1 ); + int minor_ver = ssl->minor_ver; +#if defined(MBEDTLS_SSL_PROTO_TLS1_3_EXPERIMENTAL) + /* TLS 1.3 still uses the TLS 1.2 version identifier + * for backwards compatibility. */ + if( minor_ver == MBEDTLS_SSL_MINOR_VERSION_4 ) + minor_ver = MBEDTLS_SSL_MINOR_VERSION_3; +#endif /* MBEDTLS_SSL_PROTO_TLS1_3_EXPERIMENTAL */ + mbedtls_ssl_write_version( ssl->major_ver, minor_ver, + ssl->conf->transport, ssl->out_hdr + 1 ); memcpy( ssl->out_ctr, ssl->cur_out_ctr, MBEDTLS_SSL_SEQUENCE_NUMBER_LEN ); MBEDTLS_PUT_UINT16_BE( len, ssl->out_len, 0); @@ -2577,7 +2583,7 @@ int mbedtls_ssl_write_record( mbedtls_ssl_context *ssl, uint8_t force_flush ) rec.data_offset = ssl->out_msg - rec.buf; memcpy( &rec.ctr[0], ssl->out_ctr, sizeof( rec.ctr ) ); - mbedtls_ssl_write_version( ssl->major_ver, ssl->minor_ver, + mbedtls_ssl_write_version( ssl->major_ver, minor_ver, ssl->conf->transport, rec.ver ); rec.type = ssl->out_msgtype; diff --git a/library/ssl_tls.c b/library/ssl_tls.c index d604f38cee..48a6369b7a 100644 --- a/library/ssl_tls.c +++ b/library/ssl_tls.c @@ -5551,8 +5551,13 @@ void mbedtls_ssl_handshake_free( mbedtls_ssl_context *ssl ) psa_destroy_key( handshake->ecdh_psa_privkey ); #endif /* MBEDTLS_ECDH_C && MBEDTLS_USE_PSA_CRYPTO */ - mbedtls_platform_zeroize( handshake, - sizeof( mbedtls_ssl_handshake_params ) ); +#if defined(MBEDTLS_SSL_PROTO_TLS1_3_EXPERIMENTAL) + mbedtls_ssl_transform_free( handshake->transform_handshake ); + mbedtls_ssl_transform_free( handshake->transform_earlydata ); + mbedtls_free( handshake->transform_earlydata ); + mbedtls_free( handshake->transform_handshake ); +#endif /* MBEDTLS_SSL_PROTO_TLS1_3_EXPERIMENTAL */ + #if defined(MBEDTLS_SSL_VARIABLE_BUFFER_LENGTH) /* If the buffers are too big - reallocate. Because of the way Mbed TLS @@ -5563,12 +5568,9 @@ void mbedtls_ssl_handshake_free( mbedtls_ssl_context *ssl ) mbedtls_ssl_get_output_buflen( ssl ) ); #endif -#if defined(MBEDTLS_SSL_PROTO_TLS1_3_EXPERIMENTAL) - mbedtls_free( handshake->transform_earlydata ); - mbedtls_free( handshake->transform_handshake ); - handshake->transform_earlydata = NULL; - handshake->transform_handshake = NULL; -#endif /* MBEDTLS_SSL_PROTO_TLS1_3_EXPERIMENTAL */ + /* mbedtls_platform_zeroize MUST be last one in this function */ + mbedtls_platform_zeroize( handshake, + sizeof( mbedtls_ssl_handshake_params ) ); } void mbedtls_ssl_session_free( mbedtls_ssl_session *session )