1
0
mirror of https://git.tartarus.org/simon/putty.git synced 2025-07-13 09:07:33 -05:00

Pageant is now able to avoid asking for the passphrase when asked to

load a key that is already loaded. This makes command lines such as
`pageant mykey -c mycommand' almost infinitely more useful.

[originally from svn r1522]
This commit is contained in:
Simon Tatham
2001-12-30 15:58:17 +00:00
parent 320ee10afb
commit cf356a9a5f
6 changed files with 350 additions and 95 deletions

View File

@ -32,7 +32,7 @@
(x)=='+' ? 62 : \
(x)=='/' ? 63 : 0 )
static int loadrsakey_main(FILE * fp, struct RSAKey *key,
static int loadrsakey_main(FILE * fp, struct RSAKey *key, int pub_only,
char **commentptr, char *passphrase)
{
unsigned char buf[16384];
@ -76,6 +76,11 @@ static int loadrsakey_main(FILE * fp, struct RSAKey *key,
if (len - i < 0)
goto end; /* overran */
if (pub_only) {
ret = 1;
goto end;
}
/* Next, the comment field. */
j = GET_32BIT(buf + i);
i += 4;
@ -161,7 +166,7 @@ int loadrsakey(char *filename, struct RSAKey *key, char *passphrase)
* key file.
*/
if (fgets(buf, sizeof(buf), fp) && !strcmp(buf, rsa_signature)) {
return loadrsakey_main(fp, key, NULL, passphrase);
return loadrsakey_main(fp, key, FALSE, NULL, passphrase);
}
/*
@ -189,12 +194,49 @@ int rsakey_encrypted(char *filename, char **comment)
* key file.
*/
if (fgets(buf, sizeof(buf), fp) && !strcmp(buf, rsa_signature)) {
return loadrsakey_main(fp, NULL, comment, NULL);
return loadrsakey_main(fp, NULL, FALSE, comment, NULL);
}
fclose(fp);
return 0; /* wasn't the right kind of file */
}
/*
* Return a malloc'ed chunk of memory containing the public blob of
* an RSA key, as given in the agent protocol (modulus bits,
* exponent, modulus).
*/
int rsakey_pubblob(char *filename, void **blob, int *bloblen)
{
FILE *fp;
unsigned char buf[64];
struct RSAKey key;
int ret;
/* Default return if we fail. */
*blob = NULL;
*bloblen = 0;
ret = 0;
fp = fopen(filename, "rb");
if (!fp)
return 0; /* doesn't even exist */
/*
* Read the first line of the file and see if it's a v1 private
* key file.
*/
if (fgets(buf, sizeof(buf), fp) && !strcmp(buf, rsa_signature)) {
memset(&key, 0, sizeof(key));
if (loadrsakey_main(fp, &key, TRUE, NULL, NULL)) {
*blob = rsa_public_blob(&key, bloblen);
freersakey(&key);
ret = 1;
}
}
fclose(fp);
return ret;
}
/*
* Save an RSA key file. Return nonzero on success.
*/
@ -827,8 +869,10 @@ char *ssh2_userkey_loadpub(char *filename, char **algorithm,
goto error;
fclose(fp);
*pub_blob_len = public_blob_len;
*algorithm = alg->name;
if (pub_blob_len)
*pub_blob_len = public_blob_len;
if (algorithm)
*algorithm = alg->name;
return public_blob;
/*