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.
This commit is contained in:
David Baker 2019-10-01 11:14:16 +01:00
parent 3568060570
commit 39a1ee0b18
5 changed files with 56 additions and 0 deletions

View file

@ -318,6 +318,8 @@ int olm_session_has_received_message(
OlmSession *session OlmSession *session
); );
const char * olm_session_describe(OlmSession * session);
/** Checks if the PRE_KEY message is for this in-bound session. This can happen /** 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 * 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 * message in reply. The one_time_key_message buffer is destroyed. Returns 1 if

View file

@ -17,6 +17,8 @@
#include "olm/ratchet.hh" #include "olm/ratchet.hh"
#define DESCRIBE_BUFFER_LEN 256
namespace olm { namespace olm {
struct Account; struct Account;
@ -35,6 +37,8 @@ struct Session {
bool received_message; bool received_message;
char describe_buffer[DESCRIBE_BUFFER_LEN];
_olm_curve25519_public_key alice_identity_key; _olm_curve25519_public_key alice_identity_key;
_olm_curve25519_public_key alice_base_key; _olm_curve25519_public_key alice_base_key;
_olm_curve25519_public_key bob_one_time_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 const * message, std::size_t message_length,
std::uint8_t * plaintext, std::size_t max_plaintext_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();
}; };

View file

@ -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() { function Utility() {
var size = Module['_olm_utility_size'](); var size = Module['_olm_utility_size']();
this.buf = malloc(size); this.buf = malloc(size);

View file

@ -535,6 +535,12 @@ int olm_session_has_received_message(
return from_c(session)->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( size_t olm_matches_inbound_session(
OlmSession * session, OlmSession * session,
void * one_time_key_message, size_t message_length void * one_time_key_message, size_t message_length

View file

@ -21,6 +21,7 @@
#include "olm/pickle.hh" #include "olm/pickle.hh"
#include <cstring> #include <cstring>
#include <stdio.h>
namespace { namespace {
@ -397,6 +398,34 @@ std::size_t olm::Session::decrypt(
return result; 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 { namespace {
// the master branch writes pickle version 1; the logging_enabled branch writes // the master branch writes pickle version 1; the logging_enabled branch writes
// 0x80000001. // 0x80000001.