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;
							 | 
						||
| 
								 | 
							
								}
							 |