identest.c
上传用户:lyxiangda
上传日期:2007-01-12
资源大小:3042k
文件大小:1k
源码类别:

CA认证

开发平台:

WINDOWS

  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include "mpi.h"
  4. #include "mpprime.h"
  5. #include <sys/types.h>
  6. #include <time.h>
  7. #define MAX_PREC (4096 / MP_DIGIT_BIT)
  8. mp_err identity_test(void)
  9. {
  10.   mp_size       preca, precb;
  11.   mp_err        res;
  12.   mp_int        a, b;
  13.   mp_int        t1, t2, t3, t4, t5;
  14.   preca = (rand() % MAX_PREC) + 1;
  15.   precb = (rand() % MAX_PREC) + 1;
  16.   mp_init(&a);
  17.   mp_init(&b);
  18.   mp_init(&t1);
  19.   mp_init(&t2);
  20.   mp_init(&t3);
  21.   mp_init(&t4);
  22.   mp_init(&t5);
  23.   mpp_random_size(&a, preca);
  24.   mpp_random_size(&b, precb);
  25.   if (mp_cmp(&a, &b) < 0)
  26.     mp_exch(&a, &b);
  27.   MP_CHECKOK( mp_mod(&a, &b, &t1) );       /* t1 = a%b */
  28.   MP_CHECKOK( mp_div(&a, &b, &t2, &t3) );  /* t2 = a/b */
  29.   MP_CHECKOK( mp_mul(&b, &t2, &t3) );      /* t3 = (a/b)*b */
  30.   MP_CHECKOK( mp_add(&t1, &t3, &t4) );     /* t4 = a%b + (a/b)*b */
  31.   MP_CHECKOK( mp_sub(&t4, &a, &t5) );      /* t5 = a%b + (a/b)*b - a */
  32.   if (mp_cmp_z(&t5) != 0) {
  33.     res = MP_UNDEF;
  34.     goto CLEANUP;
  35.   }
  36. CLEANUP:
  37.   mp_clear(&a);
  38.   mp_clear(&b);
  39.   mp_clear(&t1);
  40.   mp_clear(&t2);
  41.   mp_clear(&t3);
  42.   mp_clear(&t4);
  43.   mp_clear(&t5);
  44.   return res;
  45. }
  46. int
  47. main(void)
  48. {
  49.   unsigned int  seed = (unsigned int)time(NULL);
  50.   unsigned long count = 0;
  51.   mp_err        res;
  52.   srand(seed);
  53.   while (MP_OKAY == (res = identity_test())) {
  54.      if ((++count % 100) == 0)
  55.        fputc('.', stderr);
  56.   }
  57.   fprintf(stderr, "ntest failed, err %dn", res);
  58.   return res;
  59. }