2015-06-22 18:50:56 +02:00
|
|
|
/* Copyright 2015 OpenMarket Ltd
|
|
|
|
*
|
|
|
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
|
|
* you may not use this file except in compliance with the License.
|
|
|
|
* You may obtain a copy of the License at
|
|
|
|
*
|
|
|
|
* http://www.apache.org/licenses/LICENSE-2.0
|
|
|
|
*
|
|
|
|
* Unless required by applicable law or agreed to in writing, software
|
|
|
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
|
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
|
|
* See the License for the specific language governing permissions and
|
|
|
|
* limitations under the License.
|
|
|
|
*/
|
2015-06-27 01:15:23 +02:00
|
|
|
#include "olm/session.hh"
|
|
|
|
#include "olm/cipher.hh"
|
|
|
|
#include "olm/crypto.hh"
|
|
|
|
#include "olm/account.hh"
|
|
|
|
#include "olm/memory.hh"
|
|
|
|
#include "olm/message.hh"
|
|
|
|
#include "olm/pickle.hh"
|
2015-06-12 15:09:41 +02:00
|
|
|
|
|
|
|
#include <cstring>
|
|
|
|
|
|
|
|
namespace {
|
|
|
|
|
|
|
|
static const std::size_t KEY_LENGTH = 32;
|
|
|
|
static const std::uint8_t PROTOCOL_VERSION = 0x3;
|
|
|
|
|
2015-06-27 01:15:23 +02:00
|
|
|
static const std::uint8_t ROOT_KDF_INFO[] = "OLM_ROOT";
|
|
|
|
static const std::uint8_t RATCHET_KDF_INFO[] = "OLM_RATCHET";
|
|
|
|
static const std::uint8_t CIPHER_KDF_INFO[] = "OLM_KEYS";
|
2015-06-12 15:09:41 +02:00
|
|
|
|
2015-06-27 01:15:23 +02:00
|
|
|
static const olm::CipherAesSha256 OLM_CIPHER(
|
2015-06-12 15:09:41 +02:00
|
|
|
CIPHER_KDF_INFO, sizeof(CIPHER_KDF_INFO) -1
|
|
|
|
);
|
|
|
|
|
2015-06-27 01:15:23 +02:00
|
|
|
static const olm::KdfInfo OLM_KDF_INFO = {
|
2015-06-12 15:09:41 +02:00
|
|
|
ROOT_KDF_INFO, sizeof(ROOT_KDF_INFO) - 1,
|
|
|
|
RATCHET_KDF_INFO, sizeof(RATCHET_KDF_INFO) - 1
|
|
|
|
};
|
|
|
|
|
|
|
|
} // namespace
|
|
|
|
|
2015-06-27 01:15:23 +02:00
|
|
|
olm::Session::Session(
|
|
|
|
) : ratchet(OLM_KDF_INFO, OLM_CIPHER),
|
|
|
|
last_error(olm::ErrorCode::SUCCESS),
|
2015-07-08 17:00:08 +02:00
|
|
|
received_message(false) {
|
2015-06-12 15:09:41 +02:00
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
2015-06-27 01:15:23 +02:00
|
|
|
std::size_t olm::Session::new_outbound_session_random_length() {
|
2015-06-22 15:30:46 +02:00
|
|
|
return KEY_LENGTH * 2;
|
2015-06-12 15:09:41 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
|
2015-06-27 01:15:23 +02:00
|
|
|
std::size_t olm::Session::new_outbound_session(
|
|
|
|
olm::Account const & local_account,
|
|
|
|
olm::Curve25519PublicKey const & identity_key,
|
2015-07-08 15:57:55 +02:00
|
|
|
olm::Curve25519PublicKey const & one_time_key,
|
2015-06-12 15:09:41 +02:00
|
|
|
std::uint8_t const * random, std::size_t random_length
|
|
|
|
) {
|
|
|
|
if (random_length < new_outbound_session_random_length()) {
|
2015-06-27 01:15:23 +02:00
|
|
|
last_error = olm::ErrorCode::NOT_ENOUGH_RANDOM;
|
2015-06-12 15:09:41 +02:00
|
|
|
return std::size_t(-1);
|
|
|
|
}
|
|
|
|
|
|
|
|
Curve25519KeyPair base_key;
|
2015-07-07 10:03:12 +02:00
|
|
|
olm::curve25519_generate_key(random, base_key);
|
2015-06-12 15:09:41 +02:00
|
|
|
|
2015-06-22 15:30:46 +02:00
|
|
|
Curve25519KeyPair ratchet_key;
|
2015-07-07 10:03:12 +02:00
|
|
|
olm::curve25519_generate_key(random + 32, ratchet_key);
|
2015-06-22 15:30:46 +02:00
|
|
|
|
2015-06-12 15:09:41 +02:00
|
|
|
received_message = false;
|
2015-07-08 15:57:55 +02:00
|
|
|
alice_identity_key = local_account.identity_keys.curve25519_key;
|
2015-06-12 15:09:41 +02:00
|
|
|
alice_base_key = base_key;
|
2015-07-08 15:57:55 +02:00
|
|
|
bob_one_time_key = one_time_key;
|
2015-06-12 15:09:41 +02:00
|
|
|
|
2015-06-22 15:30:46 +02:00
|
|
|
std::uint8_t shared_secret[96];
|
2015-06-12 15:09:41 +02:00
|
|
|
|
2015-06-27 01:15:23 +02:00
|
|
|
olm::curve25519_shared_secret(
|
2015-07-07 17:42:03 +02:00
|
|
|
local_account.identity_keys.curve25519_key,
|
2015-07-08 15:57:55 +02:00
|
|
|
one_time_key, shared_secret
|
2015-06-12 15:09:41 +02:00
|
|
|
);
|
2015-06-27 01:15:23 +02:00
|
|
|
olm::curve25519_shared_secret(
|
2015-06-22 15:30:46 +02:00
|
|
|
base_key, identity_key, shared_secret + 32
|
2015-06-12 15:09:41 +02:00
|
|
|
);
|
2015-06-27 01:15:23 +02:00
|
|
|
olm::curve25519_shared_secret(
|
2015-07-08 15:57:55 +02:00
|
|
|
base_key, one_time_key, shared_secret + 64
|
2015-06-12 15:09:41 +02:00
|
|
|
);
|
|
|
|
|
2015-06-22 15:30:46 +02:00
|
|
|
ratchet.initialise_as_alice(shared_secret, 96, ratchet_key);
|
|
|
|
|
2015-06-27 01:15:23 +02:00
|
|
|
olm::unset(base_key);
|
|
|
|
olm::unset(ratchet_key);
|
|
|
|
olm::unset(shared_secret);
|
2015-06-12 15:09:41 +02:00
|
|
|
|
|
|
|
return std::size_t(0);
|
|
|
|
}
|
|
|
|
|
|
|
|
namespace {
|
|
|
|
|
|
|
|
bool check_message_fields(
|
2015-07-16 11:45:10 +02:00
|
|
|
olm::PreKeyMessageReader & reader, bool have_their_identity_key
|
2015-06-12 15:09:41 +02:00
|
|
|
) {
|
|
|
|
bool ok = true;
|
2015-07-16 11:45:10 +02:00
|
|
|
ok = ok && (have_their_identity_key || reader.identity_key);
|
|
|
|
if (reader.identity_key) {
|
|
|
|
ok = ok && reader.identity_key_length == KEY_LENGTH;
|
|
|
|
}
|
2015-06-12 15:09:41 +02:00
|
|
|
ok = ok && reader.message;
|
|
|
|
ok = ok && reader.base_key;
|
|
|
|
ok = ok && reader.base_key_length == KEY_LENGTH;
|
2015-07-08 15:53:25 +02:00
|
|
|
ok = ok && reader.one_time_key;
|
|
|
|
ok = ok && reader.one_time_key_length == KEY_LENGTH;
|
2015-06-12 15:09:41 +02:00
|
|
|
return ok;
|
|
|
|
}
|
|
|
|
|
|
|
|
} // namespace
|
|
|
|
|
|
|
|
|
2015-06-27 01:15:23 +02:00
|
|
|
std::size_t olm::Session::new_inbound_session(
|
|
|
|
olm::Account & local_account,
|
2015-07-16 11:45:10 +02:00
|
|
|
olm::Curve25519PublicKey const * their_identity_key,
|
2015-06-12 15:09:41 +02:00
|
|
|
std::uint8_t const * one_time_key_message, std::size_t message_length
|
|
|
|
) {
|
2015-06-27 01:15:23 +02:00
|
|
|
olm::PreKeyMessageReader reader;
|
2015-06-12 15:09:41 +02:00
|
|
|
decode_one_time_key_message(reader, one_time_key_message, message_length);
|
|
|
|
|
2015-07-16 11:45:10 +02:00
|
|
|
if (!check_message_fields(reader, their_identity_key)) {
|
2015-06-27 01:15:23 +02:00
|
|
|
last_error = olm::ErrorCode::BAD_MESSAGE_FORMAT;
|
2015-06-12 15:09:41 +02:00
|
|
|
return std::size_t(-1);
|
|
|
|
}
|
|
|
|
|
2015-07-16 11:45:10 +02:00
|
|
|
if (reader.identity_key && their_identity_key) {
|
|
|
|
bool same = 0 == std::memcmp(
|
|
|
|
their_identity_key->public_key, reader.identity_key, KEY_LENGTH
|
|
|
|
);
|
|
|
|
if (!same) {
|
|
|
|
last_error = olm::ErrorCode::BAD_MESSAGE_KEY_ID;
|
|
|
|
return std::size_t(-1);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2015-06-27 01:15:23 +02:00
|
|
|
olm::MessageReader message_reader;
|
2015-06-22 15:30:46 +02:00
|
|
|
decode_message(
|
|
|
|
message_reader, reader.message, reader.message_length,
|
|
|
|
ratchet.ratchet_cipher.mac_length()
|
|
|
|
);
|
|
|
|
|
|
|
|
if (!message_reader.ratchet_key
|
|
|
|
|| message_reader.ratchet_key_length != KEY_LENGTH) {
|
2015-06-27 01:15:23 +02:00
|
|
|
last_error = olm::ErrorCode::BAD_MESSAGE_FORMAT;
|
2015-06-22 15:30:46 +02:00
|
|
|
return std::size_t(-1);
|
|
|
|
}
|
|
|
|
|
2015-07-08 15:57:55 +02:00
|
|
|
std::memcpy(alice_identity_key.public_key, reader.identity_key, 32);
|
2015-06-12 15:09:41 +02:00
|
|
|
std::memcpy(alice_base_key.public_key, reader.base_key, 32);
|
2015-07-08 15:53:25 +02:00
|
|
|
std::memcpy(bob_one_time_key.public_key, reader.one_time_key, 32);
|
2015-06-27 01:15:23 +02:00
|
|
|
olm::Curve25519PublicKey ratchet_key;
|
2015-06-22 15:30:46 +02:00
|
|
|
std::memcpy(ratchet_key.public_key, message_reader.ratchet_key, 32);
|
2015-06-12 15:09:41 +02:00
|
|
|
|
2015-07-08 15:53:25 +02:00
|
|
|
olm::OneTimeKey const * our_one_time_key = local_account.lookup_key(
|
|
|
|
bob_one_time_key
|
2015-06-12 15:09:41 +02:00
|
|
|
);
|
|
|
|
|
2015-07-08 15:53:25 +02:00
|
|
|
if (!our_one_time_key) {
|
2015-06-27 01:15:23 +02:00
|
|
|
last_error = olm::ErrorCode::BAD_MESSAGE_KEY_ID;
|
2015-06-12 15:09:41 +02:00
|
|
|
return std::size_t(-1);
|
|
|
|
}
|
|
|
|
|
2015-06-22 15:30:46 +02:00
|
|
|
std::uint8_t shared_secret[96];
|
2015-06-12 15:09:41 +02:00
|
|
|
|
2015-06-27 01:15:23 +02:00
|
|
|
olm::curve25519_shared_secret(
|
2015-07-08 15:57:55 +02:00
|
|
|
our_one_time_key->key, alice_identity_key, shared_secret
|
2015-06-12 15:09:41 +02:00
|
|
|
);
|
2015-06-27 01:15:23 +02:00
|
|
|
olm::curve25519_shared_secret(
|
2015-07-07 17:42:03 +02:00
|
|
|
local_account.identity_keys.curve25519_key,
|
|
|
|
alice_base_key, shared_secret + 32
|
2015-06-12 15:09:41 +02:00
|
|
|
);
|
2015-06-27 01:15:23 +02:00
|
|
|
olm::curve25519_shared_secret(
|
2015-07-08 15:53:25 +02:00
|
|
|
our_one_time_key->key, alice_base_key, shared_secret + 64
|
2015-06-12 15:09:41 +02:00
|
|
|
);
|
|
|
|
|
2015-06-22 15:30:46 +02:00
|
|
|
ratchet.initialise_as_bob(shared_secret, 96, ratchet_key);
|
2015-06-12 15:09:41 +02:00
|
|
|
|
|
|
|
return std::size_t(0);
|
|
|
|
}
|
|
|
|
|
|
|
|
|
2015-07-16 12:45:20 +02:00
|
|
|
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();
|
|
|
|
}
|
|
|
|
|
|
|
|
|
2015-06-27 01:15:23 +02:00
|
|
|
bool olm::Session::matches_inbound_session(
|
2015-07-16 11:45:10 +02:00
|
|
|
olm::Curve25519PublicKey const * their_identity_key,
|
2015-06-12 15:09:41 +02:00
|
|
|
std::uint8_t const * one_time_key_message, std::size_t message_length
|
|
|
|
) {
|
2015-06-27 01:15:23 +02:00
|
|
|
olm::PreKeyMessageReader reader;
|
2015-06-12 15:09:41 +02:00
|
|
|
decode_one_time_key_message(reader, one_time_key_message, message_length);
|
|
|
|
|
2015-07-16 11:45:10 +02:00
|
|
|
if (!check_message_fields(reader, their_identity_key)) {
|
2015-06-12 15:09:41 +02:00
|
|
|
return false;
|
|
|
|
}
|
|
|
|
|
|
|
|
bool same = true;
|
2015-07-16 11:45:10 +02:00
|
|
|
if (reader.identity_key) {
|
|
|
|
same = same && 0 == std::memcmp(
|
|
|
|
reader.identity_key, alice_identity_key.public_key, KEY_LENGTH
|
|
|
|
);
|
|
|
|
}
|
|
|
|
if (their_identity_key) {
|
|
|
|
same = same && 0 == std::memcmp(
|
|
|
|
their_identity_key->public_key, alice_identity_key.public_key,
|
|
|
|
KEY_LENGTH
|
|
|
|
);
|
|
|
|
}
|
2015-06-12 15:09:41 +02:00
|
|
|
same = same && 0 == std::memcmp(
|
|
|
|
reader.base_key, alice_base_key.public_key, KEY_LENGTH
|
|
|
|
);
|
2015-07-08 15:53:25 +02:00
|
|
|
same = same && 0 == std::memcmp(
|
|
|
|
reader.one_time_key, bob_one_time_key.public_key, KEY_LENGTH
|
|
|
|
);
|
2015-06-12 15:09:41 +02:00
|
|
|
return same;
|
|
|
|
}
|
|
|
|
|
|
|
|
|
2015-06-27 01:15:23 +02:00
|
|
|
olm::MessageType olm::Session::encrypt_message_type() {
|
2015-06-12 15:09:41 +02:00
|
|
|
if (received_message) {
|
2015-06-27 01:15:23 +02:00
|
|
|
return olm::MessageType::MESSAGE;
|
2015-06-12 15:09:41 +02:00
|
|
|
} else {
|
2015-06-27 01:15:23 +02:00
|
|
|
return olm::MessageType::PRE_KEY;
|
2015-06-12 15:09:41 +02:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
2015-06-27 01:15:23 +02:00
|
|
|
std::size_t olm::Session::encrypt_message_length(
|
2015-06-12 15:09:41 +02:00
|
|
|
std::size_t plaintext_length
|
|
|
|
) {
|
|
|
|
std::size_t message_length = ratchet.encrypt_output_length(
|
|
|
|
plaintext_length
|
|
|
|
);
|
|
|
|
|
|
|
|
if (received_message) {
|
|
|
|
return message_length;
|
|
|
|
}
|
|
|
|
|
|
|
|
return encode_one_time_key_message_length(
|
2015-07-08 15:53:25 +02:00
|
|
|
KEY_LENGTH,
|
2015-06-12 15:09:41 +02:00
|
|
|
KEY_LENGTH,
|
|
|
|
KEY_LENGTH,
|
|
|
|
message_length
|
|
|
|
);
|
|
|
|
}
|
|
|
|
|
|
|
|
|
2015-06-27 01:15:23 +02:00
|
|
|
std::size_t olm::Session::encrypt_random_length() {
|
2015-06-12 15:09:41 +02:00
|
|
|
return ratchet.encrypt_random_length();
|
|
|
|
}
|
|
|
|
|
|
|
|
|
2015-06-27 01:15:23 +02:00
|
|
|
std::size_t olm::Session::encrypt(
|
2015-06-12 15:09:41 +02:00
|
|
|
std::uint8_t const * plaintext, std::size_t plaintext_length,
|
|
|
|
std::uint8_t const * random, std::size_t random_length,
|
|
|
|
std::uint8_t * message, std::size_t message_length
|
|
|
|
) {
|
|
|
|
if (message_length < encrypt_message_length(plaintext_length)) {
|
2015-06-27 01:15:23 +02:00
|
|
|
last_error = olm::ErrorCode::OUTPUT_BUFFER_TOO_SMALL;
|
2015-06-12 15:09:41 +02:00
|
|
|
return std::size_t(-1);
|
|
|
|
}
|
|
|
|
std::uint8_t * message_body;
|
|
|
|
std::size_t message_body_length = ratchet.encrypt_output_length(
|
|
|
|
plaintext_length
|
|
|
|
);
|
|
|
|
|
|
|
|
if (received_message) {
|
|
|
|
message_body = message;
|
|
|
|
} else {
|
2015-06-27 01:15:23 +02:00
|
|
|
olm::PreKeyMessageWriter writer;
|
2015-06-12 15:09:41 +02:00
|
|
|
encode_one_time_key_message(
|
|
|
|
writer,
|
|
|
|
PROTOCOL_VERSION,
|
2015-07-08 15:53:25 +02:00
|
|
|
KEY_LENGTH,
|
2015-06-12 15:09:41 +02:00
|
|
|
KEY_LENGTH,
|
|
|
|
KEY_LENGTH,
|
|
|
|
message_body_length,
|
|
|
|
message
|
|
|
|
);
|
2015-07-08 15:53:25 +02:00
|
|
|
std::memcpy(
|
|
|
|
writer.one_time_key, bob_one_time_key.public_key, KEY_LENGTH
|
|
|
|
);
|
2015-06-12 15:09:41 +02:00
|
|
|
std::memcpy(
|
2015-07-08 15:57:55 +02:00
|
|
|
writer.identity_key, alice_identity_key.public_key, KEY_LENGTH
|
2015-06-12 15:09:41 +02:00
|
|
|
);
|
|
|
|
std::memcpy(
|
|
|
|
writer.base_key, alice_base_key.public_key, KEY_LENGTH
|
|
|
|
);
|
|
|
|
message_body = writer.message;
|
|
|
|
}
|
|
|
|
|
|
|
|
std::size_t result = ratchet.encrypt(
|
|
|
|
plaintext, plaintext_length,
|
|
|
|
random, random_length,
|
|
|
|
message_body, message_body_length
|
|
|
|
);
|
|
|
|
|
|
|
|
if (result == std::size_t(-1)) {
|
|
|
|
last_error = ratchet.last_error;
|
2015-06-27 01:15:23 +02:00
|
|
|
ratchet.last_error = olm::ErrorCode::SUCCESS;
|
2015-06-12 15:09:41 +02:00
|
|
|
}
|
|
|
|
return result;
|
|
|
|
}
|
|
|
|
|
|
|
|
|
2015-06-27 01:15:23 +02:00
|
|
|
std::size_t olm::Session::decrypt_max_plaintext_length(
|
2015-06-12 15:09:41 +02:00
|
|
|
MessageType message_type,
|
|
|
|
std::uint8_t const * message, std::size_t message_length
|
|
|
|
) {
|
|
|
|
std::uint8_t const * message_body;
|
|
|
|
std::size_t message_body_length;
|
2015-06-27 01:15:23 +02:00
|
|
|
if (message_type == olm::MessageType::MESSAGE) {
|
2015-06-12 15:09:41 +02:00
|
|
|
message_body = message;
|
|
|
|
message_body_length = message_length;
|
|
|
|
} else {
|
2015-06-27 01:15:23 +02:00
|
|
|
olm::PreKeyMessageReader reader;
|
2015-06-12 15:09:41 +02:00
|
|
|
decode_one_time_key_message(reader, message, message_length);
|
|
|
|
if (!reader.message) {
|
2015-06-27 01:15:23 +02:00
|
|
|
last_error = olm::ErrorCode::BAD_MESSAGE_FORMAT;
|
2015-06-12 15:09:41 +02:00
|
|
|
return std::size_t(-1);
|
|
|
|
}
|
|
|
|
message_body = reader.message;
|
|
|
|
message_body_length = reader.message_length;
|
|
|
|
}
|
|
|
|
|
|
|
|
std::size_t result = ratchet.decrypt_max_plaintext_length(
|
|
|
|
message_body, message_body_length
|
|
|
|
);
|
|
|
|
|
|
|
|
if (result == std::size_t(-1)) {
|
|
|
|
last_error = ratchet.last_error;
|
2015-06-27 01:15:23 +02:00
|
|
|
ratchet.last_error = olm::ErrorCode::SUCCESS;
|
2015-06-12 15:09:41 +02:00
|
|
|
}
|
|
|
|
return result;
|
|
|
|
}
|
|
|
|
|
|
|
|
|
2015-06-27 01:15:23 +02:00
|
|
|
std::size_t olm::Session::decrypt(
|
|
|
|
olm::MessageType message_type,
|
2015-06-12 15:09:41 +02:00
|
|
|
std::uint8_t const * message, std::size_t message_length,
|
|
|
|
std::uint8_t * plaintext, std::size_t max_plaintext_length
|
|
|
|
) {
|
|
|
|
std::uint8_t const * message_body;
|
|
|
|
std::size_t message_body_length;
|
2015-06-27 01:15:23 +02:00
|
|
|
if (message_type == olm::MessageType::MESSAGE) {
|
2015-06-12 15:09:41 +02:00
|
|
|
message_body = message;
|
|
|
|
message_body_length = message_length;
|
|
|
|
} else {
|
2015-06-27 01:15:23 +02:00
|
|
|
olm::PreKeyMessageReader reader;
|
2015-06-12 15:09:41 +02:00
|
|
|
decode_one_time_key_message(reader, message, message_length);
|
|
|
|
if (!reader.message) {
|
2015-06-27 01:15:23 +02:00
|
|
|
last_error = olm::ErrorCode::BAD_MESSAGE_FORMAT;
|
2015-06-12 15:09:41 +02:00
|
|
|
return std::size_t(-1);
|
|
|
|
}
|
|
|
|
message_body = reader.message;
|
|
|
|
message_body_length = reader.message_length;
|
|
|
|
}
|
|
|
|
|
|
|
|
std::size_t result = ratchet.decrypt(
|
|
|
|
message_body, message_body_length, plaintext, max_plaintext_length
|
|
|
|
);
|
|
|
|
|
|
|
|
if (result == std::size_t(-1)) {
|
|
|
|
last_error = ratchet.last_error;
|
2015-06-27 01:15:23 +02:00
|
|
|
ratchet.last_error = olm::ErrorCode::SUCCESS;
|
2015-06-16 16:15:40 +02:00
|
|
|
} else {
|
|
|
|
received_message = true;
|
2015-06-12 15:09:41 +02:00
|
|
|
}
|
|
|
|
return result;
|
|
|
|
}
|
2015-06-12 17:15:37 +02:00
|
|
|
|
2015-07-10 19:00:18 +02:00
|
|
|
namespace {
|
|
|
|
static const std::uint32_t SESSION_PICKLE_VERSION = 1;
|
|
|
|
}
|
2015-06-12 17:15:37 +02:00
|
|
|
|
2015-06-27 01:15:23 +02:00
|
|
|
std::size_t olm::pickle_length(
|
2015-06-12 17:15:37 +02:00
|
|
|
Session const & value
|
|
|
|
) {
|
|
|
|
std::size_t length = 0;
|
2015-07-10 19:00:18 +02:00
|
|
|
length += olm::pickle_length(SESSION_PICKLE_VERSION);
|
2015-06-27 01:15:23 +02:00
|
|
|
length += olm::pickle_length(value.received_message);
|
2015-07-08 15:57:55 +02:00
|
|
|
length += olm::pickle_length(value.alice_identity_key);
|
2015-06-27 01:15:23 +02:00
|
|
|
length += olm::pickle_length(value.alice_base_key);
|
2015-07-08 15:53:25 +02:00
|
|
|
length += olm::pickle_length(value.bob_one_time_key);
|
2015-06-27 01:15:23 +02:00
|
|
|
length += olm::pickle_length(value.ratchet);
|
2015-06-12 17:15:37 +02:00
|
|
|
return length;
|
|
|
|
}
|
|
|
|
|
|
|
|
|
2015-06-27 01:15:23 +02:00
|
|
|
std::uint8_t * olm::pickle(
|
2015-06-12 17:15:37 +02:00
|
|
|
std::uint8_t * pos,
|
|
|
|
Session const & value
|
|
|
|
) {
|
2015-07-10 19:00:18 +02:00
|
|
|
pos = olm::pickle(pos, SESSION_PICKLE_VERSION);
|
2015-06-27 01:15:23 +02:00
|
|
|
pos = olm::pickle(pos, value.received_message);
|
2015-07-08 15:57:55 +02:00
|
|
|
pos = olm::pickle(pos, value.alice_identity_key);
|
2015-06-27 01:15:23 +02:00
|
|
|
pos = olm::pickle(pos, value.alice_base_key);
|
2015-07-08 15:53:25 +02:00
|
|
|
pos = olm::pickle(pos, value.bob_one_time_key);
|
2015-06-27 01:15:23 +02:00
|
|
|
pos = olm::pickle(pos, value.ratchet);
|
2015-06-12 17:15:37 +02:00
|
|
|
return pos;
|
|
|
|
}
|
|
|
|
|
|
|
|
|
2015-06-27 01:15:23 +02:00
|
|
|
std::uint8_t const * olm::unpickle(
|
2015-06-12 17:15:37 +02:00
|
|
|
std::uint8_t const * pos, std::uint8_t const * end,
|
|
|
|
Session & value
|
|
|
|
) {
|
2015-07-10 19:00:18 +02:00
|
|
|
uint32_t pickle_version;
|
|
|
|
pos = olm::unpickle(pos, end, pickle_version);
|
|
|
|
if (pickle_version != SESSION_PICKLE_VERSION) {
|
|
|
|
value.last_error = olm::ErrorCode::UNKNOWN_PICKLE_VERSION;
|
|
|
|
return end;
|
|
|
|
}
|
2015-06-27 01:15:23 +02:00
|
|
|
pos = olm::unpickle(pos, end, value.received_message);
|
2015-07-08 15:57:55 +02:00
|
|
|
pos = olm::unpickle(pos, end, value.alice_identity_key);
|
2015-06-27 01:15:23 +02:00
|
|
|
pos = olm::unpickle(pos, end, value.alice_base_key);
|
2015-07-08 15:53:25 +02:00
|
|
|
pos = olm::unpickle(pos, end, value.bob_one_time_key);
|
2015-06-27 01:15:23 +02:00
|
|
|
pos = olm::unpickle(pos, end, value.ratchet);
|
2015-06-12 17:15:37 +02:00
|
|
|
return pos;
|
|
|
|
}
|
|
|
|
|