diff options
-rw-r--r-- | include/olm/olm.h | 6 | ||||
-rw-r--r-- | include/olm/session.hh | 8 | ||||
-rw-r--r-- | javascript/olm_post.js | 13 | ||||
-rw-r--r-- | src/olm.cpp | 6 | ||||
-rw-r--r-- | src/session.cpp | 36 |
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. |