Develop and Download Open Source Software

Browse Subversion Repository

Diff of /branches/ssh_chacha20poly1305/ttssh2/ttxssh/ssh.c

Parent Directory Parent Directory | Revision Log Revision Log | View Patch Patch

revision 7020 by doda, Thu Jan 11 13:20:04 2018 UTC revision 7021 by doda, Thu Jan 11 13:20:07 2018 UTC
# Line 4826  static void choose_SSH2_key_maxlength(PT Line 4826  static void choose_SSH2_key_maxlength(PT
4826  }  }
4827    
4828    
4829  // キー交換開始前のチェック (SSH2_MSG_KEXINIT)  /*
4830  // ※当該関数はデータ通信中にも呼ばれてくる可能性あり   * キー交換開始前のチェック (SSH2_MSG_KEXINIT)
4831     * ※当該関数はデータ通信中にも呼ばれてくる可能性あり
4832     *
4833     * SSH2_MSG_KEXINIT:
4834     *   byte         SSH_MSG_KEXINIT
4835     *   byte[16]     cookie (random bytes)
4836     *   name-list    kex_algorithms
4837     *   name-list    server_host_key_algorithms
4838     *   name-list    encryption_algorithms (c2s)
4839     *   name-list    encryption_algorithms (s2c)
4840     *   name-list    mac_algorithms (c2s)
4841     *   name-list    mac_algorithms (s2c)
4842     *   name-list    compression_algorithms (c2s)
4843     *   name-list    compression_algorithms (s2c)
4844     *   name-list    languages (c2s)
4845     *   name-list    languages (s2c)
4846     *   boolean      first_kex_packet_follows
4847     *   uint32       0 (reserved for future extension)
4848     */
4849  static BOOL handle_SSH2_kexinit(PTInstVar pvar)  static BOOL handle_SSH2_kexinit(PTInstVar pvar)
4850  {  {
4851          char buf[1024];          char buf[1024];
# Line 5094  static BOOL handle_SSH2_kexinit(PTInstVa Line 5112  static BOOL handle_SSH2_kexinit(PTInstVa
5112                  goto error;                  goto error;
5113          }          }
5114    
5115            // 言語(クライアント -> サーバ)
5116            // 現状では未使用。ログに記録するだけ。
5117            if (!grab_payload(pvar, 4)
5118             || !grab_payload(pvar, size = get_uint32(data))) {
5119                    // 言語の name-list が取れないという事は KEXINIT パケットのフォーマット自体が想定外であり
5120                    // 異常な状態であるが、通信に必要なアルゴリズムはすでにネゴ済みで通信自体は行える。
5121                    // 今まではこの部分のチェックを行っていなかったので、警告を記録するのみで処理を続行する。
5122                    logputs(LOG_LEVEL_WARNING, __FUNCTION__ ": truncated packet (language client to server)");
5123                    goto skip;
5124            }
5125            data += 4;
5126    
5127            if (size >= sizeof(buf)) {
5128                    logputs(LOG_LEVEL_WARNING, __FUNCTION__ ": server proposed language (client to server) is too long.");
5129            }
5130            strncpy_s(buf, sizeof(buf), data, _TRUNCATE);
5131            data += size;
5132    
5133            logprintf(LOG_LEVEL_VERBOSE, "server proposal: language client to server: %s", buf);
5134    
5135            // 言語(サーバ -> クライアント)
5136            // 現状では未使用。ログに記録するだけ。
5137            if (!grab_payload(pvar, 4)
5138             || !grab_payload(pvar, size = get_uint32(data))) {
5139                    // 言語(クライアント -> サーバ) と同様に、問題があっても警告のみとする。
5140                    logputs(LOG_LEVEL_WARNING, __FUNCTION__ ": truncated packet (language server to client)");
5141                    goto skip;
5142            }
5143            data += 4;
5144    
5145            if (size >= sizeof(buf)) {
5146                    logputs(LOG_LEVEL_WARNING, __FUNCTION__ ": server proposed language (server to client) is too long.");
5147            }
5148            strncpy_s(buf, sizeof(buf), data, _TRUNCATE);
5149            data += size;
5150    
5151            logprintf(LOG_LEVEL_VERBOSE, "server proposal: language server to client: %s", buf);
5152    
5153            // first_kex_packet_follows:
5154            // KEXINIT パケットの後に、アルゴリズムのネゴ結果を推測して鍵交換パケットを送っているか。
5155            // SSH_MSG_KEXINIT の後の鍵交換はクライアント側から送るのでサーバ側が 1 にする事はないはず。
5156            if (!grab_payload(pvar, 1)) {
5157                    // 言語(クライアント -> サーバ) と同様に、問題があっても警告のみとする。
5158                    logputs(LOG_LEVEL_WARNING, __FUNCTION__ ": truncated packet (first_kex_packet_follows)");
5159                    goto skip;
5160            }
5161            if (data[0] != 0) {
5162                    // 前述のようにサーバ側は 0 以外にする事はないはずなので、警告を記録する。
5163                    logprintf(LOG_LEVEL_WARNING, __FUNCTION__ ": first_kex_packet_follows is not 0. (%d)", data[0]);
5164            }
5165            data++;
5166    
5167            // reserved: 現状は常に 0 となる。
5168            if (!grab_payload(pvar, 4)) {
5169                    // 言語(クライアント -> サーバ) と同様に、問題があっても警告のみとする。
5170                    logputs(LOG_LEVEL_WARNING, __FUNCTION__ ": truncated packet (reserved)");
5171                    goto skip;
5172            }
5173            if ((size = get_uint32(data)) != 0) {
5174                    logprintf(LOG_LEVEL_INFO, __FUNCTION__ ": reserved data is not 0. (%d)", size);
5175            }
5176    
5177  skip:  skip:
5178          // 決定した方式をログに出力          // 決定した方式をログに出力
5179          logprintf(LOG_LEVEL_VERBOSE, "KEX algorithm: %s",          logprintf(LOG_LEVEL_VERBOSE, "KEX algorithm: %s",

Legend:
Removed from v.7020  
changed lines
  Added in v.7021

Back to OSDN">Back to OSDN
ViewVC Help
Powered by ViewVC 1.1.26