mirror of
https://github.com/logos-messaging/js-waku.git
synced 2026-01-03 06:13:08 +00:00
* fix: use pubsubTopic from current ones if not set * fix: improve type on dial method * enforce same pubusb on filter.subscribe, make content topic to pubsub mapping default for decoder / encoder * fix mapping problem * update tests * add error handling * fix typo * up lock * rm lock * up lock * remove only * fix content topic * fix ephemeral test * fix filter unsubscribe test * up utils * fix subscribe test * up interfaces and filter api * remove only * up ping test * fix subscribe test * fix push test * fix lightPush * fix multiple pubsub * remove only, fix subscribe filter test * remove only * fix cluster ID selection and named sharding subscription test * fix unsubscribe test * fix light push test * fix light push test * fix push test * fix relay publish * create runNode and fix relay tests * generalize runNodes, fix some tests * fix store tests * fix toAsyncIterator tests * remove only * fix lightPush * use generics * try fix test * run failing tests * remove only * address failed tests, remove DefaultPubsubTopic dependency in some tests
155 lines
5.4 KiB
TypeScript
155 lines
5.4 KiB
TypeScript
import { IProtoMessage } from "@waku/interfaces";
|
|
import { contentTopicToPubsubTopic } from "@waku/utils";
|
|
import { expect } from "chai";
|
|
import fc from "fast-check";
|
|
|
|
import { getPublicKey } from "./crypto/index.js";
|
|
import { createDecoder, createEncoder } from "./symmetric.js";
|
|
|
|
const contentTopic = "/js-waku/1/tests/bytes";
|
|
const pubsubTopic = contentTopicToPubsubTopic(contentTopic);
|
|
|
|
describe("Symmetric Encryption", function () {
|
|
it("Round trip binary encryption [symmetric, no signature]", async function () {
|
|
await fc.assert(
|
|
fc.asyncProperty(
|
|
fc.uint8Array({ minLength: 1 }),
|
|
fc.uint8Array({ min: 1, minLength: 32, maxLength: 32 }),
|
|
async (payload, symKey) => {
|
|
const encoder = createEncoder({
|
|
contentTopic,
|
|
symKey
|
|
});
|
|
const bytes = await encoder.toWire({ payload });
|
|
|
|
const decoder = createDecoder(contentTopic, symKey);
|
|
const protoResult = await decoder.fromWireToProtoObj(bytes!);
|
|
if (!protoResult) throw "Failed to proto decode";
|
|
const result = await decoder.fromProtoObj(pubsubTopic, protoResult);
|
|
if (!result) throw "Failed to decode";
|
|
|
|
expect(result.contentTopic).to.equal(contentTopic);
|
|
expect(result.pubsubTopic).to.equal(pubsubTopic);
|
|
expect(result.version).to.equal(1);
|
|
expect(result?.payload).to.deep.equal(payload);
|
|
expect(result.signature).to.be.undefined;
|
|
expect(result.verifySignature(new Uint8Array())).to.be.false;
|
|
expect(result.signaturePublicKey).to.be.undefined;
|
|
}
|
|
)
|
|
);
|
|
});
|
|
|
|
it("Round trip binary encryption [symmetric, signature]", async function () {
|
|
await fc.assert(
|
|
fc.asyncProperty(
|
|
fc.uint8Array({ minLength: 1 }),
|
|
fc.uint8Array({ min: 1, minLength: 32, maxLength: 32 }),
|
|
fc.uint8Array({ min: 1, minLength: 32, maxLength: 32 }),
|
|
async (payload, sigPrivKey, symKey) => {
|
|
const sigPubKey = getPublicKey(sigPrivKey);
|
|
|
|
const encoder = createEncoder({
|
|
contentTopic,
|
|
symKey,
|
|
sigPrivKey
|
|
});
|
|
const bytes = await encoder.toWire({ payload });
|
|
|
|
const decoder = createDecoder(contentTopic, symKey);
|
|
const protoResult = await decoder.fromWireToProtoObj(bytes!);
|
|
if (!protoResult) throw "Failed to proto decode";
|
|
const result = await decoder.fromProtoObj(pubsubTopic, protoResult);
|
|
if (!result) throw "Failed to decode";
|
|
|
|
expect(result.contentTopic).to.equal(contentTopic);
|
|
expect(result.pubsubTopic).to.equal(pubsubTopic);
|
|
expect(result.version).to.equal(1);
|
|
expect(result?.payload).to.deep.equal(payload);
|
|
expect(result.signature).to.not.be.undefined;
|
|
expect(result.verifySignature(sigPubKey)).to.be.true;
|
|
expect(result.signaturePublicKey).to.deep.eq(sigPubKey);
|
|
}
|
|
)
|
|
);
|
|
});
|
|
|
|
it("Check meta is set [symmetric]", async function () {
|
|
await fc.assert(
|
|
fc.asyncProperty(
|
|
fc.uint8Array({ minLength: 1 }),
|
|
fc.uint8Array({ min: 1, minLength: 32, maxLength: 32 }),
|
|
async (payload, symKey) => {
|
|
const metaSetter = (
|
|
msg: IProtoMessage & { meta: undefined }
|
|
): Uint8Array => {
|
|
const buffer = new ArrayBuffer(4);
|
|
const view = new DataView(buffer);
|
|
view.setUint32(0, msg.payload.length, false);
|
|
return new Uint8Array(buffer);
|
|
};
|
|
|
|
const encoder = createEncoder({
|
|
contentTopic,
|
|
symKey,
|
|
metaSetter
|
|
});
|
|
const bytes = await encoder.toWire({ payload });
|
|
|
|
const decoder = createDecoder(contentTopic, symKey);
|
|
const protoResult = await decoder.fromWireToProtoObj(bytes!);
|
|
if (!protoResult) throw "Failed to proto decode";
|
|
const result = await decoder.fromProtoObj(pubsubTopic, protoResult);
|
|
if (!result) throw "Failed to decode";
|
|
|
|
const expectedMeta = metaSetter({
|
|
payload: protoResult.payload,
|
|
timestamp: undefined,
|
|
contentTopic: "",
|
|
ephemeral: undefined,
|
|
meta: undefined,
|
|
rateLimitProof: undefined,
|
|
version: undefined
|
|
});
|
|
|
|
expect(result.meta).to.deep.equal(expectedMeta);
|
|
}
|
|
)
|
|
);
|
|
});
|
|
});
|
|
|
|
describe("Ensures content topic is defined", () => {
|
|
it("Encoder throws on undefined content topic", () => {
|
|
const wrapper = function (): void {
|
|
createEncoder({
|
|
contentTopic: undefined as unknown as string,
|
|
symKey: new Uint8Array()
|
|
});
|
|
};
|
|
|
|
expect(wrapper).to.throw("Content topic must be specified");
|
|
});
|
|
it("Encoder throws on empty string content topic", () => {
|
|
const wrapper = function (): void {
|
|
createEncoder({ contentTopic: "", symKey: new Uint8Array() });
|
|
};
|
|
|
|
expect(wrapper).to.throw("Content topic must be specified");
|
|
});
|
|
it("Decoder throws on undefined content topic", () => {
|
|
const wrapper = function (): void {
|
|
createDecoder(undefined as unknown as string, new Uint8Array());
|
|
};
|
|
|
|
expect(wrapper).to.throw("Content topic must be specified");
|
|
});
|
|
it("Decoder throws on empty string content topic", () => {
|
|
const wrapper = function (): void {
|
|
createDecoder("", new Uint8Array());
|
|
};
|
|
|
|
expect(wrapper).to.throw("Content topic must be specified");
|
|
});
|
|
});
|