diff options
author | Lars Knoll <lars.knoll@qt.io> | 2020-02-05 15:30:05 +0100 |
---|---|---|
committer | Lars Knoll <lars.knoll@qt.io> | 2020-02-10 19:19:56 +0100 |
commit | e12577b56396cca0df05f88f8787706a3a12c82d (patch) | |
tree | c70d5b9f2f8ef217641b82e741309f0ffb8c903a | |
parent | f216c801eabf7ab66ac0e5e7b3fb03591adb7dff (diff) |
don't limit QCryptographicHash to 2^31 bytes of input
Change-Id: Icd43d3b387af9ef9e9b8adb9a6388c741949c9e8
Reviewed-by: Thiago Macieira <thiago.macieira@intel.com>
-rw-r--r-- | src/corelib/tools/qcryptographichash.cpp | 100 | ||||
-rw-r--r-- | src/corelib/tools/qcryptographichash.h | 2 |
2 files changed, 58 insertions, 44 deletions
diff --git a/src/corelib/tools/qcryptographichash.cpp b/src/corelib/tools/qcryptographichash.cpp index fa8d21e07a..1d4afabedd 100644 --- a/src/corelib/tools/qcryptographichash.cpp +++ b/src/corelib/tools/qcryptographichash.cpp @@ -359,53 +359,67 @@ void QCryptographicHash::reset() Adds the first \a length chars of \a data to the cryptographic hash. */ -void QCryptographicHash::addData(const char *data, int length) +void QCryptographicHash::addData(const char *data, qsizetype length) { - switch (d->method) { - case Sha1: - sha1Update(&d->sha1Context, (const unsigned char *)data, length); - break; + Q_ASSERT(length >= 0); + +#if QT_POINTER_SIZE == 8 + // feed the data UINT_MAX bytes at a time, as some of the methods below + // take a uint (of course, feeding more than 4G of data into the hashing + // functions will be pretty slow anyway) + qsizetype remaining = length; + while (remaining) { + length = qMin(qsizetype(std::numeric_limits<uint>::max()), remaining); + remaining -= length; +#else + { +#endif + switch (d->method) { + case Sha1: + sha1Update(&d->sha1Context, (const unsigned char *)data, length); + break; #ifdef QT_CRYPTOGRAPHICHASH_ONLY_SHA1 - default: - Q_ASSERT_X(false, "QCryptographicHash", "Method not compiled in"); - Q_UNREACHABLE(); - break; + default: + Q_ASSERT_X(false, "QCryptographicHash", "Method not compiled in"); + Q_UNREACHABLE(); + break; #else - case Md4: - md4_update(&d->md4Context, (const unsigned char *)data, length); - break; - case Md5: - MD5Update(&d->md5Context, (const unsigned char *)data, length); - break; - case Sha224: - SHA224Input(&d->sha224Context, reinterpret_cast<const unsigned char *>(data), length); - break; - case Sha256: - SHA256Input(&d->sha256Context, reinterpret_cast<const unsigned char *>(data), length); - break; - case Sha384: - SHA384Input(&d->sha384Context, reinterpret_cast<const unsigned char *>(data), length); - break; - case Sha512: - SHA512Input(&d->sha512Context, reinterpret_cast<const unsigned char *>(data), length); - break; - case RealSha3_224: - case Keccak_224: - sha3Update(&d->sha3Context, reinterpret_cast<const BitSequence *>(data), quint64(length) * 8); - break; - case RealSha3_256: - case Keccak_256: - sha3Update(&d->sha3Context, reinterpret_cast<const BitSequence *>(data), quint64(length) * 8); - break; - case RealSha3_384: - case Keccak_384: - sha3Update(&d->sha3Context, reinterpret_cast<const BitSequence *>(data), quint64(length) * 8); - break; - case RealSha3_512: - case Keccak_512: - sha3Update(&d->sha3Context, reinterpret_cast<const BitSequence *>(data), quint64(length) * 8); - break; + case Md4: + md4_update(&d->md4Context, (const unsigned char *)data, length); + break; + case Md5: + MD5Update(&d->md5Context, (const unsigned char *)data, length); + break; + case Sha224: + SHA224Input(&d->sha224Context, reinterpret_cast<const unsigned char *>(data), length); + break; + case Sha256: + SHA256Input(&d->sha256Context, reinterpret_cast<const unsigned char *>(data), length); + break; + case Sha384: + SHA384Input(&d->sha384Context, reinterpret_cast<const unsigned char *>(data), length); + break; + case Sha512: + SHA512Input(&d->sha512Context, reinterpret_cast<const unsigned char *>(data), length); + break; + case RealSha3_224: + case Keccak_224: + sha3Update(&d->sha3Context, reinterpret_cast<const BitSequence *>(data), quint64(length) * 8); + break; + case RealSha3_256: + case Keccak_256: + sha3Update(&d->sha3Context, reinterpret_cast<const BitSequence *>(data), quint64(length) * 8); + break; + case RealSha3_384: + case Keccak_384: + sha3Update(&d->sha3Context, reinterpret_cast<const BitSequence *>(data), quint64(length) * 8); + break; + case RealSha3_512: + case Keccak_512: + sha3Update(&d->sha3Context, reinterpret_cast<const BitSequence *>(data), quint64(length) * 8); + break; #endif + } } d->result.clear(); } diff --git a/src/corelib/tools/qcryptographichash.h b/src/corelib/tools/qcryptographichash.h index ad1de7c756..f76fe2d013 100644 --- a/src/corelib/tools/qcryptographichash.h +++ b/src/corelib/tools/qcryptographichash.h @@ -94,7 +94,7 @@ public: void reset(); - void addData(const char *data, int length); + void addData(const char *data, qsizetype length); void addData(const QByteArray &data); bool addData(QIODevice* device); |