about summary refs log tree commit diff stats
path: root/src/xmpp/omemo.c
diff options
context:
space:
mode:
authorPaul Fariello <paul@fariello.eu>2019-02-26 19:03:08 +0140
committerPaul Fariello <paul@fariello.eu>2019-04-10 16:03:50 +0200
commitb1ae220aa47ff503fe368e4802061be159dfb42b (patch)
tree73876b55d33a41046b05e1f1baec6ce19e08ad6c /src/xmpp/omemo.c
parentf9216fddb106d46bac2d13d9dfe175b4a475a789 (diff)
downloadprofani-tty-b1ae220aa47ff503fe368e4802061be159dfb42b.tar.gz
Create signal session
Diffstat (limited to 'src/xmpp/omemo.c')
-rw-r--r--src/xmpp/omemo.c50
1 files changed, 47 insertions, 3 deletions
diff --git a/src/xmpp/omemo.c b/src/xmpp/omemo.c
index f4641212..709b6ad8 100644
--- a/src/xmpp/omemo.c
+++ b/src/xmpp/omemo.c
@@ -134,16 +134,60 @@ omemo_start_device_session_handle_bundle(xmpp_stanza_t *const stanza, void *cons
     if (!prekey) {
         return 1;
     }
-
+    const char *prekey_id_text = xmpp_stanza_get_attribute(prekey, "preKeyId");
+    if (!prekey_id_text) {
+        return 1;
+    }
+    uint32_t prekey_id = strtoul(prekey_id_text, NULL, 10);
     xmpp_stanza_t *prekey_text = xmpp_stanza_get_children(prekey);
     if (!prekey_text) {
         return 1;
     }
-
     size_t prekey_len;
     unsigned char *prekey_raw = g_base64_decode(xmpp_stanza_get_text(prekey_text), &prekey_len);
 
-    omemo_start_device_session(from, device_id, prekey_raw, prekey_len);
+    xmpp_stanza_t *signed_prekey = xmpp_stanza_get_child_by_name(bundle, "signedPreKeyPublic");
+    if (!signed_prekey) {
+        return 1;
+    }
+    const char *signed_prekey_id_text = xmpp_stanza_get_attribute(signed_prekey, "signedPreKeyId");
+    if (!signed_prekey_id_text) {
+        return 1;
+    }
+    uint32_t signed_prekey_id = strtoul(signed_prekey_id_text, NULL, 10);
+    xmpp_stanza_t *signed_prekey_text = xmpp_stanza_get_children(signed_prekey);
+    if (!signed_prekey_text) {
+        return 1;
+    }
+    size_t signed_prekey_len;
+    unsigned char *signed_prekey_raw = g_base64_decode(xmpp_stanza_get_text(signed_prekey_text), &signed_prekey_len);
+
+    xmpp_stanza_t *signed_prekey_signature = xmpp_stanza_get_child_by_name(bundle, "signedPreKeySignature");
+    if (!signed_prekey_signature) {
+        return 1;
+    }
+    xmpp_stanza_t *signed_prekey_signature_text = xmpp_stanza_get_children(signed_prekey_signature);
+    if (!signed_prekey_signature_text) {
+        return 1;
+    }
+    size_t signed_prekey_signature_len;
+    unsigned char *signed_prekey_signature_raw = g_base64_decode(xmpp_stanza_get_text(signed_prekey_signature_text), &signed_prekey_signature_len);
+
+    xmpp_stanza_t *identity_key = xmpp_stanza_get_child_by_name(bundle, "identityKey");
+    if (!identity_key) {
+        return 1;
+    }
+    xmpp_stanza_t *identity_key_text = xmpp_stanza_get_children(identity_key);
+    if (!identity_key_text) {
+        return 1;
+    }
+    size_t identity_key_len;
+    unsigned char *identity_key_raw = g_base64_decode(xmpp_stanza_get_text(identity_key_text), &identity_key_len);
+
+    omemo_start_device_session(from, device_id, prekey_id, prekey_raw,
+        prekey_len, signed_prekey_id, signed_prekey_raw, signed_prekey_len,
+        signed_prekey_signature_raw, signed_prekey_signature_len,
+        identity_key_raw, identity_key_len);
     return 1;
 }