void GenerateKeys(mp_int *d, mp_int *e, mp_int *n) { while (1) { mp_int p; mp_init(&p); mp_prime_random_ex(&p,8,2048, LTM_PRIME_2MSB_ON, &createRandom,NULL); mp_print("P",&p); mp_int q; mp_init(&q); mp_prime_random_ex(&q,8,2048, LTM_PRIME_2MSB_ON, &createRandom,NULL); mp_print("Q",&q); mp_int pp; mp_init(&pp); mp_sub_d(&p,1,&pp); mp_int qq; mp_init(&qq); mp_sub_d(&q,1,&qq); mp_int pq; mp_init(&pq); mp_mul(&pp,&qq,&pq); mp_mul(&p,&q,n); mp_set(d, 5); mp_int temp; mp_init(&temp); mp_int g; mp_init(&g); mp_int t; mp_init(&t); mp_exteuclid(d,&pq,e, &temp,&g); if (mp_cmp_d(&g,1) == 0) return ; // now we would have to add 1, but we prefer to get some new numbers /* printf("Havve to add 1\n"); mp_add_d(d, 1, &t); printf("Exchange 1\n"); mp_copy(&t,d);*/ } }
int main(int argc, char *argv[]) { mp_digit num; mp_int a, b; srand(time(NULL)); if(argc < 3) { fprintf(stderr, "Usage: %s <a> <b>\n", argv[0]); return 1; } printf("Test 7: Random & divisibility tests\n\n"); mp_init(&a); mp_init(&b); mp_read_radix(&a, argv[1], 10); mp_read_radix(&b, argv[2], 10); printf("a = "); mp_print(&a, stdout); fputc('\n', stdout); printf("b = "); mp_print(&b, stdout); fputc('\n', stdout); if(mpp_divis(&a, &b) == MP_YES) printf("a is divisible by b\n"); else printf("a is not divisible by b\n"); if(mpp_divis(&b, &a) == MP_YES) printf("b is divisible by a\n"); else printf("b is not divisible by a\n"); printf("\nb = mpp_random()\n"); mpp_random(&b); printf("b = "); mp_print(&b, stdout); fputc('\n', stdout); mpp_random(&b); printf("b = "); mp_print(&b, stdout); fputc('\n', stdout); mpp_random(&b); printf("b = "); mp_print(&b, stdout); fputc('\n', stdout); printf("\nTesting a for divisibility by first 170 primes\n"); num = 170; if(mpp_divis_primes(&a, &num) == MP_YES) printf("It is divisible by at least one of them\n"); else printf("It is not divisible by any of them\n"); mp_clear(&b); mp_clear(&a); return 0; }
int main(int argc, char *argv[]) { mp_int a, b, c, x, y; if(argc < 3) { fprintf(stderr, "Usage: %s <a> <b>\n", argv[0]); return 1; } printf("Test 5: Number theoretic functions\n\n"); mp_init(&a); mp_init(&b); mp_read_radix(&a, argv[1], 10); mp_read_radix(&b, argv[2], 10); printf("a = "); mp_print(&a, stdout); fputc('\n', stdout); printf("b = "); mp_print(&b, stdout); fputc('\n', stdout); mp_init(&c); printf("\nc = (a, b)\n"); mp_gcd(&a, &b, &c); printf("Euclid: c = "); mp_print(&c, stdout); fputc('\n', stdout); /* mp_bgcd(&a, &b, &c); printf("Binary: c = "); mp_print(&c, stdout); fputc('\n', stdout); */ mp_init(&x); mp_init(&y); printf("\nc = (a, b) = ax + by\n"); mp_xgcd(&a, &b, &c, &x, &y); printf("c = "); mp_print(&c, stdout); fputc('\n', stdout); printf("x = "); mp_print(&x, stdout); fputc('\n', stdout); printf("y = "); mp_print(&y, stdout); fputc('\n', stdout); printf("\nc = a^-1 (mod b)\n"); if(mp_invmod(&a, &b, &c) == MP_UNDEF) { printf("a has no inverse mod b\n"); } else { printf("c = "); mp_print(&c, stdout); fputc('\n', stdout); } mp_clear(&y); mp_clear(&x); mp_clear(&c); mp_clear(&b); mp_clear(&a); return 0; }
int main(int argc, char *argv[]) { int ix; mp_digit num; mp_int a; srand(time(NULL)); if(argc < 2) { fprintf(stderr, "Usage: %s <a>\n", argv[0]); return 1; } printf("Test 8: Probabilistic primality testing\n\n"); mp_init(&a); mp_read_radix(&a, argv[1], 10); printf("a = "); mp_print(&a, stdout); fputc('\n', stdout); printf("\nChecking for divisibility by small primes ... \n"); num = 170; if(mpp_divis_primes(&a, &num) == MP_YES) { printf("it is not prime\n"); goto CLEANUP; } printf("Passed that test (not divisible by any small primes).\n"); for(ix = 0; ix < 10; ix++) { printf("\nPerforming Rabin-Miller test, iteration %d\n", ix + 1); if(mpp_pprime(&a, 5) == MP_NO) { printf("it is not prime\n"); goto CLEANUP; } } printf("All tests passed; a is probably prime\n"); CLEANUP: mp_clear(&a); return 0; }
int main(int argc, char *argv[]) { int ix; mp_int mp; #ifdef MAC_CW_SIOUX argc = ccommand(&argv); #endif mp_init(&mp); for(ix = 1; ix < argc; ix++) { mp_read_radix(&mp, argv[ix], 10); mp_print(&mp, stdout); fputc('\n', stdout); } mp_clear(&mp); return 0; }
int main(int argc, char *argv[]) { int ix, num, prec = PRECISION; mp_int a, b, c, d; instant_t start, finish; time_t seed; unsigned int d1, d2; seed = time(NULL); if(argc < 2) { fprintf(stderr, "Usage: %s <num-tests>\n", argv[0]); return 1; } if((num = atoi(argv[1])) < 0) num = -num; printf("Test 5a: Euclid vs. Binary, a GCD speed test\n\n" "Number of tests: %d\n" "Precision: %d digits\n\n", num, prec); mp_init_size(&a, prec); mp_init_size(&b, prec); mp_init(&c); mp_init(&d); printf("Verifying accuracy ... \n"); srand((unsigned int)seed); for(ix = 0; ix < num; ix++) { mpp_random_size(&a, prec); mpp_random_size(&b, prec); mp_gcd(&a, &b, &c); mp_bgcd(&a, &b, &d); if(mp_cmp(&c, &d) != 0) { printf("Error! Results not accurate:\n"); printf("a = "); mp_print(&a, stdout); fputc('\n', stdout); printf("b = "); mp_print(&b, stdout); fputc('\n', stdout); printf("c = "); mp_print(&c, stdout); fputc('\n', stdout); printf("d = "); mp_print(&d, stdout); fputc('\n', stdout); mp_clear(&a); mp_clear(&b); mp_clear(&c); mp_clear(&d); return 1; } } mp_clear(&d); printf("Accuracy confirmed for the %d test samples\n", num); printf("Testing Euclid ... \n"); srand((unsigned int)seed); start = now(); for(ix = 0; ix < num; ix++) { mpp_random_size(&a, prec); mpp_random_size(&b, prec); mp_gcd(&a, &b, &c); } finish = now(); d1 = (finish.sec - start.sec) * 1000000; d1 -= start.usec; d1 += finish.usec; printf("Testing binary ... \n"); srand((unsigned int)seed); start = now(); for(ix = 0; ix < num; ix++) { mpp_random_size(&a, prec); mpp_random_size(&b, prec); mp_bgcd(&a, &b, &c); } finish = now(); d2 = (finish.sec - start.sec) * 1000000; d2 -= start.usec; d2 += finish.usec; printf("Euclidean algorithm time: %u usec\n", d1); printf("Binary algorithm time: %u usec\n", d2); printf("Improvement: %.2f%%\n", (1.0 - ((double)d2 / (double)d1)) * 100.0); mp_clear(&c); mp_clear(&b); mp_clear(&a); return 0; }
int main(int argc, char *argv[]) { mp_int a, b, c; int pco; mp_err res; printf("Test 9: Logical functions\n\n"); if(argc < 3) { fprintf(stderr, "Usage: %s <a> <b>\n", argv[0]); return 1; } mp_init(&a); mp_init(&b); mp_init(&c); mp_read_radix(&a, argv[1], 16); mp_read_radix(&b, argv[2], 16); printf("a = "); mp_print(&a, stdout); fputc('\n', stdout); printf("b = "); mp_print(&b, stdout); fputc('\n', stdout); mpl_not(&a, &c); printf("~a = "); mp_print(&c, stdout); fputc('\n', stdout); mpl_and(&a, &b, &c); printf("a & b = "); mp_print(&c, stdout); fputc('\n', stdout); mpl_or(&a, &b, &c); printf("a | b = "); mp_print(&c, stdout); fputc('\n', stdout); mpl_xor(&a, &b, &c); printf("a ^ b = "); mp_print(&c, stdout); fputc('\n', stdout); mpl_rsh(&a, &c, 1); printf("a >> 1 = "); mp_print(&c, stdout); fputc('\n', stdout); mpl_rsh(&a, &c, 5); printf("a >> 5 = "); mp_print(&c, stdout); fputc('\n', stdout); mpl_rsh(&a, &c, 16); printf("a >> 16 = "); mp_print(&c, stdout); fputc('\n', stdout); mpl_lsh(&a, &c, 1); printf("a << 1 = "); mp_print(&c, stdout); fputc('\n', stdout); mpl_lsh(&a, &c, 5); printf("a << 5 = "); mp_print(&c, stdout); fputc('\n', stdout); mpl_lsh(&a, &c, 16); printf("a << 16 = "); mp_print(&c, stdout); fputc('\n', stdout); mpl_num_set(&a, &pco); printf("population(a) = %d\n", pco); mpl_num_set(&b, &pco); printf("population(b) = %d\n", pco); res = mpl_parity(&a); if(res == MP_EVEN) printf("a has even parity\n"); else printf("a has odd parity\n"); mp_clear(&c); mp_clear(&b); mp_clear(&a); return 0; }
int main (int argc, char **argv){ mp_int num1,den1,num2,den2; mp_rat q1,q2,q3,q4; //mp_rat *bernoulli; int i; clock_t start,stop; if (argc < 5) { fprintf(stderr, "usage: %s integer integer integer integer \n", argv[0]); exit(EXIT_FAILURE); } mp_init_multi(&num1,&den1,&num2,&den2,NULL); mp_get_str(argv[1], &num1, 10); mp_get_str(argv[2], &den1, 10); mp_get_str(argv[3], &num2, 10); mp_get_str(argv[4], &den2, 10); printf("Numerator 1: ");mp_print(&num1);puts(""); printf("Denominator 1: ");mp_print(&den1);puts(""); printf("Numerator 2: ");mp_print(&num2);puts(""); printf("Denominator 2: ");mp_print(&den2);puts(""); mpq_init_multi(&q1,&q2,&q3,&q4,NULL);puts("000"); mpq_set(&q1,&num1,&den1);puts("111"); printf("Rational1: ");mpq_print(&q1);puts(""); mpq_set(&q2,&num2,&den2);puts("222"); printf("Rational2: ");mpq_print(&q2);puts(""); mpq_add(&q1,&q2,&q3);; printf("R1 + R2 = ");mpq_print(&q3);puts(""); mpq_sub(&q1,&q2,&q3); printf("R1 - R2 = ");mpq_print(&q3);puts(""); mpq_mul(&q1,&q2,&q3); printf("R1 * R2 = ");mpq_print(&q3);puts(""); mpq_div(&q1,&q2,&q3); printf("R1 / R2 = ");mpq_print(&q3);puts(""); //mpq_pow_d(&q1,123,&q3); printf("R1 ^ 123 = ");mpq_print(&q3);puts(""); printf("cmp(R1, R2) = %d\n",mpq_cmp(&q1,&q2)); printf("cmp(R2, R1) = %d\n",mpq_cmp(&q2,&q1)); printf("cmp(R1, R1) = %d\n",mpq_cmp(&q1,&q1)); mp_set_int(&num2,123); //mp_expt(&num1,&num2,&num1); printf("num1 ^123 = ");mp_fwrite(&num1,10,stdout);puts(""); mpq_set_epsilon(50); //mpq_set_int(&q1,128,2); //mpq_set_int(&q1,529,1849); //mpq_set_int(&q1,3481,11664); //mpq_set_int(&q1,1764,1849); mpq_set_int(&q1,44521,46656); mpq_sqrt(&q1,&q1); printf("sqrt(R1) = ");mpq_print(&q1);puts(""); //SeidelBernoulli(20); //bernoulli = malloc(sizeof(mp_rat) * 102); start = clock(); //bern_rat_init(10); //bhbern(50); stop = clock(); puts("bernoulli"); for(i=0;i<=(50);i++){ //mpq_print(&bern_array[i]);printf(" %d\n",i); } mpq_bernoulli(10,&q1); printf("B_10 = ");mpq_print(&q1);puts(""); mpq_bernoulli(4,&q1); printf("B_4 = ");mpq_print(&q1);puts(""); mpq_bernoulli(0,&q1); printf("B_0 = ");mpq_print(&q1);puts(""); mpq_bernoulli(1,&q1); printf("B_1 = ");mpq_print(&q1);puts(""); mpq_bernoulli(2,&q1); printf("B_3 = ");mpq_print(&q1);puts(""); mpq_bernoulli(100,&q1); printf("B_100 = ");mpq_print(&q1);puts(""); mpq_bernoulli(98,&q1); printf("B_98 = ");mpq_print(&q1);puts(""); printf("Time: %6.6f\n",( (double)stop - (double)start )/((double)CLOCKS_PER_SEC) ); mpq_bernoulli_free(); exit(EXIT_SUCCESS); }
int main(int argc, char *argv[]) { int ix; mp_int a, b, c, m; mp_digit r; if(argc < 4) { fprintf(stderr, "Usage: %s <a> <b> <m>\n", argv[0]); return 1; } printf("Test 4: Modular arithmetic\n\n"); mp_init(&a); mp_init(&b); mp_init(&m); mp_read_radix(&a, argv[1], 10); mp_read_radix(&b, argv[2], 10); mp_read_radix(&m, argv[3], 10); printf("a = "); mp_print(&a, stdout); fputc('\n', stdout); printf("b = "); mp_print(&b, stdout); fputc('\n', stdout); printf("m = "); mp_print(&m, stdout); fputc('\n', stdout); mp_init(&c); printf("\nc = a (mod m)\n"); mp_mod(&a, &m, &c); printf("c = "); mp_print(&c, stdout); fputc('\n', stdout); printf("\nc = b (mod m)\n"); mp_mod(&b, &m, &c); printf("c = "); mp_print(&c, stdout); fputc('\n', stdout); printf("\nc = b (mod 1853)\n"); mp_mod_d(&b, 1853, &r); printf("c = %04X\n", r); printf("\nc = (a + b) mod m\n"); mp_addmod(&a, &b, &m, &c); printf("c = "); mp_print(&c, stdout); fputc('\n', stdout); printf("\nc = (a - b) mod m\n"); mp_submod(&a, &b, &m, &c); printf("c = "); mp_print(&c, stdout); fputc('\n', stdout); printf("\nc = (a * b) mod m\n"); mp_mulmod(&a, &b, &m, &c); printf("c = "); mp_print(&c, stdout); fputc('\n', stdout); printf("\nc = (a ** b) mod m\n"); mp_exptmod(&a, &b, &m, &c); printf("c = "); mp_print(&c, stdout); fputc('\n', stdout); printf("\nIn-place modular squaring test:\n"); for(ix = 0; ix < 5; ix++) { printf("a = (a * a) mod m a = "); mp_sqrmod(&a, &m, &a); mp_print(&a, stdout); fputc('\n', stdout); } mp_clear(&c); mp_clear(&m); mp_clear(&b); mp_clear(&a); return 0; }
int main(int argc, char *argv[]) { int ix; mp_int a, b, c, d; mp_digit r; mp_err res; if(argc < 3) { fprintf(stderr, "Usage: %s <a> <b>\n", argv[0]); return 1; } printf("Test 3: Multiplication and division\n\n"); srand(time(NULL)); mp_init(&a); mp_init(&b); mp_read_radix(&a, argv[1], 10); mp_read_radix(&b, argv[2], 10); printf("a = "); mp_print(&a, stdout); fputc('\n', stdout); printf("b = "); mp_print(&b, stdout); fputc('\n', stdout); mp_init(&c); printf("\nc = a * b\n"); mp_mul(&a, &b, &c); printf("c = "); mp_print(&c, stdout); fputc('\n', stdout); printf("\nc = b * 32523\n"); mp_mul_d(&b, 32523, &c); printf("c = "); mp_print(&c, stdout); fputc('\n', stdout); mp_init(&d); printf("\nc = a / b, d = a mod b\n"); mp_div(&a, &b, &c, &d); printf("c = "); mp_print(&c, stdout); fputc('\n', stdout); printf("d = "); mp_print(&d, stdout); fputc('\n', stdout); ix = rand() % 256; printf("\nc = a / %d, r = a mod %d\n", ix, ix); mp_div_d(&a, (mp_digit)ix, &c, &r); printf("c = "); mp_print(&c, stdout); fputc('\n', stdout); printf("r = %04X\n", r); #if EXPT printf("\nc = a ** b\n"); mp_expt(&a, &b, &c); printf("c = "); mp_print(&c, stdout); fputc('\n', stdout); #endif ix = rand() % 256; printf("\nc = 2^%d\n", ix); mp_2expt(&c, ix); printf("c = "); mp_print(&c, stdout); fputc('\n', stdout); #if SQRT printf("\nc = sqrt(a)\n"); if((res = mp_sqrt(&a, &c)) != MP_OKAY) { printf("mp_sqrt: %s\n", mp_strerror(res)); } else { printf("c = "); mp_print(&c, stdout); fputc('\n', stdout); mp_sqr(&c, &c); printf("c^2 = "); mp_print(&c, stdout); fputc('\n', stdout); } #endif mp_clear(&d); mp_clear(&c); mp_clear(&b); mp_clear(&a); return 0; }