mpprime.c
上传用户:lyxiangda
上传日期:2007-01-12
资源大小:3042k
文件大小:14k
源码类别:

CA认证

开发平台:

WINDOWS

  1. /*
  2.  *  mpprime.c
  3.  *
  4.  *  Utilities for finding and working with prime and pseudo-prime
  5.  *  integers
  6.  *
  7.  * The contents of this file are subject to the Mozilla Public
  8.  * License Version 1.1 (the "License"); you may not use this file
  9.  * except in compliance with the License. You may obtain a copy of
  10.  * the License at http://www.mozilla.org/MPL/
  11.  *
  12.  * Software distributed under the License is distributed on an "AS
  13.  * IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
  14.  * implied. See the License for the specific language governing
  15.  * rights and limitations under the License.
  16.  *
  17.  * The Original Code is the MPI Arbitrary Precision Integer Arithmetic
  18.  * library.
  19.  *
  20.  * The Initial Developer of the Original Code is Michael J. Fromberger.
  21.  * Portions created by Michael J. Fromberger are 
  22.  * Copyright (C) 1997, 1998, 1999, 2000 Michael J. Fromberger. 
  23.  * All Rights Reserved.
  24.  *
  25.  * Contributor(s):
  26.  * Netscape Communications Corporation
  27.  *
  28.  * Alternatively, the contents of this file may be used under the
  29.  * terms of the GNU General Public License Version 2 or later (the
  30.  * "GPL"), in which case the provisions of the GPL are applicable
  31.  * instead of those above.  If you wish to allow use of your
  32.  * version of this file only under the terms of the GPL and not to
  33.  * allow others to use your version of this file under the MPL,
  34.  * indicate your decision by deleting the provisions above and
  35.  * replace them with the notice and other provisions required by
  36.  * the GPL.  If you do not delete the provisions above, a recipient
  37.  * may use your version of this file under either the MPL or the GPL.
  38.  */
  39. #include "mpi-priv.h"
  40. #include "mpprime.h"
  41. #include "mplogic.h"
  42. #include <stdlib.h>
  43. #include <string.h>
  44. #define SMALL_TABLE 0 /* determines size of hard-wired prime table */
  45. #define RANDOM() rand()
  46. #include "primes.c"  /* pull in the prime digit table */
  47. /* 
  48.    Test if any of a given vector of digits divides a.  If not, MP_NO
  49.    is returned; otherwise, MP_YES is returned and 'which' is set to
  50.    the index of the integer in the vector which divided a.
  51.  */
  52. mp_err    s_mpp_divp(mp_int *a, const mp_digit *vec, int size, int *which);
  53. /* {{{ mpp_divis(a, b) */
  54. /*
  55.   mpp_divis(a, b)
  56.   Returns MP_YES if a is divisible by b, or MP_NO if it is not.
  57.  */
  58. mp_err  mpp_divis(mp_int *a, mp_int *b)
  59. {
  60.   mp_err  res;
  61.   mp_int  rem;
  62.   if((res = mp_init(&rem)) != MP_OKAY)
  63.     return res;
  64.   if((res = mp_mod(a, b, &rem)) != MP_OKAY)
  65.     goto CLEANUP;
  66.   if(mp_cmp_z(&rem) == 0)
  67.     res = MP_YES;
  68.   else
  69.     res = MP_NO;
  70. CLEANUP:
  71.   mp_clear(&rem);
  72.   return res;
  73. } /* end mpp_divis() */
  74. /* }}} */
  75. /* {{{ mpp_divis_d(a, d) */
  76. /*
  77.   mpp_divis_d(a, d)
  78.   Return MP_YES if a is divisible by d, or MP_NO if it is not.
  79.  */
  80. mp_err  mpp_divis_d(mp_int *a, mp_digit d)
  81. {
  82.   mp_err     res;
  83.   mp_digit   rem;
  84.   ARGCHK(a != NULL, MP_BADARG);
  85.   if(d == 0)
  86.     return MP_NO;
  87.   if((res = mp_mod_d(a, d, &rem)) != MP_OKAY)
  88.     return res;
  89.   if(rem == 0)
  90.     return MP_YES;
  91.   else
  92.     return MP_NO;
  93. } /* end mpp_divis_d() */
  94. /* }}} */
  95. /* {{{ mpp_random(a) */
  96. /*
  97.   mpp_random(a)
  98.   Assigns a random value to a.  This value is generated using the
  99.   standard C library's rand() function, so it should not be used for
  100.   cryptographic purposes, but it should be fine for primality testing,
  101.   since all we really care about there is good statistical properties.
  102.   As many digits as a currently has are filled with random digits.
  103.  */
  104. mp_err  mpp_random(mp_int *a)
  105. {
  106.   mp_digit  next = 0;
  107.   int       ix, jx;
  108.   ARGCHK(a != NULL, MP_BADARG);
  109.   for(ix = 0; ix < USED(a); ix++) {
  110.     for(jx = 0; jx < sizeof(mp_digit); jx++) {
  111.       next = (next << CHAR_BIT) | (RANDOM() & UCHAR_MAX);
  112.     }
  113.     DIGIT(a, ix) = next;
  114.   }
  115.   return MP_OKAY;
  116. } /* end mpp_random() */
  117. /* }}} */
  118. /* {{{ mpp_random_size(a, prec) */
  119. mp_err  mpp_random_size(mp_int *a, mp_size prec)
  120. {
  121.   mp_err   res;
  122.   ARGCHK(a != NULL && prec > 0, MP_BADARG);
  123.   
  124.   if((res = s_mp_pad(a, prec)) != MP_OKAY)
  125.     return res;
  126.   return mpp_random(a);
  127. } /* end mpp_random_size() */
  128. /* }}} */
  129. /* {{{ mpp_divis_vector(a, vec, size, which) */
  130. /*
  131.   mpp_divis_vector(a, vec, size, which)
  132.   Determines if a is divisible by any of the 'size' digits in vec.
  133.   Returns MP_YES and sets 'which' to the index of the offending digit,
  134.   if it is; returns MP_NO if it is not.
  135.  */
  136. mp_err  mpp_divis_vector(mp_int *a, const mp_digit *vec, int size, int *which)
  137. {
  138.   ARGCHK(a != NULL && vec != NULL && size > 0, MP_BADARG);
  139.   
  140.   return s_mpp_divp(a, vec, size, which);
  141. } /* end mpp_divis_vector() */
  142. /* }}} */
  143. /* {{{ mpp_divis_primes(a, np) */
  144. /*
  145.   mpp_divis_primes(a, np)
  146.   Test whether a is divisible by any of the first 'np' primes.  If it
  147.   is, returns MP_YES and sets *np to the value of the digit that did
  148.   it.  If not, returns MP_NO.
  149.  */
  150. mp_err  mpp_divis_primes(mp_int *a, mp_digit *np)
  151. {
  152.   int     size, which;
  153.   mp_err  res;
  154.   ARGCHK(a != NULL && np != NULL, MP_BADARG);
  155.   size = (int)*np;
  156.   if(size > prime_tab_size)
  157.     size = prime_tab_size;
  158.   res = mpp_divis_vector(a, prime_tab, size, &which);
  159.   if(res == MP_YES) 
  160.     *np = prime_tab[which];
  161.   return res;
  162. } /* end mpp_divis_primes() */
  163. /* }}} */
  164. /* {{{ mpp_fermat(a, w) */
  165. /*
  166.   Using w as a witness, try pseudo-primality testing based on Fermat's
  167.   little theorem.  If a is prime, and (w, a) = 1, then w^a == w (mod
  168.   a).  So, we compute z = w^a (mod a) and compare z to w; if they are
  169.   equal, the test passes and we return MP_YES.  Otherwise, we return
  170.   MP_NO.
  171.  */
  172. mp_err  mpp_fermat(mp_int *a, mp_digit w)
  173. {
  174.   mp_int  base, test;
  175.   mp_err  res;
  176.   
  177.   if((res = mp_init(&base)) != MP_OKAY)
  178.     return res;
  179.   mp_set(&base, w);
  180.   if((res = mp_init(&test)) != MP_OKAY)
  181.     goto TEST;
  182.   /* Compute test = base^a (mod a) */
  183.   if((res = mp_exptmod(&base, a, a, &test)) != MP_OKAY)
  184.     goto CLEANUP;
  185.   
  186.   if(mp_cmp(&base, &test) == 0)
  187.     res = MP_YES;
  188.   else
  189.     res = MP_NO;
  190.  CLEANUP:
  191.   mp_clear(&test);
  192.  TEST:
  193.   mp_clear(&base);
  194.   return res;
  195. } /* end mpp_fermat() */
  196. /* }}} */
  197. /*
  198.   Perform the fermat test on each of the primes in a list until
  199.   a) one of them shows a is not prime, or 
  200.   b) the list is exhausted.
  201.   Returns:  MP_YES if it passes tests.
  202.     MP_NO  if fermat test reveals it is composite
  203.     Some MP error code if some other error occurs.
  204.  */
  205. mp_err mpp_fermat_list(mp_int *a, const mp_digit *primes, mp_size nPrimes)
  206. {
  207.   mp_err rv = MP_YES;
  208.   while (nPrimes-- > 0 && rv == MP_YES) {
  209.     rv = mpp_fermat(a, *primes++);
  210.   }
  211.   return rv;
  212. }
  213. /* {{{ mpp_pprime(a, nt) */
  214. /*
  215.   mpp_pprime(a, nt)
  216.   Performs nt iteration of the Miller-Rabin probabilistic primality
  217.   test on a.  Returns MP_YES if the tests pass, MP_NO if one fails.
  218.   If MP_NO is returned, the number is definitely composite.  If MP_YES
  219.   is returned, it is probably prime (but that is not guaranteed).
  220.  */
  221. mp_err  mpp_pprime(mp_int *a, int nt)
  222. {
  223.   mp_err   res;
  224.   mp_int   x, amo, m, z; /* "amo" = "a minus one" */
  225.   int      iter, jx;
  226.   mp_size  b;
  227.   ARGCHK(a != NULL, MP_BADARG);
  228.   MP_DIGITS(&x) = 0;
  229.   MP_DIGITS(&amo) = 0;
  230.   MP_DIGITS(&m) = 0;
  231.   MP_DIGITS(&z) = 0;
  232.   /* Initialize temporaries... */
  233.   MP_CHECKOK( mp_init(&amo));
  234.   /* Compute amo = a - 1 for what follows...    */
  235.   MP_CHECKOK( mp_sub_d(a, 1, &amo) );
  236.   b = mp_trailing_zeros(&amo);
  237.   if (!b) { /* a was even ? */
  238.     res = MP_NO;
  239.     goto CLEANUP;
  240.   }
  241.   MP_CHECKOK( mp_init_size(&x, MP_USED(a)) );
  242.   MP_CHECKOK( mp_init(&z) );
  243.   MP_CHECKOK( mp_init(&m) );
  244.   MP_CHECKOK( mp_div_2d(&amo, b, &m, 0) );
  245.   /* Do the test nt times... */
  246.   for(iter = 0; iter < nt; iter++) {
  247.     /* Choose a random value for x < a          */
  248.     s_mp_pad(&x, USED(a));
  249.     mpp_random(&x);
  250.     MP_CHECKOK( mp_mod(&x, a, &x) );
  251.     /* Compute z = (x ** m) mod a               */
  252.     MP_CHECKOK( mp_exptmod(&x, &m, a, &z) );
  253.     
  254.     if(mp_cmp_d(&z, 1) == 0 || mp_cmp(&z, &amo) == 0) {
  255.       res = MP_YES;
  256.       continue;
  257.     }
  258.     
  259.     res = MP_NO;  /* just in case the following for loop never executes. */
  260.     for (jx = 1; jx < b; jx++) {
  261.       /* z = z^2 (mod a) */
  262.       MP_CHECKOK( mp_sqrmod(&z, a, &z) );
  263.       if(mp_cmp_d(&z, 1) == 0) {
  264. res = MP_NO;
  265. break;
  266.       }
  267.       if(mp_cmp(&z, &amo) == 0) {
  268. res = MP_YES;
  269. break;
  270.       } 
  271.       res = MP_NO;
  272.     } /* end testing loop */
  273.     /* If the test passes, we will continue iterating, but a failed
  274.        test means the candidate is definitely NOT prime, so we will
  275.        immediately break out of this loop
  276.      */
  277.     if(res == MP_NO)
  278.       break;
  279.   } /* end iterations loop */
  280.   
  281. CLEANUP:
  282.   mp_clear(&m);
  283.   mp_clear(&z);
  284.   mp_clear(&x);
  285.   mp_clear(&amo);
  286.   return res;
  287. } /* end mpp_pprime() */
  288. /* }}} */
  289. /* Produce table of composites from list of primes and trial value.  
  290. ** trial must be odd. List of primes must not include 2.
  291. ** sieve should have dimension >= MAXPRIME/2, where MAXPRIME is largest 
  292. ** prime in list of primes.  After this function is finished,
  293. ** if sieve[i] is non-zero, then (trial + 2*i) is composite.
  294. ** Each prime used in the sieve costs one division of trial, and eliminates
  295. ** one or more values from the search space. (3 eliminates 1/3 of the values
  296. ** alone!)  Each value left in the search space costs 1 or more modular 
  297. ** exponentations.  So, these divisions are a bargain!
  298. */
  299. mp_err mpp_sieve(mp_int *trial, const mp_digit *primes, mp_size nPrimes, 
  300.  unsigned char *sieve, mp_size nSieve)
  301. {
  302.   mp_err       res;
  303.   mp_digit     rem;
  304.   mp_size      ix;
  305.   unsigned long offset;
  306.   memset(sieve, 0, nSieve);
  307.   for(ix = 0; ix < nPrimes; ix++) {
  308.     mp_digit prime = primes[ix];
  309.     mp_size  i;
  310.     if((res = mp_mod_d(trial, prime, &rem)) != MP_OKAY) 
  311.       return res;
  312.     if (rem == 0) {
  313.       offset = 0;
  314.     } else {
  315.       offset = prime - (rem / 2);
  316.     }
  317.     for (i = offset; i < nSieve ; i += prime) {
  318.       sieve[i] = 1;
  319.     }
  320.   }
  321.   return MP_OKAY;
  322. }
  323. #define SIEVE_SIZE 32*1024
  324. mp_err mpp_make_prime(mp_int *start, mp_size nBits, mp_size strong,
  325.       unsigned long * nTries)
  326. {
  327.   mp_digit      np;
  328.   mp_err        res;
  329.   int           i = 0;
  330.   mp_int        trial;
  331.   mp_int        q;
  332.   mp_size       num_tests;
  333.   /*
  334.    * Always make sieve the last variabale allocated so that 
  335.    * Mac builds don't break by adding an extra variable
  336.    * on the stack. -javi
  337.    */
  338. #ifdef macintosh
  339.   unsigned char *sieve;
  340.   
  341.   sieve = malloc(SIEVE_SIZE);
  342.   ARGCHK(sieve != NULL, MP_MEM);
  343. #else
  344.   unsigned char sieve[SIEVE_SIZE];
  345. #endif  
  346.   ARGCHK(start != 0, MP_BADARG);
  347.   ARGCHK(nBits > 16, MP_RANGE);
  348.   MP_DIGITS(&trial) = 0;
  349.   MP_DIGITS(&q) = 0;
  350.   MP_CHECKOK( mp_init(&trial) );
  351.   MP_CHECKOK( mp_init(&q)     );
  352.   if (nBits >= 1024) {
  353.     num_tests = 5;
  354.   } else if (nBits >= 512) {
  355.     num_tests = 7;
  356.   } else if (nBits >= 384) {
  357.     num_tests = 9;
  358.   } else if (nBits >= 256) {
  359.     num_tests = 13;
  360.   } else
  361.     num_tests = 50;
  362.   if (strong) 
  363.     --nBits;
  364.   MP_CHECKOK( mpl_set_bit(start, nBits - 1, 1) );
  365.   MP_CHECKOK( mpl_set_bit(start,         0, 1) );
  366.   for (i = mpl_significant_bits(start) - 1; i >= nBits; --i) {
  367.     MP_CHECKOK( mpl_set_bit(start, i, 0) );
  368.   }
  369.   /* start sieveing with prime value of 3. */
  370.   MP_CHECKOK(mpp_sieve(start, prime_tab + 1, prime_tab_size - 1, 
  371.        sieve, sizeof sieve) );
  372. #ifdef DEBUG_SIEVE
  373.   res = 0;
  374.   for (i = 0; i < sizeof sieve; ++i) {
  375.     if (!sieve[i])
  376.       ++res;
  377.   }
  378.   fprintf(stderr,"sieve found %d potential primes.n", res);
  379. #define FPUTC(x,y) fputc(x,y)
  380. #else
  381. #define FPUTC(x,y) 
  382. #endif
  383.   res = MP_NO;
  384.   for(i = 0; i < sizeof sieve; ++i) {
  385.     if (sieve[i]) /* this number is composite */
  386.       continue;
  387.     MP_CHECKOK( mp_add_d(start, 2 * i, &trial) );
  388.     FPUTC('.', stderr);
  389.     /* run a Fermat test */
  390.     res = mpp_fermat(&trial, 2);
  391.     if (res != MP_OKAY) {
  392.       if (res == MP_NO)
  393. continue; /* was composite */
  394.       goto CLEANUP;
  395.     }
  396.       
  397.     FPUTC('+', stderr);
  398.     /* If that passed, run some Miller-Rabin tests */
  399.     res = mpp_pprime(&trial, num_tests);
  400.     if (res != MP_OKAY) {
  401.       if (res == MP_NO)
  402. continue; /* was composite */
  403.       goto CLEANUP;
  404.     }
  405.     FPUTC('!', stderr);
  406.     if (!strong) 
  407.       break; /* success !! */
  408.     /* At this point, we have strong evidence that our candidate
  409.        is itself prime.  If we want a strong prime, we need now
  410.        to test q = 2p + 1 for primality...
  411.      */
  412.     MP_CHECKOK( mp_mul_2(&trial, &q) );
  413.     MP_CHECKOK( mp_add_d(&q, 1, &q)  );
  414.     /* Test q for small prime divisors ... */
  415.     np = prime_tab_size;
  416.     res = mpp_divis_primes(&q, &np);
  417.     if (res == MP_YES) { /* is composite */
  418.       mp_clear(&q);
  419.       continue;
  420.     }
  421.     if (res != MP_NO) 
  422.       goto CLEANUP;
  423.     /* And test with Fermat, as with its parent ... */
  424.     res = mpp_fermat(&q, 2);
  425.     if (res != MP_YES) {
  426.       mp_clear(&q);
  427.       if (res == MP_NO)
  428. continue; /* was composite */
  429.       goto CLEANUP;
  430.     }
  431.     /* And test with Miller-Rabin, as with its parent ... */
  432.     res = mpp_pprime(&q, num_tests);
  433.     if (res != MP_YES) {
  434.       mp_clear(&q);
  435.       if (res == MP_NO)
  436. continue; /* was composite */
  437.       goto CLEANUP;
  438.     }
  439.     /* If it passed, we've got a winner */
  440.     mp_exch(&q, &trial);
  441.     mp_clear(&q);
  442.     break;
  443.   } /* end of loop through sieved values */
  444.   if (res == MP_YES) 
  445.     mp_exch(&trial, start);
  446. CLEANUP:
  447.   mp_clear(&trial);
  448.   if (nTries)
  449.     *nTries += i;
  450. #ifdef macintosh
  451.   if (sieve != NULL) {
  452.    memset(sieve, 0, SIEVE_SIZE);
  453.    free (sieve);
  454.   }
  455. #endif    
  456.   return res;
  457. }
  458. /*========================================================================*/
  459. /*------------------------------------------------------------------------*/
  460. /* Static functions visible only to the library internally                */
  461. /* {{{ s_mpp_divp(a, vec, size, which) */
  462. /* 
  463.    Test for divisibility by members of a vector of digits.  Returns
  464.    MP_NO if a is not divisible by any of them; returns MP_YES and sets
  465.    'which' to the index of the offender, if it is.  Will stop on the
  466.    first digit against which a is divisible.
  467.  */
  468. mp_err    s_mpp_divp(mp_int *a, const mp_digit *vec, int size, int *which)
  469. {
  470.   mp_err    res;
  471.   mp_digit  rem;
  472.   int     ix;
  473.   for(ix = 0; ix < size; ix++) {
  474.     if((res = mp_mod_d(a, vec[ix], &rem)) != MP_OKAY) 
  475.       return res;
  476.     if(rem == 0) {
  477.       if(which)
  478. *which = ix;
  479.       return MP_YES;
  480.     }
  481.   }
  482.   return MP_NO;
  483. } /* end s_mpp_divp() */
  484. /* }}} */
  485. /*------------------------------------------------------------------------*/
  486. /* HERE THERE BE DRAGONS                                                  */