germain.c
上传用户:zbbssh
上传日期:2007-01-08
资源大小:196k
文件大小:15k
源码类别:

CA认证

开发平台:

C/C++

  1. /*
  2.  * Sophie Germain prime generation using the bignum library and sieving.
  3.  *
  4.  * Copyright (c) 1995  Colin Plumb.  All rights reserved.
  5.  * For licensing and other legal details, see the file legal.c.
  6.  */
  7. #if HAVE_CONFIG_H
  8. #include "config.h"
  9. #endif
  10. #if !NO_ASSERT_H
  11. #include <assert.h>
  12. #else
  13. #define assert(x) (void)0
  14. #endif
  15. #if BNDEBUG
  16. #include <stdio.h>
  17. #endif
  18. #include "bn.h"
  19. #include "germain.h"
  20. #include "jacobi.h"
  21. #include "lbnmem.h" /* For lbnMemWipe */
  22. #include "sieve.h"
  23. #include "kludge.h"
  24. /* Size of the sieve area (can be up to 65536/8 = 8192) */
  25. #define SIEVE 8192
  26. /*
  27.  * Helper function that does the slow primality test.
  28.  * bn is the input bignum; a and e are temporary buffers that are
  29.  * allocated by the caller to save overhead.  bn2 is filled with
  30.  * a copy of 2*bn+1 if bn is found to be prime.
  31.  *
  32.  * Returns 0 if both bn abd bn2 are prime, >0 if not prime, and -1 on
  33.  * error (out of memory).  If not prime, the return value is the number
  34.  * of modular exponentiations performed.   Prints a '+' or '-' on the
  35.  * given FILE (if any) for each test that is passed by bn, and a '*'
  36.  * for each test that is passed by bn2.
  37.  *
  38.  * The testing consists of strong pseudoprimality tests, to the bases 2,
  39.  * 3, 5, 7, 11, 13 and 17.  (Also called Miller-Rabin, although that's not
  40.  * technically correct if we're using fixed bases.)  Some people worry
  41.  * that this might not be enough.  Number theorists may wish to generate
  42.  * primality proofs, but for random inputs, this returns non-primes with a
  43.  * probability which is quite negligible, which is good enough.
  44.  *
  45.  * It has been proved (see Carl Pomerance, "On the Distribution of
  46.  * Pseudoprimes", Math. Comp. v.37 (1981) pp. 587-593) that the number
  47.  * of pseudoprimes (composite numbers that pass a Fermat test to the
  48.  * base 2) less than x is bounded by:
  49.  * exp(ln(x)^(5/14)) <= P_2(x) ### CHECK THIS FORMULA - it looks wrong! ###
  50.  * P_2(x) <= x * exp(-1/2 * ln(x) * ln(ln(ln(x))) / ln(ln(x))).
  51.  * Thus, the local density of Pseudoprimes near x is at most
  52.  * exp(-1/2 * ln(x) * ln(ln(ln(x))) / ln(ln(x))), and at least
  53.  * exp(ln(x)^(5/14) - ln(x)).  Here are some values of this function
  54.  * for various k-bit numbers x = 2^k:
  55.  * Bits Density <= Bit equivalent Density >= Bit equivalent
  56.  *  128 3.577869e-07  21.414396 4.202213e-37  120.840190
  57.  *  192 4.175629e-10  31.157288 4.936250e-56  183.724558
  58.  *  256 5.804314e-13  40.647940 4.977813e-75  246.829095
  59.  *  384 1.578039e-18  59.136573 3.938861e-113  373.400096
  60.  *  512 5.858255e-24  77.175803 2.563353e-151  500.253110
  61.  *  768 1.489276e-34 112.370944 7.872825e-228  754.422724
  62.  * 1024 6.633188e-45 146.757062 1.882404e-304 1008.953565
  63.  *
  64.  * As you can see, there's quite a bit of slop between these estimates.
  65.  * In fact, the density of pseudoprimes is conjectured to be closer
  66.  * to the square of that upper bound.  E.g. the density of pseudoprimes
  67.  * of size 256 is around 3 * 10^-27.  The density of primes is very
  68.  * high, from 0.005636 at 256 bits to 0.001409 at 1024 bits, i.e.
  69.  * more than 10^-3.
  70.  *
  71.  * For those people used to cryptographic levels of security where the
  72.  * 56 bits of DES key space is too small because it's exhaustible with
  73.  * custom hardware searching engines, note that you are not generating
  74.  * 50,000,000 primes per second on each of 56,000 custom hardware chips
  75.  * for several hours.  The chances that another Dinosaur Killer asteroid
  76.  * will land today is about 10^-11 or 2^-36, so it would be better to
  77.  * spend your time worrying about *that*.  Well, okay, there should be
  78.  * some derating for the chance that astronomers haven't seen it yet, but
  79.  * I think you get the idea.  For a good feel about the probability of
  80.  * various events, I have heard that a good book is by E'mile Borel,
  81.  * "Les Probabilite's et la vie".  (The 's are accents, not apostrophes.)
  82.  *
  83.  * For more on the subject, try "Finding Four Million Large Random Primes",
  84.  * by Ronald Rivest, in Advancess in Cryptology: Proceedings of Crypto '90.
  85.  * He used a small-divisor test, then a Fermat test to the base 2, and then
  86.  * 8 iterations of a Miller-Rabin test.  About 718 million random 256-bit
  87.  * integers were generated, 43,741,404 passed the small divisor test,
  88.  * 4,058,000 passed the Fermat test, and all 4,058,000 passed all 8
  89.  * iterations of the Miller-Rabin test, proving their primality beyond most
  90.  * reasonable doubts.
  91.  *
  92.  * If the probability of getting a pseudoprime is some small p, then
  93.  * the probability of not getting it in t trials is (1-p)^t.  Remember
  94.  * that, for small p, (1-p)^(1/p) ~ 1/e, the base of natural logarithms.
  95.  * (This is more commonly expressed as e = lim_{xtoinfty} (1+1/x)^x.)
  96.  * Thus, (1-p)^t ~ e^(-p*t) = exp(-p*t).  So the odds of being able to
  97.  * do this many tests without seeing a pseudoprime if you assume that
  98.  * p = 10^-6 (one in a million) is one in 57.86.  If you assume that
  99.  * p = 2*10^-6, it's one in 3347.6.  So it's implausible that the
  100.  * density of pseudoprimes is much more than one millionth the density
  101.  * of primes.
  102.  *
  103.  * He also gives a theoretical argument that the chance of finding a
  104.  * 256-bit non-prime which satisfies one Fermat test to the base 2 is less
  105.  * than 10^-22.  The small divisor test improves this number, and if the
  106.  * numbers are 512 bits (as needed for a 1024-bit key) the odds of failure
  107.  * shrink to about 10^-44.  Thus, he concludes, for practical purposes
  108.  * *one* Fermat test to the base 2 is sufficient.
  109.  */
  110. static int
  111. germainPrimeTest(struct BigNum const *bn, struct BigNum *bn2, struct BigNum *e,
  112. struct BigNum *a, int (*f)(void *arg, int c), void *arg)
  113. {
  114. int err;
  115. unsigned i;
  116. int j;
  117. unsigned k, l;
  118. static unsigned const primes[] = {2, 3, 5, 7, 11, 13, 17};
  119. #if BNDEBUG /* Debugging */
  120. /*
  121.  * This is debugging code to test the sieving stage.
  122.  * If the sieving is wrong, it will let past numbers with
  123.  * small divisors.  The prime test here will still work, and
  124.  * weed them out, but you'll be doing a lot more slow tests,
  125.  * and presumably excluding from consideration some other numbers
  126.  * which might be prime.  This check just verifies that none
  127.  * of the candidates have any small divisors.  If this
  128.  * code is enabled and never triggers, you can feel quite
  129.  * confident that the sieving is doing its job.
  130.  */
  131. i = bnModQ(bn, 15015); /* 15015 = 3 * 5 * 7 * 11 * 13 */
  132. if (!(i % 3)) printf("bn div by 3!");
  133. if ((i % 3) == 1) printf("bn2 div by 3!");
  134. if (!(i % 5)) printf("bn div by 5!");
  135. if ((i % 5) == 2) printf("bn2 div by 5!");
  136. if (!(i % 7)) printf("bn div by 7!");
  137. if ((i % 7) == 3) printf("bn2 div by 7!");
  138. if (!(i % 11)) printf("bn div by 11!");
  139. if ((i % 11) == 5) printf("bn2 div by 11!");
  140. if (!(i % 13)) printf("bn div by 13!");
  141. if ((i % 13) == 6) printf("bn2 div by 13!");
  142. i = bnModQ(bn, 7429); /* 7429 = 17 * 19 * 23 */
  143. if (!(i % 17)) printf("bn div by 17!");
  144. if ((i % 17) == 8) printf("bn2 div by 17!");
  145. if (!(i % 19)) printf("bn div by 19!");
  146. if ((i % 19) == 9) printf("bn2 div by 19!");
  147. if (!(i % 23)) printf("bn div by 23!");
  148. if ((i % 23) == 11) printf("bn2 div by 23!");
  149. i = bnModQ(bn, 33263); /* 33263 = 29 * 31 * 37 */
  150. if (!(i % 29)) printf("bn div by 29!");
  151. if ((i % 29) == 14) printf("bn2 div by 29!");
  152. if (!(i % 31)) printf("bn div by 31!");
  153. if ((i % 31) == 15) printf("bn2 div by 31!");
  154. if (!(i % 37)) printf("bn div by 37!");
  155. if ((i % 37) == 18) printf("bn2 div by 37!");
  156. #endif
  157. /*
  158.  * First, check whether bn is prime.  This uses a fast primality
  159.  * test which usually obviates the need to do one of the
  160.  * confirmation tests later.  See prime.c for a full explanation.
  161.  * We check bn first because it's one bit smaller, saving one
  162.  * modular squaring, and because we might be able to save another
  163.  * when testing it.  (1/4 of the time.)  A small speed hack,
  164.  * but finding big Sophie Germain primes is *slow*.
  165.  */
  166. if (bnCopy(e, bn) < 0)
  167. return -1;
  168. (void)bnSubQ(e, 1);
  169. l = bnLSWord(e);
  170. j = 1; /* Where to start in prime array for strong prime tests */
  171. if (l & 7) {
  172. bnRShift(e, 1);
  173. if (bnTwoExpMod(a, e, bn) < 0)
  174. return -1;
  175. if ((l & 7) == 6) {
  176. /* bn == 7 mod 8, expect +1 */
  177. if (bnBits(a) != 1)
  178. return 1; /* Not prime */
  179. k = 1;
  180. } else {
  181. /* bn == 3 or 5 mod 8, expect -1 == bn-1 */
  182. if (bnAddQ(a, 1) < 0)
  183. return -1;
  184. if (bnCmp(a, bn) != 0)
  185. return 1; /* Not prime */
  186. k = 1;
  187. if (l & 4) {
  188. /* bn == 5 mod 8, make odd for strong tests */
  189. bnRShift(e, 1);
  190. k = 2;
  191. }
  192. }
  193. } else {
  194. /* bn == 1 mod 8, expect 2^((bn-1)/4) == +/-1 mod bn */
  195. bnRShift(e, 2);
  196. if (bnTwoExpMod(a, e, bn) < 0)
  197. return -1;
  198. if (bnBits(a) == 1) {
  199. j = 0; /* Re-do strong prime test to base 2 */
  200. } else {
  201. if (bnAddQ(a, 1) < 0)
  202. return -1;
  203. if (bnCmp(a, bn) != 0)
  204. return 1; /* Not prime */
  205. }
  206. k = 2 + bnMakeOdd(e);
  207. }
  208. /*
  209.  * It's prime!  Print a success indicator and check bn2.
  210.  * The success indicator we print is the sign of Jacobi(2,bn2),
  211.  * which is available to us in l.  bn2 = 2*bn + 1.  Since bn is
  212.  * odd, bn2 must be == 3 mod 4, so the options modulo 8 are 3 and 7.
  213.  * 3 if bn == 1 mod 4, 7 if bn == 3 mod 4.  The signs of the
  214.  * Jacobi symbol are - and + in thse two cases.  Set l to be
  215.  * a flag, 1 if the symbol is positive.
  216.  */
  217. l = (l >> 1) & 1;
  218. if (f && (err = f(arg, "-+"[l])) < 0)
  219. return err;
  220. /*
  221.  * Now check bn2.  Since bn2 == 3 mod 4, a strong pseudoprimality
  222.  * test boils down to looking at a^((bn2-1)/2) mod bn and seeing
  223.  * if it's +/-1.  Of course, that exponent is just bn...
  224.  */
  225. if (bnCopy(bn2, bn) < 0 || bnAdd(bn2, bn) < 0)
  226. return -1;
  227. (void)bnAddQ(bn2, 1); /* Can't overflow */
  228. if (bnTwoExpMod(a, bn, bn2) < 0)
  229. return -1;
  230. if (l) { /* Expect + */
  231. if (bnBits(a) != 1)
  232. return 2; /* Not prime */
  233. } else {
  234. if (bnAddQ(a, 1) < 0)
  235. return -1;
  236. if (bnCmp(a, bn2) != 0)
  237. return 2; /* Not prime */
  238. }
  239. /*
  240.  * Success!  We have found a key!  Now go on to confirmation
  241.  * tests...  k is the amount by which e has already been shifted
  242.  * down.  j = 1 unless the test to the base 2 could stand to
  243.  * be re-done, in which case it's 0.
  244.  */
  245. k += bnMakeOdd(e);
  246. for (i = j; i < sizeof(primes)/sizeof(*primes); i++) {
  247. if (f && (err = f(arg, '*')) < 0)
  248. return err;
  249. /* Check that bn is a strong pseudoprime */
  250. (void)bnSetQ(a, primes[i]);
  251. if (bnExpMod(a, a, e, bn) < 0)
  252. return -1;
  253. if (bnBits(a) != 1) {
  254. l = k;
  255. for (;;) {
  256. if (bnAddQ(a, 1) < 0)
  257. return -1;
  258. if (bnCmp(a, bn) == 0) /* Was result bn-1? */
  259. break; /* Prime */
  260. if (!--l)
  261. return 2*i+1; /* Failed, not prime */
  262. /* This part is executed once, on average. */
  263. (void)bnSubQ(a, 1); /* Restore a */
  264. if (bnSquare(a, a) < 0 || bnMod(a, a, bn) < 0)
  265. return -1;
  266. if (bnBits(a) == 1)
  267. return 2*i+1; /* Failed, not prime */
  268. }
  269. }
  270. /* Okay, that was prime - print success indicator */
  271. j = bnJacobiQ(primes[i], bn2);
  272. if (f && (err = f(arg, j < 0 ? '-' : '+')) < 0)
  273. return err;
  274. /* If we're re-doing the base 2, we're done. */
  275. if (!i)
  276. continue; /* Already done next part */
  277. /* Check that p^bn == Jacobi(p,bn2) (mod bn2) */
  278. (void)bnSetQ(a, primes[i]);
  279. if (bnExpMod(a, a, bn, bn2) < 0)
  280. return -1;
  281. /*
  282.  * FIXME:  Actually, we don't need to compute the Jacobi
  283.  * sumbol externally... it never happens that a = +/-1
  284.  * but it's the wrong one.  So we can just look at a and
  285.  * use its sign.  Find a proof somewhere.
  286.  */
  287. if (j < 0) {
  288. /* Not a quadratic residue, should have a =  bn2-1 */
  289. if (bnAddQ(a, 1) < 0)
  290. return -1;
  291. if (bnCmp(a, bn2) != 0) /* Was result bn2-1? */
  292. return 2*i+2; /* Mismatch -> failed */
  293. } else {
  294. /* Quadratic residue, should have a = 1 */
  295. if (bnBits(a) != 1)
  296. return 2*i+2; /* Mismatch -> failed */
  297. }
  298. /* It worked (to the base primes[i]) */
  299. }
  300. /* Print final success indicator */
  301. if (f && (err = f(arg, '*')) < 0)
  302. return err;
  303. return 0; /* Prime! */
  304. }
  305. /*
  306.  * Modifies the bignum to return the next Sohpie Germain prime >= the
  307.  * input value.  Sohpie Germain primes are number such that p is
  308.  * prime and (p-1)/2 is also prime.
  309.  *
  310.  * Returns >=0 on success or -1 on failure (out of memory).  On success,
  311.  * the return value is the number of modular exponentiations performed
  312.  * (excluding the final confirmations).  This never gives up searching.
  313.  *
  314.  * The FILE *f argument, if non-NULL, has progress indicators written
  315.  * to it.  A dot (.) is written every time a primeality test is failed,
  316.  * a plus (+) or minus (-) when the smaller prime of the pair passes a
  317.  * test, and a star (*) when the larger one does.  Finally, a slash (/)
  318.  * is printed when the sieve was emptied without finding a prime and is
  319.  * being refilled.
  320.  *
  321.  * Apologies to structured programmers for all the GOTOs.
  322.  */
  323. int
  324. germainPrimeGen(struct BigNum *bn2, int (*f)(void *arg, int c), void *arg)
  325. {
  326. int retval;
  327. unsigned p, prev;
  328. struct BigNum a, e, bn;
  329. int modexps = 0;
  330. #ifdef MSDOS
  331. unsigned char *sieve;
  332. #else
  333. unsigned char sieve[SIEVE];
  334. #endif
  335. #ifdef MSDOS
  336. sieve = lbnMemAlloc(SIEVE);
  337. if (!sieve)
  338. return -1;
  339. #endif
  340. bnBegin(&a);
  341. bnBegin(&e);
  342. bnBegin(&bn);
  343. /*
  344.  * Obviously, the prime we find must be odd.  Further, (p-1)/2
  345.  * must be odd, so p == 3 (mod 3).  Finally, p != 0 (mod 3),
  346.  * and (p-1)/2 != 0 (mod 3), meaning that p != 1 (mod 3).  Thus,
  347.  * p == 11 (mod 12).  Increase bn2 to have this property, and
  348.  * search is steps of 12.  (Actually, we work with the smaller
  349.  * bn, and increase it to 5 mod 6, then search in steps of 6.)
  350.  */
  351. if (bnCopy(&bn, bn2) < 0)
  352. goto failed;
  353. bnRShift(&bn, 1);
  354. p = bnModQ(&bn, 6);
  355. if (bnAddQ(&bn, 5-p) < 0)
  356. goto failed;
  357. for (;;) {
  358. if (sieveBuild(sieve, SIEVE, &bn, 6, 1) < 0)
  359. goto failed;
  360. p = prev = 0;
  361. if (sieve[0] & 1 || (p = sieveSearch(sieve, SIEVE, p)) != 0) {
  362. do {
  363. /*
  364.  * Adjust bn to have the right value,
  365.  * incrementing in steps of < 65536.
  366.  * 10922 = 65536/6.
  367.  */
  368. assert(p >= prev);
  369. prev = p-prev; /* Delta - add 6*prev to bn */
  370. #if SIEVE*8*6 >= 65536
  371. while (prev > 10922) {
  372. if (bnAddQ(&bn, 6*10922) < 0)
  373. goto failed;
  374. prev -= 10922;
  375. }
  376. #endif
  377. if (bnAddQ(&bn, 6*prev) < 0)
  378. goto failed;
  379. prev = p;
  380. /* Okay, do the strong tests. */
  381. retval = germainPrimeTest(&bn, bn2, &e, &a,
  382.                           f, arg);
  383. if (retval <= 0)
  384. goto done;
  385. modexps += retval;
  386. if (f && (retval = f(arg, '.')) < 0)
  387. goto done;
  388. /* And try again */
  389. p = sieveSearch(sieve, SIEVE, p);
  390. } while (p);
  391. }
  392. /* Ran out of sieve space - increase bn and keep trying. */
  393. #if SIEVE*8*6 >= 65536
  394. p = ((SIEVE-1)*8+7) - prev; /* Number of steps (of 6) */
  395. while (p >= 10922) {
  396. if (bnAddQ(&bn, 6*10922) < 0)
  397. goto failed;
  398. p -= 10922;
  399. }
  400. if (bnAddQ(&bn, 6*(p+1)) < 0)
  401. goto failed;
  402. #else
  403. if (bnAddQ(&bn, SIEVE*8*6 - prev) < 0)
  404. goto failed;
  405. #endif
  406. /*
  407.  * Make sure bn2 is up to date for checkpoint/restart
  408.  * operation triggered by calling f with '/'.
  409.  */
  410. if (bnCopy(bn2, &bn) < 0 || bnAdd(bn2, &bn) < 0)
  411. goto failed;
  412. (void)bnAddQ(bn2, 1); /* Can't overflow */
  413. if (f && (retval = f(arg, '/')) < 0)
  414. goto done;
  415. } /* for (;;) */
  416. failed:
  417. retval = -1;
  418. done:
  419. bnEnd(&bn);
  420. bnEnd(&e);
  421. bnEnd(&a);
  422. #ifdef MSDOS
  423. lbnMemFree(sieve, SIEVE);
  424. #else
  425. lbnMemWipe(sieve, sizeof(sieve));
  426. #endif
  427. return retval < 0 ? retval : modexps;
  428. }