diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/olm.cpp | 32 | ||||
-rw-r--r-- | src/session.cpp | 21 |
2 files changed, 52 insertions, 1 deletions
diff --git a/src/olm.cpp b/src/olm.cpp index 17461fe..cb4291e 100644 --- a/src/olm.cpp +++ b/src/olm.cpp @@ -552,6 +552,33 @@ size_t olm_create_inbound_session_from( } +size_t olm_session_id_length( + OlmSession * session +) { + return b64_output_length(from_c(session)->session_id_length()); +} + + +size_t olm_session_id( + OlmSession * session, + void * id, size_t id_length +) { + std::size_t raw_length = from_c(session)->session_id_length(); + if (id_length < b64_output_length(raw_length)) { + from_c(session)->last_error = + olm::ErrorCode::OUTPUT_BUFFER_TOO_SMALL; + return std::size_t(-1); + } + std::size_t result = from_c(session)->session_id( + b64_output_pos(from_c(id), raw_length), raw_length + ); + if (result == std::size_t(-1)) { + return result; + } + return b64_output(from_c(id), raw_length); +} + + size_t olm_matches_inbound_session( OlmSession * session, void * one_time_key_message, size_t message_length @@ -649,12 +676,15 @@ size_t olm_encrypt( olm::ErrorCode::OUTPUT_BUFFER_TOO_SMALL; return std::size_t(-1); } - from_c(session)->encrypt( + std::size_t result = from_c(session)->encrypt( from_c(plaintext), plaintext_length, from_c(random), random_length, b64_output_pos(from_c(message), raw_length), raw_length ); olm::unset(random, random_length); + if (result == std::size_t(-1)) { + return result; + } return b64_output(from_c(message), raw_length); } diff --git a/src/session.cpp b/src/session.cpp index 0249e6c..b17a059 100644 --- a/src/session.cpp +++ b/src/session.cpp @@ -189,6 +189,27 @@ std::size_t olm::Session::new_inbound_session( } +std::size_t olm::Session::session_id_length() { + return 32; +} + + +std::size_t olm::Session::session_id( + std::uint8_t * id, std::size_t id_length +) { + if (id_length < session_id_length()) { + last_error = olm::ErrorCode::OUTPUT_BUFFER_TOO_SMALL; + return std::size_t(-1); + } + std::uint8_t tmp[96]; + std::memcpy(tmp, alice_identity_key.public_key, 32); + std::memcpy(tmp + 32, alice_base_key.public_key, 32); + std::memcpy(tmp + 64, bob_one_time_key.public_key, 32); + olm::sha256(tmp, sizeof(tmp), id); + return session_id_length(); +} + + bool olm::Session::matches_inbound_session( olm::Curve25519PublicKey const * their_identity_key, std::uint8_t const * one_time_key_message, std::size_t message_length |