NoiseKK.kt

2.3 KB · raw

1package com.peachpasswords.sync23internal data class NoiseKKKeyPair(4    val publicKey: ByteArray,5    val secretKey: ByteArray,6)78/**9 * Standard unmodified Noise KK reconnect through the canonical Rust core.10 * Both static keys are supplied from durable local pairing state; there is no11 * NK downgrade or peer-controlled key selection.12 */13internal suspend fun noiseKKInitiator(14    ourStaticPrivateKey: ByteArray,15    ourStaticPublicKey: ByteArray,16    responderStaticPublicKey: ByteArray,17    send: suspend (ByteArray) -> Unit,18    receive: suspend () -> ByteArray,19    ephemeral: NoiseKKKeyPair? = null,20): NoiseNKSession {21    val native = RustNoiseSession(22        if (ephemeral == null) {23            RustNoiseNative.nativeCreateKkInitiator(24                ourStaticPrivateKey,25                ourStaticPublicKey,26                responderStaticPublicKey,27            )28        } else {29            RustNoiseNative.nativeCreateKkInitiatorForTest(30                ourStaticPrivateKey,31                ourStaticPublicKey,32                responderStaticPublicKey,33                ephemeral.secretKey,34            )35        },36    )37    return try {38        send(native.writeHandshake())39        native.readHandshake(receive())40        native41    } catch (error: Throwable) {42        native.close()43        throw error44    }45}4647internal suspend fun noiseKKResponder(48    ourStaticPrivateKey: ByteArray,49    ourStaticPublicKey: ByteArray,50    expectedInitiatorStaticPublicKey: ByteArray,51    send: suspend (ByteArray) -> Unit,52    receive: suspend () -> ByteArray,53    ephemeral: NoiseKKKeyPair? = null,54): NoiseNKSession {55    val native = RustNoiseSession(56        if (ephemeral == null) {57            RustNoiseNative.nativeCreateKkResponder(58                ourStaticPrivateKey,59                ourStaticPublicKey,60                expectedInitiatorStaticPublicKey,61            )62        } else {63            RustNoiseNative.nativeCreateKkResponderForTest(64                ourStaticPrivateKey,65                ourStaticPublicKey,66                expectedInitiatorStaticPublicKey,67                ephemeral.secretKey,68            )69        },70    )71    return try {72        native.readHandshake(receive())73        send(native.writeHandshake())74        native75    } catch (error: Throwable) {76        native.close()77        throw error78    }79}80