mirror of
https://github.com/Mbed-TLS/mbedtls.git
synced 2026-01-06 11:41:12 +03:00
Fix mbedtls_mpi_random when N has leading zeros
mbedtls_mpi_random() uses mbedtls_mpi_cmp_mpi_ct(), which requires its two arguments to have the same storage size. This was not the case when the upper bound passed to mbedtls_mpi_random() had leading zero limbs. Fix this by forcing the result MPI to the desired size. Since this is not what mbedtls_mpi_fill_random() does, don't call it from mbedtls_mpi_random(), but instead call a new auxiliary function. Add tests to cover this and other conditions with varying sizes for the two arguments. Signed-off-by: Gilles Peskine <Gilles.Peskine@arm.com>
This commit is contained in:
@@ -1132,6 +1132,33 @@ mpi_random_many:1:"04":1000
|
||||
MPI random in range: 3..4
|
||||
mpi_random_many:1:"04":1000
|
||||
|
||||
MPI random in range: smaller result
|
||||
mpi_random_grown:1:"aaaaaaaaaaaaaaaabbbbbbbbbbbbbbbb":1
|
||||
|
||||
MPI random in range: same size result (32-bit limbs)
|
||||
mpi_random_grown:1:"aaaaaaaaaaaaaaaa":2
|
||||
|
||||
MPI random in range: same size result (64-bit limbs)
|
||||
mpi_random_grown:1:"aaaaaaaaaaaaaaaa":1
|
||||
|
||||
MPI random in range: larger result
|
||||
mpi_random_grown:1:"aaaaaaaaaaaaaaaa":3
|
||||
|
||||
MPI random in range: leading 0 limb in upper bound #0
|
||||
mpi_random_grown:1:"00aaaaaaaaaaaaaaaa":0
|
||||
|
||||
MPI random in range: leading 0 limb in upper bound #1
|
||||
mpi_random_grown:1:"00aaaaaaaaaaaaaaaa":1
|
||||
|
||||
MPI random in range: leading 0 limb in upper bound #2
|
||||
mpi_random_grown:1:"00aaaaaaaaaaaaaaaa":2
|
||||
|
||||
MPI random in range: leading 0 limb in upper bound #3
|
||||
mpi_random_grown:1:"00aaaaaaaaaaaaaaaa":3
|
||||
|
||||
MPI random in range: leading 0 limb in upper bound #4
|
||||
mpi_random_grown:1:"00aaaaaaaaaaaaaaaa":4
|
||||
|
||||
MPI random bad arguments: min < 0
|
||||
mpi_random_fail:-1:"04":MBEDTLS_ERR_MPI_BAD_INPUT_DATA
|
||||
|
||||
|
||||
@@ -1537,6 +1537,29 @@ exit:
|
||||
}
|
||||
/* END_CASE */
|
||||
|
||||
/* BEGIN_CASE */
|
||||
void mpi_random_grown( int min, data_t *bound_bytes, int nlimbs )
|
||||
{
|
||||
mbedtls_mpi upper_bound;
|
||||
mbedtls_mpi result;
|
||||
|
||||
mbedtls_mpi_init( &upper_bound );
|
||||
mbedtls_mpi_init( &result );
|
||||
|
||||
TEST_EQUAL( 0, mbedtls_mpi_grow( &result, nlimbs ) );
|
||||
TEST_EQUAL( 0, mbedtls_mpi_read_binary( &upper_bound,
|
||||
bound_bytes->x, bound_bytes->len ) );
|
||||
TEST_EQUAL( 0, mbedtls_mpi_random( &result, min, &upper_bound,
|
||||
mbedtls_test_rnd_std_rand, NULL ) );
|
||||
TEST_ASSERT( mbedtls_mpi_cmp_mpi( &result, &upper_bound ) < 0 );
|
||||
TEST_ASSERT( mbedtls_mpi_cmp_int( &result, min ) >= 0 );
|
||||
|
||||
exit:
|
||||
mbedtls_mpi_free( &upper_bound );
|
||||
mbedtls_mpi_free( &result );
|
||||
}
|
||||
/* END_CASE */
|
||||
|
||||
/* BEGIN_CASE */
|
||||
void mpi_random_fail( int min, data_t *bound_bytes, int expected_ret )
|
||||
{
|
||||
|
||||
Reference in New Issue
Block a user