summaryrefslogtreecommitdiff
path: root/utils
diff options
context:
space:
mode:
Diffstat (limited to 'utils')
-rw-r--r--utils/mir_signal.cpp40
-rw-r--r--utils/mir_signal.h56
2 files changed, 96 insertions, 0 deletions
diff --git a/utils/mir_signal.cpp b/utils/mir_signal.cpp
new file mode 100644
index 0000000000..afca4f4188
--- /dev/null
+++ b/utils/mir_signal.cpp
@@ -0,0 +1,40 @@
+#include <Windows.h>
+
+#include <m_string.h>
+
+#include "mir_signal.h"
+
+SignalBuffer::SignalBuffer(const MBinBuffer &buf)
+{
+ m_buf = signal_buffer_create(buf.data(), buf.length());
+}
+
+SignalBuffer::SignalBuffer(const ec_public_key *key)
+{
+ ec_public_key_serialize(&m_buf, key);
+}
+
+SignalBuffer::SignalBuffer(const ec_private_key *key)
+{
+ ec_private_key_serialize(&m_buf, key);
+}
+
+SignalBuffer::SignalBuffer(const session_pre_key *pre_key)
+{
+ session_pre_key_serialize(&m_buf, pre_key);
+}
+
+SignalBuffer::SignalBuffer(const session_signed_pre_key *pre_key)
+{
+ session_signed_pre_key_serialize(&m_buf, pre_key);
+}
+
+SignalBuffer::~SignalBuffer()
+{
+ signal_buffer_free(m_buf);
+}
+
+CMStringA SignalBuffer::toBase64() const
+{
+ return ptrA(mir_base64_encode(m_buf->data, m_buf->len)).get();
+} \ No newline at end of file
diff --git a/utils/mir_signal.h b/utils/mir_signal.h
new file mode 100644
index 0000000000..ef443374ff
--- /dev/null
+++ b/utils/mir_signal.h
@@ -0,0 +1,56 @@
+#ifndef __MIR_SIGNAL_H__
+#define __MIR_SIGNAL_H__
+
+#include <m_system.h>
+#include <m_utils.h>
+
+#include "../libs/libsignal/src/curve.h"
+#include "../libs/libsignal/src/hkdf.h"
+#include "../libs/libsignal/src/key_helper.h"
+#include "../libs/libsignal/src/protocol.h"
+#include "../libs/libsignal/src/session_builder.h"
+#include "../libs/libsignal/src/session_cipher.h"
+#include "../libs/libsignal/src/signal_protocol.h"
+#include "../libs/libsignal/src/signal_protocol_types.h"
+
+struct signal_buffer
+{
+ size_t len;
+ uint8_t data[1];
+};
+
+struct signal_type_base
+{
+ unsigned int ref_count = 0;
+ void (*destroy)(signal_type_base *instance) = 0;
+};
+
+struct ec_public_key : public signal_type_base
+{
+ uint8_t data[32];
+};
+
+struct ec_private_key : public signal_type_base
+{
+ uint8_t data[32];
+};
+
+class SignalBuffer
+{
+ signal_buffer *m_buf;
+
+public:
+ SignalBuffer(const class MBinBuffer &buf);
+ SignalBuffer(const ec_public_key *key);
+ SignalBuffer(const ec_private_key *key);
+ SignalBuffer(const session_pre_key *pre_key);
+ SignalBuffer(const session_signed_pre_key *pre_key);
+ ~SignalBuffer();
+
+ __forceinline uint8_t* data() const { return m_buf->data; }
+ __forceinline unsigned len() const { return unsigned(m_buf->len); }
+
+ CMStringA toBase64() const;
+};
+
+#endif // __MIR_SMILEYS_H__