]> asedeno.scripts.mit.edu Git - PuTTY.git/commitdiff
Remove the list of key algorithms in pageant.c.
authorSimon Tatham <anakin@pobox.com>
Thu, 7 May 2015 18:57:46 +0000 (19:57 +0100)
committerSimon Tatham <anakin@pobox.com>
Thu, 7 May 2015 18:59:07 +0000 (19:59 +0100)
The only reason those couldn't be replaced with a call to the
centralised find_pubkey_alg is because that function takes a zero-
terminated string and instead we had a (length,pointer) string. Easily
fixed; there's now a find_pubkey_alg_len(), and we call that.

This also fixes a string-matching bug in which the sense of memcmp was
reversed by mistake for ECDSA keys!

pageant.c
ssh.h
sshpubk.c

index f6383a3c9403a1ba3ac08375a81461225d45997b..a97110d09c2990434659128ff36061709e89f2c1 100644 (file)
--- 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 1371828f8982594dcbc043c41034dc12280c4957..d74c278db9c1293ceca71b45005dc5c0261658b5 100644 (file)
--- 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,
index 6af08c75c8312be166fbd051056c74ca4c736cb0..0748eb67252cf687fd0c148e8df23e5a26358b07 100644 (file)
--- 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)
 {