mirror of
				https://github.com/yuzu-emu/mbedtls.git
				synced 2025-11-04 14:45:08 +00:00 
			
		
		
		
	Add olen parameter to ecp_ansi_write_group and ecp_ansi_write_point
Improve mbedtls_ecp_ansi_write_point
This commit is contained in:
		
							parent
							
								
									a2c406286a
								
							
						
					
					
						commit
						dc3111e6d9
					
				| 
						 | 
				
			
			@ -515,13 +515,14 @@ int mbedtls_ecp_tls_write_group( const mbedtls_ecp_group *grp, size_t *olen,
 | 
			
		|||
 * \param grp       ECP group used
 | 
			
		||||
 * \param buf       Buffer to write to
 | 
			
		||||
 * \param size      Buffer size
 | 
			
		||||
 *
 | 
			
		||||
 * \return          Number of bytes written to \c buf,
 | 
			
		||||
 * \param olen      Number of bytes written to \c buf
 | 
			
		||||
 * \return          0 on success
 | 
			
		||||
 *                  or \c MBEDTLS_ERR_ECP_BUFFER_TOO_SMALL
 | 
			
		||||
 *                  or \c MBEDTLS_ERR_OID_NOT_FOUND
 | 
			
		||||
 */
 | 
			
		||||
int mbedtls_ecp_ansi_write_group( const mbedtls_ecp_group *grp,
 | 
			
		||||
                                  unsigned char *p, size_t size );
 | 
			
		||||
                                  unsigned char *p, size_t size,
 | 
			
		||||
                                  size_t *olen );
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * \brief           Export a point in ANSI X9.62/RFC5480 ECPoint
 | 
			
		||||
| 
						 | 
				
			
			@ -533,8 +534,9 @@ int mbedtls_ecp_ansi_write_group( const mbedtls_ecp_group *grp,
 | 
			
		|||
 * \param format    Point format, should be a MBEDTLS_ECP_PF_XXX macro
 | 
			
		||||
 * \param p         Buffer to write to
 | 
			
		||||
 * \param size      Buffer size
 | 
			
		||||
 * \param olen      Number of bytes written to \c buf
 | 
			
		||||
 *
 | 
			
		||||
 * \return          Number of bytes written to \c buf,
 | 
			
		||||
 * \return          0 on success
 | 
			
		||||
 *                  or \c MBEDTLS_ERR_ECP_BUFFER_TOO_SMALL
 | 
			
		||||
 *                  or \c MBEDTLS_ERR_ECP_BAD_INPUT_DATA
 | 
			
		||||
 *                  or \c MBEDTLS_ERR_ASN1_BUF_TOO_SMALL
 | 
			
		||||
| 
						 | 
				
			
			@ -542,7 +544,7 @@ int mbedtls_ecp_ansi_write_group( const mbedtls_ecp_group *grp,
 | 
			
		|||
int mbedtls_ecp_ansi_write_point( const mbedtls_ecp_keypair *ec,
 | 
			
		||||
                                  int format,
 | 
			
		||||
                                  unsigned char *p,
 | 
			
		||||
                                  size_t size );
 | 
			
		||||
                                  size_t size, size_t *olen );
 | 
			
		||||
#endif /* defined(MBEDTLS_ASN1_WRITE_C) && defined(MBEDTLS_OID_C) */
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -2066,12 +2066,13 @@ cleanup:
 | 
			
		|||
#include "mbedtls/oid.h"
 | 
			
		||||
int mbedtls_ecp_ansi_write_group( const mbedtls_ecp_group *grp,
 | 
			
		||||
                                  unsigned char *p,
 | 
			
		||||
                                  size_t size )
 | 
			
		||||
                                  size_t size, size_t *olen )
 | 
			
		||||
{
 | 
			
		||||
    const char *oid;
 | 
			
		||||
    unsigned char *q;
 | 
			
		||||
    size_t oid_length;
 | 
			
		||||
    int ret;
 | 
			
		||||
 | 
			
		||||
    ret = mbedtls_oid_get_oid_by_ec_grp( grp->id, &oid, &oid_length );
 | 
			
		||||
    if( ret != 0 )
 | 
			
		||||
        return( ret );
 | 
			
		||||
| 
						 | 
				
			
			@ -2079,36 +2080,38 @@ int mbedtls_ecp_ansi_write_group( const mbedtls_ecp_group *grp,
 | 
			
		|||
    if( size < 2 + oid_length )
 | 
			
		||||
        return( MBEDTLS_ERR_ECP_BUFFER_TOO_SMALL );
 | 
			
		||||
    q = p + 2 + oid_length;
 | 
			
		||||
    return( mbedtls_asn1_write_oid( &q, p, oid, oid_length ) );
 | 
			
		||||
    *olen = mbedtls_asn1_write_oid( &q, p, oid, oid_length );
 | 
			
		||||
    return ( 0 );
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
int mbedtls_ecp_ansi_write_point( const mbedtls_ecp_keypair *ec,
 | 
			
		||||
                                  int format,
 | 
			
		||||
                                  unsigned char *p,
 | 
			
		||||
                                  size_t size )
 | 
			
		||||
                                  size_t size, size_t *olen )
 | 
			
		||||
{
 | 
			
		||||
    unsigned char *q;
 | 
			
		||||
    size_t length;
 | 
			
		||||
    size_t tl_size = 3; /* room for the OCTET_STRING tag and length */
 | 
			
		||||
    size_t tl_max_size = 3; /* room for the OCTET_STRING tag and length */
 | 
			
		||||
    int ret;
 | 
			
		||||
    if( size < tl_size )
 | 
			
		||||
 | 
			
		||||
    if( size < tl_max_size )
 | 
			
		||||
        return( MBEDTLS_ERR_ECP_BUFFER_TOO_SMALL );
 | 
			
		||||
    q = p + tl_size;
 | 
			
		||||
 | 
			
		||||
    q = p + tl_max_size;
 | 
			
		||||
    ret = mbedtls_ecp_point_write_binary( &ec->grp, &ec->Q,
 | 
			
		||||
                                          format,
 | 
			
		||||
                                          &length, q, size - 3 );
 | 
			
		||||
                                          olen, q, size - tl_max_size );
 | 
			
		||||
    if( ret < 0 )
 | 
			
		||||
        return( ret );
 | 
			
		||||
    ret = mbedtls_asn1_write_len( &q, p, length );
 | 
			
		||||
    ret = mbedtls_asn1_write_len( &q, p, *olen );
 | 
			
		||||
    if( ret < 0 )
 | 
			
		||||
        return( ret );
 | 
			
		||||
    ret = mbedtls_asn1_write_tag( &q, p, MBEDTLS_ASN1_OCTET_STRING );
 | 
			
		||||
    if( ret < 0 )
 | 
			
		||||
        return( ret );
 | 
			
		||||
    length += tl_size - ( q - p );
 | 
			
		||||
    *olen += tl_max_size - ( q - p );
 | 
			
		||||
    if( q != p )
 | 
			
		||||
        memmove( p, q, length );
 | 
			
		||||
    return( length );
 | 
			
		||||
        memmove( p, q, *olen );
 | 
			
		||||
    return( 0 );
 | 
			
		||||
}
 | 
			
		||||
#endif /* defined(MBEDTLS_ASN1_WRITE_C) && defined(MBEDTLS_OID_C) */
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -420,17 +420,20 @@ void ecp_ansi_write_group( int id, char *hex )
 | 
			
		|||
    unsigned char good[MBEDTLS_OID_EC_GRP_MAX_SIZE];
 | 
			
		||||
    unsigned char tested[MBEDTLS_OID_EC_GRP_MAX_SIZE];
 | 
			
		||||
    size_t good_len = unhexify( good, hex );
 | 
			
		||||
    size_t received_len = 0;
 | 
			
		||||
    int ret = 0;
 | 
			
		||||
    mbedtls_ecp_group_init( &grp );
 | 
			
		||||
    TEST_ASSERT( mbedtls_ecp_group_load( &grp, id ) == 0 );
 | 
			
		||||
 | 
			
		||||
    /* Positive test */
 | 
			
		||||
    ret = mbedtls_ecp_ansi_write_group( &grp, tested, sizeof( tested ) );
 | 
			
		||||
    TEST_ASSERT( ret >= 0 && good_len == (unsigned) ret );
 | 
			
		||||
    ret = mbedtls_ecp_ansi_write_group( &grp, tested, sizeof( tested ),
 | 
			
		||||
										&received_len );
 | 
			
		||||
    TEST_ASSERT( ret == 0 && good_len == (unsigned) received_len );
 | 
			
		||||
    TEST_ASSERT( memcmp( good, tested, good_len ) == 0 );
 | 
			
		||||
 | 
			
		||||
    /* Buffer too small */
 | 
			
		||||
    TEST_ASSERT( mbedtls_ecp_ansi_write_group( &grp, tested, good_len - 1 ) ==
 | 
			
		||||
    TEST_ASSERT( mbedtls_ecp_ansi_write_group( &grp, tested, good_len - 1,
 | 
			
		||||
    										   &received_len ) ==
 | 
			
		||||
                 MBEDTLS_ERR_ECP_BUFFER_TOO_SMALL );
 | 
			
		||||
 | 
			
		||||
exit:
 | 
			
		||||
| 
						 | 
				
			
			@ -444,20 +447,23 @@ void ecp_ansi_write_point( char *key_file, int format, char *good_hex )
 | 
			
		|||
    unsigned char good_buf[1000];
 | 
			
		||||
    unsigned char tested_buf[1000];
 | 
			
		||||
    size_t good_len = unhexify( good_buf, good_hex );
 | 
			
		||||
    size_t received_len = 0;
 | 
			
		||||
    mbedtls_pk_context pk;
 | 
			
		||||
    int ret = 0;
 | 
			
		||||
    int ret = -1;
 | 
			
		||||
    mbedtls_pk_init( &pk );
 | 
			
		||||
    TEST_ASSERT( mbedtls_pk_parse_public_keyfile( &pk, key_file ) == 0 );
 | 
			
		||||
 | 
			
		||||
    /* Positive test */
 | 
			
		||||
    ret = mbedtls_ecp_ansi_write_point( mbedtls_pk_ec( pk ), format,
 | 
			
		||||
                                        tested_buf, sizeof( tested_buf ) );
 | 
			
		||||
    TEST_ASSERT( ret >= 0 && good_len == (unsigned) ret );
 | 
			
		||||
                                        tested_buf, sizeof( tested_buf ), 
 | 
			
		||||
                                        &received_len );
 | 
			
		||||
    TEST_ASSERT( ret == 0 && good_len == (unsigned) received_len );
 | 
			
		||||
    TEST_ASSERT( memcmp( good_buf, tested_buf, good_len ) == 0 );
 | 
			
		||||
 | 
			
		||||
    /* Buffer too small */
 | 
			
		||||
    TEST_ASSERT( mbedtls_ecp_ansi_write_point( mbedtls_pk_ec( pk ), format,
 | 
			
		||||
                                               tested_buf, good_len - 1 ) ==
 | 
			
		||||
                                               tested_buf, good_len - 1, 
 | 
			
		||||
                                               &received_len ) ==
 | 
			
		||||
                 MBEDTLS_ERR_ECP_BUFFER_TOO_SMALL );
 | 
			
		||||
 | 
			
		||||
exit:
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
		Reference in a new issue