www.usr.com/support/gpl/USR9107_release.1.4.tar.gz
[bcm963xx.git] / userapps / opensource / sshd / libtommath / etc / drprime.c
index 157e358..0ab8ea6 100755 (executable)
@@ -1,7 +1,7 @@
 /* Makes safe primes of a DR nature */
 #include <tommath.h>
 
-const int sizes[] = { 8, 19, 28, 37, 55, 74,  110, 147 };
+int sizes[] = { 1+256/DIGIT_BIT, 1+512/DIGIT_BIT, 1+768/DIGIT_BIT, 1+1024/DIGIT_BIT, 1+2048/DIGIT_BIT, 1+4096/DIGIT_BIT };
 int main(void)
 {
    int res, x, y;
@@ -14,6 +14,7 @@ int main(void)
    
    out = fopen("drprimes.txt", "w");
    for (x = 0; x < (int)(sizeof(sizes)/sizeof(sizes[0])); x++) {
+   top:
        printf("Seeking a %d-bit safe prime\n", sizes[x] * DIGIT_BIT);
        mp_grow(&a, sizes[x]);
        mp_zero(&a);
@@ -22,21 +23,27 @@ int main(void)
        }
        
        /* make a DR modulus */
-       a.dp[0] = 1;
+       a.dp[0] = -1;
        a.used = sizes[x];
        
        /* now loop */
-       do { 
-          fflush(stdout);
-          mp_prime_next_prime(&a, 3);
-          printf(".");
+       res = 0;
+       for (;;) { 
+          a.dp[0] += 4;
+          if (a.dp[0] >= MP_MASK) break;
+          mp_prime_is_prime(&a, 1, &res);
+          if (res == 0) continue;
+          printf("."); fflush(stdout);
           mp_sub_d(&a, 1, &b);
           mp_div_2(&b, &b);
           mp_prime_is_prime(&b, 3, &res);  
-       } while (res == 0);          
+          if (res == 0) continue;
+          mp_prime_is_prime(&a, 3, &res);
+          if (res == 1) break;
+       }
         
-        if (mp_dr_is_modulus(&a) != 1) {
-           printf("Error not DR modulus\n");
+        if (res != 1) {
+           printf("Error not DR modulus\n"); sizes[x] += 1; goto top;
         } else {
            mp_toradix(&a, buf, 10);
            printf("\n\np == %s\n\n", buf);