From 70417ad3bc92f221c66d03e9550e11b83996a861 Mon Sep 17 00:00:00 2001 From: kaichaosun Date: Tue, 28 Oct 2025 17:44:43 +0800 Subject: [PATCH] noise usage --- apps/noise.nim | 108 ++++++++++++++++++++++++++++++++++++++++++++++++ chat_sdk.nimble | 11 ++++- 2 files changed, 118 insertions(+), 1 deletion(-) create mode 100644 apps/noise.nim diff --git a/apps/noise.nim b/apps/noise.nim new file mode 100644 index 0000000..aa608fb --- /dev/null +++ b/apps/noise.nim @@ -0,0 +1,108 @@ +# Demonstration of the Noise KN handshake. + +import std/[sysrand, strutils] +import stew/byteutils + +import noise/utils +import noise/states + +proc kn() = + echo "\n=== Noise KN Handshake Demo ===" + # Simulate initiator with static keypair + let initiatorKeypair = generateKeypair() + let initiatorHS = newHandshakeState(true, "KN", s = initiatorKeypair) + + # Simulate responder with initiator's static public key + let responderHS = newHandshakeState(false, "KN", rs = initiatorKeypair.`public`) + + # Initiator sends first message + let (msg1, _, _) = initiatorHS.writeMessage(@[]) + echo "Initiator sent message 1: ", msg1.toHex.toLowerAscii + + # Responder processes first message + let (payload1, _, _) = responderHS.readMessage(msg1) + echo "Responder received payload 1: ", cast[string](payload1) + + # Responder sends response with payload + let helloResponder = strToBytes("Hello from responder in KN!") + let (msg2, sendCSResp, recvCSResp) = responderHS.writeMessage(helloResponder) + echo "Responder sent message 2: ", msg2.toHex.toLowerAscii + + # Initiator processes response + let (payload2, sendCSInit, recvCSInit) = initiatorHS.readMessage(msg2) + echo "Initiator received payload 2: ", cast[string](payload2) + + # Post-handshake: Initiator sends encrypted message to responder + echo "\n=== Post KN Handshake ===" + let message = strToBytes("Hello from initiator in KN!") + let ciphertext = sendCSInit.encrypt(@[], message) + echo "Initiator encrypted: ", ciphertext.toHex.toLowerAscii + + # Responder decrypts + let plaintext = recvCSResp.decrypt(@[], ciphertext) + echo "Responder decrypted: ", cast[string](plaintext) + + # Post-handshake: Responder sends encrypted message to initiator + let message2 = strToBytes("Hi from responder in KN!") + let ciphertext2 = sendCSResp.encrypt(@[], message2) + echo "Responder encrypted: ", ciphertext2.toHex.toLowerAscii + + # Initiator decrypts + let plaintext2 = recvCSInit.decrypt(@[], ciphertext2) + echo "Initiator decrypted: ", cast[string](plaintext2) + + echo "end of demo" + +proc kx() = + echo "\n=== Noise KX Handshake Demo ===" + # Simulate initiator with static keypair + let initiatorKeypair = generateKeypair() + let initiatorHS = newHandshakeState(true, "KX", s = initiatorKeypair) + + # Simulate responder with initiator's static public key + let responderKeypair = generateKeypair() + let responderHS = newHandshakeState(false, "KX", s = responderKeypair, rs = initiatorKeypair.`public`) + + # Initiator sends first message + let (msg1, _, _) = initiatorHS.writeMessage(@[]) + echo "Initiator sent message 1: ", msg1.toHex.toLowerAscii + + # Responder processes first message + let (payload1, _, _) = responderHS.readMessage(msg1) + echo "Responder received payload 1: ", cast[string](payload1) + + # Responder sends response with payload + let helloResponder = strToBytes("Hello from responder in KX!") + let (msg2, sendCSResp, recvCSResp) = responderHS.writeMessage(helloResponder) + echo "Responder sent message 2: ", msg2.toHex.toLowerAscii + + # Initiator processes response + let (payload2, sendCSInit, recvCSInit) = initiatorHS.readMessage(msg2) + echo "Initiator received payload 2: ", cast[string](payload2) + + # Post-handshake: Initiator sends encrypted message to responder + echo "\n=== Post KX Handshake ===" + let message = strToBytes("Hello from initiator in KX!") + let ciphertext = sendCSInit.encrypt(@[], message) + echo "Initiator encrypted: ", ciphertext.toHex.toLowerAscii + + # Responder decrypts + let plaintext = recvCSResp.decrypt(@[], ciphertext) + echo "Responder decrypted: ", cast[string](plaintext) + + # Post-handshake: Responder sends encrypted message to initiator + let message2 = strToBytes("Hi from responder in KX!") + let ciphertext2 = sendCSResp.encrypt(@[], message2) + echo "Responder encrypted: ", ciphertext2.toHex.toLowerAscii + + # Initiator decrypts + let plaintext2 = recvCSInit.decrypt(@[], ciphertext2) + echo "Initiator decrypted: ", cast[string](plaintext2) + + echo "end of demo" + +proc main() = + kn() + kx() + +main() \ No newline at end of file diff --git a/chat_sdk.nimble b/chat_sdk.nimble index 6d381fb..8b267ee 100644 --- a/chat_sdk.nimble +++ b/chat_sdk.nimble @@ -7,7 +7,13 @@ license = "MIT" srcDir = "src" ### Dependencies -requires "nim >= 2.2.4", "chronicles", "chronos", "db_connector", "flatty", "waku#799793dba7ef78eba41582ed55db01a2d5d7500a" +requires "nim >= 2.2.4", + "chronicles", + "chronos", + "db_connector", + "flatty", + "waku#799793dba7ef78eba41582ed55db01a2d5d7500a", + "noiseprotocol >= 0.0.2" proc ensureRln(libFile: string = "build/librln.a", version = "v0.7.0") = if not fileExists(libFile): @@ -36,3 +42,6 @@ task subscribe, "Run waku subscription service": task publishing, "Run waku publishing service": exec "nim c --passL:build/librln.a --passL:-lm -r apps/waku_publisher.nim" + +task noise, "Run noise protocol demo": + exec "nim c -r apps/noise.nim"