job->setInsecureFallback(false);
job->setKey(kck);
job->setTextData(_mnemonic);
- connect(job, &WritePasswordJob::finished, [account, nextCall = std::move(nextCall)](Job *incoming) mutable {
- Q_UNUSED(incoming);
+ connect(job, &WritePasswordJob::finished, [this, account, nextCall = std::move(nextCall)](Job *incoming) mutable {
+ if (incoming->error() != Error::NoError) {
+ failedToInitialize(account);
+ return;
+ }
+
qCInfo(lcCse()) << "Mnemonic stored in keychain";
nextCall();
}
qCDebug(lcCse) << "Public key successfully deleted from keychain. Clearing.";
- _publicKey = QByteArray();
+ _publicKey.clear();
Q_EMIT publicKeyDeleted();
checkAllSensitiveDataDeleted();
}
return !_privateKey.isEmpty() || !_certificate.isNull() || !_mnemonic.isEmpty();
}
+void ClientSideEncryption::failedToInitialize(const AccountPtr &account)
+{
+ forgetSensitiveData(account);
+ Q_EMIT initializationFinished();
+}
+
void ClientSideEncryption::checkAllSensitiveDataDeleted()
{
if (sensitiveDataRemaining()) {
if(EVP_PKEY_keygen_init(ctx) <= 0) {
qCInfo(lcCse()) << "Couldn't initialize the key generator";
+ failedToInitialize(account);
return;
}
if(EVP_PKEY_CTX_set_rsa_keygen_bits(ctx, rsaKeyLen) <= 0) {
qCInfo(lcCse()) << "Couldn't initialize the key generator bits";
+ failedToInitialize(account);
return;
}
auto localKeyPair = PKey::generate(ctx);
if(!localKeyPair) {
qCInfo(lcCse()) << "Could not generate the key";
+ failedToInitialize(account);
return;
}
Bio privKey;
if (PEM_write_bio_PrivateKey(privKey, localKeyPair, nullptr, nullptr, 0, nullptr, nullptr) <= 0) {
qCInfo(lcCse()) << "Could not read private key from bio.";
+ failedToInitialize(account);
return;
}
const auto key = BIO2ByteArray(privKey);
- _privateKey = key; qCDebug(lcCse) << _privateKey;
+ _privateKey = key;
+ qCDebug(lcCse) << _privateKey;
}
Bio privKey;
if (PEM_write_bio_PrivateKey(privKey, localKeyPair, nullptr, nullptr, 0, nullptr, nullptr) <= 0) {
qCInfo(lcCse()) << "Could not read private key from bio.";
+ failedToInitialize(account);
return;
}
qCInfo(lcCse()) << "Keys generated correctly, sending to server.";
auto csrOutput = generateCSR(account, std::move(localKeyPair), std::move(privateKey));
- writeMnemonic(account, [account, keyPair = std::move(csrOutput.second), output = std::move(csrOutput.first), this]() mutable -> void {writeKeyPair(account, std::move(keyPair), output);});
+ writeMnemonic(account, [account, keyPair = std::move(csrOutput.second), output = std::move(csrOutput.first), this]() mutable -> void {
+ writeKeyPair(account, std::move(keyPair), output);
+ });
}
std::pair<QByteArray, ClientSideEncryption::PKey> ClientSideEncryption::generateCSR(AccountPtr account,
qCInfo(lcCse()) << ERR_lib_error_string(lastError);
lastError = ERR_get_error();
}
- forgetSensitiveData(account);
+ failedToInitialize(account);
return;
}
qCInfo(lcCse()) << "received a valid certificate";
fetchAndValidatePublicKeyFromServer(account);
+ } else {
+ qCInfo(lcCse()) << retCode;
+ failedToInitialize(account);
+ return;
}
- qCInfo(lcCse()) << retCode;
});
job->start();
}
Bio privateKey;
if (PEM_write_bio_PrivateKey(privateKey, keyPair, nullptr, nullptr, 0, nullptr, nullptr) <= 0) {
qCInfo(lcCse()) << "Could not read private key from bio.";
+ failedToInitialize(account);
return;
}
const auto bytearrayPrivateKey = BIO2ByteArray(privateKey);
privateKeyJob->setKey(privateKeyKeychainId);
privateKeyJob->setBinaryData(bytearrayPrivateKey);
connect(privateKeyJob, &WritePasswordJob::finished, [keyPair = std::move(keyPair), publicKeyKeychainId, account, output, this] (Job *incoming) mutable {
- Q_UNUSED(incoming);
+ if (incoming->error() != Error::NoError) {
+ failedToInitialize(account);
+ return;
+ }
+
qCInfo(lcCse()) << "Private key stored in keychain";
Bio publicKey;
if (PEM_write_bio_PUBKEY(publicKey, keyPair) <= 0) {
qCInfo(lcCse()) << "Could not read public key from bio.";
+ failedToInitialize(account);
return;
}
+
const auto bytearrayPublicKey = BIO2ByteArray(publicKey);
auto *publicKeyJob = new WritePasswordJob(Theme::instance()->appName());
publicKeyJob->setKey(publicKeyKeychainId);
publicKeyJob->setBinaryData(bytearrayPublicKey);
connect(publicKeyJob, &WritePasswordJob::finished, [account, keyPair = std::move(keyPair), output, this](Job *incoming) mutable {
- Q_UNUSED(incoming);
+ if (incoming->error() != Error::NoError) {
+ failedToInitialize(account);
+ return;
+ }
+
qCInfo(lcCse()) << "Public key stored in keychain";
sendSignRequestCSR(account, std::move(keyPair), output);
const auto keyIsNotOnServer = [account, this] () {
qCInfo(lcCse) << "server is missing keys. deleting local keys";
- forgetSensitiveData(account);
+ failedToInitialize(account);
};
const auto privateKeyOnServerIsValid = [this] () {
qCInfo(lcCse()) << "Private key stored encrypted on server.";
writePrivateKey(account);
writeCertificate(account);
- writeMnemonic(account, [this] () {emit initializationFinished(true);});
+ writeMnemonic(account, [this] () {
+ emit initializationFinished(true);
+ });
break;
default:
qCInfo(lcCse()) << "Store private key failed, return code:" << retCode;
+ failedToInitialize(account);
}
});
job->start();
void ClientSideEncryption::decryptPrivateKey(const AccountPtr &account, const QByteArray &key) {
if (!account->askUserForMnemonic()) {
qCDebug(lcCse) << "Not allowed to ask user for mnemonic";
- emit initializationFinished();
+ failedToInitialize(account);
return;
}
break;
}
} else {
- _mnemonic = QString();
- _privateKey = QByteArray();
qCInfo(lcCse()) << "Cancelled";
- break;
+ failedToInitialize(account);
+ return;
}
}
qCInfo(lcCse()) << "No public key on the server";
if (!account->e2eEncryptionKeysGenerationAllowed()) {
qCInfo(lcCse()) << "User did not allow E2E keys generation.";
- emit initializationFinished();
+ failedToInitialize(account);
return;
}
generateKeyPair(account);
} else {
qCInfo(lcCse()) << "Error while requesting public key: " << retCode;
+ failedToInitialize(account);
}
});
job->start();
}
} else {
qCInfo(lcCse()) << "Error while requesting server public key: " << retCode;
+ failedToInitialize(account);
+ return;
}
});
job->start();