| 75 |
static unsigned char *encbuff = NULL; |
static unsigned char *encbuff = NULL; |
| 76 |
static unsigned int encbufflen = 0; |
static unsigned int encbufflen = 0; |
| 77 |
|
|
|
static char *get_cipher_name(int cipher); |
|
|
|
|
| 78 |
static void crc_update(uint32 *a, uint32 b) |
static void crc_update(uint32 *a, uint32 b) |
| 79 |
{ |
{ |
| 80 |
b ^= *a; |
b ^= *a; |
| 294 |
memcpy(data+aadlen, encbuff, bytes); |
memcpy(data+aadlen, encbuff, bytes); |
| 295 |
|
|
| 296 |
if (EVP_Cipher(evp, NULL, NULL, 0) < 0) |
if (EVP_Cipher(evp, NULL, NULL, 0) < 0) |
| 297 |
return FALSE; |
goto err; |
| 298 |
else |
|
| 299 |
return TRUE; |
return TRUE; |
| 300 |
|
|
| 301 |
err: |
err: |
| 302 |
UTIL_get_lang_msg("MSG_DECRYPT_ERROR2", pvar, "%s decrypt error(2)"); |
UTIL_get_lang_msg("MSG_DECRYPT_ERROR2", pvar, "%s decrypt error(2)"); |
| 800 |
pvar->crypt_state.sender_cipher = SSH_CIPHER_NONE; |
pvar->crypt_state.sender_cipher = SSH_CIPHER_NONE; |
| 801 |
} |
} |
| 802 |
else { |
else { |
| 803 |
pvar->crypt_state.sender_cipher = pvar->ciphers[MODE_OUT]->id; |
pvar->crypt_state.sender_cipher = get_cipher_id(pvar->ciphers[MODE_OUT]); |
| 804 |
} |
} |
| 805 |
if (pvar->ciphers[MODE_IN] == NULL) { |
if (pvar->ciphers[MODE_IN] == NULL) { |
| 806 |
pvar->crypt_state.receiver_cipher = SSH_CIPHER_NONE; |
pvar->crypt_state.receiver_cipher = SSH_CIPHER_NONE; |
| 807 |
} |
} |
| 808 |
else { |
else { |
| 809 |
pvar->crypt_state.receiver_cipher = pvar->ciphers[MODE_IN]->id; |
pvar->crypt_state.receiver_cipher = get_cipher_id(pvar->ciphers[MODE_IN]); |
| 810 |
} |
} |
| 811 |
} |
} |
| 812 |
|
|
| 1044 |
SecureZeroMemory(state->ivec, 8); |
SecureZeroMemory(state->ivec, 8); |
| 1045 |
} |
} |
| 1046 |
|
|
|
|
|
|
// |
|
|
// SSH2用アルゴリズムの初期化 |
|
|
// |
|
|
void cipher_init_SSH2(EVP_CIPHER_CTX *evp, |
|
|
const u_char *key, u_int keylen, |
|
|
const u_char *iv, u_int ivlen, |
|
|
int encrypt, |
|
|
const EVP_CIPHER *type, |
|
|
int discard_len, |
|
|
unsigned int authlen, |
|
|
PTInstVar pvar) |
|
|
{ |
|
|
int klen; |
|
|
char tmp[80]; |
|
|
unsigned char *junk = NULL, *discard = NULL; |
|
|
|
|
|
EVP_CIPHER_CTX_reset(evp); |
|
|
if (EVP_CipherInit(evp, type, NULL, NULL, (encrypt == CIPHER_ENCRYPT)) == 0) { |
|
|
UTIL_get_lang_msg("MSG_CIPHER_INIT_ERROR", pvar, "Cipher initialize error(%d)"); |
|
|
_snprintf_s(tmp, sizeof(tmp), _TRUNCATE, pvar->ts->UIMsg, 1); |
|
|
notify_fatal_error(pvar, tmp, TRUE); |
|
|
return; |
|
|
} |
|
|
|
|
|
if (authlen > 0 && !EVP_CIPHER_CTX_ctrl(evp, EVP_CTRL_GCM_SET_IVLEN, ivlen, NULL)) { |
|
|
UTIL_get_lang_msg("MSG_CIPHER_INIT_ERROR", pvar, "Cipher initialize error(%d)"); |
|
|
_snprintf_s(tmp, sizeof(tmp), _TRUNCATE, pvar->ts->UIMsg, 2); |
|
|
notify_fatal_error(pvar, tmp, TRUE); |
|
|
return; |
|
|
} |
|
|
if (EVP_CipherInit(evp, NULL, NULL, (u_char *)iv, -1) == 0) { |
|
|
UTIL_get_lang_msg("MSG_CIPHER_INIT_ERROR", pvar, "Cipher initialize error(%d)"); |
|
|
_snprintf_s(tmp, sizeof(tmp), _TRUNCATE, pvar->ts->UIMsg, 3); |
|
|
notify_fatal_error(pvar, tmp, TRUE); |
|
|
return; |
|
|
} |
|
|
if (authlen > 0 && !EVP_CIPHER_CTX_ctrl(evp, EVP_CTRL_GCM_SET_IV_FIXED, -1, (u_char *)iv)) { |
|
|
UTIL_get_lang_msg("MSG_CIPHER_INIT_ERROR", pvar, "Cipher initialize error(%d)"); |
|
|
_snprintf_s(tmp, sizeof(tmp), _TRUNCATE, pvar->ts->UIMsg, 4); |
|
|
notify_fatal_error(pvar, tmp, TRUE); |
|
|
return; |
|
|
} |
|
|
|
|
|
klen = EVP_CIPHER_CTX_key_length(evp); |
|
|
if (klen > 0 && keylen != klen) { |
|
|
if (EVP_CIPHER_CTX_set_key_length(evp, keylen) == 0) { |
|
|
UTIL_get_lang_msg("MSG_CIPHER_INIT_ERROR", pvar, "Cipher initialize error(%d)"); |
|
|
_snprintf_s(tmp, sizeof(tmp), _TRUNCATE, pvar->ts->UIMsg, 5); |
|
|
notify_fatal_error(pvar, tmp, TRUE); |
|
|
return; |
|
|
} |
|
|
} |
|
|
if (EVP_CipherInit(evp, NULL, (u_char *)key, NULL, -1) == 0) { |
|
|
UTIL_get_lang_msg("MSG_CIPHER_INIT_ERROR", pvar, "Cipher initialize error(%d)"); |
|
|
_snprintf_s(tmp, sizeof(tmp), _TRUNCATE, pvar->ts->UIMsg, 6); |
|
|
notify_fatal_error(pvar, tmp, TRUE); |
|
|
return; |
|
|
} |
|
|
|
|
|
if (discard_len > 0) { |
|
|
junk = malloc(discard_len); |
|
|
discard = malloc(discard_len); |
|
|
if (junk == NULL || discard == NULL || |
|
|
EVP_Cipher(evp, discard, junk, discard_len) == 0) { |
|
|
UTIL_get_lang_msg("MSG_CIPHER_INIT_ERROR", pvar, "Cipher initialize error(%d)"); |
|
|
_snprintf_s(tmp, sizeof(tmp), _TRUNCATE, pvar->ts->UIMsg, 7); |
|
|
notify_fatal_error(pvar, tmp, TRUE); |
|
|
} |
|
|
else { |
|
|
SecureZeroMemory(discard, discard_len); |
|
|
} |
|
|
free(junk); |
|
|
free(discard); |
|
|
} |
|
|
} |
|
|
|
|
|
// |
|
|
// SSH2用アルゴリズムの破棄 |
|
|
// |
|
|
void cipher_free_SSH2(EVP_CIPHER_CTX *evp) |
|
|
{ |
|
|
EVP_CIPHER_CTX_free(evp); |
|
|
} |
|
|
|
|
|
|
|
| 1047 |
BOOL CRYPT_start_encryption(PTInstVar pvar, int sender_flag, int receiver_flag) |
BOOL CRYPT_start_encryption(PTInstVar pvar, int sender_flag, int receiver_flag) |
| 1048 |
{ |
{ |
| 1049 |
struct Enc *enc; |
struct Enc *enc; |
| 1050 |
char *encryption_key = pvar->crypt_state.sender_cipher_key; |
char *encryption_key = pvar->crypt_state.sender_cipher_key; |
| 1051 |
char *decryption_key = pvar->crypt_state.receiver_cipher_key; |
char *decryption_key = pvar->crypt_state.receiver_cipher_key; |
| 1052 |
SSH2Cipher *cipher; |
const struct ssh2cipher *cipher; |
| 1053 |
BOOL isOK = TRUE; |
BOOL isOK = TRUE; |
| 1054 |
|
|
| 1055 |
if (sender_flag) { |
if (sender_flag) { |
| 1174 |
HASH_MINSIZE / HASH_ENTRYSIZE; |
HASH_MINSIZE / HASH_ENTRYSIZE; |
| 1175 |
} |
} |
| 1176 |
|
|
|
static char *get_cipher_name(int cipher) |
|
|
{ |
|
|
switch (cipher) { |
|
|
case SSH_CIPHER_NONE: |
|
|
return "None"; |
|
|
case SSH_CIPHER_3DES: |
|
|
return "3DES (168 key bits)"; |
|
|
case SSH_CIPHER_DES: |
|
|
return "DES (56 key bits)"; |
|
|
case SSH_CIPHER_BLOWFISH: |
|
|
return "Blowfish (256 key bits)"; |
|
|
|
|
|
// SSH2 |
|
|
case SSH2_CIPHER_3DES_CBC: |
|
|
return "3des-cbc"; |
|
|
case SSH2_CIPHER_AES128_CBC: |
|
|
return "aes128-cbc"; |
|
|
case SSH2_CIPHER_AES192_CBC: |
|
|
return "aes192-cbc"; |
|
|
case SSH2_CIPHER_AES256_CBC: |
|
|
return "aes256-cbc"; |
|
|
case SSH2_CIPHER_BLOWFISH_CBC: |
|
|
return "blowfish-cbc"; |
|
|
case SSH2_CIPHER_AES128_CTR: |
|
|
return "aes128-ctr"; |
|
|
case SSH2_CIPHER_AES192_CTR: |
|
|
return "aes192-ctr"; |
|
|
case SSH2_CIPHER_AES256_CTR: |
|
|
return "aes256-ctr"; |
|
|
case SSH2_CIPHER_ARCFOUR: |
|
|
return "arcfour"; |
|
|
case SSH2_CIPHER_ARCFOUR128: |
|
|
return "arcfour128"; |
|
|
case SSH2_CIPHER_ARCFOUR256: |
|
|
return "arcfour256"; |
|
|
case SSH2_CIPHER_CAST128_CBC: |
|
|
return "cast-128-cbc"; |
|
|
case SSH2_CIPHER_3DES_CTR: |
|
|
return "3des-ctr"; |
|
|
case SSH2_CIPHER_BLOWFISH_CTR: |
|
|
return "blowfish-ctr"; |
|
|
case SSH2_CIPHER_CAST128_CTR: |
|
|
return "cast-128-ctr"; |
|
|
case SSH2_CIPHER_CAMELLIA128_CBC: |
|
|
return "camellia128-cbc"; |
|
|
case SSH2_CIPHER_CAMELLIA192_CBC: |
|
|
return "camellia192-cbc"; |
|
|
case SSH2_CIPHER_CAMELLIA256_CBC: |
|
|
return "camellia256-cbc"; |
|
|
case SSH2_CIPHER_CAMELLIA128_CTR: |
|
|
return "camellia128-ctr"; |
|
|
case SSH2_CIPHER_CAMELLIA192_CTR: |
|
|
return "camellia192-ctr"; |
|
|
case SSH2_CIPHER_CAMELLIA256_CTR: |
|
|
return "camellia256-ctr"; |
|
|
case SSH2_CIPHER_AES128_GCM: |
|
|
return "aes128-gcm@openssh.com"; |
|
|
case SSH2_CIPHER_AES256_GCM: |
|
|
return "aes256-gcm@openssh.com"; |
|
|
|
|
|
default: |
|
|
return "Unknown"; |
|
|
} |
|
|
} |
|
|
|
|
| 1177 |
void CRYPT_get_cipher_info(PTInstVar pvar, char *dest, int len) |
void CRYPT_get_cipher_info(PTInstVar pvar, char *dest, int len) |
| 1178 |
{ |
{ |
| 1179 |
UTIL_get_lang_msg("DLG_ABOUT_CIPHER_INFO", pvar, |
UTIL_get_lang_msg("DLG_ABOUT_CIPHER_INFO", pvar, |