X-Git-Url: https://asedeno.scripts.mit.edu/gitweb/?a=blobdiff_plain;f=puttygen.c;h=2d2d93355f625158605943b9810c268b18a6eee1;hb=030c75b7db19c25dd59aa8dc40bc906b737761ec;hp=6116e0f123a1898cb8e70265ab85713971d803b4;hpb=dac0d4569960236264898b112707c2b574eb285b;p=PuTTY.git diff --git a/puttygen.c b/puttygen.c index 6116e0f1..2d2d9335 100644 --- a/puttygen.c +++ b/puttygen.c @@ -501,6 +501,8 @@ static int CALLBACK MainDlgProc(HWND hwnd, UINT msg, IDC_TYPESTATIC, IDC_KEYSSH1, IDC_KEYSSH2RSA, IDC_KEYSSH2DSA, IDC_BITSSTATIC, IDC_BITS, IDC_ABOUT, + IDC_GIVEHELP, + IDC_IMPORT, IDC_EXPORT_OPENSSH, IDC_EXPORT_SSHCOM }; static const int nokey_ids[] = { IDC_NOKEY, 0 }; static const int generating_ids[] = @@ -531,6 +533,40 @@ static int CALLBACK MainDlgProc(HWND hwnd, UINT msg, } requested_help = FALSE; + { + HMENU menu, menu1; + + menu = CreateMenu(); + + menu1 = CreateMenu(); + AppendMenu(menu1, MF_ENABLED, IDC_GENERATE, "&Generate key pair"); + AppendMenu(menu1, MF_ENABLED, IDC_LOAD, "&Load private key"); + AppendMenu(menu1, MF_ENABLED, IDC_SAVEPUB, "Save p&ublic key"); + AppendMenu(menu1, MF_ENABLED, IDC_SAVE, "&Save private key"); + + AppendMenu(menu, MF_POPUP | MF_ENABLED, (UINT) menu1, "&File"); + + menu1 = CreateMenu(); + AppendMenu(menu1, MF_ENABLED, IDC_EXPORT_OPENSSH, + "Export &OpenSSH key"); +#if 0 + AppendMenu(menu1, MF_ENABLED, IDC_EXPORT_SSHCOM, + "Export &ssh.com key"); +#endif + + AppendMenu(menu, MF_POPUP | MF_ENABLED, (UINT) menu1, + "&Export"); + + menu1 = CreateMenu(); + AppendMenu(menu1, MF_ENABLED, IDC_ABOUT, "&About"); + if (help_path) + AppendMenu(menu1, MF_ENABLED, IDC_GIVEHELP, "&Help"); + + AppendMenu(menu, MF_POPUP | MF_ENABLED, (UINT) menu1, "&Help"); + + SetMenu(hwnd, menu); + } + /* * Centre the window. */ @@ -558,8 +594,6 @@ static int CALLBACK MainDlgProc(HWND hwnd, UINT msg, /* Accelerators used: acglops1rbd */ ctlposinit(&cp, hwnd, 4, 4, 4); - bartitle(&cp, "Public and private key generation for PuTTY", - IDC_TITLE); beginbox(&cp, "Key", IDC_BOX_KEY); cp2 = cp; statictext(&cp2, "No key.", 1, IDC_NOKEY); @@ -689,6 +723,16 @@ static int CALLBACK MainDlgProc(HWND hwnd, UINT msg, EnableWindow(hwnd, 1); SetActiveWindow(hwnd); return 0; + case IDC_GIVEHELP: + if (HIWORD(wParam) == BN_CLICKED || + HIWORD(wParam) == BN_DOUBLECLICKED) { + if (help_path) { + WinHelp(hwnd, help_path, HELP_COMMAND, + (DWORD)"JI(`',`puttygen.general')"); + requested_help = TRUE; + } + } + return 0; case IDC_GENERATE: state = (struct MainDlgState *) GetWindowLong(hwnd, GWL_USERDATA); @@ -752,12 +796,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, @@ -792,13 +863,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", @@ -846,26 +926,40 @@ static int CALLBACK MainDlgProc(HWND hwnd, UINT msg, if (prompt_keyfile(hwnd, "Load private key:", filename, 0)) { char passphrase[PASSPHRASE_MAXLEN]; int needs_pass; - int ver; + int type, realtype; int ret; char *comment; struct PassphraseProcStruct pps; struct RSAKey newkey1; struct ssh2_userkey *newkey2 = NULL; - ver = keyfile_version(filename); - if (ver == 0) { - MessageBox(NULL, "Couldn't load private key.", + type = realtype = key_type(filename); + if (type != SSH_KEYTYPE_SSH1 && + type != SSH_KEYTYPE_SSH2 && + !import_possible(type)) { + char msg[256]; + sprintf(msg, "Couldn't load private key (%s)", + key_type_to_str(type)); + MessageBox(NULL, msg, "PuTTYgen Error", MB_OK | MB_ICONERROR); break; } + if (type != SSH_KEYTYPE_SSH1 && + type != SSH_KEYTYPE_SSH2) { + realtype = type; + type = import_target_type(type); + } + comment = NULL; - if (ver == 1) + if (realtype == SSH_KEYTYPE_SSH1) needs_pass = rsakey_encrypted(filename, &comment); - else + else if (realtype == SSH_KEYTYPE_SSH2) needs_pass = ssh2_userkey_encrypted(filename, &comment); + else + needs_pass = import_encrypted(filename, realtype, + &comment); pps.passphrase = passphrase; pps.comment = comment; do { @@ -881,12 +975,20 @@ static int CALLBACK MainDlgProc(HWND hwnd, UINT msg, } } else *passphrase = '\0'; - if (ver == 1) - ret = - loadrsakey(filename, &newkey1, passphrase); - else { - newkey2 = - ssh2_load_userkey(filename, passphrase); + if (type == SSH_KEYTYPE_SSH1) { + if (realtype == type) + ret = loadrsakey(filename, &newkey1, + passphrase); + else + ret = import_ssh1(filename, realtype, + &newkey1, passphrase); + } else { + if (realtype == type) + newkey2 = ssh2_load_userkey(filename, + passphrase); + else + newkey2 = import_ssh2(filename, realtype, + passphrase); if (newkey2 == SSH2_WRONG_PASSPHRASE) ret = -1; else if (!newkey2) @@ -918,7 +1020,7 @@ static int CALLBACK MainDlgProc(HWND hwnd, UINT msg, passphrase); SetDlgItemText(hwnd, IDC_PASSPHRASE2EDIT, passphrase); - if (ver == 1) { + if (type == SSH_KEYTYPE_SSH1) { char buf[128]; char *savecomment;