| /* BEGIN_HEADER */ |
| #include "mbedtls/bignum.h" |
| #include "mbedtls/entropy.h" |
| #include "bignum_mod.h" |
| #include "constant_time_internal.h" |
| #include "test/constant_flow.h" |
| /* END_HEADER */ |
| |
| /* BEGIN_DEPENDENCIES |
| * depends_on:MBEDTLS_BIGNUM_C |
| * END_DEPENDENCIES |
| */ |
| |
| /* BEGIN_CASE */ |
| void mpi_mod_setup( int int_rep, int iret ) |
| { |
| #define MLIMBS 8 |
| mbedtls_mpi_uint mp[MLIMBS]; |
| mbedtls_mpi_mod_modulus m; |
| int ret; |
| |
| memset( mp, 0xFF, sizeof(mp) ); |
| |
| mbedtls_mpi_mod_modulus_init( &m ); |
| ret = mbedtls_mpi_mod_modulus_setup( &m, mp, MLIMBS, int_rep ); |
| TEST_EQUAL( ret, iret ); |
| |
| /* Only test if the constants have been set-up */ |
| if ( ret == 0 && int_rep == MBEDTLS_MPI_MOD_REP_MONTGOMERY ) |
| { |
| /* Test that the consts have been calculated */ |
| TEST_ASSERT( m.rep.mont.rr != NULL ); |
| TEST_ASSERT( m.rep.mont.mm != 0 ); |
| |
| } |
| |
| /* Address sanitiser should catch if we try to free mp */ |
| mbedtls_mpi_mod_modulus_free( &m ); |
| |
| /* Make sure that the modulus doesn't have reference to mp anymore */ |
| TEST_ASSERT( m.p != mp ); |
| |
| /* Only test if the constants have been set-up */ |
| if ( ret == 0 && int_rep == MBEDTLS_MPI_MOD_REP_MONTGOMERY ) |
| { |
| /* Verify the data and pointers allocated have been properly wiped */ |
| TEST_ASSERT( m.rep.mont.rr == NULL ); |
| TEST_ASSERT( m.rep.mont.mm == 0 ); |
| } |
| exit: |
| /* It should be safe to call an mbedtls free several times */ |
| mbedtls_mpi_mod_modulus_free( &m ); |
| |
| #undef MLIMBS |
| } |
| /* END_CASE */ |
| |
| /* BEGIN MERGE SLOT 1 */ |
| |
| /* END MERGE SLOT 1 */ |
| |
| /* BEGIN MERGE SLOT 2 */ |
| |
| /* END MERGE SLOT 2 */ |
| |
| /* BEGIN MERGE SLOT 3 */ |
| |
| /* END MERGE SLOT 3 */ |
| |
| /* BEGIN MERGE SLOT 4 */ |
| |
| /* END MERGE SLOT 4 */ |
| |
| /* BEGIN MERGE SLOT 5 */ |
| |
| /* END MERGE SLOT 5 */ |
| |
| /* BEGIN MERGE SLOT 6 */ |
| |
| /* END MERGE SLOT 6 */ |
| |
| /* BEGIN MERGE SLOT 7 */ |
| /* BEGIN_CASE */ |
| void mpi_residue_setup( char * input_N, char * input_R, int ret ) |
| { |
| mbedtls_mpi_uint *N = NULL; |
| mbedtls_mpi_uint *R = NULL; |
| size_t n_limbs, r_limbs; |
| mbedtls_mpi_mod_modulus m; |
| mbedtls_mpi_mod_residue r; |
| |
| mbedtls_mpi_mod_modulus_init( &m ); |
| |
| /* Allocate the memory for intermediate data structures */ |
| TEST_EQUAL( 0, mbedtls_test_read_mpi_core( &N, &n_limbs, input_N ) ); |
| TEST_EQUAL( 0, mbedtls_test_read_mpi_core( &R, &r_limbs, input_R ) ); |
| |
| TEST_EQUAL( 0, mbedtls_mpi_mod_modulus_setup( &m, N, n_limbs, |
| MBEDTLS_MPI_MOD_REP_MONTGOMERY ) ); |
| |
| TEST_EQUAL( ret, mbedtls_mpi_mod_residue_setup( &r, &m, R , r_limbs ) ); |
| |
| if ( ret == 0 ) |
| { |
| TEST_EQUAL( r.limbs, r_limbs ); |
| TEST_ASSERT( r.p == R ); |
| } |
| |
| exit: |
| mbedtls_mpi_mod_modulus_free( &m ); |
| mbedtls_free( N ); |
| mbedtls_free( R ); |
| } |
| /* END_CASE */ |
| |
| /* BEGIN_CASE */ |
| void mpi_mod_io_neg( ) |
| { |
| mbedtls_mpi_uint *N = NULL; |
| mbedtls_mpi_uint *R = NULL; |
| mbedtls_mpi_uint *N2 = NULL; |
| mbedtls_mpi_uint *R2 = NULL; |
| unsigned char *r_buff = NULL; |
| |
| size_t n_limbs, r_limbs, n2_limbs, r2_limbs; |
| |
| mbedtls_mpi_mod_modulus m; |
| mbedtls_mpi_mod_residue r; |
| mbedtls_mpi_mod_modulus m2; |
| mbedtls_mpi_mod_residue rn = { NULL, 0 }; |
| |
| const char *hex_residue_single = "01"; |
| const char *hex_modulus_single = "fe"; |
| const char *hex_residue_multi = "7ffffffffffffffffffffffffffffff0"; |
| const char *hex_modulus_multi = "7ffffffffffffffffffffffffffffff1"; |
| |
| const size_t buff_bytes = 1024; |
| |
| mbedtls_mpi_mod_modulus_init( &m ); |
| mbedtls_mpi_mod_modulus_init( &m2 ); |
| |
| /* Allocate the memory for intermediate data structures */ |
| TEST_EQUAL( 0, mbedtls_test_read_mpi_core( &N, &n_limbs, hex_modulus_single ) ); |
| TEST_EQUAL( 0, mbedtls_test_read_mpi_core( &R, &r_limbs, hex_residue_single ) ); |
| TEST_EQUAL( 0, mbedtls_test_read_mpi_core( &N2, &n2_limbs, hex_modulus_multi ) ); |
| TEST_EQUAL( 0, mbedtls_test_read_mpi_core( &R2, &r2_limbs, hex_residue_multi ) ); |
| |
| /* Allocate more than required space on buffer so we can test for input_r > mpi */ |
| ASSERT_ALLOC( r_buff, buff_bytes ); |
| memset( r_buff, 0x1, 1 ); |
| |
| mbedtls_mpi_mod_ext_rep endian = MBEDTLS_MPI_MOD_EXT_REP_LE; |
| TEST_EQUAL( 0, mbedtls_mpi_mod_modulus_setup( &m, N, n_limbs, |
| MBEDTLS_MPI_MOD_REP_MONTGOMERY ) ); |
| |
| TEST_EQUAL( 0, mbedtls_mpi_mod_residue_setup( &r, &m, R , n_limbs ) ); |
| |
| /* Pass for input_r < modulo */ |
| TEST_EQUAL( 0, mbedtls_mpi_mod_read( &r, &m, r_buff, 1, endian ) ); |
| |
| /* Pass for input_r == modulo -1 */ |
| memset( r_buff, 0xfd, buff_bytes ); |
| TEST_EQUAL( 0, mbedtls_mpi_mod_read( &r, &m, r_buff, 1, endian ) ); |
| |
| /* modulo->p == NULL || residue->p == NULL ( m2 has not been set-up ) */ |
| TEST_EQUAL( MBEDTLS_ERR_MPI_BAD_INPUT_DATA, |
| mbedtls_mpi_mod_read( &r, &m2, r_buff, 1, endian ) ); |
| TEST_EQUAL( MBEDTLS_ERR_MPI_BAD_INPUT_DATA, |
| mbedtls_mpi_mod_read( &rn, &m, r_buff, 1, endian ) ); |
| TEST_EQUAL( MBEDTLS_ERR_MPI_BAD_INPUT_DATA, |
| mbedtls_mpi_mod_write( &r, &m2, r_buff, 1, endian ) ); |
| TEST_EQUAL( MBEDTLS_ERR_MPI_BAD_INPUT_DATA, |
| mbedtls_mpi_mod_write( &rn, &m, r_buff, 1, endian ) ); |
| |
| /* Fail for r_limbs < m->limbs */ |
| r.limbs = m.limbs - 1; |
| TEST_EQUAL( MBEDTLS_ERR_MPI_BAD_INPUT_DATA, |
| mbedtls_mpi_mod_read( &r, &m, r_buff, 1, endian ) ); |
| TEST_EQUAL( MBEDTLS_ERR_MPI_BAD_INPUT_DATA, |
| mbedtls_mpi_mod_write( &rn, &m, r_buff, 1, endian ) ); |
| r.limbs = r_limbs; |
| |
| /* Fail if input_r >= modulo m */ |
| /* input_r = modulo */ |
| memset( r_buff, 0xfe, buff_bytes ); |
| TEST_EQUAL( MBEDTLS_ERR_MPI_BAD_INPUT_DATA, |
| mbedtls_mpi_mod_read( &r, &m, r_buff, 1, endian ) ); |
| |
| /* input_r > modulo */ |
| memset( r_buff, 0xff, buff_bytes ); |
| TEST_EQUAL( MBEDTLS_ERR_MPI_BAD_INPUT_DATA, |
| mbedtls_mpi_mod_read( &r, &m, r_buff, 1, endian ) ); |
| |
| /* Data too large to fit */ |
| TEST_EQUAL( MBEDTLS_ERR_MPI_BUFFER_TOO_SMALL, |
| mbedtls_mpi_mod_read( &r, &m, r_buff, buff_bytes, endian ) ); |
| |
| /* Read the two limbs input data into a larger modulus and residue */ |
| TEST_EQUAL( 0, mbedtls_mpi_mod_modulus_setup( &m2, N2, n2_limbs, |
| MBEDTLS_MPI_MOD_REP_MONTGOMERY ) ); |
| rn.p = R2; |
| rn.limbs = r2_limbs; |
| TEST_EQUAL( MBEDTLS_ERR_MPI_BUFFER_TOO_SMALL, |
| mbedtls_mpi_mod_write( &rn, &m2, r_buff, 1, endian ) ); |
| |
| exit: |
| mbedtls_mpi_mod_modulus_free( &m ); |
| mbedtls_mpi_mod_modulus_free( &m2 ); |
| mbedtls_free( N ); |
| mbedtls_free( R ); |
| mbedtls_free( N2 ); |
| mbedtls_free( R2 ); |
| mbedtls_free( r_buff ); |
| } |
| /* END_CASE */ |
| |
| /* BEGIN_CASE */ |
| void mpi_mod_io( char * input_N, data_t * input_A, int endian ) |
| { |
| mbedtls_mpi_uint *N = NULL; |
| mbedtls_mpi_uint *R = NULL; |
| unsigned char *r_buff = NULL; |
| mbedtls_mpi_mod_modulus m; |
| mbedtls_mpi_mod_residue r; |
| size_t n_limbs, n_bytes, a_bytes; |
| |
| mbedtls_mpi_mod_modulus_init( &m ); |
| |
| /* Read inputs */ |
| TEST_EQUAL( 0, mbedtls_test_read_mpi_core( &N, &n_limbs, input_N ) ); |
| n_bytes = n_limbs * sizeof( mbedtls_mpi_uint ); |
| a_bytes = input_A->len * sizeof( char ); |
| |
| /* Allocate the memory for intermediate data structures */ |
| ASSERT_ALLOC( R, n_bytes ); |
| ASSERT_ALLOC( r_buff, a_bytes ); |
| |
| /* Test that input's size is not greater to modulo's */ |
| TEST_LE_U(a_bytes, n_bytes ); |
| |
| /* Init Structures */ |
| TEST_EQUAL( 0, mbedtls_mpi_mod_modulus_setup( &m, N, n_limbs, |
| MBEDTLS_MPI_MOD_REP_MONTGOMERY ) ); |
| |
| /* Enforcing p_limbs >= m->limbs */ |
| TEST_EQUAL( 0, mbedtls_mpi_mod_residue_setup( &r, &m, R, n_limbs ) ); |
| |
| TEST_EQUAL( 0, mbedtls_mpi_mod_read( &r, &m, input_A->x, input_A->len, |
| endian ) ); |
| |
| TEST_EQUAL( 0, mbedtls_mpi_mod_write( &r, &m, r_buff, a_bytes, |
| endian ) ); |
| |
| ASSERT_COMPARE( r_buff, a_bytes, input_A->x, a_bytes ); |
| exit: |
| mbedtls_mpi_mod_modulus_free( &m ); |
| mbedtls_free( N ); |
| mbedtls_free( R ); |
| mbedtls_free( r_buff ); |
| } |
| /* END_CASE */ |
| /* END MERGE SLOT 7 */ |
| |
| /* BEGIN MERGE SLOT 8 */ |
| |
| /* END MERGE SLOT 8 */ |
| |
| /* BEGIN MERGE SLOT 9 */ |
| |
| /* END MERGE SLOT 9 */ |
| |
| /* BEGIN MERGE SLOT 10 */ |
| |
| /* END MERGE SLOT 10 */ |