1 /* Makes safe primes of a 2k nature */ 2 #include <tommath.h> 3 #include <time.h> 4 5 int sizes[] = {256, 512, 768, 1024, 1536, 2048, 3072, 4096}; 6 7 int main(void) 8 { 9 char buf[2000]; 10 int x, y; 11 mp_int q, p; 12 FILE *out; 13 clock_t t1; 14 mp_digit z; 15 16 mp_init_multi(&q, &p, NULL); 17 18 out = fopen("2kprime.1", "w"); 19 for (x = 0; x < (int)(sizeof(sizes) / sizeof(sizes[0])); x++) { 20 top: 21 mp_2expt(&q, sizes[x]); 22 mp_add_d(&q, 3, &q); 23 z = -3; 24 25 t1 = clock(); 26 for(;;) { 27 mp_sub_d(&q, 4, &q); 28 z += 4; 29 30 if (z > MP_MASK) { 31 printf("No primes of size %d found\n", sizes[x]); 32 break; 33 } 34 35 if (clock() - t1 > CLOCKS_PER_SEC) { 36 printf("."); fflush(stdout); 37 // sleep((clock() - t1 + CLOCKS_PER_SEC/2)/CLOCKS_PER_SEC); 38 t1 = clock(); 39 } 40 41 /* quick test on q */ 42 mp_prime_is_prime(&q, 1, &y); 43 if (y == 0) { 44 continue; 45 } 46 47 /* find (q-1)/2 */ 48 mp_sub_d(&q, 1, &p); 49 mp_div_2(&p, &p); 50 mp_prime_is_prime(&p, 3, &y); 51 if (y == 0) { 52 continue; 53 } 54 55 /* test on q */ 56 mp_prime_is_prime(&q, 3, &y); 57 if (y == 0) { 58 continue; 59 } 60 61 break; 62 } 63 64 if (y == 0) { 65 ++sizes[x]; 66 goto top; 67 } 68 69 mp_toradix(&q, buf, 10); 70 printf("\n\n%d-bits (k = %lu) = %s\n", sizes[x], z, buf); 71 fprintf(out, "%d-bits (k = %lu) = %s\n", sizes[x], z, buf); fflush(out); 72 } 73 74 return 0; 75 } 76 77 78 79 80 81 82 /* $Source: /cvs/libtom/libtommath/etc/2kprime.c,v $ */ 83 /* $Revision: 1.2 $ */ 84 /* $Date: 2005/05/05 14:38:47 $ */ 85