@quantakrypto/sieve 0.4.1 → 0.4.3

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.
@@ -1 +1 @@
1
- {"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/categories/types.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AA4DH,6DAA6D;AAC7D,MAAM,UAAU,MAAM,CAAC,MAAwB;IAC7C,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,MAAM,CAAC;IACvC,IAAI,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,KAAK,MAAM,CAAC;QAAE,OAAO,MAAM,CAAC;IAC3D,IAAI,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,KAAK,MAAM,CAAC;QAAE,OAAO,MAAM,CAAC;IAC5D,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,mDAAmD;AACnD,MAAM,UAAU,IAAI,CAAC,IAAY,EAAE,MAAc,EAAE,QAAmB;IACpE,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,CAAC;AACpD,CAAC;AAED,mDAAmD;AACnD,MAAM,UAAU,IAAI,CAAC,IAAY,EAAE,MAAc,EAAE,QAAmB;IACpE,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,CAAC;AACpD,CAAC;AAED,mDAAmD;AACnD,MAAM,UAAU,IAAI,CAAC,IAAY,EAAE,MAAc,EAAE,QAAmB;IACpE,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,CAAC;AACpD,CAAC"}
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/categories/types.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AA4DH,6DAA6D;AAC7D,MAAM,UAAU,MAAM,CAAC,MAAwB;IAC7C,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,MAAM,CAAC;IACvC,IAAI,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,KAAK,MAAM,CAAC;QAAE,OAAO,MAAM,CAAC;IAC3D,IAAI,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,KAAK,MAAM,CAAC;QAAE,OAAO,MAAM,CAAC;IAC5D,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,mDAAmD;AACnD,MAAM,UAAU,IAAI,CAAC,IAAY,EAAE,MAAc,EAAE,QAAmB;IACpE,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,CAAC;AACpD,CAAC;AAED,mDAAmD;AACnD,MAAM,UAAU,IAAI,CAAC,IAAY,EAAE,MAAc,EAAE,QAAmB;IACpE,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,CAAC;AACpD,CAAC;AAED,mDAAmD;AACnD,MAAM,UAAU,IAAI,CAAC,IAAY,EAAE,MAAc,EAAE,QAAmB;IACpE,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,CAAC;AACpD,CAAC","sourcesContent":["/**\n * Shared result types for test categories.\n *\n * Every category is an async function that drives a {@link Runner} and returns\n * a {@link CategoryResult}. Categories never throw for *expected* SUT failures;\n * they record them as failing checks. They only throw for harness-level faults\n * (e.g. inability to spawn), which the report layer surfaces as an \"error\".\n */\n\nimport type { Runner } from \"../runner.js\";\nimport type { Sizes } from \"../sizes.js\";\n\n/** Status of a single check or a whole category. */\nexport type Status = \"pass\" | \"fail\" | \"skip\";\n\n/**\n * A bug-class tag linking a category/check to quantakrypto's antiform taxonomy.\n *\n * - AF-02: implicit-rejection / Fujisaki-Okamoto reject-path mistakes.\n * - AF-05: size/format confusion (wrong-length artifacts accepted/emitted).\n */\nexport type BugClass = \"AF-02\" | \"AF-05\" | undefined;\n\n/** One atomic assertion within a category. */\nexport interface Check {\n /** Short name, unique within its category. */\n name: string;\n status: Status;\n /** Human-readable detail (why it passed/failed/was skipped). */\n detail: string;\n /** Optional bug-class tag. */\n bugClass?: BugClass;\n}\n\n/** The aggregate outcome of running one category. */\nexport interface CategoryResult {\n /** Category identifier, e.g. \"correctness\". */\n category: string;\n /** Rolled-up status: fail if any check failed, else pass; all-skip => skip. */\n status: Status;\n /** Bug class this category primarily exercises, if any. */\n bugClass?: BugClass;\n /** Individual checks. */\n checks: Check[];\n /** Free-form summary line. */\n summary: string;\n}\n\n/** Context handed to every category. */\nexport interface CategoryContext {\n runner: Runner;\n sizes: Sizes;\n /** Number of randomized iterations to perform (where applicable). */\n iterations: number;\n /**\n * Max concurrent in-flight requests for categories that issue many\n * INDEPENDENT requests (via {@link Runner.sendMany}). Default 16 when unset.\n * Categories with dependent/ordered ops ignore this and use serial `send`.\n */\n pipelineDepth?: number;\n /** Optional directory of official ACVP/KAT vectors (kat category only). */\n vectorsDir?: string;\n}\n\n/** A category is a named driver producing one {@link CategoryResult}. */\nexport type Category = (ctx: CategoryContext) => Promise<CategoryResult>;\n\n/** Roll a list of checks up into a category-level status. */\nexport function rollUp(checks: readonly Check[]): Status {\n if (checks.length === 0) return \"skip\";\n if (checks.some((c) => c.status === \"fail\")) return \"fail\";\n if (checks.every((c) => c.status === \"skip\")) return \"skip\";\n return \"pass\";\n}\n\n/** Convenience constructor for a passing check. */\nexport function pass(name: string, detail: string, bugClass?: BugClass): Check {\n return { name, status: \"pass\", detail, bugClass };\n}\n\n/** Convenience constructor for a failing check. */\nexport function fail(name: string, detail: string, bugClass?: BugClass): Check {\n return { name, status: \"fail\", detail, bugClass };\n}\n\n/** Convenience constructor for a skipped check. */\nexport function skip(name: string, detail: string, bugClass?: BugClass): Check {\n return { name, status: \"skip\", detail, bugClass };\n}\n"]}
package/dist/cli.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"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","sourcesContent":["#!/usr/bin/env node\n/**\n * `sieve` command-line interface.\n *\n * Usage:\n * sieve --impl \"<command...>\" --param ml-kem-768 [--iterations N]\n * [--vectors <dir>] [--timing] [--only a,b] [--timeout-ms N] [--json]\n *\n * Exit codes: 0 on overall PASS, 1 on overall FAIL, 2 on a usage error.\n *\n * Zero runtime dependencies — argument parsing is hand-rolled below.\n */\n\nimport { runSieve } from \"./index.js\";\nimport { formatHuman, formatJson } from \"./report.js\";\nimport { isParamSet, PARAM_SETS, type ParamSet } from \"./sizes.js\";\n\ninterface CliOptions {\n impl: string[];\n param: ParamSet;\n iterations: number;\n vectorsDir?: string;\n timing: boolean;\n only?: string[];\n timeoutMs?: number;\n pipelineDepth?: number;\n inheritEnv: boolean;\n json: boolean;\n}\n\nconst USAGE = `sieve — conformance battery for ML-KEM / ML-DSA implementations\n\nUSAGE:\n sieve --impl \"<command...>\" --param <set> [options]\n\nREQUIRED:\n --impl \"<cmd...>\" Command Sieve spawns and drives over stdin/stdout JSON.\n Quote the whole command, e.g. --impl \"node ./impl.js\".\n --param <set> Parameter set. One of:\n ${PARAM_SETS.join(\", \")}\n\nOPTIONS:\n --iterations <N> Randomized iterations for applicable categories (default 32).\n --vectors <dir> Directory of OFFICIAL NIST ACVP vector files for the KAT\n category. Sieve ships none and never fabricates them; see\n vectors/README.md. Without this, KAT is SKIPPED.\n --timing Include the advisory (non-verdict) decaps timing probe.\n --only <a,b,...> Run only these categories (comma-separated).\n --timeout-ms <N> Per-request timeout in ms (default 10000).\n --pipeline-depth <N> Max concurrent in-flight requests for independent-iteration\n categories (default 16). Use 1 for strictly serial.\n --inherit-env Pass the FULL parent environment to the SUT. DANGEROUS:\n the SUT is untrusted code; by default Sieve scrubs the env\n to a minimal allow-list. Only for trusted local impls.\n --json Emit the report as JSON instead of human-readable text.\n -h, --help Show this help.\n\nEXIT: 0 = PASS, 1 = FAIL, 2 = usage error.`;\n\nclass UsageError extends Error {}\n\nfunction parseArgs(argv: readonly string[]): CliOptions {\n let impl: string[] | undefined;\n let param: ParamSet | undefined;\n let iterations = 32;\n let vectorsDir: string | undefined;\n let timing = false;\n let only: string[] | undefined;\n let timeoutMs: number | undefined;\n let pipelineDepth: number | undefined;\n let inheritEnv = false;\n let json = false;\n\n for (let i = 0; i < argv.length; i++) {\n const arg = argv[i] as string;\n const eq = arg.indexOf(\"=\");\n const flag = eq >= 0 ? arg.slice(0, eq) : arg;\n const inlineVal = eq >= 0 ? arg.slice(eq + 1) : undefined;\n const next = (): string => {\n if (inlineVal !== undefined) return inlineVal;\n const v = argv[++i];\n if (v === undefined) throw new UsageError(`flag ${flag} requires a value`);\n return v;\n };\n\n switch (flag) {\n case \"--impl\": {\n const raw = next().trim();\n impl = raw.split(/\\s+/).filter((s) => s.length > 0);\n if (impl.length === 0) throw new UsageError(\"--impl command is empty\");\n break;\n }\n case \"--param\": {\n const p = next();\n if (!isParamSet(p)) {\n throw new UsageError(`unknown --param \"${p}\"; expected one of ${PARAM_SETS.join(\", \")}`);\n }\n param = p;\n break;\n }\n case \"--iterations\": {\n const n = Number(next());\n if (!Number.isInteger(n) || n < 1)\n throw new UsageError(\"--iterations must be a positive integer\");\n iterations = n;\n break;\n }\n case \"--vectors\":\n vectorsDir = next();\n break;\n case \"--timing\":\n timing = true;\n break;\n case \"--only\":\n only = next()\n .split(\",\")\n .map((s) => s.trim())\n .filter((s) => s.length > 0);\n break;\n case \"--timeout-ms\": {\n const n = Number(next());\n if (!Number.isInteger(n) || n < 1)\n throw new UsageError(\"--timeout-ms must be a positive integer\");\n timeoutMs = n;\n break;\n }\n case \"--pipeline-depth\": {\n const n = Number(next());\n if (!Number.isInteger(n) || n < 1)\n throw new UsageError(\"--pipeline-depth must be a positive integer\");\n pipelineDepth = n;\n break;\n }\n case \"--inherit-env\":\n inheritEnv = true;\n break;\n case \"--json\":\n json = true;\n break;\n case \"-h\":\n case \"--help\":\n process.stdout.write(USAGE + \"\\n\");\n process.exit(0);\n break;\n default:\n throw new UsageError(`unknown flag: ${flag}`);\n }\n }\n\n if (!impl) throw new UsageError(\"missing required --impl\");\n if (!param) throw new UsageError(\"missing required --param\");\n\n return {\n impl,\n param,\n iterations,\n ...(vectorsDir ? { vectorsDir } : {}),\n timing,\n ...(only ? { only } : {}),\n ...(timeoutMs !== undefined ? { timeoutMs } : {}),\n ...(pipelineDepth !== undefined ? { pipelineDepth } : {}),\n inheritEnv,\n json,\n };\n}\n\nasync function main(): Promise<number> {\n let opts: CliOptions;\n try {\n opts = parseArgs(process.argv.slice(2));\n } catch (err) {\n if (err instanceof UsageError) {\n process.stderr.write(`error: ${err.message}\\n\\n${USAGE}\\n`);\n return 2;\n }\n throw err;\n }\n\n const report = await runSieve({\n command: opts.impl,\n param: opts.param,\n iterations: opts.iterations,\n ...(opts.vectorsDir ? { vectorsDir: opts.vectorsDir } : {}),\n timing: opts.timing,\n ...(opts.only ? { only: opts.only } : {}),\n ...(opts.timeoutMs !== undefined ? { timeoutMs: opts.timeoutMs } : {}),\n ...(opts.pipelineDepth !== undefined ? { pipelineDepth: opts.pipelineDepth } : {}),\n ...(opts.inheritEnv ? { inheritEnv: true } : {}),\n });\n\n process.stdout.write((opts.json ? formatJson(report) : formatHuman(report)) + \"\\n\");\n return report.overall === \"PASS\" ? 0 : 1;\n}\n\nmain().then(\n (code) => process.exit(code),\n (err) => {\n process.stderr.write(`sieve: fatal: ${(err as Error).stack ?? String(err)}\\n`);\n process.exit(2);\n },\n);\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAKH,OAAO,EAAe,KAAK,WAAW,EAAE,MAAM,aAAa,CAAC;AAC5D,OAAO,EAAwB,KAAK,QAAQ,EAAE,MAAM,YAAY,CAAC;AAEjE,YAAY,EAAE,WAAW,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAC/D,YAAY,EAAE,cAAc,EAAE,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,uBAAuB,CAAC;AACrF,YAAY,EACV,QAAQ,EACR,MAAM,EACN,KAAK,EACL,QAAQ,EACR,QAAQ,EACR,WAAW,EACX,cAAc,GACf,MAAM,YAAY,CAAC;AACpB,YAAY,EAAE,OAAO,EAAE,QAAQ,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC;AAExE,OAAO,EACL,UAAU,EACV,UAAU,EACV,QAAQ,EACR,UAAU,EACV,UAAU,EACV,aAAa,EACb,gBAAgB,GACjB,MAAM,YAAY,CAAC;AACpB,OAAO,EAAE,UAAU,EAAE,aAAa,EAAE,MAAM,uBAAuB,CAAC;AAClE,OAAO,EAAE,WAAW,EAAE,WAAW,EAAE,UAAU,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AACnF,OAAO,EACL,aAAa,EACb,cAAc,EACd,aAAa,EACb,gBAAgB,EAChB,KAAK,EACL,OAAO,GACR,MAAM,eAAe,CAAC;AACvB,OAAO,EACL,MAAM,EACN,YAAY,EACZ,aAAa,EACb,WAAW,EACX,qBAAqB,GACtB,MAAM,aAAa,CAAC;AACrB,YAAY,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AACjD,OAAO,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AAC3C,YAAY,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AAEtD,oCAAoC;AACpC,MAAM,WAAW,eAAe;IAC9B,mDAAmD;IACnD,OAAO,EAAE,SAAS,MAAM,EAAE,CAAC;IAC3B,gDAAgD;IAChD,KAAK,EAAE,QAAQ,CAAC;IAChB,oEAAoE;IACpE,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,2DAA2D;IAC3D,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,0EAA0E;IAC1E,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,4DAA4D;IAC5D,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,qCAAqC;IACrC,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,qEAAqE;IACrE,GAAG,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC7B;;;OAGG;IACH,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,+EAA+E;IAC/E,YAAY,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;IACjC;;;;;OAKG;IACH,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,kEAAkE;IAClE,IAAI,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;CAC1B;AAED;;;GAGG;AACH,wBAAsB,QAAQ,CAAC,IAAI,EAAE,eAAe,GAAG,OAAO,CAAC,WAAW,CAAC,CAkE1E"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAOH,OAAO,EAAe,KAAK,WAAW,EAAE,MAAM,aAAa,CAAC;AAC5D,OAAO,EAAwB,KAAK,QAAQ,EAAE,MAAM,YAAY,CAAC;AAEjE,YAAY,EAAE,WAAW,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAC/D,YAAY,EAAE,cAAc,EAAE,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,uBAAuB,CAAC;AACrF,YAAY,EACV,QAAQ,EACR,MAAM,EACN,KAAK,EACL,QAAQ,EACR,QAAQ,EACR,WAAW,EACX,cAAc,GACf,MAAM,YAAY,CAAC;AACpB,YAAY,EAAE,OAAO,EAAE,QAAQ,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC;AAExE,OAAO,EACL,UAAU,EACV,UAAU,EACV,QAAQ,EACR,UAAU,EACV,UAAU,EACV,aAAa,EACb,gBAAgB,GACjB,MAAM,YAAY,CAAC;AACpB,OAAO,EAAE,UAAU,EAAE,aAAa,EAAE,MAAM,uBAAuB,CAAC;AAClE,OAAO,EAAE,WAAW,EAAE,WAAW,EAAE,UAAU,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AACnF,OAAO,EACL,aAAa,EACb,cAAc,EACd,aAAa,EACb,gBAAgB,EAChB,KAAK,EACL,OAAO,GACR,MAAM,eAAe,CAAC;AACvB,OAAO,EACL,MAAM,EACN,YAAY,EACZ,aAAa,EACb,WAAW,EACX,qBAAqB,GACtB,MAAM,aAAa,CAAC;AACrB,YAAY,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AACjD,OAAO,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AAC3C,YAAY,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AAEtD,oCAAoC;AACpC,MAAM,WAAW,eAAe;IAC9B,mDAAmD;IACnD,OAAO,EAAE,SAAS,MAAM,EAAE,CAAC;IAC3B,gDAAgD;IAChD,KAAK,EAAE,QAAQ,CAAC;IAChB,oEAAoE;IACpE,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,2DAA2D;IAC3D,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,0EAA0E;IAC1E,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,4DAA4D;IAC5D,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,qCAAqC;IACrC,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,qEAAqE;IACrE,GAAG,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC7B;;;OAGG;IACH,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,+EAA+E;IAC/E,YAAY,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;IACjC;;;;;OAKG;IACH,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,kEAAkE;IAClE,IAAI,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;CAC1B;AAED;;;GAGG;AACH,wBAAsB,QAAQ,CAAC,IAAI,EAAE,eAAe,GAAG,OAAO,CAAC,WAAW,CAAC,CAkF1E"}
package/dist/index.js CHANGED
@@ -14,6 +14,7 @@
14
14
  * ```
15
15
  */
16
16
  import { categoriesFor } from "./categories/index.js";
17
+ import { loadVectors } from "./vectors.js";
17
18
  import { Runner } from "./runner.js";
18
19
  import { buildReport } from "./report.js";
19
20
  import { isParamSet, sizesFor } from "./sizes.js";
@@ -83,6 +84,21 @@ export async function runSieve(opts) {
83
84
  finally {
84
85
  await runner.close();
85
86
  }
87
+ // Record vector-file provenance (raw-byte hashes + declared source) so a `kat`
88
+ // PASS is traceable to authentic inputs. Best-effort: an invalid/empty vectors
89
+ // dir is already surfaced by the kat category, so a load failure here is silent.
90
+ let provenance;
91
+ let provenanceDeclared;
92
+ if (opts.vectorsDir) {
93
+ try {
94
+ const vs = loadVectors(opts.vectorsDir);
95
+ provenance = vs.provenance;
96
+ provenanceDeclared = vs.provenanceDeclared;
97
+ }
98
+ catch {
99
+ /* invalid/empty vectors dir — the kat category reports it */
100
+ }
101
+ }
86
102
  return buildReport({
87
103
  param: opts.param,
88
104
  impl: [...opts.command],
@@ -91,6 +107,7 @@ export async function runSieve(opts) {
91
107
  startedAt,
92
108
  durationMs: Math.round(performance.now() - t0),
93
109
  categories: results,
110
+ ...(provenance ? { provenance, provenanceDeclared } : {}),
94
111
  });
95
112
  }
96
113
  //# sourceMappingURL=index.js.map
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * @quantakrypto/sieve — programmatic API.\n *\n * Sieve is a conformance battery for ML-KEM (FIPS 203) and ML-DSA (FIPS 204)\n * implementations. It TESTS other people's implementations; it implements no\n * cryptography of its own and ships no Known-Answer-Test vectors. See README.md\n * and PROTOCOL.md.\n *\n * Typical use:\n * ```ts\n * import { runSieve } from \"@quantakrypto/sieve\";\n * const report = await runSieve({ command: [\"node\", \"./my-impl.js\"], param: \"ml-kem-768\" });\n * console.log(report.overall);\n * ```\n */\n\nimport { categoriesFor } from \"./categories/index.js\";\nimport type { CategoryResult } from \"./categories/types.js\";\nimport { loadVectors } from \"./vectors.js\";\nimport type { VectorFileProvenance } from \"./vectors.js\";\nimport { Runner } from \"./runner.js\";\nimport { buildReport, type SieveReport } from \"./report.js\";\nimport { isParamSet, sizesFor, type ParamSet } from \"./sizes.js\";\n\nexport type { SieveReport, CategoryCounts } from \"./report.js\";\nexport type { CategoryResult, Check, Status, BugClass } from \"./categories/types.js\";\nexport type {\n ParamSet,\n Family,\n Sizes,\n KemSizes,\n DsaSizes,\n SlhDsaSizes,\n SignatureSizes,\n} from \"./sizes.js\";\nexport type { Request, Response, SignatureFamily } from \"./protocol.js\";\n\nexport {\n PARAM_SETS,\n isParamSet,\n sizesFor,\n asKemSizes,\n asDsaSizes,\n asSlhDsaSizes,\n asSignatureSizes,\n} from \"./sizes.js\";\nexport { CATEGORIES, categoriesFor } from \"./categories/index.js\";\nexport { buildReport, formatHuman, formatJson, overallVerdict } from \"./report.js\";\nexport {\n encodeRequest,\n decodeResponse,\n ProtocolError,\n PROTOCOL_VERSION,\n toB64,\n fromB64,\n} from \"./protocol.js\";\nexport {\n Runner,\n TimeoutError,\n SutCrashError,\n buildSutEnv,\n DEFAULT_ENV_ALLOWLIST,\n} from \"./runner.js\";\nexport type { RunnerOptions } from \"./runner.js\";\nexport { loadVectors } from \"./vectors.js\";\nexport type { Vector, VectorSet } from \"./vectors.js\";\n\n/** Options for {@link runSieve}. */\nexport interface RunSieveOptions {\n /** Argv of the SUT, e.g. [\"node\", \"./impl.js\"]. */\n command: readonly string[];\n /** Parameter set to test, e.g. \"ml-kem-768\". */\n param: ParamSet;\n /** Randomized iterations for applicable categories (default 32). */\n iterations?: number;\n /** Per-request timeout in milliseconds (default 10000). */\n timeoutMs?: number;\n /** Directory of official ACVP vectors for the kat category (optional). */\n vectorsDir?: string;\n /** Include the advisory timing category (default false). */\n timing?: boolean;\n /** Working directory for the SUT. */\n cwd?: string;\n /** Extra env for the SUT (layered over the scrubbed minimal env). */\n env?: Record<string, string>;\n /**\n * Inherit the full parent environment instead of the scrubbed minimal env.\n * Default `false` — the SUT is untrusted code. See security.md Q-17.\n */\n inheritEnv?: boolean;\n /** Extra env variable names to copy from the parent env into the SUT's env. */\n envAllowlist?: readonly string[];\n /**\n * Max concurrent in-flight requests per SUT process for categories that issue\n * many INDEPENDENT requests (correctness/determinism iterations). Default 16.\n * Set to 1 for strictly serial behavior. The id-correlated protocol keeps\n * dependent ops ordered; see docs/audits/performance.md §7.1.\n */\n pipelineDepth?: number;\n /** Restrict to these category names (default: all applicable). */\n only?: readonly string[];\n}\n\n/**\n * Spawn the SUT, run the applicable categories, and return an aggregated\n * report. The SUT process is always torn down before returning, even on error.\n */\nexport async function runSieve(opts: RunSieveOptions): Promise<SieveReport> {\n if (!isParamSet(opts.param)) {\n throw new RangeError(`unknown parameter set: ${opts.param}`);\n }\n const sizes = sizesFor(opts.param);\n const iterations = opts.iterations ?? 32;\n const startedAt = new Date();\n const t0 = performance.now();\n\n const runner = new Runner({\n command: opts.command,\n ...(opts.timeoutMs !== undefined ? { timeoutMs: opts.timeoutMs } : {}),\n ...(opts.cwd ? { cwd: opts.cwd } : {}),\n ...(opts.env ? { env: opts.env } : {}),\n ...(opts.inheritEnv !== undefined ? { inheritEnv: opts.inheritEnv } : {}),\n ...(opts.envAllowlist ? { envAllowlist: opts.envAllowlist } : {}),\n });\n const pipelineDepth = opts.pipelineDepth ?? 16;\n\n const results: CategoryResult[] = [];\n try {\n let cats = categoriesFor(sizes.family, opts.timing ?? false);\n if (opts.only && opts.only.length > 0) {\n const want = new Set(opts.only);\n cats = cats.filter((c) => want.has(c.name));\n }\n for (const cat of cats) {\n try {\n const res = await cat.run({\n runner,\n sizes,\n iterations,\n pipelineDepth,\n ...(opts.vectorsDir ? { vectorsDir: opts.vectorsDir } : {}),\n });\n results.push(res);\n } catch (err) {\n // A category that throws (rather than recording a fail) is a harness\n // fault; surface it as a failing category so the report is complete.\n results.push({\n category: cat.name,\n status: \"fail\",\n checks: [\n {\n name: \"category-error\",\n status: \"fail\",\n detail: `category threw: ${(err as Error).message}`,\n },\n ],\n summary: \"category aborted with an error\",\n });\n }\n }\n } finally {\n await runner.close();\n }\n\n // Record vector-file provenance (raw-byte hashes + declared source) so a `kat`\n // PASS is traceable to authentic inputs. Best-effort: an invalid/empty vectors\n // dir is already surfaced by the kat category, so a load failure here is silent.\n let provenance: VectorFileProvenance[] | undefined;\n let provenanceDeclared: boolean | undefined;\n if (opts.vectorsDir) {\n try {\n const vs = loadVectors(opts.vectorsDir);\n provenance = vs.provenance;\n provenanceDeclared = vs.provenanceDeclared;\n } catch {\n /* invalid/empty vectors dir — the kat category reports it */\n }\n }\n\n return buildReport({\n param: opts.param,\n impl: [...opts.command],\n iterations,\n ...(opts.vectorsDir ? { vectorsDir: opts.vectorsDir } : {}),\n startedAt,\n durationMs: Math.round(performance.now() - t0),\n categories: results,\n ...(provenance ? { provenance, provenanceDeclared } : {}),\n });\n}\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"protocol.js","sourceRoot":"","sources":["../src/protocol.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"protocol.js","sourceRoot":"","sources":["../src/protocol.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * The Sieve <-> SUT wire protocol.\n *\n * Sieve drives a system-under-test (SUT) — any ML-KEM / ML-DSA implementation\n * the user provides — by spawning it as a child process and exchanging\n * newline-delimited JSON (NDJSON) over stdin/stdout. One request per line, one\n * response per line. All byte fields are base64-encoded strings.\n *\n * This module defines the request/response TypeScript types and the\n * (de)serialization + validation logic. It performs NO cryptography. See\n * PROTOCOL.md for the human-readable specification.\n */\n\nimport type { Family, ParamSet } from \"./sizes.js\";\n\n/** Protocol version. Bumped on any breaking wire change. */\nexport const PROTOCOL_VERSION = 1 as const;\n\n// ---------------------------------------------------------------------------\n// Request types\n// ---------------------------------------------------------------------------\n\n/** Operation names, shared across families where the semantics overlap. */\nexport type Op = \"keygen\" | \"encaps\" | \"decaps\" | \"sign\" | \"verify\";\n\n/** Families that support the signature operations (sign / verify). */\nexport type SignatureFamily = \"ml-dsa\" | \"slh-dsa\";\n\n/** Fields common to every request. */\ninterface RequestBase {\n /** Correlation id; the SUT MUST echo it back on the matching response. */\n id: number;\n /** Algorithm family this request targets. */\n family: Family;\n /** Parameter-set identifier, e.g. \"ml-kem-768\". */\n param: ParamSet;\n /** Operation to perform. */\n op: Op;\n}\n\n/** ML-KEM / ML-DSA key generation. `seed` (base64) makes it deterministic. */\nexport interface KeygenRequest extends RequestBase {\n op: \"keygen\";\n /** Optional base64 seed for deterministic keygen (impl-defined length). */\n seed?: string;\n}\n\n/** ML-KEM encapsulation against a public key. */\nexport interface EncapsRequest extends RequestBase {\n family: \"ml-kem\";\n op: \"encaps\";\n /** Base64 public (encapsulation) key. */\n pk: string;\n /** Optional base64 coins/randomness for deterministic encapsulation. */\n coins?: string;\n}\n\n/** ML-KEM decapsulation of a ciphertext with a secret key. */\nexport interface DecapsRequest extends RequestBase {\n family: \"ml-kem\";\n op: \"decaps\";\n /** Base64 secret (decapsulation) key. */\n sk: string;\n /** Base64 ciphertext. */\n ct: string;\n}\n\n/** ML-DSA / SLH-DSA signature generation. */\nexport interface SignRequest extends RequestBase {\n family: SignatureFamily;\n op: \"sign\";\n /** Base64 secret (signing) key. */\n sk: string;\n /** Base64 message to sign. */\n msg: string;\n}\n\n/** ML-DSA / SLH-DSA signature verification. */\nexport interface VerifyRequest extends RequestBase {\n family: SignatureFamily;\n op: \"verify\";\n /** Base64 public (verification) key. */\n pk: string;\n /** Base64 message. */\n msg: string;\n /** Base64 signature. */\n sig: string;\n}\n\n/** Any request Sieve may send. */\nexport type Request = KeygenRequest | EncapsRequest | DecapsRequest | SignRequest | VerifyRequest;\n\n/**\n * Omit that distributes over a union, so each variant keeps its own fields\n * (plain `Omit<Request, \"id\">` would collapse to only the common keys).\n */\ntype DistributiveOmit<T, K extends keyof T> = T extends unknown ? Omit<T, K> : never;\n\n/** A request as handed to the runner — the `id` is assigned by the runner. */\nexport type RequestInput = DistributiveOmit<Request, \"id\"> & { id?: number };\n\n// ---------------------------------------------------------------------------\n// Response types\n// ---------------------------------------------------------------------------\n\n/** Successful keygen result. */\nexport interface KeygenResult {\n id: number;\n ok: true;\n /** Base64 public key. */\n pk: string;\n /** Base64 secret key. */\n sk: string;\n}\n\n/** Successful encapsulation result. */\nexport interface EncapsResult {\n id: number;\n ok: true;\n /** Base64 ciphertext. */\n ct: string;\n /** Base64 shared secret. */\n ss: string;\n}\n\n/** Successful decapsulation result. */\nexport interface DecapsResult {\n id: number;\n ok: true;\n /** Base64 shared secret. */\n ss: string;\n}\n\n/** Successful signing result. */\nexport interface SignResult {\n id: number;\n ok: true;\n /** Base64 signature. */\n sig: string;\n}\n\n/** Successful verification result. `valid` is the verification verdict. */\nexport interface VerifyResult {\n id: number;\n ok: true;\n /** Whether the signature verified against (pk, msg). */\n valid: boolean;\n}\n\n/**\n * A defined, well-formed error. The SUT MUST return this (not crash, not hang,\n * not silently produce garbage) when it cannot or will not honor a request —\n * for example when given a wrong-length key. Sieve treats a clean `error`\n * response as a *correct* rejection in the size/robustness categories.\n */\nexport interface ErrorResult {\n id: number;\n ok: false;\n /** Short machine-readable code, e.g. \"invalid-length\", \"unsupported\". */\n code: string;\n /** Human-readable detail. */\n message: string;\n}\n\n/** Any response the SUT may emit. */\nexport type Response =\n | KeygenResult\n | EncapsResult\n | DecapsResult\n | SignResult\n | VerifyResult\n | ErrorResult;\n\n/** A successful (non-error) response. */\nexport type SuccessResponse = Exclude<Response, ErrorResult>;\n\n// ---------------------------------------------------------------------------\n// Serialization\n// ---------------------------------------------------------------------------\n\n/** Serialize a request to a single NDJSON line (including the trailing \"\\n\"). */\nexport function encodeRequest(req: Request): string {\n return JSON.stringify(req) + \"\\n\";\n}\n\n/** Raised when a line from the SUT cannot be parsed into a valid Response. */\nexport class ProtocolError extends Error {\n /** The offending raw line, truncated for safety. */\n readonly raw: string;\n constructor(message: string, raw: string) {\n super(message);\n this.name = \"ProtocolError\";\n this.raw = raw.length > 512 ? raw.slice(0, 512) + \"…\" : raw;\n }\n}\n\nfunction isObject(v: unknown): v is Record<string, unknown> {\n return typeof v === \"object\" && v !== null && !Array.isArray(v);\n}\n\nfunction isStr(v: unknown): v is string {\n return typeof v === \"string\";\n}\n\n/**\n * Parse one NDJSON line from the SUT into a validated {@link Response}.\n *\n * Validates structural shape only (presence and types of fields); it does NOT\n * validate cryptographic content or byte lengths — that is the categories'\n * job. Throws {@link ProtocolError} on malformed input.\n */\nexport function decodeResponse(line: string): Response {\n const trimmed = line.trim();\n if (trimmed.length === 0) {\n throw new ProtocolError(\"empty line\", line);\n }\n\n let parsed: unknown;\n try {\n parsed = JSON.parse(trimmed);\n } catch (err) {\n throw new ProtocolError(`not valid JSON: ${(err as Error).message}`, line);\n }\n\n if (!isObject(parsed)) {\n throw new ProtocolError(\"response is not a JSON object\", line);\n }\n\n const id = parsed[\"id\"];\n if (typeof id !== \"number\" || !Number.isInteger(id)) {\n throw new ProtocolError(\"missing/invalid integer 'id'\", line);\n }\n\n const ok = parsed[\"ok\"];\n if (typeof ok !== \"boolean\") {\n throw new ProtocolError(\"missing/invalid boolean 'ok'\", line);\n }\n\n if (ok === false) {\n const code = parsed[\"code\"];\n const message = parsed[\"message\"];\n if (!isStr(code) || !isStr(message)) {\n throw new ProtocolError(\"error response must have string 'code' and 'message'\", line);\n }\n return { id, ok: false, code, message };\n }\n\n // ok === true: discriminate by which payload fields are present.\n if (isStr(parsed[\"pk\"]) && isStr(parsed[\"sk\"])) {\n return { id, ok: true, pk: parsed[\"pk\"], sk: parsed[\"sk\"] };\n }\n if (isStr(parsed[\"ct\"]) && isStr(parsed[\"ss\"])) {\n return { id, ok: true, ct: parsed[\"ct\"], ss: parsed[\"ss\"] };\n }\n if (isStr(parsed[\"ss\"])) {\n return { id, ok: true, ss: parsed[\"ss\"] };\n }\n if (isStr(parsed[\"sig\"])) {\n return { id, ok: true, sig: parsed[\"sig\"] };\n }\n if (typeof parsed[\"valid\"] === \"boolean\") {\n return { id, ok: true, valid: parsed[\"valid\"] };\n }\n\n throw new ProtocolError(\n \"ok response has no recognizable payload \" + \"(expected pk+sk, ct+ss, ss, sig, or valid)\",\n line,\n );\n}\n\n// ---------------------------------------------------------------------------\n// Base64 helpers (Node built-in Buffer — no external dependency)\n// ---------------------------------------------------------------------------\n\n/** Encode raw bytes to a base64 string. */\nexport function toB64(bytes: Uint8Array): string {\n return Buffer.from(bytes).toString(\"base64\");\n}\n\n/**\n * Decode a base64 string to bytes.\n *\n * @throws {ProtocolError} if the input is not valid base64 (i.e. re-encoding\n * the decoded bytes does not reproduce the canonical form).\n */\nexport function fromB64(b64: string): Uint8Array {\n const buf = Buffer.from(b64, \"base64\");\n // Buffer.from is lenient; sanity-check by re-encoding the canonical form.\n if (buf.toString(\"base64\").replace(/=+$/, \"\") !== b64.replace(/\\s/g, \"\").replace(/=+$/, \"\")) {\n throw new ProtocolError(\"invalid base64\", b64);\n }\n return new Uint8Array(buf);\n}\n"]}
package/dist/report.d.ts CHANGED
@@ -7,6 +7,7 @@
7
7
  */
8
8
  import type { CategoryResult } from "./categories/types.js";
9
9
  import type { ParamSet } from "./sizes.js";
10
+ import type { VectorFileProvenance } from "./vectors.js";
10
11
  /** Per-category counts. */
11
12
  export interface CategoryCounts {
12
13
  pass: number;
@@ -28,6 +29,11 @@ export interface SieveReport {
28
29
  overall: "PASS" | "FAIL";
29
30
  categories: CategoryResult[];
30
31
  counts: CategoryCounts;
32
+ /** ACVP vector-file provenance (raw-byte hashes + declared source) — present
33
+ * only when `--vectors` was supplied, so a `kat` PASS is traceable. */
34
+ provenance?: VectorFileProvenance[];
35
+ /** Whether the operator declared the vectors' source (vectors-manifest.json). */
36
+ provenanceDeclared?: boolean;
31
37
  }
32
38
  /** Compute the overall verdict: FAIL if any non-advisory category failed. */
33
39
  export declare function overallVerdict(categories: readonly CategoryResult[]): "PASS" | "FAIL";
@@ -40,6 +46,8 @@ export declare function buildReport(args: {
40
46
  startedAt: Date;
41
47
  durationMs: number;
42
48
  categories: CategoryResult[];
49
+ provenance?: VectorFileProvenance[];
50
+ provenanceDeclared?: boolean;
43
51
  }): SieveReport;
44
52
  /** Pretty JSON rendering. */
45
53
  export declare function formatJson(report: SieveReport): string;
@@ -1 +1 @@
1
- {"version":3,"file":"report.d.ts","sourceRoot":"","sources":["../src/report.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,KAAK,EAAE,cAAc,EAAU,MAAM,uBAAuB,CAAC;AAEpE,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AAK3C,2BAA2B;AAC3B,MAAM,WAAW,cAAc;IAC7B,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;CACd;AAED,uBAAuB;AACvB,MAAM,WAAW,WAAW;IAC1B,IAAI,EAAE,OAAO,CAAC;IACd,eAAe,EAAE,MAAM,CAAC;IACxB,KAAK,EAAE,QAAQ,CAAC;IAChB,uCAAuC;IACvC,IAAI,EAAE,MAAM,EAAE,CAAC;IACf,UAAU,EAAE,MAAM,CAAC;IACnB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,SAAS,EAAE,MAAM,CAAC;IAClB,UAAU,EAAE,MAAM,CAAC;IACnB,sDAAsD;IACtD,OAAO,EAAE,MAAM,GAAG,MAAM,CAAC;IACzB,UAAU,EAAE,cAAc,EAAE,CAAC;IAC7B,MAAM,EAAE,cAAc,CAAC;CACxB;AAWD,6EAA6E;AAC7E,wBAAgB,cAAc,CAAC,UAAU,EAAE,SAAS,cAAc,EAAE,GAAG,MAAM,GAAG,MAAM,CAMrF;AAED,6EAA6E;AAC7E,wBAAgB,WAAW,CAAC,IAAI,EAAE;IAChC,KAAK,EAAE,QAAQ,CAAC;IAChB,IAAI,EAAE,MAAM,EAAE,CAAC;IACf,UAAU,EAAE,MAAM,CAAC;IACnB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,SAAS,EAAE,IAAI,CAAC;IAChB,UAAU,EAAE,MAAM,CAAC;IACnB,UAAU,EAAE,cAAc,EAAE,CAAC;CAC9B,GAAG,WAAW,CAcd;AAED,6BAA6B;AAC7B,wBAAgB,UAAU,CAAC,MAAM,EAAE,WAAW,GAAG,MAAM,CAEtD;AAID,uEAAuE;AACvE,wBAAgB,WAAW,CAAC,MAAM,EAAE,WAAW,GAAG,MAAM,CA4BvD"}
1
+ {"version":3,"file":"report.d.ts","sourceRoot":"","sources":["../src/report.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,KAAK,EAAE,cAAc,EAAU,MAAM,uBAAuB,CAAC;AAEpE,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AAC3C,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,cAAc,CAAC;AAKzD,2BAA2B;AAC3B,MAAM,WAAW,cAAc;IAC7B,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;CACd;AAED,uBAAuB;AACvB,MAAM,WAAW,WAAW;IAC1B,IAAI,EAAE,OAAO,CAAC;IACd,eAAe,EAAE,MAAM,CAAC;IACxB,KAAK,EAAE,QAAQ,CAAC;IAChB,uCAAuC;IACvC,IAAI,EAAE,MAAM,EAAE,CAAC;IACf,UAAU,EAAE,MAAM,CAAC;IACnB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,SAAS,EAAE,MAAM,CAAC;IAClB,UAAU,EAAE,MAAM,CAAC;IACnB,sDAAsD;IACtD,OAAO,EAAE,MAAM,GAAG,MAAM,CAAC;IACzB,UAAU,EAAE,cAAc,EAAE,CAAC;IAC7B,MAAM,EAAE,cAAc,CAAC;IACvB;2EACuE;IACvE,UAAU,CAAC,EAAE,oBAAoB,EAAE,CAAC;IACpC,iFAAiF;IACjF,kBAAkB,CAAC,EAAE,OAAO,CAAC;CAC9B;AAWD,6EAA6E;AAC7E,wBAAgB,cAAc,CAAC,UAAU,EAAE,SAAS,cAAc,EAAE,GAAG,MAAM,GAAG,MAAM,CAMrF;AAED,6EAA6E;AAC7E,wBAAgB,WAAW,CAAC,IAAI,EAAE;IAChC,KAAK,EAAE,QAAQ,CAAC;IAChB,IAAI,EAAE,MAAM,EAAE,CAAC;IACf,UAAU,EAAE,MAAM,CAAC;IACnB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,SAAS,EAAE,IAAI,CAAC;IAChB,UAAU,EAAE,MAAM,CAAC;IACnB,UAAU,EAAE,cAAc,EAAE,CAAC;IAC7B,UAAU,CAAC,EAAE,oBAAoB,EAAE,CAAC;IACpC,kBAAkB,CAAC,EAAE,OAAO,CAAC;CAC9B,GAAG,WAAW,CAkBd;AAED,6BAA6B;AAC7B,wBAAgB,UAAU,CAAC,MAAM,EAAE,WAAW,GAAG,MAAM,CAEtD;AAID,uEAAuE;AACvE,wBAAgB,WAAW,CAAC,MAAM,EAAE,WAAW,GAAG,MAAM,CAqCvD"}
package/dist/report.js CHANGED
@@ -41,6 +41,10 @@ export function buildReport(args) {
41
41
  overall: overallVerdict(args.categories),
42
42
  categories: args.categories,
43
43
  counts: tally(args.categories),
44
+ ...(args.provenance ? { provenance: args.provenance } : {}),
45
+ ...(args.provenanceDeclared !== undefined
46
+ ? { provenanceDeclared: args.provenanceDeclared }
47
+ : {}),
44
48
  };
45
49
  }
46
50
  /** Pretty JSON rendering. */
@@ -57,6 +61,13 @@ export function formatHuman(report) {
57
61
  lines.push(` iterations : ${report.iterations}`);
58
62
  if (report.vectorsDir)
59
63
  lines.push(` vectors : ${report.vectorsDir}`);
64
+ if (report.provenance && report.provenance.length > 0) {
65
+ const flag = report.provenanceDeclared ? "source declared" : "SOURCE UNDECLARED";
66
+ lines.push(` provenance : ${report.provenance.length} vector file(s), ${flag}`);
67
+ for (const p of report.provenance) {
68
+ lines.push(` ${p.path} sha256:${p.sha256.slice(0, 12)}… ${p.casesUsed} case(s)`);
69
+ }
70
+ }
60
71
  lines.push(` duration : ${report.durationMs} ms`);
61
72
  lines.push("");
62
73
  for (const cat of report.categories) {
@@ -1 +1 @@
1
- {"version":3,"file":"report.js","sourceRoot":"","sources":["../src/report.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"report.js","sourceRoot":"","sources":["../src/report.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * Report aggregation and formatting.\n *\n * Combines per-category results into a single {@link SieveReport} with an\n * overall PASS/FAIL verdict, then renders it as JSON or as a human-readable\n * terminal summary. Advisory categories (timing) never affect the verdict.\n */\n\nimport type { CategoryResult, Status } from \"./categories/types.js\";\nimport { PROTOCOL_VERSION } from \"./protocol.js\";\nimport type { ParamSet } from \"./sizes.js\";\nimport type { VectorFileProvenance } from \"./vectors.js\";\n\n/** Categories that are informational and must not change the overall verdict. */\nconst ADVISORY_CATEGORIES = new Set<string>([\"timing\"]);\n\n/** Per-category counts. */\nexport interface CategoryCounts {\n pass: number;\n fail: number;\n skip: number;\n}\n\n/** The full report. */\nexport interface SieveReport {\n tool: \"sieve\";\n protocolVersion: number;\n param: ParamSet;\n /** Argv of the SUT that was tested. */\n impl: string[];\n iterations: number;\n vectorsDir?: string;\n startedAt: string;\n durationMs: number;\n /** Overall verdict (advisory categories excluded). */\n overall: \"PASS\" | \"FAIL\";\n categories: CategoryResult[];\n counts: CategoryCounts;\n /** ACVP vector-file provenance (raw-byte hashes + declared source) — present\n * only when `--vectors` was supplied, so a `kat` PASS is traceable. */\n provenance?: VectorFileProvenance[];\n /** Whether the operator declared the vectors' source (vectors-manifest.json). */\n provenanceDeclared?: boolean;\n}\n\n/** Tally check-level pass/fail/skip across all categories. */\nfunction tally(categories: readonly CategoryResult[]): CategoryCounts {\n const counts: CategoryCounts = { pass: 0, fail: 0, skip: 0 };\n for (const c of categories) {\n for (const chk of c.checks) counts[chk.status]++;\n }\n return counts;\n}\n\n/** Compute the overall verdict: FAIL if any non-advisory category failed. */\nexport function overallVerdict(categories: readonly CategoryResult[]): \"PASS\" | \"FAIL\" {\n for (const c of categories) {\n if (ADVISORY_CATEGORIES.has(c.category)) continue;\n if (c.status === \"fail\") return \"FAIL\";\n }\n return \"PASS\";\n}\n\n/** Assemble a {@link SieveReport} from category results and run metadata. */\nexport function buildReport(args: {\n param: ParamSet;\n impl: string[];\n iterations: number;\n vectorsDir?: string;\n startedAt: Date;\n durationMs: number;\n categories: CategoryResult[];\n provenance?: VectorFileProvenance[];\n provenanceDeclared?: boolean;\n}): SieveReport {\n return {\n tool: \"sieve\",\n protocolVersion: PROTOCOL_VERSION,\n param: args.param,\n impl: args.impl,\n iterations: args.iterations,\n ...(args.vectorsDir ? { vectorsDir: args.vectorsDir } : {}),\n startedAt: args.startedAt.toISOString(),\n durationMs: args.durationMs,\n overall: overallVerdict(args.categories),\n categories: args.categories,\n counts: tally(args.categories),\n ...(args.provenance ? { provenance: args.provenance } : {}),\n ...(args.provenanceDeclared !== undefined\n ? { provenanceDeclared: args.provenanceDeclared }\n : {}),\n };\n}\n\n/** Pretty JSON rendering. */\nexport function formatJson(report: SieveReport): string {\n return JSON.stringify(report, null, 2);\n}\n\nconst SYMBOL: Record<Status, string> = { pass: \"PASS\", fail: \"FAIL\", skip: \"SKIP\" };\n\n/** Human-readable terminal rendering (no color codes; CI-friendly). */\nexport function formatHuman(report: SieveReport): string {\n const lines: string[] = [];\n lines.push(`sieve — ML-KEM/ML-DSA/SLH-DSA conformance battery`);\n lines.push(` param : ${report.param}`);\n lines.push(` impl : ${report.impl.join(\" \")}`);\n lines.push(` iterations : ${report.iterations}`);\n if (report.vectorsDir) lines.push(` vectors : ${report.vectorsDir}`);\n if (report.provenance && report.provenance.length > 0) {\n const flag = report.provenanceDeclared ? \"source declared\" : \"SOURCE UNDECLARED\";\n lines.push(` provenance : ${report.provenance.length} vector file(s), ${flag}`);\n for (const p of report.provenance) {\n lines.push(\n ` ${p.path} sha256:${p.sha256.slice(0, 12)}… ${p.casesUsed} case(s)`,\n );\n }\n }\n lines.push(` duration : ${report.durationMs} ms`);\n lines.push(\"\");\n\n for (const cat of report.categories) {\n const advisory = ADVISORY_CATEGORIES.has(cat.category) ? \" (advisory)\" : \"\";\n const bug = cat.bugClass ? ` [${cat.bugClass}]` : \"\";\n lines.push(`[${SYMBOL[cat.status]}] ${cat.category}${bug}${advisory} — ${cat.summary}`);\n // Show failing and skipped checks; collapse passes.\n for (const chk of cat.checks) {\n if (chk.status === \"pass\") continue;\n const cbug = chk.bugClass ? ` [${chk.bugClass}]` : \"\";\n lines.push(` - ${SYMBOL[chk.status]} ${chk.name}${cbug}: ${chk.detail}`);\n }\n }\n\n lines.push(\"\");\n lines.push(\n `checks: ${report.counts.pass} pass, ${report.counts.fail} fail, ${report.counts.skip} skip`,\n );\n lines.push(`OVERALL: ${report.overall}`);\n return lines.join(\"\\n\");\n}\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"runner.js","sourceRoot":"","sources":["../src/runner.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAEH,OAAO,EAAE,KAAK,EAAuC,MAAM,oBAAoB,CAAC;AAChF,OAAO,EAAE,eAAe,EAAkB,MAAM,eAAe,CAAC;AAEhE,OAAO,EACL,cAAc,EACd,aAAa,GAKd,MAAM,eAAe,CAAC;AAoCvB;;;;;;GAMG;AACH,MAAM,CAAC,MAAM,qBAAqB,GAAsB;IACtD,MAAM;IACN,MAAM;IACN,MAAM;IACN,QAAQ;IACR,UAAU;IACV,QAAQ;IACR,KAAK;IACL,MAAM;IACN,gEAAgE;IAChE,YAAY;IACZ,aAAa;IACb,QAAQ;IACR,SAAS;IACT,SAAS;CACV,CAAC;AAEF;;;;;;;;;;;GAWG;AACH,MAAM,UAAU,WAAW,CACzB,IAAgE,EAChE,YAA+B,OAAO,CAAC,GAAG;IAE1C,MAAM,GAAG,GAA2B,EAAE,CAAC;IACvC,IAAI,IAAI,CAAC,UAAU,KAAK,IAAI,EAAE,CAAC;QAC7B,KAAK,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,SAAS,CAAC,EAAE,CAAC;YAC/C,IAAI,OAAO,CAAC,KAAK,QAAQ;gBAAE,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC;QACxC,CAAC;IACH,CAAC;SAAM,CAAC;QACN,MAAM,KAAK,GAAG,IAAI,GAAG,CAAS,CAAC,GAAG,qBAAqB,EAAE,GAAG,CAAC,IAAI,CAAC,YAAY,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;QACxF,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;YACzB,MAAM,CAAC,GAAG,SAAS,CAAC,IAAI,CAAC,CAAC;YAC1B,IAAI,OAAO,CAAC,KAAK,QAAQ;gBAAE,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QAC3C,CAAC;IACH,CAAC;IACD,gEAAgE;IAChE,IAAI,IAAI,CAAC,GAAG,EAAE,CAAC;QACb,KAAK,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC;YAAE,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC;IAC5D,CAAC;IACD,OAAO,GAAG,CAAC;AACb,CAAC;AAED,iDAAiD;AACjD,MAAM,OAAO,YAAa,SAAQ,KAAK;IAEnB;IACA;IAFlB,YACkB,OAAgB,EAChB,SAAiB;QAEjC,KAAK,CAAC,6BAA6B,OAAO,CAAC,EAAE,KAAK,OAAO,CAAC,EAAE,YAAY,SAAS,IAAI,CAAC,CAAC;QAHvE,YAAO,GAAP,OAAO,CAAS;QAChB,cAAS,GAAT,SAAS,CAAQ;QAGjC,IAAI,CAAC,IAAI,GAAG,cAAc,CAAC;IAC7B,CAAC;CACF;AAED,4EAA4E;AAC5E,MAAM,OAAO,aAAc,SAAQ,KAAK;IAGpB;IAFlB,YACE,OAAe,EACC,MAAc;QAE9B,KAAK,CAAC,OAAO,CAAC,CAAC;QAFC,WAAM,GAAN,MAAM,CAAQ;QAG9B,IAAI,CAAC,IAAI,GAAG,eAAe,CAAC;IAC9B,CAAC;CACF;AAQD,MAAM,kBAAkB,GAAG,MAAM,CAAC;AAElC,+EAA+E;AAC/E,MAAM,UAAU,GAAG,CAAC,IAAI,EAAE,CAAC;AAE3B;;;;GAIG;AACH,MAAM,eAAe,GAAG,CAAC,IAAI,EAAE,CAAC;AAEhC;;;;GAIG;AACH,MAAM,OAAO,MAAM;IACA,KAAK,CAAiC;IACtC,EAAE,CAAY;IACd,OAAO,GAAG,IAAI,GAAG,EAAmB,CAAC;IACrC,SAAS,CAAS;IAC3B,MAAM,GAAG,CAAC,CAAC;IACX,SAAS,GAAG,EAAE,CAAC;IACf,MAAM,GAAG,KAAK,CAAC;IACf,KAAK,CAAoB;IAChB,QAAQ,CAA0B;IAEnD,YAAY,IAAmB;QAC7B,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC,QAAQ,CAAC;QAC9B,IAAI,IAAI,CAAC,OAAO,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YAC9B,MAAM,IAAI,KAAK,CAAC,gDAAgD,CAAC,CAAC;QACpE,CAAC;QACD,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC,SAAS,IAAI,kBAAkB,CAAC;QAEtD,MAAM,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC,GAAG,IAAI,CAAC,OAAO,CAAC;QACpC,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC,GAAa,EAAE,IAAI,EAAE;YACtC,GAAG,EAAE,IAAI,CAAC,GAAG;YACb,yEAAyE;YACzE,GAAG,EAAE,WAAW,CAAC,IAAI,CAAC;YACtB,KAAK,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC;SAChC,CAAmC,CAAC;QAErC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,GAAG,EAAE,EAAE;YAC7B,IAAI,CAAC,OAAO,CAAC,IAAI,aAAa,CAAC,wBAAwB,GAAG,CAAC,OAAO,EAAE,EAAE,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC;QACzF,CAAC,CAAC,CAAC;QAEH,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,MAAM,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,EAAE;YACrC,IAAI,IAAI,CAAC,MAAM;gBAAE,OAAO;YACxB,MAAM,GAAG,GACP,MAAM,KAAK,IAAI,CAAC,CAAC,CAAC,yBAAyB,MAAM,EAAE,CAAC,CAAC,CAAC,wBAAwB,IAAI,EAAE,CAAC;YACvF,IAAI,CAAC,OAAO,CAAC,IAAI,aAAa,CAAC,GAAG,EAAE,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC;QACvD,CAAC,CAAC,CAAC;QAEH,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC;QACtC,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,EAAE,CAAC,MAAM,EAAE,CAAC,KAAa,EAAE,EAAE;YAC7C,IAAI,CAAC,SAAS,IAAI,KAAK,CAAC;YACxB,IAAI,IAAI,CAAC,SAAS,CAAC,MAAM,GAAG,UAAU,EAAE,CAAC;gBACvC,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC,UAAU,CAAC,CAAC;YACrD,CAAC;YACD,IAAI,IAAI,CAAC,QAAQ,EAAE,CAAC;gBAClB,KAAK,MAAM,IAAI,IAAI,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC;oBACrC,IAAI,IAAI,CAAC,MAAM,GAAG,CAAC;wBAAE,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;gBAC3C,CAAC;YACH,CAAC;QACH,CAAC,CAAC,CAAC;QAEH,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC;QACtC,sEAAsE;QACtE,IAAI,CAAC,EAAE,GAAG,eAAe,CAAC,EAAE,KAAK,EAAE,IAAI,CAAC,KAAK,CAAC,MAAM,EAAE,SAAS,EAAE,QAAQ,EAAE,CAAC,CAAC;QAC7E,IAAI,CAAC,EAAE,CAAC,EAAE,CAAC,MAAM,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC;IAClD,CAAC;IAED,gEAAgE;IAChE,IAAI,MAAM;QACR,OAAO,IAAI,CAAC,SAAS,CAAC;IACxB,CAAC;IAEO,MAAM,CAAC,IAAY;QACzB,IAAI,IAAI,CAAC,IAAI,EAAE,CAAC,MAAM,KAAK,CAAC;YAAE,OAAO;QACrC,0EAA0E;QAC1E,uEAAuE;QACvE,0DAA0D;QAC1D,IAAI,IAAI,CAAC,MAAM,GAAG,eAAe,EAAE,CAAC;YAClC,IAAI,CAAC,cAAc,CAAC,4BAA4B,eAAe,iBAAiB,CAAC,CAAC;YAClF,OAAO;QACT,CAAC;QACD,IAAI,IAAc,CAAC;QACnB,IAAI,CAAC;YACH,IAAI,GAAG,cAAc,CAAC,IAAI,CAAC,CAAC;QAC9B,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,0EAA0E;YAC1E,2EAA2E;YAC3E,4EAA4E;YAC5E,2EAA2E;YAC3E,MAAM,EAAE,GAAG,GAAoB,CAAC;YAChC,IAAI,CAAC,cAAc,CAAC,qCAAqC,EAAE,CAAC,OAAO,EAAE,CAAC,CAAC;YACvE,OAAO;QACT,CAAC;QACD,MAAM,KAAK,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QACxC,IAAI,KAAK,KAAK,SAAS,EAAE,CAAC;YACxB,gEAAgE;YAChE,OAAO;QACT,CAAC;QACD,YAAY,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;QAC1B,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QAC7B,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;IACtB,CAAC;IAED;;;;OAIG;IACK,cAAc,CAAC,MAAc;QACnC,MAAM,IAAI,GAAG,WAAW,MAAM,EAAE,CAAC;QACjC,IAAI,CAAC,SAAS,IAAI,IAAI,GAAG,IAAI,CAAC;QAC9B,IAAI,IAAI,CAAC,SAAS,CAAC,MAAM,GAAG,UAAU,EAAE,CAAC;YACvC,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC,UAAU,CAAC,CAAC;QACrD,CAAC;QACD,IAAI,IAAI,CAAC,QAAQ;YAAE,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;IACzC,CAAC;IAEO,OAAO,CAAC,GAAU;QACxB,IAAI,IAAI,CAAC,KAAK,KAAK,SAAS;YAAE,IAAI,CAAC,KAAK,GAAG,GAAG,CAAC;QAC/C,KAAK,MAAM,CAAC,EAAE,CAAC,CAAC,IAAI,IAAI,CAAC,OAAO,EAAE,CAAC;YACjC,YAAY,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC;YACtB,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;QAChB,CAAC;QACD,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE,CAAC;IACvB,CAAC;IAED;;;OAGG;IACH,IAAI,CAAC,GAAiB;QACpB,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC;YAChB,OAAO,OAAO,CAAC,MAAM,CAAC,IAAI,KAAK,CAAC,kBAAkB,CAAC,CAAC,CAAC;QACvD,CAAC;QACD,IAAI,IAAI,CAAC,KAAK,KAAK,SAAS,EAAE,CAAC;YAC7B,OAAO,OAAO,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QACpC,CAAC;QACD,MAAM,EAAE,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC;QACzB,MAAM,IAAI,GAAG,EAAE,GAAG,GAAG,EAAE,EAAE,EAAa,CAAC;QAEvC,OAAO,IAAI,OAAO,CAAW,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;YAC/C,MAAM,KAAK,GAAG,UAAU,CAAC,GAAG,EAAE;gBAC5B,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;gBACxB,MAAM,CAAC,IAAI,YAAY,CAAC,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC;YACjD,CAAC,EAAE,IAAI,CAAC,SAAS,CAAC,CAAC;YACnB,0DAA0D;YAC1D,IAAI,OAAO,KAAK,CAAC,KAAK,KAAK,UAAU;gBAAE,KAAK,CAAC,KAAK,EAAE,CAAC;YAErD,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE,EAAE,EAAE,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC,CAAC;YAEjD,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,KAAK,CAAC,aAAa,CAAC,IAAI,CAAC,EAAE,CAAC,GAAG,EAAE,EAAE;gBAClD,IAAI,GAAG,EAAE,CAAC;oBACR,YAAY,CAAC,KAAK,CAAC,CAAC;oBACpB,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;oBACxB,MAAM,CAAC,IAAI,aAAa,CAAC,wBAAwB,GAAG,CAAC,OAAO,EAAE,EAAE,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC;gBACnF,CAAC;YACH,CAAC,CAAC,CAAC;QACL,CAAC,CAAC,CAAC;IACL,CAAC;IAED;;;;;;;;;;;;;;;;;OAiBG;IACH,KAAK,CAAC,QAAQ,CAAC,IAA6B,EAAE,WAAW,GAAG,EAAE;QAC5D,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC,CAAC;QACnD,MAAM,OAAO,GAAe,IAAI,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QACnD,IAAI,IAAI,GAAG,CAAC,CAAC;QACb,IAAI,UAA6B,CAAC;QAElC,MAAM,MAAM,GAAG,KAAK,IAAmB,EAAE;YACvC,OAAO,UAAU,KAAK,SAAS,EAAE,CAAC;gBAChC,MAAM,CAAC,GAAG,IAAI,EAAE,CAAC;gBACjB,IAAI,CAAC,IAAI,IAAI,CAAC,MAAM;oBAAE,OAAO;gBAC7B,IAAI,CAAC;oBACH,OAAO,CAAC,CAAC,CAAC,GAAG,MAAM,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAiB,CAAC,CAAC;gBACxD,CAAC;gBAAC,OAAO,GAAG,EAAE,CAAC;oBACb,mEAAmE;oBACnE,8DAA8D;oBAC9D,IAAI,UAAU,KAAK,SAAS;wBAAE,UAAU,GAAG,GAAY,CAAC;oBACxD,OAAO;gBACT,CAAC;YACH,CAAC;QACH,CAAC,CAAC;QAEF,MAAM,OAAO,GAAoB,EAAE,CAAC;QACpC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,KAAK,EAAE,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;YACtD,OAAO,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC,CAAC;QACzB,CAAC;QACD,MAAM,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;QAC3B,IAAI,UAAU,KAAK,SAAS;YAAE,MAAM,UAAU,CAAC;QAC/C,OAAO,OAAO,CAAC;IACjB,CAAC;IAED;;;OAGG;IACH,KAAK,CAAC,KAAK,CAAC,OAAO,GAAG,GAAG;QACvB,IAAI,IAAI,CAAC,MAAM;YAAE,OAAO;QACxB,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC;QAEnB,IAAI,CAAC,EAAE,CAAC,KAAK,EAAE,CAAC;QAChB,IAAI,CAAC;YACH,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC;QACzB,CAAC;QAAC,MAAM,CAAC;YACP,oBAAoB;QACtB,CAAC;QAED,MAAM,MAAM,GAAG,IAAI,OAAO,CAAO,CAAC,OAAO,EAAE,EAAE;YAC3C,IAAI,IAAI,CAAC,KAAK,CAAC,QAAQ,KAAK,IAAI,IAAI,IAAI,CAAC,KAAK,CAAC,UAAU,KAAK,IAAI,EAAE,CAAC;gBACnE,OAAO,EAAE,CAAC;gBACV,OAAO;YACT,CAAC;YACD,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,EAAE,GAAG,EAAE,CAAC,OAAO,EAAE,CAAC,CAAC;QAC3C,CAAC,CAAC,CAAC;QAEH,MAAM,KAAK,GAAG,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,EAAE,KAAK,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;QAE9F,IAAI,CAAC,KAAK,IAAI,IAAI,CAAC,KAAK,CAAC,QAAQ,KAAK,IAAI,EAAE,CAAC;YAC3C,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;YAC3B,MAAM,MAAM,GAAG,MAAM,OAAO,CAAC,IAAI,CAAC;gBAChC,MAAM,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC;gBACvB,KAAK,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,KAAK,CAAC;aACjC,CAAC,CAAC;YACH,IAAI,CAAC,MAAM,IAAI,IAAI,CAAC,KAAK,CAAC,QAAQ,KAAK,IAAI,EAAE,CAAC;gBAC5C,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;YAC7B,CAAC;QACH,CAAC;IACH,CAAC;CACF;AAED,SAAS,KAAK,CAAC,EAAU;IACvB,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE;QAC7B,MAAM,CAAC,GAAG,UAAU,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC;QAClC,IAAI,OAAO,CAAC,CAAC,KAAK,KAAK,UAAU;YAAE,CAAC,CAAC,KAAK,EAAE,CAAC;IAC/C,CAAC,CAAC,CAAC;AACL,CAAC"}
1
+ {"version":3,"file":"runner.js","sourceRoot":"","sources":["../src/runner.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * The SUT runner: spawns a user-provided implementation as a child process and\n * exchanges newline-delimited JSON requests/responses over stdin/stdout.\n *\n * Responsibilities:\n * - spawn the command, wire up a readline interface on its stdout,\n * - correlate responses to requests by `id`,\n * - enforce a per-request timeout,\n * - surface SUT crashes / stderr,\n * - tear the process down cleanly.\n *\n * Uses only node:child_process and node:readline. No cryptography here.\n */\n\nimport { spawn, type ChildProcessWithoutNullStreams } from \"node:child_process\";\nimport { createInterface, type Interface } from \"node:readline\";\n\nimport {\n decodeResponse,\n encodeRequest,\n ProtocolError,\n type Request,\n type RequestInput,\n type Response,\n} from \"./protocol.js\";\n\n/** Options for constructing a {@link Runner}. */\nexport interface RunnerOptions {\n /** Argv of the SUT, e.g. [\"node\", \"./my-impl.js\"]. First item is the bin. */\n command: readonly string[];\n /** Per-request timeout in milliseconds. */\n timeoutMs?: number;\n /** Working directory for the child process. */\n cwd?: string;\n /**\n * Extra environment variables for the SUT. These are layered ON TOP of the\n * scrubbed base env (see below) — they are the ONLY way to pass arbitrary\n * variables to a SUT unless {@link RunnerOptions.inheritEnv} is set.\n */\n env?: Record<string, string>;\n /**\n * Inherit the FULL parent environment (`process.env`) instead of the scrubbed\n * minimal env. **Default `false`.** The SUT is user-supplied code that Sieve\n * drives; inheriting the parent env hands it every secret in the harness's\n * environment (CI tokens, cloud creds, signing keys). Only enable this for\n * trusted, local implementations you control. See docs/audits/security.md Q-17\n * (CWE-526 / CWE-200).\n */\n inheritEnv?: boolean;\n /**\n * Additional environment variable NAMES to copy from `process.env` into the\n * scrubbed base env (allow-list extension). Has no effect when\n * {@link RunnerOptions.inheritEnv} is `true`. Values are read from the parent\n * env at spawn time; names absent from `process.env` are skipped.\n */\n envAllowlist?: readonly string[];\n /** Optional sink for the SUT's stderr lines (for diagnostics). */\n onStderr?: (line: string) => void;\n}\n\n/**\n * Minimal environment variables a child process generally needs to locate its\n * interpreter, resolve its home directory, and produce sane text output. This\n * is the default base env handed to the SUT — secrets in the parent env\n * (tokens, credentials) are NOT forwarded. Extend via\n * {@link RunnerOptions.envAllowlist} or pass explicit {@link RunnerOptions.env}.\n */\nexport const DEFAULT_ENV_ALLOWLIST: readonly string[] = [\n \"PATH\",\n \"HOME\",\n \"LANG\",\n \"LC_ALL\",\n \"LC_CTYPE\",\n \"TMPDIR\",\n \"TMP\",\n \"TEMP\",\n // Windows process-spawn essentials (harmless / empty on POSIX).\n \"SystemRoot\",\n \"SystemDrive\",\n \"windir\",\n \"PATHEXT\",\n \"COMSPEC\",\n];\n\n/**\n * Build the environment handed to the spawned SUT.\n *\n * By default this is a SCRUBBED, minimal env: only the names in\n * {@link DEFAULT_ENV_ALLOWLIST} (plus any in `opts.envAllowlist`) are copied\n * from the parent `process.env`, then `opts.env` is layered on top. This keeps\n * harness secrets out of untrusted SUT code (security.md Q-17). When\n * `opts.inheritEnv` is set, the full parent env is used instead (legacy /\n * trusted-local behavior).\n *\n * Exported for testing; the returned object never aliases `process.env`.\n */\nexport function buildSutEnv(\n opts: Pick<RunnerOptions, \"env\" | \"inheritEnv\" | \"envAllowlist\">,\n parentEnv: NodeJS.ProcessEnv = process.env,\n): Record<string, string> {\n const out: Record<string, string> = {};\n if (opts.inheritEnv === true) {\n for (const [k, v] of Object.entries(parentEnv)) {\n if (typeof v === \"string\") out[k] = v;\n }\n } else {\n const names = new Set<string>([...DEFAULT_ENV_ALLOWLIST, ...(opts.envAllowlist ?? [])]);\n for (const name of names) {\n const v = parentEnv[name];\n if (typeof v === \"string\") out[name] = v;\n }\n }\n // Explicit extra env always wins, even over an inherited value.\n if (opts.env) {\n for (const [k, v] of Object.entries(opts.env)) out[k] = v;\n }\n return out;\n}\n\n/** Thrown when a request exceeds its timeout. */\nexport class TimeoutError extends Error {\n constructor(\n public readonly request: Request,\n public readonly timeoutMs: number,\n ) {\n super(`SUT did not respond to id=${request.id} (${request.op}) within ${timeoutMs}ms`);\n this.name = \"TimeoutError\";\n }\n}\n\n/** Thrown when the SUT process dies before/while a request is in flight. */\nexport class SutCrashError extends Error {\n constructor(\n message: string,\n public readonly stderr: string,\n ) {\n super(message);\n this.name = \"SutCrashError\";\n }\n}\n\ninterface Pending {\n resolve: (r: Response) => void;\n reject: (e: Error) => void;\n timer: NodeJS.Timeout;\n}\n\nconst DEFAULT_TIMEOUT_MS = 10_000;\n\n/** Cap on retained stderr (and sidelined-stdout notes): most recent 64 KiB. */\nconst STDERR_CAP = 1 << 16;\n\n/**\n * Largest stdout line we will buffer/decode (64 KiB). A protocol response is\n * tiny; a longer line is a misbehaving or non-protocol SUT, so we sideline it\n * rather than buffer it without bound. Mirrors the stderr cap.\n */\nconst MAX_STDOUT_LINE = 1 << 16;\n\n/**\n * A long-lived handle to a spawned SUT. Construct once per test run, issue many\n * requests, then `close()`. Requests are matched to responses by `id`, so the\n * SUT MAY answer out of order, though in practice it answers serially.\n */\nexport class Runner {\n private readonly child: ChildProcessWithoutNullStreams;\n private readonly rl: Interface;\n private readonly pending = new Map<number, Pending>();\n private readonly timeoutMs: number;\n private nextId = 1;\n private stderrBuf = \"\";\n private closed = false;\n private fatal: Error | undefined;\n private readonly onStderr?: (line: string) => void;\n\n constructor(opts: RunnerOptions) {\n this.onStderr = opts.onStderr;\n if (opts.command.length === 0) {\n throw new Error(\"Runner: command must have at least one element\");\n }\n this.timeoutMs = opts.timeoutMs ?? DEFAULT_TIMEOUT_MS;\n\n const [bin, ...args] = opts.command;\n this.child = spawn(bin as string, args, {\n cwd: opts.cwd,\n // Scrubbed, minimal env by default — see buildSutEnv / security.md Q-17.\n env: buildSutEnv(opts),\n stdio: [\"pipe\", \"pipe\", \"pipe\"],\n }) as ChildProcessWithoutNullStreams;\n\n this.child.on(\"error\", (err) => {\n this.failAll(new SutCrashError(`failed to spawn SUT: ${err.message}`, this.stderrBuf));\n });\n\n this.child.on(\"exit\", (code, signal) => {\n if (this.closed) return;\n const why =\n signal !== null ? `SUT exited via signal ${signal}` : `SUT exited with code ${code}`;\n this.failAll(new SutCrashError(why, this.stderrBuf));\n });\n\n this.child.stderr.setEncoding(\"utf8\");\n this.child.stderr.on(\"data\", (chunk: string) => {\n this.stderrBuf += chunk;\n if (this.stderrBuf.length > STDERR_CAP) {\n this.stderrBuf = this.stderrBuf.slice(-STDERR_CAP);\n }\n if (this.onStderr) {\n for (const line of chunk.split(\"\\n\")) {\n if (line.length > 0) this.onStderr(line);\n }\n }\n });\n\n this.child.stdout.setEncoding(\"utf8\");\n // crlfDelay groups CRLF; the byte cap is enforced per-line in onLine.\n this.rl = createInterface({ input: this.child.stdout, crlfDelay: Infinity });\n this.rl.on(\"line\", (line) => this.onLine(line));\n }\n\n /** Stderr captured from the SUT so far (most recent 64 KiB). */\n get stderr(): string {\n return this.stderrBuf;\n }\n\n private onLine(line: string): void {\n if (line.trim().length === 0) return;\n // Cap the line we attempt to decode, mirroring the stderr cap. A SUT that\n // streams an unbounded line (or never emits a newline) must not let us\n // buffer it without limit before we sideline it as noise.\n if (line.length > MAX_STDOUT_LINE) {\n this.sidelineStdout(`SUT stdout line exceeded ${MAX_STDOUT_LINE} bytes; ignored`);\n return;\n }\n let resp: Response;\n try {\n resp = decodeResponse(line);\n } catch (err) {\n // An undecodable stdout line is NOT fatal: a SUT may legitimately print a\n // banner, log line, or progress note to stdout. We sideline it (surface it\n // via stderr/log) and keep going. Only a process `exit`/`error` poisons the\n // runner via failAll — a stray line must not abort an otherwise-valid run.\n const pe = err as ProtocolError;\n this.sidelineStdout(`ignored non-protocol stdout line: ${pe.message}`);\n return;\n }\n const entry = this.pending.get(resp.id);\n if (entry === undefined) {\n // Unsolicited / duplicate id — record but do not crash the run.\n return;\n }\n clearTimeout(entry.timer);\n this.pending.delete(resp.id);\n entry.resolve(resp);\n }\n\n /**\n * Record a stdout line we could not use (non-protocol banner, oversize line,\n * etc.). It is surfaced through the stderr buffer and the `onStderr` sink for\n * diagnostics, but never fails any request — see the `onLine` rationale.\n */\n private sidelineStdout(detail: string): void {\n const note = `[sieve] ${detail}`;\n this.stderrBuf += note + \"\\n\";\n if (this.stderrBuf.length > STDERR_CAP) {\n this.stderrBuf = this.stderrBuf.slice(-STDERR_CAP);\n }\n if (this.onStderr) this.onStderr(note);\n }\n\n private failAll(err: Error): void {\n if (this.fatal === undefined) this.fatal = err;\n for (const [, p] of this.pending) {\n clearTimeout(p.timer);\n p.reject(err);\n }\n this.pending.clear();\n }\n\n /**\n * Send one request and await its response. The `id` field is assigned by the\n * runner; any `id` on the passed object is overwritten.\n */\n send(req: RequestInput): Promise<Response> {\n if (this.closed) {\n return Promise.reject(new Error(\"Runner is closed\"));\n }\n if (this.fatal !== undefined) {\n return Promise.reject(this.fatal);\n }\n const id = this.nextId++;\n const full = { ...req, id } as Request;\n\n return new Promise<Response>((resolve, reject) => {\n const timer = setTimeout(() => {\n this.pending.delete(id);\n reject(new TimeoutError(full, this.timeoutMs));\n }, this.timeoutMs);\n // Do not keep the event loop alive solely for this timer.\n if (typeof timer.unref === \"function\") timer.unref();\n\n this.pending.set(id, { resolve, reject, timer });\n\n this.child.stdin.write(encodeRequest(full), (err) => {\n if (err) {\n clearTimeout(timer);\n this.pending.delete(id);\n reject(new SutCrashError(`write to SUT failed: ${err.message}`, this.stderrBuf));\n }\n });\n });\n }\n\n /**\n * Issue many INDEPENDENT requests with bounded concurrency (pipelining).\n *\n * The protocol is id-correlated (each response carries the request's `id`),\n * so multiple requests may be in flight against the SUT at once. This writes\n * up to `maxInFlight` requests before awaiting any response, refilling as each\n * completes, and returns results in the SAME ORDER as `reqs` (independent of\n * the order the SUT answers).\n *\n * CORRECTNESS CONSTRAINT: every request in `reqs` MUST be independent of the\n * others — no request may depend on another's response, and the SUT must not\n * carry cross-request state that ordering would expose. Dependent or\n * order-sensitive sequences (e.g. keygen→encaps→decaps for a single key, or\n * the timing category's isolated measurements) MUST use serial `send()`\n * instead. See docs/audits/performance.md §7.1.\n *\n * Setting `maxInFlight <= 1` degrades to strictly serial behavior.\n */\n async sendMany(reqs: readonly RequestInput[], maxInFlight = 16): Promise<Response[]> {\n const limit = Math.max(1, Math.floor(maxInFlight));\n const results: Response[] = new Array(reqs.length);\n let next = 0;\n let firstError: Error | undefined;\n\n const worker = async (): Promise<void> => {\n while (firstError === undefined) {\n const i = next++;\n if (i >= reqs.length) return;\n try {\n results[i] = await this.send(reqs[i] as RequestInput);\n } catch (err) {\n // Capture the first failure and stop launching new work; in-flight\n // siblings settle on their own (their results are discarded).\n if (firstError === undefined) firstError = err as Error;\n return;\n }\n }\n };\n\n const workers: Promise<void>[] = [];\n for (let w = 0; w < Math.min(limit, reqs.length); w++) {\n workers.push(worker());\n }\n await Promise.all(workers);\n if (firstError !== undefined) throw firstError;\n return results;\n }\n\n /**\n * Gracefully shut the SUT down: end stdin, wait briefly for a clean exit,\n * then SIGTERM, then SIGKILL. Idempotent.\n */\n async close(graceMs = 500): Promise<void> {\n if (this.closed) return;\n this.closed = true;\n\n this.rl.close();\n try {\n this.child.stdin.end();\n } catch {\n /* already closed */\n }\n\n const exited = new Promise<void>((resolve) => {\n if (this.child.exitCode !== null || this.child.signalCode !== null) {\n resolve();\n return;\n }\n this.child.once(\"exit\", () => resolve());\n });\n\n const timed = await Promise.race([exited.then(() => true), delay(graceMs).then(() => false)]);\n\n if (!timed && this.child.exitCode === null) {\n this.child.kill(\"SIGTERM\");\n const killed = await Promise.race([\n exited.then(() => true),\n delay(graceMs).then(() => false),\n ]);\n if (!killed && this.child.exitCode === null) {\n this.child.kill(\"SIGKILL\");\n }\n }\n }\n}\n\nfunction delay(ms: number): Promise<void> {\n return new Promise((resolve) => {\n const t = setTimeout(resolve, ms);\n if (typeof t.unref === \"function\") t.unref();\n });\n}\n"]}
package/dist/sizes.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"sizes.js","sourceRoot":"","sources":["../src/sizes.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"sizes.js","sourceRoot":"","sources":["../src/sizes.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;GAkBG;AAsEH;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;AACH,MAAM,KAAK,GAAsC;IAC/C,YAAY,EAAE;QACZ,MAAM,EAAE,QAAQ;QAChB,EAAE,EAAE,YAAY;QAChB,SAAS,EAAE,GAAG;QACd,SAAS,EAAE,IAAI;QACf,UAAU,EAAE,GAAG;QACf,YAAY,EAAE,EAAE;KACjB;IACD,YAAY,EAAE;QACZ,MAAM,EAAE,QAAQ;QAChB,EAAE,EAAE,YAAY;QAChB,SAAS,EAAE,IAAI;QACf,SAAS,EAAE,IAAI;QACf,UAAU,EAAE,IAAI;QAChB,YAAY,EAAE,EAAE;KACjB;IACD,aAAa,EAAE;QACb,MAAM,EAAE,QAAQ;QAChB,EAAE,EAAE,aAAa;QACjB,SAAS,EAAE,IAAI;QACf,SAAS,EAAE,IAAI;QACf,UAAU,EAAE,IAAI;QAChB,YAAY,EAAE,EAAE;KACjB;IACD,WAAW,EAAE;QACX,MAAM,EAAE,QAAQ;QAChB,EAAE,EAAE,WAAW;QACf,SAAS,EAAE,IAAI;QACf,SAAS,EAAE,IAAI;QACf,SAAS,EAAE,IAAI;KAChB;IACD,WAAW,EAAE;QACX,MAAM,EAAE,QAAQ;QAChB,EAAE,EAAE,WAAW;QACf,SAAS,EAAE,IAAI;QACf,SAAS,EAAE,IAAI;QACf,SAAS,EAAE,IAAI;KAChB;IACD,WAAW,EAAE;QACX,MAAM,EAAE,QAAQ;QAChB,EAAE,EAAE,WAAW;QACf,SAAS,EAAE,IAAI;QACf,SAAS,EAAE,IAAI;QACf,SAAS,EAAE,IAAI;KAChB;IAED,6EAA6E;IAC7E,mBAAmB,EAAE;QACnB,MAAM,EAAE,SAAS;QACjB,EAAE,EAAE,mBAAmB;QACvB,SAAS,EAAE,EAAE;QACb,SAAS,EAAE,EAAE;QACb,SAAS,EAAE,IAAI;KAChB;IACD,oBAAoB,EAAE;QACpB,MAAM,EAAE,SAAS;QACjB,EAAE,EAAE,oBAAoB;QACxB,SAAS,EAAE,EAAE;QACb,SAAS,EAAE,EAAE;QACb,SAAS,EAAE,IAAI;KAChB;IACD,mBAAmB,EAAE;QACnB,MAAM,EAAE,SAAS;QACjB,EAAE,EAAE,mBAAmB;QACvB,SAAS,EAAE,EAAE;QACb,SAAS,EAAE,EAAE;QACb,SAAS,EAAE,KAAK;KACjB;IACD,oBAAoB,EAAE;QACpB,MAAM,EAAE,SAAS;QACjB,EAAE,EAAE,oBAAoB;QACxB,SAAS,EAAE,EAAE;QACb,SAAS,EAAE,EAAE;QACb,SAAS,EAAE,KAAK;KACjB;IACD,mBAAmB,EAAE;QACnB,MAAM,EAAE,SAAS;QACjB,EAAE,EAAE,mBAAmB;QACvB,SAAS,EAAE,EAAE;QACb,SAAS,EAAE,EAAE;QACb,SAAS,EAAE,KAAK;KACjB;IACD,oBAAoB,EAAE;QACpB,MAAM,EAAE,SAAS;QACjB,EAAE,EAAE,oBAAoB;QACxB,SAAS,EAAE,EAAE;QACb,SAAS,EAAE,EAAE;QACb,SAAS,EAAE,KAAK;KACjB;IACD,mBAAmB,EAAE;QACnB,MAAM,EAAE,SAAS;QACjB,EAAE,EAAE,mBAAmB;QACvB,SAAS,EAAE,EAAE;QACb,SAAS,EAAE,EAAE;QACb,SAAS,EAAE,KAAK;KACjB;IACD,oBAAoB,EAAE;QACpB,MAAM,EAAE,SAAS;QACjB,EAAE,EAAE,oBAAoB;QACxB,SAAS,EAAE,EAAE;QACb,SAAS,EAAE,EAAE;QACb,SAAS,EAAE,KAAK;KACjB;IACD,mBAAmB,EAAE;QACnB,MAAM,EAAE,SAAS;QACjB,EAAE,EAAE,mBAAmB;QACvB,SAAS,EAAE,EAAE;QACb,SAAS,EAAE,GAAG;QACd,SAAS,EAAE,KAAK;KACjB;IACD,oBAAoB,EAAE;QACpB,MAAM,EAAE,SAAS;QACjB,EAAE,EAAE,oBAAoB;QACxB,SAAS,EAAE,EAAE;QACb,SAAS,EAAE,GAAG;QACd,SAAS,EAAE,KAAK;KACjB;IACD,mBAAmB,EAAE;QACnB,MAAM,EAAE,SAAS;QACjB,EAAE,EAAE,mBAAmB;QACvB,SAAS,EAAE,EAAE;QACb,SAAS,EAAE,GAAG;QACd,SAAS,EAAE,KAAK;KACjB;IACD,oBAAoB,EAAE;QACpB,MAAM,EAAE,SAAS;QACjB,EAAE,EAAE,oBAAoB;QACxB,SAAS,EAAE,EAAE;QACb,SAAS,EAAE,GAAG;QACd,SAAS,EAAE,KAAK;KACjB;CACF,CAAC;AAEF,+DAA+D;AAC/D,MAAM,CAAC,MAAM,UAAU,GAAwB,MAAM,CAAC,IAAI,CAAC,KAAK,CAAe,CAAC;AAEhF,gEAAgE;AAChE,MAAM,UAAU,UAAU,CAAC,CAAS;IAClC,OAAO,MAAM,CAAC,SAAS,CAAC,cAAc,CAAC,IAAI,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC;AACxD,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,QAAQ,CAAC,EAAY;IACnC,MAAM,KAAK,GAAG,KAAK,CAAC,EAAE,CAAC,CAAC;IACxB,IAAI,KAAK,KAAK,SAAS,EAAE,CAAC;QACxB,MAAM,IAAI,UAAU,CAAC,0BAA0B,EAAE,EAAE,CAAC,CAAC;IACvD,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC;AAED,wDAAwD;AACxD,MAAM,UAAU,UAAU,CAAC,CAAQ;IACjC,OAAO,CAAC,CAAC,MAAM,KAAK,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;AAC/C,CAAC;AAED,wDAAwD;AACxD,MAAM,UAAU,UAAU,CAAC,CAAQ;IACjC,OAAO,CAAC,CAAC,MAAM,KAAK,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;AAC/C,CAAC;AAED,4DAA4D;AAC5D,MAAM,UAAU,aAAa,CAAC,CAAQ;IACpC,OAAO,CAAC,CAAC,MAAM,KAAK,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;AAChD,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,gBAAgB,CAAC,CAAQ;IACvC,OAAO,CAAC,CAAC,MAAM,KAAK,QAAQ,IAAI,CAAC,CAAC,MAAM,KAAK,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;AACzE,CAAC","sourcesContent":["/**\n * Public parameter-size tables for ML-KEM (FIPS 203), ML-DSA (FIPS 204), and\n * SLH-DSA (FIPS 205).\n *\n * These are the ONLY hard-coded cryptographic constants in Sieve. They are\n * public, standardized byte lengths — not secret Known-Answer-Test values.\n * Sieve uses them purely to check that a system-under-test (SUT) emits\n * artifacts of the correct shape; it never derives or fabricates the bytes\n * themselves.\n *\n * Sources:\n * - ML-KEM: NIST FIPS 203, Table 3 (sizes of key/ciphertext byte strings).\n * - ML-DSA: NIST FIPS 204, Table 2 (sizes of key/signature byte strings).\n * - SLH-DSA: NIST FIPS 205, Table 2 (parameter sets) — pk = 2n, sk = 4n,\n * signature lengths per set. The 12 standardized sets pair each of\n * six (security level × s/f) combinations with a SHA2 or SHAKE\n * hash; the public sizes depend only on the level×s/f, so the\n * SHA2 and SHAKE variants share sizes.\n */\n\n/** Algorithm families Sieve knows how to drive. */\nexport type Family = \"ml-kem\" | \"ml-dsa\" | \"slh-dsa\";\n\n/** Canonical parameter-set identifiers accepted on the CLI / API. */\nexport type ParamSet =\n | \"ml-kem-512\"\n | \"ml-kem-768\"\n | \"ml-kem-1024\"\n | \"ml-dsa-44\"\n | \"ml-dsa-65\"\n | \"ml-dsa-87\"\n | \"slh-dsa-sha2-128s\"\n | \"slh-dsa-shake-128s\"\n | \"slh-dsa-sha2-128f\"\n | \"slh-dsa-shake-128f\"\n | \"slh-dsa-sha2-192s\"\n | \"slh-dsa-shake-192s\"\n | \"slh-dsa-sha2-192f\"\n | \"slh-dsa-shake-192f\"\n | \"slh-dsa-sha2-256s\"\n | \"slh-dsa-shake-256s\"\n | \"slh-dsa-sha2-256f\"\n | \"slh-dsa-shake-256f\";\n\n/** Byte sizes for an ML-KEM parameter set (FIPS 203, Table 3). */\nexport interface KemSizes {\n readonly family: \"ml-kem\";\n readonly id: ParamSet;\n /** Encapsulation (public) key length in bytes. */\n readonly publicKey: number;\n /** Decapsulation (secret) key length in bytes. */\n readonly secretKey: number;\n /** Ciphertext length in bytes. */\n readonly ciphertext: number;\n /** Shared secret length in bytes (32 for every ML-KEM set). */\n readonly sharedSecret: number;\n}\n\n/** Byte sizes for an ML-DSA parameter set (FIPS 204, Table 2). */\nexport interface DsaSizes {\n readonly family: \"ml-dsa\";\n readonly id: ParamSet;\n /** Verification (public) key length in bytes. */\n readonly publicKey: number;\n /** Signing (secret) key length in bytes. */\n readonly secretKey: number;\n /** Signature length in bytes (fixed-length encoding). */\n readonly signature: number;\n}\n\n/** Byte sizes for an SLH-DSA parameter set (FIPS 205, Table 2). */\nexport interface SlhDsaSizes {\n readonly family: \"slh-dsa\";\n readonly id: ParamSet;\n /** Verification (public) key length in bytes (= 2·n). */\n readonly publicKey: number;\n /** Signing (secret) key length in bytes (= 4·n). */\n readonly secretKey: number;\n /** Signature length in bytes. */\n readonly signature: number;\n}\n\n/** Union of the size shapes. */\nexport type Sizes = KemSizes | DsaSizes | SlhDsaSizes;\n\n/** A signature-family size record (ML-DSA or SLH-DSA). */\nexport type SignatureSizes = DsaSizes | SlhDsaSizes;\n\n/**\n * The size table. Values are public, standardized constants.\n *\n * ML-KEM (FIPS 203, Table 3):\n * set pk sk ct ss\n * 512 800 1632 768 32\n * 768 1184 2400 1088 32\n * 1024 1568 3168 1568 32\n *\n * ML-DSA (FIPS 204, Table 2):\n * set pk sk sig\n * 44 1312 2560 2420\n * 65 1952 4032 3309\n * 87 2592 4896 4627\n *\n * SLH-DSA (FIPS 205, Table 2): pk = 2n, sk = 4n; signature length per set.\n * level/var n pk sk sig\n * 128s 16 32 64 7856\n * 128f 16 32 64 17088\n * 192s 24 48 96 16224\n * 192f 24 48 96 35664\n * 256s 32 64 128 29792\n * 256f 32 64 128 49856\n * (SHA2 and SHAKE variants of a given level/var share these public sizes.)\n */\nconst TABLE: Readonly<Record<ParamSet, Sizes>> = {\n \"ml-kem-512\": {\n family: \"ml-kem\",\n id: \"ml-kem-512\",\n publicKey: 800,\n secretKey: 1632,\n ciphertext: 768,\n sharedSecret: 32,\n },\n \"ml-kem-768\": {\n family: \"ml-kem\",\n id: \"ml-kem-768\",\n publicKey: 1184,\n secretKey: 2400,\n ciphertext: 1088,\n sharedSecret: 32,\n },\n \"ml-kem-1024\": {\n family: \"ml-kem\",\n id: \"ml-kem-1024\",\n publicKey: 1568,\n secretKey: 3168,\n ciphertext: 1568,\n sharedSecret: 32,\n },\n \"ml-dsa-44\": {\n family: \"ml-dsa\",\n id: \"ml-dsa-44\",\n publicKey: 1312,\n secretKey: 2560,\n signature: 2420,\n },\n \"ml-dsa-65\": {\n family: \"ml-dsa\",\n id: \"ml-dsa-65\",\n publicKey: 1952,\n secretKey: 4032,\n signature: 3309,\n },\n \"ml-dsa-87\": {\n family: \"ml-dsa\",\n id: \"ml-dsa-87\",\n publicKey: 2592,\n secretKey: 4896,\n signature: 4627,\n },\n\n // SLH-DSA (FIPS 205, Table 2). SHA2 and SHAKE share sizes per level/variant.\n \"slh-dsa-sha2-128s\": {\n family: \"slh-dsa\",\n id: \"slh-dsa-sha2-128s\",\n publicKey: 32,\n secretKey: 64,\n signature: 7856,\n },\n \"slh-dsa-shake-128s\": {\n family: \"slh-dsa\",\n id: \"slh-dsa-shake-128s\",\n publicKey: 32,\n secretKey: 64,\n signature: 7856,\n },\n \"slh-dsa-sha2-128f\": {\n family: \"slh-dsa\",\n id: \"slh-dsa-sha2-128f\",\n publicKey: 32,\n secretKey: 64,\n signature: 17088,\n },\n \"slh-dsa-shake-128f\": {\n family: \"slh-dsa\",\n id: \"slh-dsa-shake-128f\",\n publicKey: 32,\n secretKey: 64,\n signature: 17088,\n },\n \"slh-dsa-sha2-192s\": {\n family: \"slh-dsa\",\n id: \"slh-dsa-sha2-192s\",\n publicKey: 48,\n secretKey: 96,\n signature: 16224,\n },\n \"slh-dsa-shake-192s\": {\n family: \"slh-dsa\",\n id: \"slh-dsa-shake-192s\",\n publicKey: 48,\n secretKey: 96,\n signature: 16224,\n },\n \"slh-dsa-sha2-192f\": {\n family: \"slh-dsa\",\n id: \"slh-dsa-sha2-192f\",\n publicKey: 48,\n secretKey: 96,\n signature: 35664,\n },\n \"slh-dsa-shake-192f\": {\n family: \"slh-dsa\",\n id: \"slh-dsa-shake-192f\",\n publicKey: 48,\n secretKey: 96,\n signature: 35664,\n },\n \"slh-dsa-sha2-256s\": {\n family: \"slh-dsa\",\n id: \"slh-dsa-sha2-256s\",\n publicKey: 64,\n secretKey: 128,\n signature: 29792,\n },\n \"slh-dsa-shake-256s\": {\n family: \"slh-dsa\",\n id: \"slh-dsa-shake-256s\",\n publicKey: 64,\n secretKey: 128,\n signature: 29792,\n },\n \"slh-dsa-sha2-256f\": {\n family: \"slh-dsa\",\n id: \"slh-dsa-sha2-256f\",\n publicKey: 64,\n secretKey: 128,\n signature: 49856,\n },\n \"slh-dsa-shake-256f\": {\n family: \"slh-dsa\",\n id: \"slh-dsa-shake-256f\",\n publicKey: 64,\n secretKey: 128,\n signature: 49856,\n },\n};\n\n/** All known parameter-set identifiers, in canonical order. */\nexport const PARAM_SETS: readonly ParamSet[] = Object.keys(TABLE) as ParamSet[];\n\n/** Type guard: is `s` a recognized parameter-set identifier? */\nexport function isParamSet(s: string): s is ParamSet {\n return Object.prototype.hasOwnProperty.call(TABLE, s);\n}\n\n/**\n * Look up the size record for a parameter set.\n *\n * @throws {RangeError} if `id` is not a recognized parameter set.\n */\nexport function sizesFor(id: ParamSet): Sizes {\n const entry = TABLE[id];\n if (entry === undefined) {\n throw new RangeError(`unknown parameter set: ${id}`);\n }\n return entry;\n}\n\n/** Narrowing helper: KEM size record or `undefined`. */\nexport function asKemSizes(s: Sizes): KemSizes | undefined {\n return s.family === \"ml-kem\" ? s : undefined;\n}\n\n/** Narrowing helper: DSA size record or `undefined`. */\nexport function asDsaSizes(s: Sizes): DsaSizes | undefined {\n return s.family === \"ml-dsa\" ? s : undefined;\n}\n\n/** Narrowing helper: SLH-DSA size record or `undefined`. */\nexport function asSlhDsaSizes(s: Sizes): SlhDsaSizes | undefined {\n return s.family === \"slh-dsa\" ? s : undefined;\n}\n\n/**\n * Narrowing helper: any signature-family size record (ML-DSA or SLH-DSA) or\n * `undefined`. Both expose `publicKey`, `secretKey`, and `signature`.\n */\nexport function asSignatureSizes(s: Sizes): SignatureSizes | undefined {\n return s.family === \"ml-dsa\" || s.family === \"slh-dsa\" ? s : undefined;\n}\n"]}
package/dist/vectors.d.ts CHANGED
@@ -52,6 +52,25 @@ export interface DsaVerifyVector {
52
52
  }
53
53
  /** Any normalized vector. */
54
54
  export type Vector = KemKeygenVector | KemEncapVector | KemDecapVector | DsaVerifyVector;
55
+ /**
56
+ * Provenance of one ACVP vector file (docs/compliance/acvp-provenance.md): a
57
+ * content hash over the RAW bytes plus the declared source, so a passing `kat`
58
+ * run is traceable to the exact operator-supplied inputs. Sieve records what it
59
+ * was given; it never fetches or ships vectors (ADR-0004).
60
+ */
61
+ export interface VectorFileProvenance {
62
+ path: string;
63
+ sha256: string;
64
+ sizeBytes: number;
65
+ algorithm: string | null;
66
+ mode: string | null;
67
+ /** Parameter sets seen in the file. */
68
+ parameterSets: string[];
69
+ /** Operator-declared origin, or "unknown (operator-supplied)". */
70
+ sourceUrl: string;
71
+ /** Recognized test cases consumed from this file. */
72
+ casesUsed: number;
73
+ }
55
74
  /** Result of scanning a vectors directory. */
56
75
  export interface VectorSet {
57
76
  vectors: Vector[];
@@ -59,11 +78,10 @@ export interface VectorSet {
59
78
  files: string[];
60
79
  /** Non-fatal parse notes (unrecognized files/groups). */
61
80
  notes: string[];
81
+ /** Per-file provenance for every vector file used (kat traceability). */
82
+ provenance: VectorFileProvenance[];
83
+ /** True when the operator declared a source via `vectors-manifest.json`. */
84
+ provenanceDeclared: boolean;
62
85
  }
63
- /**
64
- * Load and normalize all `*.json` ACVP vector files in `dir`.
65
- *
66
- * @throws if `dir` does not exist or contains no readable JSON files.
67
- */
68
86
  export declare function loadVectors(dir: string): VectorSet;
69
87
  //# sourceMappingURL=vectors.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"vectors.d.ts","sourceRoot":"","sources":["../src/vectors.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAKH,OAAO,KAAK,EAAU,QAAQ,EAAE,MAAM,YAAY,CAAC;AAEnD,2DAA2D;AAC3D,MAAM,WAAW,eAAe;IAC9B,IAAI,EAAE,YAAY,CAAC;IACnB,KAAK,EAAE,QAAQ,CAAC;IAChB,4CAA4C;IAC5C,IAAI,CAAC,EAAE,UAAU,CAAC;IAClB,EAAE,EAAE,UAAU,CAAC;IACf,EAAE,EAAE,UAAU,CAAC;CAChB;AAED,yEAAyE;AACzE,MAAM,WAAW,cAAc;IAC7B,IAAI,EAAE,WAAW,CAAC;IAClB,KAAK,EAAE,QAAQ,CAAC;IAChB,EAAE,EAAE,UAAU,CAAC;IACf,+DAA+D;IAC/D,KAAK,CAAC,EAAE,UAAU,CAAC;IACnB,EAAE,EAAE,UAAU,CAAC;IACf,EAAE,EAAE,UAAU,CAAC;CAChB;AAED,gEAAgE;AAChE,MAAM,WAAW,cAAc;IAC7B,IAAI,EAAE,WAAW,CAAC;IAClB,KAAK,EAAE,QAAQ,CAAC;IAChB,EAAE,EAAE,UAAU,CAAC;IACf,EAAE,EAAE,UAAU,CAAC;IACf,EAAE,EAAE,UAAU,CAAC;CAChB;AAED,+EAA+E;AAC/E,MAAM,WAAW,eAAe;IAC9B,IAAI,EAAE,YAAY,CAAC;IACnB,KAAK,EAAE,QAAQ,CAAC;IAChB,EAAE,EAAE,UAAU,CAAC;IACf,GAAG,EAAE,UAAU,CAAC;IAChB,GAAG,EAAE,UAAU,CAAC;IAChB,QAAQ,EAAE,OAAO,CAAC;CACnB;AAED,6BAA6B;AAC7B,MAAM,MAAM,MAAM,GAAG,eAAe,GAAG,cAAc,GAAG,cAAc,GAAG,eAAe,CAAC;AAEzF,8CAA8C;AAC9C,MAAM,WAAW,SAAS;IACxB,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,4BAA4B;IAC5B,KAAK,EAAE,MAAM,EAAE,CAAC;IAChB,yDAAyD;IACzD,KAAK,EAAE,MAAM,EAAE,CAAC;CACjB;AA0JD;;;;GAIG;AACH,wBAAgB,WAAW,CAAC,GAAG,EAAE,MAAM,GAAG,SAAS,CAgClD"}
1
+ {"version":3,"file":"vectors.d.ts","sourceRoot":"","sources":["../src/vectors.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAOH,OAAO,KAAK,EAAU,QAAQ,EAAE,MAAM,YAAY,CAAC;AAEnD,2DAA2D;AAC3D,MAAM,WAAW,eAAe;IAC9B,IAAI,EAAE,YAAY,CAAC;IACnB,KAAK,EAAE,QAAQ,CAAC;IAChB,4CAA4C;IAC5C,IAAI,CAAC,EAAE,UAAU,CAAC;IAClB,EAAE,EAAE,UAAU,CAAC;IACf,EAAE,EAAE,UAAU,CAAC;CAChB;AAED,yEAAyE;AACzE,MAAM,WAAW,cAAc;IAC7B,IAAI,EAAE,WAAW,CAAC;IAClB,KAAK,EAAE,QAAQ,CAAC;IAChB,EAAE,EAAE,UAAU,CAAC;IACf,+DAA+D;IAC/D,KAAK,CAAC,EAAE,UAAU,CAAC;IACnB,EAAE,EAAE,UAAU,CAAC;IACf,EAAE,EAAE,UAAU,CAAC;CAChB;AAED,gEAAgE;AAChE,MAAM,WAAW,cAAc;IAC7B,IAAI,EAAE,WAAW,CAAC;IAClB,KAAK,EAAE,QAAQ,CAAC;IAChB,EAAE,EAAE,UAAU,CAAC;IACf,EAAE,EAAE,UAAU,CAAC;IACf,EAAE,EAAE,UAAU,CAAC;CAChB;AAED,+EAA+E;AAC/E,MAAM,WAAW,eAAe;IAC9B,IAAI,EAAE,YAAY,CAAC;IACnB,KAAK,EAAE,QAAQ,CAAC;IAChB,EAAE,EAAE,UAAU,CAAC;IACf,GAAG,EAAE,UAAU,CAAC;IAChB,GAAG,EAAE,UAAU,CAAC;IAChB,QAAQ,EAAE,OAAO,CAAC;CACnB;AAED,6BAA6B;AAC7B,MAAM,MAAM,MAAM,GAAG,eAAe,GAAG,cAAc,GAAG,cAAc,GAAG,eAAe,CAAC;AAEzF;;;;;GAKG;AACH,MAAM,WAAW,oBAAoB;IACnC,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,MAAM,CAAC;IACf,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC;IACpB,uCAAuC;IACvC,aAAa,EAAE,MAAM,EAAE,CAAC;IACxB,kEAAkE;IAClE,SAAS,EAAE,MAAM,CAAC;IAClB,qDAAqD;IACrD,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,8CAA8C;AAC9C,MAAM,WAAW,SAAS;IACxB,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,4BAA4B;IAC5B,KAAK,EAAE,MAAM,EAAE,CAAC;IAChB,yDAAyD;IACzD,KAAK,EAAE,MAAM,EAAE,CAAC;IAChB,yEAAyE;IACzE,UAAU,EAAE,oBAAoB,EAAE,CAAC;IACnC,4EAA4E;IAC5E,kBAAkB,EAAE,OAAO,CAAC;CAC7B;AA6JD,wBAAgB,WAAW,CAAC,GAAG,EAAE,MAAM,GAAG,SAAS,CAsElD"}
package/dist/vectors.js CHANGED
@@ -13,8 +13,10 @@
13
13
  *
14
14
  * Uses only node:fs. No cryptography.
15
15
  */
16
+ import { createHash } from "node:crypto";
16
17
  import { readdirSync, readFileSync, statSync } from "node:fs";
17
18
  import { join } from "node:path";
19
+ import { isParamSet } from "./sizes.js";
18
20
  function hexToBytes(hex) {
19
21
  const clean = hex.trim();
20
22
  if (clean.length === 0)
@@ -28,23 +30,15 @@ function hexToBytes(hex) {
28
30
  }
29
31
  return out;
30
32
  }
31
- /** Map an ACVP parameterSet string to our canonical ParamSet, or undefined. */
33
+ /** Map an ACVP parameterSet string to our canonical ParamSet, or undefined.
34
+ * ACVP uses e.g. "ML-KEM-768", "ML-DSA-65", "SLH-DSA-SHA2-128s" — lower-casing
35
+ * and `_`→`-` yields our canonical ids for all three families (incl. FIPS 205). */
32
36
  function normParam(family, raw) {
33
37
  if (typeof raw !== "string")
34
38
  return undefined;
35
39
  const s = raw.toLowerCase().replace(/_/g, "-");
36
- // ACVP uses e.g. "ML-KEM-768", "ML-DSA-65".
37
- const candidates = {
38
- "ml-kem-512": "ml-kem-512",
39
- "ml-kem-768": "ml-kem-768",
40
- "ml-kem-1024": "ml-kem-1024",
41
- "ml-dsa-44": "ml-dsa-44",
42
- "ml-dsa-65": "ml-dsa-65",
43
- "ml-dsa-87": "ml-dsa-87",
44
- };
45
- const hit = candidates[s];
46
- if (hit && hit.startsWith(family))
47
- return hit;
40
+ if (isParamSet(s) && s.startsWith(family))
41
+ return s;
48
42
  return undefined;
49
43
  }
50
44
  function asArray(v) {
@@ -65,11 +59,14 @@ function parseAcvpDocument(doc, notes, file) {
65
59
  const algorithm = str(root["algorithm"])?.toUpperCase() ?? "";
66
60
  const mode = str(root["mode"])?.toLowerCase() ?? "";
67
61
  const out = [];
62
+ // Order matters: "SLH-DSA" contains "DSA", so test SLH before the ML-DSA branch.
68
63
  const family = algorithm.includes("KEM")
69
64
  ? "ml-kem"
70
- : algorithm.includes("DSA")
71
- ? "ml-dsa"
72
- : undefined;
65
+ : algorithm.includes("SLH")
66
+ ? "slh-dsa"
67
+ : algorithm.includes("DSA")
68
+ ? "ml-dsa"
69
+ : undefined;
73
70
  if (family === undefined) {
74
71
  notes.push(`${file}: unrecognized algorithm "${algorithm}", skipped`);
75
72
  return out;
@@ -126,7 +123,7 @@ function parseAcvpDocument(doc, notes, file) {
126
123
  }
127
124
  }
128
125
  else {
129
- // ML-DSA: we can robustly check sigVer cases (no nonce dependence).
126
+ // ML-DSA / SLH-DSA: we can robustly check sigVer cases (verdict-driven).
130
127
  if (mode.includes("sigver") || ("signature" in t && "pk" in t)) {
131
128
  const expected = t["testPassed"];
132
129
  // NIST ACVP sigVer files mix valid and INTENTIONALLY-INVALID
@@ -174,35 +171,71 @@ function reqHex(t, ...keys) {
174
171
  *
175
172
  * @throws if `dir` does not exist or contains no readable JSON files.
176
173
  */
174
+ /** Operator-declared source manifest filename (not itself a vector file). */
175
+ const VECTORS_MANIFEST = "vectors-manifest.json";
177
176
  export function loadVectors(dir) {
178
177
  const st = statSync(dir); // throws ENOENT if missing
179
178
  if (!st.isDirectory()) {
180
179
  throw new Error(`--vectors path is not a directory: ${dir}`);
181
180
  }
182
- const entries = readdirSync(dir).filter((f) => f.toLowerCase().endsWith(".json"));
181
+ // Optional provenance manifest: `{ "sourceUrl": "https://…" }` declaring where
182
+ // the operator obtained these vectors. Absent → provenance is undeclared.
183
+ let declaredSource;
184
+ try {
185
+ const m = JSON.parse(readFileSync(join(dir, VECTORS_MANIFEST), "utf8"));
186
+ if (typeof m.sourceUrl === "string" && m.sourceUrl.trim())
187
+ declaredSource = m.sourceUrl.trim();
188
+ }
189
+ catch {
190
+ /* no manifest — provenanceDeclared stays false */
191
+ }
192
+ const entries = readdirSync(dir).filter((f) => f.toLowerCase().endsWith(".json") && f.toLowerCase() !== VECTORS_MANIFEST);
183
193
  if (entries.length === 0) {
184
194
  throw new Error(`no .json vector files found in ${dir}`);
185
195
  }
186
196
  const vectors = [];
187
197
  const files = [];
188
198
  const notes = [];
199
+ const provenance = [];
189
200
  for (const name of entries) {
190
201
  const path = join(dir, name);
202
+ // Hash the RAW bytes as supplied, before parsing — proves exactly what was used.
203
+ const raw = readFileSync(path);
204
+ const sha256 = createHash("sha256").update(raw).digest("hex");
191
205
  let doc;
192
206
  try {
193
- doc = JSON.parse(readFileSync(path, "utf8"));
207
+ doc = JSON.parse(raw.toString("utf8"));
194
208
  }
195
209
  catch (err) {
196
210
  notes.push(`${name}: not valid JSON (${err.message})`);
197
211
  continue;
198
212
  }
199
213
  files.push(name);
214
+ const before = vectors.length;
200
215
  // ACVP test-vector files may be a single object or an array of prompts.
201
216
  const docs = Array.isArray(doc) ? doc : [doc];
202
217
  for (const d of docs) {
203
218
  vectors.push(...parseAcvpDocument(d, notes, name));
204
219
  }
220
+ // Best-effort ACVP metadata for the provenance record.
221
+ const root = asObj(docs[0]);
222
+ const params = new Set();
223
+ for (const g of asArray(root["testGroups"])) {
224
+ const p = str(asObj(g)["parameterSet"]);
225
+ if (p)
226
+ params.add(p);
227
+ }
228
+ provenance.push({
229
+ path: name,
230
+ sha256,
231
+ sizeBytes: raw.length,
232
+ algorithm: str(root["algorithm"]) ?? null,
233
+ mode: str(root["mode"]) ?? null,
234
+ parameterSets: [...params],
235
+ sourceUrl: declaredSource ?? "unknown (operator-supplied)",
236
+ casesUsed: vectors.length - before,
237
+ });
205
238
  }
206
- return { vectors, files, notes };
239
+ return { vectors, files, notes, provenance, provenanceDeclared: declaredSource !== undefined };
207
240
  }
208
241
  //# sourceMappingURL=vectors.js.map