aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--include/olm/olm.h6
-rw-r--r--include/olm/session.hh8
-rw-r--r--javascript/olm_post.js13
-rw-r--r--src/olm.cpp6
-rw-r--r--src/session.cpp36
5 files changed, 69 insertions, 0 deletions
diff --git a/include/olm/olm.h b/include/olm/olm.h
index 61ea07b..6a2b3fb 100644
--- a/include/olm/olm.h
+++ b/include/olm/olm.h
@@ -318,6 +318,12 @@ int olm_session_has_received_message(
OlmSession *session
);
+/**
+ * Write a null-terminated string describing the internal state of an olm
+ * session to the buffer provided for debugging and logging purposes.
+ */
+void olm_session_describe(OlmSession * session, char *buf, size_t buflen);
+
/** 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..ce05fc8 100644
--- a/include/olm/session.hh
+++ b/include/olm/session.hh
@@ -131,6 +131,14 @@ struct Session {
std::uint8_t const * message, std::size_t message_length,
std::uint8_t * plaintext, std::size_t max_plaintext_length
);
+
+ /**
+ * Write a string describing this session and its state (not including the
+ * private key) into the buffer provided.
+ *
+ * Takes a buffer to write to and the length of that buffer
+ */
+ void describe(char *buf, size_t buflen);
};
diff --git a/javascript/olm_post.js b/javascript/olm_post.js
index ad058d9..e204f30 100644
--- a/javascript/olm_post.js
+++ b/javascript/olm_post.js
@@ -459,6 +459,19 @@ Session.prototype['decrypt'] = restore_stack(function(
});
+Session.prototype['describe'] = restore_stack(function() {
+ var description_buf;
+ try {
+ description_buf = malloc(256);
+ session_method(Module['_olm_session_describe'])(
+ this.ptr, description_buf, 256
+ );
+ return UTF8ToString(description_buf);
+ } finally {
+ if (description_buf !== undefined) free(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..0333b10 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;
}
+void olm_session_describe(
+ OlmSession * session, char *buf, size_t buflen
+) {
+ from_c(session)->describe(buf, buflen);
+}
+
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..b619e56 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,41 @@ std::size_t olm::Session::decrypt(
return result;
}
+void olm::Session::describe(char *describe_buffer, size_t buflen) {
+ if (buflen == 0) return;
+
+ describe_buffer[0] = '\0';
+ char *buf_pos = describe_buffer;
+
+ int size;
+
+ size = snprintf(
+ buf_pos, buflen - (buf_pos - describe_buffer),
+ "sender chain index: %d ", ratchet.sender_chain[0].chain_key.index
+ );
+ if (size > 0) buf_pos += size;
+
+ size = snprintf(buf_pos, buflen - (buf_pos - describe_buffer), "receiver chain indices:");
+ if (size > 0) buf_pos += size;
+ for (size_t i = 0; i < ratchet.receiver_chains.size(); ++i) {
+ size = snprintf(
+ buf_pos, buflen - (buf_pos - describe_buffer),
+ " %d", ratchet.receiver_chains[i].chain_key.index
+ );
+ if (size > 0) buf_pos += size;
+ }
+
+ size = snprintf(buf_pos, buflen - (buf_pos - describe_buffer), " skipped message keys:");
+ if (size >= 0) buf_pos += size;
+ for (size_t i = 0; i < ratchet.skipped_message_keys.size(); ++i) {
+ size = snprintf(
+ buf_pos, buflen - (buf_pos - describe_buffer),
+ " %d", ratchet.skipped_message_keys[i].message_key.index
+ );
+ if (size > 0) buf_pos += size;
+ }
+}
+
namespace {
// the master branch writes pickle version 1; the logging_enabled branch writes
// 0x80000001.