blob: 43d1d08712b8b39365d370d94adba42301654726 [file] [log] [blame]
Paul Bakker367dae42009-06-28 21:50:27 +00001BEGIN_HEADER
2#include <polarssl/bignum.h>
Paul Bakker367dae42009-06-28 21:50:27 +00003END_HEADER
4
Paul Bakker5690efc2011-05-26 13:16:06 +00005BEGIN_DEPENDENCIES
6depends_on:POLARSSL_BIGNUM_C
7END_DEPENDENCIES
8
Paul Bakker367dae42009-06-28 21:50:27 +00009BEGIN_CASE
Paul Bakkerdbd443d2013-08-16 13:38:47 +020010mpi_read_write_string:#radix_X:input_X:#radix_A:input_A:#output_size:#result_read:#result_write
Paul Bakker367dae42009-06-28 21:50:27 +000011{
12 mpi X;
13 char str[1000];
Paul Bakkerf4a3f302011-04-24 15:53:29 +000014 size_t len = {output_size};
Paul Bakker367dae42009-06-28 21:50:27 +000015
Paul Bakker6c591fa2011-05-05 11:49:20 +000016 mpi_init( &X );
Paul Bakker367dae42009-06-28 21:50:27 +000017
Paul Bakkerba48cb22009-07-12 11:01:32 +000018 TEST_ASSERT( mpi_read_string( &X, {radix_X}, {input_X} ) == {result_read} );
19 if( {result_read} == 0 )
20 {
21 TEST_ASSERT( mpi_write_string( &X, {radix_A}, str, &len ) == {result_write} );
22 if( {result_write} == 0 )
23 {
24 TEST_ASSERT( strcasecmp( str, {input_A} ) == 0 );
25 }
26 }
Paul Bakker6c591fa2011-05-05 11:49:20 +000027
28 mpi_free( &X );
Paul Bakkere896fea2009-07-06 06:40:23 +000029}
30END_CASE
31
32BEGIN_CASE
Paul Bakkerdbd443d2013-08-16 13:38:47 +020033mpi_read_binary:input_X:#radix_A:input_A
Paul Bakkere896fea2009-07-06 06:40:23 +000034{
35 mpi X;
36 unsigned char str[1000];
37 unsigned char buf[1000];
Paul Bakkerf4a3f302011-04-24 15:53:29 +000038 size_t len = 1000;
39 size_t input_len;
Paul Bakkere896fea2009-07-06 06:40:23 +000040
Paul Bakker6c591fa2011-05-05 11:49:20 +000041 mpi_init( &X );
Paul Bakkere896fea2009-07-06 06:40:23 +000042
Paul Bakker69998dd2009-07-11 19:15:20 +000043 input_len = unhexify( buf, {input_X} );
Paul Bakkere896fea2009-07-06 06:40:23 +000044
45 TEST_ASSERT( mpi_read_binary( &X, buf, input_len ) == 0 );
46 TEST_ASSERT( mpi_write_string( &X, {radix_A}, (char *) str, &len ) == 0 );
47 TEST_ASSERT( strcmp( (char *) str, {input_A} ) == 0 );
Paul Bakker6c591fa2011-05-05 11:49:20 +000048
49 mpi_free( &X );
Paul Bakkere896fea2009-07-06 06:40:23 +000050}
51END_CASE
52
53BEGIN_CASE
Paul Bakkerdbd443d2013-08-16 13:38:47 +020054mpi_write_binary:#radix_X:input_X:input_A:#output_size:#result
Paul Bakkere896fea2009-07-06 06:40:23 +000055{
56 mpi X;
57 unsigned char str[1000];
58 unsigned char buf[1000];
Paul Bakkerf4a3f302011-04-24 15:53:29 +000059 size_t buflen;
Paul Bakkere896fea2009-07-06 06:40:23 +000060
61 memset( buf, 0x00, 1000 );
62 memset( str, 0x00, 1000 );
63
Paul Bakker6c591fa2011-05-05 11:49:20 +000064 mpi_init( &X );
Paul Bakkere896fea2009-07-06 06:40:23 +000065
66 TEST_ASSERT( mpi_read_string( &X, {radix_X}, {input_X} ) == 0 );
67
Paul Bakker69998dd2009-07-11 19:15:20 +000068 buflen = mpi_size( &X );
Paul Bakkerdbd443d2013-08-16 13:38:47 +020069 if( buflen > (size_t) {output_size} )
70 buflen = (size_t) {output_size};
Paul Bakkere896fea2009-07-06 06:40:23 +000071
Paul Bakkerba48cb22009-07-12 11:01:32 +000072 TEST_ASSERT( mpi_write_binary( &X, buf, buflen ) == {result} );
73 if( {result} == 0)
74 {
75 hexify( str, buf, buflen );
Paul Bakkere896fea2009-07-06 06:40:23 +000076
Paul Bakkerba48cb22009-07-12 11:01:32 +000077 TEST_ASSERT( strcasecmp( (char *) str, {input_A} ) == 0 );
78 }
Paul Bakker6c591fa2011-05-05 11:49:20 +000079
80 mpi_free( &X );
Paul Bakkere896fea2009-07-06 06:40:23 +000081}
82END_CASE
83
84BEGIN_CASE
Paul Bakkerdbd443d2013-08-16 13:38:47 +020085mpi_read_file:#radix_X:input_file:input_A:#result
Paul Bakkere896fea2009-07-06 06:40:23 +000086{
87 mpi X;
88 unsigned char str[1000];
89 unsigned char buf[1000];
Paul Bakkerf4a3f302011-04-24 15:53:29 +000090 size_t buflen;
Paul Bakker69998dd2009-07-11 19:15:20 +000091 FILE *file;
Paul Bakkere896fea2009-07-06 06:40:23 +000092
93 memset( buf, 0x00, 1000 );
94 memset( str, 0x00, 1000 );
95
Paul Bakker6c591fa2011-05-05 11:49:20 +000096 mpi_init( &X );
Paul Bakkere896fea2009-07-06 06:40:23 +000097
Paul Bakker69998dd2009-07-11 19:15:20 +000098 file = fopen( {input_file}, "r" );
Paul Bakkerba48cb22009-07-12 11:01:32 +000099 TEST_ASSERT( mpi_read_file( &X, {radix_X}, file ) == {result} );
Paul Bakkere896fea2009-07-06 06:40:23 +0000100 fclose(file);
101
Paul Bakkerba48cb22009-07-12 11:01:32 +0000102 if( {result} == 0 )
103 {
104 buflen = mpi_size( &X );
105 TEST_ASSERT( mpi_write_binary( &X, buf, buflen ) == 0 );
Paul Bakkere896fea2009-07-06 06:40:23 +0000106
Paul Bakkerba48cb22009-07-12 11:01:32 +0000107 hexify( str, buf, buflen );
Paul Bakkere896fea2009-07-06 06:40:23 +0000108
Paul Bakkerba48cb22009-07-12 11:01:32 +0000109 TEST_ASSERT( strcasecmp( (char *) str, {input_A} ) == 0 );
110 }
Paul Bakker6c591fa2011-05-05 11:49:20 +0000111
112 mpi_free( &X );
Paul Bakkere896fea2009-07-06 06:40:23 +0000113}
114END_CASE
115
116BEGIN_CASE
Paul Bakkerdbd443d2013-08-16 13:38:47 +0200117mpi_write_file:#radix_X:input_X:#output_radix:output_file
Paul Bakkere896fea2009-07-06 06:40:23 +0000118{
119 mpi X, Y;
Paul Bakker69998dd2009-07-11 19:15:20 +0000120 FILE *file_out, *file_in;
121
Paul Bakker6c591fa2011-05-05 11:49:20 +0000122 mpi_init( &X ); mpi_init( &Y );
Paul Bakkere896fea2009-07-06 06:40:23 +0000123
124 TEST_ASSERT( mpi_read_string( &X, {radix_X}, {input_X} ) == 0 );
125
Paul Bakker69998dd2009-07-11 19:15:20 +0000126 file_out = fopen( {output_file}, "w" );
Paul Bakker5690efc2011-05-26 13:16:06 +0000127 TEST_ASSERT( file_out != NULL );
Paul Bakkere896fea2009-07-06 06:40:23 +0000128 TEST_ASSERT( mpi_write_file( NULL, &X, {output_radix}, file_out ) == 0 );
129 fclose(file_out);
130
Paul Bakker69998dd2009-07-11 19:15:20 +0000131 file_in = fopen( {output_file}, "r" );
Paul Bakker5690efc2011-05-26 13:16:06 +0000132 TEST_ASSERT( file_in != NULL );
Paul Bakkere896fea2009-07-06 06:40:23 +0000133 TEST_ASSERT( mpi_read_file( &Y, {output_radix}, file_in ) == 0 );
134 fclose(file_in);
135
136 TEST_ASSERT( mpi_cmp_mpi( &X, &Y ) == 0 );
Paul Bakker6c591fa2011-05-05 11:49:20 +0000137
138 mpi_free( &X ); mpi_free( &Y );
Paul Bakkere896fea2009-07-06 06:40:23 +0000139}
140END_CASE
141
142BEGIN_CASE
Paul Bakkerdbd443d2013-08-16 13:38:47 +0200143mpi_get_bit:#radix_X:input_X:#pos:#val
Paul Bakker2f5947e2011-05-18 15:47:11 +0000144{
145 mpi X;
146 mpi_init( &X );
147 TEST_ASSERT( mpi_read_string( &X, {radix_X}, {input_X} ) == 0 );
148 TEST_ASSERT( mpi_get_bit( &X, {pos} ) == {val} );
149
150 mpi_free( &X );
151}
152END_CASE
153
154BEGIN_CASE
Paul Bakkerdbd443d2013-08-16 13:38:47 +0200155mpi_set_bit:#radix_X:input_X:#pos:#val:#radix_Y:output_Y
Paul Bakker2f5947e2011-05-18 15:47:11 +0000156{
157 mpi X, Y;
158 mpi_init( &X ); mpi_init( &Y );
159
160 TEST_ASSERT( mpi_read_string( &X, {radix_X}, {input_X} ) == 0 );
161 TEST_ASSERT( mpi_read_string( &Y, {radix_Y}, {output_Y} ) == 0 );
162 TEST_ASSERT( mpi_set_bit( &X, {pos}, {val} ) == 0 );
163 TEST_ASSERT( mpi_cmp_mpi( &X, &Y ) == 0 );
164
Manuel Pégourié-Gonnarde44ec102012-11-17 12:42:51 +0100165 mpi_free( &X ); mpi_free( &Y );
Paul Bakker2f5947e2011-05-18 15:47:11 +0000166}
167END_CASE
168
169BEGIN_CASE
Paul Bakkerdbd443d2013-08-16 13:38:47 +0200170mpi_lsb:#radix_X:input_X:#nr_bits
Paul Bakkere896fea2009-07-06 06:40:23 +0000171{
172 mpi X;
Paul Bakker6c591fa2011-05-05 11:49:20 +0000173 mpi_init( &X );
Paul Bakkere896fea2009-07-06 06:40:23 +0000174
175 TEST_ASSERT( mpi_read_string( &X, {radix_X}, {input_X} ) == 0 );
Paul Bakkerdbd443d2013-08-16 13:38:47 +0200176 TEST_ASSERT( mpi_lsb( &X ) == (size_t) {nr_bits} );
Paul Bakker6c591fa2011-05-05 11:49:20 +0000177
178 mpi_free( &X );
Paul Bakkere896fea2009-07-06 06:40:23 +0000179}
180END_CASE
181
182BEGIN_CASE
Paul Bakkerdbd443d2013-08-16 13:38:47 +0200183mpi_msb:#radix_X:input_X:#nr_bits
Paul Bakkere896fea2009-07-06 06:40:23 +0000184{
185 mpi X;
Paul Bakker6c591fa2011-05-05 11:49:20 +0000186 mpi_init( &X );
Paul Bakkere896fea2009-07-06 06:40:23 +0000187
188 TEST_ASSERT( mpi_read_string( &X, {radix_X}, {input_X} ) == 0 );
Paul Bakkerdbd443d2013-08-16 13:38:47 +0200189 TEST_ASSERT( mpi_msb( &X ) == (size_t) {nr_bits} );
Paul Bakker6c591fa2011-05-05 11:49:20 +0000190
191 mpi_free( &X );
Paul Bakker367dae42009-06-28 21:50:27 +0000192}
193END_CASE
194
195BEGIN_CASE
Paul Bakkerdbd443d2013-08-16 13:38:47 +0200196mpi_gcd:#radix_X:input_X:#radix_Y:input_Y:#radix_A:input_A
Paul Bakker367dae42009-06-28 21:50:27 +0000197{
198 mpi A, X, Y, Z;
Paul Bakker6c591fa2011-05-05 11:49:20 +0000199 mpi_init( &A ); mpi_init( &X ); mpi_init( &Y ); mpi_init( &Z );
Paul Bakker367dae42009-06-28 21:50:27 +0000200
201 TEST_ASSERT( mpi_read_string( &X, {radix_X}, {input_X} ) == 0 );
202 TEST_ASSERT( mpi_read_string( &Y, {radix_Y}, {input_Y} ) == 0 );
203 TEST_ASSERT( mpi_read_string( &A, {radix_A}, {input_A} ) == 0 );
204 TEST_ASSERT( mpi_gcd( &Z, &X, &Y ) == 0 );
205 TEST_ASSERT( mpi_cmp_mpi( &Z, &A ) == 0 );
Paul Bakker6c591fa2011-05-05 11:49:20 +0000206
207 mpi_free( &A ); mpi_free( &X ); mpi_free( &Y ); mpi_free( &Z );
Paul Bakker367dae42009-06-28 21:50:27 +0000208}
209END_CASE
210
211BEGIN_CASE
Paul Bakkerdbd443d2013-08-16 13:38:47 +0200212mpi_cmp_int:#input_X:#input_A:#result_CMP
Paul Bakker367dae42009-06-28 21:50:27 +0000213{
214 mpi X;
Paul Bakker6c591fa2011-05-05 11:49:20 +0000215 mpi_init( &X );
Paul Bakker367dae42009-06-28 21:50:27 +0000216
217 TEST_ASSERT( mpi_lset( &X, {input_X} ) == 0);
218 TEST_ASSERT( mpi_cmp_int( &X, {input_A} ) == {result_CMP});
Paul Bakker6c591fa2011-05-05 11:49:20 +0000219
220 mpi_free( &X );
Paul Bakker367dae42009-06-28 21:50:27 +0000221}
222END_CASE
223
224BEGIN_CASE
Paul Bakkerdbd443d2013-08-16 13:38:47 +0200225mpi_cmp_mpi:#radix_X:input_X:#radix_Y:input_Y:#input_A
Paul Bakker367dae42009-06-28 21:50:27 +0000226{
227 mpi X, Y;
Paul Bakker6c591fa2011-05-05 11:49:20 +0000228 mpi_init( &X ); mpi_init( &Y );
Paul Bakker367dae42009-06-28 21:50:27 +0000229
230 TEST_ASSERT( mpi_read_string( &X, {radix_X}, {input_X} ) == 0 );
231 TEST_ASSERT( mpi_read_string( &Y, {radix_Y}, {input_Y} ) == 0 );
232 TEST_ASSERT( mpi_cmp_mpi( &X, &Y ) == {input_A} );
Paul Bakker6c591fa2011-05-05 11:49:20 +0000233
234 mpi_free( &X ); mpi_free( &Y );
Paul Bakker367dae42009-06-28 21:50:27 +0000235}
236END_CASE
237
238BEGIN_CASE
Paul Bakkerdbd443d2013-08-16 13:38:47 +0200239mpi_cmp_abs:#radix_X:input_X:#radix_Y:input_Y:#input_A
Paul Bakker367dae42009-06-28 21:50:27 +0000240{
241 mpi X, Y;
Paul Bakker6c591fa2011-05-05 11:49:20 +0000242 mpi_init( &X ); mpi_init( &Y );
Paul Bakker367dae42009-06-28 21:50:27 +0000243
244 TEST_ASSERT( mpi_read_string( &X, {radix_X}, {input_X} ) == 0 );
245 TEST_ASSERT( mpi_read_string( &Y, {radix_Y}, {input_Y} ) == 0 );
246 TEST_ASSERT( mpi_cmp_abs( &X, &Y ) == {input_A} );
Paul Bakker6c591fa2011-05-05 11:49:20 +0000247
248 mpi_free( &X ); mpi_free( &Y );
Paul Bakker367dae42009-06-28 21:50:27 +0000249}
250END_CASE
251
252BEGIN_CASE
Paul Bakkerdbd443d2013-08-16 13:38:47 +0200253mpi_copy:#input_X:#input_A
Paul Bakker367dae42009-06-28 21:50:27 +0000254{
255 mpi X, Y, A;
Paul Bakker6c591fa2011-05-05 11:49:20 +0000256 mpi_init( &X ); mpi_init( &Y ); mpi_init( &A );
Paul Bakker367dae42009-06-28 21:50:27 +0000257
258 TEST_ASSERT( mpi_lset( &X, {input_X} ) == 0 );
259 TEST_ASSERT( mpi_lset( &Y, {input_A} ) == 0 );
260 TEST_ASSERT( mpi_lset( &A, {input_A} ) == 0 );
261 TEST_ASSERT( mpi_cmp_mpi( &X, &Y ) != 0 );
262 TEST_ASSERT( mpi_cmp_mpi( &Y, &A ) == 0 );
263 TEST_ASSERT( mpi_copy( &Y, &X ) == 0 );
264 TEST_ASSERT( mpi_cmp_mpi( &X, &Y ) == 0 );
265 TEST_ASSERT( mpi_cmp_mpi( &Y, &A ) != 0 );
Paul Bakker6c591fa2011-05-05 11:49:20 +0000266
267 mpi_free( &X ); mpi_free( &Y ); mpi_free( &A );
Paul Bakker367dae42009-06-28 21:50:27 +0000268}
269END_CASE
270
271BEGIN_CASE
Paul Bakkerdbd443d2013-08-16 13:38:47 +0200272mpi_copy_self:#input_X
Paul Bakkere896fea2009-07-06 06:40:23 +0000273{
274 mpi X;
Paul Bakker6c591fa2011-05-05 11:49:20 +0000275 mpi_init( &X );
Paul Bakkere896fea2009-07-06 06:40:23 +0000276
277 TEST_ASSERT( mpi_lset( &X, {input_X} ) == 0 );
278 TEST_ASSERT( mpi_copy( &X, &X ) == 0 );
279 TEST_ASSERT( mpi_cmp_int( &X, {input_X} ) == 0 );
Paul Bakker6c591fa2011-05-05 11:49:20 +0000280
281 mpi_free( &X );
Paul Bakkere896fea2009-07-06 06:40:23 +0000282}
283END_CASE
284
285BEGIN_CASE
Paul Bakkerdbd443d2013-08-16 13:38:47 +0200286mpi_swap:#input_X:#input_Y
Paul Bakker367dae42009-06-28 21:50:27 +0000287{
288 mpi X, Y, A;
Paul Bakker6c591fa2011-05-05 11:49:20 +0000289 mpi_init( &X ); mpi_init( &Y ); mpi_init( &A );
Paul Bakker367dae42009-06-28 21:50:27 +0000290
291 TEST_ASSERT( mpi_lset( &X, {input_X} ) == 0 );
292 TEST_ASSERT( mpi_lset( &Y, {input_Y} ) == 0 );
293 TEST_ASSERT( mpi_lset( &A, {input_X} ) == 0 );
294 TEST_ASSERT( mpi_cmp_mpi( &X, &Y ) != 0 );
295 TEST_ASSERT( mpi_cmp_mpi( &X, &A ) == 0 );
296 mpi_swap( &X, &Y );
297 TEST_ASSERT( mpi_cmp_mpi( &X, &Y ) != 0 );
298 TEST_ASSERT( mpi_cmp_mpi( &Y, &A ) == 0 );
Paul Bakker6c591fa2011-05-05 11:49:20 +0000299
300 mpi_free( &X ); mpi_free( &Y ); mpi_free( &A );
Paul Bakker367dae42009-06-28 21:50:27 +0000301}
302END_CASE
303
304BEGIN_CASE
Paul Bakkerdbd443d2013-08-16 13:38:47 +0200305mpi_add_mpi:#radix_X:input_X:#radix_Y:input_Y:#radix_A:input_A
Paul Bakker367dae42009-06-28 21:50:27 +0000306{
307 mpi X, Y, Z, A;
Paul Bakker6c591fa2011-05-05 11:49:20 +0000308 mpi_init( &X ); mpi_init( &Y ); mpi_init( &Z ); mpi_init( &A );
Paul Bakker367dae42009-06-28 21:50:27 +0000309
310 TEST_ASSERT( mpi_read_string( &X, {radix_X}, {input_X} ) == 0 );
311 TEST_ASSERT( mpi_read_string( &Y, {radix_Y}, {input_Y} ) == 0 );
312 TEST_ASSERT( mpi_read_string( &A, {radix_A}, {input_A} ) == 0 );
313 TEST_ASSERT( mpi_add_mpi( &Z, &X, &Y ) == 0 );
314 TEST_ASSERT( mpi_cmp_mpi( &Z, &A ) == 0 );
Paul Bakker6c591fa2011-05-05 11:49:20 +0000315
316 mpi_free( &X ); mpi_free( &Y ); mpi_free( &Z ); mpi_free( &A );
Paul Bakker367dae42009-06-28 21:50:27 +0000317}
318END_CASE
319
320BEGIN_CASE
Paul Bakkerdbd443d2013-08-16 13:38:47 +0200321mpi_add_abs:#radix_X:input_X:#radix_Y:input_Y:#radix_A:input_A
Paul Bakker367dae42009-06-28 21:50:27 +0000322{
323 mpi X, Y, Z, A;
Paul Bakker6c591fa2011-05-05 11:49:20 +0000324 mpi_init( &X ); mpi_init( &Y ); mpi_init( &Z ); mpi_init( &A );
Paul Bakker367dae42009-06-28 21:50:27 +0000325
326 TEST_ASSERT( mpi_read_string( &X, {radix_X}, {input_X} ) == 0 );
327 TEST_ASSERT( mpi_read_string( &Y, {radix_Y}, {input_Y} ) == 0 );
328 TEST_ASSERT( mpi_read_string( &A, {radix_A}, {input_A} ) == 0 );
329 TEST_ASSERT( mpi_add_abs( &Z, &X, &Y ) == 0 );
330 TEST_ASSERT( mpi_cmp_mpi( &Z, &A ) == 0 );
Paul Bakker6c591fa2011-05-05 11:49:20 +0000331
332 mpi_free( &X ); mpi_free( &Y ); mpi_free( &Z ); mpi_free( &A );
Paul Bakker367dae42009-06-28 21:50:27 +0000333}
334END_CASE
335
336BEGIN_CASE
Paul Bakkerdbd443d2013-08-16 13:38:47 +0200337mpi_add_abs_add_first:#radix_X:input_X:#radix_Y:input_Y:#radix_A:input_A
Paul Bakkerba48cb22009-07-12 11:01:32 +0000338{
339 mpi X, Y, A;
Paul Bakker6c591fa2011-05-05 11:49:20 +0000340 mpi_init( &X ); mpi_init( &Y ); mpi_init( &A );
Paul Bakkerba48cb22009-07-12 11:01:32 +0000341
342 TEST_ASSERT( mpi_read_string( &X, {radix_X}, {input_X} ) == 0 );
343 TEST_ASSERT( mpi_read_string( &Y, {radix_Y}, {input_Y} ) == 0 );
344 TEST_ASSERT( mpi_read_string( &A, {radix_A}, {input_A} ) == 0 );
345 TEST_ASSERT( mpi_add_abs( &X, &X, &Y ) == 0 );
346 TEST_ASSERT( mpi_cmp_mpi( &X, &A ) == 0 );
Paul Bakker6c591fa2011-05-05 11:49:20 +0000347
348 mpi_free( &X ); mpi_free( &Y ); mpi_free( &A );
Paul Bakkerba48cb22009-07-12 11:01:32 +0000349}
350END_CASE
351
352BEGIN_CASE
Paul Bakkerdbd443d2013-08-16 13:38:47 +0200353mpi_add_abs_add_second:#radix_X:input_X:#radix_Y:input_Y:#radix_A:input_A
Paul Bakkerba48cb22009-07-12 11:01:32 +0000354{
355 mpi X, Y, A;
Paul Bakker6c591fa2011-05-05 11:49:20 +0000356 mpi_init( &X ); mpi_init( &Y ); mpi_init( &A );
Paul Bakkerba48cb22009-07-12 11:01:32 +0000357
358 TEST_ASSERT( mpi_read_string( &X, {radix_X}, {input_X} ) == 0 );
359 TEST_ASSERT( mpi_read_string( &Y, {radix_Y}, {input_Y} ) == 0 );
360 TEST_ASSERT( mpi_read_string( &A, {radix_A}, {input_A} ) == 0 );
361 TEST_ASSERT( mpi_add_abs( &Y, &X, &Y ) == 0 );
362 TEST_ASSERT( mpi_cmp_mpi( &Y, &A ) == 0 );
Paul Bakker6c591fa2011-05-05 11:49:20 +0000363
364 mpi_free( &X ); mpi_free( &Y ); mpi_free( &A );
Paul Bakkerba48cb22009-07-12 11:01:32 +0000365}
366END_CASE
367
368BEGIN_CASE
Paul Bakkerdbd443d2013-08-16 13:38:47 +0200369mpi_add_int:#radix_X:input_X:#input_Y:#radix_A:input_A
Paul Bakker367dae42009-06-28 21:50:27 +0000370{
371 mpi X, Z, A;
Paul Bakker6c591fa2011-05-05 11:49:20 +0000372 mpi_init( &X ); mpi_init( &Z ); mpi_init( &A );
Paul Bakker367dae42009-06-28 21:50:27 +0000373
374 TEST_ASSERT( mpi_read_string( &X, {radix_X}, {input_X} ) == 0 );
375 TEST_ASSERT( mpi_read_string( &A, {radix_A}, {input_A} ) == 0 );
376 TEST_ASSERT( mpi_add_int( &Z, &X, {input_Y} ) == 0 );
377 TEST_ASSERT( mpi_cmp_mpi( &Z, &A ) == 0 );
Paul Bakker6c591fa2011-05-05 11:49:20 +0000378
379 mpi_free( &X ); mpi_free( &Z ); mpi_free( &A );
Paul Bakker367dae42009-06-28 21:50:27 +0000380}
381END_CASE
382
383BEGIN_CASE
Paul Bakkerdbd443d2013-08-16 13:38:47 +0200384mpi_sub_mpi:#radix_X:input_X:#radix_Y:input_Y:#radix_A:input_A
Paul Bakker367dae42009-06-28 21:50:27 +0000385{
386 mpi X, Y, Z, A;
Paul Bakker6c591fa2011-05-05 11:49:20 +0000387 mpi_init( &X ); mpi_init( &Y ); mpi_init( &Z ); mpi_init( &A );
Paul Bakker367dae42009-06-28 21:50:27 +0000388
389 TEST_ASSERT( mpi_read_string( &X, {radix_X}, {input_X} ) == 0 );
390 TEST_ASSERT( mpi_read_string( &Y, {radix_Y}, {input_Y} ) == 0 );
391 TEST_ASSERT( mpi_read_string( &A, {radix_A}, {input_A} ) == 0 );
392 TEST_ASSERT( mpi_sub_mpi( &Z, &X, &Y ) == 0 );
393 TEST_ASSERT( mpi_cmp_mpi( &Z, &A ) == 0 );
Paul Bakker6c591fa2011-05-05 11:49:20 +0000394
395 mpi_free( &X ); mpi_free( &Y ); mpi_free( &Z ); mpi_free( &A );
Paul Bakker367dae42009-06-28 21:50:27 +0000396}
397END_CASE
398
399BEGIN_CASE
Paul Bakkerdbd443d2013-08-16 13:38:47 +0200400mpi_sub_abs:#radix_X:input_X:#radix_Y:input_Y:#radix_A:input_A:#sub_result
Paul Bakker367dae42009-06-28 21:50:27 +0000401{
402 mpi X, Y, Z, A;
403 int res;
Paul Bakker6c591fa2011-05-05 11:49:20 +0000404 mpi_init( &X ); mpi_init( &Y ); mpi_init( &Z ); mpi_init( &A );
Paul Bakker367dae42009-06-28 21:50:27 +0000405
406 TEST_ASSERT( mpi_read_string( &X, {radix_X}, {input_X} ) == 0 );
407 TEST_ASSERT( mpi_read_string( &Y, {radix_Y}, {input_Y} ) == 0 );
408 TEST_ASSERT( mpi_read_string( &A, {radix_A}, {input_A} ) == 0 );
409
410 res = mpi_sub_abs( &Z, &X, &Y );
411 TEST_ASSERT( res == {sub_result} );
412 if( res == 0 )
413 TEST_ASSERT( mpi_cmp_mpi( &Z, &A ) == 0 );
Paul Bakker6c591fa2011-05-05 11:49:20 +0000414
415 mpi_free( &X ); mpi_free( &Y ); mpi_free( &Z ); mpi_free( &A );
Paul Bakker367dae42009-06-28 21:50:27 +0000416}
417END_CASE
418
419BEGIN_CASE
Paul Bakkerdbd443d2013-08-16 13:38:47 +0200420mpi_sub_int:#radix_X:input_X:#input_Y:#radix_A:input_A
Paul Bakker367dae42009-06-28 21:50:27 +0000421{
422 mpi X, Z, A;
Paul Bakker6c591fa2011-05-05 11:49:20 +0000423 mpi_init( &X ); mpi_init( &Z ); mpi_init( &A );
Paul Bakker367dae42009-06-28 21:50:27 +0000424
425 TEST_ASSERT( mpi_read_string( &X, {radix_X}, {input_X} ) == 0 );
426 TEST_ASSERT( mpi_read_string( &A, {radix_A}, {input_A} ) == 0 );
427 TEST_ASSERT( mpi_sub_int( &Z, &X, {input_Y} ) == 0 );
428 TEST_ASSERT( mpi_cmp_mpi( &Z, &A ) == 0 );
Paul Bakker6c591fa2011-05-05 11:49:20 +0000429
430 mpi_free( &X ); mpi_free( &Z ); mpi_free( &A );
Paul Bakker367dae42009-06-28 21:50:27 +0000431}
432END_CASE
433
434BEGIN_CASE
Paul Bakkerdbd443d2013-08-16 13:38:47 +0200435mpi_mul_mpi:#radix_X:input_X:#radix_Y:input_Y:#radix_A:input_A
Paul Bakker367dae42009-06-28 21:50:27 +0000436{
437 mpi X, Y, Z, A;
Paul Bakker6c591fa2011-05-05 11:49:20 +0000438 mpi_init( &X ); mpi_init( &Y ); mpi_init( &Z ); mpi_init( &A );
Paul Bakker367dae42009-06-28 21:50:27 +0000439
440 TEST_ASSERT( mpi_read_string( &X, {radix_X}, {input_X} ) == 0 );
441 TEST_ASSERT( mpi_read_string( &Y, {radix_Y}, {input_Y} ) == 0 );
442 TEST_ASSERT( mpi_read_string( &A, {radix_A}, {input_A} ) == 0 );
443 TEST_ASSERT( mpi_mul_mpi( &Z, &X, &Y ) == 0 );
444 TEST_ASSERT( mpi_cmp_mpi( &Z, &A ) == 0 );
Paul Bakker6c591fa2011-05-05 11:49:20 +0000445
446 mpi_free( &X ); mpi_free( &Y ); mpi_free( &Z ); mpi_free( &A );
Paul Bakker367dae42009-06-28 21:50:27 +0000447}
448END_CASE
449
450BEGIN_CASE
Paul Bakkerdbd443d2013-08-16 13:38:47 +0200451mpi_mul_int:#radix_X:input_X:#input_Y:#radix_A:input_A:result_comparison
Paul Bakker367dae42009-06-28 21:50:27 +0000452{
453 mpi X, Z, A;
Paul Bakker6c591fa2011-05-05 11:49:20 +0000454 mpi_init( &X ); mpi_init( &Z ); mpi_init( &A );
Paul Bakker367dae42009-06-28 21:50:27 +0000455
456 TEST_ASSERT( mpi_read_string( &X, {radix_X}, {input_X} ) == 0 );
457 TEST_ASSERT( mpi_read_string( &A, {radix_A}, {input_A} ) == 0 );
458 TEST_ASSERT( mpi_mul_int( &Z, &X, {input_Y} ) == 0 );
Paul Bakkerdbd443d2013-08-16 13:38:47 +0200459 if( strcmp( result_comparison, "==" ) == 0 )
460 TEST_ASSERT( mpi_cmp_mpi( &Z, &A ) == 0 );
461 else if( strcmp( result_comparison, "!=" ) == 0 )
462 TEST_ASSERT( mpi_cmp_mpi( &Z, &A ) != 0 );
463 else
464 TEST_ASSERT( "unknown operator" == 0 );
Paul Bakker6c591fa2011-05-05 11:49:20 +0000465
466 mpi_free( &X ); mpi_free( &Z ); mpi_free( &A );
Paul Bakker367dae42009-06-28 21:50:27 +0000467}
468END_CASE
469
470BEGIN_CASE
Paul Bakkerdbd443d2013-08-16 13:38:47 +0200471mpi_div_mpi:#radix_X:input_X:#radix_Y:input_Y:#radix_A:input_A:#radix_B:input_B:#div_result
Paul Bakker367dae42009-06-28 21:50:27 +0000472{
473 mpi X, Y, Q, R, A, B;
474 int res;
Paul Bakker6c591fa2011-05-05 11:49:20 +0000475 mpi_init( &X ); mpi_init( &Y ); mpi_init( &Q ); mpi_init( &R );
476 mpi_init( &A ); mpi_init( &B );
Paul Bakker367dae42009-06-28 21:50:27 +0000477
478 TEST_ASSERT( mpi_read_string( &X, {radix_X}, {input_X} ) == 0 );
479 TEST_ASSERT( mpi_read_string( &Y, {radix_Y}, {input_Y} ) == 0 );
480 TEST_ASSERT( mpi_read_string( &A, {radix_A}, {input_A} ) == 0 );
481 TEST_ASSERT( mpi_read_string( &B, {radix_B}, {input_B} ) == 0 );
482 res = mpi_div_mpi( &Q, &R, &X, &Y );
483 TEST_ASSERT( res == {div_result} );
484 if( res == 0 )
485 {
486 TEST_ASSERT( mpi_cmp_mpi( &Q, &A ) == 0 );
487 TEST_ASSERT( mpi_cmp_mpi( &R, &B ) == 0 );
488 }
Paul Bakker6c591fa2011-05-05 11:49:20 +0000489
490 mpi_free( &X ); mpi_free( &Y ); mpi_free( &Q ); mpi_free( &R );
491 mpi_free( &A ); mpi_free( &B );
Paul Bakker367dae42009-06-28 21:50:27 +0000492}
493END_CASE
494
495BEGIN_CASE
Paul Bakkerdbd443d2013-08-16 13:38:47 +0200496mpi_div_int:#radix_X:input_X:#input_Y:#radix_A:input_A:#radix_B:input_B:#div_result
Paul Bakker367dae42009-06-28 21:50:27 +0000497{
498 mpi X, Q, R, A, B;
499 int res;
Paul Bakker6c591fa2011-05-05 11:49:20 +0000500 mpi_init( &X ); mpi_init( &Q ); mpi_init( &R ); mpi_init( &A );
501 mpi_init( &B );
Paul Bakker367dae42009-06-28 21:50:27 +0000502
503 TEST_ASSERT( mpi_read_string( &X, {radix_X}, {input_X} ) == 0 );
504 TEST_ASSERT( mpi_read_string( &A, {radix_A}, {input_A} ) == 0 );
505 TEST_ASSERT( mpi_read_string( &B, {radix_B}, {input_B} ) == 0 );
506 res = mpi_div_int( &Q, &R, &X, {input_Y} );
507 TEST_ASSERT( res == {div_result} );
508 if( res == 0 )
509 {
510 TEST_ASSERT( mpi_cmp_mpi( &Q, &A ) == 0 );
511 TEST_ASSERT( mpi_cmp_mpi( &R, &B ) == 0 );
512 }
Paul Bakker6c591fa2011-05-05 11:49:20 +0000513
514 mpi_free( &X ); mpi_free( &Q ); mpi_free( &R ); mpi_free( &A );
515 mpi_free( &B );
Paul Bakker367dae42009-06-28 21:50:27 +0000516}
517END_CASE
518
519BEGIN_CASE
Paul Bakkerdbd443d2013-08-16 13:38:47 +0200520mpi_mod_mpi:#radix_X:input_X:#radix_Y:input_Y:#radix_A:input_A:#div_result
Paul Bakker367dae42009-06-28 21:50:27 +0000521{
Paul Bakkerf02c5642012-11-13 10:25:21 +0000522 mpi X, Y, A;
Paul Bakker367dae42009-06-28 21:50:27 +0000523 int res;
Paul Bakkerf02c5642012-11-13 10:25:21 +0000524 mpi_init( &X ); mpi_init( &Y ); mpi_init( &A );
Paul Bakker367dae42009-06-28 21:50:27 +0000525
526 TEST_ASSERT( mpi_read_string( &X, {radix_X}, {input_X} ) == 0 );
527 TEST_ASSERT( mpi_read_string( &Y, {radix_Y}, {input_Y} ) == 0 );
528 TEST_ASSERT( mpi_read_string( &A, {radix_A}, {input_A} ) == 0 );
Paul Bakkerf02c5642012-11-13 10:25:21 +0000529 res = mpi_mod_mpi( &X, &X, &Y );
Paul Bakker367dae42009-06-28 21:50:27 +0000530 TEST_ASSERT( res == {div_result} );
531 if( res == 0 )
532 {
Paul Bakkerf02c5642012-11-13 10:25:21 +0000533 TEST_ASSERT( mpi_cmp_mpi( &X, &A ) == 0 );
Paul Bakker367dae42009-06-28 21:50:27 +0000534 }
Paul Bakker6c591fa2011-05-05 11:49:20 +0000535
Paul Bakkerf02c5642012-11-13 10:25:21 +0000536 mpi_free( &X ); mpi_free( &Y ); mpi_free( &A );
Paul Bakker367dae42009-06-28 21:50:27 +0000537}
538END_CASE
539
540BEGIN_CASE
Paul Bakkerdbd443d2013-08-16 13:38:47 +0200541mpi_mod_int:#radix_X:input_X:#input_Y:#input_A:#div_result
Paul Bakker367dae42009-06-28 21:50:27 +0000542{
543 mpi X;
544 int res;
Paul Bakkera755ca12011-04-24 09:11:17 +0000545 t_uint r;
Paul Bakker6c591fa2011-05-05 11:49:20 +0000546 mpi_init( &X );
Paul Bakker367dae42009-06-28 21:50:27 +0000547
548 TEST_ASSERT( mpi_read_string( &X, {radix_X}, {input_X} ) == 0 );
549 res = mpi_mod_int( &r, &X, {input_Y} );
550 TEST_ASSERT( res == {div_result} );
551 if( res == 0 )
552 {
Paul Bakkerdbd443d2013-08-16 13:38:47 +0200553 TEST_ASSERT( r == (t_uint) {input_A} );
Paul Bakker367dae42009-06-28 21:50:27 +0000554 }
Paul Bakker6c591fa2011-05-05 11:49:20 +0000555
556 mpi_free( &X );
Paul Bakker367dae42009-06-28 21:50:27 +0000557}
558END_CASE
559
560BEGIN_CASE
Paul Bakkerdbd443d2013-08-16 13:38:47 +0200561mpi_exp_mod:#radix_A:input_A:#radix_E:input_E:#radix_N:input_N:#radix_RR:input_RR:#radix_X:input_X:#div_result
Paul Bakker367dae42009-06-28 21:50:27 +0000562{
563 mpi A, E, N, RR, Z, X;
564 int res;
Paul Bakker6c591fa2011-05-05 11:49:20 +0000565 mpi_init( &A ); mpi_init( &E ); mpi_init( &N );
566 mpi_init( &RR ); mpi_init( &Z ); mpi_init( &X );
Paul Bakker367dae42009-06-28 21:50:27 +0000567
568 TEST_ASSERT( mpi_read_string( &A, {radix_A}, {input_A} ) == 0 );
569 TEST_ASSERT( mpi_read_string( &E, {radix_E}, {input_E} ) == 0 );
570 TEST_ASSERT( mpi_read_string( &N, {radix_N}, {input_N} ) == 0 );
571 TEST_ASSERT( mpi_read_string( &X, {radix_X}, {input_X} ) == 0 );
572
573 if( strlen( {input_RR} ) )
574 TEST_ASSERT( mpi_read_string( &RR, {radix_RR}, {input_RR} ) == 0 );
575
576 res = mpi_exp_mod( &Z, &A, &E, &N, &RR );
577 TEST_ASSERT( res == {div_result} );
578 if( res == 0 )
579 {
580 TEST_ASSERT( mpi_cmp_mpi( &Z, &X ) == 0 );
581 }
Paul Bakker6c591fa2011-05-05 11:49:20 +0000582
583 mpi_free( &A ); mpi_free( &E ); mpi_free( &N );
584 mpi_free( &RR ); mpi_free( &Z ); mpi_free( &X );
Paul Bakker367dae42009-06-28 21:50:27 +0000585}
586END_CASE
587
588BEGIN_CASE
Paul Bakkerdbd443d2013-08-16 13:38:47 +0200589mpi_inv_mod:#radix_X:input_X:#radix_Y:input_Y:#radix_A:input_A:#div_result
Paul Bakker367dae42009-06-28 21:50:27 +0000590{
591 mpi X, Y, Z, A;
592 int res;
Paul Bakker6c591fa2011-05-05 11:49:20 +0000593 mpi_init( &X ); mpi_init( &Y ); mpi_init( &Z ); mpi_init( &A );
Paul Bakker367dae42009-06-28 21:50:27 +0000594
595 TEST_ASSERT( mpi_read_string( &X, {radix_X}, {input_X} ) == 0 );
596 TEST_ASSERT( mpi_read_string( &Y, {radix_Y}, {input_Y} ) == 0 );
597 TEST_ASSERT( mpi_read_string( &A, {radix_A}, {input_A} ) == 0 );
598 res = mpi_inv_mod( &Z, &X, &Y );
599 TEST_ASSERT( res == {div_result} );
600 if( res == 0 )
601 {
602 TEST_ASSERT( mpi_cmp_mpi( &Z, &A ) == 0 );
603 }
Paul Bakker6c591fa2011-05-05 11:49:20 +0000604
605 mpi_free( &X ); mpi_free( &Y ); mpi_free( &Z ); mpi_free( &A );
Paul Bakker367dae42009-06-28 21:50:27 +0000606}
607END_CASE
608
609BEGIN_CASE
Paul Bakkerdbd443d2013-08-16 13:38:47 +0200610mpi_is_prime:#radix_X:input_X:#div_result
Paul Bakker367dae42009-06-28 21:50:27 +0000611{
612 mpi X;
613 int res;
Paul Bakker6c591fa2011-05-05 11:49:20 +0000614 mpi_init( &X );
Paul Bakker367dae42009-06-28 21:50:27 +0000615
616 TEST_ASSERT( mpi_read_string( &X, {radix_X}, {input_X} ) == 0 );
Paul Bakker5690efc2011-05-26 13:16:06 +0000617 res = mpi_is_prime( &X, rnd_std_rand, NULL );
Paul Bakker367dae42009-06-28 21:50:27 +0000618 TEST_ASSERT( res == {div_result} );
Paul Bakker6c591fa2011-05-05 11:49:20 +0000619
620 mpi_free( &X );
Paul Bakker367dae42009-06-28 21:50:27 +0000621}
622END_CASE
623
624BEGIN_CASE
Paul Bakkerdbd443d2013-08-16 13:38:47 +0200625mpi_shift_l:#radix_X:input_X:#shift_X:#radix_A:input_A
Paul Bakker367dae42009-06-28 21:50:27 +0000626{
627 mpi X, A;
Paul Bakker6c591fa2011-05-05 11:49:20 +0000628 mpi_init( &X ); mpi_init( &A );
Paul Bakker367dae42009-06-28 21:50:27 +0000629
630 TEST_ASSERT( mpi_read_string( &X, {radix_X}, {input_X} ) == 0 );
631 TEST_ASSERT( mpi_read_string( &A, {radix_A}, {input_A} ) == 0 );
632 TEST_ASSERT( mpi_shift_l( &X, {shift_X} ) == 0 );
633 TEST_ASSERT( mpi_cmp_mpi( &X, &A ) == 0 );
Paul Bakker6c591fa2011-05-05 11:49:20 +0000634
635 mpi_free( &X ); mpi_free( &A );
Paul Bakker367dae42009-06-28 21:50:27 +0000636}
637END_CASE
638
639BEGIN_CASE
Paul Bakkerdbd443d2013-08-16 13:38:47 +0200640mpi_shift_r:#radix_X:input_X:#shift_X:#radix_A:input_A
Paul Bakker367dae42009-06-28 21:50:27 +0000641{
642 mpi X, A;
Paul Bakker6c591fa2011-05-05 11:49:20 +0000643 mpi_init( &X ); mpi_init( &A );
Paul Bakker367dae42009-06-28 21:50:27 +0000644
645 TEST_ASSERT( mpi_read_string( &X, {radix_X}, {input_X} ) == 0 );
646 TEST_ASSERT( mpi_read_string( &A, {radix_A}, {input_A} ) == 0 );
647 TEST_ASSERT( mpi_shift_r( &X, {shift_X} ) == 0 );
648 TEST_ASSERT( mpi_cmp_mpi( &X, &A ) == 0 );
Paul Bakker6c591fa2011-05-05 11:49:20 +0000649
650 mpi_free( &X ); mpi_free( &A );
Paul Bakker367dae42009-06-28 21:50:27 +0000651}
652END_CASE
653
Paul Bakkere896fea2009-07-06 06:40:23 +0000654BEGIN_CASE
655mpi_selftest:
656{
657 TEST_ASSERT( mpi_self_test( 0 ) == 0 );
658}
659END_CASE
Paul Bakker367dae42009-06-28 21:50:27 +0000660/* Helper Code
661 char str[1000];
662 int len = 1000;
663 mpi_write_string(&Z, 10, str, &len);
664 printf("Z: %d %s\n", Z.s, str);
665 TEST_ASSERT( mpi_cmp_mpi( &Z, &A ) == 0 );
666*/