File indexing completed on 2024-05-19 05:53:29
0001 /* 0002 * SPDX-License-Identifier: GPL-3.0-or-later 0003 * SPDX-FileCopyrightText: 2020 Johan Ouwerkerk <jm.ouwerkerk@gmail.com> 0004 */ 0005 0006 #include "secret.h" 0007 0008 #include <QScopedPointer> 0009 #include <QtDebug> 0010 0011 #include <cstring> 0012 0013 namespace test 0014 { 0015 secrets::SecureMasterKey * useDummyPassword(accounts::AccountSecret *secret) 0016 { 0017 QByteArray salt; 0018 salt.resize(crypto_pwhash_SALTBYTES); 0019 salt.fill('\x0', -1); 0020 QString password(QStringLiteral("password")); 0021 QByteArray challenge = QByteArray::fromBase64("HG8yZFZRDbtkViPnLQCiRZco3PdjFuvn"); 0022 QByteArray nonce = QByteArray::fromBase64("QUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFB"); 0023 0024 std::optional<secrets::EncryptedSecret> verify = secrets::EncryptedSecret::from(challenge, nonce); 0025 if (!verify) { 0026 qDebug () << "Failed to construct password challenge object"; 0027 return nullptr; 0028 } 0029 return useDummyPassword(secret, password, salt, *verify); 0030 } 0031 0032 secrets::SecureMasterKey * useDummyPassword(accounts::AccountSecret *secret, QString &password, QByteArray &salt, const secrets::EncryptedSecret &challenge) 0033 { 0034 if (!secret) { 0035 qDebug () << "No account secret provided..."; 0036 return nullptr; 0037 } 0038 0039 std::optional<secrets::KeyDerivationParameters> keyParams = secrets::KeyDerivationParameters::create( 0040 crypto_secretbox_KEYBYTES, crypto_pwhash_ALG_DEFAULT, crypto_pwhash_MEMLIMIT_MIN, crypto_pwhash_OPSLIMIT_MIN 0041 ); 0042 if (!keyParams) { 0043 qDebug () << "Failed to construct key derivation parameters"; 0044 return nullptr; 0045 } 0046 0047 if (!secret->requestExistingPassword(challenge, salt, *keyParams)) { 0048 qDebug() << "Failed to simulate password request"; 0049 return nullptr; 0050 } 0051 if (!secret->answerExistingPassword(password)) { 0052 qDebug() << "Failed to supply the password"; 0053 return nullptr; 0054 } 0055 0056 secrets::SecureMasterKey * k = secret->deriveKey(); 0057 if (!k) { 0058 qDebug() << "Failed to derive the master key"; 0059 return nullptr; 0060 } 0061 return k; 0062 } 0063 0064 std::optional<secrets::EncryptedSecret> encrypt(const accounts::AccountSecret *secret, const QByteArray &tokenSecret) 0065 { 0066 QScopedPointer<secrets::SecureMemory> memory(secrets::SecureMemory::allocate((size_t) tokenSecret.size())); 0067 if (!memory) { 0068 qDebug () << "Failed to set up secure memory region for token secret"; 0069 return std::nullopt; 0070 } 0071 0072 std::memcpy(memory->data(), tokenSecret.constData(), memory->size()); 0073 std::optional<secrets::EncryptedSecret> s = secret->encrypt(memory.data()); 0074 if (!s) { 0075 qDebug () << "Failed to encrypt token secret"; 0076 return std::nullopt; 0077 } 0078 return s; 0079 } 0080 }