[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.453 and 1.458

version 1.453, 2022/05/31 14:05:12 version 1.458, 2022/08/05 05:01:40
Line 574 
Line 574 
                 error_f("remaining bytes in key blob %d", rlen);                  error_f("remaining bytes in key blob %d", rlen);
   
         /* try the key */          /* try the key */
         if (sshkey_sign(key, &sig, &slen, data, sizeof(data),          if ((r = sshkey_sign(key, &sig, &slen, data, sizeof(data),
             NULL, NULL, NULL, 0) != 0 ||              NULL, NULL, NULL, 0)) != 0)
             sshkey_verify(key, sig, slen, data, sizeof(data),                  error_fr(r, "signing with converted key failed");
             NULL, 0, NULL) != 0) {          else if ((r = sshkey_verify(key, sig, slen, data, sizeof(data),
               NULL, 0, NULL)) != 0)
                   error_fr(r, "verification with converted key failed");
           if (r != 0) {
                 sshkey_free(key);                  sshkey_free(key);
                 free(sig);                  free(sig);
                 return NULL;                  return NULL;
Line 1024 
Line 1027 
         } key_types[] = {          } key_types[] = {
 #ifdef WITH_OPENSSL  #ifdef WITH_OPENSSL
                 { "rsa", "RSA" ,_PATH_HOST_RSA_KEY_FILE },                  { "rsa", "RSA" ,_PATH_HOST_RSA_KEY_FILE },
                 { "dsa", "DSA", _PATH_HOST_DSA_KEY_FILE },  
                 { "ecdsa", "ECDSA",_PATH_HOST_ECDSA_KEY_FILE },                  { "ecdsa", "ECDSA",_PATH_HOST_ECDSA_KEY_FILE },
 #endif /* WITH_OPENSSL */  #endif /* WITH_OPENSSL */
                 { "ed25519", "ED25519",_PATH_HOST_ED25519_KEY_FILE },                  { "ed25519", "ED25519",_PATH_HOST_ED25519_KEY_FILE },
Line 3004 
Line 3006 
 #endif /* WITH_OPENSSL */  #endif /* WITH_OPENSSL */
 }  }
   
   /* Read and confirm a passphrase */
 static char *  static char *
 private_key_passphrase(void)  read_check_passphrase(const char *prompt1, const char *prompt2,
       const char *retry_prompt)
 {  {
         char *passphrase1, *passphrase2;          char *passphrase1, *passphrase2;
   
         /* Ask for a passphrase (twice). */          for (;;) {
         if (identity_passphrase)                  passphrase1 = read_passphrase(prompt1, RP_ALLOW_STDIN);
                 passphrase1 = xstrdup(identity_passphrase);                  passphrase2 = read_passphrase(prompt2, RP_ALLOW_STDIN);
         else if (identity_new_passphrase)                  if (strcmp(passphrase1, passphrase2) == 0) {
                 passphrase1 = xstrdup(identity_new_passphrase);  
         else {  
 passphrase_again:  
                 passphrase1 =  
                         read_passphrase("Enter passphrase (empty for no "  
                             "passphrase): ", RP_ALLOW_STDIN);  
                 passphrase2 = read_passphrase("Enter same passphrase again: ",  
                     RP_ALLOW_STDIN);  
                 if (strcmp(passphrase1, passphrase2) != 0) {  
                         /*  
                          * The passphrases do not match.  Clear them and  
                          * retry.  
                          */  
                         freezero(passphrase1, strlen(passphrase1));  
                         freezero(passphrase2, strlen(passphrase2));                          freezero(passphrase2, strlen(passphrase2));
                         printf("Passphrases do not match.  Try again.\n");                          return passphrase1;
                         goto passphrase_again;  
                 }                  }
                 /* Clear the other copy of the passphrase. */                  /* The passphrases do not match. Clear them and retry. */
                   freezero(passphrase1, strlen(passphrase1));
                 freezero(passphrase2, strlen(passphrase2));                  freezero(passphrase2, strlen(passphrase2));
                   fputs(retry_prompt, stdout);
                   fputc('\n', stdout);
                   fflush(stdout);
         }          }
         return passphrase1;          /* NOTREACHED */
           return NULL;
 }  }
   
 static char *  static char *
   private_key_passphrase(void)
   {
           if (identity_passphrase)
                   return xstrdup(identity_passphrase);
           if (identity_new_passphrase)
                   return xstrdup(identity_new_passphrase);
   
           return read_check_passphrase(
               "Enter passphrase (empty for no passphrase): ",
               "Enter same passphrase again: ",
               "Passphrases do not match.  Try again.");
   }
   
   static char *
 sk_suffix(const char *application, const uint8_t *user, size_t userlen)  sk_suffix(const char *application, const uint8_t *user, size_t userlen)
 {  {
         char *ret, *cp;          char *ret, *cp;
Line 3185 
Line 3193 
                     "%s\n", path);                      "%s\n", path);
 }  }
   
   static int
   confirm_sk_overwrite(const char *application, const char *user)
   {
           char yesno[3];
   
           printf("A resident key scoped to '%s' with user id '%s' already "
               "exists.\n", application == NULL ? "ssh:" : application,
               user == NULL ? "null" : user);
           printf("Overwrite key in token (y/n)? ");
           fflush(stdout);
           if (fgets(yesno, sizeof(yesno), stdin) == NULL)
                   return 0;
           if (yesno[0] != 'y' && yesno[0] != 'Y')
                   return 0;
           return 1;
   }
   
 static void  static void
 usage(void)  usage(void)
 {  {
Line 3240 
Line 3265 
 int  int
 main(int argc, char **argv)  main(int argc, char **argv)
 {  {
         char comment[1024], *passphrase;          char comment[1024], *passphrase = NULL;
         char *rr_hostname = NULL, *ep, *fp, *ra;          char *rr_hostname = NULL, *ep, *fp, *ra;
         struct sshkey *private, *public;          struct sshkey *private, *public;
         struct passwd *pw;          struct passwd *pw;
Line 3748 
Line 3773 
                                     "FIDO authenticator enrollment", opts[i]);                                      "FIDO authenticator enrollment", opts[i]);
                         }                          }
                 }                  }
                 if (!quiet) {  
                         printf("You may need to touch your authenticator "  
                             "to authorize key generation.\n");  
                 }  
                 if ((attest = sshbuf_new()) == NULL)                  if ((attest = sshbuf_new()) == NULL)
                         fatal("sshbuf_new failed");                          fatal("sshbuf_new failed");
                 if ((sk_flags &                  r = 0;
                     (SSH_SK_USER_VERIFICATION_REQD|SSH_SK_RESIDENT_KEY))) {                  for (i = 0 ;;) {
                         passphrase = read_passphrase("Enter PIN for "                          if (!quiet) {
                             "authenticator: ", RP_ALLOW_STDIN);                                  printf("You may need to touch your "
                 } else {                                      "authenticator%s to authorize key "
                         passphrase = NULL;                                      "generation.\n",
                 }                                      r == 0 ? "" : " again");
                 for (i = 0 ; ; i++) {                          }
                         fflush(stdout);                          fflush(stdout);
                         r = sshsk_enroll(type, sk_provider, sk_device,                          r = sshsk_enroll(type, sk_provider, sk_device,
                             sk_application == NULL ? "ssh:" : sk_application,                              sk_application == NULL ? "ssh:" : sk_application,
Line 3769 
Line 3790 
                             &private, attest);                              &private, attest);
                         if (r == 0)                          if (r == 0)
                                 break;                                  break;
                           if (r == SSH_ERR_KEY_BAD_PERMISSIONS &&
                               (sk_flags & SSH_SK_RESIDENT_KEY) != 0 &&
                               (sk_flags & SSH_SK_FORCE_OPERATION) == 0 &&
                               confirm_sk_overwrite(sk_application, sk_user)) {
                                   sk_flags |= SSH_SK_FORCE_OPERATION;
                                   continue;
                           }
                         if (r != SSH_ERR_KEY_WRONG_PASSPHRASE)                          if (r != SSH_ERR_KEY_WRONG_PASSPHRASE)
                                 fatal_r(r, "Key enrollment failed");                                  fatal_r(r, "Key enrollment failed");
                         else if (passphrase != NULL) {                          else if (passphrase != NULL) {
Line 3776 
Line 3804 
                                 freezero(passphrase, strlen(passphrase));                                  freezero(passphrase, strlen(passphrase));
                                 passphrase = NULL;                                  passphrase = NULL;
                         }                          }
                         if (i >= 3)                          if (++i >= 3)
                                 fatal("Too many incorrect PINs");                                  fatal("Too many incorrect PINs");
                         passphrase = read_passphrase("Enter PIN for "                          passphrase = read_passphrase("Enter PIN for "
                             "authenticator: ", RP_ALLOW_STDIN);                              "authenticator: ", RP_ALLOW_STDIN);
                         if (!quiet) {  
                                 printf("You may need to touch your "  
                                     "authenticator (again) to authorize "  
                                     "key generation.\n");  
                         }  
                 }                  }
                 if (passphrase != NULL) {                  if (passphrase != NULL) {
                         freezero(passphrase, strlen(passphrase));                          freezero(passphrase, strlen(passphrase));

Legend:
Removed from v.1.453  
changed lines
  Added in v.1.458