1
0
mirror of https://git.tartarus.org/simon/putty.git synced 2025-01-09 17:38:00 +00:00

Utility functions to get the algorithm from a public key.

Every time I've had to do this before, I've always done the three-line
dance of initialising a BinarySource and calling get_string on it.
It's long past time I wrapped that up into a convenient subroutine.
This commit is contained in:
Simon Tatham 2022-04-21 11:00:16 +01:00
parent e7d51505c7
commit a5c0205b87
5 changed files with 21 additions and 11 deletions

View File

@ -1280,9 +1280,8 @@ int main(int argc, char **argv)
} else {
assert(ssh2blob);
BinarySource src[1];
BinarySource_BARE_INIT_PL(src, ptrlen_from_strbuf(ssh2blob));
ptrlen algname = get_string(src);
ptrlen algname = pubkey_blob_to_alg_name(
ptrlen_from_strbuf(ssh2blob));
const ssh_keyalg *alg = find_pubkey_alg_len(algname);
if (!alg) {
fprintf(stderr, "puttygen: cannot extract key components "

3
ssh.h
View File

@ -1331,6 +1331,9 @@ extern const size_t n_keyalgs;
const ssh_keyalg *find_pubkey_alg(const char *name);
const ssh_keyalg *find_pubkey_alg_len(ptrlen name);
ptrlen pubkey_blob_to_alg_name(ptrlen blob);
const ssh_keyalg *pubkey_blob_to_alg(ptrlen blob);
/* Convenient wrappers on the LoadedFile mechanism suitable for key files */
LoadedFile *lf_load_keyfile(const Filename *filename, const char **errptr);
LoadedFile *lf_load_keyfile_fp(FILE *fp, const char **errptr);

View File

@ -353,10 +353,8 @@ static void ssh2_userauth_process_queue(PacketProtocolLayer *ppl)
/* Also, extract the algorithm string from the start
* of the public-key blob. */
BinarySource src[1];
BinarySource_BARE_INIT_PL(src, ptrlen_from_strbuf(
s->agent_keys[i].blob));
s->agent_keys[i].algorithm = get_string(src);
s->agent_keys[i].algorithm = pubkey_blob_to_alg_name(
ptrlen_from_strbuf(s->agent_keys[i].blob));
}
ppl_logevent("Pageant has %"SIZEu" SSH-2 keys", nkeys);

View File

@ -585,6 +585,18 @@ const ssh_keyalg *find_pubkey_alg(const char *name)
return find_pubkey_alg_len(ptrlen_from_asciz(name));
}
ptrlen pubkey_blob_to_alg_name(ptrlen blob)
{
BinarySource src[1];
BinarySource_BARE_INIT_PL(src, blob);
return get_string(src);
}
const ssh_keyalg *pubkey_blob_to_alg(ptrlen blob)
{
return find_pubkey_alg_len(pubkey_blob_to_alg_name(blob));
}
struct ppk_cipher {
const char *name;
size_t blocklen, keylen, ivlen;

View File

@ -368,10 +368,8 @@ static void keylist_update_callback(
* overflow past the bit-count tab stop and leave out a tab
* character. Urgh.
*/
BinarySource src[1];
BinarySource_BARE_INIT_PL(src, ptrlen_from_strbuf(key->blob));
ptrlen algname = get_string(src);
const ssh_keyalg *alg = find_pubkey_alg_len(algname);
const ssh_keyalg *alg = pubkey_blob_to_alg(
ptrlen_from_strbuf(key->blob));
bool include_bit_count = (alg == &ssh_dsa || alg == &ssh_rsa);