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

Diff for /src/usr.bin/ssh/ssh-keygen.c between version 1.196 and 1.220

version 1.196, 2010/08/04 05:40:39 version 1.220, 2012/12/03 00:14:06
Line 49 
Line 49 
 /* Number of bits in the RSA/DSA key.  This value can be set on the command line. */  /* Number of bits in the RSA/DSA key.  This value can be set on the command line. */
 #define DEFAULT_BITS            2048  #define DEFAULT_BITS            2048
 #define DEFAULT_BITS_DSA        1024  #define DEFAULT_BITS_DSA        1024
   #define DEFAULT_BITS_ECDSA      256
 u_int32_t bits = 0;  u_int32_t bits = 0;
   
 /*  /*
Line 98 
Line 99 
 char *ca_key_path = NULL;  char *ca_key_path = NULL;
   
 /* Certificate serial number */  /* Certificate serial number */
 long long cert_serial = 0;  unsigned long long cert_serial = 0;
   
 /* Key type when certifying */  /* Key type when certifying */
 u_int cert_key_type = SSH2_CERT_TYPE_USER;  u_int cert_key_type = SSH2_CERT_TYPE_USER;
Line 138 
Line 139 
   
 char *key_type_name = NULL;  char *key_type_name = NULL;
   
   /* Load key from this PKCS#11 provider */
   char *pkcs11provider = NULL;
   
 /* argv0 */  /* argv0 */
 extern char *__progname;  extern char *__progname;
Line 146 
Line 149 
   
 /* moduli.c */  /* moduli.c */
 int gen_candidates(FILE *, u_int32_t, u_int32_t, BIGNUM *);  int gen_candidates(FILE *, u_int32_t, u_int32_t, BIGNUM *);
 int prime_test(FILE *, FILE *, u_int32_t, u_int32_t);  int prime_test(FILE *, FILE *, u_int32_t, u_int32_t, char *, unsigned long,
       unsigned long);
   
 static void  static void
   type_bits_valid(int type, u_int32_t *bitsp)
   {
           u_int maxbits;
   
           if (type == KEY_UNSPEC) {
                   fprintf(stderr, "unknown key type %s\n", key_type_name);
                   exit(1);
           }
           if (*bitsp == 0) {
                   if (type == KEY_DSA)
                           *bitsp = DEFAULT_BITS_DSA;
                   else if (type == KEY_ECDSA)
                           *bitsp = DEFAULT_BITS_ECDSA;
                   else
                           *bitsp = DEFAULT_BITS;
           }
           maxbits = (type == KEY_DSA) ?
               OPENSSL_DSA_MAX_MODULUS_BITS : OPENSSL_RSA_MAX_MODULUS_BITS;
           if (*bitsp > maxbits) {
                   fprintf(stderr, "key bits exceeds maximum %d\n", maxbits);
                   exit(1);
           }
           if (type == KEY_DSA && *bitsp != 1024)
                   fatal("DSA keys must be 1024 bits");
           else if (type != KEY_ECDSA && *bitsp < 768)
                   fatal("Key must at least be 768 bits");
           else if (type == KEY_ECDSA && key_ecdsa_bits_to_nid(*bitsp) == -1)
                   fatal("Invalid ECDSA key length - valid lengths are "
                       "256, 384 or 521 bits");
   }
   
   static void
 ask_filename(struct passwd *pw, const char *prompt)  ask_filename(struct passwd *pw, const char *prompt)
 {  {
         char buf[1024];          char buf[1024];
Line 166 
Line 202 
                 case KEY_DSA:                  case KEY_DSA:
                         name = _PATH_SSH_CLIENT_ID_DSA;                          name = _PATH_SSH_CLIENT_ID_DSA;
                         break;                          break;
                   case KEY_ECDSA_CERT:
                   case KEY_ECDSA:
                           name = _PATH_SSH_CLIENT_ID_ECDSA;
                           break;
                 case KEY_RSA_CERT:                  case KEY_RSA_CERT:
                 case KEY_RSA_CERT_V00:                  case KEY_RSA_CERT_V00:
                 case KEY_RSA:                  case KEY_RSA:
Line 219 
Line 259 
         u_char *blob;          u_char *blob;
         char comment[61];          char comment[61];
   
           if (k->type == KEY_RSA1) {
                   fprintf(stderr, "version 1 keys are not supported\n");
                   exit(1);
           }
         if (key_to_blob(k, &blob, &len) <= 0) {          if (key_to_blob(k, &blob, &len) <= 0) {
                 fprintf(stderr, "key_to_blob failed\n");                  fprintf(stderr, "key_to_blob failed\n");
                 exit(1);                  exit(1);
Line 242 
Line 286 
 do_convert_to_pkcs8(Key *k)  do_convert_to_pkcs8(Key *k)
 {  {
         switch (key_type_plain(k->type)) {          switch (key_type_plain(k->type)) {
           case KEY_RSA1:
         case KEY_RSA:          case KEY_RSA:
                 if (!PEM_write_RSA_PUBKEY(stdout, k->rsa))                  if (!PEM_write_RSA_PUBKEY(stdout, k->rsa))
                         fatal("PEM_write_RSA_PUBKEY failed");                          fatal("PEM_write_RSA_PUBKEY failed");
Line 250 
Line 295 
                 if (!PEM_write_DSA_PUBKEY(stdout, k->dsa))                  if (!PEM_write_DSA_PUBKEY(stdout, k->dsa))
                         fatal("PEM_write_DSA_PUBKEY failed");                          fatal("PEM_write_DSA_PUBKEY failed");
                 break;                  break;
           case KEY_ECDSA:
                   if (!PEM_write_EC_PUBKEY(stdout, k->ecdsa))
                           fatal("PEM_write_EC_PUBKEY failed");
                   break;
         default:          default:
                 fatal("%s: unsupported key type %s", __func__, key_type(k));                  fatal("%s: unsupported key type %s", __func__, key_type(k));
         }          }
Line 260 
Line 309 
 do_convert_to_pem(Key *k)  do_convert_to_pem(Key *k)
 {  {
         switch (key_type_plain(k->type)) {          switch (key_type_plain(k->type)) {
           case KEY_RSA1:
         case KEY_RSA:          case KEY_RSA:
                 if (!PEM_write_RSAPublicKey(stdout, k->rsa))                  if (!PEM_write_RSAPublicKey(stdout, k->rsa))
                         fatal("PEM_write_RSAPublicKey failed");                          fatal("PEM_write_RSAPublicKey failed");
Line 270 
Line 320 
                         fatal("PEM_write_DSAPublicKey failed");                          fatal("PEM_write_DSAPublicKey failed");
                 break;                  break;
 #endif  #endif
           /* XXX ECDSA? */
         default:          default:
                 fatal("%s: unsupported key type %s", __func__, key_type(k));                  fatal("%s: unsupported key type %s", __func__, key_type(k));
         }          }
Line 292 
Line 343 
                         exit(1);                          exit(1);
                 }                  }
         }          }
         if (k->type == KEY_RSA1) {  
                 fprintf(stderr, "version 1 keys are not supported\n");  
                 exit(1);  
         }  
   
         switch (convert_format) {          switch (convert_format) {
         case FMT_RFC4716:          case FMT_RFC4716:
Line 529 
Line 576 
                 (*k)->type = KEY_DSA;                  (*k)->type = KEY_DSA;
                 (*k)->dsa = EVP_PKEY_get1_DSA(pubkey);                  (*k)->dsa = EVP_PKEY_get1_DSA(pubkey);
                 break;                  break;
           case EVP_PKEY_EC:
                   *k = key_new(KEY_UNSPEC);
                   (*k)->type = KEY_ECDSA;
                   (*k)->ecdsa = EVP_PKEY_get1_EC_KEY(pubkey);
                   (*k)->ecdsa_nid = key_ecdsa_key_to_nid((*k)->ecdsa);
                   break;
         default:          default:
                 fatal("%s: unsupported pubkey type %d", __func__,                  fatal("%s: unsupported pubkey type %d", __func__,
                     EVP_PKEY_type(pubkey->type));                      EVP_PKEY_type(pubkey->type));
Line 564 
Line 617 
                 fclose(fp);                  fclose(fp);
                 return;                  return;
         }          }
           /* XXX ECDSA */
 #endif  #endif
         fatal("%s: unrecognised raw private key format", __func__);          fatal("%s: unrecognised raw private key format", __func__);
 }  }
Line 604 
Line 658 
                         ok = PEM_write_DSAPrivateKey(stdout, k->dsa, NULL,                          ok = PEM_write_DSAPrivateKey(stdout, k->dsa, NULL,
                             NULL, 0, NULL, NULL);                              NULL, 0, NULL, NULL);
                         break;                          break;
                   case KEY_ECDSA:
                           ok = PEM_write_ECPrivateKey(stdout, k->ecdsa, NULL,
                               NULL, 0, NULL, NULL);
                           break;
                 case KEY_RSA:                  case KEY_RSA:
                         ok = PEM_write_RSAPrivateKey(stdout, k->rsa, NULL,                          ok = PEM_write_RSAPrivateKey(stdout, k->rsa, NULL,
                             NULL, 0, NULL, NULL);                              NULL, 0, NULL, NULL);
Line 647 
Line 705 
 }  }
   
 static void  static void
 do_download(struct passwd *pw, char *pkcs11provider)  do_download(struct passwd *pw)
 {  {
 #ifdef ENABLE_PKCS11  #ifdef ENABLE_PKCS11
         Key **keys = NULL;          Key **keys = NULL;
Line 779 
Line 837 
 }  }
   
 static void  static void
   do_gen_all_hostkeys(struct passwd *pw)
   {
           struct {
                   char *key_type;
                   char *key_type_display;
                   char *path;
           } key_types[] = {
                   { "rsa1", "RSA1", _PATH_HOST_KEY_FILE },
                   { "rsa", "RSA" ,_PATH_HOST_RSA_KEY_FILE },
                   { "dsa", "DSA", _PATH_HOST_DSA_KEY_FILE },
                   { "ecdsa", "ECDSA",_PATH_HOST_ECDSA_KEY_FILE },
                   { NULL, NULL, NULL }
           };
   
           int first = 0;
           struct stat st;
           Key *private, *public;
           char comment[1024];
           int i, type, fd;
           FILE *f;
   
           for (i = 0; key_types[i].key_type; i++) {
                   if (stat(key_types[i].path, &st) == 0)
                           continue;
                   if (errno != ENOENT) {
                           printf("Could not stat %s: %s", key_types[i].path,
                               strerror(errno));
                           first = 0;
                           continue;
                   }
   
                   if (first == 0) {
                           first = 1;
                           printf("%s: generating new host keys: ", __progname);
                   }
                   printf("%s ", key_types[i].key_type_display);
                   fflush(stdout);
                   arc4random_stir();
                   type = key_type_from_name(key_types[i].key_type);
                   strlcpy(identity_file, key_types[i].path, sizeof(identity_file));
                   bits = 0;
                   type_bits_valid(type, &bits);
                   private = key_generate(type, bits);
                   if (private == NULL) {
                           fprintf(stderr, "key_generate failed\n");
                           first = 0;
                           continue;
                   }
                   public  = key_from_private(private);
                   snprintf(comment, sizeof comment, "%s@%s", pw->pw_name,
                       hostname);
                   if (!key_save_private(private, identity_file, "", comment)) {
                           printf("Saving the key failed: %s.\n", identity_file);
                           key_free(private);
                           key_free(public);
                           first = 0;
                           continue;
                   }
                   key_free(private);
                   arc4random_stir();
                   strlcat(identity_file, ".pub", sizeof(identity_file));
                   fd = open(identity_file, O_WRONLY | O_CREAT | O_TRUNC, 0644);
                   if (fd == -1) {
                           printf("Could not save your public key in %s\n",
                               identity_file);
                           key_free(public);
                           first = 0;
                           continue;
                   }
                   f = fdopen(fd, "w");
                   if (f == NULL) {
                           printf("fdopen %s failed\n", identity_file);
                           key_free(public);
                           first = 0;
                           continue;
                   }
                   if (!key_write(public, f)) {
                           fprintf(stderr, "write key failed\n");
                           key_free(public);
                           first = 0;
                           continue;
                   }
                   fprintf(f, " %s\n", comment);
                   fclose(f);
                   key_free(public);
   
           }
           if (first != 0)
                   printf("\n");
   }
   
   static void
 printhost(FILE *f, const char *name, Key *public, int ca, int hash)  printhost(FILE *f, const char *name, Key *public, int ca, int hash)
 {  {
         if (print_fingerprint) {          if (print_fingerprint) {
Line 923 
Line 1073 
                                             ca ? " (CA key)" : "");                                              ca ? " (CA key)" : "");
                                         printhost(out, cp, pub, ca, 0);                                          printhost(out, cp, pub, ca, 0);
                                 }                                  }
                                 if (delete_host && !c && !ca)                                  if (delete_host) {
                                         printhost(out, cp, pub, ca, 0);                                          if (!c && !ca)
                                                   printhost(out, cp, pub, ca, 0);
                                           else
                                                   printf("# Host %s found: "
                                                       "line %d type %s\n", name,
                                                       num, key_type(pub));
                                   }
                         } else if (hash_hosts)                          } else if (hash_hosts)
                                 printhost(out, cp, pub, ca, 0);                                  printhost(out, cp, pub, ca, 0);
                 } else {                  } else {
Line 939 
Line 1095 
                                         printhost(out, name, pub,                                          printhost(out, name, pub,
                                             ca, hash_hosts && !ca);                                              ca, hash_hosts && !ca);
                                 }                                  }
                                 if (delete_host && !c && !ca)                                  if (delete_host) {
                                         printhost(out, cp, pub, ca, 0);                                          if (!c && !ca)
                                                   printhost(out, cp, pub, ca, 0);
                                           else
                                                   printf("# Host %s found: "
                                                       "line %d type %s\n", name,
                                                       num, key_type(pub));
                                   }
                         } else if (hash_hosts) {                          } else if (hash_hosts) {
                                 for (cp2 = strsep(&cp, ",");                                  for (cp2 = strsep(&cp, ",");
                                     cp2 != NULL && *cp2 != '\0';                                      cp2 != NULL && *cp2 != '\0';
Line 1291 
Line 1453 
             certflags_command != NULL)              certflags_command != NULL)
                 add_string_option(c, "force-command", certflags_command);                  add_string_option(c, "force-command", certflags_command);
         if ((which & OPTIONS_EXTENSIONS) != 0 &&          if ((which & OPTIONS_EXTENSIONS) != 0 &&
               (certflags_flags & CERTOPT_X_FWD) != 0)
                   add_flag_option(c, "permit-X11-forwarding");
           if ((which & OPTIONS_EXTENSIONS) != 0 &&
             (certflags_flags & CERTOPT_AGENT_FWD) != 0)              (certflags_flags & CERTOPT_AGENT_FWD) != 0)
                 add_flag_option(c, "permit-agent-forwarding");                  add_flag_option(c, "permit-agent-forwarding");
         if ((which & OPTIONS_EXTENSIONS) != 0 &&          if ((which & OPTIONS_EXTENSIONS) != 0 &&
Line 1302 
Line 1467 
         if ((which & OPTIONS_EXTENSIONS) != 0 &&          if ((which & OPTIONS_EXTENSIONS) != 0 &&
             (certflags_flags & CERTOPT_USER_RC) != 0)              (certflags_flags & CERTOPT_USER_RC) != 0)
                 add_flag_option(c, "permit-user-rc");                  add_flag_option(c, "permit-user-rc");
         if ((which & OPTIONS_EXTENSIONS) != 0 &&  
             (certflags_flags & CERTOPT_X_FWD) != 0)  
                 add_flag_option(c, "permit-X11-forwarding");  
         if ((which & OPTIONS_CRITICAL) != 0 &&          if ((which & OPTIONS_CRITICAL) != 0 &&
             certflags_src_addr != NULL)              certflags_src_addr != NULL)
                 add_string_option(c, "source-address", certflags_src_addr);                  add_string_option(c, "source-address", certflags_src_addr);
 }  }
   
   static Key *
   load_pkcs11_key(char *path)
   {
   #ifdef ENABLE_PKCS11
           Key **keys = NULL, *public, *private = NULL;
           int i, nkeys;
   
           if ((public = key_load_public(path, NULL)) == NULL)
                   fatal("Couldn't load CA public key \"%s\"", path);
   
           nkeys = pkcs11_add_provider(pkcs11provider, identity_passphrase, &keys);
           debug3("%s: %d keys", __func__, nkeys);
           if (nkeys <= 0)
                   fatal("cannot read public key from pkcs11");
           for (i = 0; i < nkeys; i++) {
                   if (key_equal_public(public, keys[i])) {
                           private = keys[i];
                           continue;
                   }
                   key_free(keys[i]);
           }
           xfree(keys);
           key_free(public);
           return private;
   #else
           fatal("no pkcs11 support");
   #endif /* ENABLE_PKCS11 */
   }
   
 static void  static void
 do_ca_sign(struct passwd *pw, int argc, char **argv)  do_ca_sign(struct passwd *pw, int argc, char **argv)
 {  {
Line 1320 
Line 1511 
         FILE *f;          FILE *f;
         int v00 = 0; /* legacy keys */          int v00 = 0; /* legacy keys */
   
         tmp = tilde_expand_filename(ca_key_path, pw->pw_uid);  
         if ((ca = load_identity(tmp)) == NULL)  
                 fatal("Couldn't load CA key \"%s\"", tmp);  
         xfree(tmp);  
   
         if (key_type_name != NULL) {          if (key_type_name != NULL) {
                 switch (key_type_from_name(key_type_name)) {                  switch (key_type_from_name(key_type_name)) {
                 case KEY_RSA_CERT_V00:                  case KEY_RSA_CERT_V00:
Line 1344 
Line 1530 
                 }                  }
         }          }
   
           pkcs11_init(1);
           tmp = tilde_expand_filename(ca_key_path, pw->pw_uid);
           if (pkcs11provider != NULL) {
                   if ((ca = load_pkcs11_key(tmp)) == NULL)
                           fatal("No PKCS#11 key matching %s found", ca_key_path);
           } else if ((ca = load_identity(tmp)) == NULL)
                   fatal("Couldn't load CA key \"%s\"", tmp);
           xfree(tmp);
   
         for (i = 0; i < argc; i++) {          for (i = 0; i < argc; i++) {
                 /* Split list of principals */                  /* Split list of principals */
                 n = 0;                  n = 0;
Line 1361 
Line 1556 
                 tmp = tilde_expand_filename(argv[i], pw->pw_uid);                  tmp = tilde_expand_filename(argv[i], pw->pw_uid);
                 if ((public = key_load_public(tmp, &comment)) == NULL)                  if ((public = key_load_public(tmp, &comment)) == NULL)
                         fatal("%s: unable to open \"%s\"", __func__, tmp);                          fatal("%s: unable to open \"%s\"", __func__, tmp);
                 if (public->type != KEY_RSA && public->type != KEY_DSA)                  if (public->type != KEY_RSA && public->type != KEY_DSA &&
                       public->type != KEY_ECDSA)
                         fatal("%s: key \"%s\" type %s cannot be certified",                          fatal("%s: key \"%s\" type %s cannot be certified",
                             __func__, tmp, key_type(public));                              __func__, tmp, key_type(public));
   
Line 1407 
Line 1603 
                 if (!quiet) {                  if (!quiet) {
                         logit("Signed %s key %s: id \"%s\" serial %llu%s%s "                          logit("Signed %s key %s: id \"%s\" serial %llu%s%s "
                             "valid %s", key_cert_type(public),                              "valid %s", key_cert_type(public),
                             out, public->cert->key_id, public->cert->serial,                              out, public->cert->key_id,
                               (unsigned long long)public->cert->serial,
                             cert_principals != NULL ? " for " : "",                              cert_principals != NULL ? " for " : "",
                             cert_principals != NULL ? cert_principals : "",                              cert_principals != NULL ? cert_principals : "",
                             fmt_validity(cert_valid_from, cert_valid_to));                              fmt_validity(cert_valid_from, cert_valid_to));
Line 1416 
Line 1613 
                 key_free(public);                  key_free(public);
                 xfree(out);                  xfree(out);
         }          }
           pkcs11_terminate();
         exit(0);          exit(0);
 }  }
   
Line 1518 
Line 1716 
 {  {
         char *val;          char *val;
   
         if (strcmp(opt, "clear") == 0)          if (strcasecmp(opt, "clear") == 0)
                 certflags_flags = 0;                  certflags_flags = 0;
         else if (strcasecmp(opt, "no-x11-forwarding") == 0)          else if (strcasecmp(opt, "no-x11-forwarding") == 0)
                 certflags_flags &= ~CERTOPT_X_FWD;                  certflags_flags &= ~CERTOPT_X_FWD;
Line 1631 
Line 1829 
         printf("        Signing CA: %s %s\n",          printf("        Signing CA: %s %s\n",
             key_type(key->cert->signature_key), ca_fp);              key_type(key->cert->signature_key), ca_fp);
         printf("        Key ID: \"%s\"\n", key->cert->key_id);          printf("        Key ID: \"%s\"\n", key->cert->key_id);
         if (!v00)          if (!v00) {
                 printf("        Serial: %llu\n", key->cert->serial);                  printf("        Serial: %llu\n",
                       (unsigned long long)key->cert->serial);
           }
         printf("        Valid: %s\n",          printf("        Valid: %s\n",
             fmt_validity(key->cert->valid_after, key->cert->valid_before));              fmt_validity(key->cert->valid_after, key->cert->valid_before));
         printf("        Principals: ");          printf("        Principals: ");
Line 1668 
Line 1868 
 {  {
         fprintf(stderr, "usage: %s [options]\n", __progname);          fprintf(stderr, "usage: %s [options]\n", __progname);
         fprintf(stderr, "Options:\n");          fprintf(stderr, "Options:\n");
           fprintf(stderr, "  -A          Generate non-existent host keys for all key types.\n");
         fprintf(stderr, "  -a trials   Number of trials for screening DH-GEX moduli.\n");          fprintf(stderr, "  -a trials   Number of trials for screening DH-GEX moduli.\n");
         fprintf(stderr, "  -B          Show bubblebabble digest of key file.\n");          fprintf(stderr, "  -B          Show bubblebabble digest of key file.\n");
         fprintf(stderr, "  -b bits     Number of bits in the key to create.\n");          fprintf(stderr, "  -b bits     Number of bits in the key to create.\n");
Line 1685 
Line 1886 
         fprintf(stderr, "  -h          Generate host certificate instead of a user certificate.\n");          fprintf(stderr, "  -h          Generate host certificate instead of a user certificate.\n");
         fprintf(stderr, "  -I key_id   Key identifier to include in certificate.\n");          fprintf(stderr, "  -I key_id   Key identifier to include in certificate.\n");
         fprintf(stderr, "  -i          Import foreign format to OpenSSH key file.\n");          fprintf(stderr, "  -i          Import foreign format to OpenSSH key file.\n");
           fprintf(stderr, "  -J number   Screen this number of moduli lines.\n");
           fprintf(stderr, "  -j number   Start screening moduli at specified line.\n");
           fprintf(stderr, "  -K checkpt  Write checkpoints to this file.\n");
         fprintf(stderr, "  -L          Print the contents of a certificate.\n");          fprintf(stderr, "  -L          Print the contents of a certificate.\n");
         fprintf(stderr, "  -l          Show fingerprint of key file.\n");          fprintf(stderr, "  -l          Show fingerprint of key file.\n");
         fprintf(stderr, "  -M memory   Amount of memory (MB) to use for generating DH-GEX moduli.\n");          fprintf(stderr, "  -M memory   Amount of memory (MB) to use for generating DH-GEX moduli.\n");
Line 1717 
Line 1921 
 main(int argc, char **argv)  main(int argc, char **argv)
 {  {
         char dotsshdir[MAXPATHLEN], comment[1024], *passphrase1, *passphrase2;          char dotsshdir[MAXPATHLEN], comment[1024], *passphrase1, *passphrase2;
         char out_file[MAXPATHLEN], *pkcs11provider = NULL;          char *checkpoint = NULL;
         char *rr_hostname = NULL;          char out_file[MAXPATHLEN], *rr_hostname = NULL, *ep;
         Key *private, *public;          Key *private, *public;
         struct passwd *pw;          struct passwd *pw;
         struct stat st;          struct stat st;
         int opt, type, fd;          int opt, type, fd;
         u_int maxbits;  
         u_int32_t memory = 0, generator_wanted = 0, trials = 100;          u_int32_t memory = 0, generator_wanted = 0, trials = 100;
         int do_gen_candidates = 0, do_screen_candidates = 0;          int do_gen_candidates = 0, do_screen_candidates = 0;
           int gen_all_hostkeys = 0;
           unsigned long start_lineno = 0, lines_to_process = 0;
         BIGNUM *start = NULL;          BIGNUM *start = NULL;
         FILE *f;          FILE *f;
         const char *errstr;          const char *errstr;
Line 1736 
Line 1941 
         /* Ensure that fds 0, 1 and 2 are open or directed to /dev/null */          /* Ensure that fds 0, 1 and 2 are open or directed to /dev/null */
         sanitise_stdfd();          sanitise_stdfd();
   
         SSLeay_add_all_algorithms();          OpenSSL_add_all_algorithms();
         log_init(argv[0], SYSLOG_LEVEL_INFO, SYSLOG_FACILITY_USER, 1);          log_init(argv[0], SYSLOG_LEVEL_INFO, SYSLOG_FACILITY_USER, 1);
   
         /* we need this for the home * directory.  */          /* we need this for the home * directory.  */
Line 1750 
Line 1955 
                 exit(1);                  exit(1);
         }          }
   
         while ((opt = getopt(argc, argv, "degiqpclBHLhvxXyF:b:f:t:D:I:P:m:N:n:"          while ((opt = getopt(argc, argv, "AegiqpclBHLhvxXyF:b:f:t:D:I:J:j:K:P:"
             "O:C:r:g:R:T:G:M:S:s:a:V:W:z:")) != -1) {              "m:N:n:O:C:r:g:R:T:G:M:S:s:a:V:W:z:")) != -1) {
                 switch (opt) {                  switch (opt) {
                   case 'A':
                           gen_all_hostkeys = 1;
                           break;
                 case 'b':                  case 'b':
                         bits = (u_int32_t)strtonum(optarg, 768, 32768, &errstr);                          bits = (u_int32_t)strtonum(optarg, 256, 32768, &errstr);
                         if (errstr)                          if (errstr)
                                 fatal("Bits has bad value %s (%s)",                                  fatal("Bits has bad value %s (%s)",
                                         optarg, errstr);                                          optarg, errstr);
Line 1769 
Line 1977 
                 case 'I':                  case 'I':
                         cert_key_id = optarg;                          cert_key_id = optarg;
                         break;                          break;
                   case 'J':
                           lines_to_process = strtoul(optarg, NULL, 10);
                           break;
                   case 'j':
                           start_lineno = strtoul(optarg, NULL, 10);
                           break;
                 case 'R':                  case 'R':
                         delete_host = 1;                          delete_host = 1;
                         rr_hostname = optarg;                          rr_hostname = optarg;
Line 1847 
Line 2061 
                 case 'y':                  case 'y':
                         print_public = 1;                          print_public = 1;
                         break;                          break;
                 case 'd':  
                         key_type_name = "dsa";  
                         break;  
                 case 's':                  case 's':
                         ca_key_path = optarg;                          ca_key_path = optarg;
                         break;                          break;
Line 1901 
Line 2112 
                             sizeof(out_file))                              sizeof(out_file))
                                 fatal("Output filename too long");                                  fatal("Output filename too long");
                         break;                          break;
                   case 'K':
                           if (strlen(optarg) >= MAXPATHLEN)
                                   fatal("Checkpoint filename too long");
                           checkpoint = xstrdup(optarg);
                           break;
                 case 'S':                  case 'S':
                         /* XXX - also compare length against bits */                          /* XXX - also compare length against bits */
                         if (BN_hex2bn(&start, optarg) == 0)                          if (BN_hex2bn(&start, optarg) == 0)
Line 1910 
Line 2126 
                         parse_cert_times(optarg);                          parse_cert_times(optarg);
                         break;                          break;
                 case 'z':                  case 'z':
                         cert_serial = strtonum(optarg, 0, LLONG_MAX, &errstr);                          errno = 0;
                         if (errstr)                          cert_serial = strtoull(optarg, &ep, 10);
                                 fatal("Invalid serial number: %s", errstr);                          if (*optarg < '0' || *optarg > '9' || *ep != '\0' ||
                               (errno == ERANGE && cert_serial == ULLONG_MAX))
                                   fatal("Invalid serial number \"%s\"", optarg);
                         break;                          break;
                 case '?':                  case '?':
                 default:                  default:
Line 1981 
Line 2199 
                             _PATH_HOST_RSA_KEY_FILE, rr_hostname);                              _PATH_HOST_RSA_KEY_FILE, rr_hostname);
                         n += do_print_resource_record(pw,                          n += do_print_resource_record(pw,
                             _PATH_HOST_DSA_KEY_FILE, rr_hostname);                              _PATH_HOST_DSA_KEY_FILE, rr_hostname);
                           n += do_print_resource_record(pw,
                               _PATH_HOST_ECDSA_KEY_FILE, rr_hostname);
   
                         if (n == 0)                          if (n == 0)
                                 fatal("no keys found.");                                  fatal("no keys found.");
Line 1988 
Line 2208 
                 }                  }
         }          }
         if (pkcs11provider != NULL)          if (pkcs11provider != NULL)
                 do_download(pw, pkcs11provider);                  do_download(pw);
   
         if (do_gen_candidates) {          if (do_gen_candidates) {
                 FILE *out = fopen(out_file, "w");                  FILE *out = fopen(out_file, "w");
Line 2023 
Line 2243 
                         fatal("Couldn't open moduli file \"%s\": %s",                          fatal("Couldn't open moduli file \"%s\": %s",
                             out_file, strerror(errno));                              out_file, strerror(errno));
                 }                  }
                 if (prime_test(in, out, trials, generator_wanted) != 0)                  if (prime_test(in, out, trials, generator_wanted, checkpoint,
                       start_lineno, lines_to_process) != 0)
                         fatal("modulus screening failed");                          fatal("modulus screening failed");
                 return (0);                  return (0);
         }          }
   
           if (gen_all_hostkeys) {
                   do_gen_all_hostkeys(pw);
                   return (0);
           }
   
         arc4random_stir();          arc4random_stir();
   
         if (key_type_name == NULL)          if (key_type_name == NULL)
                 key_type_name = "rsa";                  key_type_name = "rsa";
   
         type = key_type_from_name(key_type_name);          type = key_type_from_name(key_type_name);
         if (type == KEY_UNSPEC) {          type_bits_valid(type, &bits);
                 fprintf(stderr, "unknown key type %s\n", key_type_name);  
                 exit(1);  
         }  
         if (bits == 0)  
                 bits = (type == KEY_DSA) ? DEFAULT_BITS_DSA : DEFAULT_BITS;  
         maxbits = (type == KEY_DSA) ?  
             OPENSSL_DSA_MAX_MODULUS_BITS : OPENSSL_RSA_MAX_MODULUS_BITS;  
         if (bits > maxbits) {  
                 fprintf(stderr, "key bits exceeds maximum %d\n", maxbits);  
                 exit(1);  
         }  
         if (type == KEY_DSA && bits != 1024)  
                 fatal("DSA keys must be 1024 bits");  
         if (!quiet)          if (!quiet)
                 printf("Generating public/private %s key pair.\n", key_type_name);                  printf("Generating public/private %s key pair.\n", key_type_name);
         private = key_generate(type, bits);          private = key_generate(type, bits);

Legend:
Removed from v.1.196  
changed lines
  Added in v.1.220