QCryptographicHash: port addData() to QByteArrayView
Incl. the static hash() function. Remove the QByteArray versions from the API, but not the ABI. Adapt some callers. [ChangeLog][QtCore][QCryptographicHash] Replaced QByteArray with QByteArrayView in addData() and static hash() functions. Change-Id: Ia0e9bf726276305e05894d323d76a29e985f39eb Reviewed-by: Lars Knoll <lars.knoll@qt.io>
This commit is contained in:
parent
85831bcfe6
commit
de18b3ff37
@ -241,6 +241,7 @@ qt_internal_add_module(Core
|
|||||||
tools/qsize.cpp tools/qsize.h
|
tools/qsize.cpp tools/qsize.h
|
||||||
tools/qstack.h
|
tools/qstack.h
|
||||||
tools/qtaggedpointer.h
|
tools/qtaggedpointer.h
|
||||||
|
tools/qtcore_tools_removed_functions_in_6_3.cpp
|
||||||
tools/qtools_p.h
|
tools/qtools_p.h
|
||||||
tools/qvarlengtharray.h
|
tools/qvarlengtharray.h
|
||||||
tools/qvector.h
|
tools/qvector.h
|
||||||
@ -271,7 +272,14 @@ qt_internal_add_module(Core
|
|||||||
# special case end
|
# special case end
|
||||||
)
|
)
|
||||||
|
|
||||||
qt_update_ignore_pch_source(Core kernel/qmetatype.cpp )
|
set(corelib_no_pch_sources
|
||||||
|
kernel/qmetatype.cpp
|
||||||
|
tools/qtcore_tools_removed_functions_in_6_3.cpp
|
||||||
|
)
|
||||||
|
|
||||||
|
foreach(src ${corelib_no_pch_sources})
|
||||||
|
qt_update_ignore_pch_source(Core ${src})
|
||||||
|
endforeach()
|
||||||
|
|
||||||
# special case begin
|
# special case begin
|
||||||
add_dependencies(Core qmodule_pri)
|
add_dependencies(Core qmodule_pri)
|
||||||
|
@ -351,13 +351,32 @@ void QCryptographicHash::reset()
|
|||||||
d->result.clear();
|
d->result.clear();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#if QT_DEPRECATED_SINCE(6, 4)
|
||||||
/*!
|
/*!
|
||||||
Adds the first \a length chars of \a data to the cryptographic
|
Adds the first \a length chars of \a data to the cryptographic
|
||||||
hash.
|
hash.
|
||||||
|
|
||||||
|
\obsolete
|
||||||
|
Use the QByteArrayView overload instead.
|
||||||
*/
|
*/
|
||||||
void QCryptographicHash::addData(const char *data, qsizetype length)
|
void QCryptographicHash::addData(const char *data, qsizetype length)
|
||||||
{
|
{
|
||||||
Q_ASSERT(length >= 0);
|
Q_ASSERT(length >= 0);
|
||||||
|
addData(QByteArrayView{data, length});
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/*!
|
||||||
|
Adds the first \a length chars of \a data to the cryptographic
|
||||||
|
hash.
|
||||||
|
|
||||||
|
\note In Qt versions prior to 6.3, this function took QByteArray,
|
||||||
|
not QByteArrayView.
|
||||||
|
*/
|
||||||
|
void QCryptographicHash::addData(QByteArrayView bytes) noexcept
|
||||||
|
{
|
||||||
|
const char *data = bytes.data();
|
||||||
|
auto length = bytes.size();
|
||||||
|
|
||||||
#if QT_POINTER_SIZE == 8
|
#if QT_POINTER_SIZE == 8
|
||||||
// feed the data UINT_MAX bytes at a time, as some of the methods below
|
// feed the data UINT_MAX bytes at a time, as some of the methods below
|
||||||
@ -430,14 +449,6 @@ void QCryptographicHash::addData(const char *data, qsizetype length)
|
|||||||
d->result.clear();
|
d->result.clear();
|
||||||
}
|
}
|
||||||
|
|
||||||
/*!
|
|
||||||
\overload addData()
|
|
||||||
*/
|
|
||||||
void QCryptographicHash::addData(const QByteArray &data)
|
|
||||||
{
|
|
||||||
addData(data.constData(), data.length());
|
|
||||||
}
|
|
||||||
|
|
||||||
/*!
|
/*!
|
||||||
Reads the data from the open QIODevice \a device until it ends
|
Reads the data from the open QIODevice \a device until it ends
|
||||||
and hashes it. Returns \c true if reading was successful.
|
and hashes it. Returns \c true if reading was successful.
|
||||||
@ -455,7 +466,7 @@ bool QCryptographicHash::addData(QIODevice *device)
|
|||||||
int length;
|
int length;
|
||||||
|
|
||||||
while ((length = device->read(buffer, sizeof(buffer))) > 0)
|
while ((length = device->read(buffer, sizeof(buffer))) > 0)
|
||||||
addData(buffer, length);
|
addData({buffer, length});
|
||||||
|
|
||||||
return device->atEnd();
|
return device->atEnd();
|
||||||
}
|
}
|
||||||
@ -580,8 +591,11 @@ QByteArray QCryptographicHash::result() const
|
|||||||
|
|
||||||
/*!
|
/*!
|
||||||
Returns the hash of \a data using \a method.
|
Returns the hash of \a data using \a method.
|
||||||
|
|
||||||
|
\note In Qt versions prior to 6.3, this function took QByteArray,
|
||||||
|
not QByteArrayView.
|
||||||
*/
|
*/
|
||||||
QByteArray QCryptographicHash::hash(const QByteArray &data, Algorithm method)
|
QByteArray QCryptographicHash::hash(QByteArrayView data, Algorithm method)
|
||||||
{
|
{
|
||||||
QCryptographicHash hash(method);
|
QCryptographicHash hash(method);
|
||||||
hash.addData(data);
|
hash.addData(data);
|
||||||
|
@ -1,5 +1,6 @@
|
|||||||
/****************************************************************************
|
/****************************************************************************
|
||||||
**
|
**
|
||||||
|
** Copyright (C) 2021 Klarälvdalens Datakonsult AB, a KDAB Group company, info@kdab.com, author Marc Mutz <marc.mutz@kdab.com>
|
||||||
** Copyright (C) 2016 The Qt Company Ltd.
|
** Copyright (C) 2016 The Qt Company Ltd.
|
||||||
** Copyright (C) 2013 Richard J. Moore <rich@kde.org>.
|
** Copyright (C) 2013 Richard J. Moore <rich@kde.org>.
|
||||||
** Contact: https://www.qt.io/licensing/
|
** Contact: https://www.qt.io/licensing/
|
||||||
@ -103,13 +104,22 @@ public:
|
|||||||
|
|
||||||
void reset();
|
void reset();
|
||||||
|
|
||||||
|
#if QT_DEPRECATED_SINCE(6, 4)
|
||||||
|
QT_DEPRECATED_VERSION_X_6_4("Use the QByteArrayView overload instead")
|
||||||
void addData(const char *data, qsizetype length);
|
void addData(const char *data, qsizetype length);
|
||||||
|
#endif
|
||||||
|
#ifdef QT_BUILD_FUNCTIONS_REMOVED_IN_6_3
|
||||||
void addData(const QByteArray &data);
|
void addData(const QByteArray &data);
|
||||||
|
#endif
|
||||||
|
void addData(QByteArrayView data) noexcept;
|
||||||
bool addData(QIODevice *device);
|
bool addData(QIODevice *device);
|
||||||
|
|
||||||
QByteArray result() const;
|
QByteArray result() const;
|
||||||
|
|
||||||
|
#ifdef QT_BUILD_FUNCTIONS_REMOVED_IN_6_3
|
||||||
static QByteArray hash(const QByteArray &data, Algorithm method);
|
static QByteArray hash(const QByteArray &data, Algorithm method);
|
||||||
|
#endif
|
||||||
|
static QByteArray hash(QByteArrayView data, Algorithm method);
|
||||||
static int hashLength(Algorithm method);
|
static int hashLength(Algorithm method);
|
||||||
private:
|
private:
|
||||||
Q_DISABLE_COPY(QCryptographicHash)
|
Q_DISABLE_COPY(QCryptographicHash)
|
||||||
|
@ -140,7 +140,7 @@ void QMessageAuthenticationCodePrivate::initMessageHash()
|
|||||||
for (int i = 0; i < blockSize; ++i)
|
for (int i = 0; i < blockSize; ++i)
|
||||||
iKeyPad[i] = keyData[i] ^ 0x36;
|
iKeyPad[i] = keyData[i] ^ 0x36;
|
||||||
|
|
||||||
messageHash.addData(iKeyPad.data(), iKeyPad.size());
|
messageHash.addData(iKeyPad);
|
||||||
}
|
}
|
||||||
|
|
||||||
/*!
|
/*!
|
||||||
@ -216,7 +216,7 @@ void QMessageAuthenticationCode::setKey(const QByteArray &key)
|
|||||||
void QMessageAuthenticationCode::addData(const char *data, qsizetype length)
|
void QMessageAuthenticationCode::addData(const char *data, qsizetype length)
|
||||||
{
|
{
|
||||||
d->initMessageHash();
|
d->initMessageHash();
|
||||||
d->messageHash.addData(data, length);
|
d->messageHash.addData({data, length});
|
||||||
}
|
}
|
||||||
|
|
||||||
/*!
|
/*!
|
||||||
@ -263,7 +263,7 @@ QByteArray QMessageAuthenticationCode::result() const
|
|||||||
oKeyPad[i] = keyData[i] ^ 0x5c;
|
oKeyPad[i] = keyData[i] ^ 0x5c;
|
||||||
|
|
||||||
QCryptographicHash hash(d->method);
|
QCryptographicHash hash(d->method);
|
||||||
hash.addData(oKeyPad.data(), oKeyPad.size());
|
hash.addData(oKeyPad);
|
||||||
hash.addData(hashedMessage);
|
hash.addData(hashedMessage);
|
||||||
|
|
||||||
d->result = hash.result();
|
d->result = hash.result();
|
||||||
|
63
src/corelib/tools/qtcore_tools_removed_functions_in_6_3.cpp
Normal file
63
src/corelib/tools/qtcore_tools_removed_functions_in_6_3.cpp
Normal file
@ -0,0 +1,63 @@
|
|||||||
|
/****************************************************************************
|
||||||
|
**
|
||||||
|
** Copyright (C) 2021 Klarälvdalens Datakonsult AB, a KDAB Group company, info@kdab.com, author Marc Mutz <marc.mutz@kdab.com>
|
||||||
|
** Contact: http://www.qt.io/licensing/
|
||||||
|
**
|
||||||
|
** This file is part of the QtCore module of the Qt Toolkit.
|
||||||
|
**
|
||||||
|
** $QT_BEGIN_LICENSE:LGPL$
|
||||||
|
** Commercial License Usage
|
||||||
|
** Licensees holding valid commercial Qt licenses may use this file in
|
||||||
|
** accordance with the commercial license agreement provided with the
|
||||||
|
** Software or, alternatively, in accordance with the terms contained in
|
||||||
|
** a written agreement between you and The Qt Company. For licensing terms
|
||||||
|
** and conditions see https://www.qt.io/terms-conditions. For further
|
||||||
|
** information use the contact form at https://www.qt.io/contact-us.
|
||||||
|
**
|
||||||
|
** GNU Lesser General Public License Usage
|
||||||
|
** Alternatively, this file may be used under the terms of the GNU Lesser
|
||||||
|
** General Public License version 3 as published by the Free Software
|
||||||
|
** Foundation and appearing in the file LICENSE.LGPL3 included in the
|
||||||
|
** packaging of this file. Please review the following information to
|
||||||
|
** ensure the GNU Lesser General Public License version 3 requirements
|
||||||
|
** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
|
||||||
|
**
|
||||||
|
** GNU General Public License Usage
|
||||||
|
** Alternatively, this file may be used under the terms of the GNU
|
||||||
|
** General Public License version 2.0 or (at your option) the GNU General
|
||||||
|
** Public license version 3 or any later version approved by the KDE Free
|
||||||
|
** Qt Foundation. The licenses are as published by the Free Software
|
||||||
|
** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
|
||||||
|
** included in the packaging of this file. Please review the following
|
||||||
|
** information to ensure the GNU General Public License requirements will
|
||||||
|
** be met: https://www.gnu.org/licenses/gpl-2.0.html and
|
||||||
|
** https://www.gnu.org/licenses/gpl-3.0.html.
|
||||||
|
**
|
||||||
|
** $QT_END_LICENSE$
|
||||||
|
**
|
||||||
|
****************************************************************************/
|
||||||
|
|
||||||
|
#define QT_BUILD_FUNCTIONS_REMOVED_IN_6_3
|
||||||
|
|
||||||
|
#include "qglobal.h"
|
||||||
|
|
||||||
|
QT_USE_NAMESPACE
|
||||||
|
|
||||||
|
#if QT_DEPRECATED_SINCE(6, 3)
|
||||||
|
|
||||||
|
#include "tools/qcryptographichash.h"
|
||||||
|
|
||||||
|
void QCryptographicHash::addData(const QByteArray &data)
|
||||||
|
{
|
||||||
|
addData(QByteArrayView{data});
|
||||||
|
}
|
||||||
|
|
||||||
|
QByteArray QCryptographicHash::hash(const QByteArray &data, Algorithm method)
|
||||||
|
{
|
||||||
|
return hash(QByteArrayView{data}, method);
|
||||||
|
}
|
||||||
|
|
||||||
|
// #include <qotherheader.h>
|
||||||
|
// // implement removed functions from qotherheader.h
|
||||||
|
|
||||||
|
#endif // QT_DEPRECATED_SINCE(6, 3)
|
@ -732,9 +732,9 @@ static QByteArray digestMd5ResponseHelper(
|
|||||||
{
|
{
|
||||||
QCryptographicHash hash(QCryptographicHash::Md5);
|
QCryptographicHash hash(QCryptographicHash::Md5);
|
||||||
hash.addData(userName);
|
hash.addData(userName);
|
||||||
hash.addData(":", 1);
|
hash.addData(":");
|
||||||
hash.addData(realm);
|
hash.addData(realm);
|
||||||
hash.addData(":", 1);
|
hash.addData(":");
|
||||||
hash.addData(password);
|
hash.addData(password);
|
||||||
QByteArray ha1 = hash.result();
|
QByteArray ha1 = hash.result();
|
||||||
if (alg.compare("md5-sess", Qt::CaseInsensitive) == 0) {
|
if (alg.compare("md5-sess", Qt::CaseInsensitive) == 0) {
|
||||||
@ -744,9 +744,9 @@ static QByteArray digestMd5ResponseHelper(
|
|||||||
// but according to the errata page at http://www.rfc-editor.org/errata_list.php, ID 1649, it
|
// but according to the errata page at http://www.rfc-editor.org/errata_list.php, ID 1649, it
|
||||||
// must be the following line:
|
// must be the following line:
|
||||||
hash.addData(ha1.toHex());
|
hash.addData(ha1.toHex());
|
||||||
hash.addData(":", 1);
|
hash.addData(":");
|
||||||
hash.addData(nonce);
|
hash.addData(nonce);
|
||||||
hash.addData(":", 1);
|
hash.addData(":");
|
||||||
hash.addData(cNonce);
|
hash.addData(cNonce);
|
||||||
ha1 = hash.result();
|
ha1 = hash.result();
|
||||||
};
|
};
|
||||||
@ -755,10 +755,10 @@ static QByteArray digestMd5ResponseHelper(
|
|||||||
// calculate H(A2)
|
// calculate H(A2)
|
||||||
hash.reset();
|
hash.reset();
|
||||||
hash.addData(method);
|
hash.addData(method);
|
||||||
hash.addData(":", 1);
|
hash.addData(":");
|
||||||
hash.addData(digestUri);
|
hash.addData(digestUri);
|
||||||
if (qop.compare("auth-int", Qt::CaseInsensitive) == 0) {
|
if (qop.compare("auth-int", Qt::CaseInsensitive) == 0) {
|
||||||
hash.addData(":", 1);
|
hash.addData(":");
|
||||||
hash.addData(hEntity);
|
hash.addData(hEntity);
|
||||||
}
|
}
|
||||||
QByteArray ha2hex = hash.result().toHex();
|
QByteArray ha2hex = hash.result().toHex();
|
||||||
@ -766,16 +766,16 @@ static QByteArray digestMd5ResponseHelper(
|
|||||||
// calculate response
|
// calculate response
|
||||||
hash.reset();
|
hash.reset();
|
||||||
hash.addData(ha1);
|
hash.addData(ha1);
|
||||||
hash.addData(":", 1);
|
hash.addData(":");
|
||||||
hash.addData(nonce);
|
hash.addData(nonce);
|
||||||
hash.addData(":", 1);
|
hash.addData(":");
|
||||||
if (!qop.isNull()) {
|
if (!qop.isNull()) {
|
||||||
hash.addData(nonceCount);
|
hash.addData(nonceCount);
|
||||||
hash.addData(":", 1);
|
hash.addData(":");
|
||||||
hash.addData(cNonce);
|
hash.addData(cNonce);
|
||||||
hash.addData(":", 1);
|
hash.addData(":");
|
||||||
hash.addData(qop);
|
hash.addData(qop);
|
||||||
hash.addData(":", 1);
|
hash.addData(":");
|
||||||
}
|
}
|
||||||
hash.addData(ha2hex);
|
hash.addData(ha2hex);
|
||||||
return hash.result().toHex();
|
return hash.result().toHex();
|
||||||
@ -1302,7 +1302,7 @@ static QByteArray qCreatev2Hash(const QAuthenticatorPrivate *ctx,
|
|||||||
if (phase3->v2Hash.size() == 0) {
|
if (phase3->v2Hash.size() == 0) {
|
||||||
QCryptographicHash md4(QCryptographicHash::Md4);
|
QCryptographicHash md4(QCryptographicHash::Md4);
|
||||||
QByteArray passUnicode = qStringAsUcs2Le(ctx->password);
|
QByteArray passUnicode = qStringAsUcs2Le(ctx->password);
|
||||||
md4.addData(passUnicode.data(), passUnicode.size());
|
md4.addData(passUnicode);
|
||||||
|
|
||||||
QByteArray hashKey = md4.result();
|
QByteArray hashKey = md4.result();
|
||||||
Q_ASSERT(hashKey.size() == 16);
|
Q_ASSERT(hashKey.size() == 16);
|
||||||
|
@ -425,7 +425,7 @@ void tst_QCryptographicHash::hashLength()
|
|||||||
{
|
{
|
||||||
QFETCH(const QCryptographicHash::Algorithm, algorithm);
|
QFETCH(const QCryptographicHash::Algorithm, algorithm);
|
||||||
|
|
||||||
QByteArray output = QCryptographicHash::hash(QByteArrayLiteral("test"), algorithm);
|
QByteArray output = QCryptographicHash::hash("test", algorithm);
|
||||||
QCOMPARE(QCryptographicHash::hashLength(algorithm), output.length());
|
QCOMPARE(QCryptographicHash::hashLength(algorithm), output.length());
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -480,22 +480,22 @@ void tst_QCryptographicHash::moreThan4GiBOfData()
|
|||||||
qDebug() << algorithm << "test finished in" << timer.restart() << "ms";
|
qDebug() << algorithm << "test finished in" << timer.restart() << "ms";
|
||||||
});
|
});
|
||||||
|
|
||||||
const auto begin = large.data();
|
const auto view = QByteArrayView{large};
|
||||||
const auto mid = begin + large.size() / 2;
|
const auto first = view.first(view.size() / 2);
|
||||||
const auto end = begin + large.size();
|
const auto last = view.sliced(view.size() / 2);
|
||||||
|
|
||||||
QByteArray single;
|
QByteArray single;
|
||||||
QByteArray chunked;
|
QByteArray chunked;
|
||||||
|
|
||||||
auto t = MaybeThread{[&] {
|
auto t = MaybeThread{[&] {
|
||||||
QCryptographicHash h(algorithm);
|
QCryptographicHash h(algorithm);
|
||||||
h.addData(begin, end - begin);
|
h.addData(view);
|
||||||
single = h.result();
|
single = h.result();
|
||||||
}};
|
}};
|
||||||
{
|
{
|
||||||
QCryptographicHash h(algorithm);
|
QCryptographicHash h(algorithm);
|
||||||
h.addData(begin, mid - begin);
|
h.addData(first);
|
||||||
h.addData(mid, end - mid);
|
h.addData(last);
|
||||||
chunked = h.result();
|
chunked = h.result();
|
||||||
}
|
}
|
||||||
t.join();
|
t.join();
|
||||||
|
Loading…
x
Reference in New Issue
Block a user