mirror of
https://github.com/logos-messaging/nim-chat-sdk.git
synced 2026-01-05 23:53:09 +00:00
commit
bc87441c8f
108
apps/noise.nim
Normal file
108
apps/noise.nim
Normal 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()
|
||||||
@ -7,7 +7,13 @@ license = "MIT"
|
|||||||
srcDir = "src"
|
srcDir = "src"
|
||||||
|
|
||||||
### Dependencies
|
### 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") =
|
proc ensureRln(libFile: string = "build/librln.a", version = "v0.7.0") =
|
||||||
if not fileExists(libFile):
|
if not fileExists(libFile):
|
||||||
@ -36,3 +42,6 @@ task subscribe, "Run waku subscription service":
|
|||||||
|
|
||||||
task publishing, "Run waku publishing service":
|
task publishing, "Run waku publishing service":
|
||||||
exec "nim c --passL:build/librln.a --passL:-lm -r apps/waku_publisher.nim"
|
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"
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user