From 3b625211f27abb07f00f2b724badc62438aa0808 Mon Sep 17 00:00:00 2001 From: Emil Ivanichkov Date: Wed, 31 Jan 2024 19:58:25 +0200 Subject: [PATCH] feat(waku-utils): Implement `initiatorHandshake` closes https://github.com/status-im/status-node-manager/issues/7 --- libs/waku-utils/waku_handshake_utils.nim | 49 +++++++++++++++++++++++- 1 file changed, 48 insertions(+), 1 deletion(-) diff --git a/libs/waku-utils/waku_handshake_utils.nim b/libs/waku-utils/waku_handshake_utils.nim index ecd0db0..b521c12 100644 --- a/libs/waku-utils/waku_handshake_utils.nim +++ b/libs/waku-utils/waku_handshake_utils.nim @@ -163,7 +163,7 @@ proc prepareHandShakeMsg*(rng: ref HmacDrbgContext, # <- sB, eAsB {r} # # -> sA, sAeB, sAsB {s} # ###################### ########################## - notice "Setting up agent and preparing handshake message for step:", step = step + notice "Preparing handshake message for step:", step = step let transportMessage = agentInfo.commitment agentStep = stepHandshake(rng[], agentHS, transportMessage = transportMessage, @@ -205,3 +205,50 @@ proc handleHandShakeMsg*(rng: ref HmacDrbgContext, messageNametag = initiatorMessageNametag).get() initiatorMessageNametag = toMessageNametag(initiatorHS) +proc initiatorHandshake*(rng: ref HmacDrbgContext, node: WakuNode, + pubSubTopic: PubsubTopic, contentTopic: ContentTopic, qr: string, + qrMessageNameTag: seq[byte], initiatorInfo: AgentKeysAndCommitment + ): Future[HandshakeResult] {.async.} = + var + readyForFinalization = false + + initiatorMessageNametag: MessageNametag + initiatorStep: HandshakeStepResult + initiatorHS: HandshakeState = initHS(initiatorInfo, qr, true) + + initiatorHSResult: HandshakeResult + + let initialMessage = + prepareHandShakeInitiatorMsg(rng, contentTopic, initiatorInfo, + qrMessageNameTag, initiatorMessageNametag, initiatorHS, initiatorStep) + + proc initiatorHandshakeHandler(topic: PubsubTopic, msg: WakuMessage): Future[ + void] {.async.} = + if msg.contentTopic == contentTopic: + let readPayloadV2 = decodePayloadV2(msg).get() + if readPayloadV2.messageNametag == initiatorMessageNametag: + handleHandShakeMsg(rng, pubSubTopic, contentTopic, step = 2, + readPayloadV2, initiatorStep, initiatorHS, initiatorMessageNametag) + + let handShakeMsgStep3 = prepareHandShakeMsg(rng, contentTopic, + initiatorInfo, initiatorMessageNametag, initiatorHS, initiatorStep, step = 3) + await publishHandShakeMsg(node, pubSubTopic, contentTopic, + handShakeMsgStep3.get(), 3) + readyForFinalization = true + + node.subscribe((kind: PubsubSub, topic: pubsubTopic), some(initiatorHandshakeHandler)) + + await publishHandShakeInitiatorMsg(node, pubSubTopic, contentTopic, + initialMessage.get()) + + while true: + if readyForFinalization: + node.unsubscribe((kind: PubsubSub, topic: pubsubTopic)) + + notice "Finalizing handshake" + initiatorHSResult = finalizeHandshake(initiatorHS) + notice "Handshake finalized successfully" + break + await sleepAsync(2000) + + return initiatorHSResult