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