RustNoiseNative.kt

3.2 KB · raw

1package com.peachpasswords.sync23/**4 * Thin JNI boundary over the canonical Rust `snow` state machine.5 *6 * No transcript, key schedule, cipher, or nonce logic belongs in Kotlin.7 */8internal object RustNoiseNative {9    init {10        System.loadLibrary("peach_noise_core")11    }1213    external fun nativeCreateNkInitiator(remotePublicKey: ByteArray): Long14    external fun nativeCreateNkResponder(15        localPrivateKey: ByteArray,16        localPublicKey: ByteArray,17    ): Long18    external fun nativeCreateNkInitiatorForTest(19        remotePublicKey: ByteArray,20        ephemeralPrivateKey: ByteArray,21    ): Long22    external fun nativeCreateNkResponderForTest(23        localPrivateKey: ByteArray,24        localPublicKey: ByteArray,25        ephemeralPrivateKey: ByteArray,26    ): Long2728    external fun nativeCreateKkInitiator(29        localPrivateKey: ByteArray,30        localPublicKey: ByteArray,31        remotePublicKey: ByteArray,32    ): Long33    external fun nativeCreateKkResponder(34        localPrivateKey: ByteArray,35        localPublicKey: ByteArray,36        remotePublicKey: ByteArray,37    ): Long38    external fun nativeCreateKkInitiatorForTest(39        localPrivateKey: ByteArray,40        localPublicKey: ByteArray,41        remotePublicKey: ByteArray,42        ephemeralPrivateKey: ByteArray,43    ): Long44    external fun nativeCreateKkResponderForTest(45        localPrivateKey: ByteArray,46        localPublicKey: ByteArray,47        remotePublicKey: ByteArray,48        ephemeralPrivateKey: ByteArray,49    ): Long5051    external fun nativeWriteHandshake(handle: Long, payload: ByteArray): ByteArray52    external fun nativeReadHandshake(handle: Long, message: ByteArray): ByteArray53    external fun nativeEncrypt(handle: Long, plaintext: ByteArray): ByteArray54    external fun nativeDecrypt(handle: Long, ciphertext: ByteArray): ByteArray55    external fun nativeHandshakeHash(handle: Long): ByteArray56    external fun nativeRekeyOutgoing(handle: Long)57    external fun nativeRekeyIncoming(handle: Long)58    external fun nativeClose(handle: Long)59}6061internal class RustNoiseSession(62    private var handle: Long,63) : NoiseNKSession {64    private fun openHandle(): Long {65        check(handle != 0L) { "Noise session is closed" }66        return handle67    }6869    fun writeHandshake(payload: ByteArray = ByteArray(0)): ByteArray =70        RustNoiseNative.nativeWriteHandshake(openHandle(), payload)7172    fun readHandshake(message: ByteArray): ByteArray =73        RustNoiseNative.nativeReadHandshake(openHandle(), message)7475    override fun encrypt(plaintext: ByteArray): ByteArray =76        RustNoiseNative.nativeEncrypt(openHandle(), plaintext)7778    override fun decrypt(ciphertext: ByteArray): ByteArray =79        RustNoiseNative.nativeDecrypt(openHandle(), ciphertext)8081    override val handshakeHash: ByteArray82        get() = RustNoiseNative.nativeHandshakeHash(openHandle())8384    override fun rekeyOutgoing() {85        RustNoiseNative.nativeRekeyOutgoing(openHandle())86    }8788    override fun rekeyIncoming() {89        RustNoiseNative.nativeRekeyIncoming(openHandle())90    }9192    override fun close() {93        val value = handle94        if (value == 0L) return95        handle = 0L96        RustNoiseNative.nativeClose(value)97    }98}99