146 lines
		
	
	
		
			4.1 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			146 lines
		
	
	
		
			4.1 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
#include <stdlib.h>
 | 
						|
#include <stdio.h>
 | 
						|
#include <stddef.h>
 | 
						|
 | 
						|
#include "mbedtls/ecp.h"
 | 
						|
 | 
						|
#define mbedtls_printf     printf
 | 
						|
 | 
						|
/*
 | 
						|
 * Counts of point addition and doubling, and field multiplications.
 | 
						|
 * Used to test resistance of point multiplication to simple timing attacks.
 | 
						|
 */
 | 
						|
static unsigned long add_count, dbl_count, mul_count;
 | 
						|
 | 
						|
#define INC_MUL_COUNT   mul_count++;
 | 
						|
 | 
						|
/*
 | 
						|
 * Checkup routine
 | 
						|
 */
 | 
						|
int mbedtls_ecp_self_test( int verbose )
 | 
						|
{
 | 
						|
    int ret;
 | 
						|
    size_t i;
 | 
						|
    mbedtls_ecp_group grp;
 | 
						|
    mbedtls_ecp_point R, P;
 | 
						|
    mbedtls_mpi m;
 | 
						|
    unsigned long add_c_prev, dbl_c_prev, mul_c_prev;
 | 
						|
    /* exponents especially adapted for secp192r1 */
 | 
						|
    const char *exponents[] =
 | 
						|
    {
 | 
						|
        "000000000000000000000000000000000000000000000001", /* one */
 | 
						|
        "FFFFFFFFFFFFFFFFFFFFFFFF99DEF836146BC9B1B4D22830", /* N - 1 */
 | 
						|
        "5EA6F389A38B8BC81E767753B15AA5569E1782E30ABE7D25", /* random */
 | 
						|
        "400000000000000000000000000000000000000000000000", /* one and zeros */
 | 
						|
        "7FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF", /* all ones */
 | 
						|
        "555555555555555555555555555555555555555555555555", /* 101010... */
 | 
						|
    };
 | 
						|
 | 
						|
    mbedtls_ecp_group_init( &grp );
 | 
						|
    mbedtls_ecp_point_init( &R );
 | 
						|
    mbedtls_ecp_point_init( &P );
 | 
						|
    mbedtls_mpi_init( &m );
 | 
						|
 | 
						|
    /* Use secp192r1 if available, or any available curve */
 | 
						|
    MBEDTLS_MPI_CHK( mbedtls_ecp_group_load( &grp, MBEDTLS_ECP_DP_SECP256R1 ) );
 | 
						|
 | 
						|
    if( verbose != 0 )
 | 
						|
        mbedtls_printf( "  ECP test #1 (constant op_count, base point G): " );
 | 
						|
 | 
						|
    /* Do a dummy multiplication first to trigger precomputation */
 | 
						|
    MBEDTLS_MPI_CHK( mbedtls_mpi_lset( &m, 2 ) );
 | 
						|
    MBEDTLS_MPI_CHK( mbedtls_ecp_mul( &grp, &P, &m, &grp.G, NULL, NULL ) );
 | 
						|
 | 
						|
    add_count = 0;
 | 
						|
    dbl_count = 0;
 | 
						|
    mul_count = 0;
 | 
						|
    MBEDTLS_MPI_CHK( mbedtls_mpi_read_string( &m, 16, exponents[0] ) );
 | 
						|
    MBEDTLS_MPI_CHK( mbedtls_ecp_mul( &grp, &R, &m, &grp.G, NULL, NULL ) );
 | 
						|
 | 
						|
    for( i = 1; i < sizeof( exponents ) / sizeof( exponents[0] ); i++ )
 | 
						|
    {
 | 
						|
        add_c_prev = add_count;
 | 
						|
        dbl_c_prev = dbl_count;
 | 
						|
        mul_c_prev = mul_count;
 | 
						|
        add_count = 0;
 | 
						|
        dbl_count = 0;
 | 
						|
        mul_count = 0;
 | 
						|
 | 
						|
        MBEDTLS_MPI_CHK( mbedtls_mpi_read_string( &m, 16, exponents[i] ) );
 | 
						|
        MBEDTLS_MPI_CHK( mbedtls_ecp_mul( &grp, &R, &m, &grp.G, NULL, NULL ) );
 | 
						|
 | 
						|
        if( add_count != add_c_prev ||
 | 
						|
            dbl_count != dbl_c_prev ||
 | 
						|
            mul_count != mul_c_prev )
 | 
						|
        {
 | 
						|
            if( verbose != 0 )
 | 
						|
                mbedtls_printf( "failed (%u)\n", (unsigned int) i );
 | 
						|
 | 
						|
            ret = 1;
 | 
						|
            goto cleanup;
 | 
						|
        }
 | 
						|
    }
 | 
						|
 | 
						|
    if( verbose != 0 )
 | 
						|
        mbedtls_printf( "passed\n" );
 | 
						|
 | 
						|
    if( verbose != 0 )
 | 
						|
        mbedtls_printf( "  ECP test #2 (constant op_count, other point): " );
 | 
						|
    /* We computed P = 2G last time, use it */
 | 
						|
 | 
						|
    add_count = 0;
 | 
						|
    dbl_count = 0;
 | 
						|
    mul_count = 0;
 | 
						|
    MBEDTLS_MPI_CHK( mbedtls_mpi_read_string( &m, 16, exponents[0] ) );
 | 
						|
    MBEDTLS_MPI_CHK( mbedtls_ecp_mul( &grp, &R, &m, &P, NULL, NULL ) );
 | 
						|
 | 
						|
    for( i = 1; i < sizeof( exponents ) / sizeof( exponents[0] ); i++ )
 | 
						|
    {
 | 
						|
        add_c_prev = add_count;
 | 
						|
        dbl_c_prev = dbl_count;
 | 
						|
        mul_c_prev = mul_count;
 | 
						|
        add_count = 0;
 | 
						|
        dbl_count = 0;
 | 
						|
        mul_count = 0;
 | 
						|
 | 
						|
        MBEDTLS_MPI_CHK( mbedtls_mpi_read_string( &m, 16, exponents[i] ) );
 | 
						|
        MBEDTLS_MPI_CHK( mbedtls_ecp_mul( &grp, &R, &m, &P, NULL, NULL ) );
 | 
						|
 | 
						|
        if( add_count != add_c_prev ||
 | 
						|
            dbl_count != dbl_c_prev ||
 | 
						|
            mul_count != mul_c_prev )
 | 
						|
        {
 | 
						|
            if( verbose != 0 )
 | 
						|
                mbedtls_printf( "failed (%u)\n", (unsigned int) i );
 | 
						|
 | 
						|
            ret = 1;
 | 
						|
            goto cleanup;
 | 
						|
        }
 | 
						|
    }
 | 
						|
 | 
						|
    if( verbose != 0 )
 | 
						|
        mbedtls_printf( "passed\n" );
 | 
						|
 | 
						|
cleanup:
 | 
						|
 | 
						|
    if( ret < 0 && verbose != 0 )
 | 
						|
        mbedtls_printf( "Unexpected error, return code = %08X\n", ret );
 | 
						|
 | 
						|
    mbedtls_ecp_group_free( &grp );
 | 
						|
    mbedtls_ecp_point_free( &R );
 | 
						|
    mbedtls_ecp_point_free( &P );
 | 
						|
    mbedtls_mpi_free( &m );
 | 
						|
 | 
						|
    if( verbose != 0 )
 | 
						|
        mbedtls_printf( "\n" );
 | 
						|
 | 
						|
    return( ret );
 | 
						|
}
 | 
						|
 | 
						|
int ecp_main( )
 | 
						|
{
 | 
						|
	mbedtls_ecp_self_test(1);
 | 
						|
 | 
						|
    return 0;
 | 
						|
}
 |