blob: 6a99a60df43b5e23afbb2c97ca206257017a21e4 [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 Bakker33b43f12013-08-20 11:48:36 +020088/* BEGIN_CASE */
89void 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" );
104 TEST_ASSERT( mpi_read_file( &X, radix_X, file ) == result );
Paul Bakkere896fea2009-07-06 06:40:23 +0000105 fclose(file);
106
Paul Bakker33b43f12013-08-20 11:48:36 +0200107 if( result == 0 )
Paul Bakkerba48cb22009-07-12 11:01:32 +0000108 {
109 buflen = mpi_size( &X );
110 TEST_ASSERT( mpi_write_binary( &X, buf, buflen ) == 0 );
Paul Bakkere896fea2009-07-06 06:40:23 +0000111
Paul Bakkerba48cb22009-07-12 11:01:32 +0000112 hexify( str, buf, buflen );
Paul Bakkere896fea2009-07-06 06:40:23 +0000113
Paul Bakker33b43f12013-08-20 11:48:36 +0200114 TEST_ASSERT( strcasecmp( (char *) str, input_A ) == 0 );
Paul Bakkerba48cb22009-07-12 11:01:32 +0000115 }
Paul Bakker6c591fa2011-05-05 11:49:20 +0000116
117 mpi_free( &X );
Paul Bakkere896fea2009-07-06 06:40:23 +0000118}
Paul Bakker33b43f12013-08-20 11:48:36 +0200119/* END_CASE */
Paul Bakkere896fea2009-07-06 06:40:23 +0000120
Paul Bakker33b43f12013-08-20 11:48:36 +0200121/* BEGIN_CASE */
122void mpi_write_file( int radix_X, char *input_X, int output_radix,
123 char *output_file )
Paul Bakkere896fea2009-07-06 06:40:23 +0000124{
125 mpi X, Y;
Paul Bakker69998dd2009-07-11 19:15:20 +0000126 FILE *file_out, *file_in;
127
Paul Bakker6c591fa2011-05-05 11:49:20 +0000128 mpi_init( &X ); mpi_init( &Y );
Paul Bakkere896fea2009-07-06 06:40:23 +0000129
Paul Bakker33b43f12013-08-20 11:48:36 +0200130 TEST_ASSERT( mpi_read_string( &X, radix_X, input_X ) == 0 );
Paul Bakkere896fea2009-07-06 06:40:23 +0000131
Paul Bakker33b43f12013-08-20 11:48:36 +0200132 file_out = fopen( output_file, "w" );
Paul Bakker5690efc2011-05-26 13:16:06 +0000133 TEST_ASSERT( file_out != NULL );
Paul Bakker33b43f12013-08-20 11:48:36 +0200134 TEST_ASSERT( mpi_write_file( NULL, &X, output_radix, file_out ) == 0 );
Paul Bakkere896fea2009-07-06 06:40:23 +0000135 fclose(file_out);
136
Paul Bakker33b43f12013-08-20 11:48:36 +0200137 file_in = fopen( output_file, "r" );
Paul Bakker5690efc2011-05-26 13:16:06 +0000138 TEST_ASSERT( file_in != NULL );
Paul Bakker33b43f12013-08-20 11:48:36 +0200139 TEST_ASSERT( mpi_read_file( &Y, output_radix, file_in ) == 0 );
Paul Bakkere896fea2009-07-06 06:40:23 +0000140 fclose(file_in);
141
142 TEST_ASSERT( mpi_cmp_mpi( &X, &Y ) == 0 );
Paul Bakker6c591fa2011-05-05 11:49:20 +0000143
144 mpi_free( &X ); mpi_free( &Y );
Paul Bakkere896fea2009-07-06 06:40:23 +0000145}
Paul Bakker33b43f12013-08-20 11:48:36 +0200146/* END_CASE */
Paul Bakkere896fea2009-07-06 06:40:23 +0000147
Paul Bakker33b43f12013-08-20 11:48:36 +0200148/* BEGIN_CASE */
149void mpi_get_bit( int radix_X, char *input_X, int pos, int val )
Paul Bakker2f5947e2011-05-18 15:47:11 +0000150{
151 mpi X;
152 mpi_init( &X );
Paul Bakker33b43f12013-08-20 11:48:36 +0200153 TEST_ASSERT( mpi_read_string( &X, radix_X, input_X ) == 0 );
154 TEST_ASSERT( mpi_get_bit( &X, pos ) == val );
Paul Bakker2f5947e2011-05-18 15:47:11 +0000155
156 mpi_free( &X );
157}
Paul Bakker33b43f12013-08-20 11:48:36 +0200158/* END_CASE */
Paul Bakker2f5947e2011-05-18 15:47:11 +0000159
Paul Bakker33b43f12013-08-20 11:48:36 +0200160/* BEGIN_CASE */
161void mpi_set_bit( int radix_X, char *input_X, int pos, int val, int radix_Y,
162 char *output_Y )
Paul Bakker2f5947e2011-05-18 15:47:11 +0000163{
164 mpi X, Y;
165 mpi_init( &X ); mpi_init( &Y );
166
Paul Bakker33b43f12013-08-20 11:48:36 +0200167 TEST_ASSERT( mpi_read_string( &X, radix_X, input_X ) == 0 );
168 TEST_ASSERT( mpi_read_string( &Y, radix_Y, output_Y ) == 0 );
169 TEST_ASSERT( mpi_set_bit( &X, pos, val ) == 0 );
Paul Bakker2f5947e2011-05-18 15:47:11 +0000170 TEST_ASSERT( mpi_cmp_mpi( &X, &Y ) == 0 );
171
Manuel Pégourié-Gonnarde44ec102012-11-17 12:42:51 +0100172 mpi_free( &X ); mpi_free( &Y );
Paul Bakker2f5947e2011-05-18 15:47:11 +0000173}
Paul Bakker33b43f12013-08-20 11:48:36 +0200174/* END_CASE */
Paul Bakker2f5947e2011-05-18 15:47:11 +0000175
Paul Bakker33b43f12013-08-20 11:48:36 +0200176/* BEGIN_CASE */
177void mpi_lsb( int radix_X, char *input_X, int nr_bits )
Paul Bakkere896fea2009-07-06 06:40:23 +0000178{
179 mpi X;
Paul Bakker6c591fa2011-05-05 11:49:20 +0000180 mpi_init( &X );
Paul Bakkere896fea2009-07-06 06:40:23 +0000181
Paul Bakker33b43f12013-08-20 11:48:36 +0200182 TEST_ASSERT( mpi_read_string( &X, radix_X, input_X ) == 0 );
183 TEST_ASSERT( mpi_lsb( &X ) == (size_t) nr_bits );
Paul Bakker6c591fa2011-05-05 11:49:20 +0000184
185 mpi_free( &X );
Paul Bakkere896fea2009-07-06 06:40:23 +0000186}
Paul Bakker33b43f12013-08-20 11:48:36 +0200187/* END_CASE */
Paul Bakkere896fea2009-07-06 06:40:23 +0000188
Paul Bakker33b43f12013-08-20 11:48:36 +0200189/* BEGIN_CASE */
190void mpi_msb( int radix_X, char *input_X, int nr_bits )
Paul Bakkere896fea2009-07-06 06:40:23 +0000191{
192 mpi X;
Paul Bakker6c591fa2011-05-05 11:49:20 +0000193 mpi_init( &X );
Paul Bakkere896fea2009-07-06 06:40:23 +0000194
Paul Bakker33b43f12013-08-20 11:48:36 +0200195 TEST_ASSERT( mpi_read_string( &X, radix_X, input_X ) == 0 );
196 TEST_ASSERT( mpi_msb( &X ) == (size_t) nr_bits );
Paul Bakker6c591fa2011-05-05 11:49:20 +0000197
198 mpi_free( &X );
Paul Bakker367dae42009-06-28 21:50:27 +0000199}
Paul Bakker33b43f12013-08-20 11:48:36 +0200200/* END_CASE */
Paul Bakker367dae42009-06-28 21:50:27 +0000201
Paul Bakker33b43f12013-08-20 11:48:36 +0200202/* BEGIN_CASE */
203void mpi_gcd( int radix_X, char *input_X, int radix_Y, char *input_Y,
204 int radix_A, char *input_A )
Paul Bakker367dae42009-06-28 21:50:27 +0000205{
206 mpi A, X, Y, Z;
Paul Bakker6c591fa2011-05-05 11:49:20 +0000207 mpi_init( &A ); mpi_init( &X ); mpi_init( &Y ); mpi_init( &Z );
Paul Bakker367dae42009-06-28 21:50:27 +0000208
Paul Bakker33b43f12013-08-20 11:48:36 +0200209 TEST_ASSERT( mpi_read_string( &X, radix_X, input_X ) == 0 );
210 TEST_ASSERT( mpi_read_string( &Y, radix_Y, input_Y ) == 0 );
211 TEST_ASSERT( mpi_read_string( &A, radix_A, input_A ) == 0 );
Paul Bakker367dae42009-06-28 21:50:27 +0000212 TEST_ASSERT( mpi_gcd( &Z, &X, &Y ) == 0 );
213 TEST_ASSERT( mpi_cmp_mpi( &Z, &A ) == 0 );
Paul Bakker6c591fa2011-05-05 11:49:20 +0000214
215 mpi_free( &A ); mpi_free( &X ); mpi_free( &Y ); mpi_free( &Z );
Paul Bakker367dae42009-06-28 21:50:27 +0000216}
Paul Bakker33b43f12013-08-20 11:48:36 +0200217/* END_CASE */
Paul Bakker367dae42009-06-28 21:50:27 +0000218
Paul Bakker33b43f12013-08-20 11:48:36 +0200219/* BEGIN_CASE */
220void mpi_cmp_int( int input_X, int input_A, int result_CMP )
Paul Bakker367dae42009-06-28 21:50:27 +0000221{
222 mpi X;
Paul Bakker6c591fa2011-05-05 11:49:20 +0000223 mpi_init( &X );
Paul Bakker367dae42009-06-28 21:50:27 +0000224
Paul Bakker33b43f12013-08-20 11:48:36 +0200225 TEST_ASSERT( mpi_lset( &X, input_X ) == 0);
226 TEST_ASSERT( mpi_cmp_int( &X, input_A ) == result_CMP);
Paul Bakker6c591fa2011-05-05 11:49:20 +0000227
228 mpi_free( &X );
Paul Bakker367dae42009-06-28 21:50:27 +0000229}
Paul Bakker33b43f12013-08-20 11:48:36 +0200230/* END_CASE */
Paul Bakker367dae42009-06-28 21:50:27 +0000231
Paul Bakker33b43f12013-08-20 11:48:36 +0200232/* BEGIN_CASE */
233void mpi_cmp_mpi( int radix_X, char *input_X, int radix_Y, char *input_Y,
234 int input_A )
Paul Bakker367dae42009-06-28 21:50:27 +0000235{
236 mpi X, Y;
Paul Bakker6c591fa2011-05-05 11:49:20 +0000237 mpi_init( &X ); mpi_init( &Y );
Paul Bakker367dae42009-06-28 21:50:27 +0000238
Paul Bakker33b43f12013-08-20 11:48:36 +0200239 TEST_ASSERT( mpi_read_string( &X, radix_X, input_X ) == 0 );
240 TEST_ASSERT( mpi_read_string( &Y, radix_Y, input_Y ) == 0 );
241 TEST_ASSERT( mpi_cmp_mpi( &X, &Y ) == input_A );
Paul Bakker6c591fa2011-05-05 11:49:20 +0000242
243 mpi_free( &X ); mpi_free( &Y );
Paul Bakker367dae42009-06-28 21:50:27 +0000244}
Paul Bakker33b43f12013-08-20 11:48:36 +0200245/* END_CASE */
Paul Bakker367dae42009-06-28 21:50:27 +0000246
Paul Bakker33b43f12013-08-20 11:48:36 +0200247/* BEGIN_CASE */
248void mpi_cmp_abs( int radix_X, char *input_X, int radix_Y, char *input_Y,
249 int input_A )
Paul Bakker367dae42009-06-28 21:50:27 +0000250{
251 mpi X, Y;
Paul Bakker6c591fa2011-05-05 11:49:20 +0000252 mpi_init( &X ); mpi_init( &Y );
Paul Bakker367dae42009-06-28 21:50:27 +0000253
Paul Bakker33b43f12013-08-20 11:48:36 +0200254 TEST_ASSERT( mpi_read_string( &X, radix_X, input_X ) == 0 );
255 TEST_ASSERT( mpi_read_string( &Y, radix_Y, input_Y ) == 0 );
256 TEST_ASSERT( mpi_cmp_abs( &X, &Y ) == input_A );
Paul Bakker6c591fa2011-05-05 11:49:20 +0000257
258 mpi_free( &X ); mpi_free( &Y );
Paul Bakker367dae42009-06-28 21:50:27 +0000259}
Paul Bakker33b43f12013-08-20 11:48:36 +0200260/* END_CASE */
Paul Bakker367dae42009-06-28 21:50:27 +0000261
Paul Bakker33b43f12013-08-20 11:48:36 +0200262/* BEGIN_CASE */
263void mpi_copy( int input_X, int input_A )
Paul Bakker367dae42009-06-28 21:50:27 +0000264{
265 mpi X, Y, A;
Paul Bakker6c591fa2011-05-05 11:49:20 +0000266 mpi_init( &X ); mpi_init( &Y ); mpi_init( &A );
Paul Bakker367dae42009-06-28 21:50:27 +0000267
Paul Bakker33b43f12013-08-20 11:48:36 +0200268 TEST_ASSERT( mpi_lset( &X, input_X ) == 0 );
269 TEST_ASSERT( mpi_lset( &Y, input_A ) == 0 );
270 TEST_ASSERT( mpi_lset( &A, input_A ) == 0 );
Paul Bakker367dae42009-06-28 21:50:27 +0000271 TEST_ASSERT( mpi_cmp_mpi( &X, &Y ) != 0 );
272 TEST_ASSERT( mpi_cmp_mpi( &Y, &A ) == 0 );
273 TEST_ASSERT( mpi_copy( &Y, &X ) == 0 );
274 TEST_ASSERT( mpi_cmp_mpi( &X, &Y ) == 0 );
275 TEST_ASSERT( mpi_cmp_mpi( &Y, &A ) != 0 );
Paul Bakker6c591fa2011-05-05 11:49:20 +0000276
277 mpi_free( &X ); mpi_free( &Y ); mpi_free( &A );
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_copy_self( int input_X )
Paul Bakkere896fea2009-07-06 06:40:23 +0000283{
284 mpi X;
Paul Bakker6c591fa2011-05-05 11:49:20 +0000285 mpi_init( &X );
Paul Bakkere896fea2009-07-06 06:40:23 +0000286
Paul Bakker33b43f12013-08-20 11:48:36 +0200287 TEST_ASSERT( mpi_lset( &X, input_X ) == 0 );
Paul Bakkere896fea2009-07-06 06:40:23 +0000288 TEST_ASSERT( mpi_copy( &X, &X ) == 0 );
Paul Bakker33b43f12013-08-20 11:48:36 +0200289 TEST_ASSERT( mpi_cmp_int( &X, input_X ) == 0 );
Paul Bakker6c591fa2011-05-05 11:49:20 +0000290
291 mpi_free( &X );
Paul Bakkere896fea2009-07-06 06:40:23 +0000292}
Paul Bakker33b43f12013-08-20 11:48:36 +0200293/* END_CASE */
Paul Bakkere896fea2009-07-06 06:40:23 +0000294
Paul Bakker33b43f12013-08-20 11:48:36 +0200295/* BEGIN_CASE */
296void mpi_swap( int input_X, int input_Y )
Paul Bakker367dae42009-06-28 21:50:27 +0000297{
298 mpi X, Y, A;
Paul Bakker6c591fa2011-05-05 11:49:20 +0000299 mpi_init( &X ); mpi_init( &Y ); mpi_init( &A );
Paul Bakker367dae42009-06-28 21:50:27 +0000300
Paul Bakker33b43f12013-08-20 11:48:36 +0200301 TEST_ASSERT( mpi_lset( &X, input_X ) == 0 );
302 TEST_ASSERT( mpi_lset( &Y, input_Y ) == 0 );
303 TEST_ASSERT( mpi_lset( &A, input_X ) == 0 );
Paul Bakker367dae42009-06-28 21:50:27 +0000304 TEST_ASSERT( mpi_cmp_mpi( &X, &Y ) != 0 );
305 TEST_ASSERT( mpi_cmp_mpi( &X, &A ) == 0 );
306 mpi_swap( &X, &Y );
307 TEST_ASSERT( mpi_cmp_mpi( &X, &Y ) != 0 );
308 TEST_ASSERT( mpi_cmp_mpi( &Y, &A ) == 0 );
Paul Bakker6c591fa2011-05-05 11:49:20 +0000309
310 mpi_free( &X ); mpi_free( &Y ); mpi_free( &A );
Paul Bakker367dae42009-06-28 21:50:27 +0000311}
Paul Bakker33b43f12013-08-20 11:48:36 +0200312/* END_CASE */
Paul Bakker367dae42009-06-28 21:50:27 +0000313
Paul Bakker33b43f12013-08-20 11:48:36 +0200314/* BEGIN_CASE */
315void mpi_add_mpi( int radix_X, char *input_X, int radix_Y, char *input_Y,
316 int radix_A, char *input_A )
Paul Bakker367dae42009-06-28 21:50:27 +0000317{
318 mpi X, Y, Z, A;
Paul Bakker6c591fa2011-05-05 11:49:20 +0000319 mpi_init( &X ); mpi_init( &Y ); mpi_init( &Z ); mpi_init( &A );
Paul Bakker367dae42009-06-28 21:50:27 +0000320
Paul Bakker33b43f12013-08-20 11:48:36 +0200321 TEST_ASSERT( mpi_read_string( &X, radix_X, input_X ) == 0 );
322 TEST_ASSERT( mpi_read_string( &Y, radix_Y, input_Y ) == 0 );
323 TEST_ASSERT( mpi_read_string( &A, radix_A, input_A ) == 0 );
Paul Bakker367dae42009-06-28 21:50:27 +0000324 TEST_ASSERT( mpi_add_mpi( &Z, &X, &Y ) == 0 );
325 TEST_ASSERT( mpi_cmp_mpi( &Z, &A ) == 0 );
Paul Bakker6c591fa2011-05-05 11:49:20 +0000326
327 mpi_free( &X ); mpi_free( &Y ); mpi_free( &Z ); mpi_free( &A );
Paul Bakker367dae42009-06-28 21:50:27 +0000328}
Paul Bakker33b43f12013-08-20 11:48:36 +0200329/* END_CASE */
Paul Bakker367dae42009-06-28 21:50:27 +0000330
Paul Bakker33b43f12013-08-20 11:48:36 +0200331/* BEGIN_CASE */
332void mpi_add_abs( int radix_X, char *input_X, int radix_Y, char *input_Y,
333 int radix_A, char *input_A )
Paul Bakker367dae42009-06-28 21:50:27 +0000334{
335 mpi X, Y, Z, A;
Paul Bakker6c591fa2011-05-05 11:49:20 +0000336 mpi_init( &X ); mpi_init( &Y ); mpi_init( &Z ); mpi_init( &A );
Paul Bakker367dae42009-06-28 21:50:27 +0000337
Paul Bakker33b43f12013-08-20 11:48:36 +0200338 TEST_ASSERT( mpi_read_string( &X, radix_X, input_X ) == 0 );
339 TEST_ASSERT( mpi_read_string( &Y, radix_Y, input_Y ) == 0 );
340 TEST_ASSERT( mpi_read_string( &A, radix_A, input_A ) == 0 );
Paul Bakker367dae42009-06-28 21:50:27 +0000341 TEST_ASSERT( mpi_add_abs( &Z, &X, &Y ) == 0 );
342 TEST_ASSERT( mpi_cmp_mpi( &Z, &A ) == 0 );
Paul Bakker6c591fa2011-05-05 11:49:20 +0000343
344 mpi_free( &X ); mpi_free( &Y ); mpi_free( &Z ); mpi_free( &A );
Paul Bakker367dae42009-06-28 21:50:27 +0000345}
Paul Bakker33b43f12013-08-20 11:48:36 +0200346/* END_CASE */
Paul Bakker367dae42009-06-28 21:50:27 +0000347
Paul Bakker33b43f12013-08-20 11:48:36 +0200348/* BEGIN_CASE */
349void mpi_add_abs_add_first( int radix_X, char *input_X, int radix_Y,
350 char *input_Y, int radix_A, char *input_A )
Paul Bakkerba48cb22009-07-12 11:01:32 +0000351{
352 mpi X, Y, A;
Paul Bakker6c591fa2011-05-05 11:49:20 +0000353 mpi_init( &X ); mpi_init( &Y ); mpi_init( &A );
Paul Bakkerba48cb22009-07-12 11:01:32 +0000354
Paul Bakker33b43f12013-08-20 11:48:36 +0200355 TEST_ASSERT( mpi_read_string( &X, radix_X, input_X ) == 0 );
356 TEST_ASSERT( mpi_read_string( &Y, radix_Y, input_Y ) == 0 );
357 TEST_ASSERT( mpi_read_string( &A, radix_A, input_A ) == 0 );
Paul Bakkerba48cb22009-07-12 11:01:32 +0000358 TEST_ASSERT( mpi_add_abs( &X, &X, &Y ) == 0 );
359 TEST_ASSERT( mpi_cmp_mpi( &X, &A ) == 0 );
Paul Bakker6c591fa2011-05-05 11:49:20 +0000360
361 mpi_free( &X ); mpi_free( &Y ); mpi_free( &A );
Paul Bakkerba48cb22009-07-12 11:01:32 +0000362}
Paul Bakker33b43f12013-08-20 11:48:36 +0200363/* END_CASE */
Paul Bakkerba48cb22009-07-12 11:01:32 +0000364
Paul Bakker33b43f12013-08-20 11:48:36 +0200365/* BEGIN_CASE */
366void mpi_add_abs_add_second( int radix_X, char *input_X, int radix_Y,
367 char *input_Y, int radix_A, char *input_A )
Paul Bakkerba48cb22009-07-12 11:01:32 +0000368{
369 mpi X, Y, A;
Paul Bakker6c591fa2011-05-05 11:49:20 +0000370 mpi_init( &X ); mpi_init( &Y ); mpi_init( &A );
Paul Bakkerba48cb22009-07-12 11:01:32 +0000371
Paul Bakker33b43f12013-08-20 11:48:36 +0200372 TEST_ASSERT( mpi_read_string( &X, radix_X, input_X ) == 0 );
373 TEST_ASSERT( mpi_read_string( &Y, radix_Y, input_Y ) == 0 );
374 TEST_ASSERT( mpi_read_string( &A, radix_A, input_A ) == 0 );
Paul Bakkerba48cb22009-07-12 11:01:32 +0000375 TEST_ASSERT( mpi_add_abs( &Y, &X, &Y ) == 0 );
376 TEST_ASSERT( mpi_cmp_mpi( &Y, &A ) == 0 );
Paul Bakker6c591fa2011-05-05 11:49:20 +0000377
378 mpi_free( &X ); mpi_free( &Y ); mpi_free( &A );
Paul Bakkerba48cb22009-07-12 11:01:32 +0000379}
Paul Bakker33b43f12013-08-20 11:48:36 +0200380/* END_CASE */
Paul Bakkerba48cb22009-07-12 11:01:32 +0000381
Paul Bakker33b43f12013-08-20 11:48:36 +0200382/* BEGIN_CASE */
383void mpi_add_int( int radix_X, char *input_X, int input_Y, int radix_A,
384 char *input_A )
Paul Bakker367dae42009-06-28 21:50:27 +0000385{
386 mpi X, Z, A;
Paul Bakker6c591fa2011-05-05 11:49:20 +0000387 mpi_init( &X ); mpi_init( &Z ); mpi_init( &A );
Paul Bakker367dae42009-06-28 21:50:27 +0000388
Paul Bakker33b43f12013-08-20 11:48:36 +0200389 TEST_ASSERT( mpi_read_string( &X, radix_X, input_X ) == 0 );
390 TEST_ASSERT( mpi_read_string( &A, radix_A, input_A ) == 0 );
391 TEST_ASSERT( mpi_add_int( &Z, &X, input_Y ) == 0 );
Paul Bakker367dae42009-06-28 21:50:27 +0000392 TEST_ASSERT( mpi_cmp_mpi( &Z, &A ) == 0 );
Paul Bakker6c591fa2011-05-05 11:49:20 +0000393
394 mpi_free( &X ); mpi_free( &Z ); mpi_free( &A );
Paul Bakker367dae42009-06-28 21:50:27 +0000395}
Paul Bakker33b43f12013-08-20 11:48:36 +0200396/* END_CASE */
Paul Bakker367dae42009-06-28 21:50:27 +0000397
Paul Bakker33b43f12013-08-20 11:48:36 +0200398/* BEGIN_CASE */
399void mpi_sub_mpi( int radix_X, char *input_X, int radix_Y, char *input_Y,
400 int radix_A, char *input_A )
Paul Bakker367dae42009-06-28 21:50:27 +0000401{
402 mpi X, Y, Z, A;
Paul Bakker6c591fa2011-05-05 11:49:20 +0000403 mpi_init( &X ); mpi_init( &Y ); mpi_init( &Z ); mpi_init( &A );
Paul Bakker367dae42009-06-28 21:50:27 +0000404
Paul Bakker33b43f12013-08-20 11:48:36 +0200405 TEST_ASSERT( mpi_read_string( &X, radix_X, input_X ) == 0 );
406 TEST_ASSERT( mpi_read_string( &Y, radix_Y, input_Y ) == 0 );
407 TEST_ASSERT( mpi_read_string( &A, radix_A, input_A ) == 0 );
Paul Bakker367dae42009-06-28 21:50:27 +0000408 TEST_ASSERT( mpi_sub_mpi( &Z, &X, &Y ) == 0 );
409 TEST_ASSERT( mpi_cmp_mpi( &Z, &A ) == 0 );
Paul Bakker6c591fa2011-05-05 11:49:20 +0000410
411 mpi_free( &X ); mpi_free( &Y ); mpi_free( &Z ); mpi_free( &A );
Paul Bakker367dae42009-06-28 21:50:27 +0000412}
Paul Bakker33b43f12013-08-20 11:48:36 +0200413/* END_CASE */
Paul Bakker367dae42009-06-28 21:50:27 +0000414
Paul Bakker33b43f12013-08-20 11:48:36 +0200415/* BEGIN_CASE */
416void mpi_sub_abs( int radix_X, char *input_X, int radix_Y, char *input_Y,
417 int radix_A, char *input_A, int sub_result )
Paul Bakker367dae42009-06-28 21:50:27 +0000418{
419 mpi X, Y, Z, A;
420 int res;
Paul Bakker6c591fa2011-05-05 11:49:20 +0000421 mpi_init( &X ); mpi_init( &Y ); mpi_init( &Z ); mpi_init( &A );
Paul Bakker367dae42009-06-28 21:50:27 +0000422
Paul Bakker33b43f12013-08-20 11:48:36 +0200423 TEST_ASSERT( mpi_read_string( &X, radix_X, input_X ) == 0 );
424 TEST_ASSERT( mpi_read_string( &Y, radix_Y, input_Y ) == 0 );
425 TEST_ASSERT( mpi_read_string( &A, radix_A, input_A ) == 0 );
Paul Bakker367dae42009-06-28 21:50:27 +0000426
427 res = mpi_sub_abs( &Z, &X, &Y );
Paul Bakker33b43f12013-08-20 11:48:36 +0200428 TEST_ASSERT( res == sub_result );
Paul Bakker367dae42009-06-28 21:50:27 +0000429 if( res == 0 )
430 TEST_ASSERT( mpi_cmp_mpi( &Z, &A ) == 0 );
Paul Bakker6c591fa2011-05-05 11:49:20 +0000431
432 mpi_free( &X ); mpi_free( &Y ); mpi_free( &Z ); mpi_free( &A );
Paul Bakker367dae42009-06-28 21:50:27 +0000433}
Paul Bakker33b43f12013-08-20 11:48:36 +0200434/* END_CASE */
Paul Bakker367dae42009-06-28 21:50:27 +0000435
Paul Bakker33b43f12013-08-20 11:48:36 +0200436/* BEGIN_CASE */
437void mpi_sub_int( int radix_X, char *input_X, int input_Y, int radix_A,
438 char *input_A )
Paul Bakker367dae42009-06-28 21:50:27 +0000439{
440 mpi X, Z, A;
Paul Bakker6c591fa2011-05-05 11:49:20 +0000441 mpi_init( &X ); mpi_init( &Z ); mpi_init( &A );
Paul Bakker367dae42009-06-28 21:50:27 +0000442
Paul Bakker33b43f12013-08-20 11:48:36 +0200443 TEST_ASSERT( mpi_read_string( &X, radix_X, input_X ) == 0 );
444 TEST_ASSERT( mpi_read_string( &A, radix_A, input_A ) == 0 );
445 TEST_ASSERT( mpi_sub_int( &Z, &X, input_Y ) == 0 );
Paul Bakker367dae42009-06-28 21:50:27 +0000446 TEST_ASSERT( mpi_cmp_mpi( &Z, &A ) == 0 );
Paul Bakker6c591fa2011-05-05 11:49:20 +0000447
448 mpi_free( &X ); mpi_free( &Z ); mpi_free( &A );
Paul Bakker367dae42009-06-28 21:50:27 +0000449}
Paul Bakker33b43f12013-08-20 11:48:36 +0200450/* END_CASE */
Paul Bakker367dae42009-06-28 21:50:27 +0000451
Paul Bakker33b43f12013-08-20 11:48:36 +0200452/* BEGIN_CASE */
453void mpi_mul_mpi( int radix_X, char *input_X, int radix_Y, char *input_Y,
454 int radix_A, char *input_A )
Paul Bakker367dae42009-06-28 21:50:27 +0000455{
456 mpi X, Y, Z, A;
Paul Bakker6c591fa2011-05-05 11:49:20 +0000457 mpi_init( &X ); mpi_init( &Y ); 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( &Y, radix_Y, input_Y ) == 0 );
461 TEST_ASSERT( mpi_read_string( &A, radix_A, input_A ) == 0 );
Paul Bakker367dae42009-06-28 21:50:27 +0000462 TEST_ASSERT( mpi_mul_mpi( &Z, &X, &Y ) == 0 );
463 TEST_ASSERT( mpi_cmp_mpi( &Z, &A ) == 0 );
Paul Bakker6c591fa2011-05-05 11:49:20 +0000464
465 mpi_free( &X ); mpi_free( &Y ); mpi_free( &Z ); mpi_free( &A );
Paul Bakker367dae42009-06-28 21:50:27 +0000466}
Paul Bakker33b43f12013-08-20 11:48:36 +0200467/* END_CASE */
Paul Bakker367dae42009-06-28 21:50:27 +0000468
Paul Bakker33b43f12013-08-20 11:48:36 +0200469/* BEGIN_CASE */
470void mpi_mul_int( int radix_X, char *input_X, int input_Y, int radix_A,
471 char *input_A, char *result_comparison )
Paul Bakker367dae42009-06-28 21:50:27 +0000472{
473 mpi X, Z, A;
Paul Bakker6c591fa2011-05-05 11:49:20 +0000474 mpi_init( &X ); mpi_init( &Z ); mpi_init( &A );
Paul Bakker367dae42009-06-28 21:50:27 +0000475
Paul Bakker33b43f12013-08-20 11:48:36 +0200476 TEST_ASSERT( mpi_read_string( &X, radix_X, input_X ) == 0 );
477 TEST_ASSERT( mpi_read_string( &A, radix_A, input_A ) == 0 );
478 TEST_ASSERT( mpi_mul_int( &Z, &X, input_Y ) == 0 );
Paul Bakkerdbd443d2013-08-16 13:38:47 +0200479 if( strcmp( result_comparison, "==" ) == 0 )
480 TEST_ASSERT( mpi_cmp_mpi( &Z, &A ) == 0 );
481 else if( strcmp( result_comparison, "!=" ) == 0 )
482 TEST_ASSERT( mpi_cmp_mpi( &Z, &A ) != 0 );
483 else
484 TEST_ASSERT( "unknown operator" == 0 );
Paul Bakker6c591fa2011-05-05 11:49:20 +0000485
486 mpi_free( &X ); mpi_free( &Z ); mpi_free( &A );
Paul Bakker367dae42009-06-28 21:50:27 +0000487}
Paul Bakker33b43f12013-08-20 11:48:36 +0200488/* END_CASE */
Paul Bakker367dae42009-06-28 21:50:27 +0000489
Paul Bakker33b43f12013-08-20 11:48:36 +0200490/* BEGIN_CASE */
491void mpi_div_mpi( int radix_X, char *input_X, int radix_Y, char *input_Y,
492 int radix_A, char *input_A, int radix_B, char *input_B,
493 int div_result )
Paul Bakker367dae42009-06-28 21:50:27 +0000494{
495 mpi X, Y, Q, R, A, B;
496 int res;
Paul Bakker6c591fa2011-05-05 11:49:20 +0000497 mpi_init( &X ); mpi_init( &Y ); mpi_init( &Q ); mpi_init( &R );
498 mpi_init( &A ); mpi_init( &B );
Paul Bakker367dae42009-06-28 21:50:27 +0000499
Paul Bakker33b43f12013-08-20 11:48:36 +0200500 TEST_ASSERT( mpi_read_string( &X, radix_X, input_X ) == 0 );
501 TEST_ASSERT( mpi_read_string( &Y, radix_Y, input_Y ) == 0 );
502 TEST_ASSERT( mpi_read_string( &A, radix_A, input_A ) == 0 );
503 TEST_ASSERT( mpi_read_string( &B, radix_B, input_B ) == 0 );
Paul Bakker367dae42009-06-28 21:50:27 +0000504 res = mpi_div_mpi( &Q, &R, &X, &Y );
Paul Bakker33b43f12013-08-20 11:48:36 +0200505 TEST_ASSERT( res == div_result );
Paul Bakker367dae42009-06-28 21:50:27 +0000506 if( res == 0 )
507 {
508 TEST_ASSERT( mpi_cmp_mpi( &Q, &A ) == 0 );
509 TEST_ASSERT( mpi_cmp_mpi( &R, &B ) == 0 );
510 }
Paul Bakker6c591fa2011-05-05 11:49:20 +0000511
512 mpi_free( &X ); mpi_free( &Y ); mpi_free( &Q ); mpi_free( &R );
513 mpi_free( &A ); mpi_free( &B );
Paul Bakker367dae42009-06-28 21:50:27 +0000514}
Paul Bakker33b43f12013-08-20 11:48:36 +0200515/* END_CASE */
Paul Bakker367dae42009-06-28 21:50:27 +0000516
Paul Bakker33b43f12013-08-20 11:48:36 +0200517/* BEGIN_CASE */
518void mpi_div_int( int radix_X, char *input_X, int input_Y, int radix_A,
519 char *input_A, int radix_B, char *input_B, int div_result )
Paul Bakker367dae42009-06-28 21:50:27 +0000520{
521 mpi X, Q, R, A, B;
522 int res;
Paul Bakker6c591fa2011-05-05 11:49:20 +0000523 mpi_init( &X ); mpi_init( &Q ); mpi_init( &R ); mpi_init( &A );
524 mpi_init( &B );
Paul Bakker367dae42009-06-28 21:50:27 +0000525
Paul Bakker33b43f12013-08-20 11:48:36 +0200526 TEST_ASSERT( mpi_read_string( &X, radix_X, input_X ) == 0 );
527 TEST_ASSERT( mpi_read_string( &A, radix_A, input_A ) == 0 );
528 TEST_ASSERT( mpi_read_string( &B, radix_B, input_B ) == 0 );
529 res = mpi_div_int( &Q, &R, &X, input_Y );
530 TEST_ASSERT( res == div_result );
Paul Bakker367dae42009-06-28 21:50:27 +0000531 if( res == 0 )
532 {
533 TEST_ASSERT( mpi_cmp_mpi( &Q, &A ) == 0 );
534 TEST_ASSERT( mpi_cmp_mpi( &R, &B ) == 0 );
535 }
Paul Bakker6c591fa2011-05-05 11:49:20 +0000536
537 mpi_free( &X ); mpi_free( &Q ); mpi_free( &R ); mpi_free( &A );
538 mpi_free( &B );
Paul Bakker367dae42009-06-28 21:50:27 +0000539}
Paul Bakker33b43f12013-08-20 11:48:36 +0200540/* END_CASE */
Paul Bakker367dae42009-06-28 21:50:27 +0000541
Paul Bakker33b43f12013-08-20 11:48:36 +0200542/* BEGIN_CASE */
543void mpi_mod_mpi( int radix_X, char *input_X, int radix_Y, char *input_Y,
544 int radix_A, char *input_A, int div_result )
Paul Bakker367dae42009-06-28 21:50:27 +0000545{
Paul Bakkerf02c5642012-11-13 10:25:21 +0000546 mpi X, Y, A;
Paul Bakker367dae42009-06-28 21:50:27 +0000547 int res;
Paul Bakkerf02c5642012-11-13 10:25:21 +0000548 mpi_init( &X ); mpi_init( &Y ); mpi_init( &A );
Paul Bakker367dae42009-06-28 21:50:27 +0000549
Paul Bakker33b43f12013-08-20 11:48:36 +0200550 TEST_ASSERT( mpi_read_string( &X, radix_X, input_X ) == 0 );
551 TEST_ASSERT( mpi_read_string( &Y, radix_Y, input_Y ) == 0 );
552 TEST_ASSERT( mpi_read_string( &A, radix_A, input_A ) == 0 );
Paul Bakkerf02c5642012-11-13 10:25:21 +0000553 res = mpi_mod_mpi( &X, &X, &Y );
Paul Bakker33b43f12013-08-20 11:48:36 +0200554 TEST_ASSERT( res == div_result );
Paul Bakker367dae42009-06-28 21:50:27 +0000555 if( res == 0 )
556 {
Paul Bakkerf02c5642012-11-13 10:25:21 +0000557 TEST_ASSERT( mpi_cmp_mpi( &X, &A ) == 0 );
Paul Bakker367dae42009-06-28 21:50:27 +0000558 }
Paul Bakker6c591fa2011-05-05 11:49:20 +0000559
Paul Bakkerf02c5642012-11-13 10:25:21 +0000560 mpi_free( &X ); mpi_free( &Y ); mpi_free( &A );
Paul Bakker367dae42009-06-28 21:50:27 +0000561}
Paul Bakker33b43f12013-08-20 11:48:36 +0200562/* END_CASE */
Paul Bakker367dae42009-06-28 21:50:27 +0000563
Paul Bakker33b43f12013-08-20 11:48:36 +0200564/* BEGIN_CASE */
565void mpi_mod_int( int radix_X, char *input_X, int input_Y, int input_A,
566 int div_result )
Paul Bakker367dae42009-06-28 21:50:27 +0000567{
568 mpi X;
569 int res;
Paul Bakkera755ca12011-04-24 09:11:17 +0000570 t_uint r;
Paul Bakker6c591fa2011-05-05 11:49:20 +0000571 mpi_init( &X );
Paul Bakker367dae42009-06-28 21:50:27 +0000572
Paul Bakker33b43f12013-08-20 11:48:36 +0200573 TEST_ASSERT( mpi_read_string( &X, radix_X, input_X ) == 0 );
574 res = mpi_mod_int( &r, &X, input_Y );
575 TEST_ASSERT( res == div_result );
Paul Bakker367dae42009-06-28 21:50:27 +0000576 if( res == 0 )
577 {
Paul Bakker33b43f12013-08-20 11:48:36 +0200578 TEST_ASSERT( r == (t_uint) input_A );
Paul Bakker367dae42009-06-28 21:50:27 +0000579 }
Paul Bakker6c591fa2011-05-05 11:49:20 +0000580
581 mpi_free( &X );
Paul Bakker367dae42009-06-28 21:50:27 +0000582}
Paul Bakker33b43f12013-08-20 11:48:36 +0200583/* END_CASE */
Paul Bakker367dae42009-06-28 21:50:27 +0000584
Paul Bakker33b43f12013-08-20 11:48:36 +0200585/* BEGIN_CASE */
586void mpi_exp_mod( int radix_A, char *input_A, int radix_E, char *input_E,
587 int radix_N, char *input_N, int radix_RR, char *input_RR,
588 int radix_X, char *input_X, int div_result )
Paul Bakker367dae42009-06-28 21:50:27 +0000589{
590 mpi A, E, N, RR, Z, X;
591 int res;
Paul Bakker6c591fa2011-05-05 11:49:20 +0000592 mpi_init( &A ); mpi_init( &E ); mpi_init( &N );
593 mpi_init( &RR ); mpi_init( &Z ); mpi_init( &X );
Paul Bakker367dae42009-06-28 21:50:27 +0000594
Paul Bakker33b43f12013-08-20 11:48:36 +0200595 TEST_ASSERT( mpi_read_string( &A, radix_A, input_A ) == 0 );
596 TEST_ASSERT( mpi_read_string( &E, radix_E, input_E ) == 0 );
597 TEST_ASSERT( mpi_read_string( &N, radix_N, input_N ) == 0 );
598 TEST_ASSERT( mpi_read_string( &X, radix_X, input_X ) == 0 );
Paul Bakker367dae42009-06-28 21:50:27 +0000599
Paul Bakker33b43f12013-08-20 11:48:36 +0200600 if( strlen( input_RR ) )
601 TEST_ASSERT( mpi_read_string( &RR, radix_RR, input_RR ) == 0 );
Paul Bakker367dae42009-06-28 21:50:27 +0000602
603 res = mpi_exp_mod( &Z, &A, &E, &N, &RR );
Paul Bakker33b43f12013-08-20 11:48:36 +0200604 TEST_ASSERT( res == div_result );
Paul Bakker367dae42009-06-28 21:50:27 +0000605 if( res == 0 )
606 {
607 TEST_ASSERT( mpi_cmp_mpi( &Z, &X ) == 0 );
608 }
Paul Bakker6c591fa2011-05-05 11:49:20 +0000609
610 mpi_free( &A ); mpi_free( &E ); mpi_free( &N );
611 mpi_free( &RR ); mpi_free( &Z ); mpi_free( &X );
Paul Bakker367dae42009-06-28 21:50:27 +0000612}
Paul Bakker33b43f12013-08-20 11:48:36 +0200613/* END_CASE */
Paul Bakker367dae42009-06-28 21:50:27 +0000614
Paul Bakker33b43f12013-08-20 11:48:36 +0200615/* BEGIN_CASE */
616void mpi_inv_mod( int radix_X, char *input_X, int radix_Y, char *input_Y,
617 int radix_A, char *input_A, int div_result )
Paul Bakker367dae42009-06-28 21:50:27 +0000618{
619 mpi X, Y, Z, A;
620 int res;
Paul Bakker6c591fa2011-05-05 11:49:20 +0000621 mpi_init( &X ); mpi_init( &Y ); mpi_init( &Z ); mpi_init( &A );
Paul Bakker367dae42009-06-28 21:50:27 +0000622
Paul Bakker33b43f12013-08-20 11:48:36 +0200623 TEST_ASSERT( mpi_read_string( &X, radix_X, input_X ) == 0 );
624 TEST_ASSERT( mpi_read_string( &Y, radix_Y, input_Y ) == 0 );
625 TEST_ASSERT( mpi_read_string( &A, radix_A, input_A ) == 0 );
Paul Bakker367dae42009-06-28 21:50:27 +0000626 res = mpi_inv_mod( &Z, &X, &Y );
Paul Bakker33b43f12013-08-20 11:48:36 +0200627 TEST_ASSERT( res == div_result );
Paul Bakker367dae42009-06-28 21:50:27 +0000628 if( res == 0 )
629 {
630 TEST_ASSERT( mpi_cmp_mpi( &Z, &A ) == 0 );
631 }
Paul Bakker6c591fa2011-05-05 11:49:20 +0000632
633 mpi_free( &X ); mpi_free( &Y ); mpi_free( &Z ); mpi_free( &A );
Paul Bakker367dae42009-06-28 21:50:27 +0000634}
Paul Bakker33b43f12013-08-20 11:48:36 +0200635/* END_CASE */
Paul Bakker367dae42009-06-28 21:50:27 +0000636
Paul Bakker33b43f12013-08-20 11:48:36 +0200637/* BEGIN_CASE */
638void mpi_is_prime( int radix_X, char *input_X, int div_result )
Paul Bakker367dae42009-06-28 21:50:27 +0000639{
640 mpi X;
641 int res;
Paul Bakker6c591fa2011-05-05 11:49:20 +0000642 mpi_init( &X );
Paul Bakker367dae42009-06-28 21:50:27 +0000643
Paul Bakker33b43f12013-08-20 11:48:36 +0200644 TEST_ASSERT( mpi_read_string( &X, radix_X, input_X ) == 0 );
Paul Bakker5690efc2011-05-26 13:16:06 +0000645 res = mpi_is_prime( &X, rnd_std_rand, NULL );
Paul Bakker33b43f12013-08-20 11:48:36 +0200646 TEST_ASSERT( res == div_result );
Paul Bakker6c591fa2011-05-05 11:49:20 +0000647
648 mpi_free( &X );
Paul Bakker367dae42009-06-28 21:50:27 +0000649}
Paul Bakker33b43f12013-08-20 11:48:36 +0200650/* END_CASE */
Paul Bakker367dae42009-06-28 21:50:27 +0000651
Paul Bakker33b43f12013-08-20 11:48:36 +0200652/* BEGIN_CASE */
653void mpi_shift_l( int radix_X, char *input_X, int shift_X, int radix_A,
654 char *input_A)
Paul Bakker367dae42009-06-28 21:50:27 +0000655{
656 mpi X, A;
Paul Bakker6c591fa2011-05-05 11:49:20 +0000657 mpi_init( &X ); mpi_init( &A );
Paul Bakker367dae42009-06-28 21:50:27 +0000658
Paul Bakker33b43f12013-08-20 11:48:36 +0200659 TEST_ASSERT( mpi_read_string( &X, radix_X, input_X ) == 0 );
660 TEST_ASSERT( mpi_read_string( &A, radix_A, input_A ) == 0 );
661 TEST_ASSERT( mpi_shift_l( &X, shift_X ) == 0 );
Paul Bakker367dae42009-06-28 21:50:27 +0000662 TEST_ASSERT( mpi_cmp_mpi( &X, &A ) == 0 );
Paul Bakker6c591fa2011-05-05 11:49:20 +0000663
664 mpi_free( &X ); mpi_free( &A );
Paul Bakker367dae42009-06-28 21:50:27 +0000665}
Paul Bakker33b43f12013-08-20 11:48:36 +0200666/* END_CASE */
Paul Bakker367dae42009-06-28 21:50:27 +0000667
Paul Bakker33b43f12013-08-20 11:48:36 +0200668/* BEGIN_CASE */
669void mpi_shift_r( int radix_X, char *input_X, int shift_X, int radix_A,
670 char *input_A )
Paul Bakker367dae42009-06-28 21:50:27 +0000671{
672 mpi X, A;
Paul Bakker6c591fa2011-05-05 11:49:20 +0000673 mpi_init( &X ); mpi_init( &A );
Paul Bakker367dae42009-06-28 21:50:27 +0000674
Paul Bakker33b43f12013-08-20 11:48:36 +0200675 TEST_ASSERT( mpi_read_string( &X, radix_X, input_X ) == 0 );
676 TEST_ASSERT( mpi_read_string( &A, radix_A, input_A ) == 0 );
677 TEST_ASSERT( mpi_shift_r( &X, shift_X ) == 0 );
Paul Bakker367dae42009-06-28 21:50:27 +0000678 TEST_ASSERT( mpi_cmp_mpi( &X, &A ) == 0 );
Paul Bakker6c591fa2011-05-05 11:49:20 +0000679
680 mpi_free( &X ); mpi_free( &A );
Paul Bakker367dae42009-06-28 21:50:27 +0000681}
Paul Bakker33b43f12013-08-20 11:48:36 +0200682/* END_CASE */
Paul Bakker367dae42009-06-28 21:50:27 +0000683
Paul Bakker33b43f12013-08-20 11:48:36 +0200684/* BEGIN_CASE */
685void mpi_selftest()
Paul Bakkere896fea2009-07-06 06:40:23 +0000686{
687 TEST_ASSERT( mpi_self_test( 0 ) == 0 );
688}
Paul Bakker33b43f12013-08-20 11:48:36 +0200689/* END_CASE */