]> git.ipfire.org Git - thirdparty/openssh-portable.git/commitdiff
upstream: when downloading FIDO2 resident keys from a token, don't
authordjm@openbsd.org <djm@openbsd.org>
Fri, 13 Mar 2020 03:12:17 +0000 (03:12 +0000)
committerDamien Miller <djm@mindrot.org>
Sat, 14 Mar 2020 08:38:53 +0000 (19:38 +1100)
prompt for a PIN until the token has told us that it needs one. Avoids
double-prompting on devices that implement on-device authentication (e.g. a
touchscreen PIN pad on the Trezor Model T). ok dtucker@

OpenBSD-Commit-ID: 38b78903dd4422d7d3204095a31692fb69130817

ssh-keygen.c

index aa4ec0655938bc4960877d8ea34c7261b6bca6de..cf8e1ba977dc6e5ffa77425512bf9801507e161d 100644 (file)
@@ -1,4 +1,4 @@
-/* $OpenBSD: ssh-keygen.c,v 1.402 2020/03/06 18:29:14 markus Exp $ */
+/* $OpenBSD: ssh-keygen.c,v 1.403 2020/03/13 03:12:17 djm Exp $ */
 /*
  * Author: Tatu Ylonen <ylo@cs.hut.fi>
  * Copyright (c) 1994 Tatu Ylonen <ylo@cs.hut.fi>, Espoo, Finland
@@ -2960,18 +2960,25 @@ do_download_sk(const char *skprovider, const char *device)
        struct sshkey **keys;
        size_t nkeys, i;
        int r, ok = -1;
-       char *fp, *pin, *pass = NULL, *path, *pubpath;
+       char *fp, *pin = NULL, *pass = NULL, *path, *pubpath;
        const char *ext;
 
        if (skprovider == NULL)
                fatal("Cannot download keys without provider");
 
-       pin = read_passphrase("Enter PIN for authenticator: ", RP_ALLOW_STDIN);
-       if ((r = sshsk_load_resident(skprovider, device, pin,
-           &keys, &nkeys)) != 0) {
-               freezero(pin, strlen(pin));
-               error("Unable to load resident keys: %s", ssh_err(r));
-               return -1;
+       for (i = 0; i < 2; i++) {
+               if (i == 1) {
+                       pin = read_passphrase("Enter PIN for authenticator: ",
+                           RP_ALLOW_STDIN);
+               }
+               if ((r = sshsk_load_resident(skprovider, device, pin,
+                   &keys, &nkeys)) != 0) {
+                       if (i == 0 && r == SSH_ERR_KEY_WRONG_PASSPHRASE)
+                               continue;
+                       freezero(pin, strlen(pin));
+                       error("Unable to load resident keys: %s", ssh_err(r));
+                       return -1;
+               }
        }
        if (nkeys == 0)
                logit("No keys to download");