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