| 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 |
|
|
| 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; |
| 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 |
| 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 を計算する |
| 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) { |
| 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); |
| 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); |