@quantakrypto/sieve 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (83) hide show
  1. package/README.md +227 -0
  2. package/dist/categories/correctness.d.ts +13 -0
  3. package/dist/categories/correctness.d.ts.map +1 -0
  4. package/dist/categories/correctness.js +78 -0
  5. package/dist/categories/correctness.js.map +1 -0
  6. package/dist/categories/determinism.d.ts +12 -0
  7. package/dist/categories/determinism.d.ts.map +1 -0
  8. package/dist/categories/determinism.js +78 -0
  9. package/dist/categories/determinism.js.map +1 -0
  10. package/dist/categories/dsa.d.ts +17 -0
  11. package/dist/categories/dsa.d.ts.map +1 -0
  12. package/dist/categories/dsa.js +17 -0
  13. package/dist/categories/dsa.js.map +1 -0
  14. package/dist/categories/helpers.d.ts +50 -0
  15. package/dist/categories/helpers.d.ts.map +1 -0
  16. package/dist/categories/helpers.js +127 -0
  17. package/dist/categories/helpers.js.map +1 -0
  18. package/dist/categories/implicit-rejection.d.ts +29 -0
  19. package/dist/categories/implicit-rejection.d.ts.map +1 -0
  20. package/dist/categories/implicit-rejection.js +126 -0
  21. package/dist/categories/implicit-rejection.js.map +1 -0
  22. package/dist/categories/index.d.ts +30 -0
  23. package/dist/categories/index.d.ts.map +1 -0
  24. package/dist/categories/index.js +33 -0
  25. package/dist/categories/index.js.map +1 -0
  26. package/dist/categories/kat.d.ts +21 -0
  27. package/dist/categories/kat.d.ts.map +1 -0
  28. package/dist/categories/kat.js +173 -0
  29. package/dist/categories/kat.js.map +1 -0
  30. package/dist/categories/robustness.d.ts +15 -0
  31. package/dist/categories/robustness.d.ts.map +1 -0
  32. package/dist/categories/robustness.js +98 -0
  33. package/dist/categories/robustness.js.map +1 -0
  34. package/dist/categories/signature.d.ts +29 -0
  35. package/dist/categories/signature.d.ts.map +1 -0
  36. package/dist/categories/signature.js +259 -0
  37. package/dist/categories/signature.js.map +1 -0
  38. package/dist/categories/sizes.d.ts +23 -0
  39. package/dist/categories/sizes.d.ts.map +1 -0
  40. package/dist/categories/sizes.js +150 -0
  41. package/dist/categories/sizes.js.map +1 -0
  42. package/dist/categories/slh-dsa.d.ts +23 -0
  43. package/dist/categories/slh-dsa.d.ts.map +1 -0
  44. package/dist/categories/slh-dsa.js +23 -0
  45. package/dist/categories/slh-dsa.js.map +1 -0
  46. package/dist/categories/timing.d.ts +16 -0
  47. package/dist/categories/timing.d.ts.map +1 -0
  48. package/dist/categories/timing.js +98 -0
  49. package/dist/categories/timing.js.map +1 -0
  50. package/dist/categories/types.d.ts +68 -0
  51. package/dist/categories/types.d.ts.map +1 -0
  52. package/dist/categories/types.js +31 -0
  53. package/dist/categories/types.js.map +1 -0
  54. package/dist/cli.d.ts +14 -0
  55. package/dist/cli.d.ts.map +1 -0
  56. package/dist/cli.js +181 -0
  57. package/dist/cli.js.map +1 -0
  58. package/dist/index.d.ts +70 -0
  59. package/dist/index.d.ts.map +1 -0
  60. package/dist/index.js +96 -0
  61. package/dist/index.js.map +1 -0
  62. package/dist/protocol.d.ts +169 -0
  63. package/dist/protocol.d.ts.map +1 -0
  64. package/dist/protocol.js +115 -0
  65. package/dist/protocol.js.map +1 -0
  66. package/dist/report.d.ts +48 -0
  67. package/dist/report.d.ts.map +1 -0
  68. package/dist/report.js +79 -0
  69. package/dist/report.js.map +1 -0
  70. package/dist/runner.d.ts +129 -0
  71. package/dist/runner.d.ts.map +1 -0
  72. package/dist/runner.js +305 -0
  73. package/dist/runner.js.map +1 -0
  74. package/dist/sizes.d.ts +84 -0
  75. package/dist/sizes.d.ts.map +1 -0
  76. package/dist/sizes.js +214 -0
  77. package/dist/sizes.js.map +1 -0
  78. package/dist/vectors.d.ts +69 -0
  79. package/dist/vectors.d.ts.map +1 -0
  80. package/dist/vectors.js +198 -0
  81. package/dist/vectors.js.map +1 -0
  82. package/package.json +43 -0
  83. package/vectors/README.md +83 -0
@@ -0,0 +1 @@
1
+ {"version":3,"file":"helpers.js","sourceRoot":"","sources":["../../src/categories/helpers.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,29 @@
1
+ /**
2
+ * Implicit-rejection category — AF-02 family (ML-KEM).
3
+ *
4
+ * ML-KEM uses the Fujisaki-Okamoto transform with *implicit rejection*: when
5
+ * decapsulation receives a ciphertext that does not re-encrypt to itself, it
6
+ * MUST NOT signal an error. Instead it derives a pseudo-random shared secret
7
+ * from the secret key and the (rejected) ciphertext — a deterministic value
8
+ * that an attacker cannot distinguish from a real one without the key.
9
+ *
10
+ * Concretely, for a corrupted ciphertext ct', a conforming SUT must:
11
+ * 1. NOT return an error or crash (it returns ok with an `ss`);
12
+ * 2. return a shared secret of the correct length;
13
+ * 3. be deterministic: decaps(sk, ct') is stable across repeated calls;
14
+ * 4. return a value that differs from the honest decaps(sk, ct).
15
+ *
16
+ * We make NO exact-value assertions — the implicit-rejection secret is
17
+ * implementation-internal and we never fabricate it. We only assert the
18
+ * observable structural properties above.
19
+ *
20
+ * Common AF-02 bugs this catches:
21
+ * - returning an error/throwing on bad ct (leaks validity — Kyber's whole
22
+ * point is to avoid this),
23
+ * - returning a zero/constant ss (the "reject" secret isn't keyed),
24
+ * - returning the honest ss anyway (no integrity check),
25
+ * - non-deterministic reject secret.
26
+ */
27
+ import { type Category } from "./types.js";
28
+ export declare const implicitRejection: Category;
29
+ //# sourceMappingURL=implicit-rejection.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"implicit-rejection.d.ts","sourceRoot":"","sources":["../../src/categories/implicit-rejection.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;GAyBG;AAEH,OAAO,EACL,KAAK,QAAQ,EAOd,MAAM,YAAY,CAAC;AAgBpB,eAAO,MAAM,iBAAiB,EAAE,QAoI/B,CAAC"}
@@ -0,0 +1,126 @@
1
+ /**
2
+ * Implicit-rejection category — AF-02 family (ML-KEM).
3
+ *
4
+ * ML-KEM uses the Fujisaki-Okamoto transform with *implicit rejection*: when
5
+ * decapsulation receives a ciphertext that does not re-encrypt to itself, it
6
+ * MUST NOT signal an error. Instead it derives a pseudo-random shared secret
7
+ * from the secret key and the (rejected) ciphertext — a deterministic value
8
+ * that an attacker cannot distinguish from a real one without the key.
9
+ *
10
+ * Concretely, for a corrupted ciphertext ct', a conforming SUT must:
11
+ * 1. NOT return an error or crash (it returns ok with an `ss`);
12
+ * 2. return a shared secret of the correct length;
13
+ * 3. be deterministic: decaps(sk, ct') is stable across repeated calls;
14
+ * 4. return a value that differs from the honest decaps(sk, ct).
15
+ *
16
+ * We make NO exact-value assertions — the implicit-rejection secret is
17
+ * implementation-internal and we never fabricate it. We only assert the
18
+ * observable structural properties above.
19
+ *
20
+ * Common AF-02 bugs this catches:
21
+ * - returning an error/throwing on bad ct (leaks validity — Kyber's whole
22
+ * point is to avoid this),
23
+ * - returning a zero/constant ss (the "reject" secret isn't keyed),
24
+ * - returning the honest ss anyway (no integrity check),
25
+ * - non-deterministic reject secret.
26
+ */
27
+ import { fail, pass, rollUp, skip, } from "./types.js";
28
+ import { bytesEqual, flipBitB64, kemDecaps, kemDecapsRaw, kemEncaps, kemKeygen, requireKem, UnexpectedResponse, } from "./helpers.js";
29
+ import { fromB64, toB64 } from "../protocol.js";
30
+ const BUG = "AF-02";
31
+ const REPEATS = 3;
32
+ export const implicitRejection = async (ctx) => {
33
+ const checks = [];
34
+ if (ctx.sizes.family !== "ml-kem") {
35
+ return {
36
+ category: "implicit-rejection",
37
+ status: "skip",
38
+ bugClass: BUG,
39
+ checks: [skip("applicability", "implicit rejection is an ML-KEM property", BUG)],
40
+ summary: "skipped (not ML-KEM)",
41
+ };
42
+ }
43
+ const km = requireKem(ctx.sizes);
44
+ const param = km.id;
45
+ const ssLen = km.sharedSecret;
46
+ // Iterate over several fresh keys, corrupting one bit of each honest ct.
47
+ const trials = Math.max(1, Math.min(ctx.iterations, 16));
48
+ let noError = 0;
49
+ let goodLen = 0;
50
+ let deterministic = 0;
51
+ let differs = 0;
52
+ let attempted = 0;
53
+ for (let i = 0; i < trials; i++) {
54
+ try {
55
+ const { pk, sk } = await kemKeygen(ctx.runner, param);
56
+ const skB64 = toB64(sk);
57
+ const { ct } = await kemEncaps(ctx.runner, param, toB64(pk));
58
+ const honestCtB64 = toB64(ct);
59
+ const honestSs = await kemDecaps(ctx.runner, param, skB64, honestCtB64);
60
+ // Corrupt a different byte/bit each iteration so we exercise variety.
61
+ const badCtB64 = flipBitB64(honestCtB64, i % ct.length, i % 8);
62
+ attempted++;
63
+ // (1) must NOT error and must NOT crash.
64
+ const resp = await kemDecapsRaw(ctx.runner, param, skB64, badCtB64);
65
+ if (resp.ok !== true || !("ss" in resp)) {
66
+ checks.push(fail(`no-error[${i}]`, `decaps of a corrupted ciphertext returned an error/non-ss response ` +
67
+ `(${resp.ok === false ? `${resp.code}: ${resp.message}` : "no ss field"}); ` +
68
+ `ML-KEM must implicitly reject, not signal failure`, BUG));
69
+ continue;
70
+ }
71
+ noError++;
72
+ const rejectSs = fromB64(resp.ss);
73
+ // (2) correct length.
74
+ if (rejectSs.length === ssLen) {
75
+ goodLen++;
76
+ }
77
+ else {
78
+ checks.push(fail(`length[${i}]`, `implicit-rejection shared secret was ${rejectSs.length} bytes, expected ${ssLen}`, BUG));
79
+ }
80
+ // (3) deterministic for the same corrupted ct.
81
+ let stable = true;
82
+ for (let r = 1; r < REPEATS; r++) {
83
+ const again = await kemDecaps(ctx.runner, param, skB64, badCtB64);
84
+ if (!bytesEqual(rejectSs, again)) {
85
+ stable = false;
86
+ break;
87
+ }
88
+ }
89
+ if (stable) {
90
+ deterministic++;
91
+ }
92
+ else {
93
+ checks.push(fail(`deterministic[${i}]`, `implicit-rejection secret was not stable across ${REPEATS} identical corrupted decaps`, BUG));
94
+ }
95
+ // (4) differs from the honest shared secret.
96
+ if (!bytesEqual(rejectSs, honestSs)) {
97
+ differs++;
98
+ }
99
+ else {
100
+ checks.push(fail(`differs-from-honest[${i}]`, `implicit-rejection secret equals the honest shared secret — ` +
101
+ `corruption was not detected`, BUG));
102
+ }
103
+ }
104
+ catch (err) {
105
+ const detail = err instanceof UnexpectedResponse
106
+ ? `SUT returned an unexpected response: ${err.message}`
107
+ : `harness error (possible crash on bad ct): ${err.message}`;
108
+ checks.push(fail(`trial[${i}]`, detail, BUG));
109
+ }
110
+ }
111
+ if (attempted > 0 && checks.length === 0) {
112
+ checks.push(pass("implicit-rejection", `${noError}/${attempted} corrupted ciphertexts implicitly rejected: ` +
113
+ `no error, correct length, deterministic, distinct from honest ss`, BUG));
114
+ }
115
+ const status = rollUp(checks);
116
+ return {
117
+ category: "implicit-rejection",
118
+ status,
119
+ bugClass: BUG,
120
+ checks,
121
+ summary: status === "pass"
122
+ ? `${attempted} corrupted ciphertexts handled by implicit rejection`
123
+ : `implicit-rejection violations detected (no-error:${noError} len:${goodLen} det:${deterministic} differs:${differs} of ${attempted})`,
124
+ };
125
+ };
126
+ //# sourceMappingURL=implicit-rejection.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"implicit-rejection.js","sourceRoot":"","sources":["../../src/categories/implicit-rejection.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,30 @@
1
+ /**
2
+ * Category registry. Each entry is selected by family so the runner only
3
+ * executes categories relevant to the parameter set under test.
4
+ */
5
+ import type { Category } from "./types.js";
6
+ import type { Family } from "../sizes.js";
7
+ import { correctness } from "./correctness.js";
8
+ import { determinism } from "./determinism.js";
9
+ import { implicitRejection } from "./implicit-rejection.js";
10
+ import { sizes } from "./sizes.js";
11
+ import { robustness } from "./robustness.js";
12
+ import { dsa } from "./dsa.js";
13
+ import { slhDsa } from "./slh-dsa.js";
14
+ import { kat } from "./kat.js";
15
+ import { timing } from "./timing.js";
16
+ export * from "./types.js";
17
+ /** A named, family-scoped category. */
18
+ export interface RegisteredCategory {
19
+ name: string;
20
+ family: Family | "any";
21
+ /** Whether the category runs by default (timing is opt-in). */
22
+ defaultOn: boolean;
23
+ run: Category;
24
+ }
25
+ /** The full catalog, in execution order. */
26
+ export declare const CATEGORIES: readonly RegisteredCategory[];
27
+ /** Categories applicable to a family (plus family-agnostic ones). */
28
+ export declare function categoriesFor(family: Family, includeTiming: boolean): RegisteredCategory[];
29
+ export { correctness, determinism, implicitRejection, sizes, robustness, dsa, slhDsa, kat, timing };
30
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/categories/index.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AAC3C,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AAE1C,OAAO,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAC/C,OAAO,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAC/C,OAAO,EAAE,iBAAiB,EAAE,MAAM,yBAAyB,CAAC;AAC5D,OAAO,EAAE,KAAK,EAAE,MAAM,YAAY,CAAC;AACnC,OAAO,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAC7C,OAAO,EAAE,GAAG,EAAE,MAAM,UAAU,CAAC;AAC/B,OAAO,EAAE,MAAM,EAAE,MAAM,cAAc,CAAC;AACtC,OAAO,EAAE,GAAG,EAAE,MAAM,UAAU,CAAC;AAC/B,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AAErC,cAAc,YAAY,CAAC;AAE3B,uCAAuC;AACvC,MAAM,WAAW,kBAAkB;IACjC,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,MAAM,GAAG,KAAK,CAAC;IACvB,+DAA+D;IAC/D,SAAS,EAAE,OAAO,CAAC;IACnB,GAAG,EAAE,QAAQ,CAAC;CACf;AAED,4CAA4C;AAC5C,eAAO,MAAM,UAAU,EAAE,SAAS,kBAAkB,EAUnD,CAAC;AAEF,qEAAqE;AACrE,wBAAgB,aAAa,CAAC,MAAM,EAAE,MAAM,EAAE,aAAa,EAAE,OAAO,GAAG,kBAAkB,EAAE,CAM1F;AAED,OAAO,EAAE,WAAW,EAAE,WAAW,EAAE,iBAAiB,EAAE,KAAK,EAAE,UAAU,EAAE,GAAG,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,EAAE,CAAC"}
@@ -0,0 +1,33 @@
1
+ /**
2
+ * Category registry. Each entry is selected by family so the runner only
3
+ * executes categories relevant to the parameter set under test.
4
+ */
5
+ import { correctness } from "./correctness.js";
6
+ import { determinism } from "./determinism.js";
7
+ import { implicitRejection } from "./implicit-rejection.js";
8
+ import { sizes } from "./sizes.js";
9
+ import { robustness } from "./robustness.js";
10
+ import { dsa } from "./dsa.js";
11
+ import { slhDsa } from "./slh-dsa.js";
12
+ import { kat } from "./kat.js";
13
+ import { timing } from "./timing.js";
14
+ export * from "./types.js";
15
+ /** The full catalog, in execution order. */
16
+ export const CATEGORIES = [
17
+ { name: "correctness", family: "ml-kem", defaultOn: true, run: correctness },
18
+ { name: "determinism", family: "ml-kem", defaultOn: true, run: determinism },
19
+ { name: "implicit-rejection", family: "ml-kem", defaultOn: true, run: implicitRejection },
20
+ { name: "sizes", family: "ml-kem", defaultOn: true, run: sizes },
21
+ { name: "robustness", family: "ml-kem", defaultOn: true, run: robustness },
22
+ { name: "dsa", family: "ml-dsa", defaultOn: true, run: dsa },
23
+ { name: "slh-dsa", family: "slh-dsa", defaultOn: true, run: slhDsa },
24
+ { name: "kat", family: "any", defaultOn: true, run: kat },
25
+ { name: "timing", family: "ml-kem", defaultOn: false, run: timing },
26
+ ];
27
+ /** Categories applicable to a family (plus family-agnostic ones). */
28
+ export function categoriesFor(family, includeTiming) {
29
+ return CATEGORIES.filter((c) => (c.family === family || c.family === "any") &&
30
+ (c.defaultOn || (c.name === "timing" && includeTiming)));
31
+ }
32
+ export { correctness, determinism, implicitRejection, sizes, robustness, dsa, slhDsa, kat, timing };
33
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/categories/index.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAKH,OAAO,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAC/C,OAAO,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAC/C,OAAO,EAAE,iBAAiB,EAAE,MAAM,yBAAyB,CAAC;AAC5D,OAAO,EAAE,KAAK,EAAE,MAAM,YAAY,CAAC;AACnC,OAAO,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAC7C,OAAO,EAAE,GAAG,EAAE,MAAM,UAAU,CAAC;AAC/B,OAAO,EAAE,MAAM,EAAE,MAAM,cAAc,CAAC;AACtC,OAAO,EAAE,GAAG,EAAE,MAAM,UAAU,CAAC;AAC/B,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AAErC,cAAc,YAAY,CAAC;AAW3B,4CAA4C;AAC5C,MAAM,CAAC,MAAM,UAAU,GAAkC;IACvD,EAAE,IAAI,EAAE,aAAa,EAAE,MAAM,EAAE,QAAQ,EAAE,SAAS,EAAE,IAAI,EAAE,GAAG,EAAE,WAAW,EAAE;IAC5E,EAAE,IAAI,EAAE,aAAa,EAAE,MAAM,EAAE,QAAQ,EAAE,SAAS,EAAE,IAAI,EAAE,GAAG,EAAE,WAAW,EAAE;IAC5E,EAAE,IAAI,EAAE,oBAAoB,EAAE,MAAM,EAAE,QAAQ,EAAE,SAAS,EAAE,IAAI,EAAE,GAAG,EAAE,iBAAiB,EAAE;IACzF,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,SAAS,EAAE,IAAI,EAAE,GAAG,EAAE,KAAK,EAAE;IAChE,EAAE,IAAI,EAAE,YAAY,EAAE,MAAM,EAAE,QAAQ,EAAE,SAAS,EAAE,IAAI,EAAE,GAAG,EAAE,UAAU,EAAE;IAC1E,EAAE,IAAI,EAAE,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,SAAS,EAAE,IAAI,EAAE,GAAG,EAAE,GAAG,EAAE;IAC5D,EAAE,IAAI,EAAE,SAAS,EAAE,MAAM,EAAE,SAAS,EAAE,SAAS,EAAE,IAAI,EAAE,GAAG,EAAE,MAAM,EAAE;IACpE,EAAE,IAAI,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,SAAS,EAAE,IAAI,EAAE,GAAG,EAAE,GAAG,EAAE;IACzD,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,EAAE,QAAQ,EAAE,SAAS,EAAE,KAAK,EAAE,GAAG,EAAE,MAAM,EAAE;CACpE,CAAC;AAEF,qEAAqE;AACrE,MAAM,UAAU,aAAa,CAAC,MAAc,EAAE,aAAsB;IAClE,OAAO,UAAU,CAAC,MAAM,CACtB,CAAC,CAAC,EAAE,EAAE,CACJ,CAAC,CAAC,CAAC,MAAM,KAAK,MAAM,IAAI,CAAC,CAAC,MAAM,KAAK,KAAK,CAAC;QAC3C,CAAC,CAAC,CAAC,SAAS,IAAI,CAAC,CAAC,CAAC,IAAI,KAAK,QAAQ,IAAI,aAAa,CAAC,CAAC,CAC1D,CAAC;AACJ,CAAC;AAED,OAAO,EAAE,WAAW,EAAE,WAAW,EAAE,iBAAiB,EAAE,KAAK,EAAE,UAAU,EAAE,GAAG,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,EAAE,CAAC"}
@@ -0,0 +1,21 @@
1
+ /**
2
+ * KAT category — Known-Answer Tests against OFFICIAL NIST ACVP vectors.
3
+ *
4
+ * This category is SKIPPED unless the user supplies `--vectors <dir>` with real
5
+ * ACVP files. Sieve never fabricates expected values; if no vectors are
6
+ * present, every check is a `skip` with a clear message pointing at
7
+ * vectors/README.md.
8
+ *
9
+ * What we check when vectors ARE present:
10
+ * - kem-keygen: if a seed is given, deterministic keygen must reproduce the
11
+ * expected pk/sk exactly. (Skipped if the SUT can't do seeded keygen.)
12
+ * - kem-encap: if coins are given, deterministic encaps must reproduce ct/ss.
13
+ * - kem-decap: decaps(sk, ct) must equal the expected ss exactly.
14
+ * - dsa-verify: verify(pk, msg, sig) must equal the expected verdict.
15
+ *
16
+ * These ARE exact-value assertions — but the expected bytes come from the
17
+ * user's NIST files, not from Sieve.
18
+ */
19
+ import { type Category } from "./types.js";
20
+ export declare const kat: Category;
21
+ //# sourceMappingURL=kat.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"kat.d.ts","sourceRoot":"","sources":["../../src/categories/kat.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;GAiBG;AAEH,OAAO,EACL,KAAK,QAAQ,EAOd,MAAM,YAAY,CAAC;AAKpB,eAAO,MAAM,GAAG,EAAE,QAmFjB,CAAC"}
@@ -0,0 +1,173 @@
1
+ /**
2
+ * KAT category — Known-Answer Tests against OFFICIAL NIST ACVP vectors.
3
+ *
4
+ * This category is SKIPPED unless the user supplies `--vectors <dir>` with real
5
+ * ACVP files. Sieve never fabricates expected values; if no vectors are
6
+ * present, every check is a `skip` with a clear message pointing at
7
+ * vectors/README.md.
8
+ *
9
+ * What we check when vectors ARE present:
10
+ * - kem-keygen: if a seed is given, deterministic keygen must reproduce the
11
+ * expected pk/sk exactly. (Skipped if the SUT can't do seeded keygen.)
12
+ * - kem-encap: if coins are given, deterministic encaps must reproduce ct/ss.
13
+ * - kem-decap: decaps(sk, ct) must equal the expected ss exactly.
14
+ * - dsa-verify: verify(pk, msg, sig) must equal the expected verdict.
15
+ *
16
+ * These ARE exact-value assertions — but the expected bytes come from the
17
+ * user's NIST files, not from Sieve.
18
+ */
19
+ import { fail, pass, rollUp, skip, } from "./types.js";
20
+ import { bytesEqual } from "./helpers.js";
21
+ import { fromB64, toB64 } from "../protocol.js";
22
+ import { loadVectors } from "../vectors.js";
23
+ export const kat = async (ctx) => {
24
+ if (!ctx.vectorsDir) {
25
+ return {
26
+ category: "kat",
27
+ status: "skip",
28
+ checks: [
29
+ skip("vectors", "no --vectors <dir> supplied; Sieve ships no test vectors and will not " +
30
+ "fabricate them. See vectors/README.md to obtain official NIST ACVP files."),
31
+ ],
32
+ summary: "skipped — no official vectors provided",
33
+ };
34
+ }
35
+ const checks = [];
36
+ let loaded;
37
+ try {
38
+ loaded = loadVectors(ctx.vectorsDir);
39
+ }
40
+ catch (err) {
41
+ return {
42
+ category: "kat",
43
+ status: "fail",
44
+ checks: [
45
+ fail("load", `could not load vectors from ${ctx.vectorsDir}: ${err.message}`),
46
+ ],
47
+ summary: "vector load failed",
48
+ };
49
+ }
50
+ for (const note of loaded.notes.slice(0, 10)) {
51
+ checks.push(skip("note", note));
52
+ }
53
+ // Only run vectors matching the parameter set under test.
54
+ const param = ctx.sizes.id;
55
+ const relevant = loaded.vectors.filter((v) => v.param === param);
56
+ if (relevant.length === 0) {
57
+ checks.push(skip("applicable", `loaded ${loaded.vectors.length} vector(s) from ${loaded.files.length} file(s), ` +
58
+ `but none for ${param}`));
59
+ const status = rollUp(checks);
60
+ return { category: "kat", status, checks, summary: `no ${param} vectors among supplied files` };
61
+ }
62
+ let okCount = 0;
63
+ let idx = 0;
64
+ for (const v of relevant) {
65
+ idx++;
66
+ try {
67
+ const result = await checkVector(ctx, v);
68
+ if (result.ok) {
69
+ okCount++;
70
+ // Keep the report compact: don't push a pass per vector.
71
+ }
72
+ else {
73
+ checks.push(fail(`${v.kind}[${idx}]`, result.detail, undefined));
74
+ }
75
+ }
76
+ catch (err) {
77
+ checks.push(fail(`${v.kind}[${idx}]`, `harness error: ${err.message}`));
78
+ }
79
+ }
80
+ if (okCount > 0) {
81
+ checks.push(pass("kat", `${okCount}/${relevant.length} ${param} vectors matched expected values`));
82
+ }
83
+ const status = rollUp(checks);
84
+ return {
85
+ category: "kat",
86
+ status,
87
+ checks,
88
+ summary: status === "pass"
89
+ ? `${okCount} ${param} KAT vectors passed`
90
+ : `${checks.filter((c) => c.status === "fail").length} KAT mismatch(es)`,
91
+ };
92
+ };
93
+ async function checkVector(ctx, v) {
94
+ const { runner } = ctx;
95
+ const param = v.param;
96
+ switch (v.kind) {
97
+ case "kem-keygen": {
98
+ if (!v.seed)
99
+ return { ok: true, detail: "no seed; skipped" };
100
+ const resp = await runner.send({
101
+ family: "ml-kem",
102
+ param,
103
+ op: "keygen",
104
+ seed: toB64(v.seed),
105
+ });
106
+ if (resp.ok !== true || !("pk" in resp) || !("sk" in resp)) {
107
+ return {
108
+ ok: false,
109
+ detail: "seeded keygen did not return pk/sk (SUT may not support seeds)",
110
+ };
111
+ }
112
+ const pkOk = bytesEqual(fromB64(resp.pk), v.pk);
113
+ const skOk = bytesEqual(fromB64(resp.sk), v.sk);
114
+ return pkOk && skOk
115
+ ? { ok: true, detail: "pk/sk match" }
116
+ : { ok: false, detail: `seeded keygen mismatch (pkOk=${pkOk}, skOk=${skOk})` };
117
+ }
118
+ case "kem-encap": {
119
+ if (!v.coins)
120
+ return { ok: true, detail: "no coins; skipped" };
121
+ const resp = await runner.send({
122
+ family: "ml-kem",
123
+ param,
124
+ op: "encaps",
125
+ pk: toB64(v.pk),
126
+ coins: toB64(v.coins),
127
+ });
128
+ if (resp.ok !== true || !("ct" in resp) || !("ss" in resp)) {
129
+ return {
130
+ ok: false,
131
+ detail: "deterministic encaps did not return ct/ss (SUT may not support coins)",
132
+ };
133
+ }
134
+ const ctOk = bytesEqual(fromB64(resp.ct), v.ct);
135
+ const ssOk = bytesEqual(fromB64(resp.ss), v.ss);
136
+ return ctOk && ssOk
137
+ ? { ok: true, detail: "ct/ss match" }
138
+ : { ok: false, detail: `encaps mismatch (ctOk=${ctOk}, ssOk=${ssOk})` };
139
+ }
140
+ case "kem-decap": {
141
+ const resp = await runner.send({
142
+ family: "ml-kem",
143
+ param,
144
+ op: "decaps",
145
+ sk: toB64(v.sk),
146
+ ct: toB64(v.ct),
147
+ });
148
+ if (resp.ok !== true || !("ss" in resp)) {
149
+ return { ok: false, detail: "decaps did not return ss" };
150
+ }
151
+ return bytesEqual(fromB64(resp.ss), v.ss)
152
+ ? { ok: true, detail: "ss matches" }
153
+ : { ok: false, detail: "decaps shared secret does not match expected" };
154
+ }
155
+ case "dsa-verify": {
156
+ const resp = await runner.send({
157
+ family: "ml-dsa",
158
+ param,
159
+ op: "verify",
160
+ pk: toB64(v.pk),
161
+ msg: toB64(v.msg),
162
+ sig: toB64(v.sig),
163
+ });
164
+ if (resp.ok !== true || !("valid" in resp)) {
165
+ return { ok: false, detail: "verify did not return a 'valid' verdict" };
166
+ }
167
+ return resp.valid === v.expected
168
+ ? { ok: true, detail: `verdict ${resp.valid} matches expected` }
169
+ : { ok: false, detail: `verify returned ${resp.valid}, expected ${v.expected}` };
170
+ }
171
+ }
172
+ }
173
+ //# sourceMappingURL=kat.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"kat.js","sourceRoot":"","sources":["../../src/categories/kat.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;GAiBG;AAEH,OAAO,EAIL,IAAI,EACJ,IAAI,EACJ,MAAM,EACN,IAAI,GACL,MAAM,YAAY,CAAC;AACpB,OAAO,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAC1C,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,MAAM,gBAAgB,CAAC;AAChD,OAAO,EAAE,WAAW,EAAe,MAAM,eAAe,CAAC;AAEzD,MAAM,CAAC,MAAM,GAAG,GAAa,KAAK,EAAE,GAAG,EAA2B,EAAE;IAClE,IAAI,CAAC,GAAG,CAAC,UAAU,EAAE,CAAC;QACpB,OAAO;YACL,QAAQ,EAAE,KAAK;YACf,MAAM,EAAE,MAAM;YACd,MAAM,EAAE;gBACN,IAAI,CACF,SAAS,EACT,wEAAwE;oBACtE,2EAA2E,CAC9E;aACF;YACD,OAAO,EAAE,wCAAwC;SAClD,CAAC;IACJ,CAAC;IAED,MAAM,MAAM,GAAY,EAAE,CAAC;IAC3B,IAAI,MAAsC,CAAC;IAC3C,IAAI,CAAC;QACH,MAAM,GAAG,WAAW,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC;IACvC,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,OAAO;YACL,QAAQ,EAAE,KAAK;YACf,MAAM,EAAE,MAAM;YACd,MAAM,EAAE;gBACN,IAAI,CAAC,MAAM,EAAE,+BAA+B,GAAG,CAAC,UAAU,KAAM,GAAa,CAAC,OAAO,EAAE,CAAC;aACzF;YACD,OAAO,EAAE,oBAAoB;SAC9B,CAAC;IACJ,CAAC;IAED,KAAK,MAAM,IAAI,IAAI,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC;QAC7C,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC,CAAC;IAClC,CAAC;IAED,0DAA0D;IAC1D,MAAM,KAAK,GAAG,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC;IAC3B,MAAM,QAAQ,GAAG,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,KAAK,KAAK,CAAC,CAAC;IACjE,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC1B,MAAM,CAAC,IAAI,CACT,IAAI,CACF,YAAY,EACZ,UAAU,MAAM,CAAC,OAAO,CAAC,MAAM,mBAAmB,MAAM,CAAC,KAAK,CAAC,MAAM,YAAY;YAC/E,gBAAgB,KAAK,EAAE,CAC1B,CACF,CAAC;QACF,MAAM,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC;QAC9B,OAAO,EAAE,QAAQ,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,KAAK,+BAA+B,EAAE,CAAC;IAClG,CAAC;IAED,IAAI,OAAO,GAAG,CAAC,CAAC;IAChB,IAAI,GAAG,GAAG,CAAC,CAAC;IACZ,KAAK,MAAM,CAAC,IAAI,QAAQ,EAAE,CAAC;QACzB,GAAG,EAAE,CAAC;QACN,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,MAAM,WAAW,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC;YACzC,IAAI,MAAM,CAAC,EAAE,EAAE,CAAC;gBACd,OAAO,EAAE,CAAC;gBACV,yDAAyD;YAC3D,CAAC;iBAAM,CAAC;gBACN,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,IAAI,IAAI,GAAG,GAAG,EAAE,MAAM,CAAC,MAAM,EAAE,SAAS,CAAC,CAAC,CAAC;YACnE,CAAC;QACH,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,IAAI,IAAI,GAAG,GAAG,EAAE,kBAAmB,GAAa,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC;QACrF,CAAC;IACH,CAAC;IAED,IAAI,OAAO,GAAG,CAAC,EAAE,CAAC;QAChB,MAAM,CAAC,IAAI,CACT,IAAI,CAAC,KAAK,EAAE,GAAG,OAAO,IAAI,QAAQ,CAAC,MAAM,IAAI,KAAK,kCAAkC,CAAC,CACtF,CAAC;IACJ,CAAC;IAED,MAAM,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC;IAC9B,OAAO;QACL,QAAQ,EAAE,KAAK;QACf,MAAM;QACN,MAAM;QACN,OAAO,EACL,MAAM,KAAK,MAAM;YACf,CAAC,CAAC,GAAG,OAAO,IAAI,KAAK,qBAAqB;YAC1C,CAAC,CAAC,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,KAAK,MAAM,CAAC,CAAC,MAAM,mBAAmB;KAC7E,CAAC;AACJ,CAAC,CAAC;AAOF,KAAK,UAAU,WAAW,CACxB,GAAyC,EACzC,CAAS;IAET,MAAM,EAAE,MAAM,EAAE,GAAG,GAAG,CAAC;IACvB,MAAM,KAAK,GAAG,CAAC,CAAC,KAAK,CAAC;IAEtB,QAAQ,CAAC,CAAC,IAAI,EAAE,CAAC;QACf,KAAK,YAAY,CAAC,CAAC,CAAC;YAClB,IAAI,CAAC,CAAC,CAAC,IAAI;gBAAE,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,kBAAkB,EAAE,CAAC;YAC7D,MAAM,IAAI,GAAG,MAAM,MAAM,CAAC,IAAI,CAAC;gBAC7B,MAAM,EAAE,QAAQ;gBAChB,KAAK;gBACL,EAAE,EAAE,QAAQ;gBACZ,IAAI,EAAE,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC;aACpB,CAAC,CAAC;YACH,IAAI,IAAI,CAAC,EAAE,KAAK,IAAI,IAAI,CAAC,CAAC,IAAI,IAAI,IAAI,CAAC,IAAI,CAAC,CAAC,IAAI,IAAI,IAAI,CAAC,EAAE,CAAC;gBAC3D,OAAO;oBACL,EAAE,EAAE,KAAK;oBACT,MAAM,EAAE,gEAAgE;iBACzE,CAAC;YACJ,CAAC;YACD,MAAM,IAAI,GAAG,UAAU,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC;YAChD,MAAM,IAAI,GAAG,UAAU,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC;YAChD,OAAO,IAAI,IAAI,IAAI;gBACjB,CAAC,CAAC,EAAE,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,aAAa,EAAE;gBACrC,CAAC,CAAC,EAAE,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,gCAAgC,IAAI,UAAU,IAAI,GAAG,EAAE,CAAC;QACnF,CAAC;QACD,KAAK,WAAW,CAAC,CAAC,CAAC;YACjB,IAAI,CAAC,CAAC,CAAC,KAAK;gBAAE,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,mBAAmB,EAAE,CAAC;YAC/D,MAAM,IAAI,GAAG,MAAM,MAAM,CAAC,IAAI,CAAC;gBAC7B,MAAM,EAAE,QAAQ;gBAChB,KAAK;gBACL,EAAE,EAAE,QAAQ;gBACZ,EAAE,EAAE,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC;gBACf,KAAK,EAAE,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC;aACtB,CAAC,CAAC;YACH,IAAI,IAAI,CAAC,EAAE,KAAK,IAAI,IAAI,CAAC,CAAC,IAAI,IAAI,IAAI,CAAC,IAAI,CAAC,CAAC,IAAI,IAAI,IAAI,CAAC,EAAE,CAAC;gBAC3D,OAAO;oBACL,EAAE,EAAE,KAAK;oBACT,MAAM,EAAE,uEAAuE;iBAChF,CAAC;YACJ,CAAC;YACD,MAAM,IAAI,GAAG,UAAU,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC;YAChD,MAAM,IAAI,GAAG,UAAU,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC;YAChD,OAAO,IAAI,IAAI,IAAI;gBACjB,CAAC,CAAC,EAAE,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,aAAa,EAAE;gBACrC,CAAC,CAAC,EAAE,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,yBAAyB,IAAI,UAAU,IAAI,GAAG,EAAE,CAAC;QAC5E,CAAC;QACD,KAAK,WAAW,CAAC,CAAC,CAAC;YACjB,MAAM,IAAI,GAAG,MAAM,MAAM,CAAC,IAAI,CAAC;gBAC7B,MAAM,EAAE,QAAQ;gBAChB,KAAK;gBACL,EAAE,EAAE,QAAQ;gBACZ,EAAE,EAAE,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC;gBACf,EAAE,EAAE,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC;aAChB,CAAC,CAAC;YACH,IAAI,IAAI,CAAC,EAAE,KAAK,IAAI,IAAI,CAAC,CAAC,IAAI,IAAI,IAAI,CAAC,EAAE,CAAC;gBACxC,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,0BAA0B,EAAE,CAAC;YAC3D,CAAC;YACD,OAAO,UAAU,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC;gBACvC,CAAC,CAAC,EAAE,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,YAAY,EAAE;gBACpC,CAAC,CAAC,EAAE,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,8CAA8C,EAAE,CAAC;QAC5E,CAAC;QACD,KAAK,YAAY,CAAC,CAAC,CAAC;YAClB,MAAM,IAAI,GAAG,MAAM,MAAM,CAAC,IAAI,CAAC;gBAC7B,MAAM,EAAE,QAAQ;gBAChB,KAAK;gBACL,EAAE,EAAE,QAAQ;gBACZ,EAAE,EAAE,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC;gBACf,GAAG,EAAE,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC;gBACjB,GAAG,EAAE,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC;aAClB,CAAC,CAAC;YACH,IAAI,IAAI,CAAC,EAAE,KAAK,IAAI,IAAI,CAAC,CAAC,OAAO,IAAI,IAAI,CAAC,EAAE,CAAC;gBAC3C,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,yCAAyC,EAAE,CAAC;YAC1E,CAAC;YACD,OAAO,IAAI,CAAC,KAAK,KAAK,CAAC,CAAC,QAAQ;gBAC9B,CAAC,CAAC,EAAE,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,WAAW,IAAI,CAAC,KAAK,mBAAmB,EAAE;gBAChE,CAAC,CAAC,EAAE,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,mBAAmB,IAAI,CAAC,KAAK,cAAc,CAAC,CAAC,QAAQ,EAAE,EAAE,CAAC;QACrF,CAAC;IACH,CAAC;AACH,CAAC"}
@@ -0,0 +1,15 @@
1
+ /**
2
+ * Robustness category (ML-KEM).
3
+ *
4
+ * Feed deliberately malformed inputs and require a *defined error* response —
5
+ * never a crash, hang, or silent success:
6
+ * - empty pk/ct/sk,
7
+ * - non-base64 garbage in a byte field,
8
+ * - an oversized blob (e.g. 1 MiB) where a key/ct is expected.
9
+ *
10
+ * This overlaps with the size category but targets structural malformation
11
+ * rather than off-by-N lengths. Together they map to the AF-05 family.
12
+ */
13
+ import { type Category } from "./types.js";
14
+ export declare const robustness: Category;
15
+ //# sourceMappingURL=robustness.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"robustness.d.ts","sourceRoot":"","sources":["../../src/categories/robustness.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAEH,OAAO,EAAE,KAAK,QAAQ,EAAuD,MAAM,YAAY,CAAC;AAMhG,eAAO,MAAM,UAAU,EAAE,QA4FxB,CAAC"}
@@ -0,0 +1,98 @@
1
+ /**
2
+ * Robustness category (ML-KEM).
3
+ *
4
+ * Feed deliberately malformed inputs and require a *defined error* response —
5
+ * never a crash, hang, or silent success:
6
+ * - empty pk/ct/sk,
7
+ * - non-base64 garbage in a byte field,
8
+ * - an oversized blob (e.g. 1 MiB) where a key/ct is expected.
9
+ *
10
+ * This overlaps with the size category but targets structural malformation
11
+ * rather than off-by-N lengths. Together they map to the AF-05 family.
12
+ */
13
+ import { fail, pass, rollUp } from "./types.js";
14
+ import { requireKem } from "./helpers.js";
15
+ const OVERSIZE = 1 << 20; // 1 MiB
16
+ export const robustness = async (ctx) => {
17
+ const checks = [];
18
+ if (ctx.sizes.family !== "ml-kem") {
19
+ return {
20
+ category: "robustness",
21
+ status: "skip",
22
+ checks: [],
23
+ summary: "robustness probes currently target ML-KEM",
24
+ };
25
+ }
26
+ const km = requireKem(ctx.sizes);
27
+ const param = km.id;
28
+ const oversizeB64 = Buffer.alloc(OVERSIZE).toString("base64");
29
+ const probes = [
30
+ {
31
+ name: "encaps-empty-pk",
32
+ run: () => ctx.runner.send({ family: "ml-kem", param, op: "encaps", pk: "" }),
33
+ },
34
+ {
35
+ name: "encaps-garbage-pk",
36
+ run: () => ctx.runner.send({ family: "ml-kem", param, op: "encaps", pk: "!!!not base64!!!" }),
37
+ },
38
+ {
39
+ name: "encaps-oversize-pk",
40
+ run: () => ctx.runner.send({ family: "ml-kem", param, op: "encaps", pk: oversizeB64 }),
41
+ },
42
+ {
43
+ name: "decaps-empty-ct",
44
+ run: () => ctx.runner.send({
45
+ family: "ml-kem",
46
+ param,
47
+ op: "decaps",
48
+ sk: Buffer.alloc(km.secretKey).toString("base64"),
49
+ ct: "",
50
+ }),
51
+ },
52
+ {
53
+ name: "decaps-empty-sk",
54
+ run: () => ctx.runner.send({
55
+ family: "ml-kem",
56
+ param,
57
+ op: "decaps",
58
+ sk: "",
59
+ ct: Buffer.alloc(km.ciphertext).toString("base64"),
60
+ }),
61
+ },
62
+ {
63
+ name: "decaps-oversize-ct",
64
+ run: () => ctx.runner.send({
65
+ family: "ml-kem",
66
+ param,
67
+ op: "decaps",
68
+ sk: Buffer.alloc(km.secretKey).toString("base64"),
69
+ ct: oversizeB64,
70
+ }),
71
+ },
72
+ ];
73
+ for (const probe of probes) {
74
+ try {
75
+ const resp = await probe.run();
76
+ if (resp.ok === false) {
77
+ checks.push(pass(probe.name, `defined error: ${resp.code} (${resp.message})`));
78
+ }
79
+ else {
80
+ checks.push(fail(probe.name, "SUT returned a success result for malformed input instead of an error"));
81
+ }
82
+ }
83
+ catch (err) {
84
+ checks.push(fail(probe.name, `SUT crashed/hung on malformed input: ${err.message}`));
85
+ }
86
+ }
87
+ const status = rollUp(checks);
88
+ const failed = checks.filter((c) => c.status === "fail").length;
89
+ return {
90
+ category: "robustness",
91
+ status,
92
+ checks,
93
+ summary: status === "pass"
94
+ ? `${probes.length} malformed-input probes all rejected cleanly`
95
+ : `${failed}/${probes.length} malformed-input probes mishandled`,
96
+ };
97
+ };
98
+ //# sourceMappingURL=robustness.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"robustness.js","sourceRoot":"","sources":["../../src/categories/robustness.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAEH,OAAO,EAAkD,IAAI,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,YAAY,CAAC;AAChG,OAAO,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAG1C,MAAM,QAAQ,GAAG,CAAC,IAAI,EAAE,CAAC,CAAC,QAAQ;AAElC,MAAM,CAAC,MAAM,UAAU,GAAa,KAAK,EAAE,GAAG,EAA2B,EAAE;IACzE,MAAM,MAAM,GAAY,EAAE,CAAC;IAE3B,IAAI,GAAG,CAAC,KAAK,CAAC,MAAM,KAAK,QAAQ,EAAE,CAAC;QAClC,OAAO;YACL,QAAQ,EAAE,YAAY;YACtB,MAAM,EAAE,MAAM;YACd,MAAM,EAAE,EAAE;YACV,OAAO,EAAE,2CAA2C;SACrD,CAAC;IACJ,CAAC;IAED,MAAM,EAAE,GAAG,UAAU,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;IACjC,MAAM,KAAK,GAAG,EAAE,CAAC,EAAE,CAAC;IACpB,MAAM,WAAW,GAAG,MAAM,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC;IAE9D,MAAM,MAAM,GAA0D;QACpE;YACE,IAAI,EAAE,iBAAiB;YACvB,GAAG,EAAE,GAAG,EAAE,CAAC,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,QAAQ,EAAE,KAAK,EAAE,EAAE,EAAE,QAAQ,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC;SAC9E;QACD;YACE,IAAI,EAAE,mBAAmB;YACzB,GAAG,EAAE,GAAG,EAAE,CAAC,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,QAAQ,EAAE,KAAK,EAAE,EAAE,EAAE,QAAQ,EAAE,EAAE,EAAE,kBAAkB,EAAE,CAAC;SAC9F;QACD;YACE,IAAI,EAAE,oBAAoB;YAC1B,GAAG,EAAE,GAAG,EAAE,CAAC,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,QAAQ,EAAE,KAAK,EAAE,EAAE,EAAE,QAAQ,EAAE,EAAE,EAAE,WAAW,EAAE,CAAC;SACvF;QACD;YACE,IAAI,EAAE,iBAAiB;YACvB,GAAG,EAAE,GAAG,EAAE,CACR,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC;gBACd,MAAM,EAAE,QAAQ;gBAChB,KAAK;gBACL,EAAE,EAAE,QAAQ;gBACZ,EAAE,EAAE,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC,SAAS,CAAC,CAAC,QAAQ,CAAC,QAAQ,CAAC;gBACjD,EAAE,EAAE,EAAE;aACP,CAAC;SACL;QACD;YACE,IAAI,EAAE,iBAAiB;YACvB,GAAG,EAAE,GAAG,EAAE,CACR,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC;gBACd,MAAM,EAAE,QAAQ;gBAChB,KAAK;gBACL,EAAE,EAAE,QAAQ;gBACZ,EAAE,EAAE,EAAE;gBACN,EAAE,EAAE,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC,UAAU,CAAC,CAAC,QAAQ,CAAC,QAAQ,CAAC;aACnD,CAAC;SACL;QACD;YACE,IAAI,EAAE,oBAAoB;YAC1B,GAAG,EAAE,GAAG,EAAE,CACR,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC;gBACd,MAAM,EAAE,QAAQ;gBAChB,KAAK;gBACL,EAAE,EAAE,QAAQ;gBACZ,EAAE,EAAE,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC,SAAS,CAAC,CAAC,QAAQ,CAAC,QAAQ,CAAC;gBACjD,EAAE,EAAE,WAAW;aAChB,CAAC;SACL;KACF,CAAC;IAEF,KAAK,MAAM,KAAK,IAAI,MAAM,EAAE,CAAC;QAC3B,IAAI,CAAC;YACH,MAAM,IAAI,GAAG,MAAM,KAAK,CAAC,GAAG,EAAE,CAAC;YAC/B,IAAI,IAAI,CAAC,EAAE,KAAK,KAAK,EAAE,CAAC;gBACtB,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,EAAE,kBAAkB,IAAI,CAAC,IAAI,KAAK,IAAI,CAAC,OAAO,GAAG,CAAC,CAAC,CAAC;YACjF,CAAC;iBAAM,CAAC;gBACN,MAAM,CAAC,IAAI,CACT,IAAI,CAAC,KAAK,CAAC,IAAI,EAAE,uEAAuE,CAAC,CAC1F,CAAC;YACJ,CAAC;QACH,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,MAAM,CAAC,IAAI,CACT,IAAI,CAAC,KAAK,CAAC,IAAI,EAAE,wCAAyC,GAAa,CAAC,OAAO,EAAE,CAAC,CACnF,CAAC;QACJ,CAAC;IACH,CAAC;IAED,MAAM,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC;IAC9B,MAAM,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,KAAK,MAAM,CAAC,CAAC,MAAM,CAAC;IAChE,OAAO;QACL,QAAQ,EAAE,YAAY;QACtB,MAAM;QACN,MAAM;QACN,OAAO,EACL,MAAM,KAAK,MAAM;YACf,CAAC,CAAC,GAAG,MAAM,CAAC,MAAM,8CAA8C;YAChE,CAAC,CAAC,GAAG,MAAM,IAAI,MAAM,CAAC,MAAM,oCAAoC;KACrE,CAAC;AACJ,CAAC,CAAC"}
@@ -0,0 +1,29 @@
1
+ /**
2
+ * Generic signature self-consistency category (FIPS 204 ML-DSA, FIPS 205
3
+ * SLH-DSA).
4
+ *
5
+ * Both schemes expose the same black-box surface — keygen, sign, verify — so a
6
+ * single driver covers them. Signing is randomized (hedged) by default, so we
7
+ * cannot assert exact signature bytes without official vectors; but several
8
+ * properties hold for any conforming implementation and need no external data:
9
+ *
10
+ * - sizes: pk/sk lengths match the parameter set; signature length
11
+ * matches the fixed encoding.
12
+ * - sign-then-verify: verify(pk, msg, sign(sk, msg)) === true, over N msgs.
13
+ * - tamper-message: verify(pk, msg', sig) === false when msg' != msg.
14
+ * - tamper-signature: verify(pk, msg, flip-a-bit(sig)) === false.
15
+ * - wrong-length verify input is rejected with a defined error (AF-05).
16
+ * - signing-mode (advisory): detect whether sign(sk, msg) is deterministic or
17
+ * hedged by signing one fixed message twice and comparing. BOTH are valid;
18
+ * this never fails — it only surfaces the observed behavior.
19
+ *
20
+ * Exact-value KAT (sigVer vectors) is handled separately by the kat category.
21
+ */
22
+ import { type Category } from "./types.js";
23
+ import { type SignatureFamily } from "../protocol.js";
24
+ /**
25
+ * Build a signature category bound to a family. The same logic drives ML-DSA
26
+ * and SLH-DSA; only the family tag on the wire requests differs.
27
+ */
28
+ export declare function makeSignatureCategory(name: string, family: SignatureFamily): Category;
29
+ //# sourceMappingURL=signature.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"signature.d.ts","sourceRoot":"","sources":["../../src/categories/signature.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;GAoBG;AAEH,OAAO,EACL,KAAK,QAAQ,EAQd,MAAM,YAAY,CAAC;AAEpB,OAAO,EAAiC,KAAK,eAAe,EAAE,MAAM,gBAAgB,CAAC;AAKrF;;;GAGG;AACH,wBAAgB,qBAAqB,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,eAAe,GAAG,QAAQ,CAarF"}