Implement OpenSSH-compatible RSA key fingerprints and use them throughout
[u/mdw/putty] / pageant.c
index dc8914e..a9af585 100644 (file)
--- a/pageant.c
+++ b/pageant.c
@@ -86,16 +86,25 @@ void logevent(char *msg) {
 
 #define PASSPHRASE_MAXLEN 512
 
+struct PassphraseProcStruct {
+    char *passphrase;
+    char *comment;
+};
+
 /*
  * Dialog-box function for the passphrase box.
  */
 static int CALLBACK PassphraseProc(HWND hwnd, UINT msg,
                                    WPARAM wParam, LPARAM lParam) {
     static char *passphrase;
+    struct PassphraseProcStruct *p;
 
     switch (msg) {
       case WM_INITDIALOG:
-        passphrase = (char *)lParam;
+        p = (struct PassphraseProcStruct *)lParam;
+        passphrase = p->passphrase;
+        if (p->comment)
+            SetDlgItemText(hwnd, 101, p->comment);
         *passphrase = 0;
         return 0;
       case WM_COMMAND:
@@ -134,8 +143,16 @@ void keylist_update(void) {
     if (keylist) {
         SendDlgItemMessage(keylist, 100, LB_RESETCONTENT, 0, 0);
         for (key = first234(rsakeys, &e); key; key = next234(&e)) {
+            char listentry[512], *p;
+            /*
+             * Replace two spaces in the fingerprint with tabs, for
+             * nice alignment in the box.
+             */
+            rsa_fingerprint(listentry, sizeof(listentry), key);
+            p = strchr(listentry, ' '); if (p) *p = '\t';
+            p = strchr(listentry, ' '); if (p) *p = '\t';
             SendDlgItemMessage (keylist, 100, LB_ADDSTRING,
-                                0, (LPARAM) key->comment);
+                                0, (LPARAM)listentry);
         }
         SendDlgItemMessage (keylist, 100, LB_SETCURSEL, (WPARAM) -1, 0);
     }
@@ -150,18 +167,22 @@ void add_keyfile(char *filename) {
     int needs_pass;
     int ret;
     int attempts;
+    char *comment;
+    struct PassphraseProcStruct pps;
 
-    /* FIXME: we can acquire comment here and use it in dialog */
-    needs_pass = rsakey_encrypted(filename, NULL);
+    needs_pass = rsakey_encrypted(filename, &comment);
     attempts = 0;
     key = malloc(sizeof(*key));
+    pps.passphrase = passphrase;
+    pps.comment = comment;
     do {
         if (needs_pass) {
             int dlgret;
             dlgret = DialogBoxParam(instance, MAKEINTRESOURCE(210),
                                     NULL, PassphraseProc,
-                                    (LPARAM)passphrase);
+                                    (LPARAM)&pps);
             if (!dlgret) {
+                if (comment) free(comment);
                 free(key);
                 return;                /* operation cancelled */
             }
@@ -170,6 +191,7 @@ void add_keyfile(char *filename) {
         ret = loadrsakey(filename, key, passphrase);
         attempts++;
     } while (ret == -1);
+    if (comment) free(comment);
     if (ret == 0) {
         MessageBox(NULL, "Couldn't load public key.", APPNAME,
                    MB_OK | MB_ICONERROR);
@@ -313,6 +335,7 @@ void answer_msg(void *msg) {
                 ret[4] = SSH_AGENT_SUCCESS;
             } else {
                 freersakey(key);
+                free(key);
             }
         }
         break;
@@ -334,6 +357,7 @@ void answer_msg(void *msg) {
             if (key) {
                 del234(rsakeys, key);
                 keylist_update();
+                freersakey(key);
                 ret[4] = SSH_AGENT_SUCCESS;
             }
         }
@@ -398,10 +422,13 @@ static int CALLBACK KeyListProc(HWND hwnd, UINT msg,
 
     switch (msg) {
       case WM_INITDIALOG:
-        for (key = first234(rsakeys, &e); key; key = next234(&e)) {
-            SendDlgItemMessage (hwnd, 100, LB_ADDSTRING,
-                                0, (LPARAM) key->comment);
-        }
+        keylist = hwnd;
+       {
+           static int tabs[2] = {25, 175};
+           SendDlgItemMessage (hwnd, 100, LB_SETTABSTOPS, 2,
+                               (LPARAM) tabs);
+       }
+        keylist_update();
         return 0;
       case WM_COMMAND:
        switch (LOWORD(wParam)) {
@@ -448,12 +475,7 @@ static int CALLBACK KeyListProc(HWND hwnd, UINT msg,
                         break;
                 del234(rsakeys, key);
                 freersakey(key); free(key);
-                SendDlgItemMessage(hwnd, 100, LB_RESETCONTENT, 0, 0);
-                for (key = first234(rsakeys, &e); key; key = next234(&e)) {
-                    SendDlgItemMessage (hwnd, 100, LB_ADDSTRING,
-                                        0, (LPARAM) key->comment);
-                }
-               SendDlgItemMessage (hwnd, 100, LB_SETCURSEL, (WPARAM) -1, 0);
+                keylist_update();
             }
             return 0;
        }