From 4801c01c8e197d334d6d8235d47ef2d7dd451579 Mon Sep 17 00:00:00 2001 From: simon Date: Mon, 13 May 2002 16:56:11 +0000 Subject: [PATCH] Add some basic framework code preparatory to adding key export. git-svn-id: svn://svn.tartarus.org/sgt/putty@1675 cda61777-01e9-0310-a592-d414129be87e --- import.c | 23 +++++++++++++++++++++++ puttygen.c | 46 +++++++++++++++++++++++++++++++++++++++++----- ssh.h | 3 +++ 3 files changed, 67 insertions(+), 5 deletions(-) diff --git a/import.c b/import.c index 930b6c58..47af9b8c 100644 --- 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.) */ diff --git a/puttygen.c b/puttygen.c index e045c335..af2b1658 100644 --- a/puttygen.c +++ b/puttygen.c @@ -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 0cbdd47b..76954a4c 100644 --- 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); -- 2.11.0