aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAlexey Andreyev <aa13q@ya.ru>2019-07-07 21:53:22 +0300
committerAlexey Andreyev <aa13q@ya.ru>2019-07-08 11:36:54 +0300
commit0bfb1c1c69c02c7936cb018ead496616322a1cf7 (patch)
treee2a84627a4b11e462982d359dc1deb3c5b2ec727
parenteada787376b9f13e7fdd4e7d127074d5c3b3353e (diff)
downloadlibquotient-0bfb1c1c69c02c7936cb018ead496616322a1cf7.tar.gz
libquotient-0bfb1c1c69c02c7936cb018ead496616322a1cf7.zip
E2EE: add new account generation logic
-rw-r--r--lib/connection.cpp3
-rw-r--r--lib/encryptionmanager.cpp37
-rw-r--r--lib/encryptionmanager.h3
3 files changed, 27 insertions, 16 deletions
diff --git a/lib/connection.cpp b/lib/connection.cpp
index 20fb367c..ff066def 100644
--- a/lib/connection.cpp
+++ b/lib/connection.cpp
@@ -254,6 +254,9 @@ void Connection::doConnectToServer(const QString& user, const QString& password,
AccountSettings accountSettings(loginJob->userId());
d->encryptionManager.reset(new EncryptionManager(accountSettings.encryptionAccountPickle()));
+ if (accountSettings.encryptionAccountPickle().isEmpty()) {
+ accountSettings.setEncryptionAccountPickle(d->encryptionManager->olmAccountPickle());
+ }
d->encryptionManager->uploadIdentityKeys(this);
d->encryptionManager->uploadOneTimeKeys(this);
diff --git a/lib/encryptionmanager.cpp b/lib/encryptionmanager.cpp
index 1e1fc669..a62775d9 100644
--- a/lib/encryptionmanager.cpp
+++ b/lib/encryptionmanager.cpp
@@ -24,13 +24,17 @@ class EncryptionManager::Private
{
public:
explicit Private(const QByteArray& encryptionAccountPickle, float signedKeysProportion, float oneTimeKeyThreshold)
- : olmAccount(new Account(encryptionAccountPickle)), // TODO: passphrase even with qtkeychain?
- signedKeysProportion(move(signedKeysProportion)),
- oneTimeKeyThreshold(move(oneTimeKeyThreshold)),
- targetKeysNumber(olmAccount->maxOneTimeKeys()) // 2 // see note below
+ : signedKeysProportion(move(signedKeysProportion)),
+ oneTimeKeyThreshold(move(oneTimeKeyThreshold))
{
Q_ASSERT((0 <= signedKeysProportion) && (signedKeysProportion <= 1));
Q_ASSERT((0 <= oneTimeKeyThreshold) && (oneTimeKeyThreshold <= 1));
+ if (encryptionAccountPickle.isEmpty())
+ {
+ olmAccount.reset(new Account());
+ } else {
+ olmAccount.reset(new Account(encryptionAccountPickle)); // TODO: passphrase even with qtkeychain?
+ }
/*
* Note about targetKeysNumber:
*
@@ -42,17 +46,19 @@ class EncryptionManager::Private
* used instantly, and we want them to stay in libolm, until the limit is reached
* and it starts discarding keys, starting by the oldest.
*/
+ targetKeysNumber = olmAccount->maxOneTimeKeys(); // 2 // see note below
+ targetOneTimeKeyCounts =
+ {
+ {SignedCurve25519Name, qRound(signedKeysProportion * targetKeysNumber)},
+ {Curve25519Name, qRound((1-signedKeysProportion) * targetKeysNumber)}
+ };
}
- ~Private()
- {
- delete olmAccount;
- }
+ ~Private() = default;
UploadKeysJob* uploadIdentityKeysJob = nullptr;
UploadKeysJob* uploadOneTimeKeysJob = nullptr;
- Account* olmAccount;
- const QByteArray encryptionAccountPickle;
+ QScopedPointer<Account> olmAccount;
float signedKeysProportion;
float oneTimeKeyThreshold;
@@ -68,11 +74,7 @@ class EncryptionManager::Private
updateKeysToUpload();
}
QHash<QString, int> oneTimeKeysToUploadCounts;
- QHash<QString, int> targetOneTimeKeyCounts
- {
- {SignedCurve25519Name, qRound(signedKeysProportion * targetKeysNumber)},
- {Curve25519Name, qRound((1-signedKeysProportion) * targetKeysNumber)}
- };
+ QHash<QString, int> targetOneTimeKeyCounts;
};
EncryptionManager::EncryptionManager(const QByteArray &encryptionAccountPickle, float signedKeysProportion, float oneTimeKeyThreshold,
@@ -183,6 +185,11 @@ void EncryptionManager::uploadOneTimeKeys(Connection* connection, bool forceUpda
.arg(signedKeysToUploadCount).arg(unsignedKeysToUploadCount);
}
+QByteArray EncryptionManager::olmAccountPickle()
+{
+ return d->olmAccount->pickle(); // TODO: passphrase even with qtkeychain?
+}
+
void EncryptionManager::Private::updateKeysToUpload()
{
for (auto it = targetOneTimeKeyCounts.cbegin(); it != targetOneTimeKeyCounts.cend(); ++it)
diff --git a/lib/encryptionmanager.h b/lib/encryptionmanager.h
index 0bd05432..40fe7383 100644
--- a/lib/encryptionmanager.h
+++ b/lib/encryptionmanager.h
@@ -15,12 +15,13 @@ namespace QMatrixClient
public:
// TODO: store constats separately?
// TODO: 0.5 oneTimeKeyThreshold instead of 0.1?
- explicit EncryptionManager(const QByteArray& encryptionAccountPickle, float signedKeysProportion = 1, float oneTimeKeyThreshold = float(0.1),
+ explicit EncryptionManager(const QByteArray& encryptionAccountPickle = QByteArray(), float signedKeysProportion = 1, float oneTimeKeyThreshold = float(0.1),
QObject* parent = nullptr);
~EncryptionManager();
void uploadIdentityKeys(Connection* connection);
void uploadOneTimeKeys(Connection* connection, bool forceUpdate = false);
+ QByteArray olmAccountPickle();
private:
class Private;