forked from blue/squawk
feat: wip omemo + key publish
This commit is contained in:
parent
442ad37300
commit
6c9f1ab964
13 changed files with 147 additions and 96 deletions
|
@ -3,12 +3,18 @@
|
|||
*/
|
||||
|
||||
#include "context.h"
|
||||
#include "crypto/crypto.h"
|
||||
|
||||
using namespace Signal;
|
||||
|
||||
Context::Context() {}
|
||||
Context::Context() : cryptoProvider{ Signal::Crypto::createProvider() } {
|
||||
signal_context_create(&ctx, nullptr);
|
||||
signal_context_set_crypto_provider(ctx, &cryptoProvider);
|
||||
}
|
||||
|
||||
Context::~Context() {}
|
||||
Context::~Context() {
|
||||
signal_context_destroy(ctx);
|
||||
}
|
||||
|
||||
std::unique_ptr<Crypto::ECKeyPair> Context::generateCurveKeyPair() {
|
||||
auto result = std::unique_ptr<Crypto::ECKeyPair>();
|
||||
|
|
|
@ -25,6 +25,7 @@ namespace Signal {
|
|||
signal_context *temporaryGetContextUnsafeForRawAccessThatNeedsToBeWrapped();
|
||||
|
||||
private:
|
||||
signal_crypto_provider cryptoProvider{};
|
||||
signal_context *ctx{nullptr};
|
||||
};
|
||||
|
||||
|
|
|
@ -4,26 +4,6 @@
|
|||
|
||||
#include "sender_key_store.h"
|
||||
|
||||
void Signal::Store::SenderKeyStore::boundToContext(
|
||||
signal_protocol_store_context *ctx) {
|
||||
signal_protocol_sender_key_store store{};
|
||||
|
||||
store.user_data = nullptr;
|
||||
store.destroy_func = nullptr;
|
||||
|
||||
store.load_sender_key = [](signal_buffer **record, signal_buffer **user_record,
|
||||
const signal_protocol_sender_key_name *sender_key_name, void *ptr) {
|
||||
return static_cast<SenderKeyStore *>(ptr)->loadSenderKey(record, user_record, sender_key_name);
|
||||
};
|
||||
store.store_sender_key = [](const signal_protocol_sender_key_name *sender_key_name, uint8_t *record,
|
||||
size_t record_len, uint8_t *user_record, size_t user_record_len, void *ptr) {
|
||||
return static_cast<SenderKeyStore *>(ptr)->storeSenderKey(sender_key_name, record, record_len, user_record,
|
||||
user_record_len);
|
||||
};
|
||||
|
||||
signal_protocol_store_context_set_sender_key_store(ctx, &store);
|
||||
}
|
||||
|
||||
int Signal::Store::SenderKeyStore::loadSenderKey(signal_buffer **record, signal_buffer **user_record,
|
||||
const signal_protocol_sender_key_name *sender_key_name) {
|
||||
return 0;
|
||||
|
@ -34,3 +14,17 @@ int Signal::Store::SenderKeyStore::storeSenderKey(const signal_protocol_sender_k
|
|||
size_t user_record_len) {
|
||||
return 0;
|
||||
}
|
||||
|
||||
void Signal::Store::SenderKeyStore::fillCallbacks(signal_protocol_sender_key_store &store) {
|
||||
store.user_data = nullptr;
|
||||
store.destroy_func = nullptr;
|
||||
store.load_sender_key = [](signal_buffer **record, signal_buffer **user_record,
|
||||
const signal_protocol_sender_key_name *sender_key_name, void *ptr) {
|
||||
return static_cast<SenderKeyStore *>(ptr)->loadSenderKey(record, user_record, sender_key_name);
|
||||
};
|
||||
store.store_sender_key = [](const signal_protocol_sender_key_name *sender_key_name, uint8_t *record,
|
||||
size_t record_len, uint8_t *user_record, size_t user_record_len, void *ptr) {
|
||||
return static_cast<SenderKeyStore *>(ptr)->storeSenderKey(sender_key_name, record, record_len, user_record,
|
||||
user_record_len);
|
||||
};
|
||||
}
|
||||
|
|
|
@ -10,12 +10,12 @@ namespace Signal::Store {
|
|||
|
||||
class SenderKeyStore {
|
||||
public:
|
||||
static void boundToContext(signal_protocol_store_context *ctx);
|
||||
|
||||
int storeSenderKey(const signal_protocol_sender_key_name *sender_key_name, uint8_t *record, size_t record_len,
|
||||
uint8_t *user_record, size_t user_record_len);
|
||||
int loadSenderKey(signal_buffer **record, signal_buffer **user_record,
|
||||
const signal_protocol_sender_key_name *sender_key_name);
|
||||
|
||||
void fillCallbacks(signal_protocol_sender_key_store &store);
|
||||
};
|
||||
|
||||
} // namespace Signal::Store
|
||||
|
|
|
@ -4,38 +4,6 @@
|
|||
|
||||
#include "session_store.h"
|
||||
|
||||
void Signal::Store::SessionStore::boundToContext(
|
||||
signal_protocol_store_context *ctx) {
|
||||
signal_protocol_session_store store{};
|
||||
|
||||
store.user_data = nullptr;
|
||||
store.destroy_func = nullptr;
|
||||
|
||||
store.load_session_func = [](signal_buffer **record, signal_buffer **user_record,
|
||||
const signal_protocol_address *address, void *ptr) {
|
||||
return static_cast<SessionStore *>(ptr)->loadSession(record, user_record, address);
|
||||
};
|
||||
store.get_sub_device_sessions_func = [](signal_int_list **sessions, const char *name, size_t name_len, void *ptr) {
|
||||
return static_cast<SessionStore *>(ptr)->getSubDeviceSessions(sessions, name, name_len);
|
||||
};
|
||||
store.store_session_func = [](const signal_protocol_address *address, uint8_t *record, size_t record_len,
|
||||
uint8_t *user_record, size_t user_record_len, void *ptr) {
|
||||
return static_cast<SessionStore *>(ptr)->storeSession(address, record, record_len, user_record,
|
||||
user_record_len);
|
||||
};
|
||||
store.contains_session_func = [](const signal_protocol_address *address, void *ptr) {
|
||||
return static_cast<SessionStore *>(ptr)->containsSession(address);
|
||||
};
|
||||
store.delete_session_func = [](const signal_protocol_address *address, void *ptr) {
|
||||
return static_cast<SessionStore *>(ptr)->deleteSession(address);
|
||||
};
|
||||
store.delete_all_sessions_func = [](const char *name, size_t name_len, void *ptr) {
|
||||
return static_cast<SessionStore *>(ptr)->deleteAllSessions(name, name_len);
|
||||
};
|
||||
|
||||
signal_protocol_store_context_set_session_store(ctx, &store);
|
||||
}
|
||||
|
||||
int Signal::Store::SessionStore::loadSession(signal_buffer **record, signal_buffer **user_record,
|
||||
const signal_protocol_address *address) {
|
||||
return 0;
|
||||
|
@ -61,3 +29,29 @@ int Signal::Store::SessionStore::deleteSession(const signal_protocol_address *ad
|
|||
int Signal::Store::SessionStore::deleteAllSessions(const char *name, size_t name_len) {
|
||||
return 0;
|
||||
}
|
||||
|
||||
void Signal::Store::SessionStore::fillCallbacks(signal_protocol_session_store &store) {
|
||||
store.user_data = nullptr;
|
||||
store.destroy_func = nullptr;
|
||||
store.load_session_func = [](signal_buffer **record, signal_buffer **user_record,
|
||||
const signal_protocol_address *address, void *ptr) {
|
||||
return static_cast<SessionStore *>(ptr)->loadSession(record, user_record, address);
|
||||
};
|
||||
store.get_sub_device_sessions_func = [](signal_int_list **sessions, const char *name, size_t name_len, void *ptr) {
|
||||
return static_cast<SessionStore *>(ptr)->getSubDeviceSessions(sessions, name, name_len);
|
||||
};
|
||||
store.store_session_func = [](const signal_protocol_address *address, uint8_t *record, size_t record_len,
|
||||
uint8_t *user_record, size_t user_record_len, void *ptr) {
|
||||
return static_cast<SessionStore *>(ptr)->storeSession(address, record, record_len, user_record,
|
||||
user_record_len);
|
||||
};
|
||||
store.contains_session_func = [](const signal_protocol_address *address, void *ptr) {
|
||||
return static_cast<SessionStore *>(ptr)->containsSession(address);
|
||||
};
|
||||
store.delete_session_func = [](const signal_protocol_address *address, void *ptr) {
|
||||
return static_cast<SessionStore *>(ptr)->deleteSession(address);
|
||||
};
|
||||
store.delete_all_sessions_func = [](const char *name, size_t name_len, void *ptr) {
|
||||
return static_cast<SessionStore *>(ptr)->deleteAllSessions(name, name_len);
|
||||
};
|
||||
}
|
||||
|
|
|
@ -10,8 +10,6 @@ namespace Signal::Store {
|
|||
|
||||
class SessionStore {
|
||||
public:
|
||||
static void boundToContext(signal_protocol_store_context *ctx);
|
||||
|
||||
int loadSession(signal_buffer **record, signal_buffer **user_record, const signal_protocol_address *address);
|
||||
int getSubDeviceSessions(signal_int_list **sessions, const char *name, size_t name_len);
|
||||
int storeSession(const signal_protocol_address *address, uint8_t *record, size_t record_len,
|
||||
|
@ -19,6 +17,8 @@ namespace Signal::Store {
|
|||
int containsSession(const signal_protocol_address *address);
|
||||
int deleteSession(const signal_protocol_address *address);
|
||||
int deleteAllSessions(const char *name, size_t name_len);
|
||||
|
||||
void fillCallbacks(signal_protocol_session_store &store);
|
||||
};
|
||||
|
||||
} // namespace Signal::Store
|
||||
|
|
|
@ -4,33 +4,6 @@
|
|||
|
||||
#include "signed_pre_key_store.h"
|
||||
|
||||
void Signal::Store::SignedPreKeyStore::boundToContext(
|
||||
signal_protocol_store_context *ctx) {
|
||||
signal_protocol_signed_pre_key_store store{};
|
||||
|
||||
store.user_data = nullptr;
|
||||
store.destroy_func = nullptr;
|
||||
|
||||
store.load_signed_pre_key = [](signal_buffer **record, uint32_t signed_pre_key_id, void *ptr) {
|
||||
return static_cast<SignedPreKeyStore *>(ptr)->loadSignedPreKey(
|
||||
record, signed_pre_key_id);
|
||||
};
|
||||
store.store_signed_pre_key = [](uint32_t signed_pre_key_id, uint8_t *record, size_t record_len, void *ptr) {
|
||||
return static_cast<SignedPreKeyStore *>(ptr)->storeSignedPreKey(
|
||||
signed_pre_key_id, record, record_len);
|
||||
};
|
||||
store.contains_signed_pre_key = [](uint32_t signed_pre_key_id, void *ptr) {
|
||||
return static_cast<SignedPreKeyStore *>(ptr)->containsSignedPreKey(
|
||||
signed_pre_key_id);
|
||||
};
|
||||
store.remove_signed_pre_key = [](uint32_t signed_pre_key_id, void *ptr) {
|
||||
return static_cast<SignedPreKeyStore *>(ptr)->removeSignedPreKey(
|
||||
signed_pre_key_id);
|
||||
};
|
||||
|
||||
signal_protocol_store_context_set_signed_pre_key_store(ctx, &store);
|
||||
}
|
||||
|
||||
int Signal::Store::SignedPreKeyStore::loadSignedPreKey(signal_buffer **record, uint32_t signed_pre_key_id) {
|
||||
return 0;
|
||||
}
|
||||
|
@ -47,3 +20,24 @@ int Signal::Store::SignedPreKeyStore::containsSignedPreKey(uint32_t signed_pre_k
|
|||
int Signal::Store::SignedPreKeyStore::removeSignedPreKey(uint32_t signed_pre_key_id) {
|
||||
return 0;
|
||||
}
|
||||
|
||||
void Signal::Store::SignedPreKeyStore::fillCallbacks(signal_protocol_signed_pre_key_store &store) {
|
||||
store.user_data = nullptr;
|
||||
store.destroy_func = nullptr;
|
||||
store.load_signed_pre_key = [](signal_buffer **record, uint32_t signed_pre_key_id, void *ptr) {
|
||||
return static_cast<SignedPreKeyStore *>(ptr)->loadSignedPreKey(
|
||||
record, signed_pre_key_id);
|
||||
};
|
||||
store.store_signed_pre_key = [](uint32_t signed_pre_key_id, uint8_t *record, size_t record_len, void *ptr) {
|
||||
return static_cast<SignedPreKeyStore *>(ptr)->storeSignedPreKey(
|
||||
signed_pre_key_id, record, record_len);
|
||||
};
|
||||
store.contains_signed_pre_key = [](uint32_t signed_pre_key_id, void *ptr) {
|
||||
return static_cast<SignedPreKeyStore *>(ptr)->containsSignedPreKey(
|
||||
signed_pre_key_id);
|
||||
};
|
||||
store.remove_signed_pre_key = [](uint32_t signed_pre_key_id, void *ptr) {
|
||||
return static_cast<SignedPreKeyStore *>(ptr)->removeSignedPreKey(
|
||||
signed_pre_key_id);
|
||||
};
|
||||
}
|
||||
|
|
|
@ -10,11 +10,12 @@ namespace Signal::Store {
|
|||
|
||||
class SignedPreKeyStore {
|
||||
public:
|
||||
static void boundToContext(signal_protocol_store_context *ctx);
|
||||
int loadSignedPreKey(signal_buffer **record, uint32_t signed_pre_key_id);
|
||||
int storeSignedPreKey(uint32_t signed_pre_key_id, uint8_t *record, size_t record_len);
|
||||
int containsSignedPreKey(uint32_t signed_pre_key_id);
|
||||
int removeSignedPreKey(uint32_t signed_pre_key_id);
|
||||
|
||||
void fillCallbacks(signal_protocol_signed_pre_key_store &store);
|
||||
};
|
||||
|
||||
} // namespace Signal::Store
|
||||
|
|
|
@ -4,8 +4,20 @@
|
|||
|
||||
#include "store_context.h"
|
||||
|
||||
Signal::Store::Context::Context(signal_context *global) {
|
||||
Signal::Store::Context::Context(signal_context *global) : identityKeyStore(), preKeyStore(), senderKeyStore(), sessionStore(), signedPreKeyStore() {
|
||||
signal_protocol_store_context_create(&ctx, global);
|
||||
|
||||
identityKeyStore->fillCallbacks(iks);
|
||||
preKeyStore->fillCallbacks(pks);
|
||||
senderKeyStore->fillCallbacks(sks);
|
||||
sessionStore->fillCallbacks(ss);
|
||||
signedPreKeyStore->fillCallbacks(spks);
|
||||
|
||||
signal_protocol_store_context_set_identity_key_store(ctx, &iks);
|
||||
signal_protocol_store_context_set_pre_key_store(ctx, &pks);
|
||||
signal_protocol_store_context_set_sender_key_store(ctx, &sks);
|
||||
signal_protocol_store_context_set_session_store(ctx, &ss);
|
||||
signal_protocol_store_context_set_signed_pre_key_store(ctx, &spks);
|
||||
}
|
||||
|
||||
Signal::Store::Context::~Context() {
|
||||
|
|
|
@ -6,6 +6,12 @@
|
|||
|
||||
#include <signal/signal_protocol.h>
|
||||
|
||||
#include "identity_key_store.h"
|
||||
#include "pre_key_store.h"
|
||||
#include "sender_key_store.h"
|
||||
#include "session_store.h"
|
||||
#include "signed_pre_key_store.h"
|
||||
|
||||
namespace Signal::Store {
|
||||
|
||||
class Context {
|
||||
|
@ -19,6 +25,18 @@ namespace Signal::Store {
|
|||
|
||||
private:
|
||||
signal_protocol_store_context *ctx{nullptr};
|
||||
|
||||
signal_protocol_identity_key_store iks{};
|
||||
signal_protocol_pre_key_store pks{};
|
||||
signal_protocol_sender_key_store sks{};
|
||||
signal_protocol_session_store ss{};
|
||||
signal_protocol_signed_pre_key_store spks{};
|
||||
|
||||
std::unique_ptr<IdentityKeyStore> identityKeyStore;
|
||||
std::unique_ptr<PreKeyStore> preKeyStore;
|
||||
std::unique_ptr<SenderKeyStore> senderKeyStore;
|
||||
std::unique_ptr<SessionStore> sessionStore;
|
||||
std::unique_ptr<SignedPreKeyStore> signedPreKeyStore;
|
||||
};
|
||||
|
||||
} // namespace Signal::Store
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue