1f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project/* Makes safe primes of a DR nature */
2f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project#include <tommath.h>
3f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project
4f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Projectint 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 };
5f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Projectint main(void)
6f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project{
7f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   int res, x, y;
8f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   char buf[4096];
9f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   FILE *out;
10f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   mp_int a, b;
11f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project
12f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   mp_init(&a);
13f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   mp_init(&b);
14f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project
15f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   out = fopen("drprimes.txt", "w");
16f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   for (x = 0; x < (int)(sizeof(sizes)/sizeof(sizes[0])); x++) {
17f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   top:
18f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project       printf("Seeking a %d-bit safe prime\n", sizes[x] * DIGIT_BIT);
19f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project       mp_grow(&a, sizes[x]);
20f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project       mp_zero(&a);
21f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project       for (y = 1; y < sizes[x]; y++) {
22f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project           a.dp[y] = MP_MASK;
23f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project       }
24f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project
25f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project       /* make a DR modulus */
26f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project       a.dp[0] = -1;
27f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project       a.used = sizes[x];
28f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project
29f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project       /* now loop */
30f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project       res = 0;
31f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project       for (;;) {
32f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project          a.dp[0] += 4;
33f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project          if (a.dp[0] >= MP_MASK) break;
34f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project          mp_prime_is_prime(&a, 1, &res);
35f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project          if (res == 0) continue;
36f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project          printf("."); fflush(stdout);
37f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project          mp_sub_d(&a, 1, &b);
38f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project          mp_div_2(&b, &b);
39f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project          mp_prime_is_prime(&b, 3, &res);
40f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project          if (res == 0) continue;
41f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project          mp_prime_is_prime(&a, 3, &res);
42f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project          if (res == 1) break;
43f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project	}
44f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project
45f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project        if (res != 1) {
46f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project           printf("Error not DR modulus\n"); sizes[x] += 1; goto top;
47f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project        } else {
48f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project           mp_toradix(&a, buf, 10);
49f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project           printf("\n\np == %s\n\n", buf);
50f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project           fprintf(out, "%d-bit prime:\np == %s\n\n", mp_count_bits(&a), buf); fflush(out);
51f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project        }
52f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   }
53f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   fclose(out);
54f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project
55f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   mp_clear(&a);
56f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   mp_clear(&b);
57f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project
58f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   return 0;
59f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project}
60f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project
61f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project
62f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project/* $Source: /cvs/libtom/libtommath/etc/drprime.c,v $ */
63f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project/* $Revision: 1.2 $ */
64f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project/* $Date: 2005/05/05 14:38:47 $ */
65