| 72 |
|
|
| 73 |
#define CMP(a,b) memcmp(a, b, SSH_BLOCKSIZE) |
#define CMP(a,b) memcmp(a, b, SSH_BLOCKSIZE) |
| 74 |
|
|
| 75 |
|
static unsigned char *encbuff = NULL; |
| 76 |
|
static unsigned int encbufflen = 0; |
| 77 |
|
|
| 78 |
static char *get_cipher_name(int cipher); |
static char *get_cipher_name(int cipher); |
| 79 |
|
|
| 202 |
|
|
| 203 |
BOOL CRYPT_encrypt_aead(PTInstVar pvar, unsigned char *data, unsigned int bytes, unsigned int aadlen, unsigned int authlen) |
BOOL CRYPT_encrypt_aead(PTInstVar pvar, unsigned char *data, unsigned int bytes, unsigned int aadlen, unsigned int authlen) |
| 204 |
{ |
{ |
| 205 |
unsigned char *newbuf = NULL; |
unsigned char *newbuff = NULL; |
| 206 |
unsigned int block_size = pvar->ssh2_keys[MODE_OUT].enc.block_size; |
unsigned int block_size = pvar->ssh2_keys[MODE_OUT].enc.block_size; |
| 207 |
unsigned char lastiv[1]; |
unsigned char lastiv[1]; |
| 208 |
char tmp[80]; |
char tmp[80]; |
| 220 |
return FALSE; |
return FALSE; |
| 221 |
} |
} |
| 222 |
|
|
| 223 |
if ((newbuf = malloc(bytes)) == NULL) |
if (bytes > encbufflen) { |
| 224 |
goto err; |
if ((newbuff = realloc(encbuff, bytes)) == NULL) |
| 225 |
|
goto err; |
| 226 |
|
encbuff = newbuff; |
| 227 |
|
encbufflen = bytes; |
| 228 |
|
} |
| 229 |
|
|
| 230 |
if (!EVP_CIPHER_CTX_ctrl(evp, EVP_CTRL_GCM_IV_GEN, 1, lastiv)) |
if (!EVP_CIPHER_CTX_ctrl(evp, EVP_CTRL_GCM_IV_GEN, 1, lastiv)) |
| 231 |
goto err; |
goto err; |
| 233 |
if (aadlen && !EVP_Cipher(evp, NULL, data, aadlen) < 0) |
if (aadlen && !EVP_Cipher(evp, NULL, data, aadlen) < 0) |
| 234 |
goto err; |
goto err; |
| 235 |
|
|
| 236 |
if (EVP_Cipher(evp, newbuf, data+aadlen, bytes) < 0) |
if (EVP_Cipher(evp, encbuff, data+aadlen, bytes) < 0) |
| 237 |
goto err; |
goto err; |
| 238 |
|
|
| 239 |
memcpy(data+aadlen, newbuf, bytes); |
memcpy(data+aadlen, encbuff, bytes); |
| 240 |
|
|
| 241 |
if (EVP_Cipher(evp, NULL, NULL, 0) < 0) |
if (EVP_Cipher(evp, NULL, NULL, 0) < 0) |
| 242 |
goto err; |
goto err; |
| 244 |
if (!EVP_CIPHER_CTX_ctrl(evp, EVP_CTRL_GCM_GET_TAG, authlen, data+aadlen+bytes)) |
if (!EVP_CIPHER_CTX_ctrl(evp, EVP_CTRL_GCM_GET_TAG, authlen, data+aadlen+bytes)) |
| 245 |
goto err; |
goto err; |
| 246 |
|
|
|
free(newbuf); |
|
|
|
|
| 247 |
return TRUE; |
return TRUE; |
| 248 |
|
|
| 249 |
err: |
err: |
|
free(newbuf); |
|
|
|
|
| 250 |
UTIL_get_lang_msg("MSG_ENCRYPT_ERROR2", pvar, "%s encrypt error(2)"); |
UTIL_get_lang_msg("MSG_ENCRYPT_ERROR2", pvar, "%s encrypt error(2)"); |
| 251 |
_snprintf_s(tmp, sizeof(tmp), _TRUNCATE, pvar->ts->UIMsg, |
_snprintf_s(tmp, sizeof(tmp), _TRUNCATE, pvar->ts->UIMsg, |
| 252 |
get_cipher_name(pvar->crypt_state.sender_cipher)); |
get_cipher_name(pvar->crypt_state.sender_cipher)); |
| 256 |
|
|
| 257 |
BOOL CRYPT_decrypt_aead(PTInstVar pvar, unsigned char *data, unsigned int bytes, unsigned int aadlen, unsigned int authlen) |
BOOL CRYPT_decrypt_aead(PTInstVar pvar, unsigned char *data, unsigned int bytes, unsigned int aadlen, unsigned int authlen) |
| 258 |
{ |
{ |
| 259 |
unsigned char *newbuf = NULL; |
unsigned char *newbuff = NULL; |
| 260 |
unsigned int block_size = pvar->ssh2_keys[MODE_IN].enc.block_size; |
unsigned int block_size = pvar->ssh2_keys[MODE_IN].enc.block_size; |
| 261 |
unsigned char lastiv[1]; |
unsigned char lastiv[1]; |
| 262 |
char tmp[80]; |
char tmp[80]; |
| 274 |
return FALSE; |
return FALSE; |
| 275 |
} |
} |
| 276 |
|
|
| 277 |
if ((newbuf = malloc(bytes)) == NULL) |
if (bytes > encbufflen) { |
| 278 |
goto err; |
if ((newbuff = realloc(encbuff, bytes)) == NULL) |
| 279 |
|
goto err; |
| 280 |
|
encbuff = newbuff; |
| 281 |
|
encbufflen = bytes; |
| 282 |
|
} |
| 283 |
|
|
| 284 |
if (!EVP_CIPHER_CTX_ctrl(evp, EVP_CTRL_GCM_IV_GEN, 1, lastiv)) |
if (!EVP_CIPHER_CTX_ctrl(evp, EVP_CTRL_GCM_IV_GEN, 1, lastiv)) |
| 285 |
goto err; |
goto err; |
| 290 |
if (aadlen && !EVP_Cipher(evp, NULL, data, aadlen) < 0) |
if (aadlen && !EVP_Cipher(evp, NULL, data, aadlen) < 0) |
| 291 |
goto err; |
goto err; |
| 292 |
|
|
| 293 |
if (EVP_Cipher(evp, newbuf, data+aadlen, bytes) < 0) |
if (EVP_Cipher(evp, encbuff, data+aadlen, bytes) < 0) |
| 294 |
goto err; |
goto err; |
| 295 |
|
|
| 296 |
memcpy(data+aadlen, newbuf, bytes); |
memcpy(data+aadlen, encbuff, bytes); |
|
free(newbuf); |
|
| 297 |
|
|
| 298 |
if (EVP_Cipher(evp, NULL, NULL, 0) < 0) |
if (EVP_Cipher(evp, NULL, NULL, 0) < 0) |
| 299 |
return FALSE; |
return FALSE; |
| 301 |
return TRUE; |
return TRUE; |
| 302 |
|
|
| 303 |
err: |
err: |
|
free(newbuf); |
|
|
|
|
| 304 |
UTIL_get_lang_msg("MSG_DECRYPT_ERROR2", pvar, "%s decrypt error(2)"); |
UTIL_get_lang_msg("MSG_DECRYPT_ERROR2", pvar, "%s decrypt error(2)"); |
| 305 |
_snprintf_s(tmp, sizeof(tmp), _TRUNCATE, pvar->ts->UIMsg, |
_snprintf_s(tmp, sizeof(tmp), _TRUNCATE, pvar->ts->UIMsg, |
| 306 |
get_cipher_name(pvar->crypt_state.receiver_cipher)); |
get_cipher_name(pvar->crypt_state.receiver_cipher)); |
| 314 |
|
|
| 315 |
static void crypt_SSH2_encrypt(PTInstVar pvar, unsigned char *buf, int bytes) |
static void crypt_SSH2_encrypt(PTInstVar pvar, unsigned char *buf, int bytes) |
| 316 |
{ |
{ |
| 317 |
unsigned char *newbuf; |
unsigned char *newbuff; |
| 318 |
int block_size = pvar->ssh2_keys[MODE_OUT].enc.block_size; |
int block_size = pvar->ssh2_keys[MODE_OUT].enc.block_size; |
| 319 |
char tmp[80]; |
char tmp[80]; |
| 320 |
|
|
| 331 |
return; |
return; |
| 332 |
} |
} |
| 333 |
|
|
| 334 |
if ((newbuf = malloc(bytes)) == NULL) |
if (bytes > encbufflen) { |
| 335 |
return; |
if ((newbuff = realloc(encbuff, bytes)) == NULL) |
| 336 |
|
return; |
| 337 |
|
encbuff = newbuff; |
| 338 |
|
encbufflen = bytes; |
| 339 |
|
} |
| 340 |
|
|
| 341 |
if (EVP_Cipher(&pvar->evpcip[MODE_OUT], newbuf, buf, bytes) == 0) { |
if (EVP_Cipher(&pvar->evpcip[MODE_OUT], encbuff, buf, bytes) == 0) { |
| 342 |
UTIL_get_lang_msg("MSG_ENCRYPT_ERROR2", pvar, "%s encrypt error(2)"); |
UTIL_get_lang_msg("MSG_ENCRYPT_ERROR2", pvar, "%s encrypt error(2)"); |
| 343 |
_snprintf_s(tmp, sizeof(tmp), _TRUNCATE, pvar->ts->UIMsg, |
_snprintf_s(tmp, sizeof(tmp), _TRUNCATE, pvar->ts->UIMsg, |
| 344 |
get_cipher_name(pvar->crypt_state.sender_cipher)); |
get_cipher_name(pvar->crypt_state.sender_cipher)); |
| 345 |
notify_fatal_error(pvar, tmp, TRUE); |
notify_fatal_error(pvar, tmp, TRUE); |
| 346 |
} else { |
} else { |
| 347 |
memcpy(buf, newbuf, bytes); |
memcpy(buf, encbuff, bytes); |
| 348 |
} |
} |
|
|
|
|
free(newbuf); |
|
| 349 |
} |
} |
| 350 |
|
|
| 351 |
static void crypt_SSH2_decrypt(PTInstVar pvar, unsigned char *buf, int bytes) |
static void crypt_SSH2_decrypt(PTInstVar pvar, unsigned char *buf, int bytes) |
| 352 |
{ |
{ |
| 353 |
unsigned char *newbuf; |
unsigned char *newbuff; |
| 354 |
int block_size = pvar->ssh2_keys[MODE_IN].enc.block_size; |
int block_size = pvar->ssh2_keys[MODE_IN].enc.block_size; |
| 355 |
char tmp[80]; |
char tmp[80]; |
| 356 |
|
|
| 367 |
return; |
return; |
| 368 |
} |
} |
| 369 |
|
|
| 370 |
if ((newbuf = malloc(bytes)) == NULL) |
if (bytes > encbufflen) { |
| 371 |
return; |
if ((newbuff = malloc(bytes)) == NULL) |
| 372 |
|
return; |
| 373 |
|
encbuff = newbuff; |
| 374 |
|
encbufflen = bytes; |
| 375 |
|
} |
| 376 |
|
|
| 377 |
if (EVP_Cipher(&pvar->evpcip[MODE_IN], newbuf, buf, bytes) == 0) { |
if (EVP_Cipher(&pvar->evpcip[MODE_IN], encbuff, buf, bytes) == 0) { |
| 378 |
UTIL_get_lang_msg("MSG_DECRYPT_ERROR2", pvar, "%s decrypt error(2)"); |
UTIL_get_lang_msg("MSG_DECRYPT_ERROR2", pvar, "%s decrypt error(2)"); |
| 379 |
_snprintf_s(tmp, sizeof(tmp), _TRUNCATE, pvar->ts->UIMsg, |
_snprintf_s(tmp, sizeof(tmp), _TRUNCATE, pvar->ts->UIMsg, |
| 380 |
get_cipher_name(pvar->crypt_state.receiver_cipher)); |
get_cipher_name(pvar->crypt_state.receiver_cipher)); |
| 381 |
notify_fatal_error(pvar, tmp, TRUE); |
notify_fatal_error(pvar, tmp, TRUE); |
| 382 |
} else { |
} else { |
| 383 |
memcpy(buf, newbuf, bytes); |
memcpy(buf, encbuff, bytes); |
| 384 |
} |
} |
|
|
|
|
free(newbuf); |
|
| 385 |
} |
} |
| 386 |
|
|
| 387 |
static void c3DES_encrypt(PTInstVar pvar, unsigned char *buf, int bytes) |
static void c3DES_encrypt(PTInstVar pvar, unsigned char *buf, int bytes) |
| 1314 |
|
|
| 1315 |
void CRYPT_end(PTInstVar pvar) |
void CRYPT_end(PTInstVar pvar) |
| 1316 |
{ |
{ |
| 1317 |
|
free(encbuff); |
| 1318 |
|
encbuff = NULL; |
| 1319 |
|
encbufflen = 0; |
| 1320 |
|
|
| 1321 |
destroy_public_key(&pvar->crypt_state.host_key); |
destroy_public_key(&pvar->crypt_state.host_key); |
| 1322 |
destroy_public_key(&pvar->crypt_state.server_key); |
destroy_public_key(&pvar->crypt_state.server_key); |
| 1323 |
|
|