diff --git a/library/src/main/cpp/CMakeLists.txt b/library/src/main/cpp/CMakeLists.txt index da33623..8256a10 100644 --- a/library/src/main/cpp/CMakeLists.txt +++ b/library/src/main/cpp/CMakeLists.txt @@ -42,6 +42,8 @@ set(SOURCES encryption.cpp jni_utils.cpp ed25519.cpp + curve25519.cpp + hash.cpp ) add_library( # Sets the name of the library. diff --git a/library/src/main/cpp/blinded_key.cpp b/library/src/main/cpp/blinded_key.cpp index a3a293b..fac15d1 100644 --- a/library/src/main/cpp/blinded_key.cpp +++ b/library/src/main/cpp/blinded_key.cpp @@ -9,6 +9,7 @@ // Created by Thomas Ruffie on 29/7/2024. // + extern "C" JNIEXPORT jobject JNICALL Java_network_loki_messenger_libsession_1util_util_BlindKeyAPI_blindVersionKeyPair(JNIEnv *env, @@ -16,10 +17,7 @@ Java_network_loki_messenger_libsession_1util_util_BlindKeyAPI_blindVersionKeyPai jbyteArray ed25519_secret_key) { return jni_utils::run_catching_cxx_exception_or_throws(env, [=] { const auto [pk, sk] = session::blind_version_key_pair(util::vector_from_bytes(env, ed25519_secret_key)); - - jclass kp_class = env->FindClass("network/loki/messenger/libsession_util/util/KeyPair"); - jmethodID kp_constructor = env->GetMethodID(kp_class, "", "([B[B)V"); - return env->NewObject(kp_class, kp_constructor, util::bytes_from_vector(env, {pk.data(), pk.data() + pk.size()}), util::bytes_from_vector(env, {sk.data(), sk.data() + sk.size()})); + return jni_utils::new_key_pair(env, util::bytes_from_span(env, pk), util::bytes_from_span(env, sk)); }); } extern "C" @@ -29,7 +27,11 @@ Java_network_loki_messenger_libsession_1util_util_BlindKeyAPI_blindVersionSign(J jbyteArray ed25519_secret_key, jlong timestamp) { return jni_utils::run_catching_cxx_exception_or_throws(env, [=] { - auto bytes = session::blind_version_sign(util::vector_from_bytes(env, ed25519_secret_key), session::Platform::android, timestamp); + auto bytes = session::blind_version_sign( + jni_utils::JavaByteArrayRef(env, ed25519_secret_key).get(), + session::Platform::android, + timestamp + ); return util::bytes_from_vector(env, bytes); }); } @@ -46,16 +48,63 @@ Java_network_loki_messenger_libsession_1util_util_BlindKeyAPI_blindVersionSignRe return jni_utils::run_catching_cxx_exception_or_throws(env, [=] { auto methodC = util::string_from_jstring(env, method); auto pathC = util::string_from_jstring(env, path); - auto keyBytes = util::vector_from_bytes(env, ed25519_secret_key); - auto bodyBytes = body ? std::optional(util::vector_from_bytes(env, body)) : std::nullopt; auto bytes = session::blind_version_sign_request( - session::to_span(keyBytes), + jni_utils::JavaByteArrayRef(env, ed25519_secret_key).get(), timestamp, methodC, pathC, - body ? std::optional(session::to_span(*bodyBytes)) : std::nullopt + body ? std::make_optional(jni_utils::JavaByteArrayRef(env, body).get()) : std::nullopt ); return util::bytes_from_vector(env, bytes); }); +} + +extern "C" +JNIEXPORT jobject JNICALL +Java_network_loki_messenger_libsession_1util_util_BlindKeyAPI_blind15KeyPair(JNIEnv *env, + jobject thiz, + jbyteArray ed25519_secret_key, + jbyteArray server_pub_key) { + return jni_utils::run_catching_cxx_exception_or_throws(env, [=] { + auto [pk, sk] = session::blind15_key_pair( + jni_utils::JavaByteArrayRef(env, ed25519_secret_key).get(), + jni_utils::JavaByteArrayRef(env, server_pub_key).get() + ); + return jni_utils::new_key_pair(env, util::bytes_from_span(env, pk), util::bytes_from_span(env, sk)); + }); +} + +extern "C" +JNIEXPORT jbyteArray JNICALL +Java_network_loki_messenger_libsession_1util_util_BlindKeyAPI_blind15Sign(JNIEnv *env, jobject thiz, + jbyteArray ed25519_secret_key, + jstring server_pub_key, + jbyteArray message) { + return jni_utils::run_catching_cxx_exception_or_throws(env, [=] { + auto data = session::blind15_sign( + jni_utils::JavaByteArrayRef(env, ed25519_secret_key).get(), + jni_utils::JavaStringRef(env, server_pub_key).view(), + jni_utils::JavaByteArrayRef(env, message).get() + ); + return util::bytes_from_vector(env, data); + }); +} + +extern "C" +JNIEXPORT jboolean JNICALL +Java_network_loki_messenger_libsession_1util_util_BlindKeyAPI_sessionIdMatchesBlindedId(JNIEnv *env, + jobject thiz, + jstring session_id, + jstring blinded_id, + jstring server_pub_key) { + return jni_utils::run_catching_cxx_exception_or([=]() -> jboolean { + return session::session_id_matches_blinded_id( + jni_utils::JavaStringRef(env, session_id).view(), + jni_utils::JavaStringRef(env, blinded_id).view(), + jni_utils::JavaStringRef(env, server_pub_key).view() + ); + }, [](const char *) -> jboolean { + return false; + }); } \ No newline at end of file diff --git a/library/src/main/cpp/curve25519.cpp b/library/src/main/cpp/curve25519.cpp new file mode 100644 index 0000000..94a81df --- /dev/null +++ b/library/src/main/cpp/curve25519.cpp @@ -0,0 +1,27 @@ +#include "jni_utils.h" + +#include + +extern "C" +JNIEXPORT jobject JNICALL +Java_network_loki_messenger_libsession_1util_Curve25519_fromED25519(JNIEnv *env, jobject thiz, + jbyteArray ed25519_public_key, + jbyteArray ed25519_private_key) { + return jni_utils::run_catching_cxx_exception_or_throws(env, [=] { + auto pk = session::curve25519::to_curve25519_pubkey(jni_utils::JavaByteArrayRef(env, ed25519_public_key).get()); + auto sk = session::curve25519::to_curve25519_seckey(jni_utils::JavaByteArrayRef(env, ed25519_private_key).get()); + + return jni_utils::new_key_pair(env, util::bytes_from_span(env, pk), util::bytes_from_span(env, sk)); + }); +} + + +extern "C" +JNIEXPORT jbyteArray JNICALL +Java_network_loki_messenger_libsession_1util_Curve25519_pubKeyFromED25519(JNIEnv *env, jobject thiz, + jbyteArray ed25519_public_key) { + return jni_utils::run_catching_cxx_exception_or_throws(env, [=] { + auto pk = session::curve25519::to_curve25519_pubkey(jni_utils::JavaByteArrayRef(env, ed25519_public_key).get()); + return util::bytes_from_span(env, pk); + }); +} \ No newline at end of file diff --git a/library/src/main/cpp/ed25519.cpp b/library/src/main/cpp/ed25519.cpp index 23cb993..cd0d51b 100644 --- a/library/src/main/cpp/ed25519.cpp +++ b/library/src/main/cpp/ed25519.cpp @@ -30,4 +30,17 @@ Java_network_loki_messenger_libsession_1util_ED25519_verify(JNIEnv *env, jobject jni_utils::JavaByteArrayRef(env, message).get() ); }); +} + +extern "C" +JNIEXPORT jobject JNICALL +Java_network_loki_messenger_libsession_1util_ED25519_generate(JNIEnv *env, jobject thiz, + jbyteArray seed) { + return jni_utils::run_catching_cxx_exception_or_throws(env, [=] { + auto [pk, sk] = seed + ? session::ed25519::ed25519_key_pair(jni_utils::JavaByteArrayRef(env, seed).get()) + : session::ed25519::ed25519_key_pair(); + + return jni_utils::new_key_pair(env, util::bytes_from_span(env, pk), util::bytes_from_span(env, sk)); + }); } \ No newline at end of file diff --git a/library/src/main/cpp/encryption.cpp b/library/src/main/cpp/encryption.cpp index be6a71a..c9e9079 100644 --- a/library/src/main/cpp/encryption.cpp +++ b/library/src/main/cpp/encryption.cpp @@ -91,4 +91,38 @@ Java_network_loki_messenger_libsession_1util_SessionEncrypt_encryptForBlindedRec return jni_utils::session_bytes_from_range(env, data); }); +} + +extern "C" +JNIEXPORT jobject JNICALL +Java_network_loki_messenger_libsession_1util_SessionEncrypt_decryptPushNotification(JNIEnv *env, + jobject thiz, + jbyteArray message, + jbyteArray secret_key) { + return jni_utils::run_catching_cxx_exception_or_throws(env, [=] { + auto data = session::decrypt_push_notification( + jni_utils::JavaByteArrayRef(env, message).get(), + jni_utils::JavaByteArrayRef(env, secret_key).get() + ); + + return jni_utils::session_bytes_from_range(env, data); + }); +} + +extern "C" +JNIEXPORT jstring JNICALL +Java_network_loki_messenger_libsession_1util_SessionEncrypt_decryptOnsResponse(JNIEnv *env, + jobject thiz, + jstring lowercase_name, + jbyteArray ciphertext, + jbyteArray nonce) { + return jni_utils::run_catching_cxx_exception_or_throws(env, [=] { + auto data = session::decrypt_ons_response( + jni_utils::JavaStringRef(env, lowercase_name).view(), + jni_utils::JavaByteArrayRef(env, ciphertext).get(), + nonce ? std::make_optional(jni_utils::JavaByteArrayRef(env, nonce).get()) : std::nullopt + ); + + return util::jstringFromOptional(env, data); + }); } \ No newline at end of file diff --git a/library/src/main/cpp/hash.cpp b/library/src/main/cpp/hash.cpp new file mode 100644 index 0000000..5f61432 --- /dev/null +++ b/library/src/main/cpp/hash.cpp @@ -0,0 +1,17 @@ +#include "jni_utils.h" + +#include + +extern "C" +JNIEXPORT void JNICALL +Java_network_loki_messenger_libsession_1util_Hash_hash(JNIEnv *env, jobject thiz, + jbyteArray message, + jbyteArray hashOut, + jbyteArray key) { + jni_utils::run_catching_cxx_exception_or_throws(env, [=] { + session::hash::hash( + jni_utils::JavaByteArrayRef(env, hashOut).get(), + jni_utils::JavaByteArrayRef(env, message).get(), + key ? std::make_optional(jni_utils::JavaByteArrayRef(env, key).get()) : std::nullopt); + }); +} \ No newline at end of file diff --git a/library/src/main/cpp/jni_utils.cpp b/library/src/main/cpp/jni_utils.cpp index 5c192ed..75d31cf 100644 --- a/library/src/main/cpp/jni_utils.cpp +++ b/library/src/main/cpp/jni_utils.cpp @@ -6,4 +6,10 @@ namespace jni_utils { jmethodID constructor = env->GetMethodID(pair_class.get(), "", "(Ljava/lang/Object;Ljava/lang/Object;)V"); return env->NewObject(pair_class.get(), constructor, first, second); } + + jobject new_key_pair(JNIEnv *env, jbyteArray pubKey, jbyteArray secKey) { + auto kp_class = JavaLocalRef(env, env->FindClass("network/loki/messenger/libsession_util/util/KeyPair")); + jmethodID kp_constructor = env->GetMethodID(kp_class.get(), "", "([B[B)V"); + return env->NewObject(kp_class.get(), kp_constructor, pubKey, secKey); + } } \ No newline at end of file diff --git a/library/src/main/cpp/jni_utils.h b/library/src/main/cpp/jni_utils.h index ee6069e..ccef046 100644 --- a/library/src/main/cpp/jni_utils.h +++ b/library/src/main/cpp/jni_utils.h @@ -146,6 +146,37 @@ namespace jni_utils { */ jobject new_kotlin_pair(JNIEnv *env, jobject first, jobject second); + /** + * Create a new KeyPair object + */ + jobject new_key_pair(JNIEnv *env, jbyteArray pubKey, jbyteArray secKey); + + class JavaStringRef { + JNIEnv *env; + jstring s; + std::span data; + + public: + JavaStringRef(JNIEnv *env, jstring s) : env(env), s(s) { + const char *c_str = env->GetStringUTFChars(s, nullptr); + data = std::span(const_cast(c_str), env->GetStringUTFLength(s)); + } + + ~JavaStringRef() { + env->ReleaseStringUTFChars(s, data.data()); + } + + // Get the data as a string view. Only valid during the lifetime of this object. + std::string_view view() const { + return std::string_view(data.data(), data.size()); + } + + // Get the data as a span. Only valid during the lifetime of this object. + std::span get() const { + return data; + } + }; + /** * A RAII wrapper for a Java byte array. This will automatically release the byte array when it goes out of scope. */ @@ -164,6 +195,7 @@ namespace jni_utils { env->ReleaseByteArrayElements(byte_array, reinterpret_cast(data.data()), 0); } + // Get the data as a span. Only valid during the lifetime of this object. std::span get() const { return data; } diff --git a/library/src/main/cpp/util.cpp b/library/src/main/cpp/util.cpp index 60f13d7..94c157d 100644 --- a/library/src/main/cpp/util.cpp +++ b/library/src/main/cpp/util.cpp @@ -173,43 +173,10 @@ namespace util { } } -extern "C" -JNIEXPORT jobject JNICALL -Java_network_loki_messenger_libsession_1util_util_Sodium_ed25519KeyPair(JNIEnv *env, jobject thiz, jbyteArray seed) { - std::array ed_pk; // NOLINT(cppcoreguidelines-pro-type-member-init) - std::array ed_sk; // NOLINT(cppcoreguidelines-pro-type-member-init) - auto seed_bytes = util::vector_from_bytes(env, seed); - crypto_sign_ed25519_seed_keypair(ed_pk.data(), ed_sk.data(), seed_bytes.data()); - - auto kp_class = jni_utils::JavaLocalRef(env, env->FindClass("network/loki/messenger/libsession_util/util/KeyPair")); - jmethodID kp_constructor = env->GetMethodID(kp_class.get(), "", "(Lnetwork/loki/messenger/libsession_util/util/Bytes;Lnetwork/loki/messenger/libsession_util/util/Bytes;)V"); - - return env->NewObject(kp_class.get(), kp_constructor, - jni_utils::JavaLocalRef(env, jni_utils::session_bytes_from_range(env, ed_pk)).get(), - jni_utils::JavaLocalRef(env, jni_utils::session_bytes_from_range(env, ed_sk)).get() - ); -} - -extern "C" -JNIEXPORT jbyteArray JNICALL -Java_network_loki_messenger_libsession_1util_util_Sodium_ed25519PkToCurve25519(JNIEnv *env, - jobject thiz, - jbyteArray pk) { - auto ed_pk = util::vector_from_bytes(env, pk); - std::array curve_pk; // NOLINT(cppcoreguidelines-pro-type-member-init) - int success = crypto_sign_ed25519_pk_to_curve25519(curve_pk.data(), ed_pk.data()); - if (success != 0) { - jclass exception = env->FindClass("java/lang/Exception"); - env->ThrowNew(exception, "Invalid crypto_sign_ed25519_pk_to_curve25519 operation"); - return nullptr; - } - jbyteArray curve_pk_jarray = util::bytes_from_span(env, std::span {curve_pk.data(), curve_pk.size()}); - return curve_pk_jarray; -} extern "C" JNIEXPORT jbyteArray JNICALL -Java_network_loki_messenger_libsession_1util_util_Sodium_encryptForMultipleSimple( +Java_network_loki_messenger_libsession_1util_util_MultiEncrypt_encryptForMultipleSimple( JNIEnv *env, jobject thiz, jobjectArray messages, jobjectArray recipients, jbyteArray ed25519_secret_key, jstring domain) { // messages and recipients have to be the same size @@ -258,12 +225,12 @@ Java_network_loki_messenger_libsession_1util_util_Sodium_encryptForMultipleSimpl extern "C" JNIEXPORT jbyteArray JNICALL -Java_network_loki_messenger_libsession_1util_util_Sodium_decryptForMultipleSimple(JNIEnv *env, - jobject thiz, - jbyteArray encoded, - jbyteArray secret_key, - jbyteArray sender_pub_key, - jstring domain) { +Java_network_loki_messenger_libsession_1util_util_MultiEncrypt_decryptForMultipleSimple(JNIEnv *env, + jobject thiz, + jbyteArray encoded, + jbyteArray secret_key, + jbyteArray sender_pub_key, + jstring domain) { auto sk_vector = util::vector_from_bytes(env, secret_key); auto encoded_vector = util::vector_from_bytes(env, encoded); auto pub_vector = util::vector_from_bytes(env, sender_pub_key); diff --git a/library/src/main/java/network/loki/messenger/libsession_util/Config.kt b/library/src/main/java/network/loki/messenger/libsession_util/Config.kt index d9f11e8..f356a4e 100644 --- a/library/src/main/java/network/loki/messenger/libsession_util/Config.kt +++ b/library/src/main/java/network/loki/messenger/libsession_util/Config.kt @@ -10,7 +10,7 @@ import network.loki.messenger.libsession_util.util.GroupMember import network.loki.messenger.libsession_util.util.UserPic import java.io.Closeable -sealed class Config(initialPointer: Long): Closeable { +sealed class Config(initialPointer: Long): Closeable, LibSessionUtilCApi() { var pointer = initialPointer private set diff --git a/library/src/main/java/network/loki/messenger/libsession_util/Curve25519.kt b/library/src/main/java/network/loki/messenger/libsession_util/Curve25519.kt new file mode 100644 index 0000000..a21bd58 --- /dev/null +++ b/library/src/main/java/network/loki/messenger/libsession_util/Curve25519.kt @@ -0,0 +1,20 @@ +package network.loki.messenger.libsession_util + +import network.loki.messenger.libsession_util.util.KeyPair + +object Curve25519 : LibSessionUtilCApi() { + private external fun fromED25519( + ed25519PublicKey: ByteArray, + ed25519PrivateKey: ByteArray, + ): KeyPair + + fun fromED25519(keyPair: KeyPair): KeyPair = + fromED25519( + ed25519PublicKey = keyPair.pubKey.data, + ed25519PrivateKey = keyPair.secretKey.data + ) + + external fun pubKeyFromED25519( + ed25519PublicKey: ByteArray, + ): ByteArray +} diff --git a/library/src/main/java/network/loki/messenger/libsession_util/ED25519.kt b/library/src/main/java/network/loki/messenger/libsession_util/ED25519.kt index 6a0d69f..392e9a7 100644 --- a/library/src/main/java/network/loki/messenger/libsession_util/ED25519.kt +++ b/library/src/main/java/network/loki/messenger/libsession_util/ED25519.kt @@ -1,6 +1,8 @@ package network.loki.messenger.libsession_util -object ED25519 { +import network.loki.messenger.libsession_util.util.KeyPair + +object ED25519 : LibSessionUtilCApi() { /** * Sign a message using the ed25519 private key * @@ -25,4 +27,6 @@ object ED25519 { message: ByteArray, signature: ByteArray, ): Boolean + + external fun generate(seed: ByteArray?): KeyPair } \ No newline at end of file diff --git a/library/src/main/java/network/loki/messenger/libsession_util/Hash.kt b/library/src/main/java/network/loki/messenger/libsession_util/Hash.kt new file mode 100644 index 0000000..f732382 --- /dev/null +++ b/library/src/main/java/network/loki/messenger/libsession_util/Hash.kt @@ -0,0 +1,17 @@ +package network.loki.messenger.libsession_util + +object Hash : LibSessionUtilCApi() { + private external fun hash(message: ByteArray, hashOut: ByteArray, key: ByteArray?) + + fun hash64(message: ByteArray, key: ByteArray? = null): ByteArray { + val hashOut = ByteArray(64) + hash(message, hashOut, key) + return hashOut + } + + fun hash32(message: ByteArray, key: ByteArray? = null): ByteArray { + val hashOut = ByteArray(32) + hash(message, hashOut, key) + return hashOut + } +} \ No newline at end of file diff --git a/library/src/main/java/network/loki/messenger/libsession_util/LibSessionUtilCApi.kt b/library/src/main/java/network/loki/messenger/libsession_util/LibSessionUtilCApi.kt new file mode 100644 index 0000000..e3f8a6d --- /dev/null +++ b/library/src/main/java/network/loki/messenger/libsession_util/LibSessionUtilCApi.kt @@ -0,0 +1,12 @@ +package network.loki.messenger.libsession_util + +/** + * Base class for all objects that need access to the native library. + * + * This is needed so that the native library can be loaded as soon as any object is accessed. + */ +abstract class LibSessionUtilCApi { + init { + System.loadLibrary("session_util") + } +} \ No newline at end of file diff --git a/library/src/main/java/network/loki/messenger/libsession_util/Namespace.kt b/library/src/main/java/network/loki/messenger/libsession_util/Namespace.kt index 04edaf6..c480d5c 100644 --- a/library/src/main/java/network/loki/messenger/libsession_util/Namespace.kt +++ b/library/src/main/java/network/loki/messenger/libsession_util/Namespace.kt @@ -1,6 +1,6 @@ package network.loki.messenger.libsession_util -object Namespace { +object Namespace : LibSessionUtilCApi() { fun ALL() = "all" // Namespaces used for legacy group diff --git a/library/src/main/java/network/loki/messenger/libsession_util/SessionEncrypt.kt b/library/src/main/java/network/loki/messenger/libsession_util/SessionEncrypt.kt index c64116a..972c462 100644 --- a/library/src/main/java/network/loki/messenger/libsession_util/SessionEncrypt.kt +++ b/library/src/main/java/network/loki/messenger/libsession_util/SessionEncrypt.kt @@ -4,7 +4,7 @@ import network.loki.messenger.libsession_util.util.Bytes private typealias SessionId = String -object SessionEncrypt { +object SessionEncrypt : LibSessionUtilCApi() { /** * Decrypts data using the Session protocol for a blinded recipient. * @@ -66,4 +66,15 @@ object SessionEncrypt { x25519PrivKey: ByteArray, ciphertext: ByteArray ): Pair + + external fun decryptPushNotification( + message: ByteArray, + secretKey: ByteArray, + ): Bytes + + external fun decryptOnsResponse( + lowercaseName: String, + ciphertext: ByteArray, + nonce: ByteArray?, + ): SessionId } \ No newline at end of file diff --git a/library/src/main/java/network/loki/messenger/libsession_util/util/BlindKeyAPI.kt b/library/src/main/java/network/loki/messenger/libsession_util/util/BlindKeyAPI.kt index dc0e8cb..862cfd4 100644 --- a/library/src/main/java/network/loki/messenger/libsession_util/util/BlindKeyAPI.kt +++ b/library/src/main/java/network/loki/messenger/libsession_util/util/BlindKeyAPI.kt @@ -1,15 +1,8 @@ package network.loki.messenger.libsession_util.util -object BlindKeyAPI { - private val loadLibrary by lazy { - System.loadLibrary("session_util") - } - - init { - // Ensure the library is loaded at initialization - loadLibrary - } +import network.loki.messenger.libsession_util.LibSessionUtilCApi +object BlindKeyAPI : LibSessionUtilCApi() { external fun blindVersionKeyPair(ed25519SecretKey: ByteArray): KeyPair external fun blindVersionSign(ed25519SecretKey: ByteArray, timestamp: Long): ByteArray external fun blindVersionSignRequest( @@ -18,4 +11,50 @@ object BlindKeyAPI { method: String, path: String, body: ByteArray?): ByteArray + + /** + * Generate a 15-blinded key pair + * + * @param ed25519SecretKey The Ed25519 secret key, 32/64 bytes + * @param serverPubKey The server public key, 32 bytes + */ + external fun blind15KeyPair( + ed25519SecretKey: ByteArray, + serverPubKey: ByteArray, + ): KeyPair + + /** + * Generate a 15-blinded key pair, returning null on failure + */ + fun blind15KeyPairOrNull( + ed25519SecretKey: ByteArray, + serverPubKey: ByteArray, + ): KeyPair? = kotlin.runCatching { blind15KeyPair(ed25519SecretKey, serverPubKey) }.getOrNull() + + /** + * Sign a message with a 15 blinded key. + * + * @param ed25519SecretKey The Ed25519 secret key, 32/64 bytes + * @param serverPubKey The server public key in hex + * @param message The message to sign + */ + external fun blind15Sign( + ed25519SecretKey: ByteArray, + serverPubKey: String, + message: ByteArray, + ): ByteArray + + /** + * Takes in a standard sessionId and returns a flag indicating whether it matches the given + * blindedId for a given serverPubKey + * + * @param sessionId The session ID to check, 66bytes string + * @param blindedId The blinded ID to check against, 66bytes string + * @param serverPubKey The server public key, 64bytes string + */ + external fun sessionIdMatchesBlindedId( + sessionId: String, + blindedId: String, + serverPubKey: String, + ): Boolean } \ No newline at end of file diff --git a/library/src/main/java/network/loki/messenger/libsession_util/util/Sodium.kt b/library/src/main/java/network/loki/messenger/libsession_util/util/MultiEncrypt.kt similarity index 71% rename from library/src/main/java/network/loki/messenger/libsession_util/util/Sodium.kt rename to library/src/main/java/network/loki/messenger/libsession_util/util/MultiEncrypt.kt index a7f7e6f..8cd2baf 100644 --- a/library/src/main/java/network/loki/messenger/libsession_util/util/Sodium.kt +++ b/library/src/main/java/network/loki/messenger/libsession_util/util/MultiEncrypt.kt @@ -1,15 +1,11 @@ package network.loki.messenger.libsession_util.util +import network.loki.messenger.libsession_util.LibSessionUtilCApi -object Sodium { - const val KICKED_DOMAIN = "SessionGroupKickedMessage" +object MultiEncrypt : LibSessionUtilCApi() { - init { - System.loadLibrary("session_util") - } - external fun ed25519KeyPair(seed: ByteArray): KeyPair - external fun ed25519PkToCurve25519(pk: ByteArray): ByteArray + const val KICKED_DOMAIN = "SessionGroupKickedMessage" external fun encryptForMultipleSimple( messages: Array,