From c8cba8ae30baef6feca3b0613366d28df4a5e568 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Toma=C5=BE=20Vajngerl?= Date: Fri, 1 Nov 2024 12:48:10 +0100 Subject: [PATCH] move CryptTools from oox to comphelper so we can reuse it MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Also move the relevant tests and clean-up the names a bit to make it mroe consistent. Change-Id: I929ef9c13b954fd6a506471231d1bc41e4ef9980 Reviewed-on: https://gerrit.libreoffice.org/c/core/+/176027 Tested-by: Jenkins Reviewed-by: Tomaž Vajngerl --- comphelper/CppunitTest_comphelper_test.mk | 1 + comphelper/Library_comphelper.mk | 1 + comphelper/qa/unit/CryptoTest.cxx | 100 ++++++++ .../source/crypto/Crypto.cxx | 213 +++++++++++------- include/comphelper/crypto/Crypto.hxx | 99 ++++++++ include/oox/crypto/AgileEngine.hxx | 11 +- include/oox/crypto/CryptTools.hxx | 121 ---------- oox/Library_oox.mk | 1 - oox/qa/unit/CryptoTest.cxx | 60 +---- oox/source/crypto/AgileEngine.cxx | 50 ++-- oox/source/crypto/Standard2007Engine.cxx | 16 +- solenv/clang-format/excludelist | 2 - 12 files changed, 366 insertions(+), 309 deletions(-) create mode 100644 comphelper/qa/unit/CryptoTest.cxx rename oox/source/crypto/CryptTools.cxx => comphelper/source/crypto/Crypto.cxx (70%) create mode 100644 include/comphelper/crypto/Crypto.hxx delete mode 100644 include/oox/crypto/CryptTools.hxx diff --git a/comphelper/CppunitTest_comphelper_test.mk b/comphelper/CppunitTest_comphelper_test.mk index 17de701aca26..3fe7c53f746e 100644 --- a/comphelper/CppunitTest_comphelper_test.mk +++ b/comphelper/CppunitTest_comphelper_test.mk @@ -20,6 +20,7 @@ $(eval $(call gb_CppunitTest_add_exception_objects,comphelper_test, \ comphelper/qa/unit/types_test \ comphelper/qa/unit/test_guards \ comphelper/qa/unit/test_traceevent \ + comphelper/qa/unit/CryptoTest \ )) $(eval $(call gb_CppunitTest_use_ure,comphelper_test)) diff --git a/comphelper/Library_comphelper.mk b/comphelper/Library_comphelper.mk index 2ab1b1bfa5d7..159aaa65248d 100644 --- a/comphelper/Library_comphelper.mk +++ b/comphelper/Library_comphelper.mk @@ -75,6 +75,7 @@ $(eval $(call gb_Library_add_exception_objects,comphelper,\ comphelper/source/container/enumerablemap \ comphelper/source/container/enumhelper \ comphelper/source/container/namecontainer \ + comphelper/source/crypto/Crypto \ comphelper/source/eventattachermgr/eventattachermgr \ comphelper/source/misc/accessiblecomponenthelper \ comphelper/source/misc/accessibleeventnotifier \ diff --git a/comphelper/qa/unit/CryptoTest.cxx b/comphelper/qa/unit/CryptoTest.cxx new file mode 100644 index 000000000000..2b0dac47416f --- /dev/null +++ b/comphelper/qa/unit/CryptoTest.cxx @@ -0,0 +1,100 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + */ + +#include +#include +#include +#include + +#include + +#include +#include + +#if USE_TLS_NSS +#include +#endif + +class CryptoTest : public CppUnit::TestFixture +{ +public: + virtual void tearDown() + { +#if USE_TLS_NSS + NSS_Shutdown(); +#endif + } + + void testCryptoHash(); + void testRoundUp(); + + CPPUNIT_TEST_SUITE(CryptoTest); + CPPUNIT_TEST(testCryptoHash); + CPPUNIT_TEST(testRoundUp); + CPPUNIT_TEST_SUITE_END(); +}; + +void CryptoTest::testCryptoHash() +{ + // Check examples from Wikipedia (https://en.wikipedia.org/wiki/HMAC) + OString aContentString("The quick brown fox jumps over the lazy dog"_ostr); + std::vector aContent(aContentString.getStr(), + aContentString.getStr() + aContentString.getLength()); + std::vector aKey = { 'k', 'e', 'y' }; + { + comphelper::CryptoHash aCryptoHash(aKey, comphelper::CryptoHashType::SHA1); + aCryptoHash.update(aContent); + std::vector aHash = aCryptoHash.finalize(); + CPPUNIT_ASSERT_EQUAL(std::string("de7c9b85b8b78aa6bc8a7a36f70a90701c9db4d9"), + comphelper::hashToString(aHash)); + } + + { + comphelper::CryptoHash aCryptoHash(aKey, comphelper::CryptoHashType::SHA256); + aCryptoHash.update(aContent); + std::vector aHash = aCryptoHash.finalize(); + CPPUNIT_ASSERT_EQUAL( + std::string("f7bc83f430538424b13298e6aa6fb143ef4d59a14946175997479dbc2d1a3cd8"), + comphelper::hashToString(aHash)); + } + + { + comphelper::CryptoHash aCryptoHash(aKey, comphelper::CryptoHashType::SHA384); + aCryptoHash.update(aContent); + std::vector aHash = aCryptoHash.finalize(); + CPPUNIT_ASSERT_EQUAL(std::string("d7f4727e2c0b39ae0f1e40cc96f60242d5b7801841cea6fc592c5d3e1" + "ae50700582a96cf35e1e554995fe4e03381c237"), + comphelper::hashToString(aHash)); + } + + { + comphelper::CryptoHash aCryptoHash(aKey, comphelper::CryptoHashType::SHA512); + aCryptoHash.update(aContent); + std::vector aHash = aCryptoHash.finalize(); + CPPUNIT_ASSERT_EQUAL( + std::string("b42af09057bac1e2d41708e48a902e09b5ff7f12ab428a4fe86653c73dd248fb82f948a549" + "f7b791a5b41915ee4d1ec3935357e4e2317250d0372afa2ebeeb3a"), + comphelper::hashToString(aHash)); + } +} + +void CryptoTest::testRoundUp() +{ + CPPUNIT_ASSERT_EQUAL(16, comphelper::roundUp(16, 16)); + CPPUNIT_ASSERT_EQUAL(32, comphelper::roundUp(32, 16)); + CPPUNIT_ASSERT_EQUAL(64, comphelper::roundUp(64, 16)); + + CPPUNIT_ASSERT_EQUAL(16, comphelper::roundUp(01, 16)); + CPPUNIT_ASSERT_EQUAL(32, comphelper::roundUp(17, 16)); + CPPUNIT_ASSERT_EQUAL(32, comphelper::roundUp(31, 16)); +} + +CPPUNIT_TEST_SUITE_REGISTRATION(CryptoTest); + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/oox/source/crypto/CryptTools.cxx b/comphelper/source/crypto/Crypto.cxx similarity index 70% rename from oox/source/crypto/CryptTools.cxx rename to comphelper/source/crypto/Crypto.cxx index 32aefab57fac..a9f8b63a635d 100644 --- a/oox/source/crypto/CryptTools.cxx +++ b/comphelper/source/crypto/Crypto.cxx @@ -8,7 +8,7 @@ * */ -#include +#include #include #include @@ -26,20 +26,20 @@ #include #endif // USE_TLS_NSS -namespace oox::crypto { - +namespace comphelper +{ #if USE_TLS_OPENSSL #if (OPENSSL_VERSION_NUMBER < 0x10100000L) -static HMAC_CTX *HMAC_CTX_new(void) +static HMAC_CTX* HMAC_CTX_new(void) { - HMAC_CTX *pContext = new HMAC_CTX; - HMAC_CTX_init(pContext); - return pContext; + HMAC_CTX* pContext = new HMAC_CTX; + HMAC_CTX_init(pContext); + return pContext; } -static void HMAC_CTX_free(HMAC_CTX *pContext) +static void HMAC_CTX_free(HMAC_CTX* pContext) { HMAC_CTX_cleanup(pContext); delete pContext; @@ -48,17 +48,21 @@ static void HMAC_CTX_free(HMAC_CTX *pContext) namespace { - struct cipher_delete - { - void operator()(EVP_CIPHER_CTX* p) { EVP_CIPHER_CTX_free(p); } - }; +struct cipher_delete +{ + void operator()(EVP_CIPHER_CTX* p) { EVP_CIPHER_CTX_free(p); } +}; - struct hmac_delete +struct hmac_delete +{ + SAL_WNODEPRECATED_DECLARATIONS_PUSH // 'HMAC_CTX_free' is deprecated + void + operator()(HMAC_CTX* p) { -SAL_WNODEPRECATED_DECLARATIONS_PUSH // 'HMAC_CTX_free' is deprecated - void operator()(HMAC_CTX* p) { HMAC_CTX_free(p); } -SAL_WNODEPRECATED_DECLARATIONS_POP - }; + HMAC_CTX_free(p); + } + SAL_WNODEPRECATED_DECLARATIONS_POP +}; } struct CryptoImpl @@ -68,7 +72,8 @@ struct CryptoImpl CryptoImpl() = default; - void setupEncryptContext(std::vector& key, std::vector& iv, Crypto::CryptoType eType) + void setupEncryptContext(std::vector& key, std::vector& iv, + Crypto::CryptoType eType) { mpContext.reset(EVP_CIPHER_CTX_new()); EVP_CIPHER_CTX_init(mpContext.get()); @@ -84,7 +89,8 @@ struct CryptoImpl EVP_CIPHER_CTX_set_padding(mpContext.get(), 0); } - void setupDecryptContext(std::vector& key, std::vector& iv, Crypto::CryptoType eType) + void setupDecryptContext(std::vector& key, std::vector& iv, + Crypto::CryptoType eType) { mpContext.reset(EVP_CIPHER_CTX_new()); EVP_CIPHER_CTX_init(mpContext.get()); @@ -112,24 +118,28 @@ struct CryptoImpl void setupCryptoHashContext(std::vector& rKey, CryptoHashType eType) { -SAL_WNODEPRECATED_DECLARATIONS_PUSH // 'HMAC_CTX_new' is deprecated - mpHmacContext.reset(HMAC_CTX_new()); -SAL_WNODEPRECATED_DECLARATIONS_POP + SAL_WNODEPRECATED_DECLARATIONS_PUSH // 'HMAC_CTX_new' is deprecated + mpHmacContext.reset(HMAC_CTX_new()); + SAL_WNODEPRECATED_DECLARATIONS_POP const EVP_MD* aEvpMd = nullptr; switch (eType) { case CryptoHashType::SHA1: - aEvpMd = EVP_sha1(); break; + aEvpMd = EVP_sha1(); + break; case CryptoHashType::SHA256: - aEvpMd = EVP_sha256(); break; + aEvpMd = EVP_sha256(); + break; case CryptoHashType::SHA384: - aEvpMd = EVP_sha384(); break; + aEvpMd = EVP_sha384(); + break; case CryptoHashType::SHA512: - aEvpMd = EVP_sha512(); break; + aEvpMd = EVP_sha512(); + break; } -SAL_WNODEPRECATED_DECLARATIONS_PUSH // 'HMAC_Init_ex' is deprecated - HMAC_Init_ex(mpHmacContext.get(), rKey.data(), rKey.size(), aEvpMd, nullptr); -SAL_WNODEPRECATED_DECLARATIONS_POP + SAL_WNODEPRECATED_DECLARATIONS_PUSH // 'HMAC_Init_ex' is deprecated + HMAC_Init_ex(mpHmacContext.get(), rKey.data(), rKey.size(), aEvpMd, nullptr); + SAL_WNODEPRECATED_DECLARATIONS_POP } ~CryptoImpl() @@ -140,7 +150,7 @@ SAL_WNODEPRECATED_DECLARATIONS_POP static const EVP_CIPHER* getCipher(Crypto::CryptoType type) { - switch(type) + switch (type) { case Crypto::CryptoType::AES_128_ECB: return EVP_aes_128_ecb(); @@ -163,10 +173,10 @@ struct CryptoImpl { PK11SlotInfo* mSlot; PK11Context* mContext; - SECItem* mSecParam; - PK11SymKey* mSymKey; + SECItem* mSecParam; + PK11SymKey* mSymKey; PK11Context* mWrapKeyContext; - PK11SymKey* mWrapKey; + PK11SymKey* mWrapKey; CryptoImpl() : mSlot(nullptr) @@ -184,7 +194,10 @@ struct CryptoImpl { PRErrorCode error = PR_GetError(); const char* errorText = PR_ErrorToName(error); - throw css::uno::RuntimeException("NSS_NoDB_Init failed with " + OUString(errorText, strlen(errorText), RTL_TEXTENCODING_UTF8) + " (" + OUString::number(static_cast(error)) + ")"); + throw css::uno::RuntimeException( + "NSS_NoDB_Init failed with " + + OUString(errorText, strlen(errorText), RTL_TEXTENCODING_UTF8) + " (" + + OUString::number(static_cast(error)) + ")"); } } } @@ -227,7 +240,8 @@ struct CryptoImpl int wrap_key_len = PK11_GetBestKeyLength(mSlot, wrap_mechanism); mWrapKey = PK11_KeyGen(mSlot, wrap_mechanism, nullptr, wrap_key_len, nullptr); if (!mWrapKey) - throw css::uno::RuntimeException(u"PK11_KeyGen SymKey failure"_ustr, css::uno::Reference()); + throw css::uno::RuntimeException(u"PK11_KeyGen SymKey failure"_ustr, + css::uno::Reference()); /* * Encrypt authkey with wrapping key @@ -237,21 +251,26 @@ struct CryptoImpl * Initialization of IV is not needed because PK11_GetBestWrapMechanism should return ECB mode */ SECItem tmp_sec_item = {}; - mWrapKeyContext = PK11_CreateContextBySymKey(wrap_mechanism, CKA_ENCRYPT, mWrapKey, &tmp_sec_item); + mWrapKeyContext + = PK11_CreateContextBySymKey(wrap_mechanism, CKA_ENCRYPT, mWrapKey, &tmp_sec_item); if (!mWrapKeyContext) - throw css::uno::RuntimeException(u"PK11_CreateContextBySymKey failure"_ustr, css::uno::Reference()); + throw css::uno::RuntimeException(u"PK11_CreateContextBySymKey failure"_ustr, + css::uno::Reference()); unsigned char wrapped_key_data[MAX_WRAPPED_KEY_LEN]; int wrapped_key_len = sizeof(wrapped_key_data); if (PK11_CipherOp(mWrapKeyContext, wrapped_key_data, &wrapped_key_len, - sizeof(wrapped_key_data), key->data, key->len) != SECSuccess) + sizeof(wrapped_key_data), key->data, key->len) + != SECSuccess) { - throw css::uno::RuntimeException(u"PK11_CipherOp failure"_ustr, css::uno::Reference()); + throw css::uno::RuntimeException(u"PK11_CipherOp failure"_ustr, + css::uno::Reference()); } if (PK11_Finalize(mWrapKeyContext) != SECSuccess) - throw css::uno::RuntimeException(u"PK11_Finalize failure"_ustr, css::uno::Reference()); + throw css::uno::RuntimeException(u"PK11_Finalize failure"_ustr, + css::uno::Reference()); /* * Finally unwrap sym key @@ -261,28 +280,31 @@ struct CryptoImpl wrapped_key.len = wrapped_key_len; mSymKey = PK11_UnwrapSymKey(mWrapKey, wrap_mechanism, &tmp_sec_item, &wrapped_key, - mechanism, operation, key->len); + mechanism, operation, key->len); } return mSymKey; } - void setupEncryptContext(std::vector& key, std::vector& iv, Crypto::CryptoType type) + void setupEncryptContext(std::vector& key, std::vector& iv, + CryptoType type) { setupCryptoContext(key, iv, type, CKA_ENCRYPT); } - void setupDecryptContext(std::vector& key, std::vector& iv, Crypto::CryptoType type) + void setupDecryptContext(std::vector& key, std::vector& iv, + CryptoType type) { setupCryptoContext(key, iv, type, CKA_DECRYPT); } - void setupCryptoContext(std::vector& key, std::vector& iv, Crypto::CryptoType type, CK_ATTRIBUTE_TYPE operation) + void setupCryptoContext(std::vector& key, std::vector& iv, + CryptoType type, CK_ATTRIBUTE_TYPE operation) { CK_MECHANISM_TYPE mechanism = static_cast(-1); SECItem ivItem; ivItem.type = siBuffer; - if(iv.empty()) + if (iv.empty()) ivItem.data = nullptr; else ivItem.data = iv.data(); @@ -290,13 +312,16 @@ struct CryptoImpl SECItem* pIvItem = nullptr; - switch(type) + switch (type) { - case Crypto::CryptoType::AES_128_ECB: + case CryptoType::AES_128_ECB: mechanism = CKM_AES_ECB; break; - case Crypto::CryptoType::AES_128_CBC: - case Crypto::CryptoType::AES_256_CBC: + case CryptoType::AES_128_CBC: + mechanism = CKM_AES_CBC; + pIvItem = &ivItem; + break; + case CryptoType::AES_256_CBC: mechanism = CKM_AES_CBC; pIvItem = &ivItem; break; @@ -307,16 +332,18 @@ struct CryptoImpl mSlot = PK11_GetBestSlot(mechanism, nullptr); if (!mSlot) - throw css::uno::RuntimeException(u"NSS Slot failure"_ustr, css::uno::Reference()); + throw css::uno::RuntimeException(u"NSS Slot failure"_ustr, + css::uno::Reference()); SECItem keyItem; keyItem.type = siBuffer; keyItem.data = key.data(); - keyItem.len = key.size(); + keyItem.len = key.size(); mSymKey = ImportSymKey(mechanism, CKA_ENCRYPT, &keyItem); if (!mSymKey) - throw css::uno::RuntimeException(u"NSS SymKey failure"_ustr, css::uno::Reference()); + throw css::uno::RuntimeException(u"NSS SymKey failure"_ustr, + css::uno::Reference()); mSecParam = PK11_ParamFromIV(mechanism, pIvItem); mContext = PK11_CreateContextBySymKey(mechanism, operation, mSymKey, mSecParam); @@ -326,7 +353,7 @@ struct CryptoImpl { CK_MECHANISM_TYPE aMechanism = static_cast(-1); - switch(eType) + switch (eType) { case CryptoHashType::SHA1: aMechanism = CKM_SHA_1_HMAC; @@ -345,15 +372,17 @@ struct CryptoImpl mSlot = PK11_GetBestSlot(aMechanism, nullptr); if (!mSlot) - throw css::uno::RuntimeException(u"NSS Slot failure"_ustr, css::uno::Reference()); + throw css::uno::RuntimeException(u"NSS Slot failure"_ustr, + css::uno::Reference()); SECItem aKeyItem; aKeyItem.data = rKey.data(); - aKeyItem.len = rKey.size(); + aKeyItem.len = rKey.size(); mSymKey = ImportSymKey(aMechanism, CKA_SIGN, &aKeyItem); if (!mSymKey) - throw css::uno::RuntimeException(u"NSS SymKey failure"_ustr, css::uno::Reference()); + throw css::uno::RuntimeException(u"NSS SymKey failure"_ustr, + css::uno::Reference()); SECItem param; param.data = nullptr; @@ -363,7 +392,8 @@ struct CryptoImpl }; #else struct CryptoImpl -{}; +{ +}; #endif Crypto::Crypto() @@ -371,9 +401,7 @@ Crypto::Crypto() { } -Crypto::~Crypto() -{ -} +Crypto::~Crypto() {} // DECRYPT @@ -388,12 +416,14 @@ Decrypt::Decrypt(std::vector& key, std::vector& iv, Crypto #endif } -sal_uInt32 Decrypt::update(std::vector& output, std::vector& input, sal_uInt32 inputLength) +sal_uInt32 Decrypt::update(std::vector& output, std::vector& input, + sal_uInt32 inputLength) { int outputLength = 0; #if USE_TLS_OPENSSL + USE_TLS_NSS > 0 - sal_uInt32 actualInputLength = inputLength == 0 || inputLength > input.size() ? input.size() : inputLength; + sal_uInt32 actualInputLength + = inputLength == 0 || inputLength > input.size() ? input.size() : inputLength; #else (void)output; (void)input; @@ -401,23 +431,26 @@ sal_uInt32 Decrypt::update(std::vector& output, std::vectormpContext.get(), output.data(), &outputLength, input.data(), actualInputLength); + (void)EVP_DecryptUpdate(mpImpl->mpContext.get(), output.data(), &outputLength, input.data(), + actualInputLength); #endif // USE_TLS_OPENSSL #if USE_TLS_NSS if (!mpImpl->mContext) return 0; - (void)PK11_CipherOp(mpImpl->mContext, output.data(), &outputLength, actualInputLength, input.data(), actualInputLength); + (void)PK11_CipherOp(mpImpl->mContext, output.data(), &outputLength, actualInputLength, + input.data(), actualInputLength); #endif // USE_TLS_NSS return static_cast(outputLength); } -sal_uInt32 Decrypt::aes128ecb(std::vector& output, std::vector& input, std::vector& key) +sal_uInt32 Decrypt::aes128ecb(std::vector& output, std::vector& input, + std::vector& key) { sal_uInt32 outputLength = 0; std::vector iv; - Decrypt crypto(key, iv, Crypto::AES_128_ECB); + Decrypt crypto(key, iv, CryptoType::AES_128_ECB); outputLength = crypto.update(output, input); return outputLength; } @@ -435,12 +468,14 @@ Encrypt::Encrypt(std::vector& key, std::vector& iv, Crypto #endif } -sal_uInt32 Encrypt::update(std::vector& output, std::vector& input, sal_uInt32 inputLength) +sal_uInt32 Encrypt::update(std::vector& output, std::vector& input, + sal_uInt32 inputLength) { int outputLength = 0; #if USE_TLS_OPENSSL + USE_TLS_NSS > 0 - sal_uInt32 actualInputLength = inputLength == 0 || inputLength > input.size() ? input.size() : inputLength; + sal_uInt32 actualInputLength + = inputLength == 0 || inputLength > input.size() ? input.size() : inputLength; #else (void)output; (void)input; @@ -448,11 +483,13 @@ sal_uInt32 Encrypt::update(std::vector& output, std::vectormpContext.get(), output.data(), &outputLength, input.data(), actualInputLength); + (void)EVP_EncryptUpdate(mpImpl->mpContext.get(), output.data(), &outputLength, input.data(), + actualInputLength); #endif // USE_TLS_OPENSSL #if USE_TLS_NSS - (void)PK11_CipherOp(mpImpl->mContext, output.data(), &outputLength, actualInputLength, input.data(), actualInputLength); + (void)PK11_CipherOp(mpImpl->mContext, output.data(), &outputLength, actualInputLength, + input.data(), actualInputLength); #endif // USE_TLS_NSS return static_cast(outputLength); @@ -462,15 +499,18 @@ sal_uInt32 Encrypt::update(std::vector& output, std::vector& rKey, CryptoHashType eType) bool CryptoHash::update(std::vector& rInput, sal_uInt32 nInputLength) { #if USE_TLS_OPENSSL + USE_TLS_NSS > 0 - sal_uInt32 nActualInputLength = (nInputLength == 0 || nInputLength > rInput.size()) ? rInput.size() : nInputLength; + sal_uInt32 nActualInputLength + = (nInputLength == 0 || nInputLength > rInput.size()) ? rInput.size() : nInputLength; #else (void)rInput; (void)nInputLength; #endif #if USE_TLS_OPENSSL -SAL_WNODEPRECATED_DECLARATIONS_PUSH // 'HMAC_Update' is deprecated - return HMAC_Update(mpImpl->mpHmacContext.get(), rInput.data(), nActualInputLength) != 0; -SAL_WNODEPRECATED_DECLARATIONS_POP + SAL_WNODEPRECATED_DECLARATIONS_PUSH // 'HMAC_Update' is deprecated + return HMAC_Update(mpImpl->mpHmacContext.get(), rInput.data(), nActualInputLength) + != 0; + SAL_WNODEPRECATED_DECLARATIONS_POP #elif USE_TLS_NSS return PK11_DigestOp(mpImpl->mContext, rInput.data(), nActualInputLength) == SECSuccess; #else @@ -515,19 +557,18 @@ SAL_WNODEPRECATED_DECLARATIONS_POP std::vector CryptoHash::finalize() { std::vector aHash(mnHashSize, 0); - unsigned int nSizeWritten; #if USE_TLS_OPENSSL -SAL_WNODEPRECATED_DECLARATIONS_PUSH // 'HMAC_Final' is deprecated - (void) HMAC_Final(mpImpl->mpHmacContext.get(), aHash.data(), &nSizeWritten); -SAL_WNODEPRECATED_DECLARATIONS_POP + unsigned int nSizeWritten = 0; + SAL_WNODEPRECATED_DECLARATIONS_PUSH // 'HMAC_Final' is deprecated + (void) HMAC_Final(mpImpl->mpHmacContext.get(), aHash.data(), &nSizeWritten); + SAL_WNODEPRECATED_DECLARATIONS_POP #elif USE_TLS_NSS + unsigned int nSizeWritten = 0; PK11_DigestFinal(mpImpl->mContext, aHash.data(), &nSizeWritten, aHash.size()); #endif - (void)nSizeWritten; - return aHash; } -} // namespace oox::crypto +} // namespace comphelper /* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/include/comphelper/crypto/Crypto.hxx b/include/comphelper/crypto/Crypto.hxx new file mode 100644 index 000000000000..aba89642652a --- /dev/null +++ b/include/comphelper/crypto/Crypto.hxx @@ -0,0 +1,99 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + */ + +#pragma once + +#include +#include + +#include +#include + +namespace comphelper +{ +/** Rounds up the input to the nearest multiple + * + * For example: + * input 1, multiple 16 = 16 + * input 16, multiple 16 = 16 + * input 17, multiple 16 = 32 + * input 31, multiple 16 = 32 + */ +template T roundUp(T input, T multiple) +{ + if (input % multiple == 0) + return input; + return ((input / multiple) * multiple) + multiple; +} + +enum class CryptoHashType +{ + SHA1, + SHA256, + SHA384, + SHA512 +}; + +enum class CryptoType +{ + UNKNOWN, + AES_128_ECB, + AES_128_CBC, + AES_256_CBC, +}; + +struct CryptoImpl; + +class COMPHELPER_DLLPUBLIC Crypto +{ +protected: + std::unique_ptr mpImpl; + +protected: + Crypto(); + +public: + virtual ~Crypto(); +}; + +class COMPHELPER_DLLPUBLIC Decrypt final : public Crypto +{ +public: + Decrypt(std::vector& key, std::vector& iv, CryptoType type); + + sal_uInt32 update(std::vector& output, std::vector& input, + sal_uInt32 inputLength = 0); + + static sal_uInt32 aes128ecb(std::vector& output, std::vector& input, + std::vector& key); +}; + +class COMPHELPER_DLLPUBLIC Encrypt final : public Crypto +{ +public: + Encrypt(std::vector& key, std::vector& iv, CryptoType type); + + sal_uInt32 update(std::vector& output, std::vector& input, + sal_uInt32 inputLength = 0); +}; + +class COMPHELPER_DLLPUBLIC CryptoHash final : public Crypto +{ + sal_Int32 mnHashSize; + +public: + CryptoHash(std::vector& rKey, CryptoHashType eType); + bool update(std::vector& rInput, sal_uInt32 nInputLength = 0); + std::vector finalize(); +}; + +} // namespace comphelper + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/include/oox/crypto/AgileEngine.hxx b/include/oox/crypto/AgileEngine.hxx index 07ce3cb5eeb1..bccb30eaef3e 100644 --- a/include/oox/crypto/AgileEngine.hxx +++ b/include/oox/crypto/AgileEngine.hxx @@ -8,16 +8,15 @@ * */ -#ifndef INCLUDED_OOX_CRYPTO_AGILEENGINE_HXX -#define INCLUDED_OOX_CRYPTO_AGILEENGINE_HXX +#pragma once #include #include -#include #include #include #include +#include namespace oox { class BinaryXInputStream; @@ -94,7 +93,7 @@ private: std::vector& rInput, std::vector& rOutput); - static Crypto::CryptoType cryptoType(const AgileEncryptionInfo& rInfo); + static comphelper::CryptoType cryptoType(const AgileEncryptionInfo& rInfo); public: AgileEngine(); @@ -141,8 +140,6 @@ public: bool setupEncryptionKey(OUString const & rPassword); }; -} // namespace oox::crypto - -#endif +} // namespace comphelper::crypto /* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/include/oox/crypto/CryptTools.hxx b/include/oox/crypto/CryptTools.hxx deleted file mode 100644 index 10382b979380..000000000000 --- a/include/oox/crypto/CryptTools.hxx +++ /dev/null @@ -1,121 +0,0 @@ -/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ -/* - * This file is part of the LibreOffice project. - * - * This Source Code Form is subject to the terms of the Mozilla Public - * License, v. 2.0. If a copy of the MPL was not distributed with this - * file, You can obtain one at http://mozilla.org/MPL/2.0/. - * - * This file incorporates work covered by the following license notice: - * - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed - * with this work for additional information regarding copyright - * ownership. The ASF licenses this file to you under the Apache - * License, Version 2.0 (the "License"); you may not use this file - * except in compliance with the License. You may obtain a copy of - * the License at http://www.apache.org/licenses/LICENSE-2.0 . - */ - -#ifndef INCLUDED_OOX_CRYPTO_CRYPTTOOLS_HXX -#define INCLUDED_OOX_CRYPTO_CRYPTTOOLS_HXX - -#include -#include - -#include -#include - -namespace oox::crypto { - -/** Rounds up the input to the nearest multiple - * - * For example: - * input 1, multiple 16 = 16 - * input 16, multiple 16 = 16 - * input 17, multiple 16 = 32 - * input 31, multiple 16 = 32 - */ -template -T roundUp(T input, T multiple) -{ - if (input % multiple == 0) - return input; - return ((input / multiple) * multiple) + multiple; -} - -enum class CryptoHashType -{ - SHA1, - SHA256, - SHA384, - SHA512 -}; - -struct CryptoImpl; - -class OOX_DLLPUBLIC Crypto -{ -public: - enum CryptoType - { - UNKNOWN, - AES_128_ECB, - AES_128_CBC, - AES_256_CBC, - }; - -protected: - std::unique_ptr mpImpl; - -protected: - Crypto(); - -public: - virtual ~Crypto(); -}; - -class Decrypt final : public Crypto -{ -public: - Decrypt(std::vector& key, std::vector& iv, CryptoType type); - - sal_uInt32 update( - std::vector& output, - std::vector& input, - sal_uInt32 inputLength = 0); - - - static sal_uInt32 aes128ecb( - std::vector& output, - std::vector& input, - std::vector& key ); - -}; - -class Encrypt final : public Crypto -{ -public: - Encrypt(std::vector& key, std::vector& iv, CryptoType type); - - sal_uInt32 update( - std::vector& output, - std::vector& input, - sal_uInt32 inputLength = 0); -}; - -class OOX_DLLPUBLIC CryptoHash final : public Crypto -{ - sal_Int32 mnHashSize; -public: - CryptoHash(std::vector& rKey, CryptoHashType eType); - bool update(std::vector& rInput, sal_uInt32 nInputLength = 0); - std::vector finalize(); -}; - - -} // namespace oox::crypto - -#endif - -/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/oox/Library_oox.mk b/oox/Library_oox.mk index 7330fcc8995d..df8e484f7303 100644 --- a/oox/Library_oox.mk +++ b/oox/Library_oox.mk @@ -139,7 +139,6 @@ $(eval $(call gb_Library_add_exception_objects,oox,\ oox/source/core/relationshandler \ oox/source/core/xmlfilterbase \ oox/source/crypto/AgileEngine \ - oox/source/crypto/CryptTools \ oox/source/crypto/DocumentEncryption \ oox/source/crypto/DocumentDecryption \ oox/source/crypto/Standard2007Engine \ diff --git a/oox/qa/unit/CryptoTest.cxx b/oox/qa/unit/CryptoTest.cxx index 60938962fa72..88e71173a00d 100644 --- a/oox/qa/unit/CryptoTest.cxx +++ b/oox/qa/unit/CryptoTest.cxx @@ -31,8 +31,7 @@ class CryptoTest : public CppUnit::TestFixture { public: virtual ~CryptoTest() override; - void testCryptoHash(); - void testRoundUp(); + void testStandard2007(); void testAgileEncryptionVerifier(); void testAgileEncryptionInfoWritingAndParsing(); @@ -40,8 +39,6 @@ public: void testAgileEncryptingAndDecrypting(); CPPUNIT_TEST_SUITE(CryptoTest); - CPPUNIT_TEST(testCryptoHash); - CPPUNIT_TEST(testRoundUp); CPPUNIT_TEST(testStandard2007); CPPUNIT_TEST(testAgileEncryptionVerifier); CPPUNIT_TEST(testAgileEncryptionInfoWritingAndParsing); @@ -71,61 +68,6 @@ CryptoTest::~CryptoTest() #endif } -void CryptoTest::testCryptoHash() -{ - // Check examples from Wikipedia (https://en.wikipedia.org/wiki/HMAC) - OString aContentString("The quick brown fox jumps over the lazy dog"_ostr); - std::vector aContent(aContentString.getStr(), - aContentString.getStr() + aContentString.getLength()); - std::vector aKey = { 'k', 'e', 'y' }; - { - oox::crypto::CryptoHash aCryptoHash(aKey, oox::crypto::CryptoHashType::SHA1); - aCryptoHash.update(aContent); - std::vector aHash = aCryptoHash.finalize(); - CPPUNIT_ASSERT_EQUAL(std::string("de7c9b85b8b78aa6bc8a7a36f70a90701c9db4d9"), - toString(aHash)); - } - - { - oox::crypto::CryptoHash aCryptoHash(aKey, oox::crypto::CryptoHashType::SHA256); - aCryptoHash.update(aContent); - std::vector aHash = aCryptoHash.finalize(); - CPPUNIT_ASSERT_EQUAL( - std::string("f7bc83f430538424b13298e6aa6fb143ef4d59a14946175997479dbc2d1a3cd8"), - toString(aHash)); - } - - { - oox::crypto::CryptoHash aCryptoHash(aKey, oox::crypto::CryptoHashType::SHA384); - aCryptoHash.update(aContent); - std::vector aHash = aCryptoHash.finalize(); - CPPUNIT_ASSERT_EQUAL(std::string("d7f4727e2c0b39ae0f1e40cc96f60242d5b7801841cea6fc592c5d3e1" - "ae50700582a96cf35e1e554995fe4e03381c237"), - toString(aHash)); - } - - { - oox::crypto::CryptoHash aCryptoHash(aKey, oox::crypto::CryptoHashType::SHA512); - aCryptoHash.update(aContent); - std::vector aHash = aCryptoHash.finalize(); - CPPUNIT_ASSERT_EQUAL( - std::string("b42af09057bac1e2d41708e48a902e09b5ff7f12ab428a4fe86653c73dd248fb82f948a549" - "f7b791a5b41915ee4d1ec3935357e4e2317250d0372afa2ebeeb3a"), - toString(aHash)); - } -} - -void CryptoTest::testRoundUp() -{ - CPPUNIT_ASSERT_EQUAL(16, oox::crypto::roundUp(16, 16)); - CPPUNIT_ASSERT_EQUAL(32, oox::crypto::roundUp(32, 16)); - CPPUNIT_ASSERT_EQUAL(64, oox::crypto::roundUp(64, 16)); - - CPPUNIT_ASSERT_EQUAL(16, oox::crypto::roundUp(01, 16)); - CPPUNIT_ASSERT_EQUAL(32, oox::crypto::roundUp(17, 16)); - CPPUNIT_ASSERT_EQUAL(32, oox::crypto::roundUp(31, 16)); -} - void CryptoTest::testStandard2007() { oox::crypto::Standard2007Engine aEngine; diff --git a/oox/source/crypto/AgileEngine.cxx b/oox/source/crypto/AgileEngine.cxx index 1f164aa6ab42..6b552620f24d 100644 --- a/oox/source/crypto/AgileEngine.cxx +++ b/oox/source/crypto/AgileEngine.cxx @@ -218,14 +218,14 @@ bool hashCalc(std::vector& output, return false; } -CryptoHashType cryptoHashTypeFromString(std::u16string_view sAlgorithm) +comphelper::CryptoHashType cryptoHashTypeFromString(std::u16string_view sAlgorithm) { if (sAlgorithm == u"SHA512") - return CryptoHashType::SHA512; + return comphelper::CryptoHashType::SHA512; else if (sAlgorithm == u"SHA384") - return CryptoHashType::SHA384; + return comphelper::CryptoHashType::SHA384; else - return CryptoHashType::SHA1; + return comphelper::CryptoHashType::SHA1; } } // namespace @@ -234,13 +234,13 @@ AgileEngine::AgileEngine() : meEncryptionPreset(AgileEncryptionPreset::AES_256_SHA512) {} -Crypto::CryptoType AgileEngine::cryptoType(const AgileEncryptionInfo& rInfo) +comphelper::CryptoType AgileEngine::cryptoType(const AgileEncryptionInfo& rInfo) { if (rInfo.keyBits == 128 && rInfo.cipherAlgorithm == "AES" && rInfo.cipherChaining == "ChainingModeCBC") - return Crypto::AES_128_CBC; + return comphelper::CryptoType::AES_128_CBC; else if (rInfo.keyBits == 256 && rInfo.cipherAlgorithm == "AES" && rInfo.cipherChaining == "ChainingModeCBC") - return Crypto::AES_256_CBC; - return Crypto::UNKNOWN; + return comphelper::CryptoType::AES_256_CBC; + return comphelper::CryptoType::UNKNOWN; } static std::vector calculateIV(comphelper::HashType eType, @@ -252,7 +252,7 @@ static std::vector calculateIV(comphelper::HashType eType, aHasher.update(rSalt.data(), rSalt.size()); aHasher.update(rBlock.data(), rBlock.size()); std::vector aIV = aHasher.finalize(); - aIV.resize(roundUp(sal_Int32(aIV.size()), nCipherBlockSize), 0x36); + aIV.resize(comphelper::roundUp(sal_Int32(aIV.size()), nCipherBlockSize), 0x36); return aIV; } @@ -274,7 +274,7 @@ void AgileEngine::calculateBlock( std::copy(hash.begin(), hash.begin() + keySize, key.begin()); - Decrypt aDecryptor(key, mInfo.saltValue, cryptoType(mInfo)); + comphelper::Decrypt aDecryptor(key, mInfo.saltValue, cryptoType(mInfo)); aDecryptor.update(rOutput, rInput); } @@ -296,7 +296,7 @@ void AgileEngine::encryptBlock( std::copy(hash.begin(), hash.begin() + keySize, key.begin()); - Encrypt aEncryptor(key, mInfo.saltValue, cryptoType(mInfo)); + comphelper::Encrypt aEncryptor(key, mInfo.saltValue, cryptoType(mInfo)); aEncryptor.update(rOutput, rInput); } @@ -338,7 +338,7 @@ bool AgileEngine::decryptAndCheckVerifierHash(OUString const & rPassword) std::vector& encryptedHashInput = mInfo.encryptedVerifierHashInput; // SALT - needs to be a multiple of block size (?) - sal_uInt32 nSaltSize = roundUp(mInfo.saltSize, mInfo.blockSize); + sal_uInt32 nSaltSize = comphelper::roundUp(mInfo.saltSize, mInfo.blockSize); if (nSaltSize < encryptedHashInput.size()) return false; std::vector hashInput(nSaltSize, 0); @@ -400,7 +400,7 @@ bool AgileEngine::decryptHmacKey() std::vector iv = calculateIV(eType, mInfo.keyDataSalt, constBlockHmac1, mInfo.blockSize); // Decrypt without key, calculated iv - Decrypt aDecrypt(mKey, iv, cryptoType(mInfo)); + comphelper::Decrypt aDecrypt(mKey, iv, cryptoType(mInfo)); aDecrypt.update(mInfo.hmacKey, mInfo.hmacEncryptedKey); mInfo.hmacKey.resize(mInfo.hashSize, 0); @@ -427,7 +427,7 @@ bool AgileEngine::decryptHmacValue() std::vector iv = calculateIV(eType, mInfo.keyDataSalt, constBlockHmac2, mInfo.blockSize); // Decrypt without key, calculated iv - Decrypt aDecrypt(mKey, iv, cryptoType(mInfo)); + comphelper::Decrypt aDecrypt(mKey, iv, cryptoType(mInfo)); aDecrypt.update(mInfo.hmacHash, mInfo.hmacEncryptedValue); mInfo.hmacHash.resize(mInfo.hashSize, 0); @@ -446,7 +446,7 @@ bool AgileEngine::checkDataIntegrity() bool AgileEngine::decrypt(BinaryXInputStream& aInputStream, BinaryXOutputStream& aOutputStream) { - CryptoHash aCryptoHash(mInfo.hmacKey, cryptoHashTypeFromString(mInfo.hashAlgorithm)); + comphelper::CryptoHash aCryptoHash(mInfo.hmacKey, cryptoHashTypeFromString(mInfo.hashAlgorithm)); sal_uInt32 totalSize = aInputStream.readuInt32(); // Document unencrypted size - 4 bytes // account for size in HMAC @@ -492,7 +492,7 @@ bool AgileEngine::decrypt(BinaryXInputStream& aInputStream, // Only if hash > keySize std::copy(hash.begin(), hash.begin() + keySize, iv.begin()); - Decrypt aDecryptor(mKey, iv, AgileEngine::cryptoType(mInfo)); + comphelper::Decrypt aDecryptor(mKey, iv, cryptoType(mInfo)); outputLength = aDecryptor.update(outputBuffer, inputBuffer, inputLength); sal_uInt32 writeLength = std::min(outputLength, remaining); @@ -593,7 +593,7 @@ bool AgileEngine::generateAndEncryptVerifierHash(OUString const & rPassword) return false; // HASH - needs to be modified to be multiple of block size - sal_Int32 nVerifierHash = roundUp(mInfo.hashSize, mInfo.blockSize); + sal_Int32 nVerifierHash = comphelper::roundUp(mInfo.hashSize, mInfo.blockSize); std::vector unencryptedVerifierHashValue; if (!hashCalc(unencryptedVerifierHashValue, unencryptedVerifierHashInput, mInfo.hashAlgorithm)) return false; @@ -619,7 +619,7 @@ bool AgileEngine::encryptHmacKey() return false; // Encrypted salt must be multiple of block size - sal_Int32 nEncryptedSaltSize = oox::crypto::roundUp(mInfo.hashSize, mInfo.blockSize); + sal_Int32 nEncryptedSaltSize = comphelper::roundUp(mInfo.hashSize, mInfo.blockSize); // We need to extend hmacSalt to multiple of block size, padding with 0x36 std::vector extendedSalt(mInfo.hmacKey); @@ -643,7 +643,7 @@ bool AgileEngine::encryptHmacKey() std::vector iv = calculateIV(eType, mInfo.keyDataSalt, constBlockHmac1, mInfo.blockSize); // Encrypt without key, calculated iv - Encrypt aEncryptor(mKey, iv, cryptoType(mInfo)); + comphelper::Encrypt aEncryptor(mKey, iv, cryptoType(mInfo)); aEncryptor.update(mInfo.hmacEncryptedKey, extendedSalt); return true; @@ -651,7 +651,7 @@ bool AgileEngine::encryptHmacKey() bool AgileEngine::encryptHmacValue() { - sal_Int32 nEncryptedValueSize = roundUp(mInfo.hashSize, mInfo.blockSize); + sal_Int32 nEncryptedValueSize = comphelper::roundUp(mInfo.hashSize, mInfo.blockSize); mInfo.hmacEncryptedValue.clear(); mInfo.hmacEncryptedValue.resize(nEncryptedValueSize, 0); @@ -672,7 +672,7 @@ bool AgileEngine::encryptHmacValue() std::vector iv = calculateIV(eType, mInfo.keyDataSalt, constBlockHmac2, mInfo.blockSize); // Encrypt without key, calculated iv - Encrypt aEncryptor(mKey, iv, cryptoType(mInfo)); + comphelper::Encrypt aEncryptor(mKey, iv, cryptoType(mInfo)); aEncryptor.update(mInfo.hmacEncryptedValue, extendedHash); return true; @@ -726,7 +726,7 @@ void AgileEngine::setupEncryptionParameters(AgileEncryptionParameters const & rA mInfo.keyDataSalt.resize(mInfo.saltSize); mInfo.saltValue.resize(mInfo.saltSize); mInfo.encryptedVerifierHashInput.resize(mInfo.saltSize); - mInfo.encryptedVerifierHashValue.resize(roundUp(mInfo.hashSize, mInfo.blockSize), 0); + mInfo.encryptedVerifierHashValue.resize(comphelper::roundUp(mInfo.hashSize, mInfo.blockSize), 0); } bool AgileEngine::setupEncryptionKey(OUString const & rPassword) @@ -803,7 +803,7 @@ void AgileEngine::encrypt(const css::uno::Reference & rx css::uno::Reference & rxOutputStream, sal_uInt32 nSize) { - CryptoHash aCryptoHash(mInfo.hmacKey, cryptoHashTypeFromString(mInfo.hashAlgorithm)); + comphelper::CryptoHash aCryptoHash(mInfo.hmacKey, cryptoHashTypeFromString(mInfo.hashAlgorithm)); BinaryXOutputStream aBinaryOutputStream(rxOutputStream, false); BinaryXInputStream aBinaryInputStream(rxInputStream, false); @@ -839,7 +839,7 @@ void AgileEngine::encrypt(const css::uno::Reference & rx while ((inputLength = aBinaryInputStream.readMemory(inputBuffer.data(), inputBuffer.size())) > 0) { sal_uInt32 correctedInputLength = inputLength % mInfo.blockSize == 0 ? - inputLength : oox::crypto::roundUp(inputLength, sal_uInt32(mInfo.blockSize)); + inputLength : comphelper::roundUp(inputLength, sal_uInt32(mInfo.blockSize)); // Update Key auto p = saltWithBlockKey.begin() + saltSize; @@ -853,7 +853,7 @@ void AgileEngine::encrypt(const css::uno::Reference & rx // Only if hash > keySize std::copy(hash.begin(), hash.begin() + keySize, iv.begin()); - Encrypt aEncryptor(mKey, iv, AgileEngine::cryptoType(mInfo)); + comphelper::Encrypt aEncryptor(mKey, iv, AgileEngine::cryptoType(mInfo)); outputLength = aEncryptor.update(outputBuffer, inputBuffer, correctedInputLength); aBinaryOutputStream.writeMemory(outputBuffer.data(), outputLength); aCryptoHash.update(outputBuffer, outputLength); diff --git a/oox/source/crypto/Standard2007Engine.cxx b/oox/source/crypto/Standard2007Engine.cxx index 792c6c27cc7a..a9fb8d3c2339 100644 --- a/oox/source/crypto/Standard2007Engine.cxx +++ b/oox/source/crypto/Standard2007Engine.cxx @@ -10,11 +10,11 @@ #include -#include #include #include #include +#include #include namespace oox::crypto { @@ -50,7 +50,7 @@ bool Standard2007Engine::generateVerifier() lclRandomGenerateValues(verifier.data(), verifier.size()); std::vector iv; - Encrypt aEncryptorVerifier(mKey, iv, Crypto::AES_128_ECB); + comphelper::Encrypt aEncryptorVerifier(mKey, iv, comphelper::CryptoType::AES_128_ECB); if (aEncryptorVerifier.update(encryptedVerifier, verifier) != msfilter::ENCRYPTED_VERIFIER_LENGTH) return false; std::copy(encryptedVerifier.begin(), encryptedVerifier.end(), mInfo.verifier.encryptedVerifier); @@ -61,7 +61,7 @@ bool Standard2007Engine::generateVerifier() std::vector encryptedHash(comphelper::SHA256_HASH_LENGTH, 0); - Encrypt aEncryptorHash(mKey, iv, Crypto::AES_128_ECB); + comphelper::Encrypt aEncryptorHash(mKey, iv, comphelper::CryptoType::AES_128_ECB); aEncryptorHash.update(encryptedHash, hash, hash.size()); std::copy(encryptedHash.begin(), encryptedHash.end(), mInfo.verifier.encryptedVerifierHash); @@ -148,10 +148,10 @@ bool Standard2007Engine::generateEncryptionKey(const OUString& password) encryptedHash.begin()); std::vector verifier(encryptedVerifier.size(), 0); - Decrypt::aes128ecb(verifier, encryptedVerifier, mKey); + comphelper::Decrypt::aes128ecb(verifier, encryptedVerifier, mKey); std::vector verifierHash(encryptedHash.size(), 0); - Decrypt::aes128ecb(verifierHash, encryptedHash, mKey); + comphelper::Decrypt::aes128ecb(verifierHash, encryptedHash, mKey); std::vector hash = comphelper::Hash::calculateHash(verifier.data(), verifier.size(), comphelper::HashType::SHA1); @@ -165,7 +165,7 @@ bool Standard2007Engine::decrypt(BinaryXInputStream& aInputStream, aInputStream.skip(4); // Reserved 4 Bytes std::vector iv; - Decrypt aDecryptor(mKey, iv, Crypto::AES_128_ECB); + comphelper::Decrypt aDecryptor(mKey, iv, comphelper::CryptoType::AES_128_ECB); std::vector inputBuffer (4096); std::vector outputBuffer(4096); sal_uInt32 inputLength; @@ -261,13 +261,13 @@ void Standard2007Engine::encrypt(const css::uno::Reference iv; - Encrypt aEncryptor(mKey, iv, Crypto::AES_128_ECB); + comphelper::Encrypt aEncryptor(mKey, iv, comphelper::CryptoType::AES_128_ECB); while ((inputLength = aBinaryInputStream.readMemory(inputBuffer.data(), inputBuffer.size())) > 0) { // increase size to multiple of 16 (size of mKey) if necessary inputLength = inputLength % AES128Size == 0 ? - inputLength : roundUp(inputLength, AES128Size); + inputLength : comphelper::roundUp(inputLength, AES128Size); outputLength = aEncryptor.update(outputBuffer, inputBuffer, inputLength); aBinaryOutputStream.writeMemory(outputBuffer.data(), outputLength); } diff --git a/solenv/clang-format/excludelist b/solenv/clang-format/excludelist index f5414f105fe0..e521a5ccb359 100644 --- a/solenv/clang-format/excludelist +++ b/solenv/clang-format/excludelist @@ -5316,7 +5316,6 @@ include/oox/core/relations.hxx include/oox/core/relationshandler.hxx include/oox/core/xmlfilterbase.hxx include/oox/crypto/AgileEngine.hxx -include/oox/crypto/CryptTools.hxx include/oox/crypto/CryptoEngine.hxx include/oox/crypto/DocumentDecryption.hxx include/oox/crypto/DocumentEncryption.hxx @@ -6961,7 +6960,6 @@ oox/source/core/relations.cxx oox/source/core/relationshandler.cxx oox/source/core/xmlfilterbase.cxx oox/source/crypto/AgileEngine.cxx -oox/source/crypto/CryptTools.cxx oox/source/crypto/DocumentEncryption.cxx oox/source/crypto/Standard2007Engine.cxx oox/source/docprop/docprophandler.cxx