/* * Created by victoria on 2021-05-13. */ #include "identity_key_store.h" #include "qomemo/signal/util.h" #include Signal::Store::IdentityKeyStore::IdentityKeyStore(QXmpp::Omemo::DeviceService &deviceService, QString jid, int deviceId) : jid(std::move(jid)), deviceId(deviceId), deviceService(deviceService) { database = deviceService.getDatabase(jid); } int Signal::Store::IdentityKeyStore::getIdentityKeyPair(signal_buffer **public_data, signal_buffer **private_data) { auto pk = database->loadIdentityKey(deviceId); auto sk = database->loadIdentityKeySecret(deviceId); *public_data = signal_buffer_create(reinterpret_cast(pk->data()), pk->size()); *private_data = signal_buffer_create(reinterpret_cast(sk->data()), sk->size()); return 0; } int Signal::Store::IdentityKeyStore::getLocalRegistrationId(uint32_t *registration_id) { // TODO: Figure out what registration id is used for *registration_id = 1; return 0; } int Signal::Store::IdentityKeyStore::saveIdentity(const signal_protocol_address *address, uint8_t *key_data, size_t key_len) { auto identityJid = Signal::Util::jidFromAddress(address); auto identityKey = Signal::Util::byteArray(key_data, key_len); deviceService.getDatabase(identityJid)->saveIdentityKey(address->device_id, identityKey); return 0; } int Signal::Store::IdentityKeyStore::isTrustedIdentity(const signal_protocol_address *address, uint8_t *key_data, size_t key_len) { auto identityJid = Signal::Util::jidFromAddress(address); auto actualIdentityKey = deviceService.getDatabase(identityJid)->loadIdentityKey(address->device_id); if (!actualIdentityKey.has_value()) { return 1; } auto givenIdentityKey = Signal::Util::byteArray(key_data, key_len); return givenIdentityKey == actualIdentityKey ? 1 : 0; } void Signal::Store::IdentityKeyStore::fillCallbacks(signal_protocol_identity_key_store &store) { store.get_identity_key_pair = [](signal_buffer **public_data, signal_buffer **private_data, void *ptr) { return static_cast(ptr)->getIdentityKeyPair(public_data, private_data); }; store.get_local_registration_id = [](void *ptr, uint32_t *registrationId) { return static_cast(ptr)->getLocalRegistrationId(registrationId); }; store.is_trusted_identity = [](const signal_protocol_address *address, uint8_t *key_data, size_t key_len, void *ptr) { return static_cast(ptr)->isTrustedIdentity(address, key_data, key_len); }; store.save_identity = [](const signal_protocol_address *address, uint8_t *key_data, size_t key_len, void *ptr) { return static_cast(ptr)->saveIdentity(address, key_data, key_len); }; }