aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--autotests/CMakeLists.txt1
-rw-r--r--autotests/testolmsession.cpp28
-rw-r--r--lib/olm/message.cpp15
-rw-r--r--lib/olm/message.h7
-rw-r--r--lib/olm/qolmaccount.cpp2
-rw-r--r--lib/olm/session.cpp4
-rw-r--r--lib/olm/session.h4
7 files changed, 48 insertions, 13 deletions
diff --git a/autotests/CMakeLists.txt b/autotests/CMakeLists.txt
index 31cdb446..f35890a5 100644
--- a/autotests/CMakeLists.txt
+++ b/autotests/CMakeLists.txt
@@ -14,3 +14,4 @@ endfunction()
quotient_add_test(NAME callcandidateseventtest)
quotient_add_test(NAME testolmaccount)
quotient_add_test(NAME testgroupsession)
+quotient_add_test(NAME testolmsession)
diff --git a/autotests/testolmsession.cpp b/autotests/testolmsession.cpp
new file mode 100644
index 00000000..1b7fbb9b
--- /dev/null
+++ b/autotests/testolmsession.cpp
@@ -0,0 +1,28 @@
+#include "olm/session.h"
+
+using namespace Quotient;
+
+std::pair<std::unique_ptr<QOlmSession>, std::unique_ptr<QOlmSession>> createSessionPair()
+{
+ QByteArray pickledAccountA("eOBXIKivUT6YYowRH031BNv7zNmzqM5B7CpXdyeaPvala5mt7/OeqrG1qVA7vA1SYloFyvJPIy0QNkD3j1HiPl5vtZHN53rtfZ9exXDok03zjmssqn4IJsqcA7Fbo1FZeKafG0NFcWwCPTdmcV7REqxjqGm3I4K8MQFa45AdTGSUu2C12cWeOcbSMlcINiMral+Uyah1sgPmLJ18h1qcnskXUXQvpffZ5DiUw1Iz5zxnwOQF1GVyowPJD7Zdugvj75RQnDxAn6CzyvrY2k2CuedwqDC3fIXM2xdUNWttW4nC2g4InpBhCVvNwhZYxlUb5BUEjmPI2AB3dAL5ry6o9MFncmbN6x5x");
+ QByteArray pickledAccountB("eModTvoFi9oOIkax4j4nuxw9Tcl/J8mOmUctUWI68Q89HSaaPTqR+tdlKQ85v2GOs5NlZCp7EuycypN9GQ4fFbHUCrS7nspa3GFBWsR8PnM8+wez5PWmfFZLg3drOvT0jbMjpDx0MjGYClHBqcrEpKx9oFaIRGBaX6HXzT4lRaWSJkXxuX92q8iGNrLn96PuAWFNcD+2JXpPcNFntslwLUNgqzpZ04aIFYwL80GmzyOgq3Bz1GO6u3TgCQEAmTIYN2QkO0MQeuSfe7UoMumhlAJ6R8GPcdSSPtmXNk4tdyzzlgpVq1hm7ZLKto+g8/5Aq3PvnvA8wCqno2+Pi1duK1pZFTIlActr");
+ auto accountA = QOlmAccount("accountA:foo.com", "Device1UserA");
+ accountA.unpickle(pickledAccountA, Unencrypted{});
+ auto accountB = QOlmAccount("accountB:foo.com", "Device1UserB");
+ accountB.unpickle(pickledAccountB, Unencrypted{});
+
+ const QByteArray identityKeyA("qIEr3TWcJQt4CP8QoKKJcCaukByIOpgh6erBkhLEa2o");
+ const QByteArray oneTimeKeyA("WzsbsjD85iB1R32iWxfJdwkgmdz29ClMbJSJziECYwk");
+ const QByteArray identityKeyB("q/YhJtog/5VHCAS9rM9uUf6AaFk1yPe4GYuyUOXyQCg");
+ const QByteArray oneTimeKeyB("oWvzryma+B2onYjo3hM6A3Mgo/Yepm8HvgSvwZMTnjQ");
+ auto outbound = std::get<std::unique_ptr<QOlmSession>>(accountA
+ .createOutboundSession(identityKeyB, oneTimeKeyB));
+
+ const auto preKey = std::get<Message>(outbound->encrypt("")); // Payload does not matter for PreKey
+
+ if (preKey.type() != Message::General) {
+ throw "Wrong first message type received, can't create session";
+ }
+ auto inbound = std::get<std::unique_ptr<QOlmSession>>(accountB.createInboundSession(preKey));
+ return std::make_pair<std::unique_ptr<QOlmSession>, std::unique_ptr<QOlmSession>>(std::move(inbound), std::move(outbound));
+}
diff --git a/lib/olm/message.cpp b/lib/olm/message.cpp
index 0998a66b..634a6f0c 100644
--- a/lib/olm/message.cpp
+++ b/lib/olm/message.cpp
@@ -8,19 +8,15 @@
using namespace Quotient;
Message::Message(const QByteArray &ciphertext, Message::Type type)
- : QByteArray(std::move(ciphertext)), _messageType(type)
-{
- Q_ASSERT_X(!ciphertext.isEmpty(), "olm message", "Ciphertext is empty");
-}
-
-Message::Message(QByteArray ciphertext) : QByteArray(std::move(ciphertext))
+ : QByteArray(std::move(ciphertext))
+ , m_messageType(type)
{
Q_ASSERT_X(!ciphertext.isEmpty(), "olm message", "Ciphertext is empty");
}
Message::Type Message::type() const
{
- return _messageType;
+ return m_messageType;
}
QByteArray Message::toCiphertext() const
@@ -28,6 +24,11 @@ QByteArray Message::toCiphertext() const
return QByteArray(*this);
}
+Message Message::fromCiphertext(const QByteArray &ciphertext)
+{
+ return Message(ciphertext, Message::General);
+}
+
#endif // Quotient_E2EE_ENABLED
diff --git a/lib/olm/message.h b/lib/olm/message.h
index 6c8ab485..067d9b5a 100644
--- a/lib/olm/message.h
+++ b/lib/olm/message.h
@@ -28,16 +28,15 @@ public:
Q_ENUM(Type)
Message() = default;
- explicit Message(const QByteArray& ciphertext, Type type = General);
- explicit Message(QByteArray ciphertext);
+ explicit Message(const QByteArray &ciphertext, Type type = General);
- static Message fromCiphertext(QByteArray ciphertext);
+ static Message fromCiphertext(const QByteArray &ciphertext);
Q_INVOKABLE Type type() const;
Q_INVOKABLE QByteArray toCiphertext() const;
private:
- Type _messageType = General;
+ Type m_messageType = General;
};
diff --git a/lib/olm/qolmaccount.cpp b/lib/olm/qolmaccount.cpp
index 9c47bc87..ef51a395 100644
--- a/lib/olm/qolmaccount.cpp
+++ b/lib/olm/qolmaccount.cpp
@@ -199,11 +199,13 @@ OlmAccount *Quotient::QOlmAccount::data()
std::variant<std::unique_ptr<QOlmSession>, OlmError> QOlmAccount::createInboundSession(const Message &preKeyMessage)
{
+ Q_ASSERT(preKeyMessage.type() == Message::PreKey);
return QOlmSession::createInboundSession(this, preKeyMessage);
}
std::variant<std::unique_ptr<QOlmSession>, OlmError> QOlmAccount::createInboundSessionFrom(const QByteArray &theirIdentityKey, const Message &preKeyMessage)
{
+ Q_ASSERT(preKeyMessage.type() == Message::PreKey);
return QOlmSession::createInboundSessionFrom(this, theirIdentityKey, preKeyMessage);
}
diff --git a/lib/olm/session.cpp b/lib/olm/session.cpp
index b5cd7b81..f6cab650 100644
--- a/lib/olm/session.cpp
+++ b/lib/olm/session.cpp
@@ -152,9 +152,9 @@ QByteArray QOlmSession::sessionId() const
return idBuffer;
}
-QOlmSession::QOlmSession(OlmSession *session): m_session(session)
+QOlmSession::QOlmSession(OlmSession *session)
+ : m_session(session)
{
-
}
#endif // Quotient_E2EE_ENABLED
diff --git a/lib/olm/session.h b/lib/olm/session.h
index e3a52c88..89f5d822 100644
--- a/lib/olm/session.h
+++ b/lib/olm/session.h
@@ -14,6 +14,8 @@
namespace Quotient {
class QOlmAccount;
+class QOlmSession;
+
//! Either an outbound or inbound session for secure communication.
class QOlmSession
@@ -43,6 +45,8 @@ private:
OlmSession* m_session;
};
+//using QOlmSessionPtr = std::unique_ptr<QOlmSession>;
+
} //namespace Quotient
#endif // Quotient_E2EE_ENABLED