blob: 905f1c37a13f1073c46f3c48b08b7ee373dbd213 [file] [log] [blame]
Paul Bakker367dae42009-06-28 21:50:27 +00001BEGIN_HEADER
2#include <polarssl/bignum.h>
3
4static int myrand( void *rng_state )
5{
6 if( rng_state != NULL )
7 rng_state = NULL;
8
9 return( rand() );
10}
11
12END_HEADER
13
14BEGIN_CASE
Paul Bakkerba48cb22009-07-12 11:01:32 +000015mpi_read_write_string:radix_X:input_X:radix_A:input_A:output_size:result_read:result_write
Paul Bakker367dae42009-06-28 21:50:27 +000016{
17 mpi X;
18 char str[1000];
Paul Bakkerf4a3f302011-04-24 15:53:29 +000019 size_t len = {output_size};
Paul Bakker367dae42009-06-28 21:50:27 +000020
Paul Bakker6c591fa2011-05-05 11:49:20 +000021 mpi_init( &X );
Paul Bakker367dae42009-06-28 21:50:27 +000022
Paul Bakkerba48cb22009-07-12 11:01:32 +000023 TEST_ASSERT( mpi_read_string( &X, {radix_X}, {input_X} ) == {result_read} );
24 if( {result_read} == 0 )
25 {
26 TEST_ASSERT( mpi_write_string( &X, {radix_A}, str, &len ) == {result_write} );
27 if( {result_write} == 0 )
28 {
29 TEST_ASSERT( strcasecmp( str, {input_A} ) == 0 );
30 }
31 }
Paul Bakker6c591fa2011-05-05 11:49:20 +000032
33 mpi_free( &X );
Paul Bakkere896fea2009-07-06 06:40:23 +000034}
35END_CASE
36
37BEGIN_CASE
38mpi_read_binary:input_X:radix_A:input_A
39{
40 mpi X;
41 unsigned char str[1000];
42 unsigned char buf[1000];
Paul Bakkerf4a3f302011-04-24 15:53:29 +000043 size_t len = 1000;
44 size_t input_len;
Paul Bakkere896fea2009-07-06 06:40:23 +000045
Paul Bakker6c591fa2011-05-05 11:49:20 +000046 mpi_init( &X );
Paul Bakkere896fea2009-07-06 06:40:23 +000047
Paul Bakker69998dd2009-07-11 19:15:20 +000048 input_len = unhexify( buf, {input_X} );
Paul Bakkere896fea2009-07-06 06:40:23 +000049
50 TEST_ASSERT( mpi_read_binary( &X, buf, input_len ) == 0 );
51 TEST_ASSERT( mpi_write_string( &X, {radix_A}, (char *) str, &len ) == 0 );
52 TEST_ASSERT( strcmp( (char *) str, {input_A} ) == 0 );
Paul Bakker6c591fa2011-05-05 11:49:20 +000053
54 mpi_free( &X );
Paul Bakkere896fea2009-07-06 06:40:23 +000055}
56END_CASE
57
58BEGIN_CASE
Paul Bakkerba48cb22009-07-12 11:01:32 +000059mpi_write_binary:radix_X:input_X:input_A:output_size:result
Paul Bakkere896fea2009-07-06 06:40:23 +000060{
61 mpi X;
62 unsigned char str[1000];
63 unsigned char buf[1000];
Paul Bakkerf4a3f302011-04-24 15:53:29 +000064 size_t buflen;
Paul Bakkere896fea2009-07-06 06:40:23 +000065
66 memset( buf, 0x00, 1000 );
67 memset( str, 0x00, 1000 );
68
Paul Bakker6c591fa2011-05-05 11:49:20 +000069 mpi_init( &X );
Paul Bakkere896fea2009-07-06 06:40:23 +000070
71 TEST_ASSERT( mpi_read_string( &X, {radix_X}, {input_X} ) == 0 );
72
Paul Bakker69998dd2009-07-11 19:15:20 +000073 buflen = mpi_size( &X );
Paul Bakkerba48cb22009-07-12 11:01:32 +000074 if( buflen > {output_size} )
75 buflen = {output_size};
Paul Bakkere896fea2009-07-06 06:40:23 +000076
Paul Bakkerba48cb22009-07-12 11:01:32 +000077 TEST_ASSERT( mpi_write_binary( &X, buf, buflen ) == {result} );
78 if( {result} == 0)
79 {
80 hexify( str, buf, buflen );
Paul Bakkere896fea2009-07-06 06:40:23 +000081
Paul Bakkerba48cb22009-07-12 11:01:32 +000082 TEST_ASSERT( strcasecmp( (char *) str, {input_A} ) == 0 );
83 }
Paul Bakker6c591fa2011-05-05 11:49:20 +000084
85 mpi_free( &X );
Paul Bakkere896fea2009-07-06 06:40:23 +000086}
87END_CASE
88
89BEGIN_CASE
Paul Bakkerba48cb22009-07-12 11:01:32 +000090mpi_read_file:radix_X:input_file:input_A:result
Paul Bakkere896fea2009-07-06 06:40:23 +000091{
92 mpi X;
93 unsigned char str[1000];
94 unsigned char buf[1000];
Paul Bakkerf4a3f302011-04-24 15:53:29 +000095 size_t buflen;
Paul Bakker69998dd2009-07-11 19:15:20 +000096 FILE *file;
Paul Bakkere896fea2009-07-06 06:40:23 +000097
98 memset( buf, 0x00, 1000 );
99 memset( str, 0x00, 1000 );
100
Paul Bakker6c591fa2011-05-05 11:49:20 +0000101 mpi_init( &X );
Paul Bakkere896fea2009-07-06 06:40:23 +0000102
Paul Bakker69998dd2009-07-11 19:15:20 +0000103 file = fopen( {input_file}, "r" );
Paul Bakkerba48cb22009-07-12 11:01:32 +0000104 TEST_ASSERT( mpi_read_file( &X, {radix_X}, file ) == {result} );
Paul Bakkere896fea2009-07-06 06:40:23 +0000105 fclose(file);
106
Paul Bakkerba48cb22009-07-12 11:01:32 +0000107 if( {result} == 0 )
108 {
109 buflen = mpi_size( &X );
110 TEST_ASSERT( mpi_write_binary( &X, buf, buflen ) == 0 );
Paul Bakkere896fea2009-07-06 06:40:23 +0000111
Paul Bakkerba48cb22009-07-12 11:01:32 +0000112 hexify( str, buf, buflen );
Paul Bakkere896fea2009-07-06 06:40:23 +0000113
Paul Bakkerba48cb22009-07-12 11:01:32 +0000114 TEST_ASSERT( strcasecmp( (char *) str, {input_A} ) == 0 );
115 }
Paul Bakker6c591fa2011-05-05 11:49:20 +0000116
117 mpi_free( &X );
Paul Bakkere896fea2009-07-06 06:40:23 +0000118}
119END_CASE
120
121BEGIN_CASE
122mpi_write_file:radix_X:input_X:output_radix:output_file
123{
124 mpi X, Y;
Paul Bakker69998dd2009-07-11 19:15:20 +0000125 FILE *file_out, *file_in;
126
Paul Bakker6c591fa2011-05-05 11:49:20 +0000127 mpi_init( &X ); mpi_init( &Y );
Paul Bakkere896fea2009-07-06 06:40:23 +0000128
129 TEST_ASSERT( mpi_read_string( &X, {radix_X}, {input_X} ) == 0 );
130
Paul Bakker69998dd2009-07-11 19:15:20 +0000131 file_out = fopen( {output_file}, "w" );
Paul Bakkere896fea2009-07-06 06:40:23 +0000132 TEST_ASSERT( mpi_write_file( NULL, &X, {output_radix}, file_out ) == 0 );
133 fclose(file_out);
134
Paul Bakker69998dd2009-07-11 19:15:20 +0000135 file_in = fopen( {output_file}, "r" );
Paul Bakkere896fea2009-07-06 06:40:23 +0000136 TEST_ASSERT( mpi_read_file( &Y, {output_radix}, file_in ) == 0 );
137 fclose(file_in);
138
139 TEST_ASSERT( mpi_cmp_mpi( &X, &Y ) == 0 );
Paul Bakker6c591fa2011-05-05 11:49:20 +0000140
141 mpi_free( &X ); mpi_free( &Y );
Paul Bakkere896fea2009-07-06 06:40:23 +0000142}
143END_CASE
144
145BEGIN_CASE
Paul Bakker2f5947e2011-05-18 15:47:11 +0000146mpi_get_bit:radix_X:input_X:pos:val
147{
148 mpi X;
149 mpi_init( &X );
150 TEST_ASSERT( mpi_read_string( &X, {radix_X}, {input_X} ) == 0 );
151 TEST_ASSERT( mpi_get_bit( &X, {pos} ) == {val} );
152
153 mpi_free( &X );
154}
155END_CASE
156
157BEGIN_CASE
158mpi_set_bit:radix_X:input_X:pos:val:radix_Y:output_Y
159{
160 mpi X, Y;
161 mpi_init( &X ); mpi_init( &Y );
162
163 TEST_ASSERT( mpi_read_string( &X, {radix_X}, {input_X} ) == 0 );
164 TEST_ASSERT( mpi_read_string( &Y, {radix_Y}, {output_Y} ) == 0 );
165 TEST_ASSERT( mpi_set_bit( &X, {pos}, {val} ) == 0 );
166 TEST_ASSERT( mpi_cmp_mpi( &X, &Y ) == 0 );
167
168 mpi_free( &X );
169}
170END_CASE
171
172BEGIN_CASE
Paul Bakkere896fea2009-07-06 06:40:23 +0000173mpi_lsb:radix_X:input_X:nr_bits
174{
175 mpi X;
Paul Bakker6c591fa2011-05-05 11:49:20 +0000176 mpi_init( &X );
Paul Bakkere896fea2009-07-06 06:40:23 +0000177
178 TEST_ASSERT( mpi_read_string( &X, {radix_X}, {input_X} ) == 0 );
179 TEST_ASSERT( mpi_lsb( &X ) == {nr_bits} );
Paul Bakker6c591fa2011-05-05 11:49:20 +0000180
181 mpi_free( &X );
Paul Bakkere896fea2009-07-06 06:40:23 +0000182}
183END_CASE
184
185BEGIN_CASE
186mpi_msb:radix_X:input_X:nr_bits
187{
188 mpi X;
Paul Bakker6c591fa2011-05-05 11:49:20 +0000189 mpi_init( &X );
Paul Bakkere896fea2009-07-06 06:40:23 +0000190
191 TEST_ASSERT( mpi_read_string( &X, {radix_X}, {input_X} ) == 0 );
192 TEST_ASSERT( mpi_msb( &X ) == {nr_bits} );
Paul Bakker6c591fa2011-05-05 11:49:20 +0000193
194 mpi_free( &X );
Paul Bakker367dae42009-06-28 21:50:27 +0000195}
196END_CASE
197
198BEGIN_CASE
199mpi_gcd:radix_X:input_X:radix_Y:input_Y:radix_A:input_A
200{
201 mpi A, X, Y, Z;
Paul Bakker6c591fa2011-05-05 11:49:20 +0000202 mpi_init( &A ); mpi_init( &X ); mpi_init( &Y ); mpi_init( &Z );
Paul Bakker367dae42009-06-28 21:50:27 +0000203
204 TEST_ASSERT( mpi_read_string( &X, {radix_X}, {input_X} ) == 0 );
205 TEST_ASSERT( mpi_read_string( &Y, {radix_Y}, {input_Y} ) == 0 );
206 TEST_ASSERT( mpi_read_string( &A, {radix_A}, {input_A} ) == 0 );
207 TEST_ASSERT( mpi_gcd( &Z, &X, &Y ) == 0 );
208 TEST_ASSERT( mpi_cmp_mpi( &Z, &A ) == 0 );
Paul Bakker6c591fa2011-05-05 11:49:20 +0000209
210 mpi_free( &A ); mpi_free( &X ); mpi_free( &Y ); mpi_free( &Z );
Paul Bakker367dae42009-06-28 21:50:27 +0000211}
212END_CASE
213
214BEGIN_CASE
215mpi_cmp_int:input_X:input_A:result_CMP
216{
217 mpi X;
Paul Bakker6c591fa2011-05-05 11:49:20 +0000218 mpi_init( &X );
Paul Bakker367dae42009-06-28 21:50:27 +0000219
220 TEST_ASSERT( mpi_lset( &X, {input_X} ) == 0);
221 TEST_ASSERT( mpi_cmp_int( &X, {input_A} ) == {result_CMP});
Paul Bakker6c591fa2011-05-05 11:49:20 +0000222
223 mpi_free( &X );
Paul Bakker367dae42009-06-28 21:50:27 +0000224}
225END_CASE
226
227BEGIN_CASE
228mpi_cmp_mpi:radix_X:input_X:radix_Y:input_Y:input_A
229{
230 mpi X, Y;
Paul Bakker6c591fa2011-05-05 11:49:20 +0000231 mpi_init( &X ); mpi_init( &Y );
Paul Bakker367dae42009-06-28 21:50:27 +0000232
233 TEST_ASSERT( mpi_read_string( &X, {radix_X}, {input_X} ) == 0 );
234 TEST_ASSERT( mpi_read_string( &Y, {radix_Y}, {input_Y} ) == 0 );
235 TEST_ASSERT( mpi_cmp_mpi( &X, &Y ) == {input_A} );
Paul Bakker6c591fa2011-05-05 11:49:20 +0000236
237 mpi_free( &X ); mpi_free( &Y );
Paul Bakker367dae42009-06-28 21:50:27 +0000238}
239END_CASE
240
241BEGIN_CASE
242mpi_cmp_abs:radix_X:input_X:radix_Y:input_Y:input_A
243{
244 mpi X, Y;
Paul Bakker6c591fa2011-05-05 11:49:20 +0000245 mpi_init( &X ); mpi_init( &Y );
Paul Bakker367dae42009-06-28 21:50:27 +0000246
247 TEST_ASSERT( mpi_read_string( &X, {radix_X}, {input_X} ) == 0 );
248 TEST_ASSERT( mpi_read_string( &Y, {radix_Y}, {input_Y} ) == 0 );
249 TEST_ASSERT( mpi_cmp_abs( &X, &Y ) == {input_A} );
Paul Bakker6c591fa2011-05-05 11:49:20 +0000250
251 mpi_free( &X ); mpi_free( &Y );
Paul Bakker367dae42009-06-28 21:50:27 +0000252}
253END_CASE
254
255BEGIN_CASE
256mpi_copy:input_X:input_A
257{
258 mpi X, Y, A;
Paul Bakker6c591fa2011-05-05 11:49:20 +0000259 mpi_init( &X ); mpi_init( &Y ); mpi_init( &A );
Paul Bakker367dae42009-06-28 21:50:27 +0000260
261 TEST_ASSERT( mpi_lset( &X, {input_X} ) == 0 );
262 TEST_ASSERT( mpi_lset( &Y, {input_A} ) == 0 );
263 TEST_ASSERT( mpi_lset( &A, {input_A} ) == 0 );
264 TEST_ASSERT( mpi_cmp_mpi( &X, &Y ) != 0 );
265 TEST_ASSERT( mpi_cmp_mpi( &Y, &A ) == 0 );
266 TEST_ASSERT( mpi_copy( &Y, &X ) == 0 );
267 TEST_ASSERT( mpi_cmp_mpi( &X, &Y ) == 0 );
268 TEST_ASSERT( mpi_cmp_mpi( &Y, &A ) != 0 );
Paul Bakker6c591fa2011-05-05 11:49:20 +0000269
270 mpi_free( &X ); mpi_free( &Y ); mpi_free( &A );
Paul Bakker367dae42009-06-28 21:50:27 +0000271}
272END_CASE
273
274BEGIN_CASE
Paul Bakkere896fea2009-07-06 06:40:23 +0000275mpi_copy_self:input_X
276{
277 mpi X;
Paul Bakker6c591fa2011-05-05 11:49:20 +0000278 mpi_init( &X );
Paul Bakkere896fea2009-07-06 06:40:23 +0000279
280 TEST_ASSERT( mpi_lset( &X, {input_X} ) == 0 );
281 TEST_ASSERT( mpi_copy( &X, &X ) == 0 );
282 TEST_ASSERT( mpi_cmp_int( &X, {input_X} ) == 0 );
Paul Bakker6c591fa2011-05-05 11:49:20 +0000283
284 mpi_free( &X );
Paul Bakkere896fea2009-07-06 06:40:23 +0000285}
286END_CASE
287
288BEGIN_CASE
Paul Bakker367dae42009-06-28 21:50:27 +0000289mpi_swap:input_X:input_Y
290{
291 mpi X, Y, A;
Paul Bakker6c591fa2011-05-05 11:49:20 +0000292 mpi_init( &X ); mpi_init( &Y ); mpi_init( &A );
Paul Bakker367dae42009-06-28 21:50:27 +0000293
294 TEST_ASSERT( mpi_lset( &X, {input_X} ) == 0 );
295 TEST_ASSERT( mpi_lset( &Y, {input_Y} ) == 0 );
296 TEST_ASSERT( mpi_lset( &A, {input_X} ) == 0 );
297 TEST_ASSERT( mpi_cmp_mpi( &X, &Y ) != 0 );
298 TEST_ASSERT( mpi_cmp_mpi( &X, &A ) == 0 );
299 mpi_swap( &X, &Y );
300 TEST_ASSERT( mpi_cmp_mpi( &X, &Y ) != 0 );
301 TEST_ASSERT( mpi_cmp_mpi( &Y, &A ) == 0 );
Paul Bakker6c591fa2011-05-05 11:49:20 +0000302
303 mpi_free( &X ); mpi_free( &Y ); mpi_free( &A );
Paul Bakker367dae42009-06-28 21:50:27 +0000304}
305END_CASE
306
307BEGIN_CASE
308mpi_add_mpi:radix_X:input_X:radix_Y:input_Y:radix_A:input_A
309{
310 mpi X, Y, Z, A;
Paul Bakker6c591fa2011-05-05 11:49:20 +0000311 mpi_init( &X ); mpi_init( &Y ); mpi_init( &Z ); mpi_init( &A );
Paul Bakker367dae42009-06-28 21:50:27 +0000312
313 TEST_ASSERT( mpi_read_string( &X, {radix_X}, {input_X} ) == 0 );
314 TEST_ASSERT( mpi_read_string( &Y, {radix_Y}, {input_Y} ) == 0 );
315 TEST_ASSERT( mpi_read_string( &A, {radix_A}, {input_A} ) == 0 );
316 TEST_ASSERT( mpi_add_mpi( &Z, &X, &Y ) == 0 );
317 TEST_ASSERT( mpi_cmp_mpi( &Z, &A ) == 0 );
Paul Bakker6c591fa2011-05-05 11:49:20 +0000318
319 mpi_free( &X ); mpi_free( &Y ); mpi_free( &Z ); mpi_free( &A );
Paul Bakker367dae42009-06-28 21:50:27 +0000320}
321END_CASE
322
323BEGIN_CASE
324mpi_add_abs:radix_X:input_X:radix_Y:input_Y:radix_A:input_A
325{
326 mpi X, Y, Z, A;
Paul Bakker6c591fa2011-05-05 11:49:20 +0000327 mpi_init( &X ); mpi_init( &Y ); mpi_init( &Z ); mpi_init( &A );
Paul Bakker367dae42009-06-28 21:50:27 +0000328
329 TEST_ASSERT( mpi_read_string( &X, {radix_X}, {input_X} ) == 0 );
330 TEST_ASSERT( mpi_read_string( &Y, {radix_Y}, {input_Y} ) == 0 );
331 TEST_ASSERT( mpi_read_string( &A, {radix_A}, {input_A} ) == 0 );
332 TEST_ASSERT( mpi_add_abs( &Z, &X, &Y ) == 0 );
333 TEST_ASSERT( mpi_cmp_mpi( &Z, &A ) == 0 );
Paul Bakker6c591fa2011-05-05 11:49:20 +0000334
335 mpi_free( &X ); mpi_free( &Y ); mpi_free( &Z ); mpi_free( &A );
Paul Bakker367dae42009-06-28 21:50:27 +0000336}
337END_CASE
338
339BEGIN_CASE
Paul Bakkerba48cb22009-07-12 11:01:32 +0000340mpi_add_abs_add_first:radix_X:input_X:radix_Y:input_Y:radix_A:input_A
341{
342 mpi X, Y, A;
Paul Bakker6c591fa2011-05-05 11:49:20 +0000343 mpi_init( &X ); mpi_init( &Y ); mpi_init( &A );
Paul Bakkerba48cb22009-07-12 11:01:32 +0000344
345 TEST_ASSERT( mpi_read_string( &X, {radix_X}, {input_X} ) == 0 );
346 TEST_ASSERT( mpi_read_string( &Y, {radix_Y}, {input_Y} ) == 0 );
347 TEST_ASSERT( mpi_read_string( &A, {radix_A}, {input_A} ) == 0 );
348 TEST_ASSERT( mpi_add_abs( &X, &X, &Y ) == 0 );
349 TEST_ASSERT( mpi_cmp_mpi( &X, &A ) == 0 );
Paul Bakker6c591fa2011-05-05 11:49:20 +0000350
351 mpi_free( &X ); mpi_free( &Y ); mpi_free( &A );
Paul Bakkerba48cb22009-07-12 11:01:32 +0000352}
353END_CASE
354
355BEGIN_CASE
356mpi_add_abs_add_second:radix_X:input_X:radix_Y:input_Y:radix_A:input_A
357{
358 mpi X, Y, A;
Paul Bakker6c591fa2011-05-05 11:49:20 +0000359 mpi_init( &X ); mpi_init( &Y ); mpi_init( &A );
Paul Bakkerba48cb22009-07-12 11:01:32 +0000360
361 TEST_ASSERT( mpi_read_string( &X, {radix_X}, {input_X} ) == 0 );
362 TEST_ASSERT( mpi_read_string( &Y, {radix_Y}, {input_Y} ) == 0 );
363 TEST_ASSERT( mpi_read_string( &A, {radix_A}, {input_A} ) == 0 );
364 TEST_ASSERT( mpi_add_abs( &Y, &X, &Y ) == 0 );
365 TEST_ASSERT( mpi_cmp_mpi( &Y, &A ) == 0 );
Paul Bakker6c591fa2011-05-05 11:49:20 +0000366
367 mpi_free( &X ); mpi_free( &Y ); mpi_free( &A );
Paul Bakkerba48cb22009-07-12 11:01:32 +0000368}
369END_CASE
370
371BEGIN_CASE
Paul Bakker367dae42009-06-28 21:50:27 +0000372mpi_add_int:radix_X:input_X:input_Y:radix_A:input_A
373{
374 mpi X, Z, A;
Paul Bakker6c591fa2011-05-05 11:49:20 +0000375 mpi_init( &X ); mpi_init( &Z ); mpi_init( &A );
Paul Bakker367dae42009-06-28 21:50:27 +0000376
377 TEST_ASSERT( mpi_read_string( &X, {radix_X}, {input_X} ) == 0 );
378 TEST_ASSERT( mpi_read_string( &A, {radix_A}, {input_A} ) == 0 );
379 TEST_ASSERT( mpi_add_int( &Z, &X, {input_Y} ) == 0 );
380 TEST_ASSERT( mpi_cmp_mpi( &Z, &A ) == 0 );
Paul Bakker6c591fa2011-05-05 11:49:20 +0000381
382 mpi_free( &X ); mpi_free( &Z ); mpi_free( &A );
Paul Bakker367dae42009-06-28 21:50:27 +0000383}
384END_CASE
385
386BEGIN_CASE
387mpi_sub_mpi:radix_X:input_X:radix_Y:input_Y:radix_A:input_A
388{
389 mpi X, Y, Z, A;
Paul Bakker6c591fa2011-05-05 11:49:20 +0000390 mpi_init( &X ); mpi_init( &Y ); mpi_init( &Z ); mpi_init( &A );
Paul Bakker367dae42009-06-28 21:50:27 +0000391
392 TEST_ASSERT( mpi_read_string( &X, {radix_X}, {input_X} ) == 0 );
393 TEST_ASSERT( mpi_read_string( &Y, {radix_Y}, {input_Y} ) == 0 );
394 TEST_ASSERT( mpi_read_string( &A, {radix_A}, {input_A} ) == 0 );
395 TEST_ASSERT( mpi_sub_mpi( &Z, &X, &Y ) == 0 );
396 TEST_ASSERT( mpi_cmp_mpi( &Z, &A ) == 0 );
Paul Bakker6c591fa2011-05-05 11:49:20 +0000397
398 mpi_free( &X ); mpi_free( &Y ); mpi_free( &Z ); mpi_free( &A );
Paul Bakker367dae42009-06-28 21:50:27 +0000399}
400END_CASE
401
402BEGIN_CASE
403mpi_sub_abs:radix_X:input_X:radix_Y:input_Y:radix_A:input_A:sub_result
404{
405 mpi X, Y, Z, A;
406 int res;
Paul Bakker6c591fa2011-05-05 11:49:20 +0000407 mpi_init( &X ); mpi_init( &Y ); mpi_init( &Z ); mpi_init( &A );
Paul Bakker367dae42009-06-28 21:50:27 +0000408
409 TEST_ASSERT( mpi_read_string( &X, {radix_X}, {input_X} ) == 0 );
410 TEST_ASSERT( mpi_read_string( &Y, {radix_Y}, {input_Y} ) == 0 );
411 TEST_ASSERT( mpi_read_string( &A, {radix_A}, {input_A} ) == 0 );
412
413 res = mpi_sub_abs( &Z, &X, &Y );
414 TEST_ASSERT( res == {sub_result} );
415 if( res == 0 )
416 TEST_ASSERT( mpi_cmp_mpi( &Z, &A ) == 0 );
Paul Bakker6c591fa2011-05-05 11:49:20 +0000417
418 mpi_free( &X ); mpi_free( &Y ); mpi_free( &Z ); mpi_free( &A );
Paul Bakker367dae42009-06-28 21:50:27 +0000419}
420END_CASE
421
422BEGIN_CASE
423mpi_sub_int:radix_X:input_X:input_Y:radix_A:input_A
424{
425 mpi X, Z, A;
Paul Bakker6c591fa2011-05-05 11:49:20 +0000426 mpi_init( &X ); mpi_init( &Z ); mpi_init( &A );
Paul Bakker367dae42009-06-28 21:50:27 +0000427
428 TEST_ASSERT( mpi_read_string( &X, {radix_X}, {input_X} ) == 0 );
429 TEST_ASSERT( mpi_read_string( &A, {radix_A}, {input_A} ) == 0 );
430 TEST_ASSERT( mpi_sub_int( &Z, &X, {input_Y} ) == 0 );
431 TEST_ASSERT( mpi_cmp_mpi( &Z, &A ) == 0 );
Paul Bakker6c591fa2011-05-05 11:49:20 +0000432
433 mpi_free( &X ); mpi_free( &Z ); mpi_free( &A );
Paul Bakker367dae42009-06-28 21:50:27 +0000434}
435END_CASE
436
437BEGIN_CASE
438mpi_mul_mpi:radix_X:input_X:radix_Y:input_Y:radix_A:input_A
439{
440 mpi X, Y, Z, A;
Paul Bakker6c591fa2011-05-05 11:49:20 +0000441 mpi_init( &X ); mpi_init( &Y ); mpi_init( &Z ); mpi_init( &A );
Paul Bakker367dae42009-06-28 21:50:27 +0000442
443 TEST_ASSERT( mpi_read_string( &X, {radix_X}, {input_X} ) == 0 );
444 TEST_ASSERT( mpi_read_string( &Y, {radix_Y}, {input_Y} ) == 0 );
445 TEST_ASSERT( mpi_read_string( &A, {radix_A}, {input_A} ) == 0 );
446 TEST_ASSERT( mpi_mul_mpi( &Z, &X, &Y ) == 0 );
447 TEST_ASSERT( mpi_cmp_mpi( &Z, &A ) == 0 );
Paul Bakker6c591fa2011-05-05 11:49:20 +0000448
449 mpi_free( &X ); mpi_free( &Y ); mpi_free( &Z ); mpi_free( &A );
Paul Bakker367dae42009-06-28 21:50:27 +0000450}
451END_CASE
452
453BEGIN_CASE
454mpi_mul_int:radix_X:input_X:input_Y:radix_A:input_A:result_comparison
455{
456 mpi X, Z, A;
Paul Bakker6c591fa2011-05-05 11:49:20 +0000457 mpi_init( &X ); mpi_init( &Z ); mpi_init( &A );
Paul Bakker367dae42009-06-28 21:50:27 +0000458
459 TEST_ASSERT( mpi_read_string( &X, {radix_X}, {input_X} ) == 0 );
460 TEST_ASSERT( mpi_read_string( &A, {radix_A}, {input_A} ) == 0 );
461 TEST_ASSERT( mpi_mul_int( &Z, &X, {input_Y} ) == 0 );
462 TEST_ASSERT( mpi_cmp_mpi( &Z, &A ) {result_comparison} 0 );
Paul Bakker6c591fa2011-05-05 11:49:20 +0000463
464 mpi_free( &X ); mpi_free( &Z ); mpi_free( &A );
Paul Bakker367dae42009-06-28 21:50:27 +0000465}
466END_CASE
467
468BEGIN_CASE
469mpi_div_mpi:radix_X:input_X:radix_Y:input_Y:radix_A:input_A:radix_B:input_B:div_result
470{
471 mpi X, Y, Q, R, A, B;
472 int res;
Paul Bakker6c591fa2011-05-05 11:49:20 +0000473 mpi_init( &X ); mpi_init( &Y ); mpi_init( &Q ); mpi_init( &R );
474 mpi_init( &A ); mpi_init( &B );
Paul Bakker367dae42009-06-28 21:50:27 +0000475
476 TEST_ASSERT( mpi_read_string( &X, {radix_X}, {input_X} ) == 0 );
477 TEST_ASSERT( mpi_read_string( &Y, {radix_Y}, {input_Y} ) == 0 );
478 TEST_ASSERT( mpi_read_string( &A, {radix_A}, {input_A} ) == 0 );
479 TEST_ASSERT( mpi_read_string( &B, {radix_B}, {input_B} ) == 0 );
480 res = mpi_div_mpi( &Q, &R, &X, &Y );
481 TEST_ASSERT( res == {div_result} );
482 if( res == 0 )
483 {
484 TEST_ASSERT( mpi_cmp_mpi( &Q, &A ) == 0 );
485 TEST_ASSERT( mpi_cmp_mpi( &R, &B ) == 0 );
486 }
Paul Bakker6c591fa2011-05-05 11:49:20 +0000487
488 mpi_free( &X ); mpi_free( &Y ); mpi_free( &Q ); mpi_free( &R );
489 mpi_free( &A ); mpi_free( &B );
Paul Bakker367dae42009-06-28 21:50:27 +0000490}
491END_CASE
492
493BEGIN_CASE
494mpi_div_int:radix_X:input_X:input_Y:radix_A:input_A:radix_B:input_B:div_result
495{
496 mpi X, Q, R, A, B;
497 int res;
Paul Bakker6c591fa2011-05-05 11:49:20 +0000498 mpi_init( &X ); mpi_init( &Q ); mpi_init( &R ); mpi_init( &A );
499 mpi_init( &B );
Paul Bakker367dae42009-06-28 21:50:27 +0000500
501 TEST_ASSERT( mpi_read_string( &X, {radix_X}, {input_X} ) == 0 );
502 TEST_ASSERT( mpi_read_string( &A, {radix_A}, {input_A} ) == 0 );
503 TEST_ASSERT( mpi_read_string( &B, {radix_B}, {input_B} ) == 0 );
504 res = mpi_div_int( &Q, &R, &X, {input_Y} );
505 TEST_ASSERT( res == {div_result} );
506 if( res == 0 )
507 {
508 TEST_ASSERT( mpi_cmp_mpi( &Q, &A ) == 0 );
509 TEST_ASSERT( mpi_cmp_mpi( &R, &B ) == 0 );
510 }
Paul Bakker6c591fa2011-05-05 11:49:20 +0000511
512 mpi_free( &X ); mpi_free( &Q ); mpi_free( &R ); mpi_free( &A );
513 mpi_free( &B );
Paul Bakker367dae42009-06-28 21:50:27 +0000514}
515END_CASE
516
517BEGIN_CASE
518mpi_mod_mpi:radix_X:input_X:radix_Y:input_Y:radix_A:input_A:div_result
519{
520 mpi X, Y, Z, A;
521 int res;
Paul Bakker6c591fa2011-05-05 11:49:20 +0000522 mpi_init( &X ); mpi_init( &Y ); mpi_init( &Z ); mpi_init( &A );
Paul Bakker367dae42009-06-28 21:50:27 +0000523
524 TEST_ASSERT( mpi_read_string( &X, {radix_X}, {input_X} ) == 0 );
525 TEST_ASSERT( mpi_read_string( &Y, {radix_Y}, {input_Y} ) == 0 );
526 TEST_ASSERT( mpi_read_string( &A, {radix_A}, {input_A} ) == 0 );
527 res = mpi_mod_mpi( &Z, &X, &Y );
528 TEST_ASSERT( res == {div_result} );
529 if( res == 0 )
530 {
531 TEST_ASSERT( mpi_cmp_mpi( &Z, &A ) == 0 );
532 }
Paul Bakker6c591fa2011-05-05 11:49:20 +0000533
534 mpi_free( &X ); mpi_free( &Y ); mpi_free( &Z ); mpi_free( &A );
Paul Bakker367dae42009-06-28 21:50:27 +0000535}
536END_CASE
537
538BEGIN_CASE
539mpi_mod_int:radix_X:input_X:input_Y:input_A:div_result
540{
541 mpi X;
542 int res;
Paul Bakkera755ca12011-04-24 09:11:17 +0000543 t_uint r;
Paul Bakker6c591fa2011-05-05 11:49:20 +0000544 mpi_init( &X );
Paul Bakker367dae42009-06-28 21:50:27 +0000545
546 TEST_ASSERT( mpi_read_string( &X, {radix_X}, {input_X} ) == 0 );
547 res = mpi_mod_int( &r, &X, {input_Y} );
548 TEST_ASSERT( res == {div_result} );
549 if( res == 0 )
550 {
551 TEST_ASSERT( r == {input_A} );
552 }
Paul Bakker6c591fa2011-05-05 11:49:20 +0000553
554 mpi_free( &X );
Paul Bakker367dae42009-06-28 21:50:27 +0000555}
556END_CASE
557
558BEGIN_CASE
559mpi_exp_mod:radix_A:input_A:radix_E:input_E:radix_N:input_N:radix_RR:input_RR:radix_X:input_X:div_result
560{
561 mpi A, E, N, RR, Z, X;
562 int res;
Paul Bakker6c591fa2011-05-05 11:49:20 +0000563 mpi_init( &A ); mpi_init( &E ); mpi_init( &N );
564 mpi_init( &RR ); mpi_init( &Z ); mpi_init( &X );
Paul Bakker367dae42009-06-28 21:50:27 +0000565
566 TEST_ASSERT( mpi_read_string( &A, {radix_A}, {input_A} ) == 0 );
567 TEST_ASSERT( mpi_read_string( &E, {radix_E}, {input_E} ) == 0 );
568 TEST_ASSERT( mpi_read_string( &N, {radix_N}, {input_N} ) == 0 );
569 TEST_ASSERT( mpi_read_string( &X, {radix_X}, {input_X} ) == 0 );
570
571 if( strlen( {input_RR} ) )
572 TEST_ASSERT( mpi_read_string( &RR, {radix_RR}, {input_RR} ) == 0 );
573
574 res = mpi_exp_mod( &Z, &A, &E, &N, &RR );
575 TEST_ASSERT( res == {div_result} );
576 if( res == 0 )
577 {
578 TEST_ASSERT( mpi_cmp_mpi( &Z, &X ) == 0 );
579 }
Paul Bakker6c591fa2011-05-05 11:49:20 +0000580
581 mpi_free( &A ); mpi_free( &E ); mpi_free( &N );
582 mpi_free( &RR ); mpi_free( &Z ); mpi_free( &X );
Paul Bakker367dae42009-06-28 21:50:27 +0000583}
584END_CASE
585
586BEGIN_CASE
587mpi_inv_mod:radix_X:input_X:radix_Y:input_Y:radix_A:input_A:div_result
588{
589 mpi X, Y, Z, A;
590 int res;
Paul Bakker6c591fa2011-05-05 11:49:20 +0000591 mpi_init( &X ); mpi_init( &Y ); mpi_init( &Z ); mpi_init( &A );
Paul Bakker367dae42009-06-28 21:50:27 +0000592
593 TEST_ASSERT( mpi_read_string( &X, {radix_X}, {input_X} ) == 0 );
594 TEST_ASSERT( mpi_read_string( &Y, {radix_Y}, {input_Y} ) == 0 );
595 TEST_ASSERT( mpi_read_string( &A, {radix_A}, {input_A} ) == 0 );
596 res = mpi_inv_mod( &Z, &X, &Y );
597 TEST_ASSERT( res == {div_result} );
598 if( res == 0 )
599 {
600 TEST_ASSERT( mpi_cmp_mpi( &Z, &A ) == 0 );
601 }
Paul Bakker6c591fa2011-05-05 11:49:20 +0000602
603 mpi_free( &X ); mpi_free( &Y ); mpi_free( &Z ); mpi_free( &A );
Paul Bakker367dae42009-06-28 21:50:27 +0000604}
605END_CASE
606
607BEGIN_CASE
608mpi_is_prime:radix_X:input_X:div_result
609{
610 mpi X;
611 int res;
Paul Bakker6c591fa2011-05-05 11:49:20 +0000612 mpi_init( &X );
Paul Bakker367dae42009-06-28 21:50:27 +0000613
614 TEST_ASSERT( mpi_read_string( &X, {radix_X}, {input_X} ) == 0 );
615 res = mpi_is_prime( &X, myrand, NULL );
616 TEST_ASSERT( res == {div_result} );
Paul Bakker6c591fa2011-05-05 11:49:20 +0000617
618 mpi_free( &X );
Paul Bakker367dae42009-06-28 21:50:27 +0000619}
620END_CASE
621
622BEGIN_CASE
623mpi_shift_l:radix_X:input_X:shift_X:radix_A:input_A
624{
625 mpi X, A;
Paul Bakker6c591fa2011-05-05 11:49:20 +0000626 mpi_init( &X ); mpi_init( &A );
Paul Bakker367dae42009-06-28 21:50:27 +0000627
628 TEST_ASSERT( mpi_read_string( &X, {radix_X}, {input_X} ) == 0 );
629 TEST_ASSERT( mpi_read_string( &A, {radix_A}, {input_A} ) == 0 );
630 TEST_ASSERT( mpi_shift_l( &X, {shift_X} ) == 0 );
631 TEST_ASSERT( mpi_cmp_mpi( &X, &A ) == 0 );
Paul Bakker6c591fa2011-05-05 11:49:20 +0000632
633 mpi_free( &X ); mpi_free( &A );
Paul Bakker367dae42009-06-28 21:50:27 +0000634}
635END_CASE
636
637BEGIN_CASE
638mpi_shift_r:radix_X:input_X:shift_X:radix_A:input_A
639{
640 mpi X, A;
Paul Bakker6c591fa2011-05-05 11:49:20 +0000641 mpi_init( &X ); mpi_init( &A );
Paul Bakker367dae42009-06-28 21:50:27 +0000642
643 TEST_ASSERT( mpi_read_string( &X, {radix_X}, {input_X} ) == 0 );
644 TEST_ASSERT( mpi_read_string( &A, {radix_A}, {input_A} ) == 0 );
645 TEST_ASSERT( mpi_shift_r( &X, {shift_X} ) == 0 );
646 TEST_ASSERT( mpi_cmp_mpi( &X, &A ) == 0 );
Paul Bakker6c591fa2011-05-05 11:49:20 +0000647
648 mpi_free( &X ); mpi_free( &A );
Paul Bakker367dae42009-06-28 21:50:27 +0000649}
650END_CASE
651
Paul Bakkere896fea2009-07-06 06:40:23 +0000652BEGIN_CASE
653mpi_selftest:
654{
655 TEST_ASSERT( mpi_self_test( 0 ) == 0 );
656}
657END_CASE
Paul Bakker367dae42009-06-28 21:50:27 +0000658/* Helper Code
659 char str[1000];
660 int len = 1000;
661 mpi_write_string(&Z, 10, str, &len);
662 printf("Z: %d %s\n", Z.s, str);
663 TEST_ASSERT( mpi_cmp_mpi( &Z, &A ) == 0 );
664*/