From 8dd3c182ee568b9121a336b106aaaceedd1cc470 Mon Sep 17 00:00:00 2001 From: Richard van der Hoff Date: Thu, 30 Jun 2016 11:27:25 +0100 Subject: Make space in the session pickle for chain index Keeping track of the chain index is a useful thing to do, but is only required if we've enabled diagnostics. Extend the session pickle format to make a space for it, so that pickles can be transferred between the logging_enabled branch and the master branch without loss of information. Also add some tests for session pickling which explicitly check that we can unpickle both formats of pickle. --- src/ratchet.cpp | 18 +++++++++++++++++- 1 file changed, 17 insertions(+), 1 deletion(-) (limited to 'src/ratchet.cpp') diff --git a/src/ratchet.cpp b/src/ratchet.cpp index dd1d42c..671d260 100644 --- a/src/ratchet.cpp +++ b/src/ratchet.cpp @@ -363,6 +363,10 @@ std::size_t olm::pickle_length( length += olm::pickle_length(value.sender_chain); length += olm::pickle_length(value.receiver_chains); length += olm::pickle_length(value.skipped_message_keys); + + // the logging_enabled branch includes a 'chain_index' field + length += olm::pickle_length(std::uint32_t(0)); + return length; } @@ -374,18 +378,30 @@ std::uint8_t * olm::pickle( pos = pickle(pos, value.sender_chain); pos = pickle(pos, value.receiver_chains); pos = pickle(pos, value.skipped_message_keys); + + // the logging_enabled branch includes a 'chain_index' field; for us, it is + // empty. + pos = pickle(pos, std::uint32_t(0)); + return pos; } std::uint8_t const * olm::unpickle( std::uint8_t const * pos, std::uint8_t const * end, - olm::Ratchet & value + olm::Ratchet & value, + bool includes_chain_index ) { pos = unpickle(pos, end, value.root_key); pos = unpickle(pos, end, value.sender_chain); pos = unpickle(pos, end, value.receiver_chains); pos = unpickle(pos, end, value.skipped_message_keys); + + // pickle v2 includes a chain index; pickle v1 did not. + if (includes_chain_index) { + std::uint32_t dummy; + pos = unpickle(pos, end, dummy); + } return pos; } -- cgit v1.2.3