Back to index

lightning-sunbird  0.9+nobinonly
identest.c
Go to the documentation of this file.
00001 #include <stdio.h>
00002 #include <stdlib.h>
00003 #include "mpi.h"
00004 #include "mpprime.h"
00005 #include <sys/types.h>
00006 #include <time.h>
00007 
00008 #define MAX_PREC (4096 / MP_DIGIT_BIT)
00009 
00010 mp_err identity_test(void)
00011 {
00012   mp_size       preca, precb;
00013   mp_err        res;
00014   mp_int        a, b;
00015   mp_int        t1, t2, t3, t4, t5;
00016 
00017   preca = (rand() % MAX_PREC) + 1;
00018   precb = (rand() % MAX_PREC) + 1;
00019 
00020   MP_DIGITS(&a) = 0;
00021   MP_DIGITS(&b) = 0;
00022   MP_DIGITS(&t1) = 0;
00023   MP_DIGITS(&t2) = 0;
00024   MP_DIGITS(&t3) = 0;
00025   MP_DIGITS(&t4) = 0;
00026   MP_DIGITS(&t5) = 0;
00027 
00028   MP_CHECKOK( mp_init(&a)  );
00029   MP_CHECKOK( mp_init(&b)  );
00030   MP_CHECKOK( mp_init(&t1) );
00031   MP_CHECKOK( mp_init(&t2) );
00032   MP_CHECKOK( mp_init(&t3) );
00033   MP_CHECKOK( mp_init(&t4) );
00034   MP_CHECKOK( mp_init(&t5) );
00035 
00036   MP_CHECKOK( mpp_random_size(&a, preca) );
00037   MP_CHECKOK( mpp_random_size(&b, precb) );
00038 
00039   if (mp_cmp(&a, &b) < 0)
00040     mp_exch(&a, &b);
00041 
00042   MP_CHECKOK( mp_mod(&a, &b, &t1) );       /* t1 = a%b */
00043   MP_CHECKOK( mp_div(&a, &b, &t2, NULL) ); /* t2 = a/b */
00044   MP_CHECKOK( mp_mul(&b, &t2, &t3) );      /* t3 = (a/b)*b */
00045   MP_CHECKOK( mp_add(&t1, &t3, &t4) );     /* t4 = a%b + (a/b)*b */
00046   MP_CHECKOK( mp_sub(&t4, &a, &t5) );      /* t5 = a%b + (a/b)*b - a */
00047   if (mp_cmp_z(&t5) != 0) {
00048     res = MP_UNDEF;
00049     goto CLEANUP;
00050   }
00051 
00052 CLEANUP:
00053   mp_clear(&t5);
00054   mp_clear(&t4);
00055   mp_clear(&t3);
00056   mp_clear(&t2);
00057   mp_clear(&t1);
00058   mp_clear(&b);
00059   mp_clear(&a);
00060   return res;
00061 }
00062 
00063 int
00064 main(void)
00065 {
00066   unsigned int  seed = (unsigned int)time(NULL);
00067   unsigned long count = 0;
00068   mp_err        res;
00069 
00070   srand(seed);
00071 
00072   while (MP_OKAY == (res = identity_test())) {
00073      if ((++count % 100) == 0)
00074        fputc('.', stderr);
00075   }
00076 
00077   fprintf(stderr, "\ntest failed, err %d\n", res);
00078   return res;
00079 }