diff options
author | Liang Qi <liang.qi@qt.io> | 2017-04-06 13:52:45 +0200 |
---|---|---|
committer | Liang Qi <liang.qi@qt.io> | 2017-04-06 14:16:31 +0200 |
commit | 0fc569184cf0fb6663e955e68bfa14baf3f3fe0d (patch) | |
tree | 0161df2f2ac28b554e77d62498647054198d8e1e /src/corelib/tools | |
parent | 280e321e52fd4e86545f3f0d4bd4e047786a897e (diff) | |
parent | efb84b6189f9e98c6dd29c22f00ad760445196c2 (diff) |
Merge remote-tracking branch 'origin/5.8' into 5.9
Conflicts:
src/platformsupport/fontdatabases/freetype/qfontengine_ft.cpp
src/platformsupport/fontdatabases/freetype/qfreetypefontdatabase.cpp
src/plugins/platformthemes/gtk3/qgtk3dialoghelpers.cpp
src/widgets/widgets/qtabbar.cpp
Change-Id: Iaa9daee5f7a6490d56257a3824730a35751ceb05
Diffstat (limited to 'src/corelib/tools')
-rw-r--r-- | src/corelib/tools/qcryptographichash.cpp | 55 | ||||
-rw-r--r-- | src/corelib/tools/qvector.h | 1 |
2 files changed, 43 insertions, 13 deletions
diff --git a/src/corelib/tools/qcryptographichash.cpp b/src/corelib/tools/qcryptographichash.cpp index 08f89d2f02..963a91b9a9 100644 --- a/src/corelib/tools/qcryptographichash.cpp +++ b/src/corelib/tools/qcryptographichash.cpp @@ -180,9 +180,45 @@ public: SHA3Context sha3Context; #endif }; +#ifndef QT_CRYPTOGRAPHICHASH_ONLY_SHA1 + void sha3Finish(int bitCount); +#endif QByteArray result; }; +#ifndef QT_CRYPTOGRAPHICHASH_ONLY_SHA1 +void QCryptographicHashPrivate::sha3Finish(int bitCount) +{ + /* + FIPS 202 ยง6.1 defines SHA-3 in terms of calculating the Keccak function + over the original message with the two-bit suffix "01" appended to it. + This variable stores that suffix (and it's fed into the calculations + when the hash is returned to users). + + Only 2 bits of this variable are actually used (see the call to sha3Update + below). The Keccak implementation we're using will actually use the + *leftmost* 2 bits, and interpret them right-to-left. In other words, the + bits must appear in order of *increasing* significance; and as the two most + significant bits of the byte -- the rightmost 6 are ignored. (Yes, this + seems self-contradictory, but it's the way it is...) + + Overall, this means: + * the leftmost two bits must be "10" (not "01"!); + * we don't care what the other six bits are set to (they can be set to + any value), but we arbitrarily set them to 0; + + and for an unsigned char this gives us 0b10'00'00'00, or 0x80. + */ + static const unsigned char sha3FinalSuffix = 0x80; + + result.resize(bitCount / 8); + + SHA3Context copy = sha3Context; + sha3Update(©, reinterpret_cast<const BitSequence *>(&sha3FinalSuffix), 2); + sha3Final(©, reinterpret_cast<BitSequence *>(result.data())); +} +#endif + /*! \class QCryptographicHash \inmodule QtCore @@ -196,7 +232,8 @@ public: QCryptographicHash can be used to generate cryptographic hashes of binary or text data. - Currently MD4, MD5, SHA-1, SHA-224, SHA-256, SHA-384, and SHA-512 are supported. + Refer to the documentation of the \l QCryptographicHash::Algorithm enum for a + list of the supported algorithms. */ /*! @@ -426,27 +463,19 @@ QByteArray QCryptographicHash::result() const break; } case Sha3_224: { - SHA3Context copy = d->sha3Context; - d->result.resize(224/8); - sha3Final(©, reinterpret_cast<BitSequence *>(d->result.data())); + d->sha3Finish(224); break; } case Sha3_256: { - SHA3Context copy = d->sha3Context; - d->result.resize(256/8); - sha3Final(©, reinterpret_cast<BitSequence *>(d->result.data())); + d->sha3Finish(256); break; } case Sha3_384: { - SHA3Context copy = d->sha3Context; - d->result.resize(384/8); - sha3Final(©, reinterpret_cast<BitSequence *>(d->result.data())); + d->sha3Finish(384); break; } case Sha3_512: { - SHA3Context copy = d->sha3Context; - d->result.resize(512/8); - sha3Final(©, reinterpret_cast<BitSequence *>(d->result.data())); + d->sha3Finish(512); break; } #endif diff --git a/src/corelib/tools/qvector.h b/src/corelib/tools/qvector.h index ab5a2944bf..57e80ae125 100644 --- a/src/corelib/tools/qvector.h +++ b/src/corelib/tools/qvector.h @@ -291,6 +291,7 @@ public: private: friend class QRegion; // Optimization for QRegion::rects() + // ### Qt6: remove const from int parameters void reallocData(const int size, const int alloc, QArrayData::AllocationOptions options = QArrayData::Default); void reallocData(const int sz) { reallocData(sz, d->alloc); } void freeData(Data *d); |