aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDavid Baker <dave@matrix.org>2019-10-01 11:14:16 +0100
committerDavid Baker <dave@matrix.org>2019-10-01 11:14:16 +0100
commit39a1ee0b18f0fced6d7bc293cc9a46ea70ec9e96 (patch)
treecbda083a8eb42f57a82d03cea38add6803d20823
parent3568060570bb06eff022f49ab39cf34e387e382f (diff)
Add olm_session_describe
As a way to dump the state of an olm session, ie. the chain indicies, so we can debug why olm sessions break and get out of sync.
-rw-r--r--include/olm/olm.h2
-rw-r--r--include/olm/session.hh12
-rw-r--r--javascript/olm_post.js7
-rw-r--r--src/olm.cpp6
-rw-r--r--src/session.cpp29
5 files changed, 56 insertions, 0 deletions
diff --git a/include/olm/olm.h b/include/olm/olm.h
index 61ea07b..770be72 100644
--- a/include/olm/olm.h
+++ b/include/olm/olm.h
@@ -318,6 +318,8 @@ int olm_session_has_received_message(
OlmSession *session
);
+const char * olm_session_describe(OlmSession * session);
+
/** Checks if the PRE_KEY message is for this in-bound session. This can happen
* if multiple messages are sent to this account before this account sends a
* message in reply. The one_time_key_message buffer is destroyed. Returns 1 if
diff --git a/include/olm/session.hh b/include/olm/session.hh
index 9d44816..86598dd 100644
--- a/include/olm/session.hh
+++ b/include/olm/session.hh
@@ -17,6 +17,8 @@
#include "olm/ratchet.hh"
+#define DESCRIBE_BUFFER_LEN 256
+
namespace olm {
struct Account;
@@ -35,6 +37,8 @@ struct Session {
bool received_message;
+ char describe_buffer[DESCRIBE_BUFFER_LEN];
+
_olm_curve25519_public_key alice_identity_key;
_olm_curve25519_public_key alice_base_key;
_olm_curve25519_public_key bob_one_time_key;
@@ -131,6 +135,14 @@ struct Session {
std::uint8_t const * message, std::size_t message_length,
std::uint8_t * plaintext, std::size_t max_plaintext_length
);
+
+ /**
+ * Return a string describing this session and its state (not including the
+ * private key)
+ * The pointer returned refers to an internal buffer which will be valid
+ * up until the next time describe() is called.
+ */
+ const char *describe();
};
diff --git a/javascript/olm_post.js b/javascript/olm_post.js
index ad058d9..c0498db 100644
--- a/javascript/olm_post.js
+++ b/javascript/olm_post.js
@@ -459,6 +459,13 @@ Session.prototype['decrypt'] = restore_stack(function(
});
+Session.prototype['describe'] = restore_stack(function() {
+ var description_buf = session_method(Module['_olm_session_describe'])(
+ this.ptr
+ );
+ return UTF8ToString(description_buf);
+});
+
function Utility() {
var size = Module['_olm_utility_size']();
this.buf = malloc(size);
diff --git a/src/olm.cpp b/src/olm.cpp
index d626c84..65e506d 100644
--- a/src/olm.cpp
+++ b/src/olm.cpp
@@ -535,6 +535,12 @@ int olm_session_has_received_message(
return from_c(session)->received_message;
}
+const char * olm_session_describe(
+ OlmSession * session
+) {
+ return from_c(session)->describe();
+}
+
size_t olm_matches_inbound_session(
OlmSession * session,
void * one_time_key_message, size_t message_length
diff --git a/src/session.cpp b/src/session.cpp
index f1bc5a7..bad19de 100644
--- a/src/session.cpp
+++ b/src/session.cpp
@@ -21,6 +21,7 @@
#include "olm/pickle.hh"
#include <cstring>
+#include <stdio.h>
namespace {
@@ -397,6 +398,34 @@ std::size_t olm::Session::decrypt(
return result;
}
+const char * olm::Session::describe() {
+ describe_buffer[0] = '\0';
+ char *buf_pos = describe_buffer;
+
+ buf_pos += snprintf(
+ buf_pos, DESCRIBE_BUFFER_LEN - (buf_pos - describe_buffer),
+ "sender chain index: %d ", ratchet.sender_chain[0].chain_key.index
+ );
+
+ buf_pos += snprintf(buf_pos, DESCRIBE_BUFFER_LEN - (buf_pos - describe_buffer), "receiver chain indcies:");
+ for (size_t i = 0; i < ratchet.receiver_chains.size(); ++i) {
+ buf_pos += snprintf(
+ buf_pos, DESCRIBE_BUFFER_LEN - (buf_pos - describe_buffer),
+ " %d", ratchet.receiver_chains[i].chain_key.index
+ );
+ }
+
+ buf_pos += snprintf(buf_pos, DESCRIBE_BUFFER_LEN - (buf_pos - describe_buffer), " skipped message keys:");
+ for (size_t i = 0; i < ratchet.skipped_message_keys.size(); ++i) {
+ buf_pos += snprintf(
+ buf_pos, DESCRIBE_BUFFER_LEN - (buf_pos - describe_buffer),
+ " %d", ratchet.skipped_message_keys[i].message_key.index
+ );
+ }
+
+ return describe_buffer;
+}
+
namespace {
// the master branch writes pickle version 1; the logging_enabled branch writes
// 0x80000001.