@coderifts/agent-guard 8.5.0 → 9.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/README.md +37 -23
- package/dist/cjs/cas-attestation.d.ts +22 -0
- package/dist/cjs/cas-attestation.d.ts.map +1 -1
- package/dist/cjs/cas-attestation.js +49 -3
- package/dist/cjs/cas-attestation.js.map +1 -1
- package/dist/cjs/deploy-bind.d.ts +9 -7
- package/dist/cjs/deploy-bind.d.ts.map +1 -1
- package/dist/cjs/deploy-bind.js +9 -3
- package/dist/cjs/deploy-bind.js.map +1 -1
- package/dist/cjs/deploy-gate.d.ts +54 -6
- package/dist/cjs/deploy-gate.d.ts.map +1 -1
- package/dist/cjs/deploy-gate.js +73 -12
- package/dist/cjs/deploy-gate.js.map +1 -1
- package/dist/cjs/deploy-receipt-token.d.ts +59 -0
- package/dist/cjs/deploy-receipt-token.d.ts.map +1 -0
- package/dist/cjs/deploy-receipt-token.js +245 -0
- package/dist/cjs/deploy-receipt-token.js.map +1 -0
- package/dist/cjs/execution-proof.d.ts +11 -0
- package/dist/cjs/execution-proof.d.ts.map +1 -1
- package/dist/cjs/execution-proof.js +6 -0
- package/dist/cjs/execution-proof.js.map +1 -1
- package/dist/cjs/final-answer-proof.d.ts +1 -1
- package/dist/cjs/final-answer-proof.d.ts.map +1 -1
- package/dist/cjs/final-answer-proof.js +18 -1
- package/dist/cjs/final-answer-proof.js.map +1 -1
- package/dist/cjs/guard.d.ts.map +1 -1
- package/dist/cjs/guard.js +19 -6
- package/dist/cjs/guard.js.map +1 -1
- package/dist/cjs/index.d.ts +6 -4
- package/dist/cjs/index.d.ts.map +1 -1
- package/dist/cjs/index.js +10 -2
- package/dist/cjs/index.js.map +1 -1
- package/dist/cjs/types.d.ts +7 -0
- package/dist/cjs/types.d.ts.map +1 -1
- package/dist/esm/cas-attestation.d.ts +22 -0
- package/dist/esm/cas-attestation.d.ts.map +1 -1
- package/dist/esm/cas-attestation.js +47 -2
- package/dist/esm/cas-attestation.js.map +1 -1
- package/dist/esm/deploy-bind.d.ts +9 -7
- package/dist/esm/deploy-bind.d.ts.map +1 -1
- package/dist/esm/deploy-bind.js +9 -3
- package/dist/esm/deploy-bind.js.map +1 -1
- package/dist/esm/deploy-gate.d.ts +54 -6
- package/dist/esm/deploy-gate.d.ts.map +1 -1
- package/dist/esm/deploy-gate.js +70 -12
- package/dist/esm/deploy-gate.js.map +1 -1
- package/dist/esm/deploy-receipt-token.d.ts +59 -0
- package/dist/esm/deploy-receipt-token.d.ts.map +1 -0
- package/dist/esm/deploy-receipt-token.js +241 -0
- package/dist/esm/deploy-receipt-token.js.map +1 -0
- package/dist/esm/execution-proof.d.ts +11 -0
- package/dist/esm/execution-proof.d.ts.map +1 -1
- package/dist/esm/execution-proof.js +6 -0
- package/dist/esm/execution-proof.js.map +1 -1
- package/dist/esm/final-answer-proof.d.ts +1 -1
- package/dist/esm/final-answer-proof.d.ts.map +1 -1
- package/dist/esm/final-answer-proof.js +18 -1
- package/dist/esm/final-answer-proof.js.map +1 -1
- package/dist/esm/guard.d.ts.map +1 -1
- package/dist/esm/guard.js +20 -7
- package/dist/esm/guard.js.map +1 -1
- package/dist/esm/index.d.ts +6 -4
- package/dist/esm/index.d.ts.map +1 -1
- package/dist/esm/index.js +3 -2
- package/dist/esm/index.js.map +1 -1
- package/dist/esm/types.d.ts +7 -0
- package/dist/esm/types.d.ts.map +1 -1
- package/package.json +1 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"deploy-bind.js","sourceRoot":"","sources":["../../src/deploy-bind.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;GAoBG;AAEH,OAAO,EACL,UAAU,
|
|
1
|
+
{"version":3,"file":"deploy-bind.js","sourceRoot":"","sources":["../../src/deploy-bind.ts"],"names":[],"mappings":"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"}
|
|
@@ -4,9 +4,12 @@
|
|
|
4
4
|
* receipt and the observed pipeline-enforcement state?"
|
|
5
5
|
*
|
|
6
6
|
* Same shape as the merge gate, different operation. It is a PURE function — NO I/O, NO CD-API call
|
|
7
|
-
* (pipeline enforcement is an INPUT, observed by the host and passed in).
|
|
8
|
-
*
|
|
9
|
-
*
|
|
7
|
+
* (pipeline enforcement is an INPUT, observed by the host and passed in). TOKEN mode verifies a
|
|
8
|
+
* chain-receipt locally (Ed25519 + registry/pinned PEM; no HTTP). VERIFIED-VIEW mode accepts a
|
|
9
|
+
* host-attributed view ONLY with the guard-defined provenance marker. A bare
|
|
10
|
+
* `currently_authorized: true` is not proof (P0 / external audit 2026-08-24). Same
|
|
11
|
+
* inputs → same output (D9). Observation `verification.{mode,verify_status}` is recorded on the
|
|
12
|
+
* outcome; it does not enter any fingerprint preimage.
|
|
10
13
|
*
|
|
11
14
|
* The three deploy-specific binds are the whole point: T7 (a MERGE — or operation-less — receipt can
|
|
12
15
|
* never deploy), environment binding (a staging ALLOW never authorizes production), and artifact
|
|
@@ -19,8 +22,16 @@
|
|
|
19
22
|
* secrets.
|
|
20
23
|
*/
|
|
21
24
|
import type { GateStatusState, EnforcementState } from './merge-gate.js';
|
|
25
|
+
import { type DeployTokenReceipt } from './deploy-receipt-token.js';
|
|
22
26
|
export type { GateStatusState, EnforcementState } from './merge-gate.js';
|
|
23
|
-
|
|
27
|
+
export type { DeployTokenReceipt } from './deploy-receipt-token.js';
|
|
28
|
+
/**
|
|
29
|
+
* Guard-defined VERIFIED-VIEW provenance marker (same idiom as `proof_spec` /
|
|
30
|
+
* `attestation_spec`). A host that already verified (CLI, etc.) MUST set this —
|
|
31
|
+
* `currently_authorized: true` alone is untrusted input.
|
|
32
|
+
*/
|
|
33
|
+
export declare const DEPLOY_RECEIPT_VIEW_SPEC: "deploy-receipt-view.v1";
|
|
34
|
+
/** Deploy-gate reason codes (§1.1 + change-set residual + 9.0.0 verification). Success uses allow_current_deploy;
|
|
24
35
|
* enforcement_not_configured / bypass_open / change_set_not_rebound name honesty residuals on an
|
|
25
36
|
* otherwise-green check; fingerprint_mismatch is a hard failure (not a residual). */
|
|
26
37
|
export type DeployGateReason = 'allow_current_deploy' | 'no_receipt' | 'receipt_not_authorized' | 'operation_mismatch' | 'env_mismatch' | 'stale_artifact' | 'fingerprint_mismatch' | 'body_hash_mismatch' | 'target_mismatch' | 'decision_not_allow' | 'inputs_incomplete' | 'enforcement_not_configured' | 'bypass_open'
|
|
@@ -30,7 +41,13 @@ export type DeployGateReason = 'allow_current_deploy' | 'no_receipt' | 'receipt_
|
|
|
30
41
|
* fingerprint_mismatch (hard failure when a re-bind WAS requested and disagreed).
|
|
31
42
|
* deploy_allowed may stay true.
|
|
32
43
|
*/
|
|
33
|
-
| 'change_set_not_rebound'
|
|
44
|
+
| 'change_set_not_rebound'
|
|
45
|
+
/**
|
|
46
|
+
* Caller handed a receipt view with currently_authorized (or bounds) but no TOKEN and no
|
|
47
|
+
* guard-defined view_spec provenance. Distinct from receipt_not_authorized: "you didn't prove
|
|
48
|
+
* it" ≠ "verification says no".
|
|
49
|
+
*/
|
|
50
|
+
| 'unverified_receipt_view' | 'invalid_signature' | 'expired' | 'unknown_key' | 'retired_key';
|
|
34
51
|
/** What is being deployed — all fields are INPUTS (the pure function performs no discovery). */
|
|
35
52
|
export type DeployTarget = {
|
|
36
53
|
environment: string;
|
|
@@ -55,7 +72,28 @@ export type DeployReceiptView = {
|
|
|
55
72
|
body_hash?: string;
|
|
56
73
|
target_id?: string;
|
|
57
74
|
signature_valid?: boolean;
|
|
75
|
+
/**
|
|
76
|
+
* VERIFIED-VIEW provenance. Must equal DEPLOY_RECEIPT_VIEW_SPEC together with
|
|
77
|
+
* `verified: true` or the gate denies unverified_receipt_view.
|
|
78
|
+
*/
|
|
79
|
+
view_spec?: string;
|
|
80
|
+
verified?: boolean;
|
|
81
|
+
verify_status?: string;
|
|
58
82
|
};
|
|
83
|
+
/** VERIFIED-VIEW: host-attributed, guard-defined marker required. */
|
|
84
|
+
export type VerifiedDeployReceiptView = DeployReceiptView & {
|
|
85
|
+
view_spec: typeof DEPLOY_RECEIPT_VIEW_SPEC;
|
|
86
|
+
verified: true;
|
|
87
|
+
verify_status: string;
|
|
88
|
+
};
|
|
89
|
+
export type DeployVerificationMode = 'token' | 'verified_view' | 'unverified' | 'none';
|
|
90
|
+
export type DeployVerificationObservation = {
|
|
91
|
+
mode: DeployVerificationMode;
|
|
92
|
+
verify_status: string | null;
|
|
93
|
+
};
|
|
94
|
+
/** Stamp a computed view so deployGate will accept it as VERIFIED-VIEW (not TOKEN). */
|
|
95
|
+
export declare function asVerifiedDeployReceiptView(view: DeployReceiptView, verify_status?: string): VerifiedDeployReceiptView;
|
|
96
|
+
export declare function isVerifiedDeployReceiptView(r: DeployReceiptView | null | undefined): r is VerifiedDeployReceiptView;
|
|
59
97
|
/** Pipeline-enforcement observation (from the host's CD-config read — the pure gate consumes it). */
|
|
60
98
|
export type DeployEnforcementState = {
|
|
61
99
|
enforcement: EnforcementState;
|
|
@@ -79,7 +117,13 @@ export type DeployRequiredContext = {
|
|
|
79
117
|
};
|
|
80
118
|
export type DeployGateInput = {
|
|
81
119
|
deployTarget: DeployTarget;
|
|
82
|
-
|
|
120
|
+
/**
|
|
121
|
+
* VERIFIED-VIEW (or null). A bare currently_authorized boolean is untrusted.
|
|
122
|
+
* TOKEN mode uses `token` instead (recommended).
|
|
123
|
+
*/
|
|
124
|
+
receipt?: DeployReceiptView | VerifiedDeployReceiptView | null;
|
|
125
|
+
/** TOKEN mode: signed chain_receipt + registry | pinnedKeyPem. Guard verifies locally. */
|
|
126
|
+
token?: DeployTokenReceipt;
|
|
83
127
|
requiredContext: DeployRequiredContext;
|
|
84
128
|
/** Incomplete/no-receipt → pending when true, else failure (default false). */
|
|
85
129
|
allowPending?: boolean;
|
|
@@ -112,6 +156,10 @@ export type DeployGateDecision = {
|
|
|
112
156
|
bound_artifact_id: string | null;
|
|
113
157
|
operation: string | null;
|
|
114
158
|
};
|
|
159
|
+
/**
|
|
160
|
+
* Observation: which input mode ran and the verify_status. Not a preimage field.
|
|
161
|
+
*/
|
|
162
|
+
verification: DeployVerificationObservation;
|
|
115
163
|
};
|
|
116
164
|
/**
|
|
117
165
|
* §1.4 — the normative, first-match-wins deploy decision. Pure; no I/O; deterministic.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"deploy-gate.d.ts","sourceRoot":"","sources":["../../src/deploy-gate.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"deploy-gate.d.ts","sourceRoot":"","sources":["../../src/deploy-gate.ts"],"names":[],"mappings":"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"}
|
package/dist/esm/deploy-gate.js
CHANGED
|
@@ -4,9 +4,12 @@
|
|
|
4
4
|
* receipt and the observed pipeline-enforcement state?"
|
|
5
5
|
*
|
|
6
6
|
* Same shape as the merge gate, different operation. It is a PURE function — NO I/O, NO CD-API call
|
|
7
|
-
* (pipeline enforcement is an INPUT, observed by the host and passed in).
|
|
8
|
-
*
|
|
9
|
-
*
|
|
7
|
+
* (pipeline enforcement is an INPUT, observed by the host and passed in). TOKEN mode verifies a
|
|
8
|
+
* chain-receipt locally (Ed25519 + registry/pinned PEM; no HTTP). VERIFIED-VIEW mode accepts a
|
|
9
|
+
* host-attributed view ONLY with the guard-defined provenance marker. A bare
|
|
10
|
+
* `currently_authorized: true` is not proof (P0 / external audit 2026-08-24). Same
|
|
11
|
+
* inputs → same output (D9). Observation `verification.{mode,verify_status}` is recorded on the
|
|
12
|
+
* outcome; it does not enter any fingerprint preimage.
|
|
10
13
|
*
|
|
11
14
|
* The three deploy-specific binds are the whole point: T7 (a MERGE — or operation-less — receipt can
|
|
12
15
|
* never deploy), environment binding (a staging ALLOW never authorizes production), and artifact
|
|
@@ -18,6 +21,27 @@
|
|
|
18
21
|
* generic deploy-gate concepts — no scoring logic, weights, thresholds, pattern names, endpoints, or
|
|
19
22
|
* secrets.
|
|
20
23
|
*/
|
|
24
|
+
import { verifyDeployReceiptToken, } from './deploy-receipt-token.js';
|
|
25
|
+
/**
|
|
26
|
+
* Guard-defined VERIFIED-VIEW provenance marker (same idiom as `proof_spec` /
|
|
27
|
+
* `attestation_spec`). A host that already verified (CLI, etc.) MUST set this —
|
|
28
|
+
* `currently_authorized: true` alone is untrusted input.
|
|
29
|
+
*/
|
|
30
|
+
export const DEPLOY_RECEIPT_VIEW_SPEC = 'deploy-receipt-view.v1';
|
|
31
|
+
/** Stamp a computed view so deployGate will accept it as VERIFIED-VIEW (not TOKEN). */
|
|
32
|
+
export function asVerifiedDeployReceiptView(view, verify_status = 'VERIFIED_CURRENT') {
|
|
33
|
+
return {
|
|
34
|
+
...view,
|
|
35
|
+
view_spec: DEPLOY_RECEIPT_VIEW_SPEC,
|
|
36
|
+
verified: true,
|
|
37
|
+
verify_status,
|
|
38
|
+
};
|
|
39
|
+
}
|
|
40
|
+
export function isVerifiedDeployReceiptView(r) {
|
|
41
|
+
return !!r
|
|
42
|
+
&& r.view_spec === DEPLOY_RECEIPT_VIEW_SPEC
|
|
43
|
+
&& r.verified === true;
|
|
44
|
+
}
|
|
21
45
|
// ── helpers (pure) ────────────────────────────────────────────────────────────────────────────────
|
|
22
46
|
function norm(s) {
|
|
23
47
|
return String(s == null ? '' : s).trim().toLowerCase();
|
|
@@ -70,29 +94,62 @@ export function deployGate(input) {
|
|
|
70
94
|
const allowPending = input.allowPending ?? rc.allowPending ?? false;
|
|
71
95
|
const allowWarnDeploy = input.allowWarnDeploy ?? rc.allowWarnDeploy ?? false;
|
|
72
96
|
const allowPrefix = input.allowPrefixCompare ?? rc.allowPrefixCompare ?? false;
|
|
73
|
-
|
|
74
|
-
|
|
97
|
+
let verification = { mode: 'none', verify_status: null };
|
|
98
|
+
let receipt = input.receipt;
|
|
99
|
+
const detailOf = (r) => ({
|
|
75
100
|
environment: norm(target.environment),
|
|
76
101
|
artifact_id: norm(target.artifact_id),
|
|
77
|
-
bound_environment:
|
|
78
|
-
bound_artifact_id:
|
|
79
|
-
operation:
|
|
80
|
-
};
|
|
102
|
+
bound_environment: r && r.bound_environment != null ? norm(r.bound_environment) : null,
|
|
103
|
+
bound_artifact_id: r && r.bound_artifact_id != null ? norm(r.bound_artifact_id) : null,
|
|
104
|
+
operation: r && r.operation != null ? String(r.operation) : null,
|
|
105
|
+
});
|
|
81
106
|
const deny = (state, reason) => ({
|
|
82
107
|
deploy_allowed: false, state, reason, enforcement_state, inescapable_deploy: false,
|
|
83
108
|
residuals: [],
|
|
84
|
-
detail,
|
|
109
|
+
detail: detailOf(receipt),
|
|
110
|
+
verification,
|
|
85
111
|
});
|
|
86
112
|
// 0) incomplete target → pending/failure (fail-closed on missing evaluation input).
|
|
87
113
|
if (!target.environment || String(target.environment).trim() === ''
|
|
88
114
|
|| !target.artifact_id || String(target.artifact_id).trim() === '') {
|
|
89
115
|
return deny(allowPending ? 'pending' : 'failure', 'inputs_incomplete');
|
|
90
116
|
}
|
|
91
|
-
//
|
|
117
|
+
// TOKEN mode (recommended): guard verifies locally. Wins over a sibling receipt view.
|
|
118
|
+
const tokenInput = input.token;
|
|
119
|
+
if (tokenInput && typeof tokenInput.token === 'string' && tokenInput.token.length > 0) {
|
|
120
|
+
const tv = verifyDeployReceiptToken(tokenInput, {
|
|
121
|
+
operation: opRequired,
|
|
122
|
+
environment: target.environment,
|
|
123
|
+
artifact_id: target.artifact_id,
|
|
124
|
+
});
|
|
125
|
+
verification = { mode: 'token', verify_status: tv.status };
|
|
126
|
+
if (tv.denyReason) {
|
|
127
|
+
receipt = tv.view;
|
|
128
|
+
return deny('failure', tv.denyReason);
|
|
129
|
+
}
|
|
130
|
+
receipt = tv.view;
|
|
131
|
+
}
|
|
132
|
+
else if (receipt === null || receipt === undefined) {
|
|
133
|
+
// 1) no receipt and no token → fail-closed (D4).
|
|
134
|
+
return deny(allowPending ? 'pending' : 'failure', 'no_receipt');
|
|
135
|
+
}
|
|
136
|
+
else if (isVerifiedDeployReceiptView(receipt)) {
|
|
137
|
+
verification = {
|
|
138
|
+
mode: 'verified_view',
|
|
139
|
+
verify_status: typeof receipt.verify_status === 'string' ? receipt.verify_status : null,
|
|
140
|
+
};
|
|
141
|
+
}
|
|
142
|
+
else {
|
|
143
|
+
// Bare currently_authorized (or any view without the guard-defined marker).
|
|
144
|
+
verification = { mode: 'unverified', verify_status: null };
|
|
145
|
+
return deny('failure', 'unverified_receipt_view');
|
|
146
|
+
}
|
|
92
147
|
if (receipt === null || receipt === undefined) {
|
|
93
148
|
return deny(allowPending ? 'pending' : 'failure', 'no_receipt');
|
|
94
149
|
}
|
|
95
150
|
// 2) lifecycle authorization — a valid signature alone is NOT sufficient (D5).
|
|
151
|
+
// In TOKEN mode currently_authorized was COMPUTED; in VERIFIED-VIEW it is host-attributed
|
|
152
|
+
// behind view_spec (not a sneaked boolean).
|
|
96
153
|
if (receipt.currently_authorized !== true) {
|
|
97
154
|
return deny('failure', 'receipt_not_authorized');
|
|
98
155
|
}
|
|
@@ -165,7 +222,8 @@ export function deployGate(input) {
|
|
|
165
222
|
inescapable_deploy,
|
|
166
223
|
residuals,
|
|
167
224
|
...(residual ? { residual } : {}),
|
|
168
|
-
detail,
|
|
225
|
+
detail: detailOf(receipt),
|
|
226
|
+
verification,
|
|
169
227
|
};
|
|
170
228
|
}
|
|
171
229
|
//# sourceMappingURL=deploy-gate.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"deploy-gate.js","sourceRoot":"","sources":["../../src/deploy-gate.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"deploy-gate.js","sourceRoot":"","sources":["../../src/deploy-gate.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* TOKEN-mode chain-receipt verification for deployGate.
|
|
3
|
+
*
|
|
4
|
+
* SDK 3.4.0 `CodeRifts.verifyReceipt` is HTTP POST /api/v1/verify-receipt (async, I/O) —
|
|
5
|
+
* unusable inside the pure deployGate. Local public-material verify of crchain.v1 is
|
|
6
|
+
* NOT exported by that SDK. This module:
|
|
7
|
+
* - uses node:crypto Ed25519 the same way `@coderifts/sdk` `verifyExecutionAttestation` does
|
|
8
|
+
* (`createPublicKey` + `verify`) — no new algorithm
|
|
9
|
+
* - reuses SDK `ExecutorKeyRegistry` shape and `isReceiptExpired` (ID104 leeway)
|
|
10
|
+
* - reuses this package's `computeBodyHash` for envelope bind
|
|
11
|
+
* - reconstructs the published crchain.v1 signing input (RECEIPT_FORMAT / app kernel)
|
|
12
|
+
*
|
|
13
|
+
* No fetch. Same inputs → same output.
|
|
14
|
+
*/
|
|
15
|
+
import type { ExecutorKeyRegistry } from '@coderifts/sdk';
|
|
16
|
+
/** Structural receipt view produced after TOKEN verify (assignable to DeployReceiptView). */
|
|
17
|
+
export type TokenDerivedReceiptView = {
|
|
18
|
+
currently_authorized: boolean;
|
|
19
|
+
decision: string;
|
|
20
|
+
execution_action?: string;
|
|
21
|
+
operation?: string;
|
|
22
|
+
bound_environment?: string | null;
|
|
23
|
+
bound_artifact_id?: string | null;
|
|
24
|
+
verdict_fingerprint?: string;
|
|
25
|
+
body_hash?: string;
|
|
26
|
+
target_id?: string;
|
|
27
|
+
};
|
|
28
|
+
export declare const CHAIN_SIGNING_PREFIX = "crchain.v1";
|
|
29
|
+
export type DeployTokenReceipt = {
|
|
30
|
+
/** Signed chain_receipt token (`base64url(body).base64url(sig)`). */
|
|
31
|
+
token: string;
|
|
32
|
+
/** Body-hash-bound decision envelope (verifier family). Required for currently_authorized. */
|
|
33
|
+
decision_result?: Record<string, unknown>;
|
|
34
|
+
/** Well-known-shaped registry `{ keys: [{ kid, public_key_pem, status, valid_from, retired_at }] }`. */
|
|
35
|
+
registry?: ExecutorKeyRegistry;
|
|
36
|
+
/** Air-gap single PEM (kid-agnostic). */
|
|
37
|
+
pinnedKeyPem?: string;
|
|
38
|
+
};
|
|
39
|
+
export type DeployTokenVerifyStatus = 'VERIFIED_CURRENT' | 'VERIFIED_EXPIRED' | 'RETIRED_KEY_VALID_AT_ISSUE' | 'INVALID_SIGNATURE' | 'MALFORMED' | 'UNKNOWN_KEY' | 'UNSUPPORTED_VERSION';
|
|
40
|
+
export type DeployTokenVerifyResult = {
|
|
41
|
+
valid: boolean;
|
|
42
|
+
status: DeployTokenVerifyStatus;
|
|
43
|
+
currently_authorized: boolean;
|
|
44
|
+
authz_reason: string | null;
|
|
45
|
+
/** When set, deployGate denies with this reason before bind checks. */
|
|
46
|
+
denyReason: string | null;
|
|
47
|
+
payload?: Record<string, unknown>;
|
|
48
|
+
view: TokenDerivedReceiptView | null;
|
|
49
|
+
key_status: 'active' | 'retired' | null;
|
|
50
|
+
};
|
|
51
|
+
/**
|
|
52
|
+
* Verify a chain-receipt token against a registry or pinned PEM. Pure (no I/O).
|
|
53
|
+
*/
|
|
54
|
+
export declare function verifyDeployReceiptToken(input: DeployTokenReceipt, _intended?: {
|
|
55
|
+
operation?: string;
|
|
56
|
+
environment?: string;
|
|
57
|
+
artifact_id?: string;
|
|
58
|
+
}, nowMs?: number): DeployTokenVerifyResult;
|
|
59
|
+
//# sourceMappingURL=deploy-receipt-token.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"deploy-receipt-token.d.ts","sourceRoot":"","sources":["../../src/deploy-receipt-token.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAIH,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,gBAAgB,CAAC;AAG1D,6FAA6F;AAC7F,MAAM,MAAM,uBAAuB,GAAG;IACpC,oBAAoB,EAAE,OAAO,CAAC;IAC9B,QAAQ,EAAE,MAAM,CAAC;IACjB,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,iBAAiB,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAClC,iBAAiB,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAClC,mBAAmB,CAAC,EAAE,MAAM,CAAC;IAC7B,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB,CAAC;AAEF,eAAO,MAAM,oBAAoB,eAAe,CAAC;AAEjD,MAAM,MAAM,kBAAkB,GAAG;IAC/B,qEAAqE;IACrE,KAAK,EAAE,MAAM,CAAC;IACd,8FAA8F;IAC9F,eAAe,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAC1C,wGAAwG;IACxG,QAAQ,CAAC,EAAE,mBAAmB,CAAC;IAC/B,yCAAyC;IACzC,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB,CAAC;AAEF,MAAM,MAAM,uBAAuB,GAC/B,kBAAkB,GAClB,kBAAkB,GAClB,4BAA4B,GAC5B,mBAAmB,GACnB,WAAW,GACX,aAAa,GACb,qBAAqB,CAAC;AAE1B,MAAM,MAAM,uBAAuB,GAAG;IACpC,KAAK,EAAE,OAAO,CAAC;IACf,MAAM,EAAE,uBAAuB,CAAC;IAChC,oBAAoB,EAAE,OAAO,CAAC;IAC9B,YAAY,EAAE,MAAM,GAAG,IAAI,CAAC;IAC5B,uEAAuE;IACvE,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAClC,IAAI,EAAE,uBAAuB,GAAG,IAAI,CAAC;IACrC,UAAU,EAAE,QAAQ,GAAG,SAAS,GAAG,IAAI,CAAC;CACzC,CAAC;AA+GF;;GAEG;AACH,wBAAgB,wBAAwB,CACtC,KAAK,EAAE,kBAAkB,EACzB,SAAS,GAAE;IAAE,SAAS,CAAC,EAAE,MAAM,CAAC;IAAC,WAAW,CAAC,EAAE,MAAM,CAAC;IAAC,WAAW,CAAC,EAAE,MAAM,CAAA;CAAO,EAClF,KAAK,CAAC,EAAE,MAAM,GACb,uBAAuB,CA2HzB"}
|
|
@@ -0,0 +1,241 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* TOKEN-mode chain-receipt verification for deployGate.
|
|
3
|
+
*
|
|
4
|
+
* SDK 3.4.0 `CodeRifts.verifyReceipt` is HTTP POST /api/v1/verify-receipt (async, I/O) —
|
|
5
|
+
* unusable inside the pure deployGate. Local public-material verify of crchain.v1 is
|
|
6
|
+
* NOT exported by that SDK. This module:
|
|
7
|
+
* - uses node:crypto Ed25519 the same way `@coderifts/sdk` `verifyExecutionAttestation` does
|
|
8
|
+
* (`createPublicKey` + `verify`) — no new algorithm
|
|
9
|
+
* - reuses SDK `ExecutorKeyRegistry` shape and `isReceiptExpired` (ID104 leeway)
|
|
10
|
+
* - reuses this package's `computeBodyHash` for envelope bind
|
|
11
|
+
* - reconstructs the published crchain.v1 signing input (RECEIPT_FORMAT / app kernel)
|
|
12
|
+
*
|
|
13
|
+
* No fetch. Same inputs → same output.
|
|
14
|
+
*/
|
|
15
|
+
import { createPublicKey, verify as cryptoVerify } from 'node:crypto';
|
|
16
|
+
import { isReceiptExpired } from '@coderifts/sdk';
|
|
17
|
+
import { computeBodyHash } from './receipt-binding.js';
|
|
18
|
+
export const CHAIN_SIGNING_PREFIX = 'crchain.v1';
|
|
19
|
+
function scalar(v) {
|
|
20
|
+
return v == null ? '' : String(v);
|
|
21
|
+
}
|
|
22
|
+
function reconstructInput(payload) {
|
|
23
|
+
const v1 = `${CHAIN_SIGNING_PREFIX}|${scalar(payload.kid)}|${scalar(payload.fp)}|${scalar(payload.prev)}|${scalar(payload.caller)}|${scalar(payload.ts)}`;
|
|
24
|
+
if (payload.v === 4) {
|
|
25
|
+
return `${v1}|${scalar(payload.reg)}|${scalar(payload.ir)}|${scalar(payload.expires_at)}|${scalar(payload.bh)}`;
|
|
26
|
+
}
|
|
27
|
+
if (payload.v === 3) {
|
|
28
|
+
return `${v1}|${scalar(payload.reg)}|${scalar(payload.ir)}`;
|
|
29
|
+
}
|
|
30
|
+
if (payload.v === 2) {
|
|
31
|
+
return `${v1}|${scalar(payload.reg)}`;
|
|
32
|
+
}
|
|
33
|
+
return v1;
|
|
34
|
+
}
|
|
35
|
+
function isIssueTimeWithinKeyWindow(ts, keyMeta) {
|
|
36
|
+
if (!keyMeta || keyMeta.status === 'active')
|
|
37
|
+
return true;
|
|
38
|
+
if (keyMeta.status !== 'retired')
|
|
39
|
+
return false;
|
|
40
|
+
if (typeof keyMeta.retired_at !== 'string' || keyMeta.retired_at.length === 0)
|
|
41
|
+
return false;
|
|
42
|
+
if (typeof ts !== 'string' || ts.length === 0)
|
|
43
|
+
return false;
|
|
44
|
+
const issueMs = Date.parse(ts);
|
|
45
|
+
if (!Number.isFinite(issueMs))
|
|
46
|
+
return false;
|
|
47
|
+
if (keyMeta.valid_from) {
|
|
48
|
+
const fromMs = Date.parse(keyMeta.valid_from);
|
|
49
|
+
if (Number.isFinite(fromMs) && issueMs < fromMs)
|
|
50
|
+
return false;
|
|
51
|
+
}
|
|
52
|
+
const retiredMs = Date.parse(keyMeta.retired_at);
|
|
53
|
+
if (!Number.isFinite(retiredMs))
|
|
54
|
+
return false;
|
|
55
|
+
if (issueMs >= retiredMs)
|
|
56
|
+
return false;
|
|
57
|
+
return true;
|
|
58
|
+
}
|
|
59
|
+
function resolveKey(kid, registry, pinnedKeyPem) {
|
|
60
|
+
if (typeof pinnedKeyPem === 'string' && pinnedKeyPem.trim().length > 0) {
|
|
61
|
+
try {
|
|
62
|
+
return {
|
|
63
|
+
publicKey: createPublicKey(pinnedKeyPem),
|
|
64
|
+
status: 'active',
|
|
65
|
+
valid_from: null,
|
|
66
|
+
retired_at: null,
|
|
67
|
+
};
|
|
68
|
+
}
|
|
69
|
+
catch {
|
|
70
|
+
return null;
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
if (!registry || !Array.isArray(registry.keys) || !kid)
|
|
74
|
+
return null;
|
|
75
|
+
const matches = registry.keys.filter((k) => k && k.kid === kid && typeof k.public_key_pem === 'string');
|
|
76
|
+
if (matches.length === 0)
|
|
77
|
+
return null;
|
|
78
|
+
const entry = matches.find((k) => k.status === 'active') || matches[0];
|
|
79
|
+
try {
|
|
80
|
+
return {
|
|
81
|
+
publicKey: createPublicKey(entry.public_key_pem),
|
|
82
|
+
status: entry.status === 'retired' ? 'retired' : 'active',
|
|
83
|
+
valid_from: entry.valid_from || null,
|
|
84
|
+
retired_at: entry.retired_at || null,
|
|
85
|
+
};
|
|
86
|
+
}
|
|
87
|
+
catch {
|
|
88
|
+
return null;
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
function fail(status, denyReason, extra = {}) {
|
|
92
|
+
return {
|
|
93
|
+
valid: false,
|
|
94
|
+
status,
|
|
95
|
+
currently_authorized: false,
|
|
96
|
+
authz_reason: extra.authz_reason ?? denyReason,
|
|
97
|
+
denyReason,
|
|
98
|
+
view: null,
|
|
99
|
+
key_status: extra.key_status ?? null,
|
|
100
|
+
payload: extra.payload,
|
|
101
|
+
};
|
|
102
|
+
}
|
|
103
|
+
function viewFromEnvelope(envelope, payload, currently_authorized) {
|
|
104
|
+
const artifact = envelope.target_id ?? envelope.artifact_digest ?? envelope.bound_artifact_id;
|
|
105
|
+
return {
|
|
106
|
+
currently_authorized,
|
|
107
|
+
decision: typeof envelope.decision === 'string' ? envelope.decision : '',
|
|
108
|
+
execution_action: typeof envelope.execution_action === 'string' ? envelope.execution_action : undefined,
|
|
109
|
+
operation: typeof envelope.operation === 'string' ? envelope.operation : undefined,
|
|
110
|
+
bound_environment: typeof envelope.environment === 'string' ? envelope.environment : null,
|
|
111
|
+
bound_artifact_id: artifact == null ? null : String(artifact),
|
|
112
|
+
verdict_fingerprint: typeof envelope.fingerprint === 'string'
|
|
113
|
+
? envelope.fingerprint
|
|
114
|
+
: (typeof payload.fp === 'string' ? payload.fp : undefined),
|
|
115
|
+
body_hash: typeof payload.bh === 'string' ? payload.bh : undefined,
|
|
116
|
+
target_id: envelope.target_id == null ? undefined : String(envelope.target_id),
|
|
117
|
+
};
|
|
118
|
+
}
|
|
119
|
+
/**
|
|
120
|
+
* Verify a chain-receipt token against a registry or pinned PEM. Pure (no I/O).
|
|
121
|
+
*/
|
|
122
|
+
export function verifyDeployReceiptToken(input, _intended = {}, nowMs) {
|
|
123
|
+
const token = input && input.token;
|
|
124
|
+
if (typeof token !== 'string' || token.length === 0) {
|
|
125
|
+
return fail('MALFORMED', 'unverified_receipt_view');
|
|
126
|
+
}
|
|
127
|
+
const hasKeys = (input.pinnedKeyPem && String(input.pinnedKeyPem).trim().length > 0)
|
|
128
|
+
|| (input.registry && Array.isArray(input.registry.keys) && input.registry.keys.length > 0);
|
|
129
|
+
if (!hasKeys) {
|
|
130
|
+
return fail('MALFORMED', 'inputs_incomplete', { authz_reason: 'keys_missing' });
|
|
131
|
+
}
|
|
132
|
+
const segments = token.split('.');
|
|
133
|
+
if (segments.length !== 2 || segments.some((s) => !s)) {
|
|
134
|
+
return fail('MALFORMED', 'unverified_receipt_view');
|
|
135
|
+
}
|
|
136
|
+
let payload;
|
|
137
|
+
try {
|
|
138
|
+
payload = JSON.parse(Buffer.from(segments[0], 'base64url').toString('utf8'));
|
|
139
|
+
}
|
|
140
|
+
catch {
|
|
141
|
+
return fail('MALFORMED', 'unverified_receipt_view');
|
|
142
|
+
}
|
|
143
|
+
if (!payload || typeof payload !== 'object' || Array.isArray(payload)) {
|
|
144
|
+
return fail('MALFORMED', 'unverified_receipt_view');
|
|
145
|
+
}
|
|
146
|
+
if (typeof payload.v === 'number' && payload.v > 4) {
|
|
147
|
+
return fail('UNSUPPORTED_VERSION', 'unverified_receipt_view', { payload });
|
|
148
|
+
}
|
|
149
|
+
const kid = typeof payload.kid === 'string' ? payload.kid : '';
|
|
150
|
+
const resolved = resolveKey(kid, input.registry, input.pinnedKeyPem);
|
|
151
|
+
if (!resolved)
|
|
152
|
+
return fail('UNKNOWN_KEY', 'unknown_key', { payload });
|
|
153
|
+
let sigOk = false;
|
|
154
|
+
try {
|
|
155
|
+
sigOk = cryptoVerify(null, Buffer.from(reconstructInput(payload), 'utf8'), resolved.publicKey, Buffer.from(segments[1], 'base64url'));
|
|
156
|
+
}
|
|
157
|
+
catch {
|
|
158
|
+
return fail('INVALID_SIGNATURE', 'invalid_signature', { payload });
|
|
159
|
+
}
|
|
160
|
+
if (!sigOk)
|
|
161
|
+
return fail('INVALID_SIGNATURE', 'invalid_signature', { payload });
|
|
162
|
+
for (const k of ['kid', 'fp', 'prev', 'caller', 'ts', 'reg', 'ir', 'expires_at', 'bh']) {
|
|
163
|
+
if (typeof payload[k] === 'string' && payload[k].includes('|')) {
|
|
164
|
+
return fail('INVALID_SIGNATURE', 'invalid_signature', { payload, authz_reason: 'delimiter_in_field' });
|
|
165
|
+
}
|
|
166
|
+
}
|
|
167
|
+
if (resolved.status === 'retired') {
|
|
168
|
+
if (!isIssueTimeWithinKeyWindow(typeof payload.ts === 'string' ? payload.ts : undefined, resolved)) {
|
|
169
|
+
return fail('INVALID_SIGNATURE', 'invalid_signature', { payload, authz_reason: 'retired_key_outside_window' });
|
|
170
|
+
}
|
|
171
|
+
const envelope = input.decision_result && typeof input.decision_result === 'object'
|
|
172
|
+
? input.decision_result
|
|
173
|
+
: undefined;
|
|
174
|
+
const view = envelope ? viewFromEnvelope(envelope, payload, false) : null;
|
|
175
|
+
return {
|
|
176
|
+
valid: true,
|
|
177
|
+
status: 'RETIRED_KEY_VALID_AT_ISSUE',
|
|
178
|
+
currently_authorized: false,
|
|
179
|
+
authz_reason: 'retired_key',
|
|
180
|
+
denyReason: 'retired_key',
|
|
181
|
+
payload,
|
|
182
|
+
view,
|
|
183
|
+
key_status: 'retired',
|
|
184
|
+
};
|
|
185
|
+
}
|
|
186
|
+
if (payload.v === 4 && typeof payload.expires_at === 'string') {
|
|
187
|
+
const exp = Date.parse(payload.expires_at);
|
|
188
|
+
const now = Number.isFinite(nowMs) ? nowMs : Date.now();
|
|
189
|
+
if (isReceiptExpired(exp, now, { environment: _intended.environment, operation: _intended.operation })) {
|
|
190
|
+
const envelope = input.decision_result && typeof input.decision_result === 'object'
|
|
191
|
+
? input.decision_result
|
|
192
|
+
: undefined;
|
|
193
|
+
return {
|
|
194
|
+
valid: true,
|
|
195
|
+
status: 'VERIFIED_EXPIRED',
|
|
196
|
+
currently_authorized: false,
|
|
197
|
+
authz_reason: 'expired',
|
|
198
|
+
denyReason: 'expired',
|
|
199
|
+
payload,
|
|
200
|
+
view: envelope ? viewFromEnvelope(envelope, payload, false) : null,
|
|
201
|
+
key_status: 'active',
|
|
202
|
+
};
|
|
203
|
+
}
|
|
204
|
+
}
|
|
205
|
+
const envelope = input.decision_result && typeof input.decision_result === 'object'
|
|
206
|
+
? input.decision_result
|
|
207
|
+
: undefined;
|
|
208
|
+
if (!envelope) {
|
|
209
|
+
return {
|
|
210
|
+
valid: true,
|
|
211
|
+
status: 'VERIFIED_CURRENT',
|
|
212
|
+
currently_authorized: false,
|
|
213
|
+
authz_reason: 'receipt_context_required',
|
|
214
|
+
denyReason: 'receipt_not_authorized',
|
|
215
|
+
payload,
|
|
216
|
+
view: null,
|
|
217
|
+
key_status: 'active',
|
|
218
|
+
};
|
|
219
|
+
}
|
|
220
|
+
let localBh = null;
|
|
221
|
+
try {
|
|
222
|
+
localBh = computeBodyHash(envelope);
|
|
223
|
+
}
|
|
224
|
+
catch {
|
|
225
|
+
localBh = null;
|
|
226
|
+
}
|
|
227
|
+
if (typeof payload.bh !== 'string' || payload.bh !== localBh) {
|
|
228
|
+
return fail('INVALID_SIGNATURE', 'body_hash_mismatch', { payload, authz_reason: 'body_hash_mismatch' });
|
|
229
|
+
}
|
|
230
|
+
return {
|
|
231
|
+
valid: true,
|
|
232
|
+
status: 'VERIFIED_CURRENT',
|
|
233
|
+
currently_authorized: true,
|
|
234
|
+
authz_reason: 'ok',
|
|
235
|
+
denyReason: null,
|
|
236
|
+
payload,
|
|
237
|
+
view: viewFromEnvelope(envelope, payload, true),
|
|
238
|
+
key_status: 'active',
|
|
239
|
+
};
|
|
240
|
+
}
|
|
241
|
+
//# sourceMappingURL=deploy-receipt-token.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"deploy-receipt-token.js","sourceRoot":"","sources":["../../src/deploy-receipt-token.ts"],"names":[],"mappings":"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"}
|