@veraanchor/verifier 0.0.0-stage → 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.
- package/CHANGELOG.md +22 -0
- package/CONTRIBUTING.md +33 -0
- package/LICENSE +21 -0
- package/NOTICE +4 -0
- package/README.md +263 -2
- package/SECURITY.md +21 -0
- package/dist/cli/commandV1.d.ts +5 -0
- package/dist/cli/commandV1.d.ts.map +1 -0
- package/dist/cli/commandV1.js +440 -0
- package/dist/cli/commandV1.js.map +1 -0
- package/dist/cli.d.ts +3 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +5 -0
- package/dist/cli.js.map +1 -0
- package/dist/contracts/verification.d.ts +77 -0
- package/dist/contracts/verification.d.ts.map +1 -0
- package/dist/contracts/verification.js +6 -0
- package/dist/contracts/verification.js.map +1 -0
- package/dist/crypto/sha3.d.ts +15 -0
- package/dist/crypto/sha3.d.ts.map +1 -0
- package/dist/crypto/sha3.js +27 -0
- package/dist/crypto/sha3.js.map +1 -0
- package/dist/crypto/streamSha3.d.ts +26 -0
- package/dist/crypto/streamSha3.d.ts.map +1 -0
- package/dist/crypto/streamSha3.js +52 -0
- package/dist/crypto/streamSha3.js.map +1 -0
- package/dist/hf/hashContractV1.d.ts +48 -0
- package/dist/hf/hashContractV1.d.ts.map +1 -0
- package/dist/hf/hashContractV1.js +185 -0
- package/dist/hf/hashContractV1.js.map +1 -0
- package/dist/index.d.ts +80 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +57 -0
- package/dist/index.js.map +1 -0
- package/dist/merkle/membership.d.ts +30 -0
- package/dist/merkle/membership.d.ts.map +1 -0
- package/dist/merkle/membership.js +105 -0
- package/dist/merkle/membership.js.map +1 -0
- package/dist/policy/contractV1.d.ts +37 -0
- package/dist/policy/contractV1.d.ts.map +1 -0
- package/dist/policy/contractV1.js +2 -0
- package/dist/policy/contractV1.js.map +1 -0
- package/dist/policy/evaluateV1.d.ts +24 -0
- package/dist/policy/evaluateV1.d.ts.map +1 -0
- package/dist/policy/evaluateV1.js +320 -0
- package/dist/policy/evaluateV1.js.map +1 -0
- package/dist/profiles/dataset/sourceV1.d.ts +22 -0
- package/dist/profiles/dataset/sourceV1.d.ts.map +1 -0
- package/dist/profiles/dataset/sourceV1.js +73 -0
- package/dist/profiles/dataset/sourceV1.js.map +1 -0
- package/dist/profiles/dataset/v1.d.ts +39 -0
- package/dist/profiles/dataset/v1.d.ts.map +1 -0
- package/dist/profiles/dataset/v1.js +362 -0
- package/dist/profiles/dataset/v1.js.map +1 -0
- package/dist/profiles/execution/contractV1.d.ts +279 -0
- package/dist/profiles/execution/contractV1.d.ts.map +1 -0
- package/dist/profiles/execution/contractV1.js +364 -0
- package/dist/profiles/execution/contractV1.js.map +1 -0
- package/dist/profiles/execution/independentStandardsV1.d.ts +44 -0
- package/dist/profiles/execution/independentStandardsV1.d.ts.map +1 -0
- package/dist/profiles/execution/independentStandardsV1.js +336 -0
- package/dist/profiles/execution/independentStandardsV1.js.map +1 -0
- package/dist/profiles/execution/reasonCodesV1.d.ts +30 -0
- package/dist/profiles/execution/reasonCodesV1.d.ts.map +1 -0
- package/dist/profiles/execution/reasonCodesV1.js +20 -0
- package/dist/profiles/execution/reasonCodesV1.js.map +1 -0
- package/dist/profiles/execution/recomputationV1.d.ts +11 -0
- package/dist/profiles/execution/recomputationV1.d.ts.map +1 -0
- package/dist/profiles/execution/recomputationV1.js +144 -0
- package/dist/profiles/execution/recomputationV1.js.map +1 -0
- package/dist/profiles/execution/rulesV1.d.ts +6 -0
- package/dist/profiles/execution/rulesV1.d.ts.map +1 -0
- package/dist/profiles/execution/rulesV1.js +855 -0
- package/dist/profiles/execution/rulesV1.js.map +1 -0
- package/dist/profiles/execution/standardsPlanV1.d.ts +18 -0
- package/dist/profiles/execution/standardsPlanV1.d.ts.map +1 -0
- package/dist/profiles/execution/standardsPlanV1.js +16 -0
- package/dist/profiles/execution/standardsPlanV1.js.map +1 -0
- package/dist/profiles/execution/verificationV1.d.ts +28 -0
- package/dist/profiles/execution/verificationV1.d.ts.map +1 -0
- package/dist/profiles/execution/verificationV1.js +188 -0
- package/dist/profiles/execution/verificationV1.js.map +1 -0
- package/dist/profiles/ingest/sourceV1.d.ts +36 -0
- package/dist/profiles/ingest/sourceV1.d.ts.map +1 -0
- package/dist/profiles/ingest/sourceV1.js +99 -0
- package/dist/profiles/ingest/sourceV1.js.map +1 -0
- package/dist/profiles/ingest/v1.d.ts +65 -0
- package/dist/profiles/ingest/v1.d.ts.map +1 -0
- package/dist/profiles/ingest/v1.js +477 -0
- package/dist/profiles/ingest/v1.js.map +1 -0
- package/dist/profiles/sourceV1Helpers.d.ts +48 -0
- package/dist/profiles/sourceV1Helpers.d.ts.map +1 -0
- package/dist/profiles/sourceV1Helpers.js +141 -0
- package/dist/profiles/sourceV1Helpers.js.map +1 -0
- package/dist/reports/coreV1.d.ts +7 -0
- package/dist/reports/coreV1.d.ts.map +1 -0
- package/dist/reports/coreV1.js +195 -0
- package/dist/reports/coreV1.js.map +1 -0
- package/dist/reports/portableV1.d.ts +48 -0
- package/dist/reports/portableV1.d.ts.map +1 -0
- package/dist/reports/portableV1.js +279 -0
- package/dist/reports/portableV1.js.map +1 -0
- package/dist/reports/validationV1.d.ts +19 -0
- package/dist/reports/validationV1.d.ts.map +1 -0
- package/dist/reports/validationV1.js +441 -0
- package/dist/reports/validationV1.js.map +1 -0
- package/dist/resolvers/executionMirrorV1.d.ts +15 -0
- package/dist/resolvers/executionMirrorV1.d.ts.map +1 -0
- package/dist/resolvers/executionMirrorV1.js +206 -0
- package/dist/resolvers/executionMirrorV1.js.map +1 -0
- package/dist/resolvers/explorerExecutionV1.d.ts +17 -0
- package/dist/resolvers/explorerExecutionV1.d.ts.map +1 -0
- package/dist/resolvers/explorerExecutionV1.js +61 -0
- package/dist/resolvers/explorerExecutionV1.js.map +1 -0
- package/dist/resolvers/explorerPublicV1.d.ts +37 -0
- package/dist/resolvers/explorerPublicV1.d.ts.map +1 -0
- package/dist/resolvers/explorerPublicV1.js +210 -0
- package/dist/resolvers/explorerPublicV1.js.map +1 -0
- package/dist/resolvers/explorerPublicationV1.d.ts +20 -0
- package/dist/resolvers/explorerPublicationV1.d.ts.map +1 -0
- package/dist/resolvers/explorerPublicationV1.js +195 -0
- package/dist/resolvers/explorerPublicationV1.js.map +1 -0
- package/dist/resolvers/explorerTransportV1.d.ts +17 -0
- package/dist/resolvers/explorerTransportV1.d.ts.map +1 -0
- package/dist/resolvers/explorerTransportV1.js +112 -0
- package/dist/resolvers/explorerTransportV1.js.map +1 -0
- package/dist/resolvers/hcs11MirrorV1.d.ts +49 -0
- package/dist/resolvers/hcs11MirrorV1.d.ts.map +1 -0
- package/dist/resolvers/hcs11MirrorV1.js +293 -0
- package/dist/resolvers/hcs11MirrorV1.js.map +1 -0
- package/dist/resolvers/hcs13MirrorV1.d.ts +35 -0
- package/dist/resolvers/hcs13MirrorV1.d.ts.map +1 -0
- package/dist/resolvers/hcs13MirrorV1.js +72 -0
- package/dist/resolvers/hcs13MirrorV1.js.map +1 -0
- package/dist/resolvers/hcs1MirrorV1.d.ts +28 -0
- package/dist/resolvers/hcs1MirrorV1.d.ts.map +1 -0
- package/dist/resolvers/hcs1MirrorV1.js +220 -0
- package/dist/resolvers/hcs1MirrorV1.js.map +1 -0
- package/dist/resolvers/hcs26MirrorV1.d.ts +67 -0
- package/dist/resolvers/hcs26MirrorV1.d.ts.map +1 -0
- package/dist/resolvers/hcs26MirrorV1.js +218 -0
- package/dist/resolvers/hcs26MirrorV1.js.map +1 -0
- package/dist/resolvers/hcs26RegistryMirrorV1.d.ts +26 -0
- package/dist/resolvers/hcs26RegistryMirrorV1.d.ts.map +1 -0
- package/dist/resolvers/hcs26RegistryMirrorV1.js +200 -0
- package/dist/resolvers/hcs26RegistryMirrorV1.js.map +1 -0
- package/dist/resolvers/hcs2MirrorV1.d.ts +26 -0
- package/dist/resolvers/hcs2MirrorV1.d.ts.map +1 -0
- package/dist/resolvers/hcs2MirrorV1.js +196 -0
- package/dist/resolvers/hcs2MirrorV1.js.map +1 -0
- package/dist/resolvers/hederaMirrorV1.d.ts +22 -0
- package/dist/resolvers/hederaMirrorV1.d.ts.map +1 -0
- package/dist/resolvers/hederaMirrorV1.js +338 -0
- package/dist/resolvers/hederaMirrorV1.js.map +1 -0
- package/dist/standards/hcs/hcs11V1.d.ts +51 -0
- package/dist/standards/hcs/hcs11V1.d.ts.map +1 -0
- package/dist/standards/hcs/hcs11V1.js +289 -0
- package/dist/standards/hcs/hcs11V1.js.map +1 -0
- package/dist/standards/hcs/hcs13V1.d.ts +39 -0
- package/dist/standards/hcs/hcs13V1.d.ts.map +1 -0
- package/dist/standards/hcs/hcs13V1.js +114 -0
- package/dist/standards/hcs/hcs13V1.js.map +1 -0
- package/dist/standards/hcs/hcs14V1.d.ts +35 -0
- package/dist/standards/hcs/hcs14V1.d.ts.map +1 -0
- package/dist/standards/hcs/hcs14V1.js +168 -0
- package/dist/standards/hcs/hcs14V1.js.map +1 -0
- package/dist/standards/hcs/hcs1V1.d.ts +30 -0
- package/dist/standards/hcs/hcs1V1.d.ts.map +1 -0
- package/dist/standards/hcs/hcs1V1.js +140 -0
- package/dist/standards/hcs/hcs1V1.js.map +1 -0
- package/dist/standards/hcs/hcs26V1.d.ts +58 -0
- package/dist/standards/hcs/hcs26V1.d.ts.map +1 -0
- package/dist/standards/hcs/hcs26V1.js +339 -0
- package/dist/standards/hcs/hcs26V1.js.map +1 -0
- package/dist/standards/hcs/hcs2V1.d.ts +36 -0
- package/dist/standards/hcs/hcs2V1.d.ts.map +1 -0
- package/dist/standards/hcs/hcs2V1.js +181 -0
- package/dist/standards/hcs/hcs2V1.js.map +1 -0
- package/dist/standards/hcs/jsonCanonicalV1.d.ts +15 -0
- package/dist/standards/hcs/jsonCanonicalV1.d.ts.map +1 -0
- package/dist/standards/hcs/jsonCanonicalV1.js +160 -0
- package/dist/standards/hcs/jsonCanonicalV1.js.map +1 -0
- package/dist/triangulation/compareV1.d.ts +50 -0
- package/dist/triangulation/compareV1.d.ts.map +1 -0
- package/dist/triangulation/compareV1.js +236 -0
- package/dist/triangulation/compareV1.js.map +1 -0
- package/dist/triangulation/executionPlanV1.d.ts +39 -0
- package/dist/triangulation/executionPlanV1.d.ts.map +1 -0
- package/dist/triangulation/executionPlanV1.js +208 -0
- package/dist/triangulation/executionPlanV1.js.map +1 -0
- package/dist/triangulation/executionPublicV1.d.ts +22 -0
- package/dist/triangulation/executionPublicV1.d.ts.map +1 -0
- package/dist/triangulation/executionPublicV1.js +39 -0
- package/dist/triangulation/executionPublicV1.js.map +1 -0
- package/dist/triangulation/messageObservationV1.d.ts +26 -0
- package/dist/triangulation/messageObservationV1.d.ts.map +1 -0
- package/dist/triangulation/messageObservationV1.js +69 -0
- package/dist/triangulation/messageObservationV1.js.map +1 -0
- package/dist/triangulation/publicV1.d.ts +29 -0
- package/dist/triangulation/publicV1.d.ts.map +1 -0
- package/dist/triangulation/publicV1.js +170 -0
- package/dist/triangulation/publicV1.js.map +1 -0
- package/dist/verification/sourceIntentV1.d.ts +15 -0
- package/dist/verification/sourceIntentV1.d.ts.map +1 -0
- package/dist/verification/sourceIntentV1.js +206 -0
- package/dist/verification/sourceIntentV1.js.map +1 -0
- package/docs/cli-v0.1.md +237 -0
- package/docs/conformance.md +38 -0
- package/docs/threat-model.md +37 -0
- package/docs/verification-semantics.md +65 -0
- package/examples/README.md +35 -0
- package/examples/dataset-offline.mjs +58 -0
- package/examples/dataset-policy.mjs +59 -0
- package/package.json +65 -4
|
@@ -0,0 +1,440 @@
|
|
|
1
|
+
import { randomUUID } from "node:crypto";
|
|
2
|
+
import { constants } from "node:fs";
|
|
3
|
+
import { link, lstat, open, realpath, unlink } from "node:fs/promises";
|
|
4
|
+
import { dirname, isAbsolute, join, relative, resolve, sep } from "node:path";
|
|
5
|
+
import { sourceV1Path } from "../profiles/sourceV1Helpers.js";
|
|
6
|
+
import { assessPortableVerificationPolicyV1, triangulateDatasetWithPolicyV1, triangulateIngestWithPolicyV1, verifyIngestWithPolicyV1, triangulateExecutionWithPolicyV1, verifyDatasetWithPolicyV1, verifyExecutionWithPolicyV1, verifyExecutionStandardsWithPolicyV1 } from "../policy/evaluateV1.js";
|
|
7
|
+
import { validatePortableVerificationReportV1 } from "../reports/validationV1.js";
|
|
8
|
+
const CLI_SCHEMA = "va.verifier-cli-result.v1";
|
|
9
|
+
const MAX_JSON_BYTES = 2 * 1024 * 1024;
|
|
10
|
+
const MAX_SOURCE_BYTES = 1024 * 1024 * 1024;
|
|
11
|
+
const MAX_FILES = 256;
|
|
12
|
+
const COMMANDS = {
|
|
13
|
+
"verify dataset": ["bundle", "sources", "source-root", "intent", "policy", "receipt",
|
|
14
|
+
"mode", "explorer-url", "mirror-url", "report-out"],
|
|
15
|
+
"verify execution": ["evidence", "intent", "policy", "verification-material",
|
|
16
|
+
"mode", "explorer-url", "mirror-url", "report-out"],
|
|
17
|
+
"verify ingest": ["bundle", "material", "source-root", "intent", "policy", "receipt",
|
|
18
|
+
"anchor-request-id", "mode", "explorer-url", "mirror-url", "report-out"],
|
|
19
|
+
"verify standards": ["evidence", "intent", "policy", "verification-material",
|
|
20
|
+
"mirror-url", "report-out"],
|
|
21
|
+
"report validate": ["report"],
|
|
22
|
+
"policy assess": ["report", "policy"],
|
|
23
|
+
};
|
|
24
|
+
class CliInputError extends Error {
|
|
25
|
+
}
|
|
26
|
+
function plainObject(value) {
|
|
27
|
+
if (!value || typeof value !== "object" || Array.isArray(value))
|
|
28
|
+
return false;
|
|
29
|
+
const prototype = Object.getPrototypeOf(value);
|
|
30
|
+
return prototype === null || prototype === Object.prototype;
|
|
31
|
+
}
|
|
32
|
+
function parseArgs(argv) {
|
|
33
|
+
const command = `${argv[0] ?? ""} ${argv[1] ?? ""}`;
|
|
34
|
+
if (!Object.hasOwn(COMMANDS, command))
|
|
35
|
+
throw new CliInputError("Unsupported command");
|
|
36
|
+
const allowed = COMMANDS[command];
|
|
37
|
+
const options = Object.create(null);
|
|
38
|
+
for (let i = 2; i < argv.length; i += 2) {
|
|
39
|
+
const flag = argv[i];
|
|
40
|
+
const value = argv[i + 1];
|
|
41
|
+
if (!flag?.startsWith("--") || !value || value.startsWith("--") || !allowed.includes(flag.slice(2))) {
|
|
42
|
+
throw new CliInputError("Unexpected option or missing value");
|
|
43
|
+
}
|
|
44
|
+
const key = flag.slice(2);
|
|
45
|
+
if (Object.hasOwn(options, key))
|
|
46
|
+
throw new CliInputError("Duplicate option");
|
|
47
|
+
options[key] = value;
|
|
48
|
+
}
|
|
49
|
+
const required = command === "verify dataset" ? ["bundle", "sources", "source-root", "intent", "policy"] :
|
|
50
|
+
command === "verify execution" ? ["evidence", "intent", "policy"] :
|
|
51
|
+
command === "verify ingest" ? ["bundle", "material", "intent", "policy"] :
|
|
52
|
+
command === "verify standards" ? ["evidence", "intent", "policy"] :
|
|
53
|
+
command === "report validate" ? ["report"] : ["report", "policy"];
|
|
54
|
+
if (required.some((key) => !Object.hasOwn(options, key)))
|
|
55
|
+
throw new CliInputError("Missing required option");
|
|
56
|
+
return { command, options };
|
|
57
|
+
}
|
|
58
|
+
function option(options, name) {
|
|
59
|
+
const selected = options[name];
|
|
60
|
+
if (!selected)
|
|
61
|
+
throw new CliInputError("Missing required option");
|
|
62
|
+
return selected;
|
|
63
|
+
}
|
|
64
|
+
/** Only bounded, regular local files may supply JSON metadata. */
|
|
65
|
+
async function readJson(path) {
|
|
66
|
+
const filename = resolve(path);
|
|
67
|
+
const stat = await lstat(filename);
|
|
68
|
+
if (!stat.isFile() || stat.size > MAX_JSON_BYTES)
|
|
69
|
+
throw new CliInputError("Invalid JSON input file");
|
|
70
|
+
const handle = await open(filename, constants.O_RDONLY | (process.platform === "win32" ? 0 : constants.O_NOFOLLOW));
|
|
71
|
+
try {
|
|
72
|
+
const opened = await handle.stat();
|
|
73
|
+
if (!opened.isFile() || opened.size > MAX_JSON_BYTES)
|
|
74
|
+
throw new CliInputError("Invalid JSON input file");
|
|
75
|
+
const bytes = await handle.readFile();
|
|
76
|
+
if (bytes.byteLength > MAX_JSON_BYTES)
|
|
77
|
+
throw new CliInputError("JSON input exceeds size limit");
|
|
78
|
+
return JSON.parse(new TextDecoder("utf-8", { fatal: true }).decode(bytes));
|
|
79
|
+
}
|
|
80
|
+
finally {
|
|
81
|
+
await handle.close();
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
function checkIntent(value, kind) {
|
|
85
|
+
if (!plainObject(value) || !plainObject(value.subject) || value.subject.kind !== kind ||
|
|
86
|
+
typeof value.subject.id !== "string" || !Array.isArray(value.expected)) {
|
|
87
|
+
throw new CliInputError("Invalid independent verification intent");
|
|
88
|
+
}
|
|
89
|
+
return value;
|
|
90
|
+
}
|
|
91
|
+
function checkPolicy(value) {
|
|
92
|
+
if (!plainObject(value) || !plainObject(value.subject) || !Array.isArray(value.required_checks)) {
|
|
93
|
+
throw new CliInputError("Invalid independent verification policy");
|
|
94
|
+
}
|
|
95
|
+
return value;
|
|
96
|
+
}
|
|
97
|
+
function sameSubject(intent, policy) {
|
|
98
|
+
if (policy.subject.kind !== intent.subject.kind || policy.subject.id !== intent.subject.id ||
|
|
99
|
+
policy.subject.hedera_network !== intent.subject.hedera_network) {
|
|
100
|
+
throw new CliInputError("Independent intent does not match policy subject");
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
/** No source path can escape the explicit root or traverse a symbolic link. */
|
|
104
|
+
async function sourceFile(root, relativePath) {
|
|
105
|
+
const name = sourceV1Path(relativePath, 1024);
|
|
106
|
+
const filename = join(root, ...name.split("/"));
|
|
107
|
+
const pathRelative = relative(root, filename);
|
|
108
|
+
if (isAbsolute(pathRelative) || pathRelative === ".." || pathRelative.startsWith(`..${sep}`)) {
|
|
109
|
+
throw new CliInputError("Source escapes specified root");
|
|
110
|
+
}
|
|
111
|
+
let part = root;
|
|
112
|
+
const segments = name.split("/");
|
|
113
|
+
for (const [index, segment] of segments.entries()) {
|
|
114
|
+
part = join(part, segment);
|
|
115
|
+
const stat = await lstat(part);
|
|
116
|
+
if (stat.isSymbolicLink() || (index < segments.length - 1 ? !stat.isDirectory() : !stat.isFile())) {
|
|
117
|
+
throw new CliInputError("Source must be a regular file under the specified root");
|
|
118
|
+
}
|
|
119
|
+
}
|
|
120
|
+
const actual = await realpath(filename);
|
|
121
|
+
const inside = relative(root, actual);
|
|
122
|
+
if (isAbsolute(inside) || inside === ".." || inside.startsWith(`..${sep}`)) {
|
|
123
|
+
throw new CliInputError("Source escapes specified root");
|
|
124
|
+
}
|
|
125
|
+
return filename;
|
|
126
|
+
}
|
|
127
|
+
async function* sourceStream(root, relativePath, budget) {
|
|
128
|
+
const filename = await sourceFile(root, relativePath);
|
|
129
|
+
const handle = await open(filename, constants.O_RDONLY | (process.platform === "win32" ? 0 : constants.O_NOFOLLOW));
|
|
130
|
+
try {
|
|
131
|
+
const stat = await handle.stat();
|
|
132
|
+
if (!stat.isFile() || stat.size > MAX_SOURCE_BYTES)
|
|
133
|
+
throw new CliInputError("Source file exceeds limit");
|
|
134
|
+
for await (const chunk of handle.createReadStream({ autoClose: false })) {
|
|
135
|
+
if (chunk.byteLength > budget.remaining)
|
|
136
|
+
throw new RangeError("Total source bytes exceed limit");
|
|
137
|
+
budget.remaining -= chunk.byteLength;
|
|
138
|
+
yield chunk;
|
|
139
|
+
}
|
|
140
|
+
}
|
|
141
|
+
finally {
|
|
142
|
+
await handle.close();
|
|
143
|
+
}
|
|
144
|
+
}
|
|
145
|
+
/** Shared bounded local file loader for Dataset and Ingest source material. */
|
|
146
|
+
async function sourcePaths(sourceRoot, paths) {
|
|
147
|
+
const rootArg = resolve(sourceRoot);
|
|
148
|
+
const rootStat = await lstat(rootArg);
|
|
149
|
+
if (!rootStat.isDirectory() || rootStat.isSymbolicLink())
|
|
150
|
+
throw new CliInputError("Invalid source root");
|
|
151
|
+
const root = await realpath(rootArg);
|
|
152
|
+
if (!Array.isArray(paths) || paths.length < 1 || paths.length > MAX_FILES) {
|
|
153
|
+
throw new CliInputError("Source paths must be a nonempty bounded array");
|
|
154
|
+
}
|
|
155
|
+
const files = [];
|
|
156
|
+
const unique = new Set();
|
|
157
|
+
const budget = { remaining: MAX_SOURCE_BYTES };
|
|
158
|
+
let total = 0;
|
|
159
|
+
for (const candidate of paths) {
|
|
160
|
+
const path_rel = sourceV1Path(candidate, 1024);
|
|
161
|
+
const identity = process.platform === "win32" ? path_rel.toLowerCase() : path_rel;
|
|
162
|
+
if (unique.has(identity))
|
|
163
|
+
throw new CliInputError("Duplicate source path");
|
|
164
|
+
unique.add(identity);
|
|
165
|
+
const filename = await sourceFile(root, path_rel);
|
|
166
|
+
const stat = await lstat(filename);
|
|
167
|
+
if (stat.size > MAX_SOURCE_BYTES - total)
|
|
168
|
+
throw new CliInputError("Total source bytes exceed limit");
|
|
169
|
+
total += stat.size;
|
|
170
|
+
files.push({ path_rel, source: sourceStream(root, path_rel, budget) });
|
|
171
|
+
}
|
|
172
|
+
return files;
|
|
173
|
+
}
|
|
174
|
+
async function datasetSources(options) {
|
|
175
|
+
const manifest = await readJson(option(options, "sources"));
|
|
176
|
+
if (!plainObject(manifest) || Object.keys(manifest).length !== 1 || !Array.isArray(manifest.paths)) {
|
|
177
|
+
throw new CliInputError("Sources manifest must contain a bounded paths array");
|
|
178
|
+
}
|
|
179
|
+
return sourcePaths(option(options, "source-root"), manifest.paths);
|
|
180
|
+
}
|
|
181
|
+
/** The CLI descriptor contains local paths, never source bytes, user URLs, or trusted commitments. */
|
|
182
|
+
async function ingestMaterial(options) {
|
|
183
|
+
const descriptor = await readJson(option(options, "material"));
|
|
184
|
+
if (!plainObject(descriptor))
|
|
185
|
+
throw new CliInputError("Invalid Ingest material descriptor");
|
|
186
|
+
const exact = (keys) => {
|
|
187
|
+
if (Object.keys(descriptor).some((key) => !keys.includes(key))) {
|
|
188
|
+
throw new CliInputError("Unknown Ingest material field");
|
|
189
|
+
}
|
|
190
|
+
};
|
|
191
|
+
if (descriptor.kind === "json") {
|
|
192
|
+
exact(["kind", "value"]);
|
|
193
|
+
if (!Object.hasOwn(descriptor, "value") || options["source-root"]) {
|
|
194
|
+
throw new CliInputError("Inline JSON material requires a value and no source root");
|
|
195
|
+
}
|
|
196
|
+
return { kind: "json", value: descriptor.value };
|
|
197
|
+
}
|
|
198
|
+
if (descriptor.kind === "text") {
|
|
199
|
+
exact(["kind", "text", "media_type"]);
|
|
200
|
+
if (typeof descriptor.text !== "string" || options["source-root"] ||
|
|
201
|
+
(descriptor.media_type !== undefined && descriptor.media_type !== null &&
|
|
202
|
+
(typeof descriptor.media_type !== "string" || !descriptor.media_type.trim() ||
|
|
203
|
+
descriptor.media_type.length > 256 || descriptor.media_type.trim() !== descriptor.media_type))) {
|
|
204
|
+
throw new CliInputError("Invalid inline text material");
|
|
205
|
+
}
|
|
206
|
+
return { kind: "text", text: descriptor.text,
|
|
207
|
+
...(descriptor.media_type === undefined || descriptor.media_type === null ? {} : { media_type: descriptor.media_type }) };
|
|
208
|
+
}
|
|
209
|
+
if (descriptor.kind === "file") {
|
|
210
|
+
exact(["kind", "path_rel"]);
|
|
211
|
+
const path_rel = sourceV1Path(descriptor.path_rel, 1024);
|
|
212
|
+
if (path_rel.includes("/"))
|
|
213
|
+
throw new CliInputError("Single-file Ingest requires a basename");
|
|
214
|
+
const files = await sourcePaths(option(options, "source-root"), [path_rel]);
|
|
215
|
+
return { kind: "file", file: files[0] };
|
|
216
|
+
}
|
|
217
|
+
if (descriptor.kind === "file_set") {
|
|
218
|
+
exact(["kind", "paths"]);
|
|
219
|
+
return { kind: "file_set", files: await sourcePaths(option(options, "source-root"), descriptor.paths) };
|
|
220
|
+
}
|
|
221
|
+
throw new CliInputError("Unsupported Ingest material kind");
|
|
222
|
+
}
|
|
223
|
+
/** Public Core anchor identity is separate from the independently selected Ingest source key. */
|
|
224
|
+
function ingestAnchor(options, mode) {
|
|
225
|
+
const id = options["anchor-request-id"];
|
|
226
|
+
if (mode === "offline") {
|
|
227
|
+
if (id !== undefined)
|
|
228
|
+
throw new CliInputError("Offline Ingest cannot select a public anchor");
|
|
229
|
+
return null;
|
|
230
|
+
}
|
|
231
|
+
if (!id || !/^[0-9a-f]{8}-[0-9a-f]{4}-[1-5][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/i.test(id)) {
|
|
232
|
+
throw new CliInputError("Public Ingest requires an independently selected Core anchor request UUID");
|
|
233
|
+
}
|
|
234
|
+
return id.toLowerCase();
|
|
235
|
+
}
|
|
236
|
+
/** Resolver endpoints are operator-controlled arguments, never fields from evidence.
|
|
237
|
+
* The resolvers independently enforce URL, transport and response bounds. */
|
|
238
|
+
function endpoint(value, kind) {
|
|
239
|
+
let url;
|
|
240
|
+
try {
|
|
241
|
+
url = new URL(value);
|
|
242
|
+
}
|
|
243
|
+
catch {
|
|
244
|
+
throw new CliInputError("Invalid resolver endpoint");
|
|
245
|
+
}
|
|
246
|
+
const loopback = url.hostname === "localhost" || url.hostname === "127.0.0.1" || url.hostname === "[::1]";
|
|
247
|
+
const pathname = kind === "explorer" ? url.pathname.replace(/\/$/, "") : url.pathname;
|
|
248
|
+
if ((url.protocol !== "https:" && !(loopback && url.protocol === "http:")) ||
|
|
249
|
+
url.username || url.password || url.search || url.hash ||
|
|
250
|
+
(kind === "explorer" ? pathname !== "" && pathname !== "/v1" : pathname !== "/api/v1")) {
|
|
251
|
+
throw new CliInputError("Resolver endpoint requires HTTPS and a supported API root (HTTP loopback permitted)");
|
|
252
|
+
}
|
|
253
|
+
return value;
|
|
254
|
+
}
|
|
255
|
+
/** Offline is the default. A public run requires explicit operator-selected
|
|
256
|
+
* endpoints and a network-scoped relying-party policy, never producer metadata. */
|
|
257
|
+
function verificationMode(options, intent, policy, reportKinds) {
|
|
258
|
+
const mode = options.mode ?? "offline";
|
|
259
|
+
if (mode !== "offline" && mode !== "public")
|
|
260
|
+
throw new CliInputError("Unsupported verification mode");
|
|
261
|
+
if (mode === "offline") {
|
|
262
|
+
if (options["explorer-url"] || options["mirror-url"] || policy.report_kind !== reportKinds.offline) {
|
|
263
|
+
throw new CliInputError("Offline verification does not accept public resolver options or policies");
|
|
264
|
+
}
|
|
265
|
+
return { mode };
|
|
266
|
+
}
|
|
267
|
+
const network = intent.subject.hedera_network;
|
|
268
|
+
if (policy.report_kind !== reportKinds.public || (network !== "mainnet" && network !== "testnet") ||
|
|
269
|
+
!options["explorer-url"]) {
|
|
270
|
+
throw new CliInputError("Public verification requires explicit network, public policy and Explorer origin");
|
|
271
|
+
}
|
|
272
|
+
const explorer = {
|
|
273
|
+
base_url: endpoint(options["explorer-url"], "explorer"),
|
|
274
|
+
};
|
|
275
|
+
const config = options["mirror-url"] ? {
|
|
276
|
+
explorer, mirror: { base_urls: { [network]: endpoint(options["mirror-url"], "mirror") } },
|
|
277
|
+
} : { explorer };
|
|
278
|
+
return { mode, config };
|
|
279
|
+
}
|
|
280
|
+
function statusCode(decision) {
|
|
281
|
+
return decision === "allow" || decision === "valid" ? 0 : decision === "review" ? 2 : 1;
|
|
282
|
+
}
|
|
283
|
+
/** Persist a complete standalone report with exclusive creation, not a CLI envelope.
|
|
284
|
+
* Linking a fully flushed sibling file avoids partial or overwritten reports. */
|
|
285
|
+
async function saveReport(path, report) {
|
|
286
|
+
if (validatePortableVerificationReportV1(report).status !== "valid") {
|
|
287
|
+
throw new Error("Verifier produced an invalid portable report");
|
|
288
|
+
}
|
|
289
|
+
const serialized = `${JSON.stringify(report)}\n`;
|
|
290
|
+
if (Buffer.byteLength(serialized, "utf8") > MAX_JSON_BYTES) {
|
|
291
|
+
throw new Error("Verifier report exceeds output size limit");
|
|
292
|
+
}
|
|
293
|
+
const destination = resolve(path);
|
|
294
|
+
const staging = join(dirname(destination), `.va-verifier-${randomUUID()}.tmp`);
|
|
295
|
+
let created = false;
|
|
296
|
+
try {
|
|
297
|
+
const handle = await open(staging, "wx", 0o600);
|
|
298
|
+
created = true;
|
|
299
|
+
try {
|
|
300
|
+
await handle.writeFile(serialized, "utf8");
|
|
301
|
+
await handle.sync();
|
|
302
|
+
}
|
|
303
|
+
finally {
|
|
304
|
+
await handle.close();
|
|
305
|
+
}
|
|
306
|
+
try {
|
|
307
|
+
// link() rejects an existing destination, including an existing symlink.
|
|
308
|
+
// Staging in the same directory guarantees a complete final file on success.
|
|
309
|
+
await link(staging, destination);
|
|
310
|
+
}
|
|
311
|
+
catch (error) {
|
|
312
|
+
if (error.code === "EEXIST") {
|
|
313
|
+
throw new CliInputError("Report output already exists");
|
|
314
|
+
}
|
|
315
|
+
throw error;
|
|
316
|
+
}
|
|
317
|
+
}
|
|
318
|
+
finally {
|
|
319
|
+
if (created)
|
|
320
|
+
await unlink(staging).catch(() => undefined);
|
|
321
|
+
}
|
|
322
|
+
}
|
|
323
|
+
/** CLI adapter only. Never accepts a caller flag claiming a report was SDK-verified. */
|
|
324
|
+
export async function runVerifierCliV1(argv, emit) {
|
|
325
|
+
try {
|
|
326
|
+
const { command, options } = parseArgs(argv);
|
|
327
|
+
let result;
|
|
328
|
+
let code;
|
|
329
|
+
if (command === "report validate") {
|
|
330
|
+
result = validatePortableVerificationReportV1(await readJson(option(options, "report")));
|
|
331
|
+
code = statusCode(result && typeof result === "object" && "status" in result && result.status === "valid" ? "valid" : "invalid");
|
|
332
|
+
}
|
|
333
|
+
else if (command === "policy assess") {
|
|
334
|
+
const policy = checkPolicy(await readJson(option(options, "policy")));
|
|
335
|
+
const decision = assessPortableVerificationPolicyV1(await readJson(option(options, "report")), policy);
|
|
336
|
+
result = decision;
|
|
337
|
+
code = statusCode(decision.decision);
|
|
338
|
+
}
|
|
339
|
+
else if (command === "verify standards") {
|
|
340
|
+
const intent = checkIntent(await readJson(option(options, "intent")), "execution");
|
|
341
|
+
const policy = checkPolicy(await readJson(option(options, "policy")));
|
|
342
|
+
sameSubject(intent, policy);
|
|
343
|
+
const network = intent.subject.hedera_network;
|
|
344
|
+
const scope = policy.execution_scope;
|
|
345
|
+
if ((network !== "testnet" && network !== "mainnet") ||
|
|
346
|
+
policy.report_kind !== "independent_standards" ||
|
|
347
|
+
scope?.profile !== "sage-standards-v1" || scope.expected_program !== "sage" ||
|
|
348
|
+
(scope.requested_result_id !== null && typeof scope.requested_result_id !== "string")) {
|
|
349
|
+
throw new CliInputError("Independent SAGE standards require a network-scoped standards policy and exact SAGE execution scope");
|
|
350
|
+
}
|
|
351
|
+
// Only configured Mirror REST observations are used. HCS-1 decoding is
|
|
352
|
+
// handled by the bounded native Zstd adapter in the existing SDK kernel.
|
|
353
|
+
const config = options["mirror-url"] ? {
|
|
354
|
+
base_urls: { [network]: endpoint(options["mirror-url"], "mirror") },
|
|
355
|
+
} : {};
|
|
356
|
+
const input = {
|
|
357
|
+
intent, evidence: await readJson(option(options, "evidence")),
|
|
358
|
+
profile: "sage-standards-v1", expected_program: "sage",
|
|
359
|
+
...(scope.requested_result_id === null ? {} : { result_id: scope.requested_result_id }),
|
|
360
|
+
...(options["verification-material"] ? {
|
|
361
|
+
verification_material: await readJson(options["verification-material"]),
|
|
362
|
+
} : {}),
|
|
363
|
+
};
|
|
364
|
+
const workflow = await verifyExecutionStandardsWithPolicyV1(config, input, {}, policy);
|
|
365
|
+
result = workflow;
|
|
366
|
+
code = statusCode(workflow.policy.decision);
|
|
367
|
+
}
|
|
368
|
+
else if (command === "verify execution") {
|
|
369
|
+
const intent = checkIntent(await readJson(option(options, "intent")), "execution");
|
|
370
|
+
const policy = checkPolicy(await readJson(option(options, "policy")));
|
|
371
|
+
sameSubject(intent, policy);
|
|
372
|
+
if (!policy.execution_scope)
|
|
373
|
+
throw new CliInputError("Execution policy scope required");
|
|
374
|
+
const selected = verificationMode(options, intent, policy, { offline: "execution", public: "execution_triangulation" });
|
|
375
|
+
const scope = policy.execution_scope;
|
|
376
|
+
const input = {
|
|
377
|
+
intent, evidence: await readJson(option(options, "evidence")), profile: scope.profile,
|
|
378
|
+
...(scope.expected_program === null ? {} : { expected_program: scope.expected_program }),
|
|
379
|
+
...(scope.requested_result_id === null ? {} : { result_id: scope.requested_result_id }),
|
|
380
|
+
...(options["verification-material"] ? { verification_material: await readJson(options["verification-material"]) } : {}),
|
|
381
|
+
};
|
|
382
|
+
const workflow = selected.mode === "public"
|
|
383
|
+
? await triangulateExecutionWithPolicyV1(selected.config, input, policy)
|
|
384
|
+
: verifyExecutionWithPolicyV1(input, policy);
|
|
385
|
+
result = workflow;
|
|
386
|
+
code = statusCode(workflow.policy.decision);
|
|
387
|
+
}
|
|
388
|
+
else if (command === "verify ingest") {
|
|
389
|
+
const intent = checkIntent(await readJson(option(options, "intent")), "ingest");
|
|
390
|
+
const policy = checkPolicy(await readJson(option(options, "policy")));
|
|
391
|
+
sameSubject(intent, policy);
|
|
392
|
+
const selected = verificationMode(options, intent, policy, { offline: "verification", public: "public_triangulation" });
|
|
393
|
+
const anchor_request_id = ingestAnchor(options, selected.mode);
|
|
394
|
+
const bundle = await readJson(option(options, "bundle"));
|
|
395
|
+
const material = await ingestMaterial(options);
|
|
396
|
+
const input = { bundle, material, intent,
|
|
397
|
+
...(options.receipt ? { receipt: await readJson(options.receipt) } : {}) };
|
|
398
|
+
if (selected.mode === "public") {
|
|
399
|
+
if (anchor_request_id === null)
|
|
400
|
+
throw new CliInputError("Missing Core anchor request ID");
|
|
401
|
+
const workflow = await triangulateIngestWithPolicyV1(selected.config, { ...input, anchor_request_id }, policy);
|
|
402
|
+
result = workflow;
|
|
403
|
+
code = statusCode(workflow.policy.decision);
|
|
404
|
+
}
|
|
405
|
+
else {
|
|
406
|
+
const workflow = await verifyIngestWithPolicyV1(input, policy);
|
|
407
|
+
result = workflow;
|
|
408
|
+
code = statusCode(workflow.policy.decision);
|
|
409
|
+
}
|
|
410
|
+
}
|
|
411
|
+
else {
|
|
412
|
+
const intent = checkIntent(await readJson(option(options, "intent")), "dataset");
|
|
413
|
+
const policy = checkPolicy(await readJson(option(options, "policy")));
|
|
414
|
+
sameSubject(intent, policy);
|
|
415
|
+
const selected = verificationMode(options, intent, policy, { offline: "verification", public: "public_triangulation" });
|
|
416
|
+
const bundle = await readJson(option(options, "bundle"));
|
|
417
|
+
const files = await datasetSources(options);
|
|
418
|
+
const input = { bundle, files, intent,
|
|
419
|
+
...(options.receipt ? { receipt: await readJson(options.receipt) } : {}) };
|
|
420
|
+
const workflow = selected.mode === "public"
|
|
421
|
+
? await triangulateDatasetWithPolicyV1(selected.config, input, policy)
|
|
422
|
+
: await verifyDatasetWithPolicyV1(input, policy);
|
|
423
|
+
result = workflow;
|
|
424
|
+
code = statusCode(workflow.policy.decision);
|
|
425
|
+
}
|
|
426
|
+
if (options["report-out"] !== undefined) {
|
|
427
|
+
// Only verification commands allow this option; imported reports never acquire authority.
|
|
428
|
+
await saveReport(options["report-out"], result.report);
|
|
429
|
+
}
|
|
430
|
+
emit(JSON.stringify({ schema_version: CLI_SCHEMA, command, result }));
|
|
431
|
+
return code;
|
|
432
|
+
}
|
|
433
|
+
catch (error) {
|
|
434
|
+
// Never echo attacker-controlled filenames, response bodies, source text or credentials.
|
|
435
|
+
const badInput = error instanceof CliInputError || error instanceof TypeError || error instanceof SyntaxError || error instanceof RangeError;
|
|
436
|
+
emit(JSON.stringify({ schema_version: CLI_SCHEMA, error: { code: badInput ? "CLI_INPUT_INVALID" : "CLI_OPERATION_FAILED" } }));
|
|
437
|
+
return badInput ? 64 : 70;
|
|
438
|
+
}
|
|
439
|
+
}
|
|
440
|
+
//# sourceMappingURL=commandV1.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"commandV1.js","sourceRoot":"","sources":["../../src/cli/commandV1.ts"],"names":[],"mappings":"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"}
|
package/dist/cli.d.ts
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cli.d.ts","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":""}
|
package/dist/cli.js
ADDED
package/dist/cli.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":";AACA,OAAO,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;AAEtD,KAAK,gBAAgB,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,IAAI,IAAI,CAAC,CAAC;KACtF,IAAI,CAAC,CAAC,IAAI,EAAE,EAAE,GAAG,OAAO,CAAC,QAAQ,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC"}
|
|
@@ -0,0 +1,77 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Shared structural contracts for read-only verification.
|
|
3
|
+
* Pre-release: these types are not a runtime validator or a verification claim.
|
|
4
|
+
*/
|
|
5
|
+
export type HederaNetwork = "mainnet" | "testnet";
|
|
6
|
+
export type VerificationSubjectKind = "artifact" | "dataset" | "ingest" | "evidence_package" | "merkle_anchor" | "merkle_root" | "merkle_leaf" | "execution" | "result";
|
|
7
|
+
/** Network is required by network-bound profiles, not by content-only evidence. */
|
|
8
|
+
export type VerificationSubject = Readonly<{
|
|
9
|
+
kind: VerificationSubjectKind;
|
|
10
|
+
id: string;
|
|
11
|
+
hedera_network?: HederaNetwork;
|
|
12
|
+
}>;
|
|
13
|
+
/**
|
|
14
|
+
* Explicit commitment families. Never substitute one hashing/framing contract
|
|
15
|
+
* for another merely because both produce SHA3-512 digests.
|
|
16
|
+
*/
|
|
17
|
+
export type ExpectedCommitment = Readonly<{
|
|
18
|
+
key: string;
|
|
19
|
+
kind: "digest";
|
|
20
|
+
contract: "raw-sha3-512" | "core-canonical-json";
|
|
21
|
+
digest: string;
|
|
22
|
+
}> | Readonly<{
|
|
23
|
+
key: string;
|
|
24
|
+
kind: "digest";
|
|
25
|
+
contract: "hf-contract-v1";
|
|
26
|
+
material: "json" | "utf8" | "raw";
|
|
27
|
+
domain: string;
|
|
28
|
+
digest: string;
|
|
29
|
+
}> | Readonly<{
|
|
30
|
+
key: string;
|
|
31
|
+
kind: "merkle-root";
|
|
32
|
+
tree_alg: "binary-sorted" | "binary-sorted-v2" | "hf-dataset-v1" | "hf-ingest-v1";
|
|
33
|
+
root_hash: string;
|
|
34
|
+
leaf_count: number;
|
|
35
|
+
}>;
|
|
36
|
+
/** Expectations must be supplied by the caller or explicitly trusted context. */
|
|
37
|
+
export type VerificationIntent = Readonly<{
|
|
38
|
+
subject: VerificationSubject;
|
|
39
|
+
expected: readonly ExpectedCommitment[];
|
|
40
|
+
}>;
|
|
41
|
+
export type VerificationFactValue = string | number | boolean | null;
|
|
42
|
+
export type VerificationFact = Readonly<{
|
|
43
|
+
key: string;
|
|
44
|
+
state: "available";
|
|
45
|
+
value: VerificationFactValue;
|
|
46
|
+
}> | Readonly<{
|
|
47
|
+
key: string;
|
|
48
|
+
state: "unavailable" | "not_applicable";
|
|
49
|
+
reason_code?: string | null;
|
|
50
|
+
}>;
|
|
51
|
+
/** Source designation is provenance metadata, not proof of source authenticity. */
|
|
52
|
+
export type VerificationObservation = Readonly<{
|
|
53
|
+
id: string;
|
|
54
|
+
subject: VerificationSubject;
|
|
55
|
+
source: "provided_evidence" | "public_record" | "hedera_mirror" | "local_computation";
|
|
56
|
+
resolver_id?: string;
|
|
57
|
+
observed_at?: string | null;
|
|
58
|
+
facts: readonly VerificationFact[];
|
|
59
|
+
}>;
|
|
60
|
+
/** Check outcomes are distinct from evidence consistency and policy decisions. */
|
|
61
|
+
export type VerificationOutcome = "pass" | "fail" | "indeterminate" | "unsupported" | "skipped";
|
|
62
|
+
/** Findings carry no timestamps or raw source payloads. */
|
|
63
|
+
export type VerificationFinding = Readonly<{
|
|
64
|
+
check_id: string;
|
|
65
|
+
outcome: VerificationOutcome;
|
|
66
|
+
reason_code: string | null;
|
|
67
|
+
observation_ids: readonly string[];
|
|
68
|
+
}>;
|
|
69
|
+
/** Relationship consistency is not an overall verification or policy verdict. */
|
|
70
|
+
export type EvidenceConsistency = "consistent" | "conflict" | "incomplete";
|
|
71
|
+
/** No aggregate success flag until profile-specific required checks are defined. */
|
|
72
|
+
export type VerificationReport = Readonly<{
|
|
73
|
+
intent: VerificationIntent;
|
|
74
|
+
findings: readonly VerificationFinding[];
|
|
75
|
+
observations: readonly VerificationObservation[];
|
|
76
|
+
}>;
|
|
77
|
+
//# sourceMappingURL=verification.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"verification.d.ts","sourceRoot":"","sources":["../../src/contracts/verification.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"verification.js","sourceRoot":"","sources":["../../src/contracts/verification.ts"],"names":[],"mappings":"AAAA;;;GAGG"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import type { VerificationOutcome } from "../contracts/verification.js";
|
|
2
|
+
export type DigestVerificationResult = Readonly<{
|
|
3
|
+
outcome: Extract<VerificationOutcome, "pass" | "fail">;
|
|
4
|
+
reason_code: string | null;
|
|
5
|
+
expected_digest: string;
|
|
6
|
+
computed_digest: string;
|
|
7
|
+
}>;
|
|
8
|
+
export declare function normalizeSha3_512Digest(value: unknown): string;
|
|
9
|
+
/** SHA3-512 over exact bytes. No JSON canonicalization or domain framing. */
|
|
10
|
+
export declare function sha3_512Hex(bytes: Uint8Array): string;
|
|
11
|
+
export declare function verifySha3_512Bytes(input: Readonly<{
|
|
12
|
+
bytes: Uint8Array;
|
|
13
|
+
expected_digest: string;
|
|
14
|
+
}>): DigestVerificationResult;
|
|
15
|
+
//# sourceMappingURL=sha3.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sha3.d.ts","sourceRoot":"","sources":["../../src/crypto/sha3.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,8BAA8B,CAAC;AAIxE,MAAM,MAAM,wBAAwB,GAAG,QAAQ,CAAC;IAC9C,OAAO,EAAE,OAAO,CAAC,mBAAmB,EAAE,MAAM,GAAG,MAAM,CAAC,CAAC;IACvD,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3B,eAAe,EAAE,MAAM,CAAC;IACxB,eAAe,EAAE,MAAM,CAAC;CACzB,CAAC,CAAC;AAEH,wBAAgB,uBAAuB,CAAC,KAAK,EAAE,OAAO,GAAG,MAAM,CAK9D;AAED,6EAA6E;AAC7E,wBAAgB,WAAW,CAAC,KAAK,EAAE,UAAU,GAAG,MAAM,CAKrD;AAED,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,QAAQ,CAAC;IAClD,KAAK,EAAE,UAAU,CAAC;IAClB,eAAe,EAAE,MAAM,CAAC;CACzB,CAAC,GAAG,wBAAwB,CAU5B"}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
import { createHash } from "node:crypto";
|
|
2
|
+
const DIGEST_RE = /^[0-9a-f]{128}$/i;
|
|
3
|
+
export function normalizeSha3_512Digest(value) {
|
|
4
|
+
if (typeof value !== "string" || !DIGEST_RE.test(value)) {
|
|
5
|
+
throw new TypeError("SHA3-512 digest must contain exactly 128 hex characters");
|
|
6
|
+
}
|
|
7
|
+
return value.toLowerCase();
|
|
8
|
+
}
|
|
9
|
+
/** SHA3-512 over exact bytes. No JSON canonicalization or domain framing. */
|
|
10
|
+
export function sha3_512Hex(bytes) {
|
|
11
|
+
if (!(bytes instanceof Uint8Array)) {
|
|
12
|
+
throw new TypeError("SHA3-512 input must be Uint8Array");
|
|
13
|
+
}
|
|
14
|
+
return createHash("sha3-512").update(bytes).digest("hex");
|
|
15
|
+
}
|
|
16
|
+
export function verifySha3_512Bytes(input) {
|
|
17
|
+
const expected = normalizeSha3_512Digest(input.expected_digest);
|
|
18
|
+
const computed = sha3_512Hex(input.bytes);
|
|
19
|
+
const matches = computed === expected;
|
|
20
|
+
return Object.freeze({
|
|
21
|
+
outcome: matches ? "pass" : "fail",
|
|
22
|
+
reason_code: matches ? null : "DIGEST_MISMATCH",
|
|
23
|
+
expected_digest: expected,
|
|
24
|
+
computed_digest: computed,
|
|
25
|
+
});
|
|
26
|
+
}
|
|
27
|
+
//# sourceMappingURL=sha3.js.map
|