Reasonably thorough test suite for command-line PuTTYgen, and
[u/mdw/putty] / sshpubk.c
index 78a35ee..26baa43 100644 (file)
--- a/sshpubk.c
+++ b/sshpubk.c
@@ -182,17 +182,22 @@ int loadrsakey(const Filename *filename, struct RSAKey *key, char *passphrase,
      * key file.
      */
     if (fgets(buf, sizeof(buf), fp) && !strcmp(buf, rsa_signature)) {
+       /*
+        * This routine will take care of calling fclose() for us.
+        */
        ret = loadrsakey_main(fp, key, FALSE, NULL, passphrase, &error);
+       fp = NULL;
        goto end;
     }
 
     /*
      * Otherwise, we have nothing. Return empty-handed.
      */
-    fclose(fp);
     error = "not an SSH-1 RSA file";
 
   end:
+    if (fp)
+       fclose(fp);
     if ((ret != 1) && errorstr)
        *errorstr = error;
     return ret;
@@ -217,6 +222,9 @@ int rsakey_encrypted(const Filename *filename, char **comment)
      */
     if (fgets(buf, sizeof(buf), fp) && !strcmp(buf, rsa_signature)) {
        const char *dummy;
+       /*
+        * This routine will take care of calling fclose() for us.
+        */
        return loadrsakey_main(fp, NULL, FALSE, comment, NULL, &dummy);
     }
     fclose(fp);
@@ -258,13 +266,15 @@ int rsakey_pubblob(const Filename *filename, void **blob, int *bloblen,
            *blob = rsa_public_blob(&key, bloblen);
            freersakey(&key);
            ret = 1;
+           fp = NULL;
        }
     } else {
        error = "not an SSH-1 RSA file";
-        fclose(fp);
     }
 
   end:
+    if (fp)
+       fclose(fp);
     if ((ret != 1) && errorstr)
        *errorstr = error;
     return ret;
@@ -605,6 +615,16 @@ struct ssh2_userkey ssh2_wrong_passphrase = {
     NULL, NULL, NULL
 };
 
+const struct ssh_signkey *find_pubkey_alg(const char *name)
+{
+    if (!strcmp(name, "ssh-rsa"))
+       return &ssh_rsa;
+    else if (!strcmp(name, "ssh-dss"))
+       return &ssh_dss;
+    else
+       return NULL;
+}
+
 struct ssh2_userkey *ssh2_load_userkey(const Filename *filename,
                                       char *passphrase, const char **errorstr)
 {
@@ -646,11 +666,8 @@ struct ssh2_userkey *ssh2_load_userkey(const Filename *filename,
     if ((b = read_body(fp)) == NULL)
        goto error;
     /* Select key algorithm structure. */
-    if (!strcmp(b, "ssh-rsa"))
-       alg = &ssh_rsa;
-    else if (!strcmp(b, "ssh-dss"))
-       alg = &ssh_dss;
-    else {
+    alg = find_pubkey_alg(b);
+    if (!alg) {
        sfree(b);
        goto error;
     }
@@ -807,6 +824,7 @@ struct ssh2_userkey *ssh2_load_userkey(const Filename *filename,
            /* An incorrect MAC is an unconditional Error if the key is
             * unencrypted. Otherwise, it means Wrong Passphrase. */
            if (cipher) {
+               error = "wrong passphrase";
                ret = SSH2_WRONG_PASSPHRASE;
            } else {
                error = "MAC failed";
@@ -835,7 +853,8 @@ struct ssh2_userkey *ssh2_load_userkey(const Filename *filename,
     sfree(public_blob);
     sfree(private_blob);
     sfree(encryption);
-    *errorstr = NULL;
+    if (errorstr)
+       *errorstr = NULL;
     return ret;
 
     /*
@@ -889,11 +908,8 @@ char *ssh2_userkey_loadpub(const Filename *filename, char **algorithm,
     if ((b = read_body(fp)) == NULL)
        goto error;
     /* Select key algorithm structure. Currently only ssh-rsa. */
-    if (!strcmp(b, "ssh-rsa"))
-       alg = &ssh_rsa;
-    else if (!strcmp(b, "ssh-dss"))
-       alg = &ssh_dss;
-    else {
+    alg = find_pubkey_alg(b);
+    if (!alg) {
        sfree(b);
        goto error;
     }