[BACK]Return to moduli.c CVS log [TXT][DIR] Up to [local] / src / usr.bin / ssh

Diff for /src/usr.bin/ssh/moduli.c between version 1.5 and 1.5.2.1

version 1.5, 2003/12/22 09:16:57 version 1.5.2.1, 2004/08/19 04:13:26
Line 38 
Line 38 
  */   */
   
 #include "includes.h"  #include "includes.h"
 #include "moduli.h"  
 #include "xmalloc.h"  #include "xmalloc.h"
 #include "log.h"  #include "log.h"
   
Line 49 
Line 48 
  */   */
   
 /* need line long enough for largest moduli plus headers */  /* need line long enough for largest moduli plus headers */
 #define QLINESIZE               (100+8192)  #define QLINESIZE               (100+8192)
   
 /* Type: decimal.  /* Type: decimal.
  * Specifies the internal structure of the prime modulus.   * Specifies the internal structure of the prime modulus.
  */   */
 #define QTYPE_UNKNOWN           (0)  #define QTYPE_UNKNOWN           (0)
 #define QTYPE_UNSTRUCTURED      (1)  #define QTYPE_UNSTRUCTURED      (1)
 #define QTYPE_SAFE              (2)  #define QTYPE_SAFE              (2)
 #define QTYPE_SCHNOOR           (3)  #define QTYPE_SCHNOOR           (3)
 #define QTYPE_SOPHIE_GERMAINE   (4)  #define QTYPE_SOPHIE_GERMAIN    (4)
 #define QTYPE_STRONG            (5)  #define QTYPE_STRONG            (5)
   
 /* Tests: decimal (bit field).  /* Tests: decimal (bit field).
  * Specifies the methods used in checking for primality.   * Specifies the methods used in checking for primality.
  * Usually, more than one test is used.   * Usually, more than one test is used.
  */   */
 #define QTEST_UNTESTED          (0x00)  #define QTEST_UNTESTED          (0x00)
 #define QTEST_COMPOSITE         (0x01)  #define QTEST_COMPOSITE         (0x01)
 #define QTEST_SIEVE             (0x02)  #define QTEST_SIEVE             (0x02)
 #define QTEST_MILLER_RABIN      (0x04)  #define QTEST_MILLER_RABIN      (0x04)
 #define QTEST_JACOBI            (0x08)  #define QTEST_JACOBI            (0x08)
 #define QTEST_ELLIPTIC          (0x10)  #define QTEST_ELLIPTIC          (0x10)
   
 /*  /*
  * Size: decimal.   * Size: decimal.
  * Specifies the number of the most significant bit (0 to M).   * Specifies the number of the most significant bit (0 to M).
  * WARNING: internally, usually 1 to N.   * WARNING: internally, usually 1 to N.
  */   */
 #define QSIZE_MINIMUM           (511)  #define QSIZE_MINIMUM           (511)
   
 /*  /*
  * Prime sieving defines   * Prime sieving defines
  */   */
   
 /* Constant: assuming 8 bit bytes and 32 bit words */  /* Constant: assuming 8 bit bytes and 32 bit words */
 #define SHIFT_BIT       (3)  #define SHIFT_BIT       (3)
 #define SHIFT_BYTE      (2)  #define SHIFT_BYTE      (2)
 #define SHIFT_WORD      (SHIFT_BIT+SHIFT_BYTE)  #define SHIFT_WORD      (SHIFT_BIT+SHIFT_BYTE)
 #define SHIFT_MEGABYTE  (20)  #define SHIFT_MEGABYTE  (20)
 #define SHIFT_MEGAWORD  (SHIFT_MEGABYTE-SHIFT_BYTE)  #define SHIFT_MEGAWORD  (SHIFT_MEGABYTE-SHIFT_BYTE)
   
 /*  /*
    * Using virtual memory can cause thrashing.  This should be the largest
    * number that is supported without a large amount of disk activity --
    * that would increase the run time from hours to days or weeks!
    */
   #define LARGE_MINIMUM   (8UL)   /* megabytes */
   
   /*
    * Do not increase this number beyond the unsigned integer bit size.
    * Due to a multiple of 4, it must be LESS than 128 (yielding 2**30 bits).
    */
   #define LARGE_MAXIMUM   (127UL) /* megabytes */
   
   /*
  * Constant: when used with 32-bit integers, the largest sieve prime   * Constant: when used with 32-bit integers, the largest sieve prime
  * has to be less than 2**32.   * has to be less than 2**32.
  */   */
 #define SMALL_MAXIMUM   (0xffffffffUL)  #define SMALL_MAXIMUM   (0xffffffffUL)
   
 /* Constant: can sieve all primes less than 2**32, as 65537**2 > 2**32-1. */  /* Constant: can sieve all primes less than 2**32, as 65537**2 > 2**32-1. */
 #define TINY_NUMBER     (1UL<<16)  #define TINY_NUMBER     (1UL<<16)
   
 /* Ensure enough bit space for testing 2*q. */  /* Ensure enough bit space for testing 2*q. */
 #define TEST_MAXIMUM    (1UL<<16)  #define TEST_MAXIMUM    (1UL<<16)
Line 114 
Line 126 
  * Prime testing defines   * Prime testing defines
  */   */
   
   /* Minimum number of primality tests to perform */
   #define TRIAL_MINIMUM           (4)
   
 /*  /*
  * Sieving data (XXX - move to struct)   * Sieving data (XXX - move to struct)
  */   */
Line 129 
Line 144 
 static u_int32_t largebits, largememory;        /* megabytes */  static u_int32_t largebits, largememory;        /* megabytes */
 static BIGNUM *largebase;  static BIGNUM *largebase;
   
   int gen_candidates(FILE *, int, int, BIGNUM *);
   int prime_test(FILE *, FILE *, u_int32_t, u_int32_t);
   
 /*  /*
  * print moduli out in consistent form,   * print moduli out in consistent form,
Line 219 
Line 236 
 }  }
   
 /*  /*
  * list candidates for Sophie-Germaine primes (where q = (p-1)/2)   * list candidates for Sophie-Germain primes (where q = (p-1)/2)
  * to standard output.   * to standard output.
  * The list is checked against small known primes (less than 2**30).   * The list is checked against small known primes (less than 2**30).
  */   */
Line 235 
Line 252 
   
         largememory = memory;          largememory = memory;
   
           if (memory != 0 &&
              (memory < LARGE_MINIMUM || memory > LARGE_MAXIMUM)) {
                   error("Invalid memory amount (min %ld, max %ld)",
                       LARGE_MINIMUM, LARGE_MAXIMUM);
                   return (-1);
           }
   
         /*          /*
          * Set power to the length in bits of the prime to be generated.           * Set power to the length in bits of the prime to be generated.
          * This is changed to 1 less than the desired safe prime moduli p.           * This is changed to 1 less than the desired safe prime moduli p.
Line 403 
Line 427 
                 debug2("test q = largebase+%u", 2 * j);                  debug2("test q = largebase+%u", 2 * j);
                 BN_set_word(q, 2 * j);                  BN_set_word(q, 2 * j);
                 BN_add(q, q, largebase);                  BN_add(q, q, largebase);
                 if (qfileout(out, QTYPE_SOPHIE_GERMAINE, QTEST_SIEVE,                  if (qfileout(out, QTYPE_SOPHIE_GERMAIN, QTEST_SIEVE,
                     largetries, (power - 1) /* MSB */, (0), q) == -1) {                      largetries, (power - 1) /* MSB */, (0), q) == -1) {
                         ret = -1;                          ret = -1;
                         break;                          break;
Line 430 
Line 454 
  * The result is a list of so-call "safe" primes   * The result is a list of so-call "safe" primes
  */   */
 int  int
 prime_test(FILE *in, FILE *out, u_int32_t trials,  prime_test(FILE *in, FILE *out, u_int32_t trials, u_int32_t generator_wanted)
     u_int32_t generator_wanted)  
 {  {
         BIGNUM *q, *p, *a;          BIGNUM *q, *p, *a;
         BN_CTX *ctx;          BN_CTX *ctx;
Line 441 
Line 464 
         time_t time_start, time_stop;          time_t time_start, time_stop;
         int res;          int res;
   
           if (trials < TRIAL_MINIMUM) {
                   error("Minimum primality trials is %d", TRIAL_MINIMUM);
                   return (-1);
           }
   
         time(&time_start);          time(&time_start);
   
         p = BN_new();          p = BN_new();
Line 490 
Line 518 
   
                 /* modulus (hex) */                  /* modulus (hex) */
                 switch (in_type) {                  switch (in_type) {
                 case QTYPE_SOPHIE_GERMAINE:                  case QTYPE_SOPHIE_GERMAIN:
                         debug2("%10u: (%u) Sophie-Germaine", count_in, in_type);                          debug2("%10u: (%u) Sophie-Germain", count_in, in_type);
                         a = q;                          a = q;
                         BN_hex2bn(&a, cp);                          BN_hex2bn(&a, cp);
                         /* p = 2*q + 1 */                          /* p = 2*q + 1 */

Legend:
Removed from v.1.5  
changed lines
  Added in v.1.5.2.1