| 784 |
* 引数: |
* 引数: |
| 785 |
* data - ssh パケットの先頭を指すポインタ |
* data - ssh パケットの先頭を指すポインタ |
| 786 |
* len - パケット長 (先頭のパケット長領域(4バイト)を除いた値) |
* len - パケット長 (先頭のパケット長領域(4バイト)を除いた値) |
|
* padding - パディング長 (EtMの場合は0となっているので、復号後に取得する必要あり) |
|
| 787 |
* etm - MAC 方式が EtM かどうかのフラグ |
* etm - MAC 方式が EtM かどうかのフラグ |
| 788 |
*/ |
*/ |
| 789 |
|
|
| 790 |
static int prep_packet_ssh2(PTInstVar pvar, char *data, unsigned int len, unsigned int padding, int etm) |
static int prep_packet_ssh2(PTInstVar pvar, char *data, unsigned int len, int etm) |
| 791 |
{ |
{ |
| 792 |
|
unsigned int padding; |
| 793 |
|
|
| 794 |
if (etm) { |
if (etm) { |
| 795 |
// EtM の場合は先に MAC の検証を行う |
// EtM の場合は先に MAC の検証を行う |
| 796 |
if (!CRYPT_verify_receiver_MAC(pvar, pvar->ssh_state.receiver_sequence_number, data, len + 4, data + len + 4)) { |
if (!CRYPT_verify_receiver_MAC(pvar, pvar->ssh_state.receiver_sequence_number, data, len + 4, data + len + 4)) { |
| 801 |
|
|
| 802 |
// パケット長部分(先頭4バイト)は暗号化されていないので、そこをスキップして復号する。 |
// パケット長部分(先頭4バイト)は暗号化されていないので、そこをスキップして復号する。 |
| 803 |
CRYPT_decrypt(pvar, data + 4, len); |
CRYPT_decrypt(pvar, data + 4, len); |
|
|
|
|
// EtM の場合は 呼び出し元では padding 部分が読めない為、ここで値を取得する。 |
|
|
padding = (unsigned int) data[4]; |
|
| 804 |
} |
} |
| 805 |
else { |
else { |
| 806 |
// E&M では先頭部分が事前復号されている。 |
// E&M では先頭部分が事前復号されている。 |
| 818 |
} |
} |
| 819 |
} |
} |
| 820 |
|
|
| 821 |
|
// パディング長の取得 |
| 822 |
|
padding = (unsigned int) data[4]; |
| 823 |
|
|
| 824 |
// パケット長(4バイト) 部分とパディング長(1バイト)部分をスキップした SSH ペイロードの先頭 |
// パケット長(4バイト) 部分とパディング長(1バイト)部分をスキップした SSH ペイロードの先頭 |
| 825 |
pvar->ssh_state.payload = data + 4 + 1; |
pvar->ssh_state.payload = data + 4 + 1; |
| 826 |
|
|
| 2115 |
} |
} |
| 2116 |
} |
} |
| 2117 |
|
|
| 2118 |
void SSH2_handle_packet(PTInstVar pvar, char *data, unsigned int len, unsigned int padding, int etm) |
void SSH2_handle_packet(PTInstVar pvar, char *data, unsigned int len, int etm) |
| 2119 |
{ |
{ |
| 2120 |
unsigned char message = prep_packet_ssh2(pvar, data, len, padding, etm); |
unsigned char message = prep_packet_ssh2(pvar, data, len, etm); |
| 2121 |
|
|
| 2122 |
// SSHのメッセージタイプをチェック |
// SSHのメッセージタイプをチェック |
| 2123 |
if (message != SSH_MSG_NONE) { |
if (message != SSH_MSG_NONE) { |