svnno****@sourc*****
svnno****@sourc*****
2014年 3月 10日 (月) 22:32:05 JST
Revision: 5519 http://sourceforge.jp/projects/ttssh2/scm/svn/commits/5519 Author: yutakapon Date: 2014-03-10 22:32:05 +0900 (Mon, 10 Mar 2014) Log Message: ----------- 秘密鍵のファイルへの保存に対応した。 Modified Paths: -------------- branches/ssh_ed25519/ttssh2/ttxssh/key.c branches/ssh_ed25519/ttssh2/ttxssh/key.h branches/ssh_ed25519/ttssh2/ttxssh/ttxssh.c -------------- next part -------------- Modified: branches/ssh_ed25519/ttssh2/ttxssh/key.c =================================================================== --- branches/ssh_ed25519/ttssh2/ttxssh/key.c 2014-03-10 13:12:40 UTC (rev 5518) +++ branches/ssh_ed25519/ttssh2/ttxssh/key.c 2014-03-10 13:32:05 UTC (rev 5519) @@ -1245,21 +1245,21 @@ return KEY_UNSPEC; } -void key_private_serialize(Key *key, buffer_t *b) -{ - char *s; - - s = get_sshname_from_key(key); - buffer_put_cstring(b, s); - - switch (key->type) { - case KEY_ED25519: - buffer_put_string(b, key->ed25519_pk, ED25519_PK_SZ); - buffer_put_string(b, key->ed25519_sk, ED25519_SK_SZ); - break; - - default: - // TODO: ED25519 \x88ȊO\x82͖\xA2\x83T\x83|\x81[\x83g\x81B - break; - } -} +void key_private_serialize(Key *key, buffer_t *b) +{ + char *s; + + s = get_sshname_from_key(key); + buffer_put_cstring(b, s); + + switch (key->type) { + case KEY_ED25519: + buffer_put_string(b, key->ed25519_pk, ED25519_PK_SZ); + buffer_put_string(b, key->ed25519_sk, ED25519_SK_SZ); + break; + + default: + // TODO: ED25519 \x88ȊO\x82͖\xA2\x83T\x83|\x81[\x83g\x81B + break; + } +} Modified: branches/ssh_ed25519/ttssh2/ttxssh/key.h =================================================================== --- branches/ssh_ed25519/ttssh2/ttxssh/key.h 2014-03-10 13:12:40 UTC (rev 5518) +++ branches/ssh_ed25519/ttssh2/ttxssh/key.h 2014-03-10 13:32:05 UTC (rev 5519) @@ -60,6 +60,6 @@ int keytype_to_cipher_nid(ssh_keytype type); ssh_keytype nid_to_keytype(int nid); -void key_private_serialize(Key *key, buffer_t *b); - -#endif +void key_private_serialize(Key *key, buffer_t *b); + +#endif Modified: branches/ssh_ed25519/ttssh2/ttxssh/ttxssh.c =================================================================== --- branches/ssh_ed25519/ttssh2/ttxssh/ttxssh.c 2014-03-10 13:12:40 UTC (rev 5518) +++ branches/ssh_ed25519/ttssh2/ttxssh/ttxssh.c 2014-03-10 13:32:05 UTC (rev 5519) @@ -4089,7 +4089,7 @@ // ED25519 \x94閧\x8C\xAE\x82\xF0\x95ۑ\xB6\x82\xB7\x82\xE9 // based on OpenSSH 6.5:key_save_private(), key_private_to_blob2() -static void save_ed25519_private_key(char *passphrase, char *filename, char *comment) +static void save_ed25519_private_key(char *passphrase, char *filename, char *comment, HWND dlg, PTInstVar pvar) { SSHCipher ciphernameval = SSH2_CIPHER_AES256_CBC; char *ciphername = DEFAULT_CIPHERNAME; @@ -4097,18 +4097,22 @@ buffer_t *b = NULL; buffer_t *kdf = NULL; buffer_t *encoded = NULL; - int blocksize, keylen, ivlen, authlen, i; + buffer_t *blob = NULL; + int blocksize, keylen, ivlen, authlen, i, n; unsigned char *key = NULL, salt[SALT_LEN]; char *kdfname = KDFNAME; EVP_CIPHER_CTX cipher_ctx; Key keyblob; unsigned char *cp = NULL; unsigned int len, check; + FILE *fp; + char uimsg[MAX_UIMSG]; b = buffer_init(); kdf = buffer_init(); encoded = buffer_init(); - if (b == NULL || kdf == NULL || encoded == NULL) + blob = buffer_init(); + if (b == NULL || kdf == NULL || encoded == NULL || blob == NULL) goto ed25519_error; blocksize = get_cipher_block_size(ciphernameval); @@ -4149,26 +4153,26 @@ memset(cp, 0, len); free(cp); - /* Random check bytes */ - check = arc4random(); - buffer_put_int(b, check); - buffer_put_int(b, check); - - /* append private key and comment*/ - key_private_serialize(&keyblob, b); - buffer_put_cstring(b, comment); - - /* padding */ - i = 0; - while (buffer_len(b) % blocksize) - buffer_put_char(b, ++i & 0xff); - - /* length */ - buffer_put_int(encoded, buffer_len(b)); + /* Random check bytes */ + check = arc4random(); + buffer_put_int(b, check); + buffer_put_int(b, check); - /* encrypt */ - buffer_append_space(encoded, buffer_len(b) + authlen); - cp = buffer_ptr(encoded); + /* append private key and comment*/ + key_private_serialize(&keyblob, b); + buffer_put_cstring(b, comment); + + /* padding */ + i = 0; + while (buffer_len(b) % blocksize) + buffer_put_char(b, ++i & 0xff); + + /* length */ + buffer_put_int(encoded, buffer_len(b)); + + /* encrypt */ + buffer_append_space(encoded, buffer_len(b) + authlen); + cp = buffer_ptr(encoded); if (EVP_Cipher(&cipher_ctx, cp, buffer_ptr(b), buffer_len(b)) == 0) { //strncpy_s(errmsg, errmsg_len, "Key decrypt error", _TRUNCATE); //free(decrypted); @@ -4176,10 +4180,54 @@ } cipher_cleanup_SSH2(&cipher_ctx); + len = 2 * buffer_len(encoded); + cp = malloc(len); + n = uuencode(buffer_ptr(encoded), buffer_len(encoded), (char *)cp, len); + if (n < 0) { + free(cp); + goto ed25519_error; + } + + buffer_clear(blob); + buffer_append(blob, MARK_BEGIN, sizeof(MARK_BEGIN) - 1); + for (i = 0; i < n; i++) { + buffer_put_char(blob, cp[i]); + if (i % 70 == 69) + buffer_put_char(blob, '\n'); + } + if (i % 70 != 69) + buffer_put_char(blob, '\n'); + buffer_append(blob, MARK_END, sizeof(MARK_END) - 1); + free(cp); + + len = buffer_len(blob); + + // \x94閧\x8C\xAE\x82\xF0\x83t\x83@\x83C\x83\x8B\x82ɕۑ\xB6\x82\xB7\x82\xE9\x81B + fp = fopen(filename, "w"); + if (fp == NULL) { + UTIL_get_lang_msg("MSG_SAVE_KEY_OPENFILE_ERROR", pvar, + "Can't open key file"); + strncpy_s(uimsg, sizeof(uimsg), pvar->ts->UIMsg, _TRUNCATE); + UTIL_get_lang_msg("MSG_ERROR", pvar, "ERROR"); + MessageBox(dlg, uimsg, pvar->ts->UIMsg, MB_OK | MB_ICONEXCLAMATION); + goto ed25519_error; + } + n = fwrite(buffer_ptr(blob), buffer_len(blob), 1, fp); + if (n != 1) { + UTIL_get_lang_msg("MSG_SAVE_KEY_WRITEFILE_ERROR", pvar, + "Can't open key file"); + strncpy_s(uimsg, sizeof(uimsg), pvar->ts->UIMsg, _TRUNCATE); + UTIL_get_lang_msg("MSG_ERROR", pvar, "ERROR"); + MessageBox(dlg, uimsg, pvar->ts->UIMsg, MB_OK | MB_ICONEXCLAMATION); + } + fclose(fp); + + ed25519_error: buffer_free(b); buffer_free(kdf); buffer_free(encoded); + buffer_free(blob); } static BOOL CALLBACK TTXKeyGenerator(HWND dlg, UINT msg, WPARAM wParam, @@ -4685,6 +4733,15 @@ ofn.lpstrFilter = uimsg; strncpy_s(filename, sizeof(filename), "id_ecdsa", _TRUNCATE); break; + case KEY_ED25519: + UTIL_get_lang_msg("FILEDLG_SAVE_PRIVATEKEY_ED25519_FILTER", pvar, + "SSH2 ED25519 key(id_ed25519)\\0id_ed25519\\0All Files(*.*)\\0*.*\\0\\0"); + memcpy(uimsg, pvar->ts->UIMsg, sizeof(uimsg)); + ofn.lpstrFilter = uimsg; + strncpy_s(filename, sizeof(filename), "id_ed25519", _TRUNCATE); + break; + default: + break; } ofn.lpstrFile = filename; ofn.nMaxFile = sizeof(filename); @@ -4815,7 +4872,7 @@ buffer_free(enc); } else if (private_key.type == KEY_ED25519) { // SSH2 ED25519 - save_ed25519_private_key(buf, filename, comment); + save_ed25519_private_key(buf, filename, comment, dlg, pvar); } else { // SSH2 RSA, DSA, ECDSA int len;