From c935a3d0b1b45a4be57b8b6c5f4867f2516b0409 Mon Sep 17 00:00:00 2001 From: Jonah BrĂ¼chert Date: Sat, 18 Mar 2023 19:36:22 +0100 Subject: QXmppOmemo: Fix ODR violation I wrote the problematic code, so yay --- src/omemo/QXmppOmemoManager_p.cpp | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) (limited to 'src/omemo/QXmppOmemoManager_p.cpp') diff --git a/src/omemo/QXmppOmemoManager_p.cpp b/src/omemo/QXmppOmemoManager_p.cpp index c4d82e78..c0f9c093 100644 --- a/src/omemo/QXmppOmemoManager_p.cpp +++ b/src/omemo/QXmppOmemoManager_p.cpp @@ -38,14 +38,14 @@ using Error = QXmppStanza::Error; using Manager = QXmppOmemoManager; using ManagerPrivate = QXmppOmemoManagerPrivate; -const char *ns_client = "jabber:client"; -const char *ns_pubsub_auto_create = "http://jabber.org/protocol/pubsub#auto-create"; -const char *ns_pubsub_config_node = "http://jabber.org/protocol/pubsub#config-node"; -const char *ns_pubsub_config_node_max = "http://jabber.org/protocol/pubsub#config-node-max"; -const char *ns_pubsub_create_and_configure = "http://jabber.org/protocol/pubsub#create-and-configure"; -const char *ns_pubsub_create_nodes = "http://jabber.org/protocol/pubsub#create-nodes"; -const char *ns_pubsub_publish = "http://jabber.org/protocol/pubsub#publish"; -const char *ns_pubsub_publish_options = "http://jabber.org/protocol/pubsub#publish-options"; +constexpr auto ns_client = "jabber:client"; +constexpr auto ns_pubsub_auto_create = "http://jabber.org/protocol/pubsub#auto-create"; +constexpr auto ns_pubsub_config_node = "http://jabber.org/protocol/pubsub#config-node"; +constexpr auto ns_pubsub_config_node_max = "http://jabber.org/protocol/pubsub#config-node-max"; +constexpr auto ns_pubsub_create_and_configure = "http://jabber.org/protocol/pubsub#create-and-configure"; +constexpr auto ns_pubsub_create_nodes = "http://jabber.org/protocol/pubsub#create-nodes"; +constexpr auto ns_pubsub_publish = "http://jabber.org/protocol/pubsub#publish"; +constexpr auto ns_pubsub_publish_options = "http://jabber.org/protocol/pubsub#publish-options"; namespace QXmpp::Omemo::Private { -- cgit v1.2.3 From 43fc33d6d9f9dbb39435e2cbcbd2c558289857a6 Mon Sep 17 00:00:00 2001 From: Melvin Keskin Date: Thu, 16 Mar 2023 14:06:33 +0100 Subject: OmemoManagerPrivate: Reuse public identity key deserialization method --- src/omemo/QXmppOmemoManager_p.cpp | 14 +------------- 1 file changed, 1 insertion(+), 13 deletions(-) (limited to 'src/omemo/QXmppOmemoManager_p.cpp') diff --git a/src/omemo/QXmppOmemoManager_p.cpp b/src/omemo/QXmppOmemoManager_p.cpp index c0f9c093..75464162 100644 --- a/src/omemo/QXmppOmemoManager_p.cpp +++ b/src/omemo/QXmppOmemoManager_p.cpp @@ -987,20 +987,8 @@ bool ManagerPrivate::generateIdentityKeyPair(ratchet_identity_key_pair **identit return false; } - const auto &serializedPublicIdentityKey = ownDevice.publicIdentityKey; - BufferPtr publicIdentityKeyBuffer = BufferPtr::fromByteArray(serializedPublicIdentityKey); - - if (!publicIdentityKeyBuffer) { - warning("Buffer for serialized public identity key could not be created"); - return false; - } - RefCountedPtr publicIdentityKey; - - if (curve_decode_point_ed(publicIdentityKey.ptrRef(), signal_buffer_data(publicIdentityKeyBuffer.get()), signal_buffer_len(publicIdentityKeyBuffer.get()), globalContext.get()) < 0) { - warning("Public identity key could not be deserialized"); - return false; - } + 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"); -- cgit v1.2.3 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/omemo/QXmppOmemoManager_p.cpp') 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 From 1e33e82e83f188dd37c2abdb47d77b4c3870835e Mon Sep 17 00:00:00 2001 From: Melvin Keskin Date: Tue, 21 Mar 2023 11:46:35 +0100 Subject: OmemoManagerPrivate: Fix check for singleton device list node --- src/omemo/QXmppOmemoManager_p.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'src/omemo/QXmppOmemoManager_p.cpp') diff --git a/src/omemo/QXmppOmemoManager_p.cpp b/src/omemo/QXmppOmemoManager_p.cpp index 6fd53193..afcb706c 100644 --- a/src/omemo/QXmppOmemoManager_p.cpp +++ b/src/omemo/QXmppOmemoManager_p.cpp @@ -2614,7 +2614,7 @@ std::optional QXmppOmemoManagerPrivate::updateContactD { if (deviceListItems.size() > 1) { const auto itr = std::find_if(deviceListItems.cbegin(), deviceListItems.cend(), [=](const QXmppOmemoDeviceListItem &item) { - return item.id() == QXmppPubSubManager::Current; + return item.id() == QXmppPubSubManager::standardItemIdToString(QXmppPubSubManager::Current); }); if (itr != deviceListItems.cend()) { -- cgit v1.2.3 From 33a5cd99448079a535e2f84c0047e085fea87056 Mon Sep 17 00:00:00 2001 From: Melvin Keskin Date: Tue, 21 Mar 2023 12:35:55 +0100 Subject: OmemoManagerPrivate: Finish decryptMessage() if no SCE envelope can be found --- src/omemo/QXmppOmemoManager_p.cpp | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) (limited to 'src/omemo/QXmppOmemoManager_p.cpp') diff --git a/src/omemo/QXmppOmemoManager_p.cpp b/src/omemo/QXmppOmemoManager_p.cpp index afcb706c..52a6d2b0 100644 --- a/src/omemo/QXmppOmemoManager_p.cpp +++ b/src/omemo/QXmppOmemoManager_p.cpp @@ -1383,12 +1383,12 @@ QByteArray ManagerPrivate::createOmemoEnvelopeData(const signal_protocol_address // QXmppTask> ManagerPrivate::decryptMessage(QXmppMessage stanza) { - QXmppPromise> interface; - // At this point, the stanza has always an OMEMO element. const auto omemoElement = *stanza.omemoElement(); if (auto optionalOmemoEnvelope = omemoElement.searchEnvelope(ownBareJid(), ownDevice.id)) { + QXmppPromise> interface; + const auto senderJid = QXmppUtils::jidToBareJid(stanza.from()); const auto senderDeviceId = omemoElement.senderDeviceId(); const auto omemoEnvelope = *optionalOmemoEnvelope; @@ -1429,9 +1429,11 @@ QXmppTask> ManagerPrivate::decryptMessage(QXmppMessa } }); } - } - return interface.task(); + return interface.task(); + } else { + return makeReadyTask>(std::nullopt); + } } // -- cgit v1.2.3 From e1e87c01644abead0bab231e4b1435a86308ee5a Mon Sep 17 00:00:00 2001 From: Melvin Keskin Date: Wed, 22 Mar 2023 09:40:32 +0100 Subject: OmemoManagerPrivate: Use optional OMEMO envelope directly --- src/omemo/QXmppOmemoManager_p.cpp | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) (limited to 'src/omemo/QXmppOmemoManager_p.cpp') diff --git a/src/omemo/QXmppOmemoManager_p.cpp b/src/omemo/QXmppOmemoManager_p.cpp index 52a6d2b0..fc9d13a5 100644 --- a/src/omemo/QXmppOmemoManager_p.cpp +++ b/src/omemo/QXmppOmemoManager_p.cpp @@ -1386,12 +1386,11 @@ QXmppTask> ManagerPrivate::decryptMessage(QXmppMessa // At this point, the stanza has always an OMEMO element. const auto omemoElement = *stanza.omemoElement(); - if (auto optionalOmemoEnvelope = omemoElement.searchEnvelope(ownBareJid(), ownDevice.id)) { + if (const auto omemoEnvelope = omemoElement.searchEnvelope(ownBareJid(), ownDevice.id)) { QXmppPromise> interface; const auto senderJid = QXmppUtils::jidToBareJid(stanza.from()); const auto senderDeviceId = omemoElement.senderDeviceId(); - const auto omemoEnvelope = *optionalOmemoEnvelope; const auto omemoPayload = omemoElement.payload(); subscribeToNewDeviceLists(senderJid, senderDeviceId); @@ -1400,7 +1399,7 @@ QXmppTask> ManagerPrivate::decryptMessage(QXmppMessa // for it after building the initial session or sent by devices to build a new session // with this device. if (omemoPayload.isEmpty()) { - auto future = extractPayloadDecryptionData(senderJid, senderDeviceId, omemoEnvelope); + auto future = extractPayloadDecryptionData(senderJid, senderDeviceId, *omemoEnvelope); future.then(q, [=](std::optional payloadDecryptionData) mutable { if (!payloadDecryptionData) { warning("Empty OMEMO message could not be successfully processed"); @@ -1411,7 +1410,7 @@ QXmppTask> ManagerPrivate::decryptMessage(QXmppMessa interface.finish(std::nullopt); }); } else { - auto future = decryptStanza(stanza, senderJid, senderDeviceId, omemoEnvelope, omemoPayload); + auto future = decryptStanza(stanza, senderJid, senderDeviceId, *omemoEnvelope, omemoPayload); future.then(q, [=](std::optional optionalDecryptionResult) mutable { if (optionalDecryptionResult) { const auto decryptionResult = std::move(*optionalDecryptionResult); -- cgit v1.2.3 From bf1fc75475ce1629dbcae97d1d5558e5d7cae2ef Mon Sep 17 00:00:00 2001 From: Melvin Keskin Date: Wed, 22 Mar 2023 09:42:32 +0100 Subject: OmemoManagerPrivate: Use 'omemoEnvelope' consistently --- src/omemo/QXmppOmemoManager_p.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) (limited to 'src/omemo/QXmppOmemoManager_p.cpp') diff --git a/src/omemo/QXmppOmemoManager_p.cpp b/src/omemo/QXmppOmemoManager_p.cpp index fc9d13a5..305e8c61 100644 --- a/src/omemo/QXmppOmemoManager_p.cpp +++ b/src/omemo/QXmppOmemoManager_p.cpp @@ -1453,13 +1453,13 @@ QXmppTask> ManagerPrivate::decryptIq(const QDo iq.parse(iqElement); auto omemoElement = iq.omemoElement(); - if (const auto envelope = omemoElement.searchEnvelope(ownBareJid(), ownDevice.id)) { + if (const auto omemoEnvelope = omemoElement.searchEnvelope(ownBareJid(), ownDevice.id)) { const auto senderJid = QXmppUtils::jidToBareJid(iq.from()); const auto senderDeviceId = omemoElement.senderDeviceId(); subscribeToNewDeviceLists(senderJid, senderDeviceId); - auto future = decryptStanza(iq, senderJid, senderDeviceId, *envelope, omemoElement.payload(), false); + auto future = decryptStanza(iq, senderJid, senderDeviceId, *omemoEnvelope, omemoElement.payload(), false); return chain(std::move(future), q, [iqElement](auto result) -> Result { if (result) { auto decryptedElement = iqElement.cloneNode(true).toElement(); -- cgit v1.2.3