@primust/verifier 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (46) hide show
  1. package/LICENSE +93 -0
  2. package/dist/bounded-trace.d.ts +46 -0
  3. package/dist/bounded-trace.d.ts.map +1 -0
  4. package/dist/bounded-trace.js +558 -0
  5. package/dist/bounded-trace.js.map +1 -0
  6. package/dist/cli.d.ts +18 -0
  7. package/dist/cli.d.ts.map +1 -0
  8. package/dist/cli.js +391 -0
  9. package/dist/cli.js.map +1 -0
  10. package/dist/index.d.ts +13 -0
  11. package/dist/index.d.ts.map +1 -0
  12. package/dist/index.js +13 -0
  13. package/dist/index.js.map +1 -0
  14. package/dist/key-cache.d.ts +20 -0
  15. package/dist/key-cache.d.ts.map +1 -0
  16. package/dist/key-cache.js +68 -0
  17. package/dist/key-cache.js.map +1 -0
  18. package/dist/scoped.d.ts +35 -0
  19. package/dist/scoped.d.ts.map +1 -0
  20. package/dist/scoped.js +582 -0
  21. package/dist/scoped.js.map +1 -0
  22. package/dist/types.d.ts +60 -0
  23. package/dist/types.d.ts.map +1 -0
  24. package/dist/types.js +5 -0
  25. package/dist/types.js.map +1 -0
  26. package/dist/upstream_resolver.d.ts +60 -0
  27. package/dist/upstream_resolver.d.ts.map +1 -0
  28. package/dist/upstream_resolver.js +126 -0
  29. package/dist/upstream_resolver.js.map +1 -0
  30. package/dist/v29-envelope.d.ts +55 -0
  31. package/dist/v29-envelope.d.ts.map +1 -0
  32. package/dist/v29-envelope.js +450 -0
  33. package/dist/v29-envelope.js.map +1 -0
  34. package/dist/verifier.d.ts +36 -0
  35. package/dist/verifier.d.ts.map +1 -0
  36. package/dist/verifier.js +1235 -0
  37. package/dist/verifier.js.map +1 -0
  38. package/dist/verifier.test.d.ts +2 -0
  39. package/dist/verifier.test.d.ts.map +1 -0
  40. package/dist/verifier.test.js +395 -0
  41. package/dist/verifier.test.js.map +1 -0
  42. package/dist/verify-html-template.d.ts +45 -0
  43. package/dist/verify-html-template.d.ts.map +1 -0
  44. package/dist/verify-html-template.js +182 -0
  45. package/dist/verify-html-template.js.map +1 -0
  46. package/package.json +52 -0
@@ -0,0 +1,558 @@
1
+ /**
2
+ * Reference TypeScript interpreter for bounded_trace_v1 verification.
3
+ *
4
+ * This is the canonical second-opinion verifier described in PRIMUST_V27 §20.2,
5
+ * ported from verifier-py/src/primust_verify/bounded_trace.py. It is
6
+ * intentionally small and obviously-correct: consumes a BoundedTraceV1 payload
7
+ * plus a ProfileRecord and produces one of the §16.3 canonical downgrade
8
+ * reason codes (or "ok" on success).
9
+ *
10
+ * Crypto used: SHA-256 with RFC 6962-style domain-separated leaves (0x00)
11
+ * and nodes (0x01). Canonical JSON follows RFC 8785 + ECMAScript 7.1.12.1
12
+ * number serialization for cross-language parity.
13
+ *
14
+ * SI-3 (VPEC verifiability): this module's output MUST match the Python
15
+ * reference byte-for-byte across the shared conformance fixture corpus at
16
+ * packages/verifier-py/tests/fixtures/bounded_trace_v1/. The conformance
17
+ * runner in scripts/lane_a_conformance.* enforces this.
18
+ *
19
+ * Zero runtime dependencies besides node:crypto.
20
+ */
21
+ import { createHash } from "node:crypto";
22
+ // ── Canonical number + JSON (duplicated for zero-dep reference parity) ──
23
+ export function canonicalNumber(x) {
24
+ if (typeof x !== "number" || Number.isNaN(x) || !Number.isFinite(x)) {
25
+ throw new Error("canonical JSON cannot represent NaN, infinity, or non-numbers");
26
+ }
27
+ if (x === 0)
28
+ return "0";
29
+ // Node/V8 Number.prototype.toString already emits ECMAScript 7.1.12.1
30
+ // form for most values. Python repr() does the same for finite doubles.
31
+ // We normalize a handful of edge cases to match Python exactly:
32
+ // - trim trailing zeros after the decimal
33
+ // - "-0" → "0"
34
+ // - re-express scientific form with explicit "+"/"-" exponent sign
35
+ let s = x.toString();
36
+ const eIdx = s.indexOf("e");
37
+ if (eIdx >= 0) {
38
+ const mantissa = s.slice(0, eIdx);
39
+ const expPart = s.slice(eIdx + 1);
40
+ const sign = expPart.startsWith("-") ? "-" : "+";
41
+ const expDigits = expPart.replace(/^[+-]/, "").replace(/^0+(?=\d)/, "");
42
+ return `${mantissa}e${sign}${expDigits || "0"}`;
43
+ }
44
+ if (s.includes(".")) {
45
+ // Strip trailing zeros, then trailing dot
46
+ s = s.replace(/\.?0+$/, (m) => (m.startsWith(".") ? "" : m));
47
+ }
48
+ if (s === "-0")
49
+ s = "0";
50
+ return s;
51
+ }
52
+ /**
53
+ * Canonical JSON serialization:
54
+ * - object keys sorted lexicographically
55
+ * - UTF-8
56
+ * - separators ",":":", no whitespace
57
+ * - numbers via canonicalNumber
58
+ * - strings via JSON.stringify (same escape rules as Python json with ensure_ascii=False)
59
+ */
60
+ export function canonicalJson(obj) {
61
+ const s = canonicalJsonString(obj);
62
+ return new TextEncoder().encode(s);
63
+ }
64
+ export function canonicalJsonString(obj) {
65
+ if (obj === null)
66
+ return "null";
67
+ if (typeof obj === "boolean")
68
+ return obj ? "true" : "false";
69
+ if (typeof obj === "number")
70
+ return canonicalNumber(obj);
71
+ if (typeof obj === "string")
72
+ return JSON.stringify(obj);
73
+ if (Array.isArray(obj)) {
74
+ return "[" + obj.map((v) => canonicalJsonString(v)).join(",") + "]";
75
+ }
76
+ if (typeof obj === "object") {
77
+ const keys = Object.keys(obj).sort();
78
+ const parts = keys.map((k) => {
79
+ const v = obj[k];
80
+ return JSON.stringify(k) + ":" + canonicalJsonString(v);
81
+ });
82
+ return "{" + parts.join(",") + "}";
83
+ }
84
+ throw new Error(`canonical_json cannot encode value of type ${typeof obj}`);
85
+ }
86
+ // ── Merkle helpers (RFC 6962 domain separation) ──
87
+ function sha256(bytes) {
88
+ const h = createHash("sha256");
89
+ h.update(bytes);
90
+ return new Uint8Array(h.digest());
91
+ }
92
+ function leafHash(payload) {
93
+ const prefixed = new Uint8Array(payload.length + 1);
94
+ prefixed[0] = 0x00;
95
+ prefixed.set(payload, 1);
96
+ return sha256(prefixed);
97
+ }
98
+ function nodeHash(left, right) {
99
+ const prefixed = new Uint8Array(1 + left.length + right.length);
100
+ prefixed[0] = 0x01;
101
+ prefixed.set(left, 1);
102
+ prefixed.set(right, 1 + left.length);
103
+ return sha256(prefixed);
104
+ }
105
+ function toHex(bytes) {
106
+ let out = "";
107
+ for (const b of bytes) {
108
+ out += b.toString(16).padStart(2, "0");
109
+ }
110
+ return out;
111
+ }
112
+ export function buildMerkleRoot(leaves) {
113
+ if (leaves.length === 0) {
114
+ throw new Error("cannot build Merkle root over empty leaf list");
115
+ }
116
+ let level = leaves.map((l) => leafHash(l));
117
+ while (level.length > 1) {
118
+ if (level.length % 2 === 1) {
119
+ level.push(level[level.length - 1]);
120
+ }
121
+ const next = [];
122
+ for (let i = 0; i < level.length; i += 2) {
123
+ next.push(nodeHash(level[i], level[i + 1]));
124
+ }
125
+ level = next;
126
+ }
127
+ return "sha256:" + toHex(level[0]);
128
+ }
129
+ // ── Canonical reason codes (§16.3) ──
130
+ export const REASONS = [
131
+ "profile_not_found",
132
+ "profile_signature_invalid",
133
+ "profile_not_empirical",
134
+ "profile_expired",
135
+ "profile_revoked",
136
+ "profile_no_freshness_window",
137
+ "profile_trace_mismatch",
138
+ "runtime_not_supported",
139
+ "trace_schema_unknown",
140
+ "missing_merkle_root",
141
+ "merkle_inclusion_failed",
142
+ "threshold_violation",
143
+ "runtime_section_missing",
144
+ "retrieval_section_missing",
145
+ // v28.5 §4 — closed-API lifecycle downgrade codes. Mirrors the
146
+ // primust_verify (Python) 1.0.3 vocabulary so cross-verifier
147
+ // conformance holds. The TS verifier consults
148
+ // `model_profiles.lifecycle_state` (mig 123) BEFORE the legacy
149
+ // profile_class check; rows with non-empirical lifecycle states
150
+ // downgrade to `execution` with the listed reason regardless of class.
151
+ "closed_api_pre_cohort",
152
+ "closed_api_pre_promote",
153
+ "closed_api_v2_promoted",
154
+ "profile_deprecated",
155
+ "unknown_lifecycle_state",
156
+ ];
157
+ // v28.5 §1 lifecycle state vocabulary recognized by the verifier.
158
+ // Mirrors primust_verify.bounded_trace._KNOWN_LIFECYCLE_STATES
159
+ // byte-for-byte. Unknown values fail closed.
160
+ const KNOWN_LIFECYCLE_STATES = new Set([
161
+ "v1_placeholder",
162
+ "v2_run_complete",
163
+ "v2_staged",
164
+ "cohort_validated",
165
+ "v2_empirical_closed_api",
166
+ "deprecated",
167
+ ]);
168
+ // v28.5 §4 state-behavior table — non-empirical lifecycle → execution
169
+ // with the listed reason. v2_empirical_closed_api is intentionally
170
+ // absent: it's the only state that lets the verifier proceed.
171
+ const LIFECYCLE_DOWNGRADE_REASON = {
172
+ v1_placeholder: "closed_api_pre_cohort",
173
+ v2_run_complete: "closed_api_pre_cohort",
174
+ v2_staged: "closed_api_pre_cohort",
175
+ cohort_validated: "closed_api_pre_promote",
176
+ deprecated: "profile_deprecated",
177
+ };
178
+ // ── Verification steps ──
179
+ function asDate(x) {
180
+ if (!x)
181
+ return null;
182
+ if (x instanceof Date)
183
+ return x;
184
+ if (typeof x === "string") {
185
+ const d = new Date(x);
186
+ if (!isNaN(d.getTime()))
187
+ return d;
188
+ }
189
+ return null;
190
+ }
191
+ function checkProfile(profile, now) {
192
+ if (!profile || Object.keys(profile).length === 0) {
193
+ return { ok: false, reason: "profile_not_found" };
194
+ }
195
+ const sig = String(profile.profile_signature ?? profile.signature ?? "");
196
+ if (sig.includes("PLACEHOLDER") || sig.includes("UNSIGNED_PENDING")) {
197
+ return { ok: false, reason: "profile_signature_invalid" };
198
+ }
199
+ const status = String(profile.status ?? "active").toLowerCase();
200
+ if (status === "revoked" || status === "suspended") {
201
+ return { ok: false, reason: "profile_revoked" };
202
+ }
203
+ // v28.5 §4 — closed-API lifecycle gate. Mirrors primust_verify
204
+ // (Python) _check_profile. Runs BEFORE profile_class so a closed-API
205
+ // row that is profile_class='empirical' but still in cohort_validated
206
+ // lifecycle correctly downgrades to execution with closed_api_pre_promote
207
+ // rather than verifying as operator_bound. Open-weight rows have
208
+ // lifecycle_state=NULL/undefined per mig 123 and skip this gate,
209
+ // falling through to the legacy profile_class path.
210
+ const lifecycle = profile.lifecycle_state;
211
+ if (lifecycle !== null && lifecycle !== undefined) {
212
+ const ls = String(lifecycle).toLowerCase();
213
+ if (!KNOWN_LIFECYCLE_STATES.has(ls)) {
214
+ return { ok: false, reason: "unknown_lifecycle_state" };
215
+ }
216
+ const downgrade = LIFECYCLE_DOWNGRADE_REASON[ls];
217
+ if (downgrade !== undefined) {
218
+ return { ok: false, reason: downgrade };
219
+ }
220
+ // ls === 'v2_empirical_closed_api' — eligible if remaining gates pass.
221
+ }
222
+ const cls = String(profile.profile_class ?? "placeholder").toLowerCase();
223
+ if (cls === "revoked")
224
+ return { ok: false, reason: "profile_revoked" };
225
+ if (cls === "synthetic" || cls === "placeholder") {
226
+ return { ok: false, reason: "profile_not_empirical" };
227
+ }
228
+ if (cls === "expired")
229
+ return { ok: false, reason: "profile_expired" };
230
+ if (cls !== "empirical")
231
+ return { ok: false, reason: "profile_not_empirical" };
232
+ const validFrom = asDate(profile.freshness_valid_from);
233
+ const validUntil = asDate(profile.freshness_valid_until);
234
+ if (!validFrom || !validUntil) {
235
+ return { ok: false, reason: "profile_no_freshness_window" };
236
+ }
237
+ const graceDays = Number(profile.freshness_grace_days) || 0;
238
+ const graceMs = graceDays * 24 * 60 * 60 * 1000;
239
+ if (now.getTime() > validUntil.getTime() + graceMs) {
240
+ return { ok: false, reason: "profile_expired" };
241
+ }
242
+ if (now.getTime() < validFrom.getTime()) {
243
+ return { ok: false, reason: "profile_expired" };
244
+ }
245
+ return { ok: true, reason: "ok" };
246
+ }
247
+ function asDict(v) {
248
+ if (v && typeof v === "object" && !Array.isArray(v)) {
249
+ return v;
250
+ }
251
+ if (typeof v === "string") {
252
+ try {
253
+ const parsed = JSON.parse(v);
254
+ if (parsed && typeof parsed === "object" && !Array.isArray(parsed)) {
255
+ return parsed;
256
+ }
257
+ }
258
+ catch {
259
+ /* ignore */
260
+ }
261
+ }
262
+ return {};
263
+ }
264
+ function checkRuntime(trace, profile) {
265
+ const runtime = asDict(trace.runtime);
266
+ const kernel = runtime.kernel_profile_id;
267
+ const gpu = runtime.gpu_class;
268
+ const supportedRaw = profile.supported_runtime_classes;
269
+ const supported = new Set(Array.isArray(supportedRaw) ? supportedRaw : []);
270
+ if (supported.size > 0) {
271
+ if (kernel && supported.has(kernel))
272
+ return { ok: true, reason: "ok" };
273
+ if (gpu && supported.has(gpu))
274
+ return { ok: true, reason: "ok" };
275
+ return { ok: false, reason: "runtime_not_supported" };
276
+ }
277
+ // Legacy profile_data.calibrated_gpu_classes (pre-Sprint-2 shape)
278
+ const profileData = asDict(profile.profile_data);
279
+ const calibrated = profileData.calibrated_gpu_classes;
280
+ if (calibrated && typeof calibrated === "object") {
281
+ const keys = Array.isArray(calibrated)
282
+ ? calibrated
283
+ : Object.keys(calibrated);
284
+ if (gpu && keys.includes(gpu))
285
+ return { ok: true, reason: "ok" };
286
+ if (kernel && keys.includes(kernel))
287
+ return { ok: true, reason: "ok" };
288
+ }
289
+ return { ok: false, reason: "runtime_not_supported" };
290
+ }
291
+ function recomputeMerkleRoot(operators) {
292
+ const leaves = operators.map((op) => canonicalJson({ v: "bounded_trace_v1", op }));
293
+ return buildMerkleRoot(leaves);
294
+ }
295
+ function compareThresholds(trace, profile) {
296
+ const runtime = asDict(trace.runtime);
297
+ const gpu = runtime.gpu_class;
298
+ const profileData = asDict(profile.profile_data);
299
+ let opThresholds = {};
300
+ const calibrated = profileData.calibrated_gpu_classes;
301
+ if (calibrated &&
302
+ typeof calibrated === "object" &&
303
+ !Array.isArray(calibrated) &&
304
+ gpu &&
305
+ gpu in calibrated) {
306
+ const gpuBlock = calibrated[gpu];
307
+ if (gpuBlock && typeof gpuBlock === "object") {
308
+ const ops = gpuBlock.operators;
309
+ if (ops && typeof ops === "object" && !Array.isArray(ops)) {
310
+ opThresholds = ops;
311
+ }
312
+ }
313
+ }
314
+ if (Object.keys(opThresholds).length === 0) {
315
+ const legacyOps = profileData.operators;
316
+ if (legacyOps && typeof legacyOps === "object" && !Array.isArray(legacyOps)) {
317
+ opThresholds = legacyOps;
318
+ }
319
+ }
320
+ if (Object.keys(opThresholds).length === 0) {
321
+ return {
322
+ ok: false,
323
+ violations: [{ reason: "no_operator_thresholds_in_profile" }],
324
+ };
325
+ }
326
+ let marginFactor = 1.0;
327
+ const safetyMargin = profile.safety_margin;
328
+ if (typeof safetyMargin === "number" && !Number.isNaN(safetyMargin)) {
329
+ marginFactor = 1.0 + safetyMargin;
330
+ }
331
+ const absOrViolation = (raw) => {
332
+ // Returns the absolute value for finite numeric stats; null when the
333
+ // field is missing OR when the supplied value is not a real finite
334
+ // number. Mirrors _abs_or_violation() in bounded_trace.py — crafted
335
+ // traces can't smuggle NaN/infinity past a naive `>`-comparison
336
+ // (NaN > x is False in ECMAScript) and negative values named *_abs
337
+ // are coerced to their magnitude before comparison.
338
+ if (raw === null || raw === undefined)
339
+ return null;
340
+ if (typeof raw !== "number")
341
+ return null;
342
+ if (Number.isNaN(raw) || !Number.isFinite(raw))
343
+ return null;
344
+ return Math.abs(raw);
345
+ };
346
+ const violations = [];
347
+ const tops = Array.isArray(trace.operators) ? trace.operators : [];
348
+ for (const rawOp of tops) {
349
+ const op = asDict(rawOp);
350
+ const opType = op.operator_type;
351
+ const thresholds = opType && typeof opType === "string" ? opThresholds[opType] : undefined;
352
+ if (!thresholds) {
353
+ violations.push({
354
+ operator_index: op.operator_index,
355
+ operator_type: opType,
356
+ stat: "operator_type",
357
+ observed: opType,
358
+ allowed: Object.keys(opThresholds),
359
+ });
360
+ continue;
361
+ }
362
+ const stats = asDict(op.stats);
363
+ const p99 = thresholds.p99;
364
+ const p99_99 = thresholds.p99_99;
365
+ const rawP99 = stats.p99_abs;
366
+ const rawMax = stats.max_abs;
367
+ const observedP99 = absOrViolation(rawP99);
368
+ const observedMax = absOrViolation(rawMax);
369
+ if (rawP99 !== null && rawP99 !== undefined && observedP99 === null) {
370
+ violations.push({
371
+ operator_index: op.operator_index,
372
+ operator_type: opType,
373
+ stat: "p99_abs",
374
+ observed: rawP99,
375
+ allowed: "finite non-negative number",
376
+ });
377
+ }
378
+ else if (observedP99 !== null &&
379
+ typeof p99 === "number" &&
380
+ observedP99 > p99 * marginFactor) {
381
+ violations.push({
382
+ operator_index: op.operator_index,
383
+ operator_type: opType,
384
+ stat: "p99_abs",
385
+ observed: observedP99,
386
+ allowed: p99 * marginFactor,
387
+ });
388
+ }
389
+ if (rawMax !== null && rawMax !== undefined && observedMax === null) {
390
+ violations.push({
391
+ operator_index: op.operator_index,
392
+ operator_type: opType,
393
+ stat: "max_abs",
394
+ observed: rawMax,
395
+ allowed: "finite non-negative number",
396
+ });
397
+ }
398
+ else if (observedMax !== null &&
399
+ typeof p99_99 === "number" &&
400
+ observedMax > p99_99 * marginFactor) {
401
+ violations.push({
402
+ operator_index: op.operator_index,
403
+ operator_type: opType,
404
+ stat: "max_abs",
405
+ observed: observedMax,
406
+ allowed: p99_99 * marginFactor,
407
+ });
408
+ }
409
+ }
410
+ return { ok: violations.length === 0, violations };
411
+ }
412
+ // ── Public entry point ──
413
+ export function verifyBoundedTrace(trace, profile, options = {}) {
414
+ const now = options.now ?? new Date();
415
+ // 1. Trace schema version
416
+ const schema = trace.trace_schema_version;
417
+ if (schema !== "bounded_trace_v1") {
418
+ return {
419
+ valid: false,
420
+ proof_level: "execution",
421
+ reason: "trace_schema_unknown",
422
+ disclosed_operator_count: 0,
423
+ verified_merkle_paths: 0,
424
+ details: { trace_schema_version: schema },
425
+ };
426
+ }
427
+ // 1a. Profile / trace identity binding. The trace must declare it was
428
+ // produced against the same profile we're verifying it against; otherwise
429
+ // an attacker could pair a low-stat trace with a sibling empirical
430
+ // profile that happens to have lenient thresholds. Only fires when the
431
+ // caller has actually supplied a profile (i.e. profile.profile_id is
432
+ // populated); an empty profile dict falls through to checkProfile so
433
+ // the caller sees profile_not_found instead. Mirrors bounded_trace.py.
434
+ const profileProfileId = profile.profile_id;
435
+ const traceProfileId = trace.profile_id;
436
+ if (profileProfileId !== undefined &&
437
+ profileProfileId !== null &&
438
+ traceProfileId !== profileProfileId) {
439
+ return {
440
+ valid: false,
441
+ proof_level: "execution",
442
+ reason: "profile_trace_mismatch",
443
+ disclosed_operator_count: 0,
444
+ verified_merkle_paths: 0,
445
+ details: {
446
+ trace_profile_id: traceProfileId,
447
+ profile_profile_id: profileProfileId,
448
+ },
449
+ };
450
+ }
451
+ // 2. Missing Merkle root
452
+ const claimedRoot = trace.merkle_root;
453
+ if (typeof claimedRoot !== "string" || !claimedRoot.startsWith("sha256:")) {
454
+ return {
455
+ valid: false,
456
+ proof_level: "execution",
457
+ reason: "missing_merkle_root",
458
+ disclosed_operator_count: 0,
459
+ verified_merkle_paths: 0,
460
+ details: { merkle_root: claimedRoot },
461
+ };
462
+ }
463
+ // 3. Merkle inclusion — reconstruct root from disclosed operators.
464
+ // Matches the Python reference: if operator_count is declared and
465
+ // disagrees with operators.length, the trace is claiming partial
466
+ // disclosure, which Sprint 3+ does not yet support (no inclusion
467
+ // proofs). Refuse with merkle_inclusion_failed.
468
+ const operators = Array.isArray(trace.operators) ? trace.operators : [];
469
+ const declaredCount = trace.operator_count;
470
+ if (typeof declaredCount === "number" &&
471
+ Number.isInteger(declaredCount) &&
472
+ declaredCount !== operators.length) {
473
+ return {
474
+ valid: false,
475
+ proof_level: "execution",
476
+ reason: "merkle_inclusion_failed",
477
+ disclosed_operator_count: operators.length,
478
+ verified_merkle_paths: 0,
479
+ details: {
480
+ declared_operator_count: declaredCount,
481
+ disclosed_operator_count: operators.length,
482
+ error: "operator_count_mismatch_without_inclusion_proofs",
483
+ },
484
+ };
485
+ }
486
+ let recomputed;
487
+ try {
488
+ recomputed = recomputeMerkleRoot(operators);
489
+ }
490
+ catch (exc) {
491
+ return {
492
+ valid: false,
493
+ proof_level: "execution",
494
+ reason: "merkle_inclusion_failed",
495
+ disclosed_operator_count: operators.length,
496
+ verified_merkle_paths: 0,
497
+ details: { error: String(exc) },
498
+ };
499
+ }
500
+ if (recomputed !== claimedRoot) {
501
+ return {
502
+ valid: false,
503
+ proof_level: "execution",
504
+ reason: "merkle_inclusion_failed",
505
+ disclosed_operator_count: operators.length,
506
+ verified_merkle_paths: 0,
507
+ details: { claimed: claimedRoot, recomputed },
508
+ };
509
+ }
510
+ // 4. Profile policy
511
+ const policy = checkProfile(profile, now);
512
+ if (!policy.ok) {
513
+ return {
514
+ valid: false,
515
+ proof_level: "execution",
516
+ reason: policy.reason,
517
+ disclosed_operator_count: operators.length,
518
+ verified_merkle_paths: operators.length,
519
+ details: { profile_class: profile.profile_class },
520
+ };
521
+ }
522
+ // 5. Runtime compatibility
523
+ const runtime = checkRuntime(trace, profile);
524
+ if (!runtime.ok) {
525
+ return {
526
+ valid: false,
527
+ proof_level: "execution",
528
+ reason: runtime.reason,
529
+ disclosed_operator_count: operators.length,
530
+ verified_merkle_paths: operators.length,
531
+ details: { trace_runtime: trace.runtime },
532
+ };
533
+ }
534
+ // 6. Threshold comparison
535
+ const thresholds = compareThresholds(trace, profile);
536
+ if (!thresholds.ok) {
537
+ return {
538
+ valid: false,
539
+ proof_level: "execution",
540
+ reason: "threshold_violation",
541
+ disclosed_operator_count: operators.length,
542
+ verified_merkle_paths: operators.length,
543
+ details: { violations: thresholds.violations },
544
+ };
545
+ }
546
+ return {
547
+ valid: true,
548
+ proof_level: "operator_bound",
549
+ reason: "thresholds_verified",
550
+ disclosed_operator_count: operators.length,
551
+ verified_merkle_paths: operators.length,
552
+ details: {
553
+ profile_id: profile.profile_id,
554
+ profile_class: profile.profile_class,
555
+ },
556
+ };
557
+ }
558
+ //# sourceMappingURL=bounded-trace.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"bounded-trace.js","sourceRoot":"","sources":["../src/bounded-trace.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;GAmBG;AAEH,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAEzC,2EAA2E;AAE3E,MAAM,UAAU,eAAe,CAAC,CAAS;IACvC,IAAI,OAAO,CAAC,KAAK,QAAQ,IAAI,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,CAAC;QACpE,MAAM,IAAI,KAAK,CAAC,+DAA+D,CAAC,CAAC;IACnF,CAAC;IACD,IAAI,CAAC,KAAK,CAAC;QAAE,OAAO,GAAG,CAAC;IAExB,sEAAsE;IACtE,wEAAwE;IACxE,gEAAgE;IAChE,4CAA4C;IAC5C,iBAAiB;IACjB,qEAAqE;IACrE,IAAI,CAAC,GAAG,CAAC,CAAC,QAAQ,EAAE,CAAC;IAErB,MAAM,IAAI,GAAG,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;IAC5B,IAAI,IAAI,IAAI,CAAC,EAAE,CAAC;QACd,MAAM,QAAQ,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC;QAClC,MAAM,OAAO,GAAG,CAAC,CAAC,KAAK,CAAC,IAAI,GAAG,CAAC,CAAC,CAAC;QAClC,MAAM,IAAI,GAAG,OAAO,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC;QACjD,MAAM,SAAS,GAAG,OAAO,CAAC,OAAO,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC,OAAO,CAAC,WAAW,EAAE,EAAE,CAAC,CAAC;QACxE,OAAO,GAAG,QAAQ,IAAI,IAAI,GAAG,SAAS,IAAI,GAAG,EAAE,CAAC;IAClD,CAAC;IAED,IAAI,CAAC,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC;QACpB,0CAA0C;QAC1C,CAAC,GAAG,CAAC,CAAC,OAAO,CAAC,QAAQ,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IAC/D,CAAC;IACD,IAAI,CAAC,KAAK,IAAI;QAAE,CAAC,GAAG,GAAG,CAAC;IACxB,OAAO,CAAC,CAAC;AACX,CAAC;AAED;;;;;;;GAOG;AACH,MAAM,UAAU,aAAa,CAAC,GAAY;IACxC,MAAM,CAAC,GAAG,mBAAmB,CAAC,GAAG,CAAC,CAAC;IACnC,OAAO,IAAI,WAAW,EAAE,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;AACrC,CAAC;AAED,MAAM,UAAU,mBAAmB,CAAC,GAAY;IAC9C,IAAI,GAAG,KAAK,IAAI;QAAE,OAAO,MAAM,CAAC;IAChC,IAAI,OAAO,GAAG,KAAK,SAAS;QAAE,OAAO,GAAG,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,OAAO,CAAC;IAC5D,IAAI,OAAO,GAAG,KAAK,QAAQ;QAAE,OAAO,eAAe,CAAC,GAAG,CAAC,CAAC;IACzD,IAAI,OAAO,GAAG,KAAK,QAAQ;QAAE,OAAO,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC;IACxD,IAAI,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC;QACvB,OAAO,GAAG,GAAG,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,mBAAmB,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,GAAG,CAAC;IACtE,CAAC;IACD,IAAI,OAAO,GAAG,KAAK,QAAQ,EAAE,CAAC;QAC5B,MAAM,IAAI,GAAG,MAAM,CAAC,IAAI,CAAC,GAA8B,CAAC,CAAC,IAAI,EAAE,CAAC;QAChE,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE;YAC3B,MAAM,CAAC,GAAI,GAA+B,CAAC,CAAC,CAAC,CAAC;YAC9C,OAAO,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,GAAG,GAAG,GAAG,mBAAmB,CAAC,CAAC,CAAC,CAAC;QAC1D,CAAC,CAAC,CAAC;QACH,OAAO,GAAG,GAAG,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,GAAG,CAAC;IACrC,CAAC;IACD,MAAM,IAAI,KAAK,CAAC,8CAA8C,OAAO,GAAG,EAAE,CAAC,CAAC;AAC9E,CAAC;AAED,oDAAoD;AAEpD,SAAS,MAAM,CAAC,KAAiB;IAC/B,MAAM,CAAC,GAAG,UAAU,CAAC,QAAQ,CAAC,CAAC;IAC/B,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;IAChB,OAAO,IAAI,UAAU,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC;AACpC,CAAC;AAED,SAAS,QAAQ,CAAC,OAAmB;IACnC,MAAM,QAAQ,GAAG,IAAI,UAAU,CAAC,OAAO,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;IACpD,QAAQ,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC;IACnB,QAAQ,CAAC,GAAG,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC;IACzB,OAAO,MAAM,CAAC,QAAQ,CAAC,CAAC;AAC1B,CAAC;AAED,SAAS,QAAQ,CAAC,IAAgB,EAAE,KAAiB;IACnD,MAAM,QAAQ,GAAG,IAAI,UAAU,CAAC,CAAC,GAAG,IAAI,CAAC,MAAM,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC;IAChE,QAAQ,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC;IACnB,QAAQ,CAAC,GAAG,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC;IACtB,QAAQ,CAAC,GAAG,CAAC,KAAK,EAAE,CAAC,GAAG,IAAI,CAAC,MAAM,CAAC,CAAC;IACrC,OAAO,MAAM,CAAC,QAAQ,CAAC,CAAC;AAC1B,CAAC;AAED,SAAS,KAAK,CAAC,KAAiB;IAC9B,IAAI,GAAG,GAAG,EAAE,CAAC;IACb,KAAK,MAAM,CAAC,IAAI,KAAK,EAAE,CAAC;QACtB,GAAG,IAAI,CAAC,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC;IACzC,CAAC;IACD,OAAO,GAAG,CAAC;AACb,CAAC;AAED,MAAM,UAAU,eAAe,CAAC,MAAoB;IAClD,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACxB,MAAM,IAAI,KAAK,CAAC,+CAA+C,CAAC,CAAC;IACnE,CAAC;IACD,IAAI,KAAK,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC;IAC3C,OAAO,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACxB,IAAI,KAAK,CAAC,MAAM,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC;YAC3B,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC;QACtC,CAAC;QACD,MAAM,IAAI,GAAiB,EAAE,CAAC;QAC9B,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC;YACzC,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;QAC9C,CAAC;QACD,KAAK,GAAG,IAAI,CAAC;IACf,CAAC;IACD,OAAO,SAAS,GAAG,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;AACrC,CAAC;AAaD,uCAAuC;AAEvC,MAAM,CAAC,MAAM,OAAO,GAAG;IACrB,mBAAmB;IACnB,2BAA2B;IAC3B,uBAAuB;IACvB,iBAAiB;IACjB,iBAAiB;IACjB,6BAA6B;IAC7B,wBAAwB;IACxB,uBAAuB;IACvB,sBAAsB;IACtB,qBAAqB;IACrB,yBAAyB;IACzB,qBAAqB;IACrB,yBAAyB;IACzB,2BAA2B;IAC3B,+DAA+D;IAC/D,6DAA6D;IAC7D,8CAA8C;IAC9C,+DAA+D;IAC/D,gEAAgE;IAChE,uEAAuE;IACvE,uBAAuB;IACvB,wBAAwB;IACxB,wBAAwB;IACxB,oBAAoB;IACpB,yBAAyB;CACjB,CAAC;AAIX,kEAAkE;AAClE,+DAA+D;AAC/D,6CAA6C;AAC7C,MAAM,sBAAsB,GAAwB,IAAI,GAAG,CAAC;IAC1D,gBAAgB;IAChB,iBAAiB;IACjB,WAAW;IACX,kBAAkB;IAClB,yBAAyB;IACzB,YAAY;CACb,CAAC,CAAC;AAEH,sEAAsE;AACtE,mEAAmE;AACnE,8DAA8D;AAC9D,MAAM,0BAA0B,GAAqC;IACnE,cAAc,EAAE,uBAAuB;IACvC,eAAe,EAAE,uBAAuB;IACxC,SAAS,EAAE,uBAAuB;IAClC,gBAAgB,EAAE,wBAAwB;IAC1C,UAAU,EAAE,oBAAoB;CACjC,CAAC;AAEF,2BAA2B;AAE3B,SAAS,MAAM,CAAC,CAAU;IACxB,IAAI,CAAC,CAAC;QAAE,OAAO,IAAI,CAAC;IACpB,IAAI,CAAC,YAAY,IAAI;QAAE,OAAO,CAAC,CAAC;IAChC,IAAI,OAAO,CAAC,KAAK,QAAQ,EAAE,CAAC;QAC1B,MAAM,CAAC,GAAG,IAAI,IAAI,CAAC,CAAC,CAAC,CAAC;QACtB,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,OAAO,EAAE,CAAC;YAAE,OAAO,CAAC,CAAC;IACpC,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC;AAED,SAAS,YAAY,CACnB,OAAgC,EAChC,GAAS;IAET,IAAI,CAAC,OAAO,IAAI,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAClD,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,mBAAmB,EAAE,CAAC;IACpD,CAAC;IAED,MAAM,GAAG,GAAG,MAAM,CAAC,OAAO,CAAC,iBAAiB,IAAI,OAAO,CAAC,SAAS,IAAI,EAAE,CAAC,CAAC;IACzE,IAAI,GAAG,CAAC,QAAQ,CAAC,aAAa,CAAC,IAAI,GAAG,CAAC,QAAQ,CAAC,kBAAkB,CAAC,EAAE,CAAC;QACpE,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,2BAA2B,EAAE,CAAC;IAC5D,CAAC;IAED,MAAM,MAAM,GAAG,MAAM,CAAC,OAAO,CAAC,MAAM,IAAI,QAAQ,CAAC,CAAC,WAAW,EAAE,CAAC;IAChE,IAAI,MAAM,KAAK,SAAS,IAAI,MAAM,KAAK,WAAW,EAAE,CAAC;QACnD,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,iBAAiB,EAAE,CAAC;IAClD,CAAC;IAED,+DAA+D;IAC/D,qEAAqE;IACrE,sEAAsE;IACtE,0EAA0E;IAC1E,iEAAiE;IACjE,iEAAiE;IACjE,oDAAoD;IACpD,MAAM,SAAS,GAAG,OAAO,CAAC,eAAe,CAAC;IAC1C,IAAI,SAAS,KAAK,IAAI,IAAI,SAAS,KAAK,SAAS,EAAE,CAAC;QAClD,MAAM,EAAE,GAAG,MAAM,CAAC,SAAS,CAAC,CAAC,WAAW,EAAE,CAAC;QAC3C,IAAI,CAAC,sBAAsB,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,CAAC;YACpC,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,yBAAyB,EAAE,CAAC;QAC1D,CAAC;QACD,MAAM,SAAS,GAAG,0BAA0B,CAAC,EAAE,CAAC,CAAC;QACjD,IAAI,SAAS,KAAK,SAAS,EAAE,CAAC;YAC5B,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,SAAS,EAAE,CAAC;QAC1C,CAAC;QACD,uEAAuE;IACzE,CAAC;IAED,MAAM,GAAG,GAAG,MAAM,CAAC,OAAO,CAAC,aAAa,IAAI,aAAa,CAAC,CAAC,WAAW,EAAE,CAAC;IACzE,IAAI,GAAG,KAAK,SAAS;QAAE,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,iBAAiB,EAAE,CAAC;IACvE,IAAI,GAAG,KAAK,WAAW,IAAI,GAAG,KAAK,aAAa,EAAE,CAAC;QACjD,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,uBAAuB,EAAE,CAAC;IACxD,CAAC;IACD,IAAI,GAAG,KAAK,SAAS;QAAE,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,iBAAiB,EAAE,CAAC;IACvE,IAAI,GAAG,KAAK,WAAW;QAAE,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,uBAAuB,EAAE,CAAC;IAE/E,MAAM,SAAS,GAAG,MAAM,CAAC,OAAO,CAAC,oBAAoB,CAAC,CAAC;IACvD,MAAM,UAAU,GAAG,MAAM,CAAC,OAAO,CAAC,qBAAqB,CAAC,CAAC;IACzD,IAAI,CAAC,SAAS,IAAI,CAAC,UAAU,EAAE,CAAC;QAC9B,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,6BAA6B,EAAE,CAAC;IAC9D,CAAC;IAED,MAAM,SAAS,GAAG,MAAM,CAAC,OAAO,CAAC,oBAAoB,CAAC,IAAI,CAAC,CAAC;IAC5D,MAAM,OAAO,GAAG,SAAS,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,IAAI,CAAC;IAChD,IAAI,GAAG,CAAC,OAAO,EAAE,GAAG,UAAU,CAAC,OAAO,EAAE,GAAG,OAAO,EAAE,CAAC;QACnD,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,iBAAiB,EAAE,CAAC;IAClD,CAAC;IACD,IAAI,GAAG,CAAC,OAAO,EAAE,GAAG,SAAS,CAAC,OAAO,EAAE,EAAE,CAAC;QACxC,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,iBAAiB,EAAE,CAAC;IAClD,CAAC;IAED,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC;AACpC,CAAC;AAED,SAAS,MAAM,CAAC,CAAU;IACxB,IAAI,CAAC,IAAI,OAAO,CAAC,KAAK,QAAQ,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC;QACpD,OAAO,CAA4B,CAAC;IACtC,CAAC;IACD,IAAI,OAAO,CAAC,KAAK,QAAQ,EAAE,CAAC;QAC1B,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;YAC7B,IAAI,MAAM,IAAI,OAAO,MAAM,KAAK,QAAQ,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC;gBACnE,OAAO,MAAiC,CAAC;YAC3C,CAAC;QACH,CAAC;QAAC,MAAM,CAAC;YACP,YAAY;QACd,CAAC;IACH,CAAC;IACD,OAAO,EAAE,CAAC;AACZ,CAAC;AAED,SAAS,YAAY,CACnB,KAA8B,EAC9B,OAAgC;IAEhC,MAAM,OAAO,GAAG,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;IACtC,MAAM,MAAM,GAAG,OAAO,CAAC,iBAAuC,CAAC;IAC/D,MAAM,GAAG,GAAG,OAAO,CAAC,SAA+B,CAAC;IACpD,MAAM,YAAY,GAAG,OAAO,CAAC,yBAAyB,CAAC;IACvD,MAAM,SAAS,GAAG,IAAI,GAAG,CAAC,KAAK,CAAC,OAAO,CAAC,YAAY,CAAC,CAAC,CAAC,CAAE,YAAyB,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;IAEzF,IAAI,SAAS,CAAC,IAAI,GAAG,CAAC,EAAE,CAAC;QACvB,IAAI,MAAM,IAAI,SAAS,CAAC,GAAG,CAAC,MAAM,CAAC;YAAE,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC;QACvE,IAAI,GAAG,IAAI,SAAS,CAAC,GAAG,CAAC,GAAG,CAAC;YAAE,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC;QACjE,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,uBAAuB,EAAE,CAAC;IACxD,CAAC;IAED,kEAAkE;IAClE,MAAM,WAAW,GAAG,MAAM,CAAC,OAAO,CAAC,YAAY,CAAC,CAAC;IACjD,MAAM,UAAU,GAAG,WAAW,CAAC,sBAAsB,CAAC;IACtD,IAAI,UAAU,IAAI,OAAO,UAAU,KAAK,QAAQ,EAAE,CAAC;QACjD,MAAM,IAAI,GAAG,KAAK,CAAC,OAAO,CAAC,UAAU,CAAC;YACpC,CAAC,CAAE,UAAuB;YAC1B,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,UAAqC,CAAC,CAAC;QACvD,IAAI,GAAG,IAAI,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC;YAAE,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC;QACjE,IAAI,MAAM,IAAI,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC;YAAE,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC;IACzE,CAAC;IACD,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,uBAAuB,EAAE,CAAC;AACxD,CAAC;AAED,SAAS,mBAAmB,CAAC,SAAoB;IAC/C,MAAM,MAAM,GAAiB,SAAS,CAAC,GAAG,CAAC,CAAC,EAAE,EAAE,EAAE,CAChD,aAAa,CAAC,EAAE,CAAC,EAAE,kBAAkB,EAAE,EAAE,EAAE,CAAC,CAC7C,CAAC;IACF,OAAO,eAAe,CAAC,MAAM,CAAC,CAAC;AACjC,CAAC;AAUD,SAAS,iBAAiB,CACxB,KAA8B,EAC9B,OAAgC;IAEhC,MAAM,OAAO,GAAG,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;IACtC,MAAM,GAAG,GAAG,OAAO,CAAC,SAA+B,CAAC;IACpD,MAAM,WAAW,GAAG,MAAM,CAAC,OAAO,CAAC,YAAY,CAAC,CAAC;IAEjD,IAAI,YAAY,GAA2C,EAAE,CAAC;IAC9D,MAAM,UAAU,GAAG,WAAW,CAAC,sBAAsB,CAAC;IACtD,IACE,UAAU;QACV,OAAO,UAAU,KAAK,QAAQ;QAC9B,CAAC,KAAK,CAAC,OAAO,CAAC,UAAU,CAAC;QAC1B,GAAG;QACH,GAAG,IAAK,UAAsC,EAC9C,CAAC;QACD,MAAM,QAAQ,GAAI,UAAsC,CAAC,GAAG,CAAC,CAAC;QAC9D,IAAI,QAAQ,IAAI,OAAO,QAAQ,KAAK,QAAQ,EAAE,CAAC;YAC7C,MAAM,GAAG,GAAI,QAAoC,CAAC,SAAS,CAAC;YAC5D,IAAI,GAAG,IAAI,OAAO,GAAG,KAAK,QAAQ,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC;gBAC1D,YAAY,GAAG,GAA6C,CAAC;YAC/D,CAAC;QACH,CAAC;IACH,CAAC;IACD,IAAI,MAAM,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC3C,MAAM,SAAS,GAAG,WAAW,CAAC,SAAS,CAAC;QACxC,IAAI,SAAS,IAAI,OAAO,SAAS,KAAK,QAAQ,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,SAAS,CAAC,EAAE,CAAC;YAC5E,YAAY,GAAG,SAAmD,CAAC;QACrE,CAAC;IACH,CAAC;IAED,IAAI,MAAM,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC3C,OAAO;YACL,EAAE,EAAE,KAAK;YACT,UAAU,EAAE,CAAC,EAAE,MAAM,EAAE,mCAAmC,EAAE,CAAC;SAC9D,CAAC;IACJ,CAAC;IAED,IAAI,YAAY,GAAG,GAAG,CAAC;IACvB,MAAM,YAAY,GAAG,OAAO,CAAC,aAAa,CAAC;IAC3C,IAAI,OAAO,YAAY,KAAK,QAAQ,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,YAAY,CAAC,EAAE,CAAC;QACpE,YAAY,GAAG,GAAG,GAAG,YAAY,CAAC;IACpC,CAAC;IAED,MAAM,cAAc,GAAG,CAAC,GAAY,EAAiB,EAAE;QACrD,qEAAqE;QACrE,mEAAmE;QACnE,oEAAoE;QACpE,gEAAgE;QAChE,mEAAmE;QACnE,oDAAoD;QACpD,IAAI,GAAG,KAAK,IAAI,IAAI,GAAG,KAAK,SAAS;YAAE,OAAO,IAAI,CAAC;QACnD,IAAI,OAAO,GAAG,KAAK,QAAQ;YAAE,OAAO,IAAI,CAAC;QACzC,IAAI,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,GAAG,CAAC;YAAE,OAAO,IAAI,CAAC;QAC5D,OAAO,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;IACvB,CAAC,CAAC;IAEF,MAAM,UAAU,GAAyB,EAAE,CAAC;IAC5C,MAAM,IAAI,GAAG,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC;IACnE,KAAK,MAAM,KAAK,IAAI,IAAI,EAAE,CAAC;QACzB,MAAM,EAAE,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC;QACzB,MAAM,MAAM,GAAG,EAAE,CAAC,aAAa,CAAC;QAChC,MAAM,UAAU,GAAG,MAAM,IAAI,OAAO,MAAM,KAAK,QAAQ,CAAC,CAAC,CAAC,YAAY,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;QAC3F,IAAI,CAAC,UAAU,EAAE,CAAC;YAChB,UAAU,CAAC,IAAI,CAAC;gBACd,cAAc,EAAE,EAAE,CAAC,cAAc;gBACjC,aAAa,EAAE,MAAM;gBACrB,IAAI,EAAE,eAAe;gBACrB,QAAQ,EAAE,MAAM;gBAChB,OAAO,EAAE,MAAM,CAAC,IAAI,CAAC,YAAY,CAAC;aACnC,CAAC,CAAC;YACH,SAAS;QACX,CAAC;QACD,MAAM,KAAK,GAAG,MAAM,CAAC,EAAE,CAAC,KAAK,CAAC,CAAC;QAC/B,MAAM,GAAG,GAAG,UAAU,CAAC,GAAG,CAAC;QAC3B,MAAM,MAAM,GAAG,UAAU,CAAC,MAAM,CAAC;QACjC,MAAM,MAAM,GAAG,KAAK,CAAC,OAAO,CAAC;QAC7B,MAAM,MAAM,GAAG,KAAK,CAAC,OAAO,CAAC;QAC7B,MAAM,WAAW,GAAG,cAAc,CAAC,MAAM,CAAC,CAAC;QAC3C,MAAM,WAAW,GAAG,cAAc,CAAC,MAAM,CAAC,CAAC;QAE3C,IAAI,MAAM,KAAK,IAAI,IAAI,MAAM,KAAK,SAAS,IAAI,WAAW,KAAK,IAAI,EAAE,CAAC;YACpE,UAAU,CAAC,IAAI,CAAC;gBACd,cAAc,EAAE,EAAE,CAAC,cAAc;gBACjC,aAAa,EAAE,MAAM;gBACrB,IAAI,EAAE,SAAS;gBACf,QAAQ,EAAE,MAAM;gBAChB,OAAO,EAAE,4BAA4B;aACtC,CAAC,CAAC;QACL,CAAC;aAAM,IACL,WAAW,KAAK,IAAI;YACpB,OAAO,GAAG,KAAK,QAAQ;YACvB,WAAW,GAAG,GAAG,GAAG,YAAY,EAChC,CAAC;YACD,UAAU,CAAC,IAAI,CAAC;gBACd,cAAc,EAAE,EAAE,CAAC,cAAc;gBACjC,aAAa,EAAE,MAAM;gBACrB,IAAI,EAAE,SAAS;gBACf,QAAQ,EAAE,WAAW;gBACrB,OAAO,EAAE,GAAG,GAAG,YAAY;aAC5B,CAAC,CAAC;QACL,CAAC;QAED,IAAI,MAAM,KAAK,IAAI,IAAI,MAAM,KAAK,SAAS,IAAI,WAAW,KAAK,IAAI,EAAE,CAAC;YACpE,UAAU,CAAC,IAAI,CAAC;gBACd,cAAc,EAAE,EAAE,CAAC,cAAc;gBACjC,aAAa,EAAE,MAAM;gBACrB,IAAI,EAAE,SAAS;gBACf,QAAQ,EAAE,MAAM;gBAChB,OAAO,EAAE,4BAA4B;aACtC,CAAC,CAAC;QACL,CAAC;aAAM,IACL,WAAW,KAAK,IAAI;YACpB,OAAO,MAAM,KAAK,QAAQ;YAC1B,WAAW,GAAG,MAAM,GAAG,YAAY,EACnC,CAAC;YACD,UAAU,CAAC,IAAI,CAAC;gBACd,cAAc,EAAE,EAAE,CAAC,cAAc;gBACjC,aAAa,EAAE,MAAM;gBACrB,IAAI,EAAE,SAAS;gBACf,QAAQ,EAAE,WAAW;gBACrB,OAAO,EAAE,MAAM,GAAG,YAAY;aAC/B,CAAC,CAAC;QACL,CAAC;IACH,CAAC;IAED,OAAO,EAAE,EAAE,EAAE,UAAU,CAAC,MAAM,KAAK,CAAC,EAAE,UAAU,EAAE,CAAC;AACrD,CAAC;AAED,2BAA2B;AAE3B,MAAM,UAAU,kBAAkB,CAChC,KAA8B,EAC9B,OAAgC,EAChC,UAA0B,EAAE;IAE5B,MAAM,GAAG,GAAG,OAAO,CAAC,GAAG,IAAI,IAAI,IAAI,EAAE,CAAC;IAEtC,0BAA0B;IAC1B,MAAM,MAAM,GAAG,KAAK,CAAC,oBAAoB,CAAC;IAC1C,IAAI,MAAM,KAAK,kBAAkB,EAAE,CAAC;QAClC,OAAO;YACL,KAAK,EAAE,KAAK;YACZ,WAAW,EAAE,WAAW;YACxB,MAAM,EAAE,sBAAsB;YAC9B,wBAAwB,EAAE,CAAC;YAC3B,qBAAqB,EAAE,CAAC;YACxB,OAAO,EAAE,EAAE,oBAAoB,EAAE,MAAM,EAAE;SAC1C,CAAC;IACJ,CAAC;IAED,sEAAsE;IACtE,0EAA0E;IAC1E,mEAAmE;IACnE,uEAAuE;IACvE,qEAAqE;IACrE,qEAAqE;IACrE,uEAAuE;IACvE,MAAM,gBAAgB,GAAG,OAAO,CAAC,UAAU,CAAC;IAC5C,MAAM,cAAc,GAAG,KAAK,CAAC,UAAU,CAAC;IACxC,IACE,gBAAgB,KAAK,SAAS;QAC9B,gBAAgB,KAAK,IAAI;QACzB,cAAc,KAAK,gBAAgB,EACnC,CAAC;QACD,OAAO;YACL,KAAK,EAAE,KAAK;YACZ,WAAW,EAAE,WAAW;YACxB,MAAM,EAAE,wBAAwB;YAChC,wBAAwB,EAAE,CAAC;YAC3B,qBAAqB,EAAE,CAAC;YACxB,OAAO,EAAE;gBACP,gBAAgB,EAAE,cAAc;gBAChC,kBAAkB,EAAE,gBAAgB;aACrC;SACF,CAAC;IACJ,CAAC;IAED,yBAAyB;IACzB,MAAM,WAAW,GAAG,KAAK,CAAC,WAAW,CAAC;IACtC,IAAI,OAAO,WAAW,KAAK,QAAQ,IAAI,CAAC,WAAW,CAAC,UAAU,CAAC,SAAS,CAAC,EAAE,CAAC;QAC1E,OAAO;YACL,KAAK,EAAE,KAAK;YACZ,WAAW,EAAE,WAAW;YACxB,MAAM,EAAE,qBAAqB;YAC7B,wBAAwB,EAAE,CAAC;YAC3B,qBAAqB,EAAE,CAAC;YACxB,OAAO,EAAE,EAAE,WAAW,EAAE,WAAW,EAAE;SACtC,CAAC;IACJ,CAAC;IAED,mEAAmE;IACnE,kEAAkE;IAClE,iEAAiE;IACjE,iEAAiE;IACjE,gDAAgD;IAChD,MAAM,SAAS,GAAG,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC,CAAC,CAAE,KAAK,CAAC,SAAuB,CAAC,CAAC,CAAC,EAAE,CAAC;IACvF,MAAM,aAAa,GAAG,KAAK,CAAC,cAAc,CAAC;IAC3C,IACE,OAAO,aAAa,KAAK,QAAQ;QACjC,MAAM,CAAC,SAAS,CAAC,aAAa,CAAC;QAC/B,aAAa,KAAK,SAAS,CAAC,MAAM,EAClC,CAAC;QACD,OAAO;YACL,KAAK,EAAE,KAAK;YACZ,WAAW,EAAE,WAAW;YACxB,MAAM,EAAE,yBAAyB;YACjC,wBAAwB,EAAE,SAAS,CAAC,MAAM;YAC1C,qBAAqB,EAAE,CAAC;YACxB,OAAO,EAAE;gBACP,uBAAuB,EAAE,aAAa;gBACtC,wBAAwB,EAAE,SAAS,CAAC,MAAM;gBAC1C,KAAK,EAAE,kDAAkD;aAC1D;SACF,CAAC;IACJ,CAAC;IACD,IAAI,UAAkB,CAAC;IACvB,IAAI,CAAC;QACH,UAAU,GAAG,mBAAmB,CAAC,SAAS,CAAC,CAAC;IAC9C,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,OAAO;YACL,KAAK,EAAE,KAAK;YACZ,WAAW,EAAE,WAAW;YACxB,MAAM,EAAE,yBAAyB;YACjC,wBAAwB,EAAE,SAAS,CAAC,MAAM;YAC1C,qBAAqB,EAAE,CAAC;YACxB,OAAO,EAAE,EAAE,KAAK,EAAE,MAAM,CAAC,GAAG,CAAC,EAAE;SAChC,CAAC;IACJ,CAAC;IACD,IAAI,UAAU,KAAK,WAAW,EAAE,CAAC;QAC/B,OAAO;YACL,KAAK,EAAE,KAAK;YACZ,WAAW,EAAE,WAAW;YACxB,MAAM,EAAE,yBAAyB;YACjC,wBAAwB,EAAE,SAAS,CAAC,MAAM;YAC1C,qBAAqB,EAAE,CAAC;YACxB,OAAO,EAAE,EAAE,OAAO,EAAE,WAAW,EAAE,UAAU,EAAE;SAC9C,CAAC;IACJ,CAAC;IAED,oBAAoB;IACpB,MAAM,MAAM,GAAG,YAAY,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC;IAC1C,IAAI,CAAC,MAAM,CAAC,EAAE,EAAE,CAAC;QACf,OAAO;YACL,KAAK,EAAE,KAAK;YACZ,WAAW,EAAE,WAAW;YACxB,MAAM,EAAE,MAAM,CAAC,MAAM;YACrB,wBAAwB,EAAE,SAAS,CAAC,MAAM;YAC1C,qBAAqB,EAAE,SAAS,CAAC,MAAM;YACvC,OAAO,EAAE,EAAE,aAAa,EAAE,OAAO,CAAC,aAAa,EAAE;SAClD,CAAC;IACJ,CAAC;IAED,2BAA2B;IAC3B,MAAM,OAAO,GAAG,YAAY,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC;IAC7C,IAAI,CAAC,OAAO,CAAC,EAAE,EAAE,CAAC;QAChB,OAAO;YACL,KAAK,EAAE,KAAK;YACZ,WAAW,EAAE,WAAW;YACxB,MAAM,EAAE,OAAO,CAAC,MAAM;YACtB,wBAAwB,EAAE,SAAS,CAAC,MAAM;YAC1C,qBAAqB,EAAE,SAAS,CAAC,MAAM;YACvC,OAAO,EAAE,EAAE,aAAa,EAAE,KAAK,CAAC,OAAO,EAAE;SAC1C,CAAC;IACJ,CAAC;IAED,0BAA0B;IAC1B,MAAM,UAAU,GAAG,iBAAiB,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC;IACrD,IAAI,CAAC,UAAU,CAAC,EAAE,EAAE,CAAC;QACnB,OAAO;YACL,KAAK,EAAE,KAAK;YACZ,WAAW,EAAE,WAAW;YACxB,MAAM,EAAE,qBAAqB;YAC7B,wBAAwB,EAAE,SAAS,CAAC,MAAM;YAC1C,qBAAqB,EAAE,SAAS,CAAC,MAAM;YACvC,OAAO,EAAE,EAAE,UAAU,EAAE,UAAU,CAAC,UAAU,EAAE;SAC/C,CAAC;IACJ,CAAC;IAED,OAAO;QACL,KAAK,EAAE,IAAI;QACX,WAAW,EAAE,gBAAgB;QAC7B,MAAM,EAAE,qBAAqB;QAC7B,wBAAwB,EAAE,SAAS,CAAC,MAAM;QAC1C,qBAAqB,EAAE,SAAS,CAAC,MAAM;QACvC,OAAO,EAAE;YACP,UAAU,EAAE,OAAO,CAAC,UAAU;YAC9B,aAAa,EAAE,OAAO,CAAC,aAAa;SACrC;KACF,CAAC;AACJ,CAAC"}
package/dist/cli.d.ts ADDED
@@ -0,0 +1,18 @@
1
+ #!/usr/bin/env node
2
+ /**
3
+ * primust-verify CLI
4
+ *
5
+ * Usage:
6
+ * primust-verify vpec_<id>.json
7
+ * primust-verify vpec_<id>.json --production
8
+ * primust-verify vpec_<id>.json --trust-root ./my-pubkey.pem
9
+ * primust-verify vpec_<id>.json --skip-network
10
+ * primust-verify vpec_<id>.json --json
11
+ *
12
+ * Exit codes:
13
+ * 0 = valid (production)
14
+ * 1 = invalid / tampered
15
+ * 2 = valid but sandbox-only (or system error)
16
+ */
17
+ export declare function main(args?: string[]): Promise<number>;
18
+ //# sourceMappingURL=cli.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cli.d.ts","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":";AAEA;;;;;;;;;;;;;;GAcG;AAoOH,wBAAsB,IAAI,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,MAAM,CAAC,CAmK3D"}