[Ttssh2-commit] [7010] Kex Reply の handler の共通部分を関数に括りだした

アーカイブの一覧に戻る

scmno****@osdn***** scmno****@osdn*****
2017年 12月 26日 (火) 18:13:33 JST


Revision: 7010
          http://sourceforge.jp/projects/ttssh2/scm/svn/commits/7010
Author:   doda
Date:     2017-12-26 18:13:33 +0900 (Tue, 26 Dec 2017)
Log Message:
-----------
Kex Reply の handler の共通部分を関数に括りだした

KEX 後に必要な共通の処理が各 KEX のハンドラに分散していてメンテナンス
しづらいので、関数にまとめた。

もうちょっとうまくまとまらないだろうか。

Modified Paths:
--------------
    trunk/ttssh2/ttxssh/ssh.c

-------------- next part --------------
Modified: trunk/ttssh2/ttxssh/ssh.c
===================================================================
--- trunk/ttssh2/ttxssh/ssh.c	2017-12-19 11:50:14 UTC (rev 7009)
+++ trunk/ttssh2/ttxssh/ssh.c	2017-12-26 09:13:33 UTC (rev 7010)
@@ -5500,7 +5500,94 @@
 	pvar->ssh2_keys[mode] = current_keys[mode];
 }
 
+static BOOL ssh2_kex_finish(PTInstVar pvar, char *hash, int hashlen, BIGNUM *share_key, Key *hostkey, char *signature, int siglen)
+{
+	int ret;
+	char emsg[1024];  // error message
 
+	//debug_print(30, hash, hashlen);
+	//debug_print(31, pvar->client_version_string, strlen(pvar->client_version_string));
+	//debug_print(32, pvar->server_version_string, strlen(pvar->server_version_string));
+	//debug_print(33, buffer_ptr(pvar->my_kex), buffer_len(pvar->my_kex));
+	//debug_print(34, buffer_ptr(pvar->peer_kex), buffer_len(pvar->peer_kex));
+	//debug_print(35, server_host_key_blob, bloblen);
+
+	// session id\x82̕ۑ\xB6\x81i\x8F\x89\x89\xF1\x90ڑ\xB1\x8E\x9E\x82̂݁j
+	if (pvar->session_id == NULL) {
+		pvar->session_id_len = hashlen;
+		pvar->session_id = malloc(pvar->session_id_len);
+		if (pvar->session_id != NULL) {
+			memcpy(pvar->session_id, hash, pvar->session_id_len);
+		} else {
+			// TODO:
+		}
+	}
+
+	if ((ret = key_verify(hostkey, signature, siglen, hash, hashlen)) != 1) {
+		if (ret == -3 && hostkey->type == KEY_RSA) {
+			if (!pvar->settings.EnableRsaShortKeyServer) {
+				_snprintf_s(emsg, sizeof(emsg), _TRUNCATE, __FUNCTION__
+					": key verify error. remote rsa key length is too short (%d-bit)",
+					BN_num_bits(hostkey->rsa->n));
+			}
+			else {
+				goto cont;
+			}
+		}
+		else {
+			_snprintf_s(emsg, sizeof(emsg), _TRUNCATE, __FUNCTION__ ": key verify error (%d)\r\n%s", ret, SENDTOME);
+		}
+
+		save_memdump(LOGDUMP);
+		notify_fatal_error(pvar, emsg, TRUE);
+		return FALSE;
+	}
+
+cont:
+	kex_derive_keys(pvar, pvar->we_need, hash, share_key, pvar->session_id, pvar->session_id_len);
+
+	// KEX finish
+	begin_send_packet(pvar, SSH2_MSG_NEWKEYS, 0);
+	finish_send_packet(pvar);
+
+	logputs(LOG_LEVEL_VERBOSE, "SSH2_MSG_NEWKEYS was sent at handle_SSH2_dh_kex_reply().");
+
+	// SSH2_MSG_NEWKEYS\x82𑗂\xE8\x8FI\x82\xED\x82\xC1\x82\xBD\x82\xA0\x82ƂɃL\x81[\x82̐ݒ肨\x82\xE6\x82эĐݒ\xE8\x82\xF0\x8Ds\x82\xA4
+	// \x91\x97\x90M\x97p\x82̈Í\x86\x8C\xAE\x82\xCD SSH2_MSG_NEWKEYS \x82̑\x97\x90M\x8C\xE3\x82ɁA\x8E\xF3\x90M\x97p\x82̂\xCD SSH2_MSG_NEWKEYS \x82\xCC
+	// \x8E\xF3\x90M\x8C\xE3\x82ɍĐݒ\xE8\x82\xF0\x8Ds\x82\xA4\x81B
+	if (pvar->rekeying == 1) { // \x83L\x81[\x82̍Đݒ\xE8
+		// \x82܂\xB8\x81A\x91\x97\x90M\x97p\x82\xBE\x82\xAF\x90ݒ肷\x82\xE9\x81B
+		ssh2_set_newkeys(pvar, MODE_OUT);
+		pvar->ssh2_keys[MODE_OUT].mac.enabled = 1;
+		pvar->ssh2_keys[MODE_OUT].comp.enabled = 1;
+		enable_send_compression(pvar);
+		if (!CRYPT_start_encryption(pvar, 1, 0)) {
+			// TODO: error
+		}
+
+	} else {
+		// \x8F\x89\x89\xF1\x90ڑ\xB1\x82̏ꍇ\x82͎\xC0\x8DۂɈÍ\x86\x83\x8B\x81[\x83`\x83\x93\x82\xAA\x90ݒ肳\x82\xEA\x82\xE9\x82̂́A\x82\xA0\x82ƂɂȂ\xC1\x82Ă\xA9\x82\xE7
+		// \x82Ȃ̂ŁiCRYPT_start_encryption\x8A֐\x94\x81j\x81A\x82\xB1\x82\xB1\x82Ō\xAE\x82̐ݒ\xE8\x82\xF0\x82\xB5\x82Ă\xB5\x82܂\xC1\x82Ă\xE0\x82悢\x81B
+		ssh2_set_newkeys(pvar, MODE_OUT);
+
+		// SSH2_MSG_NEWKEYS\x82𑗐M\x82\xB5\x82\xBD\x8E\x9E\x93_\x82ŁAMAC\x82\xF0\x97L\x8C\xF8\x82ɂ\xB7\x82\xE9\x81B(2006.10.30 yutaka)
+		pvar->ssh2_keys[MODE_OUT].mac.enabled = 1;
+		pvar->ssh2_keys[MODE_OUT].comp.enabled = 1;
+
+		// \x83p\x83P\x83b\x83g\x88\xB3\x8Fk\x82\xAA\x97L\x8C\xF8\x82Ȃ珉\x8A\x{227B0B7}\x82\xE9\x81B(2005.7.9 yutaka)
+		// SSH2_MSG_NEWKEYS\x82̎\xF3\x90M\x82\xE6\x82\xE8\x91O\x82Ȃ̂ł\xB1\x82\xB1\x82\xBE\x82\xAF\x82ł悢\x81B(2006.10.30 maya)
+		prep_compression(pvar);
+		enable_compression(pvar);
+	}
+
+	SSH2_dispatch_init(3);
+	SSH2_dispatch_add_message(SSH2_MSG_NEWKEYS);
+	SSH2_dispatch_add_message(SSH2_MSG_IGNORE);
+	SSH2_dispatch_add_message(SSH2_MSG_DEBUG);
+
+	return TRUE;
+}
+
 //
 // Diffie-Hellman Key Exchange Reply(SSH2_MSG_KEXDH_REPLY:31)
 //
@@ -5517,8 +5604,8 @@
 	char *dh_buf = NULL;
 	BIGNUM *share_key = NULL;
 	char *hash;
-	char *emsg, emsg_tmp[1024];  // error message
-	int ret, hashlen;
+	char *emsg = NULL, emsg_tmp[1024];  // error message
+	int hashlen;
 	Key *hostkey;  // hostkey
 	BOOL result = FALSE;
 
@@ -5622,92 +5709,12 @@
 		push_memdump("KEXDH_REPLY kex_dh_kex_hash", "hash", hash, hashlen);
 	}
 
-	//debug_print(30, hash, hashlen);
-	//debug_print(31, pvar->client_version_string, strlen(pvar->client_version_string));
-	//debug_print(32, pvar->server_version_string, strlen(pvar->server_version_string));
-	//debug_print(33, buffer_ptr(pvar->my_kex), buffer_len(pvar->my_kex));
-	//debug_print(34, buffer_ptr(pvar->peer_kex), buffer_len(pvar->peer_kex));
-	//debug_print(35, server_host_key_blob, bloblen);
-
-	// session id\x82̕ۑ\xB6\x81i\x8F\x89\x89\xF1\x90ڑ\xB1\x8E\x9E\x82̂݁j
-	if (pvar->session_id == NULL) {
-		pvar->session_id_len = hashlen;
-		pvar->session_id = malloc(pvar->session_id_len);
-		if (pvar->session_id != NULL) {
-			memcpy(pvar->session_id, hash, pvar->session_id_len);
-		} else {
-			// TODO:
-		}
-	}
-
-	if ((ret = key_verify(hostkey, signature, siglen, hash, hashlen)) != 1) {
-		if (ret == -3 && hostkey->type == KEY_RSA) {
-			if (!pvar->settings.EnableRsaShortKeyServer) {
-				_snprintf_s(emsg_tmp, sizeof(emsg_tmp), _TRUNCATE,
-				            "key verify error(remote rsa key length is too short %d-bit) "
-				            "@ handle_SSH2_dh_kex_reply()", BN_num_bits(hostkey->rsa->n));
-			}
-			else {
-				goto cont;
-			}
-		}
-		else {
-			_snprintf_s(emsg_tmp, sizeof(emsg_tmp), _TRUNCATE,
-			            "key verify error(%d) @ handle_SSH2_dh_kex_reply()\r\n%s", ret, SENDTOME);
-		}
-		emsg = emsg_tmp;
-		save_memdump(LOGDUMP);
-		goto error;
-	}
-
-cont:
-	kex_derive_keys(pvar, pvar->we_need, hash, share_key, pvar->session_id, pvar->session_id_len);
-
-	// KEX finish
-	begin_send_packet(pvar, SSH2_MSG_NEWKEYS, 0);
-	finish_send_packet(pvar);
-
-	logputs(LOG_LEVEL_VERBOSE, "SSH2_MSG_NEWKEYS was sent at handle_SSH2_dh_kex_reply().");
-
-	// SSH2_MSG_NEWKEYS\x82𑗂\xE8\x8FI\x82\xED\x82\xC1\x82\xBD\x82\xA0\x82ƂɃL\x81[\x82̐ݒ肨\x82\xE6\x82эĐݒ\xE8\x82\xF0\x8Ds\x82\xA4
-	// \x91\x97\x90M\x97p\x82̈Í\x86\x8C\xAE\x82\xCD SSH2_MSG_NEWKEYS \x82̑\x97\x90M\x8C\xE3\x82ɁA\x8E\xF3\x90M\x97p\x82̂\xCD SSH2_MSG_NEWKEYS \x82\xCC
-	// \x8E\xF3\x90M\x8C\xE3\x82ɍĐݒ\xE8\x82\xF0\x8Ds\x82\xA4\x81B
-	if (pvar->rekeying == 1) { // \x83L\x81[\x82̍Đݒ\xE8
-		// \x82܂\xB8\x81A\x91\x97\x90M\x97p\x82\xBE\x82\xAF\x90ݒ肷\x82\xE9\x81B
-		ssh2_set_newkeys(pvar, MODE_OUT);
-		pvar->ssh2_keys[MODE_OUT].mac.enabled = 1;
-		pvar->ssh2_keys[MODE_OUT].comp.enabled = 1;
-		enable_send_compression(pvar);
-		if (!CRYPT_start_encryption(pvar, 1, 0)) {
-			// TODO: error
-		}
-
-	} else {
-		// \x8F\x89\x89\xF1\x90ڑ\xB1\x82̏ꍇ\x82͎\xC0\x8DۂɈÍ\x86\x83\x8B\x81[\x83`\x83\x93\x82\xAA\x90ݒ肳\x82\xEA\x82\xE9\x82̂́A\x82\xA0\x82ƂɂȂ\xC1\x82Ă\xA9\x82\xE7
-		// \x82Ȃ̂ŁiCRYPT_start_encryption\x8A֐\x94\x81j\x81A\x82\xB1\x82\xB1\x82Ō\xAE\x82̐ݒ\xE8\x82\xF0\x82\xB5\x82Ă\xB5\x82܂\xC1\x82Ă\xE0\x82悢\x81B
-		ssh2_set_newkeys(pvar, MODE_OUT);
-
-		// SSH2_MSG_NEWKEYS\x82𑗐M\x82\xB5\x82\xBD\x8E\x9E\x93_\x82ŁAMAC\x82\xF0\x97L\x8C\xF8\x82ɂ\xB7\x82\xE9\x81B(2006.10.30 yutaka)
-		pvar->ssh2_keys[MODE_OUT].mac.enabled = 1;
-		pvar->ssh2_keys[MODE_OUT].comp.enabled = 1;
-
-		// \x83p\x83P\x83b\x83g\x88\xB3\x8Fk\x82\xAA\x97L\x8C\xF8\x82Ȃ珉\x8A\x{227B0B7}\x82\xE9\x81B(2005.7.9 yutaka)
-		// SSH2_MSG_NEWKEYS\x82̎\xF3\x90M\x82\xE6\x82\xE8\x91O\x82Ȃ̂ł\xB1\x82\xB1\x82\xBE\x82\xAF\x82ł悢\x81B(2006.10.30 maya)
-		prep_compression(pvar);
-		enable_compression(pvar);
-	}
-
 	// TTSSH\x83o\x81[\x83W\x83\x87\x83\x93\x8F\xEE\x95\xF1\x82ɕ\\x8E\xA6\x82\xB7\x82\xE9\x83L\x81[\x83r\x83b\x83g\x90\x94\x82\xF0\x8B\x81\x82߂Ă\xA8\x82\xAD (2004.10.30 yutaka)
 	pvar->client_key_bits = BN_num_bits(pvar->kexdh->pub_key);
 	pvar->server_key_bits = BN_num_bits(dh_server_pub);
 
-	SSH2_dispatch_init(3);
-	SSH2_dispatch_add_message(SSH2_MSG_NEWKEYS);
-	SSH2_dispatch_add_message(SSH2_MSG_IGNORE); // XXX: Tru64 UNIX workaround   (2005.3.5 yutaka)
-	SSH2_dispatch_add_message(SSH2_MSG_DEBUG);
+	result = ssh2_kex_finish(pvar, hash, hashlen, share_key, hostkey, signature, siglen);
 
-	result = TRUE;
-
 error:
 	BN_free(dh_server_pub);
 	DH_free(pvar->kexdh); pvar->kexdh = NULL;
@@ -5715,7 +5722,7 @@
 	free(dh_buf);
 	BN_free(share_key);
 
-	if (result == FALSE)
+	if (emsg)
 		notify_fatal_error(pvar, emsg, TRUE);
 
 	return result;
@@ -5740,8 +5747,8 @@
 	char *dh_buf = NULL;
 	BIGNUM *share_key = NULL;
 	char *hash;
-	char *emsg, emsg_tmp[1024];  // error message
-	int ret, hashlen;
+	char *emsg = NULL, emsg_tmp[1024];  // error message
+	int hashlen;
 	Key *hostkey = NULL;  // hostkey
 	BOOL result = FALSE;
 
@@ -5854,92 +5861,12 @@
 		push_memdump("DH_GEX_REPLY kex_dh_gex_hash", "hash", hash, hashlen);
 	}
 
-	//debug_print(30, hash, hashlen);
-	//debug_print(31, pvar->client_version_string, strlen(pvar->client_version_string));
-	//debug_print(32, pvar->server_version_string, strlen(pvar->server_version_string));
-	//debug_print(33, buffer_ptr(pvar->my_kex), buffer_len(pvar->my_kex));
-	//debug_print(34, buffer_ptr(pvar->peer_kex), buffer_len(pvar->peer_kex));
-	//debug_print(35, server_host_key_blob, bloblen);
-
-	// session id\x82̕ۑ\xB6\x81i\x8F\x89\x89\xF1\x90ڑ\xB1\x8E\x9E\x82̂݁j
-	if (pvar->session_id == NULL) {
-		pvar->session_id_len = hashlen;
-		pvar->session_id = malloc(pvar->session_id_len);
-		if (pvar->session_id != NULL) {
-			memcpy(pvar->session_id, hash, pvar->session_id_len);
-		} else {
-			// TODO:
-		}
-	}
-
-	if ((ret = key_verify(hostkey, signature, siglen, hash, hashlen)) != 1) {
-		if (ret == -3 && hostkey->type == KEY_RSA) {
-			if (!pvar->settings.EnableRsaShortKeyServer) {
-				_snprintf_s(emsg_tmp, sizeof(emsg_tmp), _TRUNCATE,
-				            "key verify error(remote rsa key length is too short %d-bit) "
-				            "@ handle_SSH2_dh_gex_reply()", BN_num_bits(hostkey->rsa->n));
-			}
-			else {
-				goto cont;
-			}
-		}
-		else {
-			_snprintf_s(emsg_tmp, sizeof(emsg_tmp), _TRUNCATE,
-			            "key verify error(%d) @ handle_SSH2_dh_gex_reply()\r\n%s", ret, SENDTOME);
-		}
-		emsg = emsg_tmp;
-		save_memdump(LOGDUMP);
-		goto error;
-	}
-
-cont:
-	kex_derive_keys(pvar, pvar->we_need, hash, share_key, pvar->session_id, pvar->session_id_len);
-
-	// KEX finish
-	begin_send_packet(pvar, SSH2_MSG_NEWKEYS, 0);
-	finish_send_packet(pvar);
-
-	logputs(LOG_LEVEL_VERBOSE, "SSH2_MSG_NEWKEYS was sent at handle_SSH2_dh_gex_reply().");
-
-	// SSH2_MSG_NEWKEYS\x82𑗂\xE8\x8FI\x82\xED\x82\xC1\x82\xBD\x82\xA0\x82ƂɃL\x81[\x82̐ݒ肨\x82\xE6\x82эĐݒ\xE8\x82\xF0\x8Ds\x82\xA4
-	// \x91\x97\x90M\x97p\x82̈Í\x86\x8C\xAE\x82\xCD SSH2_MSG_NEWKEYS \x82̑\x97\x90M\x8C\xE3\x82ɁA\x8E\xF3\x90M\x97p\x82̂\xCD SSH2_MSG_NEWKEYS \x82\xCC
-	// \x8E\xF3\x90M\x8C\xE3\x82ɍĐݒ\xE8\x82\xF0\x8Ds\x82\xA4\x81B
-	if (pvar->rekeying == 1) { // \x83L\x81[\x82̍Đݒ\xE8
-		// \x82܂\xB8\x81A\x91\x97\x90M\x97p\x82\xBE\x82\xAF\x90ݒ肷\x82\xE9\x81B
-		ssh2_set_newkeys(pvar, MODE_OUT);
-		pvar->ssh2_keys[MODE_OUT].mac.enabled = 1;
-		pvar->ssh2_keys[MODE_OUT].comp.enabled = 1;
-		enable_send_compression(pvar);
-		if (!CRYPT_start_encryption(pvar, 1, 0)) {
-			// TODO: error
-		}
-
-	} else {
-		// \x8F\x89\x89\xF1\x90ڑ\xB1\x82̏ꍇ\x82͎\xC0\x8DۂɈÍ\x86\x83\x8B\x81[\x83`\x83\x93\x82\xAA\x90ݒ肳\x82\xEA\x82\xE9\x82̂́A\x82\xA0\x82ƂɂȂ\xC1\x82Ă\xA9\x82\xE7
-		// \x82Ȃ̂ŁiCRYPT_start_encryption\x8A֐\x94\x81j\x81A\x82\xB1\x82\xB1\x82Ō\xAE\x82̐ݒ\xE8\x82\xF0\x82\xB5\x82Ă\xB5\x82܂\xC1\x82Ă\xE0\x82悢\x81B
-		ssh2_set_newkeys(pvar, MODE_OUT);
-
-		// SSH2_MSG_NEWKEYS\x82𑗐M\x82\xB5\x82\xBD\x8E\x9E\x93_\x82ŁAMAC\x82\xF0\x97L\x8C\xF8\x82ɂ\xB7\x82\xE9\x81B(2006.10.30 yutaka)
-		pvar->ssh2_keys[MODE_OUT].mac.enabled = 1;
-		pvar->ssh2_keys[MODE_OUT].comp.enabled = 1;
-
-		// \x83p\x83P\x83b\x83g\x88\xB3\x8Fk\x82\xAA\x97L\x8C\xF8\x82Ȃ珉\x8A\x{227B0B7}\x82\xE9\x81B(2005.7.9 yutaka)
-		// SSH2_MSG_NEWKEYS\x82̎\xF3\x90M\x82\xE6\x82\xE8\x91O\x82Ȃ̂ł\xB1\x82\xB1\x82\xBE\x82\xAF\x82ł悢\x81B(2006.10.30 maya)
-		prep_compression(pvar);
-		enable_compression(pvar);
-	}
-
 	// TTSSH\x83o\x81[\x83W\x83\x87\x83\x93\x8F\xEE\x95\xF1\x82ɕ\\x8E\xA6\x82\xB7\x82\xE9\x83L\x81[\x83r\x83b\x83g\x90\x94\x82\xF0\x8B\x81\x82߂Ă\xA8\x82\xAD (2004.10.30 yutaka)
 	pvar->client_key_bits = BN_num_bits(pvar->kexdh->pub_key);
 	pvar->server_key_bits = BN_num_bits(dh_server_pub);
 
-	SSH2_dispatch_init(3);
-	SSH2_dispatch_add_message(SSH2_MSG_NEWKEYS);
-	SSH2_dispatch_add_message(SSH2_MSG_IGNORE); // XXX: Tru64 UNIX workaround   (2005.3.5 yutaka)
-	SSH2_dispatch_add_message(SSH2_MSG_DEBUG);
+	result = ssh2_kex_finish(pvar, hash, hashlen, share_key, hostkey, signature, siglen);
 
-	result = TRUE;
-
 error:
 	BN_free(dh_server_pub);
 	DH_free(pvar->kexdh); pvar->kexdh = NULL;
@@ -5947,7 +5874,7 @@
 	free(dh_buf);
 	BN_free(share_key);
 
-	if (result == FALSE)
+	if (emsg)
 		notify_fatal_error(pvar, emsg, TRUE);
 
 	return result;
@@ -5955,7 +5882,7 @@
 
 
 //
-// Elliptic Curv Diffie-Hellman Key Exchange Reply(SSH2_MSG_KEX_ECDH_REPLY:31)
+// Elliptic Curve Diffie-Hellman Key Exchange Reply(SSH2_MSG_KEX_ECDH_REPLY:31)
 //
 static BOOL handle_SSH2_ecdh_kex_reply(PTInstVar pvar)
 {
@@ -5971,8 +5898,8 @@
 	char *ecdh_buf = NULL;
 	BIGNUM *share_key = NULL;
 	char *hash;
-	char *emsg, emsg_tmp[1024];  // error message
-	int ret, hashlen;
+	char *emsg = NULL, emsg_tmp[1024];  // error message
+	int hashlen;
 	Key *hostkey = NULL;  // hostkey
 	BOOL result = FALSE;
 
@@ -6083,81 +6010,6 @@
 		push_memdump("KEX_ECDH_REPLY ecdh_kex_reply", "hash", hash, hashlen);
 	}
 
-	//debug_print(30, hash, hashlen);
-	//debug_print(31, pvar->client_version_string, strlen(pvar->client_version_string));
-	//debug_print(32, pvar->server_version_string, strlen(pvar->server_version_string));
-	//debug_print(33, buffer_ptr(pvar->my_kex), buffer_len(pvar->my_kex));
-	//debug_print(34, buffer_ptr(pvar->peer_kex), buffer_len(pvar->peer_kex));
-	//debug_print(35, server_host_key_blob, bloblen);
-
-	// session id\x82̕ۑ\xB6\x81i\x8F\x89\x89\xF1\x90ڑ\xB1\x8E\x9E\x82̂݁j
-	if (pvar->session_id == NULL) {
-		pvar->session_id_len = hashlen;
-		pvar->session_id = malloc(pvar->session_id_len);
-		if (pvar->session_id != NULL) {
-			memcpy(pvar->session_id, hash, pvar->session_id_len);
-		} else {
-			// TODO:
-		}
-	}
-
-	if ((ret = key_verify(hostkey, signature, siglen, hash, hashlen)) != 1) {
-		if (ret == -3 && hostkey->type == KEY_RSA) {
-			if (!pvar->settings.EnableRsaShortKeyServer) {
-				_snprintf_s(emsg_tmp, sizeof(emsg_tmp), _TRUNCATE,
-				            "key verify error(remote rsa key length is too short %d-bit) "
-				            "@ handle_SSH2_ecdh_kex_reply()", BN_num_bits(hostkey->rsa->n));
-			}
-			else {
-				goto cont;
-			}
-		}
-		else {
-			_snprintf_s(emsg_tmp, sizeof(emsg_tmp), _TRUNCATE,
-			            "key verify error(%d) @ handle_SSH2_ecdh_kex_reply()\r\n%s", ret, SENDTOME);
-		}
-		emsg = emsg_tmp;
-		save_memdump(LOGDUMP);
-		goto error;
-	}
-
-cont:
-	kex_derive_keys(pvar, pvar->we_need, hash, share_key, pvar->session_id, pvar->session_id_len);
-
-	// KEX finish
-	begin_send_packet(pvar, SSH2_MSG_NEWKEYS, 0);
-	finish_send_packet(pvar);
-
-	logputs(LOG_LEVEL_VERBOSE, "SSH2_MSG_NEWKEYS was sent at handle_SSH2_ecdh_kex_reply().");
-
-	// SSH2_MSG_NEWKEYS\x82𑗂\xE8\x8FI\x82\xED\x82\xC1\x82\xBD\x82\xA0\x82ƂɃL\x81[\x82̐ݒ肨\x82\xE6\x82эĐݒ\xE8\x82\xF0\x8Ds\x82\xA4
-	// \x91\x97\x90M\x97p\x82̈Í\x86\x8C\xAE\x82\xCD SSH2_MSG_NEWKEYS \x82̑\x97\x90M\x8C\xE3\x82ɁA\x8E\xF3\x90M\x97p\x82̂\xCD SSH2_MSG_NEWKEYS \x82\xCC
-	// \x8E\xF3\x90M\x8C\xE3\x82ɍĐݒ\xE8\x82\xF0\x8Ds\x82\xA4\x81B
-	if (pvar->rekeying == 1) { // \x83L\x81[\x82̍Đݒ\xE8
-		// \x82܂\xB8\x81A\x91\x97\x90M\x97p\x82\xBE\x82\xAF\x90ݒ肷\x82\xE9\x81B
-		ssh2_set_newkeys(pvar, MODE_OUT);
-		pvar->ssh2_keys[MODE_OUT].mac.enabled = 1;
-		pvar->ssh2_keys[MODE_OUT].comp.enabled = 1;
-		enable_send_compression(pvar);
-		if (!CRYPT_start_encryption(pvar, 1, 0)) {
-			// TODO: error
-		}
-
-	} else {
-		// \x8F\x89\x89\xF1\x90ڑ\xB1\x82̏ꍇ\x82͎\xC0\x8DۂɈÍ\x86\x83\x8B\x81[\x83`\x83\x93\x82\xAA\x90ݒ肳\x82\xEA\x82\xE9\x82̂́A\x82\xA0\x82ƂɂȂ\xC1\x82Ă\xA9\x82\xE7
-		// \x82Ȃ̂ŁiCRYPT_start_encryption\x8A֐\x94\x81j\x81A\x82\xB1\x82\xB1\x82Ō\xAE\x82̐ݒ\xE8\x82\xF0\x82\xB5\x82Ă\xB5\x82܂\xC1\x82Ă\xE0\x82悢\x81B
-		ssh2_set_newkeys(pvar, MODE_OUT);
-
-		// SSH2_MSG_NEWKEYS\x82𑗐M\x82\xB5\x82\xBD\x8E\x9E\x93_\x82ŁAMAC\x82\xF0\x97L\x8C\xF8\x82ɂ\xB7\x82\xE9\x81B(2006.10.30 yutaka)
-		pvar->ssh2_keys[MODE_OUT].mac.enabled = 1;
-		pvar->ssh2_keys[MODE_OUT].comp.enabled = 1;
-
-		// \x83p\x83P\x83b\x83g\x88\xB3\x8Fk\x82\xAA\x97L\x8C\xF8\x82Ȃ珉\x8A\x{227B0B7}\x82\xE9\x81B(2005.7.9 yutaka)
-		// SSH2_MSG_NEWKEYS\x82̎\xF3\x90M\x82\xE6\x82\xE8\x91O\x82Ȃ̂ł\xB1\x82\xB1\x82\xBE\x82\xAF\x82ł悢\x81B(2006.10.30 maya)
-		prep_compression(pvar);
-		enable_compression(pvar);
-	}
-
 	// TTSSH\x83o\x81[\x83W\x83\x87\x83\x93\x8F\xEE\x95\xF1\x82ɕ\\x8E\xA6\x82\xB7\x82\xE9\x83L\x81[\x83r\x83b\x83g\x90\x94\x82\xF0\x8B\x81\x82߂Ă\xA8\x82\xAD
 	switch (pvar->kex_type) {
 		case KEX_ECDH_SHA2_256:
@@ -6177,21 +6029,16 @@
 			break;
 	}
 
-	SSH2_dispatch_init(3);
-	SSH2_dispatch_add_message(SSH2_MSG_NEWKEYS);
-	SSH2_dispatch_add_message(SSH2_MSG_IGNORE); // XXX: Tru64 UNIX workaround   (2005.3.5 yutaka)
-	SSH2_dispatch_add_message(SSH2_MSG_DEBUG);
+	result = ssh2_kex_finish(pvar, hash, hashlen, share_key, hostkey, signature, siglen);
 
-	result = TRUE;
-
 error:
+	EC_POINT_clear_free(server_public);
 	EC_KEY_free(pvar->ecdh_client_key); pvar->ecdh_client_key = NULL;
-	EC_POINT_clear_free(server_public);
 	key_free(hostkey);
 	free(ecdh_buf);
 	BN_free(share_key);
 
-	if (result == FALSE)
+	if (emsg)
 		notify_fatal_error(pvar, emsg, TRUE);
 
 	return result;



Ttssh2-commit メーリングリストの案内
アーカイブの一覧に戻る