From 9248d0cfbee0805d670f4b6b07bd3bf4003d6263 Mon Sep 17 00:00:00 2001 From: Marc Mutz Date: Fri, 24 Feb 2023 10:41:16 +0100 Subject: [PATCH] QCryptographicHash: separate OpenSSL3 and traditional modes more MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit ... by defining separate init(), reset(), addData() and finalizeUnchecked() functions instead of doing #ifdef'ery inside the function bodies. The purpose of the exercise is that these functions will later end up in different classes. For now, we can already drop the UINT_MAX loop for the OpenSSL30 case, as both EVP_DigestUpdate() and the Blake functions use size_t lengths in the API. Pick-to: 6.5 Change-Id: I9ad618c90bb54b429db3225061cd5cfd25243fca Reviewed-by: MÃ¥rten Nordheim Reviewed-by: Qt CI Bot --- src/corelib/tools/qcryptographichash.cpp | 78 ++++++++++++++++-------- 1 file changed, 54 insertions(+), 24 deletions(-) diff --git a/src/corelib/tools/qcryptographichash.cpp b/src/corelib/tools/qcryptographichash.cpp index b6dfe646517..d0c126876b3 100644 --- a/src/corelib/tools/qcryptographichash.cpp +++ b/src/corelib/tools/qcryptographichash.cpp @@ -531,9 +531,10 @@ QCryptographicHash::Algorithm QCryptographicHash::algorithm() const noexcept return d->method; } +#ifdef USING_OPENSSL30 + void QCryptographicHashPrivate::init() { -#ifdef USING_OPENSSL30 if (method == QCryptographicHash::Blake2b_160 || method == QCryptographicHash::Blake2b_256 || method == QCryptographicHash::Blake2b_384) { @@ -578,7 +579,12 @@ void QCryptographicHashPrivate::init() } initializationFailed = !EVP_DigestInit_ex(context.get(), algorithm.get(), nullptr); -#else +} + +#else // USING_OPENSSL30 + +void QCryptographicHashPrivate::init() +{ switch (method) { case QCryptographicHash::Sha1: new (&sha1Context) Sha1State; @@ -633,13 +639,15 @@ void QCryptographicHashPrivate::init() case QCryptographicHash::NumAlgorithms: Q_UNREACHABLE(); } -#endif } +#endif // !USING_OPENSSL30 + +#ifdef USING_OPENSSL30 + void QCryptographicHashPrivate::reset() noexcept { result.clear(); -#ifdef USING_OPENSSL30 if (method == QCryptographicHash::Blake2b_160 || method == QCryptographicHash::Blake2b_256 || method == QCryptographicHash::Blake2b_384) { @@ -660,8 +668,13 @@ void QCryptographicHashPrivate::reset() noexcept initializationFailed = !EVP_DigestInit_ex(context.get(), algorithm.get(), nullptr); } // if initializationFailed first time around, it will not succeed this time, either +} -#else +#else // USING_OPENSSL30 + +void QCryptographicHashPrivate::reset() noexcept +{ + result.clear(); switch (method) { case QCryptographicHash::Sha1: sha1InitState(&sha1Context); @@ -716,9 +729,10 @@ void QCryptographicHashPrivate::reset() noexcept case QCryptographicHash::NumAlgorithms: Q_UNREACHABLE(); } -#endif // !QT_CONFIG(opensslv30) } +#endif // USING_OPENSSL30 + #if QT_DEPRECATED_SINCE(6, 4) /*! Adds the first \a length chars of \a data to the cryptographic @@ -745,6 +759,31 @@ void QCryptographicHash::addData(QByteArrayView bytes) noexcept d->addData(bytes); } +#ifdef USING_OPENSSL30 + +void QCryptographicHashPrivate::addData(QByteArrayView bytes) noexcept +{ + const char *data = bytes.data(); + auto length = bytes.size(); + // all functions take size_t length, so we don't need to loop around them: + { + if (method == QCryptographicHash::Blake2b_160 || + method == QCryptographicHash::Blake2b_256 || + method == QCryptographicHash::Blake2b_384) { + blake2b_update(&blake2bContext, reinterpret_cast(data), length); + } else if (method == QCryptographicHash::Blake2s_128 || + method == QCryptographicHash::Blake2s_160 || + method == QCryptographicHash::Blake2s_224) { + blake2s_update(&blake2sContext, reinterpret_cast(data), length); + } else if (!initializationFailed) { + EVP_DigestUpdate(context.get(), (const unsigned char *)data, length); + } + } + result.clear(); +} + +#else // USING_OPENSSL30 + void QCryptographicHashPrivate::addData(QByteArrayView bytes) noexcept { const char *data = bytes.data(); @@ -759,20 +798,6 @@ void QCryptographicHashPrivate::addData(QByteArrayView bytes) noexcept #else { #endif - -#ifdef USING_OPENSSL30 - if (method == QCryptographicHash::Blake2b_160 || - method == QCryptographicHash::Blake2b_256 || - method == QCryptographicHash::Blake2b_384) { - blake2b_update(&blake2bContext, reinterpret_cast(data), length); - } else if (method == QCryptographicHash::Blake2s_128 || - method == QCryptographicHash::Blake2s_160 || - method == QCryptographicHash::Blake2s_224) { - blake2s_update(&blake2sContext, reinterpret_cast(data), length); - } else if (!initializationFailed) { - EVP_DigestUpdate(context.get(), (const unsigned char *)data, length); - } -#else switch (method) { case QCryptographicHash::Sha1: sha1Update(&sha1Context, (const unsigned char *)data, length); @@ -827,10 +852,10 @@ void QCryptographicHashPrivate::addData(QByteArrayView bytes) noexcept case QCryptographicHash::NumAlgorithms: Q_UNREACHABLE(); } -#endif // !QT_CONFIG(opensslv30) } result.clear(); } +#endif // !USING_OPENSSL30 /*! Reads the data from the open QIODevice \a device until it ends @@ -908,9 +933,9 @@ void QCryptographicHashPrivate::finalize() noexcept Must be called with finalizeMutex held (except from static hash() function, where no sharing can take place). */ +#ifdef USING_OPENSSL30 void QCryptographicHashPrivate::finalizeUnchecked() noexcept { -#ifdef USING_OPENSSL30 if (method == QCryptographicHash::Blake2b_160 || method == QCryptographicHash::Blake2b_256 || method == QCryptographicHash::Blake2b_384) { @@ -931,7 +956,12 @@ void QCryptographicHashPrivate::finalizeUnchecked() noexcept result.resizeForOverwrite(EVP_MD_get_size(algorithm.get())); EVP_DigestFinal_ex(copy.get(), result.data(), nullptr); } -#else +} + +#else // USING_OPENSSL30 + +void QCryptographicHashPrivate::finalizeUnchecked() noexcept +{ switch (method) { case QCryptographicHash::Sha1: { Sha1State copy = sha1Context; @@ -1020,8 +1050,8 @@ void QCryptographicHashPrivate::finalizeUnchecked() noexcept case QCryptographicHash::NumAlgorithms: Q_UNREACHABLE(); } -#endif // !QT_CONFIG(opensslv30) } +#endif // !USING_OPENSSL30 /*! Returns the hash of \a data using \a method.