Develop and Download Open Source Software

Browse Subversion Repository

Diff of /trunk/ttssh2/ttxssh/pkt.c

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

revision 6969 by doda, Thu Nov 2 11:37:41 2017 UTC revision 6972 by doda, Tue Nov 7 22:26:20 2017 UTC
# Line 88  static int recv_data(PTInstVar pvar, uns Line 88  static int recv_data(PTInstVar pvar, uns
88          return amount_read;          return amount_read;
89  }  }
90    
   
91  // 改行コードが出てくるまで読む  // 改行コードが出てくるまで読む
92  static int recv_line_data(PTInstVar pvar)  static int recv_line_data(PTInstVar pvar)
93  {  {
# Line 128  static int recv_line_data(PTInstVar pvar Line 127  static int recv_line_data(PTInstVar pvar
127          return amount_read;          return amount_read;
128  }  }
129    
   
130  /* This function does two things:  /* This function does two things:
131     -- reads data from the sshd and feeds the SSH protocol packets to ssh.c     -- reads data from the sshd and feeds the SSH protocol packets to ssh.c
132     -- copies any available decrypted session data into the application buffer     -- copies any available decrypted session data into the application buffer
# Line 186  int PKT_recv(PTInstVar pvar, char *buf, Line 184  int PKT_recv(PTInstVar pvar, char *buf,
184    
185                          etm = mac && mac->enabled && mac->etm;                          etm = mac && mac->enabled && mac->etm;
186    
187                          // 暗号化パケットの一部を復号化する。                          /*
188                             * 通常の MAC 方式 (E&M: Encrypt & MAC) ではパケット長部分も暗号化されているため、
189                             * 先頭の 1 ブロックを復号する。MAC 方式が EtM (Encrypt then MAC) の時は
190                             * パケット長部分は暗号化されていないので復号は必要無い。
191                             */
192                          if (!pvar->pkt_state.predecrypted_packet && !etm) {                          if (!pvar->pkt_state.predecrypted_packet && !etm) {
193                                  SSH_predecrpyt_packet(pvar, data);                                  SSH_predecrpyt_packet(pvar, data);
194                                  pvar->pkt_state.predecrypted_packet = TRUE;                                  pvar->pkt_state.predecrypted_packet = TRUE;
# Line 198  int PKT_recv(PTInstVar pvar, char *buf, Line 200  int PKT_recv(PTInstVar pvar, char *buf,
200                                  padding = 8 - (realpktsize % 8);                                  padding = 8 - (realpktsize % 8);
201                                  pktsize = realpktsize + padding;                                  pktsize = realpktsize + padding;
202                          } else {                          } else {
203                                  // SSH2のパケットは先頭に packet-size(4)+padding(1)+type(1) が続く。                                  // SSH2 ではパケットの先頭に uint32 (4バイト) のパケット長が来る
204                                  pktsize = get_uint32_MSBfirst(data);                                  pktsize = get_uint32_MSBfirst(data);
205    
206                                    // 続く 1 バイトは padding の長さ
207                                  if (etm) {                                  if (etm) {
208                                            // EtM では padding length 以降は暗号化されている。
209                                            // この時点ではまだ復号していないので padding length が分からない。
210                                            // 仮に 0 を入れて置く。
211                                          padding = 0;                                          padding = 0;
212                                  }                                  }
213                                  else {                                  else {
214                                            // E&M では復号済み
215                                          padding = (unsigned char) data[4];                                          padding = (unsigned char) data[4];
216                                  }                                  }
217                          }                          }
218    
219                          // パケット(TCPペイロード)の全体のサイズは、SSHペイロード+4(+MAC)となる。                          // パケット(TCPペイロード)の全体のサイズは、SSHペイロード+4(+MAC)となる。
220                          // +4は、SSHペイロードのサイズを格納している部分(int型)。                          // +4は、SSHペイロードのサイズを格納している部分(int型)。
221                          total_packet_size = pktsize + 4 + SSH_get_clear_MAC_size(pvar);                          total_packet_size = pktsize + 4 + SSH_get_clear_MAC_size(pvar);
222    
223                          if (total_packet_size <= pvar->pkt_state.datalen) {                          if (total_packet_size <= pvar->pkt_state.datalen) {
224                                  /* the data must be 4 byte aligned. */                                  // 受信済みデータが十分有る場合はパケットの実処理を行う
225                                  if (SSHv1(pvar)) {                                  if (SSHv1(pvar)) {
226                                            // SSH1 は EtM 非対応
227                                          SSH_handle_packet1(pvar, data, pktsize, padding);                                          SSH_handle_packet1(pvar, data, pktsize, padding);
228                                  }                                  }
229                                  else {                                  else {
230                                          SSH_handle_packet2(pvar, data, pktsize, padding, etm);                                          SSH_handle_packet2(pvar, data, pktsize, padding, etm);
231                                  }                                  }
                                 pvar->pkt_state.predecrypted_packet = FALSE;  
232    
233                                    pvar->pkt_state.predecrypted_packet = FALSE;
234                                  pvar->pkt_state.datastart += total_packet_size;                                  pvar->pkt_state.datastart += total_packet_size;
235                                  pvar->pkt_state.datalen -= total_packet_size;                                  pvar->pkt_state.datalen -= total_packet_size;
236    
237                          } else if (total_packet_size > PACKET_MAX_SIZE) {                          } else if (total_packet_size > PACKET_MAX_SIZE) {
238                                  // 4MBを超える巨大なパケットが届いたら、異常終了する。                                  // パケット長が大きすぎる場合は異常終了する。
239                                  // 実際にはデータ化けで復号失敗時に、誤認識することが多い。                                  // 実際には何らかの要因で復号失敗⇒パケット長部分が壊れている事が多い。
240                                  UTIL_get_lang_msg("MSG_PKT_OVERSIZED_ERROR", pvar,                                  UTIL_get_lang_msg("MSG_PKT_OVERSIZED_ERROR", pvar,
241                                                    "Oversized packet received from server; connection will close.");                                                    "Oversized packet received from server; connection will close.");
242                                  notify_fatal_error(pvar, pvar->ts->UIMsg, TRUE);                                  notify_fatal_error(pvar, pvar->ts->UIMsg, TRUE);

Legend:
Removed from v.6969  
changed lines
  Added in v.6972

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