diff --git a/library/src/main/cpp/curve25519.cpp b/library/src/main/cpp/curve25519.cpp index 94a81df..e4cbe98 100644 --- a/library/src/main/cpp/curve25519.cpp +++ b/library/src/main/cpp/curve25519.cpp @@ -24,4 +24,15 @@ Java_network_loki_messenger_libsession_1util_Curve25519_pubKeyFromED25519(JNIEnv auto pk = session::curve25519::to_curve25519_pubkey(jni_utils::JavaByteArrayRef(env, ed25519_public_key).get()); return util::bytes_from_span(env, pk); }); +} + +extern "C" +JNIEXPORT jobject JNICALL +Java_network_loki_messenger_libsession_1util_Curve25519_generateKeyPair(JNIEnv *env, jobject thiz) { + return jni_utils::run_catching_cxx_exception_or_throws(env, [=] { + auto [sk, pk] = session::curve25519::curve25519_key_pair(); + return jni_utils::new_key_pair(env, + util::bytes_from_span(env, sk), + util::bytes_from_span(env, pk)); + }); } \ No newline at end of file diff --git a/library/src/main/cpp/encryption.cpp b/library/src/main/cpp/encryption.cpp index c9e9079..1530c7b 100644 --- a/library/src/main/cpp/encryption.cpp +++ b/library/src/main/cpp/encryption.cpp @@ -4,6 +4,8 @@ #include "jni_utils.h" +#include + using jni_utils::JavaByteArrayRef; extern "C" @@ -125,4 +127,33 @@ Java_network_loki_messenger_libsession_1util_SessionEncrypt_decryptOnsResponse(J return util::jstringFromOptional(env, data); }); +} + +extern "C" +JNIEXPORT jbyteArray JNICALL +Java_network_loki_messenger_libsession_1util_SessionEncrypt_calculateECHDAgreement(JNIEnv *env, + jobject thiz, + jbyteArray x25519_pub_key, + jbyteArray x25519_priv_key) { + return jni_utils::run_catching_cxx_exception_or_throws(env, [=] { + JavaByteArrayRef sk(env, x25519_priv_key); + JavaByteArrayRef pk(env, x25519_pub_key); + + if (sk.get().size() != crypto_scalarmult_SCALARBYTES) { + throw std::invalid_argument{"Invalid x25519_priv_key: expected 32 bytes"}; + } + + if (pk.get().size() != crypto_scalarmult_BYTES) { + throw std::invalid_argument{"Invalid x25519_pub_key: expected 32 bytes"}; + } + + std::array shared_secret {0}; + if (crypto_scalarmult(shared_secret.data(),sk.get().data(), pk.get().data()) != 0) { + throw std::runtime_error{"An error occurred while attempting to calculate the shared " + "secret; is the key valid?"}; + } + + return util::bytes_from_span(env, shared_secret); + }); + } \ No newline at end of file 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 index a21bd58..5e38a30 100644 --- a/library/src/main/java/network/loki/messenger/libsession_util/Curve25519.kt +++ b/library/src/main/java/network/loki/messenger/libsession_util/Curve25519.kt @@ -17,4 +17,6 @@ object Curve25519 : LibSessionUtilCApi() { external fun pubKeyFromED25519( ed25519PublicKey: ByteArray, ): ByteArray + + external fun generateKeyPair(): KeyPair } 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 972c462..466eae2 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 @@ -77,4 +77,9 @@ object SessionEncrypt : LibSessionUtilCApi() { ciphertext: ByteArray, nonce: ByteArray?, ): SessionId + + external fun calculateECHDAgreement( + x25519PubKey: ByteArray, + x25519PrivKey: ByteArray, + ): ByteArray } \ No newline at end of file