summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rwxr-xr-xlibs/libaxolotl/src/signal.def4
-rwxr-xr-xprotocols/JabberG/src/jabber_omemo.cpp61
-rwxr-xr-xprotocols/JabberG/src/jabber_proto.cpp21
-rwxr-xr-xprotocols/JabberG/src/jabber_proto.h1
4 files changed, 76 insertions, 11 deletions
diff --git a/libs/libaxolotl/src/signal.def b/libs/libaxolotl/src/signal.def
index 6fcf308687..77a1925d0a 100755
--- a/libs/libaxolotl/src/signal.def
+++ b/libs/libaxolotl/src/signal.def
@@ -54,3 +54,7 @@ EXPORTS
signal_protocol_sender_key_store_key
signal_protocol_sender_key_load_key
curve_generate_key_pair
+ ec_public_key_serialize
+ ec_key_pair_get_public
+ ec_key_pair_get_private
+ ec_private_key_serialize
diff --git a/protocols/JabberG/src/jabber_omemo.cpp b/protocols/JabberG/src/jabber_omemo.cpp
index be4f896e49..47e70401b9 100755
--- a/protocols/JabberG/src/jabber_omemo.cpp
+++ b/protocols/JabberG/src/jabber_omemo.cpp
@@ -29,6 +29,7 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
#include <openssl/hmac.h>
#include <openssl/rand.h>
#include <openssl/sha.h>
+#include <signal_protocol_internal.h>
namespace omemo {
@@ -399,10 +400,14 @@ namespace omemo {
ec_key_pair *device_key;
};
- omemo_device* init_device()
+ omemo_device* create_device()
{
omemo_device *dev = (omemo_device*)mir_alloc(sizeof(omemo_device));
- Utils_GetRandom((void*)dev->id, 4);
+ for (dev->id = 0; dev->id == 0;)
+ {
+ Utils_GetRandom((void*)&(dev->id), 4);
+ }
+
if (curve_generate_key_pair(global_context, &(dev->device_key)))
{
//TODO: handle error
@@ -410,9 +415,61 @@ namespace omemo {
return dev;
}
+ bool IsFirstRun(CJabberProto *proto)
+ {
+ int id = proto->getDword("OmemoDeviceId", 0);
+ if (id == 0)
+ return true;
+ DBVARIANT dbv = { 0 };
+ proto->getString("OmemoDevicePublicKey", &dbv);
+ if (!dbv.pszVal[0])
+ {
+ //does it need to free something in DBVARIANT?
+ return true;
+ }
+ proto->getString("OmemoDevicePrivateKey", &dbv);
+ if (!dbv.pszVal[0])
+ {
+ //does it need to free something in DBVARIANT?
+ return true;
+ }
+
+ return false;
+ }
+ void RefreshDevice(CJabberProto *proto)
+ {
+ omemo_device *new_dev = create_device();
+ proto->setDword("OmemoDeviceId", new_dev->id);
+ ec_public_key *public_key = ec_key_pair_get_public(new_dev->device_key);
+ SIGNAL_REF(public_key);
+ signal_buffer *key_buf;
+ ec_public_key_serialize(&key_buf, public_key);
+ char *key = mir_base64_encode(key_buf->data, (unsigned int)key_buf->len);
+ proto->setString("OmemoDevicePublicKey", key);
+ mir_free(key);
+ signal_buffer_free(key_buf);
+ ec_private_key *private_key = ec_key_pair_get_private(new_dev->device_key);
+ SIGNAL_REF(private_key);
+ ec_private_key_serialize(&key_buf, private_key);
+ key = mir_base64_encode(key_buf->data, (unsigned int)key_buf->len);
+ proto->setString("OmemoDevicePrivateKey", key);
+ mir_free(key);
+ signal_buffer_free(key_buf);
+
+ SIGNAL_UNREF(new_dev->device_key);
+
+ }
};
+void CJabberProto::OmemoInitDevice()
+{
+ if (omemo::IsFirstRun(this))
+ omemo::RefreshDevice(this);
+
+}
+
+
void CJabberProto::OmemoHandleMessage(HXML /*node*/)
{
//TODO: handle "encrypted" node here
diff --git a/protocols/JabberG/src/jabber_proto.cpp b/protocols/JabberG/src/jabber_proto.cpp
index 6d46ddb8a1..8c220e2a63 100755
--- a/protocols/JabberG/src/jabber_proto.cpp
+++ b/protocols/JabberG/src/jabber_proto.cpp
@@ -127,6 +127,16 @@ CJabberProto::CJabberProto(const char *aProtoName, const wchar_t *aUserName) :
m_messageManager.FillPermanentHandlers();
m_adhocManager.FillDefaultNodes();
m_clientCapsManager.AddDefaultCaps();
+
+ IconsInit();
+ InitPopups();
+ GlobalMenuInit();
+ WsInit();
+ ConsoleInit();
+
+ m_pepServices.insert(new CPepMood(this));
+ m_pepServices.insert(new CPepActivity(this));
+
if (m_options.UseOMEMO)
{
JabberCapsBits jcb = 0;
@@ -141,16 +151,9 @@ CJabberProto::CJabberProto(const char *aProtoName, const wchar_t *aUserName) :
jcb |= JABBER_CAPS_OMEMO_NOTIFY;
m_clientCapsManager.SetClientCaps(JABBER_CAPS_MIRANDA_NODE, szCoreVersion, jcb);
- }
-
- IconsInit();
- InitPopups();
- GlobalMenuInit();
- WsInit();
- ConsoleInit();
- m_pepServices.insert(new CPepMood(this));
- m_pepServices.insert(new CPepActivity(this));
+ OmemoInitDevice();
+ }
db_set_resident(m_szModuleName, DBSETTING_XSTATUSID);
db_set_resident(m_szModuleName, DBSETTING_XSTATUSNAME);
diff --git a/protocols/JabberG/src/jabber_proto.h b/protocols/JabberG/src/jabber_proto.h
index b2042bcdd1..48c7778461 100755
--- a/protocols/JabberG/src/jabber_proto.h
+++ b/protocols/JabberG/src/jabber_proto.h
@@ -339,6 +339,7 @@ struct CJabberProto : public PROTO<CJabberProto>, public IJabberInterface
//---- jabber_omemo.cpp --------------------------------------------------------------
void OmemoHandleMessage(HXML node);
void OmemoHandleDeviceList(HXML node);
+ void OmemoInitDevice();
//---- jabber_console.cpp ------------------------------------------------------------