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 6968 by doda, Thu Nov 2 11:37:37 2017 UTC revision 6969 by doda, Thu Nov 2 11:37:41 2017 UTC
# Line 774  static int prep_packet_ssh1(PTInstVar pv Line 774  static int prep_packet_ssh1(PTInstVar pv
774          return pvar->ssh_state.payload[-1];          return pvar->ssh_state.payload[-1];
775  }  }
776    
777  static int prep_packet_ssh2(PTInstVar pvar, char *data, int len, int padding)  static int prep_packet_ssh2(PTInstVar pvar, char *data, int len, int padding, int etm)
778  {  {
         int already_decrypted = get_predecryption_amount(pvar);  
   
779          pvar->ssh_state.payload = data + 4;          pvar->ssh_state.payload = data + 4;
780          pvar->ssh_state.payloadlen = len;          pvar->ssh_state.payloadlen = len;
781    
782          CRYPT_decrypt(pvar, data + already_decrypted, (4 + len) - already_decrypted);          if (etm) {
783                    if (!CRYPT_verify_receiver_MAC(pvar, pvar->ssh_state.receiver_sequence_number, data, len + 4, data + len + 4)) {
784                            UTIL_get_lang_msg("MSG_SSH_CORRUPTDATA_ERROR", pvar, "Detected corrupted data; connection terminating.");
785                            notify_fatal_error(pvar, pvar->ts->UIMsg, TRUE);
786                            return SSH_MSG_NONE;
787                    }
788    
789          if (!CRYPT_verify_receiver_MAC(pvar, pvar->ssh_state.receiver_sequence_number, data, len + 4, data + len + 4)) {                  CRYPT_decrypt(pvar, data + 4, len);
790                  UTIL_get_lang_msg("MSG_SSH_CORRUPTDATA_ERROR", pvar, "Detected corrupted data; connection terminating.");                  padding = (unsigned int) data[4];
791                  notify_fatal_error(pvar, pvar->ts->UIMsg, TRUE);          }
792                  return SSH_MSG_NONE;          else {
793                    int already_decrypted = get_predecryption_amount(pvar);
794    
795                    CRYPT_decrypt(pvar, data + already_decrypted, (4 + len) - already_decrypted);
796    
797                    if (!CRYPT_verify_receiver_MAC(pvar, pvar->ssh_state.receiver_sequence_number, data, len + 4, data + len + 4)) {
798                            UTIL_get_lang_msg("MSG_SSH_CORRUPTDATA_ERROR", pvar, "Detected corrupted data; connection terminating.");
799                            notify_fatal_error(pvar, pvar->ts->UIMsg, TRUE);
800                            return SSH_MSG_NONE;
801                    }
802          }          }
803    
804          pvar->ssh_state.payload++;          pvar->ssh_state.payload++;
# Line 989  void finish_send_packet_special(PTInstVa Line 1001  void finish_send_packet_special(PTInstVa
1001                  unsigned int encryption_size;                  unsigned int encryption_size;
1002                  unsigned int padding;                  unsigned int padding;
1003                  BOOL ret;                  BOOL ret;
1004                    struct Mac *mac = &pvar->ssh2_keys[MODE_OUT].mac;
1005                    int aadlen = 0;
1006    
1007                  /*                  /*
1008                   データ構造                   データ構造
# Line 1041  void finish_send_packet_special(PTInstVa Line 1055  void finish_send_packet_special(PTInstVa
1055                          block_size = 8;                          block_size = 8;
1056                  }                  }
1057    
1058                  encryption_size = 4 + 1 + len;                  if (mac && mac->etm) {
1059                            aadlen = 4;
1060                    }
1061    
1062                    encryption_size = 4 - aadlen + 1 + len;
1063                  padding = block_size - (encryption_size % block_size);                  padding = block_size - (encryption_size % block_size);
1064                  if (padding < 4)                  if (padding < 4)
1065                          padding += block_size;                          padding += block_size;
1066                  encryption_size += padding;                  encryption_size += padding;
1067                  set_uint32(data, encryption_size - 4);                  set_uint32(data, encryption_size - 4 + aadlen);
1068                  data[4] = (unsigned char) padding;                  data[4] = (unsigned char) padding;
1069                  data_length = encryption_size + CRYPT_get_sender_MAC_size(pvar);                  data_length = encryption_size;
1070                  if (msg) {                  if (msg) {
1071                          // パケット圧縮の場合、バッファを拡張する。(2011.6.10 yutaka)                          // パケット圧縮の場合、バッファを拡張する。(2011.6.10 yutaka)
1072                          buffer_append_space(msg, padding + EVP_MAX_MD_SIZE);                          buffer_append_space(msg, padding + EVP_MAX_MD_SIZE);
# Line 1058  void finish_send_packet_special(PTInstVa Line 1076  void finish_send_packet_special(PTInstVa
1076    
1077                  //if (pvar->ssh_state.outbuflen <= 7 + data_length) *(int *)0 = 0;                  //if (pvar->ssh_state.outbuflen <= 7 + data_length) *(int *)0 = 0;
1078                  CRYPT_set_random_data(pvar, data + 5 + len, padding);                  CRYPT_set_random_data(pvar, data + 5 + len, padding);
1079                  ret = CRYPT_build_sender_MAC(pvar,  
1080                                               pvar->ssh_state.sender_sequence_number,                  if (aadlen == 0) {
1081                                               data, encryption_size,                          ret = CRYPT_build_sender_MAC(pvar, pvar->ssh_state.sender_sequence_number,
1082                                               data + encryption_size);                                                       data, encryption_size, data + encryption_size);
1083                  if (ret == FALSE) { // MACがまだ設定されていない場合                          if (ret) {
1084                          data_length = encryption_size;                                  data_length += CRYPT_get_sender_MAC_size(pvar);
1085    //                              data[encryption_size + 5] = 0;
1086                            }
1087                  }                  }
1088    
1089                  // パケットを暗号化する。MAC以降は暗号化対象外。                  // パケットを暗号化する。MAC以降は暗号化対象外。
1090                  CRYPT_encrypt(pvar, data, encryption_size);                  CRYPT_encrypt(pvar, data + aadlen, encryption_size);
1091    
1092                    if (aadlen) {
1093                            int maclen;
1094                            encryption_size += aadlen;
1095                            ret = CRYPT_build_sender_MAC(pvar, pvar->ssh_state.sender_sequence_number,
1096                                                         data, encryption_size, data + encryption_size);
1097                            if (ret) {
1098                                    maclen = CRYPT_get_sender_MAC_size(pvar);
1099                                    data_length = encryption_size + maclen;
1100                            }
1101                            logprintf(LOG_LEVEL_ERROR, __FUNCTION__
1102                                    ": EtM test. aadlen:%d, enclen:%d, pad:%d, datalen:%d, maclen:%d",
1103                                    aadlen, encryption_size, padding, data_length, maclen);
1104                    }
1105    
1106          }          }
1107    
1108          send_packet_blocking(pvar, data, data_length);          send_packet_blocking(pvar, data, data_length);
# Line 2035  void SSH2_dispatch_add_range_message(uns Line 2070  void SSH2_dispatch_add_range_message(uns
2070          }          }
2071  }  }
2072    
   
2073  void SSH_handle_packet1(PTInstVar pvar, char *data, int len, int padding)  void SSH_handle_packet1(PTInstVar pvar, char *data, int len, int padding)
2074  {  {
2075          unsigned char message = prep_packet_ssh1(pvar, data, len, padding);          unsigned char message = prep_packet_ssh1(pvar, data, len, padding);
# Line 2059  void SSH_handle_packet1(PTInstVar pvar, Line 2093  void SSH_handle_packet1(PTInstVar pvar,
2093          }          }
2094  }  }
2095    
2096  void SSH_handle_packet2(PTInstVar pvar, char *data, int len, int padding)  void SSH_handle_packet2(PTInstVar pvar, char *data, int len, int padding, int etm)
2097  {  {
2098          unsigned char message = prep_packet_ssh2(pvar, data, len, padding);          unsigned char message = prep_packet_ssh2(pvar, data, len, padding, etm);
2099    
2100          // SSHのメッセージタイプをチェック          // SSHのメッセージタイプをチェック
2101          if (message != SSH_MSG_NONE) {          if (message != SSH_MSG_NONE) {
# Line 4168  int get_ssh2_mac_truncatebits(hmac_type Line 4202  int get_ssh2_mac_truncatebits(hmac_type
4202          return bits;          return bits;
4203  }  }
4204    
4205    int get_ssh2_mac_etm(hmac_type type)
4206    {
4207            ssh2_mac_t *ptr = ssh2_macs;
4208            int etm;
4209    
4210            while (ptr->name != NULL) {
4211                    if (type == ptr->type) {
4212                            etm = ptr->etm;
4213                            break;
4214                    }
4215                    ptr++;
4216            }
4217            return etm;
4218    }
4219    
4220  char* get_ssh2_comp_name(compression_type type)  char* get_ssh2_comp_name(compression_type type)
4221  {  {
4222          ssh2_comp_t *ptr = ssh2_comps;          ssh2_comp_t *ptr = ssh2_comps;
# Line 4701  static void choose_SSH2_key_maxlength(PT Line 4750  static void choose_SSH2_key_maxlength(PT
4750                  if (get_ssh2_mac_truncatebits(val) != 0) {                  if (get_ssh2_mac_truncatebits(val) != 0) {
4751                          current_keys[mode].mac.mac_len = get_ssh2_mac_truncatebits(val) / 8;                          current_keys[mode].mac.mac_len = get_ssh2_mac_truncatebits(val) / 8;
4752                  }                  }
4753                    current_keys[mode].mac.etm = get_ssh2_mac_etm(val);
4754    
4755                  // キーサイズとブロックサイズもここで設定しておく (2004.11.7 yutaka)                  // キーサイズとブロックサイズもここで設定しておく (2004.11.7 yutaka)
4756                  if (ctos == 1) {                  if (ctos == 1) {

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

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