From ceb62dd9d0d86bc8327ace116930962cf7fad1e9 Mon Sep 17 00:00:00 2001 From: Melvin Keskin Date: Mon, 9 May 2022 21:45:49 +0200 Subject: Implement XEP-0384: OMEMO Encryption v0.8 This implements XEP-0384 in version v0.8 with a manager and storage classes to be user-implemented for persistant storage. The license of the code is LGPL-2.1-or-later as usual. However since libomemo-c (libsignal-protocol-c) is GPL-3.0, the built binary is always licensed under GPL-3.0. Having our code LGPL licensed will make it avoids relicensing in the future in case we port it to an LGPL compatible omemo library. Closes #133. Co-authored-by: Linus Jahn --- src/client/OmemoLibWrappers.h | 100 ++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 100 insertions(+) create mode 100644 src/client/OmemoLibWrappers.h (limited to 'src/client/OmemoLibWrappers.h') diff --git a/src/client/OmemoLibWrappers.h b/src/client/OmemoLibWrappers.h new file mode 100644 index 00000000..e157f12c --- /dev/null +++ b/src/client/OmemoLibWrappers.h @@ -0,0 +1,100 @@ +// SPDX-FileCopyrightText: 2022 Linus Jahn +// +// SPDX-License-Identifier: LGPL-2.1-or-later + +#ifndef OMEMOLIBWRAPPERS_H +#define OMEMOLIBWRAPPERS_H + +#include +#include +#include +#include + +// Wraps various types of the OMEMO library. +template +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 &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 +void omemoLibUnrefHelper(T *ptr) +{ + SIGNAL_UNREF(ptr); +} + +template +using RefCountedPtr = OmemoLibPtr>; + +static QByteArray omemoLibBufferToByteArray(signal_buffer *buffer) +{ + return QByteArray(reinterpret_cast(signal_buffer_data(buffer)), signal_buffer_len(buffer)); +} + +static signal_buffer *omemoLibBufferFromByteArray(const QByteArray &bytes) +{ + return signal_buffer_create(reinterpret_cast(bytes.constData()), bytes.size()); +} + +template +class BufferPtrBase : public OmemoLibPtr +{ +public: + QByteArray toByteArray() const + { + return omemoLibBufferToByteArray(this->get()); + } +}; + +class BufferSecurePtr : public BufferPtrBase +{ +public: + static BufferSecurePtr fromByteArray(const QByteArray &bytes) + { + return { omemoLibBufferFromByteArray(bytes) }; + } +}; + +class BufferPtr : public BufferPtrBase +{ +public: + static BufferPtr fromByteArray(const QByteArray &bytes) + { + return { omemoLibBufferFromByteArray(bytes) }; + } +}; + +using KeyListNodePtr = OmemoLibPtr; +using SessionCipherPtr = OmemoLibPtr; +using SessionBuilderPtr = OmemoLibPtr; +using OmemoContextPtr = OmemoLibPtr; +using StoreContextPtr = OmemoLibPtr; + +#endif // OMEMOLIBWRAPPERS_H -- cgit v1.2.3