diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/ratchet.cpp | 18 | ||||
-rw-r--r-- | src/session.cpp | 22 |
2 files changed, 34 insertions, 6 deletions
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; } diff --git a/src/session.cpp b/src/session.cpp index c148c97..b76a6b8 100644 --- a/src/session.cpp +++ b/src/session.cpp @@ -396,7 +396,7 @@ std::size_t olm::Session::decrypt( } namespace { -static const std::uint32_t SESSION_PICKLE_VERSION = 1; +static const std::uint32_t SESSION_PICKLE_VERSION = 2; } std::size_t olm::pickle_length( @@ -433,14 +433,26 @@ std::uint8_t const * olm::unpickle( ) { uint32_t pickle_version; pos = olm::unpickle(pos, end, pickle_version); - if (pickle_version != SESSION_PICKLE_VERSION) { - value.last_error = OlmErrorCode::OLM_UNKNOWN_PICKLE_VERSION; - return end; + + bool includes_chain_index; + switch (pickle_version) { + case 1: + includes_chain_index = false; + break; + + case 2: + includes_chain_index = true; + break; + + default: + value.last_error = OlmErrorCode::OLM_UNKNOWN_PICKLE_VERSION; + return end; } + pos = olm::unpickle(pos, end, value.received_message); pos = olm::unpickle(pos, end, value.alice_identity_key); pos = olm::unpickle(pos, end, value.alice_base_key); pos = olm::unpickle(pos, end, value.bob_one_time_key); - pos = olm::unpickle(pos, end, value.ratchet); + pos = olm::unpickle(pos, end, value.ratchet, includes_chain_index); return pos; } |