aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/olm.cpp32
-rw-r--r--src/session.cpp21
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