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 9216 by nmaya, Sat Apr 17 08:36:59 2021 UTC revision 9217 by nmaya, Sun Apr 25 02:18:41 2021 UTC
# Line 931  static int prep_packet_ssh1(PTInstVar pv Line 931  static int prep_packet_ssh1(PTInstVar pv
931   *   data - ssh パケットの先頭を指すポインタ   *   data - ssh パケットの先頭を指すポインタ
932   *   len - パケット長 (先頭のパケット長領域(4バイト)を除いた値)   *   len - パケット長 (先頭のパケット長領域(4バイト)を除いた値)
933   *   aadlen - 暗号化されていないが認証の対象となっているデータの長さ   *   aadlen - 暗号化されていないが認証の対象となっているデータの長さ
934     *            chacha20-poly1305 では暗号化されるパケット長部分の長さ
935   *   authlen - 認証データ(AEAD tag)長   *   authlen - 認証データ(AEAD tag)長
936   */   */
937    
# Line 1175  void finish_send_packet_special(PTInstVa Line 1176  void finish_send_packet_special(PTInstVa
1176                  CRYPT_encrypt(pvar, data + 4, data_length - 4);                  CRYPT_encrypt(pvar, data + 4, data_length - 4);
1177          } else { //for SSH2(yutaka)          } else { //for SSH2(yutaka)
1178                  unsigned int block_size = CRYPT_get_encryption_block_size(pvar);                  unsigned int block_size = CRYPT_get_encryption_block_size(pvar);
1179                    unsigned int packet_length;
1180                  unsigned int encryption_size;                  unsigned int encryption_size;
1181                  unsigned int padding;                  unsigned int padding_size;
1182                  BOOL ret;                  BOOL ret;
1183                  struct Mac *mac = &pvar->ssh2_keys[MODE_OUT].mac;                  struct Mac *mac = &pvar->ssh2_keys[MODE_OUT].mac;
1184                  struct Enc *enc = &pvar->ssh2_keys[MODE_OUT].enc;                  struct Enc *enc = &pvar->ssh2_keys[MODE_OUT].enc;
# Line 1189  void finish_send_packet_special(PTInstVa Line 1191  void finish_send_packet_special(PTInstVa
1191                           <--ignore---> ^^^^^^^^    <---- payload --->                           <--ignore---> ^^^^^^^^    <---- payload --->
1192                                         packet length                                         packet length
1193    
1194                                                  ^^padding                                                  ^^padding_size
1195    
1196                                         <---------------------------->                                         <---------------------------->
1197                                            SSH2 sending data on TCP                                            SSH2 sending data on TCP
# Line 1238  void finish_send_packet_special(PTInstVa Line 1240  void finish_send_packet_special(PTInstVa
1240                  }                  }
1241    
1242                  if (mac && mac->etm || authlen > 0) {                  if (mac && mac->etm || authlen > 0) {
1243                          // 暗号化対象では無いが、MAC の対象となる部分の長さ                          // 暗号化対象ではないが、MAC の対象となるパケット長部分の長さ
1244                            // または chacha20-poly1305 で暗号化されるパケット長部分の長さ
1245                            // cf. PKT_recv 内のコメント
1246                          aadlen = 4;                          aadlen = 4;
1247                  }                  }
1248    
1249                  encryption_size = 4 - aadlen + 1 + len;                  packet_length = 1 + len; // パディング長のサイズ + ペイロード長
1250                  padding = block_size - (encryption_size % block_size);                  encryption_size = 4 + packet_length - aadlen; // パケット長のサイズ + packet_length - addlen
1251                  if (padding < 4)                  padding_size = block_size - (encryption_size % block_size);
1252                          padding += block_size;                  if (padding_size < 4)
1253                  encryption_size += padding;                          padding_size += block_size;
1254                  set_uint32(data, encryption_size - 4 + aadlen);                  packet_length += padding_size;
1255                  data[4] = (unsigned char) padding;                  encryption_size += padding_size;
1256                    set_uint32(data, packet_length);
1257                    data[4] = (unsigned char) padding_size;
1258                  if (msg) {                  if (msg) {
1259                          // パケット圧縮の場合、バッファを拡張する。(2011.6.10 yutaka)                          // パケット圧縮の場合、バッファを拡張する。(2011.6.10 yutaka)
1260                          buffer_append_space(msg, padding + EVP_MAX_MD_SIZE);                          buffer_append_space(msg, padding_size + EVP_MAX_MD_SIZE);
1261                          // realloc()されると、ポインタが変わる可能性があるので、再度取り直す。                          // realloc()されると、ポインタが変わる可能性があるので、再度取り直す。
1262                          data = buffer_ptr(msg);                          data = buffer_ptr(msg);
1263                  }                  }
1264    
1265                  CRYPT_set_random_data(pvar, data + 5 + len, padding);                  CRYPT_set_random_data(pvar, data + 5 + len, padding_size);
1266    
1267                  if (authlen > 0) {                  if (authlen > 0) {
1268                            // パケット暗号化と MAC の計算
1269                          CRYPT_encrypt_aead(pvar, data, encryption_size, aadlen, authlen);                          CRYPT_encrypt_aead(pvar, data, encryption_size, aadlen, authlen);
1270                          maclen = authlen;                          maclen = authlen;
1271                  }                  }
1272                  else if (aadlen) {                  else if (aadlen) {
1273                          // パケット暗号化                          // パケット暗号化(aadlenより後ろだけ)
1274                          CRYPT_encrypt(pvar, data + aadlen, encryption_size);                          CRYPT_encrypt(pvar, data + aadlen, encryption_size);
1275    
1276                          // EtM では暗号化後に MAC を計算する                          // EtM では暗号化後に MAC を計算する
# Line 1274  void finish_send_packet_special(PTInstVa Line 1281  void finish_send_packet_special(PTInstVa
1281                          }                          }
1282                  }                  }
1283                  else {                  else {
1284                          // E&M では先に MAC を計算する                          // E&M では暗号化前に MAC を計算する
1285                          ret = CRYPT_build_sender_MAC(pvar, pvar->ssh_state.sender_sequence_number,                          ret = CRYPT_build_sender_MAC(pvar, pvar->ssh_state.sender_sequence_number,
1286                                                       data, encryption_size, data + encryption_size);                                                       data, encryption_size, data + encryption_size);
1287                          if (ret) {                          if (ret) {
# Line 1288  void finish_send_packet_special(PTInstVa Line 1295  void finish_send_packet_special(PTInstVa
1295                  data_length = encryption_size + aadlen + maclen;                  data_length = encryption_size + aadlen + maclen;
1296    
1297                  logprintf(150,                  logprintf(150,
1298                                    "%s: built packet info: aadlen:%d, enclen:%d, padlen:%d, datalen:%d, maclen:%d, mode:%s",                            "%s: built packet info: "
1299                                    __FUNCTION__,                            "aadlen:%d, enclen:%d, padlen:%d, datalen:%d, maclen:%d, "
1300                                    aadlen, encryption_size, padding, data_length, maclen, aadlen ? "EtM" : "E&M");                            "Encrypt Mode:%s, MAC mode:%s",
1301                              __FUNCTION__,
1302                              aadlen, encryption_size, padding_size, data_length, maclen,
1303                              authlen ? "AEAD" : "not AEAD", aadlen ? "EtM" : "E&M");
1304          }          }
1305    
1306          send_packet_blocking(pvar, data, data_length);          send_packet_blocking(pvar, data, data_length);
# Line 6398  static BOOL handle_SSH2_newkeys(PTInstVa Line 6408  static BOOL handle_SSH2_newkeys(PTInstVa
6408                                 | 1 << SSH2_CIPHER_CAMELLIA256_CTR                                 | 1 << SSH2_CIPHER_CAMELLIA256_CTR
6409                                 | 1 << SSH2_CIPHER_AES128_GCM                                 | 1 << SSH2_CIPHER_AES128_GCM
6410                                 | 1 << SSH2_CIPHER_AES256_GCM                                 | 1 << SSH2_CIPHER_AES256_GCM
6411                                   | 1 << SSH2_CIPHER_CHACHAPOLY
6412          );          );
6413          int type = (1 << SSH_AUTH_PASSWORD) | (1 << SSH_AUTH_RSA) |          int type = (1 << SSH_AUTH_PASSWORD) | (1 << SSH_AUTH_RSA) |
6414                     (1 << SSH_AUTH_TIS) | (1 << SSH_AUTH_PAGEANT);                     (1 << SSH_AUTH_TIS) | (1 << SSH_AUTH_PAGEANT);

Legend:
Removed from v.9216  
changed lines
  Added in v.9217

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