diff --git a/library/src/main/cpp/encryption.cpp b/library/src/main/cpp/encryption.cpp index 607ba20..be6a71a 100644 --- a/library/src/main/cpp/encryption.cpp +++ b/library/src/main/cpp/encryption.cpp @@ -18,11 +18,11 @@ Java_network_loki_messenger_libsession_1util_SessionEncrypt_decryptForBlindedRec jbyteArray recipient_blind_id) { return jni_utils::run_catching_cxx_exception_or_throws(env, [=] { auto [plain_text, session_id] = session::decrypt_from_blinded_recipient( - JavaByteArrayRef(env, my_ed25519_privte_key).get(), - JavaByteArrayRef(env, open_group_public_key).get(), - JavaByteArrayRef(env, sender_blinded_id).get(), - JavaByteArrayRef(env, recipient_blind_id).get(), - JavaByteArrayRef(env, ciphertext).get() + JavaByteArrayRef(env, my_ed25519_privte_key).get(), + JavaByteArrayRef(env, open_group_public_key).get(), + JavaByteArrayRef(env, sender_blinded_id).get(), + JavaByteArrayRef(env, recipient_blind_id).get(), + JavaByteArrayRef(env, ciphertext).get() ); return jni_utils::new_kotlin_pair( @@ -32,3 +32,63 @@ Java_network_loki_messenger_libsession_1util_SessionEncrypt_decryptForBlindedRec ); }); } + +extern "C" +JNIEXPORT jobject JNICALL +Java_network_loki_messenger_libsession_1util_SessionEncrypt_encryptForRecipient(JNIEnv *env, + jobject thiz, + jbyteArray ed25519_private_key, + jbyteArray recipient_x25519_public_key, + jbyteArray message) { + return jni_utils::run_catching_cxx_exception_or_throws(env, [=] { + auto data = session::encrypt_for_recipient( + JavaByteArrayRef(env, ed25519_private_key).get(), + JavaByteArrayRef(env, recipient_x25519_public_key).get(), + JavaByteArrayRef(env, message).get() + ); + + return jni_utils::session_bytes_from_range(env, data); + }); +} + +extern "C" +JNIEXPORT jobject JNICALL +Java_network_loki_messenger_libsession_1util_SessionEncrypt_decryptIncoming(JNIEnv *env, + jobject thiz, + jbyteArray x25519_pub_key, + jbyteArray x25519_priv_key, + jbyteArray ciphertext) { + return jni_utils::run_catching_cxx_exception_or_throws(env, [=] { + auto [plain_text, session_id] = session::decrypt_incoming_session_id( + JavaByteArrayRef(env, x25519_pub_key).get(), + JavaByteArrayRef(env, x25519_priv_key).get(), + JavaByteArrayRef(env, ciphertext).get() + ); + + return jni_utils::new_kotlin_pair( + env, + util::jstringFromOptional(env, session_id), + jni_utils::session_bytes_from_range(env, plain_text) + ); + }); +} + +extern "C" +JNIEXPORT jobject JNICALL +Java_network_loki_messenger_libsession_1util_SessionEncrypt_encryptForBlindedRecipient(JNIEnv *env, + jobject thiz, + jbyteArray message, + jbyteArray my_ed25519_privkey, + jbyteArray server_pub_key, + jbyteArray recipient_blind_id) { + return jni_utils::run_catching_cxx_exception_or_throws(env, [=] { + auto data = session::encrypt_for_blinded_recipient( + JavaByteArrayRef(env, my_ed25519_privkey).get(), + JavaByteArrayRef(env, server_pub_key).get(), + JavaByteArrayRef(env, recipient_blind_id).get(), + JavaByteArrayRef(env, message).get() + ); + + return jni_utils::session_bytes_from_range(env, data); + }); +} \ No newline at end of file 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 9603c7b..c64116a 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 @@ -5,6 +5,16 @@ import network.loki.messenger.libsession_util.util.Bytes private typealias SessionId = String object SessionEncrypt { + /** + * Decrypts data using the Session protocol for a blinded recipient. + * + * @param ciphertext The data to decrypt. + * @param myEd25519Privkey The ED25519 private key to use for decryption. Could be 32 bytes seed or libsodium-style 64 bytes. + * @param openGroupPubkey The public key of the open group. Must be 32 bytes unprefixed pub key. + * @param senderBlindedId The sender's blinded ID. Must be 33 bytes prefixed with either 0x15 or 0x25. + * @param recipientBlindId The recipient's blinded ID. Must be 33 bytes prefixed with either 0x15 or 0x25. + * @return A pair of the sender's session ID and the decrypted message. + */ external fun decryptForBlindedRecipient( ciphertext: ByteArray, myEd25519Privkey: ByteArray, @@ -12,4 +22,48 @@ object SessionEncrypt { senderBlindedId: ByteArray, recipientBlindId: ByteArray ): Pair + + /** + * Encrypts data using the Session protocol for a blinded recipient. + * + * @param message The plaintext message to encrypt. + * @param myEd25519Privkey The ED25519 private key to use for signing the message. Could be 32 bytes seed or libsodium-style 64 bytes. + * @param serverPubKey The public key of the server. Must be 32 bytes unprefixed pub key. + * @param recipientBlindId The recipient's blinded ID. Must be 33 bytes prefixed with either 0x15 or 0x25. + */ + external fun encryptForBlindedRecipient( + message: ByteArray, + myEd25519Privkey: ByteArray, + serverPubKey: ByteArray, + recipientBlindId: ByteArray, + ): Bytes + + /** + * Encrypts data using the Session protocol for `recipientX25519PublicKey`. + * + * @param ed25519PrivateKey The ED25519 private key to use for signing the message. + * Could be 32bytes seed or libsodium-style 64 bytes + * @param recipientX25519PublicKey Recipient's x25519 pub key. Must be 32 bytes unprefixed pub key. + * @param message The plaintext message to encrypt. + */ + external fun encryptForRecipient( + ed25519PrivateKey: ByteArray, + recipientX25519PublicKey: ByteArray, + message: ByteArray, + ): Bytes + + /** + * Decrypt data using the Session protocol. + * + * @param x25519PubKey The X25519 public key of what the sender used to encrypt the message. 32 bytes. + * @param x25519PrivKey The X25519 private key to the public key used to encrypt the message. 32/64 bytes. + * @param ciphertext The data to decrypt + * + * @return A pair of the sender's session ID and the decrypted message. + */ + external fun decryptIncoming( + x25519PubKey: ByteArray, + x25519PrivKey: ByteArray, + ciphertext: ByteArray + ): Pair } \ No newline at end of file