feat(waku-utils): Add utils for `Waku Handshake`

Partial solution for https://github.com/status-im/nimbus-gui/issues/91
This commit is contained in:
Emil Ivanichkov 2024-01-29 19:16:55 +02:00 committed by Emil Ivanichkov
parent 87e475cdb3
commit 9174fa5cc5
1 changed files with 81 additions and 0 deletions

View File

@ -0,0 +1,81 @@
import debug from 'debug'
import { randomBytes } from '@stablelib/random'
import { HMACDRBG } from '@stablelib/hmac-drbg'
import { LightNode } from '@waku/interfaces'
import { bytesToHex } from '@waku/utils/bytes'
import {
HandshakeResult,
WakuPairing,
X25519DHKey,
ResponderParameters,
NoiseSecureTransferEncoder,
NoiseSecureTransferDecoder,
} from '@waku/noise'
import { CustomHandshakeResult } from './handshake'
const log = debug('nimbus-gui:waku:utils')
export function getPairingObject(node: LightNode): WakuPairing {
const dhKey = new X25519DHKey()
const rng = new HMACDRBG()
const nimbusGUIStaticKey = dhKey.generateKeyPair()
const applicationName = 'nimbus-gui'
const applicationVersion = '0.0.0'
const shardIdAsBytes = randomBytes(16, rng)
const shardId = bytesToHex(shardIdAsBytes)
const pairingObj = new WakuPairing(
node.lightPush,
node.filter,
nimbusGUIStaticKey,
new ResponderParameters(applicationName, applicationVersion, shardId),
)
const pInfo = pairingObj.getPairingInfo()
log(`Initial messageNameTag: "${bytesToHex(pInfo.qrMessageNameTag)}"`)
log(`QR Code: "${pInfo.qrCode}"`)
log(`Content topic: "${pairingObj.contentTopic}"`)
return pairingObj
}
export async function scheduleHandshakeAuthConfirmation(
pairingObj: WakuPairing,
) {
const authCode = await pairingObj.getAuthCode()
log('Auth code is: ' + authCode)
pairingObj.validateAuthCode(true)
}
export async function proceedHandshake(pairingObj: WakuPairing): Promise<{
encoder: NoiseSecureTransferEncoder
decoder: NoiseSecureTransferDecoder
handshakeResult: HandshakeResult
}> {
const pExecute = pairingObj.execute(120000) // timeout after 2m
await scheduleHandshakeAuthConfirmation(pairingObj)
log("Authcode confirmed")
const [encoder] = await pExecute
const handshakeResult = pairingObj.getHandshakeResult()
handshakeResult ? log('Handshake successful') : log('Handshake failed')
const customHandshakeResult = new CustomHandshakeResult(
handshakeResult.getCSOutbound(),
handshakeResult.getCSInbound(),
handshakeResult.nametagsInbound,
handshakeResult.nametagsOutbound,
handshakeResult.rs,
handshakeResult.h,
)
const decoder = new NoiseSecureTransferDecoder(
pairingObj.contentTopic,
customHandshakeResult,
)
return { encoder, decoder, handshakeResult: customHandshakeResult }
}