diff --git a/pageant.c b/pageant.c index f6383a3c..a97110d0 100644 --- a/pageant.c +++ b/pageant.c @@ -682,18 +682,8 @@ void *pageant_handle_msg(const void *msg, int msglen, int *outlen, p += alglen; key = snew(struct ssh2_userkey); - /* Add further algorithm names here. */ - if (alglen == 7 && !memcmp(alg, "ssh-rsa", 7)) - key->alg = &ssh_rsa; - else if (alglen == 7 && !memcmp(alg, "ssh-dss", 7)) - key->alg = &ssh_dss; - else if (alglen == 19 && memcmp(alg, "ecdsa-sha2-nistp256", 19)) - key->alg = &ssh_ecdsa_nistp256; - else if (alglen == 19 && memcmp(alg, "ecdsa-sha2-nistp384", 19)) - key->alg = &ssh_ecdsa_nistp384; - else if (alglen == 19 && memcmp(alg, "ecdsa-sha2-nistp521", 19)) - key->alg = &ssh_ecdsa_nistp521; - else { + key->alg = find_pubkey_alg_len(alglen, alg); + if (!key->alg) { sfree(key); fail_reason = "algorithm unknown"; goto failure; diff --git a/ssh.h b/ssh.h index 1371828f..d74c278d 100644 --- a/ssh.h +++ b/ssh.h @@ -634,6 +634,7 @@ unsigned char *ssh2_userkey_loadpub(const Filename *filename, char **algorithm, int ssh2_save_userkey(const Filename *filename, struct ssh2_userkey *key, char *passphrase); const struct ssh_signkey *find_pubkey_alg(const char *name); +const struct ssh_signkey *find_pubkey_alg_len(int namelen, const char *name); enum { SSH_KEYTYPE_UNOPENABLE, diff --git a/sshpubk.c b/sshpubk.c index 6af08c75..0748eb67 100644 --- a/sshpubk.c +++ b/sshpubk.c @@ -557,22 +557,27 @@ struct ssh2_userkey ssh2_wrong_passphrase = { NULL, NULL, NULL }; -const struct ssh_signkey *find_pubkey_alg(const char *name) +const struct ssh_signkey *find_pubkey_alg_len(int namelen, const char *name) { - if (!strcmp(name, "ssh-rsa")) + if (match_ssh_id(namelen, name, "ssh-rsa")) return &ssh_rsa; - else if (!strcmp(name, "ssh-dss")) + else if (match_ssh_id(namelen, name, "ssh-dss")) return &ssh_dss; - else if (!strcmp(name, "ecdsa-sha2-nistp256")) + else if (match_ssh_id(namelen, name, "ecdsa-sha2-nistp256")) return &ssh_ecdsa_nistp256; - else if (!strcmp(name, "ecdsa-sha2-nistp384")) + else if (match_ssh_id(namelen, name, "ecdsa-sha2-nistp384")) return &ssh_ecdsa_nistp384; - else if (!strcmp(name, "ecdsa-sha2-nistp521")) + else if (match_ssh_id(namelen, name, "ecdsa-sha2-nistp521")) return &ssh_ecdsa_nistp521; else return NULL; } +const struct ssh_signkey *find_pubkey_alg(const char *name) +{ + return find_pubkey_alg_len(strlen(name), name); +} + struct ssh2_userkey *ssh2_load_userkey(const Filename *filename, char *passphrase, const char **errorstr) {