aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorMelvin Keskin <melvo@olomono.de>2023-03-16 14:23:38 +0100
committerLinus Jahn <lnj@kaidan.im>2023-03-29 14:36:12 +0200
commit7fdc30eaa290855a8f2b8cf73396bbbea0e7ac83 (patch)
treeabeac040f9334b566e8605bafbc5d3fb53c0aef9 /src
parent43fc33d6d9f9dbb39435e2cbcbd2c558289857a6 (diff)
Split identity key deserialization into separate methods
Diffstat (limited to 'src')
-rw-r--r--src/omemo/QXmppOmemoManager_p.cpp88
-rw-r--r--src/omemo/QXmppOmemoManager_p.h4
2 files changed, 54 insertions, 38 deletions
diff --git a/src/omemo/QXmppOmemoManager_p.cpp b/src/omemo/QXmppOmemoManager_p.cpp
index 75464162..6fd53193 100644
--- a/src/omemo/QXmppOmemoManager_p.cpp
+++ b/src/omemo/QXmppOmemoManager_p.cpp
@@ -757,7 +757,7 @@ void ManagerPrivate::renewSignedPreKeyPairs()
if (isSignedPreKeyPairRemoved) {
RefCountedPtr<ratchet_identity_key_pair> identityKeyPair;
- generateIdentityKeyPair(identityKeyPair.ptrRef());
+ deserializeIdentityKeyPair(identityKeyPair.ptrRef());
updateSignedPreKeyPair(identityKeyPair.get());
// Store the own device containing the new signed pre key ID.
@@ -963,42 +963,6 @@ void ManagerPrivate::removeDevicesRemovedFromServer()
}
//
-// Generates an identity key pair.
-//
-// The identity key pair is the pair of private and a public long-term key.
-//
-// \param identityKeyPair identity key pair location
-//
-// \return whether it succeeded
-//
-bool ManagerPrivate::generateIdentityKeyPair(ratchet_identity_key_pair **identityKeyPair) const
-{
- BufferSecurePtr privateIdentityKeyBuffer = BufferSecurePtr::fromByteArray(ownDevice.privateIdentityKey);
-
- if (!privateIdentityKeyBuffer) {
- warning("Buffer for serialized private identity key could not be created");
- return false;
- }
-
- RefCountedPtr<ec_private_key> privateIdentityKey;
-
- if (curve_decode_private_point(privateIdentityKey.ptrRef(), signal_buffer_data(privateIdentityKeyBuffer.get()), signal_buffer_len(privateIdentityKeyBuffer.get()), globalContext.get()) < 0) {
- warning("Private identity key could not be deserialized");
- return false;
- }
-
- RefCountedPtr<ec_public_key> publicIdentityKey;
- deserializePublicIdentityKey(publicIdentityKey.ptrRef(), ownDevice.publicIdentityKey);
-
- if (ratchet_identity_key_pair_create(identityKeyPair, publicIdentityKey.get(), privateIdentityKey.get()) < 0) {
- warning("Identity key pair could not be deserialized");
- return false;
- }
-
- return true;
-}
-
-//
// Encrypts a message for specific recipients.
//
// \param message message to be encrypted
@@ -3490,6 +3454,56 @@ bool ManagerPrivate::createSessionBundle(session_pre_key_bundle **sessionBundle,
}
//
+// Deserializes the locally stored identity key pair.
+//
+// The identity key pair is the pair of private and a public long-term keys.
+//
+// \param identityKeyPair identity key pair location
+//
+// \return whether it succeeded
+//
+bool ManagerPrivate::deserializeIdentityKeyPair(ratchet_identity_key_pair **identityKeyPair) const
+{
+ RefCountedPtr<ec_private_key> privateIdentityKey;
+ deserializePrivateIdentityKey(privateIdentityKey.ptrRef(), ownDevice.privateIdentityKey);
+
+ RefCountedPtr<ec_public_key> publicIdentityKey;
+ deserializePublicIdentityKey(publicIdentityKey.ptrRef(), ownDevice.publicIdentityKey);
+
+ if (ratchet_identity_key_pair_create(identityKeyPair, publicIdentityKey.get(), privateIdentityKey.get()) < 0) {
+ warning("Identity key pair could not be deserialized");
+ return false;
+ }
+
+ return true;
+}
+
+//
+// Deserializes a private identity key.
+//
+// \param privateIdentityKey private identity key location
+// \param serializedPrivateIdentityKey serialized private identity key
+//
+// \return whether it succeeded
+//
+bool ManagerPrivate::deserializePrivateIdentityKey(ec_private_key **privateIdentityKey, const QByteArray &serializedPrivateIdentityKey) const
+{
+ BufferSecurePtr privateIdentityKeyBuffer = BufferSecurePtr::fromByteArray(serializedPrivateIdentityKey);
+
+ if (!privateIdentityKeyBuffer) {
+ warning("Buffer for serialized private identity key could not be created");
+ return false;
+ }
+
+ if (curve_decode_private_point(privateIdentityKey, signal_buffer_data(privateIdentityKeyBuffer.get()), signal_buffer_len(privateIdentityKeyBuffer.get()), globalContext.get()) < 0) {
+ warning("Private identity key could not be deserialized");
+ return false;
+ }
+
+ return true;
+}
+
+//
// Deserializes a public identity key.
//
// \param publicIdentityKey public identity key location
diff --git a/src/omemo/QXmppOmemoManager_p.h b/src/omemo/QXmppOmemoManager_p.h
index 0792bdf2..e1ba6ff1 100644
--- a/src/omemo/QXmppOmemoManager_p.h
+++ b/src/omemo/QXmppOmemoManager_p.h
@@ -194,7 +194,6 @@ public:
bool renewPreKeyPairs(uint32_t keyPairBeingRenewed);
bool updatePreKeyPairs(uint32_t count = 1);
void removeDevicesRemovedFromServer();
- bool generateIdentityKeyPair(ratchet_identity_key_pair **identityKeyPair) const;
QXmppTask<QXmppE2eeExtension::MessageEncryptResult> encryptMessageForRecipients(QXmppMessage &&message,
QVector<QString> recipientJids,
@@ -336,6 +335,9 @@ public:
const QByteArray &serializedSignedPublicPreKeySignature,
const QByteArray &serializedPublicPreKey,
uint32_t publicPreKeyId);
+
+ bool deserializeIdentityKeyPair(ratchet_identity_key_pair **identityKeyPair) const;
+ bool deserializePrivateIdentityKey(ec_private_key **privateIdentityKey, const QByteArray &serializedPrivateIdentityKey) const;
bool deserializePublicIdentityKey(ec_public_key **publicIdentityKey, const QByteArray &serializedPublicIdentityKey) const;
bool deserializeSignedPublicPreKey(ec_public_key **signedPublicPreKey, const QByteArray &serializedSignedPublicPreKey) const;
bool deserializePublicPreKey(ec_public_key **publicPreKey, const QByteArray &serializedPublicPreKey) const;