This is an automated email from the ASF dual-hosted git repository. mseidel pushed a commit to branch AOO42X in repository https://gitbox.apache.org/repos/asf/openoffice.git
The following commit(s) were added to refs/heads/AOO42X by this push: new fc265111d3 Use OpenSSL ciphers as opaque pointer types, created with EVP_CIPHER_CTX_new() and freed with EVP_CIPHER_CTX_free(), so we are compatible with both OpenSSL 1.0.x and 1.1.x. fc265111d3 is described below commit fc265111d3f3e917624d1eb127ac39e26585fb80 Author: Damjan Jovanovic <dam...@apache.org> AuthorDate: Mon Aug 22 03:51:13 2022 +0200 Use OpenSSL ciphers as opaque pointer types, created with EVP_CIPHER_CTX_new() and freed with EVP_CIPHER_CTX_free(), so we are compatible with both OpenSSL 1.0.x and 1.1.x. Patch by: me (cherry picked from commit f884850fece86ece56c7194bb1e746641f77c0a0) --- main/oox/source/core/filterdetect.cxx | 42 ++++++++++++++++++++--------------- 1 file changed, 24 insertions(+), 18 deletions(-) diff --git a/main/oox/source/core/filterdetect.cxx b/main/oox/source/core/filterdetect.cxx index e5b98281e9..f36aea307a 100644 --- a/main/oox/source/core/filterdetect.cxx +++ b/main/oox/source/core/filterdetect.cxx @@ -356,25 +356,29 @@ bool lclCheckEncryptionData( const sal_uInt8* pnKey, sal_uInt32 nKeySize, const if ( nKeySize == 16 && nVerifierSize == 16 && nVerifierHashSize == 32 ) { // check password - EVP_CIPHER_CTX aes_ctx; - EVP_CIPHER_CTX_init( &aes_ctx ); - EVP_DecryptInit_ex( &aes_ctx, EVP_aes_128_ecb(), 0, pnKey, 0 ); - EVP_CIPHER_CTX_set_padding( &aes_ctx, 0 ); + EVP_CIPHER_CTX *aes_ctx; + aes_ctx = EVP_CIPHER_CTX_new(); + if ( aes_ctx == NULL ) + return false; + EVP_DecryptInit_ex( aes_ctx, EVP_aes_128_ecb(), 0, pnKey, 0 ); + EVP_CIPHER_CTX_set_padding( aes_ctx, 0 ); int nOutLen = 0; sal_uInt8 pnTmpVerifier[ 16 ]; (void) memset( pnTmpVerifier, 0, sizeof(pnTmpVerifier) ); - /*int*/ EVP_DecryptUpdate( &aes_ctx, pnTmpVerifier, &nOutLen, pnVerifier, nVerifierSize ); - EVP_CIPHER_CTX_cleanup( &aes_ctx ); + /*int*/ EVP_DecryptUpdate( aes_ctx, pnTmpVerifier, &nOutLen, pnVerifier, nVerifierSize ); + EVP_CIPHER_CTX_free( aes_ctx ); - EVP_CIPHER_CTX_init( &aes_ctx ); - EVP_DecryptInit_ex( &aes_ctx, EVP_aes_128_ecb(), 0, pnKey, 0 ); - EVP_CIPHER_CTX_set_padding( &aes_ctx, 0 ); + aes_ctx = EVP_CIPHER_CTX_new(); + if ( aes_ctx == NULL ) + return false; + EVP_DecryptInit_ex( aes_ctx, EVP_aes_128_ecb(), 0, pnKey, 0 ); + EVP_CIPHER_CTX_set_padding( aes_ctx, 0 ); sal_uInt8 pnTmpVerifierHash[ 32 ]; (void) memset( pnTmpVerifierHash, 0, sizeof(pnTmpVerifierHash) ); - /*int*/ EVP_DecryptUpdate( &aes_ctx, pnTmpVerifierHash, &nOutLen, pnVerifierHash, nVerifierHashSize ); - EVP_CIPHER_CTX_cleanup( &aes_ctx ); + /*int*/ EVP_DecryptUpdate( aes_ctx, pnTmpVerifierHash, &nOutLen, pnVerifierHash, nVerifierHashSize ); + EVP_CIPHER_CTX_free( aes_ctx ); rtlDigest aDigest = rtl_digest_create( rtl_Digest_AlgorithmSHA1 ); rtlDigestError aError = rtl_digest_update( aDigest, pnTmpVerifier, sizeof( pnTmpVerifier ) ); @@ -563,10 +567,12 @@ Reference< XInputStream > FilterDetect::extractUnencryptedPackage( MediaDescript BinaryXOutputStream aDecryptedPackage( xDecryptedPackage, true ); BinaryXInputStream aEncryptedPackage( xEncryptedPackage, true ); - EVP_CIPHER_CTX aes_ctx; - EVP_CIPHER_CTX_init( &aes_ctx ); - EVP_DecryptInit_ex( &aes_ctx, EVP_aes_128_ecb(), 0, aVerifier.getKey(), 0 ); - EVP_CIPHER_CTX_set_padding( &aes_ctx, 0 ); + EVP_CIPHER_CTX *aes_ctx; + aes_ctx = EVP_CIPHER_CTX_new(); + if ( aes_ctx == NULL ) + throw Exception(); + EVP_DecryptInit_ex( aes_ctx, EVP_aes_128_ecb(), 0, aVerifier.getKey(), 0 ); + EVP_CIPHER_CTX_set_padding( aes_ctx, 0 ); sal_uInt8 pnInBuffer[ 1024 ]; sal_uInt8 pnOutBuffer[ 1024 ]; @@ -575,13 +581,13 @@ Reference< XInputStream > FilterDetect::extractUnencryptedPackage( MediaDescript aEncryptedPackage.skip( 8 ); // decrypted size while( (nInLen = aEncryptedPackage.readMemory( pnInBuffer, sizeof( pnInBuffer ) )) > 0 ) { - EVP_DecryptUpdate( &aes_ctx, pnOutBuffer, &nOutLen, pnInBuffer, nInLen ); + EVP_DecryptUpdate( aes_ctx, pnOutBuffer, &nOutLen, pnInBuffer, nInLen ); aDecryptedPackage.writeMemory( pnOutBuffer, nOutLen ); } - EVP_DecryptFinal_ex( &aes_ctx, pnOutBuffer, &nOutLen ); + EVP_DecryptFinal_ex( aes_ctx, pnOutBuffer, &nOutLen ); aDecryptedPackage.writeMemory( pnOutBuffer, nOutLen ); - EVP_CIPHER_CTX_cleanup( &aes_ctx ); + EVP_CIPHER_CTX_free( aes_ctx ); xDecryptedPackage->flush(); aDecryptedPackage.seekToStart();