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 6983 by doda, Sat Nov 25 15:26:35 2017 UTC revision 6985 by doda, Sat Nov 25 15:26:45 2017 UTC
# Line 180  int PKT_recv(PTInstVar pvar, char *buf, Line 180  int PKT_recv(PTInstVar pvar, char *buf,
180                          uint32 pktsize;                          uint32 pktsize;
181                          uint32 total_packet_size;                          uint32 total_packet_size;
182                          struct Mac *mac = &pvar->ssh2_keys[MODE_IN].mac;                          struct Mac *mac = &pvar->ssh2_keys[MODE_IN].mac;
183                          int etm;                          struct Enc *enc = &pvar->ssh2_keys[MODE_IN].enc;
184                            int aadlen;
185    
186                          etm = mac && mac->enabled && mac->etm;                          /*
187                             * aadlen: Additional Authenticated Data Length
188                             *   - 暗号化しないが MAC や AEAD での認証の対象となるデータの長さ
189                             *
190                             * EtM 方式の MAC や、AEAD な暗号ではパケットの先頭のパケット長部分は暗号化されず
191                             * 認証のみが行われる。パケット長は uint32 (4バイト) で格納されている。
192                             * 通常の MAC 方式 (E&M) で、かつ AEAD でない暗号方式ではパケット長部分も暗号化
193                             * されるので aadlen は 0 となる。
194                             */
195                            if (SSHv2(pvar) && ((mac && mac->etm) || (enc && enc->auth_len > 0))) {
196                                    aadlen = 4;
197                            }
198                            else {
199                                    aadlen = 0;
200                            }
201    
202                          /*                          /*
203                           * 通常の MAC 方式 (E&M: Encrypt & MAC) ではパケット長部分も暗号化されているため、                           * aadlen が 0 の時はパケット長部分が暗号化されている。パケット全体を受信してから
204                           * 先頭の 1 ブロックを復号する。MAC 方式が EtM (Encrypt then MAC) の時、および SSH1 では                           * 後段の処理を行う為にパケット長を知る必要が有る為、先頭の 1 ブロックを復号する。
                          * パケット長部分は暗号化されていないので復号は必要無い。  
205                           */                           */
206                          if (SSHv2(pvar) && !pvar->pkt_state.predecrypted_packet && !etm) {                          if (SSHv2(pvar) && !pvar->pkt_state.predecrypted_packet && aadlen == 0) {
207                                  SSH_predecrpyt_packet(pvar, data);                                  SSH_predecrpyt_packet(pvar, data);
208                                  pvar->pkt_state.predecrypted_packet = TRUE;                                  pvar->pkt_state.predecrypted_packet = TRUE;
209                          }                          }
# Line 208  int PKT_recv(PTInstVar pvar, char *buf, Line 222  int PKT_recv(PTInstVar pvar, char *buf,
222    
223                          // パケット(TCPペイロード)の全体のサイズは、SSHペイロード+4(+MAC)となる。                          // パケット(TCPペイロード)の全体のサイズは、SSHペイロード+4(+MAC)となる。
224                          // +4は、SSHペイロードのサイズを格納している部分(int型)。                          // +4は、SSHペイロードのサイズを格納している部分(int型)。
225                          total_packet_size = pktsize + 4 + SSH_get_clear_MAC_size(pvar);                          total_packet_size = pktsize + 4 + SSH_get_authdata_size(pvar, MODE_IN);
226    
227                          if (total_packet_size <= pvar->pkt_state.datalen) {                          if (total_packet_size <= pvar->pkt_state.datalen) {
228                                  // 受信済みデータが十分有る場合はパケットの実処理を行う                                  // 受信済みデータが十分有る場合はパケットの実処理を行う
# Line 219  int PKT_recv(PTInstVar pvar, char *buf, Line 233  int PKT_recv(PTInstVar pvar, char *buf,
233                                  else {                                  else {
234                                          // SSH2 ではこの時点では padding 長部分が復号されていない場合があるので、                                          // SSH2 ではこの時点では padding 長部分が復号されていない場合があるので、
235                                          // padding 長は渡さずに、必要になった時に内部で取得する。                                          // padding 長は渡さずに、必要になった時に内部で取得する。
236                                          SSH2_handle_packet(pvar, data, pktsize, etm);                                          SSH2_handle_packet(pvar, data, pktsize, aadlen, enc->auth_len);
237                                  }                                  }
238    
239                                  pvar->pkt_state.predecrypted_packet = FALSE;                                  pvar->pkt_state.predecrypted_packet = FALSE;

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

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