@emilia-protocol/gate 0.10.0 → 0.13.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 +91 -0
- package/README.md +272 -0
- package/action-control-manifest.js +3 -268
- package/action-escrow-custodian.js +4 -0
- package/action-escrow-evidence.js +4 -0
- package/action-escrow-package.js +4 -0
- package/action-escrow-postgres.js +4 -0
- package/action-escrow-state.js +4 -0
- package/action-escrow-verifiers.js +4 -0
- package/action-escrow.js +4 -0
- package/action-packs.js +3 -140
- package/adapters/_kit.js +3 -104
- package/adapters/aws.js +3 -108
- package/adapters/cloudflare.js +3 -54
- package/adapters/gcp.js +3 -70
- package/adapters/github.js +3 -109
- package/adapters/jira.js +3 -55
- package/adapters/k8s.js +3 -70
- package/adapters/linear.js +3 -55
- package/adapters/salesforce.js +3 -55
- package/adapters/stripe.js +3 -81
- package/adapters/supabase.js +3 -121
- package/adapters/terraform.js +3 -59
- package/adapters/vercel.js +3 -84
- package/aec-execution.js +3 -312
- package/breakglass.js +3 -582
- package/capability-receipt.js +4 -0
- package/cf1-conformance.js +3 -106
- package/challenge-store.js +3 -69
- package/control-plane.js +3 -340
- package/coverage.js +3 -721
- package/demo.mjs +1 -1
- package/deployment-attestation.js +3 -247
- package/dist/action-control-manifest.d.ts +82 -0
- package/dist/action-control-manifest.d.ts.map +1 -0
- package/dist/action-control-manifest.js +422 -0
- package/dist/action-control-manifest.js.map +1 -0
- package/dist/action-escrow-custodian.d.ts +74 -0
- package/dist/action-escrow-custodian.d.ts.map +1 -0
- package/dist/action-escrow-custodian.js +363 -0
- package/dist/action-escrow-custodian.js.map +1 -0
- package/dist/action-escrow-evidence.d.ts +130 -0
- package/dist/action-escrow-evidence.d.ts.map +1 -0
- package/dist/action-escrow-evidence.js +1012 -0
- package/dist/action-escrow-evidence.js.map +1 -0
- package/dist/action-escrow-package.d.ts +10 -0
- package/dist/action-escrow-package.d.ts.map +1 -0
- package/dist/action-escrow-package.js +1583 -0
- package/dist/action-escrow-package.js.map +1 -0
- package/dist/action-escrow-postgres.d.ts +62 -0
- package/dist/action-escrow-postgres.d.ts.map +1 -0
- package/dist/action-escrow-postgres.js +339 -0
- package/dist/action-escrow-postgres.js.map +1 -0
- package/dist/action-escrow-state.d.ts +141 -0
- package/dist/action-escrow-state.d.ts.map +1 -0
- package/dist/action-escrow-state.js +413 -0
- package/dist/action-escrow-state.js.map +1 -0
- package/dist/action-escrow-verifiers.d.ts +65 -0
- package/dist/action-escrow-verifiers.d.ts.map +1 -0
- package/dist/action-escrow-verifiers.js +421 -0
- package/dist/action-escrow-verifiers.js.map +1 -0
- package/dist/action-escrow.d.ts +112 -0
- package/dist/action-escrow.d.ts.map +1 -0
- package/dist/action-escrow.js +2661 -0
- package/dist/action-escrow.js.map +1 -0
- package/dist/action-packs.d.ts +54 -0
- package/dist/action-packs.d.ts.map +1 -0
- package/dist/action-packs.js +143 -0
- package/dist/action-packs.js.map +1 -0
- package/dist/adapters/_kit.d.ts +50 -0
- package/dist/adapters/_kit.d.ts.map +1 -0
- package/dist/adapters/_kit.js +98 -0
- package/dist/adapters/_kit.js.map +1 -0
- package/dist/adapters/aws.d.ts +158 -0
- package/dist/adapters/aws.d.ts.map +1 -0
- package/dist/adapters/aws.js +136 -0
- package/dist/adapters/aws.js.map +1 -0
- package/dist/adapters/cloudflare.d.ts +116 -0
- package/dist/adapters/cloudflare.d.ts.map +1 -0
- package/dist/adapters/cloudflare.js +75 -0
- package/dist/adapters/cloudflare.js.map +1 -0
- package/dist/adapters/gcp.d.ts +139 -0
- package/dist/adapters/gcp.d.ts.map +1 -0
- package/dist/adapters/gcp.js +69 -0
- package/dist/adapters/gcp.js.map +1 -0
- package/dist/adapters/github.d.ts +123 -0
- package/dist/adapters/github.d.ts.map +1 -0
- package/dist/adapters/github.js +105 -0
- package/dist/adapters/github.js.map +1 -0
- package/dist/adapters/jira.d.ts +109 -0
- package/dist/adapters/jira.d.ts.map +1 -0
- package/dist/adapters/jira.js +54 -0
- package/dist/adapters/jira.js.map +1 -0
- package/dist/adapters/k8s.d.ts +139 -0
- package/dist/adapters/k8s.d.ts.map +1 -0
- package/dist/adapters/k8s.js +69 -0
- package/dist/adapters/k8s.js.map +1 -0
- package/dist/adapters/linear.d.ts +109 -0
- package/dist/adapters/linear.d.ts.map +1 -0
- package/dist/adapters/linear.js +54 -0
- package/dist/adapters/linear.js.map +1 -0
- package/dist/adapters/salesforce.d.ts +109 -0
- package/dist/adapters/salesforce.d.ts.map +1 -0
- package/dist/adapters/salesforce.js +54 -0
- package/dist/adapters/salesforce.js.map +1 -0
- package/dist/adapters/stripe.d.ts +116 -0
- package/dist/adapters/stripe.d.ts.map +1 -0
- package/dist/adapters/stripe.js +77 -0
- package/dist/adapters/stripe.js.map +1 -0
- package/dist/adapters/supabase.d.ts +127 -0
- package/dist/adapters/supabase.d.ts.map +1 -0
- package/dist/adapters/supabase.js +112 -0
- package/dist/adapters/supabase.js.map +1 -0
- package/dist/adapters/terraform.d.ts +109 -0
- package/dist/adapters/terraform.d.ts.map +1 -0
- package/dist/adapters/terraform.js +58 -0
- package/dist/adapters/terraform.js.map +1 -0
- package/dist/adapters/vercel.d.ts +114 -0
- package/dist/adapters/vercel.d.ts.map +1 -0
- package/dist/adapters/vercel.js +81 -0
- package/dist/adapters/vercel.js.map +1 -0
- package/dist/aec-execution.d.ts +107 -0
- package/dist/aec-execution.d.ts.map +1 -0
- package/dist/aec-execution.js +334 -0
- package/dist/aec-execution.js.map +1 -0
- package/dist/breakglass.d.ts +205 -0
- package/dist/breakglass.d.ts.map +1 -0
- package/dist/breakglass.js +627 -0
- package/dist/breakglass.js.map +1 -0
- package/dist/capability-receipt.d.ts +601 -0
- package/dist/capability-receipt.d.ts.map +1 -0
- package/dist/capability-receipt.js +1177 -0
- package/dist/capability-receipt.js.map +1 -0
- package/dist/cf1-conformance.d.ts +83 -0
- package/dist/cf1-conformance.d.ts.map +1 -0
- package/dist/cf1-conformance.js +94 -0
- package/dist/cf1-conformance.js.map +1 -0
- package/dist/challenge-store.d.ts +20 -0
- package/dist/challenge-store.d.ts.map +1 -0
- package/dist/challenge-store.js +62 -0
- package/dist/challenge-store.js.map +1 -0
- package/dist/control-plane.d.ts +136 -0
- package/dist/control-plane.d.ts.map +1 -0
- package/dist/control-plane.js +349 -0
- package/dist/control-plane.js.map +1 -0
- package/dist/coverage.d.ts +156 -0
- package/dist/coverage.d.ts.map +1 -0
- package/dist/coverage.js +768 -0
- package/dist/coverage.js.map +1 -0
- package/dist/deployment-attestation.d.ts +93 -0
- package/dist/deployment-attestation.d.ts.map +1 -0
- package/dist/deployment-attestation.js +262 -0
- package/dist/deployment-attestation.js.map +1 -0
- package/dist/eg1-conformance.d.ts +286 -0
- package/dist/eg1-conformance.d.ts.map +1 -0
- package/dist/eg1-conformance.js +379 -0
- package/dist/eg1-conformance.js.map +1 -0
- package/dist/enterprise.d.ts +88 -0
- package/dist/enterprise.d.ts.map +1 -0
- package/dist/enterprise.js +194 -0
- package/dist/enterprise.js.map +1 -0
- package/dist/evidence-postgres.d.ts +123 -0
- package/dist/evidence-postgres.d.ts.map +1 -0
- package/dist/evidence-postgres.js +343 -0
- package/dist/evidence-postgres.js.map +1 -0
- package/dist/evidence.d.ts +113 -0
- package/dist/evidence.d.ts.map +1 -0
- package/dist/evidence.js +369 -0
- package/dist/evidence.js.map +1 -0
- package/dist/execution-binding.d.ts +49 -0
- package/dist/execution-binding.d.ts.map +1 -0
- package/dist/execution-binding.js +243 -0
- package/dist/execution-binding.js.map +1 -0
- package/dist/formal-runtime-map.d.ts +42 -0
- package/dist/formal-runtime-map.d.ts.map +1 -0
- package/dist/formal-runtime-map.js +23 -0
- package/dist/formal-runtime-map.js.map +1 -0
- package/dist/index.d.ts +1002 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +1736 -0
- package/dist/index.js.map +1 -0
- package/dist/key-registry.d.ts +60 -0
- package/dist/key-registry.d.ts.map +1 -0
- package/dist/key-registry.js +144 -0
- package/dist/key-registry.js.map +1 -0
- package/dist/mcp.d.ts +53 -0
- package/dist/mcp.d.ts.map +1 -0
- package/dist/mcp.js +112 -0
- package/dist/mcp.js.map +1 -0
- package/dist/metering.d.ts +80 -0
- package/dist/metering.d.ts.map +1 -0
- package/dist/metering.js +227 -0
- package/dist/metering.js.map +1 -0
- package/dist/metrics.d.ts +68 -0
- package/dist/metrics.d.ts.map +1 -0
- package/dist/metrics.js +242 -0
- package/dist/metrics.js.map +1 -0
- package/dist/network-witness.d.ts +167 -0
- package/dist/network-witness.d.ts.map +1 -0
- package/dist/network-witness.js +520 -0
- package/dist/network-witness.js.map +1 -0
- package/dist/protocol-state.d.ts +141 -0
- package/dist/protocol-state.d.ts.map +1 -0
- package/dist/protocol-state.js +106 -0
- package/dist/protocol-state.js.map +1 -0
- package/dist/receipt-program.d.ts +59 -0
- package/dist/receipt-program.d.ts.map +1 -0
- package/dist/receipt-program.js +1053 -0
- package/dist/receipt-program.js.map +1 -0
- package/dist/reliance-kernel.d.ts +66 -0
- package/dist/reliance-kernel.d.ts.map +1 -0
- package/dist/reliance-kernel.js +103 -0
- package/dist/reliance-kernel.js.map +1 -0
- package/dist/reliance-packet.d.ts +67 -0
- package/dist/reliance-packet.d.ts.map +1 -0
- package/dist/reliance-packet.js +176 -0
- package/dist/reliance-packet.js.map +1 -0
- package/dist/remedy-program-postgres.d.ts +37 -0
- package/dist/remedy-program-postgres.d.ts.map +1 -0
- package/dist/remedy-program-postgres.js +291 -0
- package/dist/remedy-program-postgres.js.map +1 -0
- package/dist/remedy-program-receipt.d.ts +97 -0
- package/dist/remedy-program-receipt.d.ts.map +1 -0
- package/dist/remedy-program-receipt.js +817 -0
- package/dist/remedy-program-receipt.js.map +1 -0
- package/dist/remedy-program.d.ts +76 -0
- package/dist/remedy-program.d.ts.map +1 -0
- package/dist/remedy-program.js +1346 -0
- package/dist/remedy-program.js.map +1 -0
- package/dist/reports/art14.d.ts +101 -0
- package/dist/reports/art14.d.ts.map +1 -0
- package/dist/reports/art14.js +340 -0
- package/dist/reports/art14.js.map +1 -0
- package/dist/reports/assurance-package.d.ts +197 -0
- package/dist/reports/assurance-package.d.ts.map +1 -0
- package/dist/reports/assurance-package.js +313 -0
- package/dist/reports/assurance-package.js.map +1 -0
- package/dist/reports/auditor-workpaper.d.ts +194 -0
- package/dist/reports/auditor-workpaper.d.ts.map +1 -0
- package/dist/reports/auditor-workpaper.js +545 -0
- package/dist/reports/auditor-workpaper.js.map +1 -0
- package/dist/reports/external-verification.d.ts +76 -0
- package/dist/reports/external-verification.d.ts.map +1 -0
- package/dist/reports/external-verification.js +209 -0
- package/dist/reports/external-verification.js.map +1 -0
- package/dist/reports/reperform.d.ts +122 -0
- package/dist/reports/reperform.d.ts.map +1 -0
- package/dist/reports/reperform.js +432 -0
- package/dist/reports/reperform.js.map +1 -0
- package/dist/reports/underwriter.d.ts +127 -0
- package/dist/reports/underwriter.d.ts.map +1 -0
- package/dist/reports/underwriter.js +348 -0
- package/dist/reports/underwriter.js.map +1 -0
- package/dist/retention.d.ts +88 -0
- package/dist/retention.d.ts.map +1 -0
- package/dist/retention.js +90 -0
- package/dist/retention.js.map +1 -0
- package/dist/roster.d.ts +113 -0
- package/dist/roster.d.ts.map +1 -0
- package/dist/roster.js +261 -0
- package/dist/roster.js.map +1 -0
- package/dist/runtime-monitor.d.ts +132 -0
- package/dist/runtime-monitor.d.ts.map +1 -0
- package/dist/runtime-monitor.js +197 -0
- package/dist/runtime-monitor.js.map +1 -0
- package/dist/settlement.d.ts +68 -0
- package/dist/settlement.d.ts.map +1 -0
- package/dist/settlement.js +306 -0
- package/dist/settlement.js.map +1 -0
- package/dist/siem.d.ts +261 -0
- package/dist/siem.d.ts.map +1 -0
- package/dist/siem.js +247 -0
- package/dist/siem.js.map +1 -0
- package/dist/store-postgres.d.ts +107 -0
- package/dist/store-postgres.d.ts.map +1 -0
- package/dist/store-postgres.js +152 -0
- package/dist/store-postgres.js.map +1 -0
- package/dist/store.d.ts +95 -0
- package/dist/store.d.ts.map +1 -0
- package/dist/store.js +202 -0
- package/dist/store.js.map +1 -0
- package/dist/strict-json.d.ts +14 -0
- package/dist/strict-json.d.ts.map +1 -0
- package/dist/strict-json.js +132 -0
- package/dist/strict-json.js.map +1 -0
- package/dist/trust-program-adapters.d.ts +122 -0
- package/dist/trust-program-adapters.d.ts.map +1 -0
- package/dist/trust-program-adapters.js +802 -0
- package/dist/trust-program-adapters.js.map +1 -0
- package/dist/trust-program-postgres.d.ts +41 -0
- package/dist/trust-program-postgres.d.ts.map +1 -0
- package/dist/trust-program-postgres.js +346 -0
- package/dist/trust-program-postgres.js.map +1 -0
- package/dist/trust-program-revocation.d.ts +206 -0
- package/dist/trust-program-revocation.d.ts.map +1 -0
- package/dist/trust-program-revocation.js +600 -0
- package/dist/trust-program-revocation.js.map +1 -0
- package/dist/trust-program.d.ts +197 -0
- package/dist/trust-program.d.ts.map +1 -0
- package/dist/trust-program.js +1351 -0
- package/dist/trust-program.js.map +1 -0
- package/dist/witness-postgres.d.ts +43 -0
- package/dist/witness-postgres.d.ts.map +1 -0
- package/dist/witness-postgres.js +92 -0
- package/dist/witness-postgres.js.map +1 -0
- package/dist/zk-range-proof.d.ts +78 -0
- package/dist/zk-range-proof.d.ts.map +1 -0
- package/dist/zk-range-proof.js +228 -0
- package/dist/zk-range-proof.js.map +1 -0
- package/eg1-conformance.js +3 -404
- package/enterprise.js +3 -180
- package/ep-assure.mjs +1 -0
- package/evidence-postgres.js +3 -356
- package/evidence.js +4 -360
- package/execution-binding.js +3 -212
- package/formal-runtime-map.js +4 -0
- package/index.js +4 -1249
- package/key-registry.js +3 -134
- package/mcp.js +3 -109
- package/metering.js +3 -226
- package/metrics.js +3 -231
- package/network-witness.js +3 -499
- package/package.json +47 -4
- package/receipt-program.js +4 -0
- package/reliance-kernel.js +3 -112
- package/reliance-packet.js +3 -175
- package/remedy-program-postgres.js +4 -0
- package/remedy-program-receipt.js +4 -0
- package/remedy-program.js +4 -0
- package/reports/art14.js +0 -0
- package/reports/assurance-package.js +2 -312
- package/reports/auditor-workpaper.js +3 -537
- package/reports/external-verification.js +3 -222
- package/reports/reperform.js +3 -424
- package/reports/underwriter.js +3 -339
- package/retention.js +3 -84
- package/roster.js +3 -264
- package/runtime-monitor.js +4 -0
- package/settlement.js +3 -299
- package/siem.js +3 -235
- package/src/action-control-manifest.ts +424 -0
- package/src/action-escrow-custodian.ts +427 -0
- package/src/action-escrow-evidence.ts +1178 -0
- package/src/action-escrow-package.ts +1821 -0
- package/src/action-escrow-postgres.ts +366 -0
- package/src/action-escrow-state.ts +498 -0
- package/src/action-escrow-verifiers.ts +484 -0
- package/src/action-escrow.ts +3039 -0
- package/src/action-packs.ts +170 -0
- package/src/adapters/_kit.ts +117 -0
- package/src/adapters/aws.ts +142 -0
- package/src/adapters/cloudflare.ts +78 -0
- package/src/adapters/gcp.ts +71 -0
- package/src/adapters/github.ts +110 -0
- package/src/adapters/jira.ts +56 -0
- package/src/adapters/k8s.ts +71 -0
- package/src/adapters/linear.ts +56 -0
- package/src/adapters/salesforce.ts +56 -0
- package/src/adapters/stripe.ts +82 -0
- package/src/adapters/supabase.ts +122 -0
- package/src/adapters/terraform.ts +60 -0
- package/src/adapters/vercel.ts +85 -0
- package/src/aec-execution.ts +354 -0
- package/src/breakglass.ts +647 -0
- package/src/capability-receipt.ts +1258 -0
- package/src/cf1-conformance.ts +120 -0
- package/src/challenge-store.ts +70 -0
- package/src/control-plane.ts +374 -0
- package/src/coverage.ts +832 -0
- package/src/deployment-attestation.ts +259 -0
- package/src/eg1-conformance.ts +471 -0
- package/src/enterprise.ts +195 -0
- package/src/evidence-postgres.ts +374 -0
- package/src/evidence.ts +367 -0
- package/src/execution-binding.ts +236 -0
- package/src/formal-runtime-map.ts +24 -0
- package/src/index.ts +2122 -0
- package/src/key-registry.ts +150 -0
- package/src/mcp.ts +120 -0
- package/src/metering.ts +237 -0
- package/src/metrics.ts +232 -0
- package/src/network-witness.ts +585 -0
- package/src/protocol-state.ts +143 -0
- package/src/protocol-state.typecheck.ts +94 -0
- package/src/receipt-program.ts +1105 -0
- package/src/reliance-kernel.ts +119 -0
- package/src/reliance-packet.ts +206 -0
- package/src/remedy-program-postgres.ts +367 -0
- package/src/remedy-program-receipt.ts +891 -0
- package/src/remedy-program.ts +1388 -0
- package/src/reports/art14.ts +361 -0
- package/src/reports/assurance-package.ts +330 -0
- package/src/reports/auditor-workpaper.ts +558 -0
- package/src/reports/external-verification.ts +232 -0
- package/src/reports/reperform.ts +441 -0
- package/src/reports/underwriter.ts +356 -0
- package/src/retention.ts +100 -0
- package/src/roster.ts +273 -0
- package/src/runtime-monitor.ts +217 -0
- package/src/settlement.ts +313 -0
- package/src/siem.ts +247 -0
- package/src/store-postgres.ts +167 -0
- package/src/store.ts +214 -0
- package/src/strict-json.ts +115 -0
- package/src/trust-program-adapters.ts +847 -0
- package/src/trust-program-postgres.ts +429 -0
- package/src/trust-program-revocation.ts +751 -0
- package/src/trust-program.ts +1460 -0
- package/src/witness-postgres.ts +106 -0
- package/src/zk-range-proof.ts +250 -0
- package/store-postgres.js +3 -161
- package/store.js +4 -198
- package/strict-json.js +3 -85
- package/trust-program-adapters.js +4 -0
- package/trust-program-postgres.js +4 -0
- package/trust-program-revocation.js +4 -0
- package/trust-program.js +4 -0
- package/witness-postgres.js +3 -96
- package/zk-range-proof.js +4 -0
|
@@ -0,0 +1,209 @@
|
|
|
1
|
+
// SPDX-License-Identifier: Apache-2.0
|
|
2
|
+
/**
|
|
3
|
+
* EP-EXTERNAL-VERIFICATION-STATEMENT-v1.
|
|
4
|
+
*
|
|
5
|
+
* A signed statement a NON-EMILIA verifier can issue after it re-performs an
|
|
6
|
+
* evidence log, replays an admissibility profile, or runs a conformance harness.
|
|
7
|
+
* This is the missing adoption rail between "our verifier works" and "an
|
|
8
|
+
* outside party says exactly what they checked."
|
|
9
|
+
*
|
|
10
|
+
* Scope is intentionally narrow:
|
|
11
|
+
* - the statement signs a procedure, inputs, result, and limitations;
|
|
12
|
+
* - it does NOT authorize an action;
|
|
13
|
+
* - it does NOT certify business correctness;
|
|
14
|
+
* - acceptance is by a relying party pinning the external verifier key.
|
|
15
|
+
*/
|
|
16
|
+
import crypto from 'node:crypto';
|
|
17
|
+
// In-package canonicalize (byte-identical to lib/canonical-json.js): reports must
|
|
18
|
+
// never import outside the package root or the published tarball cannot resolve it.
|
|
19
|
+
import { canonicalize } from '../execution-binding.js';
|
|
20
|
+
export const EXTERNAL_VERIFICATION_STATEMENT_VERSION = 'EP-EXTERNAL-VERIFICATION-STATEMENT-v1';
|
|
21
|
+
export const EXTERNAL_VERIFICATION_DOMAIN = 'EP-EXTERNAL-VERIFICATION-STATEMENT-v1\0';
|
|
22
|
+
const SHA256_RE = /^sha256:[0-9a-f]{64}$/i;
|
|
23
|
+
function sha256hex(bytes) {
|
|
24
|
+
return crypto.createHash('sha256').update(bytes).digest('hex');
|
|
25
|
+
}
|
|
26
|
+
function publicKeyToB64u(key) {
|
|
27
|
+
return crypto.createPublicKey(key).export({ type: 'spki', format: 'der' }).toString('base64url');
|
|
28
|
+
}
|
|
29
|
+
function keyIdFor(publicKeyB64u) {
|
|
30
|
+
return `ep:external-verifier-key:sha256:${sha256hex(Buffer.from(publicKeyB64u, 'base64url')).slice(0, 16)}`;
|
|
31
|
+
}
|
|
32
|
+
function signingBytes(unsignedStatement) {
|
|
33
|
+
return Buffer.from(EXTERNAL_VERIFICATION_DOMAIN + canonicalize(unsignedStatement), 'utf8');
|
|
34
|
+
}
|
|
35
|
+
function unsigned(statement) {
|
|
36
|
+
if (!statement || typeof statement !== 'object' || Array.isArray(statement)) {
|
|
37
|
+
throw new Error('statement must be an object');
|
|
38
|
+
}
|
|
39
|
+
const { signature: _signature, ...body } = statement;
|
|
40
|
+
return body;
|
|
41
|
+
}
|
|
42
|
+
/** Digest of the signed statement body, excluding the signature envelope. */
|
|
43
|
+
export function externalVerificationDigest(statement) {
|
|
44
|
+
return `sha256:${sha256hex(signingBytes(unsigned(statement)))}`;
|
|
45
|
+
}
|
|
46
|
+
function normalizeChecks(checks) {
|
|
47
|
+
if (!Array.isArray(checks))
|
|
48
|
+
return [];
|
|
49
|
+
return checks.map((c) => ({
|
|
50
|
+
id: String(c?.id ?? ''),
|
|
51
|
+
ok: c?.ok === true,
|
|
52
|
+
...(c?.detail !== undefined ? { detail: c.detail } : {}),
|
|
53
|
+
})).filter((c) => c.id);
|
|
54
|
+
}
|
|
55
|
+
/**
|
|
56
|
+
* Build and sign an external-verifier statement.
|
|
57
|
+
*
|
|
58
|
+
* @param {object} args
|
|
59
|
+
* @param {object} args.verifier {id, name?, organization?}
|
|
60
|
+
* @param {object} args.subject what was checked, e.g. {kind:'evidence_log', head:'sha256:...'}
|
|
61
|
+
* @param {object} args.procedure {id, version?, tool?, command?}
|
|
62
|
+
* @param {object} args.result {status, checks?, artifact_digest?}
|
|
63
|
+
* @param {object} [args.inputs] stable digests/ids the procedure consumed
|
|
64
|
+
* @param {string[]} [args.limitations] honest non-claims
|
|
65
|
+
* @param {string|number} [args.generated_at] ISO or epoch millis
|
|
66
|
+
* @param {crypto.KeyObject} privateKey Ed25519 private key
|
|
67
|
+
*/
|
|
68
|
+
export function signExternalVerificationStatement(args, privateKey) {
|
|
69
|
+
if (!privateKey)
|
|
70
|
+
throw new Error('privateKey is required');
|
|
71
|
+
const generatedAt = args?.generated_at !== undefined
|
|
72
|
+
? new Date(args.generated_at).toISOString()
|
|
73
|
+
: new Date().toISOString();
|
|
74
|
+
const publicKey = publicKeyToB64u(privateKey);
|
|
75
|
+
const body = {
|
|
76
|
+
'@version': EXTERNAL_VERIFICATION_STATEMENT_VERSION,
|
|
77
|
+
generated_at: generatedAt,
|
|
78
|
+
verifier: {
|
|
79
|
+
id: args?.verifier?.id ?? keyIdFor(publicKey),
|
|
80
|
+
...(args?.verifier?.name ? { name: args.verifier.name } : {}),
|
|
81
|
+
...(args?.verifier?.organization ? { organization: args.verifier.organization } : {}),
|
|
82
|
+
},
|
|
83
|
+
subject: args?.subject ?? {},
|
|
84
|
+
procedure: args?.procedure ?? {},
|
|
85
|
+
inputs: args?.inputs ?? {},
|
|
86
|
+
result: {
|
|
87
|
+
status: String(args?.result?.status ?? 'unknown'),
|
|
88
|
+
checks: normalizeChecks(args?.result?.checks),
|
|
89
|
+
...(args?.result?.artifact_digest ? { artifact_digest: args.result.artifact_digest } : {}),
|
|
90
|
+
},
|
|
91
|
+
limitations: Array.isArray(args?.limitations) && args.limitations.length
|
|
92
|
+
? args.limitations.map(String)
|
|
93
|
+
: [
|
|
94
|
+
'This statement records the external verifier procedure and result; it does not authorize the action.',
|
|
95
|
+
'It does not certify business correctness, legal compliance, or human wisdom.',
|
|
96
|
+
'Acceptance depends on the relying party pinning the verifier key out of band.',
|
|
97
|
+
'The statement carries no expiry and no consumer binding; it is replayable verbatim, and generated_at is asserted by the signer, not verified.',
|
|
98
|
+
],
|
|
99
|
+
};
|
|
100
|
+
const digest = externalVerificationDigest(body);
|
|
101
|
+
const sig = crypto.sign(null, signingBytes(body), privateKey).toString('base64url');
|
|
102
|
+
return Object.freeze({
|
|
103
|
+
...body,
|
|
104
|
+
signature: {
|
|
105
|
+
algorithm: 'Ed25519',
|
|
106
|
+
key_id: keyIdFor(publicKey),
|
|
107
|
+
public_key: publicKey,
|
|
108
|
+
statement_digest: digest,
|
|
109
|
+
signature_b64u: sig,
|
|
110
|
+
},
|
|
111
|
+
});
|
|
112
|
+
}
|
|
113
|
+
/**
|
|
114
|
+
* Verify a signed external-verifier statement against pinned verifier keys.
|
|
115
|
+
*
|
|
116
|
+
* @param {object} statement
|
|
117
|
+
* @param {{pinnedVerifierKeys?:Array<{verifier_id?:string,key_id?:string,public_key:string}>}} [opts]
|
|
118
|
+
*/
|
|
119
|
+
export function verifyExternalVerificationStatement(statement, opts = {}) {
|
|
120
|
+
const fail = (reason, extra = {}) => ({
|
|
121
|
+
verified: false,
|
|
122
|
+
accepted: false,
|
|
123
|
+
checks: {
|
|
124
|
+
version: statement?.['@version'] === EXTERNAL_VERIFICATION_STATEMENT_VERSION,
|
|
125
|
+
signature: false,
|
|
126
|
+
pinned_verifier_key: false,
|
|
127
|
+
statement_digest: false,
|
|
128
|
+
},
|
|
129
|
+
reason,
|
|
130
|
+
...extra,
|
|
131
|
+
});
|
|
132
|
+
if (statement?.['@version'] !== EXTERNAL_VERIFICATION_STATEMENT_VERSION) {
|
|
133
|
+
return fail('unsupported_version');
|
|
134
|
+
}
|
|
135
|
+
const sig = statement.signature;
|
|
136
|
+
if (!sig || sig.algorithm !== 'Ed25519' || typeof sig.public_key !== 'string' || typeof sig.signature_b64u !== 'string') {
|
|
137
|
+
return fail('signature_missing_or_malformed');
|
|
138
|
+
}
|
|
139
|
+
if (typeof sig.statement_digest !== 'string' || !SHA256_RE.test(sig.statement_digest)) {
|
|
140
|
+
return fail('statement_digest_missing_or_malformed');
|
|
141
|
+
}
|
|
142
|
+
let digest;
|
|
143
|
+
try {
|
|
144
|
+
digest = externalVerificationDigest(statement);
|
|
145
|
+
}
|
|
146
|
+
catch {
|
|
147
|
+
return fail('statement_uncanonicalizable');
|
|
148
|
+
}
|
|
149
|
+
if (digest !== sig.statement_digest) {
|
|
150
|
+
return fail('statement_digest_mismatch', { statement_digest: digest });
|
|
151
|
+
}
|
|
152
|
+
const pinned = Array.isArray(opts.pinnedVerifierKeys) ? opts.pinnedVerifierKeys : [];
|
|
153
|
+
const verifierId = statement.verifier?.id ?? null;
|
|
154
|
+
// key_id is always DERIVED from the carried public key. The envelope's key_id is
|
|
155
|
+
// outside the signed bytes, so it is attacker-malleable; if present it must match
|
|
156
|
+
// the derived value or the statement is refused.
|
|
157
|
+
const keyId = keyIdFor(sig.public_key);
|
|
158
|
+
if (sig.key_id !== undefined && sig.key_id !== keyId) {
|
|
159
|
+
return fail('key_id_mismatch', { statement_digest: digest });
|
|
160
|
+
}
|
|
161
|
+
// A pin grants an identity, not just a key: every usable pin entry must name the
|
|
162
|
+
// verifier_id it vouches for. A pin that matches the key but omits verifier_id
|
|
163
|
+
// (or names a different one) never binds the statement's claimed identity.
|
|
164
|
+
const keyMatched = pinned.filter((k) => k?.public_key === sig.public_key
|
|
165
|
+
&& (k.key_id === undefined || k.key_id === keyId));
|
|
166
|
+
const pin = keyMatched.find((k) => typeof k.verifier_id === 'string' && k.verifier_id === verifierId);
|
|
167
|
+
if (!pin) {
|
|
168
|
+
return {
|
|
169
|
+
verified: false,
|
|
170
|
+
accepted: false,
|
|
171
|
+
checks: { version: true, signature: false, pinned_verifier_key: false, statement_digest: true },
|
|
172
|
+
reason: keyMatched.length ? 'pin_missing_or_mismatched_verifier_id' : 'verifier_key_not_pinned',
|
|
173
|
+
statement_digest: digest,
|
|
174
|
+
};
|
|
175
|
+
}
|
|
176
|
+
let ok = false;
|
|
177
|
+
try {
|
|
178
|
+
const publicKey = crypto.createPublicKey({ key: Buffer.from(sig.public_key, 'base64url'), type: 'spki', format: 'der' });
|
|
179
|
+
ok = crypto.verify(null, signingBytes(unsigned(statement)), publicKey, Buffer.from(sig.signature_b64u, 'base64url'));
|
|
180
|
+
}
|
|
181
|
+
catch {
|
|
182
|
+
ok = false;
|
|
183
|
+
}
|
|
184
|
+
if (!ok) {
|
|
185
|
+
return {
|
|
186
|
+
verified: false,
|
|
187
|
+
accepted: false,
|
|
188
|
+
checks: { version: true, signature: false, pinned_verifier_key: true, statement_digest: true },
|
|
189
|
+
reason: 'signature_invalid',
|
|
190
|
+
statement_digest: digest,
|
|
191
|
+
};
|
|
192
|
+
}
|
|
193
|
+
return {
|
|
194
|
+
verified: true,
|
|
195
|
+
accepted: true,
|
|
196
|
+
checks: { version: true, signature: true, pinned_verifier_key: true, statement_digest: true },
|
|
197
|
+
verifier_id: verifierId,
|
|
198
|
+
key_id: keyId,
|
|
199
|
+
statement_digest: digest,
|
|
200
|
+
};
|
|
201
|
+
}
|
|
202
|
+
export default {
|
|
203
|
+
EXTERNAL_VERIFICATION_STATEMENT_VERSION,
|
|
204
|
+
EXTERNAL_VERIFICATION_DOMAIN,
|
|
205
|
+
externalVerificationDigest,
|
|
206
|
+
signExternalVerificationStatement,
|
|
207
|
+
verifyExternalVerificationStatement,
|
|
208
|
+
};
|
|
209
|
+
//# sourceMappingURL=external-verification.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"external-verification.js","sourceRoot":"","sources":["../../src/reports/external-verification.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,122 @@
|
|
|
1
|
+
export declare const REPERFORMANCE_VERSION = "EP-GATE-REPERFORMANCE-v1";
|
|
2
|
+
/**
|
|
3
|
+
* Re-perform the evidence: rebuild the chain, re-verify carried cryptographic
|
|
4
|
+
* material, recompute the counts. Async because the chain is rebuilt through
|
|
5
|
+
* the evidence log's own (async) record().
|
|
6
|
+
*
|
|
7
|
+
* The entries MUST be the complete log from genesis (`evidence.all()` or a
|
|
8
|
+
* full export). A partial slice fails the chain (fail closed) because its
|
|
9
|
+
* first link cannot chain from 'genesis'.
|
|
10
|
+
*
|
|
11
|
+
* Chain method — drives evidence.js's REAL verify(), twice over:
|
|
12
|
+
* 1. every supplied entry body (its own seq/prev_hash included, its hash
|
|
13
|
+
* stripped) is re-recorded into a fresh createEvidenceLog(), which
|
|
14
|
+
* recomputes the canonical-JSON sha256 for that exact body; a recomputed
|
|
15
|
+
* hash that differs from the SUPPLIED hash is a tampered/forged entry —
|
|
16
|
+
* broken from that point;
|
|
17
|
+
* 2. the rebuilt log's own verify() then walks the whole chain, catching
|
|
18
|
+
* link-level attacks the per-entry recompute cannot (a removed entry, or
|
|
19
|
+
* an entry rewritten WITH a consistently recomputed hash — its successor's
|
|
20
|
+
* prev_hash no longer matches).
|
|
21
|
+
*
|
|
22
|
+
* @param {Array<object>} entries the full evidence log (evidence.all())
|
|
23
|
+
* @param {object} [o]
|
|
24
|
+
* @param {string[]} [o.issuerKeys=[]] pinned base64url SPKI issuer keys, sourced
|
|
25
|
+
* by the AUDITOR out of band — never from the entries themselves
|
|
26
|
+
* @param {number|function} [o.now=Date.now] clock for generated_at (pin for determinism)
|
|
27
|
+
* @param {object} [o.approverKeys={}] auditor-pinned identity-bound approver keys
|
|
28
|
+
* @param {string|null} [o.rpId] bind carried WebAuthn assertions to this relying-party id
|
|
29
|
+
* @param {string[]} [o.allowedOrigins=[]] exact accepted WebAuthn origins
|
|
30
|
+
* @param {object} [o.quorumPolicy] auditor-pinned global organizational quorum rule
|
|
31
|
+
* @param {object} [o.quorumPolicies] action_type -> auditor-pinned quorum rule
|
|
32
|
+
* @returns {Promise<object>} EP-GATE-REPERFORMANCE-v1 document:
|
|
33
|
+
* { chain: {ok, entries, head}, receipts: {reverified, failed, not_reverifiable},
|
|
34
|
+
* counts: {allows, denies, replays_blocked, by_action_type}, ... }
|
|
35
|
+
*/
|
|
36
|
+
export declare function reperformEvidence(entries?: any[], { issuerKeys, approverKeys, now, rpId, allowedOrigins, quorumPolicy, quorumPolicies, }?: {
|
|
37
|
+
issuerKeys?: string[];
|
|
38
|
+
approverKeys?: Record<string, any>;
|
|
39
|
+
now?: number | (() => number);
|
|
40
|
+
rpId?: string | null;
|
|
41
|
+
allowedOrigins?: string[];
|
|
42
|
+
quorumPolicy?: any;
|
|
43
|
+
quorumPolicies?: Record<string, any>;
|
|
44
|
+
}): Promise<{
|
|
45
|
+
'@version': string;
|
|
46
|
+
product: string;
|
|
47
|
+
generated_at: string;
|
|
48
|
+
honesty: {
|
|
49
|
+
reperforms: string;
|
|
50
|
+
does_not_establish: string[];
|
|
51
|
+
status: string;
|
|
52
|
+
};
|
|
53
|
+
input: {
|
|
54
|
+
entries_supplied: number;
|
|
55
|
+
issuer_keys_pinned: number;
|
|
56
|
+
approver_keys_pinned: number;
|
|
57
|
+
relying_party_scope_pinned: boolean;
|
|
58
|
+
quorum_policies_pinned: number;
|
|
59
|
+
expects: string;
|
|
60
|
+
};
|
|
61
|
+
chain: {
|
|
62
|
+
broken_at?: number | null | undefined;
|
|
63
|
+
broken_seq?: number | null | undefined;
|
|
64
|
+
reason?: string | undefined;
|
|
65
|
+
ok: boolean;
|
|
66
|
+
entries: number;
|
|
67
|
+
head: string | null;
|
|
68
|
+
};
|
|
69
|
+
receipts: {
|
|
70
|
+
reverified: number;
|
|
71
|
+
failed: {
|
|
72
|
+
hash: string | null;
|
|
73
|
+
reason: string;
|
|
74
|
+
}[];
|
|
75
|
+
not_reverifiable: number;
|
|
76
|
+
no_receipt_presented: number;
|
|
77
|
+
};
|
|
78
|
+
counts: {
|
|
79
|
+
allows: number;
|
|
80
|
+
denies: number;
|
|
81
|
+
replays_blocked: number;
|
|
82
|
+
by_action_type: {};
|
|
83
|
+
};
|
|
84
|
+
integrity_warnings: {
|
|
85
|
+
index: number;
|
|
86
|
+
reason: string;
|
|
87
|
+
}[];
|
|
88
|
+
}>;
|
|
89
|
+
/**
|
|
90
|
+
* Diff recomputed counts against a reported pack — the auditor's tie-out.
|
|
91
|
+
*
|
|
92
|
+
* Accepts an EP-GATE-USAGE-v1 pack (meterUsage output or the signed-ready
|
|
93
|
+
* buildUsageStatement body) or an EP-GATE-UNDERWRITER-ATTESTATION-v1 pack.
|
|
94
|
+
* Only the OVERLAPPING NUMERIC fields are compared; an unknown pack @version
|
|
95
|
+
* is refused (fail closed), never fuzzily matched. A reported field that is
|
|
96
|
+
* missing or non-numeric is itself a named drift — a stripped pack can never
|
|
97
|
+
* silently match.
|
|
98
|
+
*
|
|
99
|
+
* The comparison is meaningful only when the recomputation ran over exactly
|
|
100
|
+
* the entries the reported pack was built from (same slice, same window);
|
|
101
|
+
* scoping the slice is the auditor's procedure, not this function's.
|
|
102
|
+
*
|
|
103
|
+
* @param {object} recomputed reperformEvidence() result (or its .counts)
|
|
104
|
+
* @param {object} reportedPack usage or underwriter pack
|
|
105
|
+
* @returns {{match: boolean, pack_version: string, drift: Array<{field, reported, recomputed}>}}
|
|
106
|
+
*/
|
|
107
|
+
export declare function compareToReported(recomputed: any, reportedPack: any): {
|
|
108
|
+
match: boolean;
|
|
109
|
+
pack_version: any;
|
|
110
|
+
drift: {
|
|
111
|
+
field: string;
|
|
112
|
+
reported: any;
|
|
113
|
+
recomputed: any;
|
|
114
|
+
}[];
|
|
115
|
+
};
|
|
116
|
+
declare const _default: {
|
|
117
|
+
REPERFORMANCE_VERSION: string;
|
|
118
|
+
reperformEvidence: typeof reperformEvidence;
|
|
119
|
+
compareToReported: typeof compareToReported;
|
|
120
|
+
};
|
|
121
|
+
export default _default;
|
|
122
|
+
//# sourceMappingURL=reperform.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"reperform.d.ts","sourceRoot":"","sources":["../../src/reports/reperform.ts"],"names":[],"mappings":"AA4CA,eAAO,MAAM,qBAAqB,6BAA6B,CAAC;AA6HhE;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAiCG;AACH,wBAAsB,iBAAiB,CAAC,OAAO,GAAE,GAAG,EAAO,EAAE,EAC3D,UAAe,EACf,YAAiB,EACjB,GAAc,EACd,IAAW,EACX,cAAmB,EACnB,YAAmB,EACnB,cAAmB,GACpB,GAAE;IACD,UAAU,CAAC,EAAE,MAAM,EAAE,CAAC;IACtB,YAAY,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;IACnC,GAAG,CAAC,EAAE,MAAM,GAAG,CAAC,MAAM,MAAM,CAAC,CAAC;IAC9B,IAAI,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACrB,cAAc,CAAC,EAAE,MAAM,EAAE,CAAC;IAC1B,YAAY,CAAC,EAAE,GAAG,CAAC;IACnB,cAAc,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;CACjC;;;;;;;;;;;;;;;;;;;;;;;;;;oBAuCU,MAAM;gBACV;YAAE,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC;YAAC,MAAM,EAAE,MAAM,CAAA;SAAE,EAAE;0BAC/B,MAAM;8BACF,MAAM;;;;;;;;;eAEL,MAAM;gBAAU,MAAM;;GA+FhD;AAoBD;;;;;;;;;;;;;;;;;GAiBG;AACH,wBAAgB,iBAAiB,CAAC,UAAU,KAAA,EAAE,YAAY,KAAA;;;;eAMlC,MAAM;kBAAY,GAAG;oBAAc,GAAG;;EAoC7D;;;;;;AAED,wBAA+E"}
|