5 #include "authenticationrealm.h" 6 #include "credentialpassword_p.h" 9 #include <QLoggingCategory> 10 #include <QMessageAuthenticationCode> 16 Q_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;
82 d->passwordPreSalt = passwordPreSalt;
88 return d->passwordPostSalt;
94 d->passwordPostSalt = 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,
129 pbkdf2(static_cast<QCryptographicHash::Algorithm>(method),
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");
288 int 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" const_iterator cbegin() const const
QString passwordPostSalt() const
QList< QByteArray > split(char sep) const const
virtual AuthenticationUser findUser(Context *c, const ParamsMultiMap &userinfo)
const_iterator cend() const const
void reserve(qsizetype size)
void setPasswordPreSalt(const QString &passwordPreSalt)
const_reference at(qsizetype i) const const
static QByteArray hmac(QCryptographicHash::Algorithm method, const QByteArray &key, const QByteArray &message)
Use password based authentication to authenticate a user.
qsizetype length() const const
Abstract class to validate authentication credentials like user name and password.
qsizetype size() const const
Combines user store and credential validation into a named realm.
QByteArray read(qint64 maxSize)
void setPasswordType(PasswordType type)
static QByteArray createPassword(const QByteArray &password, QCryptographicHash::Algorithm method, int iterations, int saltByteSize, int hashByteSize)
QByteArray result() const const
QByteArray number(double n, char format, int precision)
QString passwordField() const
QString passwordPreSalt() const
void truncate(qsizetype pos)
The Cutelyst namespace holds all public Cutelyst API.
QByteArray & append(QByteArrayView data)
Container for user data retrieved from an AuthenticationStore.
void resize(qsizetype newSize, char c)
QByteArray hash(QByteArrayView message, QByteArrayView key, QCryptographicHash::Algorithm method)
bool addData(QIODevice *device)
QByteArray fromBase64(const QByteArray &base64, Base64Options options)
QVariant value(const QString &key, const QVariant &defaultValue=QVariant()) const
void setPasswordField(const QString &fieldName)
bool open(FILE *fh, OpenMode mode, FileHandleFlags handleFlags)
PasswordType passwordType() const
static QByteArray pbkdf2(QCryptographicHash::Algorithm method, const QByteArray &password, const QByteArray &salt, int rounds, int keyLength)
QByteArray toBase64(Base64Options options) const const
void setPasswordPostSalt(const QString &passwordPostSalt)
AuthenticationUser authenticate(Context *c, AuthenticationRealm *realm, const ParamsMultiMap &authinfo) final
qsizetype size() const const
QString toString() const const
QByteArray toRfc4122() const const
virtual ~CredentialPassword() override
static bool validatePassword(const QByteArray &password, const QByteArray &correctHash)
T value(const Key &key, const T &defaultValue) const const
QByteArray toUtf8() const const