From 7fdc30eaa290855a8f2b8cf73396bbbea0e7ac83 Mon Sep 17 00:00:00 2001 From: Melvin Keskin Date: Thu, 16 Mar 2023 14:23:38 +0100 Subject: Split identity key deserialization into separate methods --- src/omemo/QXmppOmemoManager_p.cpp | 88 +++++++++++++++++++++++---------------- src/omemo/QXmppOmemoManager_p.h | 4 +- 2 files changed, 54 insertions(+), 38 deletions(-) (limited to 'src') 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 identityKeyPair; - generateIdentityKeyPair(identityKeyPair.ptrRef()); + deserializeIdentityKeyPair(identityKeyPair.ptrRef()); updateSignedPreKeyPair(identityKeyPair.get()); // Store the own device containing the new signed pre key ID. @@ -962,42 +962,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 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 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. // @@ -3489,6 +3453,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 privateIdentityKey; + deserializePrivateIdentityKey(privateIdentityKey.ptrRef(), ownDevice.privateIdentityKey); + + RefCountedPtr 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. // 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 encryptMessageForRecipients(QXmppMessage &&message, QVector 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; -- cgit v1.2.3