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 6982 by doda, Sat Nov 25 15:26:31 2017 UTC revision 6983 by doda, Sat Nov 25 15:26:35 2017 UTC
# Line 186  int PKT_recv(PTInstVar pvar, char *buf, Line 186  int PKT_recv(PTInstVar pvar, char *buf,
186    
187                          /*                          /*
188                           * 通常の MAC 方式 (E&M: Encrypt & MAC) ではパケット長部分も暗号化されているため、                           * 通常の MAC 方式 (E&M: Encrypt & MAC) ではパケット長部分も暗号化されているため、
189                           * 先頭の 1 ブロックを復号する。MAC 方式が EtM (Encrypt then MAC) の時は                           * 先頭の 1 ブロックを復号する。MAC 方式が EtM (Encrypt then MAC) の時、および SSH1 では
190                           * パケット長部分は暗号化されていないので復号は必要無い。                           * パケット長部分は暗号化されていないので復号は必要無い。
191                           */                           */
192                          if (!pvar->pkt_state.predecrypted_packet && !etm) {                          if (SSHv2(pvar) && !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;
195                          }                          }
196    
197                            // パケットの先頭に uint32 (4バイト) のパケット長が来る
198                            pktsize = get_uint32_MSBfirst(data);
199    
200                          if (SSHv1(pvar)) {                          if (SSHv1(pvar)) {
201                                  uint32 realpktsize = get_uint32_MSBfirst(data);                                  // SSH1 ではパケット長の値には padding の長さが含まれていない。
202                                    // また padding の長さの情報もパケット上には無いので、パケット長の値から計算する。
203                                    padding = 8 - (pktsize % 8);
204    
205                                  padding = 8 - (realpktsize % 8);                                  // 以降の処理は pktsize に padding の値が含まれている事が前提となっている。
206                                  pktsize = realpktsize + padding;                                  pktsize += padding;
                         } else {  
                                 // SSH2 ではパケットの先頭に uint32 (4バイト) のパケット長が来る  
                                 pktsize = get_uint32_MSBfirst(data);  
   
                                 // 続く 1 バイトは padding の長さ  
                                 if (etm) {  
                                         // EtM では padding length 以降は暗号化されている。  
                                         // この時点ではまだ復号していないので padding length が分からない。  
                                         // 仮に 0 を入れて置く。  
                                         padding = 0;  
                                 }  
                                 else {  
                                         // E&M では復号済み  
                                         padding = (unsigned char) data[4];  
                                 }  
207                          }                          }
208    
209                          // パケット(TCPペイロード)の全体のサイズは、SSHペイロード+4(+MAC)となる。                          // パケット(TCPペイロード)の全体のサイズは、SSHペイロード+4(+MAC)となる。
# Line 223  int PKT_recv(PTInstVar pvar, char *buf, Line 213  int PKT_recv(PTInstVar pvar, char *buf,
213                          if (total_packet_size <= pvar->pkt_state.datalen) {                          if (total_packet_size <= pvar->pkt_state.datalen) {
214                                  // 受信済みデータが十分有る場合はパケットの実処理を行う                                  // 受信済みデータが十分有る場合はパケットの実処理を行う
215                                  if (SSHv1(pvar)) {                                  if (SSHv1(pvar)) {
216                                          // SSH1 は EtM 非対応                                          // SSH1 は EtM 非対応 (そもそも MAC ではなく CRC を使う)
217                                          SSH1_handle_packet(pvar, data, pktsize, padding);                                          SSH1_handle_packet(pvar, data, pktsize, padding);
218                                  }                                  }
219                                  else {                                  else {
220                                          SSH2_handle_packet(pvar, data, pktsize, padding, etm);                                          // SSH2 ではこの時点では padding 長部分が復号されていない場合があるので、
221                                            // padding 長は渡さずに、必要になった時に内部で取得する。
222                                            SSH2_handle_packet(pvar, data, pktsize, etm);
223                                  }                                  }
224    
225                                  pvar->pkt_state.predecrypted_packet = FALSE;                                  pvar->pkt_state.predecrypted_packet = FALSE;
226                                  pvar->pkt_state.datastart += total_packet_size;                                  pvar->pkt_state.datastart += total_packet_size;
227                                  pvar->pkt_state.datalen -= total_packet_size;                                  pvar->pkt_state.datalen -= total_packet_size;
228    
229                          } else if (total_packet_size > PACKET_MAX_SIZE) {                          }
230                            else if (total_packet_size > PACKET_MAX_SIZE) {
231                                  // パケット長が大きすぎる場合は異常終了する。                                  // パケット長が大きすぎる場合は異常終了する。
232                                  // 実際には何らかの要因で復号失敗⇒パケット長部分が壊れている事が多い。                                  // 実際には何らかの要因で復号失敗⇒パケット長部分が壊れている事が多い。
233                                  UTIL_get_lang_msg("MSG_PKT_OVERSIZED_ERROR", pvar,                                  UTIL_get_lang_msg("MSG_PKT_OVERSIZED_ERROR", pvar,
234                                                    "Oversized packet received from server; connection will close.");                                                    "Oversized packet received from server; connection will close.");
235                                  notify_fatal_error(pvar, pvar->ts->UIMsg, TRUE);                                  notify_fatal_error(pvar, pvar->ts->UIMsg, TRUE);
236                          } else {                          }
237                            else {
238                                  int amount_read = recv_data(pvar, max(total_packet_size, READAMOUNT));                                  int amount_read = recv_data(pvar, max(total_packet_size, READAMOUNT));
239    
240                                  if (amount_read == SOCKET_ERROR) {                                  if (amount_read == SOCKET_ERROR) {

Legend:
Removed from v.6982  
changed lines
  Added in v.6983

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