aboutsummaryrefslogtreecommitdiff
path: root/src/omemo/OmemoLibWrappers.h
diff options
context:
space:
mode:
authorLinus Jahn <lnj@kaidan.im>2022-05-31 12:22:48 +0200
committerLinus Jahn <lnj@kaidan.im>2022-08-13 15:55:03 +0200
commitf0e0e1cd227c08ffd97aa42813a479b8c3ca6d23 (patch)
tree12ca6aefdef9195ee8937406db86e73cf1a5f820 /src/omemo/OmemoLibWrappers.h
parent87df8a8dda385558d39639ce09e2717974264ab6 (diff)
downloadqxmpp-f0e0e1cd227c08ffd97aa42813a479b8c3ca6d23.tar.gz
Split up OMEMO into extra module
Diffstat (limited to 'src/omemo/OmemoLibWrappers.h')
-rw-r--r--src/omemo/OmemoLibWrappers.h100
1 files changed, 100 insertions, 0 deletions
diff --git a/src/omemo/OmemoLibWrappers.h b/src/omemo/OmemoLibWrappers.h
new file mode 100644
index 00000000..e157f12c
--- /dev/null
+++ b/src/omemo/OmemoLibWrappers.h
@@ -0,0 +1,100 @@
+// SPDX-FileCopyrightText: 2022 Linus Jahn <lnj@kaidan.im>
+//
+// SPDX-License-Identifier: LGPL-2.1-or-later
+
+#ifndef OMEMOLIBWRAPPERS_H
+#define OMEMOLIBWRAPPERS_H
+
+#include <key_helper.h>
+#include <session_builder.h>
+#include <session_cipher.h>
+#include <signal_protocol.h>
+
+// Wraps various types of the OMEMO library.
+template<typename T, void(destruct)(T *)>
+class OmemoLibPtr
+{
+ T *m_ptr = nullptr;
+
+public:
+ OmemoLibPtr(T *ptr = nullptr) : m_ptr(ptr) { }
+ OmemoLibPtr(const OmemoLibPtr &) = delete;
+ ~OmemoLibPtr()
+ {
+ if (m_ptr) {
+ destruct(m_ptr);
+ }
+ }
+ OmemoLibPtr &operator=(const OmemoLibPtr &) = delete;
+ OmemoLibPtr<T, destruct> &operator=(T *ptr)
+ {
+ reset(ptr);
+ return *this;
+ }
+ operator bool() const { return m_ptr != nullptr; }
+ T *operator->() const { return m_ptr; }
+ T *get() const { return m_ptr; }
+ T **ptrRef() { return &m_ptr; }
+ void reset(T *ptr)
+ {
+ if (m_ptr) {
+ destruct(m_ptr);
+ }
+ m_ptr = ptr;
+ }
+};
+
+template<typename T>
+void omemoLibUnrefHelper(T *ptr)
+{
+ SIGNAL_UNREF(ptr);
+}
+
+template<typename T>
+using RefCountedPtr = OmemoLibPtr<T, omemoLibUnrefHelper<T>>;
+
+static QByteArray omemoLibBufferToByteArray(signal_buffer *buffer)
+{
+ return QByteArray(reinterpret_cast<const char *>(signal_buffer_data(buffer)), signal_buffer_len(buffer));
+}
+
+static signal_buffer *omemoLibBufferFromByteArray(const QByteArray &bytes)
+{
+ return signal_buffer_create(reinterpret_cast<const unsigned char *>(bytes.constData()), bytes.size());
+}
+
+template<void(destruct)(signal_buffer *)>
+class BufferPtrBase : public OmemoLibPtr<signal_buffer, destruct>
+{
+public:
+ QByteArray toByteArray() const
+ {
+ return omemoLibBufferToByteArray(this->get());
+ }
+};
+
+class BufferSecurePtr : public BufferPtrBase<signal_buffer_bzero_free>
+{
+public:
+ static BufferSecurePtr fromByteArray(const QByteArray &bytes)
+ {
+ return { omemoLibBufferFromByteArray(bytes) };
+ }
+};
+
+class BufferPtr : public BufferPtrBase<signal_buffer_free>
+{
+public:
+ static BufferPtr fromByteArray(const QByteArray &bytes)
+ {
+ return { omemoLibBufferFromByteArray(bytes) };
+ }
+};
+
+using KeyListNodePtr = OmemoLibPtr<signal_protocol_key_helper_pre_key_list_node, signal_protocol_key_helper_key_list_free>;
+using SessionCipherPtr = OmemoLibPtr<session_cipher, session_cipher_free>;
+using SessionBuilderPtr = OmemoLibPtr<session_builder, session_builder_free>;
+using OmemoContextPtr = OmemoLibPtr<signal_context, signal_context_destroy>;
+using StoreContextPtr = OmemoLibPtr<signal_protocol_store_context, signal_protocol_store_context_destroy>;
+
+#endif // OMEMOLIBWRAPPERS_H