5#include "authenticationrealm.h"
6#include "credentialpassword_p.h"
9#include <QLoggingCategory>
10#include <QMessageAuthenticationCode>
14using namespace Qt::StringLiterals;
16Q_LOGGING_CATEGORY(C_CREDENTIALPASSWORD,
"cutelyst.plugin.credentialpassword", QtWarningMsg)
20 , d_ptr(new CredentialPasswordPrivate)
37 if (d->checkPassword(_user, authinfo)) {
40 qCDebug(C_CREDENTIALPASSWORD) <<
"Password didn't match";
43 qCDebug(C_CREDENTIALPASSWORD)
44 <<
"Unable to locate a user matching user info provided in realm";
52 return d->passwordField;
58 d->passwordField = fieldName;
64 return d->passwordType;
70 d->passwordType = type;
76 return d->passwordPreSalt;
88 return d->passwordPostSalt;
101 for (
int i = 0; i < a.
size() && i < b.
size(); i++) {
108#define HASH_SECTIONS 4
109#define HASH_ALGORITHM_INDEX 0
110#define HASH_ITERATION_INDEX 1
111#define HASH_SALT_INDEX 2
112#define HASH_PBKDF2_INDEX 3
118 if (params.
size() < HASH_SECTIONS) {
122 int method = CredentialPasswordPrivate::cryptoStrToEnum(params.
at(HASH_ALGORITHM_INDEX));
128 return slowEquals(pbkdf2Hash,
131 params.
at(HASH_SALT_INDEX),
132 params.
at(HASH_ITERATION_INDEX).toInt(),
144 QFile random(u
"/dev/urandom"_s);
154 const QByteArray methodStr = CredentialPasswordPrivate::cryptoEnumToStr(method);
156 pbkdf2(method, password, salt, iterations, hashByteSize).
toBase64();
176 if (rounds <= 0 || keyLength <= 0) {
177 qCCritical(C_CREDENTIALPASSWORD,
"PBKDF2 ERROR: Invalid parameters.");
181 if (salt.
size() == 0 || salt.
size() > std::numeric_limits<int>::max() - 4) {
186 int saltSize = salt.
size();
188 asalt.
resize(saltSize + 4);
195 for (
int count = 1, remainingBytes = keyLength; remainingBytes > 0; ++count) {
196 asalt[saltSize + 0] =
static_cast<char>((count >> 24) & 0xff);
197 asalt[saltSize + 1] =
static_cast<char>((count >> 16) & 0xff);
198 asalt[saltSize + 2] =
static_cast<char>((count >> 8) & 0xff);
199 asalt[saltSize + 3] =
static_cast<char>(count & 0xff);
203 obuf = d1 = code.
result();
205 for (
int i = 1; i < rounds; ++i) {
209 auto it = obuf.
begin();
211 while (d1It != d1.
cend()) {
219 remainingBytes -= obuf.
size();
236 const QString password = passwordPreSalt + authinfo.
value(passwordField) + passwordPostSalt;
242 return storedPassword == password;
244 qCDebug(C_CREDENTIALPASSWORD) <<
"CredentialPassword is set to ignore password check";
255#ifndef QT_CRYPTOGRAPHICHASH_ONLY_SHA1
257 hashmethod = QByteArrayLiteral(
"Md4");
259 hashmethod = QByteArrayLiteral(
"Md5");
263 hashmethod = QByteArrayLiteral(
"Sha1");
265#ifndef QT_CRYPTOGRAPHICHASH_ONLY_SHA1
267 hashmethod = QByteArrayLiteral(
"Sha224");
269 hashmethod = QByteArrayLiteral(
"Sha256");
271 hashmethod = QByteArrayLiteral(
"Sha384");
273 hashmethod = QByteArrayLiteral(
"Sha512");
275 hashmethod = QByteArrayLiteral(
"Sha3_224");
277 hashmethod = QByteArrayLiteral(
"Sha3_256");
279 hashmethod = QByteArrayLiteral(
"Sha3_384");
281 hashmethod = QByteArrayLiteral(
"Sha3_512");
288int CredentialPasswordPrivate::cryptoStrToEnum(
const QByteArray &hashMethod)
293#ifndef QT_CRYPTOGRAPHICHASH_ONLY_SHA1
294 if (hashmethod ==
"Md4") {
296 }
else if (hashmethod ==
"Md5") {
300 if (hashmethod ==
"Sha1") {
303#ifndef QT_CRYPTOGRAPHICHASH_ONLY_SHA1
304 if (hashmethod ==
"Sha224") {
306 }
else if (hashmethod ==
"Sha256") {
308 }
else if (hashmethod ==
"Sha384") {
310 }
else if (hashmethod ==
"Sha512") {
312 }
else if (hashmethod ==
"Sha3_224") {
314 }
else if (hashmethod ==
"Sha3_256") {
316 }
else if (hashmethod ==
"Sha3_384") {
318 }
else if (hashmethod ==
"Sha3_512") {
326#include "moc_credentialpassword.cpp"
Abstract class to validate authentication credentials like user name and password.
Combines user store and credential validation into a named realm.
virtual AuthenticationUser findUser(Context *c, const ParamsMultiMap &userinfo)
Container for user data retrieved from an AuthenticationStore.
QVariant value(const QString &key, const QVariant &defaultValue=QVariant()) const
Use password based authentication to authenticate a user.
void setPasswordType(PasswordType type)
QString passwordField() const
void setPasswordPostSalt(const QString &passwordPostSalt)
virtual ~CredentialPassword() override
AuthenticationUser authenticate(Context *c, AuthenticationRealm *realm, const ParamsMultiMap &authinfo) final
static QByteArray pbkdf2(QCryptographicHash::Algorithm method, const QByteArray &password, const QByteArray &salt, int rounds, int keyLength)
static bool validatePassword(const QByteArray &password, const QByteArray &correctHash)
QString passwordPreSalt() const
PasswordType passwordType() const
QString passwordPostSalt() const
static QByteArray createPassword(const QByteArray &password, QCryptographicHash::Algorithm method, int iterations, int saltByteSize, int hashByteSize)
void setPasswordField(const QString &fieldName)
static QByteArray hmac(QCryptographicHash::Algorithm method, const QByteArray &key, const QByteArray &message)
void setPasswordPreSalt(const QString &passwordPreSalt)
The Cutelyst namespace holds all public Cutelyst API.
QByteArray & append(QByteArrayView data)
QByteArray::iterator begin()
QByteArray::const_iterator cbegin() const const
QByteArray::const_iterator cend() const const
QByteArray fromBase64(const QByteArray &base64, QByteArray::Base64Options options)
qsizetype length() const const
QByteArray number(double n, char format, int precision)
void reserve(qsizetype size)
void resize(qsizetype newSize, char c)
qsizetype size() const const
QList< QByteArray > split(char sep) const const
QByteArray toBase64(QByteArray::Base64Options options) const const
void truncate(qsizetype pos)
bool open(FILE *fh, QIODeviceBase::OpenMode mode, QFileDevice::FileHandleFlags handleFlags)
QByteArray read(qint64 maxSize)
QList::const_reference at(qsizetype i) const const
qsizetype size() const const
bool addData(QIODevice *device)
QByteArray hash(QByteArrayView message, QByteArrayView key, QCryptographicHash::Algorithm method)
QByteArray result() const const
T value(const Key &key, const T &defaultValue) const const
QByteArray toUtf8() const const
QByteArray toRfc4122() const const
QString toString() const const