/*
* TODO:
- * - have some means of verifying passphrase changes against typos
- * - prompt before overwriting an existing file
* - check the return value from saversakey()
* - test the generated keys for actual working-RSA-key-hood
* - variable key size
IDC_PKSTATIC, IDC_KEYDISPLAY,
IDC_FPSTATIC, IDC_FINGERPRINT,
IDC_COMMENTSTATIC, IDC_COMMENTEDIT,
- IDC_PASSPHRASESTATIC, IDC_PASSPHRASEEDIT,
+ IDC_PASSPHRASE1STATIC, IDC_PASSPHRASE1EDIT,
+ IDC_PASSPHRASE2STATIC, IDC_PASSPHRASE2EDIT,
IDC_BOX_ACTIONS, IDC_BOXT_ACTIONS,
IDC_GENSTATIC, IDC_GENERATE,
IDC_LOADSTATIC, IDC_LOAD,
IDC_PKSTATIC, IDC_KEYDISPLAY,
IDC_FPSTATIC, IDC_FINGERPRINT,
IDC_COMMENTSTATIC, IDC_COMMENTEDIT,
- IDC_PASSPHRASESTATIC, IDC_PASSPHRASEEDIT, 0 };
+ IDC_PASSPHRASE1STATIC, IDC_PASSPHRASE1EDIT,
+ IDC_PASSPHRASE2STATIC, IDC_PASSPHRASE2EDIT, 0 };
static const char generating_msg[] =
"Please wait while a key is generated...";
static const char entropy_msg[] =
{
struct ctlpos cp, cp2;
+ /* Accelerators used: acglops */
+
ctlposinit(&cp, hwnd, 10, 10, 10);
bartitle(&cp, "Public and private key generation for PuTTY",
IDC_TITLE);
SendDlgItemMessage(hwnd, IDC_FINGERPRINT, EM_SETREADONLY, 1, 0);
staticedit(&cp, "Key &comment:", IDC_COMMENTSTATIC,
IDC_COMMENTEDIT, 70);
- staticpassedit(&cp, "Key p&assphrase:", IDC_PASSPHRASESTATIC,
- IDC_PASSPHRASEEDIT, 70);
+ staticpassedit(&cp, "Key p&assphrase:", IDC_PASSPHRASE1STATIC,
+ IDC_PASSPHRASE1EDIT, 70);
+ staticpassedit(&cp, "C&onfirm passphrase:", IDC_PASSPHRASE2STATIC,
+ IDC_PASSPHRASE2EDIT, 70);
endbox(&cp);
beginbox(&cp, "Actions",
IDC_BOX_ACTIONS, IDC_BOXT_ACTIONS);
if (state->key_exists) {
char filename[FILENAME_MAX];
char passphrase[PASSPHRASE_MAXLEN];
- GetDlgItemText(hwnd, IDC_PASSPHRASEEDIT,
- passphrase, sizeof(passphrase)-1);
+ char passphrase2[PASSPHRASE_MAXLEN];
+ GetDlgItemText(hwnd, IDC_PASSPHRASE1EDIT,
+ passphrase, sizeof(passphrase));
+ GetDlgItemText(hwnd, IDC_PASSPHRASE2EDIT,
+ passphrase2, sizeof(passphrase2));
+ if (strcmp(passphrase, passphrase2)) {
+ MessageBox(hwnd,
+ "The two passphrases given do not match.",
+ "PuTTYgen Error",
+ MB_OK | MB_ICONERROR);
+ break;
+ }
if (!*passphrase) {
int ret;
ret = MessageBox(hwnd,
}
if (prompt_keyfile(hwnd, "Save private key as:",
filename, 1)) {
- /* FIXME: prompt before overwriting */
+ FILE *fp = fopen(filename, "r");
+ if (fp) {
+ int ret;
+ char buffer[FILENAME_MAX+80];
+ fclose(fp);
+ sprintf(buffer, "Overwrite existing file\n%.*s?",
+ FILENAME_MAX, filename);
+ ret = MessageBox(hwnd, buffer, "PuTTYgen Warning",
+ MB_YESNO | MB_ICONWARNING);
+ if (ret != IDYES)
+ break;
+ }
saversakey(filename, &state->key, &state->aux,
*passphrase ? passphrase : NULL);
/* FIXME: check return value */
*/
{
char buf[128];
- SetDlgItemText(hwnd, IDC_PASSPHRASEEDIT,
+ SetDlgItemText(hwnd, IDC_PASSPHRASE1EDIT,
+ passphrase);
+ SetDlgItemText(hwnd, IDC_PASSPHRASE2EDIT,
passphrase);
SetDlgItemText(hwnd, IDC_COMMENTEDIT,
state->key.comment);
* because we will warn (Are You Sure?) before allowing
* the user to save an unprotected private key.
*/
- SetDlgItemText(hwnd, IDC_PASSPHRASEEDIT, "");
+ SetDlgItemText(hwnd, IDC_PASSPHRASE1EDIT, "");
+ SetDlgItemText(hwnd, IDC_PASSPHRASE2EDIT, "");
/*
* Set the comment.
*/
}
int WINAPI WinMain(HINSTANCE inst, HINSTANCE prev, LPSTR cmdline, int show) {
+ InitCommonControls();
hinst = inst;
random_init();
return DialogBox(hinst, MAKEINTRESOURCE(201), NULL, MainDlgProc) != IDOK;