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

Diff for /src/usr.bin/ssh/dh.c between version 1.14 and 1.14.2.2

version 1.14, 2001/04/15 08:43:45 version 1.14.2.2, 2002/03/09 00:20:44
Line 39 
Line 39 
 #include "log.h"  #include "log.h"
 #include "misc.h"  #include "misc.h"
   
 int  static int
 parse_prime(int linenum, char *line, struct dhgroup *dhg)  parse_prime(int linenum, char *line, struct dhgroup *dhg)
 {  {
         char *cp, *arg;          char *cp, *arg;
Line 78 
Line 78 
         if (cp != NULL || *prime == '\0')          if (cp != NULL || *prime == '\0')
                 goto fail;                  goto fail;
   
         dhg->g = BN_new();          if ((dhg->g = BN_new()) == NULL)
         dhg->p = BN_new();                  fatal("parse_prime: BN_new failed");
           if ((dhg->p = BN_new()) == NULL)
                   fatal("parse_prime: BN_new failed");
         if (BN_hex2bn(&dhg->g, gen) == 0)          if (BN_hex2bn(&dhg->g, gen) == 0)
                 goto failclean;                  goto failclean;
   
Line 92 
Line 94 
         return (1);          return (1);
   
  failclean:   failclean:
         BN_free(dhg->g);          BN_clear_free(dhg->g);
         BN_free(dhg->p);          BN_clear_free(dhg->p);
  fail:   fail:
         error("Bad prime description in line %d", linenum);          error("Bad prime description in line %d", linenum);
         return (0);          return (0);
Line 103 
Line 105 
 choose_dh(int min, int wantbits, int max)  choose_dh(int min, int wantbits, int max)
 {  {
         FILE *f;          FILE *f;
         char line[1024];          char line[2048];
         int best, bestcount, which;          int best, bestcount, which;
         int linenum;          int linenum;
         struct dhgroup dhg;          struct dhgroup dhg;
   
         f = fopen(_PATH_DH_PRIMES, "r");          if ((f = fopen(_PATH_DH_MODULI, "r")) == NULL &&
         if (!f) {              (f = fopen(_PATH_DH_PRIMES, "r")) == NULL) {
                 log("WARNING: %s does not exist, using old prime", _PATH_DH_PRIMES);                  log("WARNING: %s does not exist, using old modulus", _PATH_DH_MODULI);
                 return (dh_new_group1());                  return (dh_new_group1());
         }          }
   
Line 120 
Line 122 
                 linenum++;                  linenum++;
                 if (!parse_prime(linenum, line, &dhg))                  if (!parse_prime(linenum, line, &dhg))
                         continue;                          continue;
                 BN_free(dhg.g);                  BN_clear_free(dhg.g);
                 BN_free(dhg.p);                  BN_clear_free(dhg.p);
   
                 if (dhg.size > max || dhg.size < min)                  if (dhg.size > max || dhg.size < min)
                         continue;                          continue;
Line 134 
Line 136 
                 if (dhg.size == best)                  if (dhg.size == best)
                         bestcount++;                          bestcount++;
         }          }
         fclose (f);          rewind(f);
   
         if (bestcount == 0) {          if (bestcount == 0) {
                   fclose(f);
                 log("WARNING: no suitable primes in %s", _PATH_DH_PRIMES);                  log("WARNING: no suitable primes in %s", _PATH_DH_PRIMES);
                 return (NULL);                  return (NULL);
         }          }
   
         f = fopen(_PATH_DH_PRIMES, "r");  
         if (!f) {  
                 fatal("WARNING: %s disappeared, giving up", _PATH_DH_PRIMES);  
         }  
   
         linenum = 0;          linenum = 0;
         which = arc4random() % bestcount;          which = arc4random() % bestcount;
         while (fgets(line, sizeof(line), f)) {          while (fgets(line, sizeof(line), f)) {
Line 154 
Line 152 
                 if ((dhg.size > max || dhg.size < min) ||                  if ((dhg.size > max || dhg.size < min) ||
                     dhg.size != best ||                      dhg.size != best ||
                     linenum++ != which) {                      linenum++ != which) {
                         BN_free(dhg.g);                          BN_clear_free(dhg.g);
                         BN_free(dhg.p);                          BN_clear_free(dhg.p);
                         continue;                          continue;
                 }                  }
                 break;                  break;
Line 205 
Line 203 
                     BN_num_bits(dh->p), 2*need);                      BN_num_bits(dh->p), 2*need);
         do {          do {
                 if (dh->priv_key != NULL)                  if (dh->priv_key != NULL)
                         BN_free(dh->priv_key);                          BN_clear_free(dh->priv_key);
                 dh->priv_key = BN_new();                  if ((dh->priv_key = BN_new()) == NULL)
                 if (dh->priv_key == NULL)  
                         fatal("dh_gen_key: BN_new failed");                          fatal("dh_gen_key: BN_new failed");
                 /* generate a 2*need bits random private exponent */                  /* generate a 2*need bits random private exponent */
                 if (!BN_rand(dh->priv_key, 2*need, 0, 0))                  if (!BN_rand(dh->priv_key, 2*need, 0, 0))
Line 229 
Line 226 
 {  {
         DH *dh;          DH *dh;
   
         dh = DH_new();          if ((dh = DH_new()) == NULL)
         if (dh == NULL)                  fatal("dh_new_group_asc: DH_new");
                 fatal("DH_new");  
   
         if (BN_hex2bn(&dh->p, modulus) == 0)          if (BN_hex2bn(&dh->p, modulus) == 0)
                 fatal("BN_hex2bn p");                  fatal("BN_hex2bn p");
Line 251 
Line 247 
 {  {
         DH *dh;          DH *dh;
   
         dh = DH_new();          if ((dh = DH_new()) == NULL)
         if (dh == NULL)                  fatal("dh_new_group: DH_new");
                 fatal("DH_new");  
         dh->p = modulus;          dh->p = modulus;
         dh->g = gen;          dh->g = gen;
   

Legend:
Removed from v.1.14  
changed lines
  Added in v.1.14.2.2