summaryrefslogtreecommitdiffstats
path: root/src/tests/bigint_test.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/tests/bigint_test.c')
-rw-r--r--src/tests/bigint_test.c112
1 files changed, 97 insertions, 15 deletions
diff --git a/src/tests/bigint_test.c b/src/tests/bigint_test.c
index 8d40c318..76aca105 100644
--- a/src/tests/bigint_test.c
+++ b/src/tests/bigint_test.c
@@ -149,16 +149,38 @@ void bigint_shrink_sample ( const bigint_element_t *source0,
bigint_shrink ( source, dest );
}
+void bigint_copy_sample ( const bigint_element_t *source0,
+ bigint_element_t *dest0, unsigned int size ) {
+ const bigint_t ( size ) *source __attribute__ (( may_alias ))
+ = ( ( const void * ) source0 );
+ bigint_t ( size ) *dest __attribute__ (( may_alias ))
+ = ( ( void * ) dest0 );
+
+ bigint_copy ( source, dest );
+}
+
+void bigint_swap_sample ( bigint_element_t *first0, bigint_element_t *second0,
+ unsigned int size, int swap ) {
+ bigint_t ( size ) *first __attribute__ (( may_alias ))
+ = ( ( void * ) first0 );
+ bigint_t ( size ) *second __attribute__ (( may_alias ))
+ = ( ( void * ) second0 );
+
+ bigint_swap ( first, second, swap );
+}
+
void bigint_multiply_sample ( const bigint_element_t *multiplicand0,
+ unsigned int multiplicand_size,
const bigint_element_t *multiplier0,
- bigint_element_t *result0,
- unsigned int size ) {
- const bigint_t ( size ) *multiplicand __attribute__ (( may_alias ))
- = ( ( const void * ) multiplicand0 );
- const bigint_t ( size ) *multiplier __attribute__ (( may_alias ))
- = ( ( const void * ) multiplier0 );
- bigint_t ( size * 2 ) *result __attribute__ (( may_alias ))
- = ( ( void * ) result0 );
+ unsigned int multiplier_size,
+ bigint_element_t *result0 ) {
+ unsigned int result_size = ( multiplicand_size + multiplier_size );
+ const bigint_t ( multiplicand_size ) __attribute__ (( may_alias ))
+ *multiplicand = ( ( const void * ) multiplicand0 );
+ const bigint_t ( multiplier_size ) __attribute__ (( may_alias ))
+ *multiplier = ( ( const void * ) multiplier0 );
+ bigint_t ( result_size ) __attribute__ (( may_alias ))
+ *result = ( ( void * ) result0 );
bigint_multiply ( multiplicand, multiplier, result );
}
@@ -419,6 +441,42 @@ void bigint_mod_exp_sample ( const bigint_element_t *base0,
} while ( 0 )
/**
+ * Report result of big integer swap test
+ *
+ * @v first Big integer to be conditionally swapped
+ * @v second Big integer to be conditionally swapped
+ */
+#define bigint_swap_ok( first, second ) do { \
+ static const uint8_t first_raw[] = first; \
+ static const uint8_t second_raw[] = second; \
+ uint8_t temp[ sizeof ( first_raw ) ]; \
+ unsigned int size = bigint_required_size ( sizeof ( temp) ); \
+ bigint_t ( size ) first_temp; \
+ bigint_t ( size ) second_temp; \
+ {} /* Fix emacs alignment */ \
+ \
+ assert ( sizeof ( first_raw ) == sizeof ( temp ) ); \
+ assert ( sizeof ( second_raw ) == sizeof ( temp ) ); \
+ bigint_init ( &first_temp, first_raw, sizeof ( first_raw ) ); \
+ bigint_init ( &second_temp, second_raw, sizeof ( second_raw ) );\
+ bigint_swap ( &first_temp, &second_temp, 0 ); \
+ bigint_done ( &first_temp, temp, sizeof ( temp ) ); \
+ ok ( memcmp ( temp, first_raw, sizeof ( temp ) ) == 0 ); \
+ bigint_done ( &second_temp, temp, sizeof ( temp ) ); \
+ ok ( memcmp ( temp, second_raw, sizeof ( temp ) ) == 0 ); \
+ bigint_swap ( &first_temp, &second_temp, 1 ); \
+ bigint_done ( &first_temp, temp, sizeof ( temp ) ); \
+ ok ( memcmp ( temp, second_raw, sizeof ( temp ) ) == 0 ); \
+ bigint_done ( &second_temp, temp, sizeof ( temp ) ); \
+ ok ( memcmp ( temp, first_raw, sizeof ( temp ) ) == 0 ); \
+ bigint_swap ( &first_temp, &second_temp, 1 ); \
+ bigint_done ( &first_temp, temp, sizeof ( temp ) ); \
+ ok ( memcmp ( temp, first_raw, sizeof ( temp ) ) == 0 ); \
+ bigint_done ( &second_temp, temp, sizeof ( temp ) ); \
+ ok ( memcmp ( temp, second_raw, sizeof ( temp ) ) == 0 ); \
+ } while ( 0 )
+
+/**
* Report result of big integer multiplication test
*
* @v multiplicand Big integer to be multiplied
@@ -430,17 +488,18 @@ void bigint_mod_exp_sample ( const bigint_element_t *base0,
static const uint8_t multiplier_raw[] = multiplier; \
static const uint8_t expected_raw[] = expected; \
uint8_t result_raw[ sizeof ( expected_raw ) ]; \
- unsigned int size = \
+ unsigned int multiplicand_size = \
bigint_required_size ( sizeof ( multiplicand_raw ) ); \
- bigint_t ( size ) multiplicand_temp; \
- bigint_t ( size ) multiplier_temp; \
- bigint_t ( size * 2 ) result_temp; \
+ unsigned int multiplier_size = \
+ bigint_required_size ( sizeof ( multiplier_raw ) ); \
+ bigint_t ( multiplicand_size ) multiplicand_temp; \
+ bigint_t ( multiplier_size ) multiplier_temp; \
+ bigint_t ( multiplicand_size + multiplier_size ) result_temp; \
{} /* Fix emacs alignment */ \
\
- assert ( bigint_size ( &multiplier_temp ) == \
- bigint_size ( &multiplicand_temp ) ); \
assert ( bigint_size ( &result_temp ) == \
- ( 2 * bigint_size ( &multiplicand_temp ) ) ); \
+ ( bigint_size ( &multiplicand_temp ) + \
+ bigint_size ( &multiplier_temp ) ) ); \
bigint_init ( &multiplicand_temp, multiplicand_raw, \
sizeof ( multiplicand_raw ) ); \
bigint_init ( &multiplier_temp, multiplier_raw, \
@@ -655,6 +714,15 @@ static void bigint_test_exec ( void ) {
bigint_subtract_ok ( BIGINT ( 0xbb, 0x77, 0x32, 0x5a ),
BIGINT ( 0x5a, 0xd5, 0xfe, 0x28 ),
BIGINT ( 0x9f, 0x5e, 0xcb, 0xce ) );
+ bigint_subtract_ok ( BIGINT ( 0x00, 0x00, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff ),
+ BIGINT ( 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x2a ),
+ BIGINT ( 0xff, 0xff, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x2b ) );
bigint_subtract_ok ( BIGINT ( 0x7b, 0xaa, 0x16, 0xcf, 0x15, 0x87,
0xe0, 0x4f, 0x2c, 0xa3, 0xec, 0x2f,
0x46, 0xfb, 0x83, 0xc6, 0xe0, 0xee,
@@ -1360,6 +1428,14 @@ static void bigint_test_exec ( void ) {
0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff ),
1024 );
+ bigint_swap_ok ( BIGINT ( 0x68, 0x65, 0x6c, 0x6c, 0x6f ),
+ BIGINT ( 0x77, 0x6f, 0x72, 0x6c, 0x64 ) );
+ bigint_swap_ok ( BIGINT ( 0xc8, 0x1c, 0x31, 0xd7, 0x13, 0x69, 0x47,
+ 0x32, 0xb0, 0x0a, 0xf7, 0x2d, 0xb9, 0xc3,
+ 0x35, 0x96 ),
+ BIGINT ( 0x8b, 0x1d, 0x8f, 0x21, 0x76, 0x16, 0x4c,
+ 0xf8, 0xb2, 0x63, 0xed, 0x89, 0x5e, 0x6b,
+ 0x35, 0x7c ) );
bigint_multiply_ok ( BIGINT ( 0xf0 ),
BIGINT ( 0xeb ),
BIGINT ( 0xdc, 0x50 ) );
@@ -1373,6 +1449,12 @@ static void bigint_test_exec ( void ) {
BIGINT ( 0x67, 0x3c, 0x5a, 0x16 ),
BIGINT ( 0x3c, 0xdb, 0x7f, 0xae, 0x12, 0x7e,
0xef, 0x16 ) );
+ bigint_multiply_ok ( BIGINT ( 0x39, 0x1f, 0xc8, 0x6a ),
+ BIGINT ( 0xba, 0x39, 0x4a, 0xb8, 0xac, 0xb3,
+ 0x4f, 0x64, 0x28, 0x46, 0xa6, 0x99 ),
+ BIGINT ( 0x29, 0x8d, 0xe0, 0x5d, 0x08, 0xea,
+ 0x0d, 0xc7, 0x82, 0x5d, 0xba, 0x96,
+ 0x1c, 0xef, 0x83, 0x5a ) );
bigint_multiply_ok ( BIGINT ( 0xe8, 0x08, 0x0b, 0xe9, 0x29, 0x36,
0xea, 0x51, 0x1d, 0x75, 0x1a, 0xd5,
0xba, 0xc6, 0xa0, 0xf3, 0x48, 0x5c,