[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.201 and 1.206

version 1.201, 2010/08/31 12:33:38 version 1.206, 2011/03/23 15:16:22
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      521  #define DEFAULT_BITS_ECDSA      256
 u_int32_t bits = 0;  u_int32_t bits = 0;
   
 /*  /*
Line 152 
Line 152 
 int prime_test(FILE *, FILE *, u_int32_t, u_int32_t);  int prime_test(FILE *, FILE *, u_int32_t, u_int32_t);
   
 static void  static void
   type_bits_valid(int type, u_int32_t *bits)
   {
           u_int maxbits;
   
           if (type == KEY_UNSPEC) {
                   fprintf(stderr, "unknown key type %s\n", key_type_name);
                   exit(1);
           }
           if (*bits == 0) {
                   if (type == KEY_DSA)
                           *bits = DEFAULT_BITS_DSA;
                   else if (type == KEY_ECDSA)
                           *bits = DEFAULT_BITS_ECDSA;
                   else
                           *bits = 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");
           else if (type != KEY_ECDSA && *bits < 768)
                   fatal("Key must at least be 768 bits");
           else if (type == KEY_ECDSA && key_ecdsa_bits_to_nid(*bits) == -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 545 
Line 577 
                 *k = key_new(KEY_UNSPEC);                  *k = key_new(KEY_UNSPEC);
                 (*k)->type = KEY_ECDSA;                  (*k)->type = KEY_ECDSA;
                 (*k)->ecdsa = EVP_PKEY_get1_EC_KEY(pubkey);                  (*k)->ecdsa = EVP_PKEY_get1_EC_KEY(pubkey);
                 (*k)->ecdsa_nid = key_ecdsa_group_to_nid(                  (*k)->ecdsa_nid = key_ecdsa_key_to_nid((*k)->ecdsa);
                     EC_KEY_get0_group((*k)->ecdsa));  
                 break;                  break;
         default:          default:
                 fatal("%s: unsupported pubkey type %d", __func__,                  fatal("%s: unsupported pubkey type %d", __func__,
Line 803 
Line 834 
 }  }
   
 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 1465 
Line 1588 
                 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 1690 
Line 1814 
         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 1727 
Line 1853 
 {  {
         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 1781 
Line 1908 
         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;
         BIGNUM *start = NULL;          BIGNUM *start = NULL;
         FILE *f;          FILE *f;
         const char *errstr;          const char *errstr;
Line 1808 
Line 1935 
                 exit(1);                  exit(1);
         }          }
   
         while ((opt = getopt(argc, argv, "degiqpclBHLhvxXyF:b:f:t:D:I:P:m:N:n:"          while ((opt = getopt(argc, argv, "AdegiqpclBHLhvxXyF:b:f:t:D:I:P:m:N:n:"
             "O:C:r:g:R:T:G:M:S:s:a:V:W:z:")) != -1) {              "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 2086 
Line 2216 
                 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) {  
                 if (type == KEY_DSA)  
                         bits = DEFAULT_BITS_DSA;  
                 else if (type == KEY_ECDSA)  
                         bits = DEFAULT_BITS_ECDSA;  
                 else  
                         bits = 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");  
         else if (type == KEY_ECDSA && key_ecdsa_bits_to_nid(bits) == -1)  
                 fatal("Invalid ECDSA key length - valid lengths are "  
                     "256, 384 or 521 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.201  
changed lines
  Added in v.1.206