mirror of
				https://github.com/cuberite/polarssl.git
				synced 2025-11-04 04:32:24 -05: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