From 77eb467cab260d66ef6e94a29c4ec95c501e0511 Mon Sep 17 00:00:00 2001 From: "fryorcraken.eth" Date: Fri, 30 Sep 2022 14:46:18 +1000 Subject: [PATCH] feat: test codec with version 1 codec --- src/codec.spec.ts | 183 +++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 180 insertions(+), 3 deletions(-) diff --git a/src/codec.spec.ts b/src/codec.spec.ts index a7e2bc3..8a95688 100644 --- a/src/codec.spec.ts +++ b/src/codec.spec.ts @@ -1,9 +1,20 @@ import { expect } from "chai"; +import { + generatePrivateKey, + generateSymmetricKey, + getPublicKey, +} from "js-waku"; import { DecoderV0, EncoderV0, MessageV0, } from "js-waku/lib/waku_message/version_0"; +import { + AsymDecoder, + AsymEncoder, + SymDecoder, + SymEncoder, +} from "js-waku/lib/waku_message/version_1"; import { RLNDecoder, RLNEncoder } from "./codec.js"; import { RlnMessage } from "./message.js"; @@ -12,8 +23,8 @@ import * as rln from "./index.js"; const TestContentTopic = "/test/1/waku-message/utf8"; -describe("js-rln: encoder", () => { - it("should attach a proof to a waku message when using toWire", async function () { +describe("RLN codec with version 0", () => { + it("toWire", async function () { const rlnInstance = await rln.create(); const memKeys = rlnInstance.generateMembershipKey(); const index = 0; @@ -51,7 +62,7 @@ describe("js-rln: encoder", () => { expect(msg.timestamp).to.not.be.undefined; }); - it("should attach a proof to a waku message when using toProtoObj", async function () { + it("toProtoObj", async function () { const rlnInstance = await rln.create(); const memKeys = rlnInstance.generateMembershipKey(); const index = 0; @@ -90,3 +101,169 @@ describe("js-rln: encoder", () => { expect(msg.timestamp).to.not.be.undefined; }); }); + +describe("RLN codec with version 1", () => { + it("Symmetric, toWire", async function () { + const rlnInstance = await rln.create(); + const memKeys = rlnInstance.generateMembershipKey(); + const index = 0; + const payload = new Uint8Array([1, 2, 3, 4, 5]); + + rlnInstance.insertMember(memKeys.IDCommitment); + + const symKey = generateSymmetricKey(); + + const rlnEncoder = new RLNEncoder( + new SymEncoder(TestContentTopic, symKey), + rlnInstance, + index, + memKeys + ); + const rlnDecoder = new RLNDecoder( + rlnInstance, + new SymDecoder(TestContentTopic, symKey) + ); + + const bytes = await rlnEncoder.toWire({ payload }); + + expect(bytes).to.not.be.undefined; + const protoResult = await rlnDecoder.fromWireToProtoObj(bytes!); + + expect(protoResult).to.not.be.undefined; + const msg = (await rlnDecoder.fromProtoObj(protoResult!))!; + + expect(msg.rateLimitProof).to.not.be.undefined; + expect(msg.verify()).to.be.true; + expect(msg.epoch).to.not.be.undefined; + expect(msg.epoch).to.be.gt(0); + + expect(msg.contentTopic).to.eq(TestContentTopic); + expect(msg.msg.version).to.eq(1); + expect(msg.payload).to.deep.eq(payload); + expect(msg.timestamp).to.not.be.undefined; + }); + + it("Symmetric, toProtoObj", async function () { + const rlnInstance = await rln.create(); + const memKeys = rlnInstance.generateMembershipKey(); + const index = 0; + const payload = new Uint8Array([1, 2, 3, 4, 5]); + + rlnInstance.insertMember(memKeys.IDCommitment); + + const symKey = generateSymmetricKey(); + + const rlnEncoder = new RLNEncoder( + new SymEncoder(TestContentTopic, symKey), + rlnInstance, + index, + memKeys + ); + const rlnDecoder = new RLNDecoder( + rlnInstance, + new SymDecoder(TestContentTopic, symKey) + ); + + const proto = await rlnEncoder.toProtoObj({ payload }); + + expect(proto).to.not.be.undefined; + const msg = (await rlnDecoder.fromProtoObj( + proto! + )) as RlnMessage; + + expect(msg).to.not.be.undefined; + expect(msg.rateLimitProof).to.not.be.undefined; + + expect(msg.verify()).to.be.true; + expect(msg.epoch).to.not.be.undefined; + expect(msg.epoch).to.be.gt(0); + + expect(msg.contentTopic).to.eq(TestContentTopic); + expect(msg.msg.version).to.eq(1); + expect(msg.payload).to.deep.eq(payload); + expect(msg.timestamp).to.not.be.undefined; + }); + + it("Asymmetric, toWire", async function () { + const rlnInstance = await rln.create(); + const memKeys = rlnInstance.generateMembershipKey(); + const index = 0; + const payload = new Uint8Array([1, 2, 3, 4, 5]); + + rlnInstance.insertMember(memKeys.IDCommitment); + + const privateKey = generatePrivateKey(); + const publicKey = getPublicKey(privateKey); + + const rlnEncoder = new RLNEncoder( + new AsymEncoder(TestContentTopic, publicKey), + rlnInstance, + index, + memKeys + ); + const rlnDecoder = new RLNDecoder( + rlnInstance, + new AsymDecoder(TestContentTopic, privateKey) + ); + + const bytes = await rlnEncoder.toWire({ payload }); + + expect(bytes).to.not.be.undefined; + const protoResult = await rlnDecoder.fromWireToProtoObj(bytes!); + + expect(protoResult).to.not.be.undefined; + const msg = (await rlnDecoder.fromProtoObj(protoResult!))!; + + expect(msg.rateLimitProof).to.not.be.undefined; + expect(msg.verify()).to.be.true; + expect(msg.epoch).to.not.be.undefined; + expect(msg.epoch).to.be.gt(0); + + expect(msg.contentTopic).to.eq(TestContentTopic); + expect(msg.msg.version).to.eq(1); + expect(msg.payload).to.deep.eq(payload); + expect(msg.timestamp).to.not.be.undefined; + }); + + it("Asymmetric, toProtoObj", async function () { + const rlnInstance = await rln.create(); + const memKeys = rlnInstance.generateMembershipKey(); + const index = 0; + const payload = new Uint8Array([1, 2, 3, 4, 5]); + + rlnInstance.insertMember(memKeys.IDCommitment); + + const privateKey = generatePrivateKey(); + const publicKey = getPublicKey(privateKey); + + const rlnEncoder = new RLNEncoder( + new AsymEncoder(TestContentTopic, publicKey), + rlnInstance, + index, + memKeys + ); + const rlnDecoder = new RLNDecoder( + rlnInstance, + new AsymDecoder(TestContentTopic, privateKey) + ); + + const proto = await rlnEncoder.toProtoObj({ payload }); + + expect(proto).to.not.be.undefined; + const msg = (await rlnDecoder.fromProtoObj( + proto! + )) as RlnMessage; + + expect(msg).to.not.be.undefined; + expect(msg.rateLimitProof).to.not.be.undefined; + + expect(msg.verify()).to.be.true; + expect(msg.epoch).to.not.be.undefined; + expect(msg.epoch).to.be.gt(0); + + expect(msg.contentTopic).to.eq(TestContentTopic); + expect(msg.msg.version).to.eq(1); + expect(msg.payload).to.deep.eq(payload); + expect(msg.timestamp).to.not.be.undefined; + }); +});