Add some basic framework code preparatory to adding key export.
authorsimon <simon@cda61777-01e9-0310-a592-d414129be87e>
Mon, 13 May 2002 16:56:11 +0000 (16:56 +0000)
committersimon <simon@cda61777-01e9-0310-a592-d414129be87e>
Mon, 13 May 2002 16:56:11 +0000 (16:56 +0000)
git-svn-id: svn://svn.tartarus.org/sgt/putty@1675 cda61777-01e9-0310-a592-d414129be87e

import.c
puttygen.c
ssh.h

index 930b6c5..47af9b8 100644 (file)
--- a/import.c
+++ b/import.c
@@ -89,6 +89,29 @@ struct ssh2_userkey *import_ssh2(char *filename, int type, char *passphrase)
     return NULL;
 }
 
+/*
+ * Export an SSH1 key.
+ */
+int export_ssh1(char *filename, int type, struct RSAKey *key, char *passphrase)
+{
+    return 0;
+}
+
+/*
+ * Export an SSH2 key.
+ */
+int export_ssh2(char *filename, int type,
+                struct ssh2_userkey *key, char *passphrase)
+{
+#if 0
+    if (type == SSH_KEYTYPE_OPENSSH)
+       return openssh_write(filename, key, passphrase);
+    if (type == SSH_KEYTYPE_SSHCOM)
+       return sshcom_write(filename, key, passphrase);
+#endif
+    return 0;
+}
+
 /* ----------------------------------------------------------------------
  * Helper routines. (The base64 ones are defined in sshpubk.c.)
  */
index e045c33..af2b165 100644 (file)
@@ -800,12 +800,39 @@ static int CALLBACK MainDlgProc(HWND hwnd, UINT msg,
            }
            break;
          case IDC_SAVE:
+          case IDC_EXPORT_OPENSSH:
+          case IDC_EXPORT_SSHCOM:
            state =
                (struct MainDlgState *) GetWindowLong(hwnd, GWL_USERDATA);
            if (state->key_exists) {
                char filename[FILENAME_MAX];
                char passphrase[PASSPHRASE_MAXLEN];
                char passphrase2[PASSPHRASE_MAXLEN];
+                int type, realtype;
+
+                if (state->ssh2)
+                    realtype = SSH_KEYTYPE_SSH2;
+                else
+                    realtype = SSH_KEYTYPE_SSH1;
+
+                if (LOWORD(wParam) == IDC_EXPORT_OPENSSH)
+                    type = SSH_KEYTYPE_OPENSSH;
+                else if (LOWORD(wParam) == IDC_EXPORT_SSHCOM)
+                    type = SSH_KEYTYPE_SSHCOM;
+                else
+                    type = realtype;
+
+                if (type != realtype &&
+                    import_target_type(type) != realtype) {
+                    char msg[256];
+                    sprintf(msg, "Cannot export an SSH%d key in an SSH%d"
+                            " format", (state->ssh2 ? 2 : 1),
+                            (state->ssh2 ? 1 : 2));
+                   MessageBox(hwnd, msg,
+                               "PuTTYgen Error", MB_OK | MB_ICONERROR);
+                   break;
+                }
+
                GetDlgItemText(hwnd, IDC_PASSPHRASE1EDIT,
                               passphrase, sizeof(passphrase));
                GetDlgItemText(hwnd, IDC_PASSPHRASE2EDIT,
@@ -840,13 +867,22 @@ static int CALLBACK MainDlgProc(HWND hwnd, UINT msg,
                        if (ret != IDYES)
                            break;
                    }
+
                    if (state->ssh2) {
-                       ret = ssh2_save_userkey(filename, &state->ssh2key,
-                                               *passphrase ? passphrase :
-                                               NULL);
+                        if (type != realtype)
+                            ret = export_ssh2(filename, type, &state->ssh2key,
+                                              *passphrase ? passphrase : NULL);
+                        else
+                            ret = ssh2_save_userkey(filename, &state->ssh2key,
+                                                    *passphrase ? passphrase :
+                                                    NULL);
                    } else {
-                       ret = saversakey(filename, &state->key,
-                                        *passphrase ? passphrase : NULL);
+                        if (type != realtype)
+                            ret = export_ssh1(filename, type, &state->key,
+                                              *passphrase ? passphrase : NULL);
+                        else
+                            ret = saversakey(filename, &state->key,
+                                             *passphrase ? passphrase : NULL);
                    }
                    if (ret <= 0) {
                        MessageBox(hwnd, "Unable to save key file",
diff --git a/ssh.h b/ssh.h
index 0cbdd47..76954a4 100644 (file)
--- a/ssh.h
+++ b/ssh.h
@@ -311,6 +311,9 @@ int import_target_type(int type);
 int import_encrypted(char *filename, int type, char **comment);
 int import_ssh1(char *filename, int type, struct RSAKey *key,char *passphrase);
 struct ssh2_userkey *import_ssh2(char *filename, int type, char *passphrase);
+int export_ssh1(char *filename, int type, struct RSAKey *key,char *passphrase);
+int export_ssh2(char *filename, int type,
+                struct ssh2_userkey *key, char *passphrase);
 
 void des3_decrypt_pubkey(unsigned char *key, unsigned char *blk, int len);
 void des3_encrypt_pubkey(unsigned char *key, unsigned char *blk, int len);