mirror of
				https://github.com/cuberite/polarssl.git
				synced 2025-11-04 04:32:24 -05:00 
			
		
		
		
	Implement parameter validation for ECP module
This commit is contained in:
		
							parent
							
								
									ebffa7995b
								
							
						
					
					
						commit
						4f8e8e5805
					
				
							
								
								
									
										140
									
								
								library/ecp.c
									
									
									
									
									
								
							
							
						
						
									
										140
									
								
								library/ecp.c
									
									
									
									
									
								
							@ -86,6 +86,12 @@
 | 
			
		||||
 | 
			
		||||
#if !defined(MBEDTLS_ECP_ALT)
 | 
			
		||||
 | 
			
		||||
/* Parameter validation macros based on platform_util.h */
 | 
			
		||||
#define ECP_VALIDATE_RET( cond )    \
 | 
			
		||||
    MBEDTLS_INTERNAL_VALIDATE_RET( cond, MBEDTLS_ERR_ECP_BAD_INPUT_DATA )
 | 
			
		||||
#define ECP_VALIDATE( cond )        \
 | 
			
		||||
    MBEDTLS_INTERNAL_VALIDATE( cond )
 | 
			
		||||
 | 
			
		||||
#if defined(MBEDTLS_PLATFORM_C)
 | 
			
		||||
#include "mbedtls/platform.h"
 | 
			
		||||
#else
 | 
			
		||||
@ -268,6 +274,8 @@ int mbedtls_ecp_check_budget( const mbedtls_ecp_group *grp,
 | 
			
		||||
                              mbedtls_ecp_restart_ctx *rs_ctx,
 | 
			
		||||
                              unsigned ops )
 | 
			
		||||
{
 | 
			
		||||
    ECP_VALIDATE_RET( grp != NULL );
 | 
			
		||||
 | 
			
		||||
    if( rs_ctx != NULL && ecp_max_ops != 0 )
 | 
			
		||||
    {
 | 
			
		||||
        /* scale depending on curve size: the chosen reference is 256-bit,
 | 
			
		||||
@ -526,8 +534,7 @@ static inline ecp_curve_type ecp_get_type( const mbedtls_ecp_group *grp )
 | 
			
		||||
 */
 | 
			
		||||
void mbedtls_ecp_point_init( mbedtls_ecp_point *pt )
 | 
			
		||||
{
 | 
			
		||||
    if( pt == NULL )
 | 
			
		||||
        return;
 | 
			
		||||
    ECP_VALIDATE( pt != NULL );
 | 
			
		||||
 | 
			
		||||
    mbedtls_mpi_init( &pt->X );
 | 
			
		||||
    mbedtls_mpi_init( &pt->Y );
 | 
			
		||||
@ -539,8 +546,7 @@ void mbedtls_ecp_point_init( mbedtls_ecp_point *pt )
 | 
			
		||||
 */
 | 
			
		||||
void mbedtls_ecp_group_init( mbedtls_ecp_group *grp )
 | 
			
		||||
{
 | 
			
		||||
    if( grp == NULL )
 | 
			
		||||
        return;
 | 
			
		||||
    ECP_VALIDATE( grp != NULL );
 | 
			
		||||
 | 
			
		||||
    grp->id = MBEDTLS_ECP_DP_NONE;
 | 
			
		||||
    mbedtls_mpi_init( &grp->P );
 | 
			
		||||
@ -564,8 +570,7 @@ void mbedtls_ecp_group_init( mbedtls_ecp_group *grp )
 | 
			
		||||
 */
 | 
			
		||||
void mbedtls_ecp_keypair_init( mbedtls_ecp_keypair *key )
 | 
			
		||||
{
 | 
			
		||||
    if( key == NULL )
 | 
			
		||||
        return;
 | 
			
		||||
    ECP_VALIDATE( key != NULL );
 | 
			
		||||
 | 
			
		||||
    mbedtls_ecp_group_init( &key->grp );
 | 
			
		||||
    mbedtls_mpi_init( &key->d );
 | 
			
		||||
@ -633,6 +638,8 @@ void mbedtls_ecp_keypair_free( mbedtls_ecp_keypair *key )
 | 
			
		||||
int mbedtls_ecp_copy( mbedtls_ecp_point *P, const mbedtls_ecp_point *Q )
 | 
			
		||||
{
 | 
			
		||||
    int ret;
 | 
			
		||||
    ECP_VALIDATE_RET( P != NULL );
 | 
			
		||||
    ECP_VALIDATE_RET( Q != NULL );
 | 
			
		||||
 | 
			
		||||
    MBEDTLS_MPI_CHK( mbedtls_mpi_copy( &P->X, &Q->X ) );
 | 
			
		||||
    MBEDTLS_MPI_CHK( mbedtls_mpi_copy( &P->Y, &Q->Y ) );
 | 
			
		||||
@ -647,7 +654,10 @@ cleanup:
 | 
			
		||||
 */
 | 
			
		||||
int mbedtls_ecp_group_copy( mbedtls_ecp_group *dst, const mbedtls_ecp_group *src )
 | 
			
		||||
{
 | 
			
		||||
    return mbedtls_ecp_group_load( dst, src->id );
 | 
			
		||||
    ECP_VALIDATE_RET( dst != NULL );
 | 
			
		||||
    ECP_VALIDATE_RET( src != NULL );
 | 
			
		||||
 | 
			
		||||
    return( mbedtls_ecp_group_load( dst, src->id ) );
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
@ -656,6 +666,7 @@ int mbedtls_ecp_group_copy( mbedtls_ecp_group *dst, const mbedtls_ecp_group *src
 | 
			
		||||
int mbedtls_ecp_set_zero( mbedtls_ecp_point *pt )
 | 
			
		||||
{
 | 
			
		||||
    int ret;
 | 
			
		||||
    ECP_VALIDATE_RET( pt != NULL );
 | 
			
		||||
 | 
			
		||||
    MBEDTLS_MPI_CHK( mbedtls_mpi_lset( &pt->X , 1 ) );
 | 
			
		||||
    MBEDTLS_MPI_CHK( mbedtls_mpi_lset( &pt->Y , 1 ) );
 | 
			
		||||
@ -670,6 +681,8 @@ cleanup:
 | 
			
		||||
 */
 | 
			
		||||
int mbedtls_ecp_is_zero( mbedtls_ecp_point *pt )
 | 
			
		||||
{
 | 
			
		||||
    ECP_VALIDATE_RET( pt != NULL );
 | 
			
		||||
 | 
			
		||||
    return( mbedtls_mpi_cmp_int( &pt->Z, 0 ) == 0 );
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
@ -679,6 +692,9 @@ int mbedtls_ecp_is_zero( mbedtls_ecp_point *pt )
 | 
			
		||||
int mbedtls_ecp_point_cmp( const mbedtls_ecp_point *P,
 | 
			
		||||
                           const mbedtls_ecp_point *Q )
 | 
			
		||||
{
 | 
			
		||||
    ECP_VALIDATE_RET( P != NULL );
 | 
			
		||||
    ECP_VALIDATE_RET( Q != NULL );
 | 
			
		||||
 | 
			
		||||
    if( mbedtls_mpi_cmp_mpi( &P->X, &Q->X ) == 0 &&
 | 
			
		||||
        mbedtls_mpi_cmp_mpi( &P->Y, &Q->Y ) == 0 &&
 | 
			
		||||
        mbedtls_mpi_cmp_mpi( &P->Z, &Q->Z ) == 0 )
 | 
			
		||||
@ -696,6 +712,9 @@ int mbedtls_ecp_point_read_string( mbedtls_ecp_point *P, int radix,
 | 
			
		||||
                           const char *x, const char *y )
 | 
			
		||||
{
 | 
			
		||||
    int ret;
 | 
			
		||||
    ECP_VALIDATE_RET( P != NULL );
 | 
			
		||||
    ECP_VALIDATE_RET( x != NULL );
 | 
			
		||||
    ECP_VALIDATE_RET( y != NULL );
 | 
			
		||||
 | 
			
		||||
    MBEDTLS_MPI_CHK( mbedtls_mpi_read_string( &P->X, radix, x ) );
 | 
			
		||||
    MBEDTLS_MPI_CHK( mbedtls_mpi_read_string( &P->Y, radix, y ) );
 | 
			
		||||
@ -708,16 +727,19 @@ cleanup:
 | 
			
		||||
/*
 | 
			
		||||
 * Export a point into unsigned binary data (SEC1 2.3.3)
 | 
			
		||||
 */
 | 
			
		||||
int mbedtls_ecp_point_write_binary( const mbedtls_ecp_group *grp, const mbedtls_ecp_point *P,
 | 
			
		||||
                            int format, size_t *olen,
 | 
			
		||||
                            unsigned char *buf, size_t buflen )
 | 
			
		||||
int mbedtls_ecp_point_write_binary( const mbedtls_ecp_group *grp,
 | 
			
		||||
                                    const mbedtls_ecp_point *P,
 | 
			
		||||
                                    int format, size_t *olen,
 | 
			
		||||
                                    unsigned char *buf, size_t buflen )
 | 
			
		||||
{
 | 
			
		||||
    int ret = 0;
 | 
			
		||||
    size_t plen;
 | 
			
		||||
 | 
			
		||||
    if( format != MBEDTLS_ECP_PF_UNCOMPRESSED &&
 | 
			
		||||
        format != MBEDTLS_ECP_PF_COMPRESSED )
 | 
			
		||||
        return( MBEDTLS_ERR_ECP_BAD_INPUT_DATA );
 | 
			
		||||
    ECP_VALIDATE_RET( grp  != NULL );
 | 
			
		||||
    ECP_VALIDATE_RET( P    != NULL );
 | 
			
		||||
    ECP_VALIDATE_RET( olen != NULL );
 | 
			
		||||
    ECP_VALIDATE_RET( buf  != NULL );
 | 
			
		||||
    ECP_VALIDATE_RET( format == MBEDTLS_ECP_PF_UNCOMPRESSED ||
 | 
			
		||||
                      format == MBEDTLS_ECP_PF_COMPRESSED );
 | 
			
		||||
 | 
			
		||||
    /*
 | 
			
		||||
     * Common case: P == 0
 | 
			
		||||
@ -764,11 +786,15 @@ cleanup:
 | 
			
		||||
/*
 | 
			
		||||
 * Import a point from unsigned binary data (SEC1 2.3.4)
 | 
			
		||||
 */
 | 
			
		||||
int mbedtls_ecp_point_read_binary( const mbedtls_ecp_group *grp, mbedtls_ecp_point *pt,
 | 
			
		||||
                           const unsigned char *buf, size_t ilen )
 | 
			
		||||
int mbedtls_ecp_point_read_binary( const mbedtls_ecp_group *grp,
 | 
			
		||||
                                   mbedtls_ecp_point *pt,
 | 
			
		||||
                                   const unsigned char *buf, size_t ilen )
 | 
			
		||||
{
 | 
			
		||||
    int ret;
 | 
			
		||||
    size_t plen;
 | 
			
		||||
    ECP_VALIDATE_RET( grp != NULL );
 | 
			
		||||
    ECP_VALIDATE_RET( pt  != NULL );
 | 
			
		||||
    ECP_VALIDATE_RET( buf != NULL );
 | 
			
		||||
 | 
			
		||||
    if( ilen < 1 )
 | 
			
		||||
        return( MBEDTLS_ERR_ECP_BAD_INPUT_DATA );
 | 
			
		||||
@ -803,11 +829,16 @@ cleanup:
 | 
			
		||||
 *          opaque point <1..2^8-1>;
 | 
			
		||||
 *      } ECPoint;
 | 
			
		||||
 */
 | 
			
		||||
int mbedtls_ecp_tls_read_point( const mbedtls_ecp_group *grp, mbedtls_ecp_point *pt,
 | 
			
		||||
                        const unsigned char **buf, size_t buf_len )
 | 
			
		||||
int mbedtls_ecp_tls_read_point( const mbedtls_ecp_group *grp,
 | 
			
		||||
                                mbedtls_ecp_point *pt,
 | 
			
		||||
                                const unsigned char **buf, size_t buf_len )
 | 
			
		||||
{
 | 
			
		||||
    unsigned char data_len;
 | 
			
		||||
    const unsigned char *buf_start;
 | 
			
		||||
    ECP_VALIDATE_RET( grp != NULL );
 | 
			
		||||
    ECP_VALIDATE_RET( pt  != NULL );
 | 
			
		||||
    ECP_VALIDATE_RET( buf != NULL );
 | 
			
		||||
    ECP_VALIDATE_RET( *buf != NULL );
 | 
			
		||||
 | 
			
		||||
    /*
 | 
			
		||||
     * We must have at least two bytes (1 for length, at least one for data)
 | 
			
		||||
@ -825,7 +856,7 @@ int mbedtls_ecp_tls_read_point( const mbedtls_ecp_group *grp, mbedtls_ecp_point
 | 
			
		||||
    buf_start = *buf;
 | 
			
		||||
    *buf += data_len;
 | 
			
		||||
 | 
			
		||||
    return mbedtls_ecp_point_read_binary( grp, pt, buf_start, data_len );
 | 
			
		||||
    return( mbedtls_ecp_point_read_binary( grp, pt, buf_start, data_len ) );
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
@ -839,6 +870,12 @@ int mbedtls_ecp_tls_write_point( const mbedtls_ecp_group *grp, const mbedtls_ecp
 | 
			
		||||
                         unsigned char *buf, size_t blen )
 | 
			
		||||
{
 | 
			
		||||
    int ret;
 | 
			
		||||
    ECP_VALIDATE_RET( grp  != NULL );
 | 
			
		||||
    ECP_VALIDATE_RET( pt   != NULL );
 | 
			
		||||
    ECP_VALIDATE_RET( olen != NULL );
 | 
			
		||||
    ECP_VALIDATE_RET( buf  != NULL );
 | 
			
		||||
    ECP_VALIDATE_RET( format == MBEDTLS_ECP_PF_UNCOMPRESSED ||
 | 
			
		||||
                      format == MBEDTLS_ECP_PF_COMPRESSED );
 | 
			
		||||
 | 
			
		||||
    /*
 | 
			
		||||
     * buffer length must be at least one, for our length byte
 | 
			
		||||
@ -867,11 +904,14 @@ int mbedtls_ecp_tls_read_group( mbedtls_ecp_group *grp,
 | 
			
		||||
{
 | 
			
		||||
    int ret;
 | 
			
		||||
    mbedtls_ecp_group_id grp_id;
 | 
			
		||||
    ECP_VALIDATE_RET( grp  != NULL );
 | 
			
		||||
    ECP_VALIDATE_RET( buf  != NULL );
 | 
			
		||||
    ECP_VALIDATE_RET( *buf != NULL );
 | 
			
		||||
 | 
			
		||||
    if( ( ret = mbedtls_ecp_tls_read_group_id( &grp_id, buf, len ) ) != 0 )
 | 
			
		||||
        return( ret );
 | 
			
		||||
 | 
			
		||||
    return mbedtls_ecp_group_load( grp, grp_id );
 | 
			
		||||
    return( mbedtls_ecp_group_load( grp, grp_id ) );
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
@ -883,6 +923,9 @@ int mbedtls_ecp_tls_read_group_id( mbedtls_ecp_group_id *grp,
 | 
			
		||||
{
 | 
			
		||||
    uint16_t tls_id;
 | 
			
		||||
    const mbedtls_ecp_curve_info *curve_info;
 | 
			
		||||
    ECP_VALIDATE_RET( grp  != NULL );
 | 
			
		||||
    ECP_VALIDATE_RET( buf  != NULL );
 | 
			
		||||
    ECP_VALIDATE_RET( *buf != NULL );
 | 
			
		||||
 | 
			
		||||
    /*
 | 
			
		||||
     * We expect at least three bytes (see below)
 | 
			
		||||
@ -918,6 +961,9 @@ int mbedtls_ecp_tls_write_group( const mbedtls_ecp_group *grp, size_t *olen,
 | 
			
		||||
                         unsigned char *buf, size_t blen )
 | 
			
		||||
{
 | 
			
		||||
    const mbedtls_ecp_curve_info *curve_info;
 | 
			
		||||
    ECP_VALIDATE_RET( grp  != NULL );
 | 
			
		||||
    ECP_VALIDATE_RET( buf  != NULL );
 | 
			
		||||
    ECP_VALIDATE_RET( olen != NULL );
 | 
			
		||||
 | 
			
		||||
    if( ( curve_info = mbedtls_ecp_curve_info_from_grp_id( grp->id ) ) == NULL )
 | 
			
		||||
        return( MBEDTLS_ERR_ECP_BAD_INPUT_DATA );
 | 
			
		||||
@ -2276,6 +2322,10 @@ int mbedtls_ecp_mul_restartable( mbedtls_ecp_group *grp, mbedtls_ecp_point *R,
 | 
			
		||||
#if defined(MBEDTLS_ECP_INTERNAL_ALT)
 | 
			
		||||
    char is_grp_capable = 0;
 | 
			
		||||
#endif
 | 
			
		||||
    ECP_VALIDATE_RET( grp != NULL );
 | 
			
		||||
    ECP_VALIDATE_RET( R   != NULL );
 | 
			
		||||
    ECP_VALIDATE_RET( m   != NULL );
 | 
			
		||||
    ECP_VALIDATE_RET( P   != NULL );
 | 
			
		||||
 | 
			
		||||
#if defined(MBEDTLS_ECP_RESTARTABLE)
 | 
			
		||||
    /* reset ops count for this call if top-level */
 | 
			
		||||
@ -2333,6 +2383,10 @@ int mbedtls_ecp_mul( mbedtls_ecp_group *grp, mbedtls_ecp_point *R,
 | 
			
		||||
             const mbedtls_mpi *m, const mbedtls_ecp_point *P,
 | 
			
		||||
             int (*f_rng)(void *, unsigned char *, size_t), void *p_rng )
 | 
			
		||||
{
 | 
			
		||||
    ECP_VALIDATE_RET( grp != NULL );
 | 
			
		||||
    ECP_VALIDATE_RET( R   != NULL );
 | 
			
		||||
    ECP_VALIDATE_RET( m   != NULL );
 | 
			
		||||
    ECP_VALIDATE_RET( P   != NULL );
 | 
			
		||||
    return( mbedtls_ecp_mul_restartable( grp, R, m, P, f_rng, p_rng, NULL ) );
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
@ -2435,6 +2489,12 @@ int mbedtls_ecp_muladd_restartable(
 | 
			
		||||
#if defined(MBEDTLS_ECP_INTERNAL_ALT)
 | 
			
		||||
    char is_grp_capable = 0;
 | 
			
		||||
#endif
 | 
			
		||||
    ECP_VALIDATE_RET( grp != NULL );
 | 
			
		||||
    ECP_VALIDATE_RET( R   != NULL );
 | 
			
		||||
    ECP_VALIDATE_RET( m   != NULL );
 | 
			
		||||
    ECP_VALIDATE_RET( P   != NULL );
 | 
			
		||||
    ECP_VALIDATE_RET( n   != NULL );
 | 
			
		||||
    ECP_VALIDATE_RET( Q   != NULL );
 | 
			
		||||
 | 
			
		||||
    if( ecp_get_type( grp ) != ECP_TYPE_SHORT_WEIERSTRASS )
 | 
			
		||||
        return( MBEDTLS_ERR_ECP_FEATURE_UNAVAILABLE );
 | 
			
		||||
@ -2517,6 +2577,12 @@ int mbedtls_ecp_muladd( mbedtls_ecp_group *grp, mbedtls_ecp_point *R,
 | 
			
		||||
             const mbedtls_mpi *m, const mbedtls_ecp_point *P,
 | 
			
		||||
             const mbedtls_mpi *n, const mbedtls_ecp_point *Q )
 | 
			
		||||
{
 | 
			
		||||
    ECP_VALIDATE_RET( grp != NULL );
 | 
			
		||||
    ECP_VALIDATE_RET( R   != NULL );
 | 
			
		||||
    ECP_VALIDATE_RET( m   != NULL );
 | 
			
		||||
    ECP_VALIDATE_RET( P   != NULL );
 | 
			
		||||
    ECP_VALIDATE_RET( n   != NULL );
 | 
			
		||||
    ECP_VALIDATE_RET( Q   != NULL );
 | 
			
		||||
    return( mbedtls_ecp_muladd_restartable( grp, R, m, P, n, Q, NULL ) );
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
@ -2539,8 +2605,12 @@ static int ecp_check_pubkey_mx( const mbedtls_ecp_group *grp, const mbedtls_ecp_
 | 
			
		||||
/*
 | 
			
		||||
 * Check that a point is valid as a public key
 | 
			
		||||
 */
 | 
			
		||||
int mbedtls_ecp_check_pubkey( const mbedtls_ecp_group *grp, const mbedtls_ecp_point *pt )
 | 
			
		||||
int mbedtls_ecp_check_pubkey( const mbedtls_ecp_group *grp,
 | 
			
		||||
                              const mbedtls_ecp_point *pt )
 | 
			
		||||
{
 | 
			
		||||
    ECP_VALIDATE_RET( grp != NULL );
 | 
			
		||||
    ECP_VALIDATE_RET( pt  != NULL );
 | 
			
		||||
 | 
			
		||||
    /* Must use affine coordinates */
 | 
			
		||||
    if( mbedtls_mpi_cmp_int( &pt->Z, 1 ) != 0 )
 | 
			
		||||
        return( MBEDTLS_ERR_ECP_INVALID_KEY );
 | 
			
		||||
@ -2559,8 +2629,12 @@ int mbedtls_ecp_check_pubkey( const mbedtls_ecp_group *grp, const mbedtls_ecp_po
 | 
			
		||||
/*
 | 
			
		||||
 * Check that an mbedtls_mpi is valid as a private key
 | 
			
		||||
 */
 | 
			
		||||
int mbedtls_ecp_check_privkey( const mbedtls_ecp_group *grp, const mbedtls_mpi *d )
 | 
			
		||||
int mbedtls_ecp_check_privkey( const mbedtls_ecp_group *grp,
 | 
			
		||||
                               const mbedtls_mpi *d )
 | 
			
		||||
{
 | 
			
		||||
    ECP_VALIDATE_RET( grp != NULL );
 | 
			
		||||
    ECP_VALIDATE_RET( d   != NULL );
 | 
			
		||||
 | 
			
		||||
#if defined(ECP_MONTGOMERY)
 | 
			
		||||
    if( ecp_get_type( grp ) == ECP_TYPE_MONTGOMERY )
 | 
			
		||||
    {
 | 
			
		||||
@ -2601,7 +2675,13 @@ int mbedtls_ecp_gen_privkey( const mbedtls_ecp_group *grp,
 | 
			
		||||
                     void *p_rng )
 | 
			
		||||
{
 | 
			
		||||
    int ret = MBEDTLS_ERR_ECP_BAD_INPUT_DATA;
 | 
			
		||||
    size_t n_size = ( grp->nbits + 7 ) / 8;
 | 
			
		||||
    size_t n_size;
 | 
			
		||||
 | 
			
		||||
    ECP_VALIDATE_RET( grp   != NULL );
 | 
			
		||||
    ECP_VALIDATE_RET( d     != NULL );
 | 
			
		||||
    ECP_VALIDATE_RET( f_rng != NULL );
 | 
			
		||||
 | 
			
		||||
    n_size = ( grp->nbits + 7 ) / 8;
 | 
			
		||||
 | 
			
		||||
#if defined(ECP_MONTGOMERY)
 | 
			
		||||
    if( ecp_get_type( grp ) == ECP_TYPE_MONTGOMERY )
 | 
			
		||||
@ -2680,6 +2760,11 @@ int mbedtls_ecp_gen_keypair_base( mbedtls_ecp_group *grp,
 | 
			
		||||
                     void *p_rng )
 | 
			
		||||
{
 | 
			
		||||
    int ret;
 | 
			
		||||
    ECP_VALIDATE_RET( grp   != NULL );
 | 
			
		||||
    ECP_VALIDATE_RET( d     != NULL );
 | 
			
		||||
    ECP_VALIDATE_RET( G     != NULL );
 | 
			
		||||
    ECP_VALIDATE_RET( Q     != NULL );
 | 
			
		||||
    ECP_VALIDATE_RET( f_rng != NULL );
 | 
			
		||||
 | 
			
		||||
    MBEDTLS_MPI_CHK( mbedtls_ecp_gen_privkey( grp, d, f_rng, p_rng ) );
 | 
			
		||||
    MBEDTLS_MPI_CHK( mbedtls_ecp_mul( grp, Q, d, G, f_rng, p_rng ) );
 | 
			
		||||
@ -2696,6 +2781,11 @@ int mbedtls_ecp_gen_keypair( mbedtls_ecp_group *grp,
 | 
			
		||||
                             int (*f_rng)(void *, unsigned char *, size_t),
 | 
			
		||||
                             void *p_rng )
 | 
			
		||||
{
 | 
			
		||||
    ECP_VALIDATE_RET( grp   != NULL );
 | 
			
		||||
    ECP_VALIDATE_RET( d     != NULL );
 | 
			
		||||
    ECP_VALIDATE_RET( Q     != NULL );
 | 
			
		||||
    ECP_VALIDATE_RET( f_rng != NULL );
 | 
			
		||||
 | 
			
		||||
    return( mbedtls_ecp_gen_keypair_base( grp, &grp->G, d, Q, f_rng, p_rng ) );
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
@ -2706,6 +2796,8 @@ int mbedtls_ecp_gen_key( mbedtls_ecp_group_id grp_id, mbedtls_ecp_keypair *key,
 | 
			
		||||
                int (*f_rng)(void *, unsigned char *, size_t), void *p_rng )
 | 
			
		||||
{
 | 
			
		||||
    int ret;
 | 
			
		||||
    ECP_VALIDATE_RET( key   != NULL );
 | 
			
		||||
    ECP_VALIDATE_RET( f_rng != NULL );
 | 
			
		||||
 | 
			
		||||
    if( ( ret = mbedtls_ecp_group_load( &key->grp, grp_id ) ) != 0 )
 | 
			
		||||
        return( ret );
 | 
			
		||||
@ -2721,6 +2813,8 @@ int mbedtls_ecp_check_pub_priv( const mbedtls_ecp_keypair *pub, const mbedtls_ec
 | 
			
		||||
    int ret;
 | 
			
		||||
    mbedtls_ecp_point Q;
 | 
			
		||||
    mbedtls_ecp_group grp;
 | 
			
		||||
    ECP_VALIDATE_RET( pub != NULL );
 | 
			
		||||
    ECP_VALIDATE_RET( prv != NULL );
 | 
			
		||||
 | 
			
		||||
    if( pub->grp.id == MBEDTLS_ECP_DP_NONE ||
 | 
			
		||||
        pub->grp.id != prv->grp.id ||
 | 
			
		||||
 | 
			
		||||
@ -28,11 +28,18 @@
 | 
			
		||||
#if defined(MBEDTLS_ECP_C)
 | 
			
		||||
 | 
			
		||||
#include "mbedtls/ecp.h"
 | 
			
		||||
#include "mbedtls/platform_util.h"
 | 
			
		||||
 | 
			
		||||
#include <string.h>
 | 
			
		||||
 | 
			
		||||
#if !defined(MBEDTLS_ECP_ALT)
 | 
			
		||||
 | 
			
		||||
/* Parameter validation macros based on platform_util.h */
 | 
			
		||||
#define ECP_VALIDATE_RET( cond )    \
 | 
			
		||||
    MBEDTLS_INTERNAL_VALIDATE_RET( cond, MBEDTLS_ERR_ECP_BAD_INPUT_DATA )
 | 
			
		||||
#define ECP_VALIDATE( cond )        \
 | 
			
		||||
    MBEDTLS_INTERNAL_VALIDATE( cond )
 | 
			
		||||
 | 
			
		||||
#if ( defined(__ARMCC_VERSION) || defined(_MSC_VER) ) && \
 | 
			
		||||
    !defined(inline) && !defined(__cplusplus)
 | 
			
		||||
#define inline __inline
 | 
			
		||||
@ -746,6 +753,7 @@ cleanup:
 | 
			
		||||
 */
 | 
			
		||||
int mbedtls_ecp_group_load( mbedtls_ecp_group *grp, mbedtls_ecp_group_id id )
 | 
			
		||||
{
 | 
			
		||||
    ECP_VALIDATE_RET( grp != NULL );
 | 
			
		||||
    mbedtls_ecp_group_free( grp );
 | 
			
		||||
 | 
			
		||||
    grp->id = id;
 | 
			
		||||
 | 
			
		||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user