Skip to content

Commit

Permalink
Use recommended LCG parameter
Browse files Browse the repository at this point in the history
  • Loading branch information
turiyadev committed Jan 29, 2024
1 parent 51c1582 commit 4100b4b
Show file tree
Hide file tree
Showing 4 changed files with 63 additions and 62 deletions.
3 changes: 2 additions & 1 deletion src/KeymaskGenerator.ts
@@ -1,14 +1,15 @@
import { clampBuffer } from "./bufferUtils";

// LCG parameters from https://www.ams.org/journals/mcom/1999-68-225/S0025-5718-99-00996-5/S0025-5718-99-00996-5.pdf
// Errata: https://www.iro.umontreal.ca/~lecuyer/myftp/papers/latrules99Errata.pdf
// In each case, the selected parameters are those that are least proximal to
// low harmonic factors of the modulus (1...8). See `util/harmonics.js`. This
// means that they are least likely to present repeating patterns across short
// sequences of values.
const lcgMap: (number[] | bigint[])[] = [
[],
[41, 22, 28],
[1021, 331, 401], // 2^10 - 3
[1021, 65, 377], // 2^10 - 3
[65521, 17364, 32236], // 2^16 - 15
[2097143, 1043187, 1352851], // 2^21 - 9
[67108859, 19552116, 24409594], // 2^26 - 5
Expand Down
100 changes: 50 additions & 50 deletions test/Keymask.test.ts
Expand Up @@ -13,10 +13,10 @@ describe("Keymask", () => {
});

it("should mask and unmask in range 2", () => {
equal(keymask.mask(41), "PK");
equal(keymask.mask(1020), "sV");
equal(keymask.unmask("PK"), 41);
equal(keymask.unmask("sV"), 1020);
equal(keymask.mask(41), "LT");
equal(keymask.mask(1020), "Rd");
equal(keymask.unmask("LT"), 41);
equal(keymask.unmask("Rd"), 1020);
});

it("should mask and unmask in range 3", () => {
Expand Down Expand Up @@ -93,9 +93,9 @@ describe("Keymask", () => {
const buffer1 = new Uint8Array([1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16]).buffer;
const buffer2 = new Uint8Array([11, 22, 33, 44, 55, 66, 77, 88, 99]).buffer;
equal(keymask.mask(buffer1), "NpRcJcFtscDkjdfXLfFWGtqR");
equal(keymask.mask(buffer2), "HXmKjxGXGXBKTD");
equal(keymask.mask(buffer2), "HXmKjxGXGXBKcK");
deepEqual(keymask.unmask("NpRcJcFtscDkjdfXLfFWGtqR"), buffer1);
deepEqual(keymask.unmask("HXmKjxGXGXBKTD"), buffer2);
deepEqual(keymask.unmask("HXmKjxGXGXBKcK"), buffer2);
});
});

Expand All @@ -110,10 +110,10 @@ describe("Keymask", () => {
});

it("should mask and unmask in range 2", () => {
equal(keymask.mask(41), "PK");
equal(keymask.mask(1020), "sV");
equal(keymask.unmask("PK"), 41);
equal(keymask.unmask("sV"), 1020);
equal(keymask.mask(41), "LT");
equal(keymask.mask(1020), "Rd");
equal(keymask.unmask("LT"), 41);
equal(keymask.unmask("Rd"), 1020);
});

it("should mask and unmask in range 3", () => {
Expand Down Expand Up @@ -190,9 +190,9 @@ describe("Keymask", () => {
const buffer1 = new Uint8Array([1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16]).buffer;
const buffer2 = new Uint8Array([11, 22, 33, 44, 55, 66, 77, 88, 99]).buffer;
equal(keymask.mask(buffer1), "NpRcJcFtscDkjdfXLfFWGtqR");
equal(keymask.mask(buffer2), "HXmKjxGXGXBKTD");
equal(keymask.mask(buffer2), "HXmKjxGXGXBKcK");
deepEqual(keymask.unmask("NpRcJcFtscDkjdfXLfFWGtqR"), 21345817372864405881847059188222722561n);
deepEqual(keymask.unmask("HXmKjxGXGXBKTD"), 1832590477950520989195n);
deepEqual(keymask.unmask("HXmKjxGXGXBKcK"), 1832590477950520989195n);
});
});

Expand All @@ -207,10 +207,10 @@ describe("Keymask", () => {
});

it("should mask and unmask in range 2", () => {
equal(keymask.mask(41n), "PK");
equal(keymask.mask(1020n), "sV");
equal(keymask.unmask("PK"), 41n);
equal(keymask.unmask("sV"), 1020n);
equal(keymask.mask(41n), "LT");
equal(keymask.mask(1020n), "Rd");
equal(keymask.unmask("LT"), 41n);
equal(keymask.unmask("Rd"), 1020n);
});

it("should mask and unmask in range 3", () => {
Expand Down Expand Up @@ -287,9 +287,9 @@ describe("Keymask", () => {
const buffer1 = new Uint8Array([1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16]).buffer;
const buffer2 = new Uint8Array([11, 22, 33, 44, 55, 66, 77, 88, 99]).buffer;
equal(keymask.mask(buffer1), "NpRcJcFtscDkjdfXLfFWGtqR");
equal(keymask.mask(buffer2), "HXmKjxGXGXBKTD");
equal(keymask.mask(buffer2), "HXmKjxGXGXBKcK");
deepEqual(keymask.unmask("NpRcJcFtscDkjdfXLfFWGtqR"), 21345817372864405881847059188222722561n);
deepEqual(keymask.unmask("HXmKjxGXGXBKTD"), 1832590477950520989195n);
deepEqual(keymask.unmask("HXmKjxGXGXBKcK"), 1832590477950520989195n);
});
});

Expand All @@ -304,10 +304,10 @@ describe("Keymask", () => {
});

it("should mask and unmask in range 2", () => {
equal(keymask.mask("41"), "PK");
equal(keymask.mask("1020"), "sV");
equal(keymask.unmask("PK"), "41");
equal(keymask.unmask("sV"), "1020");
equal(keymask.mask("41"), "LT");
equal(keymask.mask("1020"), "Rd");
equal(keymask.unmask("LT"), "41");
equal(keymask.unmask("Rd"), "1020");
});

it("should mask and unmask in range 3", () => {
Expand Down Expand Up @@ -384,9 +384,9 @@ describe("Keymask", () => {
const buffer1 = new Uint8Array([1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16]).buffer;
const buffer2 = new Uint8Array([11, 22, 33, 44, 55, 66, 77, 88, 99]).buffer;
equal(keymask.mask(buffer1), "NpRcJcFtscDkjdfXLfFWGtqR");
equal(keymask.mask(buffer2), "HXmKjxGXGXBKTD");
equal(keymask.mask(buffer2), "HXmKjxGXGXBKcK");
deepEqual(keymask.unmask("NpRcJcFtscDkjdfXLfFWGtqR"), "21345817372864405881847059188222722561");
deepEqual(keymask.unmask("HXmKjxGXGXBKTD"), "1832590477950520989195");
deepEqual(keymask.unmask("HXmKjxGXGXBKcK"), "1832590477950520989195");
});
});

Expand All @@ -407,12 +407,12 @@ describe("Keymask", () => {
it("should mask and unmask in range 2", () => {
const buffer1 = new Uint8Array([41, 0, 0, 0, 0, 0, 0, 0]).buffer;
const buffer2 = new Uint8Array([252, 3, 0, 0, 0, 0, 0, 0]).buffer;
equal(keymask.mask(41n), "PK");
equal(keymask.mask(1020n), "sV");
equal(keymask.mask(buffer1), "PK");
equal(keymask.mask(buffer2), "sV");
deepEqual(keymask.unmask("PK"), buffer1);
deepEqual(keymask.unmask("sV"), buffer2);
equal(keymask.mask(41n), "LT");
equal(keymask.mask(1020n), "Rd");
equal(keymask.mask(buffer1), "LT");
equal(keymask.mask(buffer2), "Rd");
deepEqual(keymask.unmask("LT"), buffer1);
deepEqual(keymask.unmask("Rd"), buffer2);
});

it("should mask and unmask in range 3", () => {
Expand Down Expand Up @@ -529,9 +529,9 @@ describe("Keymask", () => {
const buffer1 = new Uint8Array([1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16]).buffer;
const buffer2 = new Uint8Array([11, 22, 33, 44, 55, 66, 77, 88, 99]).buffer;
equal(keymask.mask(buffer1), "NpRcJcFtscDkjdfXLfFWGtqR");
equal(keymask.mask(buffer2), "HXmKjxGXGXBKTD");
equal(keymask.mask(buffer2), "HXmKjxGXGXBKcK");
deepEqual(keymask.unmask("NpRcJcFtscDkjdfXLfFWGtqR"), buffer1);
deepEqual(keymask.unmask("HXmKjxGXGXBKTD"), buffer2);
deepEqual(keymask.unmask("HXmKjxGXGXBKcK"), buffer2);
});
});

Expand Down Expand Up @@ -866,10 +866,10 @@ describe("Keymask", () => {
});

it("should mask and unmask in range 2", () => {
equal(keymask.mask(41), "Kq");
equal(keymask.mask(1020), "wW");
equal(keymask.unmask("Kq"), 41);
equal(keymask.unmask("wW"), 1020);
equal(keymask.mask(41), "yv");
equal(keymask.mask(1020), "Jh");
equal(keymask.unmask("yv"), 41);
equal(keymask.unmask("Jh"), 1020);
});

it("should mask and unmask in range 3", () => {
Expand Down Expand Up @@ -946,9 +946,9 @@ describe("Keymask", () => {
const buffer1 = new Uint8Array([1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16]).buffer;
const buffer2 = new Uint8Array([11, 22, 33, 44, 55, 66, 77, 88, 99]).buffer;
equal(keymask.mask(buffer1), "tTxGLKMvKqStrdjpjGNGWsLW");
equal(keymask.mask(buffer2), "zHYscNMqWmVTPJ");
equal(keymask.mask(buffer2), "zHYscNMqWmVTGq");
deepEqual(keymask.unmask("tTxGLKMvKqStrdjpjGNGWsLW"), buffer1);
deepEqual(keymask.unmask("zHYscNMqWmVTPJ"), buffer2);
deepEqual(keymask.unmask("zHYscNMqWmVTGq"), buffer2);
});
});

Expand All @@ -969,10 +969,10 @@ describe("Keymask", () => {
});

it("should mask and unmask in range 2", () => {
equal(keymask.mask(41), "QP");
equal(keymask.mask(1020), "gR");
equal(keymask.unmask("QP"), 41);
equal(keymask.unmask("gR"), 1020);
equal(keymask.mask(41), "fq");
equal(keymask.mask(1020), "Bv");
equal(keymask.unmask("fq"), 41);
equal(keymask.unmask("Bv"), 1020);
});

it("should mask and unmask in range 3", () => {
Expand Down Expand Up @@ -1049,9 +1049,9 @@ describe("Keymask", () => {
const buffer1 = new Uint8Array([1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16]).buffer;
const buffer2 = new Uint8Array([11, 22, 33, 44, 55, 66, 77, 88, 99]).buffer;
equal(keymask.mask(buffer1), "JXBmhmKjgmDLdvWSfWKTbjCB");
equal(keymask.mask(buffer2), "tSNPdzbSbSyPqD");
equal(keymask.mask(buffer2), "tSNPdzbSbSyPmP");
deepEqual(keymask.unmask("JXBmhmKjgmDLdvWSfWKTbjCB"), buffer1);
deepEqual(keymask.unmask("tSNPdzbSbSyPqD"), buffer2);
deepEqual(keymask.unmask("tSNPdzbSbSyPmP"), buffer2);
});
});

Expand All @@ -1073,10 +1073,10 @@ describe("Keymask", () => {
});

it("should mask and unmask in range 2", () => {
equal(keymask.mask(41), "Kq");
equal(keymask.mask(1020), "wW");
equal(keymask.unmask("Kq"), 41);
equal(keymask.unmask("wW"), 1020);
equal(keymask.mask(41), "yv");
equal(keymask.mask(1020), "Jh");
equal(keymask.unmask("yv"), 41);
equal(keymask.unmask("Jh"), 1020);
});

it("should mask and unmask in range 3", () => {
Expand Down Expand Up @@ -1153,9 +1153,9 @@ describe("Keymask", () => {
const buffer1 = new Uint8Array([1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16]).buffer;
const buffer2 = new Uint8Array([11, 22, 33, 44, 55, 66, 77, 88, 99]).buffer;
equal(keymask.mask(buffer1), "tTxGLKMvKqStrdjpjGNGWsLW");
equal(keymask.mask(buffer2), "zHYscNMqWmVTPJ");
equal(keymask.mask(buffer2), "zHYscNMqWmVTGq");
deepEqual(keymask.unmask("tTxGLKMvKqStrdjpjGNGWsLW"), buffer1);
deepEqual(keymask.unmask("zHYscNMqWmVTPJ"), buffer2);
deepEqual(keymask.unmask("zHYscNMqWmVTGq"), buffer2);
});
});
});
20 changes: 10 additions & 10 deletions test/KeymaskGenerator.test.ts
Expand Up @@ -49,11 +49,11 @@ describe("KeymaskGenerator", () => {
const prev3 = generator.previous(next3, 2);
const prev2 = generator.previous(prev3, 2);
const prev1 = generator.previous(prev2, 2);
equal(next1, 331);
equal(next2, 314);
equal(next3, 813);
equal(prev3, 314);
equal(prev2, 331);
equal(next1, 65);
equal(next2, 141);
equal(next3, 997);
equal(prev3, 141);
equal(prev2, 65);
equal(prev1, 1);
});

Expand Down Expand Up @@ -247,11 +247,11 @@ describe("KeymaskGenerator", () => {
const prev3 = generator.previous(next3, 2);
const prev2 = generator.previous(prev3, 2);
const prev1 = generator.previous(prev2, 2);
equal(next1, 549);
equal(next2, 200);
equal(next3, 54);
equal(prev3, 200);
equal(prev2, 549);
equal(next1, 283);
equal(next2, 235);
equal(next3, 179);
equal(prev3, 235);
equal(prev2, 283);
equal(prev1, 1);
});

Expand Down
2 changes: 1 addition & 1 deletion util/harmonics.js
Expand Up @@ -13,7 +13,7 @@ const tests = [
modulus: 1021,
params: [
[65, 377],
[331, 401]
[644, 956]
]
},
{
Expand Down

0 comments on commit 4100b4b

Please sign in to comment.