[Ttssh2-commit] [6983] padding 長の取得関連を修正

Back to archive index

scmno****@osdn***** scmno****@osdn*****
2017年 11月 26日 (日) 00:26:36 JST


Revision: 6983
          http://sourceforge.jp/projects/ttssh2/scm/svn/commits/6983
Author:   doda
Date:     2017-11-26 00:26:35 +0900 (Sun, 26 Nov 2017)
Log Message:
-----------
padding 長の取得関連を修正

SSH2 では PKT_recv()@pkt.c の時点では padding 長のデータが復号されて
いない場合があるため、ここでは padding 長を取得せずに、実際に必要に
なる prep_packet_ssh2()@ssh.c で取得するように変更。

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

-------------- next part --------------
Modified: trunk/ttssh2/ttxssh/pkt.c
===================================================================
--- trunk/ttssh2/ttxssh/pkt.c	2017-11-25 15:26:31 UTC (rev 6982)
+++ trunk/ttssh2/ttxssh/pkt.c	2017-11-25 15:26:35 UTC (rev 6983)
@@ -186,34 +186,24 @@
 
 			/*
 			 * \x92ʏ\xED\x82\xCC MAC \x95\xFB\x8E\xAE (E&M: Encrypt & MAC) \x82ł̓p\x83P\x83b\x83g\x92\xB7\x95\x94\x95\xAA\x82\xE0\x88Í\x86\x89\xBB\x82\xB3\x82\xEA\x82Ă\xA2\x82邽\x82߁A
-			 * \x90擪\x82\xCC 1 \x83u\x83\x8D\x83b\x83N\x82𕜍\x86\x82\xB7\x82\xE9\x81BMAC \x95\x{33AE0AA} EtM (Encrypt then MAC) \x82̎\x9E\x82\xCD
+			 * \x90擪\x82\xCC 1 \x83u\x83\x8D\x83b\x83N\x82𕜍\x86\x82\xB7\x82\xE9\x81BMAC \x95\x{33AE0AA} EtM (Encrypt then MAC) \x82̎\x9E\x81A\x82\xA8\x82\xE6\x82\xD1 SSH1 \x82ł\xCD
 			 * \x83p\x83P\x83b\x83g\x92\xB7\x95\x94\x95\xAA\x82͈Í\x86\x89\xBB\x82\xB3\x82\xEA\x82Ă\xA2\x82Ȃ\xA2\x82̂ŕ\x9C\x8D\x86\x82͕K\x97v\x96\xB3\x82\xA2\x81B
 			 */
-			if (!pvar->pkt_state.predecrypted_packet && !etm) {
+			if (SSHv2(pvar) && !pvar->pkt_state.predecrypted_packet && !etm) {
 				SSH_predecrpyt_packet(pvar, data);
 				pvar->pkt_state.predecrypted_packet = TRUE;
 			}
 
+			// \x83p\x83P\x83b\x83g\x82̐擪\x82\xC9 uint32 (4\x83o\x83C\x83g) \x82̃p\x83P\x83b\x83g\x92\xB7\x82\xAA\x97\x88\x82\xE9
+			pktsize = get_uint32_MSBfirst(data);
+
 			if (SSHv1(pvar)) {
-				uint32 realpktsize = get_uint32_MSBfirst(data);
+				// SSH1 \x82ł̓p\x83P\x83b\x83g\x92\xB7\x82̒l\x82ɂ\xCD padding \x82̒\xB7\x82\xB3\x82\xAA\x8A܂܂\xEA\x82Ă\xA2\x82Ȃ\xA2\x81B
+				// \x82܂\xBD padding \x82̒\xB7\x82\xB3\x82̏\xEE\x95\xF1\x82\xE0\x83p\x83P\x83b\x83g\x8F\xE3\x82ɂ͖\xB3\x82\xA2\x82̂ŁA\x83p\x83P\x83b\x83g\x92\xB7\x82̒l\x82\xA9\x82\xE7\x8Cv\x8EZ\x82\xB7\x82\xE9\x81B
+				padding = 8 - (pktsize % 8);
 
-				padding = 8 - (realpktsize % 8);
-				pktsize = realpktsize + padding;
-			} else {
-				// SSH2 \x82ł̓p\x83P\x83b\x83g\x82̐擪\x82\xC9 uint32 (4\x83o\x83C\x83g) \x82̃p\x83P\x83b\x83g\x92\xB7\x82\xAA\x97\x88\x82\xE9
-				pktsize = get_uint32_MSBfirst(data);
-
-				// \x91\xB1\x82\xAD 1 \x83o\x83C\x83g\x82\xCD padding \x82̒\xB7\x82\xB3
-				if (etm) {
-					// EtM \x82ł\xCD padding length \x88ȍ~\x82͈Í\x86\x89\xBB\x82\xB3\x82\xEA\x82Ă\xA2\x82\xE9\x81B
-					// \x82\xB1\x82̎\x9E\x93_\x82ł͂܂\xBE\x95\x9C\x8D\x86\x82\xB5\x82Ă\xA2\x82Ȃ\xA2\x82̂\xC5 padding length \x82\xAA\x95\xAA\x82\xA9\x82\xE7\x82Ȃ\xA2\x81B
-					// \x89\xBC\x82\xC9 0 \x82\xF0\x93\xFC\x82\xEA\x82Ēu\x82\xAD\x81B
-					padding = 0;
-				}
-				else {
-					// E&M \x82ł͕\x9C\x8D\x86\x8Dς\xDD
-					padding = (unsigned char) data[4];
-				}
+				// \x88ȍ~\x82̏\x88\x97\x9D\x82\xCD pktsize \x82\xC9 padding \x82̒l\x82\xAA\x8A܂܂\xEA\x82Ă\xA2\x82鎖\x82\xAA\x91O\x92\xF1\x82ƂȂ\xC1\x82Ă\xA2\x82\xE9\x81B
+				pktsize += padding;
 			}
 
 			// \x83p\x83P\x83b\x83g(TCP\x83y\x83C\x83\x8D\x81[\x83h)\x82̑S\x91̂̃T\x83C\x83Y\x82́ASSH\x83y\x83C\x83\x8D\x81[\x83h+4\x81i+MAC\x81j\x82ƂȂ\xE9\x81B
@@ -223,11 +213,13 @@
 			if (total_packet_size <= pvar->pkt_state.datalen) {
 				// \x8E\xF3\x90M\x8Dς݃f\x81[\x83^\x82\xAA\x8F\\x95\xAA\x97L\x82\xE9\x8Fꍇ\x82̓p\x83P\x83b\x83g\x82̎\xC0\x8F\x88\x97\x9D\x82\xF0\x8Ds\x82\xA4
 				if (SSHv1(pvar)) {
-					// SSH1 \x82\xCD EtM \x94\xF1\x91Ή\x9E
+					// SSH1 \x82\xCD EtM \x94\xF1\x91Ή\x9E (\x82\xBB\x82\xE0\x82\xBB\x82\xE0 MAC \x82ł͂Ȃ\xAD CRC \x82\xF0\x8Eg\x82\xA4)
 					SSH1_handle_packet(pvar, data, pktsize, padding);
 				}
 				else {
-					SSH2_handle_packet(pvar, data, pktsize, padding, etm);
+					// SSH2 \x82ł͂\xB1\x82̎\x9E\x93_\x82ł\xCD padding \x92\xB7\x95\x94\x95\xAA\x82\xAA\x95\x9C\x8D\x86\x82\xB3\x82\xEA\x82Ă\xA2\x82Ȃ\xA2\x8Fꍇ\x82\xAA\x82\xA0\x82\xE9\x82̂ŁA
+					// padding \x92\xB7\x82͓n\x82\xB3\x82\xB8\x82ɁA\x95K\x97v\x82ɂȂ\xC1\x82\xBD\x8E\x9E\x82ɓ\xE0\x95\x94\x82Ŏ擾\x82\xB7\x82\xE9\x81B
+					SSH2_handle_packet(pvar, data, pktsize, etm);
 				}
 
 				pvar->pkt_state.predecrypted_packet = FALSE;
@@ -234,13 +226,15 @@
 				pvar->pkt_state.datastart += total_packet_size;
 				pvar->pkt_state.datalen -= total_packet_size;
 
-			} else if (total_packet_size > PACKET_MAX_SIZE) {
+			}
+			else if (total_packet_size > PACKET_MAX_SIZE) {
 				// \x83p\x83P\x83b\x83g\x92\xB7\x82\xAA\x91傫\x82\xB7\x82\xAC\x82\xE9\x8Fꍇ\x82ُ͈\xED\x8FI\x97\xB9\x82\xB7\x82\xE9\x81B
 				// \x8E\xC0\x8Dۂɂ͉\xBD\x82炩\x82̗v\x88\xF6\x82ŕ\x9C\x8D\x86\x8E\xB8\x94s\x81˃p\x83P\x83b\x83g\x92\xB7\x95\x94\x95\xAA\x82\xAA\x89\xF3\x82\xEA\x82Ă\xA2\x82鎖\x82\xAA\x91\xBD\x82\xA2\x81B
 				UTIL_get_lang_msg("MSG_PKT_OVERSIZED_ERROR", pvar,
 				                  "Oversized packet received from server; connection will close.");
 				notify_fatal_error(pvar, pvar->ts->UIMsg, TRUE);
-			} else {
+			}
+			else {
 				int amount_read = recv_data(pvar, max(total_packet_size, READAMOUNT));
 
 				if (amount_read == SOCKET_ERROR) {

Modified: trunk/ttssh2/ttxssh/ssh.c
===================================================================
--- trunk/ttssh2/ttxssh/ssh.c	2017-11-25 15:26:31 UTC (rev 6982)
+++ trunk/ttssh2/ttxssh/ssh.c	2017-11-25 15:26:35 UTC (rev 6983)
@@ -784,12 +784,13 @@
  * \x88\xF8\x90\x94:
  *   data - ssh \x83p\x83P\x83b\x83g\x82̐擪\x82\xF0\x8Ew\x82\xB7\x83|\x83C\x83\x93\x83^
  *   len - \x83p\x83P\x83b\x83g\x92\xB7 (\x90擪\x82̃p\x83P\x83b\x83g\x92\xB7\x97̈\xE6(4\x83o\x83C\x83g)\x82\xF0\x8F\x9C\x82\xA2\x82\xBD\x92l)
- *   padding - \x83p\x83f\x83B\x83\x93\x83O\x92\xB7 (EtM\x82̏ꍇ\x82\xCD0\x82ƂȂ\xC1\x82Ă\xA2\x82\xE9\x82̂ŁA\x95\x9C\x8D\x86\x8C\xE3\x82Ɏ擾\x82\xB7\x82\xE9\x95K\x97v\x82\xA0\x82\xE8)
  *   etm - MAC \x95\x{33AE0AA} EtM \x82\xA9\x82ǂ\xA4\x82\xA9\x82̃t\x83\x89\x83O
  */
 
-static int prep_packet_ssh2(PTInstVar pvar, char *data, unsigned int len, unsigned int padding, int etm)
+static int prep_packet_ssh2(PTInstVar pvar, char *data, unsigned int len, int etm)
 {
+	unsigned int padding;
+
 	if (etm) {
 		// EtM \x82̏ꍇ\x82͐\xE6\x82\xC9 MAC \x82̌\x9F\x8F؂\xF0\x8Ds\x82\xA4
 		if (!CRYPT_verify_receiver_MAC(pvar, pvar->ssh_state.receiver_sequence_number, data, len + 4, data + len + 4)) {
@@ -800,9 +801,6 @@
 
 		// \x83p\x83P\x83b\x83g\x92\xB7\x95\x94\x95\xAA(\x90擪4\x83o\x83C\x83g)\x82͈Í\x86\x89\xBB\x82\xB3\x82\xEA\x82Ă\xA2\x82Ȃ\xA2\x82̂ŁA\x82\xBB\x82\xB1\x82\xF0\x83X\x83L\x83b\x83v\x82\xB5\x82ĕ\x9C\x8D\x86\x82\xB7\x82\xE9\x81B
 		CRYPT_decrypt(pvar, data + 4, len);
-
-		// EtM \x82̏ꍇ\x82\xCD \x8CĂяo\x82\xB5\x8C\xB3\x82ł\xCD padding \x95\x94\x95\xAA\x82\xAA\x93ǂ߂Ȃ\xA2\x88ׁA\x82\xB1\x82\xB1\x82Œl\x82\xF0\x8E擾\x82\xB7\x82\xE9\x81B
-		padding = (unsigned int) data[4];
 	}
 	else {
 		// E&M \x82ł͐擪\x95\x94\x95\xAA\x82\xAA\x8E\x96\x91O\x95\x9C\x8D\x86\x82\xB3\x82\xEA\x82Ă\xA2\x82\xE9\x81B
@@ -820,6 +818,9 @@
 		}
 	}
 
+	// \x83p\x83f\x83B\x83\x93\x83O\x92\xB7\x82̎擾
+	padding = (unsigned int) data[4];
+
 	// \x83p\x83P\x83b\x83g\x92\xB7(4\x83o\x83C\x83g) \x95\x94\x95\xAA\x82ƃp\x83f\x83B\x83\x93\x83O\x92\xB7(1\x83o\x83C\x83g)\x95\x94\x95\xAA\x82\xF0\x83X\x83L\x83b\x83v\x82\xB5\x82\xBD SSH \x83y\x83C\x83\x8D\x81[\x83h\x82̐擪
 	pvar->ssh_state.payload = data + 4 + 1;
 
@@ -2114,9 +2115,9 @@
 	}
 }
 
-void SSH2_handle_packet(PTInstVar pvar, char *data, unsigned int len, unsigned int padding, int etm)
+void SSH2_handle_packet(PTInstVar pvar, char *data, unsigned int len, int etm)
 {
-	unsigned char message = prep_packet_ssh2(pvar, data, len, padding, etm);
+	unsigned char message = prep_packet_ssh2(pvar, data, len, etm);
 
 	// SSH\x82̃\x81\x83b\x83Z\x81[\x83W\x83^\x83C\x83v\x82\xF0\x83`\x83F\x83b\x83N
 	if (message != SSH_MSG_NONE) {

Modified: trunk/ttssh2/ttxssh/ssh.h
===================================================================
--- trunk/ttssh2/ttxssh/ssh.h	2017-11-25 15:26:31 UTC (rev 6982)
+++ trunk/ttssh2/ttxssh/ssh.h	2017-11-25 15:26:35 UTC (rev 6983)
@@ -713,7 +713,7 @@
    'data' points to the start of the packet data (the length field)
 */
 void SSH1_handle_packet(PTInstVar pvar, char *data, unsigned int len, unsigned int padding);
-void SSH2_handle_packet(PTInstVar pvar, char *data, unsigned int len, unsigned int padding, int etm);
+void SSH2_handle_packet(PTInstVar pvar, char *data, unsigned int len, int etm);
 void SSH_notify_win_size(PTInstVar pvar, int cols, int rows);
 void SSH_notify_user_name(PTInstVar pvar);
 void SSH_notify_cred(PTInstVar pvar);



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