noise usage

This commit is contained in:
kaichaosun 2025-10-28 17:44:43 +08:00
parent 027c8dc157
commit 70417ad3bc
No known key found for this signature in database
GPG Key ID: 223E0F992F4F03BF
2 changed files with 118 additions and 1 deletions

108
apps/noise.nim Normal file
View File

@ -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()

View File

@ -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"