1 /* makes a bignum test harness with NUM tests per operation
3 * the output is made in the following format [one parameter per line]
13 So for example "a * b mod n" would be
21 e.g. if a=3, b=4 n=11 then
34 #define THE_MASK 32767
42 #ifdef LTM_MTEST_REAL_RAND
43 #define getRandChar() fgetc(rng)
46 #define getRandChar() (rand()&0xFF)
49 void rand_num(mp_int *a)
52 unsigned char buf[2048];
55 size = 1 + ((getRandChar()<<8) + getRandChar()) % 101;
56 buf[0] = (getRandChar()&1)?1:0;
57 #ifdef LTM_MTEST_REAL_RAND
58 sz = fread(buf+1, 1, size, rng);
61 while (sz < (unsigned)size) {
62 buf[sz] = getRandChar();
66 if (sz != (unsigned)size) {
67 fprintf(stderr, "\nWarning: fread failed\n\n");
69 while (buf[1] == 0) buf[1] = getRandChar();
70 mp_read_raw(a, buf, 1+size);
73 void rand_num2(mp_int *a)
76 unsigned char buf[2048];
79 size = 10 + ((getRandChar()<<8) + getRandChar()) % 101;
80 buf[0] = (getRandChar()&1)?1:0;
81 #ifdef LTM_MTEST_REAL_RAND
82 sz = fread(buf+1, 1, size, rng);
85 while (sz < (unsigned)size) {
86 buf[sz] = getRandChar();
90 if (sz != (unsigned)size) {
91 fprintf(stderr, "\nWarning: fread failed\n\n");
93 while (buf[1] == 0) buf[1] = getRandChar();
94 mp_read_raw(a, buf, 1+size);
97 #define mp_to64(a, b) mp_toradix(a, b, 64)
99 int main(int argc, char *argv[])
103 mp_int a, b, c, d, e;
104 #ifdef MTEST_NO_FULLSPEED
116 max = strtol(argv[1], NULL, 0);
119 max = (1 << -(max)) + 1;
123 } else if (max == 0) {
131 /* initial (2^n - 1)^2 testing, makes sure the comba multiplier works [it has the new carry code] */
134 for (n = 1; n < 8192; n++) {
138 printf("%s\n%s\n", buf, buf);
148 #ifdef LTM_MTEST_REAL_RAND
149 rng = fopen("/dev/urandom", "rb");
151 rng = fopen("/dev/random", "rb");
153 fprintf(stderr, "\nWarning: no /dev/[u]random available\n\n");
162 #ifdef MTEST_NO_FULLSPEED
166 #ifdef MTEST_NO_FULLSPEED
167 if (clock() - t1 > CLOCKS_PER_SEC) {
172 n = getRandChar() % 15;
220 mp_div(&a, &b, &c, &d);
243 n = getRandChar() & 63;
244 mp_mul_2d(&b, n, &b);
255 n = getRandChar() & 63;
256 mp_div_2d(&b, n, &b, NULL);
296 /* if (c.dp[0]&1) mp_add_d(&c, 1, &c); */
297 a.sign = b.sign = c.sign = 0;
298 mp_exptmod(&a, &b, &c, &d);
308 } else if (n == 10) {
316 } while (mp_cmp_d(&c, 1) != 0 || mp_cmp_d(&b, 1) == 0);
317 mp_invmod(&a, &b, &c);
325 } else if (n == 11) {
334 } else if (n == 12) {
342 } else if (n == 13) {
344 tmp = abs(rand()) & THE_MASK;
345 mp_add_d(&a, tmp, &b);
348 printf("%s\n%d\n", buf, tmp);
351 } else if (n == 14) {
353 tmp = abs(rand()) & THE_MASK;
354 mp_sub_d(&a, tmp, &b);
357 printf("%s\n%d\n", buf, tmp);
360 } else if (n == 255) {
366 #ifdef LTM_MTEST_REAL_RAND