blob: c0fdf8e8dc80c388f384995f998ced287b422811 [file] [log] [blame]
Paul Bakker33b43f12013-08-20 11:48:36 +02001/* BEGIN_HEADER */
Rich Evansce2f2372015-02-06 13:57:42 +00002#include "polarssl/bignum.h"
Paul Bakker33b43f12013-08-20 11:48:36 +02003/* END_HEADER */
Paul Bakker367dae42009-06-28 21:50:27 +00004
Paul Bakker33b43f12013-08-20 11:48:36 +02005/* BEGIN_DEPENDENCIES
6 * depends_on:POLARSSL_BIGNUM_C
7 * END_DEPENDENCIES
8 */
Paul Bakker5690efc2011-05-26 13:16:06 +00009
Paul Bakker33b43f12013-08-20 11:48:36 +020010/* BEGIN_CASE */
Manuel Pégourié-Gonnard770b5e12015-04-29 17:02:01 +020011void mpi_null( )
12{
13 mpi X, Y, Z;
14
15 mpi_init( &X );
16 mpi_init( &Y );
17 mpi_init( &Z );
18
19 TEST_ASSERT( mpi_get_bit( &X, 42 ) == 0 );
20 TEST_ASSERT( mpi_lsb( &X ) == 0 );
21 TEST_ASSERT( mpi_msb( &X ) == 0 );
22 TEST_ASSERT( mpi_size( &X ) == 0 );
23
24exit:
25 mpi_free( &X );
26}
27/* END_CASE */
28
29/* BEGIN_CASE */
Paul Bakker33b43f12013-08-20 11:48:36 +020030void mpi_read_write_string( int radix_X, char *input_X, int radix_A,
31 char *input_A, int output_size, int result_read,
32 int result_write )
Paul Bakker367dae42009-06-28 21:50:27 +000033{
34 mpi X;
35 char str[1000];
Paul Bakker33b43f12013-08-20 11:48:36 +020036 size_t len = output_size;
Paul Bakker367dae42009-06-28 21:50:27 +000037
Paul Bakker6c591fa2011-05-05 11:49:20 +000038 mpi_init( &X );
Paul Bakker367dae42009-06-28 21:50:27 +000039
Paul Bakker33b43f12013-08-20 11:48:36 +020040 TEST_ASSERT( mpi_read_string( &X, radix_X, input_X ) == result_read );
41 if( result_read == 0 )
Paul Bakkerba48cb22009-07-12 11:01:32 +000042 {
Paul Bakker33b43f12013-08-20 11:48:36 +020043 TEST_ASSERT( mpi_write_string( &X, radix_A, str, &len ) == result_write );
44 if( result_write == 0 )
Paul Bakkerba48cb22009-07-12 11:01:32 +000045 {
Paul Bakker33b43f12013-08-20 11:48:36 +020046 TEST_ASSERT( strcasecmp( str, input_A ) == 0 );
Paul Bakkerba48cb22009-07-12 11:01:32 +000047 }
48 }
Paul Bakker6c591fa2011-05-05 11:49:20 +000049
Paul Bakkerbd51b262014-07-10 15:26:12 +020050exit:
Paul Bakker6c591fa2011-05-05 11:49:20 +000051 mpi_free( &X );
Paul Bakkere896fea2009-07-06 06:40:23 +000052}
Paul Bakker33b43f12013-08-20 11:48:36 +020053/* END_CASE */
Paul Bakkere896fea2009-07-06 06:40:23 +000054
Paul Bakker33b43f12013-08-20 11:48:36 +020055/* BEGIN_CASE */
56void mpi_read_binary( char *input_X, int radix_A, char *input_A )
Paul Bakkere896fea2009-07-06 06:40:23 +000057{
58 mpi X;
59 unsigned char str[1000];
60 unsigned char buf[1000];
Paul Bakkerf4a3f302011-04-24 15:53:29 +000061 size_t len = 1000;
62 size_t input_len;
Paul Bakkere896fea2009-07-06 06:40:23 +000063
Paul Bakker6c591fa2011-05-05 11:49:20 +000064 mpi_init( &X );
Paul Bakkere896fea2009-07-06 06:40:23 +000065
Paul Bakker33b43f12013-08-20 11:48:36 +020066 input_len = unhexify( buf, input_X );
Paul Bakkere896fea2009-07-06 06:40:23 +000067
68 TEST_ASSERT( mpi_read_binary( &X, buf, input_len ) == 0 );
Paul Bakker33b43f12013-08-20 11:48:36 +020069 TEST_ASSERT( mpi_write_string( &X, radix_A, (char *) str, &len ) == 0 );
70 TEST_ASSERT( strcmp( (char *) str, input_A ) == 0 );
Paul Bakker6c591fa2011-05-05 11:49:20 +000071
Paul Bakkerbd51b262014-07-10 15:26:12 +020072exit:
Paul Bakker6c591fa2011-05-05 11:49:20 +000073 mpi_free( &X );
Paul Bakkere896fea2009-07-06 06:40:23 +000074}
Paul Bakker33b43f12013-08-20 11:48:36 +020075/* END_CASE */
Paul Bakkere896fea2009-07-06 06:40:23 +000076
Paul Bakker33b43f12013-08-20 11:48:36 +020077/* BEGIN_CASE */
78void mpi_write_binary( int radix_X, char *input_X, char *input_A,
79 int output_size, int result )
Paul Bakkere896fea2009-07-06 06:40:23 +000080{
81 mpi X;
82 unsigned char str[1000];
83 unsigned char buf[1000];
Paul Bakkerf4a3f302011-04-24 15:53:29 +000084 size_t buflen;
Paul Bakkere896fea2009-07-06 06:40:23 +000085
86 memset( buf, 0x00, 1000 );
87 memset( str, 0x00, 1000 );
88
Paul Bakker6c591fa2011-05-05 11:49:20 +000089 mpi_init( &X );
Paul Bakkere896fea2009-07-06 06:40:23 +000090
Paul Bakker33b43f12013-08-20 11:48:36 +020091 TEST_ASSERT( mpi_read_string( &X, radix_X, input_X ) == 0 );
Paul Bakkere896fea2009-07-06 06:40:23 +000092
Paul Bakker69998dd2009-07-11 19:15:20 +000093 buflen = mpi_size( &X );
Paul Bakker33b43f12013-08-20 11:48:36 +020094 if( buflen > (size_t) output_size )
95 buflen = (size_t) output_size;
Paul Bakkere896fea2009-07-06 06:40:23 +000096
Paul Bakker33b43f12013-08-20 11:48:36 +020097 TEST_ASSERT( mpi_write_binary( &X, buf, buflen ) == result );
98 if( result == 0)
Paul Bakkerba48cb22009-07-12 11:01:32 +000099 {
100 hexify( str, buf, buflen );
Paul Bakkere896fea2009-07-06 06:40:23 +0000101
Paul Bakker33b43f12013-08-20 11:48:36 +0200102 TEST_ASSERT( strcasecmp( (char *) str, input_A ) == 0 );
Paul Bakkerba48cb22009-07-12 11:01:32 +0000103 }
Paul Bakker6c591fa2011-05-05 11:49:20 +0000104
Paul Bakkerbd51b262014-07-10 15:26:12 +0200105exit:
Paul Bakker6c591fa2011-05-05 11:49:20 +0000106 mpi_free( &X );
Paul Bakkere896fea2009-07-06 06:40:23 +0000107}
Paul Bakker33b43f12013-08-20 11:48:36 +0200108/* END_CASE */
Paul Bakkere896fea2009-07-06 06:40:23 +0000109
Paul Bakker428b9ba2013-09-15 15:20:37 +0200110/* BEGIN_CASE depends_on:POLARSSL_FS_IO */
Paul Bakker33b43f12013-08-20 11:48:36 +0200111void mpi_read_file( int radix_X, char *input_file, char *input_A,
112 int result )
Paul Bakkere896fea2009-07-06 06:40:23 +0000113{
114 mpi X;
115 unsigned char str[1000];
116 unsigned char buf[1000];
Paul Bakkerf4a3f302011-04-24 15:53:29 +0000117 size_t buflen;
Paul Bakker69998dd2009-07-11 19:15:20 +0000118 FILE *file;
Manuel Pégourié-Gonnarde43187d2015-02-14 16:01:34 +0000119 int ret;
Paul Bakkere896fea2009-07-06 06:40:23 +0000120
121 memset( buf, 0x00, 1000 );
122 memset( str, 0x00, 1000 );
123
Paul Bakker6c591fa2011-05-05 11:49:20 +0000124 mpi_init( &X );
Paul Bakkere896fea2009-07-06 06:40:23 +0000125
Paul Bakker33b43f12013-08-20 11:48:36 +0200126 file = fopen( input_file, "r" );
Paul Bakker8a0c0a92014-04-17 16:08:20 +0200127 TEST_ASSERT( file != NULL );
Manuel Pégourié-Gonnarde43187d2015-02-14 16:01:34 +0000128 ret = mpi_read_file( &X, radix_X, file );
Paul Bakkere896fea2009-07-06 06:40:23 +0000129 fclose(file);
Manuel Pégourié-Gonnarde43187d2015-02-14 16:01:34 +0000130 TEST_ASSERT( ret == result );
Paul Bakkere896fea2009-07-06 06:40:23 +0000131
Paul Bakker33b43f12013-08-20 11:48:36 +0200132 if( result == 0 )
Paul Bakkerba48cb22009-07-12 11:01:32 +0000133 {
134 buflen = mpi_size( &X );
135 TEST_ASSERT( mpi_write_binary( &X, buf, buflen ) == 0 );
Paul Bakkere896fea2009-07-06 06:40:23 +0000136
Paul Bakkerba48cb22009-07-12 11:01:32 +0000137 hexify( str, buf, buflen );
Paul Bakkere896fea2009-07-06 06:40:23 +0000138
Paul Bakker33b43f12013-08-20 11:48:36 +0200139 TEST_ASSERT( strcasecmp( (char *) str, input_A ) == 0 );
Paul Bakkerba48cb22009-07-12 11:01:32 +0000140 }
Paul Bakker6c591fa2011-05-05 11:49:20 +0000141
Paul Bakkerbd51b262014-07-10 15:26:12 +0200142exit:
Paul Bakker6c591fa2011-05-05 11:49:20 +0000143 mpi_free( &X );
Paul Bakkere896fea2009-07-06 06:40:23 +0000144}
Paul Bakker33b43f12013-08-20 11:48:36 +0200145/* END_CASE */
Paul Bakkere896fea2009-07-06 06:40:23 +0000146
Paul Bakker428b9ba2013-09-15 15:20:37 +0200147/* BEGIN_CASE depends_on:POLARSSL_FS_IO */
Paul Bakker33b43f12013-08-20 11:48:36 +0200148void mpi_write_file( int radix_X, char *input_X, int output_radix,
149 char *output_file )
Paul Bakkere896fea2009-07-06 06:40:23 +0000150{
151 mpi X, Y;
Paul Bakker69998dd2009-07-11 19:15:20 +0000152 FILE *file_out, *file_in;
153
Paul Bakker6c591fa2011-05-05 11:49:20 +0000154 mpi_init( &X ); mpi_init( &Y );
Paul Bakkere896fea2009-07-06 06:40:23 +0000155
Paul Bakker33b43f12013-08-20 11:48:36 +0200156 TEST_ASSERT( mpi_read_string( &X, radix_X, input_X ) == 0 );
Paul Bakkere896fea2009-07-06 06:40:23 +0000157
Paul Bakker33b43f12013-08-20 11:48:36 +0200158 file_out = fopen( output_file, "w" );
Paul Bakker5690efc2011-05-26 13:16:06 +0000159 TEST_ASSERT( file_out != NULL );
Paul Bakker33b43f12013-08-20 11:48:36 +0200160 TEST_ASSERT( mpi_write_file( NULL, &X, output_radix, file_out ) == 0 );
Paul Bakkere896fea2009-07-06 06:40:23 +0000161 fclose(file_out);
162
Paul Bakker33b43f12013-08-20 11:48:36 +0200163 file_in = fopen( output_file, "r" );
Paul Bakker5690efc2011-05-26 13:16:06 +0000164 TEST_ASSERT( file_in != NULL );
Paul Bakker33b43f12013-08-20 11:48:36 +0200165 TEST_ASSERT( mpi_read_file( &Y, output_radix, file_in ) == 0 );
Paul Bakkere896fea2009-07-06 06:40:23 +0000166 fclose(file_in);
167
168 TEST_ASSERT( mpi_cmp_mpi( &X, &Y ) == 0 );
Paul Bakker6c591fa2011-05-05 11:49:20 +0000169
Paul Bakkerbd51b262014-07-10 15:26:12 +0200170exit:
Paul Bakker6c591fa2011-05-05 11:49:20 +0000171 mpi_free( &X ); mpi_free( &Y );
Paul Bakkere896fea2009-07-06 06:40:23 +0000172}
Paul Bakker33b43f12013-08-20 11:48:36 +0200173/* END_CASE */
Paul Bakkere896fea2009-07-06 06:40:23 +0000174
Paul Bakker33b43f12013-08-20 11:48:36 +0200175/* BEGIN_CASE */
176void mpi_get_bit( int radix_X, char *input_X, int pos, int val )
Paul Bakker2f5947e2011-05-18 15:47:11 +0000177{
178 mpi X;
179 mpi_init( &X );
Paul Bakker33b43f12013-08-20 11:48:36 +0200180 TEST_ASSERT( mpi_read_string( &X, radix_X, input_X ) == 0 );
181 TEST_ASSERT( mpi_get_bit( &X, pos ) == val );
Paul Bakker2f5947e2011-05-18 15:47:11 +0000182
Paul Bakkerbd51b262014-07-10 15:26:12 +0200183exit:
Paul Bakker2f5947e2011-05-18 15:47:11 +0000184 mpi_free( &X );
185}
Paul Bakker33b43f12013-08-20 11:48:36 +0200186/* END_CASE */
Paul Bakker2f5947e2011-05-18 15:47:11 +0000187
Paul Bakker33b43f12013-08-20 11:48:36 +0200188/* BEGIN_CASE */
189void mpi_set_bit( int radix_X, char *input_X, int pos, int val, int radix_Y,
190 char *output_Y )
Paul Bakker2f5947e2011-05-18 15:47:11 +0000191{
192 mpi X, Y;
193 mpi_init( &X ); mpi_init( &Y );
194
Paul Bakker33b43f12013-08-20 11:48:36 +0200195 TEST_ASSERT( mpi_read_string( &X, radix_X, input_X ) == 0 );
196 TEST_ASSERT( mpi_read_string( &Y, radix_Y, output_Y ) == 0 );
197 TEST_ASSERT( mpi_set_bit( &X, pos, val ) == 0 );
Paul Bakker2f5947e2011-05-18 15:47:11 +0000198 TEST_ASSERT( mpi_cmp_mpi( &X, &Y ) == 0 );
199
Paul Bakkerbd51b262014-07-10 15:26:12 +0200200exit:
Manuel Pégourié-Gonnarde44ec102012-11-17 12:42:51 +0100201 mpi_free( &X ); mpi_free( &Y );
Paul Bakker2f5947e2011-05-18 15:47:11 +0000202}
Paul Bakker33b43f12013-08-20 11:48:36 +0200203/* END_CASE */
Paul Bakker2f5947e2011-05-18 15:47:11 +0000204
Paul Bakker33b43f12013-08-20 11:48:36 +0200205/* BEGIN_CASE */
206void mpi_lsb( int radix_X, char *input_X, int nr_bits )
Paul Bakkere896fea2009-07-06 06:40:23 +0000207{
208 mpi X;
Paul Bakker6c591fa2011-05-05 11:49:20 +0000209 mpi_init( &X );
Paul Bakkere896fea2009-07-06 06:40:23 +0000210
Paul Bakker33b43f12013-08-20 11:48:36 +0200211 TEST_ASSERT( mpi_read_string( &X, radix_X, input_X ) == 0 );
212 TEST_ASSERT( mpi_lsb( &X ) == (size_t) nr_bits );
Paul Bakker6c591fa2011-05-05 11:49:20 +0000213
Paul Bakkerbd51b262014-07-10 15:26:12 +0200214exit:
Paul Bakker6c591fa2011-05-05 11:49:20 +0000215 mpi_free( &X );
Paul Bakkere896fea2009-07-06 06:40:23 +0000216}
Paul Bakker33b43f12013-08-20 11:48:36 +0200217/* END_CASE */
Paul Bakkere896fea2009-07-06 06:40:23 +0000218
Paul Bakker33b43f12013-08-20 11:48:36 +0200219/* BEGIN_CASE */
220void mpi_msb( int radix_X, char *input_X, int nr_bits )
Paul Bakkere896fea2009-07-06 06:40:23 +0000221{
222 mpi X;
Paul Bakker6c591fa2011-05-05 11:49:20 +0000223 mpi_init( &X );
Paul Bakkere896fea2009-07-06 06:40:23 +0000224
Paul Bakker33b43f12013-08-20 11:48:36 +0200225 TEST_ASSERT( mpi_read_string( &X, radix_X, input_X ) == 0 );
226 TEST_ASSERT( mpi_msb( &X ) == (size_t) nr_bits );
Paul Bakker6c591fa2011-05-05 11:49:20 +0000227
Paul Bakkerbd51b262014-07-10 15:26:12 +0200228exit:
Paul Bakker6c591fa2011-05-05 11:49:20 +0000229 mpi_free( &X );
Paul Bakker367dae42009-06-28 21:50:27 +0000230}
Paul Bakker33b43f12013-08-20 11:48:36 +0200231/* END_CASE */
Paul Bakker367dae42009-06-28 21:50:27 +0000232
Paul Bakker33b43f12013-08-20 11:48:36 +0200233/* BEGIN_CASE */
234void mpi_gcd( int radix_X, char *input_X, int radix_Y, char *input_Y,
235 int radix_A, char *input_A )
Paul Bakker367dae42009-06-28 21:50:27 +0000236{
237 mpi A, X, Y, Z;
Paul Bakker6c591fa2011-05-05 11:49:20 +0000238 mpi_init( &A ); mpi_init( &X ); mpi_init( &Y ); mpi_init( &Z );
Paul Bakker367dae42009-06-28 21:50:27 +0000239
Paul Bakker33b43f12013-08-20 11:48:36 +0200240 TEST_ASSERT( mpi_read_string( &X, radix_X, input_X ) == 0 );
241 TEST_ASSERT( mpi_read_string( &Y, radix_Y, input_Y ) == 0 );
242 TEST_ASSERT( mpi_read_string( &A, radix_A, input_A ) == 0 );
Paul Bakker367dae42009-06-28 21:50:27 +0000243 TEST_ASSERT( mpi_gcd( &Z, &X, &Y ) == 0 );
244 TEST_ASSERT( mpi_cmp_mpi( &Z, &A ) == 0 );
Paul Bakker6c591fa2011-05-05 11:49:20 +0000245
Paul Bakkerbd51b262014-07-10 15:26:12 +0200246exit:
Paul Bakker6c591fa2011-05-05 11:49:20 +0000247 mpi_free( &A ); mpi_free( &X ); mpi_free( &Y ); mpi_free( &Z );
Paul Bakker367dae42009-06-28 21:50:27 +0000248}
Paul Bakker33b43f12013-08-20 11:48:36 +0200249/* END_CASE */
Paul Bakker367dae42009-06-28 21:50:27 +0000250
Paul Bakker33b43f12013-08-20 11:48:36 +0200251/* BEGIN_CASE */
252void mpi_cmp_int( int input_X, int input_A, int result_CMP )
Paul Bakker367dae42009-06-28 21:50:27 +0000253{
254 mpi X;
Paul Bakker6c591fa2011-05-05 11:49:20 +0000255 mpi_init( &X );
Paul Bakker367dae42009-06-28 21:50:27 +0000256
Paul Bakker33b43f12013-08-20 11:48:36 +0200257 TEST_ASSERT( mpi_lset( &X, input_X ) == 0);
258 TEST_ASSERT( mpi_cmp_int( &X, input_A ) == result_CMP);
Paul Bakker6c591fa2011-05-05 11:49:20 +0000259
Paul Bakkerbd51b262014-07-10 15:26:12 +0200260exit:
Paul Bakker6c591fa2011-05-05 11:49:20 +0000261 mpi_free( &X );
Paul Bakker367dae42009-06-28 21:50:27 +0000262}
Paul Bakker33b43f12013-08-20 11:48:36 +0200263/* END_CASE */
Paul Bakker367dae42009-06-28 21:50:27 +0000264
Paul Bakker33b43f12013-08-20 11:48:36 +0200265/* BEGIN_CASE */
266void mpi_cmp_mpi( int radix_X, char *input_X, int radix_Y, char *input_Y,
267 int input_A )
Paul Bakker367dae42009-06-28 21:50:27 +0000268{
269 mpi X, Y;
Paul Bakker6c591fa2011-05-05 11:49:20 +0000270 mpi_init( &X ); mpi_init( &Y );
Paul Bakker367dae42009-06-28 21:50:27 +0000271
Paul Bakker33b43f12013-08-20 11:48:36 +0200272 TEST_ASSERT( mpi_read_string( &X, radix_X, input_X ) == 0 );
273 TEST_ASSERT( mpi_read_string( &Y, radix_Y, input_Y ) == 0 );
274 TEST_ASSERT( mpi_cmp_mpi( &X, &Y ) == input_A );
Paul Bakker6c591fa2011-05-05 11:49:20 +0000275
Paul Bakkerbd51b262014-07-10 15:26:12 +0200276exit:
Paul Bakker6c591fa2011-05-05 11:49:20 +0000277 mpi_free( &X ); mpi_free( &Y );
Paul Bakker367dae42009-06-28 21:50:27 +0000278}
Paul Bakker33b43f12013-08-20 11:48:36 +0200279/* END_CASE */
Paul Bakker367dae42009-06-28 21:50:27 +0000280
Paul Bakker33b43f12013-08-20 11:48:36 +0200281/* BEGIN_CASE */
282void mpi_cmp_abs( int radix_X, char *input_X, int radix_Y, char *input_Y,
283 int input_A )
Paul Bakker367dae42009-06-28 21:50:27 +0000284{
285 mpi X, Y;
Paul Bakker6c591fa2011-05-05 11:49:20 +0000286 mpi_init( &X ); mpi_init( &Y );
Paul Bakker367dae42009-06-28 21:50:27 +0000287
Paul Bakker33b43f12013-08-20 11:48:36 +0200288 TEST_ASSERT( mpi_read_string( &X, radix_X, input_X ) == 0 );
289 TEST_ASSERT( mpi_read_string( &Y, radix_Y, input_Y ) == 0 );
290 TEST_ASSERT( mpi_cmp_abs( &X, &Y ) == input_A );
Paul Bakker6c591fa2011-05-05 11:49:20 +0000291
Paul Bakkerbd51b262014-07-10 15:26:12 +0200292exit:
Paul Bakker6c591fa2011-05-05 11:49:20 +0000293 mpi_free( &X ); mpi_free( &Y );
Paul Bakker367dae42009-06-28 21:50:27 +0000294}
Paul Bakker33b43f12013-08-20 11:48:36 +0200295/* END_CASE */
Paul Bakker367dae42009-06-28 21:50:27 +0000296
Paul Bakker33b43f12013-08-20 11:48:36 +0200297/* BEGIN_CASE */
298void mpi_copy( int input_X, int input_A )
Paul Bakker367dae42009-06-28 21:50:27 +0000299{
300 mpi X, Y, A;
Paul Bakker6c591fa2011-05-05 11:49:20 +0000301 mpi_init( &X ); mpi_init( &Y ); mpi_init( &A );
Paul Bakker367dae42009-06-28 21:50:27 +0000302
Paul Bakker33b43f12013-08-20 11:48:36 +0200303 TEST_ASSERT( mpi_lset( &X, input_X ) == 0 );
304 TEST_ASSERT( mpi_lset( &Y, input_A ) == 0 );
305 TEST_ASSERT( mpi_lset( &A, input_A ) == 0 );
Paul Bakker367dae42009-06-28 21:50:27 +0000306 TEST_ASSERT( mpi_cmp_mpi( &X, &Y ) != 0 );
307 TEST_ASSERT( mpi_cmp_mpi( &Y, &A ) == 0 );
308 TEST_ASSERT( mpi_copy( &Y, &X ) == 0 );
309 TEST_ASSERT( mpi_cmp_mpi( &X, &Y ) == 0 );
310 TEST_ASSERT( mpi_cmp_mpi( &Y, &A ) != 0 );
Paul Bakker6c591fa2011-05-05 11:49:20 +0000311
Paul Bakkerbd51b262014-07-10 15:26:12 +0200312exit:
Paul Bakker6c591fa2011-05-05 11:49:20 +0000313 mpi_free( &X ); mpi_free( &Y ); mpi_free( &A );
Paul Bakker367dae42009-06-28 21:50:27 +0000314}
Paul Bakker33b43f12013-08-20 11:48:36 +0200315/* END_CASE */
Paul Bakker367dae42009-06-28 21:50:27 +0000316
Paul Bakker33b43f12013-08-20 11:48:36 +0200317/* BEGIN_CASE */
318void mpi_copy_self( int input_X )
Paul Bakkere896fea2009-07-06 06:40:23 +0000319{
320 mpi X;
Paul Bakker6c591fa2011-05-05 11:49:20 +0000321 mpi_init( &X );
Paul Bakkere896fea2009-07-06 06:40:23 +0000322
Paul Bakker33b43f12013-08-20 11:48:36 +0200323 TEST_ASSERT( mpi_lset( &X, input_X ) == 0 );
Paul Bakkere896fea2009-07-06 06:40:23 +0000324 TEST_ASSERT( mpi_copy( &X, &X ) == 0 );
Paul Bakker33b43f12013-08-20 11:48:36 +0200325 TEST_ASSERT( mpi_cmp_int( &X, input_X ) == 0 );
Paul Bakker6c591fa2011-05-05 11:49:20 +0000326
Paul Bakkerbd51b262014-07-10 15:26:12 +0200327exit:
Paul Bakker6c591fa2011-05-05 11:49:20 +0000328 mpi_free( &X );
Paul Bakkere896fea2009-07-06 06:40:23 +0000329}
Paul Bakker33b43f12013-08-20 11:48:36 +0200330/* END_CASE */
Paul Bakkere896fea2009-07-06 06:40:23 +0000331
Paul Bakker33b43f12013-08-20 11:48:36 +0200332/* BEGIN_CASE */
Manuel Pégourié-Gonnard58681632013-11-21 10:39:37 +0100333void mpi_shrink( int before, int used, int min, int after )
334{
335 mpi X;
336 mpi_init( &X );
337
338 TEST_ASSERT( mpi_grow( &X, before ) == 0 );
339 TEST_ASSERT( used <= before );
340 memset( X.p, 0x2a, used * sizeof( t_uint ) );
341 TEST_ASSERT( mpi_shrink( &X, min ) == 0 );
342 TEST_ASSERT( X.n == (size_t) after );
343
Paul Bakkerbd51b262014-07-10 15:26:12 +0200344exit:
Manuel Pégourié-Gonnard58681632013-11-21 10:39:37 +0100345 mpi_free( &X );
346}
347/* END_CASE */
348
349/* BEGIN_CASE */
Manuel Pégourié-Gonnard3e3d2b82013-11-21 21:12:26 +0100350void mpi_safe_cond_assign( int x_sign, char *x_str,
351 int y_sign, char *y_str )
Manuel Pégourié-Gonnard71c2c212013-11-21 16:56:39 +0100352{
353 mpi X, Y, XX;
354 mpi_init( &X ); mpi_init( &Y ); mpi_init( &XX );
355
356 TEST_ASSERT( mpi_read_string( &X, 16, x_str ) == 0 );
Manuel Pégourié-Gonnard3e3d2b82013-11-21 21:12:26 +0100357 X.s = x_sign;
Manuel Pégourié-Gonnard71c2c212013-11-21 16:56:39 +0100358 TEST_ASSERT( mpi_read_string( &Y, 16, y_str ) == 0 );
Manuel Pégourié-Gonnard3e3d2b82013-11-21 21:12:26 +0100359 Y.s = y_sign;
Manuel Pégourié-Gonnard71c2c212013-11-21 16:56:39 +0100360 TEST_ASSERT( mpi_copy( &XX, &X ) == 0 );
361
362 TEST_ASSERT( mpi_safe_cond_assign( &X, &Y, 0 ) == 0 );
363 TEST_ASSERT( mpi_cmp_mpi( &X, &XX ) == 0 );
364
365 TEST_ASSERT( mpi_safe_cond_assign( &X, &Y, 1 ) == 0 );
366 TEST_ASSERT( mpi_cmp_mpi( &X, &Y ) == 0 );
367
Paul Bakkerbd51b262014-07-10 15:26:12 +0200368exit:
Manuel Pégourié-Gonnard71c2c212013-11-21 16:56:39 +0100369 mpi_free( &X ); mpi_free( &Y ); mpi_free( &XX );
370}
371/* END_CASE */
372
373/* BEGIN_CASE */
Manuel Pégourié-Gonnarda60fe892013-12-04 21:41:50 +0100374void mpi_safe_cond_swap( int x_sign, char *x_str,
375 int y_sign, char *y_str )
376{
377 mpi X, Y, XX, YY;
378
379 mpi_init( &X ); mpi_init( &Y );
380 mpi_init( &XX ); mpi_init( &YY );
381
382 TEST_ASSERT( mpi_read_string( &X, 16, x_str ) == 0 );
383 X.s = x_sign;
384 TEST_ASSERT( mpi_read_string( &Y, 16, y_str ) == 0 );
385 Y.s = y_sign;
386
387 TEST_ASSERT( mpi_copy( &XX, &X ) == 0 );
388 TEST_ASSERT( mpi_copy( &YY, &Y ) == 0 );
389
390 TEST_ASSERT( mpi_safe_cond_swap( &X, &Y, 0 ) == 0 );
391 TEST_ASSERT( mpi_cmp_mpi( &X, &XX ) == 0 );
392 TEST_ASSERT( mpi_cmp_mpi( &Y, &YY ) == 0 );
393
394 TEST_ASSERT( mpi_safe_cond_swap( &X, &Y, 1 ) == 0 );
395 TEST_ASSERT( mpi_cmp_mpi( &Y, &XX ) == 0 );
396 TEST_ASSERT( mpi_cmp_mpi( &X, &YY ) == 0 );
397
Paul Bakkerbd51b262014-07-10 15:26:12 +0200398exit:
Manuel Pégourié-Gonnarda60fe892013-12-04 21:41:50 +0100399 mpi_free( &X ); mpi_free( &Y );
400 mpi_free( &XX ); mpi_free( &YY );
401}
402/* END_CASE */
403
404/* BEGIN_CASE */
Paul Bakker33b43f12013-08-20 11:48:36 +0200405void mpi_swap( int input_X, int input_Y )
Paul Bakker367dae42009-06-28 21:50:27 +0000406{
407 mpi X, Y, A;
Paul Bakker6c591fa2011-05-05 11:49:20 +0000408 mpi_init( &X ); mpi_init( &Y ); mpi_init( &A );
Paul Bakker367dae42009-06-28 21:50:27 +0000409
Paul Bakker33b43f12013-08-20 11:48:36 +0200410 TEST_ASSERT( mpi_lset( &X, input_X ) == 0 );
411 TEST_ASSERT( mpi_lset( &Y, input_Y ) == 0 );
412 TEST_ASSERT( mpi_lset( &A, input_X ) == 0 );
Paul Bakker367dae42009-06-28 21:50:27 +0000413 TEST_ASSERT( mpi_cmp_mpi( &X, &Y ) != 0 );
414 TEST_ASSERT( mpi_cmp_mpi( &X, &A ) == 0 );
415 mpi_swap( &X, &Y );
416 TEST_ASSERT( mpi_cmp_mpi( &X, &Y ) != 0 );
417 TEST_ASSERT( mpi_cmp_mpi( &Y, &A ) == 0 );
Paul Bakker6c591fa2011-05-05 11:49:20 +0000418
Paul Bakkerbd51b262014-07-10 15:26:12 +0200419exit:
Paul Bakker6c591fa2011-05-05 11:49:20 +0000420 mpi_free( &X ); mpi_free( &Y ); mpi_free( &A );
Paul Bakker367dae42009-06-28 21:50:27 +0000421}
Paul Bakker33b43f12013-08-20 11:48:36 +0200422/* END_CASE */
Paul Bakker367dae42009-06-28 21:50:27 +0000423
Paul Bakker33b43f12013-08-20 11:48:36 +0200424/* BEGIN_CASE */
425void mpi_add_mpi( int radix_X, char *input_X, int radix_Y, char *input_Y,
426 int radix_A, char *input_A )
Paul Bakker367dae42009-06-28 21:50:27 +0000427{
428 mpi X, Y, Z, A;
Paul Bakker6c591fa2011-05-05 11:49:20 +0000429 mpi_init( &X ); mpi_init( &Y ); mpi_init( &Z ); mpi_init( &A );
Paul Bakker367dae42009-06-28 21:50:27 +0000430
Paul Bakker33b43f12013-08-20 11:48:36 +0200431 TEST_ASSERT( mpi_read_string( &X, radix_X, input_X ) == 0 );
432 TEST_ASSERT( mpi_read_string( &Y, radix_Y, input_Y ) == 0 );
433 TEST_ASSERT( mpi_read_string( &A, radix_A, input_A ) == 0 );
Paul Bakker367dae42009-06-28 21:50:27 +0000434 TEST_ASSERT( mpi_add_mpi( &Z, &X, &Y ) == 0 );
435 TEST_ASSERT( mpi_cmp_mpi( &Z, &A ) == 0 );
Paul Bakker6c591fa2011-05-05 11:49:20 +0000436
Paul Bakkerbd51b262014-07-10 15:26:12 +0200437exit:
Paul Bakker6c591fa2011-05-05 11:49:20 +0000438 mpi_free( &X ); mpi_free( &Y ); mpi_free( &Z ); mpi_free( &A );
Paul Bakker367dae42009-06-28 21:50:27 +0000439}
Paul Bakker33b43f12013-08-20 11:48:36 +0200440/* END_CASE */
Paul Bakker367dae42009-06-28 21:50:27 +0000441
Paul Bakker33b43f12013-08-20 11:48:36 +0200442/* BEGIN_CASE */
Janos Follath87f14942015-10-25 10:58:03 +0100443void mpi_add_mpi_inplace( int radix_X, char *input_X, int radix_A, char *input_A )
444{
445 mpi X, A;
Janos Follathff5317e2015-10-25 12:29:13 +0100446 mpi_init( &X ); mpi_init( &A );
447
448 TEST_ASSERT( mpi_read_string( &A, radix_A, input_A ) == 0 );
Janos Follath87f14942015-10-25 10:58:03 +0100449
450 TEST_ASSERT( mpi_read_string( &X, radix_X, input_X ) == 0 );
Janos Follathff5317e2015-10-25 12:29:13 +0100451 TEST_ASSERT( mpi_sub_abs( &X, &X, &X ) == 0 );
452 TEST_ASSERT( mpi_cmp_int( &X, 0 ) == 0 );
453
454 TEST_ASSERT( mpi_read_string( &X, radix_X, input_X ) == 0 );
455 TEST_ASSERT( mpi_add_abs( &X, &X, &X ) == 0 );
456 TEST_ASSERT( mpi_cmp_mpi( &X, &A ) == 0 );
457
458 TEST_ASSERT( mpi_read_string( &X, radix_X, input_X ) == 0 );
Janos Follath87f14942015-10-25 10:58:03 +0100459 TEST_ASSERT( mpi_add_mpi( &X, &X, &X ) == 0 );
460 TEST_ASSERT( mpi_cmp_mpi( &X, &A ) == 0 );
461
462exit:
Janos Follathff5317e2015-10-25 12:29:13 +0100463 mpi_free( &X ); mpi_free( &A );
Janos Follath87f14942015-10-25 10:58:03 +0100464}
465/* END_CASE */
466
467
468/* BEGIN_CASE */
Paul Bakker33b43f12013-08-20 11:48:36 +0200469void mpi_add_abs( int radix_X, char *input_X, int radix_Y, char *input_Y,
470 int radix_A, char *input_A )
Paul Bakker367dae42009-06-28 21:50:27 +0000471{
472 mpi X, Y, Z, A;
Paul Bakker6c591fa2011-05-05 11:49:20 +0000473 mpi_init( &X ); mpi_init( &Y ); mpi_init( &Z ); mpi_init( &A );
Paul Bakker367dae42009-06-28 21:50:27 +0000474
Paul Bakker33b43f12013-08-20 11:48:36 +0200475 TEST_ASSERT( mpi_read_string( &X, radix_X, input_X ) == 0 );
476 TEST_ASSERT( mpi_read_string( &Y, radix_Y, input_Y ) == 0 );
477 TEST_ASSERT( mpi_read_string( &A, radix_A, input_A ) == 0 );
Paul Bakker367dae42009-06-28 21:50:27 +0000478 TEST_ASSERT( mpi_add_abs( &Z, &X, &Y ) == 0 );
479 TEST_ASSERT( mpi_cmp_mpi( &Z, &A ) == 0 );
Paul Bakker6c591fa2011-05-05 11:49:20 +0000480
Paul Bakkerbd51b262014-07-10 15:26:12 +0200481exit:
Paul Bakker6c591fa2011-05-05 11:49:20 +0000482 mpi_free( &X ); mpi_free( &Y ); mpi_free( &Z ); mpi_free( &A );
Paul Bakker367dae42009-06-28 21:50:27 +0000483}
Paul Bakker33b43f12013-08-20 11:48:36 +0200484/* END_CASE */
Paul Bakker367dae42009-06-28 21:50:27 +0000485
Paul Bakker33b43f12013-08-20 11:48:36 +0200486/* BEGIN_CASE */
487void mpi_add_abs_add_first( int radix_X, char *input_X, int radix_Y,
488 char *input_Y, int radix_A, char *input_A )
Paul Bakkerba48cb22009-07-12 11:01:32 +0000489{
490 mpi X, Y, A;
Paul Bakker6c591fa2011-05-05 11:49:20 +0000491 mpi_init( &X ); mpi_init( &Y ); mpi_init( &A );
Paul Bakkerba48cb22009-07-12 11:01:32 +0000492
Paul Bakker33b43f12013-08-20 11:48:36 +0200493 TEST_ASSERT( mpi_read_string( &X, radix_X, input_X ) == 0 );
494 TEST_ASSERT( mpi_read_string( &Y, radix_Y, input_Y ) == 0 );
495 TEST_ASSERT( mpi_read_string( &A, radix_A, input_A ) == 0 );
Paul Bakkerba48cb22009-07-12 11:01:32 +0000496 TEST_ASSERT( mpi_add_abs( &X, &X, &Y ) == 0 );
497 TEST_ASSERT( mpi_cmp_mpi( &X, &A ) == 0 );
Paul Bakker6c591fa2011-05-05 11:49:20 +0000498
Paul Bakkerbd51b262014-07-10 15:26:12 +0200499exit:
Paul Bakker6c591fa2011-05-05 11:49:20 +0000500 mpi_free( &X ); mpi_free( &Y ); mpi_free( &A );
Paul Bakkerba48cb22009-07-12 11:01:32 +0000501}
Paul Bakker33b43f12013-08-20 11:48:36 +0200502/* END_CASE */
Paul Bakkerba48cb22009-07-12 11:01:32 +0000503
Paul Bakker33b43f12013-08-20 11:48:36 +0200504/* BEGIN_CASE */
505void mpi_add_abs_add_second( int radix_X, char *input_X, int radix_Y,
506 char *input_Y, int radix_A, char *input_A )
Paul Bakkerba48cb22009-07-12 11:01:32 +0000507{
508 mpi X, Y, A;
Paul Bakker6c591fa2011-05-05 11:49:20 +0000509 mpi_init( &X ); mpi_init( &Y ); mpi_init( &A );
Paul Bakkerba48cb22009-07-12 11:01:32 +0000510
Paul Bakker33b43f12013-08-20 11:48:36 +0200511 TEST_ASSERT( mpi_read_string( &X, radix_X, input_X ) == 0 );
512 TEST_ASSERT( mpi_read_string( &Y, radix_Y, input_Y ) == 0 );
513 TEST_ASSERT( mpi_read_string( &A, radix_A, input_A ) == 0 );
Paul Bakkerba48cb22009-07-12 11:01:32 +0000514 TEST_ASSERT( mpi_add_abs( &Y, &X, &Y ) == 0 );
515 TEST_ASSERT( mpi_cmp_mpi( &Y, &A ) == 0 );
Paul Bakker6c591fa2011-05-05 11:49:20 +0000516
Paul Bakkerbd51b262014-07-10 15:26:12 +0200517exit:
Paul Bakker6c591fa2011-05-05 11:49:20 +0000518 mpi_free( &X ); mpi_free( &Y ); mpi_free( &A );
Paul Bakkerba48cb22009-07-12 11:01:32 +0000519}
Paul Bakker33b43f12013-08-20 11:48:36 +0200520/* END_CASE */
Paul Bakkerba48cb22009-07-12 11:01:32 +0000521
Paul Bakker33b43f12013-08-20 11:48:36 +0200522/* BEGIN_CASE */
523void mpi_add_int( int radix_X, char *input_X, int input_Y, int radix_A,
524 char *input_A )
Paul Bakker367dae42009-06-28 21:50:27 +0000525{
526 mpi X, Z, A;
Paul Bakker6c591fa2011-05-05 11:49:20 +0000527 mpi_init( &X ); mpi_init( &Z ); mpi_init( &A );
Paul Bakker367dae42009-06-28 21:50:27 +0000528
Paul Bakker33b43f12013-08-20 11:48:36 +0200529 TEST_ASSERT( mpi_read_string( &X, radix_X, input_X ) == 0 );
530 TEST_ASSERT( mpi_read_string( &A, radix_A, input_A ) == 0 );
531 TEST_ASSERT( mpi_add_int( &Z, &X, input_Y ) == 0 );
Paul Bakker367dae42009-06-28 21:50:27 +0000532 TEST_ASSERT( mpi_cmp_mpi( &Z, &A ) == 0 );
Paul Bakker6c591fa2011-05-05 11:49:20 +0000533
Paul Bakkerbd51b262014-07-10 15:26:12 +0200534exit:
Paul Bakker6c591fa2011-05-05 11:49:20 +0000535 mpi_free( &X ); mpi_free( &Z ); mpi_free( &A );
Paul Bakker367dae42009-06-28 21:50:27 +0000536}
Paul Bakker33b43f12013-08-20 11:48:36 +0200537/* END_CASE */
Paul Bakker367dae42009-06-28 21:50:27 +0000538
Paul Bakker33b43f12013-08-20 11:48:36 +0200539/* BEGIN_CASE */
540void mpi_sub_mpi( int radix_X, char *input_X, int radix_Y, char *input_Y,
541 int radix_A, char *input_A )
Paul Bakker367dae42009-06-28 21:50:27 +0000542{
543 mpi X, Y, Z, A;
Paul Bakker6c591fa2011-05-05 11:49:20 +0000544 mpi_init( &X ); mpi_init( &Y ); mpi_init( &Z ); mpi_init( &A );
Paul Bakker367dae42009-06-28 21:50:27 +0000545
Paul Bakker33b43f12013-08-20 11:48:36 +0200546 TEST_ASSERT( mpi_read_string( &X, radix_X, input_X ) == 0 );
547 TEST_ASSERT( mpi_read_string( &Y, radix_Y, input_Y ) == 0 );
548 TEST_ASSERT( mpi_read_string( &A, radix_A, input_A ) == 0 );
Paul Bakker367dae42009-06-28 21:50:27 +0000549 TEST_ASSERT( mpi_sub_mpi( &Z, &X, &Y ) == 0 );
550 TEST_ASSERT( mpi_cmp_mpi( &Z, &A ) == 0 );
Paul Bakker6c591fa2011-05-05 11:49:20 +0000551
Paul Bakkerbd51b262014-07-10 15:26:12 +0200552exit:
Paul Bakker6c591fa2011-05-05 11:49:20 +0000553 mpi_free( &X ); mpi_free( &Y ); mpi_free( &Z ); mpi_free( &A );
Paul Bakker367dae42009-06-28 21:50:27 +0000554}
Paul Bakker33b43f12013-08-20 11:48:36 +0200555/* END_CASE */
Paul Bakker367dae42009-06-28 21:50:27 +0000556
Paul Bakker33b43f12013-08-20 11:48:36 +0200557/* BEGIN_CASE */
558void mpi_sub_abs( int radix_X, char *input_X, int radix_Y, char *input_Y,
559 int radix_A, char *input_A, int sub_result )
Paul Bakker367dae42009-06-28 21:50:27 +0000560{
561 mpi X, Y, Z, A;
562 int res;
Paul Bakker6c591fa2011-05-05 11:49:20 +0000563 mpi_init( &X ); mpi_init( &Y ); mpi_init( &Z ); mpi_init( &A );
Paul Bakker367dae42009-06-28 21:50:27 +0000564
Paul Bakker33b43f12013-08-20 11:48:36 +0200565 TEST_ASSERT( mpi_read_string( &X, radix_X, input_X ) == 0 );
566 TEST_ASSERT( mpi_read_string( &Y, radix_Y, input_Y ) == 0 );
567 TEST_ASSERT( mpi_read_string( &A, radix_A, input_A ) == 0 );
Paul Bakker367dae42009-06-28 21:50:27 +0000568
569 res = mpi_sub_abs( &Z, &X, &Y );
Paul Bakker33b43f12013-08-20 11:48:36 +0200570 TEST_ASSERT( res == sub_result );
Paul Bakker367dae42009-06-28 21:50:27 +0000571 if( res == 0 )
572 TEST_ASSERT( mpi_cmp_mpi( &Z, &A ) == 0 );
Paul Bakker6c591fa2011-05-05 11:49:20 +0000573
Paul Bakkerbd51b262014-07-10 15:26:12 +0200574exit:
Paul Bakker6c591fa2011-05-05 11:49:20 +0000575 mpi_free( &X ); mpi_free( &Y ); mpi_free( &Z ); mpi_free( &A );
Paul Bakker367dae42009-06-28 21:50:27 +0000576}
Paul Bakker33b43f12013-08-20 11:48:36 +0200577/* END_CASE */
Paul Bakker367dae42009-06-28 21:50:27 +0000578
Paul Bakker33b43f12013-08-20 11:48:36 +0200579/* BEGIN_CASE */
580void mpi_sub_int( int radix_X, char *input_X, int input_Y, int radix_A,
581 char *input_A )
Paul Bakker367dae42009-06-28 21:50:27 +0000582{
583 mpi X, Z, A;
Paul Bakker6c591fa2011-05-05 11:49:20 +0000584 mpi_init( &X ); mpi_init( &Z ); mpi_init( &A );
Paul Bakker367dae42009-06-28 21:50:27 +0000585
Paul Bakker33b43f12013-08-20 11:48:36 +0200586 TEST_ASSERT( mpi_read_string( &X, radix_X, input_X ) == 0 );
587 TEST_ASSERT( mpi_read_string( &A, radix_A, input_A ) == 0 );
588 TEST_ASSERT( mpi_sub_int( &Z, &X, input_Y ) == 0 );
Paul Bakker367dae42009-06-28 21:50:27 +0000589 TEST_ASSERT( mpi_cmp_mpi( &Z, &A ) == 0 );
Paul Bakker6c591fa2011-05-05 11:49:20 +0000590
Paul Bakkerbd51b262014-07-10 15:26:12 +0200591exit:
Paul Bakker6c591fa2011-05-05 11:49:20 +0000592 mpi_free( &X ); mpi_free( &Z ); mpi_free( &A );
Paul Bakker367dae42009-06-28 21:50:27 +0000593}
Paul Bakker33b43f12013-08-20 11:48:36 +0200594/* END_CASE */
Paul Bakker367dae42009-06-28 21:50:27 +0000595
Paul Bakker33b43f12013-08-20 11:48:36 +0200596/* BEGIN_CASE */
597void mpi_mul_mpi( int radix_X, char *input_X, int radix_Y, char *input_Y,
598 int radix_A, char *input_A )
Paul Bakker367dae42009-06-28 21:50:27 +0000599{
600 mpi X, Y, Z, A;
Paul Bakker6c591fa2011-05-05 11:49:20 +0000601 mpi_init( &X ); mpi_init( &Y ); mpi_init( &Z ); mpi_init( &A );
Paul Bakker367dae42009-06-28 21:50:27 +0000602
Paul Bakker33b43f12013-08-20 11:48:36 +0200603 TEST_ASSERT( mpi_read_string( &X, radix_X, input_X ) == 0 );
604 TEST_ASSERT( mpi_read_string( &Y, radix_Y, input_Y ) == 0 );
605 TEST_ASSERT( mpi_read_string( &A, radix_A, input_A ) == 0 );
Paul Bakker367dae42009-06-28 21:50:27 +0000606 TEST_ASSERT( mpi_mul_mpi( &Z, &X, &Y ) == 0 );
607 TEST_ASSERT( mpi_cmp_mpi( &Z, &A ) == 0 );
Paul Bakker6c591fa2011-05-05 11:49:20 +0000608
Paul Bakkerbd51b262014-07-10 15:26:12 +0200609exit:
Paul Bakker6c591fa2011-05-05 11:49:20 +0000610 mpi_free( &X ); mpi_free( &Y ); mpi_free( &Z ); mpi_free( &A );
Paul Bakker367dae42009-06-28 21:50:27 +0000611}
Paul Bakker33b43f12013-08-20 11:48:36 +0200612/* END_CASE */
Paul Bakker367dae42009-06-28 21:50:27 +0000613
Paul Bakker33b43f12013-08-20 11:48:36 +0200614/* BEGIN_CASE */
615void mpi_mul_int( int radix_X, char *input_X, int input_Y, int radix_A,
616 char *input_A, char *result_comparison )
Paul Bakker367dae42009-06-28 21:50:27 +0000617{
618 mpi X, Z, A;
Paul Bakker6c591fa2011-05-05 11:49:20 +0000619 mpi_init( &X ); mpi_init( &Z ); mpi_init( &A );
Paul Bakker367dae42009-06-28 21:50:27 +0000620
Paul Bakker33b43f12013-08-20 11:48:36 +0200621 TEST_ASSERT( mpi_read_string( &X, radix_X, input_X ) == 0 );
622 TEST_ASSERT( mpi_read_string( &A, radix_A, input_A ) == 0 );
623 TEST_ASSERT( mpi_mul_int( &Z, &X, input_Y ) == 0 );
Paul Bakkerdbd443d2013-08-16 13:38:47 +0200624 if( strcmp( result_comparison, "==" ) == 0 )
625 TEST_ASSERT( mpi_cmp_mpi( &Z, &A ) == 0 );
626 else if( strcmp( result_comparison, "!=" ) == 0 )
627 TEST_ASSERT( mpi_cmp_mpi( &Z, &A ) != 0 );
628 else
629 TEST_ASSERT( "unknown operator" == 0 );
Paul Bakker6c591fa2011-05-05 11:49:20 +0000630
Paul Bakkerbd51b262014-07-10 15:26:12 +0200631exit:
Paul Bakker6c591fa2011-05-05 11:49:20 +0000632 mpi_free( &X ); mpi_free( &Z ); mpi_free( &A );
Paul Bakker367dae42009-06-28 21:50:27 +0000633}
Paul Bakker33b43f12013-08-20 11:48:36 +0200634/* END_CASE */
Paul Bakker367dae42009-06-28 21:50:27 +0000635
Paul Bakker33b43f12013-08-20 11:48:36 +0200636/* BEGIN_CASE */
637void mpi_div_mpi( int radix_X, char *input_X, int radix_Y, char *input_Y,
638 int radix_A, char *input_A, int radix_B, char *input_B,
639 int div_result )
Paul Bakker367dae42009-06-28 21:50:27 +0000640{
641 mpi X, Y, Q, R, A, B;
642 int res;
Paul Bakker6c591fa2011-05-05 11:49:20 +0000643 mpi_init( &X ); mpi_init( &Y ); mpi_init( &Q ); mpi_init( &R );
644 mpi_init( &A ); mpi_init( &B );
Paul Bakker367dae42009-06-28 21:50:27 +0000645
Paul Bakker33b43f12013-08-20 11:48:36 +0200646 TEST_ASSERT( mpi_read_string( &X, radix_X, input_X ) == 0 );
647 TEST_ASSERT( mpi_read_string( &Y, radix_Y, input_Y ) == 0 );
648 TEST_ASSERT( mpi_read_string( &A, radix_A, input_A ) == 0 );
649 TEST_ASSERT( mpi_read_string( &B, radix_B, input_B ) == 0 );
Paul Bakker367dae42009-06-28 21:50:27 +0000650 res = mpi_div_mpi( &Q, &R, &X, &Y );
Paul Bakker33b43f12013-08-20 11:48:36 +0200651 TEST_ASSERT( res == div_result );
Paul Bakker367dae42009-06-28 21:50:27 +0000652 if( res == 0 )
653 {
654 TEST_ASSERT( mpi_cmp_mpi( &Q, &A ) == 0 );
655 TEST_ASSERT( mpi_cmp_mpi( &R, &B ) == 0 );
656 }
Paul Bakker6c591fa2011-05-05 11:49:20 +0000657
Paul Bakkerbd51b262014-07-10 15:26:12 +0200658exit:
Paul Bakker6c591fa2011-05-05 11:49:20 +0000659 mpi_free( &X ); mpi_free( &Y ); mpi_free( &Q ); mpi_free( &R );
660 mpi_free( &A ); mpi_free( &B );
Paul Bakker367dae42009-06-28 21:50:27 +0000661}
Paul Bakker33b43f12013-08-20 11:48:36 +0200662/* END_CASE */
Paul Bakker367dae42009-06-28 21:50:27 +0000663
Paul Bakker33b43f12013-08-20 11:48:36 +0200664/* BEGIN_CASE */
665void mpi_div_int( int radix_X, char *input_X, int input_Y, int radix_A,
666 char *input_A, int radix_B, char *input_B, int div_result )
Paul Bakker367dae42009-06-28 21:50:27 +0000667{
668 mpi X, Q, R, A, B;
669 int res;
Paul Bakker6c591fa2011-05-05 11:49:20 +0000670 mpi_init( &X ); mpi_init( &Q ); mpi_init( &R ); mpi_init( &A );
671 mpi_init( &B );
Paul Bakker367dae42009-06-28 21:50:27 +0000672
Paul Bakker33b43f12013-08-20 11:48:36 +0200673 TEST_ASSERT( mpi_read_string( &X, radix_X, input_X ) == 0 );
674 TEST_ASSERT( mpi_read_string( &A, radix_A, input_A ) == 0 );
675 TEST_ASSERT( mpi_read_string( &B, radix_B, input_B ) == 0 );
676 res = mpi_div_int( &Q, &R, &X, input_Y );
677 TEST_ASSERT( res == div_result );
Paul Bakker367dae42009-06-28 21:50:27 +0000678 if( res == 0 )
679 {
680 TEST_ASSERT( mpi_cmp_mpi( &Q, &A ) == 0 );
681 TEST_ASSERT( mpi_cmp_mpi( &R, &B ) == 0 );
682 }
Paul Bakker6c591fa2011-05-05 11:49:20 +0000683
Paul Bakkerbd51b262014-07-10 15:26:12 +0200684exit:
Paul Bakker6c591fa2011-05-05 11:49:20 +0000685 mpi_free( &X ); mpi_free( &Q ); mpi_free( &R ); mpi_free( &A );
686 mpi_free( &B );
Paul Bakker367dae42009-06-28 21:50:27 +0000687}
Paul Bakker33b43f12013-08-20 11:48:36 +0200688/* END_CASE */
Paul Bakker367dae42009-06-28 21:50:27 +0000689
Paul Bakker33b43f12013-08-20 11:48:36 +0200690/* BEGIN_CASE */
691void mpi_mod_mpi( int radix_X, char *input_X, int radix_Y, char *input_Y,
692 int radix_A, char *input_A, int div_result )
Paul Bakker367dae42009-06-28 21:50:27 +0000693{
Paul Bakkerf02c5642012-11-13 10:25:21 +0000694 mpi X, Y, A;
Paul Bakker367dae42009-06-28 21:50:27 +0000695 int res;
Paul Bakkerf02c5642012-11-13 10:25:21 +0000696 mpi_init( &X ); mpi_init( &Y ); mpi_init( &A );
Paul Bakker367dae42009-06-28 21:50:27 +0000697
Paul Bakker33b43f12013-08-20 11:48:36 +0200698 TEST_ASSERT( mpi_read_string( &X, radix_X, input_X ) == 0 );
699 TEST_ASSERT( mpi_read_string( &Y, radix_Y, input_Y ) == 0 );
700 TEST_ASSERT( mpi_read_string( &A, radix_A, input_A ) == 0 );
Paul Bakkerf02c5642012-11-13 10:25:21 +0000701 res = mpi_mod_mpi( &X, &X, &Y );
Paul Bakker33b43f12013-08-20 11:48:36 +0200702 TEST_ASSERT( res == div_result );
Paul Bakker367dae42009-06-28 21:50:27 +0000703 if( res == 0 )
704 {
Paul Bakkerf02c5642012-11-13 10:25:21 +0000705 TEST_ASSERT( mpi_cmp_mpi( &X, &A ) == 0 );
Paul Bakker367dae42009-06-28 21:50:27 +0000706 }
Paul Bakker6c591fa2011-05-05 11:49:20 +0000707
Paul Bakkerbd51b262014-07-10 15:26:12 +0200708exit:
Paul Bakkerf02c5642012-11-13 10:25:21 +0000709 mpi_free( &X ); mpi_free( &Y ); mpi_free( &A );
Paul Bakker367dae42009-06-28 21:50:27 +0000710}
Paul Bakker33b43f12013-08-20 11:48:36 +0200711/* END_CASE */
Paul Bakker367dae42009-06-28 21:50:27 +0000712
Paul Bakker33b43f12013-08-20 11:48:36 +0200713/* BEGIN_CASE */
714void mpi_mod_int( int radix_X, char *input_X, int input_Y, int input_A,
715 int div_result )
Paul Bakker367dae42009-06-28 21:50:27 +0000716{
717 mpi X;
718 int res;
Paul Bakkera755ca12011-04-24 09:11:17 +0000719 t_uint r;
Paul Bakker6c591fa2011-05-05 11:49:20 +0000720 mpi_init( &X );
Paul Bakker367dae42009-06-28 21:50:27 +0000721
Paul Bakker33b43f12013-08-20 11:48:36 +0200722 TEST_ASSERT( mpi_read_string( &X, radix_X, input_X ) == 0 );
723 res = mpi_mod_int( &r, &X, input_Y );
724 TEST_ASSERT( res == div_result );
Paul Bakker367dae42009-06-28 21:50:27 +0000725 if( res == 0 )
726 {
Paul Bakker33b43f12013-08-20 11:48:36 +0200727 TEST_ASSERT( r == (t_uint) input_A );
Paul Bakker367dae42009-06-28 21:50:27 +0000728 }
Paul Bakker6c591fa2011-05-05 11:49:20 +0000729
Paul Bakkerbd51b262014-07-10 15:26:12 +0200730exit:
Paul Bakker6c591fa2011-05-05 11:49:20 +0000731 mpi_free( &X );
Paul Bakker367dae42009-06-28 21:50:27 +0000732}
Paul Bakker33b43f12013-08-20 11:48:36 +0200733/* END_CASE */
Paul Bakker367dae42009-06-28 21:50:27 +0000734
Paul Bakker33b43f12013-08-20 11:48:36 +0200735/* BEGIN_CASE */
736void mpi_exp_mod( int radix_A, char *input_A, int radix_E, char *input_E,
737 int radix_N, char *input_N, int radix_RR, char *input_RR,
738 int radix_X, char *input_X, int div_result )
Paul Bakker367dae42009-06-28 21:50:27 +0000739{
740 mpi A, E, N, RR, Z, X;
741 int res;
Paul Bakker6c591fa2011-05-05 11:49:20 +0000742 mpi_init( &A ); mpi_init( &E ); mpi_init( &N );
743 mpi_init( &RR ); mpi_init( &Z ); mpi_init( &X );
Paul Bakker367dae42009-06-28 21:50:27 +0000744
Paul Bakker33b43f12013-08-20 11:48:36 +0200745 TEST_ASSERT( mpi_read_string( &A, radix_A, input_A ) == 0 );
746 TEST_ASSERT( mpi_read_string( &E, radix_E, input_E ) == 0 );
747 TEST_ASSERT( mpi_read_string( &N, radix_N, input_N ) == 0 );
748 TEST_ASSERT( mpi_read_string( &X, radix_X, input_X ) == 0 );
Paul Bakker367dae42009-06-28 21:50:27 +0000749
Paul Bakker33b43f12013-08-20 11:48:36 +0200750 if( strlen( input_RR ) )
751 TEST_ASSERT( mpi_read_string( &RR, radix_RR, input_RR ) == 0 );
Paul Bakker367dae42009-06-28 21:50:27 +0000752
753 res = mpi_exp_mod( &Z, &A, &E, &N, &RR );
Paul Bakker33b43f12013-08-20 11:48:36 +0200754 TEST_ASSERT( res == div_result );
Paul Bakker367dae42009-06-28 21:50:27 +0000755 if( res == 0 )
756 {
757 TEST_ASSERT( mpi_cmp_mpi( &Z, &X ) == 0 );
758 }
Paul Bakker6c591fa2011-05-05 11:49:20 +0000759
Paul Bakkerbd51b262014-07-10 15:26:12 +0200760exit:
Paul Bakker6c591fa2011-05-05 11:49:20 +0000761 mpi_free( &A ); mpi_free( &E ); mpi_free( &N );
762 mpi_free( &RR ); mpi_free( &Z ); mpi_free( &X );
Paul Bakker367dae42009-06-28 21:50:27 +0000763}
Paul Bakker33b43f12013-08-20 11:48:36 +0200764/* END_CASE */
Paul Bakker367dae42009-06-28 21:50:27 +0000765
Paul Bakker33b43f12013-08-20 11:48:36 +0200766/* BEGIN_CASE */
767void mpi_inv_mod( int radix_X, char *input_X, int radix_Y, char *input_Y,
768 int radix_A, char *input_A, int div_result )
Paul Bakker367dae42009-06-28 21:50:27 +0000769{
770 mpi X, Y, Z, A;
771 int res;
Paul Bakker6c591fa2011-05-05 11:49:20 +0000772 mpi_init( &X ); mpi_init( &Y ); mpi_init( &Z ); mpi_init( &A );
Paul Bakker367dae42009-06-28 21:50:27 +0000773
Paul Bakker33b43f12013-08-20 11:48:36 +0200774 TEST_ASSERT( mpi_read_string( &X, radix_X, input_X ) == 0 );
775 TEST_ASSERT( mpi_read_string( &Y, radix_Y, input_Y ) == 0 );
776 TEST_ASSERT( mpi_read_string( &A, radix_A, input_A ) == 0 );
Paul Bakker367dae42009-06-28 21:50:27 +0000777 res = mpi_inv_mod( &Z, &X, &Y );
Paul Bakker33b43f12013-08-20 11:48:36 +0200778 TEST_ASSERT( res == div_result );
Paul Bakker367dae42009-06-28 21:50:27 +0000779 if( res == 0 )
780 {
781 TEST_ASSERT( mpi_cmp_mpi( &Z, &A ) == 0 );
782 }
Paul Bakker6c591fa2011-05-05 11:49:20 +0000783
Paul Bakkerbd51b262014-07-10 15:26:12 +0200784exit:
Paul Bakker6c591fa2011-05-05 11:49:20 +0000785 mpi_free( &X ); mpi_free( &Y ); mpi_free( &Z ); mpi_free( &A );
Paul Bakker367dae42009-06-28 21:50:27 +0000786}
Paul Bakker33b43f12013-08-20 11:48:36 +0200787/* END_CASE */
Paul Bakker367dae42009-06-28 21:50:27 +0000788
Manuel Pégourié-Gonnarddf0142b2013-08-22 18:29:07 +0200789/* BEGIN_CASE depends_on:POLARSSL_GENPRIME */
Paul Bakker33b43f12013-08-20 11:48:36 +0200790void mpi_is_prime( int radix_X, char *input_X, int div_result )
Paul Bakker367dae42009-06-28 21:50:27 +0000791{
792 mpi X;
793 int res;
Paul Bakker6c591fa2011-05-05 11:49:20 +0000794 mpi_init( &X );
Paul Bakker367dae42009-06-28 21:50:27 +0000795
Paul Bakker33b43f12013-08-20 11:48:36 +0200796 TEST_ASSERT( mpi_read_string( &X, radix_X, input_X ) == 0 );
Paul Bakker5690efc2011-05-26 13:16:06 +0000797 res = mpi_is_prime( &X, rnd_std_rand, NULL );
Paul Bakker33b43f12013-08-20 11:48:36 +0200798 TEST_ASSERT( res == div_result );
Paul Bakker6c591fa2011-05-05 11:49:20 +0000799
Paul Bakkerbd51b262014-07-10 15:26:12 +0200800exit:
Paul Bakker6c591fa2011-05-05 11:49:20 +0000801 mpi_free( &X );
Paul Bakker367dae42009-06-28 21:50:27 +0000802}
Paul Bakker33b43f12013-08-20 11:48:36 +0200803/* END_CASE */
Paul Bakker367dae42009-06-28 21:50:27 +0000804
Manuel Pégourié-Gonnard15f58a82014-06-16 17:12:40 +0200805/* BEGIN_CASE depends_on:POLARSSL_GENPRIME */
806void mpi_gen_prime( int bits, int safe, int ref_ret )
807{
808 mpi X;
809 int my_ret;
810
811 mpi_init( &X );
812
813 my_ret = mpi_gen_prime( &X, bits, safe, rnd_std_rand, NULL );
814 TEST_ASSERT( my_ret == ref_ret );
815
816 if( ref_ret == 0 )
817 {
818 size_t actual_bits = mpi_msb( &X );
819
820 TEST_ASSERT( actual_bits >= (size_t) bits );
821 TEST_ASSERT( actual_bits <= (size_t) bits + 1 );
822
823 TEST_ASSERT( mpi_is_prime( &X, rnd_std_rand, NULL ) == 0 );
824 if( safe )
825 {
826 mpi_shift_r( &X, 1 ); /* X = ( X - 1 ) / 2 */
827 TEST_ASSERT( mpi_is_prime( &X, rnd_std_rand, NULL ) == 0 );
828 }
829 }
830
Paul Bakkerbd51b262014-07-10 15:26:12 +0200831exit:
Manuel Pégourié-Gonnard15f58a82014-06-16 17:12:40 +0200832 mpi_free( &X );
833}
834/* END_CASE */
835
Paul Bakker33b43f12013-08-20 11:48:36 +0200836/* BEGIN_CASE */
837void mpi_shift_l( int radix_X, char *input_X, int shift_X, int radix_A,
838 char *input_A)
Paul Bakker367dae42009-06-28 21:50:27 +0000839{
840 mpi X, A;
Paul Bakker6c591fa2011-05-05 11:49:20 +0000841 mpi_init( &X ); mpi_init( &A );
Paul Bakker367dae42009-06-28 21:50:27 +0000842
Paul Bakker33b43f12013-08-20 11:48:36 +0200843 TEST_ASSERT( mpi_read_string( &X, radix_X, input_X ) == 0 );
844 TEST_ASSERT( mpi_read_string( &A, radix_A, input_A ) == 0 );
845 TEST_ASSERT( mpi_shift_l( &X, shift_X ) == 0 );
Paul Bakker367dae42009-06-28 21:50:27 +0000846 TEST_ASSERT( mpi_cmp_mpi( &X, &A ) == 0 );
Paul Bakker6c591fa2011-05-05 11:49:20 +0000847
Paul Bakkerbd51b262014-07-10 15:26:12 +0200848exit:
Paul Bakker6c591fa2011-05-05 11:49:20 +0000849 mpi_free( &X ); mpi_free( &A );
Paul Bakker367dae42009-06-28 21:50:27 +0000850}
Paul Bakker33b43f12013-08-20 11:48:36 +0200851/* END_CASE */
Paul Bakker367dae42009-06-28 21:50:27 +0000852
Paul Bakker33b43f12013-08-20 11:48:36 +0200853/* BEGIN_CASE */
854void mpi_shift_r( int radix_X, char *input_X, int shift_X, int radix_A,
855 char *input_A )
Paul Bakker367dae42009-06-28 21:50:27 +0000856{
857 mpi X, A;
Paul Bakker6c591fa2011-05-05 11:49:20 +0000858 mpi_init( &X ); mpi_init( &A );
Paul Bakker367dae42009-06-28 21:50:27 +0000859
Paul Bakker33b43f12013-08-20 11:48:36 +0200860 TEST_ASSERT( mpi_read_string( &X, radix_X, input_X ) == 0 );
861 TEST_ASSERT( mpi_read_string( &A, radix_A, input_A ) == 0 );
862 TEST_ASSERT( mpi_shift_r( &X, shift_X ) == 0 );
Paul Bakker367dae42009-06-28 21:50:27 +0000863 TEST_ASSERT( mpi_cmp_mpi( &X, &A ) == 0 );
Paul Bakker6c591fa2011-05-05 11:49:20 +0000864
Paul Bakkerbd51b262014-07-10 15:26:12 +0200865exit:
Paul Bakker6c591fa2011-05-05 11:49:20 +0000866 mpi_free( &X ); mpi_free( &A );
Paul Bakker367dae42009-06-28 21:50:27 +0000867}
Paul Bakker33b43f12013-08-20 11:48:36 +0200868/* END_CASE */
Paul Bakker367dae42009-06-28 21:50:27 +0000869
Manuel Pégourié-Gonnard20140162013-10-10 12:48:03 +0200870/* BEGIN_CASE depends_on:POLARSSL_SELF_TEST */
Paul Bakker33b43f12013-08-20 11:48:36 +0200871void mpi_selftest()
Paul Bakkere896fea2009-07-06 06:40:23 +0000872{
873 TEST_ASSERT( mpi_self_test( 0 ) == 0 );
874}
Paul Bakker33b43f12013-08-20 11:48:36 +0200875/* END_CASE */