mirror of
https://git.tartarus.org/simon/putty.git
synced 2025-07-01 11:32:48 -05:00
Change ssh.h crypto APIs to output to BinarySink.
This affects all the functions that generate public and private key and signature blobs of all kinds, plus ssh_ecdhkex_getpublic. Instead of returning a bare block of memory and taking an extra 'int *length' parameter, all these functions now write to a BinarySink, and it's the caller's job to have prepared an appropriate one where they want the output to go (usually a strbuf). The main value of this change is that those blob-generation functions were chock full of ad-hoc length-counting and data marshalling. You have only to look at rsa2_{public,private}_blob, for example, to see the kind of thing I was keen to get rid of!
This commit is contained in:
@ -556,8 +556,11 @@ struct pageant_pubkey *find_key(const char *string, char **retstr)
|
||||
keytype == SSH_KEYTYPE_SSH1_PUBLIC) {
|
||||
const char *error;
|
||||
|
||||
if (!rsa_ssh1_loadpub(fn, &key_in.blob, &key_in.bloblen,
|
||||
key_in.blob = strbuf_new();
|
||||
if (!rsa_ssh1_loadpub(fn, BinarySink_UPCAST(key_in.blob),
|
||||
NULL, &error)) {
|
||||
strbuf_free(key_in.blob);
|
||||
key_in.blob = NULL;
|
||||
if (file_errors) {
|
||||
*retstr = dupprintf("unable to load file '%s': %s",
|
||||
string, error);
|
||||
@ -573,7 +576,8 @@ struct pageant_pubkey *find_key(const char *string, char **retstr)
|
||||
key_in.ssh_version = 1;
|
||||
key_in.comment = NULL;
|
||||
key_ret = pageant_pubkey_copy(&key_in);
|
||||
sfree(key_in.blob);
|
||||
strbuf_free(key_in.blob);
|
||||
key_in.blob = NULL;
|
||||
filename_free(fn);
|
||||
return key_ret;
|
||||
}
|
||||
@ -582,9 +586,11 @@ struct pageant_pubkey *find_key(const char *string, char **retstr)
|
||||
keytype == SSH_KEYTYPE_SSH2_PUBLIC_OPENSSH) {
|
||||
const char *error;
|
||||
|
||||
if ((key_in.blob = ssh2_userkey_loadpub(fn, NULL,
|
||||
&key_in.bloblen,
|
||||
NULL, &error)) == NULL) {
|
||||
key_in.blob = strbuf_new();
|
||||
if (!ssh2_userkey_loadpub(fn, NULL, BinarySink_UPCAST(key_in.blob),
|
||||
NULL, &error)) {
|
||||
strbuf_free(key_in.blob);
|
||||
key_in.blob = NULL;
|
||||
if (file_errors) {
|
||||
*retstr = dupprintf("unable to load file '%s': %s",
|
||||
string, error);
|
||||
@ -600,7 +606,8 @@ struct pageant_pubkey *find_key(const char *string, char **retstr)
|
||||
key_in.ssh_version = 2;
|
||||
key_in.comment = NULL;
|
||||
key_ret = pageant_pubkey_copy(&key_in);
|
||||
sfree(key_in.blob);
|
||||
strbuf_free(key_in.blob);
|
||||
key_in.blob = NULL;
|
||||
filename_free(fn);
|
||||
return key_ret;
|
||||
}
|
||||
@ -696,12 +703,14 @@ void run_client(void)
|
||||
struct RSAKey rkey;
|
||||
memset(&rkey, 0, sizeof(rkey));
|
||||
rkey.comment = dupstr(key->comment);
|
||||
rsa_ssh1_readpub(key->blob, key->bloblen, &rkey, NULL,
|
||||
rsa_ssh1_readpub(key->blob->u, key->blob->len, &rkey, NULL,
|
||||
RSA_SSH1_EXPONENT_FIRST);
|
||||
ssh1_write_pubkey(fp, &rkey);
|
||||
freersakey(&rkey);
|
||||
} else {
|
||||
ssh2_write_pubkey(fp, key->comment, key->blob,key->bloblen,
|
||||
ssh2_write_pubkey(fp, key->comment,
|
||||
key->blob->u,
|
||||
key->blob->len,
|
||||
(act->action == KEYACT_CLIENT_PUBLIC ?
|
||||
SSH_KEYTYPE_SSH2_PUBLIC_RFC4716 :
|
||||
SSH_KEYTYPE_SSH2_PUBLIC_OPENSSH));
|
||||
|
Reference in New Issue
Block a user