| 48 |
#define DEATTACK_DETECTED 1 |
#define DEATTACK_DETECTED 1 |
| 49 |
|
|
| 50 |
/* |
/* |
| 51 |
* $Id: crypt.c,v 1.15 2007-10-17 15:58:15 maya Exp $ Cryptographic attack |
* $Id: crypt.c,v 1.16 2007-10-18 03:49:39 maya Exp $ Cryptographic attack |
| 52 |
* detector for ssh - source code (C)1998 CORE-SDI, Buenos Aires Argentina |
* detector for ssh - source code (C)1998 CORE-SDI, Buenos Aires Argentina |
| 53 |
* Ariel Futoransky(futo@core-sdi.com) <http://www.core-sdi.com> |
* Ariel Futoransky(futo@core-sdi.com) <http://www.core-sdi.com> |
| 54 |
*/ |
*/ |
| 219 |
static void cAES128_encrypt(PTInstVar pvar, unsigned char FAR * buf, |
static void cAES128_encrypt(PTInstVar pvar, unsigned char FAR * buf, |
| 220 |
int bytes) |
int bytes) |
| 221 |
{ |
{ |
|
// unsigned char key[AES128_KEYLEN], iv[AES128_IVLEN]; |
|
| 222 |
unsigned char *newbuf = malloc(bytes); |
unsigned char *newbuf = malloc(bytes); |
| 223 |
int block_size = pvar->ssh2_keys[MODE_OUT].enc.block_size; |
int block_size = pvar->ssh2_keys[MODE_OUT].enc.block_size; |
| 224 |
|
|
| 246 |
goto error; |
goto error; |
| 247 |
|
|
| 248 |
} else { |
} else { |
|
//memcpy(key, pvar->ssh2_keys[MODE_OUT].enc.key, AES128_KEYLEN); |
|
|
// IVはDES関数内で更新されるため、ローカルにコピーしてから使う。 |
|
|
//memcpy(iv, pvar->ssh2_keys[MODE_OUT].enc.iv, AES128_IVLEN); |
|
|
|
|
|
//debug_print(50, key, 24); |
|
|
//debug_print(51, iv, 8); |
|
|
//debug_print(52, buf, bytes); |
|
|
//debug_print(53, newbuf, bytes); |
|
|
|
|
| 249 |
memcpy(buf, newbuf, bytes); |
memcpy(buf, newbuf, bytes); |
| 250 |
|
|
| 251 |
} |
} |
| 252 |
|
|
| 253 |
error: |
error: |
| 257 |
static void cAES128_decrypt(PTInstVar pvar, unsigned char FAR * buf, |
static void cAES128_decrypt(PTInstVar pvar, unsigned char FAR * buf, |
| 258 |
int bytes) |
int bytes) |
| 259 |
{ |
{ |
|
// unsigned char key[AES128_KEYLEN], iv[AES128_IVLEN]; |
|
| 260 |
unsigned char *newbuf = malloc(bytes); |
unsigned char *newbuf = malloc(bytes); |
| 261 |
int block_size = pvar->ssh2_keys[MODE_IN].enc.block_size; |
int block_size = pvar->ssh2_keys[MODE_IN].enc.block_size; |
| 262 |
|
|
| 283 |
goto error; |
goto error; |
| 284 |
|
|
| 285 |
} else { |
} else { |
|
//memcpy(key, pvar->ssh2_keys[MODE_IN].enc.key, AES128_KEYLEN); |
|
|
// IVはDES関数内で更新されるため、ローカルにコピーしてから使う。 |
|
|
//memcpy(iv, pvar->ssh2_keys[MODE_IN].enc.iv, AES128_IVLEN); |
|
|
|
|
|
//debug_print(70, key, AES128_KEYLEN); |
|
|
//debug_print(71, iv, AES128_IVLEN); |
|
|
//debug_print(72, buf, bytes); |
|
|
//debug_print(73, newbuf, bytes); |
|
|
|
|
| 286 |
memcpy(buf, newbuf, bytes); |
memcpy(buf, newbuf, bytes); |
| 287 |
|
|
| 288 |
} |
} |
| 289 |
|
|
| 290 |
error: |
error: |
| 297 |
static void c3DES_CBC_encrypt(PTInstVar pvar, unsigned char FAR * buf, |
static void c3DES_CBC_encrypt(PTInstVar pvar, unsigned char FAR * buf, |
| 298 |
int bytes) |
int bytes) |
| 299 |
{ |
{ |
|
// unsigned char key[24], iv[8]; |
|
| 300 |
unsigned char *newbuf = malloc(bytes); |
unsigned char *newbuf = malloc(bytes); |
| 301 |
|
|
| 302 |
if (newbuf == NULL) |
if (newbuf == NULL) |
| 309 |
goto error; |
goto error; |
| 310 |
|
|
| 311 |
} else { |
} else { |
| 312 |
|
//unsigned char key[24], iv[8]; |
| 313 |
//memcpy(key, pvar->ssh2_keys[MODE_OUT].enc.key, 24); |
//memcpy(key, pvar->ssh2_keys[MODE_OUT].enc.key, 24); |
| 314 |
// IVはDES関数内で更新されるため、ローカルにコピーしてから使う。 |
// IVはDES関数内で更新されるため、ローカルにコピーしてから使う。 |
| 315 |
//memcpy(iv, pvar->ssh2_keys[MODE_OUT].enc.iv, 8); |
//memcpy(iv, pvar->ssh2_keys[MODE_OUT].enc.iv, 8); |
| 329 |
static void c3DES_CBC_decrypt(PTInstVar pvar, unsigned char FAR * buf, |
static void c3DES_CBC_decrypt(PTInstVar pvar, unsigned char FAR * buf, |
| 330 |
int bytes) |
int bytes) |
| 331 |
{ |
{ |
|
// unsigned char key[24], iv[8]; |
|
| 332 |
unsigned char *newbuf = malloc(bytes); |
unsigned char *newbuf = malloc(bytes); |
| 333 |
|
|
| 334 |
if (newbuf == NULL) |
if (newbuf == NULL) |
| 341 |
goto error; |
goto error; |
| 342 |
|
|
| 343 |
} else { |
} else { |
| 344 |
|
//unsigned char key[24], iv[8]; |
| 345 |
//memcpy(key, pvar->ssh2_keys[MODE_IN].enc.key, 24); |
//memcpy(key, pvar->ssh2_keys[MODE_IN].enc.key, 24); |
| 346 |
// IVはDES関数内で更新されるため、ローカルにコピーしてから使う。 |
// IVはDES関数内で更新されるため、ローカルにコピーしてから使う。 |
| 347 |
//memcpy(iv, pvar->ssh2_keys[MODE_IN].enc.iv, 8); |
//memcpy(iv, pvar->ssh2_keys[MODE_IN].enc.iv, 8); |
| 359 |
} |
} |
| 360 |
|
|
| 361 |
|
|
| 362 |
|
static void cBlowfish_encrypt2(PTInstVar pvar, unsigned char FAR * buf, |
| 363 |
|
int bytes) |
| 364 |
|
{ |
| 365 |
|
unsigned char *newbuf = malloc(bytes); |
| 366 |
|
int block_size = pvar->ssh2_keys[MODE_OUT].enc.block_size; |
| 367 |
|
|
| 368 |
|
// 事前復号化により、全ペイロードが復号化されている場合は、0バイトになる。(2004.11.7 yutaka) |
| 369 |
|
if (bytes == 0) |
| 370 |
|
return; |
| 371 |
|
|
| 372 |
|
if (newbuf == NULL) |
| 373 |
|
return; |
| 374 |
|
|
| 375 |
|
if (EVP_Cipher(&pvar->evpcip[MODE_OUT], newbuf, buf, bytes) == 0) { |
| 376 |
|
UTIL_get_lang_msg("MSG_BLOWFISH_ENCRYPT_ERROR", pvar, |
| 377 |
|
"Blowfish encrypt error"); |
| 378 |
|
notify_fatal_error(pvar, pvar->ts->UIMsg); |
| 379 |
|
goto error; |
| 380 |
|
|
| 381 |
|
} else { |
| 382 |
|
memcpy(buf, newbuf, bytes); |
| 383 |
|
|
| 384 |
|
} |
| 385 |
|
|
| 386 |
|
error: |
| 387 |
|
free(newbuf); |
| 388 |
|
} |
| 389 |
|
|
| 390 |
|
static void cBlowfish_decrypt2(PTInstVar pvar, unsigned char FAR * buf, |
| 391 |
|
int bytes) |
| 392 |
|
{ |
| 393 |
|
unsigned char *newbuf = malloc(bytes); |
| 394 |
|
int block_size = pvar->ssh2_keys[MODE_IN].enc.block_size; |
| 395 |
|
|
| 396 |
|
// 事前復号化により、全ペイロードが復号化されている場合は、0バイトになる。(2004.11.7 yutaka) |
| 397 |
|
if (bytes == 0) |
| 398 |
|
return; |
| 399 |
|
|
| 400 |
|
if (newbuf == NULL) |
| 401 |
|
return; |
| 402 |
|
|
| 403 |
|
if (EVP_Cipher(&pvar->evpcip[MODE_IN], newbuf, buf, bytes) == 0) { |
| 404 |
|
UTIL_get_lang_msg("MSG_BLOWFISH_DECRYPT_ERROR", pvar, |
| 405 |
|
"Blowfish decrypt error"); |
| 406 |
|
notify_fatal_error(pvar, pvar->ts->UIMsg); |
| 407 |
|
goto error; |
| 408 |
|
|
| 409 |
|
} else { |
| 410 |
|
memcpy(buf, newbuf, bytes); |
| 411 |
|
|
| 412 |
|
} |
| 413 |
|
|
| 414 |
|
error: |
| 415 |
|
free(newbuf); |
| 416 |
|
} |
| 417 |
|
|
| 418 |
|
|
| 419 |
|
|
| 420 |
static void c3DES_encrypt(PTInstVar pvar, unsigned char FAR * buf, |
static void c3DES_encrypt(PTInstVar pvar, unsigned char FAR * buf, |
| 421 |
int bytes) |
int bytes) |
| 422 |
{ |
{ |
| 637 |
|
|
| 638 |
} else { // for SSH2(yutaka) |
} else { // for SSH2(yutaka) |
| 639 |
// SSH2がサポートするデータ通信用アルゴリズム(公開鍵交換用とは別) |
// SSH2がサポートするデータ通信用アルゴリズム(公開鍵交換用とは別) |
| 640 |
cipher_mask = (1 << SSH_CIPHER_3DES_CBC) |
cipher_mask = (1 << SSH2_CIPHER_3DES_CBC) |
| 641 |
| (1 << SSH_CIPHER_AES128) |
| (1 << SSH2_CIPHER_AES128) |
| 642 |
#ifdef SSH2_BLOWFISH |
| (1 << SSH2_CIPHER_BLOWFISH) |
| 643 |
| (1 << SSH_CIPHER_BLOWFISH) |
| (1 << SSH2_CIPHER_AES192) |
| 644 |
#endif |
| (1 << SSH2_CIPHER_AES256); |
|
| (1 << SSH_CIPHER_AES192) |
|
|
| (1 << SSH_CIPHER_AES256); |
|
| 645 |
} |
} |
| 646 |
|
|
| 647 |
sender_ciphers &= cipher_mask; |
sender_ciphers &= cipher_mask; |
| 1088 |
if (sender_flag) { |
if (sender_flag) { |
| 1089 |
switch (pvar->crypt_state.sender_cipher) { |
switch (pvar->crypt_state.sender_cipher) { |
| 1090 |
// for SSH2(yutaka) |
// for SSH2(yutaka) |
| 1091 |
case SSH_CIPHER_3DES_CBC: |
case SSH2_CIPHER_3DES_CBC: |
| 1092 |
{ |
{ |
| 1093 |
struct Enc *enc; |
struct Enc *enc; |
| 1094 |
|
|
| 1108 |
} |
} |
| 1109 |
|
|
| 1110 |
// for SSH2(yutaka) |
// for SSH2(yutaka) |
| 1111 |
case SSH_CIPHER_AES128: |
case SSH2_CIPHER_AES128: |
| 1112 |
case SSH_CIPHER_AES192: |
case SSH2_CIPHER_AES192: |
| 1113 |
case SSH_CIPHER_AES256: |
case SSH2_CIPHER_AES256: |
| 1114 |
{ |
{ |
| 1115 |
struct Enc *enc; |
struct Enc *enc; |
| 1116 |
|
|
| 1129 |
break; |
break; |
| 1130 |
} |
} |
| 1131 |
|
|
| 1132 |
|
case SSH2_CIPHER_BLOWFISH: |
| 1133 |
|
{ |
| 1134 |
|
struct Enc *enc; |
| 1135 |
|
|
| 1136 |
|
enc = &pvar->ssh2_keys[MODE_OUT].enc; |
| 1137 |
|
cipher_init_SSH2(&pvar->evpcip[MODE_OUT], |
| 1138 |
|
enc->key, get_cipher_key_len(pvar->crypt_state.sender_cipher), |
| 1139 |
|
enc->iv, get_cipher_block_size(pvar->crypt_state.sender_cipher), |
| 1140 |
|
CIPHER_ENCRYPT, |
| 1141 |
|
get_cipher_EVP_CIPHER(pvar->crypt_state.sender_cipher), |
| 1142 |
|
pvar); |
| 1143 |
|
|
| 1144 |
|
//debug_print(10, enc->key, get_cipher_key_len(pvar->crypt_state.sender_cipher)); |
| 1145 |
|
//debug_print(11, enc->iv, get_cipher_block_size(pvar->crypt_state.sender_cipher)); |
| 1146 |
|
|
| 1147 |
|
pvar->crypt_state.encrypt = cBlowfish_encrypt2; |
| 1148 |
|
break; |
| 1149 |
|
} |
| 1150 |
|
|
| 1151 |
case SSH_CIPHER_3DES:{ |
case SSH_CIPHER_3DES:{ |
| 1152 |
c3DES_init(encryption_key, &pvar->crypt_state.enc.c3DES); |
c3DES_init(encryption_key, &pvar->crypt_state.enc.c3DES); |
| 1153 |
pvar->crypt_state.encrypt = c3DES_encrypt; |
pvar->crypt_state.encrypt = c3DES_encrypt; |
| 1184 |
if (receiver_flag) { |
if (receiver_flag) { |
| 1185 |
switch (pvar->crypt_state.receiver_cipher) { |
switch (pvar->crypt_state.receiver_cipher) { |
| 1186 |
// for SSH2(yutaka) |
// for SSH2(yutaka) |
| 1187 |
case SSH_CIPHER_3DES_CBC: |
case SSH2_CIPHER_3DES_CBC: |
| 1188 |
{ |
{ |
| 1189 |
struct Enc *enc; |
struct Enc *enc; |
| 1190 |
|
|
| 1196 |
get_cipher_EVP_CIPHER(pvar->crypt_state.sender_cipher), |
get_cipher_EVP_CIPHER(pvar->crypt_state.sender_cipher), |
| 1197 |
pvar); |
pvar); |
| 1198 |
|
|
| 1199 |
//debug_print(12, enc->key, 24); |
//debug_print(12, enc->key, get_cipher_key_len(pvar->crypt_state.sender_cipher)); |
| 1200 |
//debug_print(13, enc->iv, 24); |
//debug_print(13, enc->iv, get_cipher_block_size(pvar->crypt_state.sender_cipher)); |
| 1201 |
|
|
| 1202 |
pvar->crypt_state.decrypt = c3DES_CBC_decrypt; |
pvar->crypt_state.decrypt = c3DES_CBC_decrypt; |
| 1203 |
break; |
break; |
| 1204 |
} |
} |
| 1205 |
|
|
| 1206 |
// for SSH2(yutaka) |
// for SSH2(yutaka) |
| 1207 |
case SSH_CIPHER_AES128: |
case SSH2_CIPHER_AES128: |
| 1208 |
case SSH_CIPHER_AES192: |
case SSH2_CIPHER_AES192: |
| 1209 |
case SSH_CIPHER_AES256: |
case SSH2_CIPHER_AES256: |
| 1210 |
{ |
{ |
| 1211 |
struct Enc *enc; |
struct Enc *enc; |
| 1212 |
|
|
| 1218 |
get_cipher_EVP_CIPHER(pvar->crypt_state.sender_cipher), |
get_cipher_EVP_CIPHER(pvar->crypt_state.sender_cipher), |
| 1219 |
pvar); |
pvar); |
| 1220 |
|
|
| 1221 |
//debug_print(12, enc->key, 24); |
//debug_print(12, enc->key, get_cipher_key_len(pvar->crypt_state.sender_cipher)); |
| 1222 |
//debug_print(13, enc->iv, 24); |
//debug_print(13, enc->iv, get_cipher_block_size(pvar->crypt_state.sender_cipher)); |
| 1223 |
|
|
| 1224 |
pvar->crypt_state.decrypt = cAES128_decrypt; |
pvar->crypt_state.decrypt = cAES128_decrypt; |
| 1225 |
break; |
break; |
| 1226 |
} |
} |
| 1227 |
|
|
| 1228 |
|
case SSH2_CIPHER_BLOWFISH: |
| 1229 |
|
{ |
| 1230 |
|
struct Enc *enc; |
| 1231 |
|
|
| 1232 |
|
enc = &pvar->ssh2_keys[MODE_IN].enc; |
| 1233 |
|
cipher_init_SSH2(&pvar->evpcip[MODE_IN], |
| 1234 |
|
enc->key, get_cipher_key_len(pvar->crypt_state.sender_cipher), |
| 1235 |
|
enc->iv, get_cipher_block_size(pvar->crypt_state.sender_cipher), |
| 1236 |
|
CIPHER_DECRYPT, |
| 1237 |
|
get_cipher_EVP_CIPHER(pvar->crypt_state.sender_cipher), |
| 1238 |
|
pvar); |
| 1239 |
|
|
| 1240 |
|
//debug_print(12, enc->key, get_cipher_key_len(pvar->crypt_state.sender_cipher)); |
| 1241 |
|
//debug_print(13, enc->iv, get_cipher_block_size(pvar->crypt_state.sender_cipher)); |
| 1242 |
|
|
| 1243 |
|
pvar->crypt_state.decrypt = cBlowfish_decrypt2; |
| 1244 |
|
break; |
| 1245 |
|
} |
| 1246 |
|
|
| 1247 |
case SSH_CIPHER_3DES:{ |
case SSH_CIPHER_3DES:{ |
| 1248 |
c3DES_init(decryption_key, &pvar->crypt_state.dec.c3DES); |
c3DES_init(decryption_key, &pvar->crypt_state.dec.c3DES); |
| 1249 |
pvar->crypt_state.decrypt = c3DES_decrypt; |
pvar->crypt_state.decrypt = c3DES_decrypt; |
| 1319 |
return "Blowfish (256 key bits)"; |
return "Blowfish (256 key bits)"; |
| 1320 |
|
|
| 1321 |
// SSH2 |
// SSH2 |
| 1322 |
case SSH_CIPHER_3DES_CBC: |
case SSH2_CIPHER_3DES_CBC: |
| 1323 |
return "3DES-CBC"; |
return "3DES-CBC"; |
| 1324 |
case SSH_CIPHER_AES128: |
case SSH2_CIPHER_AES128: |
| 1325 |
return "AES128"; |
return "AES128"; |
| 1326 |
case SSH_CIPHER_AES192: |
case SSH2_CIPHER_AES192: |
| 1327 |
return "AES192"; |
return "AES192"; |
| 1328 |
case SSH_CIPHER_AES256: |
case SSH2_CIPHER_AES256: |
| 1329 |
return "AES256"; |
return "AES256"; |
| 1330 |
|
case SSH2_CIPHER_BLOWFISH: |
| 1331 |
|
return "Blowfish"; |
| 1332 |
|
|
| 1333 |
default: |
default: |
| 1334 |
return "Unknown"; |
return "Unknown"; |