diff options
author | Thiago Macieira <thiago.macieira@intel.com> | 2017-10-12 14:59:51 -0700 |
---|---|---|
committer | Lars Knoll <lars.knoll@qt.io> | 2017-10-29 10:13:01 +0000 |
commit | 81f251660026fff198daf8920edc62bbc782ff7d (patch) | |
tree | 9939cc07543eb69b5ee8e80496fca4a42c45d5fd /src | |
parent | fd9dd8e95b7563a439b1672fa622729bdcb6f4fc (diff) |
QRandomGenerator: add system() and global()
Right now,this does really nothing. This commit is just to allow us to
transition the other modules (besides qtbase) to use the syntax that
will become the API.
I've marked three places to use the system CSPRNG:
1) the QHash seed
2) QUuid
3) QAuthenticator
I didn't think the HTTP multipart boundary needed to be
cryptographically safe, so I changed that one to the global generator.
Change-Id: Ib17dde1a1dbb49a7bba8fffd14ecf1938bd8ff61
Reviewed-by: Edward Welbourne <edward.welbourne@qt.io>
Diffstat (limited to 'src')
-rw-r--r-- | src/corelib/global/qrandom.h | 9 | ||||
-rw-r--r-- | src/corelib/plugin/quuid.cpp | 2 | ||||
-rw-r--r-- | src/corelib/tools/qhash.cpp | 2 | ||||
-rw-r--r-- | src/network/access/qhttpmultipart.cpp | 2 | ||||
-rw-r--r-- | src/network/kernel/qauthenticator.cpp | 3 |
5 files changed, 10 insertions, 8 deletions
diff --git a/src/corelib/global/qrandom.h b/src/corelib/global/qrandom.h index 2259f2657a..049495d4e8 100644 --- a/src/corelib/global/qrandom.h +++ b/src/corelib/global/qrandom.h @@ -51,9 +51,12 @@ class QRandomGenerator template <typename UInt> using IfValidUInt = typename std::enable_if<std::is_unsigned<UInt>::value && sizeof(UInt) >= sizeof(uint), bool>::type; public: + static QRandomGenerator system() { return {}; } + static QRandomGenerator global() { return {}; } QRandomGenerator() = default; // ### REMOVE BEFORE 5.10 + QRandomGenerator *operator->() { return this; } static quint32 get32() { return generate(); } static quint64 get64() { return generate64(); } static qreal getReal() { return generateDouble(); } @@ -135,13 +138,14 @@ public: static Q_DECL_CONSTEXPR result_type max() { return (std::numeric_limits<result_type>::max)(); } private: - Q_DISABLE_COPY(QRandomGenerator) static Q_CORE_EXPORT void fillRange_helper(void *buffer, void *bufferEnd); }; class QRandomGenerator64 { public: + static QRandomGenerator64 system() { return {}; } + static QRandomGenerator64 global() { return {}; } QRandomGenerator64() = default; static quint64 generate() { return QRandomGenerator::generate64(); } @@ -152,9 +156,6 @@ public: double entropy() const Q_DECL_NOTHROW { return 0.0; } static Q_DECL_CONSTEXPR result_type min() { return (std::numeric_limits<result_type>::min)(); } static Q_DECL_CONSTEXPR result_type max() { return (std::numeric_limits<result_type>::max)(); } - -private: - Q_DISABLE_COPY(QRandomGenerator64) }; diff --git a/src/corelib/plugin/quuid.cpp b/src/corelib/plugin/quuid.cpp index 11ef247531..3a1c0495fe 100644 --- a/src/corelib/plugin/quuid.cpp +++ b/src/corelib/plugin/quuid.cpp @@ -945,7 +945,7 @@ QUuid QUuid::createUuid() QUuid result(Qt::Uninitialized); uint *data = &(result.data1); enum { AmountToRead = 4 }; - QRandomGenerator::fillRange(data, AmountToRead); + QRandomGenerator::system()->fillRange(data, AmountToRead); result.data4[0] = (result.data4[0] & 0x3F) | 0x80; // UV_DCE result.data3 = (result.data3 & 0x0FFF) | 0x4000; // UV_Random diff --git a/src/corelib/tools/qhash.cpp b/src/corelib/tools/qhash.cpp index 485c6591c2..ded9ad354e 100644 --- a/src/corelib/tools/qhash.cpp +++ b/src/corelib/tools/qhash.cpp @@ -296,7 +296,7 @@ static uint qt_create_qhash_seed() return seed; } - seed = QRandomGenerator::generate(); + seed = QRandomGenerator::system()->generate(); #endif // QT_BOOTSTRAPPED return seed; diff --git a/src/network/access/qhttpmultipart.cpp b/src/network/access/qhttpmultipart.cpp index 58d306d5f9..c59df9d8b8 100644 --- a/src/network/access/qhttpmultipart.cpp +++ b/src/network/access/qhttpmultipart.cpp @@ -435,7 +435,7 @@ QHttpMultiPartPrivate::QHttpMultiPartPrivate() : contentType(QHttpMultiPart::Mix { // 24 random bytes, becomes 32 characters when encoded to Base64 quint32 random[6]; - QRandomGenerator::fillRange(random); + QRandomGenerator::global()->fillRange(random); boundary = "boundary_.oOo._" + QByteArray::fromRawData(reinterpret_cast<char *>(random), sizeof(random)).toBase64(); diff --git a/src/network/kernel/qauthenticator.cpp b/src/network/kernel/qauthenticator.cpp index 099d9586d2..a3ccf13e82 100644 --- a/src/network/kernel/qauthenticator.cpp +++ b/src/network/kernel/qauthenticator.cpp @@ -48,6 +48,7 @@ #include <qendian.h> #include <qstring.h> #include <qdatetime.h> +#include <qrandom.h> #ifdef Q_OS_WIN #include <qmutex.h> @@ -357,7 +358,7 @@ QAuthenticatorPrivate::QAuthenticatorPrivate() , phase(Start) , nonceCount(0) { - cnonce = QCryptographicHash::hash(QByteArray::number(qrand(), 16) + QByteArray::number(qrand(), 16), + cnonce = QCryptographicHash::hash(QByteArray::number(QRandomGenerator::system()->generate64(), 16), QCryptographicHash::Md5).toHex(); nonceCount = 0; } |