blob: 52c5e413d41ead9a8b35462080a9337be90d1663 [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
15mpi_read_write_string:radix_X:input_X:radix_A:input_A
16{
17 mpi X;
18 char str[1000];
19 int len = 1000;
20
21 mpi_init(&X, NULL);
22
23 TEST_ASSERT( mpi_read_string( &X, {radix_X}, {input_X} ) == 0 );
24 TEST_ASSERT( mpi_write_string( &X, {radix_A}, str, &len ) == 0 );
Paul Bakkere896fea2009-07-06 06:40:23 +000025 TEST_ASSERT( strcasecmp( str, {input_A} ) == 0 );
26}
27END_CASE
28
29BEGIN_CASE
30mpi_read_binary:input_X:radix_A:input_A
31{
32 mpi X;
33 unsigned char str[1000];
34 unsigned char buf[1000];
35 int len = 1000;
Paul Bakker69998dd2009-07-11 19:15:20 +000036 int input_len;
Paul Bakkere896fea2009-07-06 06:40:23 +000037
38 mpi_init(&X, NULL);
39
Paul Bakker69998dd2009-07-11 19:15:20 +000040 input_len = unhexify( buf, {input_X} );
Paul Bakkere896fea2009-07-06 06:40:23 +000041
42 TEST_ASSERT( mpi_read_binary( &X, buf, input_len ) == 0 );
43 TEST_ASSERT( mpi_write_string( &X, {radix_A}, (char *) str, &len ) == 0 );
44 TEST_ASSERT( strcmp( (char *) str, {input_A} ) == 0 );
45}
46END_CASE
47
48BEGIN_CASE
49mpi_write_binary:radix_X:input_X:input_A
50{
51 mpi X;
52 unsigned char str[1000];
53 unsigned char buf[1000];
Paul Bakker69998dd2009-07-11 19:15:20 +000054 int buflen;
Paul Bakkere896fea2009-07-06 06:40:23 +000055
56 memset( buf, 0x00, 1000 );
57 memset( str, 0x00, 1000 );
58
59 mpi_init(&X, NULL);
60
61 TEST_ASSERT( mpi_read_string( &X, {radix_X}, {input_X} ) == 0 );
62
Paul Bakker69998dd2009-07-11 19:15:20 +000063 buflen = mpi_size( &X );
Paul Bakkere896fea2009-07-06 06:40:23 +000064 TEST_ASSERT( mpi_write_binary( &X, buf, buflen ) == 0 );
65
66 hexify( str, buf, buflen );
67
68 TEST_ASSERT( strcasecmp( (char *) str, {input_A} ) == 0 );
69}
70END_CASE
71
72BEGIN_CASE
73mpi_read_file:radix_X:input_file:input_A
74{
75 mpi X;
76 unsigned char str[1000];
77 unsigned char buf[1000];
Paul Bakker69998dd2009-07-11 19:15:20 +000078 int buflen;
79 FILE *file;
Paul Bakkere896fea2009-07-06 06:40:23 +000080
81 memset( buf, 0x00, 1000 );
82 memset( str, 0x00, 1000 );
83
84 mpi_init(&X, NULL);
85
Paul Bakker69998dd2009-07-11 19:15:20 +000086 file = fopen( {input_file}, "r" );
Paul Bakkere896fea2009-07-06 06:40:23 +000087 TEST_ASSERT( mpi_read_file( &X, {radix_X}, file ) == 0 );
88 fclose(file);
89
Paul Bakker69998dd2009-07-11 19:15:20 +000090 buflen = mpi_size( &X );
Paul Bakkere896fea2009-07-06 06:40:23 +000091 TEST_ASSERT( mpi_write_binary( &X, buf, buflen ) == 0 );
92
93 hexify( str, buf, buflen );
94
95 TEST_ASSERT( strcasecmp( (char *) str, {input_A} ) == 0 );
96}
97END_CASE
98
99BEGIN_CASE
100mpi_write_file:radix_X:input_X:output_radix:output_file
101{
102 mpi X, Y;
Paul Bakker69998dd2009-07-11 19:15:20 +0000103 FILE *file_out, *file_in;
104
Paul Bakkere896fea2009-07-06 06:40:23 +0000105 mpi_init( &X, &Y, NULL );
106
107 TEST_ASSERT( mpi_read_string( &X, {radix_X}, {input_X} ) == 0 );
108
Paul Bakker69998dd2009-07-11 19:15:20 +0000109 file_out = fopen( {output_file}, "w" );
Paul Bakkere896fea2009-07-06 06:40:23 +0000110 TEST_ASSERT( mpi_write_file( NULL, &X, {output_radix}, file_out ) == 0 );
111 fclose(file_out);
112
Paul Bakker69998dd2009-07-11 19:15:20 +0000113 file_in = fopen( {output_file}, "r" );
Paul Bakkere896fea2009-07-06 06:40:23 +0000114 TEST_ASSERT( mpi_read_file( &Y, {output_radix}, file_in ) == 0 );
115 fclose(file_in);
116
117 TEST_ASSERT( mpi_cmp_mpi( &X, &Y ) == 0 );
118}
119END_CASE
120
121BEGIN_CASE
122mpi_lsb:radix_X:input_X:nr_bits
123{
124 mpi X;
125 mpi_init(&X, NULL);
126
127 TEST_ASSERT( mpi_read_string( &X, {radix_X}, {input_X} ) == 0 );
128 TEST_ASSERT( mpi_lsb( &X ) == {nr_bits} );
129}
130END_CASE
131
132BEGIN_CASE
133mpi_msb:radix_X:input_X:nr_bits
134{
135 mpi X;
136 mpi_init(&X, NULL);
137
138 TEST_ASSERT( mpi_read_string( &X, {radix_X}, {input_X} ) == 0 );
139 TEST_ASSERT( mpi_msb( &X ) == {nr_bits} );
Paul Bakker367dae42009-06-28 21:50:27 +0000140}
141END_CASE
142
143BEGIN_CASE
144mpi_gcd:radix_X:input_X:radix_Y:input_Y:radix_A:input_A
145{
146 mpi A, X, Y, Z;
147 mpi_init(&A, &X, &Y, &Z, NULL);
148
149 TEST_ASSERT( mpi_read_string( &X, {radix_X}, {input_X} ) == 0 );
150 TEST_ASSERT( mpi_read_string( &Y, {radix_Y}, {input_Y} ) == 0 );
151 TEST_ASSERT( mpi_read_string( &A, {radix_A}, {input_A} ) == 0 );
152 TEST_ASSERT( mpi_gcd( &Z, &X, &Y ) == 0 );
153 TEST_ASSERT( mpi_cmp_mpi( &Z, &A ) == 0 );
154}
155END_CASE
156
157BEGIN_CASE
158mpi_cmp_int:input_X:input_A:result_CMP
159{
160 mpi X;
161 mpi_init(&X, NULL);
162
163 TEST_ASSERT( mpi_lset( &X, {input_X} ) == 0);
164 TEST_ASSERT( mpi_cmp_int( &X, {input_A} ) == {result_CMP});
165}
166END_CASE
167
168BEGIN_CASE
169mpi_cmp_mpi:radix_X:input_X:radix_Y:input_Y:input_A
170{
171 mpi X, Y;
172 mpi_init(&X, &Y, NULL);
173
174 TEST_ASSERT( mpi_read_string( &X, {radix_X}, {input_X} ) == 0 );
175 TEST_ASSERT( mpi_read_string( &Y, {radix_Y}, {input_Y} ) == 0 );
176 TEST_ASSERT( mpi_cmp_mpi( &X, &Y ) == {input_A} );
177}
178END_CASE
179
180BEGIN_CASE
181mpi_cmp_abs:radix_X:input_X:radix_Y:input_Y:input_A
182{
183 mpi X, Y;
184 mpi_init(&X, &Y, NULL);
185
186 TEST_ASSERT( mpi_read_string( &X, {radix_X}, {input_X} ) == 0 );
187 TEST_ASSERT( mpi_read_string( &Y, {radix_Y}, {input_Y} ) == 0 );
188 TEST_ASSERT( mpi_cmp_abs( &X, &Y ) == {input_A} );
189}
190END_CASE
191
192BEGIN_CASE
193mpi_copy:input_X:input_A
194{
195 mpi X, Y, A;
196 mpi_init(&X, &Y, &A, NULL);
197
198 TEST_ASSERT( mpi_lset( &X, {input_X} ) == 0 );
199 TEST_ASSERT( mpi_lset( &Y, {input_A} ) == 0 );
200 TEST_ASSERT( mpi_lset( &A, {input_A} ) == 0 );
201 TEST_ASSERT( mpi_cmp_mpi( &X, &Y ) != 0 );
202 TEST_ASSERT( mpi_cmp_mpi( &Y, &A ) == 0 );
203 TEST_ASSERT( mpi_copy( &Y, &X ) == 0 );
204 TEST_ASSERT( mpi_cmp_mpi( &X, &Y ) == 0 );
205 TEST_ASSERT( mpi_cmp_mpi( &Y, &A ) != 0 );
206}
207END_CASE
208
209BEGIN_CASE
Paul Bakkere896fea2009-07-06 06:40:23 +0000210mpi_copy_self:input_X
211{
212 mpi X;
213 mpi_init(&X, NULL);
214
215 TEST_ASSERT( mpi_lset( &X, {input_X} ) == 0 );
216 TEST_ASSERT( mpi_copy( &X, &X ) == 0 );
217 TEST_ASSERT( mpi_cmp_int( &X, {input_X} ) == 0 );
218}
219END_CASE
220
221BEGIN_CASE
Paul Bakker367dae42009-06-28 21:50:27 +0000222mpi_swap:input_X:input_Y
223{
224 mpi X, Y, A;
225 mpi_init(&X, &Y, &A, NULL);
226
227 TEST_ASSERT( mpi_lset( &X, {input_X} ) == 0 );
228 TEST_ASSERT( mpi_lset( &Y, {input_Y} ) == 0 );
229 TEST_ASSERT( mpi_lset( &A, {input_X} ) == 0 );
230 TEST_ASSERT( mpi_cmp_mpi( &X, &Y ) != 0 );
231 TEST_ASSERT( mpi_cmp_mpi( &X, &A ) == 0 );
232 mpi_swap( &X, &Y );
233 TEST_ASSERT( mpi_cmp_mpi( &X, &Y ) != 0 );
234 TEST_ASSERT( mpi_cmp_mpi( &Y, &A ) == 0 );
235}
236END_CASE
237
238BEGIN_CASE
239mpi_add_mpi:radix_X:input_X:radix_Y:input_Y:radix_A:input_A
240{
241 mpi X, Y, Z, A;
242 mpi_init(&X, &Y, &Z, &A, NULL);
243
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_read_string( &A, {radix_A}, {input_A} ) == 0 );
247 TEST_ASSERT( mpi_add_mpi( &Z, &X, &Y ) == 0 );
248 TEST_ASSERT( mpi_cmp_mpi( &Z, &A ) == 0 );
249}
250END_CASE
251
252BEGIN_CASE
253mpi_add_abs:radix_X:input_X:radix_Y:input_Y:radix_A:input_A
254{
255 mpi X, Y, Z, A;
256 mpi_init(&X, &Y, &Z, &A, NULL);
257
258 TEST_ASSERT( mpi_read_string( &X, {radix_X}, {input_X} ) == 0 );
259 TEST_ASSERT( mpi_read_string( &Y, {radix_Y}, {input_Y} ) == 0 );
260 TEST_ASSERT( mpi_read_string( &A, {radix_A}, {input_A} ) == 0 );
261 TEST_ASSERT( mpi_add_abs( &Z, &X, &Y ) == 0 );
262 TEST_ASSERT( mpi_cmp_mpi( &Z, &A ) == 0 );
263}
264END_CASE
265
266BEGIN_CASE
267mpi_add_int:radix_X:input_X:input_Y:radix_A:input_A
268{
269 mpi X, Z, A;
270 mpi_init(&X, &Z, &A, NULL);
271
272 TEST_ASSERT( mpi_read_string( &X, {radix_X}, {input_X} ) == 0 );
273 TEST_ASSERT( mpi_read_string( &A, {radix_A}, {input_A} ) == 0 );
274 TEST_ASSERT( mpi_add_int( &Z, &X, {input_Y} ) == 0 );
275 TEST_ASSERT( mpi_cmp_mpi( &Z, &A ) == 0 );
276}
277END_CASE
278
279BEGIN_CASE
280mpi_sub_mpi:radix_X:input_X:radix_Y:input_Y:radix_A:input_A
281{
282 mpi X, Y, Z, A;
283 mpi_init(&X, &Y, &Z, &A, NULL);
284
285 TEST_ASSERT( mpi_read_string( &X, {radix_X}, {input_X} ) == 0 );
286 TEST_ASSERT( mpi_read_string( &Y, {radix_Y}, {input_Y} ) == 0 );
287 TEST_ASSERT( mpi_read_string( &A, {radix_A}, {input_A} ) == 0 );
288 TEST_ASSERT( mpi_sub_mpi( &Z, &X, &Y ) == 0 );
289 TEST_ASSERT( mpi_cmp_mpi( &Z, &A ) == 0 );
290}
291END_CASE
292
293BEGIN_CASE
294mpi_sub_abs:radix_X:input_X:radix_Y:input_Y:radix_A:input_A:sub_result
295{
296 mpi X, Y, Z, A;
297 int res;
298 mpi_init(&X, &Y, &Z, &A, NULL);
299
300 TEST_ASSERT( mpi_read_string( &X, {radix_X}, {input_X} ) == 0 );
301 TEST_ASSERT( mpi_read_string( &Y, {radix_Y}, {input_Y} ) == 0 );
302 TEST_ASSERT( mpi_read_string( &A, {radix_A}, {input_A} ) == 0 );
303
304 res = mpi_sub_abs( &Z, &X, &Y );
305 TEST_ASSERT( res == {sub_result} );
306 if( res == 0 )
307 TEST_ASSERT( mpi_cmp_mpi( &Z, &A ) == 0 );
308}
309END_CASE
310
311BEGIN_CASE
312mpi_sub_int:radix_X:input_X:input_Y:radix_A:input_A
313{
314 mpi X, Z, A;
315 mpi_init(&X, &Z, &A, NULL);
316
317 TEST_ASSERT( mpi_read_string( &X, {radix_X}, {input_X} ) == 0 );
318 TEST_ASSERT( mpi_read_string( &A, {radix_A}, {input_A} ) == 0 );
319 TEST_ASSERT( mpi_sub_int( &Z, &X, {input_Y} ) == 0 );
320 TEST_ASSERT( mpi_cmp_mpi( &Z, &A ) == 0 );
321}
322END_CASE
323
324BEGIN_CASE
325mpi_mul_mpi:radix_X:input_X:radix_Y:input_Y:radix_A:input_A
326{
327 mpi X, Y, Z, A;
328 mpi_init(&X, &Y, &Z, &A, NULL);
329
330 TEST_ASSERT( mpi_read_string( &X, {radix_X}, {input_X} ) == 0 );
331 TEST_ASSERT( mpi_read_string( &Y, {radix_Y}, {input_Y} ) == 0 );
332 TEST_ASSERT( mpi_read_string( &A, {radix_A}, {input_A} ) == 0 );
333 TEST_ASSERT( mpi_mul_mpi( &Z, &X, &Y ) == 0 );
334 TEST_ASSERT( mpi_cmp_mpi( &Z, &A ) == 0 );
335}
336END_CASE
337
338BEGIN_CASE
339mpi_mul_int:radix_X:input_X:input_Y:radix_A:input_A:result_comparison
340{
341 mpi X, Z, A;
342 mpi_init(&X, &Z, &A, NULL);
343
344 TEST_ASSERT( mpi_read_string( &X, {radix_X}, {input_X} ) == 0 );
345 TEST_ASSERT( mpi_read_string( &A, {radix_A}, {input_A} ) == 0 );
346 TEST_ASSERT( mpi_mul_int( &Z, &X, {input_Y} ) == 0 );
347 TEST_ASSERT( mpi_cmp_mpi( &Z, &A ) {result_comparison} 0 );
348}
349END_CASE
350
351BEGIN_CASE
352mpi_div_mpi:radix_X:input_X:radix_Y:input_Y:radix_A:input_A:radix_B:input_B:div_result
353{
354 mpi X, Y, Q, R, A, B;
355 int res;
356 mpi_init(&X, &Y, &Q, &R, &A, &B, NULL);
357
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_read_string( &B, {radix_B}, {input_B} ) == 0 );
362 res = mpi_div_mpi( &Q, &R, &X, &Y );
363 TEST_ASSERT( res == {div_result} );
364 if( res == 0 )
365 {
366 TEST_ASSERT( mpi_cmp_mpi( &Q, &A ) == 0 );
367 TEST_ASSERT( mpi_cmp_mpi( &R, &B ) == 0 );
368 }
369}
370END_CASE
371
372BEGIN_CASE
373mpi_div_int:radix_X:input_X:input_Y:radix_A:input_A:radix_B:input_B:div_result
374{
375 mpi X, Q, R, A, B;
376 int res;
377 mpi_init(&X, &Q, &R, &A, &B, NULL);
378
379 TEST_ASSERT( mpi_read_string( &X, {radix_X}, {input_X} ) == 0 );
380 TEST_ASSERT( mpi_read_string( &A, {radix_A}, {input_A} ) == 0 );
381 TEST_ASSERT( mpi_read_string( &B, {radix_B}, {input_B} ) == 0 );
382 res = mpi_div_int( &Q, &R, &X, {input_Y} );
383 TEST_ASSERT( res == {div_result} );
384 if( res == 0 )
385 {
386 TEST_ASSERT( mpi_cmp_mpi( &Q, &A ) == 0 );
387 TEST_ASSERT( mpi_cmp_mpi( &R, &B ) == 0 );
388 }
389}
390END_CASE
391
392BEGIN_CASE
393mpi_mod_mpi:radix_X:input_X:radix_Y:input_Y:radix_A:input_A:div_result
394{
395 mpi X, Y, Z, A;
396 int res;
397 mpi_init(&X, &Y, &Z, &A, NULL);
398
399 TEST_ASSERT( mpi_read_string( &X, {radix_X}, {input_X} ) == 0 );
400 TEST_ASSERT( mpi_read_string( &Y, {radix_Y}, {input_Y} ) == 0 );
401 TEST_ASSERT( mpi_read_string( &A, {radix_A}, {input_A} ) == 0 );
402 res = mpi_mod_mpi( &Z, &X, &Y );
403 TEST_ASSERT( res == {div_result} );
404 if( res == 0 )
405 {
406 TEST_ASSERT( mpi_cmp_mpi( &Z, &A ) == 0 );
407 }
408}
409END_CASE
410
411BEGIN_CASE
412mpi_mod_int:radix_X:input_X:input_Y:input_A:div_result
413{
414 mpi X;
415 int res;
416 t_int r;
417 mpi_init(&X, NULL);
418
419 TEST_ASSERT( mpi_read_string( &X, {radix_X}, {input_X} ) == 0 );
420 res = mpi_mod_int( &r, &X, {input_Y} );
421 TEST_ASSERT( res == {div_result} );
422 if( res == 0 )
423 {
424 TEST_ASSERT( r == {input_A} );
425 }
426}
427END_CASE
428
429BEGIN_CASE
430mpi_exp_mod:radix_A:input_A:radix_E:input_E:radix_N:input_N:radix_RR:input_RR:radix_X:input_X:div_result
431{
432 mpi A, E, N, RR, Z, X;
433 int res;
434 mpi_init(&A, &E, &N, &RR, &Z, &X, NULL);
435
436 TEST_ASSERT( mpi_read_string( &A, {radix_A}, {input_A} ) == 0 );
437 TEST_ASSERT( mpi_read_string( &E, {radix_E}, {input_E} ) == 0 );
438 TEST_ASSERT( mpi_read_string( &N, {radix_N}, {input_N} ) == 0 );
439 TEST_ASSERT( mpi_read_string( &X, {radix_X}, {input_X} ) == 0 );
440
441 if( strlen( {input_RR} ) )
442 TEST_ASSERT( mpi_read_string( &RR, {radix_RR}, {input_RR} ) == 0 );
443
444 res = mpi_exp_mod( &Z, &A, &E, &N, &RR );
445 TEST_ASSERT( res == {div_result} );
446 if( res == 0 )
447 {
448 TEST_ASSERT( mpi_cmp_mpi( &Z, &X ) == 0 );
449 }
450}
451END_CASE
452
453BEGIN_CASE
454mpi_inv_mod:radix_X:input_X:radix_Y:input_Y:radix_A:input_A:div_result
455{
456 mpi X, Y, Z, A;
457 int res;
458 mpi_init(&X, &Y, &Z, &A, NULL);
459
460 TEST_ASSERT( mpi_read_string( &X, {radix_X}, {input_X} ) == 0 );
461 TEST_ASSERT( mpi_read_string( &Y, {radix_Y}, {input_Y} ) == 0 );
462 TEST_ASSERT( mpi_read_string( &A, {radix_A}, {input_A} ) == 0 );
463 res = mpi_inv_mod( &Z, &X, &Y );
464 TEST_ASSERT( res == {div_result} );
465 if( res == 0 )
466 {
467 TEST_ASSERT( mpi_cmp_mpi( &Z, &A ) == 0 );
468 }
469}
470END_CASE
471
472BEGIN_CASE
473mpi_is_prime:radix_X:input_X:div_result
474{
475 mpi X;
476 int res;
477 mpi_init(&X, NULL);
478
479 TEST_ASSERT( mpi_read_string( &X, {radix_X}, {input_X} ) == 0 );
480 res = mpi_is_prime( &X, myrand, NULL );
481 TEST_ASSERT( res == {div_result} );
482}
483END_CASE
484
485BEGIN_CASE
486mpi_shift_l:radix_X:input_X:shift_X:radix_A:input_A
487{
488 mpi X, A;
489 mpi_init(&X, &A, NULL);
490
491 TEST_ASSERT( mpi_read_string( &X, {radix_X}, {input_X} ) == 0 );
492 TEST_ASSERT( mpi_read_string( &A, {radix_A}, {input_A} ) == 0 );
493 TEST_ASSERT( mpi_shift_l( &X, {shift_X} ) == 0 );
494 TEST_ASSERT( mpi_cmp_mpi( &X, &A ) == 0 );
495}
496END_CASE
497
498BEGIN_CASE
499mpi_shift_r:radix_X:input_X:shift_X:radix_A:input_A
500{
501 mpi X, A;
502 mpi_init(&X, &A, NULL);
503
504 TEST_ASSERT( mpi_read_string( &X, {radix_X}, {input_X} ) == 0 );
505 TEST_ASSERT( mpi_read_string( &A, {radix_A}, {input_A} ) == 0 );
506 TEST_ASSERT( mpi_shift_r( &X, {shift_X} ) == 0 );
507 TEST_ASSERT( mpi_cmp_mpi( &X, &A ) == 0 );
508}
509END_CASE
510
Paul Bakkere896fea2009-07-06 06:40:23 +0000511BEGIN_CASE
512mpi_selftest:
513{
514 TEST_ASSERT( mpi_self_test( 0 ) == 0 );
515}
516END_CASE
Paul Bakker367dae42009-06-28 21:50:27 +0000517/* Helper Code
518 char str[1000];
519 int len = 1000;
520 mpi_write_string(&Z, 10, str, &len);
521 printf("Z: %d %s\n", Z.s, str);
522 TEST_ASSERT( mpi_cmp_mpi( &Z, &A ) == 0 );
523*/