blob: 70d9b4f1896b63a9f5d4959406efd824e8431594 [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 Bakkerba48cb22009-07-12 11:01:32 +000010mpi_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
33mpi_read_binary:input_X:radix_A:input_A
34{
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 Bakkerba48cb22009-07-12 11:01:32 +000054mpi_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 Bakkerba48cb22009-07-12 11:01:32 +000069 if( buflen > {output_size} )
70 buflen = {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 Bakkerba48cb22009-07-12 11:01:32 +000085mpi_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
117mpi_write_file:radix_X:input_X:output_radix:output_file
118{
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 Bakker2f5947e2011-05-18 15:47:11 +0000143mpi_get_bit:radix_X:input_X:pos:val
144{
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
155mpi_set_bit:radix_X:input_X:pos:val:radix_Y:output_Y
156{
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 Bakkere896fea2009-07-06 06:40:23 +0000170mpi_lsb:radix_X:input_X:nr_bits
171{
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 );
176 TEST_ASSERT( mpi_lsb( &X ) == {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
183mpi_msb:radix_X:input_X:nr_bits
184{
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 );
189 TEST_ASSERT( mpi_msb( &X ) == {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
196mpi_gcd:radix_X:input_X:radix_Y:input_Y:radix_A:input_A
197{
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
212mpi_cmp_int:input_X:input_A:result_CMP
213{
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
225mpi_cmp_mpi:radix_X:input_X:radix_Y:input_Y:input_A
226{
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
239mpi_cmp_abs:radix_X:input_X:radix_Y:input_Y:input_A
240{
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
253mpi_copy:input_X:input_A
254{
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 Bakkere896fea2009-07-06 06:40:23 +0000272mpi_copy_self:input_X
273{
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 Bakker367dae42009-06-28 21:50:27 +0000286mpi_swap:input_X:input_Y
287{
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
305mpi_add_mpi:radix_X:input_X:radix_Y:input_Y:radix_A:input_A
306{
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
321mpi_add_abs:radix_X:input_X:radix_Y:input_Y:radix_A:input_A
322{
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 Bakkerba48cb22009-07-12 11:01:32 +0000337mpi_add_abs_add_first:radix_X:input_X:radix_Y:input_Y:radix_A:input_A
338{
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
353mpi_add_abs_add_second:radix_X:input_X:radix_Y:input_Y:radix_A:input_A
354{
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 Bakker367dae42009-06-28 21:50:27 +0000369mpi_add_int:radix_X:input_X:input_Y:radix_A:input_A
370{
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
384mpi_sub_mpi:radix_X:input_X:radix_Y:input_Y:radix_A:input_A
385{
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
400mpi_sub_abs:radix_X:input_X:radix_Y:input_Y:radix_A:input_A:sub_result
401{
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
420mpi_sub_int:radix_X:input_X:input_Y:radix_A:input_A
421{
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
435mpi_mul_mpi:radix_X:input_X:radix_Y:input_Y:radix_A:input_A
436{
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
451mpi_mul_int:radix_X:input_X:input_Y:radix_A:input_A:result_comparison
452{
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 );
459 TEST_ASSERT( mpi_cmp_mpi( &Z, &A ) {result_comparison} 0 );
Paul Bakker6c591fa2011-05-05 11:49:20 +0000460
461 mpi_free( &X ); mpi_free( &Z ); mpi_free( &A );
Paul Bakker367dae42009-06-28 21:50:27 +0000462}
463END_CASE
464
465BEGIN_CASE
466mpi_div_mpi:radix_X:input_X:radix_Y:input_Y:radix_A:input_A:radix_B:input_B:div_result
467{
468 mpi X, Y, Q, R, A, B;
469 int res;
Paul Bakker6c591fa2011-05-05 11:49:20 +0000470 mpi_init( &X ); mpi_init( &Y ); mpi_init( &Q ); mpi_init( &R );
471 mpi_init( &A ); mpi_init( &B );
Paul Bakker367dae42009-06-28 21:50:27 +0000472
473 TEST_ASSERT( mpi_read_string( &X, {radix_X}, {input_X} ) == 0 );
474 TEST_ASSERT( mpi_read_string( &Y, {radix_Y}, {input_Y} ) == 0 );
475 TEST_ASSERT( mpi_read_string( &A, {radix_A}, {input_A} ) == 0 );
476 TEST_ASSERT( mpi_read_string( &B, {radix_B}, {input_B} ) == 0 );
477 res = mpi_div_mpi( &Q, &R, &X, &Y );
478 TEST_ASSERT( res == {div_result} );
479 if( res == 0 )
480 {
481 TEST_ASSERT( mpi_cmp_mpi( &Q, &A ) == 0 );
482 TEST_ASSERT( mpi_cmp_mpi( &R, &B ) == 0 );
483 }
Paul Bakker6c591fa2011-05-05 11:49:20 +0000484
485 mpi_free( &X ); mpi_free( &Y ); mpi_free( &Q ); mpi_free( &R );
486 mpi_free( &A ); mpi_free( &B );
Paul Bakker367dae42009-06-28 21:50:27 +0000487}
488END_CASE
489
490BEGIN_CASE
491mpi_div_int:radix_X:input_X:input_Y:radix_A:input_A:radix_B:input_B:div_result
492{
493 mpi X, Q, R, A, B;
494 int res;
Paul Bakker6c591fa2011-05-05 11:49:20 +0000495 mpi_init( &X ); mpi_init( &Q ); mpi_init( &R ); mpi_init( &A );
496 mpi_init( &B );
Paul Bakker367dae42009-06-28 21:50:27 +0000497
498 TEST_ASSERT( mpi_read_string( &X, {radix_X}, {input_X} ) == 0 );
499 TEST_ASSERT( mpi_read_string( &A, {radix_A}, {input_A} ) == 0 );
500 TEST_ASSERT( mpi_read_string( &B, {radix_B}, {input_B} ) == 0 );
501 res = mpi_div_int( &Q, &R, &X, {input_Y} );
502 TEST_ASSERT( res == {div_result} );
503 if( res == 0 )
504 {
505 TEST_ASSERT( mpi_cmp_mpi( &Q, &A ) == 0 );
506 TEST_ASSERT( mpi_cmp_mpi( &R, &B ) == 0 );
507 }
Paul Bakker6c591fa2011-05-05 11:49:20 +0000508
509 mpi_free( &X ); mpi_free( &Q ); mpi_free( &R ); mpi_free( &A );
510 mpi_free( &B );
Paul Bakker367dae42009-06-28 21:50:27 +0000511}
512END_CASE
513
514BEGIN_CASE
515mpi_mod_mpi:radix_X:input_X:radix_Y:input_Y:radix_A:input_A:div_result
516{
Paul Bakkerf02c5642012-11-13 10:25:21 +0000517 mpi X, Y, A;
Paul Bakker367dae42009-06-28 21:50:27 +0000518 int res;
Paul Bakkerf02c5642012-11-13 10:25:21 +0000519 mpi_init( &X ); mpi_init( &Y ); mpi_init( &A );
Paul Bakker367dae42009-06-28 21:50:27 +0000520
521 TEST_ASSERT( mpi_read_string( &X, {radix_X}, {input_X} ) == 0 );
522 TEST_ASSERT( mpi_read_string( &Y, {radix_Y}, {input_Y} ) == 0 );
523 TEST_ASSERT( mpi_read_string( &A, {radix_A}, {input_A} ) == 0 );
Paul Bakkerf02c5642012-11-13 10:25:21 +0000524 res = mpi_mod_mpi( &X, &X, &Y );
Paul Bakker367dae42009-06-28 21:50:27 +0000525 TEST_ASSERT( res == {div_result} );
526 if( res == 0 )
527 {
Paul Bakkerf02c5642012-11-13 10:25:21 +0000528 TEST_ASSERT( mpi_cmp_mpi( &X, &A ) == 0 );
Paul Bakker367dae42009-06-28 21:50:27 +0000529 }
Paul Bakker6c591fa2011-05-05 11:49:20 +0000530
Paul Bakkerf02c5642012-11-13 10:25:21 +0000531 mpi_free( &X ); mpi_free( &Y ); mpi_free( &A );
Paul Bakker367dae42009-06-28 21:50:27 +0000532}
533END_CASE
534
535BEGIN_CASE
536mpi_mod_int:radix_X:input_X:input_Y:input_A:div_result
537{
538 mpi X;
539 int res;
Paul Bakkera755ca12011-04-24 09:11:17 +0000540 t_uint r;
Paul Bakker6c591fa2011-05-05 11:49:20 +0000541 mpi_init( &X );
Paul Bakker367dae42009-06-28 21:50:27 +0000542
543 TEST_ASSERT( mpi_read_string( &X, {radix_X}, {input_X} ) == 0 );
544 res = mpi_mod_int( &r, &X, {input_Y} );
545 TEST_ASSERT( res == {div_result} );
546 if( res == 0 )
547 {
548 TEST_ASSERT( r == {input_A} );
549 }
Paul Bakker6c591fa2011-05-05 11:49:20 +0000550
551 mpi_free( &X );
Paul Bakker367dae42009-06-28 21:50:27 +0000552}
553END_CASE
554
555BEGIN_CASE
556mpi_exp_mod:radix_A:input_A:radix_E:input_E:radix_N:input_N:radix_RR:input_RR:radix_X:input_X:div_result
557{
558 mpi A, E, N, RR, Z, X;
559 int res;
Paul Bakker6c591fa2011-05-05 11:49:20 +0000560 mpi_init( &A ); mpi_init( &E ); mpi_init( &N );
561 mpi_init( &RR ); mpi_init( &Z ); mpi_init( &X );
Paul Bakker367dae42009-06-28 21:50:27 +0000562
563 TEST_ASSERT( mpi_read_string( &A, {radix_A}, {input_A} ) == 0 );
564 TEST_ASSERT( mpi_read_string( &E, {radix_E}, {input_E} ) == 0 );
565 TEST_ASSERT( mpi_read_string( &N, {radix_N}, {input_N} ) == 0 );
566 TEST_ASSERT( mpi_read_string( &X, {radix_X}, {input_X} ) == 0 );
567
568 if( strlen( {input_RR} ) )
569 TEST_ASSERT( mpi_read_string( &RR, {radix_RR}, {input_RR} ) == 0 );
570
571 res = mpi_exp_mod( &Z, &A, &E, &N, &RR );
572 TEST_ASSERT( res == {div_result} );
573 if( res == 0 )
574 {
575 TEST_ASSERT( mpi_cmp_mpi( &Z, &X ) == 0 );
576 }
Paul Bakker6c591fa2011-05-05 11:49:20 +0000577
578 mpi_free( &A ); mpi_free( &E ); mpi_free( &N );
579 mpi_free( &RR ); mpi_free( &Z ); mpi_free( &X );
Paul Bakker367dae42009-06-28 21:50:27 +0000580}
581END_CASE
582
583BEGIN_CASE
584mpi_inv_mod:radix_X:input_X:radix_Y:input_Y:radix_A:input_A:div_result
585{
586 mpi X, Y, Z, A;
587 int res;
Paul Bakker6c591fa2011-05-05 11:49:20 +0000588 mpi_init( &X ); mpi_init( &Y ); mpi_init( &Z ); mpi_init( &A );
Paul Bakker367dae42009-06-28 21:50:27 +0000589
590 TEST_ASSERT( mpi_read_string( &X, {radix_X}, {input_X} ) == 0 );
591 TEST_ASSERT( mpi_read_string( &Y, {radix_Y}, {input_Y} ) == 0 );
592 TEST_ASSERT( mpi_read_string( &A, {radix_A}, {input_A} ) == 0 );
593 res = mpi_inv_mod( &Z, &X, &Y );
594 TEST_ASSERT( res == {div_result} );
595 if( res == 0 )
596 {
597 TEST_ASSERT( mpi_cmp_mpi( &Z, &A ) == 0 );
598 }
Paul Bakker6c591fa2011-05-05 11:49:20 +0000599
600 mpi_free( &X ); mpi_free( &Y ); mpi_free( &Z ); mpi_free( &A );
Paul Bakker367dae42009-06-28 21:50:27 +0000601}
602END_CASE
603
604BEGIN_CASE
605mpi_is_prime:radix_X:input_X:div_result
606{
607 mpi X;
608 int res;
Paul Bakker6c591fa2011-05-05 11:49:20 +0000609 mpi_init( &X );
Paul Bakker367dae42009-06-28 21:50:27 +0000610
611 TEST_ASSERT( mpi_read_string( &X, {radix_X}, {input_X} ) == 0 );
Paul Bakker5690efc2011-05-26 13:16:06 +0000612 res = mpi_is_prime( &X, rnd_std_rand, NULL );
Paul Bakker367dae42009-06-28 21:50:27 +0000613 TEST_ASSERT( res == {div_result} );
Paul Bakker6c591fa2011-05-05 11:49:20 +0000614
615 mpi_free( &X );
Paul Bakker367dae42009-06-28 21:50:27 +0000616}
617END_CASE
618
619BEGIN_CASE
620mpi_shift_l:radix_X:input_X:shift_X:radix_A:input_A
621{
622 mpi X, A;
Paul Bakker6c591fa2011-05-05 11:49:20 +0000623 mpi_init( &X ); mpi_init( &A );
Paul Bakker367dae42009-06-28 21:50:27 +0000624
625 TEST_ASSERT( mpi_read_string( &X, {radix_X}, {input_X} ) == 0 );
626 TEST_ASSERT( mpi_read_string( &A, {radix_A}, {input_A} ) == 0 );
627 TEST_ASSERT( mpi_shift_l( &X, {shift_X} ) == 0 );
628 TEST_ASSERT( mpi_cmp_mpi( &X, &A ) == 0 );
Paul Bakker6c591fa2011-05-05 11:49:20 +0000629
630 mpi_free( &X ); mpi_free( &A );
Paul Bakker367dae42009-06-28 21:50:27 +0000631}
632END_CASE
633
634BEGIN_CASE
635mpi_shift_r:radix_X:input_X:shift_X:radix_A:input_A
636{
637 mpi X, A;
Paul Bakker6c591fa2011-05-05 11:49:20 +0000638 mpi_init( &X ); mpi_init( &A );
Paul Bakker367dae42009-06-28 21:50:27 +0000639
640 TEST_ASSERT( mpi_read_string( &X, {radix_X}, {input_X} ) == 0 );
641 TEST_ASSERT( mpi_read_string( &A, {radix_A}, {input_A} ) == 0 );
642 TEST_ASSERT( mpi_shift_r( &X, {shift_X} ) == 0 );
643 TEST_ASSERT( mpi_cmp_mpi( &X, &A ) == 0 );
Paul Bakker6c591fa2011-05-05 11:49:20 +0000644
645 mpi_free( &X ); mpi_free( &A );
Paul Bakker367dae42009-06-28 21:50:27 +0000646}
647END_CASE
648
Paul Bakkere896fea2009-07-06 06:40:23 +0000649BEGIN_CASE
650mpi_selftest:
651{
652 TEST_ASSERT( mpi_self_test( 0 ) == 0 );
653}
654END_CASE
Paul Bakker367dae42009-06-28 21:50:27 +0000655/* Helper Code
656 char str[1000];
657 int len = 1000;
658 mpi_write_string(&Z, 10, str, &len);
659 printf("Z: %d %s\n", Z.s, str);
660 TEST_ASSERT( mpi_cmp_mpi( &Z, &A ) == 0 );
661*/