From 0f7b17b384832392148f2487c1b0750d3034e688 Mon Sep 17 00:00:00 2001 From: 0x330a <92654767+0x330a@users.noreply.github.com> Date: Thu, 5 Oct 2023 10:37:41 +1100 Subject: [PATCH] feat: add lock guard and implement new decrypt method --- libsession-util/src/main/cpp/group_keys.cpp | 23 +++++++++++++++---- .../loki/messenger/libsession_util/Config.kt | 6 ++--- 2 files changed, 21 insertions(+), 8 deletions(-) diff --git a/libsession-util/src/main/cpp/group_keys.cpp b/libsession-util/src/main/cpp/group_keys.cpp index fcda63e3c..e9fa83786 100644 --- a/libsession-util/src/main/cpp/group_keys.cpp +++ b/libsession-util/src/main/cpp/group_keys.cpp @@ -147,6 +147,7 @@ Java_network_loki_messenger_libsession_1util_GroupKeysConfig_rekey(JNIEnv *env, extern "C" JNIEXPORT jbyteArray JNICALL Java_network_loki_messenger_libsession_1util_GroupKeysConfig_dump(JNIEnv *env, jobject thiz) { + std::lock_guard lock{util::util_mutex_}; auto keys = ptrToKeys(env, thiz); auto dump = keys->dump(); auto byte_array = util::bytes_from_ustring(env, dump); @@ -156,6 +157,7 @@ Java_network_loki_messenger_libsession_1util_GroupKeysConfig_dump(JNIEnv *env, j extern "C" JNIEXPORT void JNICALL Java_network_loki_messenger_libsession_1util_GroupKeysConfig_free(JNIEnv *env, jobject thiz) { + std::lock_guard lock{util::util_mutex_}; auto ptr = ptrToKeys(env, thiz); delete ptr; } @@ -164,6 +166,7 @@ extern "C" JNIEXPORT jbyteArray JNICALL Java_network_loki_messenger_libsession_1util_GroupKeysConfig_encrypt(JNIEnv *env, jobject thiz, jbyteArray plaintext) { + std::lock_guard lock{util::util_mutex_}; auto ptr = ptrToKeys(env, thiz); auto plaintext_ustring = util::ustring_from_bytes(env, plaintext); auto enc = ptr->encrypt_message(plaintext_ustring); @@ -171,14 +174,24 @@ Java_network_loki_messenger_libsession_1util_GroupKeysConfig_encrypt(JNIEnv *env } extern "C" -JNIEXPORT jbyteArray JNICALL +JNIEXPORT jobject JNICALL Java_network_loki_messenger_libsession_1util_GroupKeysConfig_decrypt(JNIEnv *env, jobject thiz, jbyteArray ciphertext) { + std::lock_guard lock{util::util_mutex_}; auto ptr = ptrToKeys(env, thiz); auto ciphertext_ustring = util::ustring_from_bytes(env, ciphertext); - auto plaintext = ptr->decrypt_message(ciphertext_ustring); - if (plaintext) { - return util::bytes_from_ustring(env, *plaintext); + try { + auto decrypted = ptr->decrypt_message(ciphertext_ustring); + auto sender = decrypted.first; + auto plaintext = decrypted.second; + auto plaintext_bytes = util::bytes_from_ustring(env, plaintext); + auto sender_session_id = util::serialize_session_id(env, sender.data()); + auto pair_class = env->FindClass("kotlin/Pair"); + auto pair_constructor = env->GetMethodID(pair_class, "", "(Ljava/lang/Object;Ljava/lang/Object;)V"); + auto pair_obj = env->NewObject(pair_class, pair_constructor, plaintext_bytes, sender_session_id); + return pair_obj; + } catch (std::exception& e) { + // TODO: maybe log here } return nullptr; @@ -186,6 +199,7 @@ Java_network_loki_messenger_libsession_1util_GroupKeysConfig_decrypt(JNIEnv *env extern "C" JNIEXPORT jobject JNICALL Java_network_loki_messenger_libsession_1util_GroupKeysConfig_keys(JNIEnv *env, jobject thiz) { + std::lock_guard lock{util::util_mutex_}; auto ptr = ptrToKeys(env, thiz); auto keys = ptr->group_keys(); jclass stack = env->FindClass("java/util/Stack"); @@ -203,6 +217,7 @@ extern "C" JNIEXPORT jobject JNICALL Java_network_loki_messenger_libsession_1util_GroupKeysConfig_currentHashes(JNIEnv *env, jobject thiz) { + std::lock_guard lock{util::util_mutex_}; auto ptr = ptrToKeys(env, thiz); auto existing = ptr->current_hashes(); jclass stack = env->FindClass("java/util/Stack"); diff --git a/libsession-util/src/main/java/network/loki/messenger/libsession_util/Config.kt b/libsession-util/src/main/java/network/loki/messenger/libsession_util/Config.kt index 65587f43b..48c4fb3ab 100644 --- a/libsession-util/src/main/java/network/loki/messenger/libsession_util/Config.kt +++ b/libsession-util/src/main/java/network/loki/messenger/libsession_util/Config.kt @@ -39,7 +39,6 @@ sealed class ConfigBase(pointer: Long): Config(pointer) { is GroupMembersConfig -> Kind.CLOSED_GROUP_MEMBERS } - // TODO: time in future to activate (hardcoded to 1st jan 2024 for testing, change before release) private const val ACTIVATE_TIME = 1690761600000 fun isNewConfigEnabled(forced: Boolean, currentTime: Long) = @@ -292,8 +291,7 @@ class GroupMembersConfig(pointer: Long): ConfigBase(pointer), Closeable { } } -sealed class ConfigSig(pointer: Long) : Config(pointer) { -} +sealed class ConfigSig(pointer: Long) : Config(pointer) class GroupKeysConfig(pointer: Long): ConfigSig(pointer) { companion object { @@ -330,7 +328,7 @@ class GroupKeysConfig(pointer: Long): ConfigSig(pointer) { } external fun encrypt(plaintext: ByteArray): ByteArray - external fun decrypt(ciphertext: ByteArray): ByteArray? + external fun decrypt(ciphertext: ByteArray): Pair? external fun keys(): Stack