@emilia-protocol/gate 0.19.0 → 0.20.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 +29 -0
- package/README.md +22 -0
- package/action-refusal-statement.js +1 -0
- package/coverage-reconciliation-attestation.js +1 -0
- package/dist/action-refusal-statement.d.ts +109 -0
- package/dist/action-refusal-statement.d.ts.map +1 -0
- package/dist/action-refusal-statement.js +333 -0
- package/dist/action-refusal-statement.js.map +1 -0
- package/dist/coverage-reconciliation-attestation.d.ts +29 -0
- package/dist/coverage-reconciliation-attestation.d.ts.map +1 -0
- package/dist/coverage-reconciliation-attestation.js +111 -0
- package/dist/coverage-reconciliation-attestation.js.map +1 -0
- package/dist/index.d.ts +7 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +7 -0
- package/dist/index.js.map +1 -1
- package/dist/loss-allocation-schedule.d.ts +53 -0
- package/dist/loss-allocation-schedule.d.ts.map +1 -0
- package/dist/loss-allocation-schedule.js +351 -0
- package/dist/loss-allocation-schedule.js.map +1 -0
- package/dist/loss-experience-feed.d.ts +82 -0
- package/dist/loss-experience-feed.d.ts.map +1 -0
- package/dist/loss-experience-feed.js +314 -0
- package/dist/loss-experience-feed.js.map +1 -0
- package/dist/open-exposure-ledger-postgres.d.ts +40 -0
- package/dist/open-exposure-ledger-postgres.d.ts.map +1 -0
- package/dist/open-exposure-ledger-postgres.js +577 -0
- package/dist/open-exposure-ledger-postgres.js.map +1 -0
- package/dist/open-exposure-ledger.d.ts +243 -0
- package/dist/open-exposure-ledger.d.ts.map +1 -0
- package/dist/open-exposure-ledger.js +794 -0
- package/dist/open-exposure-ledger.js.map +1 -0
- package/dist/receipt-census.d.ts +21 -0
- package/dist/receipt-census.d.ts.map +1 -0
- package/dist/receipt-census.js +162 -0
- package/dist/receipt-census.js.map +1 -0
- package/dist/reliance-risk-crypto.d.ts +28 -0
- package/dist/reliance-risk-crypto.d.ts.map +1 -0
- package/dist/reliance-risk-crypto.js +110 -0
- package/dist/reliance-risk-crypto.js.map +1 -0
- package/loss-allocation-schedule.js +1 -0
- package/loss-experience-feed.js +1 -0
- package/open-exposure-ledger-postgres.js +1 -0
- package/open-exposure-ledger.js +1 -0
- package/package.json +36 -1
- package/receipt-census.js +1 -0
- package/src/action-refusal-statement.ts +396 -0
- package/src/coverage-reconciliation-attestation.ts +107 -0
- package/src/index.ts +7 -0
- package/src/loss-allocation-schedule.ts +427 -0
- package/src/loss-experience-feed.ts +398 -0
- package/src/open-exposure-ledger-postgres.ts +701 -0
- package/src/open-exposure-ledger.ts +1213 -0
- package/src/receipt-census.ts +163 -0
- package/src/reliance-risk-crypto.ts +114 -0
package/CHANGELOG.md
CHANGED
|
@@ -4,6 +4,35 @@
|
|
|
4
4
|
All notable changes to `@emilia-protocol/gate` are documented here.
|
|
5
5
|
This package follows [Semantic Versioning](https://semver.org/).
|
|
6
6
|
|
|
7
|
+
## 0.20.0 (2026-07-28)
|
|
8
|
+
|
|
9
|
+
### Added
|
|
10
|
+
|
|
11
|
+
- A separately signed Loss-Allocation Schedule pinned to an exact Reliance
|
|
12
|
+
Program through a relying-party-owned Admissibility Profile.
|
|
13
|
+
- An Open Exposure Ledger with aggregate ceilings across tenant, program,
|
|
14
|
+
counterparty, and action class; durable PostgreSQL custody; and mandatory
|
|
15
|
+
independent reconciliation for indeterminate execution.
|
|
16
|
+
- Exact-action signed refusal statements with atomic replay acceptance and
|
|
17
|
+
optional delivery, custody, and transparency evidence references.
|
|
18
|
+
- Period Coverage Reconciliation Attestations, governed-taxonomy Receipt Census
|
|
19
|
+
aggregates with coarse primary suppression, and signed external Loss
|
|
20
|
+
Experience Feeds with trusted correction lineage.
|
|
21
|
+
- A bounded composed lifecycle model and runtime-refinement trace covering
|
|
22
|
+
admission, exposure reservation, invocation, uncertainty, reconciliation,
|
|
23
|
+
refusal, and terminal-state preservation.
|
|
24
|
+
|
|
25
|
+
### Security
|
|
26
|
+
|
|
27
|
+
- Loss schedules, refusal statements, coverage attestations, and loss feeds
|
|
28
|
+
remain separate from authorization and cannot create execution authority.
|
|
29
|
+
- Open exposure remains reserved through `INVOKING` and `INDETERMINATE`; there
|
|
30
|
+
is no blind release or retry, and origin, executor, and reconciler authority
|
|
31
|
+
must remain distinct.
|
|
32
|
+
- Coverage and census artifacts reconcile only supplied populations. They do
|
|
33
|
+
not establish completeness, causation, insurance coverage, legal liability,
|
|
34
|
+
adjudicated loss, solvency, or payment.
|
|
35
|
+
|
|
7
36
|
## 0.19.0 (2026-07-28)
|
|
8
37
|
|
|
9
38
|
### Added
|
package/README.md
CHANGED
|
@@ -820,6 +820,28 @@ consequential actions by default**, so the parties with leverage (clouds, paymen
|
|
|
820
820
|
insurers) can *require* a receipt — and "no receipt" becomes like "no TLS cert" or "unsigned binary":
|
|
821
821
|
not always illegal, just untrusted. Necessary, not sufficient.
|
|
822
822
|
|
|
823
|
+
## Reliance risk plane
|
|
824
|
+
|
|
825
|
+
Gate `0.20.0` adds a consequence-risk plane around the existing Reliance
|
|
826
|
+
Program and execution lifecycle:
|
|
827
|
+
|
|
828
|
+
- `./loss-allocation-schedule` verifies separately signed, exact-program terms;
|
|
829
|
+
- `./open-exposure-ledger` and `./open-exposure-ledger-postgres` reserve and
|
|
830
|
+
aggregate open exposure before provider invocation;
|
|
831
|
+
- `./action-refusal-statement` emits a signed exact-action technical refusal;
|
|
832
|
+
- `./coverage-reconciliation-attestation` reconciles supplied effect and
|
|
833
|
+
receipt populations for a bounded period;
|
|
834
|
+
- `./receipt-census` emits governed-taxonomy aggregates with coarse primary suppression; and
|
|
835
|
+
- `./loss-experience-feed` carries signed external observations whose
|
|
836
|
+
corrections require a trusted current-head lineage resolver.
|
|
837
|
+
|
|
838
|
+
These artifacts do not create authority. EMILIA does not bear or allocate loss,
|
|
839
|
+
adjudicate disputes, verify insurance coverage or solvency, or move money.
|
|
840
|
+
Open exposure is an operational ceiling: an `INDETERMINATE` provider outcome
|
|
841
|
+
stays open until an independent reconciler supplies authenticated evidence.
|
|
842
|
+
See `docs/architecture/RELIANCE-RISK-PLANE.md` for the composed state model and
|
|
843
|
+
claim boundaries.
|
|
844
|
+
|
|
823
845
|
## Standards
|
|
824
846
|
|
|
825
847
|
The mechanism is specified in `draft-schrock-ep-enforcement-point` (the Receipt-Required rail) over
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export * from './dist/action-refusal-statement.js';
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export * from './dist/coverage-reconciliation-attestation.js';
|
|
@@ -0,0 +1,109 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Exact-action technical refusal evidence. It is not a legal determination,
|
|
3
|
+
* an adverse-benefit denial, an authorization grant, or proof of delivery.
|
|
4
|
+
*/
|
|
5
|
+
import { type RiskRecord, type TrustedRiskKeys } from './reliance-risk-crypto.js';
|
|
6
|
+
export declare const ACTION_REFUSAL_STATEMENT_VERSION = "EP-ACTION-REFUSAL-STATEMENT-v1";
|
|
7
|
+
export declare const ACTION_REFUSAL_CLAIM_BOUNDARY = "technical_refusal_not_legal_or_benefit_determination";
|
|
8
|
+
export declare const ACTION_REFUSAL_CLASSES: readonly string[];
|
|
9
|
+
export type ActionRefusalExpectedBindings = {
|
|
10
|
+
caid?: string;
|
|
11
|
+
action_digest?: string;
|
|
12
|
+
relying_party_id?: string;
|
|
13
|
+
program_id?: string;
|
|
14
|
+
program_version?: number;
|
|
15
|
+
source_digest?: string;
|
|
16
|
+
program_digest?: string;
|
|
17
|
+
nonce?: string;
|
|
18
|
+
};
|
|
19
|
+
export type ActionRefusalReplayStore = {
|
|
20
|
+
durable: boolean;
|
|
21
|
+
consume(relyingPartyId: string, nonce: string, refusalDigest: string): Promise<{
|
|
22
|
+
accepted: boolean;
|
|
23
|
+
reason: string | null;
|
|
24
|
+
}>;
|
|
25
|
+
};
|
|
26
|
+
export declare function signActionRefusalStatement(input: RiskRecord, signer: {
|
|
27
|
+
issuer_id: string;
|
|
28
|
+
key_id: string;
|
|
29
|
+
private_key: any;
|
|
30
|
+
}): RiskRecord;
|
|
31
|
+
export declare function actionRefusalStatementDigest(statement: unknown): string;
|
|
32
|
+
export declare function verifyActionRefusalStatement(statement: unknown, options?: {
|
|
33
|
+
trusted_keys?: TrustedRiskKeys;
|
|
34
|
+
now?: string | number;
|
|
35
|
+
max_future_skew_sec?: number;
|
|
36
|
+
expected?: ActionRefusalExpectedBindings;
|
|
37
|
+
}): {
|
|
38
|
+
accepted: false;
|
|
39
|
+
verified: false;
|
|
40
|
+
reason: string;
|
|
41
|
+
refusal_digest: string | null;
|
|
42
|
+
semantics: null;
|
|
43
|
+
delivery_evidence: "NOT_EVIDENCED";
|
|
44
|
+
custody_evidence: "NOT_EVIDENCED";
|
|
45
|
+
transparency_anchor: "NOT_REFERENCED";
|
|
46
|
+
claim_boundary: string;
|
|
47
|
+
} | {
|
|
48
|
+
accepted: true;
|
|
49
|
+
verified: true;
|
|
50
|
+
reason: null;
|
|
51
|
+
refusal_digest: string | null;
|
|
52
|
+
relying_party_id: any;
|
|
53
|
+
nonce: any;
|
|
54
|
+
semantics: any;
|
|
55
|
+
delivery_evidence: string;
|
|
56
|
+
custody_evidence: string;
|
|
57
|
+
transparency_anchor: string;
|
|
58
|
+
claim_boundary: string;
|
|
59
|
+
};
|
|
60
|
+
export declare function createMemoryActionRefusalReplayStore(): ActionRefusalReplayStore;
|
|
61
|
+
export declare function acceptActionRefusalStatement(statement: unknown, options?: {
|
|
62
|
+
trusted_keys?: TrustedRiskKeys;
|
|
63
|
+
now?: string | number;
|
|
64
|
+
max_future_skew_sec?: number;
|
|
65
|
+
expected?: ActionRefusalExpectedBindings;
|
|
66
|
+
replayStore?: ActionRefusalReplayStore;
|
|
67
|
+
allowEphemeralReplayStore?: boolean;
|
|
68
|
+
}): Promise<{
|
|
69
|
+
accepted: false;
|
|
70
|
+
reason: string;
|
|
71
|
+
replay_checked: boolean;
|
|
72
|
+
replay_store_durable: boolean;
|
|
73
|
+
verified: false;
|
|
74
|
+
refusal_digest: string | null;
|
|
75
|
+
semantics: null;
|
|
76
|
+
delivery_evidence: "NOT_EVIDENCED";
|
|
77
|
+
custody_evidence: "NOT_EVIDENCED";
|
|
78
|
+
transparency_anchor: "NOT_REFERENCED";
|
|
79
|
+
claim_boundary: string;
|
|
80
|
+
} | {
|
|
81
|
+
accepted: false;
|
|
82
|
+
reason: string;
|
|
83
|
+
replay_checked: boolean;
|
|
84
|
+
replay_store_durable: boolean;
|
|
85
|
+
verified: true;
|
|
86
|
+
refusal_digest: string | null;
|
|
87
|
+
relying_party_id: any;
|
|
88
|
+
nonce: any;
|
|
89
|
+
semantics: any;
|
|
90
|
+
delivery_evidence: string;
|
|
91
|
+
custody_evidence: string;
|
|
92
|
+
transparency_anchor: string;
|
|
93
|
+
claim_boundary: string;
|
|
94
|
+
} | {
|
|
95
|
+
accepted: true;
|
|
96
|
+
replay_checked: boolean;
|
|
97
|
+
replay_store_durable: boolean;
|
|
98
|
+
verified: true;
|
|
99
|
+
reason: null;
|
|
100
|
+
refusal_digest: string | null;
|
|
101
|
+
relying_party_id: any;
|
|
102
|
+
nonce: any;
|
|
103
|
+
semantics: any;
|
|
104
|
+
delivery_evidence: string;
|
|
105
|
+
custody_evidence: string;
|
|
106
|
+
transparency_anchor: string;
|
|
107
|
+
claim_boundary: string;
|
|
108
|
+
}>;
|
|
109
|
+
//# sourceMappingURL=action-refusal-statement.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"action-refusal-statement.d.ts","sourceRoot":"","sources":["../src/action-refusal-statement.ts"],"names":[],"mappings":"AACA;;;GAGG;AACH,OAAO,EAEkD,KAAK,UAAU,EACtE,KAAK,eAAe,EACrB,MAAM,2BAA2B,CAAC;AAEnC,eAAO,MAAM,gCAAgC,mCAAmC,CAAC;AACjF,eAAO,MAAM,6BAA6B,yDAAyD,CAAC;AACpG,eAAO,MAAM,sBAAsB,mBAQjC,CAAC;AA8BH,MAAM,MAAM,6BAA6B,GAAG;IAC1C,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB,CAAC;AAEF,MAAM,MAAM,wBAAwB,GAAG;IACrC,OAAO,EAAE,OAAO,CAAC;IACjB,OAAO,CACL,cAAc,EAAE,MAAM,EACtB,KAAK,EAAE,MAAM,EACb,aAAa,EAAE,MAAM,GACpB,OAAO,CAAC;QAAE,QAAQ,EAAE,OAAO,CAAC;QAAC,MAAM,EAAE,MAAM,GAAG,IAAI,CAAA;KAAE,CAAC,CAAC;CAC1D,CAAC;AA6KF,wBAAgB,0BAA0B,CACxC,KAAK,EAAE,UAAU,EACjB,MAAM,EAAE;IAAE,SAAS,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAC;IAAC,WAAW,EAAE,GAAG,CAAA;CAAE,cAKhE;AAED,wBAAgB,4BAA4B,CAAC,SAAS,EAAE,OAAO,GAAG,MAAM,CAEvE;AAuBD,wBAAgB,4BAA4B,CAAC,SAAS,EAAE,OAAO,EAAE,OAAO,GAAE;IACxE,YAAY,CAAC,EAAE,eAAe,CAAC;IAC/B,GAAG,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC;IACtB,mBAAmB,CAAC,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,EAAE,6BAA6B,CAAC;CACrC;;;;;;;;;;;;;;;;;;;;;;EA2CL;AAED,wBAAgB,oCAAoC,IAAI,wBAAwB,CAe/E;AAED,wBAAsB,4BAA4B,CAAC,SAAS,EAAE,OAAO,EAAE,OAAO,GAAE;IAC9E,YAAY,CAAC,EAAE,eAAe,CAAC;IAC/B,GAAG,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC;IACtB,mBAAmB,CAAC,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,EAAE,6BAA6B,CAAC;IACzC,WAAW,CAAC,EAAE,wBAAwB,CAAC;IACvC,yBAAyB,CAAC,EAAE,OAAO,CAAC;CAChC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA6CL"}
|
|
@@ -0,0 +1,333 @@
|
|
|
1
|
+
// @ts-nocheck
|
|
2
|
+
// SPDX-License-Identifier: Apache-2.0
|
|
3
|
+
/**
|
|
4
|
+
* Exact-action technical refusal evidence. It is not a legal determination,
|
|
5
|
+
* an adverse-benefit denial, an authorization grant, or proof of delivery.
|
|
6
|
+
*/
|
|
7
|
+
import { RISK_CAID, RISK_DIGEST, riskClone, riskDigest, riskExact, riskIdentifier, riskInstant, riskRecord, signRiskBody, verifyRiskBody, } from './reliance-risk-crypto.js';
|
|
8
|
+
export const ACTION_REFUSAL_STATEMENT_VERSION = 'EP-ACTION-REFUSAL-STATEMENT-v1';
|
|
9
|
+
export const ACTION_REFUSAL_CLAIM_BOUNDARY = 'technical_refusal_not_legal_or_benefit_determination';
|
|
10
|
+
export const ACTION_REFUSAL_CLASSES = Object.freeze([
|
|
11
|
+
'verification_failed',
|
|
12
|
+
'action_mismatch',
|
|
13
|
+
'evidence_unsatisfied',
|
|
14
|
+
'authorization_refused',
|
|
15
|
+
'replay_detected',
|
|
16
|
+
'expired',
|
|
17
|
+
'indeterminate',
|
|
18
|
+
]);
|
|
19
|
+
const PROGRAM_KEYS = ['program_id', 'version', 'source_digest', 'program_digest'];
|
|
20
|
+
const DELIVERY_KEYS = ['channel', 'recipient_id', 'delivered_at', 'custody_digest'];
|
|
21
|
+
const CUSTODY_KEYS = ['custodian_id', 'acknowledged_at', 'evidence_digest'];
|
|
22
|
+
const ANCHOR_KEYS = ['method', 'evidence_digest'];
|
|
23
|
+
const SEMANTIC_KEYS = ['verification', 'match', 'satisfaction', 'authorization'];
|
|
24
|
+
const BODY_KEYS = [
|
|
25
|
+
'@version', 'refusal_id', 'relying_party_id', 'caid', 'action_digest',
|
|
26
|
+
'program', 'failed_requirement_ids', 'evidence_digests',
|
|
27
|
+
'challenge_digests', 'nonce', 'refused_at', 'expires_at', 'refusal_class',
|
|
28
|
+
'semantics', 'delivery', 'custody', 'transparency_anchor', 'claim_boundary',
|
|
29
|
+
];
|
|
30
|
+
const INPUT_KEYS = new Set([
|
|
31
|
+
...BODY_KEYS.filter((key) => key !== '@version' && key !== 'semantics'
|
|
32
|
+
&& key !== 'delivery' && key !== 'custody' && key !== 'transparency_anchor'
|
|
33
|
+
&& key !== 'challenge_digests'),
|
|
34
|
+
'semantics', 'delivery', 'custody', 'transparency_anchor',
|
|
35
|
+
'challenge_digest', 'challenge_digests',
|
|
36
|
+
]);
|
|
37
|
+
const EXPECTED_KEYS = [
|
|
38
|
+
'caid', 'action_digest', 'relying_party_id', 'program_id', 'program_version',
|
|
39
|
+
'source_digest', 'program_digest', 'nonce',
|
|
40
|
+
];
|
|
41
|
+
const VERIFICATION = new Set(['VERIFIED', 'NOT_VERIFIED', 'INDETERMINATE']);
|
|
42
|
+
const MATCH = new Set(['MATCH', 'MISMATCH', 'INDETERMINATE']);
|
|
43
|
+
const SATISFACTION = new Set(['SATISFIED', 'NOT_SATISFIED', 'INDETERMINATE']);
|
|
44
|
+
const AUTHORIZATION = new Set(['AUTHORIZED', 'NOT_AUTHORIZED', 'NOT_EVALUATED', 'INDETERMINATE']);
|
|
45
|
+
function canonicalSet(value, validator, maximum, requireNonEmpty) {
|
|
46
|
+
if (!Array.isArray(value) || value.length > maximum
|
|
47
|
+
|| (requireNonEmpty && value.length === 0) || !value.every(validator)
|
|
48
|
+
|| new Set(value).size !== value.length)
|
|
49
|
+
return false;
|
|
50
|
+
return value.every((entry, index) => index === 0
|
|
51
|
+
|| Buffer.from(value[index - 1]).compare(Buffer.from(entry)) < 0);
|
|
52
|
+
}
|
|
53
|
+
function sortedUnique(value, validator, maximum, label, requireNonEmpty) {
|
|
54
|
+
if (!Array.isArray(value) || value.length > maximum
|
|
55
|
+
|| (requireNonEmpty && value.length === 0) || !value.every(validator)) {
|
|
56
|
+
throw new TypeError(`action refusal ${label} are invalid`);
|
|
57
|
+
}
|
|
58
|
+
if (new Set(value).size !== value.length) {
|
|
59
|
+
throw new TypeError(`action refusal ${label} are duplicate`);
|
|
60
|
+
}
|
|
61
|
+
return [...value].sort((left, right) => Buffer.from(left).compare(Buffer.from(right)));
|
|
62
|
+
}
|
|
63
|
+
function defaultSemantics(refusalClass) {
|
|
64
|
+
const base = {
|
|
65
|
+
verification: 'VERIFIED',
|
|
66
|
+
match: 'MATCH',
|
|
67
|
+
satisfaction: 'NOT_SATISFIED',
|
|
68
|
+
authorization: 'NOT_EVALUATED',
|
|
69
|
+
};
|
|
70
|
+
if (refusalClass === 'verification_failed')
|
|
71
|
+
return { ...base, verification: 'NOT_VERIFIED' };
|
|
72
|
+
if (refusalClass === 'action_mismatch')
|
|
73
|
+
return { ...base, match: 'MISMATCH' };
|
|
74
|
+
if (refusalClass === 'authorization_refused')
|
|
75
|
+
return { ...base, authorization: 'NOT_AUTHORIZED' };
|
|
76
|
+
if (refusalClass === 'indeterminate')
|
|
77
|
+
return { ...base, satisfaction: 'INDETERMINATE' };
|
|
78
|
+
return base;
|
|
79
|
+
}
|
|
80
|
+
function validSemantics(value, refusalClass) {
|
|
81
|
+
if (!riskExact(value, SEMANTIC_KEYS)
|
|
82
|
+
|| !VERIFICATION.has(value.verification) || !MATCH.has(value.match)
|
|
83
|
+
|| !SATISFACTION.has(value.satisfaction) || !AUTHORIZATION.has(value.authorization)
|
|
84
|
+
|| value.satisfaction === 'SATISFIED')
|
|
85
|
+
return false;
|
|
86
|
+
if (refusalClass === 'verification_failed')
|
|
87
|
+
return value.verification === 'NOT_VERIFIED';
|
|
88
|
+
if (refusalClass === 'action_mismatch')
|
|
89
|
+
return value.match === 'MISMATCH';
|
|
90
|
+
if (refusalClass === 'evidence_unsatisfied')
|
|
91
|
+
return value.satisfaction === 'NOT_SATISFIED';
|
|
92
|
+
if (refusalClass === 'authorization_refused')
|
|
93
|
+
return value.authorization === 'NOT_AUTHORIZED';
|
|
94
|
+
if (refusalClass === 'indeterminate')
|
|
95
|
+
return Object.values(value).includes('INDETERMINATE');
|
|
96
|
+
return true;
|
|
97
|
+
}
|
|
98
|
+
function validate(value) {
|
|
99
|
+
if (!riskRecord(value))
|
|
100
|
+
throw new TypeError('action refusal statement shape is invalid');
|
|
101
|
+
const { issuer, ...body } = value;
|
|
102
|
+
if (issuer !== undefined && (!riskExact(issuer, ['id', 'key_id'])
|
|
103
|
+
|| !riskIdentifier(issuer.id) || !riskIdentifier(issuer.key_id))) {
|
|
104
|
+
throw new TypeError('action refusal issuer is invalid');
|
|
105
|
+
}
|
|
106
|
+
if (!riskExact(body, BODY_KEYS) || body['@version'] !== ACTION_REFUSAL_STATEMENT_VERSION
|
|
107
|
+
|| !riskIdentifier(body.refusal_id) || !riskIdentifier(body.relying_party_id)
|
|
108
|
+
|| typeof body.caid !== 'string' || !RISK_CAID.test(body.caid)
|
|
109
|
+
|| typeof body.action_digest !== 'string' || !RISK_DIGEST.test(body.action_digest)
|
|
110
|
+
|| !riskExact(body.program, PROGRAM_KEYS) || !riskIdentifier(body.program.program_id)
|
|
111
|
+
|| !Number.isSafeInteger(body.program.version) || body.program.version < 1
|
|
112
|
+
|| typeof body.program.source_digest !== 'string' || !RISK_DIGEST.test(body.program.source_digest)
|
|
113
|
+
|| typeof body.program.program_digest !== 'string' || !RISK_DIGEST.test(body.program.program_digest)
|
|
114
|
+
|| !riskIdentifier(body.nonce) || !ACTION_REFUSAL_CLASSES.includes(body.refusal_class)
|
|
115
|
+
|| !validSemantics(body.semantics, body.refusal_class)
|
|
116
|
+
|| body.claim_boundary !== ACTION_REFUSAL_CLAIM_BOUNDARY) {
|
|
117
|
+
throw new TypeError('action refusal statement shape is invalid');
|
|
118
|
+
}
|
|
119
|
+
if (!canonicalSet(body.failed_requirement_ids, riskIdentifier, 128, true)) {
|
|
120
|
+
throw new TypeError('action refusal requirements are invalid, duplicate, or unsorted');
|
|
121
|
+
}
|
|
122
|
+
if (!canonicalSet(body.evidence_digests, (entry) => typeof entry === 'string' && RISK_DIGEST.test(entry), 256, false) || !canonicalSet(body.challenge_digests, (entry) => typeof entry === 'string' && RISK_DIGEST.test(entry), 256, true))
|
|
123
|
+
throw new TypeError('action refusal evidence or challenge binding is invalid');
|
|
124
|
+
const refused = riskInstant(body.refused_at);
|
|
125
|
+
const expires = riskInstant(body.expires_at);
|
|
126
|
+
if (!Number.isFinite(refused) || !Number.isFinite(expires) || expires <= refused) {
|
|
127
|
+
throw new TypeError('action refusal time window is invalid');
|
|
128
|
+
}
|
|
129
|
+
if (body.delivery !== null && (!riskExact(body.delivery, DELIVERY_KEYS)
|
|
130
|
+
|| !riskIdentifier(body.delivery.channel) || !riskIdentifier(body.delivery.recipient_id)
|
|
131
|
+
|| !Number.isFinite(riskInstant(body.delivery.delivered_at))
|
|
132
|
+
|| riskInstant(body.delivery.delivered_at) < refused
|
|
133
|
+
|| riskInstant(body.delivery.delivered_at) > expires
|
|
134
|
+
|| typeof body.delivery.custody_digest !== 'string'
|
|
135
|
+
|| !RISK_DIGEST.test(body.delivery.custody_digest))) {
|
|
136
|
+
throw new TypeError('action refusal delivery evidence is invalid');
|
|
137
|
+
}
|
|
138
|
+
if (body.custody !== null && (body.delivery === null
|
|
139
|
+
|| !riskExact(body.custody, CUSTODY_KEYS)
|
|
140
|
+
|| !riskIdentifier(body.custody.custodian_id)
|
|
141
|
+
|| !Number.isFinite(riskInstant(body.custody.acknowledged_at))
|
|
142
|
+
|| riskInstant(body.custody.acknowledged_at) < riskInstant(body.delivery.delivered_at)
|
|
143
|
+
|| riskInstant(body.custody.acknowledged_at) > expires
|
|
144
|
+
|| typeof body.custody.evidence_digest !== 'string'
|
|
145
|
+
|| !RISK_DIGEST.test(body.custody.evidence_digest))) {
|
|
146
|
+
throw new TypeError('action refusal custody evidence is invalid');
|
|
147
|
+
}
|
|
148
|
+
if (body.transparency_anchor !== null && (!riskExact(body.transparency_anchor, ANCHOR_KEYS)
|
|
149
|
+
|| !riskIdentifier(body.transparency_anchor.method)
|
|
150
|
+
|| typeof body.transparency_anchor.evidence_digest !== 'string'
|
|
151
|
+
|| !RISK_DIGEST.test(body.transparency_anchor.evidence_digest))) {
|
|
152
|
+
throw new TypeError('action refusal transparency anchor is invalid');
|
|
153
|
+
}
|
|
154
|
+
}
|
|
155
|
+
function normalizedInput(input) {
|
|
156
|
+
const required = [
|
|
157
|
+
'refusal_id', 'relying_party_id', 'caid', 'action_digest', 'program',
|
|
158
|
+
'failed_requirement_ids', 'evidence_digests', 'nonce', 'refused_at',
|
|
159
|
+
'expires_at', 'refusal_class', 'claim_boundary',
|
|
160
|
+
];
|
|
161
|
+
if (!riskRecord(input) || !required.every((key) => Object.hasOwn(input, key))
|
|
162
|
+
|| !Object.keys(input).every((key) => INPUT_KEYS.has(key))
|
|
163
|
+
|| (Object.hasOwn(input, 'challenge_digest') === Object.hasOwn(input, 'challenge_digests'))) {
|
|
164
|
+
throw new TypeError('action refusal input shape is invalid');
|
|
165
|
+
}
|
|
166
|
+
const rawChallenges = input.challenge_digests ?? [input.challenge_digest];
|
|
167
|
+
return {
|
|
168
|
+
'@version': ACTION_REFUSAL_STATEMENT_VERSION,
|
|
169
|
+
refusal_id: input.refusal_id,
|
|
170
|
+
relying_party_id: input.relying_party_id,
|
|
171
|
+
caid: input.caid,
|
|
172
|
+
action_digest: input.action_digest,
|
|
173
|
+
program: input.program,
|
|
174
|
+
failed_requirement_ids: sortedUnique(input.failed_requirement_ids, riskIdentifier, 128, 'requirements', true),
|
|
175
|
+
evidence_digests: sortedUnique(input.evidence_digests, (entry) => typeof entry === 'string' && RISK_DIGEST.test(entry), 256, 'evidence digests', false),
|
|
176
|
+
challenge_digests: sortedUnique(rawChallenges, (entry) => typeof entry === 'string' && RISK_DIGEST.test(entry), 256, 'challenge digests', true),
|
|
177
|
+
nonce: input.nonce,
|
|
178
|
+
refused_at: input.refused_at,
|
|
179
|
+
expires_at: input.expires_at,
|
|
180
|
+
refusal_class: input.refusal_class,
|
|
181
|
+
semantics: input.semantics ?? defaultSemantics(input.refusal_class),
|
|
182
|
+
delivery: input.delivery ?? null,
|
|
183
|
+
custody: input.custody ?? null,
|
|
184
|
+
transparency_anchor: input.transparency_anchor ?? null,
|
|
185
|
+
claim_boundary: input.claim_boundary,
|
|
186
|
+
};
|
|
187
|
+
}
|
|
188
|
+
export function signActionRefusalStatement(input, signer) {
|
|
189
|
+
const body = normalizedInput(input);
|
|
190
|
+
validate(body);
|
|
191
|
+
return signRiskBody(ACTION_REFUSAL_STATEMENT_VERSION, body, signer);
|
|
192
|
+
}
|
|
193
|
+
export function actionRefusalStatementDigest(statement) {
|
|
194
|
+
return riskDigest(statement);
|
|
195
|
+
}
|
|
196
|
+
function expectedMismatch(body, expected) {
|
|
197
|
+
if (expected === undefined)
|
|
198
|
+
return null;
|
|
199
|
+
if (!riskRecord(expected) || !Object.keys(expected).every((key) => EXPECTED_KEYS.includes(key))) {
|
|
200
|
+
return 'expected_binding_invalid';
|
|
201
|
+
}
|
|
202
|
+
const bindings = {
|
|
203
|
+
caid: body.caid,
|
|
204
|
+
action_digest: body.action_digest,
|
|
205
|
+
relying_party_id: body.relying_party_id,
|
|
206
|
+
program_id: body.program.program_id,
|
|
207
|
+
program_version: body.program.version,
|
|
208
|
+
source_digest: body.program.source_digest,
|
|
209
|
+
program_digest: body.program.program_digest,
|
|
210
|
+
nonce: body.nonce,
|
|
211
|
+
};
|
|
212
|
+
for (const key of Object.keys(expected)) {
|
|
213
|
+
if (bindings[key] !== expected[key])
|
|
214
|
+
return `${key}_mismatch`;
|
|
215
|
+
}
|
|
216
|
+
return null;
|
|
217
|
+
}
|
|
218
|
+
export function verifyActionRefusalStatement(statement, options = {}) {
|
|
219
|
+
const refuse = (reason, refusalDigest = null) => ({
|
|
220
|
+
accepted: false,
|
|
221
|
+
verified: false,
|
|
222
|
+
reason,
|
|
223
|
+
refusal_digest: refusalDigest,
|
|
224
|
+
semantics: null,
|
|
225
|
+
delivery_evidence: 'NOT_EVIDENCED',
|
|
226
|
+
custody_evidence: 'NOT_EVIDENCED',
|
|
227
|
+
transparency_anchor: 'NOT_REFERENCED',
|
|
228
|
+
claim_boundary: ACTION_REFUSAL_CLAIM_BOUNDARY,
|
|
229
|
+
});
|
|
230
|
+
const signed = verifyRiskBody(statement, ACTION_REFUSAL_STATEMENT_VERSION, options.trusted_keys);
|
|
231
|
+
if (!signed.valid || !signed.body)
|
|
232
|
+
return refuse(signed.reason ?? 'refusal_invalid');
|
|
233
|
+
try {
|
|
234
|
+
validate(signed.body);
|
|
235
|
+
}
|
|
236
|
+
catch {
|
|
237
|
+
return refuse('refusal_schema_invalid', signed.artifact_digest);
|
|
238
|
+
}
|
|
239
|
+
const now = options.now === undefined
|
|
240
|
+
? Date.now() : (typeof options.now === 'string' ? Date.parse(options.now) : Number(options.now));
|
|
241
|
+
const skew = options.max_future_skew_sec ?? 30;
|
|
242
|
+
if (!Number.isFinite(now) || !Number.isSafeInteger(skew) || skew < 0 || skew > 3600) {
|
|
243
|
+
return refuse('verification_time_invalid', signed.artifact_digest);
|
|
244
|
+
}
|
|
245
|
+
if (riskInstant(signed.body.refused_at) > now + skew * 1000) {
|
|
246
|
+
return refuse('refusal_from_future', signed.artifact_digest);
|
|
247
|
+
}
|
|
248
|
+
if (now >= riskInstant(signed.body.expires_at)) {
|
|
249
|
+
return refuse('refusal_expired', signed.artifact_digest);
|
|
250
|
+
}
|
|
251
|
+
const mismatch = expectedMismatch(signed.body, options.expected);
|
|
252
|
+
if (mismatch)
|
|
253
|
+
return refuse(mismatch, signed.artifact_digest);
|
|
254
|
+
return {
|
|
255
|
+
accepted: true,
|
|
256
|
+
verified: true,
|
|
257
|
+
reason: null,
|
|
258
|
+
refusal_digest: signed.artifact_digest,
|
|
259
|
+
relying_party_id: signed.body.relying_party_id,
|
|
260
|
+
nonce: signed.body.nonce,
|
|
261
|
+
semantics: riskClone(signed.body.semantics),
|
|
262
|
+
delivery_evidence: signed.body.delivery === null ? 'NOT_EVIDENCED' : 'REFERENCED',
|
|
263
|
+
custody_evidence: signed.body.custody === null ? 'NOT_EVIDENCED' : 'REFERENCED',
|
|
264
|
+
transparency_anchor: signed.body.transparency_anchor === null
|
|
265
|
+
? 'NOT_REFERENCED' : 'REFERENCED_NOT_EXTERNALLY_VERIFIED',
|
|
266
|
+
claim_boundary: ACTION_REFUSAL_CLAIM_BOUNDARY,
|
|
267
|
+
};
|
|
268
|
+
}
|
|
269
|
+
export function createMemoryActionRefusalReplayStore() {
|
|
270
|
+
const consumed = new Map();
|
|
271
|
+
return Object.freeze({
|
|
272
|
+
durable: false,
|
|
273
|
+
async consume(relyingPartyId, nonce, refusalDigest) {
|
|
274
|
+
const key = JSON.stringify([relyingPartyId, nonce]);
|
|
275
|
+
const existing = consumed.get(key);
|
|
276
|
+
if (existing === undefined) {
|
|
277
|
+
consumed.set(key, refusalDigest);
|
|
278
|
+
return { accepted: true, reason: null };
|
|
279
|
+
}
|
|
280
|
+
if (existing === refusalDigest)
|
|
281
|
+
return { accepted: false, reason: 'statement_replay' };
|
|
282
|
+
return { accepted: false, reason: 'nonce_equivocation' };
|
|
283
|
+
},
|
|
284
|
+
});
|
|
285
|
+
}
|
|
286
|
+
export async function acceptActionRefusalStatement(statement, options = {}) {
|
|
287
|
+
const verification = verifyActionRefusalStatement(statement, options);
|
|
288
|
+
const refused = (reason, checked = false, durable = false) => ({
|
|
289
|
+
...verification,
|
|
290
|
+
accepted: false,
|
|
291
|
+
reason,
|
|
292
|
+
replay_checked: checked,
|
|
293
|
+
replay_store_durable: durable,
|
|
294
|
+
});
|
|
295
|
+
if (!verification.verified)
|
|
296
|
+
return refused(verification.reason);
|
|
297
|
+
if (typeof verification.refusal_digest !== 'string')
|
|
298
|
+
return refused('refusal_digest_missing');
|
|
299
|
+
if (!riskExact(options.expected, EXPECTED_KEYS))
|
|
300
|
+
return refused('complete_expected_binding_required');
|
|
301
|
+
const store = options.replayStore;
|
|
302
|
+
if (!store || typeof store.consume !== 'function' || typeof store.durable !== 'boolean') {
|
|
303
|
+
return refused('replay_store_required');
|
|
304
|
+
}
|
|
305
|
+
if (!store.durable && options.allowEphemeralReplayStore !== true) {
|
|
306
|
+
return refused('durable_replay_store_required');
|
|
307
|
+
}
|
|
308
|
+
let result;
|
|
309
|
+
try {
|
|
310
|
+
result = await store.consume(verification.relying_party_id, verification.nonce, verification.refusal_digest);
|
|
311
|
+
}
|
|
312
|
+
catch {
|
|
313
|
+
return refused('replay_store_unavailable', false, store.durable);
|
|
314
|
+
}
|
|
315
|
+
if (!riskExact(result, ['accepted', 'reason']) || typeof result.accepted !== 'boolean'
|
|
316
|
+
|| (result.reason !== null && typeof result.reason !== 'string')) {
|
|
317
|
+
return refused('replay_store_result_invalid', false, store.durable);
|
|
318
|
+
}
|
|
319
|
+
if (!result.accepted) {
|
|
320
|
+
const reason = result.reason === 'statement_replay' || result.reason === 'nonce_equivocation'
|
|
321
|
+
? result.reason : 'replay_store_refused';
|
|
322
|
+
return refused(reason, true, store.durable);
|
|
323
|
+
}
|
|
324
|
+
if (result.reason !== null)
|
|
325
|
+
return refused('replay_store_result_invalid', true, store.durable);
|
|
326
|
+
return {
|
|
327
|
+
...verification,
|
|
328
|
+
accepted: true,
|
|
329
|
+
replay_checked: true,
|
|
330
|
+
replay_store_durable: store.durable,
|
|
331
|
+
};
|
|
332
|
+
}
|
|
333
|
+
//# sourceMappingURL=action-refusal-statement.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"action-refusal-statement.js","sourceRoot":"","sources":["../src/action-refusal-statement.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
/** Signed period reconciliation of supplied populations; never proof that the supplied population is complete. */
|
|
2
|
+
import { type RiskRecord, type TrustedRiskKeys } from './reliance-risk-crypto.js';
|
|
3
|
+
export declare const COVERAGE_RECONCILIATION_ATTESTATION_VERSION = "EP-COVERAGE-RECONCILIATION-ATTESTATION-v1";
|
|
4
|
+
export declare const COVERAGE_RECONCILIATION_CLAIM_BOUNDARY = "signed_reconciliation_of_supplied_populations_not_population_completeness";
|
|
5
|
+
export declare function signCoverageReconciliationAttestation(input: RiskRecord, signer: {
|
|
6
|
+
issuer_id: string;
|
|
7
|
+
key_id: string;
|
|
8
|
+
private_key: any;
|
|
9
|
+
}): RiskRecord;
|
|
10
|
+
export declare function verifyCoverageReconciliationAttestation(attestation: unknown, options?: {
|
|
11
|
+
trusted_keys?: TrustedRiskKeys;
|
|
12
|
+
now?: string | number;
|
|
13
|
+
expected_program?: RiskRecord;
|
|
14
|
+
expected_census_digest?: string;
|
|
15
|
+
expected_relying_party_id?: string;
|
|
16
|
+
}): {
|
|
17
|
+
accepted: boolean;
|
|
18
|
+
verified: boolean;
|
|
19
|
+
reason: string;
|
|
20
|
+
attestation_digest: string | null;
|
|
21
|
+
claim_boundary: string;
|
|
22
|
+
} | {
|
|
23
|
+
accepted: boolean;
|
|
24
|
+
verified: boolean;
|
|
25
|
+
reason: null;
|
|
26
|
+
attestation_digest: string | null;
|
|
27
|
+
claim_boundary: string;
|
|
28
|
+
};
|
|
29
|
+
//# sourceMappingURL=coverage-reconciliation-attestation.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"coverage-reconciliation-attestation.d.ts","sourceRoot":"","sources":["../src/coverage-reconciliation-attestation.ts"],"names":[],"mappings":"AACA,kHAAkH;AAClH,OAAO,EAEyB,KAAK,UAAU,EAAE,KAAK,eAAe,EACpE,MAAM,2BAA2B,CAAC;AAEnC,eAAO,MAAM,2CAA2C,8CAA8C,CAAC;AACvG,eAAO,MAAM,sCAAsC,8EAA8E,CAAC;AAkDlI,wBAAgB,qCAAqC,CAAC,KAAK,EAAE,UAAU,EAAE,MAAM,EAAE;IAAE,SAAS,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAC;IAAC,WAAW,EAAE,GAAG,CAAA;CAAE,cAKvI;AAED,wBAAgB,uCAAuC,CAAC,WAAW,EAAE,OAAO,EAAE,OAAO,GAAE;IACrF,YAAY,CAAC,EAAE,eAAe,CAAC;IAAC,GAAG,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC;IAAC,gBAAgB,CAAC,EAAE,UAAU,CAAC;IACrF,sBAAsB,CAAC,EAAE,MAAM,CAAC;IAAC,yBAAyB,CAAC,EAAE,MAAM,CAAC;CAChE;;;;;;;;;;;;EAsCL"}
|