From 90ec8e857c044d8789b92ec8f77d704e11fde445 Mon Sep 17 00:00:00 2001 From: Gilles Peskine Date: Thu, 10 Jun 2021 15:17:30 +0200 Subject: [PATCH] Overhaul testing of mbedtls_mpi_copy Replace the two test functions mbedtls_mpi_copy_sint (supporting signed inputs but always with exactly one limb) and mbedtls_mpi_copy_binary (supporting arbitrary-sized inputs but not negative inputs) by a single function that supports both arbitrary-sized inputs and arbitrary-signed inputs. This will allows testing combinations like negative source and zero-sized destination. Also generalize mpi_copy_self to support arbitrary inputs. Generate a new list of test cases systematically enumerating all possibilities among various categories: zero with 0 or 1 limb, negative or positive with 1 limb, negative or positive with >1 limb. I used the following Perl script: ``` sub rhs { $_ = $_[0]; s/bead/beef/; s/ca5cadedb01dfaceacc01ade/face1e55ca11ab1ecab005e5/; $_ } %v = ( "zero (null)" => "", "zero (1 limb)" => "0", "small positive" => "bead", "large positive" => "ca5cadedb01dfaceacc01ade", "small negative" => "-bead", "large negative" => "-ca5cadedb01dfaceacc01ade", ); foreach $s (sort keys %v) { foreach $d (sort keys %v) { printf "Copy %s to %s\nmbedtls_mpi_copy:\"%s\":\"%s\"\n\n", $s, $d, $v{$s}, rhs($v{$d}); } } foreach $s (sort keys %v) { printf "Copy self: %s\nmpi_copy_self:\"%s\"\n\n", $s, $v{$s}; } ``` Signed-off-by: Gilles Peskine --- tests/suites/test_suite_mpi.data | 137 ++++++++++++++++++++++----- tests/suites/test_suite_mpi.function | 56 ++++------- 2 files changed, 133 insertions(+), 60 deletions(-) diff --git a/tests/suites/test_suite_mpi.data b/tests/suites/test_suite_mpi.data index 7968501136..2f8cab2a7b 100644 --- a/tests/suites/test_suite_mpi.data +++ b/tests/suites/test_suite_mpi.data @@ -310,44 +310,131 @@ mbedtls_mpi_cmp_abs:10:"2":10:"-3":-1 Base test mbedtls_mpi_cmp_abs (Mix values) #3 mbedtls_mpi_cmp_abs:10:"-2":10:"1":1 -Copy zero (1 limb) to positive (1 limb) -mbedtls_mpi_copy_sint:0:1500 +Copy large negative to large negative +mbedtls_mpi_copy:"-ca5cadedb01dfaceacc01ade":"-face1e55ca11ab1ecab005e5" -Copy zero (1 limb) to negative (1 limb) -mbedtls_mpi_copy_sint:0:-1500 +Copy large negative to large positive +mbedtls_mpi_copy:"-ca5cadedb01dfaceacc01ade":"face1e55ca11ab1ecab005e5" -Copy positive (1 limb) to zero (1 limb) -mbedtls_mpi_copy_sint:1500:0 +Copy large negative to small negative +mbedtls_mpi_copy:"-ca5cadedb01dfaceacc01ade":"-beef" -Copy negative (1 limb) to zero (1 limb) -mbedtls_mpi_copy_sint:-1500:0 +Copy large negative to small positive +mbedtls_mpi_copy:"-ca5cadedb01dfaceacc01ade":"beef" -Copy positive (1 limb) to negative (1 limb) -mbedtls_mpi_copy_sint:1500:-42 +Copy large negative to zero (1 limb) +mbedtls_mpi_copy:"-ca5cadedb01dfaceacc01ade":"0" -Copy negative (1 limb) to positive (1 limb) -mbedtls_mpi_copy_sint:-42:1500 +Copy large negative to zero (null) +mbedtls_mpi_copy:"-ca5cadedb01dfaceacc01ade":"" + +Copy large positive to large negative +mbedtls_mpi_copy:"ca5cadedb01dfaceacc01ade":"-face1e55ca11ab1ecab005e5" + +Copy large positive to large positive +mbedtls_mpi_copy:"ca5cadedb01dfaceacc01ade":"face1e55ca11ab1ecab005e5" + +Copy large positive to small negative +mbedtls_mpi_copy:"ca5cadedb01dfaceacc01ade":"-beef" + +Copy large positive to small positive +mbedtls_mpi_copy:"ca5cadedb01dfaceacc01ade":"beef" + +Copy large positive to zero (1 limb) +mbedtls_mpi_copy:"ca5cadedb01dfaceacc01ade":"0" + +Copy large positive to zero (null) +mbedtls_mpi_copy:"ca5cadedb01dfaceacc01ade":"" + +Copy small negative to large negative +mbedtls_mpi_copy:"-bead":"-face1e55ca11ab1ecab005e5" + +Copy small negative to large positive +mbedtls_mpi_copy:"-bead":"face1e55ca11ab1ecab005e5" + +Copy small negative to small negative +mbedtls_mpi_copy:"-bead":"-beef" + +Copy small negative to small positive +mbedtls_mpi_copy:"-bead":"beef" + +Copy small negative to zero (1 limb) +mbedtls_mpi_copy:"-bead":"0" + +Copy small negative to zero (null) +mbedtls_mpi_copy:"-bead":"" + +Copy small positive to large negative +mbedtls_mpi_copy:"bead":"-face1e55ca11ab1ecab005e5" + +Copy small positive to large positive +mbedtls_mpi_copy:"bead":"face1e55ca11ab1ecab005e5" + +Copy small positive to small negative +mbedtls_mpi_copy:"bead":"-beef" + +Copy small positive to small positive +mbedtls_mpi_copy:"bead":"beef" + +Copy small positive to zero (1 limb) +mbedtls_mpi_copy:"bead":"0" + +Copy small positive to zero (null) +mbedtls_mpi_copy:"bead":"" + +Copy zero (1 limb) to large negative +mbedtls_mpi_copy:"0":"-face1e55ca11ab1ecab005e5" + +Copy zero (1 limb) to large positive +mbedtls_mpi_copy:"0":"face1e55ca11ab1ecab005e5" + +Copy zero (1 limb) to small negative +mbedtls_mpi_copy:"0":"-beef" + +Copy zero (1 limb) to small positive +mbedtls_mpi_copy:"0":"beef" + +Copy zero (1 limb) to zero (1 limb) +mbedtls_mpi_copy:"0":"0" + +Copy zero (1 limb) to zero (null) +mbedtls_mpi_copy:"0":"" + +Copy zero (null) to large negative +mbedtls_mpi_copy:"":"-face1e55ca11ab1ecab005e5" + +Copy zero (null) to large positive +mbedtls_mpi_copy:"":"face1e55ca11ab1ecab005e5" + +Copy zero (null) to small negative +mbedtls_mpi_copy:"":"-beef" + +Copy zero (null) to small positive +mbedtls_mpi_copy:"":"beef" + +Copy zero (null) to zero (1 limb) +mbedtls_mpi_copy:"":"0" Copy zero (null) to zero (null) -mbedtls_mpi_copy_binary:"":"" +mbedtls_mpi_copy:"":"" -Copy zero (null) to positive (1 limb) -mbedtls_mpi_copy_binary:"":"1234" +Copy self: large negative +mpi_copy_self:"-ca5cadedb01dfaceacc01ade" -Copy positive (1 limb) to zero (null) -mbedtls_mpi_copy_binary:"1234":"" +Copy self: large positive +mpi_copy_self:"ca5cadedb01dfaceacc01ade" -Copy positive to larger -mbedtls_mpi_copy_binary:"bead":"ca5cadedb01dfaceacc01ade" +Copy self: small negative +mpi_copy_self:"-bead" -Copy positive to smaller -mbedtls_mpi_copy_binary:"ca5cadedb01dfaceacc01ade":"bead" - -Copy self: positive (1 limb) -mpi_copy_self:14 +Copy self: small positive +mpi_copy_self:"bead" Copy self: zero (1 limb) -mpi_copy_self:0 +mpi_copy_self:"0" + +Copy self: zero (null) +mpi_copy_self:"" Swap zero (1 limb) with positive (1 limb) mbedtls_mpi_swap_sint:0:1500 diff --git a/tests/suites/test_suite_mpi.function b/tests/suites/test_suite_mpi.function index d45d3dcf81..42dbafa2d7 100644 --- a/tests/suites/test_suite_mpi.function +++ b/tests/suites/test_suite_mpi.function @@ -501,56 +501,42 @@ exit: /* END_CASE */ /* BEGIN_CASE */ -void mbedtls_mpi_copy_sint( int input_X, int input_Y ) +void mbedtls_mpi_copy( char *src_hex, char *dst_hex ) { - mbedtls_mpi X, Y; - mbedtls_mpi_init( &X ); mbedtls_mpi_init( &Y ); + mbedtls_mpi src, dst; + mbedtls_mpi_init( &src ); + mbedtls_mpi_init( &dst ); - TEST_ASSERT( mbedtls_mpi_lset( &X, input_X ) == 0 ); - TEST_ASSERT( mbedtls_mpi_lset( &Y, input_Y ) == 0 ); + TEST_ASSERT( mbedtls_test_read_mpi( &src, 16, src_hex ) == 0 ); + TEST_ASSERT( mbedtls_test_read_mpi( &dst, 16, dst_hex ) == 0 ); - TEST_ASSERT( mbedtls_mpi_copy( &Y, &X ) == 0 ); - TEST_ASSERT( sign_is_valid( &Y ) ); - TEST_ASSERT( mbedtls_mpi_cmp_int( &X, input_X ) == 0 ); - TEST_ASSERT( mbedtls_mpi_cmp_int( &Y, input_X ) == 0 ); + TEST_ASSERT( mbedtls_mpi_copy( &dst, &src ) == 0 ); + + TEST_ASSERT( sign_is_valid( &dst ) ); + TEST_ASSERT( mbedtls_mpi_cmp_mpi( &dst, &src ) == 0 ); exit: - mbedtls_mpi_free( &X ); mbedtls_mpi_free( &Y ); + mbedtls_mpi_free( &src ); + mbedtls_mpi_free( &dst ); } /* END_CASE */ /* BEGIN_CASE */ -void mbedtls_mpi_copy_binary( data_t *input_X, data_t *input_Y ) +void mpi_copy_self( char *input_X ) { - mbedtls_mpi X, Y, X0; - mbedtls_mpi_init( &X ); mbedtls_mpi_init( &Y ); mbedtls_mpi_init( &X0 ); - - TEST_ASSERT( mbedtls_mpi_read_binary( &X, input_X->x, input_X->len ) == 0 ); - TEST_ASSERT( mbedtls_mpi_read_binary( &Y, input_Y->x, input_Y->len ) == 0 ); - TEST_ASSERT( mbedtls_mpi_read_binary( &X0, input_X->x, input_X->len ) == 0 ); - TEST_ASSERT( mbedtls_mpi_cmp_mpi( &X, &X0 ) == 0 ); - - TEST_ASSERT( mbedtls_mpi_copy( &Y, &X ) == 0 ); - TEST_ASSERT( sign_is_valid( &Y ) ); - TEST_ASSERT( mbedtls_mpi_cmp_mpi( &X, &X0 ) == 0 ); - TEST_ASSERT( mbedtls_mpi_cmp_mpi( &Y, &X0 ) == 0 ); - -exit: - mbedtls_mpi_free( &X ); mbedtls_mpi_free( &Y ); mbedtls_mpi_free( &X0 ); -} -/* END_CASE */ - -/* BEGIN_CASE */ -void mpi_copy_self( int input_X ) -{ - mbedtls_mpi X; + mbedtls_mpi X, A; + mbedtls_mpi_init( &A ); mbedtls_mpi_init( &X ); - TEST_ASSERT( mbedtls_mpi_lset( &X, input_X ) == 0 ); + TEST_ASSERT( mbedtls_test_read_mpi( &X, 16, input_X ) == 0 ); TEST_ASSERT( mbedtls_mpi_copy( &X, &X ) == 0 ); - TEST_ASSERT( mbedtls_mpi_cmp_int( &X, input_X ) == 0 ); + + TEST_ASSERT( mbedtls_test_read_mpi( &A, 16, input_X ) == 0 ); + TEST_ASSERT( sign_is_valid( &X ) ); + TEST_ASSERT( mbedtls_mpi_cmp_mpi( &X, &A ) == 0 ); exit: + mbedtls_mpi_free( &A ); mbedtls_mpi_free( &X ); } /* END_CASE */