From 13c8a0527b8ceb1f4c29b4e484788ec9eddc8de2 Mon Sep 17 00:00:00 2001 From: Franck Royer Date: Thu, 15 Jul 2021 12:12:43 +1000 Subject: [PATCH] Test symmetric encryption with nim-waku using relay --- src/lib/waku_message/index.spec.ts | 54 ++++++++++++++++++++++++++++++ src/lib/waku_message/version_1.ts | 9 +++-- src/lib/waku_relay/index.ts | 4 ++- src/test_utils/nim_waku.ts | 40 ++++++++++++++++++++++ 4 files changed, 104 insertions(+), 3 deletions(-) diff --git a/src/lib/waku_message/index.spec.ts b/src/lib/waku_message/index.spec.ts index a0f14c6ff4..a9f552ab81 100644 --- a/src/lib/waku_message/index.spec.ts +++ b/src/lib/waku_message/index.spec.ts @@ -105,5 +105,59 @@ describe('Waku Message: Node only', function () { expect(msgs[0].contentTopic).to.equal(message.contentTopic); expect(hexToBuf(msgs[0].payload).toString('utf-8')).to.equal(messageText); }); + + it('JS decrypts nim message [symmetric, no signature]', async function () { + this.timeout(10000); + await delay(200); + + const messageText = 'Here is a message encrypted in a symmetric manner.'; + const message: WakuRelayMessage = { + contentTopic: DefaultContentTopic, + payload: Buffer.from(messageText, 'utf-8').toString('hex'), + }; + + const symKey = generatePrivateKey(); + + waku.relay.addDecryptionPrivateKey(symKey); + + const receivedMsgPromise: Promise = new Promise( + (resolve) => { + waku.relay.addObserver(resolve); + } + ); + + dbg('Post message'); + await nimWaku.postSymmetricMessage(message, symKey); + + const receivedMsg = await receivedMsgPromise; + + expect(receivedMsg.contentTopic).to.eq(message.contentTopic); + expect(receivedMsg.version).to.eq(1); + expect(receivedMsg.payloadAsUtf8).to.eq(messageText); + }); + + it('Js encrypts message for nim [symmetric, no signature]', async function () { + this.timeout(5000); + + const symKey = await nimWaku.getSymmetricKey(); + + const messageText = + 'This is a message I am going to encrypt with a symmetric key'; + const message = await WakuMessage.fromUtf8String(messageText, { + symKey: symKey, + }); + + await waku.relay.send(message); + + let msgs: WakuRelayMessage[] = []; + + while (msgs.length === 0) { + await delay(200); + msgs = await nimWaku.getSymmetricMessages(symKey); + } + + expect(msgs[0].contentTopic).to.equal(message.contentTopic); + expect(hexToBuf(msgs[0].payload).toString('utf-8')).to.equal(messageText); + }); }); }); diff --git a/src/lib/waku_message/version_1.ts b/src/lib/waku_message/version_1.ts index 7cdbdf68e8..19ae218ad0 100644 --- a/src/lib/waku_message/version_1.ts +++ b/src/lib/waku_message/version_1.ts @@ -172,14 +172,19 @@ export async function decryptSymmetric( } /** - * Generate a new private key + * Generate a new key. Can be used as a private key for Asymmetric encryption + * or a key for symmetric encryption. + * + * If using Asymmetric encryption, use {@link getPublicKey} to get the + * corresponding Public Key. */ export function generatePrivateKey(): Uint8Array { return randomBytes(32); } /** - * Return the public key for the given private key + * Return the public key for the given private key, to be used for asymmetric + * encryption. */ export function getPublicKey(privateKey: Uint8Array | Buffer): Uint8Array { return secp256k1.publicKeyCreate(privateKey, false); diff --git a/src/lib/waku_relay/index.ts b/src/lib/waku_relay/index.ts index 041a428e35..ac4fc342b5 100644 --- a/src/lib/waku_relay/index.ts +++ b/src/lib/waku_relay/index.ts @@ -125,7 +125,9 @@ export class WakuRelay extends Gossipsub { /** * Register a decryption private key to attempt decryption of messages of - * the given content topic. + * the given content topic. This can either be a private key for asymmetric + * encryption or a symmetric key. Waku relay will attempt to decrypt messages + * using both methods. */ addDecryptionPrivateKey(privateKey: Uint8Array): void { this.decPrivateKeys.add(privateKey); diff --git a/src/test_utils/nim_waku.ts b/src/test_utils/nim_waku.ts index cef77d7c4c..8a9acc0745 100644 --- a/src/test_utils/nim_waku.ts +++ b/src/test_utils/nim_waku.ts @@ -12,6 +12,7 @@ import debug from 'debug'; import { Multiaddr, multiaddr } from 'multiaddr'; import PeerId from 'peer-id'; +import { hexToBuf } from '../lib/utils'; import { WakuMessage } from '../lib/waku_message'; import { DefaultPubsubTopic } from '../lib/waku_relay'; import * as proto from '../proto/waku/v2/message'; @@ -251,6 +252,45 @@ export class NimWaku { ); } + async getSymmetricKey(): Promise { + this.checkProcess(); + + return this.rpcCall( + 'get_waku_v2_private_v1_symmetric_key', + [] + ).then(hexToBuf); + } + + async postSymmetricMessage( + message: WakuRelayMessage, + symKey: Uint8Array, + pubsubTopic?: string + ): Promise { + this.checkProcess(); + + if (!message.payload) { + throw 'Attempting to send empty message'; + } + + return this.rpcCall('post_waku_v2_private_v1_symmetric_message', [ + pubsubTopic ? pubsubTopic : DefaultPubsubTopic, + message, + '0x' + bufToHex(symKey), + ]); + } + + async getSymmetricMessages( + symKey: Uint8Array, + pubsubTopic?: string + ): Promise { + this.checkProcess(); + + return await this.rpcCall( + 'get_waku_v2_private_v1_symmetric_messages', + [pubsubTopic ? pubsubTopic : DefaultPubsubTopic, '0x' + bufToHex(symKey)] + ); + } + async getPeerId(): Promise { return await this.setPeerId().then((res) => res.peerId); }