blob: 795d2a022f289661f5861b91e1c784979cc4294b [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 */
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
Paul Bakkerbd51b262014-07-10 15:26:12 +020031exit:
Paul Bakker6c591fa2011-05-05 11:49:20 +000032 mpi_free( &X );
Paul Bakkere896fea2009-07-06 06:40:23 +000033}
Paul Bakker33b43f12013-08-20 11:48:36 +020034/* END_CASE */
Paul Bakkere896fea2009-07-06 06:40:23 +000035
Paul Bakker33b43f12013-08-20 11:48:36 +020036/* BEGIN_CASE */
37void mpi_read_binary( char *input_X, int radix_A, char *input_A )
Paul Bakkere896fea2009-07-06 06:40:23 +000038{
39 mpi X;
40 unsigned char str[1000];
41 unsigned char buf[1000];
Paul Bakkerf4a3f302011-04-24 15:53:29 +000042 size_t len = 1000;
43 size_t input_len;
Paul Bakkere896fea2009-07-06 06:40:23 +000044
Paul Bakker6c591fa2011-05-05 11:49:20 +000045 mpi_init( &X );
Paul Bakkere896fea2009-07-06 06:40:23 +000046
Paul Bakker33b43f12013-08-20 11:48:36 +020047 input_len = unhexify( buf, input_X );
Paul Bakkere896fea2009-07-06 06:40:23 +000048
49 TEST_ASSERT( mpi_read_binary( &X, buf, input_len ) == 0 );
Paul Bakker33b43f12013-08-20 11:48:36 +020050 TEST_ASSERT( mpi_write_string( &X, radix_A, (char *) str, &len ) == 0 );
51 TEST_ASSERT( strcmp( (char *) str, input_A ) == 0 );
Paul Bakker6c591fa2011-05-05 11:49:20 +000052
Paul Bakkerbd51b262014-07-10 15:26:12 +020053exit:
Paul Bakker6c591fa2011-05-05 11:49:20 +000054 mpi_free( &X );
Paul Bakkere896fea2009-07-06 06:40:23 +000055}
Paul Bakker33b43f12013-08-20 11:48:36 +020056/* END_CASE */
Paul Bakkere896fea2009-07-06 06:40:23 +000057
Paul Bakker33b43f12013-08-20 11:48:36 +020058/* BEGIN_CASE */
59void mpi_write_binary( int radix_X, char *input_X, char *input_A,
60 int output_size, int result )
Paul Bakkere896fea2009-07-06 06:40:23 +000061{
62 mpi X;
63 unsigned char str[1000];
64 unsigned char buf[1000];
Paul Bakkerf4a3f302011-04-24 15:53:29 +000065 size_t buflen;
Paul Bakkere896fea2009-07-06 06:40:23 +000066
67 memset( buf, 0x00, 1000 );
68 memset( str, 0x00, 1000 );
69
Paul Bakker6c591fa2011-05-05 11:49:20 +000070 mpi_init( &X );
Paul Bakkere896fea2009-07-06 06:40:23 +000071
Paul Bakker33b43f12013-08-20 11:48:36 +020072 TEST_ASSERT( mpi_read_string( &X, radix_X, input_X ) == 0 );
Paul Bakkere896fea2009-07-06 06:40:23 +000073
Paul Bakker69998dd2009-07-11 19:15:20 +000074 buflen = mpi_size( &X );
Paul Bakker33b43f12013-08-20 11:48:36 +020075 if( buflen > (size_t) output_size )
76 buflen = (size_t) output_size;
Paul Bakkere896fea2009-07-06 06:40:23 +000077
Paul Bakker33b43f12013-08-20 11:48:36 +020078 TEST_ASSERT( mpi_write_binary( &X, buf, buflen ) == result );
79 if( result == 0)
Paul Bakkerba48cb22009-07-12 11:01:32 +000080 {
81 hexify( str, buf, buflen );
Paul Bakkere896fea2009-07-06 06:40:23 +000082
Paul Bakker33b43f12013-08-20 11:48:36 +020083 TEST_ASSERT( strcasecmp( (char *) str, input_A ) == 0 );
Paul Bakkerba48cb22009-07-12 11:01:32 +000084 }
Paul Bakker6c591fa2011-05-05 11:49:20 +000085
Paul Bakkerbd51b262014-07-10 15:26:12 +020086exit:
Paul Bakker6c591fa2011-05-05 11:49:20 +000087 mpi_free( &X );
Paul Bakkere896fea2009-07-06 06:40:23 +000088}
Paul Bakker33b43f12013-08-20 11:48:36 +020089/* END_CASE */
Paul Bakkere896fea2009-07-06 06:40:23 +000090
Paul Bakker428b9ba2013-09-15 15:20:37 +020091/* BEGIN_CASE depends_on:POLARSSL_FS_IO */
Paul Bakker33b43f12013-08-20 11:48:36 +020092void mpi_read_file( int radix_X, char *input_file, char *input_A,
93 int result )
Paul Bakkere896fea2009-07-06 06:40:23 +000094{
95 mpi X;
96 unsigned char str[1000];
97 unsigned char buf[1000];
Paul Bakkerf4a3f302011-04-24 15:53:29 +000098 size_t buflen;
Paul Bakker69998dd2009-07-11 19:15:20 +000099 FILE *file;
Paul Bakkere896fea2009-07-06 06:40:23 +0000100
101 memset( buf, 0x00, 1000 );
102 memset( str, 0x00, 1000 );
103
Paul Bakker6c591fa2011-05-05 11:49:20 +0000104 mpi_init( &X );
Paul Bakkere896fea2009-07-06 06:40:23 +0000105
Paul Bakker33b43f12013-08-20 11:48:36 +0200106 file = fopen( input_file, "r" );
Paul Bakker8a0c0a92014-04-17 16:08:20 +0200107 TEST_ASSERT( file != NULL );
Paul Bakker33b43f12013-08-20 11:48:36 +0200108 TEST_ASSERT( mpi_read_file( &X, radix_X, file ) == result );
Paul Bakkere896fea2009-07-06 06:40:23 +0000109 fclose(file);
110
Paul Bakker33b43f12013-08-20 11:48:36 +0200111 if( result == 0 )
Paul Bakkerba48cb22009-07-12 11:01:32 +0000112 {
113 buflen = mpi_size( &X );
114 TEST_ASSERT( mpi_write_binary( &X, buf, buflen ) == 0 );
Paul Bakkere896fea2009-07-06 06:40:23 +0000115
Paul Bakkerba48cb22009-07-12 11:01:32 +0000116 hexify( str, buf, buflen );
Paul Bakkere896fea2009-07-06 06:40:23 +0000117
Paul Bakker33b43f12013-08-20 11:48:36 +0200118 TEST_ASSERT( strcasecmp( (char *) str, input_A ) == 0 );
Paul Bakkerba48cb22009-07-12 11:01:32 +0000119 }
Paul Bakker6c591fa2011-05-05 11:49:20 +0000120
Paul Bakkerbd51b262014-07-10 15:26:12 +0200121exit:
Paul Bakker6c591fa2011-05-05 11:49:20 +0000122 mpi_free( &X );
Paul Bakkere896fea2009-07-06 06:40:23 +0000123}
Paul Bakker33b43f12013-08-20 11:48:36 +0200124/* END_CASE */
Paul Bakkere896fea2009-07-06 06:40:23 +0000125
Paul Bakker428b9ba2013-09-15 15:20:37 +0200126/* BEGIN_CASE depends_on:POLARSSL_FS_IO */
Paul Bakker33b43f12013-08-20 11:48:36 +0200127void mpi_write_file( int radix_X, char *input_X, int output_radix,
128 char *output_file )
Paul Bakkere896fea2009-07-06 06:40:23 +0000129{
130 mpi X, Y;
Paul Bakker69998dd2009-07-11 19:15:20 +0000131 FILE *file_out, *file_in;
132
Paul Bakker6c591fa2011-05-05 11:49:20 +0000133 mpi_init( &X ); mpi_init( &Y );
Paul Bakkere896fea2009-07-06 06:40:23 +0000134
Paul Bakker33b43f12013-08-20 11:48:36 +0200135 TEST_ASSERT( mpi_read_string( &X, radix_X, input_X ) == 0 );
Paul Bakkere896fea2009-07-06 06:40:23 +0000136
Paul Bakker33b43f12013-08-20 11:48:36 +0200137 file_out = fopen( output_file, "w" );
Paul Bakker5690efc2011-05-26 13:16:06 +0000138 TEST_ASSERT( file_out != NULL );
Paul Bakker33b43f12013-08-20 11:48:36 +0200139 TEST_ASSERT( mpi_write_file( NULL, &X, output_radix, file_out ) == 0 );
Paul Bakkere896fea2009-07-06 06:40:23 +0000140 fclose(file_out);
141
Paul Bakker33b43f12013-08-20 11:48:36 +0200142 file_in = fopen( output_file, "r" );
Paul Bakker5690efc2011-05-26 13:16:06 +0000143 TEST_ASSERT( file_in != NULL );
Paul Bakker33b43f12013-08-20 11:48:36 +0200144 TEST_ASSERT( mpi_read_file( &Y, output_radix, file_in ) == 0 );
Paul Bakkere896fea2009-07-06 06:40:23 +0000145 fclose(file_in);
146
147 TEST_ASSERT( mpi_cmp_mpi( &X, &Y ) == 0 );
Paul Bakker6c591fa2011-05-05 11:49:20 +0000148
Paul Bakkerbd51b262014-07-10 15:26:12 +0200149exit:
Paul Bakker6c591fa2011-05-05 11:49:20 +0000150 mpi_free( &X ); mpi_free( &Y );
Paul Bakkere896fea2009-07-06 06:40:23 +0000151}
Paul Bakker33b43f12013-08-20 11:48:36 +0200152/* END_CASE */
Paul Bakkere896fea2009-07-06 06:40:23 +0000153
Paul Bakker33b43f12013-08-20 11:48:36 +0200154/* BEGIN_CASE */
155void mpi_get_bit( int radix_X, char *input_X, int pos, int val )
Paul Bakker2f5947e2011-05-18 15:47:11 +0000156{
157 mpi X;
158 mpi_init( &X );
Paul Bakker33b43f12013-08-20 11:48:36 +0200159 TEST_ASSERT( mpi_read_string( &X, radix_X, input_X ) == 0 );
160 TEST_ASSERT( mpi_get_bit( &X, pos ) == val );
Paul Bakker2f5947e2011-05-18 15:47:11 +0000161
Paul Bakkerbd51b262014-07-10 15:26:12 +0200162exit:
Paul Bakker2f5947e2011-05-18 15:47:11 +0000163 mpi_free( &X );
164}
Paul Bakker33b43f12013-08-20 11:48:36 +0200165/* END_CASE */
Paul Bakker2f5947e2011-05-18 15:47:11 +0000166
Paul Bakker33b43f12013-08-20 11:48:36 +0200167/* BEGIN_CASE */
168void mpi_set_bit( int radix_X, char *input_X, int pos, int val, int radix_Y,
169 char *output_Y )
Paul Bakker2f5947e2011-05-18 15:47:11 +0000170{
171 mpi X, Y;
172 mpi_init( &X ); mpi_init( &Y );
173
Paul Bakker33b43f12013-08-20 11:48:36 +0200174 TEST_ASSERT( mpi_read_string( &X, radix_X, input_X ) == 0 );
175 TEST_ASSERT( mpi_read_string( &Y, radix_Y, output_Y ) == 0 );
176 TEST_ASSERT( mpi_set_bit( &X, pos, val ) == 0 );
Paul Bakker2f5947e2011-05-18 15:47:11 +0000177 TEST_ASSERT( mpi_cmp_mpi( &X, &Y ) == 0 );
178
Paul Bakkerbd51b262014-07-10 15:26:12 +0200179exit:
Manuel Pégourié-Gonnarde44ec102012-11-17 12:42:51 +0100180 mpi_free( &X ); mpi_free( &Y );
Paul Bakker2f5947e2011-05-18 15:47:11 +0000181}
Paul Bakker33b43f12013-08-20 11:48:36 +0200182/* END_CASE */
Paul Bakker2f5947e2011-05-18 15:47:11 +0000183
Paul Bakker33b43f12013-08-20 11:48:36 +0200184/* BEGIN_CASE */
185void mpi_lsb( int radix_X, char *input_X, int nr_bits )
Paul Bakkere896fea2009-07-06 06:40:23 +0000186{
187 mpi X;
Paul Bakker6c591fa2011-05-05 11:49:20 +0000188 mpi_init( &X );
Paul Bakkere896fea2009-07-06 06:40:23 +0000189
Paul Bakker33b43f12013-08-20 11:48:36 +0200190 TEST_ASSERT( mpi_read_string( &X, radix_X, input_X ) == 0 );
191 TEST_ASSERT( mpi_lsb( &X ) == (size_t) nr_bits );
Paul Bakker6c591fa2011-05-05 11:49:20 +0000192
Paul Bakkerbd51b262014-07-10 15:26:12 +0200193exit:
Paul Bakker6c591fa2011-05-05 11:49:20 +0000194 mpi_free( &X );
Paul Bakkere896fea2009-07-06 06:40:23 +0000195}
Paul Bakker33b43f12013-08-20 11:48:36 +0200196/* END_CASE */
Paul Bakkere896fea2009-07-06 06:40:23 +0000197
Paul Bakker33b43f12013-08-20 11:48:36 +0200198/* BEGIN_CASE */
199void mpi_msb( int radix_X, char *input_X, int nr_bits )
Paul Bakkere896fea2009-07-06 06:40:23 +0000200{
201 mpi X;
Paul Bakker6c591fa2011-05-05 11:49:20 +0000202 mpi_init( &X );
Paul Bakkere896fea2009-07-06 06:40:23 +0000203
Paul Bakker33b43f12013-08-20 11:48:36 +0200204 TEST_ASSERT( mpi_read_string( &X, radix_X, input_X ) == 0 );
205 TEST_ASSERT( mpi_msb( &X ) == (size_t) nr_bits );
Paul Bakker6c591fa2011-05-05 11:49:20 +0000206
Paul Bakkerbd51b262014-07-10 15:26:12 +0200207exit:
Paul Bakker6c591fa2011-05-05 11:49:20 +0000208 mpi_free( &X );
Paul Bakker367dae42009-06-28 21:50:27 +0000209}
Paul Bakker33b43f12013-08-20 11:48:36 +0200210/* END_CASE */
Paul Bakker367dae42009-06-28 21:50:27 +0000211
Paul Bakker33b43f12013-08-20 11:48:36 +0200212/* BEGIN_CASE */
213void mpi_gcd( int radix_X, char *input_X, int radix_Y, char *input_Y,
214 int radix_A, char *input_A )
Paul Bakker367dae42009-06-28 21:50:27 +0000215{
216 mpi A, X, Y, Z;
Paul Bakker6c591fa2011-05-05 11:49:20 +0000217 mpi_init( &A ); mpi_init( &X ); mpi_init( &Y ); mpi_init( &Z );
Paul Bakker367dae42009-06-28 21:50:27 +0000218
Paul Bakker33b43f12013-08-20 11:48:36 +0200219 TEST_ASSERT( mpi_read_string( &X, radix_X, input_X ) == 0 );
220 TEST_ASSERT( mpi_read_string( &Y, radix_Y, input_Y ) == 0 );
221 TEST_ASSERT( mpi_read_string( &A, radix_A, input_A ) == 0 );
Paul Bakker367dae42009-06-28 21:50:27 +0000222 TEST_ASSERT( mpi_gcd( &Z, &X, &Y ) == 0 );
223 TEST_ASSERT( mpi_cmp_mpi( &Z, &A ) == 0 );
Paul Bakker6c591fa2011-05-05 11:49:20 +0000224
Paul Bakkerbd51b262014-07-10 15:26:12 +0200225exit:
Paul Bakker6c591fa2011-05-05 11:49:20 +0000226 mpi_free( &A ); mpi_free( &X ); mpi_free( &Y ); mpi_free( &Z );
Paul Bakker367dae42009-06-28 21:50:27 +0000227}
Paul Bakker33b43f12013-08-20 11:48:36 +0200228/* END_CASE */
Paul Bakker367dae42009-06-28 21:50:27 +0000229
Paul Bakker33b43f12013-08-20 11:48:36 +0200230/* BEGIN_CASE */
231void mpi_cmp_int( int input_X, int input_A, int result_CMP )
Paul Bakker367dae42009-06-28 21:50:27 +0000232{
233 mpi X;
Paul Bakker6c591fa2011-05-05 11:49:20 +0000234 mpi_init( &X );
Paul Bakker367dae42009-06-28 21:50:27 +0000235
Paul Bakker33b43f12013-08-20 11:48:36 +0200236 TEST_ASSERT( mpi_lset( &X, input_X ) == 0);
237 TEST_ASSERT( mpi_cmp_int( &X, input_A ) == result_CMP);
Paul Bakker6c591fa2011-05-05 11:49:20 +0000238
Paul Bakkerbd51b262014-07-10 15:26:12 +0200239exit:
Paul Bakker6c591fa2011-05-05 11:49:20 +0000240 mpi_free( &X );
Paul Bakker367dae42009-06-28 21:50:27 +0000241}
Paul Bakker33b43f12013-08-20 11:48:36 +0200242/* END_CASE */
Paul Bakker367dae42009-06-28 21:50:27 +0000243
Paul Bakker33b43f12013-08-20 11:48:36 +0200244/* BEGIN_CASE */
245void mpi_cmp_mpi( int radix_X, char *input_X, int radix_Y, char *input_Y,
246 int input_A )
Paul Bakker367dae42009-06-28 21:50:27 +0000247{
248 mpi X, Y;
Paul Bakker6c591fa2011-05-05 11:49:20 +0000249 mpi_init( &X ); mpi_init( &Y );
Paul Bakker367dae42009-06-28 21:50:27 +0000250
Paul Bakker33b43f12013-08-20 11:48:36 +0200251 TEST_ASSERT( mpi_read_string( &X, radix_X, input_X ) == 0 );
252 TEST_ASSERT( mpi_read_string( &Y, radix_Y, input_Y ) == 0 );
253 TEST_ASSERT( mpi_cmp_mpi( &X, &Y ) == input_A );
Paul Bakker6c591fa2011-05-05 11:49:20 +0000254
Paul Bakkerbd51b262014-07-10 15:26:12 +0200255exit:
Paul Bakker6c591fa2011-05-05 11:49:20 +0000256 mpi_free( &X ); mpi_free( &Y );
Paul Bakker367dae42009-06-28 21:50:27 +0000257}
Paul Bakker33b43f12013-08-20 11:48:36 +0200258/* END_CASE */
Paul Bakker367dae42009-06-28 21:50:27 +0000259
Paul Bakker33b43f12013-08-20 11:48:36 +0200260/* BEGIN_CASE */
261void mpi_cmp_abs( int radix_X, char *input_X, int radix_Y, char *input_Y,
262 int input_A )
Paul Bakker367dae42009-06-28 21:50:27 +0000263{
264 mpi X, Y;
Paul Bakker6c591fa2011-05-05 11:49:20 +0000265 mpi_init( &X ); mpi_init( &Y );
Paul Bakker367dae42009-06-28 21:50:27 +0000266
Paul Bakker33b43f12013-08-20 11:48:36 +0200267 TEST_ASSERT( mpi_read_string( &X, radix_X, input_X ) == 0 );
268 TEST_ASSERT( mpi_read_string( &Y, radix_Y, input_Y ) == 0 );
269 TEST_ASSERT( mpi_cmp_abs( &X, &Y ) == input_A );
Paul Bakker6c591fa2011-05-05 11:49:20 +0000270
Paul Bakkerbd51b262014-07-10 15:26:12 +0200271exit:
Paul Bakker6c591fa2011-05-05 11:49:20 +0000272 mpi_free( &X ); mpi_free( &Y );
Paul Bakker367dae42009-06-28 21:50:27 +0000273}
Paul Bakker33b43f12013-08-20 11:48:36 +0200274/* END_CASE */
Paul Bakker367dae42009-06-28 21:50:27 +0000275
Paul Bakker33b43f12013-08-20 11:48:36 +0200276/* BEGIN_CASE */
277void mpi_copy( int input_X, int input_A )
Paul Bakker367dae42009-06-28 21:50:27 +0000278{
279 mpi X, Y, A;
Paul Bakker6c591fa2011-05-05 11:49:20 +0000280 mpi_init( &X ); mpi_init( &Y ); mpi_init( &A );
Paul Bakker367dae42009-06-28 21:50:27 +0000281
Paul Bakker33b43f12013-08-20 11:48:36 +0200282 TEST_ASSERT( mpi_lset( &X, input_X ) == 0 );
283 TEST_ASSERT( mpi_lset( &Y, input_A ) == 0 );
284 TEST_ASSERT( mpi_lset( &A, input_A ) == 0 );
Paul Bakker367dae42009-06-28 21:50:27 +0000285 TEST_ASSERT( mpi_cmp_mpi( &X, &Y ) != 0 );
286 TEST_ASSERT( mpi_cmp_mpi( &Y, &A ) == 0 );
287 TEST_ASSERT( mpi_copy( &Y, &X ) == 0 );
288 TEST_ASSERT( mpi_cmp_mpi( &X, &Y ) == 0 );
289 TEST_ASSERT( mpi_cmp_mpi( &Y, &A ) != 0 );
Paul Bakker6c591fa2011-05-05 11:49:20 +0000290
Paul Bakkerbd51b262014-07-10 15:26:12 +0200291exit:
Paul Bakker6c591fa2011-05-05 11:49:20 +0000292 mpi_free( &X ); mpi_free( &Y ); mpi_free( &A );
Paul Bakker367dae42009-06-28 21:50:27 +0000293}
Paul Bakker33b43f12013-08-20 11:48:36 +0200294/* END_CASE */
Paul Bakker367dae42009-06-28 21:50:27 +0000295
Paul Bakker33b43f12013-08-20 11:48:36 +0200296/* BEGIN_CASE */
297void mpi_copy_self( int input_X )
Paul Bakkere896fea2009-07-06 06:40:23 +0000298{
299 mpi X;
Paul Bakker6c591fa2011-05-05 11:49:20 +0000300 mpi_init( &X );
Paul Bakkere896fea2009-07-06 06:40:23 +0000301
Paul Bakker33b43f12013-08-20 11:48:36 +0200302 TEST_ASSERT( mpi_lset( &X, input_X ) == 0 );
Paul Bakkere896fea2009-07-06 06:40:23 +0000303 TEST_ASSERT( mpi_copy( &X, &X ) == 0 );
Paul Bakker33b43f12013-08-20 11:48:36 +0200304 TEST_ASSERT( mpi_cmp_int( &X, input_X ) == 0 );
Paul Bakker6c591fa2011-05-05 11:49:20 +0000305
Paul Bakkerbd51b262014-07-10 15:26:12 +0200306exit:
Paul Bakker6c591fa2011-05-05 11:49:20 +0000307 mpi_free( &X );
Paul Bakkere896fea2009-07-06 06:40:23 +0000308}
Paul Bakker33b43f12013-08-20 11:48:36 +0200309/* END_CASE */
Paul Bakkere896fea2009-07-06 06:40:23 +0000310
Paul Bakker33b43f12013-08-20 11:48:36 +0200311/* BEGIN_CASE */
Manuel Pégourié-Gonnard58681632013-11-21 10:39:37 +0100312void mpi_shrink( int before, int used, int min, int after )
313{
314 mpi X;
315 mpi_init( &X );
316
317 TEST_ASSERT( mpi_grow( &X, before ) == 0 );
318 TEST_ASSERT( used <= before );
319 memset( X.p, 0x2a, used * sizeof( t_uint ) );
320 TEST_ASSERT( mpi_shrink( &X, min ) == 0 );
321 TEST_ASSERT( X.n == (size_t) after );
322
Paul Bakkerbd51b262014-07-10 15:26:12 +0200323exit:
Manuel Pégourié-Gonnard58681632013-11-21 10:39:37 +0100324 mpi_free( &X );
325}
326/* END_CASE */
327
328/* BEGIN_CASE */
Manuel Pégourié-Gonnard3e3d2b82013-11-21 21:12:26 +0100329void mpi_safe_cond_assign( int x_sign, char *x_str,
330 int y_sign, char *y_str )
Manuel Pégourié-Gonnard71c2c212013-11-21 16:56:39 +0100331{
332 mpi X, Y, XX;
333 mpi_init( &X ); mpi_init( &Y ); mpi_init( &XX );
334
335 TEST_ASSERT( mpi_read_string( &X, 16, x_str ) == 0 );
Manuel Pégourié-Gonnard3e3d2b82013-11-21 21:12:26 +0100336 X.s = x_sign;
Manuel Pégourié-Gonnard71c2c212013-11-21 16:56:39 +0100337 TEST_ASSERT( mpi_read_string( &Y, 16, y_str ) == 0 );
Manuel Pégourié-Gonnard3e3d2b82013-11-21 21:12:26 +0100338 Y.s = y_sign;
Manuel Pégourié-Gonnard71c2c212013-11-21 16:56:39 +0100339 TEST_ASSERT( mpi_copy( &XX, &X ) == 0 );
340
341 TEST_ASSERT( mpi_safe_cond_assign( &X, &Y, 0 ) == 0 );
342 TEST_ASSERT( mpi_cmp_mpi( &X, &XX ) == 0 );
343
344 TEST_ASSERT( mpi_safe_cond_assign( &X, &Y, 1 ) == 0 );
345 TEST_ASSERT( mpi_cmp_mpi( &X, &Y ) == 0 );
346
Paul Bakkerbd51b262014-07-10 15:26:12 +0200347exit:
Manuel Pégourié-Gonnard71c2c212013-11-21 16:56:39 +0100348 mpi_free( &X ); mpi_free( &Y ); mpi_free( &XX );
349}
350/* END_CASE */
351
352/* BEGIN_CASE */
Manuel Pégourié-Gonnarda60fe892013-12-04 21:41:50 +0100353void mpi_safe_cond_swap( int x_sign, char *x_str,
354 int y_sign, char *y_str )
355{
356 mpi X, Y, XX, YY;
357
358 mpi_init( &X ); mpi_init( &Y );
359 mpi_init( &XX ); mpi_init( &YY );
360
361 TEST_ASSERT( mpi_read_string( &X, 16, x_str ) == 0 );
362 X.s = x_sign;
363 TEST_ASSERT( mpi_read_string( &Y, 16, y_str ) == 0 );
364 Y.s = y_sign;
365
366 TEST_ASSERT( mpi_copy( &XX, &X ) == 0 );
367 TEST_ASSERT( mpi_copy( &YY, &Y ) == 0 );
368
369 TEST_ASSERT( mpi_safe_cond_swap( &X, &Y, 0 ) == 0 );
370 TEST_ASSERT( mpi_cmp_mpi( &X, &XX ) == 0 );
371 TEST_ASSERT( mpi_cmp_mpi( &Y, &YY ) == 0 );
372
373 TEST_ASSERT( mpi_safe_cond_swap( &X, &Y, 1 ) == 0 );
374 TEST_ASSERT( mpi_cmp_mpi( &Y, &XX ) == 0 );
375 TEST_ASSERT( mpi_cmp_mpi( &X, &YY ) == 0 );
376
Paul Bakkerbd51b262014-07-10 15:26:12 +0200377exit:
Manuel Pégourié-Gonnarda60fe892013-12-04 21:41:50 +0100378 mpi_free( &X ); mpi_free( &Y );
379 mpi_free( &XX ); mpi_free( &YY );
380}
381/* END_CASE */
382
383/* BEGIN_CASE */
Paul Bakker33b43f12013-08-20 11:48:36 +0200384void mpi_swap( int input_X, int input_Y )
Paul Bakker367dae42009-06-28 21:50:27 +0000385{
386 mpi X, Y, A;
Paul Bakker6c591fa2011-05-05 11:49:20 +0000387 mpi_init( &X ); mpi_init( &Y ); mpi_init( &A );
Paul Bakker367dae42009-06-28 21:50:27 +0000388
Paul Bakker33b43f12013-08-20 11:48:36 +0200389 TEST_ASSERT( mpi_lset( &X, input_X ) == 0 );
390 TEST_ASSERT( mpi_lset( &Y, input_Y ) == 0 );
391 TEST_ASSERT( mpi_lset( &A, input_X ) == 0 );
Paul Bakker367dae42009-06-28 21:50:27 +0000392 TEST_ASSERT( mpi_cmp_mpi( &X, &Y ) != 0 );
393 TEST_ASSERT( mpi_cmp_mpi( &X, &A ) == 0 );
394 mpi_swap( &X, &Y );
395 TEST_ASSERT( mpi_cmp_mpi( &X, &Y ) != 0 );
396 TEST_ASSERT( mpi_cmp_mpi( &Y, &A ) == 0 );
Paul Bakker6c591fa2011-05-05 11:49:20 +0000397
Paul Bakkerbd51b262014-07-10 15:26:12 +0200398exit:
Paul Bakker6c591fa2011-05-05 11:49:20 +0000399 mpi_free( &X ); mpi_free( &Y ); mpi_free( &A );
Paul Bakker367dae42009-06-28 21:50:27 +0000400}
Paul Bakker33b43f12013-08-20 11:48:36 +0200401/* END_CASE */
Paul Bakker367dae42009-06-28 21:50:27 +0000402
Paul Bakker33b43f12013-08-20 11:48:36 +0200403/* BEGIN_CASE */
404void mpi_add_mpi( int radix_X, char *input_X, int radix_Y, char *input_Y,
405 int radix_A, char *input_A )
Paul Bakker367dae42009-06-28 21:50:27 +0000406{
407 mpi X, Y, Z, A;
Paul Bakker6c591fa2011-05-05 11:49:20 +0000408 mpi_init( &X ); mpi_init( &Y ); mpi_init( &Z ); mpi_init( &A );
Paul Bakker367dae42009-06-28 21:50:27 +0000409
Paul Bakker33b43f12013-08-20 11:48:36 +0200410 TEST_ASSERT( mpi_read_string( &X, radix_X, input_X ) == 0 );
411 TEST_ASSERT( mpi_read_string( &Y, radix_Y, input_Y ) == 0 );
412 TEST_ASSERT( mpi_read_string( &A, radix_A, input_A ) == 0 );
Paul Bakker367dae42009-06-28 21:50:27 +0000413 TEST_ASSERT( mpi_add_mpi( &Z, &X, &Y ) == 0 );
414 TEST_ASSERT( mpi_cmp_mpi( &Z, &A ) == 0 );
Paul Bakker6c591fa2011-05-05 11:49:20 +0000415
Paul Bakkerbd51b262014-07-10 15:26:12 +0200416exit:
Paul Bakker6c591fa2011-05-05 11:49:20 +0000417 mpi_free( &X ); mpi_free( &Y ); mpi_free( &Z ); mpi_free( &A );
Paul Bakker367dae42009-06-28 21:50:27 +0000418}
Paul Bakker33b43f12013-08-20 11:48:36 +0200419/* END_CASE */
Paul Bakker367dae42009-06-28 21:50:27 +0000420
Paul Bakker33b43f12013-08-20 11:48:36 +0200421/* BEGIN_CASE */
422void mpi_add_abs( int radix_X, char *input_X, int radix_Y, char *input_Y,
423 int radix_A, char *input_A )
Paul Bakker367dae42009-06-28 21:50:27 +0000424{
425 mpi X, Y, Z, A;
Paul Bakker6c591fa2011-05-05 11:49:20 +0000426 mpi_init( &X ); mpi_init( &Y ); mpi_init( &Z ); mpi_init( &A );
Paul Bakker367dae42009-06-28 21:50:27 +0000427
Paul Bakker33b43f12013-08-20 11:48:36 +0200428 TEST_ASSERT( mpi_read_string( &X, radix_X, input_X ) == 0 );
429 TEST_ASSERT( mpi_read_string( &Y, radix_Y, input_Y ) == 0 );
430 TEST_ASSERT( mpi_read_string( &A, radix_A, input_A ) == 0 );
Paul Bakker367dae42009-06-28 21:50:27 +0000431 TEST_ASSERT( mpi_add_abs( &Z, &X, &Y ) == 0 );
432 TEST_ASSERT( mpi_cmp_mpi( &Z, &A ) == 0 );
Paul Bakker6c591fa2011-05-05 11:49:20 +0000433
Paul Bakkerbd51b262014-07-10 15:26:12 +0200434exit:
Paul Bakker6c591fa2011-05-05 11:49:20 +0000435 mpi_free( &X ); mpi_free( &Y ); mpi_free( &Z ); mpi_free( &A );
Paul Bakker367dae42009-06-28 21:50:27 +0000436}
Paul Bakker33b43f12013-08-20 11:48:36 +0200437/* END_CASE */
Paul Bakker367dae42009-06-28 21:50:27 +0000438
Paul Bakker33b43f12013-08-20 11:48:36 +0200439/* BEGIN_CASE */
440void mpi_add_abs_add_first( int radix_X, char *input_X, int radix_Y,
441 char *input_Y, int radix_A, char *input_A )
Paul Bakkerba48cb22009-07-12 11:01:32 +0000442{
443 mpi X, Y, A;
Paul Bakker6c591fa2011-05-05 11:49:20 +0000444 mpi_init( &X ); mpi_init( &Y ); mpi_init( &A );
Paul Bakkerba48cb22009-07-12 11:01:32 +0000445
Paul Bakker33b43f12013-08-20 11:48:36 +0200446 TEST_ASSERT( mpi_read_string( &X, radix_X, input_X ) == 0 );
447 TEST_ASSERT( mpi_read_string( &Y, radix_Y, input_Y ) == 0 );
448 TEST_ASSERT( mpi_read_string( &A, radix_A, input_A ) == 0 );
Paul Bakkerba48cb22009-07-12 11:01:32 +0000449 TEST_ASSERT( mpi_add_abs( &X, &X, &Y ) == 0 );
450 TEST_ASSERT( mpi_cmp_mpi( &X, &A ) == 0 );
Paul Bakker6c591fa2011-05-05 11:49:20 +0000451
Paul Bakkerbd51b262014-07-10 15:26:12 +0200452exit:
Paul Bakker6c591fa2011-05-05 11:49:20 +0000453 mpi_free( &X ); mpi_free( &Y ); mpi_free( &A );
Paul Bakkerba48cb22009-07-12 11:01:32 +0000454}
Paul Bakker33b43f12013-08-20 11:48:36 +0200455/* END_CASE */
Paul Bakkerba48cb22009-07-12 11:01:32 +0000456
Paul Bakker33b43f12013-08-20 11:48:36 +0200457/* BEGIN_CASE */
458void mpi_add_abs_add_second( int radix_X, char *input_X, int radix_Y,
459 char *input_Y, int radix_A, char *input_A )
Paul Bakkerba48cb22009-07-12 11:01:32 +0000460{
461 mpi X, Y, A;
Paul Bakker6c591fa2011-05-05 11:49:20 +0000462 mpi_init( &X ); mpi_init( &Y ); mpi_init( &A );
Paul Bakkerba48cb22009-07-12 11:01:32 +0000463
Paul Bakker33b43f12013-08-20 11:48:36 +0200464 TEST_ASSERT( mpi_read_string( &X, radix_X, input_X ) == 0 );
465 TEST_ASSERT( mpi_read_string( &Y, radix_Y, input_Y ) == 0 );
466 TEST_ASSERT( mpi_read_string( &A, radix_A, input_A ) == 0 );
Paul Bakkerba48cb22009-07-12 11:01:32 +0000467 TEST_ASSERT( mpi_add_abs( &Y, &X, &Y ) == 0 );
468 TEST_ASSERT( mpi_cmp_mpi( &Y, &A ) == 0 );
Paul Bakker6c591fa2011-05-05 11:49:20 +0000469
Paul Bakkerbd51b262014-07-10 15:26:12 +0200470exit:
Paul Bakker6c591fa2011-05-05 11:49:20 +0000471 mpi_free( &X ); mpi_free( &Y ); mpi_free( &A );
Paul Bakkerba48cb22009-07-12 11:01:32 +0000472}
Paul Bakker33b43f12013-08-20 11:48:36 +0200473/* END_CASE */
Paul Bakkerba48cb22009-07-12 11:01:32 +0000474
Paul Bakker33b43f12013-08-20 11:48:36 +0200475/* BEGIN_CASE */
476void mpi_add_int( int radix_X, char *input_X, int input_Y, int radix_A,
477 char *input_A )
Paul Bakker367dae42009-06-28 21:50:27 +0000478{
479 mpi X, Z, A;
Paul Bakker6c591fa2011-05-05 11:49:20 +0000480 mpi_init( &X ); mpi_init( &Z ); mpi_init( &A );
Paul Bakker367dae42009-06-28 21:50:27 +0000481
Paul Bakker33b43f12013-08-20 11:48:36 +0200482 TEST_ASSERT( mpi_read_string( &X, radix_X, input_X ) == 0 );
483 TEST_ASSERT( mpi_read_string( &A, radix_A, input_A ) == 0 );
484 TEST_ASSERT( mpi_add_int( &Z, &X, input_Y ) == 0 );
Paul Bakker367dae42009-06-28 21:50:27 +0000485 TEST_ASSERT( mpi_cmp_mpi( &Z, &A ) == 0 );
Paul Bakker6c591fa2011-05-05 11:49:20 +0000486
Paul Bakkerbd51b262014-07-10 15:26:12 +0200487exit:
Paul Bakker6c591fa2011-05-05 11:49:20 +0000488 mpi_free( &X ); mpi_free( &Z ); mpi_free( &A );
Paul Bakker367dae42009-06-28 21:50:27 +0000489}
Paul Bakker33b43f12013-08-20 11:48:36 +0200490/* END_CASE */
Paul Bakker367dae42009-06-28 21:50:27 +0000491
Paul Bakker33b43f12013-08-20 11:48:36 +0200492/* BEGIN_CASE */
493void mpi_sub_mpi( int radix_X, char *input_X, int radix_Y, char *input_Y,
494 int radix_A, char *input_A )
Paul Bakker367dae42009-06-28 21:50:27 +0000495{
496 mpi X, Y, Z, A;
Paul Bakker6c591fa2011-05-05 11:49:20 +0000497 mpi_init( &X ); mpi_init( &Y ); mpi_init( &Z ); mpi_init( &A );
Paul Bakker367dae42009-06-28 21:50:27 +0000498
Paul Bakker33b43f12013-08-20 11:48:36 +0200499 TEST_ASSERT( mpi_read_string( &X, radix_X, input_X ) == 0 );
500 TEST_ASSERT( mpi_read_string( &Y, radix_Y, input_Y ) == 0 );
501 TEST_ASSERT( mpi_read_string( &A, radix_A, input_A ) == 0 );
Paul Bakker367dae42009-06-28 21:50:27 +0000502 TEST_ASSERT( mpi_sub_mpi( &Z, &X, &Y ) == 0 );
503 TEST_ASSERT( mpi_cmp_mpi( &Z, &A ) == 0 );
Paul Bakker6c591fa2011-05-05 11:49:20 +0000504
Paul Bakkerbd51b262014-07-10 15:26:12 +0200505exit:
Paul Bakker6c591fa2011-05-05 11:49:20 +0000506 mpi_free( &X ); mpi_free( &Y ); mpi_free( &Z ); mpi_free( &A );
Paul Bakker367dae42009-06-28 21:50:27 +0000507}
Paul Bakker33b43f12013-08-20 11:48:36 +0200508/* END_CASE */
Paul Bakker367dae42009-06-28 21:50:27 +0000509
Paul Bakker33b43f12013-08-20 11:48:36 +0200510/* BEGIN_CASE */
511void mpi_sub_abs( int radix_X, char *input_X, int radix_Y, char *input_Y,
512 int radix_A, char *input_A, int sub_result )
Paul Bakker367dae42009-06-28 21:50:27 +0000513{
514 mpi X, Y, Z, A;
515 int res;
Paul Bakker6c591fa2011-05-05 11:49:20 +0000516 mpi_init( &X ); mpi_init( &Y ); mpi_init( &Z ); mpi_init( &A );
Paul Bakker367dae42009-06-28 21:50:27 +0000517
Paul Bakker33b43f12013-08-20 11:48:36 +0200518 TEST_ASSERT( mpi_read_string( &X, radix_X, input_X ) == 0 );
519 TEST_ASSERT( mpi_read_string( &Y, radix_Y, input_Y ) == 0 );
520 TEST_ASSERT( mpi_read_string( &A, radix_A, input_A ) == 0 );
Paul Bakker367dae42009-06-28 21:50:27 +0000521
522 res = mpi_sub_abs( &Z, &X, &Y );
Paul Bakker33b43f12013-08-20 11:48:36 +0200523 TEST_ASSERT( res == sub_result );
Paul Bakker367dae42009-06-28 21:50:27 +0000524 if( res == 0 )
525 TEST_ASSERT( mpi_cmp_mpi( &Z, &A ) == 0 );
Paul Bakker6c591fa2011-05-05 11:49:20 +0000526
Paul Bakkerbd51b262014-07-10 15:26:12 +0200527exit:
Paul Bakker6c591fa2011-05-05 11:49:20 +0000528 mpi_free( &X ); mpi_free( &Y ); mpi_free( &Z ); mpi_free( &A );
Paul Bakker367dae42009-06-28 21:50:27 +0000529}
Paul Bakker33b43f12013-08-20 11:48:36 +0200530/* END_CASE */
Paul Bakker367dae42009-06-28 21:50:27 +0000531
Paul Bakker33b43f12013-08-20 11:48:36 +0200532/* BEGIN_CASE */
533void mpi_sub_int( int radix_X, char *input_X, int input_Y, int radix_A,
534 char *input_A )
Paul Bakker367dae42009-06-28 21:50:27 +0000535{
536 mpi X, Z, A;
Paul Bakker6c591fa2011-05-05 11:49:20 +0000537 mpi_init( &X ); mpi_init( &Z ); mpi_init( &A );
Paul Bakker367dae42009-06-28 21:50:27 +0000538
Paul Bakker33b43f12013-08-20 11:48:36 +0200539 TEST_ASSERT( mpi_read_string( &X, radix_X, input_X ) == 0 );
540 TEST_ASSERT( mpi_read_string( &A, radix_A, input_A ) == 0 );
541 TEST_ASSERT( mpi_sub_int( &Z, &X, input_Y ) == 0 );
Paul Bakker367dae42009-06-28 21:50:27 +0000542 TEST_ASSERT( mpi_cmp_mpi( &Z, &A ) == 0 );
Paul Bakker6c591fa2011-05-05 11:49:20 +0000543
Paul Bakkerbd51b262014-07-10 15:26:12 +0200544exit:
Paul Bakker6c591fa2011-05-05 11:49:20 +0000545 mpi_free( &X ); mpi_free( &Z ); mpi_free( &A );
Paul Bakker367dae42009-06-28 21:50:27 +0000546}
Paul Bakker33b43f12013-08-20 11:48:36 +0200547/* END_CASE */
Paul Bakker367dae42009-06-28 21:50:27 +0000548
Paul Bakker33b43f12013-08-20 11:48:36 +0200549/* BEGIN_CASE */
550void mpi_mul_mpi( int radix_X, char *input_X, int radix_Y, char *input_Y,
551 int radix_A, char *input_A )
Paul Bakker367dae42009-06-28 21:50:27 +0000552{
553 mpi X, Y, Z, A;
Paul Bakker6c591fa2011-05-05 11:49:20 +0000554 mpi_init( &X ); mpi_init( &Y ); mpi_init( &Z ); mpi_init( &A );
Paul Bakker367dae42009-06-28 21:50:27 +0000555
Paul Bakker33b43f12013-08-20 11:48:36 +0200556 TEST_ASSERT( mpi_read_string( &X, radix_X, input_X ) == 0 );
557 TEST_ASSERT( mpi_read_string( &Y, radix_Y, input_Y ) == 0 );
558 TEST_ASSERT( mpi_read_string( &A, radix_A, input_A ) == 0 );
Paul Bakker367dae42009-06-28 21:50:27 +0000559 TEST_ASSERT( mpi_mul_mpi( &Z, &X, &Y ) == 0 );
560 TEST_ASSERT( mpi_cmp_mpi( &Z, &A ) == 0 );
Paul Bakker6c591fa2011-05-05 11:49:20 +0000561
Paul Bakkerbd51b262014-07-10 15:26:12 +0200562exit:
Paul Bakker6c591fa2011-05-05 11:49:20 +0000563 mpi_free( &X ); mpi_free( &Y ); mpi_free( &Z ); mpi_free( &A );
Paul Bakker367dae42009-06-28 21:50:27 +0000564}
Paul Bakker33b43f12013-08-20 11:48:36 +0200565/* END_CASE */
Paul Bakker367dae42009-06-28 21:50:27 +0000566
Paul Bakker33b43f12013-08-20 11:48:36 +0200567/* BEGIN_CASE */
568void mpi_mul_int( int radix_X, char *input_X, int input_Y, int radix_A,
569 char *input_A, char *result_comparison )
Paul Bakker367dae42009-06-28 21:50:27 +0000570{
571 mpi X, Z, A;
Paul Bakker6c591fa2011-05-05 11:49:20 +0000572 mpi_init( &X ); mpi_init( &Z ); mpi_init( &A );
Paul Bakker367dae42009-06-28 21:50:27 +0000573
Paul Bakker33b43f12013-08-20 11:48:36 +0200574 TEST_ASSERT( mpi_read_string( &X, radix_X, input_X ) == 0 );
575 TEST_ASSERT( mpi_read_string( &A, radix_A, input_A ) == 0 );
576 TEST_ASSERT( mpi_mul_int( &Z, &X, input_Y ) == 0 );
Paul Bakkerdbd443d2013-08-16 13:38:47 +0200577 if( strcmp( result_comparison, "==" ) == 0 )
578 TEST_ASSERT( mpi_cmp_mpi( &Z, &A ) == 0 );
579 else if( strcmp( result_comparison, "!=" ) == 0 )
580 TEST_ASSERT( mpi_cmp_mpi( &Z, &A ) != 0 );
581 else
582 TEST_ASSERT( "unknown operator" == 0 );
Paul Bakker6c591fa2011-05-05 11:49:20 +0000583
Paul Bakkerbd51b262014-07-10 15:26:12 +0200584exit:
Paul Bakker6c591fa2011-05-05 11:49:20 +0000585 mpi_free( &X ); mpi_free( &Z ); mpi_free( &A );
Paul Bakker367dae42009-06-28 21:50:27 +0000586}
Paul Bakker33b43f12013-08-20 11:48:36 +0200587/* END_CASE */
Paul Bakker367dae42009-06-28 21:50:27 +0000588
Paul Bakker33b43f12013-08-20 11:48:36 +0200589/* BEGIN_CASE */
590void mpi_div_mpi( int radix_X, char *input_X, int radix_Y, char *input_Y,
591 int radix_A, char *input_A, int radix_B, char *input_B,
592 int div_result )
Paul Bakker367dae42009-06-28 21:50:27 +0000593{
594 mpi X, Y, Q, R, A, B;
595 int res;
Paul Bakker6c591fa2011-05-05 11:49:20 +0000596 mpi_init( &X ); mpi_init( &Y ); mpi_init( &Q ); mpi_init( &R );
597 mpi_init( &A ); mpi_init( &B );
Paul Bakker367dae42009-06-28 21:50:27 +0000598
Paul Bakker33b43f12013-08-20 11:48:36 +0200599 TEST_ASSERT( mpi_read_string( &X, radix_X, input_X ) == 0 );
600 TEST_ASSERT( mpi_read_string( &Y, radix_Y, input_Y ) == 0 );
601 TEST_ASSERT( mpi_read_string( &A, radix_A, input_A ) == 0 );
602 TEST_ASSERT( mpi_read_string( &B, radix_B, input_B ) == 0 );
Paul Bakker367dae42009-06-28 21:50:27 +0000603 res = mpi_div_mpi( &Q, &R, &X, &Y );
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( &Q, &A ) == 0 );
608 TEST_ASSERT( mpi_cmp_mpi( &R, &B ) == 0 );
609 }
Paul Bakker6c591fa2011-05-05 11:49:20 +0000610
Paul Bakkerbd51b262014-07-10 15:26:12 +0200611exit:
Paul Bakker6c591fa2011-05-05 11:49:20 +0000612 mpi_free( &X ); mpi_free( &Y ); mpi_free( &Q ); mpi_free( &R );
613 mpi_free( &A ); mpi_free( &B );
Paul Bakker367dae42009-06-28 21:50:27 +0000614}
Paul Bakker33b43f12013-08-20 11:48:36 +0200615/* END_CASE */
Paul Bakker367dae42009-06-28 21:50:27 +0000616
Paul Bakker33b43f12013-08-20 11:48:36 +0200617/* BEGIN_CASE */
618void mpi_div_int( int radix_X, char *input_X, int input_Y, int radix_A,
619 char *input_A, int radix_B, char *input_B, int div_result )
Paul Bakker367dae42009-06-28 21:50:27 +0000620{
621 mpi X, Q, R, A, B;
622 int res;
Paul Bakker6c591fa2011-05-05 11:49:20 +0000623 mpi_init( &X ); mpi_init( &Q ); mpi_init( &R ); mpi_init( &A );
624 mpi_init( &B );
Paul Bakker367dae42009-06-28 21:50:27 +0000625
Paul Bakker33b43f12013-08-20 11:48:36 +0200626 TEST_ASSERT( mpi_read_string( &X, radix_X, input_X ) == 0 );
627 TEST_ASSERT( mpi_read_string( &A, radix_A, input_A ) == 0 );
628 TEST_ASSERT( mpi_read_string( &B, radix_B, input_B ) == 0 );
629 res = mpi_div_int( &Q, &R, &X, input_Y );
630 TEST_ASSERT( res == div_result );
Paul Bakker367dae42009-06-28 21:50:27 +0000631 if( res == 0 )
632 {
633 TEST_ASSERT( mpi_cmp_mpi( &Q, &A ) == 0 );
634 TEST_ASSERT( mpi_cmp_mpi( &R, &B ) == 0 );
635 }
Paul Bakker6c591fa2011-05-05 11:49:20 +0000636
Paul Bakkerbd51b262014-07-10 15:26:12 +0200637exit:
Paul Bakker6c591fa2011-05-05 11:49:20 +0000638 mpi_free( &X ); mpi_free( &Q ); mpi_free( &R ); mpi_free( &A );
639 mpi_free( &B );
Paul Bakker367dae42009-06-28 21:50:27 +0000640}
Paul Bakker33b43f12013-08-20 11:48:36 +0200641/* END_CASE */
Paul Bakker367dae42009-06-28 21:50:27 +0000642
Paul Bakker33b43f12013-08-20 11:48:36 +0200643/* BEGIN_CASE */
644void mpi_mod_mpi( int radix_X, char *input_X, int radix_Y, char *input_Y,
645 int radix_A, char *input_A, int div_result )
Paul Bakker367dae42009-06-28 21:50:27 +0000646{
Paul Bakkerf02c5642012-11-13 10:25:21 +0000647 mpi X, Y, A;
Paul Bakker367dae42009-06-28 21:50:27 +0000648 int res;
Paul Bakkerf02c5642012-11-13 10:25:21 +0000649 mpi_init( &X ); mpi_init( &Y ); mpi_init( &A );
Paul Bakker367dae42009-06-28 21:50:27 +0000650
Paul Bakker33b43f12013-08-20 11:48:36 +0200651 TEST_ASSERT( mpi_read_string( &X, radix_X, input_X ) == 0 );
652 TEST_ASSERT( mpi_read_string( &Y, radix_Y, input_Y ) == 0 );
653 TEST_ASSERT( mpi_read_string( &A, radix_A, input_A ) == 0 );
Paul Bakkerf02c5642012-11-13 10:25:21 +0000654 res = mpi_mod_mpi( &X, &X, &Y );
Paul Bakker33b43f12013-08-20 11:48:36 +0200655 TEST_ASSERT( res == div_result );
Paul Bakker367dae42009-06-28 21:50:27 +0000656 if( res == 0 )
657 {
Paul Bakkerf02c5642012-11-13 10:25:21 +0000658 TEST_ASSERT( mpi_cmp_mpi( &X, &A ) == 0 );
Paul Bakker367dae42009-06-28 21:50:27 +0000659 }
Paul Bakker6c591fa2011-05-05 11:49:20 +0000660
Paul Bakkerbd51b262014-07-10 15:26:12 +0200661exit:
Paul Bakkerf02c5642012-11-13 10:25:21 +0000662 mpi_free( &X ); mpi_free( &Y ); mpi_free( &A );
Paul Bakker367dae42009-06-28 21:50:27 +0000663}
Paul Bakker33b43f12013-08-20 11:48:36 +0200664/* END_CASE */
Paul Bakker367dae42009-06-28 21:50:27 +0000665
Paul Bakker33b43f12013-08-20 11:48:36 +0200666/* BEGIN_CASE */
667void mpi_mod_int( int radix_X, char *input_X, int input_Y, int input_A,
668 int div_result )
Paul Bakker367dae42009-06-28 21:50:27 +0000669{
670 mpi X;
671 int res;
Paul Bakkera755ca12011-04-24 09:11:17 +0000672 t_uint r;
Paul Bakker6c591fa2011-05-05 11:49:20 +0000673 mpi_init( &X );
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 res = mpi_mod_int( &r, &X, input_Y );
677 TEST_ASSERT( res == div_result );
Paul Bakker367dae42009-06-28 21:50:27 +0000678 if( res == 0 )
679 {
Paul Bakker33b43f12013-08-20 11:48:36 +0200680 TEST_ASSERT( r == (t_uint) input_A );
Paul Bakker367dae42009-06-28 21:50:27 +0000681 }
Paul Bakker6c591fa2011-05-05 11:49:20 +0000682
Paul Bakkerbd51b262014-07-10 15:26:12 +0200683exit:
Paul Bakker6c591fa2011-05-05 11:49:20 +0000684 mpi_free( &X );
Paul Bakker367dae42009-06-28 21:50:27 +0000685}
Paul Bakker33b43f12013-08-20 11:48:36 +0200686/* END_CASE */
Paul Bakker367dae42009-06-28 21:50:27 +0000687
Paul Bakker33b43f12013-08-20 11:48:36 +0200688/* BEGIN_CASE */
689void mpi_exp_mod( int radix_A, char *input_A, int radix_E, char *input_E,
690 int radix_N, char *input_N, int radix_RR, char *input_RR,
691 int radix_X, char *input_X, int div_result )
Paul Bakker367dae42009-06-28 21:50:27 +0000692{
693 mpi A, E, N, RR, Z, X;
694 int res;
Paul Bakker6c591fa2011-05-05 11:49:20 +0000695 mpi_init( &A ); mpi_init( &E ); mpi_init( &N );
696 mpi_init( &RR ); mpi_init( &Z ); mpi_init( &X );
Paul Bakker367dae42009-06-28 21:50:27 +0000697
Paul Bakker33b43f12013-08-20 11:48:36 +0200698 TEST_ASSERT( mpi_read_string( &A, radix_A, input_A ) == 0 );
699 TEST_ASSERT( mpi_read_string( &E, radix_E, input_E ) == 0 );
700 TEST_ASSERT( mpi_read_string( &N, radix_N, input_N ) == 0 );
701 TEST_ASSERT( mpi_read_string( &X, radix_X, input_X ) == 0 );
Paul Bakker367dae42009-06-28 21:50:27 +0000702
Paul Bakker33b43f12013-08-20 11:48:36 +0200703 if( strlen( input_RR ) )
704 TEST_ASSERT( mpi_read_string( &RR, radix_RR, input_RR ) == 0 );
Paul Bakker367dae42009-06-28 21:50:27 +0000705
706 res = mpi_exp_mod( &Z, &A, &E, &N, &RR );
Paul Bakker33b43f12013-08-20 11:48:36 +0200707 TEST_ASSERT( res == div_result );
Paul Bakker367dae42009-06-28 21:50:27 +0000708 if( res == 0 )
709 {
710 TEST_ASSERT( mpi_cmp_mpi( &Z, &X ) == 0 );
711 }
Paul Bakker6c591fa2011-05-05 11:49:20 +0000712
Paul Bakkerbd51b262014-07-10 15:26:12 +0200713exit:
Paul Bakker6c591fa2011-05-05 11:49:20 +0000714 mpi_free( &A ); mpi_free( &E ); mpi_free( &N );
715 mpi_free( &RR ); mpi_free( &Z ); mpi_free( &X );
Paul Bakker367dae42009-06-28 21:50:27 +0000716}
Paul Bakker33b43f12013-08-20 11:48:36 +0200717/* END_CASE */
Paul Bakker367dae42009-06-28 21:50:27 +0000718
Paul Bakker33b43f12013-08-20 11:48:36 +0200719/* BEGIN_CASE */
720void mpi_inv_mod( int radix_X, char *input_X, int radix_Y, char *input_Y,
721 int radix_A, char *input_A, int div_result )
Paul Bakker367dae42009-06-28 21:50:27 +0000722{
723 mpi X, Y, Z, A;
724 int res;
Paul Bakker6c591fa2011-05-05 11:49:20 +0000725 mpi_init( &X ); mpi_init( &Y ); mpi_init( &Z ); mpi_init( &A );
Paul Bakker367dae42009-06-28 21:50:27 +0000726
Paul Bakker33b43f12013-08-20 11:48:36 +0200727 TEST_ASSERT( mpi_read_string( &X, radix_X, input_X ) == 0 );
728 TEST_ASSERT( mpi_read_string( &Y, radix_Y, input_Y ) == 0 );
729 TEST_ASSERT( mpi_read_string( &A, radix_A, input_A ) == 0 );
Paul Bakker367dae42009-06-28 21:50:27 +0000730 res = mpi_inv_mod( &Z, &X, &Y );
Paul Bakker33b43f12013-08-20 11:48:36 +0200731 TEST_ASSERT( res == div_result );
Paul Bakker367dae42009-06-28 21:50:27 +0000732 if( res == 0 )
733 {
734 TEST_ASSERT( mpi_cmp_mpi( &Z, &A ) == 0 );
735 }
Paul Bakker6c591fa2011-05-05 11:49:20 +0000736
Paul Bakkerbd51b262014-07-10 15:26:12 +0200737exit:
Paul Bakker6c591fa2011-05-05 11:49:20 +0000738 mpi_free( &X ); mpi_free( &Y ); mpi_free( &Z ); mpi_free( &A );
Paul Bakker367dae42009-06-28 21:50:27 +0000739}
Paul Bakker33b43f12013-08-20 11:48:36 +0200740/* END_CASE */
Paul Bakker367dae42009-06-28 21:50:27 +0000741
Manuel Pégourié-Gonnarddf0142b2013-08-22 18:29:07 +0200742/* BEGIN_CASE depends_on:POLARSSL_GENPRIME */
Paul Bakker33b43f12013-08-20 11:48:36 +0200743void mpi_is_prime( int radix_X, char *input_X, int div_result )
Paul Bakker367dae42009-06-28 21:50:27 +0000744{
745 mpi X;
746 int res;
Paul Bakker6c591fa2011-05-05 11:49:20 +0000747 mpi_init( &X );
Paul Bakker367dae42009-06-28 21:50:27 +0000748
Paul Bakker33b43f12013-08-20 11:48:36 +0200749 TEST_ASSERT( mpi_read_string( &X, radix_X, input_X ) == 0 );
Paul Bakker5690efc2011-05-26 13:16:06 +0000750 res = mpi_is_prime( &X, rnd_std_rand, NULL );
Paul Bakker33b43f12013-08-20 11:48:36 +0200751 TEST_ASSERT( res == div_result );
Paul Bakker6c591fa2011-05-05 11:49:20 +0000752
Paul Bakkerbd51b262014-07-10 15:26:12 +0200753exit:
Paul Bakker6c591fa2011-05-05 11:49:20 +0000754 mpi_free( &X );
Paul Bakker367dae42009-06-28 21:50:27 +0000755}
Paul Bakker33b43f12013-08-20 11:48:36 +0200756/* END_CASE */
Paul Bakker367dae42009-06-28 21:50:27 +0000757
Manuel Pégourié-Gonnard15f58a82014-06-16 17:12:40 +0200758/* BEGIN_CASE depends_on:POLARSSL_GENPRIME */
759void mpi_gen_prime( int bits, int safe, int ref_ret )
760{
761 mpi X;
762 int my_ret;
763
764 mpi_init( &X );
765
766 my_ret = mpi_gen_prime( &X, bits, safe, rnd_std_rand, NULL );
767 TEST_ASSERT( my_ret == ref_ret );
768
769 if( ref_ret == 0 )
770 {
771 size_t actual_bits = mpi_msb( &X );
772
773 TEST_ASSERT( actual_bits >= (size_t) bits );
774 TEST_ASSERT( actual_bits <= (size_t) bits + 1 );
775
776 TEST_ASSERT( mpi_is_prime( &X, rnd_std_rand, NULL ) == 0 );
777 if( safe )
778 {
779 mpi_shift_r( &X, 1 ); /* X = ( X - 1 ) / 2 */
780 TEST_ASSERT( mpi_is_prime( &X, rnd_std_rand, NULL ) == 0 );
781 }
782 }
783
Paul Bakkerbd51b262014-07-10 15:26:12 +0200784exit:
Manuel Pégourié-Gonnard15f58a82014-06-16 17:12:40 +0200785 mpi_free( &X );
786}
787/* END_CASE */
788
Paul Bakker33b43f12013-08-20 11:48:36 +0200789/* BEGIN_CASE */
790void mpi_shift_l( int radix_X, char *input_X, int shift_X, int radix_A,
791 char *input_A)
Paul Bakker367dae42009-06-28 21:50:27 +0000792{
793 mpi X, A;
Paul Bakker6c591fa2011-05-05 11:49:20 +0000794 mpi_init( &X ); mpi_init( &A );
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 );
797 TEST_ASSERT( mpi_read_string( &A, radix_A, input_A ) == 0 );
798 TEST_ASSERT( mpi_shift_l( &X, shift_X ) == 0 );
Paul Bakker367dae42009-06-28 21:50:27 +0000799 TEST_ASSERT( mpi_cmp_mpi( &X, &A ) == 0 );
Paul Bakker6c591fa2011-05-05 11:49:20 +0000800
Paul Bakkerbd51b262014-07-10 15:26:12 +0200801exit:
Paul Bakker6c591fa2011-05-05 11:49:20 +0000802 mpi_free( &X ); mpi_free( &A );
Paul Bakker367dae42009-06-28 21:50:27 +0000803}
Paul Bakker33b43f12013-08-20 11:48:36 +0200804/* END_CASE */
Paul Bakker367dae42009-06-28 21:50:27 +0000805
Paul Bakker33b43f12013-08-20 11:48:36 +0200806/* BEGIN_CASE */
807void mpi_shift_r( int radix_X, char *input_X, int shift_X, int radix_A,
808 char *input_A )
Paul Bakker367dae42009-06-28 21:50:27 +0000809{
810 mpi X, A;
Paul Bakker6c591fa2011-05-05 11:49:20 +0000811 mpi_init( &X ); mpi_init( &A );
Paul Bakker367dae42009-06-28 21:50:27 +0000812
Paul Bakker33b43f12013-08-20 11:48:36 +0200813 TEST_ASSERT( mpi_read_string( &X, radix_X, input_X ) == 0 );
814 TEST_ASSERT( mpi_read_string( &A, radix_A, input_A ) == 0 );
815 TEST_ASSERT( mpi_shift_r( &X, shift_X ) == 0 );
Paul Bakker367dae42009-06-28 21:50:27 +0000816 TEST_ASSERT( mpi_cmp_mpi( &X, &A ) == 0 );
Paul Bakker6c591fa2011-05-05 11:49:20 +0000817
Paul Bakkerbd51b262014-07-10 15:26:12 +0200818exit:
Paul Bakker6c591fa2011-05-05 11:49:20 +0000819 mpi_free( &X ); mpi_free( &A );
Paul Bakker367dae42009-06-28 21:50:27 +0000820}
Paul Bakker33b43f12013-08-20 11:48:36 +0200821/* END_CASE */
Paul Bakker367dae42009-06-28 21:50:27 +0000822
Manuel Pégourié-Gonnard20140162013-10-10 12:48:03 +0200823/* BEGIN_CASE depends_on:POLARSSL_SELF_TEST */
Paul Bakker33b43f12013-08-20 11:48:36 +0200824void mpi_selftest()
Paul Bakkere896fea2009-07-06 06:40:23 +0000825{
826 TEST_ASSERT( mpi_self_test( 0 ) == 0 );
827}
Paul Bakker33b43f12013-08-20 11:48:36 +0200828/* END_CASE */