| 4182 |
|
|
| 4183 |
// bcrypt KDF形式で秘密鍵を保存する |
// bcrypt KDF形式で秘密鍵を保存する |
| 4184 |
// based on OpenSSH 6.5:key_save_private(), key_private_to_blob2() |
// based on OpenSSH 6.5:key_save_private(), key_private_to_blob2() |
| 4185 |
static void save_bcrypt_private_key(char *passphrase, char *filename, char *comment, HWND dlg, PTInstVar pvar) |
static void save_bcrypt_private_key(char *passphrase, char *filename, char *comment, HWND dlg, PTInstVar pvar, int rounds) |
| 4186 |
{ |
{ |
| 4187 |
SSHCipher ciphernameval = SSH_CIPHER_NONE; |
SSHCipher ciphernameval = SSH_CIPHER_NONE; |
| 4188 |
char *ciphername = DEFAULT_CIPHERNAME; |
char *ciphername = DEFAULT_CIPHERNAME; |
|
int rounds = DEFAULT_ROUNDS; |
|
| 4189 |
buffer_t *b = NULL; |
buffer_t *b = NULL; |
| 4190 |
buffer_t *kdf = NULL; |
buffer_t *kdf = NULL; |
| 4191 |
buffer_t *encoded = NULL; |
buffer_t *encoded = NULL; |
| 4370 |
UTIL_get_lang_msg("BTN_CLOSE", pvar, uimsg); |
UTIL_get_lang_msg("BTN_CLOSE", pvar, uimsg); |
| 4371 |
SetDlgItemText(dlg, IDCANCEL, pvar->ts->UIMsg); |
SetDlgItemText(dlg, IDCANCEL, pvar->ts->UIMsg); |
| 4372 |
GetDlgItemText(dlg, IDC_BCRYPT_KDF_CHECK, uimsg, sizeof(uimsg)); |
GetDlgItemText(dlg, IDC_BCRYPT_KDF_CHECK, uimsg, sizeof(uimsg)); |
| 4373 |
UTIL_get_lang_msg("DLG_BCRYPT_KDF", pvar, uimsg); |
UTIL_get_lang_msg("DLG_KEYGEN_BCRYPT_KDF", pvar, uimsg); |
| 4374 |
SetDlgItemText(dlg, IDC_BCRYPT_KDF_CHECK, pvar->ts->UIMsg); |
SetDlgItemText(dlg, IDC_BCRYPT_KDF_CHECK, pvar->ts->UIMsg); |
| 4375 |
|
GetDlgItemText(dlg, IDC_BCRYPT_KDF_ROUNDS_LABEL, uimsg, sizeof(uimsg)); |
| 4376 |
|
UTIL_get_lang_msg("DLG_KEYGEN_BCRYPT_ROUNDS", pvar, uimsg); |
| 4377 |
|
SetDlgItemText(dlg, IDC_BCRYPT_KDF_ROUNDS_LABEL, pvar->ts->UIMsg); |
| 4378 |
|
|
| 4379 |
font = (HFONT)SendMessage(dlg, WM_GETFONT, 0, 0); |
font = (HFONT)SendMessage(dlg, WM_GETFONT, 0, 0); |
| 4380 |
GetObject(font, sizeof(LOGFONT), &logfont); |
GetObject(font, sizeof(LOGFONT), &logfont); |
| 4401 |
SendDlgItemMessage(dlg, IDOK, WM_SETFONT, (WPARAM)DlgKeygenFont, MAKELPARAM(TRUE,0)); |
SendDlgItemMessage(dlg, IDOK, WM_SETFONT, (WPARAM)DlgKeygenFont, MAKELPARAM(TRUE,0)); |
| 4402 |
SendDlgItemMessage(dlg, IDCANCEL, WM_SETFONT, (WPARAM)DlgKeygenFont, MAKELPARAM(TRUE,0)); |
SendDlgItemMessage(dlg, IDCANCEL, WM_SETFONT, (WPARAM)DlgKeygenFont, MAKELPARAM(TRUE,0)); |
| 4403 |
SendDlgItemMessage(dlg, IDC_BCRYPT_KDF_CHECK, WM_SETFONT, (WPARAM)DlgKeygenFont, MAKELPARAM(TRUE,0)); |
SendDlgItemMessage(dlg, IDC_BCRYPT_KDF_CHECK, WM_SETFONT, (WPARAM)DlgKeygenFont, MAKELPARAM(TRUE,0)); |
| 4404 |
|
SendDlgItemMessage(dlg, IDC_BCRYPT_KDF_ROUNDS_LABEL, WM_SETFONT, (WPARAM)DlgKeygenFont, MAKELPARAM(TRUE,0)); |
| 4405 |
|
SendDlgItemMessage(dlg, IDC_BCRYPT_KDF_ROUNDS, WM_SETFONT, (WPARAM)DlgKeygenFont, MAKELPARAM(TRUE,0)); |
| 4406 |
} |
} |
| 4407 |
else { |
else { |
| 4408 |
DlgHostFont = NULL; |
DlgHostFont = NULL; |
| 4433 |
|
|
| 4434 |
// default bcrypt KDF |
// default bcrypt KDF |
| 4435 |
EnableWindow(GetDlgItem(dlg, IDC_BCRYPT_KDF_CHECK), TRUE); |
EnableWindow(GetDlgItem(dlg, IDC_BCRYPT_KDF_CHECK), TRUE); |
| 4436 |
|
EnableWindow(GetDlgItem(dlg, IDC_BCRYPT_KDF_ROUNDS), FALSE); |
| 4437 |
|
SetDlgItemInt(dlg, IDC_BCRYPT_KDF_ROUNDS, DEFAULT_ROUNDS, FALSE); |
| 4438 |
|
SendDlgItemMessage(dlg, IDC_BCRYPT_KDF_ROUNDS, EM_LIMITTEXT, 4, 0); |
| 4439 |
|
|
| 4440 |
} |
} |
| 4441 |
return TRUE; |
return TRUE; |
| 4562 |
} |
} |
| 4563 |
SendMessage(GetDlgItem(dlg, IDC_BCRYPT_KDF_CHECK), BM_SETCHECK, BST_UNCHECKED, 0); |
SendMessage(GetDlgItem(dlg, IDC_BCRYPT_KDF_CHECK), BM_SETCHECK, BST_UNCHECKED, 0); |
| 4564 |
EnableWindow(GetDlgItem(dlg, IDC_BCRYPT_KDF_CHECK), FALSE); |
EnableWindow(GetDlgItem(dlg, IDC_BCRYPT_KDF_CHECK), FALSE); |
| 4565 |
|
EnableWindow(GetDlgItem(dlg, IDC_BCRYPT_KDF_ROUNDS), FALSE); |
| 4566 |
key_type = KEY_RSA1; |
key_type = KEY_RSA1; |
| 4567 |
break; |
break; |
| 4568 |
|
|
| 4572 |
SetDlgItemInt(dlg, IDC_KEYBITS, saved_key_bits, FALSE); |
SetDlgItemInt(dlg, IDC_KEYBITS, saved_key_bits, FALSE); |
| 4573 |
} |
} |
| 4574 |
EnableWindow(GetDlgItem(dlg, IDC_BCRYPT_KDF_CHECK), TRUE); |
EnableWindow(GetDlgItem(dlg, IDC_BCRYPT_KDF_CHECK), TRUE); |
| 4575 |
|
if (SendMessage(GetDlgItem(dlg, IDC_BCRYPT_KDF_CHECK), BM_GETCHECK, 0, 0) == BST_CHECKED) { |
| 4576 |
|
EnableWindow(GetDlgItem(dlg, IDC_BCRYPT_KDF_ROUNDS), TRUE); |
| 4577 |
|
} |
| 4578 |
|
else { |
| 4579 |
|
EnableWindow(GetDlgItem(dlg, IDC_BCRYPT_KDF_ROUNDS), FALSE); |
| 4580 |
|
} |
| 4581 |
key_type = KEY_RSA; |
key_type = KEY_RSA; |
| 4582 |
break; |
break; |
| 4583 |
|
|
| 4587 |
saved_key_bits = GetDlgItemInt(dlg, IDC_KEYBITS, NULL, FALSE); |
saved_key_bits = GetDlgItemInt(dlg, IDC_KEYBITS, NULL, FALSE); |
| 4588 |
} |
} |
| 4589 |
EnableWindow(GetDlgItem(dlg, IDC_BCRYPT_KDF_CHECK), TRUE); |
EnableWindow(GetDlgItem(dlg, IDC_BCRYPT_KDF_CHECK), TRUE); |
| 4590 |
|
if (SendMessage(GetDlgItem(dlg, IDC_BCRYPT_KDF_CHECK), BM_GETCHECK, 0, 0) == BST_CHECKED) { |
| 4591 |
|
EnableWindow(GetDlgItem(dlg, IDC_BCRYPT_KDF_ROUNDS), TRUE); |
| 4592 |
|
} |
| 4593 |
|
else { |
| 4594 |
|
EnableWindow(GetDlgItem(dlg, IDC_BCRYPT_KDF_ROUNDS), FALSE); |
| 4595 |
|
} |
| 4596 |
key_type = KEY_DSA; |
key_type = KEY_DSA; |
| 4597 |
SetDlgItemInt(dlg, IDC_KEYBITS, 1024, FALSE); |
SetDlgItemInt(dlg, IDC_KEYBITS, 1024, FALSE); |
| 4598 |
break; |
break; |
| 4603 |
saved_key_bits = GetDlgItemInt(dlg, IDC_KEYBITS, NULL, FALSE); |
saved_key_bits = GetDlgItemInt(dlg, IDC_KEYBITS, NULL, FALSE); |
| 4604 |
} |
} |
| 4605 |
EnableWindow(GetDlgItem(dlg, IDC_BCRYPT_KDF_CHECK), TRUE); |
EnableWindow(GetDlgItem(dlg, IDC_BCRYPT_KDF_CHECK), TRUE); |
| 4606 |
|
if (SendMessage(GetDlgItem(dlg, IDC_BCRYPT_KDF_CHECK), BM_GETCHECK, 0, 0) == BST_CHECKED) { |
| 4607 |
|
EnableWindow(GetDlgItem(dlg, IDC_BCRYPT_KDF_ROUNDS), TRUE); |
| 4608 |
|
} |
| 4609 |
|
else { |
| 4610 |
|
EnableWindow(GetDlgItem(dlg, IDC_BCRYPT_KDF_ROUNDS), FALSE); |
| 4611 |
|
} |
| 4612 |
key_type = KEY_ECDSA256; |
key_type = KEY_ECDSA256; |
| 4613 |
SetDlgItemInt(dlg, IDC_KEYBITS, 256, FALSE); |
SetDlgItemInt(dlg, IDC_KEYBITS, 256, FALSE); |
| 4614 |
break; |
break; |
| 4619 |
saved_key_bits = GetDlgItemInt(dlg, IDC_KEYBITS, NULL, FALSE); |
saved_key_bits = GetDlgItemInt(dlg, IDC_KEYBITS, NULL, FALSE); |
| 4620 |
} |
} |
| 4621 |
EnableWindow(GetDlgItem(dlg, IDC_BCRYPT_KDF_CHECK), TRUE); |
EnableWindow(GetDlgItem(dlg, IDC_BCRYPT_KDF_CHECK), TRUE); |
| 4622 |
|
if (SendMessage(GetDlgItem(dlg, IDC_BCRYPT_KDF_CHECK), BM_GETCHECK, 0, 0) == BST_CHECKED) { |
| 4623 |
|
EnableWindow(GetDlgItem(dlg, IDC_BCRYPT_KDF_ROUNDS), TRUE); |
| 4624 |
|
} |
| 4625 |
|
else { |
| 4626 |
|
EnableWindow(GetDlgItem(dlg, IDC_BCRYPT_KDF_ROUNDS), FALSE); |
| 4627 |
|
} |
| 4628 |
key_type = KEY_ECDSA384; |
key_type = KEY_ECDSA384; |
| 4629 |
SetDlgItemInt(dlg, IDC_KEYBITS, 384, FALSE); |
SetDlgItemInt(dlg, IDC_KEYBITS, 384, FALSE); |
| 4630 |
break; |
break; |
| 4635 |
saved_key_bits = GetDlgItemInt(dlg, IDC_KEYBITS, NULL, FALSE); |
saved_key_bits = GetDlgItemInt(dlg, IDC_KEYBITS, NULL, FALSE); |
| 4636 |
} |
} |
| 4637 |
EnableWindow(GetDlgItem(dlg, IDC_BCRYPT_KDF_CHECK), TRUE); |
EnableWindow(GetDlgItem(dlg, IDC_BCRYPT_KDF_CHECK), TRUE); |
| 4638 |
|
if (SendMessage(GetDlgItem(dlg, IDC_BCRYPT_KDF_CHECK), BM_GETCHECK, 0, 0) == BST_CHECKED) { |
| 4639 |
|
EnableWindow(GetDlgItem(dlg, IDC_BCRYPT_KDF_ROUNDS), TRUE); |
| 4640 |
|
} |
| 4641 |
|
else { |
| 4642 |
|
EnableWindow(GetDlgItem(dlg, IDC_BCRYPT_KDF_ROUNDS), FALSE); |
| 4643 |
|
} |
| 4644 |
key_type = KEY_ECDSA521; |
key_type = KEY_ECDSA521; |
| 4645 |
SetDlgItemInt(dlg, IDC_KEYBITS, 521, FALSE); |
SetDlgItemInt(dlg, IDC_KEYBITS, 521, FALSE); |
| 4646 |
break; |
break; |
| 4653 |
} |
} |
| 4654 |
SendMessage(GetDlgItem(dlg, IDC_BCRYPT_KDF_CHECK), BM_SETCHECK, BST_CHECKED, 0); |
SendMessage(GetDlgItem(dlg, IDC_BCRYPT_KDF_CHECK), BM_SETCHECK, BST_CHECKED, 0); |
| 4655 |
EnableWindow(GetDlgItem(dlg, IDC_BCRYPT_KDF_CHECK), FALSE); |
EnableWindow(GetDlgItem(dlg, IDC_BCRYPT_KDF_CHECK), FALSE); |
| 4656 |
|
EnableWindow(GetDlgItem(dlg, IDC_BCRYPT_KDF_ROUNDS), TRUE); |
| 4657 |
key_type = KEY_ED25519; |
key_type = KEY_ED25519; |
| 4658 |
SetDlgItemInt(dlg, IDC_KEYBITS, 256, FALSE); |
SetDlgItemInt(dlg, IDC_KEYBITS, 256, FALSE); |
| 4659 |
break; |
break; |
| 4660 |
|
|
| 4661 |
|
case IDC_BCRYPT_KDF_CHECK | (BN_CLICKED << 16): |
| 4662 |
|
if (SendMessage(GetDlgItem(dlg, IDC_BCRYPT_KDF_CHECK), BM_GETCHECK, 0, 0) == BST_CHECKED) { |
| 4663 |
|
EnableWindow(GetDlgItem(dlg, IDC_BCRYPT_KDF_ROUNDS), TRUE); |
| 4664 |
|
} |
| 4665 |
|
else { |
| 4666 |
|
EnableWindow(GetDlgItem(dlg, IDC_BCRYPT_KDF_ROUNDS), FALSE); |
| 4667 |
|
} |
| 4668 |
|
break; |
| 4669 |
|
|
| 4670 |
// saving public key file |
// saving public key file |
| 4671 |
case IDC_SAVE_PUBLIC_KEY: |
case IDC_SAVE_PUBLIC_KEY: |
| 4672 |
{ |
{ |
| 4843 |
case IDC_SAVE_PRIVATE_KEY: |
case IDC_SAVE_PRIVATE_KEY: |
| 4844 |
{ |
{ |
| 4845 |
char buf[1024], buf_conf[1024]; // passphrase |
char buf[1024], buf_conf[1024]; // passphrase |
| 4846 |
int ret; |
int ret, rounds; |
| 4847 |
OPENFILENAME ofn; |
OPENFILENAME ofn; |
| 4848 |
char filename[MAX_PATH]; |
char filename[MAX_PATH]; |
| 4849 |
char comment[1024]; // comment string in private key |
char comment[1024]; // comment string in private key |
| 4873 |
break; |
break; |
| 4874 |
} |
} |
| 4875 |
|
|
| 4876 |
|
// number of rounds |
| 4877 |
|
if (SendMessage(GetDlgItem(dlg, IDC_BCRYPT_KDF_CHECK), BM_GETCHECK, 0, 0) == BST_CHECKED) { |
| 4878 |
|
rounds = GetDlgItemInt(dlg, IDC_BCRYPT_KDF_ROUNDS, NULL, FALSE); |
| 4879 |
|
if (rounds < SSH_KEYGEN_MINIMUM_ROUNDS) { |
| 4880 |
|
UTIL_get_lang_msg("MSG_BCRYPT_ROUNDS_MIN_ERROR", pvar, |
| 4881 |
|
"The number of rounds is too small."); |
| 4882 |
|
MessageBox(dlg, pvar->ts->UIMsg, |
| 4883 |
|
"Tera Term", MB_OK | MB_ICONEXCLAMATION); |
| 4884 |
|
break; |
| 4885 |
|
} |
| 4886 |
|
if (rounds > SSH_KEYGEN_MAXIMUM_ROUNDS) { |
| 4887 |
|
UTIL_get_lang_msg("MSG_BCRYPT_ROUNDS_MAX_ERROR", pvar, |
| 4888 |
|
"The number of rounds is too large."); |
| 4889 |
|
MessageBox(dlg, pvar->ts->UIMsg, |
| 4890 |
|
"Tera Term", MB_OK | MB_ICONEXCLAMATION); |
| 4891 |
|
break; |
| 4892 |
|
} |
| 4893 |
|
} |
| 4894 |
|
|
| 4895 |
ssh_make_comment(comment, sizeof(comment)); |
ssh_make_comment(comment, sizeof(comment)); |
| 4896 |
|
|
| 4897 |
// saving file dialog |
// saving file dialog |
| 5068 |
buffer_free(enc); |
buffer_free(enc); |
| 5069 |
|
|
| 5070 |
} else if (private_key.type == KEY_ED25519) { // SSH2 ED25519 |
} else if (private_key.type == KEY_ED25519) { // SSH2 ED25519 |
| 5071 |
save_bcrypt_private_key(buf, filename, comment, dlg, pvar); |
save_bcrypt_private_key(buf, filename, comment, dlg, pvar, rounds); |
| 5072 |
|
|
| 5073 |
} else { // SSH2 RSA, DSA, ECDSA |
} else { // SSH2 RSA, DSA, ECDSA |
| 5074 |
int len; |
int len; |
| 5076 |
const EVP_CIPHER *cipher; |
const EVP_CIPHER *cipher; |
| 5077 |
|
|
| 5078 |
if (SendMessage(GetDlgItem(dlg, IDC_BCRYPT_KDF_CHECK), BM_GETCHECK, 0, 0) == BST_CHECKED) { |
if (SendMessage(GetDlgItem(dlg, IDC_BCRYPT_KDF_CHECK), BM_GETCHECK, 0, 0) == BST_CHECKED) { |
| 5079 |
save_bcrypt_private_key(buf, filename, comment, dlg, pvar); |
save_bcrypt_private_key(buf, filename, comment, dlg, pvar, rounds); |
| 5080 |
break; |
break; |
| 5081 |
} |
} |
| 5082 |
|
|