diff options
| author | Callum Linden <callum@lindenlab.com> | 2021-10-13 16:54:08 -0700 | 
|---|---|---|
| committer | Callum Linden <callum@lindenlab.com> | 2021-10-13 16:54:08 -0700 | 
| commit | 3c2ccd879cb59ac0fdcacfab1fe68bc4dcefc68b (patch) | |
| tree | 3a0851d0c1d77fcd6ffa948f9c6199640b7147dd /indra/llmessage | |
| parent | 3a3296f371508c4a31a37053242ee69a574f22f0 (diff) | |
| parent | cbaba2df56c66926e051d50b6cb02955c81c2a6c (diff) | |
Merge with master after latest Viewer release
Diffstat (limited to 'indra/llmessage')
| -rw-r--r-- | indra/llmessage/llblowfishcipher.cpp | 28 | 
1 files changed, 16 insertions, 12 deletions
| diff --git a/indra/llmessage/llblowfishcipher.cpp b/indra/llmessage/llblowfishcipher.cpp index 0b5025a422..949d4cc0c7 100644 --- a/indra/llmessage/llblowfishcipher.cpp +++ b/indra/llmessage/llblowfishcipher.cpp @@ -52,24 +52,28 @@ U32 LLBlowfishCipher::encrypt(const U8* src, U32 src_len, U8* dst, U32 dst_len)  	if (src_len > dst_len) return 0;  	// OpenSSL uses "cipher contexts" to hold encryption parameters. -    EVP_CIPHER_CTX context; -    EVP_CIPHER_CTX_init(&context); +    EVP_CIPHER_CTX *context = EVP_CIPHER_CTX_new(); +    if (!context) +    { +        LL_WARNS() << "LLBlowfishCipher::encrypt EVP_CIPHER_CTX initiation failure" << LL_ENDL; +        return 0; +    }  	// We want a blowfish cyclic block chain cipher, but need to set   	// the key length before we pass in a key, so call EncryptInit   	// first with NULLs. -	EVP_EncryptInit_ex(&context, EVP_bf_cbc(), NULL, NULL, NULL); -	EVP_CIPHER_CTX_set_key_length(&context, (int)mSecretSize); +	EVP_EncryptInit_ex(context, EVP_bf_cbc(), NULL, NULL, NULL); +	EVP_CIPHER_CTX_set_key_length(context, (int)mSecretSize);  	// Complete initialization.  Per EVP_EncryptInit man page, the  	// cipher pointer must be NULL.  Apparently initial_vector must  	// be 8 bytes for blowfish, as this is the block size.      unsigned char initial_vector[] = { 0, 0, 0, 0, 0, 0, 0, 0 }; -	EVP_EncryptInit_ex(&context, NULL, NULL, mSecret, initial_vector); +	EVP_EncryptInit_ex(context, NULL, NULL, mSecret, initial_vector); -    int blocksize = EVP_CIPHER_CTX_block_size(&context); -    int keylen = EVP_CIPHER_CTX_key_length(&context); -    int iv_length = EVP_CIPHER_CTX_iv_length(&context); +    int blocksize = EVP_CIPHER_CTX_block_size(context); +    int keylen = EVP_CIPHER_CTX_key_length(context); +    int iv_length = EVP_CIPHER_CTX_iv_length(context);      LL_DEBUGS() << "LLBlowfishCipher blocksize " << blocksize  		<< " keylen " << keylen  		<< " iv_len " << iv_length @@ -77,7 +81,7 @@ U32 LLBlowfishCipher::encrypt(const U8* src, U32 src_len, U8* dst, U32 dst_len)  	int output_len = 0;  	int temp_len = 0; -	if (!EVP_EncryptUpdate(&context, +	if (!EVP_EncryptUpdate(context,  			dst,  			&output_len,  			src, @@ -89,18 +93,18 @@ U32 LLBlowfishCipher::encrypt(const U8* src, U32 src_len, U8* dst, U32 dst_len)  	// There may be some final data left to encrypt if the input is  	// not an exact multiple of the block size. -	if (!EVP_EncryptFinal_ex(&context, (unsigned char*)(dst + output_len), &temp_len)) +	if (!EVP_EncryptFinal_ex(context, (unsigned char*)(dst + output_len), &temp_len))  	{  		LL_WARNS() << "LLBlowfishCipher::encrypt EVP_EncryptFinal failure" << LL_ENDL;  		goto ERROR;  	}  	output_len += temp_len; -	EVP_CIPHER_CTX_cleanup(&context); +	EVP_CIPHER_CTX_free(context);  	return output_len;  ERROR: -	EVP_CIPHER_CTX_cleanup(&context); +	EVP_CIPHER_CTX_free(context);  	return 0;  } | 
