[Ttssh2-commit] [5519] 秘密鍵のファイルへの保存に対応した。

Back to archive index

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;



Ttssh2-commit メーリングリストの案内
Back to archive index