mirror of
https://git.tartarus.org/simon/putty.git
synced 2025-01-10 09:58:01 +00:00
PuTTY can now detect when one of the Pageant keys it tries matches
the private key file given in the config; if it spots this then it avoids trying it again (and in particular avoids needing to ask for the passphrase when it knows perfectly well it won't work). [originally from svn r1523]
This commit is contained in:
parent
cf356a9a5f
commit
2ce502eae2
27
ssh.c
27
ssh.c
@ -1859,6 +1859,8 @@ static int do_ssh1_login(unsigned char *in, int inlen, int ispkt)
|
||||
static unsigned char session_id[16];
|
||||
static int cipher_type;
|
||||
static char username[100];
|
||||
static void *publickey_blob;
|
||||
int publickey_bloblen;
|
||||
|
||||
crBegin;
|
||||
|
||||
@ -2105,6 +2107,12 @@ static int do_ssh1_login(unsigned char *in, int inlen, int ispkt)
|
||||
|
||||
tried_publickey = 0;
|
||||
tis_auth_refused = ccard_auth_refused = 0;
|
||||
/* Load the public half of cfg.keyfile so we notice if it's in Pageant */
|
||||
if (*cfg.keyfile) {
|
||||
if (!rsakey_pubblob(cfg.keyfile, &publickey_blob, &publickey_bloblen))
|
||||
publickey_blob = NULL;
|
||||
} else
|
||||
publickey_blob = NULL;
|
||||
|
||||
while (pktin.type == SSH1_SMSG_FAILURE) {
|
||||
static char password[100];
|
||||
@ -2152,6 +2160,11 @@ static int do_ssh1_login(unsigned char *in, int inlen, int ispkt)
|
||||
sprintf(buf, "Trying Pageant key #%d", i);
|
||||
logevent(buf);
|
||||
}
|
||||
if (publickey_blob &&
|
||||
!memcmp(p, publickey_blob, publickey_bloblen)) {
|
||||
logevent("This key matches configured key file");
|
||||
tried_publickey = 1;
|
||||
}
|
||||
p += 4;
|
||||
p += ssh1_read_bignum(p, &key.exponent);
|
||||
p += ssh1_read_bignum(p, &key.modulus);
|
||||
@ -3751,6 +3764,8 @@ static void do_ssh2_authconn(unsigned char *in, int inlen, int ispkt)
|
||||
static char username[100];
|
||||
static char pwprompt[200];
|
||||
static char password[100];
|
||||
static void *publickey_blob;
|
||||
static int publickey_bloblen;
|
||||
|
||||
crBegin;
|
||||
|
||||
@ -3891,6 +3906,12 @@ static void do_ssh2_authconn(unsigned char *in, int inlen, int ispkt)
|
||||
tried_agent = FALSE;
|
||||
tried_keyb_inter = FALSE;
|
||||
kbd_inter_running = FALSE;
|
||||
/* Load the pub half of cfg.keyfile so we notice if it's in Pageant */
|
||||
if (*cfg.keyfile) {
|
||||
publickey_blob = ssh2_userkey_loadpub(cfg.keyfile, NULL,
|
||||
&publickey_bloblen);
|
||||
} else
|
||||
publickey_blob = NULL;
|
||||
|
||||
while (1) {
|
||||
/*
|
||||
@ -4046,6 +4067,12 @@ static void do_ssh2_authconn(unsigned char *in, int inlen, int ispkt)
|
||||
}
|
||||
pklen = GET_32BIT(p);
|
||||
p += 4;
|
||||
if (publickey_blob &&
|
||||
pklen == publickey_bloblen &&
|
||||
!memcmp(p, publickey_blob, publickey_bloblen)) {
|
||||
logevent("This key matches configured key file");
|
||||
tried_pubkey_config = 1;
|
||||
}
|
||||
pkblob = p;
|
||||
p += pklen;
|
||||
alglen = GET_32BIT(pkblob);
|
||||
|
Loading…
Reference in New Issue
Block a user