74 lines
2.7 KiB
TypeScript
Raw Normal View History

import { expect } from "chai";
import fc from "fast-check";
import { getPublicKey } from "./crypto/index.js";
import { createDecoder, createEncoder } from "./symmetric.js";
describe("Symmetric Encryption", function () {
it("Round trip binary encryption [symmetric, no signature]", async function () {
await fc.assert(
fc.asyncProperty(
2023-03-13 14:15:57 +11:00
fc.string(),
fc.string(),
fc.uint8Array({ minLength: 1 }),
fc.uint8Array({ min: 1, minLength: 32, maxLength: 32 }),
2023-03-13 14:15:57 +11:00
async (pubSubTopic, contentTopic, payload, symKey) => {
const encoder = createEncoder({
2023-03-13 14:15:57 +11:00
contentTopic,
symKey,
});
const bytes = await encoder.toWire({ payload });
2023-03-13 14:15:57 +11:00
const decoder = createDecoder(contentTopic, symKey);
const protoResult = await decoder.fromWireToProtoObj(bytes!);
if (!protoResult) throw "Failed to proto decode";
2023-03-13 14:15:57 +11:00
const result = await decoder.fromProtoObj(pubSubTopic, protoResult);
if (!result) throw "Failed to decode";
2023-03-13 14:15:57 +11:00
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.signaturePublicKey).to.be.undefined;
}
)
);
});
it("Round trip binary encryption [symmetric, signature]", async function () {
await fc.assert(
fc.asyncProperty(
2023-03-13 14:15:57 +11:00
fc.string(),
fc.string(),
fc.uint8Array({ minLength: 1 }),
fc.uint8Array({ min: 1, minLength: 32, maxLength: 32 }),
fc.uint8Array({ min: 1, minLength: 32, maxLength: 32 }),
2023-03-13 14:15:57 +11:00
async (pubSubTopic, contentTopic, payload, sigPrivKey, symKey) => {
const sigPubKey = getPublicKey(sigPrivKey);
const encoder = createEncoder({
2023-03-13 14:15:57 +11:00
contentTopic,
symKey,
sigPrivKey,
});
const bytes = await encoder.toWire({ payload });
2023-03-13 14:15:57 +11:00
const decoder = createDecoder(contentTopic, symKey);
const protoResult = await decoder.fromWireToProtoObj(bytes!);
if (!protoResult) throw "Failed to proto decode";
2023-03-13 14:15:57 +11:00
const result = await decoder.fromProtoObj(pubSubTopic, protoResult);
if (!result) throw "Failed to decode";
2023-03-13 14:15:57 +11:00
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.signaturePublicKey).to.deep.eq(sigPubKey);
}
)
);
});
});