[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.413 and 1.415

version 1.413, 2020/06/26 05:02:03 version 1.415, 2020/08/03 02:53:51
Line 127 
Line 127 
 static char *certflags_src_addr = NULL;  static char *certflags_src_addr = NULL;
   
 /* Arbitrary extensions specified by user */  /* Arbitrary extensions specified by user */
 struct cert_userext {  struct cert_ext {
         char *key;          char *key;
         char *val;          char *val;
         int crit;          int crit;
 };  };
 static struct cert_userext *cert_userext;  static struct cert_ext *cert_ext;
 static size_t ncert_userext;  static size_t ncert_ext;
   
 /* Conversion to/from various formats */  /* Conversion to/from various formats */
 enum {  enum {
Line 1579 
Line 1579 
 }  }
   
 static void  static void
 add_flag_option(struct sshbuf *c, const char *name)  cert_ext_add(const char *key, const char *value, int iscrit)
 {  {
         int r;          cert_ext = xreallocarray(cert_ext, ncert_ext + 1, sizeof(*cert_ext));
           cert_ext[ncert_ext].key = xstrdup(key);
         debug3("%s: %s", __func__, name);          cert_ext[ncert_ext].val = value == NULL ? NULL : xstrdup(value);
         if ((r = sshbuf_put_cstring(c, name)) != 0 ||          cert_ext[ncert_ext].crit = iscrit;
             (r = sshbuf_put_string(c, NULL, 0)) != 0)          ncert_ext++;
                 fatal("%s: buffer error: %s", __func__, ssh_err(r));  
 }  }
   
 static void  /* qsort(3) comparison function for certificate extensions */
 add_string_option(struct sshbuf *c, const char *name, const char *value)  static int
   cert_ext_cmp(const void *_a, const void *_b)
 {  {
         struct sshbuf *b;          const struct cert_ext *a = (const struct cert_ext *)_a;
           const struct cert_ext *b = (const struct cert_ext *)_b;
         int r;          int r;
   
         debug3("%s: %s=%s", __func__, name, value);          if (a->crit != b->crit)
         if ((b = sshbuf_new()) == NULL)                  return (a->crit < b->crit) ? -1 : 1;
                 fatal("%s: sshbuf_new failed", __func__);          if ((r = strcmp(a->key, b->key)) != 0)
         if ((r = sshbuf_put_cstring(b, value)) != 0 ||                  return r;
             (r = sshbuf_put_cstring(c, name)) != 0 ||          if ((a->val == NULL) != (b->val == NULL))
             (r = sshbuf_put_stringb(c, b)) != 0)                  return (a->val == NULL) ? -1 : 1;
                 fatal("%s: buffer error: %s", __func__, ssh_err(r));          if (a->val != NULL && (r = strcmp(a->val, b->val)) != 0)
                   return r;
         sshbuf_free(b);          return 0;
 }  }
   
 #define OPTIONS_CRITICAL        1  #define OPTIONS_CRITICAL        1
Line 1611 
Line 1612 
 static void  static void
 prepare_options_buf(struct sshbuf *c, int which)  prepare_options_buf(struct sshbuf *c, int which)
 {  {
           struct sshbuf *b;
         size_t i;          size_t i;
           int r;
           const struct cert_ext *ext;
   
           if ((b = sshbuf_new()) == NULL)
                   fatal("%s: sshbuf_new failed", __func__);
         sshbuf_reset(c);          sshbuf_reset(c);
         if ((which & OPTIONS_CRITICAL) != 0 &&          for (i = 0; i < ncert_ext; i++) {
             certflags_command != NULL)                  ext = &cert_ext[i];
                 add_string_option(c, "force-command", certflags_command);                  if ((ext->crit && (which & OPTIONS_EXTENSIONS)) ||
         if ((which & OPTIONS_EXTENSIONS) != 0 &&                      (!ext->crit && (which & OPTIONS_CRITICAL)))
             (certflags_flags & CERTOPT_X_FWD) != 0)  
                 add_flag_option(c, "permit-X11-forwarding");  
         if ((which & OPTIONS_EXTENSIONS) != 0 &&  
             (certflags_flags & CERTOPT_AGENT_FWD) != 0)  
                 add_flag_option(c, "permit-agent-forwarding");  
         if ((which & OPTIONS_EXTENSIONS) != 0 &&  
             (certflags_flags & CERTOPT_PORT_FWD) != 0)  
                 add_flag_option(c, "permit-port-forwarding");  
         if ((which & OPTIONS_EXTENSIONS) != 0 &&  
             (certflags_flags & CERTOPT_PTY) != 0)  
                 add_flag_option(c, "permit-pty");  
         if ((which & OPTIONS_EXTENSIONS) != 0 &&  
             (certflags_flags & CERTOPT_USER_RC) != 0)  
                 add_flag_option(c, "permit-user-rc");  
         if ((which & OPTIONS_EXTENSIONS) != 0 &&  
             (certflags_flags & CERTOPT_NO_REQUIRE_USER_PRESENCE) != 0)  
                 add_flag_option(c, "no-touch-required");  
         if ((which & OPTIONS_CRITICAL) != 0 &&  
             certflags_src_addr != NULL)  
                 add_string_option(c, "source-address", certflags_src_addr);  
         for (i = 0; i < ncert_userext; i++) {  
                 if ((cert_userext[i].crit && (which & OPTIONS_EXTENSIONS)) ||  
                     (!cert_userext[i].crit && (which & OPTIONS_CRITICAL)))  
                         continue;                          continue;
                 if (cert_userext[i].val == NULL)                  if (ext->val == NULL) {
                         add_flag_option(c, cert_userext[i].key);                          /* flag option */
                 else {                          debug3("%s: %s", __func__, ext->key);
                         add_string_option(c, cert_userext[i].key,                          if ((r = sshbuf_put_cstring(c, ext->key)) != 0 ||
                             cert_userext[i].val);                              (r = sshbuf_put_string(c, NULL, 0)) != 0)
                                   fatal("%s: buffer: %s", __func__, ssh_err(r));
                   } else {
                           /* key/value option */
                           debug3("%s: %s=%s", __func__, ext->key, ext->val);
                           sshbuf_reset(b);
                           if ((r = sshbuf_put_cstring(c, ext->key)) != 0 ||
                               (r = sshbuf_put_cstring(b, ext->val)) != 0 ||
                               (r = sshbuf_put_stringb(c, b)) != 0)
                                   fatal("%s: buffer: %s", __func__, ssh_err(r));
                 }                  }
         }          }
           sshbuf_free(b);
 }  }
   
   static void
   finalise_cert_exts(void)
   {
           /* critical options */
           if (certflags_command != NULL)
                   cert_ext_add("force-command", certflags_command, 1);
           if (certflags_src_addr != NULL)
                   cert_ext_add("source-address", certflags_src_addr, 1);
           /* extensions */
           if ((certflags_flags & CERTOPT_X_FWD) != 0)
                   cert_ext_add("permit-X11-forwarding", NULL, 0);
           if ((certflags_flags & CERTOPT_AGENT_FWD) != 0)
                   cert_ext_add("permit-agent-forwarding", NULL, 0);
           if ((certflags_flags & CERTOPT_PORT_FWD) != 0)
                   cert_ext_add("permit-port-forwarding", NULL, 0);
           if ((certflags_flags & CERTOPT_PTY) != 0)
                   cert_ext_add("permit-pty", NULL, 0);
           if ((certflags_flags & CERTOPT_USER_RC) != 0)
                   cert_ext_add("permit-user-rc", NULL, 0);
           if ((certflags_flags & CERTOPT_NO_REQUIRE_USER_PRESENCE) != 0)
                   cert_ext_add("no-touch-required", NULL, 0);
           /* order lexically by key */
           if (ncert_ext > 0)
                   qsort(cert_ext, ncert_ext, sizeof(*cert_ext), cert_ext_cmp);
   }
   
 static struct sshkey *  static struct sshkey *
 load_pkcs11_key(char *path)  load_pkcs11_key(char *path)
 {  {
Line 1758 
Line 1777 
         }          }
         ca_fp = sshkey_fingerprint(ca, fingerprint_hash, SSH_FP_DEFAULT);          ca_fp = sshkey_fingerprint(ca, fingerprint_hash, SSH_FP_DEFAULT);
   
           finalise_cert_exts();
         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 1972 
Line 1992 
                 val = xstrdup(strchr(opt, ':') + 1);                  val = xstrdup(strchr(opt, ':') + 1);
                 if ((cp = strchr(val, '=')) != NULL)                  if ((cp = strchr(val, '=')) != NULL)
                         *cp++ = '\0';                          *cp++ = '\0';
                 cert_userext = xreallocarray(cert_userext, ncert_userext + 1,                  cert_ext_add(val, cp, iscrit);
                     sizeof(*cert_userext));                  free(val);
                 cert_userext[ncert_userext].key = val;  
                 cert_userext[ncert_userext].val = cp == NULL ?  
                     NULL : xstrdup(cp);  
                 cert_userext[ncert_userext].crit = iscrit;  
                 ncert_userext++;  
         } else          } else
                 fatal("Unsupported certificate option \"%s\"", opt);                  fatal("Unsupported certificate option \"%s\"", opt);
 }  }
Line 1986 
Line 2001 
 static void  static void
 show_options(struct sshbuf *optbuf, int in_critical)  show_options(struct sshbuf *optbuf, int in_critical)
 {  {
         char *name, *arg;          char *name, *arg, *hex;
         struct sshbuf *options, *option = NULL;          struct sshbuf *options, *option = NULL;
         int r;          int r;
   
Line 2015 
Line 2030 
                                     __func__, ssh_err(r));                                      __func__, ssh_err(r));
                         printf(" %s\n", arg);                          printf(" %s\n", arg);
                         free(arg);                          free(arg);
                 } else {                  } else if (sshbuf_len(option) > 0) {
                         printf(" UNKNOWN OPTION (len %zu)\n",                          hex = sshbuf_dtob16(option);
                             sshbuf_len(option));                          printf(" UNKNOWN OPTION: %s (len %zu)\n",
                               hex, sshbuf_len(option));
                         sshbuf_reset(option);                          sshbuf_reset(option);
                 }                          free(hex);
                   } else
                           printf(" UNKNOWN FLAG OPTION\n");
                 free(name);                  free(name);
                 if (sshbuf_len(option) != 0)                  if (sshbuf_len(option) != 0)
                         fatal("Option corrupt: extra data at end");                          fatal("Option corrupt: extra data at end");
Line 3013 
Line 3031 
 usage(void)  usage(void)
 {  {
         fprintf(stderr,          fprintf(stderr,
             "usage: ssh-keygen [-q] [-b bits] [-C comment] [-f output_keyfile] [-m format]\n"              "usage: ssh-keygen [-q] [-a rounds] [-b bits] [-C comment] [-f output_keyfile]\n"
               "                  [-m format] [-N new_passphrase] [-O option]\n"
             "                  [-t dsa | ecdsa | ecdsa-sk | ed25519 | ed25519-sk | rsa]\n"              "                  [-t dsa | ecdsa | ecdsa-sk | ed25519 | ed25519-sk | rsa]\n"
             "                  [-N new_passphrase] [-O option] [-w provider]\n"              "                  [-w provider]\n"
             "       ssh-keygen -p [-f keyfile] [-m format] [-N new_passphrase]\n"              "       ssh-keygen -p [-a rounds] [-f keyfile] [-m format] [-N new_passphrase]\n"
             "                   [-P old_passphrase]\n"              "                   [-P old_passphrase]\n"
             "       ssh-keygen -i [-f input_keyfile] [-m key_format]\n"              "       ssh-keygen -i [-f input_keyfile] [-m key_format]\n"
             "       ssh-keygen -e [-f input_keyfile] [-m key_format]\n"              "       ssh-keygen -e [-f input_keyfile] [-m key_format]\n"
             "       ssh-keygen -y [-f input_keyfile]\n"              "       ssh-keygen -y [-f input_keyfile]\n"
             "       ssh-keygen -c [-C comment] [-f keyfile] [-P passphrase]\n"              "       ssh-keygen -c [-a rounds] [-C comment] [-f keyfile] [-P passphrase]\n"
             "       ssh-keygen -l [-v] [-E fingerprint_hash] [-f input_keyfile]\n"              "       ssh-keygen -l [-v] [-E fingerprint_hash] [-f input_keyfile]\n"
             "       ssh-keygen -B [-f input_keyfile]\n");              "       ssh-keygen -B [-f input_keyfile]\n");
 #ifdef ENABLE_PKCS11  #ifdef ENABLE_PKCS11
Line 3031 
Line 3050 
         fprintf(stderr,          fprintf(stderr,
             "       ssh-keygen -F hostname [-lv] [-f known_hosts_file]\n"              "       ssh-keygen -F hostname [-lv] [-f known_hosts_file]\n"
             "       ssh-keygen -H [-f known_hosts_file]\n"              "       ssh-keygen -H [-f known_hosts_file]\n"
             "       ssh-keygen -K [-w provider]\n"              "       ssh-keygen -K [-a rounds] [-w provider]\n"
             "       ssh-keygen -R hostname [-f known_hosts_file]\n"              "       ssh-keygen -R hostname [-f known_hosts_file]\n"
             "       ssh-keygen -r hostname [-g] [-f input_keyfile]\n"              "       ssh-keygen -r hostname [-g] [-f input_keyfile]\n"
 #ifdef WITH_OPENSSL  #ifdef WITH_OPENSSL
Line 3042 
Line 3061 
             "                  [-n principals] [-O option] [-V validity_interval]\n"              "                  [-n principals] [-O option] [-V validity_interval]\n"
             "                  [-z serial_number] file ...\n"              "                  [-z serial_number] file ...\n"
             "       ssh-keygen -L [-f input_keyfile]\n"              "       ssh-keygen -L [-f input_keyfile]\n"
             "       ssh-keygen -A [-f prefix_path]\n"              "       ssh-keygen -A [-a rounds] [-f prefix_path]\n"
             "       ssh-keygen -k -f krl_file [-u] [-s ca_public] [-z version_number]\n"              "       ssh-keygen -k -f krl_file [-u] [-s ca_public] [-z version_number]\n"
             "                  file ...\n"              "                  file ...\n"
             "       ssh-keygen -Q [-l] -f krl_file [file ...]\n"              "       ssh-keygen -Q [-l] -f krl_file [file ...]\n"

Legend:
Removed from v.1.413  
changed lines
  Added in v.1.415