PolarSSL v1.2.5
test_suite_mpi.c
Go to the documentation of this file.
1 #include "fct.h"
2 
3 #include <polarssl/bignum.h>
4 
5 #include <polarssl/config.h>
6 
7 #ifdef _MSC_VER
8 #include <basetsd.h>
9 typedef UINT32 uint32_t;
10 #else
11 #include <inttypes.h>
12 #endif
13 
14 /*
15  * 32-bit integer manipulation macros (big endian)
16  */
17 #ifndef GET_UINT32_BE
18 #define GET_UINT32_BE(n,b,i) \
19 { \
20  (n) = ( (uint32_t) (b)[(i) ] << 24 ) \
21  | ( (uint32_t) (b)[(i) + 1] << 16 ) \
22  | ( (uint32_t) (b)[(i) + 2] << 8 ) \
23  | ( (uint32_t) (b)[(i) + 3] ); \
24 }
25 #endif
26 
27 #ifndef PUT_UINT32_BE
28 #define PUT_UINT32_BE(n,b,i) \
29 { \
30  (b)[(i) ] = (unsigned char) ( (n) >> 24 ); \
31  (b)[(i) + 1] = (unsigned char) ( (n) >> 16 ); \
32  (b)[(i) + 2] = (unsigned char) ( (n) >> 8 ); \
33  (b)[(i) + 3] = (unsigned char) ( (n) ); \
34 }
35 #endif
36 
37 int unhexify(unsigned char *obuf, const char *ibuf)
38 {
39  unsigned char c, c2;
40  int len = strlen(ibuf) / 2;
41  assert(!(strlen(ibuf) %1)); // must be even number of bytes
42 
43  while (*ibuf != 0)
44  {
45  c = *ibuf++;
46  if( c >= '0' && c <= '9' )
47  c -= '0';
48  else if( c >= 'a' && c <= 'f' )
49  c -= 'a' - 10;
50  else if( c >= 'A' && c <= 'F' )
51  c -= 'A' - 10;
52  else
53  assert( 0 );
54 
55  c2 = *ibuf++;
56  if( c2 >= '0' && c2 <= '9' )
57  c2 -= '0';
58  else if( c2 >= 'a' && c2 <= 'f' )
59  c2 -= 'a' - 10;
60  else if( c2 >= 'A' && c2 <= 'F' )
61  c2 -= 'A' - 10;
62  else
63  assert( 0 );
64 
65  *obuf++ = ( c << 4 ) | c2;
66  }
67 
68  return len;
69 }
70 
71 void hexify(unsigned char *obuf, const unsigned char *ibuf, int len)
72 {
73  unsigned char l, h;
74 
75  while (len != 0)
76  {
77  h = (*ibuf) / 16;
78  l = (*ibuf) % 16;
79 
80  if( h < 10 )
81  *obuf++ = '0' + h;
82  else
83  *obuf++ = 'a' + h - 10;
84 
85  if( l < 10 )
86  *obuf++ = '0' + l;
87  else
88  *obuf++ = 'a' + l - 10;
89 
90  ++ibuf;
91  len--;
92  }
93 }
94 
104 static int rnd_std_rand( void *rng_state, unsigned char *output, size_t len )
105 {
106  size_t i;
107 
108  if( rng_state != NULL )
109  rng_state = NULL;
110 
111  for( i = 0; i < len; ++i )
112  output[i] = rand();
113 
114  return( 0 );
115 }
116 
122 static int rnd_zero_rand( void *rng_state, unsigned char *output, size_t len )
123 {
124  if( rng_state != NULL )
125  rng_state = NULL;
126 
127  memset( output, 0, len );
128 
129  return( 0 );
130 }
131 
132 typedef struct
133 {
134  unsigned char *buf;
135  size_t length;
136 } rnd_buf_info;
137 
149 static int rnd_buffer_rand( void *rng_state, unsigned char *output, size_t len )
150 {
151  rnd_buf_info *info = (rnd_buf_info *) rng_state;
152  size_t use_len;
153 
154  if( rng_state == NULL )
155  return( rnd_std_rand( NULL, output, len ) );
156 
157  use_len = len;
158  if( len > info->length )
159  use_len = info->length;
160 
161  if( use_len )
162  {
163  memcpy( output, info->buf, use_len );
164  info->buf += use_len;
165  info->length -= use_len;
166  }
167 
168  if( len - use_len > 0 )
169  return( rnd_std_rand( NULL, output + use_len, len - use_len ) );
170 
171  return( 0 );
172 }
173 
181 typedef struct
182 {
183  uint32_t key[16];
184  uint32_t v0, v1;
186 
195 static int rnd_pseudo_rand( void *rng_state, unsigned char *output, size_t len )
196 {
197  rnd_pseudo_info *info = (rnd_pseudo_info *) rng_state;
198  uint32_t i, *k, sum, delta=0x9E3779B9;
199  unsigned char result[4];
200 
201  if( rng_state == NULL )
202  return( rnd_std_rand( NULL, output, len ) );
203 
204  k = info->key;
205 
206  while( len > 0 )
207  {
208  size_t use_len = ( len > 4 ) ? 4 : len;
209  sum = 0;
210 
211  for( i = 0; i < 32; i++ )
212  {
213  info->v0 += (((info->v1 << 4) ^ (info->v1 >> 5)) + info->v1) ^ (sum + k[sum & 3]);
214  sum += delta;
215  info->v1 += (((info->v0 << 4) ^ (info->v0 >> 5)) + info->v0) ^ (sum + k[(sum>>11) & 3]);
216  }
217 
218  PUT_UINT32_BE( info->v0, result, 0 );
219  memcpy( output, result, use_len );
220  len -= use_len;
221  }
222 
223  return( 0 );
224 }
225 
226 
228 {
229 #ifdef POLARSSL_BIGNUM_C
230 
231 
232  FCT_SUITE_BGN(test_suite_mpi)
233  {
234 
235  FCT_TEST_BGN(base_test_mpi_read_write_string_1)
236  {
237  mpi X;
238  char str[1000];
239  size_t len = 100;
240 
241  mpi_init( &X );
242 
243  fct_chk( mpi_read_string( &X, 10, "128" ) == 0 );
244  if( 0 == 0 )
245  {
246  fct_chk( mpi_write_string( &X, 10, str, &len ) == 0 );
247  if( 0 == 0 )
248  {
249  fct_chk( strcasecmp( str, "128" ) == 0 );
250  }
251  }
252 
253  mpi_free( &X );
254  }
255  FCT_TEST_END();
256 
257 
258  FCT_TEST_BGN(base_test_mpi_read_write_string_2)
259  {
260  mpi X;
261  char str[1000];
262  size_t len = 100;
263 
264  mpi_init( &X );
265 
266  fct_chk( mpi_read_string( &X, 10, "128" ) == 0 );
267  if( 0 == 0 )
268  {
269  fct_chk( mpi_write_string( &X, 16, str, &len ) == 0 );
270  if( 0 == 0 )
271  {
272  fct_chk( strcasecmp( str, "80" ) == 0 );
273  }
274  }
275 
276  mpi_free( &X );
277  }
278  FCT_TEST_END();
279 
280 
281  FCT_TEST_BGN(base_test_mpi_read_write_string_3_read_zero)
282  {
283  mpi X;
284  char str[1000];
285  size_t len = 100;
286 
287  mpi_init( &X );
288 
289  fct_chk( mpi_read_string( &X, 10, "0" ) == 0 );
290  if( 0 == 0 )
291  {
292  fct_chk( mpi_write_string( &X, 10, str, &len ) == 0 );
293  if( 0 == 0 )
294  {
295  fct_chk( strcasecmp( str, "0" ) == 0 );
296  }
297  }
298 
299  mpi_free( &X );
300  }
301  FCT_TEST_END();
302 
303 
304  FCT_TEST_BGN(base_test_mpi_read_write_string_3_negative_decimal)
305  {
306  mpi X;
307  char str[1000];
308  size_t len = 100;
309 
310  mpi_init( &X );
311 
312  fct_chk( mpi_read_string( &X, 10, "-23" ) == 0 );
313  if( 0 == 0 )
314  {
315  fct_chk( mpi_write_string( &X, 10, str, &len ) == 0 );
316  if( 0 == 0 )
317  {
318  fct_chk( strcasecmp( str, "-23" ) == 0 );
319  }
320  }
321 
322  mpi_free( &X );
323  }
324  FCT_TEST_END();
325 
326 
327  FCT_TEST_BGN(base_test_mpi_read_write_string_3_negative_hex)
328  {
329  mpi X;
330  char str[1000];
331  size_t len = 100;
332 
333  mpi_init( &X );
334 
335  fct_chk( mpi_read_string( &X, 16, "-20" ) == 0 );
336  if( 0 == 0 )
337  {
338  fct_chk( mpi_write_string( &X, 10, str, &len ) == 0 );
339  if( 0 == 0 )
340  {
341  fct_chk( strcasecmp( str, "-32" ) == 0 );
342  }
343  }
344 
345  mpi_free( &X );
346  }
347  FCT_TEST_END();
348 
349 
350  FCT_TEST_BGN(base_test_mpi_read_write_string_3_negative_decimal)
351  {
352  mpi X;
353  char str[1000];
354  size_t len = 100;
355 
356  mpi_init( &X );
357 
358  fct_chk( mpi_read_string( &X, 16, "-23" ) == 0 );
359  if( 0 == 0 )
360  {
361  fct_chk( mpi_write_string( &X, 16, str, &len ) == 0 );
362  if( 0 == 0 )
363  {
364  fct_chk( strcasecmp( str, "-23" ) == 0 );
365  }
366  }
367 
368  mpi_free( &X );
369  }
370  FCT_TEST_END();
371 
372 
373  FCT_TEST_BGN(test_mpi_read_write_string_1_invalid_character)
374  {
375  mpi X;
376  char str[1000];
377  size_t len = 100;
378 
379  mpi_init( &X );
380 
381  fct_chk( mpi_read_string( &X, 10, "a28" ) == POLARSSL_ERR_MPI_INVALID_CHARACTER );
383  {
384  fct_chk( mpi_write_string( &X, 0, str, &len ) == 0 );
385  if( 0 == 0 )
386  {
387  fct_chk( strcasecmp( str, "" ) == 0 );
388  }
389  }
390 
391  mpi_free( &X );
392  }
393  FCT_TEST_END();
394 
395 
396  FCT_TEST_BGN(test_mpi_read_write_string_2_illegal_input_radix)
397  {
398  mpi X;
399  char str[1000];
400  size_t len = 100;
401 
402  mpi_init( &X );
403 
404  fct_chk( mpi_read_string( &X, 19, "a28" ) == POLARSSL_ERR_MPI_BAD_INPUT_DATA );
406  {
407  fct_chk( mpi_write_string( &X, 0, str, &len ) == 0 );
408  if( 0 == 0 )
409  {
410  fct_chk( strcasecmp( str, "" ) == 0 );
411  }
412  }
413 
414  mpi_free( &X );
415  }
416  FCT_TEST_END();
417 
418 
419  FCT_TEST_BGN(test_mpi_read_write_string_3_buffer_just_fits)
420  {
421  mpi X;
422  char str[1000];
423  size_t len = 4;
424 
425  mpi_init( &X );
426 
427  fct_chk( mpi_read_string( &X, 16, "-23" ) == 0 );
428  if( 0 == 0 )
429  {
430  fct_chk( mpi_write_string( &X, 16, str, &len ) == 0 );
431  if( 0 == 0 )
432  {
433  fct_chk( strcasecmp( str, "-23" ) == 0 );
434  }
435  }
436 
437  mpi_free( &X );
438  }
439  FCT_TEST_END();
440 
441 
442  FCT_TEST_BGN(test_mpi_read_write_string_4_buffer_too_small)
443  {
444  mpi X;
445  char str[1000];
446  size_t len = 3;
447 
448  mpi_init( &X );
449 
450  fct_chk( mpi_read_string( &X, 16, "-23" ) == 0 );
451  if( 0 == 0 )
452  {
453  fct_chk( mpi_write_string( &X, 16, str, &len ) == POLARSSL_ERR_MPI_BUFFER_TOO_SMALL );
455  {
456  fct_chk( strcasecmp( str, "-23" ) == 0 );
457  }
458  }
459 
460  mpi_free( &X );
461  }
462  FCT_TEST_END();
463 
464 
465  FCT_TEST_BGN(test_mpi_read_write_string_5_illegal_output_radix)
466  {
467  mpi X;
468  char str[1000];
469  size_t len = 4;
470 
471  mpi_init( &X );
472 
473  fct_chk( mpi_read_string( &X, 16, "-23" ) == 0 );
474  if( 0 == 0 )
475  {
476  fct_chk( mpi_write_string( &X, 17, str, &len ) == POLARSSL_ERR_MPI_BAD_INPUT_DATA );
478  {
479  fct_chk( strcasecmp( str, "-23" ) == 0 );
480  }
481  }
482 
483  mpi_free( &X );
484  }
485  FCT_TEST_END();
486 
487 
488  FCT_TEST_BGN(test_mpi_read_write_string_6_output_radix_of_15)
489  {
490  mpi X;
491  char str[1000];
492  size_t len = 100;
493 
494  mpi_init( &X );
495 
496  fct_chk( mpi_read_string( &X, 10, "29" ) == 0 );
497  if( 0 == 0 )
498  {
499  fct_chk( mpi_write_string( &X, 15, str, &len ) == 0 );
500  if( 0 == 0 )
501  {
502  fct_chk( strcasecmp( str, "1e" ) == 0 );
503  }
504  }
505 
506  mpi_free( &X );
507  }
508  FCT_TEST_END();
509 
510 
511  FCT_TEST_BGN(test_mpi_read_write_string_7)
512  {
513  mpi X;
514  char str[1000];
515  size_t len = 200;
516 
517  mpi_init( &X );
518 
519  fct_chk( mpi_read_string( &X, 10, "56125680981752282334141896320372489490613963693556392520816017892111350604111697682705498319512049040516698827829292076808006940873974979584527073481012636016353913462376755556720019831187364993587901952757307830896531678727717924" ) == 0 );
520  if( 0 == 0 )
521  {
522  fct_chk( mpi_write_string( &X, 16, str, &len ) == 0 );
523  if( 0 == 0 )
524  {
525  fct_chk( strcasecmp( str, "0941379d00fed1491fe15df284dfde4a142f68aa8d412023195cee66883e6290ffe703f4ea5963bf212713cee46b107c09182b5edcd955adac418bf4918e2889af48e1099d513830cec85c26ac1e158b52620e33ba8692f893efbb2f958b4424" ) == 0 );
526  }
527  }
528 
529  mpi_free( &X );
530  }
531  FCT_TEST_END();
532 
533 
534  FCT_TEST_BGN(base_test_mpi_read_binary_1)
535  {
536  mpi X;
537  unsigned char str[1000];
538  unsigned char buf[1000];
539  size_t len = 1000;
540  size_t input_len;
541 
542  mpi_init( &X );
543 
544  input_len = unhexify( buf, "0941379d00fed1491fe15df284dfde4a142f68aa8d412023195cee66883e6290ffe703f4ea5963bf212713cee46b107c09182b5edcd955adac418bf4918e2889af48e1099d513830cec85c26ac1e158b52620e33ba8692f893efbb2f958b4424" );
545 
546  fct_chk( mpi_read_binary( &X, buf, input_len ) == 0 );
547  fct_chk( mpi_write_string( &X, 10, (char *) str, &len ) == 0 );
548  fct_chk( strcmp( (char *) str, "56125680981752282334141896320372489490613963693556392520816017892111350604111697682705498319512049040516698827829292076808006940873974979584527073481012636016353913462376755556720019831187364993587901952757307830896531678727717924" ) == 0 );
549 
550  mpi_free( &X );
551  }
552  FCT_TEST_END();
553 
554 
555  FCT_TEST_BGN(base_test_mpi_write_binary_1)
556  {
557  mpi X;
558  unsigned char str[1000];
559  unsigned char buf[1000];
560  size_t buflen;
561 
562  memset( buf, 0x00, 1000 );
563  memset( str, 0x00, 1000 );
564 
565  mpi_init( &X );
566 
567  fct_chk( mpi_read_string( &X, 10, "56125680981752282334141896320372489490613963693556392520816017892111350604111697682705498319512049040516698827829292076808006940873974979584527073481012636016353913462376755556720019831187364993587901952757307830896531678727717924" ) == 0 );
568 
569  buflen = mpi_size( &X );
570  if( buflen > 200 )
571  buflen = 200;
572 
573  fct_chk( mpi_write_binary( &X, buf, buflen ) == 0 );
574  if( 0 == 0)
575  {
576  hexify( str, buf, buflen );
577 
578  fct_chk( strcasecmp( (char *) str, "0941379d00fed1491fe15df284dfde4a142f68aa8d412023195cee66883e6290ffe703f4ea5963bf212713cee46b107c09182b5edcd955adac418bf4918e2889af48e1099d513830cec85c26ac1e158b52620e33ba8692f893efbb2f958b4424" ) == 0 );
579  }
580 
581  mpi_free( &X );
582  }
583  FCT_TEST_END();
584 
585 
586  FCT_TEST_BGN(test_mpi_write_binary_1_buffer_just_fits)
587  {
588  mpi X;
589  unsigned char str[1000];
590  unsigned char buf[1000];
591  size_t buflen;
592 
593  memset( buf, 0x00, 1000 );
594  memset( str, 0x00, 1000 );
595 
596  mpi_init( &X );
597 
598  fct_chk( mpi_read_string( &X, 16, "123123123123123123123123123" ) == 0 );
599 
600  buflen = mpi_size( &X );
601  if( buflen > 14 )
602  buflen = 14;
603 
604  fct_chk( mpi_write_binary( &X, buf, buflen ) == 0 );
605  if( 0 == 0)
606  {
607  hexify( str, buf, buflen );
608 
609  fct_chk( strcasecmp( (char *) str, "0123123123123123123123123123" ) == 0 );
610  }
611 
612  mpi_free( &X );
613  }
614  FCT_TEST_END();
615 
616 
617  FCT_TEST_BGN(test_mpi_write_binary_2_buffer_too_small)
618  {
619  mpi X;
620  unsigned char str[1000];
621  unsigned char buf[1000];
622  size_t buflen;
623 
624  memset( buf, 0x00, 1000 );
625  memset( str, 0x00, 1000 );
626 
627  mpi_init( &X );
628 
629  fct_chk( mpi_read_string( &X, 16, "123123123123123123123123123" ) == 0 );
630 
631  buflen = mpi_size( &X );
632  if( buflen > 13 )
633  buflen = 13;
634 
635  fct_chk( mpi_write_binary( &X, buf, buflen ) == POLARSSL_ERR_MPI_BUFFER_TOO_SMALL );
637  {
638  hexify( str, buf, buflen );
639 
640  fct_chk( strcasecmp( (char *) str, "123123123123123123123123123" ) == 0 );
641  }
642 
643  mpi_free( &X );
644  }
645  FCT_TEST_END();
646 
647 #ifdef POLARSSL_FS_IO
648 
649  FCT_TEST_BGN(base_test_mpi_read_file_1)
650  {
651  mpi X;
652  unsigned char str[1000];
653  unsigned char buf[1000];
654  size_t buflen;
655  FILE *file;
656 
657  memset( buf, 0x00, 1000 );
658  memset( str, 0x00, 1000 );
659 
660  mpi_init( &X );
661 
662  file = fopen( "data_files/mpi_10", "r" );
663  fct_chk( mpi_read_file( &X, 10, file ) == 0 );
664  fclose(file);
665 
666  if( 0 == 0 )
667  {
668  buflen = mpi_size( &X );
669  fct_chk( mpi_write_binary( &X, buf, buflen ) == 0 );
670 
671  hexify( str, buf, buflen );
672 
673  fct_chk( strcasecmp( (char *) str, "01f55332c3a48b910f9942f6c914e58bef37a47ee45cb164a5b6b8d1006bf59a059c21449939ebebfdf517d2e1dbac88010d7b1f141e997bd6801ddaec9d05910f4f2de2b2c4d714e2c14a72fc7f17aa428d59c531627f09" ) == 0 );
674  }
675 
676  mpi_free( &X );
677  }
678  FCT_TEST_END();
679 #endif /* POLARSSL_FS_IO */
680 
681 #ifdef POLARSSL_FS_IO
682 
683  FCT_TEST_BGN(test_mpi_read_file_1_empty_file)
684  {
685  mpi X;
686  unsigned char str[1000];
687  unsigned char buf[1000];
688  size_t buflen;
689  FILE *file;
690 
691  memset( buf, 0x00, 1000 );
692  memset( str, 0x00, 1000 );
693 
694  mpi_init( &X );
695 
696  file = fopen( "data_files/hash_file_4", "r" );
697  fct_chk( mpi_read_file( &X, 10, file ) == POLARSSL_ERR_MPI_FILE_IO_ERROR );
698  fclose(file);
699 
701  {
702  buflen = mpi_size( &X );
703  fct_chk( mpi_write_binary( &X, buf, buflen ) == 0 );
704 
705  hexify( str, buf, buflen );
706 
707  fct_chk( strcasecmp( (char *) str, "" ) == 0 );
708  }
709 
710  mpi_free( &X );
711  }
712  FCT_TEST_END();
713 #endif /* POLARSSL_FS_IO */
714 
715 #ifdef POLARSSL_FS_IO
716 
717  FCT_TEST_BGN(test_mpi_read_file_2_illegal_input)
718  {
719  mpi X;
720  unsigned char str[1000];
721  unsigned char buf[1000];
722  size_t buflen;
723  FILE *file;
724 
725  memset( buf, 0x00, 1000 );
726  memset( str, 0x00, 1000 );
727 
728  mpi_init( &X );
729 
730  file = fopen( "data_files/hash_file_3", "r" );
731  fct_chk( mpi_read_file( &X, 10, file ) == 0 );
732  fclose(file);
733 
734  if( 0 == 0 )
735  {
736  buflen = mpi_size( &X );
737  fct_chk( mpi_write_binary( &X, buf, buflen ) == 0 );
738 
739  hexify( str, buf, buflen );
740 
741  fct_chk( strcasecmp( (char *) str, "" ) == 0 );
742  }
743 
744  mpi_free( &X );
745  }
746  FCT_TEST_END();
747 #endif /* POLARSSL_FS_IO */
748 
749 #ifdef POLARSSL_FS_IO
750 
751  FCT_TEST_BGN(test_mpi_read_file_3_input_too_big)
752  {
753  mpi X;
754  unsigned char str[1000];
755  unsigned char buf[1000];
756  size_t buflen;
757  FILE *file;
758 
759  memset( buf, 0x00, 1000 );
760  memset( str, 0x00, 1000 );
761 
762  mpi_init( &X );
763 
764  file = fopen( "data_files/mpi_too_big", "r" );
765  fct_chk( mpi_read_file( &X, 10, file ) == POLARSSL_ERR_MPI_BUFFER_TOO_SMALL );
766  fclose(file);
767 
769  {
770  buflen = mpi_size( &X );
771  fct_chk( mpi_write_binary( &X, buf, buflen ) == 0 );
772 
773  hexify( str, buf, buflen );
774 
775  fct_chk( strcasecmp( (char *) str, "" ) == 0 );
776  }
777 
778  mpi_free( &X );
779  }
780  FCT_TEST_END();
781 #endif /* POLARSSL_FS_IO */
782 
783 #ifdef POLARSSL_FS_IO
784 
785  FCT_TEST_BGN(base_test_mpi_write_file_1)
786  {
787  mpi X, Y;
788  FILE *file_out, *file_in;
789 
790  mpi_init( &X ); mpi_init( &Y );
791 
792  fct_chk( mpi_read_string( &X, 10, "56125680981752282334141896320372489490613963693556392520816017892111350604111697682705498319512049040516698827829292076808006940873974979584527073481012636016353913462376755556720019831187364993587901952757307830896531678727717924" ) == 0 );
793 
794  file_out = fopen( "data_files/mpi_write", "w" );
795  fct_chk( file_out != NULL );
796  fct_chk( mpi_write_file( NULL, &X, 16, file_out ) == 0 );
797  fclose(file_out);
798 
799  file_in = fopen( "data_files/mpi_write", "r" );
800  fct_chk( file_in != NULL );
801  fct_chk( mpi_read_file( &Y, 16, file_in ) == 0 );
802  fclose(file_in);
803 
804  fct_chk( mpi_cmp_mpi( &X, &Y ) == 0 );
805 
806  mpi_free( &X ); mpi_free( &Y );
807  }
808  FCT_TEST_END();
809 #endif /* POLARSSL_FS_IO */
810 
811 
812  FCT_TEST_BGN(base_test_mpi_lsb_1)
813  {
814  mpi X;
815  mpi_init( &X );
816 
817  fct_chk( mpi_read_string( &X, 10, "56125680981752282334141896320372489490613963693556392520816017892111350604111697682705498319512049040516698827829292076808006940873974979584527073481012636016353913462376755556720019831187364993587901952757307830896531678727717924" ) == 0 );
818  fct_chk( mpi_lsb( &X ) == 2 );
819 
820  mpi_free( &X );
821  }
822  FCT_TEST_END();
823 
824 
825  FCT_TEST_BGN(base_test_mpi_lsb_2)
826  {
827  mpi X;
828  mpi_init( &X );
829 
830  fct_chk( mpi_read_string( &X, 10, "24" ) == 0 );
831  fct_chk( mpi_lsb( &X ) == 3 );
832 
833  mpi_free( &X );
834  }
835  FCT_TEST_END();
836 
837 
838  FCT_TEST_BGN(base_test_mpi_lsb_3)
839  {
840  mpi X;
841  mpi_init( &X );
842 
843  fct_chk( mpi_read_string( &X, 16, "24" ) == 0 );
844  fct_chk( mpi_lsb( &X ) == 2 );
845 
846  mpi_free( &X );
847  }
848  FCT_TEST_END();
849 
850 
851  FCT_TEST_BGN(base_test_mpi_lsb_4)
852  {
853  mpi X;
854  mpi_init( &X );
855 
856  fct_chk( mpi_read_string( &X, 16, "2000" ) == 0 );
857  fct_chk( mpi_lsb( &X ) == 13 );
858 
859  mpi_free( &X );
860  }
861  FCT_TEST_END();
862 
863 
864  FCT_TEST_BGN(base_test_mpi_msb_1)
865  {
866  mpi X;
867  mpi_init( &X );
868 
869  fct_chk( mpi_read_string( &X, 10, "56125680981752282334141896320372489490613963693556392520816017892111350604111697682705498319512049040516698827829292076808006940873974979584527073481012636016353913462376755556720019831187364993587901952757307830896531678727717924" ) == 0 );
870  fct_chk( mpi_msb( &X ) == 764 );
871 
872  mpi_free( &X );
873  }
874  FCT_TEST_END();
875 
876 
877  FCT_TEST_BGN(base_test_mpi_msb_2)
878  {
879  mpi X;
880  mpi_init( &X );
881 
882  fct_chk( mpi_read_string( &X, 10, "24" ) == 0 );
883  fct_chk( mpi_msb( &X ) == 5 );
884 
885  mpi_free( &X );
886  }
887  FCT_TEST_END();
888 
889 
890  FCT_TEST_BGN(base_test_mpi_msb_3)
891  {
892  mpi X;
893  mpi_init( &X );
894 
895  fct_chk( mpi_read_string( &X, 10, "1" ) == 0 );
896  fct_chk( mpi_msb( &X ) == 1 );
897 
898  mpi_free( &X );
899  }
900  FCT_TEST_END();
901 
902 
903  FCT_TEST_BGN(base_test_mpi_msb_4)
904  {
905  mpi X;
906  mpi_init( &X );
907 
908  fct_chk( mpi_read_string( &X, 10, "15" ) == 0 );
909  fct_chk( mpi_msb( &X ) == 4 );
910 
911  mpi_free( &X );
912  }
913  FCT_TEST_END();
914 
915 
916  FCT_TEST_BGN(base_test_mpi_msb_5)
917  {
918  mpi X;
919  mpi_init( &X );
920 
921  fct_chk( mpi_read_string( &X, 10, "16" ) == 0 );
922  fct_chk( mpi_msb( &X ) == 5 );
923 
924  mpi_free( &X );
925  }
926  FCT_TEST_END();
927 
928 
929  FCT_TEST_BGN(base_test_mpi_msb_6)
930  {
931  mpi X;
932  mpi_init( &X );
933 
934  fct_chk( mpi_read_string( &X, 10, "10" ) == 0 );
935  fct_chk( mpi_msb( &X ) == 4 );
936 
937  mpi_free( &X );
938  }
939  FCT_TEST_END();
940 
941 
942  FCT_TEST_BGN(base_test_mpi_msb_7)
943  {
944  mpi X;
945  mpi_init( &X );
946 
947  fct_chk( mpi_read_string( &X, 10, "0" ) == 0 );
948  fct_chk( mpi_msb( &X ) == 0 );
949 
950  mpi_free( &X );
951  }
952  FCT_TEST_END();
953 
954 
955  FCT_TEST_BGN(base_test_mpi_cmp_int_1)
956  {
957  mpi X;
958  mpi_init( &X );
959 
960  fct_chk( mpi_lset( &X, 693 ) == 0);
961  fct_chk( mpi_cmp_int( &X, 693 ) == 0);
962 
963  mpi_free( &X );
964  }
965  FCT_TEST_END();
966 
967 
968  FCT_TEST_BGN(base_test_mpi_cmp_int_2)
969  {
970  mpi X;
971  mpi_init( &X );
972 
973  fct_chk( mpi_lset( &X, 693 ) == 0);
974  fct_chk( mpi_cmp_int( &X, 692 ) == 1);
975 
976  mpi_free( &X );
977  }
978  FCT_TEST_END();
979 
980 
981  FCT_TEST_BGN(base_test_mpi_cmp_int_3)
982  {
983  mpi X;
984  mpi_init( &X );
985 
986  fct_chk( mpi_lset( &X, 693 ) == 0);
987  fct_chk( mpi_cmp_int( &X, 694 ) == -1);
988 
989  mpi_free( &X );
990  }
991  FCT_TEST_END();
992 
993 
994  FCT_TEST_BGN(base_test_mpi_cmp_int_negative_values_1)
995  {
996  mpi X;
997  mpi_init( &X );
998 
999  fct_chk( mpi_lset( &X, -2 ) == 0);
1000  fct_chk( mpi_cmp_int( &X, -2 ) == 0);
1001 
1002  mpi_free( &X );
1003  }
1004  FCT_TEST_END();
1005 
1006 
1007  FCT_TEST_BGN(base_test_mpi_cmp_int_negative_values_2)
1008  {
1009  mpi X;
1010  mpi_init( &X );
1011 
1012  fct_chk( mpi_lset( &X, -2 ) == 0);
1013  fct_chk( mpi_cmp_int( &X, -3 ) == 1);
1014 
1015  mpi_free( &X );
1016  }
1017  FCT_TEST_END();
1018 
1019 
1020  FCT_TEST_BGN(base_test_mpi_cmp_int_negative_values_3)
1021  {
1022  mpi X;
1023  mpi_init( &X );
1024 
1025  fct_chk( mpi_lset( &X, -2 ) == 0);
1026  fct_chk( mpi_cmp_int( &X, -1 ) == -1);
1027 
1028  mpi_free( &X );
1029  }
1030  FCT_TEST_END();
1031 
1032 
1033  FCT_TEST_BGN(base_test_mpi_cmp_mpi_1)
1034  {
1035  mpi X, Y;
1036  mpi_init( &X ); mpi_init( &Y );
1037 
1038  fct_chk( mpi_read_string( &X, 10, "693" ) == 0 );
1039  fct_chk( mpi_read_string( &Y, 10, "693" ) == 0 );
1040  fct_chk( mpi_cmp_mpi( &X, &Y ) == 0 );
1041 
1042  mpi_free( &X ); mpi_free( &Y );
1043  }
1044  FCT_TEST_END();
1045 
1046 
1047  FCT_TEST_BGN(base_test_mpi_cmp_mpi_2)
1048  {
1049  mpi X, Y;
1050  mpi_init( &X ); mpi_init( &Y );
1051 
1052  fct_chk( mpi_read_string( &X, 10, "693" ) == 0 );
1053  fct_chk( mpi_read_string( &Y, 10, "692" ) == 0 );
1054  fct_chk( mpi_cmp_mpi( &X, &Y ) == 1 );
1055 
1056  mpi_free( &X ); mpi_free( &Y );
1057  }
1058  FCT_TEST_END();
1059 
1060 
1061  FCT_TEST_BGN(base_test_mpi_cmp_mpi_3)
1062  {
1063  mpi X, Y;
1064  mpi_init( &X ); mpi_init( &Y );
1065 
1066  fct_chk( mpi_read_string( &X, 10, "693" ) == 0 );
1067  fct_chk( mpi_read_string( &Y, 10, "694" ) == 0 );
1068  fct_chk( mpi_cmp_mpi( &X, &Y ) == -1 );
1069 
1070  mpi_free( &X ); mpi_free( &Y );
1071  }
1072  FCT_TEST_END();
1073 
1074 
1075  FCT_TEST_BGN(base_test_mpi_cmp_mpi_negative_values_1)
1076  {
1077  mpi X, Y;
1078  mpi_init( &X ); mpi_init( &Y );
1079 
1080  fct_chk( mpi_read_string( &X, 10, "-2" ) == 0 );
1081  fct_chk( mpi_read_string( &Y, 10, "-2" ) == 0 );
1082  fct_chk( mpi_cmp_mpi( &X, &Y ) == 0 );
1083 
1084  mpi_free( &X ); mpi_free( &Y );
1085  }
1086  FCT_TEST_END();
1087 
1088 
1089  FCT_TEST_BGN(base_test_mpi_cmp_mpi_negative_values_2)
1090  {
1091  mpi X, Y;
1092  mpi_init( &X ); mpi_init( &Y );
1093 
1094  fct_chk( mpi_read_string( &X, 10, "-2" ) == 0 );
1095  fct_chk( mpi_read_string( &Y, 10, "-3" ) == 0 );
1096  fct_chk( mpi_cmp_mpi( &X, &Y ) == 1 );
1097 
1098  mpi_free( &X ); mpi_free( &Y );
1099  }
1100  FCT_TEST_END();
1101 
1102 
1103  FCT_TEST_BGN(base_test_mpi_cmp_mpi_negative_values_3)
1104  {
1105  mpi X, Y;
1106  mpi_init( &X ); mpi_init( &Y );
1107 
1108  fct_chk( mpi_read_string( &X, 10, "-2" ) == 0 );
1109  fct_chk( mpi_read_string( &Y, 10, "-1" ) == 0 );
1110  fct_chk( mpi_cmp_mpi( &X, &Y ) == -1 );
1111 
1112  mpi_free( &X ); mpi_free( &Y );
1113  }
1114  FCT_TEST_END();
1115 
1116 
1117  FCT_TEST_BGN(base_test_mpi_cmp_mpi_mixed_values_4)
1118  {
1119  mpi X, Y;
1120  mpi_init( &X ); mpi_init( &Y );
1121 
1122  fct_chk( mpi_read_string( &X, 10, "-3" ) == 0 );
1123  fct_chk( mpi_read_string( &Y, 10, "2" ) == 0 );
1124  fct_chk( mpi_cmp_mpi( &X, &Y ) == -1 );
1125 
1126  mpi_free( &X ); mpi_free( &Y );
1127  }
1128  FCT_TEST_END();
1129 
1130 
1131  FCT_TEST_BGN(base_test_mpi_cmp_mpi_mixed_values_5)
1132  {
1133  mpi X, Y;
1134  mpi_init( &X ); mpi_init( &Y );
1135 
1136  fct_chk( mpi_read_string( &X, 10, "2" ) == 0 );
1137  fct_chk( mpi_read_string( &Y, 10, "-3" ) == 0 );
1138  fct_chk( mpi_cmp_mpi( &X, &Y ) == 1 );
1139 
1140  mpi_free( &X ); mpi_free( &Y );
1141  }
1142  FCT_TEST_END();
1143 
1144 
1145  FCT_TEST_BGN(base_test_mpi_cmp_mpi_mixed_values_6)
1146  {
1147  mpi X, Y;
1148  mpi_init( &X ); mpi_init( &Y );
1149 
1150  fct_chk( mpi_read_string( &X, 10, "-2" ) == 0 );
1151  fct_chk( mpi_read_string( &Y, 10, "31231231289798" ) == 0 );
1152  fct_chk( mpi_cmp_mpi( &X, &Y ) == -1 );
1153 
1154  mpi_free( &X ); mpi_free( &Y );
1155  }
1156  FCT_TEST_END();
1157 
1158 
1159  FCT_TEST_BGN(base_test_mpi_cmp_abs_1)
1160  {
1161  mpi X, Y;
1162  mpi_init( &X ); mpi_init( &Y );
1163 
1164  fct_chk( mpi_read_string( &X, 10, "693" ) == 0 );
1165  fct_chk( mpi_read_string( &Y, 10, "693" ) == 0 );
1166  fct_chk( mpi_cmp_abs( &X, &Y ) == 0 );
1167 
1168  mpi_free( &X ); mpi_free( &Y );
1169  }
1170  FCT_TEST_END();
1171 
1172 
1173  FCT_TEST_BGN(base_test_mpi_cmp_abs_2)
1174  {
1175  mpi X, Y;
1176  mpi_init( &X ); mpi_init( &Y );
1177 
1178  fct_chk( mpi_read_string( &X, 10, "693" ) == 0 );
1179  fct_chk( mpi_read_string( &Y, 10, "692" ) == 0 );
1180  fct_chk( mpi_cmp_abs( &X, &Y ) == 1 );
1181 
1182  mpi_free( &X ); mpi_free( &Y );
1183  }
1184  FCT_TEST_END();
1185 
1186 
1187  FCT_TEST_BGN(base_test_mpi_cmp_abs_3)
1188  {
1189  mpi X, Y;
1190  mpi_init( &X ); mpi_init( &Y );
1191 
1192  fct_chk( mpi_read_string( &X, 10, "693" ) == 0 );
1193  fct_chk( mpi_read_string( &Y, 10, "694" ) == 0 );
1194  fct_chk( mpi_cmp_abs( &X, &Y ) == -1 );
1195 
1196  mpi_free( &X ); mpi_free( &Y );
1197  }
1198  FCT_TEST_END();
1199 
1200 
1201  FCT_TEST_BGN(base_test_mpi_cmp_abs_negative_values_1)
1202  {
1203  mpi X, Y;
1204  mpi_init( &X ); mpi_init( &Y );
1205 
1206  fct_chk( mpi_read_string( &X, 10, "-2" ) == 0 );
1207  fct_chk( mpi_read_string( &Y, 10, "-2" ) == 0 );
1208  fct_chk( mpi_cmp_abs( &X, &Y ) == 0 );
1209 
1210  mpi_free( &X ); mpi_free( &Y );
1211  }
1212  FCT_TEST_END();
1213 
1214 
1215  FCT_TEST_BGN(base_test_mpi_cmp_abs_negative_values_2)
1216  {
1217  mpi X, Y;
1218  mpi_init( &X ); mpi_init( &Y );
1219 
1220  fct_chk( mpi_read_string( &X, 10, "-2" ) == 0 );
1221  fct_chk( mpi_read_string( &Y, 10, "-3" ) == 0 );
1222  fct_chk( mpi_cmp_abs( &X, &Y ) == -1 );
1223 
1224  mpi_free( &X ); mpi_free( &Y );
1225  }
1226  FCT_TEST_END();
1227 
1228 
1229  FCT_TEST_BGN(base_test_mpi_cmp_abs_negative_values_3)
1230  {
1231  mpi X, Y;
1232  mpi_init( &X ); mpi_init( &Y );
1233 
1234  fct_chk( mpi_read_string( &X, 10, "-2" ) == 0 );
1235  fct_chk( mpi_read_string( &Y, 10, "-1" ) == 0 );
1236  fct_chk( mpi_cmp_abs( &X, &Y ) == 1 );
1237 
1238  mpi_free( &X ); mpi_free( &Y );
1239  }
1240  FCT_TEST_END();
1241 
1242 
1243  FCT_TEST_BGN(base_test_mpi_cmp_abs_zero_and_zero_4)
1244  {
1245  mpi X, Y;
1246  mpi_init( &X ); mpi_init( &Y );
1247 
1248  fct_chk( mpi_read_string( &X, 10, "0" ) == 0 );
1249  fct_chk( mpi_read_string( &Y, 10, "0" ) == 0 );
1250  fct_chk( mpi_cmp_abs( &X, &Y ) == 0 );
1251 
1252  mpi_free( &X ); mpi_free( &Y );
1253  }
1254  FCT_TEST_END();
1255 
1256 
1257  FCT_TEST_BGN(base_test_mpi_cmp_abs_mix_values_1)
1258  {
1259  mpi X, Y;
1260  mpi_init( &X ); mpi_init( &Y );
1261 
1262  fct_chk( mpi_read_string( &X, 10, "-2" ) == 0 );
1263  fct_chk( mpi_read_string( &Y, 10, "2" ) == 0 );
1264  fct_chk( mpi_cmp_abs( &X, &Y ) == 0 );
1265 
1266  mpi_free( &X ); mpi_free( &Y );
1267  }
1268  FCT_TEST_END();
1269 
1270 
1271  FCT_TEST_BGN(base_test_mpi_cmp_abs_mix_values_2)
1272  {
1273  mpi X, Y;
1274  mpi_init( &X ); mpi_init( &Y );
1275 
1276  fct_chk( mpi_read_string( &X, 10, "2" ) == 0 );
1277  fct_chk( mpi_read_string( &Y, 10, "-3" ) == 0 );
1278  fct_chk( mpi_cmp_abs( &X, &Y ) == -1 );
1279 
1280  mpi_free( &X ); mpi_free( &Y );
1281  }
1282  FCT_TEST_END();
1283 
1284 
1285  FCT_TEST_BGN(base_test_mpi_cmp_abs_mix_values_3)
1286  {
1287  mpi X, Y;
1288  mpi_init( &X ); mpi_init( &Y );
1289 
1290  fct_chk( mpi_read_string( &X, 10, "-2" ) == 0 );
1291  fct_chk( mpi_read_string( &Y, 10, "1" ) == 0 );
1292  fct_chk( mpi_cmp_abs( &X, &Y ) == 1 );
1293 
1294  mpi_free( &X ); mpi_free( &Y );
1295  }
1296  FCT_TEST_END();
1297 
1298 
1299  FCT_TEST_BGN(base_test_mpi_copy_1)
1300  {
1301  mpi X, Y, A;
1302  mpi_init( &X ); mpi_init( &Y ); mpi_init( &A );
1303 
1304  fct_chk( mpi_lset( &X, 0 ) == 0 );
1305  fct_chk( mpi_lset( &Y, 1500 ) == 0 );
1306  fct_chk( mpi_lset( &A, 1500 ) == 0 );
1307  fct_chk( mpi_cmp_mpi( &X, &Y ) != 0 );
1308  fct_chk( mpi_cmp_mpi( &Y, &A ) == 0 );
1309  fct_chk( mpi_copy( &Y, &X ) == 0 );
1310  fct_chk( mpi_cmp_mpi( &X, &Y ) == 0 );
1311  fct_chk( mpi_cmp_mpi( &Y, &A ) != 0 );
1312 
1313  mpi_free( &X ); mpi_free( &Y ); mpi_free( &A );
1314  }
1315  FCT_TEST_END();
1316 
1317 
1318  FCT_TEST_BGN(base_test_mpi_copy_self_1)
1319  {
1320  mpi X;
1321  mpi_init( &X );
1322 
1323  fct_chk( mpi_lset( &X, 14 ) == 0 );
1324  fct_chk( mpi_copy( &X, &X ) == 0 );
1325  fct_chk( mpi_cmp_int( &X, 14 ) == 0 );
1326 
1327  mpi_free( &X );
1328  }
1329  FCT_TEST_END();
1330 
1331 
1332  FCT_TEST_BGN(base_test_mpi_swap_1)
1333  {
1334  mpi X, Y, A;
1335  mpi_init( &X ); mpi_init( &Y ); mpi_init( &A );
1336 
1337  fct_chk( mpi_lset( &X, 0 ) == 0 );
1338  fct_chk( mpi_lset( &Y, 1500 ) == 0 );
1339  fct_chk( mpi_lset( &A, 0 ) == 0 );
1340  fct_chk( mpi_cmp_mpi( &X, &Y ) != 0 );
1341  fct_chk( mpi_cmp_mpi( &X, &A ) == 0 );
1342  mpi_swap( &X, &Y );
1343  fct_chk( mpi_cmp_mpi( &X, &Y ) != 0 );
1344  fct_chk( mpi_cmp_mpi( &Y, &A ) == 0 );
1345 
1346  mpi_free( &X ); mpi_free( &Y ); mpi_free( &A );
1347  }
1348  FCT_TEST_END();
1349 
1350 
1351  FCT_TEST_BGN(base_test_mpi_add_abs_1)
1352  {
1353  mpi X, Y, Z, A;
1354  mpi_init( &X ); mpi_init( &Y ); mpi_init( &Z ); mpi_init( &A );
1355 
1356  fct_chk( mpi_read_string( &X, 10, "12345678" ) == 0 );
1357  fct_chk( mpi_read_string( &Y, 10, "642531" ) == 0 );
1358  fct_chk( mpi_read_string( &A, 10, "12988209" ) == 0 );
1359  fct_chk( mpi_add_abs( &Z, &X, &Y ) == 0 );
1360  fct_chk( mpi_cmp_mpi( &Z, &A ) == 0 );
1361 
1362  mpi_free( &X ); mpi_free( &Y ); mpi_free( &Z ); mpi_free( &A );
1363  }
1364  FCT_TEST_END();
1365 
1366 
1367  FCT_TEST_BGN(base_test_mpi_add_abs_2)
1368  {
1369  mpi X, Y, Z, A;
1370  mpi_init( &X ); mpi_init( &Y ); mpi_init( &Z ); mpi_init( &A );
1371 
1372  fct_chk( mpi_read_string( &X, 10, "-12345678" ) == 0 );
1373  fct_chk( mpi_read_string( &Y, 10, "642531" ) == 0 );
1374  fct_chk( mpi_read_string( &A, 10, "12988209" ) == 0 );
1375  fct_chk( mpi_add_abs( &Z, &X, &Y ) == 0 );
1376  fct_chk( mpi_cmp_mpi( &Z, &A ) == 0 );
1377 
1378  mpi_free( &X ); mpi_free( &Y ); mpi_free( &Z ); mpi_free( &A );
1379  }
1380  FCT_TEST_END();
1381 
1382 
1383  FCT_TEST_BGN(base_test_mpi_add_abs_3)
1384  {
1385  mpi X, Y, Z, A;
1386  mpi_init( &X ); mpi_init( &Y ); mpi_init( &Z ); mpi_init( &A );
1387 
1388  fct_chk( mpi_read_string( &X, 10, "12345678" ) == 0 );
1389  fct_chk( mpi_read_string( &Y, 10, "-642531" ) == 0 );
1390  fct_chk( mpi_read_string( &A, 10, "12988209" ) == 0 );
1391  fct_chk( mpi_add_abs( &Z, &X, &Y ) == 0 );
1392  fct_chk( mpi_cmp_mpi( &Z, &A ) == 0 );
1393 
1394  mpi_free( &X ); mpi_free( &Y ); mpi_free( &Z ); mpi_free( &A );
1395  }
1396  FCT_TEST_END();
1397 
1398 
1399  FCT_TEST_BGN(base_test_mpi_add_abs_4)
1400  {
1401  mpi X, Y, Z, A;
1402  mpi_init( &X ); mpi_init( &Y ); mpi_init( &Z ); mpi_init( &A );
1403 
1404  fct_chk( mpi_read_string( &X, 10, "-12345678" ) == 0 );
1405  fct_chk( mpi_read_string( &Y, 10, "-642531" ) == 0 );
1406  fct_chk( mpi_read_string( &A, 10, "12988209" ) == 0 );
1407  fct_chk( mpi_add_abs( &Z, &X, &Y ) == 0 );
1408  fct_chk( mpi_cmp_mpi( &Z, &A ) == 0 );
1409 
1410  mpi_free( &X ); mpi_free( &Y ); mpi_free( &Z ); mpi_free( &A );
1411  }
1412  FCT_TEST_END();
1413 
1414 
1415  FCT_TEST_BGN(test_mpi_add_abs_1)
1416  {
1417  mpi X, Y, Z, A;
1418  mpi_init( &X ); mpi_init( &Y ); mpi_init( &Z ); mpi_init( &A );
1419 
1420  fct_chk( mpi_read_string( &X, 10, "-643808006803554439230129854961492699151386107534013432918073439524138264842370630061369715394739134090922937332590384720397133335969549256322620979036686633213903952966175107096769180017646161851573147596390153" ) == 0 );
1421  fct_chk( mpi_read_string( &Y, 10, "56125680981752282333498088313568935051383833838594899821664631784577337171193624243181360054669678410455329112434552942717084003541384594864129940145043086760031292483340068923506115878221189886491132772739661669044958531131327771" ) == 0 );
1422  fct_chk( mpi_read_string( &A, 10, "56125680981752282334141896320372489490613963693556392520816017892111350604111697682705498319512049040516698827829292076808006940873974979584527073481012636016353913462376755556720019831187364993587901952757307830896531678727717924" ) == 0 );
1423  fct_chk( mpi_add_abs( &Z, &X, &Y ) == 0 );
1424  fct_chk( mpi_cmp_mpi( &Z, &A ) == 0 );
1425 
1426  mpi_free( &X ); mpi_free( &Y ); mpi_free( &Z ); mpi_free( &A );
1427  }
1428  FCT_TEST_END();
1429 
1430 
1431  FCT_TEST_BGN(test_mpi_add_abs_2_add_to_first_value)
1432  {
1433  mpi X, Y, A;
1434  mpi_init( &X ); mpi_init( &Y ); mpi_init( &A );
1435 
1436  fct_chk( mpi_read_string( &X, 10, "123123" ) == 0 );
1437  fct_chk( mpi_read_string( &Y, 10, "123123" ) == 0 );
1438  fct_chk( mpi_read_string( &A, 10, "246246" ) == 0 );
1439  fct_chk( mpi_add_abs( &X, &X, &Y ) == 0 );
1440  fct_chk( mpi_cmp_mpi( &X, &A ) == 0 );
1441 
1442  mpi_free( &X ); mpi_free( &Y ); mpi_free( &A );
1443  }
1444  FCT_TEST_END();
1445 
1446 
1447  FCT_TEST_BGN(test_mpi_add_abs_3_add_to_second_value)
1448  {
1449  mpi X, Y, A;
1450  mpi_init( &X ); mpi_init( &Y ); mpi_init( &A );
1451 
1452  fct_chk( mpi_read_string( &X, 10, "123123" ) == 0 );
1453  fct_chk( mpi_read_string( &Y, 10, "123123" ) == 0 );
1454  fct_chk( mpi_read_string( &A, 10, "246246" ) == 0 );
1455  fct_chk( mpi_add_abs( &Y, &X, &Y ) == 0 );
1456  fct_chk( mpi_cmp_mpi( &Y, &A ) == 0 );
1457 
1458  mpi_free( &X ); mpi_free( &Y ); mpi_free( &A );
1459  }
1460  FCT_TEST_END();
1461 
1462 
1463  FCT_TEST_BGN(regression_mpi_add_abs_add_small_to_very_large_mpi_with_carry_rollover)
1464  {
1465  mpi X, Y, Z, A;
1466  mpi_init( &X ); mpi_init( &Y ); mpi_init( &Z ); mpi_init( &A );
1467 
1468  fct_chk( mpi_read_string( &X, 16, "FFFFFFFFFFFFFFFFFFFFFFFFFFFFF8" ) == 0 );
1469  fct_chk( mpi_read_string( &Y, 16, "08" ) == 0 );
1470  fct_chk( mpi_read_string( &A, 16, "1000000000000000000000000000000" ) == 0 );
1471  fct_chk( mpi_add_abs( &Z, &X, &Y ) == 0 );
1472  fct_chk( mpi_cmp_mpi( &Z, &A ) == 0 );
1473 
1474  mpi_free( &X ); mpi_free( &Y ); mpi_free( &Z ); mpi_free( &A );
1475  }
1476  FCT_TEST_END();
1477 
1478 
1479  FCT_TEST_BGN(regression_mpi_add_abs_add_small_to_very_large_mpi_with_carry_rollover)
1480  {
1481  mpi X, Y, Z, A;
1482  mpi_init( &X ); mpi_init( &Y ); mpi_init( &Z ); mpi_init( &A );
1483 
1484  fct_chk( mpi_read_string( &X, 16, "08" ) == 0 );
1485  fct_chk( mpi_read_string( &Y, 16, "FFFFFFFFFFFFFFFFFFFFFFFFFFFFF8" ) == 0 );
1486  fct_chk( mpi_read_string( &A, 16, "1000000000000000000000000000000" ) == 0 );
1487  fct_chk( mpi_add_abs( &Z, &X, &Y ) == 0 );
1488  fct_chk( mpi_cmp_mpi( &Z, &A ) == 0 );
1489 
1490  mpi_free( &X ); mpi_free( &Y ); mpi_free( &Z ); mpi_free( &A );
1491  }
1492  FCT_TEST_END();
1493 
1494 
1495  FCT_TEST_BGN(base_test_mpi_add_mpi_1)
1496  {
1497  mpi X, Y, Z, A;
1498  mpi_init( &X ); mpi_init( &Y ); mpi_init( &Z ); mpi_init( &A );
1499 
1500  fct_chk( mpi_read_string( &X, 10, "12345678" ) == 0 );
1501  fct_chk( mpi_read_string( &Y, 10, "642531" ) == 0 );
1502  fct_chk( mpi_read_string( &A, 10, "12988209" ) == 0 );
1503  fct_chk( mpi_add_mpi( &Z, &X, &Y ) == 0 );
1504  fct_chk( mpi_cmp_mpi( &Z, &A ) == 0 );
1505 
1506  mpi_free( &X ); mpi_free( &Y ); mpi_free( &Z ); mpi_free( &A );
1507  }
1508  FCT_TEST_END();
1509 
1510 
1511  FCT_TEST_BGN(base_test_mpi_add_mpi_2)
1512  {
1513  mpi X, Y, Z, A;
1514  mpi_init( &X ); mpi_init( &Y ); mpi_init( &Z ); mpi_init( &A );
1515 
1516  fct_chk( mpi_read_string( &X, 10, "-12345678" ) == 0 );
1517  fct_chk( mpi_read_string( &Y, 10, "642531" ) == 0 );
1518  fct_chk( mpi_read_string( &A, 10, "-11703147" ) == 0 );
1519  fct_chk( mpi_add_mpi( &Z, &X, &Y ) == 0 );
1520  fct_chk( mpi_cmp_mpi( &Z, &A ) == 0 );
1521 
1522  mpi_free( &X ); mpi_free( &Y ); mpi_free( &Z ); mpi_free( &A );
1523  }
1524  FCT_TEST_END();
1525 
1526 
1527  FCT_TEST_BGN(base_test_mpi_add_mpi_3)
1528  {
1529  mpi X, Y, Z, A;
1530  mpi_init( &X ); mpi_init( &Y ); mpi_init( &Z ); mpi_init( &A );
1531 
1532  fct_chk( mpi_read_string( &X, 10, "12345678" ) == 0 );
1533  fct_chk( mpi_read_string( &Y, 10, "-642531" ) == 0 );
1534  fct_chk( mpi_read_string( &A, 10, "11703147" ) == 0 );
1535  fct_chk( mpi_add_mpi( &Z, &X, &Y ) == 0 );
1536  fct_chk( mpi_cmp_mpi( &Z, &A ) == 0 );
1537 
1538  mpi_free( &X ); mpi_free( &Y ); mpi_free( &Z ); mpi_free( &A );
1539  }
1540  FCT_TEST_END();
1541 
1542 
1543  FCT_TEST_BGN(base_test_mpi_add_mpi_4)
1544  {
1545  mpi X, Y, Z, A;
1546  mpi_init( &X ); mpi_init( &Y ); mpi_init( &Z ); mpi_init( &A );
1547 
1548  fct_chk( mpi_read_string( &X, 10, "-12345678" ) == 0 );
1549  fct_chk( mpi_read_string( &Y, 10, "-642531" ) == 0 );
1550  fct_chk( mpi_read_string( &A, 10, "-12988209" ) == 0 );
1551  fct_chk( mpi_add_mpi( &Z, &X, &Y ) == 0 );
1552  fct_chk( mpi_cmp_mpi( &Z, &A ) == 0 );
1553 
1554  mpi_free( &X ); mpi_free( &Y ); mpi_free( &Z ); mpi_free( &A );
1555  }
1556  FCT_TEST_END();
1557 
1558 
1559  FCT_TEST_BGN(test_mpi_add_mpi_1)
1560  {
1561  mpi X, Y, Z, A;
1562  mpi_init( &X ); mpi_init( &Y ); mpi_init( &Z ); mpi_init( &A );
1563 
1564  fct_chk( mpi_read_string( &X, 10, "203956878356401977405765866929034577280193993314348263094772646453283062722701277632936616063144088173312372882677123879538709400158306567338328279154499698366071906766440037074217117805690872792848149112022286332144876183376326512083574821647933992961249917319836219304274280243803104015000563790123" ) == 0 );
1565  fct_chk( mpi_read_string( &Y, 10, "531872289054204184185084734375133399408303613982130856645299464930952178606045848877129147820387996428175564228204785846141207532462936339834139412401975338705794646595487324365194792822189473092273993580587964571659678084484152603881094176995594813302284232006001752128168901293560051833646881436219" ) == 0 );
1566  fct_chk( mpi_read_string( &A, 10, "735829167410606161590850601304167976688497607296479119740072111384235241328747126510065763883532084601487937110881909725679916932621242907172467691556475037071866553361927361439411910627880345885122142692610250903804554267860479115964668998643528806263534149325837971432443181537363155848647445226342" ) == 0 );
1567  fct_chk( mpi_add_mpi( &Z, &X, &Y ) == 0 );
1568  fct_chk( mpi_cmp_mpi( &Z, &A ) == 0 );
1569 
1570  mpi_free( &X ); mpi_free( &Y ); mpi_free( &Z ); mpi_free( &A );
1571  }
1572  FCT_TEST_END();
1573 
1574 
1575  FCT_TEST_BGN(test_mpi_add_mpi_2)
1576  {
1577  mpi X, Y, Z, A;
1578  mpi_init( &X ); mpi_init( &Y ); mpi_init( &Z ); mpi_init( &A );
1579 
1580  fct_chk( mpi_read_string( &X, 10, "643808006803554439230129854961492699151386107534013432918073439524138264842370630061369715394739134090922937332590384720397133335969549256322620979036686633213903952966175107096769180017646161851573147596390153" ) == 0 );
1581  fct_chk( mpi_read_string( &Y, 10, "56125680981752282333498088313568935051383833838594899821664631784577337171193624243181360054669678410455329112434552942717084003541384594864129940145043086760031292483340068923506115878221189886491132772739661669044958531131327771" ) == 0 );
1582  fct_chk( mpi_read_string( &A, 10, "56125680981752282334141896320372489490613963693556392520816017892111350604111697682705498319512049040516698827829292076808006940873974979584527073481012636016353913462376755556720019831187364993587901952757307830896531678727717924" ) == 0 );
1583  fct_chk( mpi_add_mpi( &Z, &X, &Y ) == 0 );
1584  fct_chk( mpi_cmp_mpi( &Z, &A ) == 0 );
1585 
1586  mpi_free( &X ); mpi_free( &Y ); mpi_free( &Z ); mpi_free( &A );
1587  }
1588  FCT_TEST_END();
1589 
1590 
1591  FCT_TEST_BGN(test_mpi_add_int_1)
1592  {
1593  mpi X, Z, A;
1594  mpi_init( &X ); mpi_init( &Z ); mpi_init( &A );
1595 
1596  fct_chk( mpi_read_string( &X, 10, "2039568783564019774057658669290345772801939933143482630947726464532830627227012776329" ) == 0 );
1597  fct_chk( mpi_read_string( &A, 10, "2039568783564019774057658669290345772801939933143482630947726464532830627227022647561" ) == 0 );
1598  fct_chk( mpi_add_int( &Z, &X, 9871232 ) == 0 );
1599  fct_chk( mpi_cmp_mpi( &Z, &A ) == 0 );
1600 
1601  mpi_free( &X ); mpi_free( &Z ); mpi_free( &A );
1602  }
1603  FCT_TEST_END();
1604 
1605 
1606  FCT_TEST_BGN(test_mpi_add_int_2)
1607  {
1608  mpi X, Z, A;
1609  mpi_init( &X ); mpi_init( &Z ); mpi_init( &A );
1610 
1611  fct_chk( mpi_read_string( &X, 10, "2039568783564019774057658669290345772801939933143482630947726464532830627227012776329" ) == 0 );
1612  fct_chk( mpi_read_string( &A, 10, "2039568783564019774057658669290345772801939933143482630947726464532830627227002905097" ) == 0 );
1613  fct_chk( mpi_add_int( &Z, &X, -9871232 ) == 0 );
1614  fct_chk( mpi_cmp_mpi( &Z, &A ) == 0 );
1615 
1616  mpi_free( &X ); mpi_free( &Z ); mpi_free( &A );
1617  }
1618  FCT_TEST_END();
1619 
1620 
1621  FCT_TEST_BGN(base_test_mpi_sub_abs_1_test_with_larger_second_input)
1622  {
1623  mpi X, Y, Z, A;
1624  int res;
1625  mpi_init( &X ); mpi_init( &Y ); mpi_init( &Z ); mpi_init( &A );
1626 
1627  fct_chk( mpi_read_string( &X, 10, "5" ) == 0 );
1628  fct_chk( mpi_read_string( &Y, 10, "7" ) == 0 );
1629  fct_chk( mpi_read_string( &A, 10, "0" ) == 0 );
1630 
1631  res = mpi_sub_abs( &Z, &X, &Y );
1632  fct_chk( res == POLARSSL_ERR_MPI_NEGATIVE_VALUE );
1633  if( res == 0 )
1634  fct_chk( mpi_cmp_mpi( &Z, &A ) == 0 );
1635 
1636  mpi_free( &X ); mpi_free( &Y ); mpi_free( &Z ); mpi_free( &A );
1637  }
1638  FCT_TEST_END();
1639 
1640 
1641  FCT_TEST_BGN(base_test_mpi_sub_abs_2_test_with_larger_second_input)
1642  {
1643  mpi X, Y, Z, A;
1644  int res;
1645  mpi_init( &X ); mpi_init( &Y ); mpi_init( &Z ); mpi_init( &A );
1646 
1647  fct_chk( mpi_read_string( &X, 10, "-5" ) == 0 );
1648  fct_chk( mpi_read_string( &Y, 10, "-7" ) == 0 );
1649  fct_chk( mpi_read_string( &A, 10, "0" ) == 0 );
1650 
1651  res = mpi_sub_abs( &Z, &X, &Y );
1652  fct_chk( res == POLARSSL_ERR_MPI_NEGATIVE_VALUE );
1653  if( res == 0 )
1654  fct_chk( mpi_cmp_mpi( &Z, &A ) == 0 );
1655 
1656  mpi_free( &X ); mpi_free( &Y ); mpi_free( &Z ); mpi_free( &A );
1657  }
1658  FCT_TEST_END();
1659 
1660 
1661  FCT_TEST_BGN(base_test_mpi_sub_abs_3_test_with_larger_second_input)
1662  {
1663  mpi X, Y, Z, A;
1664  int res;
1665  mpi_init( &X ); mpi_init( &Y ); mpi_init( &Z ); mpi_init( &A );
1666 
1667  fct_chk( mpi_read_string( &X, 10, "-5" ) == 0 );
1668  fct_chk( mpi_read_string( &Y, 10, "7" ) == 0 );
1669  fct_chk( mpi_read_string( &A, 10, "0" ) == 0 );
1670 
1671  res = mpi_sub_abs( &Z, &X, &Y );
1672  fct_chk( res == POLARSSL_ERR_MPI_NEGATIVE_VALUE );
1673  if( res == 0 )
1674  fct_chk( mpi_cmp_mpi( &Z, &A ) == 0 );
1675 
1676  mpi_free( &X ); mpi_free( &Y ); mpi_free( &Z ); mpi_free( &A );
1677  }
1678  FCT_TEST_END();
1679 
1680 
1681  FCT_TEST_BGN(base_test_mpi_sub_abs_4_test_with_larger_second_input)
1682  {
1683  mpi X, Y, Z, A;
1684  int res;
1685  mpi_init( &X ); mpi_init( &Y ); mpi_init( &Z ); mpi_init( &A );
1686 
1687  fct_chk( mpi_read_string( &X, 10, "5" ) == 0 );
1688  fct_chk( mpi_read_string( &Y, 10, "-7" ) == 0 );
1689  fct_chk( mpi_read_string( &A, 10, "0" ) == 0 );
1690 
1691  res = mpi_sub_abs( &Z, &X, &Y );
1692  fct_chk( res == POLARSSL_ERR_MPI_NEGATIVE_VALUE );
1693  if( res == 0 )
1694  fct_chk( mpi_cmp_mpi( &Z, &A ) == 0 );
1695 
1696  mpi_free( &X ); mpi_free( &Y ); mpi_free( &Z ); mpi_free( &A );
1697  }
1698  FCT_TEST_END();
1699 
1700 
1701  FCT_TEST_BGN(base_test_mpi_sub_abs_1)
1702  {
1703  mpi X, Y, Z, A;
1704  int res;
1705  mpi_init( &X ); mpi_init( &Y ); mpi_init( &Z ); mpi_init( &A );
1706 
1707  fct_chk( mpi_read_string( &X, 10, "7" ) == 0 );
1708  fct_chk( mpi_read_string( &Y, 10, "5" ) == 0 );
1709  fct_chk( mpi_read_string( &A, 10, "2" ) == 0 );
1710 
1711  res = mpi_sub_abs( &Z, &X, &Y );
1712  fct_chk( res == 0 );
1713  if( res == 0 )
1714  fct_chk( mpi_cmp_mpi( &Z, &A ) == 0 );
1715 
1716  mpi_free( &X ); mpi_free( &Y ); mpi_free( &Z ); mpi_free( &A );
1717  }
1718  FCT_TEST_END();
1719 
1720 
1721  FCT_TEST_BGN(base_test_mpi_sub_abs_2)
1722  {
1723  mpi X, Y, Z, A;
1724  int res;
1725  mpi_init( &X ); mpi_init( &Y ); mpi_init( &Z ); mpi_init( &A );
1726 
1727  fct_chk( mpi_read_string( &X, 10, "-7" ) == 0 );
1728  fct_chk( mpi_read_string( &Y, 10, "-5" ) == 0 );
1729  fct_chk( mpi_read_string( &A, 10, "2" ) == 0 );
1730 
1731  res = mpi_sub_abs( &Z, &X, &Y );
1732  fct_chk( res == 0 );
1733  if( res == 0 )
1734  fct_chk( mpi_cmp_mpi( &Z, &A ) == 0 );
1735 
1736  mpi_free( &X ); mpi_free( &Y ); mpi_free( &Z ); mpi_free( &A );
1737  }
1738  FCT_TEST_END();
1739 
1740 
1741  FCT_TEST_BGN(base_test_mpi_sub_abs_3)
1742  {
1743  mpi X, Y, Z, A;
1744  int res;
1745  mpi_init( &X ); mpi_init( &Y ); mpi_init( &Z ); mpi_init( &A );
1746 
1747  fct_chk( mpi_read_string( &X, 10, "-7" ) == 0 );
1748  fct_chk( mpi_read_string( &Y, 10, "5" ) == 0 );
1749  fct_chk( mpi_read_string( &A, 10, "2" ) == 0 );
1750 
1751  res = mpi_sub_abs( &Z, &X, &Y );
1752  fct_chk( res == 0 );
1753  if( res == 0 )
1754  fct_chk( mpi_cmp_mpi( &Z, &A ) == 0 );
1755 
1756  mpi_free( &X ); mpi_free( &Y ); mpi_free( &Z ); mpi_free( &A );
1757  }
1758  FCT_TEST_END();
1759 
1760 
1761  FCT_TEST_BGN(base_test_mpi_sub_abs_4)
1762  {
1763  mpi X, Y, Z, A;
1764  int res;
1765  mpi_init( &X ); mpi_init( &Y ); mpi_init( &Z ); mpi_init( &A );
1766 
1767  fct_chk( mpi_read_string( &X, 10, "7" ) == 0 );
1768  fct_chk( mpi_read_string( &Y, 10, "-5" ) == 0 );
1769  fct_chk( mpi_read_string( &A, 10, "2" ) == 0 );
1770 
1771  res = mpi_sub_abs( &Z, &X, &Y );
1772  fct_chk( res == 0 );
1773  if( res == 0 )
1774  fct_chk( mpi_cmp_mpi( &Z, &A ) == 0 );
1775 
1776  mpi_free( &X ); mpi_free( &Y ); mpi_free( &Z ); mpi_free( &A );
1777  }
1778  FCT_TEST_END();
1779 
1780 
1781  FCT_TEST_BGN(test_mpi_sub_abs_1)
1782  {
1783  mpi X, Y, Z, A;
1784  int res;
1785  mpi_init( &X ); mpi_init( &Y ); mpi_init( &Z ); mpi_init( &A );
1786 
1787  fct_chk( mpi_read_string( &X, 16, "FFFFFFFFFF" ) == 0 );
1788  fct_chk( mpi_read_string( &Y, 16, "01" ) == 0 );
1789  fct_chk( mpi_read_string( &A, 16, "FFFFFFFFFE" ) == 0 );
1790 
1791  res = mpi_sub_abs( &Z, &X, &Y );
1792  fct_chk( res == 0 );
1793  if( res == 0 )
1794  fct_chk( mpi_cmp_mpi( &Z, &A ) == 0 );
1795 
1796  mpi_free( &X ); mpi_free( &Y ); mpi_free( &Z ); mpi_free( &A );
1797  }
1798  FCT_TEST_END();
1799 
1800 
1801  FCT_TEST_BGN(test_mpi_sub_abs_2)
1802  {
1803  mpi X, Y, Z, A;
1804  int res;
1805  mpi_init( &X ); mpi_init( &Y ); mpi_init( &Z ); mpi_init( &A );
1806 
1807  fct_chk( mpi_read_string( &X, 16, "FFFFFFFFF0" ) == 0 );
1808  fct_chk( mpi_read_string( &Y, 16, "01" ) == 0 );
1809  fct_chk( mpi_read_string( &A, 16, "FFFFFFFFEF" ) == 0 );
1810 
1811  res = mpi_sub_abs( &Z, &X, &Y );
1812  fct_chk( res == 0 );
1813  if( res == 0 )
1814  fct_chk( mpi_cmp_mpi( &Z, &A ) == 0 );
1815 
1816  mpi_free( &X ); mpi_free( &Y ); mpi_free( &Z ); mpi_free( &A );
1817  }
1818  FCT_TEST_END();
1819 
1820 
1821  FCT_TEST_BGN(test_mpi_sub_abs_3)
1822  {
1823  mpi X, Y, Z, A;
1824  int res;
1825  mpi_init( &X ); mpi_init( &Y ); mpi_init( &Z ); mpi_init( &A );
1826 
1827  fct_chk( mpi_read_string( &X, 16, "FF00000000" ) == 0 );
1828  fct_chk( mpi_read_string( &Y, 16, "0F00000000" ) == 0 );
1829  fct_chk( mpi_read_string( &A, 16, "F000000000" ) == 0 );
1830 
1831  res = mpi_sub_abs( &Z, &X, &Y );
1832  fct_chk( res == 0 );
1833  if( res == 0 )
1834  fct_chk( mpi_cmp_mpi( &Z, &A ) == 0 );
1835 
1836  mpi_free( &X ); mpi_free( &Y ); mpi_free( &Z ); mpi_free( &A );
1837  }
1838  FCT_TEST_END();
1839 
1840 
1841  FCT_TEST_BGN(test_mpi_sub_abs_4)
1842  {
1843  mpi X, Y, Z, A;
1844  int res;
1845  mpi_init( &X ); mpi_init( &Y ); mpi_init( &Z ); mpi_init( &A );
1846 
1847  fct_chk( mpi_read_string( &X, 16, "FF00000000" ) == 0 );
1848  fct_chk( mpi_read_string( &Y, 16, "0F00000001" ) == 0 );
1849  fct_chk( mpi_read_string( &A, 16, "EFFFFFFFFF" ) == 0 );
1850 
1851  res = mpi_sub_abs( &Z, &X, &Y );
1852  fct_chk( res == 0 );
1853  if( res == 0 )
1854  fct_chk( mpi_cmp_mpi( &Z, &A ) == 0 );
1855 
1856  mpi_free( &X ); mpi_free( &Y ); mpi_free( &Z ); mpi_free( &A );
1857  }
1858  FCT_TEST_END();
1859 
1860 
1861  FCT_TEST_BGN(base_test_mpi_sub_mpi_1_test_with_negative_result)
1862  {
1863  mpi X, Y, Z, A;
1864  mpi_init( &X ); mpi_init( &Y ); mpi_init( &Z ); mpi_init( &A );
1865 
1866  fct_chk( mpi_read_string( &X, 10, "5" ) == 0 );
1867  fct_chk( mpi_read_string( &Y, 10, "7" ) == 0 );
1868  fct_chk( mpi_read_string( &A, 10, "-2" ) == 0 );
1869  fct_chk( mpi_sub_mpi( &Z, &X, &Y ) == 0 );
1870  fct_chk( mpi_cmp_mpi( &Z, &A ) == 0 );
1871 
1872  mpi_free( &X ); mpi_free( &Y ); mpi_free( &Z ); mpi_free( &A );
1873  }
1874  FCT_TEST_END();
1875 
1876 
1877  FCT_TEST_BGN(base_test_mpi_sub_mpi_2_test_with_negative_inputs)
1878  {
1879  mpi X, Y, Z, A;
1880  mpi_init( &X ); mpi_init( &Y ); mpi_init( &Z ); mpi_init( &A );
1881 
1882  fct_chk( mpi_read_string( &X, 10, "-5" ) == 0 );
1883  fct_chk( mpi_read_string( &Y, 10, "-7" ) == 0 );
1884  fct_chk( mpi_read_string( &A, 10, "2" ) == 0 );
1885  fct_chk( mpi_sub_mpi( &Z, &X, &Y ) == 0 );
1886  fct_chk( mpi_cmp_mpi( &Z, &A ) == 0 );
1887 
1888  mpi_free( &X ); mpi_free( &Y ); mpi_free( &Z ); mpi_free( &A );
1889  }
1890  FCT_TEST_END();
1891 
1892 
1893  FCT_TEST_BGN(base_test_mpi_sub_mpi_3_test_with_negative_base)
1894  {
1895  mpi X, Y, Z, A;
1896  mpi_init( &X ); mpi_init( &Y ); mpi_init( &Z ); mpi_init( &A );
1897 
1898  fct_chk( mpi_read_string( &X, 10, "-5" ) == 0 );
1899  fct_chk( mpi_read_string( &Y, 10, "7" ) == 0 );
1900  fct_chk( mpi_read_string( &A, 10, "-12" ) == 0 );
1901  fct_chk( mpi_sub_mpi( &Z, &X, &Y ) == 0 );
1902  fct_chk( mpi_cmp_mpi( &Z, &A ) == 0 );
1903 
1904  mpi_free( &X ); mpi_free( &Y ); mpi_free( &Z ); mpi_free( &A );
1905  }
1906  FCT_TEST_END();
1907 
1908 
1909  FCT_TEST_BGN(base_test_mpi_sub_mpi_4_test_with_negative_substraction)
1910  {
1911  mpi X, Y, Z, A;
1912  mpi_init( &X ); mpi_init( &Y ); mpi_init( &Z ); mpi_init( &A );
1913 
1914  fct_chk( mpi_read_string( &X, 10, "5" ) == 0 );
1915  fct_chk( mpi_read_string( &Y, 10, "-7" ) == 0 );
1916  fct_chk( mpi_read_string( &A, 10, "12" ) == 0 );
1917  fct_chk( mpi_sub_mpi( &Z, &X, &Y ) == 0 );
1918  fct_chk( mpi_cmp_mpi( &Z, &A ) == 0 );
1919 
1920  mpi_free( &X ); mpi_free( &Y ); mpi_free( &Z ); mpi_free( &A );
1921  }
1922  FCT_TEST_END();
1923 
1924 
1925  FCT_TEST_BGN(test_mpi_sub_mpi_1)
1926  {
1927  mpi X, Y, Z, A;
1928  mpi_init( &X ); mpi_init( &Y ); mpi_init( &Z ); mpi_init( &A );
1929 
1930  fct_chk( mpi_read_string( &X, 10, "531872289054204184185084734375133399408303613982130856645299464930952178606045848877129147820387996428175564228204785846141207532462936339834139412401975338705794646595487324365194792822189473092273993580587964571659678084484152603881094176995594813302284232006001752128168901293560051833646881436219" ) == 0 );
1931  fct_chk( mpi_read_string( &Y, 10, "203956878356401977405765866929034577280193993314348263094772646453283062722701277632936616063144088173312372882677123879538709400158306567338328279154499698366071906766440037074217117805690872792848149112022286332144876183376326512083574821647933992961249917319836219304274280243803104015000563790123" ) == 0 );
1932  fct_chk( mpi_read_string( &A, 10, "327915410697802206779318867446098822128109620667782593550526818477669115883344571244192531757243908254863191345527661966602498132304629772495811133247475640339722739829047287290977675016498600299425844468565678239514801901107826091797519355347660820341034314686165532823894621049756947818646317646096" ) == 0 );
1933  fct_chk( mpi_sub_mpi( &Z, &X, &Y ) == 0 );
1934  fct_chk( mpi_cmp_mpi( &Z, &A ) == 0 );
1935 
1936  mpi_free( &X ); mpi_free( &Y ); mpi_free( &Z ); mpi_free( &A );
1937  }
1938  FCT_TEST_END();
1939 
1940 
1941  FCT_TEST_BGN(test_mpi_sub_mpi_2_test_for_negative_result)
1942  {
1943  mpi X, Y, Z, A;
1944  mpi_init( &X ); mpi_init( &Y ); mpi_init( &Z ); mpi_init( &A );
1945 
1946  fct_chk( mpi_read_string( &X, 10, "643808006803554439230129854961492699151386107534013432918073439524138264842370630061369715394739134090922937332590384720397133335969549256322620979036686633213903952966175107096769180017646161851573147596390153" ) == 0 );
1947  fct_chk( mpi_read_string( &Y, 10, "56125680981752282333498088313568935051383833838594899821664631784577337171193624243181360054669678410455329112434552942717084003541384594864129940145043086760031292483340068923506115878221189886491132772739661669044958531131327771" ) == 0 );
1948  fct_chk( mpi_read_string( &A, 10, "-56125680981752282332854280306765380612153703983633407122513245677043323738275550803657221789827307780393959397039813808626161066208794210143732806809073537503708671504303382290292211925255014779394363592722015507193385383534937618" ) == 0 );
1949  fct_chk( mpi_sub_mpi( &Z, &X, &Y ) == 0 );
1950  fct_chk( mpi_cmp_mpi( &Z, &A ) == 0 );
1951 
1952  mpi_free( &X ); mpi_free( &Y ); mpi_free( &Z ); mpi_free( &A );
1953  }
1954  FCT_TEST_END();
1955 
1956 
1957  FCT_TEST_BGN(test_mpi_sub_int_1)
1958  {
1959  mpi X, Z, A;
1960  mpi_init( &X ); mpi_init( &Z ); mpi_init( &A );
1961 
1962  fct_chk( mpi_read_string( &X, 10, "2039568783564019774057658669290345772801939933143482630947726464532830627227012776329" ) == 0 );
1963  fct_chk( mpi_read_string( &A, 10, "2039568783564019774057658669290345772801939933143482630947726464532830627227022647561" ) == 0 );
1964  fct_chk( mpi_sub_int( &Z, &X, -9871232 ) == 0 );
1965  fct_chk( mpi_cmp_mpi( &Z, &A ) == 0 );
1966 
1967  mpi_free( &X ); mpi_free( &Z ); mpi_free( &A );
1968  }
1969  FCT_TEST_END();
1970 
1971 
1972  FCT_TEST_BGN(test_mpi_sub_int_2)
1973  {
1974  mpi X, Z, A;
1975  mpi_init( &X ); mpi_init( &Z ); mpi_init( &A );
1976 
1977  fct_chk( mpi_read_string( &X, 10, "2039568783564019774057658669290345772801939933143482630947726464532830627227012776329" ) == 0 );
1978  fct_chk( mpi_read_string( &A, 10, "2039568783564019774057658669290345772801939933143482630947726464532830627227002905097" ) == 0 );
1979  fct_chk( mpi_sub_int( &Z, &X, 9871232 ) == 0 );
1980  fct_chk( mpi_cmp_mpi( &Z, &A ) == 0 );
1981 
1982  mpi_free( &X ); mpi_free( &Z ); mpi_free( &A );
1983  }
1984  FCT_TEST_END();
1985 
1986 
1987  FCT_TEST_BGN(test_mpi_shift_l_1)
1988  {
1989  mpi X, A;
1990  mpi_init( &X ); mpi_init( &A );
1991 
1992  fct_chk( mpi_read_string( &X, 10, "64" ) == 0 );
1993  fct_chk( mpi_read_string( &A, 10, "128" ) == 0 );
1994  fct_chk( mpi_shift_l( &X, 1 ) == 0 );
1995  fct_chk( mpi_cmp_mpi( &X, &A ) == 0 );
1996 
1997  mpi_free( &X ); mpi_free( &A );
1998  }
1999  FCT_TEST_END();
2000 
2001 
2002  FCT_TEST_BGN(test_mpi_shift_l_2)
2003  {
2004  mpi X, A;
2005  mpi_init( &X ); mpi_init( &A );
2006 
2007  fct_chk( mpi_read_string( &X, 10, "658385546911733550164516088405238961461880256029834598831972039469421755117818013653494814438931957316403111689187691446941406788869098983929874080332195117465344344350008880118042764943201875870917468833709791733282363323948005998269792207" ) == 0 );
2008  fct_chk( mpi_read_string( &A, 10, "90487820548639020691922304619723076305400961610119884872723190678642804168382367856686134531865643066983017249846286450251272364365605022750900439437595355052945035915579216557330505438734955340526145476988250171181404966718289259743378883640981192704" ) == 0 );
2009  fct_chk( mpi_shift_l( &X, 37 ) == 0 );
2010  fct_chk( mpi_cmp_mpi( &X, &A ) == 0 );
2011 
2012  mpi_free( &X ); mpi_free( &A );
2013  }
2014  FCT_TEST_END();
2015 
2016 
2017  FCT_TEST_BGN(test_mpi_shift_r_1)
2018  {
2019  mpi X, A;
2020  mpi_init( &X ); mpi_init( &A );
2021 
2022  fct_chk( mpi_read_string( &X, 10, "128" ) == 0 );
2023  fct_chk( mpi_read_string( &A, 10, "64" ) == 0 );
2024  fct_chk( mpi_shift_r( &X, 1 ) == 0 );
2025  fct_chk( mpi_cmp_mpi( &X, &A ) == 0 );
2026 
2027  mpi_free( &X ); mpi_free( &A );
2028  }
2029  FCT_TEST_END();
2030 
2031 
2032  FCT_TEST_BGN(test_mpi_shift_r_2)
2033  {
2034  mpi X, A;
2035  mpi_init( &X ); mpi_init( &A );
2036 
2037  fct_chk( mpi_read_string( &X, 10, "120815570979701484704906977000760567182871429114712069861589084706550626575967516787438008593490722779337547394120718248995900363209947025063336882559539208430319216688889117222633155838468458047056355241515415159736436403445579777425189969" ) == 0 );
2038  fct_chk( mpi_read_string( &A, 10, "3433785053053426415343295076376096153094051405637175942660777670498379921354157795219578264137985649407981651226029903483433269093721578004287291678324982297860947730012217028349628999378309630601971640587504883789518896817457" ) == 0 );
2039  fct_chk( mpi_shift_r( &X, 45 ) == 0 );
2040  fct_chk( mpi_cmp_mpi( &X, &A ) == 0 );
2041 
2042  mpi_free( &X ); mpi_free( &A );
2043  }
2044  FCT_TEST_END();
2045 
2046 
2047  FCT_TEST_BGN(test_mpi_shift_r_4)
2048  {
2049  mpi X, A;
2050  mpi_init( &X ); mpi_init( &A );
2051 
2052  fct_chk( mpi_read_string( &X, 16, "FFFFFFFFFFFFFFFF" ) == 0 );
2053  fct_chk( mpi_read_string( &A, 16, "01" ) == 0 );
2054  fct_chk( mpi_shift_r( &X, 63 ) == 0 );
2055  fct_chk( mpi_cmp_mpi( &X, &A ) == 0 );
2056 
2057  mpi_free( &X ); mpi_free( &A );
2058  }
2059  FCT_TEST_END();
2060 
2061 
2062  FCT_TEST_BGN(test_mpi_shift_r_4)
2063  {
2064  mpi X, A;
2065  mpi_init( &X ); mpi_init( &A );
2066 
2067  fct_chk( mpi_read_string( &X, 16, "FFFFFFFFFFFFFFFF" ) == 0 );
2068  fct_chk( mpi_read_string( &A, 16, "00" ) == 0 );
2069  fct_chk( mpi_shift_r( &X, 64 ) == 0 );
2070  fct_chk( mpi_cmp_mpi( &X, &A ) == 0 );
2071 
2072  mpi_free( &X ); mpi_free( &A );
2073  }
2074  FCT_TEST_END();
2075 
2076 
2077  FCT_TEST_BGN(test_mpi_shift_r_6)
2078  {
2079  mpi X, A;
2080  mpi_init( &X ); mpi_init( &A );
2081 
2082  fct_chk( mpi_read_string( &X, 16, "FFFFFFFFFFFFFFFF" ) == 0 );
2083  fct_chk( mpi_read_string( &A, 16, "00" ) == 0 );
2084  fct_chk( mpi_shift_r( &X, 65 ) == 0 );
2085  fct_chk( mpi_cmp_mpi( &X, &A ) == 0 );
2086 
2087  mpi_free( &X ); mpi_free( &A );
2088  }
2089  FCT_TEST_END();
2090 
2091 
2092  FCT_TEST_BGN(test_mpi_shift_r_7)
2093  {
2094  mpi X, A;
2095  mpi_init( &X ); mpi_init( &A );
2096 
2097  fct_chk( mpi_read_string( &X, 16, "FFFFFFFFFFFFFFFF" ) == 0 );
2098  fct_chk( mpi_read_string( &A, 16, "00" ) == 0 );
2099  fct_chk( mpi_shift_r( &X, 128 ) == 0 );
2100  fct_chk( mpi_cmp_mpi( &X, &A ) == 0 );
2101 
2102  mpi_free( &X ); mpi_free( &A );
2103  }
2104  FCT_TEST_END();
2105 
2106 
2107  FCT_TEST_BGN(base_test_mpi_mul_mpi_1)
2108  {
2109  mpi X, Y, Z, A;
2110  mpi_init( &X ); mpi_init( &Y ); mpi_init( &Z ); mpi_init( &A );
2111 
2112  fct_chk( mpi_read_string( &X, 10, "5" ) == 0 );
2113  fct_chk( mpi_read_string( &Y, 10, "7" ) == 0 );
2114  fct_chk( mpi_read_string( &A, 10, "35" ) == 0 );
2115  fct_chk( mpi_mul_mpi( &Z, &X, &Y ) == 0 );
2116  fct_chk( mpi_cmp_mpi( &Z, &A ) == 0 );
2117 
2118  mpi_free( &X ); mpi_free( &Y ); mpi_free( &Z ); mpi_free( &A );
2119  }
2120  FCT_TEST_END();
2121 
2122 
2123  FCT_TEST_BGN(base_test_mpi_mul_mpi_2)
2124  {
2125  mpi X, Y, Z, A;
2126  mpi_init( &X ); mpi_init( &Y ); mpi_init( &Z ); mpi_init( &A );
2127 
2128  fct_chk( mpi_read_string( &X, 10, "-5" ) == 0 );
2129  fct_chk( mpi_read_string( &Y, 10, "7" ) == 0 );
2130  fct_chk( mpi_read_string( &A, 10, "-35" ) == 0 );
2131  fct_chk( mpi_mul_mpi( &Z, &X, &Y ) == 0 );
2132  fct_chk( mpi_cmp_mpi( &Z, &A ) == 0 );
2133 
2134  mpi_free( &X ); mpi_free( &Y ); mpi_free( &Z ); mpi_free( &A );
2135  }
2136  FCT_TEST_END();
2137 
2138 
2139  FCT_TEST_BGN(base_test_mpi_mul_mpi_3)
2140  {
2141  mpi X, Y, Z, A;
2142  mpi_init( &X ); mpi_init( &Y ); mpi_init( &Z ); mpi_init( &A );
2143 
2144  fct_chk( mpi_read_string( &X, 10, "5" ) == 0 );
2145  fct_chk( mpi_read_string( &Y, 10, "-7" ) == 0 );
2146  fct_chk( mpi_read_string( &A, 10, "-35" ) == 0 );
2147  fct_chk( mpi_mul_mpi( &Z, &X, &Y ) == 0 );
2148  fct_chk( mpi_cmp_mpi( &Z, &A ) == 0 );
2149 
2150  mpi_free( &X ); mpi_free( &Y ); mpi_free( &Z ); mpi_free( &A );
2151  }
2152  FCT_TEST_END();
2153 
2154 
2155  FCT_TEST_BGN(base_test_mpi_mul_mpi_4)
2156  {
2157  mpi X, Y, Z, A;
2158  mpi_init( &X ); mpi_init( &Y ); mpi_init( &Z ); mpi_init( &A );
2159 
2160  fct_chk( mpi_read_string( &X, 10, "-5" ) == 0 );
2161  fct_chk( mpi_read_string( &Y, 10, "-7" ) == 0 );
2162  fct_chk( mpi_read_string( &A, 10, "35" ) == 0 );
2163  fct_chk( mpi_mul_mpi( &Z, &X, &Y ) == 0 );
2164  fct_chk( mpi_cmp_mpi( &Z, &A ) == 0 );
2165 
2166  mpi_free( &X ); mpi_free( &Y ); mpi_free( &Z ); mpi_free( &A );
2167  }
2168  FCT_TEST_END();
2169 
2170 
2171  FCT_TEST_BGN(test_mpi_mul_mpi_1)
2172  {
2173  mpi X, Y, Z, A;
2174  mpi_init( &X ); mpi_init( &Y ); mpi_init( &Z ); mpi_init( &A );
2175 
2176  fct_chk( mpi_read_string( &X, 10, "28911710017320205966167820725313234361535259163045867986277478145081076845846493521348693253530011243988160148063424837895971948244167867236923919506962312185829914482993478947657472351461336729641485069323635424692930278888923450060546465883490944265147851036817433970984747733020522259537" ) == 0 );
2177  fct_chk( mpi_read_string( &Y, 10, "16471581891701794764704009719057349996270239948993452268812975037240586099924712715366967486587417803753916334331355573776945238871512026832810626226164346328807407669366029926221415383560814338828449642265377822759768011406757061063524768140567867350208554439342320410551341675119078050953" ) == 0 );
2178  fct_chk( mpi_read_string( &A, 10, "476221599179424887669515829231223263939342135681791605842540429321038144633323941248706405375723482912535192363845116154236465184147599697841273424891410002781967962186252583311115708128167171262206919514587899883547279647025952837516324649656913580411611297312678955801899536937577476819667861053063432906071315727948826276092545739432005962781562403795455162483159362585281248265005441715080197800335757871588045959754547836825977169125866324128449699877076762316768127816074587766799018626179199776188490087103869164122906791440101822594139648973454716256383294690817576188761" ) == 0 );
2179  fct_chk( mpi_mul_mpi( &Z, &X, &Y ) == 0 );
2180  fct_chk( mpi_cmp_mpi( &Z, &A ) == 0 );
2181 
2182  mpi_free( &X ); mpi_free( &Y ); mpi_free( &Z ); mpi_free( &A );
2183  }
2184  FCT_TEST_END();
2185 
2186 
2187  FCT_TEST_BGN(test_mpi_mul_int_1)
2188  {
2189  mpi X, Z, A;
2190  mpi_init( &X ); mpi_init( &Z ); mpi_init( &A );
2191 
2192  fct_chk( mpi_read_string( &X, 10, "2039568783564019774057658669290345772801939933143482630947726464532830627227012776329" ) == 0 );
2193  fct_chk( mpi_read_string( &A, 10, "20133056642518226042310730101376278483547239130123806338055387803943342738063359782107667328" ) == 0 );
2194  fct_chk( mpi_mul_int( &Z, &X, 9871232 ) == 0 );
2195  fct_chk( mpi_cmp_mpi( &Z, &A ) == 0 );
2196 
2197  mpi_free( &X ); mpi_free( &Z ); mpi_free( &A );
2198  }
2199  FCT_TEST_END();
2200 
2201 
2202  FCT_TEST_BGN(test_mpi_mul_int_2_unsigned_thus_failure)
2203  {
2204  mpi X, Z, A;
2205  mpi_init( &X ); mpi_init( &Z ); mpi_init( &A );
2206 
2207  fct_chk( mpi_read_string( &X, 10, "2039568783564019774057658669290345772801939933143482630947726464532830627227012776329" ) == 0 );
2208  fct_chk( mpi_read_string( &A, 10, "-20133056642518226042310730101376278483547239130123806338055387803943342738063359782107667328" ) == 0 );
2209  fct_chk( mpi_mul_int( &Z, &X, -9871232 ) == 0 );
2210  fct_chk( mpi_cmp_mpi( &Z, &A ) != 0 );
2211 
2212  mpi_free( &X ); mpi_free( &Z ); mpi_free( &A );
2213  }
2214  FCT_TEST_END();
2215 
2216 
2217  FCT_TEST_BGN(test_mpi_mul_int_3)
2218  {
2219  mpi X, Z, A;
2220  mpi_init( &X ); mpi_init( &Z ); mpi_init( &A );
2221 
2222  fct_chk( mpi_read_string( &X, 10, "-2039568783564019774057658669290345772801939933143482630947726464532830627227012776329" ) == 0 );
2223  fct_chk( mpi_read_string( &A, 10, "-20133056642518226042310730101376278483547239130123806338055387803943342738063359782107667328" ) == 0 );
2224  fct_chk( mpi_mul_int( &Z, &X, 9871232 ) == 0 );
2225  fct_chk( mpi_cmp_mpi( &Z, &A ) == 0 );
2226 
2227  mpi_free( &X ); mpi_free( &Z ); mpi_free( &A );
2228  }
2229  FCT_TEST_END();
2230 
2231 
2232  FCT_TEST_BGN(test_mpi_mul_int_4_unsigned_thus_failure)
2233  {
2234  mpi X, Z, A;
2235  mpi_init( &X ); mpi_init( &Z ); mpi_init( &A );
2236 
2237  fct_chk( mpi_read_string( &X, 10, "-2039568783564019774057658669290345772801939933143482630947726464532830627227012776329" ) == 0 );
2238  fct_chk( mpi_read_string( &A, 10, "20133056642518226042310730101376278483547239130123806338055387803943342738063359782107667328" ) == 0 );
2239  fct_chk( mpi_mul_int( &Z, &X, -9871232 ) == 0 );
2240  fct_chk( mpi_cmp_mpi( &Z, &A ) != 0 );
2241 
2242  mpi_free( &X ); mpi_free( &Z ); mpi_free( &A );
2243  }
2244  FCT_TEST_END();
2245 
2246 
2247  FCT_TEST_BGN(base_test_mpi_div_mpi_1)
2248  {
2249  mpi X, Y, Q, R, A, B;
2250  int res;
2251  mpi_init( &X ); mpi_init( &Y ); mpi_init( &Q ); mpi_init( &R );
2252  mpi_init( &A ); mpi_init( &B );
2253 
2254  fct_chk( mpi_read_string( &X, 10, "1000" ) == 0 );
2255  fct_chk( mpi_read_string( &Y, 10, "13" ) == 0 );
2256  fct_chk( mpi_read_string( &A, 10, "76" ) == 0 );
2257  fct_chk( mpi_read_string( &B, 10, "12" ) == 0 );
2258  res = mpi_div_mpi( &Q, &R, &X, &Y );
2259  fct_chk( res == 0 );
2260  if( res == 0 )
2261  {
2262  fct_chk( mpi_cmp_mpi( &Q, &A ) == 0 );
2263  fct_chk( mpi_cmp_mpi( &R, &B ) == 0 );
2264  }
2265 
2266  mpi_free( &X ); mpi_free( &Y ); mpi_free( &Q ); mpi_free( &R );
2267  mpi_free( &A ); mpi_free( &B );
2268  }
2269  FCT_TEST_END();
2270 
2271 
2272  FCT_TEST_BGN(base_test_mpi_div_mpi_2_divide_by_zero)
2273  {
2274  mpi X, Y, Q, R, A, B;
2275  int res;
2276  mpi_init( &X ); mpi_init( &Y ); mpi_init( &Q ); mpi_init( &R );
2277  mpi_init( &A ); mpi_init( &B );
2278 
2279  fct_chk( mpi_read_string( &X, 10, "1000" ) == 0 );
2280  fct_chk( mpi_read_string( &Y, 10, "0" ) == 0 );
2281  fct_chk( mpi_read_string( &A, 10, "1" ) == 0 );
2282  fct_chk( mpi_read_string( &B, 10, "1" ) == 0 );
2283  res = mpi_div_mpi( &Q, &R, &X, &Y );
2284  fct_chk( res == POLARSSL_ERR_MPI_DIVISION_BY_ZERO );
2285  if( res == 0 )
2286  {
2287  fct_chk( mpi_cmp_mpi( &Q, &A ) == 0 );
2288  fct_chk( mpi_cmp_mpi( &R, &B ) == 0 );
2289  }
2290 
2291  mpi_free( &X ); mpi_free( &Y ); mpi_free( &Q ); mpi_free( &R );
2292  mpi_free( &A ); mpi_free( &B );
2293  }
2294  FCT_TEST_END();
2295 
2296 
2297  FCT_TEST_BGN(base_test_mpi_div_mpi_3)
2298  {
2299  mpi X, Y, Q, R, A, B;
2300  int res;
2301  mpi_init( &X ); mpi_init( &Y ); mpi_init( &Q ); mpi_init( &R );
2302  mpi_init( &A ); mpi_init( &B );
2303 
2304  fct_chk( mpi_read_string( &X, 10, "1000" ) == 0 );
2305  fct_chk( mpi_read_string( &Y, 10, "-13" ) == 0 );
2306  fct_chk( mpi_read_string( &A, 10, "-76" ) == 0 );
2307  fct_chk( mpi_read_string( &B, 10, "12" ) == 0 );
2308  res = mpi_div_mpi( &Q, &R, &X, &Y );
2309  fct_chk( res == 0 );
2310  if( res == 0 )
2311  {
2312  fct_chk( mpi_cmp_mpi( &Q, &A ) == 0 );
2313  fct_chk( mpi_cmp_mpi( &R, &B ) == 0 );
2314  }
2315 
2316  mpi_free( &X ); mpi_free( &Y ); mpi_free( &Q ); mpi_free( &R );
2317  mpi_free( &A ); mpi_free( &B );
2318  }
2319  FCT_TEST_END();
2320 
2321 
2322  FCT_TEST_BGN(test_mpi_div_mpi_1)
2323  {
2324  mpi X, Y, Q, R, A, B;
2325  int res;
2326  mpi_init( &X ); mpi_init( &Y ); mpi_init( &Q ); mpi_init( &R );
2327  mpi_init( &A ); mpi_init( &B );
2328 
2329  fct_chk( mpi_read_string( &X, 10, "20133056642518226042310730101376278483547239130123806338055387803943342738063359782107667328" ) == 0 );
2330  fct_chk( mpi_read_string( &Y, 10, "34" ) == 0 );
2331  fct_chk( mpi_read_string( &A, 10, "592148724779947824773845002981655249516095268533053127589864347174804198178334111238460803" ) == 0 );
2332  fct_chk( mpi_read_string( &B, 10, "26" ) == 0 );
2333  res = mpi_div_mpi( &Q, &R, &X, &Y );
2334  fct_chk( res == 0 );
2335  if( res == 0 )
2336  {
2337  fct_chk( mpi_cmp_mpi( &Q, &A ) == 0 );
2338  fct_chk( mpi_cmp_mpi( &R, &B ) == 0 );
2339  }
2340 
2341  mpi_free( &X ); mpi_free( &Y ); mpi_free( &Q ); mpi_free( &R );
2342  mpi_free( &A ); mpi_free( &B );
2343  }
2344  FCT_TEST_END();
2345 
2346 
2347  FCT_TEST_BGN(test_mpi_div_mpi_2)
2348  {
2349  mpi X, Y, Q, R, A, B;
2350  int res;
2351  mpi_init( &X ); mpi_init( &Y ); mpi_init( &Q ); mpi_init( &R );
2352  mpi_init( &A ); mpi_init( &B );
2353 
2354  fct_chk( mpi_read_string( &X, 10, "476221599179424887669515829231223263939342135681791605842540429321038144633323941248706405375723482912535192363845116154236465184147599697841273424891410002781967962186252583311115708128167171262206919514587899883547279647025952837516324649656913580411611297312678955801899536937577476819667861053063432906071315727948826276092545739432005962781562403795455162483159362585281248265005441715080197800335757871588045959754547836825977169125866324128449699877076762316768127816074587766799018626179199776188490087103869164122906791440101822594139648973454716256383294690817576188762" ) == 0 );
2355  fct_chk( mpi_read_string( &Y, 10, "28911710017320205966167820725313234361535259163045867986277478145081076845846493521348693253530011243988160148063424837895971948244167867236923919506962312185829914482993478947657472351461336729641485069323635424692930278888923450060546465883490944265147851036817433970984747733020522259537" ) == 0 );
2356  fct_chk( mpi_read_string( &A, 10, "16471581891701794764704009719057349996270239948993452268812975037240586099924712715366967486587417803753916334331355573776945238871512026832810626226164346328807407669366029926221415383560814338828449642265377822759768011406757061063524768140567867350208554439342320410551341675119078050953" ) == 0 );
2357  fct_chk( mpi_read_string( &B, 10, "1" ) == 0 );
2358  res = mpi_div_mpi( &Q, &R, &X, &Y );
2359  fct_chk( res == 0 );
2360  if( res == 0 )
2361  {
2362  fct_chk( mpi_cmp_mpi( &Q, &A ) == 0 );
2363  fct_chk( mpi_cmp_mpi( &R, &B ) == 0 );
2364  }
2365 
2366  mpi_free( &X ); mpi_free( &Y ); mpi_free( &Q ); mpi_free( &R );
2367  mpi_free( &A ); mpi_free( &B );
2368  }
2369  FCT_TEST_END();
2370 
2371 
2372  FCT_TEST_BGN(test_mpi_div_mpi_3)
2373  {
2374  mpi X, Y, Q, R, A, B;
2375  int res;
2376  mpi_init( &X ); mpi_init( &Y ); mpi_init( &Q ); mpi_init( &R );
2377  mpi_init( &A ); mpi_init( &B );
2378 
2379  fct_chk( mpi_read_string( &X, 10, "1000" ) == 0 );
2380  fct_chk( mpi_read_string( &Y, 10, "7" ) == 0 );
2381  fct_chk( mpi_read_string( &A, 10, "142" ) == 0 );
2382  fct_chk( mpi_read_string( &B, 10, "6" ) == 0 );
2383  res = mpi_div_mpi( &Q, &R, &X, &Y );
2384  fct_chk( res == 0 );
2385  if( res == 0 )
2386  {
2387  fct_chk( mpi_cmp_mpi( &Q, &A ) == 0 );
2388  fct_chk( mpi_cmp_mpi( &R, &B ) == 0 );
2389  }
2390 
2391  mpi_free( &X ); mpi_free( &Y ); mpi_free( &Q ); mpi_free( &R );
2392  mpi_free( &A ); mpi_free( &B );
2393  }
2394  FCT_TEST_END();
2395 
2396 
2397  FCT_TEST_BGN(test_mpi_div_mpi_4)
2398  {
2399  mpi X, Y, Q, R, A, B;
2400  int res;
2401  mpi_init( &X ); mpi_init( &Y ); mpi_init( &Q ); mpi_init( &R );
2402  mpi_init( &A ); mpi_init( &B );
2403 
2404  fct_chk( mpi_read_string( &X, 10, "777" ) == 0 );
2405  fct_chk( mpi_read_string( &Y, 10, "7" ) == 0 );
2406  fct_chk( mpi_read_string( &A, 10, "111" ) == 0 );
2407  fct_chk( mpi_read_string( &B, 10, "0" ) == 0 );
2408  res = mpi_div_mpi( &Q, &R, &X, &Y );
2409  fct_chk( res == 0 );
2410  if( res == 0 )
2411  {
2412  fct_chk( mpi_cmp_mpi( &Q, &A ) == 0 );
2413  fct_chk( mpi_cmp_mpi( &R, &B ) == 0 );
2414  }
2415 
2416  mpi_free( &X ); mpi_free( &Y ); mpi_free( &Q ); mpi_free( &R );
2417  mpi_free( &A ); mpi_free( &B );
2418  }
2419  FCT_TEST_END();
2420 
2421 
2422  FCT_TEST_BGN(base_test_mpi_div_int_1)
2423  {
2424  mpi X, Q, R, A, B;
2425  int res;
2426  mpi_init( &X ); mpi_init( &Q ); mpi_init( &R ); mpi_init( &A );
2427  mpi_init( &B );
2428 
2429  fct_chk( mpi_read_string( &X, 10, "1000" ) == 0 );
2430  fct_chk( mpi_read_string( &A, 10, "76" ) == 0 );
2431  fct_chk( mpi_read_string( &B, 10, "12" ) == 0 );
2432  res = mpi_div_int( &Q, &R, &X, 13 );
2433  fct_chk( res == 0 );
2434  if( res == 0 )
2435  {
2436  fct_chk( mpi_cmp_mpi( &Q, &A ) == 0 );
2437  fct_chk( mpi_cmp_mpi( &R, &B ) == 0 );
2438  }
2439 
2440  mpi_free( &X ); mpi_free( &Q ); mpi_free( &R ); mpi_free( &A );
2441  mpi_free( &B );
2442  }
2443  FCT_TEST_END();
2444 
2445 
2446  FCT_TEST_BGN(base_test_mpi_div_int_2_divide_by_zero)
2447  {
2448  mpi X, Q, R, A, B;
2449  int res;
2450  mpi_init( &X ); mpi_init( &Q ); mpi_init( &R ); mpi_init( &A );
2451  mpi_init( &B );
2452 
2453  fct_chk( mpi_read_string( &X, 10, "1000" ) == 0 );
2454  fct_chk( mpi_read_string( &A, 10, "1" ) == 0 );
2455  fct_chk( mpi_read_string( &B, 10, "1" ) == 0 );
2456  res = mpi_div_int( &Q, &R, &X, 0 );
2457  fct_chk( res == POLARSSL_ERR_MPI_DIVISION_BY_ZERO );
2458  if( res == 0 )
2459  {
2460  fct_chk( mpi_cmp_mpi( &Q, &A ) == 0 );
2461  fct_chk( mpi_cmp_mpi( &R, &B ) == 0 );
2462  }
2463 
2464  mpi_free( &X ); mpi_free( &Q ); mpi_free( &R ); mpi_free( &A );
2465  mpi_free( &B );
2466  }
2467  FCT_TEST_END();
2468 
2469 
2470  FCT_TEST_BGN(base_test_mpi_div_int_3)
2471  {
2472  mpi X, Q, R, A, B;
2473  int res;
2474  mpi_init( &X ); mpi_init( &Q ); mpi_init( &R ); mpi_init( &A );
2475  mpi_init( &B );
2476 
2477  fct_chk( mpi_read_string( &X, 10, "1000" ) == 0 );
2478  fct_chk( mpi_read_string( &A, 10, "-76" ) == 0 );
2479  fct_chk( mpi_read_string( &B, 10, "12" ) == 0 );
2480  res = mpi_div_int( &Q, &R, &X, -13 );
2481  fct_chk( res == 0 );
2482  if( res == 0 )
2483  {
2484  fct_chk( mpi_cmp_mpi( &Q, &A ) == 0 );
2485  fct_chk( mpi_cmp_mpi( &R, &B ) == 0 );
2486  }
2487 
2488  mpi_free( &X ); mpi_free( &Q ); mpi_free( &R ); mpi_free( &A );
2489  mpi_free( &B );
2490  }
2491  FCT_TEST_END();
2492 
2493 
2494  FCT_TEST_BGN(test_mpi_div_int_1)
2495  {
2496  mpi X, Q, R, A, B;
2497  int res;
2498  mpi_init( &X ); mpi_init( &Q ); mpi_init( &R ); mpi_init( &A );
2499  mpi_init( &B );
2500 
2501  fct_chk( mpi_read_string( &X, 10, "20133056642518226042310730101376278483547239130123806338055387803943342738063359782107667328" ) == 0 );
2502  fct_chk( mpi_read_string( &A, 10, "592148724779947824773845002981655249516095268533053127589864347174804198178334111238460803" ) == 0 );
2503  fct_chk( mpi_read_string( &B, 10, "26" ) == 0 );
2504  res = mpi_div_int( &Q, &R, &X, 34 );
2505  fct_chk( res == 0 );
2506  if( res == 0 )
2507  {
2508  fct_chk( mpi_cmp_mpi( &Q, &A ) == 0 );
2509  fct_chk( mpi_cmp_mpi( &R, &B ) == 0 );
2510  }
2511 
2512  mpi_free( &X ); mpi_free( &Q ); mpi_free( &R ); mpi_free( &A );
2513  mpi_free( &B );
2514  }
2515  FCT_TEST_END();
2516 
2517 
2518  FCT_TEST_BGN(test_mpi_div_int_2)
2519  {
2520  mpi X, Q, R, A, B;
2521  int res;
2522  mpi_init( &X ); mpi_init( &Q ); mpi_init( &R ); mpi_init( &A );
2523  mpi_init( &B );
2524 
2525  fct_chk( mpi_read_string( &X, 10, "20133056642518226042310730101376278483547239130123806338055387803943342738063359782107667328" ) == 0 );
2526  fct_chk( mpi_read_string( &A, 10, "-592148724779947824773845002981655249516095268533053127589864347174804198178334111238460803" ) == 0 );
2527  fct_chk( mpi_read_string( &B, 10, "26" ) == 0 );
2528  res = mpi_div_int( &Q, &R, &X, -34 );
2529  fct_chk( res == 0 );
2530  if( res == 0 )
2531  {
2532  fct_chk( mpi_cmp_mpi( &Q, &A ) == 0 );
2533  fct_chk( mpi_cmp_mpi( &R, &B ) == 0 );
2534  }
2535 
2536  mpi_free( &X ); mpi_free( &Q ); mpi_free( &R ); mpi_free( &A );
2537  mpi_free( &B );
2538  }
2539  FCT_TEST_END();
2540 
2541 
2542  FCT_TEST_BGN(base_test_mpi_mod_mpi_1)
2543  {
2544  mpi X, Y, A;
2545  int res;
2546  mpi_init( &X ); mpi_init( &Y ); mpi_init( &A );
2547 
2548  fct_chk( mpi_read_string( &X, 10, "1000" ) == 0 );
2549  fct_chk( mpi_read_string( &Y, 10, "13" ) == 0 );
2550  fct_chk( mpi_read_string( &A, 10, "12" ) == 0 );
2551  res = mpi_mod_mpi( &X, &X, &Y );
2552  fct_chk( res == 0 );
2553  if( res == 0 )
2554  {
2555  fct_chk( mpi_cmp_mpi( &X, &A ) == 0 );
2556  }
2557 
2558  mpi_free( &X ); mpi_free( &Y ); mpi_free( &A );
2559  }
2560  FCT_TEST_END();
2561 
2562 
2563  FCT_TEST_BGN(base_test_mpi_mod_mpi_2_divide_by_zero)
2564  {
2565  mpi X, Y, A;
2566  int res;
2567  mpi_init( &X ); mpi_init( &Y ); mpi_init( &A );
2568 
2569  fct_chk( mpi_read_string( &X, 10, "1000" ) == 0 );
2570  fct_chk( mpi_read_string( &Y, 10, "0" ) == 0 );
2571  fct_chk( mpi_read_string( &A, 10, "0" ) == 0 );
2572  res = mpi_mod_mpi( &X, &X, &Y );
2573  fct_chk( res == POLARSSL_ERR_MPI_DIVISION_BY_ZERO );
2574  if( res == 0 )
2575  {
2576  fct_chk( mpi_cmp_mpi( &X, &A ) == 0 );
2577  }
2578 
2579  mpi_free( &X ); mpi_free( &Y ); mpi_free( &A );
2580  }
2581  FCT_TEST_END();
2582 
2583 
2584  FCT_TEST_BGN(base_test_mpi_mod_mpi_3)
2585  {
2586  mpi X, Y, A;
2587  int res;
2588  mpi_init( &X ); mpi_init( &Y ); mpi_init( &A );
2589 
2590  fct_chk( mpi_read_string( &X, 10, "-1000" ) == 0 );
2591  fct_chk( mpi_read_string( &Y, 10, "13" ) == 0 );
2592  fct_chk( mpi_read_string( &A, 10, "1" ) == 0 );
2593  res = mpi_mod_mpi( &X, &X, &Y );
2594  fct_chk( res == 0 );
2595  if( res == 0 )
2596  {
2597  fct_chk( mpi_cmp_mpi( &X, &A ) == 0 );
2598  }
2599 
2600  mpi_free( &X ); mpi_free( &Y ); mpi_free( &A );
2601  }
2602  FCT_TEST_END();
2603 
2604 
2605  FCT_TEST_BGN(base_test_mpi_mod_mpi_4_negative_modulo)
2606  {
2607  mpi X, Y, A;
2608  int res;
2609  mpi_init( &X ); mpi_init( &Y ); mpi_init( &A );
2610 
2611  fct_chk( mpi_read_string( &X, 10, "1000" ) == 0 );
2612  fct_chk( mpi_read_string( &Y, 10, "-13" ) == 0 );
2613  fct_chk( mpi_read_string( &A, 10, "-1" ) == 0 );
2614  res = mpi_mod_mpi( &X, &X, &Y );
2615  fct_chk( res == POLARSSL_ERR_MPI_NEGATIVE_VALUE );
2616  if( res == 0 )
2617  {
2618  fct_chk( mpi_cmp_mpi( &X, &A ) == 0 );
2619  }
2620 
2621  mpi_free( &X ); mpi_free( &Y ); mpi_free( &A );
2622  }
2623  FCT_TEST_END();
2624 
2625 
2626  FCT_TEST_BGN(base_test_mpi_mod_mpi_5_negative_modulo)
2627  {
2628  mpi X, Y, A;
2629  int res;
2630  mpi_init( &X ); mpi_init( &Y ); mpi_init( &A );
2631 
2632  fct_chk( mpi_read_string( &X, 10, "-1000" ) == 0 );
2633  fct_chk( mpi_read_string( &Y, 10, "-13" ) == 0 );
2634  fct_chk( mpi_read_string( &A, 10, "-12" ) == 0 );
2635  res = mpi_mod_mpi( &X, &X, &Y );
2636  fct_chk( res == POLARSSL_ERR_MPI_NEGATIVE_VALUE );
2637  if( res == 0 )
2638  {
2639  fct_chk( mpi_cmp_mpi( &X, &A ) == 0 );
2640  }
2641 
2642  mpi_free( &X ); mpi_free( &Y ); mpi_free( &A );
2643  }
2644  FCT_TEST_END();
2645 
2646 
2647  FCT_TEST_BGN(base_test_mpi_mod_int_1)
2648  {
2649  mpi X;
2650  int res;
2651  t_uint r;
2652  mpi_init( &X );
2653 
2654  fct_chk( mpi_read_string( &X, 10, "1000" ) == 0 );
2655  res = mpi_mod_int( &r, &X, 13 );
2656  fct_chk( res == 0 );
2657  if( res == 0 )
2658  {
2659  fct_chk( r == 12 );
2660  }
2661 
2662  mpi_free( &X );
2663  }
2664  FCT_TEST_END();
2665 
2666 
2667  FCT_TEST_BGN(base_test_mpi_mod_int_2_divide_by_zero)
2668  {
2669  mpi X;
2670  int res;
2671  t_uint r;
2672  mpi_init( &X );
2673 
2674  fct_chk( mpi_read_string( &X, 10, "1000" ) == 0 );
2675  res = mpi_mod_int( &r, &X, 0 );
2676  fct_chk( res == POLARSSL_ERR_MPI_DIVISION_BY_ZERO );
2677  if( res == 0 )
2678  {
2679  fct_chk( r == 0 );
2680  }
2681 
2682  mpi_free( &X );
2683  }
2684  FCT_TEST_END();
2685 
2686 
2687  FCT_TEST_BGN(base_test_mpi_mod_int_3)
2688  {
2689  mpi X;
2690  int res;
2691  t_uint r;
2692  mpi_init( &X );
2693 
2694  fct_chk( mpi_read_string( &X, 10, "-1000" ) == 0 );
2695  res = mpi_mod_int( &r, &X, 13 );
2696  fct_chk( res == 0 );
2697  if( res == 0 )
2698  {
2699  fct_chk( r == 1 );
2700  }
2701 
2702  mpi_free( &X );
2703  }
2704  FCT_TEST_END();
2705 
2706 
2707  FCT_TEST_BGN(base_test_mpi_mod_int_4_negative_modulo)
2708  {
2709  mpi X;
2710  int res;
2711  t_uint r;
2712  mpi_init( &X );
2713 
2714  fct_chk( mpi_read_string( &X, 10, "1000" ) == 0 );
2715  res = mpi_mod_int( &r, &X, -13 );
2716  fct_chk( res == POLARSSL_ERR_MPI_NEGATIVE_VALUE );
2717  if( res == 0 )
2718  {
2719  fct_chk( r == 0 );
2720  }
2721 
2722  mpi_free( &X );
2723  }
2724  FCT_TEST_END();
2725 
2726 
2727  FCT_TEST_BGN(base_test_mpi_mod_int_5_negative_modulo)
2728  {
2729  mpi X;
2730  int res;
2731  t_uint r;
2732  mpi_init( &X );
2733 
2734  fct_chk( mpi_read_string( &X, 10, "-1000" ) == 0 );
2735  res = mpi_mod_int( &r, &X, -13 );
2736  fct_chk( res == POLARSSL_ERR_MPI_NEGATIVE_VALUE );
2737  if( res == 0 )
2738  {
2739  fct_chk( r == 0 );
2740  }
2741 
2742  mpi_free( &X );
2743  }
2744  FCT_TEST_END();
2745 
2746 
2747  FCT_TEST_BGN(base_test_mpi_mod_int_6_by_1)
2748  {
2749  mpi X;
2750  int res;
2751  t_uint r;
2752  mpi_init( &X );
2753 
2754  fct_chk( mpi_read_string( &X, 10, "1000" ) == 0 );
2755  res = mpi_mod_int( &r, &X, 1 );
2756  fct_chk( res == 0 );
2757  if( res == 0 )
2758  {
2759  fct_chk( r == 0 );
2760  }
2761 
2762  mpi_free( &X );
2763  }
2764  FCT_TEST_END();
2765 
2766 
2767  FCT_TEST_BGN(base_test_mpi_mod_int_7_by_2)
2768  {
2769  mpi X;
2770  int res;
2771  t_uint r;
2772  mpi_init( &X );
2773 
2774  fct_chk( mpi_read_string( &X, 10, "1001" ) == 0 );
2775  res = mpi_mod_int( &r, &X, 2 );
2776  fct_chk( res == 0 );
2777  if( res == 0 )
2778  {
2779  fct_chk( r == 1 );
2780  }
2781 
2782  mpi_free( &X );
2783  }
2784  FCT_TEST_END();
2785 
2786 
2787  FCT_TEST_BGN(base_test_mpi_mod_int_8_by_2)
2788  {
2789  mpi X;
2790  int res;
2791  t_uint r;
2792  mpi_init( &X );
2793 
2794  fct_chk( mpi_read_string( &X, 10, "1000" ) == 0 );
2795  res = mpi_mod_int( &r, &X, 2 );
2796  fct_chk( res == 0 );
2797  if( res == 0 )
2798  {
2799  fct_chk( r == 0 );
2800  }
2801 
2802  mpi_free( &X );
2803  }
2804  FCT_TEST_END();
2805 
2806 
2807  FCT_TEST_BGN(base_test_mpi_exp_mod_1)
2808  {
2809  mpi A, E, N, RR, Z, X;
2810  int res;
2811  mpi_init( &A ); mpi_init( &E ); mpi_init( &N );
2812  mpi_init( &RR ); mpi_init( &Z ); mpi_init( &X );
2813 
2814  fct_chk( mpi_read_string( &A, 10, "23" ) == 0 );
2815  fct_chk( mpi_read_string( &E, 10, "13" ) == 0 );
2816  fct_chk( mpi_read_string( &N, 10, "29" ) == 0 );
2817  fct_chk( mpi_read_string( &X, 10, "24" ) == 0 );
2818 
2819  if( strlen( "" ) )
2820  fct_chk( mpi_read_string( &RR, 10, "" ) == 0 );
2821 
2822  res = mpi_exp_mod( &Z, &A, &E, &N, &RR );
2823  fct_chk( res == 0 );
2824  if( res == 0 )
2825  {
2826  fct_chk( mpi_cmp_mpi( &Z, &X ) == 0 );
2827  }
2828 
2829  mpi_free( &A ); mpi_free( &E ); mpi_free( &N );
2830  mpi_free( &RR ); mpi_free( &Z ); mpi_free( &X );
2831  }
2832  FCT_TEST_END();
2833 
2834 
2835  FCT_TEST_BGN(base_test_mpi_exp_mod_2_even_n)
2836  {
2837  mpi A, E, N, RR, Z, X;
2838  int res;
2839  mpi_init( &A ); mpi_init( &E ); mpi_init( &N );
2840  mpi_init( &RR ); mpi_init( &Z ); mpi_init( &X );
2841 
2842  fct_chk( mpi_read_string( &A, 10, "23" ) == 0 );
2843  fct_chk( mpi_read_string( &E, 10, "13" ) == 0 );
2844  fct_chk( mpi_read_string( &N, 10, "30" ) == 0 );
2845  fct_chk( mpi_read_string( &X, 10, "0" ) == 0 );
2846 
2847  if( strlen( "" ) )
2848  fct_chk( mpi_read_string( &RR, 10, "" ) == 0 );
2849 
2850  res = mpi_exp_mod( &Z, &A, &E, &N, &RR );
2851  fct_chk( res == POLARSSL_ERR_MPI_BAD_INPUT_DATA );
2852  if( res == 0 )
2853  {
2854  fct_chk( mpi_cmp_mpi( &Z, &X ) == 0 );
2855  }
2856 
2857  mpi_free( &A ); mpi_free( &E ); mpi_free( &N );
2858  mpi_free( &RR ); mpi_free( &Z ); mpi_free( &X );
2859  }
2860  FCT_TEST_END();
2861 
2862 
2863  FCT_TEST_BGN(base_test_mpi_exp_mod_3_negative_n)
2864  {
2865  mpi A, E, N, RR, Z, X;
2866  int res;
2867  mpi_init( &A ); mpi_init( &E ); mpi_init( &N );
2868  mpi_init( &RR ); mpi_init( &Z ); mpi_init( &X );
2869 
2870  fct_chk( mpi_read_string( &A, 10, "23" ) == 0 );
2871  fct_chk( mpi_read_string( &E, 10, "13" ) == 0 );
2872  fct_chk( mpi_read_string( &N, 10, "-29" ) == 0 );
2873  fct_chk( mpi_read_string( &X, 10, "0" ) == 0 );
2874 
2875  if( strlen( "" ) )
2876  fct_chk( mpi_read_string( &RR, 10, "" ) == 0 );
2877 
2878  res = mpi_exp_mod( &Z, &A, &E, &N, &RR );
2879  fct_chk( res == POLARSSL_ERR_MPI_BAD_INPUT_DATA );
2880  if( res == 0 )
2881  {
2882  fct_chk( mpi_cmp_mpi( &Z, &X ) == 0 );
2883  }
2884 
2885  mpi_free( &A ); mpi_free( &E ); mpi_free( &N );
2886  mpi_free( &RR ); mpi_free( &Z ); mpi_free( &X );
2887  }
2888  FCT_TEST_END();
2889 
2890 
2891  FCT_TEST_BGN(base_test_mpi_exp_mod_4_negative_base)
2892  {
2893  mpi A, E, N, RR, Z, X;
2894  int res;
2895  mpi_init( &A ); mpi_init( &E ); mpi_init( &N );
2896  mpi_init( &RR ); mpi_init( &Z ); mpi_init( &X );
2897 
2898  fct_chk( mpi_read_string( &A, 10, "-23" ) == 0 );
2899  fct_chk( mpi_read_string( &E, 10, "13" ) == 0 );
2900  fct_chk( mpi_read_string( &N, 10, "29" ) == 0 );
2901  fct_chk( mpi_read_string( &X, 10, "5" ) == 0 );
2902 
2903  if( strlen( "" ) )
2904  fct_chk( mpi_read_string( &RR, 10, "" ) == 0 );
2905 
2906  res = mpi_exp_mod( &Z, &A, &E, &N, &RR );
2907  fct_chk( res == 0 );
2908  if( res == 0 )
2909  {
2910  fct_chk( mpi_cmp_mpi( &Z, &X ) == 0 );
2911  }
2912 
2913  mpi_free( &A ); mpi_free( &E ); mpi_free( &N );
2914  mpi_free( &RR ); mpi_free( &Z ); mpi_free( &X );
2915  }
2916  FCT_TEST_END();
2917 
2918 
2919  FCT_TEST_BGN(base_test_mpi_exp_mod_5_negative_exponent)
2920  {
2921  mpi A, E, N, RR, Z, X;
2922  int res;
2923  mpi_init( &A ); mpi_init( &E ); mpi_init( &N );
2924  mpi_init( &RR ); mpi_init( &Z ); mpi_init( &X );
2925 
2926  fct_chk( mpi_read_string( &A, 10, "23" ) == 0 );
2927  fct_chk( mpi_read_string( &E, 10, "-13" ) == 0 );
2928  fct_chk( mpi_read_string( &N, 10, "29" ) == 0 );
2929  fct_chk( mpi_read_string( &X, 10, "0" ) == 0 );
2930 
2931  if( strlen( "" ) )
2932  fct_chk( mpi_read_string( &RR, 10, "" ) == 0 );
2933 
2934  res = mpi_exp_mod( &Z, &A, &E, &N, &RR );
2935  fct_chk( res == POLARSSL_ERR_MPI_BAD_INPUT_DATA );
2936  if( res == 0 )
2937  {
2938  fct_chk( mpi_cmp_mpi( &Z, &X ) == 0 );
2939  }
2940 
2941  mpi_free( &A ); mpi_free( &E ); mpi_free( &N );
2942  mpi_free( &RR ); mpi_free( &Z ); mpi_free( &X );
2943  }
2944  FCT_TEST_END();
2945 
2946 
2947  FCT_TEST_BGN(base_test_mpi_exp_mod_7_negative_base__exponent)
2948  {
2949  mpi A, E, N, RR, Z, X;
2950  int res;
2951  mpi_init( &A ); mpi_init( &E ); mpi_init( &N );
2952  mpi_init( &RR ); mpi_init( &Z ); mpi_init( &X );
2953 
2954  fct_chk( mpi_read_string( &A, 10, "-23" ) == 0 );
2955  fct_chk( mpi_read_string( &E, 10, "-13" ) == 0 );
2956  fct_chk( mpi_read_string( &N, 10, "29" ) == 0 );
2957  fct_chk( mpi_read_string( &X, 10, "0" ) == 0 );
2958 
2959  if( strlen( "" ) )
2960  fct_chk( mpi_read_string( &RR, 10, "" ) == 0 );
2961 
2962  res = mpi_exp_mod( &Z, &A, &E, &N, &RR );
2963  fct_chk( res == POLARSSL_ERR_MPI_BAD_INPUT_DATA );
2964  if( res == 0 )
2965  {
2966  fct_chk( mpi_cmp_mpi( &Z, &X ) == 0 );
2967  }
2968 
2969  mpi_free( &A ); mpi_free( &E ); mpi_free( &N );
2970  mpi_free( &RR ); mpi_free( &Z ); mpi_free( &X );
2971  }
2972  FCT_TEST_END();
2973 
2974 
2975  FCT_TEST_BGN(test_mpi_exp_mod_1)
2976  {
2977  mpi A, E, N, RR, Z, X;
2978  int res;
2979  mpi_init( &A ); mpi_init( &E ); mpi_init( &N );
2980  mpi_init( &RR ); mpi_init( &Z ); mpi_init( &X );
2981 
2982  fct_chk( mpi_read_string( &A, 10, "433019240910377478217373572959560109819648647016096560523769010881172869083338285573756574557395862965095016483867813043663981946477698466501451832407592327356331263124555137732393938242285782144928753919588632679050799198937132922145084847" ) == 0 );
2983  fct_chk( mpi_read_string( &E, 10, "5781538327977828897150909166778407659250458379645823062042492461576758526757490910073628008613977550546382774775570888130029763571528699574717583228939535960234464230882573615930384979100379102915657483866755371559811718767760594919456971354184113721" ) == 0 );
2984  fct_chk( mpi_read_string( &N, 10, "583137007797276923956891216216022144052044091311388601652961409557516421612874571554415606746479105795833145583959622117418531166391184939066520869800857530421873250114773204354963864729386957427276448683092491947566992077136553066273207777134303397724679138833126700957" ) == 0 );
2985  fct_chk( mpi_read_string( &X, 10, "114597449276684355144920670007147953232659436380163461553186940113929777196018164149703566472936578890991049344459204199888254907113495794730452699842273939581048142004834330369483813876618772578869083248061616444392091693787039636316845512292127097865026290173004860736" ) == 0 );
2986 
2987  if( strlen( "" ) )
2988  fct_chk( mpi_read_string( &RR, 10, "" ) == 0 );
2989 
2990  res = mpi_exp_mod( &Z, &A, &E, &N, &RR );
2991  fct_chk( res == 0 );
2992  if( res == 0 )
2993  {
2994  fct_chk( mpi_cmp_mpi( &Z, &X ) == 0 );
2995  }
2996 
2997  mpi_free( &A ); mpi_free( &E ); mpi_free( &N );
2998  mpi_free( &RR ); mpi_free( &Z ); mpi_free( &X );
2999  }
3000  FCT_TEST_END();
3001 
3002 
3003  FCT_TEST_BGN(test_mpi_exp_mod_negative_base)
3004  {
3005  mpi A, E, N, RR, Z, X;
3006  int res;
3007  mpi_init( &A ); mpi_init( &E ); mpi_init( &N );
3008  mpi_init( &RR ); mpi_init( &Z ); mpi_init( &X );
3009 
3010  fct_chk( mpi_read_string( &A, 10, "-10000000000" ) == 0 );
3011  fct_chk( mpi_read_string( &E, 10, "10000000000" ) == 0 );
3012  fct_chk( mpi_read_string( &N, 10, "99999" ) == 0 );
3013  fct_chk( mpi_read_string( &X, 10, "99998" ) == 0 );
3014 
3015  if( strlen( "" ) )
3016  fct_chk( mpi_read_string( &RR, 10, "" ) == 0 );
3017 
3018  res = mpi_exp_mod( &Z, &A, &E, &N, &RR );
3019  fct_chk( res == 0 );
3020  if( res == 0 )
3021  {
3022  fct_chk( mpi_cmp_mpi( &Z, &X ) == 0 );
3023  }
3024 
3025  mpi_free( &A ); mpi_free( &E ); mpi_free( &N );
3026  mpi_free( &RR ); mpi_free( &Z ); mpi_free( &X );
3027  }
3028  FCT_TEST_END();
3029 
3030 
3031  FCT_TEST_BGN(test_mpi_exp_mod_negative_base)
3032  {
3033  mpi A, E, N, RR, Z, X;
3034  int res;
3035  mpi_init( &A ); mpi_init( &E ); mpi_init( &N );
3036  mpi_init( &RR ); mpi_init( &Z ); mpi_init( &X );
3037 
3038  fct_chk( mpi_read_string( &A, 16, "-9f13012cd92aa72fb86ac8879d2fde4f7fd661aaae43a00971f081cc60ca277059d5c37e89652e2af2585d281d66ef6a9d38a117e9608e9e7574cd142dc55278838a2161dd56db9470d4c1da2d5df15a908ee2eb886aaa890f23be16de59386663a12f1afbb325431a3e835e3fd89b98b96a6f77382f458ef9a37e1f84a03045c8676ab55291a94c2228ea15448ee96b626b998" ) == 0 );
3039  fct_chk( mpi_read_string( &E, 16, "40a54d1b9e86789f06d9607fb158672d64867665c73ee9abb545fc7a785634b354c7bae5b962ce8040cf45f2c1f3d3659b2ee5ede17534c8fc2ec85c815e8df1fe7048d12c90ee31b88a68a081f17f0d8ce5f4030521e9400083bcea73a429031d4ca7949c2000d597088e0c39a6014d8bf962b73bb2e8083bd0390a4e00b9b3" ) == 0 );
3040  fct_chk( mpi_read_string( &N, 16, "eeaf0ab9adb38dd69c33f80afa8fc5e86072618775ff3c0b9ea2314c9c256576d674df7496ea81d3383b4813d692c6e0e0d5d8e250b98be48e495c1d6089dad15dc7d7b46154d6b6ce8ef4ad69b15d4982559b297bcf1885c529f566660e57ec68edbc3c05726cc02fd4cbf4976eaa9afd5138fe8376435b9fc61d2fc0eb06e3" ) == 0 );
3041  fct_chk( mpi_read_string( &X, 16, "21acc7199e1b90f9b4844ffe12c19f00ec548c5d32b21c647d48b6015d8eb9ec9db05b4f3d44db4227a2b5659c1a7cceb9d5fa8fa60376047953ce7397d90aaeb7465e14e820734f84aa52ad0fc66701bcbb991d57715806a11531268e1e83dd48288c72b424a6287e9ce4e5cc4db0dd67614aecc23b0124a5776d36e5c89483" ) == 0 );
3042 
3043  if( strlen( "" ) )
3044  fct_chk( mpi_read_string( &RR, 16, "" ) == 0 );
3045 
3046  res = mpi_exp_mod( &Z, &A, &E, &N, &RR );
3047  fct_chk( res == 0 );
3048  if( res == 0 )
3049  {
3050  fct_chk( mpi_cmp_mpi( &Z, &X ) == 0 );
3051  }
3052 
3053  mpi_free( &A ); mpi_free( &E ); mpi_free( &N );
3054  mpi_free( &RR ); mpi_free( &Z ); mpi_free( &X );
3055  }
3056  FCT_TEST_END();
3057 
3058 
3059  FCT_TEST_BGN(base_test_gcd_1)
3060  {
3061  mpi A, X, Y, Z;
3062  mpi_init( &A ); mpi_init( &X ); mpi_init( &Y ); mpi_init( &Z );
3063 
3064  fct_chk( mpi_read_string( &X, 10, "693" ) == 0 );
3065  fct_chk( mpi_read_string( &Y, 10, "609" ) == 0 );
3066  fct_chk( mpi_read_string( &A, 10, "21" ) == 0 );
3067  fct_chk( mpi_gcd( &Z, &X, &Y ) == 0 );
3068  fct_chk( mpi_cmp_mpi( &Z, &A ) == 0 );
3069 
3070  mpi_free( &A ); mpi_free( &X ); mpi_free( &Y ); mpi_free( &Z );
3071  }
3072  FCT_TEST_END();
3073 
3074 
3075  FCT_TEST_BGN(base_test_gcd_2)
3076  {
3077  mpi A, X, Y, Z;
3078  mpi_init( &A ); mpi_init( &X ); mpi_init( &Y ); mpi_init( &Z );
3079 
3080  fct_chk( mpi_read_string( &X, 10, "1764" ) == 0 );
3081  fct_chk( mpi_read_string( &Y, 10, "868" ) == 0 );
3082  fct_chk( mpi_read_string( &A, 10, "28" ) == 0 );
3083  fct_chk( mpi_gcd( &Z, &X, &Y ) == 0 );
3084  fct_chk( mpi_cmp_mpi( &Z, &A ) == 0 );
3085 
3086  mpi_free( &A ); mpi_free( &X ); mpi_free( &Y ); mpi_free( &Z );
3087  }
3088  FCT_TEST_END();
3089 
3090 
3091  FCT_TEST_BGN(base_test_gcd_3)
3092  {
3093  mpi A, X, Y, Z;
3094  mpi_init( &A ); mpi_init( &X ); mpi_init( &Y ); mpi_init( &Z );
3095 
3096  fct_chk( mpi_read_string( &X, 10, "768454923" ) == 0 );
3097  fct_chk( mpi_read_string( &Y, 10, "542167814" ) == 0 );
3098  fct_chk( mpi_read_string( &A, 10, "1" ) == 0 );
3099  fct_chk( mpi_gcd( &Z, &X, &Y ) == 0 );
3100  fct_chk( mpi_cmp_mpi( &Z, &A ) == 0 );
3101 
3102  mpi_free( &A ); mpi_free( &X ); mpi_free( &Y ); mpi_free( &Z );
3103  }
3104  FCT_TEST_END();
3105 
3106 
3107  FCT_TEST_BGN(test_gcd_1)
3108  {
3109  mpi A, X, Y, Z;
3110  mpi_init( &A ); mpi_init( &X ); mpi_init( &Y ); mpi_init( &Z );
3111 
3112  fct_chk( mpi_read_string( &X, 10, "433019240910377478217373572959560109819648647016096560523769010881172869083338285573756574557395862965095016483867813043663981946477698466501451832407592327356331263124555137732393938242285782144928753919588632679050799198937132922145084847" ) == 0 );
3113  fct_chk( mpi_read_string( &Y, 10, "5781538327977828897150909166778407659250458379645823062042492461576758526757490910073628008613977550546382774775570888130029763571528699574717583228939535960234464230882573615930384979100379102915657483866755371559811718767760594919456971354184113721" ) == 0 );
3114  fct_chk( mpi_read_string( &A, 10, "1" ) == 0 );
3115  fct_chk( mpi_gcd( &Z, &X, &Y ) == 0 );
3116  fct_chk( mpi_cmp_mpi( &Z, &A ) == 0 );
3117 
3118  mpi_free( &A ); mpi_free( &X ); mpi_free( &Y ); mpi_free( &Z );
3119  }
3120  FCT_TEST_END();
3121 
3122 #ifdef POLARSSL_GENPRIME
3123 
3124  FCT_TEST_BGN(base_test_mpi_inv_mod_1)
3125  {
3126  mpi X, Y, Z, A;
3127  int res;
3128  mpi_init( &X ); mpi_init( &Y ); mpi_init( &Z ); mpi_init( &A );
3129 
3130  fct_chk( mpi_read_string( &X, 10, "3" ) == 0 );
3131  fct_chk( mpi_read_string( &Y, 10, "11" ) == 0 );
3132  fct_chk( mpi_read_string( &A, 10, "4" ) == 0 );
3133  res = mpi_inv_mod( &Z, &X, &Y );
3134  fct_chk( res == 0 );
3135  if( res == 0 )
3136  {
3137  fct_chk( mpi_cmp_mpi( &Z, &A ) == 0 );
3138  }
3139 
3140  mpi_free( &X ); mpi_free( &Y ); mpi_free( &Z ); mpi_free( &A );
3141  }
3142  FCT_TEST_END();
3143 #endif /* POLARSSL_GENPRIME */
3144 
3145 #ifdef POLARSSL_GENPRIME
3146 
3147  FCT_TEST_BGN(base_test_mpi_inv_mod_2)
3148  {
3149  mpi X, Y, Z, A;
3150  int res;
3151  mpi_init( &X ); mpi_init( &Y ); mpi_init( &Z ); mpi_init( &A );
3152 
3153  fct_chk( mpi_read_string( &X, 10, "3" ) == 0 );
3154  fct_chk( mpi_read_string( &Y, 10, "0" ) == 0 );
3155  fct_chk( mpi_read_string( &A, 10, "0" ) == 0 );
3156  res = mpi_inv_mod( &Z, &X, &Y );
3157  fct_chk( res == POLARSSL_ERR_MPI_BAD_INPUT_DATA );
3158  if( res == 0 )
3159  {
3160  fct_chk( mpi_cmp_mpi( &Z, &A ) == 0 );
3161  }
3162 
3163  mpi_free( &X ); mpi_free( &Y ); mpi_free( &Z ); mpi_free( &A );
3164  }
3165  FCT_TEST_END();
3166 #endif /* POLARSSL_GENPRIME */
3167 
3168 #ifdef POLARSSL_GENPRIME
3169 
3170  FCT_TEST_BGN(base_test_mpi_inv_mod_3)
3171  {
3172  mpi X, Y, Z, A;
3173  int res;
3174  mpi_init( &X ); mpi_init( &Y ); mpi_init( &Z ); mpi_init( &A );
3175 
3176  fct_chk( mpi_read_string( &X, 10, "3" ) == 0 );
3177  fct_chk( mpi_read_string( &Y, 10, "-11" ) == 0 );
3178  fct_chk( mpi_read_string( &A, 10, "4" ) == 0 );
3179  res = mpi_inv_mod( &Z, &X, &Y );
3180  fct_chk( res == POLARSSL_ERR_MPI_BAD_INPUT_DATA );
3181  if( res == 0 )
3182  {
3183  fct_chk( mpi_cmp_mpi( &Z, &A ) == 0 );
3184  }
3185 
3186  mpi_free( &X ); mpi_free( &Y ); mpi_free( &Z ); mpi_free( &A );
3187  }
3188  FCT_TEST_END();
3189 #endif /* POLARSSL_GENPRIME */
3190 
3191 #ifdef POLARSSL_GENPRIME
3192 
3193  FCT_TEST_BGN(base_test_mpi_inv_mod_4)
3194  {
3195  mpi X, Y, Z, A;
3196  int res;
3197  mpi_init( &X ); mpi_init( &Y ); mpi_init( &Z ); mpi_init( &A );
3198 
3199  fct_chk( mpi_read_string( &X, 10, "2" ) == 0 );
3200  fct_chk( mpi_read_string( &Y, 10, "4" ) == 0 );
3201  fct_chk( mpi_read_string( &A, 10, "0" ) == 0 );
3202  res = mpi_inv_mod( &Z, &X, &Y );
3203  fct_chk( res == POLARSSL_ERR_MPI_NOT_ACCEPTABLE );
3204  if( res == 0 )
3205  {
3206  fct_chk( mpi_cmp_mpi( &Z, &A ) == 0 );
3207  }
3208 
3209  mpi_free( &X ); mpi_free( &Y ); mpi_free( &Z ); mpi_free( &A );
3210  }
3211  FCT_TEST_END();
3212 #endif /* POLARSSL_GENPRIME */
3213 
3214 #ifdef POLARSSL_GENPRIME
3215 
3216  FCT_TEST_BGN(test_mpi_inv_mod_1)
3217  {
3218  mpi X, Y, Z, A;
3219  int res;
3220  mpi_init( &X ); mpi_init( &Y ); mpi_init( &Z ); mpi_init( &A );
3221 
3222  fct_chk( mpi_read_string( &X, 16, "aa4df5cb14b4c31237f98bd1faf527c283c2d0f3eec89718664ba33f9762907c" ) == 0 );
3223  fct_chk( mpi_read_string( &Y, 16, "fffbbd660b94412ae61ead9c2906a344116e316a256fd387874c6c675b1d587d" ) == 0 );
3224  fct_chk( mpi_read_string( &A, 16, "8d6a5c1d7adeae3e94b9bcd2c47e0d46e778bc8804a2cc25c02d775dc3d05b0c" ) == 0 );
3225  res = mpi_inv_mod( &Z, &X, &Y );
3226  fct_chk( res == 0 );
3227  if( res == 0 )
3228  {
3229  fct_chk( mpi_cmp_mpi( &Z, &A ) == 0 );
3230  }
3231 
3232  mpi_free( &X ); mpi_free( &Y ); mpi_free( &Z ); mpi_free( &A );
3233  }
3234  FCT_TEST_END();
3235 #endif /* POLARSSL_GENPRIME */
3236 
3237 #ifdef POLARSSL_GENPRIME
3238 
3239  FCT_TEST_BGN(base_test_mpi_is_prime_1)
3240  {
3241  mpi X;
3242  int res;
3243  mpi_init( &X );
3244 
3245  fct_chk( mpi_read_string( &X, 10, "0" ) == 0 );
3246  res = mpi_is_prime( &X, rnd_std_rand, NULL );
3247  fct_chk( res == POLARSSL_ERR_MPI_NOT_ACCEPTABLE );
3248 
3249  mpi_free( &X );
3250  }
3251  FCT_TEST_END();
3252 #endif /* POLARSSL_GENPRIME */
3253 
3254 #ifdef POLARSSL_GENPRIME
3255 
3256  FCT_TEST_BGN(base_test_mpi_is_prime_2)
3257  {
3258  mpi X;
3259  int res;
3260  mpi_init( &X );
3261 
3262  fct_chk( mpi_read_string( &X, 10, "1" ) == 0 );
3263  res = mpi_is_prime( &X, rnd_std_rand, NULL );
3264  fct_chk( res == POLARSSL_ERR_MPI_NOT_ACCEPTABLE );
3265 
3266  mpi_free( &X );
3267  }
3268  FCT_TEST_END();
3269 #endif /* POLARSSL_GENPRIME */
3270 
3271 #ifdef POLARSSL_GENPRIME
3272 
3273  FCT_TEST_BGN(base_test_mpi_is_prime_3)
3274  {
3275  mpi X;
3276  int res;
3277  mpi_init( &X );
3278 
3279  fct_chk( mpi_read_string( &X, 10, "2" ) == 0 );
3280  res = mpi_is_prime( &X, rnd_std_rand, NULL );
3281  fct_chk( res == 0 );
3282 
3283  mpi_free( &X );
3284  }
3285  FCT_TEST_END();
3286 #endif /* POLARSSL_GENPRIME */
3287 
3288 #ifdef POLARSSL_GENPRIME
3289 
3290  FCT_TEST_BGN(base_test_mpi_is_prime_4)
3291  {
3292  mpi X;
3293  int res;
3294  mpi_init( &X );
3295 
3296  fct_chk( mpi_read_string( &X, 10, "3" ) == 0 );
3297  res = mpi_is_prime( &X, rnd_std_rand, NULL );
3298  fct_chk( res == 0 );
3299 
3300  mpi_free( &X );
3301  }
3302  FCT_TEST_END();
3303 #endif /* POLARSSL_GENPRIME */
3304 
3305 #ifdef POLARSSL_GENPRIME
3306 
3307  FCT_TEST_BGN(base_test_mpi_is_prime_5)
3308  {
3309  mpi X;
3310  int res;
3311  mpi_init( &X );
3312 
3313  fct_chk( mpi_read_string( &X, 10, "4" ) == 0 );
3314  res = mpi_is_prime( &X, rnd_std_rand, NULL );
3315  fct_chk( res == POLARSSL_ERR_MPI_NOT_ACCEPTABLE );
3316 
3317  mpi_free( &X );
3318  }
3319  FCT_TEST_END();
3320 #endif /* POLARSSL_GENPRIME */
3321 
3322 #ifdef POLARSSL_GENPRIME
3323 
3324  FCT_TEST_BGN(base_test_mpi_is_prime_6)
3325  {
3326  mpi X;
3327  int res;
3328  mpi_init( &X );
3329 
3330  fct_chk( mpi_read_string( &X, 10, "5" ) == 0 );
3331  res = mpi_is_prime( &X, rnd_std_rand, NULL );
3332  fct_chk( res == 0 );
3333 
3334  mpi_free( &X );
3335  }
3336  FCT_TEST_END();
3337 #endif /* POLARSSL_GENPRIME */
3338 
3339 #ifdef POLARSSL_GENPRIME
3340 
3341  FCT_TEST_BGN(base_test_mpi_is_prime_7)
3342  {
3343  mpi X;
3344  int res;
3345  mpi_init( &X );
3346 
3347  fct_chk( mpi_read_string( &X, 10, "27" ) == 0 );
3348  res = mpi_is_prime( &X, rnd_std_rand, NULL );
3349  fct_chk( res == POLARSSL_ERR_MPI_NOT_ACCEPTABLE );
3350 
3351  mpi_free( &X );
3352  }
3353  FCT_TEST_END();
3354 #endif /* POLARSSL_GENPRIME */
3355 
3356 #ifdef POLARSSL_GENPRIME
3357 
3358  FCT_TEST_BGN(base_test_mpi_is_prime_8)
3359  {
3360  mpi X;
3361  int res;
3362  mpi_init( &X );
3363 
3364  fct_chk( mpi_read_string( &X, 10, "47" ) == 0 );
3365  res = mpi_is_prime( &X, rnd_std_rand, NULL );
3366  fct_chk( res == 0 );
3367 
3368  mpi_free( &X );
3369  }
3370  FCT_TEST_END();
3371 #endif /* POLARSSL_GENPRIME */
3372 
3373 #ifdef POLARSSL_GENPRIME
3374 
3375  FCT_TEST_BGN(test_mpi_is_prime_1)
3376  {
3377  mpi X;
3378  int res;
3379  mpi_init( &X );
3380 
3381  fct_chk( mpi_read_string( &X, 10, "827131507221654563937832686696200995595835694437983658840870036586124168186967796809117749047430768825822857042432722828096779098498192459819306321073968735177531164565305635281198148032612029767584644305912099" ) == 0 );
3382  res = mpi_is_prime( &X, rnd_std_rand, NULL );
3383  fct_chk( res == 0 );
3384 
3385  mpi_free( &X );
3386  }
3387  FCT_TEST_END();
3388 #endif /* POLARSSL_GENPRIME */
3389 
3390 #ifdef POLARSSL_GENPRIME
3391 
3392  FCT_TEST_BGN(test_mpi_is_prime_2)
3393  {
3394  mpi X;
3395  int res;
3396  mpi_init( &X );
3397 
3398  fct_chk( mpi_read_string( &X, 10, "827131507221654563937832686696200995595835694437983658840870036586124168186967796809117749047430768825822857042432722828096779098498192459819306321073968735177531164565305635281198148032612029767584644305912001" ) == 0 );
3399  res = mpi_is_prime( &X, rnd_std_rand, NULL );
3400  fct_chk( res == POLARSSL_ERR_MPI_NOT_ACCEPTABLE );
3401 
3402  mpi_free( &X );
3403  }
3404  FCT_TEST_END();
3405 #endif /* POLARSSL_GENPRIME */
3406 
3407 #ifdef POLARSSL_GENPRIME
3408 
3409  FCT_TEST_BGN(test_mpi_is_prime_3)
3410  {
3411  mpi X;
3412  int res;
3413  mpi_init( &X );
3414 
3415  fct_chk( mpi_read_string( &X, 10, "2833419889721787128217599" ) == 0 );
3416  res = mpi_is_prime( &X, rnd_std_rand, NULL );
3417  fct_chk( res == 0 );
3418 
3419  mpi_free( &X );
3420  }
3421  FCT_TEST_END();
3422 #endif /* POLARSSL_GENPRIME */
3423 
3424 #ifdef POLARSSL_GENPRIME
3425 
3426  FCT_TEST_BGN(test_mpi_is_prime_4)
3427  {
3428  mpi X;
3429  int res;
3430  mpi_init( &X );
3431 
3432  fct_chk( mpi_read_string( &X, 10, "195845982777569926302400511" ) == 0 );
3433  res = mpi_is_prime( &X, rnd_std_rand, NULL );
3434  fct_chk( res == 0 );
3435 
3436  mpi_free( &X );
3437  }
3438  FCT_TEST_END();
3439 #endif /* POLARSSL_GENPRIME */
3440 
3441 #ifdef POLARSSL_GENPRIME
3442 
3443  FCT_TEST_BGN(test_mpi_is_prime_5)
3444  {
3445  mpi X;
3446  int res;
3447  mpi_init( &X );
3448 
3449  fct_chk( mpi_read_string( &X, 10, "4776913109852041418248056622882488319" ) == 0 );
3450  res = mpi_is_prime( &X, rnd_std_rand, NULL );
3451  fct_chk( res == 0 );
3452 
3453  mpi_free( &X );
3454  }
3455  FCT_TEST_END();
3456 #endif /* POLARSSL_GENPRIME */
3457 
3458 #ifdef POLARSSL_GENPRIME
3459 
3460  FCT_TEST_BGN(test_mpi_is_prime_5)
3461  {
3462  mpi X;
3463  int res;
3464  mpi_init( &X );
3465 
3466  fct_chk( mpi_read_string( &X, 10, "768614336404564651" ) == 0 );
3467  res = mpi_is_prime( &X, rnd_std_rand, NULL );
3468  fct_chk( res == 0 );
3469 
3470  mpi_free( &X );
3471  }
3472  FCT_TEST_END();
3473 #endif /* POLARSSL_GENPRIME */
3474 
3475 #ifdef POLARSSL_GENPRIME
3476 
3477  FCT_TEST_BGN(test_mpi_is_prime_6)
3478  {
3479  mpi X;
3480  int res;
3481  mpi_init( &X );
3482 
3483  fct_chk( mpi_read_string( &X, 10, "201487636602438195784363" ) == 0 );
3484  res = mpi_is_prime( &X, rnd_std_rand, NULL );
3485  fct_chk( res == 0 );
3486 
3487  mpi_free( &X );
3488  }
3489  FCT_TEST_END();
3490 #endif /* POLARSSL_GENPRIME */
3491 
3492 #ifdef POLARSSL_GENPRIME
3493 
3494  FCT_TEST_BGN(test_mpi_is_prime_7)
3495  {
3496  mpi X;
3497  int res;
3498  mpi_init( &X );
3499 
3500  fct_chk( mpi_read_string( &X, 10, "845100400152152934331135470251" ) == 0 );
3501  res = mpi_is_prime( &X, rnd_std_rand, NULL );
3502  fct_chk( res == 0 );
3503 
3504  mpi_free( &X );
3505  }
3506  FCT_TEST_END();
3507 #endif /* POLARSSL_GENPRIME */
3508 
3509 #ifdef POLARSSL_GENPRIME
3510 
3511  FCT_TEST_BGN(test_mpi_is_prime_8)
3512  {
3513  mpi X;
3514  int res;
3515  mpi_init( &X );
3516 
3517  fct_chk( mpi_read_string( &X, 10, "56713727820156410577229101238628035243" ) == 0 );
3518  res = mpi_is_prime( &X, rnd_std_rand, NULL );
3519  fct_chk( res == 0 );
3520 
3521  mpi_free( &X );
3522  }
3523  FCT_TEST_END();
3524 #endif /* POLARSSL_GENPRIME */
3525 
3526 #ifdef POLARSSL_GENPRIME
3527 
3528  FCT_TEST_BGN(test_mpi_is_prime_9)
3529  {
3530  mpi X;
3531  int res;
3532  mpi_init( &X );
3533 
3534  fct_chk( mpi_read_string( &X, 10, "203956878356401977405765866929034577280193993314348263094772646453283062722701277632936616063144088173312372882677123879538709400158306567338328279154499698366071906766440037074217117805690872792848149112022286332144876183376326512083574821647933992961249917319836219304274280243803104015000563790123" ) == 0 );
3535  res = mpi_is_prime( &X, rnd_std_rand, NULL );
3536  fct_chk( res == 0 );
3537 
3538  mpi_free( &X );
3539  }
3540  FCT_TEST_END();
3541 #endif /* POLARSSL_GENPRIME */
3542 
3543 #ifdef POLARSSL_GENPRIME
3544 
3545  FCT_TEST_BGN(test_mpi_is_prime_10)
3546  {
3547  mpi X;
3548  int res;
3549  mpi_init( &X );
3550 
3551  fct_chk( mpi_read_string( &X, 10, "531872289054204184185084734375133399408303613982130856645299464930952178606045848877129147820387996428175564228204785846141207532462936339834139412401975338705794646595487324365194792822189473092273993580587964571659678084484152603881094176995594813302284232006001752128168901293560051833646881436219" ) == 0 );
3552  res = mpi_is_prime( &X, rnd_std_rand, NULL );
3553  fct_chk( res == 0 );
3554 
3555  mpi_free( &X );
3556  }
3557  FCT_TEST_END();
3558 #endif /* POLARSSL_GENPRIME */
3559 
3560 #ifdef POLARSSL_GENPRIME
3561 
3562  FCT_TEST_BGN(test_mpi_is_prime_11)
3563  {
3564  mpi X;
3565  int res;
3566  mpi_init( &X );
3567 
3568  fct_chk( mpi_read_string( &X, 10, "319705304701141539155720137200974664666792526059405792539680974929469783512821793995613718943171723765238853752439032835985158829038528214925658918372196742089464683960239919950882355844766055365179937610326127675178857306260955550407044463370239890187189750909036833976197804646589380690779463976173" ) == 0 );
3569  res = mpi_is_prime( &X, rnd_std_rand, NULL );
3570  fct_chk( res == 0 );
3571 
3572  mpi_free( &X );
3573  }
3574  FCT_TEST_END();
3575 #endif /* POLARSSL_GENPRIME */
3576 
3577 #ifdef POLARSSL_GENPRIME
3578 
3579  FCT_TEST_BGN(test_mpi_is_prime_12)
3580  {
3581  mpi X;
3582  int res;
3583  mpi_init( &X );
3584 
3585  fct_chk( mpi_read_string( &X, 10, "200603822195324642393516294012917598972967449320074999667103434371470616000652036570009912021332527788252300901905236578801044680456930305350440933538867383130165841118050781326291059830545891570648243241795871" ) == 0 );
3586  res = mpi_is_prime( &X, rnd_std_rand, NULL );
3587  fct_chk( res == 0 );
3588 
3589  mpi_free( &X );
3590  }
3591  FCT_TEST_END();
3592 #endif /* POLARSSL_GENPRIME */
3593 
3594 #ifdef POLARSSL_GENPRIME
3595 
3596  FCT_TEST_BGN(test_mpi_is_prime_13)
3597  {
3598  mpi X;
3599  int res;
3600  mpi_init( &X );
3601 
3602  fct_chk( mpi_read_string( &X, 10, "827131507221654563937832686696200995595835694437983658840870036586124168186967796809117749047430768825822857042432722828096779098498192459819306321073968735177531164565305635281198148032612029767584644305912099" ) == 0 );
3603  res = mpi_is_prime( &X, rnd_std_rand, NULL );
3604  fct_chk( res == 0 );
3605 
3606  mpi_free( &X );
3607  }
3608  FCT_TEST_END();
3609 #endif /* POLARSSL_GENPRIME */
3610 
3611 #ifdef POLARSSL_GENPRIME
3612 
3613  FCT_TEST_BGN(test_mpi_is_prime_14)
3614  {
3615  mpi X;
3616  int res;
3617  mpi_init( &X );
3618 
3619  fct_chk( mpi_read_string( &X, 10, "964274047248418797145090983157197980855078966882276492572788532954904112655338439361306213898569516593744267391754033306465125919199692703323878557833023573312685002670662846477592597659826113460619815244721311" ) == 0 );
3620  res = mpi_is_prime( &X, rnd_std_rand, NULL );
3621  fct_chk( res == 0 );
3622 
3623  mpi_free( &X );
3624  }
3625  FCT_TEST_END();
3626 #endif /* POLARSSL_GENPRIME */
3627 
3628 #ifdef POLARSSL_GENPRIME
3629 
3630  FCT_TEST_BGN(test_mpi_is_prime_15)
3631  {
3632  mpi X;
3633  int res;
3634  mpi_init( &X );
3635 
3636  fct_chk( mpi_read_string( &X, 10, "170141183460469231731687303715884105727" ) == 0 );
3637  res = mpi_is_prime( &X, rnd_std_rand, NULL );
3638  fct_chk( res == 0 );
3639 
3640  mpi_free( &X );
3641  }
3642  FCT_TEST_END();
3643 #endif /* POLARSSL_GENPRIME */
3644 
3645 #ifdef POLARSSL_GENPRIME
3646 
3647  FCT_TEST_BGN(test_mpi_is_prime_16)
3648  {
3649  mpi X;
3650  int res;
3651  mpi_init( &X );
3652 
3653  fct_chk( mpi_read_string( &X, 10, "2147483647" ) == 0 );
3654  res = mpi_is_prime( &X, rnd_std_rand, NULL );
3655  fct_chk( res == 0 );
3656 
3657  mpi_free( &X );
3658  }
3659  FCT_TEST_END();
3660 #endif /* POLARSSL_GENPRIME */
3661 
3662 #ifdef POLARSSL_GENPRIME
3663 
3664  FCT_TEST_BGN(test_mpi_is_prime_17)
3665  {
3666  mpi X;
3667  int res;
3668  mpi_init( &X );
3669 
3670  fct_chk( mpi_read_string( &X, 10, "961748941" ) == 0 );
3671  res = mpi_is_prime( &X, rnd_std_rand, NULL );
3672  fct_chk( res == 0 );
3673 
3674  mpi_free( &X );
3675  }
3676  FCT_TEST_END();
3677 #endif /* POLARSSL_GENPRIME */
3678 
3679 #ifdef POLARSSL_GENPRIME
3680 
3681  FCT_TEST_BGN(test_mpi_is_prime_18)
3682  {
3683  mpi X;
3684  int res;
3685  mpi_init( &X );
3686 
3687  fct_chk( mpi_read_string( &X, 10, "179424691" ) == 0 );
3688  res = mpi_is_prime( &X, rnd_std_rand, NULL );
3689  fct_chk( res == 0 );
3690 
3691  mpi_free( &X );
3692  }
3693  FCT_TEST_END();
3694 #endif /* POLARSSL_GENPRIME */
3695 
3696 #ifdef POLARSSL_GENPRIME
3697 
3698  FCT_TEST_BGN(test_mpi_is_prime_19)
3699  {
3700  mpi X;
3701  int res;
3702  mpi_init( &X );
3703 
3704  fct_chk( mpi_read_string( &X, 10, "32452867" ) == 0 );
3705  res = mpi_is_prime( &X, rnd_std_rand, NULL );
3706  fct_chk( res == 0 );
3707 
3708  mpi_free( &X );
3709  }
3710  FCT_TEST_END();
3711 #endif /* POLARSSL_GENPRIME */
3712 
3713 #ifdef POLARSSL_GENPRIME
3714 
3715  FCT_TEST_BGN(test_mpi_is_prime_20)
3716  {
3717  mpi X;
3718  int res;
3719  mpi_init( &X );
3720 
3721  fct_chk( mpi_read_string( &X, 10, "49979687" ) == 0 );
3722  res = mpi_is_prime( &X, rnd_std_rand, NULL );
3723  fct_chk( res == 0 );
3724 
3725  mpi_free( &X );
3726  }
3727  FCT_TEST_END();
3728 #endif /* POLARSSL_GENPRIME */
3729 
3730 
3731  FCT_TEST_BGN(test_bit_getting_value_bit_25)
3732  {
3733  mpi X;
3734  mpi_init( &X );
3735  fct_chk( mpi_read_string( &X, 10, "49979687" ) == 0 );
3736  fct_chk( mpi_get_bit( &X, 25 ) == 1 );
3737 
3738  mpi_free( &X );
3739  }
3740  FCT_TEST_END();
3741 
3742 
3743  FCT_TEST_BGN(test_bit_getting_larger_but_same_limb)
3744  {
3745  mpi X;
3746  mpi_init( &X );
3747  fct_chk( mpi_read_string( &X, 10, "49979687" ) == 0 );
3748  fct_chk( mpi_get_bit( &X, 26 ) == 0 );
3749 
3750  mpi_free( &X );
3751  }
3752  FCT_TEST_END();
3753 
3754 
3755  FCT_TEST_BGN(test_bit_getting_larger_and_non_existing_limb)
3756  {
3757  mpi X;
3758  mpi_init( &X );
3759  fct_chk( mpi_read_string( &X, 10, "49979687" ) == 0 );
3760  fct_chk( mpi_get_bit( &X, 500 ) == 0 );
3761 
3762  mpi_free( &X );
3763  }
3764  FCT_TEST_END();
3765 
3766 
3767  FCT_TEST_BGN(test_bit_getting_value_bit_24)
3768  {
3769  mpi X;
3770  mpi_init( &X );
3771  fct_chk( mpi_read_string( &X, 10, "49979687" ) == 0 );
3772  fct_chk( mpi_get_bit( &X, 24 ) == 0 );
3773 
3774  mpi_free( &X );
3775  }
3776  FCT_TEST_END();
3777 
3778 
3779  FCT_TEST_BGN(test_bit_getting_value_bit_23)
3780  {
3781  mpi X;
3782  mpi_init( &X );
3783  fct_chk( mpi_read_string( &X, 10, "49979687" ) == 0 );
3784  fct_chk( mpi_get_bit( &X, 23 ) == 1 );
3785 
3786  mpi_free( &X );
3787  }
3788  FCT_TEST_END();
3789 
3790 
3791  FCT_TEST_BGN(test_bit_set_change_existing_value_with_a_1)
3792  {
3793  mpi X, Y;
3794  mpi_init( &X ); mpi_init( &Y );
3795 
3796  fct_chk( mpi_read_string( &X, 10, "49979687" ) == 0 );
3797  fct_chk( mpi_read_string( &Y, 10, "66756903" ) == 0 );
3798  fct_chk( mpi_set_bit( &X, 24, 1 ) == 0 );
3799  fct_chk( mpi_cmp_mpi( &X, &Y ) == 0 );
3800 
3801  mpi_free( &X ); mpi_free( &Y );
3802  }
3803  FCT_TEST_END();
3804 
3805 
3806  FCT_TEST_BGN(test_bit_set_change_existing_value_with_a_0)
3807  {
3808  mpi X, Y;
3809  mpi_init( &X ); mpi_init( &Y );
3810 
3811  fct_chk( mpi_read_string( &X, 10, "49979687" ) == 0 );
3812  fct_chk( mpi_read_string( &Y, 10, "16425255" ) == 0 );
3813  fct_chk( mpi_set_bit( &X, 25, 0 ) == 0 );
3814  fct_chk( mpi_cmp_mpi( &X, &Y ) == 0 );
3815 
3816  mpi_free( &X ); mpi_free( &Y );
3817  }
3818  FCT_TEST_END();
3819 
3820 
3821  FCT_TEST_BGN(test_bit_set_add_above_existing_limbs_with_a_0)
3822  {
3823  mpi X, Y;
3824  mpi_init( &X ); mpi_init( &Y );
3825 
3826  fct_chk( mpi_read_string( &X, 10, "49979687" ) == 0 );
3827  fct_chk( mpi_read_string( &Y, 10, "49979687" ) == 0 );
3828  fct_chk( mpi_set_bit( &X, 80, 0 ) == 0 );
3829  fct_chk( mpi_cmp_mpi( &X, &Y ) == 0 );
3830 
3831  mpi_free( &X ); mpi_free( &Y );
3832  }
3833  FCT_TEST_END();
3834 
3835 
3836  FCT_TEST_BGN(test_bit_set_add_above_existing_limbs_with_a_1)
3837  {
3838  mpi X, Y;
3839  mpi_init( &X ); mpi_init( &Y );
3840 
3841  fct_chk( mpi_read_string( &X, 10, "49979687" ) == 0 );
3842  fct_chk( mpi_read_string( &Y, 10, "1208925819614629224685863" ) == 0 );
3843  fct_chk( mpi_set_bit( &X, 80, 1 ) == 0 );
3844  fct_chk( mpi_cmp_mpi( &X, &Y ) == 0 );
3845 
3846  mpi_free( &X ); mpi_free( &Y );
3847  }
3848  FCT_TEST_END();
3849 
3850 #ifdef POLARSSL_SELF_TEST
3851 
3852  FCT_TEST_BGN(mpi_selftest)
3853  {
3854  fct_chk( mpi_self_test( 0 ) == 0 );
3855  }
3856  FCT_TEST_END();
3857 #endif /* POLARSSL_SELF_TEST */
3858 
3859  }
3860  FCT_SUITE_END();
3861 
3862 #endif /* POLARSSL_BIGNUM_C */
3863 
3864 }
3865 FCT_END();
3866