blob: c31589e8f20b3e5ce0384b3067e9fbcdd9f3b941 [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
146mpi_lsb:radix_X:input_X:nr_bits
147{
148 mpi X;
Paul Bakker6c591fa2011-05-05 11:49:20 +0000149 mpi_init( &X );
Paul Bakkere896fea2009-07-06 06:40:23 +0000150
151 TEST_ASSERT( mpi_read_string( &X, {radix_X}, {input_X} ) == 0 );
152 TEST_ASSERT( mpi_lsb( &X ) == {nr_bits} );
Paul Bakker6c591fa2011-05-05 11:49:20 +0000153
154 mpi_free( &X );
Paul Bakkere896fea2009-07-06 06:40:23 +0000155}
156END_CASE
157
158BEGIN_CASE
159mpi_msb:radix_X:input_X:nr_bits
160{
161 mpi X;
Paul Bakker6c591fa2011-05-05 11:49:20 +0000162 mpi_init( &X );
Paul Bakkere896fea2009-07-06 06:40:23 +0000163
164 TEST_ASSERT( mpi_read_string( &X, {radix_X}, {input_X} ) == 0 );
165 TEST_ASSERT( mpi_msb( &X ) == {nr_bits} );
Paul Bakker6c591fa2011-05-05 11:49:20 +0000166
167 mpi_free( &X );
Paul Bakker367dae42009-06-28 21:50:27 +0000168}
169END_CASE
170
171BEGIN_CASE
172mpi_gcd:radix_X:input_X:radix_Y:input_Y:radix_A:input_A
173{
174 mpi A, X, Y, Z;
Paul Bakker6c591fa2011-05-05 11:49:20 +0000175 mpi_init( &A ); mpi_init( &X ); mpi_init( &Y ); mpi_init( &Z );
Paul Bakker367dae42009-06-28 21:50:27 +0000176
177 TEST_ASSERT( mpi_read_string( &X, {radix_X}, {input_X} ) == 0 );
178 TEST_ASSERT( mpi_read_string( &Y, {radix_Y}, {input_Y} ) == 0 );
179 TEST_ASSERT( mpi_read_string( &A, {radix_A}, {input_A} ) == 0 );
180 TEST_ASSERT( mpi_gcd( &Z, &X, &Y ) == 0 );
181 TEST_ASSERT( mpi_cmp_mpi( &Z, &A ) == 0 );
Paul Bakker6c591fa2011-05-05 11:49:20 +0000182
183 mpi_free( &A ); mpi_free( &X ); mpi_free( &Y ); mpi_free( &Z );
Paul Bakker367dae42009-06-28 21:50:27 +0000184}
185END_CASE
186
187BEGIN_CASE
188mpi_cmp_int:input_X:input_A:result_CMP
189{
190 mpi X;
Paul Bakker6c591fa2011-05-05 11:49:20 +0000191 mpi_init( &X );
Paul Bakker367dae42009-06-28 21:50:27 +0000192
193 TEST_ASSERT( mpi_lset( &X, {input_X} ) == 0);
194 TEST_ASSERT( mpi_cmp_int( &X, {input_A} ) == {result_CMP});
Paul Bakker6c591fa2011-05-05 11:49:20 +0000195
196 mpi_free( &X );
Paul Bakker367dae42009-06-28 21:50:27 +0000197}
198END_CASE
199
200BEGIN_CASE
201mpi_cmp_mpi:radix_X:input_X:radix_Y:input_Y:input_A
202{
203 mpi X, Y;
Paul Bakker6c591fa2011-05-05 11:49:20 +0000204 mpi_init( &X ); mpi_init( &Y );
Paul Bakker367dae42009-06-28 21:50:27 +0000205
206 TEST_ASSERT( mpi_read_string( &X, {radix_X}, {input_X} ) == 0 );
207 TEST_ASSERT( mpi_read_string( &Y, {radix_Y}, {input_Y} ) == 0 );
208 TEST_ASSERT( mpi_cmp_mpi( &X, &Y ) == {input_A} );
Paul Bakker6c591fa2011-05-05 11:49:20 +0000209
210 mpi_free( &X ); mpi_free( &Y );
Paul Bakker367dae42009-06-28 21:50:27 +0000211}
212END_CASE
213
214BEGIN_CASE
215mpi_cmp_abs:radix_X:input_X:radix_Y:input_Y:input_A
216{
217 mpi X, Y;
Paul Bakker6c591fa2011-05-05 11:49:20 +0000218 mpi_init( &X ); mpi_init( &Y );
Paul Bakker367dae42009-06-28 21:50:27 +0000219
220 TEST_ASSERT( mpi_read_string( &X, {radix_X}, {input_X} ) == 0 );
221 TEST_ASSERT( mpi_read_string( &Y, {radix_Y}, {input_Y} ) == 0 );
222 TEST_ASSERT( mpi_cmp_abs( &X, &Y ) == {input_A} );
Paul Bakker6c591fa2011-05-05 11:49:20 +0000223
224 mpi_free( &X ); mpi_free( &Y );
Paul Bakker367dae42009-06-28 21:50:27 +0000225}
226END_CASE
227
228BEGIN_CASE
229mpi_copy:input_X:input_A
230{
231 mpi X, Y, A;
Paul Bakker6c591fa2011-05-05 11:49:20 +0000232 mpi_init( &X ); mpi_init( &Y ); mpi_init( &A );
Paul Bakker367dae42009-06-28 21:50:27 +0000233
234 TEST_ASSERT( mpi_lset( &X, {input_X} ) == 0 );
235 TEST_ASSERT( mpi_lset( &Y, {input_A} ) == 0 );
236 TEST_ASSERT( mpi_lset( &A, {input_A} ) == 0 );
237 TEST_ASSERT( mpi_cmp_mpi( &X, &Y ) != 0 );
238 TEST_ASSERT( mpi_cmp_mpi( &Y, &A ) == 0 );
239 TEST_ASSERT( mpi_copy( &Y, &X ) == 0 );
240 TEST_ASSERT( mpi_cmp_mpi( &X, &Y ) == 0 );
241 TEST_ASSERT( mpi_cmp_mpi( &Y, &A ) != 0 );
Paul Bakker6c591fa2011-05-05 11:49:20 +0000242
243 mpi_free( &X ); mpi_free( &Y ); mpi_free( &A );
Paul Bakker367dae42009-06-28 21:50:27 +0000244}
245END_CASE
246
247BEGIN_CASE
Paul Bakkere896fea2009-07-06 06:40:23 +0000248mpi_copy_self:input_X
249{
250 mpi X;
Paul Bakker6c591fa2011-05-05 11:49:20 +0000251 mpi_init( &X );
Paul Bakkere896fea2009-07-06 06:40:23 +0000252
253 TEST_ASSERT( mpi_lset( &X, {input_X} ) == 0 );
254 TEST_ASSERT( mpi_copy( &X, &X ) == 0 );
255 TEST_ASSERT( mpi_cmp_int( &X, {input_X} ) == 0 );
Paul Bakker6c591fa2011-05-05 11:49:20 +0000256
257 mpi_free( &X );
Paul Bakkere896fea2009-07-06 06:40:23 +0000258}
259END_CASE
260
261BEGIN_CASE
Paul Bakker367dae42009-06-28 21:50:27 +0000262mpi_swap:input_X:input_Y
263{
264 mpi X, Y, A;
Paul Bakker6c591fa2011-05-05 11:49:20 +0000265 mpi_init( &X ); mpi_init( &Y ); mpi_init( &A );
Paul Bakker367dae42009-06-28 21:50:27 +0000266
267 TEST_ASSERT( mpi_lset( &X, {input_X} ) == 0 );
268 TEST_ASSERT( mpi_lset( &Y, {input_Y} ) == 0 );
269 TEST_ASSERT( mpi_lset( &A, {input_X} ) == 0 );
270 TEST_ASSERT( mpi_cmp_mpi( &X, &Y ) != 0 );
271 TEST_ASSERT( mpi_cmp_mpi( &X, &A ) == 0 );
272 mpi_swap( &X, &Y );
273 TEST_ASSERT( mpi_cmp_mpi( &X, &Y ) != 0 );
274 TEST_ASSERT( mpi_cmp_mpi( &Y, &A ) == 0 );
Paul Bakker6c591fa2011-05-05 11:49:20 +0000275
276 mpi_free( &X ); mpi_free( &Y ); mpi_free( &A );
Paul Bakker367dae42009-06-28 21:50:27 +0000277}
278END_CASE
279
280BEGIN_CASE
281mpi_add_mpi:radix_X:input_X:radix_Y:input_Y:radix_A:input_A
282{
283 mpi X, Y, Z, A;
Paul Bakker6c591fa2011-05-05 11:49:20 +0000284 mpi_init( &X ); mpi_init( &Y ); mpi_init( &Z ); mpi_init( &A );
Paul Bakker367dae42009-06-28 21:50:27 +0000285
286 TEST_ASSERT( mpi_read_string( &X, {radix_X}, {input_X} ) == 0 );
287 TEST_ASSERT( mpi_read_string( &Y, {radix_Y}, {input_Y} ) == 0 );
288 TEST_ASSERT( mpi_read_string( &A, {radix_A}, {input_A} ) == 0 );
289 TEST_ASSERT( mpi_add_mpi( &Z, &X, &Y ) == 0 );
290 TEST_ASSERT( mpi_cmp_mpi( &Z, &A ) == 0 );
Paul Bakker6c591fa2011-05-05 11:49:20 +0000291
292 mpi_free( &X ); mpi_free( &Y ); mpi_free( &Z ); mpi_free( &A );
Paul Bakker367dae42009-06-28 21:50:27 +0000293}
294END_CASE
295
296BEGIN_CASE
297mpi_add_abs:radix_X:input_X:radix_Y:input_Y:radix_A:input_A
298{
299 mpi X, Y, Z, A;
Paul Bakker6c591fa2011-05-05 11:49:20 +0000300 mpi_init( &X ); mpi_init( &Y ); mpi_init( &Z ); mpi_init( &A );
Paul Bakker367dae42009-06-28 21:50:27 +0000301
302 TEST_ASSERT( mpi_read_string( &X, {radix_X}, {input_X} ) == 0 );
303 TEST_ASSERT( mpi_read_string( &Y, {radix_Y}, {input_Y} ) == 0 );
304 TEST_ASSERT( mpi_read_string( &A, {radix_A}, {input_A} ) == 0 );
305 TEST_ASSERT( mpi_add_abs( &Z, &X, &Y ) == 0 );
306 TEST_ASSERT( mpi_cmp_mpi( &Z, &A ) == 0 );
Paul Bakker6c591fa2011-05-05 11:49:20 +0000307
308 mpi_free( &X ); mpi_free( &Y ); mpi_free( &Z ); mpi_free( &A );
Paul Bakker367dae42009-06-28 21:50:27 +0000309}
310END_CASE
311
312BEGIN_CASE
Paul Bakkerba48cb22009-07-12 11:01:32 +0000313mpi_add_abs_add_first:radix_X:input_X:radix_Y:input_Y:radix_A:input_A
314{
315 mpi X, Y, A;
Paul Bakker6c591fa2011-05-05 11:49:20 +0000316 mpi_init( &X ); mpi_init( &Y ); mpi_init( &A );
Paul Bakkerba48cb22009-07-12 11:01:32 +0000317
318 TEST_ASSERT( mpi_read_string( &X, {radix_X}, {input_X} ) == 0 );
319 TEST_ASSERT( mpi_read_string( &Y, {radix_Y}, {input_Y} ) == 0 );
320 TEST_ASSERT( mpi_read_string( &A, {radix_A}, {input_A} ) == 0 );
321 TEST_ASSERT( mpi_add_abs( &X, &X, &Y ) == 0 );
322 TEST_ASSERT( mpi_cmp_mpi( &X, &A ) == 0 );
Paul Bakker6c591fa2011-05-05 11:49:20 +0000323
324 mpi_free( &X ); mpi_free( &Y ); mpi_free( &A );
Paul Bakkerba48cb22009-07-12 11:01:32 +0000325}
326END_CASE
327
328BEGIN_CASE
329mpi_add_abs_add_second:radix_X:input_X:radix_Y:input_Y:radix_A:input_A
330{
331 mpi X, Y, A;
Paul Bakker6c591fa2011-05-05 11:49:20 +0000332 mpi_init( &X ); mpi_init( &Y ); mpi_init( &A );
Paul Bakkerba48cb22009-07-12 11:01:32 +0000333
334 TEST_ASSERT( mpi_read_string( &X, {radix_X}, {input_X} ) == 0 );
335 TEST_ASSERT( mpi_read_string( &Y, {radix_Y}, {input_Y} ) == 0 );
336 TEST_ASSERT( mpi_read_string( &A, {radix_A}, {input_A} ) == 0 );
337 TEST_ASSERT( mpi_add_abs( &Y, &X, &Y ) == 0 );
338 TEST_ASSERT( mpi_cmp_mpi( &Y, &A ) == 0 );
Paul Bakker6c591fa2011-05-05 11:49:20 +0000339
340 mpi_free( &X ); mpi_free( &Y ); mpi_free( &A );
Paul Bakkerba48cb22009-07-12 11:01:32 +0000341}
342END_CASE
343
344BEGIN_CASE
Paul Bakker367dae42009-06-28 21:50:27 +0000345mpi_add_int:radix_X:input_X:input_Y:radix_A:input_A
346{
347 mpi X, Z, A;
Paul Bakker6c591fa2011-05-05 11:49:20 +0000348 mpi_init( &X ); mpi_init( &Z ); mpi_init( &A );
Paul Bakker367dae42009-06-28 21:50:27 +0000349
350 TEST_ASSERT( mpi_read_string( &X, {radix_X}, {input_X} ) == 0 );
351 TEST_ASSERT( mpi_read_string( &A, {radix_A}, {input_A} ) == 0 );
352 TEST_ASSERT( mpi_add_int( &Z, &X, {input_Y} ) == 0 );
353 TEST_ASSERT( mpi_cmp_mpi( &Z, &A ) == 0 );
Paul Bakker6c591fa2011-05-05 11:49:20 +0000354
355 mpi_free( &X ); mpi_free( &Z ); mpi_free( &A );
Paul Bakker367dae42009-06-28 21:50:27 +0000356}
357END_CASE
358
359BEGIN_CASE
360mpi_sub_mpi:radix_X:input_X:radix_Y:input_Y:radix_A:input_A
361{
362 mpi X, Y, Z, A;
Paul Bakker6c591fa2011-05-05 11:49:20 +0000363 mpi_init( &X ); mpi_init( &Y ); mpi_init( &Z ); mpi_init( &A );
Paul Bakker367dae42009-06-28 21:50:27 +0000364
365 TEST_ASSERT( mpi_read_string( &X, {radix_X}, {input_X} ) == 0 );
366 TEST_ASSERT( mpi_read_string( &Y, {radix_Y}, {input_Y} ) == 0 );
367 TEST_ASSERT( mpi_read_string( &A, {radix_A}, {input_A} ) == 0 );
368 TEST_ASSERT( mpi_sub_mpi( &Z, &X, &Y ) == 0 );
369 TEST_ASSERT( mpi_cmp_mpi( &Z, &A ) == 0 );
Paul Bakker6c591fa2011-05-05 11:49:20 +0000370
371 mpi_free( &X ); mpi_free( &Y ); mpi_free( &Z ); mpi_free( &A );
Paul Bakker367dae42009-06-28 21:50:27 +0000372}
373END_CASE
374
375BEGIN_CASE
376mpi_sub_abs:radix_X:input_X:radix_Y:input_Y:radix_A:input_A:sub_result
377{
378 mpi X, Y, Z, A;
379 int res;
Paul Bakker6c591fa2011-05-05 11:49:20 +0000380 mpi_init( &X ); mpi_init( &Y ); mpi_init( &Z ); mpi_init( &A );
Paul Bakker367dae42009-06-28 21:50:27 +0000381
382 TEST_ASSERT( mpi_read_string( &X, {radix_X}, {input_X} ) == 0 );
383 TEST_ASSERT( mpi_read_string( &Y, {radix_Y}, {input_Y} ) == 0 );
384 TEST_ASSERT( mpi_read_string( &A, {radix_A}, {input_A} ) == 0 );
385
386 res = mpi_sub_abs( &Z, &X, &Y );
387 TEST_ASSERT( res == {sub_result} );
388 if( res == 0 )
389 TEST_ASSERT( mpi_cmp_mpi( &Z, &A ) == 0 );
Paul Bakker6c591fa2011-05-05 11:49:20 +0000390
391 mpi_free( &X ); mpi_free( &Y ); mpi_free( &Z ); mpi_free( &A );
Paul Bakker367dae42009-06-28 21:50:27 +0000392}
393END_CASE
394
395BEGIN_CASE
396mpi_sub_int:radix_X:input_X:input_Y:radix_A:input_A
397{
398 mpi X, Z, A;
Paul Bakker6c591fa2011-05-05 11:49:20 +0000399 mpi_init( &X ); mpi_init( &Z ); mpi_init( &A );
Paul Bakker367dae42009-06-28 21:50:27 +0000400
401 TEST_ASSERT( mpi_read_string( &X, {radix_X}, {input_X} ) == 0 );
402 TEST_ASSERT( mpi_read_string( &A, {radix_A}, {input_A} ) == 0 );
403 TEST_ASSERT( mpi_sub_int( &Z, &X, {input_Y} ) == 0 );
404 TEST_ASSERT( mpi_cmp_mpi( &Z, &A ) == 0 );
Paul Bakker6c591fa2011-05-05 11:49:20 +0000405
406 mpi_free( &X ); mpi_free( &Z ); mpi_free( &A );
Paul Bakker367dae42009-06-28 21:50:27 +0000407}
408END_CASE
409
410BEGIN_CASE
411mpi_mul_mpi:radix_X:input_X:radix_Y:input_Y:radix_A:input_A
412{
413 mpi X, Y, Z, A;
Paul Bakker6c591fa2011-05-05 11:49:20 +0000414 mpi_init( &X ); mpi_init( &Y ); mpi_init( &Z ); mpi_init( &A );
Paul Bakker367dae42009-06-28 21:50:27 +0000415
416 TEST_ASSERT( mpi_read_string( &X, {radix_X}, {input_X} ) == 0 );
417 TEST_ASSERT( mpi_read_string( &Y, {radix_Y}, {input_Y} ) == 0 );
418 TEST_ASSERT( mpi_read_string( &A, {radix_A}, {input_A} ) == 0 );
419 TEST_ASSERT( mpi_mul_mpi( &Z, &X, &Y ) == 0 );
420 TEST_ASSERT( mpi_cmp_mpi( &Z, &A ) == 0 );
Paul Bakker6c591fa2011-05-05 11:49:20 +0000421
422 mpi_free( &X ); mpi_free( &Y ); mpi_free( &Z ); mpi_free( &A );
Paul Bakker367dae42009-06-28 21:50:27 +0000423}
424END_CASE
425
426BEGIN_CASE
427mpi_mul_int:radix_X:input_X:input_Y:radix_A:input_A:result_comparison
428{
429 mpi X, Z, A;
Paul Bakker6c591fa2011-05-05 11:49:20 +0000430 mpi_init( &X ); mpi_init( &Z ); mpi_init( &A );
Paul Bakker367dae42009-06-28 21:50:27 +0000431
432 TEST_ASSERT( mpi_read_string( &X, {radix_X}, {input_X} ) == 0 );
433 TEST_ASSERT( mpi_read_string( &A, {radix_A}, {input_A} ) == 0 );
434 TEST_ASSERT( mpi_mul_int( &Z, &X, {input_Y} ) == 0 );
435 TEST_ASSERT( mpi_cmp_mpi( &Z, &A ) {result_comparison} 0 );
Paul Bakker6c591fa2011-05-05 11:49:20 +0000436
437 mpi_free( &X ); mpi_free( &Z ); mpi_free( &A );
Paul Bakker367dae42009-06-28 21:50:27 +0000438}
439END_CASE
440
441BEGIN_CASE
442mpi_div_mpi:radix_X:input_X:radix_Y:input_Y:radix_A:input_A:radix_B:input_B:div_result
443{
444 mpi X, Y, Q, R, A, B;
445 int res;
Paul Bakker6c591fa2011-05-05 11:49:20 +0000446 mpi_init( &X ); mpi_init( &Y ); mpi_init( &Q ); mpi_init( &R );
447 mpi_init( &A ); mpi_init( &B );
Paul Bakker367dae42009-06-28 21:50:27 +0000448
449 TEST_ASSERT( mpi_read_string( &X, {radix_X}, {input_X} ) == 0 );
450 TEST_ASSERT( mpi_read_string( &Y, {radix_Y}, {input_Y} ) == 0 );
451 TEST_ASSERT( mpi_read_string( &A, {radix_A}, {input_A} ) == 0 );
452 TEST_ASSERT( mpi_read_string( &B, {radix_B}, {input_B} ) == 0 );
453 res = mpi_div_mpi( &Q, &R, &X, &Y );
454 TEST_ASSERT( res == {div_result} );
455 if( res == 0 )
456 {
457 TEST_ASSERT( mpi_cmp_mpi( &Q, &A ) == 0 );
458 TEST_ASSERT( mpi_cmp_mpi( &R, &B ) == 0 );
459 }
Paul Bakker6c591fa2011-05-05 11:49:20 +0000460
461 mpi_free( &X ); mpi_free( &Y ); mpi_free( &Q ); mpi_free( &R );
462 mpi_free( &A ); mpi_free( &B );
Paul Bakker367dae42009-06-28 21:50:27 +0000463}
464END_CASE
465
466BEGIN_CASE
467mpi_div_int:radix_X:input_X:input_Y:radix_A:input_A:radix_B:input_B:div_result
468{
469 mpi X, Q, R, A, B;
470 int res;
Paul Bakker6c591fa2011-05-05 11:49:20 +0000471 mpi_init( &X ); mpi_init( &Q ); mpi_init( &R ); mpi_init( &A );
472 mpi_init( &B );
Paul Bakker367dae42009-06-28 21:50:27 +0000473
474 TEST_ASSERT( mpi_read_string( &X, {radix_X}, {input_X} ) == 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_int( &Q, &R, &X, {input_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( &Q ); mpi_free( &R ); mpi_free( &A );
486 mpi_free( &B );
Paul Bakker367dae42009-06-28 21:50:27 +0000487}
488END_CASE
489
490BEGIN_CASE
491mpi_mod_mpi:radix_X:input_X:radix_Y:input_Y:radix_A:input_A:div_result
492{
493 mpi X, Y, Z, A;
494 int res;
Paul Bakker6c591fa2011-05-05 11:49:20 +0000495 mpi_init( &X ); mpi_init( &Y ); mpi_init( &Z ); mpi_init( &A );
Paul Bakker367dae42009-06-28 21:50:27 +0000496
497 TEST_ASSERT( mpi_read_string( &X, {radix_X}, {input_X} ) == 0 );
498 TEST_ASSERT( mpi_read_string( &Y, {radix_Y}, {input_Y} ) == 0 );
499 TEST_ASSERT( mpi_read_string( &A, {radix_A}, {input_A} ) == 0 );
500 res = mpi_mod_mpi( &Z, &X, &Y );
501 TEST_ASSERT( res == {div_result} );
502 if( res == 0 )
503 {
504 TEST_ASSERT( mpi_cmp_mpi( &Z, &A ) == 0 );
505 }
Paul Bakker6c591fa2011-05-05 11:49:20 +0000506
507 mpi_free( &X ); mpi_free( &Y ); mpi_free( &Z ); mpi_free( &A );
Paul Bakker367dae42009-06-28 21:50:27 +0000508}
509END_CASE
510
511BEGIN_CASE
512mpi_mod_int:radix_X:input_X:input_Y:input_A:div_result
513{
514 mpi X;
515 int res;
Paul Bakkera755ca12011-04-24 09:11:17 +0000516 t_uint r;
Paul Bakker6c591fa2011-05-05 11:49:20 +0000517 mpi_init( &X );
Paul Bakker367dae42009-06-28 21:50:27 +0000518
519 TEST_ASSERT( mpi_read_string( &X, {radix_X}, {input_X} ) == 0 );
520 res = mpi_mod_int( &r, &X, {input_Y} );
521 TEST_ASSERT( res == {div_result} );
522 if( res == 0 )
523 {
524 TEST_ASSERT( r == {input_A} );
525 }
Paul Bakker6c591fa2011-05-05 11:49:20 +0000526
527 mpi_free( &X );
Paul Bakker367dae42009-06-28 21:50:27 +0000528}
529END_CASE
530
531BEGIN_CASE
532mpi_exp_mod:radix_A:input_A:radix_E:input_E:radix_N:input_N:radix_RR:input_RR:radix_X:input_X:div_result
533{
534 mpi A, E, N, RR, Z, X;
535 int res;
Paul Bakker6c591fa2011-05-05 11:49:20 +0000536 mpi_init( &A ); mpi_init( &E ); mpi_init( &N );
537 mpi_init( &RR ); mpi_init( &Z ); mpi_init( &X );
Paul Bakker367dae42009-06-28 21:50:27 +0000538
539 TEST_ASSERT( mpi_read_string( &A, {radix_A}, {input_A} ) == 0 );
540 TEST_ASSERT( mpi_read_string( &E, {radix_E}, {input_E} ) == 0 );
541 TEST_ASSERT( mpi_read_string( &N, {radix_N}, {input_N} ) == 0 );
542 TEST_ASSERT( mpi_read_string( &X, {radix_X}, {input_X} ) == 0 );
543
544 if( strlen( {input_RR} ) )
545 TEST_ASSERT( mpi_read_string( &RR, {radix_RR}, {input_RR} ) == 0 );
546
547 res = mpi_exp_mod( &Z, &A, &E, &N, &RR );
548 TEST_ASSERT( res == {div_result} );
549 if( res == 0 )
550 {
551 TEST_ASSERT( mpi_cmp_mpi( &Z, &X ) == 0 );
552 }
Paul Bakker6c591fa2011-05-05 11:49:20 +0000553
554 mpi_free( &A ); mpi_free( &E ); mpi_free( &N );
555 mpi_free( &RR ); mpi_free( &Z ); mpi_free( &X );
Paul Bakker367dae42009-06-28 21:50:27 +0000556}
557END_CASE
558
559BEGIN_CASE
560mpi_inv_mod:radix_X:input_X:radix_Y:input_Y:radix_A:input_A:div_result
561{
562 mpi X, Y, Z, A;
563 int res;
Paul Bakker6c591fa2011-05-05 11:49:20 +0000564 mpi_init( &X ); mpi_init( &Y ); mpi_init( &Z ); mpi_init( &A );
Paul Bakker367dae42009-06-28 21:50:27 +0000565
566 TEST_ASSERT( mpi_read_string( &X, {radix_X}, {input_X} ) == 0 );
567 TEST_ASSERT( mpi_read_string( &Y, {radix_Y}, {input_Y} ) == 0 );
568 TEST_ASSERT( mpi_read_string( &A, {radix_A}, {input_A} ) == 0 );
569 res = mpi_inv_mod( &Z, &X, &Y );
570 TEST_ASSERT( res == {div_result} );
571 if( res == 0 )
572 {
573 TEST_ASSERT( mpi_cmp_mpi( &Z, &A ) == 0 );
574 }
Paul Bakker6c591fa2011-05-05 11:49:20 +0000575
576 mpi_free( &X ); mpi_free( &Y ); mpi_free( &Z ); mpi_free( &A );
Paul Bakker367dae42009-06-28 21:50:27 +0000577}
578END_CASE
579
580BEGIN_CASE
581mpi_is_prime:radix_X:input_X:div_result
582{
583 mpi X;
584 int res;
Paul Bakker6c591fa2011-05-05 11:49:20 +0000585 mpi_init( &X );
Paul Bakker367dae42009-06-28 21:50:27 +0000586
587 TEST_ASSERT( mpi_read_string( &X, {radix_X}, {input_X} ) == 0 );
588 res = mpi_is_prime( &X, myrand, NULL );
589 TEST_ASSERT( res == {div_result} );
Paul Bakker6c591fa2011-05-05 11:49:20 +0000590
591 mpi_free( &X );
Paul Bakker367dae42009-06-28 21:50:27 +0000592}
593END_CASE
594
595BEGIN_CASE
596mpi_shift_l:radix_X:input_X:shift_X:radix_A:input_A
597{
598 mpi X, A;
Paul Bakker6c591fa2011-05-05 11:49:20 +0000599 mpi_init( &X ); mpi_init( &A );
Paul Bakker367dae42009-06-28 21:50:27 +0000600
601 TEST_ASSERT( mpi_read_string( &X, {radix_X}, {input_X} ) == 0 );
602 TEST_ASSERT( mpi_read_string( &A, {radix_A}, {input_A} ) == 0 );
603 TEST_ASSERT( mpi_shift_l( &X, {shift_X} ) == 0 );
604 TEST_ASSERT( mpi_cmp_mpi( &X, &A ) == 0 );
Paul Bakker6c591fa2011-05-05 11:49:20 +0000605
606 mpi_free( &X ); mpi_free( &A );
Paul Bakker367dae42009-06-28 21:50:27 +0000607}
608END_CASE
609
610BEGIN_CASE
611mpi_shift_r:radix_X:input_X:shift_X:radix_A:input_A
612{
613 mpi X, A;
Paul Bakker6c591fa2011-05-05 11:49:20 +0000614 mpi_init( &X ); mpi_init( &A );
Paul Bakker367dae42009-06-28 21:50:27 +0000615
616 TEST_ASSERT( mpi_read_string( &X, {radix_X}, {input_X} ) == 0 );
617 TEST_ASSERT( mpi_read_string( &A, {radix_A}, {input_A} ) == 0 );
618 TEST_ASSERT( mpi_shift_r( &X, {shift_X} ) == 0 );
619 TEST_ASSERT( mpi_cmp_mpi( &X, &A ) == 0 );
Paul Bakker6c591fa2011-05-05 11:49:20 +0000620
621 mpi_free( &X ); mpi_free( &A );
Paul Bakker367dae42009-06-28 21:50:27 +0000622}
623END_CASE
624
Paul Bakkere896fea2009-07-06 06:40:23 +0000625BEGIN_CASE
626mpi_selftest:
627{
628 TEST_ASSERT( mpi_self_test( 0 ) == 0 );
629}
630END_CASE
Paul Bakker367dae42009-06-28 21:50:27 +0000631/* Helper Code
632 char str[1000];
633 int len = 1000;
634 mpi_write_string(&Z, 10, str, &len);
635 printf("Z: %d %s\n", Z.s, str);
636 TEST_ASSERT( mpi_cmp_mpi( &Z, &A ) == 0 );
637*/