mirror of
https://github.com/Mbed-TLS/mbedtls.git
synced 2025-02-04 15:39:53 +00:00
fix various issues
Signed-off-by: Jerry Yu <jerry.h.yu@arm.com>
This commit is contained in:
parent
da8cdf2fa9
commit
0b32c502a4
@ -218,57 +218,6 @@ int mbedtls_ssl_tls13_write_sig_alg_ext( mbedtls_ssl_context *ssl,
|
|||||||
return( 0 );
|
return( 0 );
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
|
||||||
* The ssl_tls13_create_verify_structure() creates the verify structure.
|
|
||||||
* As input, it requires the transcript hash.
|
|
||||||
*
|
|
||||||
* The caller has to ensure that the buffer has size at least
|
|
||||||
* SSL_VERIFY_STRUCT_MAX_SIZE bytes.
|
|
||||||
*/
|
|
||||||
static void ssl_tls13_create_verify_structure( unsigned char *transcript_hash,
|
|
||||||
size_t transcript_hash_len,
|
|
||||||
unsigned char *verify_buffer,
|
|
||||||
size_t *verify_buffer_len,
|
|
||||||
int from )
|
|
||||||
{
|
|
||||||
size_t idx;
|
|
||||||
|
|
||||||
/* RFC 8446, Section 4.4.3:
|
|
||||||
*
|
|
||||||
* The digital signature [in the CertificateVerify message] is then
|
|
||||||
* computed over the concatenation of:
|
|
||||||
* - A string that consists of octet 32 (0x20) repeated 64 times
|
|
||||||
* - The context string
|
|
||||||
* - A single 0 byte which serves as the separator
|
|
||||||
* - The content to be signed
|
|
||||||
*/
|
|
||||||
uint8_t const verify_padding_val = 0x20;
|
|
||||||
size_t const verify_padding_len = 64;
|
|
||||||
|
|
||||||
memset( verify_buffer, verify_padding_val, verify_padding_len );
|
|
||||||
idx = verify_padding_len;
|
|
||||||
|
|
||||||
if( from == MBEDTLS_SSL_IS_CLIENT )
|
|
||||||
{
|
|
||||||
memcpy( verify_buffer + idx, MBEDTLS_SSL_TLS1_3_LBL_WITH_LEN( client_cv ) );
|
|
||||||
idx += MBEDTLS_SSL_TLS1_3_LBL_LEN( client_cv );
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{ /* from == MBEDTLS_SSL_IS_SERVER */
|
|
||||||
memcpy( verify_buffer + idx, MBEDTLS_SSL_TLS1_3_LBL_WITH_LEN( server_cv ) );
|
|
||||||
idx += MBEDTLS_SSL_TLS1_3_LBL_LEN( server_cv );
|
|
||||||
}
|
|
||||||
|
|
||||||
verify_buffer[idx++] = 0x0;
|
|
||||||
|
|
||||||
memcpy( verify_buffer + idx, transcript_hash, transcript_hash_len );
|
|
||||||
idx += transcript_hash_len;
|
|
||||||
|
|
||||||
*verify_buffer_len = idx;
|
|
||||||
}
|
|
||||||
|
|
||||||
#endif /* MBEDTLS_KEY_EXCHANGE_WITH_CERT_ENABLED */
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* STATE HANDLING: Read CertificateVerify
|
* STATE HANDLING: Read CertificateVerify
|
||||||
*/
|
*/
|
||||||
@ -296,8 +245,52 @@ static void ssl_tls13_create_verify_structure( unsigned char *transcript_hash,
|
|||||||
MBEDTLS_TLS1_3_MD_MAX_SIZE \
|
MBEDTLS_TLS1_3_MD_MAX_SIZE \
|
||||||
)
|
)
|
||||||
|
|
||||||
|
/*
|
||||||
|
* The ssl_tls13_create_verify_structure() creates the verify structure.
|
||||||
|
* As input, it requires the transcript hash.
|
||||||
|
*
|
||||||
|
* The caller has to ensure that the buffer has size at least
|
||||||
|
* SSL_VERIFY_STRUCT_MAX_SIZE bytes.
|
||||||
|
*/
|
||||||
|
static void ssl_tls13_create_verify_structure( unsigned char *transcript_hash,
|
||||||
|
size_t transcript_hash_len,
|
||||||
|
unsigned char *verify_buffer,
|
||||||
|
size_t *verify_buffer_len,
|
||||||
|
int from )
|
||||||
|
{
|
||||||
|
size_t idx;
|
||||||
|
|
||||||
|
/* RFC 8446, Section 4.4.3:
|
||||||
|
*
|
||||||
|
* The digital signature [in the CertificateVerify message] is then
|
||||||
|
* computed over the concatenation of:
|
||||||
|
* - A string that consists of octet 32 (0x20) repeated 64 times
|
||||||
|
* - The context string
|
||||||
|
* - A single 0 byte which serves as the separator
|
||||||
|
* - The content to be signed
|
||||||
|
*/
|
||||||
|
memset( verify_buffer, 0x20, 64 );
|
||||||
|
idx = 64;
|
||||||
|
|
||||||
|
if( from == MBEDTLS_SSL_IS_CLIENT )
|
||||||
|
{
|
||||||
|
memcpy( verify_buffer + idx, MBEDTLS_SSL_TLS1_3_LBL_WITH_LEN( client_cv ) );
|
||||||
|
idx += MBEDTLS_SSL_TLS1_3_LBL_LEN( client_cv );
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{ /* from == MBEDTLS_SSL_IS_SERVER */
|
||||||
|
memcpy( verify_buffer + idx, MBEDTLS_SSL_TLS1_3_LBL_WITH_LEN( server_cv ) );
|
||||||
|
idx += MBEDTLS_SSL_TLS1_3_LBL_LEN( server_cv );
|
||||||
|
}
|
||||||
|
|
||||||
|
verify_buffer[idx++] = 0x0;
|
||||||
|
|
||||||
|
memcpy( verify_buffer + idx, transcript_hash, transcript_hash_len );
|
||||||
|
idx += transcript_hash_len;
|
||||||
|
|
||||||
|
*verify_buffer_len = idx;
|
||||||
|
}
|
||||||
|
|
||||||
#if defined(MBEDTLS_KEY_EXCHANGE_WITH_CERT_ENABLED)
|
|
||||||
static int ssl_tls13_sig_alg_is_offered( mbedtls_ssl_context *ssl, uint16_t sig_alg )
|
static int ssl_tls13_sig_alg_is_offered( mbedtls_ssl_context *ssl, uint16_t sig_alg )
|
||||||
{
|
{
|
||||||
const uint16_t *tls13_sig_alg = ssl->conf->tls13_sig_algs;
|
const uint16_t *tls13_sig_alg = ssl->conf->tls13_sig_algs;
|
||||||
@ -310,7 +303,7 @@ static int ssl_tls13_sig_alg_is_offered( mbedtls_ssl_context *ssl, uint16_t sig_
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int ssl_tls13_process_certificate_verify_parse( mbedtls_ssl_context *ssl,
|
static int ssl_tls13_parse_certificate_verify( mbedtls_ssl_context *ssl,
|
||||||
const unsigned char *buf,
|
const unsigned char *buf,
|
||||||
const unsigned char *end,
|
const unsigned char *end,
|
||||||
const unsigned char *verify_buffer,
|
const unsigned char *verify_buffer,
|
||||||
@ -350,7 +343,7 @@ static int ssl_tls13_process_certificate_verify_parse( mbedtls_ssl_context *ssl,
|
|||||||
* Check if algorithm in offered signature algorithms. Send `unsupported_certificate`
|
* Check if algorithm in offered signature algorithms. Send `unsupported_certificate`
|
||||||
* alert message on failure.
|
* alert message on failure.
|
||||||
*/
|
*/
|
||||||
if( ssl_tls13_sig_alg_is_offered( ssl, algorithm ) == 0 )
|
if( ! ssl_tls13_sig_alg_is_offered( ssl, algorithm ) )
|
||||||
{
|
{
|
||||||
/* algorithm not in offered signature algorithms list */
|
/* algorithm not in offered signature algorithms list */
|
||||||
MBEDTLS_SSL_DEBUG_MSG( 1, ( "Received signature algorithm(%04x) is not "
|
MBEDTLS_SSL_DEBUG_MSG( 1, ( "Received signature algorithm(%04x) is not "
|
||||||
@ -430,11 +423,8 @@ static int ssl_tls13_process_certificate_verify_parse( mbedtls_ssl_context *ssl,
|
|||||||
#endif /* MBEDTLS_SHA512_C */
|
#endif /* MBEDTLS_SHA512_C */
|
||||||
|
|
||||||
default:
|
default:
|
||||||
MBEDTLS_SSL_DEBUG_MSG( 1, ( "Certificate Verify: Unknown signature algorithm." ) );
|
ret = MBEDTLS_ERR_SSL_HANDSHAKE_FAILURE;
|
||||||
MBEDTLS_SSL_PEND_FATAL_ALERT(
|
break;
|
||||||
MBEDTLS_SSL_ALERT_MSG_UNSUPPORTED_CERT,
|
|
||||||
MBEDTLS_ERR_SSL_HANDSHAKE_FAILURE );
|
|
||||||
return( MBEDTLS_ERR_SSL_HANDSHAKE_FAILURE );
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if( ret != 0 )
|
if( ret != 0 )
|
||||||
@ -481,13 +471,6 @@ int mbedtls_ssl_tls13_process_certificate_verify( mbedtls_ssl_context *ssl )
|
|||||||
unsigned char *buf;
|
unsigned char *buf;
|
||||||
size_t buf_len;
|
size_t buf_len;
|
||||||
|
|
||||||
if( mbedtls_ssl_tls1_3_some_psk_enabled( ssl ) )
|
|
||||||
return( MBEDTLS_ERR_SSL_INTERNAL_ERROR );
|
|
||||||
|
|
||||||
if( ssl->session_negotiate->peer_cert == NULL )
|
|
||||||
return( MBEDTLS_ERR_SSL_INTERNAL_ERROR );
|
|
||||||
|
|
||||||
|
|
||||||
MBEDTLS_SSL_DEBUG_MSG( 2, ( "=> parse certificate verify" ) );
|
MBEDTLS_SSL_DEBUG_MSG( 2, ( "=> parse certificate verify" ) );
|
||||||
|
|
||||||
MBEDTLS_SSL_PROC_CHK(
|
MBEDTLS_SSL_PROC_CHK(
|
||||||
@ -517,12 +500,13 @@ int mbedtls_ssl_tls13_process_certificate_verify( mbedtls_ssl_context *ssl )
|
|||||||
transcript_len,
|
transcript_len,
|
||||||
verify_buffer,
|
verify_buffer,
|
||||||
&verify_buffer_len,
|
&verify_buffer_len,
|
||||||
!ssl->conf->endpoint );
|
( ssl->conf->endpoint == MBEDTLS_SSL_IS_CLIENT ) ?
|
||||||
|
MBEDTLS_SSL_IS_SERVER :
|
||||||
|
MBEDTLS_SSL_IS_CLIENT );
|
||||||
|
|
||||||
/* Process the message contents */
|
/* Process the message contents */
|
||||||
MBEDTLS_SSL_PROC_CHK(
|
MBEDTLS_SSL_PROC_CHK( ssl_tls13_parse_certificate_verify( ssl, buf,
|
||||||
ssl_tls13_process_certificate_verify_parse( ssl,
|
buf + buf_len, verify_buffer, verify_buffer_len ) );
|
||||||
buf, buf + buf_len, verify_buffer, verify_buffer_len ) );
|
|
||||||
|
|
||||||
mbedtls_ssl_tls1_3_add_hs_msg_to_checksum( ssl,
|
mbedtls_ssl_tls1_3_add_hs_msg_to_checksum( ssl,
|
||||||
MBEDTLS_SSL_HS_CERTIFICATE_VERIFY, buf, buf_len );
|
MBEDTLS_SSL_HS_CERTIFICATE_VERIFY, buf, buf_len );
|
||||||
|
Loading…
x
Reference in New Issue
Block a user