blob: 239f8a937064d4714689412353f0f7b230e1e959 [file] [log] [blame]
Paul Bakker33b43f12013-08-20 11:48:36 +02001/* BEGIN_HEADER */
Paul Bakker367dae42009-06-28 21:50:27 +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 */
11void mpi_read_write_string( int radix_X, char *input_X, int radix_A,
12 char *input_A, int output_size, int result_read,
13 int result_write )
Paul Bakker367dae42009-06-28 21:50:27 +000014{
15 mpi X;
16 char str[1000];
Paul Bakker33b43f12013-08-20 11:48:36 +020017 size_t len = output_size;
Paul Bakker367dae42009-06-28 21:50:27 +000018
Paul Bakker6c591fa2011-05-05 11:49:20 +000019 mpi_init( &X );
Paul Bakker367dae42009-06-28 21:50:27 +000020
Paul Bakker33b43f12013-08-20 11:48:36 +020021 TEST_ASSERT( mpi_read_string( &X, radix_X, input_X ) == result_read );
22 if( result_read == 0 )
Paul Bakkerba48cb22009-07-12 11:01:32 +000023 {
Paul Bakker33b43f12013-08-20 11:48:36 +020024 TEST_ASSERT( mpi_write_string( &X, radix_A, str, &len ) == result_write );
25 if( result_write == 0 )
Paul Bakkerba48cb22009-07-12 11:01:32 +000026 {
Paul Bakker33b43f12013-08-20 11:48:36 +020027 TEST_ASSERT( strcasecmp( str, input_A ) == 0 );
Paul Bakkerba48cb22009-07-12 11:01:32 +000028 }
29 }
Paul Bakker6c591fa2011-05-05 11:49:20 +000030
31 mpi_free( &X );
Paul Bakkere896fea2009-07-06 06:40:23 +000032}
Paul Bakker33b43f12013-08-20 11:48:36 +020033/* END_CASE */
Paul Bakkere896fea2009-07-06 06:40:23 +000034
Paul Bakker33b43f12013-08-20 11:48:36 +020035/* BEGIN_CASE */
36void mpi_read_binary( char *input_X, int radix_A, char *input_A )
Paul Bakkere896fea2009-07-06 06:40:23 +000037{
38 mpi X;
39 unsigned char str[1000];
40 unsigned char buf[1000];
Paul Bakkerf4a3f302011-04-24 15:53:29 +000041 size_t len = 1000;
42 size_t input_len;
Paul Bakkere896fea2009-07-06 06:40:23 +000043
Paul Bakker6c591fa2011-05-05 11:49:20 +000044 mpi_init( &X );
Paul Bakkere896fea2009-07-06 06:40:23 +000045
Paul Bakker33b43f12013-08-20 11:48:36 +020046 input_len = unhexify( buf, input_X );
Paul Bakkere896fea2009-07-06 06:40:23 +000047
48 TEST_ASSERT( mpi_read_binary( &X, buf, input_len ) == 0 );
Paul Bakker33b43f12013-08-20 11:48:36 +020049 TEST_ASSERT( mpi_write_string( &X, radix_A, (char *) str, &len ) == 0 );
50 TEST_ASSERT( strcmp( (char *) str, input_A ) == 0 );
Paul Bakker6c591fa2011-05-05 11:49:20 +000051
52 mpi_free( &X );
Paul Bakkere896fea2009-07-06 06:40:23 +000053}
Paul Bakker33b43f12013-08-20 11:48:36 +020054/* END_CASE */
Paul Bakkere896fea2009-07-06 06:40:23 +000055
Paul Bakker33b43f12013-08-20 11:48:36 +020056/* BEGIN_CASE */
57void mpi_write_binary( int radix_X, char *input_X, char *input_A,
58 int output_size, int result )
Paul Bakkere896fea2009-07-06 06:40:23 +000059{
60 mpi X;
61 unsigned char str[1000];
62 unsigned char buf[1000];
Paul Bakkerf4a3f302011-04-24 15:53:29 +000063 size_t buflen;
Paul Bakkere896fea2009-07-06 06:40:23 +000064
65 memset( buf, 0x00, 1000 );
66 memset( str, 0x00, 1000 );
67
Paul Bakker6c591fa2011-05-05 11:49:20 +000068 mpi_init( &X );
Paul Bakkere896fea2009-07-06 06:40:23 +000069
Paul Bakker33b43f12013-08-20 11:48:36 +020070 TEST_ASSERT( mpi_read_string( &X, radix_X, input_X ) == 0 );
Paul Bakkere896fea2009-07-06 06:40:23 +000071
Paul Bakker69998dd2009-07-11 19:15:20 +000072 buflen = mpi_size( &X );
Paul Bakker33b43f12013-08-20 11:48:36 +020073 if( buflen > (size_t) output_size )
74 buflen = (size_t) output_size;
Paul Bakkere896fea2009-07-06 06:40:23 +000075
Paul Bakker33b43f12013-08-20 11:48:36 +020076 TEST_ASSERT( mpi_write_binary( &X, buf, buflen ) == result );
77 if( result == 0)
Paul Bakkerba48cb22009-07-12 11:01:32 +000078 {
79 hexify( str, buf, buflen );
Paul Bakkere896fea2009-07-06 06:40:23 +000080
Paul Bakker33b43f12013-08-20 11:48:36 +020081 TEST_ASSERT( strcasecmp( (char *) str, input_A ) == 0 );
Paul Bakkerba48cb22009-07-12 11:01:32 +000082 }
Paul Bakker6c591fa2011-05-05 11:49:20 +000083
84 mpi_free( &X );
Paul Bakkere896fea2009-07-06 06:40:23 +000085}
Paul Bakker33b43f12013-08-20 11:48:36 +020086/* END_CASE */
Paul Bakkere896fea2009-07-06 06:40:23 +000087
Paul Bakker428b9ba2013-09-15 15:20:37 +020088/* BEGIN_CASE depends_on:POLARSSL_FS_IO */
Paul Bakker33b43f12013-08-20 11:48:36 +020089void mpi_read_file( int radix_X, char *input_file, char *input_A,
90 int result )
Paul Bakkere896fea2009-07-06 06:40:23 +000091{
92 mpi X;
93 unsigned char str[1000];
94 unsigned char buf[1000];
Paul Bakkerf4a3f302011-04-24 15:53:29 +000095 size_t buflen;
Paul Bakker69998dd2009-07-11 19:15:20 +000096 FILE *file;
Paul Bakkere896fea2009-07-06 06:40:23 +000097
98 memset( buf, 0x00, 1000 );
99 memset( str, 0x00, 1000 );
100
Paul Bakker6c591fa2011-05-05 11:49:20 +0000101 mpi_init( &X );
Paul Bakkere896fea2009-07-06 06:40:23 +0000102
Paul Bakker33b43f12013-08-20 11:48:36 +0200103 file = fopen( input_file, "r" );
Paul Bakker8a0c0a92014-04-17 16:08:20 +0200104 TEST_ASSERT( file != NULL );
Paul Bakker33b43f12013-08-20 11:48:36 +0200105 TEST_ASSERT( mpi_read_file( &X, radix_X, file ) == result );
Paul Bakkere896fea2009-07-06 06:40:23 +0000106 fclose(file);
107
Paul Bakker33b43f12013-08-20 11:48:36 +0200108 if( result == 0 )
Paul Bakkerba48cb22009-07-12 11:01:32 +0000109 {
110 buflen = mpi_size( &X );
111 TEST_ASSERT( mpi_write_binary( &X, buf, buflen ) == 0 );
Paul Bakkere896fea2009-07-06 06:40:23 +0000112
Paul Bakkerba48cb22009-07-12 11:01:32 +0000113 hexify( str, buf, buflen );
Paul Bakkere896fea2009-07-06 06:40:23 +0000114
Paul Bakker33b43f12013-08-20 11:48:36 +0200115 TEST_ASSERT( strcasecmp( (char *) str, input_A ) == 0 );
Paul Bakkerba48cb22009-07-12 11:01:32 +0000116 }
Paul Bakker6c591fa2011-05-05 11:49:20 +0000117
118 mpi_free( &X );
Paul Bakkere896fea2009-07-06 06:40:23 +0000119}
Paul Bakker33b43f12013-08-20 11:48:36 +0200120/* END_CASE */
Paul Bakkere896fea2009-07-06 06:40:23 +0000121
Paul Bakker428b9ba2013-09-15 15:20:37 +0200122/* BEGIN_CASE depends_on:POLARSSL_FS_IO */
Paul Bakker33b43f12013-08-20 11:48:36 +0200123void mpi_write_file( int radix_X, char *input_X, int output_radix,
124 char *output_file )
Paul Bakkere896fea2009-07-06 06:40:23 +0000125{
126 mpi X, Y;
Paul Bakker69998dd2009-07-11 19:15:20 +0000127 FILE *file_out, *file_in;
128
Paul Bakker6c591fa2011-05-05 11:49:20 +0000129 mpi_init( &X ); mpi_init( &Y );
Paul Bakkere896fea2009-07-06 06:40:23 +0000130
Paul Bakker33b43f12013-08-20 11:48:36 +0200131 TEST_ASSERT( mpi_read_string( &X, radix_X, input_X ) == 0 );
Paul Bakkere896fea2009-07-06 06:40:23 +0000132
Paul Bakker33b43f12013-08-20 11:48:36 +0200133 file_out = fopen( output_file, "w" );
Paul Bakker5690efc2011-05-26 13:16:06 +0000134 TEST_ASSERT( file_out != NULL );
Paul Bakker33b43f12013-08-20 11:48:36 +0200135 TEST_ASSERT( mpi_write_file( NULL, &X, output_radix, file_out ) == 0 );
Paul Bakkere896fea2009-07-06 06:40:23 +0000136 fclose(file_out);
137
Paul Bakker33b43f12013-08-20 11:48:36 +0200138 file_in = fopen( output_file, "r" );
Paul Bakker5690efc2011-05-26 13:16:06 +0000139 TEST_ASSERT( file_in != NULL );
Paul Bakker33b43f12013-08-20 11:48:36 +0200140 TEST_ASSERT( mpi_read_file( &Y, output_radix, file_in ) == 0 );
Paul Bakkere896fea2009-07-06 06:40:23 +0000141 fclose(file_in);
142
143 TEST_ASSERT( mpi_cmp_mpi( &X, &Y ) == 0 );
Paul Bakker6c591fa2011-05-05 11:49:20 +0000144
145 mpi_free( &X ); mpi_free( &Y );
Paul Bakkere896fea2009-07-06 06:40:23 +0000146}
Paul Bakker33b43f12013-08-20 11:48:36 +0200147/* END_CASE */
Paul Bakkere896fea2009-07-06 06:40:23 +0000148
Paul Bakker33b43f12013-08-20 11:48:36 +0200149/* BEGIN_CASE */
150void mpi_get_bit( int radix_X, char *input_X, int pos, int val )
Paul Bakker2f5947e2011-05-18 15:47:11 +0000151{
152 mpi X;
153 mpi_init( &X );
Paul Bakker33b43f12013-08-20 11:48:36 +0200154 TEST_ASSERT( mpi_read_string( &X, radix_X, input_X ) == 0 );
155 TEST_ASSERT( mpi_get_bit( &X, pos ) == val );
Paul Bakker2f5947e2011-05-18 15:47:11 +0000156
157 mpi_free( &X );
158}
Paul Bakker33b43f12013-08-20 11:48:36 +0200159/* END_CASE */
Paul Bakker2f5947e2011-05-18 15:47:11 +0000160
Paul Bakker33b43f12013-08-20 11:48:36 +0200161/* BEGIN_CASE */
162void mpi_set_bit( int radix_X, char *input_X, int pos, int val, int radix_Y,
163 char *output_Y )
Paul Bakker2f5947e2011-05-18 15:47:11 +0000164{
165 mpi X, Y;
166 mpi_init( &X ); mpi_init( &Y );
167
Paul Bakker33b43f12013-08-20 11:48:36 +0200168 TEST_ASSERT( mpi_read_string( &X, radix_X, input_X ) == 0 );
169 TEST_ASSERT( mpi_read_string( &Y, radix_Y, output_Y ) == 0 );
170 TEST_ASSERT( mpi_set_bit( &X, pos, val ) == 0 );
Paul Bakker2f5947e2011-05-18 15:47:11 +0000171 TEST_ASSERT( mpi_cmp_mpi( &X, &Y ) == 0 );
172
Manuel Pégourié-Gonnarde44ec102012-11-17 12:42:51 +0100173 mpi_free( &X ); mpi_free( &Y );
Paul Bakker2f5947e2011-05-18 15:47:11 +0000174}
Paul Bakker33b43f12013-08-20 11:48:36 +0200175/* END_CASE */
Paul Bakker2f5947e2011-05-18 15:47:11 +0000176
Paul Bakker33b43f12013-08-20 11:48:36 +0200177/* BEGIN_CASE */
178void mpi_lsb( int radix_X, char *input_X, int nr_bits )
Paul Bakkere896fea2009-07-06 06:40:23 +0000179{
180 mpi X;
Paul Bakker6c591fa2011-05-05 11:49:20 +0000181 mpi_init( &X );
Paul Bakkere896fea2009-07-06 06:40:23 +0000182
Paul Bakker33b43f12013-08-20 11:48:36 +0200183 TEST_ASSERT( mpi_read_string( &X, radix_X, input_X ) == 0 );
184 TEST_ASSERT( mpi_lsb( &X ) == (size_t) nr_bits );
Paul Bakker6c591fa2011-05-05 11:49:20 +0000185
186 mpi_free( &X );
Paul Bakkere896fea2009-07-06 06:40:23 +0000187}
Paul Bakker33b43f12013-08-20 11:48:36 +0200188/* END_CASE */
Paul Bakkere896fea2009-07-06 06:40:23 +0000189
Paul Bakker33b43f12013-08-20 11:48:36 +0200190/* BEGIN_CASE */
191void mpi_msb( int radix_X, char *input_X, int nr_bits )
Paul Bakkere896fea2009-07-06 06:40:23 +0000192{
193 mpi X;
Paul Bakker6c591fa2011-05-05 11:49:20 +0000194 mpi_init( &X );
Paul Bakkere896fea2009-07-06 06:40:23 +0000195
Paul Bakker33b43f12013-08-20 11:48:36 +0200196 TEST_ASSERT( mpi_read_string( &X, radix_X, input_X ) == 0 );
197 TEST_ASSERT( mpi_msb( &X ) == (size_t) nr_bits );
Paul Bakker6c591fa2011-05-05 11:49:20 +0000198
199 mpi_free( &X );
Paul Bakker367dae42009-06-28 21:50:27 +0000200}
Paul Bakker33b43f12013-08-20 11:48:36 +0200201/* END_CASE */
Paul Bakker367dae42009-06-28 21:50:27 +0000202
Paul Bakker33b43f12013-08-20 11:48:36 +0200203/* BEGIN_CASE */
204void mpi_gcd( int radix_X, char *input_X, int radix_Y, char *input_Y,
205 int radix_A, char *input_A )
Paul Bakker367dae42009-06-28 21:50:27 +0000206{
207 mpi A, X, Y, Z;
Paul Bakker6c591fa2011-05-05 11:49:20 +0000208 mpi_init( &A ); mpi_init( &X ); mpi_init( &Y ); mpi_init( &Z );
Paul Bakker367dae42009-06-28 21:50:27 +0000209
Paul Bakker33b43f12013-08-20 11:48:36 +0200210 TEST_ASSERT( mpi_read_string( &X, radix_X, input_X ) == 0 );
211 TEST_ASSERT( mpi_read_string( &Y, radix_Y, input_Y ) == 0 );
212 TEST_ASSERT( mpi_read_string( &A, radix_A, input_A ) == 0 );
Paul Bakker367dae42009-06-28 21:50:27 +0000213 TEST_ASSERT( mpi_gcd( &Z, &X, &Y ) == 0 );
214 TEST_ASSERT( mpi_cmp_mpi( &Z, &A ) == 0 );
Paul Bakker6c591fa2011-05-05 11:49:20 +0000215
216 mpi_free( &A ); mpi_free( &X ); mpi_free( &Y ); mpi_free( &Z );
Paul Bakker367dae42009-06-28 21:50:27 +0000217}
Paul Bakker33b43f12013-08-20 11:48:36 +0200218/* END_CASE */
Paul Bakker367dae42009-06-28 21:50:27 +0000219
Paul Bakker33b43f12013-08-20 11:48:36 +0200220/* BEGIN_CASE */
221void mpi_cmp_int( int input_X, int input_A, int result_CMP )
Paul Bakker367dae42009-06-28 21:50:27 +0000222{
223 mpi X;
Paul Bakker6c591fa2011-05-05 11:49:20 +0000224 mpi_init( &X );
Paul Bakker367dae42009-06-28 21:50:27 +0000225
Paul Bakker33b43f12013-08-20 11:48:36 +0200226 TEST_ASSERT( mpi_lset( &X, input_X ) == 0);
227 TEST_ASSERT( mpi_cmp_int( &X, input_A ) == result_CMP);
Paul Bakker6c591fa2011-05-05 11:49:20 +0000228
229 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_cmp_mpi( int radix_X, char *input_X, int radix_Y, char *input_Y,
235 int input_A )
Paul Bakker367dae42009-06-28 21:50:27 +0000236{
237 mpi X, Y;
Paul Bakker6c591fa2011-05-05 11:49:20 +0000238 mpi_init( &X ); mpi_init( &Y );
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_cmp_mpi( &X, &Y ) == input_A );
Paul Bakker6c591fa2011-05-05 11:49:20 +0000243
244 mpi_free( &X ); mpi_free( &Y );
Paul Bakker367dae42009-06-28 21:50:27 +0000245}
Paul Bakker33b43f12013-08-20 11:48:36 +0200246/* END_CASE */
Paul Bakker367dae42009-06-28 21:50:27 +0000247
Paul Bakker33b43f12013-08-20 11:48:36 +0200248/* BEGIN_CASE */
249void mpi_cmp_abs( int radix_X, char *input_X, int radix_Y, char *input_Y,
250 int input_A )
Paul Bakker367dae42009-06-28 21:50:27 +0000251{
252 mpi X, Y;
Paul Bakker6c591fa2011-05-05 11:49:20 +0000253 mpi_init( &X ); mpi_init( &Y );
Paul Bakker367dae42009-06-28 21:50:27 +0000254
Paul Bakker33b43f12013-08-20 11:48:36 +0200255 TEST_ASSERT( mpi_read_string( &X, radix_X, input_X ) == 0 );
256 TEST_ASSERT( mpi_read_string( &Y, radix_Y, input_Y ) == 0 );
257 TEST_ASSERT( mpi_cmp_abs( &X, &Y ) == input_A );
Paul Bakker6c591fa2011-05-05 11:49:20 +0000258
259 mpi_free( &X ); mpi_free( &Y );
Paul Bakker367dae42009-06-28 21:50:27 +0000260}
Paul Bakker33b43f12013-08-20 11:48:36 +0200261/* END_CASE */
Paul Bakker367dae42009-06-28 21:50:27 +0000262
Paul Bakker33b43f12013-08-20 11:48:36 +0200263/* BEGIN_CASE */
264void mpi_copy( int input_X, int input_A )
Paul Bakker367dae42009-06-28 21:50:27 +0000265{
266 mpi X, Y, A;
Paul Bakker6c591fa2011-05-05 11:49:20 +0000267 mpi_init( &X ); mpi_init( &Y ); mpi_init( &A );
Paul Bakker367dae42009-06-28 21:50:27 +0000268
Paul Bakker33b43f12013-08-20 11:48:36 +0200269 TEST_ASSERT( mpi_lset( &X, input_X ) == 0 );
270 TEST_ASSERT( mpi_lset( &Y, input_A ) == 0 );
271 TEST_ASSERT( mpi_lset( &A, input_A ) == 0 );
Paul Bakker367dae42009-06-28 21:50:27 +0000272 TEST_ASSERT( mpi_cmp_mpi( &X, &Y ) != 0 );
273 TEST_ASSERT( mpi_cmp_mpi( &Y, &A ) == 0 );
274 TEST_ASSERT( mpi_copy( &Y, &X ) == 0 );
275 TEST_ASSERT( mpi_cmp_mpi( &X, &Y ) == 0 );
276 TEST_ASSERT( mpi_cmp_mpi( &Y, &A ) != 0 );
Paul Bakker6c591fa2011-05-05 11:49:20 +0000277
278 mpi_free( &X ); mpi_free( &Y ); mpi_free( &A );
Paul Bakker367dae42009-06-28 21:50:27 +0000279}
Paul Bakker33b43f12013-08-20 11:48:36 +0200280/* END_CASE */
Paul Bakker367dae42009-06-28 21:50:27 +0000281
Paul Bakker33b43f12013-08-20 11:48:36 +0200282/* BEGIN_CASE */
283void mpi_copy_self( int input_X )
Paul Bakkere896fea2009-07-06 06:40:23 +0000284{
285 mpi X;
Paul Bakker6c591fa2011-05-05 11:49:20 +0000286 mpi_init( &X );
Paul Bakkere896fea2009-07-06 06:40:23 +0000287
Paul Bakker33b43f12013-08-20 11:48:36 +0200288 TEST_ASSERT( mpi_lset( &X, input_X ) == 0 );
Paul Bakkere896fea2009-07-06 06:40:23 +0000289 TEST_ASSERT( mpi_copy( &X, &X ) == 0 );
Paul Bakker33b43f12013-08-20 11:48:36 +0200290 TEST_ASSERT( mpi_cmp_int( &X, input_X ) == 0 );
Paul Bakker6c591fa2011-05-05 11:49:20 +0000291
292 mpi_free( &X );
Paul Bakkere896fea2009-07-06 06:40:23 +0000293}
Paul Bakker33b43f12013-08-20 11:48:36 +0200294/* END_CASE */
Paul Bakkere896fea2009-07-06 06:40:23 +0000295
Paul Bakker33b43f12013-08-20 11:48:36 +0200296/* BEGIN_CASE */
Manuel Pégourié-Gonnard58681632013-11-21 10:39:37 +0100297void mpi_shrink( int before, int used, int min, int after )
298{
299 mpi X;
300 mpi_init( &X );
301
302 TEST_ASSERT( mpi_grow( &X, before ) == 0 );
303 TEST_ASSERT( used <= before );
304 memset( X.p, 0x2a, used * sizeof( t_uint ) );
305 TEST_ASSERT( mpi_shrink( &X, min ) == 0 );
306 TEST_ASSERT( X.n == (size_t) after );
307
308 mpi_free( &X );
309}
310/* END_CASE */
311
312/* BEGIN_CASE */
Manuel Pégourié-Gonnard3e3d2b82013-11-21 21:12:26 +0100313void mpi_safe_cond_assign( int x_sign, char *x_str,
314 int y_sign, char *y_str )
Manuel Pégourié-Gonnard71c2c212013-11-21 16:56:39 +0100315{
316 mpi X, Y, XX;
317 mpi_init( &X ); mpi_init( &Y ); mpi_init( &XX );
318
319 TEST_ASSERT( mpi_read_string( &X, 16, x_str ) == 0 );
Manuel Pégourié-Gonnard3e3d2b82013-11-21 21:12:26 +0100320 X.s = x_sign;
Manuel Pégourié-Gonnard71c2c212013-11-21 16:56:39 +0100321 TEST_ASSERT( mpi_read_string( &Y, 16, y_str ) == 0 );
Manuel Pégourié-Gonnard3e3d2b82013-11-21 21:12:26 +0100322 Y.s = y_sign;
Manuel Pégourié-Gonnard71c2c212013-11-21 16:56:39 +0100323 TEST_ASSERT( mpi_copy( &XX, &X ) == 0 );
324
325 TEST_ASSERT( mpi_safe_cond_assign( &X, &Y, 0 ) == 0 );
326 TEST_ASSERT( mpi_cmp_mpi( &X, &XX ) == 0 );
327
328 TEST_ASSERT( mpi_safe_cond_assign( &X, &Y, 1 ) == 0 );
329 TEST_ASSERT( mpi_cmp_mpi( &X, &Y ) == 0 );
330
331 mpi_free( &X ); mpi_free( &Y ); mpi_free( &XX );
332}
333/* END_CASE */
334
335/* BEGIN_CASE */
Manuel Pégourié-Gonnarda60fe892013-12-04 21:41:50 +0100336void mpi_safe_cond_swap( int x_sign, char *x_str,
337 int y_sign, char *y_str )
338{
339 mpi X, Y, XX, YY;
340
341 mpi_init( &X ); mpi_init( &Y );
342 mpi_init( &XX ); mpi_init( &YY );
343
344 TEST_ASSERT( mpi_read_string( &X, 16, x_str ) == 0 );
345 X.s = x_sign;
346 TEST_ASSERT( mpi_read_string( &Y, 16, y_str ) == 0 );
347 Y.s = y_sign;
348
349 TEST_ASSERT( mpi_copy( &XX, &X ) == 0 );
350 TEST_ASSERT( mpi_copy( &YY, &Y ) == 0 );
351
352 TEST_ASSERT( mpi_safe_cond_swap( &X, &Y, 0 ) == 0 );
353 TEST_ASSERT( mpi_cmp_mpi( &X, &XX ) == 0 );
354 TEST_ASSERT( mpi_cmp_mpi( &Y, &YY ) == 0 );
355
356 TEST_ASSERT( mpi_safe_cond_swap( &X, &Y, 1 ) == 0 );
357 TEST_ASSERT( mpi_cmp_mpi( &Y, &XX ) == 0 );
358 TEST_ASSERT( mpi_cmp_mpi( &X, &YY ) == 0 );
359
360 mpi_free( &X ); mpi_free( &Y );
361 mpi_free( &XX ); mpi_free( &YY );
362}
363/* END_CASE */
364
365/* BEGIN_CASE */
Paul Bakker33b43f12013-08-20 11:48:36 +0200366void mpi_swap( int input_X, int input_Y )
Paul Bakker367dae42009-06-28 21:50:27 +0000367{
368 mpi X, Y, A;
Paul Bakker6c591fa2011-05-05 11:49:20 +0000369 mpi_init( &X ); mpi_init( &Y ); mpi_init( &A );
Paul Bakker367dae42009-06-28 21:50:27 +0000370
Paul Bakker33b43f12013-08-20 11:48:36 +0200371 TEST_ASSERT( mpi_lset( &X, input_X ) == 0 );
372 TEST_ASSERT( mpi_lset( &Y, input_Y ) == 0 );
373 TEST_ASSERT( mpi_lset( &A, input_X ) == 0 );
Paul Bakker367dae42009-06-28 21:50:27 +0000374 TEST_ASSERT( mpi_cmp_mpi( &X, &Y ) != 0 );
375 TEST_ASSERT( mpi_cmp_mpi( &X, &A ) == 0 );
376 mpi_swap( &X, &Y );
377 TEST_ASSERT( mpi_cmp_mpi( &X, &Y ) != 0 );
378 TEST_ASSERT( mpi_cmp_mpi( &Y, &A ) == 0 );
Paul Bakker6c591fa2011-05-05 11:49:20 +0000379
380 mpi_free( &X ); mpi_free( &Y ); mpi_free( &A );
Paul Bakker367dae42009-06-28 21:50:27 +0000381}
Paul Bakker33b43f12013-08-20 11:48:36 +0200382/* END_CASE */
Paul Bakker367dae42009-06-28 21:50:27 +0000383
Paul Bakker33b43f12013-08-20 11:48:36 +0200384/* BEGIN_CASE */
385void mpi_add_mpi( int radix_X, char *input_X, int radix_Y, char *input_Y,
386 int radix_A, char *input_A )
Paul Bakker367dae42009-06-28 21:50:27 +0000387{
388 mpi X, Y, Z, A;
Paul Bakker6c591fa2011-05-05 11:49:20 +0000389 mpi_init( &X ); mpi_init( &Y ); mpi_init( &Z ); mpi_init( &A );
Paul Bakker367dae42009-06-28 21:50:27 +0000390
Paul Bakker33b43f12013-08-20 11:48:36 +0200391 TEST_ASSERT( mpi_read_string( &X, radix_X, input_X ) == 0 );
392 TEST_ASSERT( mpi_read_string( &Y, radix_Y, input_Y ) == 0 );
393 TEST_ASSERT( mpi_read_string( &A, radix_A, input_A ) == 0 );
Paul Bakker367dae42009-06-28 21:50:27 +0000394 TEST_ASSERT( mpi_add_mpi( &Z, &X, &Y ) == 0 );
395 TEST_ASSERT( mpi_cmp_mpi( &Z, &A ) == 0 );
Paul Bakker6c591fa2011-05-05 11:49:20 +0000396
397 mpi_free( &X ); mpi_free( &Y ); mpi_free( &Z ); mpi_free( &A );
Paul Bakker367dae42009-06-28 21:50:27 +0000398}
Paul Bakker33b43f12013-08-20 11:48:36 +0200399/* END_CASE */
Paul Bakker367dae42009-06-28 21:50:27 +0000400
Paul Bakker33b43f12013-08-20 11:48:36 +0200401/* BEGIN_CASE */
402void mpi_add_abs( int radix_X, char *input_X, int radix_Y, char *input_Y,
403 int radix_A, char *input_A )
Paul Bakker367dae42009-06-28 21:50:27 +0000404{
405 mpi X, Y, Z, A;
Paul Bakker6c591fa2011-05-05 11:49:20 +0000406 mpi_init( &X ); mpi_init( &Y ); mpi_init( &Z ); mpi_init( &A );
Paul Bakker367dae42009-06-28 21:50:27 +0000407
Paul Bakker33b43f12013-08-20 11:48:36 +0200408 TEST_ASSERT( mpi_read_string( &X, radix_X, input_X ) == 0 );
409 TEST_ASSERT( mpi_read_string( &Y, radix_Y, input_Y ) == 0 );
410 TEST_ASSERT( mpi_read_string( &A, radix_A, input_A ) == 0 );
Paul Bakker367dae42009-06-28 21:50:27 +0000411 TEST_ASSERT( mpi_add_abs( &Z, &X, &Y ) == 0 );
412 TEST_ASSERT( mpi_cmp_mpi( &Z, &A ) == 0 );
Paul Bakker6c591fa2011-05-05 11:49:20 +0000413
414 mpi_free( &X ); mpi_free( &Y ); mpi_free( &Z ); mpi_free( &A );
Paul Bakker367dae42009-06-28 21:50:27 +0000415}
Paul Bakker33b43f12013-08-20 11:48:36 +0200416/* END_CASE */
Paul Bakker367dae42009-06-28 21:50:27 +0000417
Paul Bakker33b43f12013-08-20 11:48:36 +0200418/* BEGIN_CASE */
419void mpi_add_abs_add_first( int radix_X, char *input_X, int radix_Y,
420 char *input_Y, int radix_A, char *input_A )
Paul Bakkerba48cb22009-07-12 11:01:32 +0000421{
422 mpi X, Y, A;
Paul Bakker6c591fa2011-05-05 11:49:20 +0000423 mpi_init( &X ); mpi_init( &Y ); mpi_init( &A );
Paul Bakkerba48cb22009-07-12 11:01:32 +0000424
Paul Bakker33b43f12013-08-20 11:48:36 +0200425 TEST_ASSERT( mpi_read_string( &X, radix_X, input_X ) == 0 );
426 TEST_ASSERT( mpi_read_string( &Y, radix_Y, input_Y ) == 0 );
427 TEST_ASSERT( mpi_read_string( &A, radix_A, input_A ) == 0 );
Paul Bakkerba48cb22009-07-12 11:01:32 +0000428 TEST_ASSERT( mpi_add_abs( &X, &X, &Y ) == 0 );
429 TEST_ASSERT( mpi_cmp_mpi( &X, &A ) == 0 );
Paul Bakker6c591fa2011-05-05 11:49:20 +0000430
431 mpi_free( &X ); mpi_free( &Y ); mpi_free( &A );
Paul Bakkerba48cb22009-07-12 11:01:32 +0000432}
Paul Bakker33b43f12013-08-20 11:48:36 +0200433/* END_CASE */
Paul Bakkerba48cb22009-07-12 11:01:32 +0000434
Paul Bakker33b43f12013-08-20 11:48:36 +0200435/* BEGIN_CASE */
436void mpi_add_abs_add_second( int radix_X, char *input_X, int radix_Y,
437 char *input_Y, int radix_A, char *input_A )
Paul Bakkerba48cb22009-07-12 11:01:32 +0000438{
439 mpi X, Y, A;
Paul Bakker6c591fa2011-05-05 11:49:20 +0000440 mpi_init( &X ); mpi_init( &Y ); mpi_init( &A );
Paul Bakkerba48cb22009-07-12 11:01:32 +0000441
Paul Bakker33b43f12013-08-20 11:48:36 +0200442 TEST_ASSERT( mpi_read_string( &X, radix_X, input_X ) == 0 );
443 TEST_ASSERT( mpi_read_string( &Y, radix_Y, input_Y ) == 0 );
444 TEST_ASSERT( mpi_read_string( &A, radix_A, input_A ) == 0 );
Paul Bakkerba48cb22009-07-12 11:01:32 +0000445 TEST_ASSERT( mpi_add_abs( &Y, &X, &Y ) == 0 );
446 TEST_ASSERT( mpi_cmp_mpi( &Y, &A ) == 0 );
Paul Bakker6c591fa2011-05-05 11:49:20 +0000447
448 mpi_free( &X ); mpi_free( &Y ); mpi_free( &A );
Paul Bakkerba48cb22009-07-12 11:01:32 +0000449}
Paul Bakker33b43f12013-08-20 11:48:36 +0200450/* END_CASE */
Paul Bakkerba48cb22009-07-12 11:01:32 +0000451
Paul Bakker33b43f12013-08-20 11:48:36 +0200452/* BEGIN_CASE */
453void mpi_add_int( int radix_X, char *input_X, int input_Y, int radix_A,
454 char *input_A )
Paul Bakker367dae42009-06-28 21:50:27 +0000455{
456 mpi X, Z, A;
Paul Bakker6c591fa2011-05-05 11:49:20 +0000457 mpi_init( &X ); mpi_init( &Z ); mpi_init( &A );
Paul Bakker367dae42009-06-28 21:50:27 +0000458
Paul Bakker33b43f12013-08-20 11:48:36 +0200459 TEST_ASSERT( mpi_read_string( &X, radix_X, input_X ) == 0 );
460 TEST_ASSERT( mpi_read_string( &A, radix_A, input_A ) == 0 );
461 TEST_ASSERT( mpi_add_int( &Z, &X, input_Y ) == 0 );
Paul Bakker367dae42009-06-28 21:50:27 +0000462 TEST_ASSERT( mpi_cmp_mpi( &Z, &A ) == 0 );
Paul Bakker6c591fa2011-05-05 11:49:20 +0000463
464 mpi_free( &X ); mpi_free( &Z ); mpi_free( &A );
Paul Bakker367dae42009-06-28 21:50:27 +0000465}
Paul Bakker33b43f12013-08-20 11:48:36 +0200466/* END_CASE */
Paul Bakker367dae42009-06-28 21:50:27 +0000467
Paul Bakker33b43f12013-08-20 11:48:36 +0200468/* BEGIN_CASE */
469void mpi_sub_mpi( 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_sub_mpi( &Z, &X, &Y ) == 0 );
479 TEST_ASSERT( mpi_cmp_mpi( &Z, &A ) == 0 );
Paul Bakker6c591fa2011-05-05 11:49:20 +0000480
481 mpi_free( &X ); mpi_free( &Y ); mpi_free( &Z ); mpi_free( &A );
Paul Bakker367dae42009-06-28 21:50:27 +0000482}
Paul Bakker33b43f12013-08-20 11:48:36 +0200483/* END_CASE */
Paul Bakker367dae42009-06-28 21:50:27 +0000484
Paul Bakker33b43f12013-08-20 11:48:36 +0200485/* BEGIN_CASE */
486void mpi_sub_abs( int radix_X, char *input_X, int radix_Y, char *input_Y,
487 int radix_A, char *input_A, int sub_result )
Paul Bakker367dae42009-06-28 21:50:27 +0000488{
489 mpi X, Y, Z, A;
490 int res;
Paul Bakker6c591fa2011-05-05 11:49:20 +0000491 mpi_init( &X ); mpi_init( &Y ); mpi_init( &Z ); mpi_init( &A );
Paul Bakker367dae42009-06-28 21:50:27 +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 Bakker367dae42009-06-28 21:50:27 +0000496
497 res = mpi_sub_abs( &Z, &X, &Y );
Paul Bakker33b43f12013-08-20 11:48:36 +0200498 TEST_ASSERT( res == sub_result );
Paul Bakker367dae42009-06-28 21:50:27 +0000499 if( res == 0 )
500 TEST_ASSERT( mpi_cmp_mpi( &Z, &A ) == 0 );
Paul Bakker6c591fa2011-05-05 11:49:20 +0000501
502 mpi_free( &X ); mpi_free( &Y ); mpi_free( &Z ); mpi_free( &A );
Paul Bakker367dae42009-06-28 21:50:27 +0000503}
Paul Bakker33b43f12013-08-20 11:48:36 +0200504/* END_CASE */
Paul Bakker367dae42009-06-28 21:50:27 +0000505
Paul Bakker33b43f12013-08-20 11:48:36 +0200506/* BEGIN_CASE */
507void mpi_sub_int( int radix_X, char *input_X, int input_Y, int radix_A,
508 char *input_A )
Paul Bakker367dae42009-06-28 21:50:27 +0000509{
510 mpi X, Z, A;
Paul Bakker6c591fa2011-05-05 11:49:20 +0000511 mpi_init( &X ); mpi_init( &Z ); mpi_init( &A );
Paul Bakker367dae42009-06-28 21:50:27 +0000512
Paul Bakker33b43f12013-08-20 11:48:36 +0200513 TEST_ASSERT( mpi_read_string( &X, radix_X, input_X ) == 0 );
514 TEST_ASSERT( mpi_read_string( &A, radix_A, input_A ) == 0 );
515 TEST_ASSERT( mpi_sub_int( &Z, &X, input_Y ) == 0 );
Paul Bakker367dae42009-06-28 21:50:27 +0000516 TEST_ASSERT( mpi_cmp_mpi( &Z, &A ) == 0 );
Paul Bakker6c591fa2011-05-05 11:49:20 +0000517
518 mpi_free( &X ); mpi_free( &Z ); mpi_free( &A );
Paul Bakker367dae42009-06-28 21:50:27 +0000519}
Paul Bakker33b43f12013-08-20 11:48:36 +0200520/* END_CASE */
Paul Bakker367dae42009-06-28 21:50:27 +0000521
Paul Bakker33b43f12013-08-20 11:48:36 +0200522/* BEGIN_CASE */
523void mpi_mul_mpi( int radix_X, char *input_X, int radix_Y, char *input_Y,
524 int radix_A, char *input_A )
Paul Bakker367dae42009-06-28 21:50:27 +0000525{
526 mpi X, Y, Z, A;
Paul Bakker6c591fa2011-05-05 11:49:20 +0000527 mpi_init( &X ); mpi_init( &Y ); 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( &Y, radix_Y, input_Y ) == 0 );
531 TEST_ASSERT( mpi_read_string( &A, radix_A, input_A ) == 0 );
Paul Bakker367dae42009-06-28 21:50:27 +0000532 TEST_ASSERT( mpi_mul_mpi( &Z, &X, &Y ) == 0 );
533 TEST_ASSERT( mpi_cmp_mpi( &Z, &A ) == 0 );
Paul Bakker6c591fa2011-05-05 11:49:20 +0000534
535 mpi_free( &X ); mpi_free( &Y ); 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_mul_int( int radix_X, char *input_X, int input_Y, int radix_A,
541 char *input_A, char *result_comparison )
Paul Bakker367dae42009-06-28 21:50:27 +0000542{
543 mpi X, Z, A;
Paul Bakker6c591fa2011-05-05 11:49:20 +0000544 mpi_init( &X ); 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( &A, radix_A, input_A ) == 0 );
548 TEST_ASSERT( mpi_mul_int( &Z, &X, input_Y ) == 0 );
Paul Bakkerdbd443d2013-08-16 13:38:47 +0200549 if( strcmp( result_comparison, "==" ) == 0 )
550 TEST_ASSERT( mpi_cmp_mpi( &Z, &A ) == 0 );
551 else if( strcmp( result_comparison, "!=" ) == 0 )
552 TEST_ASSERT( mpi_cmp_mpi( &Z, &A ) != 0 );
553 else
554 TEST_ASSERT( "unknown operator" == 0 );
Paul Bakker6c591fa2011-05-05 11:49:20 +0000555
556 mpi_free( &X ); mpi_free( &Z ); mpi_free( &A );
Paul Bakker367dae42009-06-28 21:50:27 +0000557}
Paul Bakker33b43f12013-08-20 11:48:36 +0200558/* END_CASE */
Paul Bakker367dae42009-06-28 21:50:27 +0000559
Paul Bakker33b43f12013-08-20 11:48:36 +0200560/* BEGIN_CASE */
561void mpi_div_mpi( int radix_X, char *input_X, int radix_Y, char *input_Y,
562 int radix_A, char *input_A, int radix_B, char *input_B,
563 int div_result )
Paul Bakker367dae42009-06-28 21:50:27 +0000564{
565 mpi X, Y, Q, R, A, B;
566 int res;
Paul Bakker6c591fa2011-05-05 11:49:20 +0000567 mpi_init( &X ); mpi_init( &Y ); mpi_init( &Q ); mpi_init( &R );
568 mpi_init( &A ); mpi_init( &B );
Paul Bakker367dae42009-06-28 21:50:27 +0000569
Paul Bakker33b43f12013-08-20 11:48:36 +0200570 TEST_ASSERT( mpi_read_string( &X, radix_X, input_X ) == 0 );
571 TEST_ASSERT( mpi_read_string( &Y, radix_Y, input_Y ) == 0 );
572 TEST_ASSERT( mpi_read_string( &A, radix_A, input_A ) == 0 );
573 TEST_ASSERT( mpi_read_string( &B, radix_B, input_B ) == 0 );
Paul Bakker367dae42009-06-28 21:50:27 +0000574 res = mpi_div_mpi( &Q, &R, &X, &Y );
Paul Bakker33b43f12013-08-20 11:48:36 +0200575 TEST_ASSERT( res == div_result );
Paul Bakker367dae42009-06-28 21:50:27 +0000576 if( res == 0 )
577 {
578 TEST_ASSERT( mpi_cmp_mpi( &Q, &A ) == 0 );
579 TEST_ASSERT( mpi_cmp_mpi( &R, &B ) == 0 );
580 }
Paul Bakker6c591fa2011-05-05 11:49:20 +0000581
582 mpi_free( &X ); mpi_free( &Y ); mpi_free( &Q ); mpi_free( &R );
583 mpi_free( &A ); mpi_free( &B );
Paul Bakker367dae42009-06-28 21:50:27 +0000584}
Paul Bakker33b43f12013-08-20 11:48:36 +0200585/* END_CASE */
Paul Bakker367dae42009-06-28 21:50:27 +0000586
Paul Bakker33b43f12013-08-20 11:48:36 +0200587/* BEGIN_CASE */
588void mpi_div_int( int radix_X, char *input_X, int input_Y, int radix_A,
589 char *input_A, int radix_B, char *input_B, int div_result )
Paul Bakker367dae42009-06-28 21:50:27 +0000590{
591 mpi X, Q, R, A, B;
592 int res;
Paul Bakker6c591fa2011-05-05 11:49:20 +0000593 mpi_init( &X ); mpi_init( &Q ); mpi_init( &R ); mpi_init( &A );
594 mpi_init( &B );
Paul Bakker367dae42009-06-28 21:50:27 +0000595
Paul Bakker33b43f12013-08-20 11:48:36 +0200596 TEST_ASSERT( mpi_read_string( &X, radix_X, input_X ) == 0 );
597 TEST_ASSERT( mpi_read_string( &A, radix_A, input_A ) == 0 );
598 TEST_ASSERT( mpi_read_string( &B, radix_B, input_B ) == 0 );
599 res = mpi_div_int( &Q, &R, &X, input_Y );
600 TEST_ASSERT( res == div_result );
Paul Bakker367dae42009-06-28 21:50:27 +0000601 if( res == 0 )
602 {
603 TEST_ASSERT( mpi_cmp_mpi( &Q, &A ) == 0 );
604 TEST_ASSERT( mpi_cmp_mpi( &R, &B ) == 0 );
605 }
Paul Bakker6c591fa2011-05-05 11:49:20 +0000606
607 mpi_free( &X ); mpi_free( &Q ); mpi_free( &R ); mpi_free( &A );
608 mpi_free( &B );
Paul Bakker367dae42009-06-28 21:50:27 +0000609}
Paul Bakker33b43f12013-08-20 11:48:36 +0200610/* END_CASE */
Paul Bakker367dae42009-06-28 21:50:27 +0000611
Paul Bakker33b43f12013-08-20 11:48:36 +0200612/* BEGIN_CASE */
613void mpi_mod_mpi( int radix_X, char *input_X, int radix_Y, char *input_Y,
614 int radix_A, char *input_A, int div_result )
Paul Bakker367dae42009-06-28 21:50:27 +0000615{
Paul Bakkerf02c5642012-11-13 10:25:21 +0000616 mpi X, Y, A;
Paul Bakker367dae42009-06-28 21:50:27 +0000617 int res;
Paul Bakkerf02c5642012-11-13 10:25:21 +0000618 mpi_init( &X ); mpi_init( &Y ); mpi_init( &A );
Paul Bakker367dae42009-06-28 21:50:27 +0000619
Paul Bakker33b43f12013-08-20 11:48:36 +0200620 TEST_ASSERT( mpi_read_string( &X, radix_X, input_X ) == 0 );
621 TEST_ASSERT( mpi_read_string( &Y, radix_Y, input_Y ) == 0 );
622 TEST_ASSERT( mpi_read_string( &A, radix_A, input_A ) == 0 );
Paul Bakkerf02c5642012-11-13 10:25:21 +0000623 res = mpi_mod_mpi( &X, &X, &Y );
Paul Bakker33b43f12013-08-20 11:48:36 +0200624 TEST_ASSERT( res == div_result );
Paul Bakker367dae42009-06-28 21:50:27 +0000625 if( res == 0 )
626 {
Paul Bakkerf02c5642012-11-13 10:25:21 +0000627 TEST_ASSERT( mpi_cmp_mpi( &X, &A ) == 0 );
Paul Bakker367dae42009-06-28 21:50:27 +0000628 }
Paul Bakker6c591fa2011-05-05 11:49:20 +0000629
Paul Bakkerf02c5642012-11-13 10:25:21 +0000630 mpi_free( &X ); mpi_free( &Y ); mpi_free( &A );
Paul Bakker367dae42009-06-28 21:50:27 +0000631}
Paul Bakker33b43f12013-08-20 11:48:36 +0200632/* END_CASE */
Paul Bakker367dae42009-06-28 21:50:27 +0000633
Paul Bakker33b43f12013-08-20 11:48:36 +0200634/* BEGIN_CASE */
635void mpi_mod_int( int radix_X, char *input_X, int input_Y, int input_A,
636 int div_result )
Paul Bakker367dae42009-06-28 21:50:27 +0000637{
638 mpi X;
639 int res;
Paul Bakkera755ca12011-04-24 09:11:17 +0000640 t_uint r;
Paul Bakker6c591fa2011-05-05 11:49:20 +0000641 mpi_init( &X );
Paul Bakker367dae42009-06-28 21:50:27 +0000642
Paul Bakker33b43f12013-08-20 11:48:36 +0200643 TEST_ASSERT( mpi_read_string( &X, radix_X, input_X ) == 0 );
644 res = mpi_mod_int( &r, &X, input_Y );
645 TEST_ASSERT( res == div_result );
Paul Bakker367dae42009-06-28 21:50:27 +0000646 if( res == 0 )
647 {
Paul Bakker33b43f12013-08-20 11:48:36 +0200648 TEST_ASSERT( r == (t_uint) input_A );
Paul Bakker367dae42009-06-28 21:50:27 +0000649 }
Paul Bakker6c591fa2011-05-05 11:49:20 +0000650
651 mpi_free( &X );
Paul Bakker367dae42009-06-28 21:50:27 +0000652}
Paul Bakker33b43f12013-08-20 11:48:36 +0200653/* END_CASE */
Paul Bakker367dae42009-06-28 21:50:27 +0000654
Paul Bakker33b43f12013-08-20 11:48:36 +0200655/* BEGIN_CASE */
656void mpi_exp_mod( int radix_A, char *input_A, int radix_E, char *input_E,
657 int radix_N, char *input_N, int radix_RR, char *input_RR,
658 int radix_X, char *input_X, int div_result )
Paul Bakker367dae42009-06-28 21:50:27 +0000659{
660 mpi A, E, N, RR, Z, X;
661 int res;
Paul Bakker6c591fa2011-05-05 11:49:20 +0000662 mpi_init( &A ); mpi_init( &E ); mpi_init( &N );
663 mpi_init( &RR ); mpi_init( &Z ); mpi_init( &X );
Paul Bakker367dae42009-06-28 21:50:27 +0000664
Paul Bakker33b43f12013-08-20 11:48:36 +0200665 TEST_ASSERT( mpi_read_string( &A, radix_A, input_A ) == 0 );
666 TEST_ASSERT( mpi_read_string( &E, radix_E, input_E ) == 0 );
667 TEST_ASSERT( mpi_read_string( &N, radix_N, input_N ) == 0 );
668 TEST_ASSERT( mpi_read_string( &X, radix_X, input_X ) == 0 );
Paul Bakker367dae42009-06-28 21:50:27 +0000669
Paul Bakker33b43f12013-08-20 11:48:36 +0200670 if( strlen( input_RR ) )
671 TEST_ASSERT( mpi_read_string( &RR, radix_RR, input_RR ) == 0 );
Paul Bakker367dae42009-06-28 21:50:27 +0000672
673 res = mpi_exp_mod( &Z, &A, &E, &N, &RR );
Paul Bakker33b43f12013-08-20 11:48:36 +0200674 TEST_ASSERT( res == div_result );
Paul Bakker367dae42009-06-28 21:50:27 +0000675 if( res == 0 )
676 {
677 TEST_ASSERT( mpi_cmp_mpi( &Z, &X ) == 0 );
678 }
Paul Bakker6c591fa2011-05-05 11:49:20 +0000679
680 mpi_free( &A ); mpi_free( &E ); mpi_free( &N );
681 mpi_free( &RR ); mpi_free( &Z ); mpi_free( &X );
Paul Bakker367dae42009-06-28 21:50:27 +0000682}
Paul Bakker33b43f12013-08-20 11:48:36 +0200683/* END_CASE */
Paul Bakker367dae42009-06-28 21:50:27 +0000684
Paul Bakker33b43f12013-08-20 11:48:36 +0200685/* BEGIN_CASE */
686void mpi_inv_mod( int radix_X, char *input_X, int radix_Y, char *input_Y,
687 int radix_A, char *input_A, int div_result )
Paul Bakker367dae42009-06-28 21:50:27 +0000688{
689 mpi X, Y, Z, A;
690 int res;
Paul Bakker6c591fa2011-05-05 11:49:20 +0000691 mpi_init( &X ); mpi_init( &Y ); mpi_init( &Z ); mpi_init( &A );
Paul Bakker367dae42009-06-28 21:50:27 +0000692
Paul Bakker33b43f12013-08-20 11:48:36 +0200693 TEST_ASSERT( mpi_read_string( &X, radix_X, input_X ) == 0 );
694 TEST_ASSERT( mpi_read_string( &Y, radix_Y, input_Y ) == 0 );
695 TEST_ASSERT( mpi_read_string( &A, radix_A, input_A ) == 0 );
Paul Bakker367dae42009-06-28 21:50:27 +0000696 res = mpi_inv_mod( &Z, &X, &Y );
Paul Bakker33b43f12013-08-20 11:48:36 +0200697 TEST_ASSERT( res == div_result );
Paul Bakker367dae42009-06-28 21:50:27 +0000698 if( res == 0 )
699 {
700 TEST_ASSERT( mpi_cmp_mpi( &Z, &A ) == 0 );
701 }
Paul Bakker6c591fa2011-05-05 11:49:20 +0000702
703 mpi_free( &X ); mpi_free( &Y ); mpi_free( &Z ); mpi_free( &A );
Paul Bakker367dae42009-06-28 21:50:27 +0000704}
Paul Bakker33b43f12013-08-20 11:48:36 +0200705/* END_CASE */
Paul Bakker367dae42009-06-28 21:50:27 +0000706
Manuel Pégourié-Gonnarddf0142b2013-08-22 18:29:07 +0200707/* BEGIN_CASE depends_on:POLARSSL_GENPRIME */
Paul Bakker33b43f12013-08-20 11:48:36 +0200708void mpi_is_prime( int radix_X, char *input_X, int div_result )
Paul Bakker367dae42009-06-28 21:50:27 +0000709{
710 mpi X;
711 int res;
Paul Bakker6c591fa2011-05-05 11:49:20 +0000712 mpi_init( &X );
Paul Bakker367dae42009-06-28 21:50:27 +0000713
Paul Bakker33b43f12013-08-20 11:48:36 +0200714 TEST_ASSERT( mpi_read_string( &X, radix_X, input_X ) == 0 );
Paul Bakker5690efc2011-05-26 13:16:06 +0000715 res = mpi_is_prime( &X, rnd_std_rand, NULL );
Paul Bakker33b43f12013-08-20 11:48:36 +0200716 TEST_ASSERT( res == div_result );
Paul Bakker6c591fa2011-05-05 11:49:20 +0000717
718 mpi_free( &X );
Paul Bakker367dae42009-06-28 21:50:27 +0000719}
Paul Bakker33b43f12013-08-20 11:48:36 +0200720/* END_CASE */
Paul Bakker367dae42009-06-28 21:50:27 +0000721
Paul Bakker33b43f12013-08-20 11:48:36 +0200722/* BEGIN_CASE */
723void mpi_shift_l( int radix_X, char *input_X, int shift_X, int radix_A,
724 char *input_A)
Paul Bakker367dae42009-06-28 21:50:27 +0000725{
726 mpi X, A;
Paul Bakker6c591fa2011-05-05 11:49:20 +0000727 mpi_init( &X ); mpi_init( &A );
Paul Bakker367dae42009-06-28 21:50:27 +0000728
Paul Bakker33b43f12013-08-20 11:48:36 +0200729 TEST_ASSERT( mpi_read_string( &X, radix_X, input_X ) == 0 );
730 TEST_ASSERT( mpi_read_string( &A, radix_A, input_A ) == 0 );
731 TEST_ASSERT( mpi_shift_l( &X, shift_X ) == 0 );
Paul Bakker367dae42009-06-28 21:50:27 +0000732 TEST_ASSERT( mpi_cmp_mpi( &X, &A ) == 0 );
Paul Bakker6c591fa2011-05-05 11:49:20 +0000733
734 mpi_free( &X ); mpi_free( &A );
Paul Bakker367dae42009-06-28 21:50:27 +0000735}
Paul Bakker33b43f12013-08-20 11:48:36 +0200736/* END_CASE */
Paul Bakker367dae42009-06-28 21:50:27 +0000737
Paul Bakker33b43f12013-08-20 11:48:36 +0200738/* BEGIN_CASE */
739void mpi_shift_r( int radix_X, char *input_X, int shift_X, int radix_A,
740 char *input_A )
Paul Bakker367dae42009-06-28 21:50:27 +0000741{
742 mpi X, A;
Paul Bakker6c591fa2011-05-05 11:49:20 +0000743 mpi_init( &X ); mpi_init( &A );
Paul Bakker367dae42009-06-28 21:50:27 +0000744
Paul Bakker33b43f12013-08-20 11:48:36 +0200745 TEST_ASSERT( mpi_read_string( &X, radix_X, input_X ) == 0 );
746 TEST_ASSERT( mpi_read_string( &A, radix_A, input_A ) == 0 );
747 TEST_ASSERT( mpi_shift_r( &X, shift_X ) == 0 );
Paul Bakker367dae42009-06-28 21:50:27 +0000748 TEST_ASSERT( mpi_cmp_mpi( &X, &A ) == 0 );
Paul Bakker6c591fa2011-05-05 11:49:20 +0000749
750 mpi_free( &X ); mpi_free( &A );
Paul Bakker367dae42009-06-28 21:50:27 +0000751}
Paul Bakker33b43f12013-08-20 11:48:36 +0200752/* END_CASE */
Paul Bakker367dae42009-06-28 21:50:27 +0000753
Manuel Pégourié-Gonnard20140162013-10-10 12:48:03 +0200754/* BEGIN_CASE depends_on:POLARSSL_SELF_TEST */
Paul Bakker33b43f12013-08-20 11:48:36 +0200755void mpi_selftest()
Paul Bakkere896fea2009-07-06 06:40:23 +0000756{
757 TEST_ASSERT( mpi_self_test( 0 ) == 0 );
758}
Paul Bakker33b43f12013-08-20 11:48:36 +0200759/* END_CASE */