Skip to content

Commit

Permalink
upstream: pull passphrase reading and confirmation into a separate
Browse files Browse the repository at this point in the history
function so it can be used for FIDO2 PINs; no functional change

OpenBSD-Commit-ID: bf34f76b8283cc1d3f54633e0d4f13613d87bb2f
  • Loading branch information
djmdjm committed Jul 20, 2022
1 parent eb679e2 commit 5bcfc78
Showing 1 changed file with 37 additions and 28 deletions.
65 changes: 37 additions & 28 deletions ssh-keygen.c
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
/* $OpenBSD: ssh-keygen.c,v 1.454 2022/06/03 03:17:42 dtucker Exp $ */
/* $OpenBSD: ssh-keygen.c,v 1.455 2022/07/20 03:13:04 djm Exp $ */
/*
* Author: Tatu Ylonen <ylo@cs.hut.fi>
* Copyright (c) 1994 Tatu Ylonen <ylo@cs.hut.fi>, Espoo, Finland
Expand Down Expand Up @@ -591,10 +591,13 @@ do_convert_private_ssh2(struct sshbuf *b)
error_f("remaining bytes in key blob %d", rlen);

/* try the key */
if (sshkey_sign(key, &sig, &slen, data, sizeof(data),
NULL, NULL, NULL, 0) != 0 ||
sshkey_verify(key, sig, slen, data, sizeof(data),
NULL, 0, NULL) != 0) {
if ((r = sshkey_sign(key, &sig, &slen, data, sizeof(data),
NULL, NULL, NULL, 0)) != 0)
error_fr(r, "signing with converted key failed");
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);
free(sig);
return NULL;
Expand Down Expand Up @@ -3026,37 +3029,43 @@ do_moduli_screen(const char *out_file, char **opts, size_t nopts)
#endif /* WITH_OPENSSL */
}

/* Read and confirm a passphrase */
static char *
private_key_passphrase(void)
read_check_passphrase(const char *prompt1, const char *prompt2,
const char *retry_prompt)
{
char *passphrase1, *passphrase2;

/* Ask for a passphrase (twice). */
if (identity_passphrase)
passphrase1 = xstrdup(identity_passphrase);
else if (identity_new_passphrase)
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));
for (;;) {
passphrase1 = read_passphrase(prompt1, RP_ALLOW_STDIN);
passphrase2 = read_passphrase(prompt2, RP_ALLOW_STDIN);
if (strcmp(passphrase1, passphrase2) == 0) {
freezero(passphrase2, strlen(passphrase2));
printf("Passphrases do not match. Try again.\n");
goto passphrase_again;
return passphrase1;
}
/* Clear the other copy of the passphrase. */
/* The passphrases do not match. Clear them and retry. */
freezero(passphrase1, strlen(passphrase1));
freezero(passphrase2, strlen(passphrase2));
fputs(retry_prompt, stdout);
fputc('\n', stdout);
fflush(stdout);
}
return passphrase1;
/* NOTREACHED */
return NULL;
}

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 *
Expand Down

0 comments on commit 5bcfc78

Please sign in to comment.