@ziffer-io/verify 0.1.1 → 0.2.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/dist/cbor.d.ts +87 -0
- package/dist/cbor.d.ts.map +1 -0
- package/dist/cbor.js +326 -0
- package/dist/cbor.js.map +1 -0
- package/dist/clauses.d.ts +70 -0
- package/dist/clauses.d.ts.map +1 -1
- package/dist/clauses.js +77 -0
- package/dist/clauses.js.map +1 -1
- package/dist/index.d.ts +5 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +5 -0
- package/dist/index.js.map +1 -1
- package/dist/quorum.d.ts +245 -0
- package/dist/quorum.d.ts.map +1 -0
- package/dist/quorum.js +566 -0
- package/dist/quorum.js.map +1 -0
- package/dist/sig.d.ts +57 -0
- package/dist/sig.d.ts.map +1 -0
- package/dist/sig.js +127 -0
- package/dist/sig.js.map +1 -0
- package/dist/testkeys.d.ts +33 -0
- package/dist/testkeys.d.ts.map +1 -1
- package/dist/testkeys.js +100 -0
- package/dist/testkeys.js.map +1 -1
- package/dist/verify.d.ts +44 -20
- package/dist/verify.d.ts.map +1 -1
- package/dist/verify.js +55 -146
- package/dist/verify.js.map +1 -1
- package/dist/webauthn.d.ts +148 -0
- package/dist/webauthn.d.ts.map +1 -0
- package/dist/webauthn.js +414 -0
- package/dist/webauthn.js.map +1 -0
- package/dist/wire.d.ts +44 -0
- package/dist/wire.d.ts.map +1 -0
- package/dist/wire.js +90 -0
- package/dist/wire.js.map +1 -0
- package/package.json +2 -2
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EAAE,KAAK,EAAE,iBAAiB,EAAa,MAAM,YAAY,CAAC;AACjE,OAAO,EACL,gBAAgB,EAChB,gBAAgB,EAChB,eAAe,EACf,uBAAuB,EACvB,yBAAyB,EACzB,gBAAgB,EAChB,kBAAkB,EAClB,eAAe,EACf,oBAAoB,EACpB,sBAAsB,EACtB,cAAc,EACd,gBAAgB,GACjB,MAAM,cAAc,CAAC;AACtB,OAAO,EACL,cAAc,EACd,eAAe,EACf,mBAAmB,EACnB,mBAAmB,GACpB,MAAM,cAAc,CAAC;AACtB,OAAO,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AAC5C,OAAO,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AACvC,OAAO,EACL,UAAU,EACV,cAAc,EACd,eAAe,EACf,YAAY,GAKb,MAAM,YAAY,CAAC;AACpB,OAAO,EACL,eAAe,EACf,wBAAwB,EACxB,cAAc,EACd,eAAe,EACf,cAAc,EACd,YAAY,EACZ,wBAAwB,EACxB,eAAe,EACf,cAAc,EACd,QAAQ,EACR,aAAa,GAId,MAAM,aAAa,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EAAE,KAAK,EAAE,iBAAiB,EAAa,MAAM,YAAY,CAAC;AACjE,OAAO,EACL,SAAS,EACT,WAAW,EACX,UAAU,EACV,UAAU,EACV,WAAW,EACX,SAAS,EACT,QAAQ,EACR,eAAe,GAGhB,MAAM,WAAW,CAAC;AACnB,OAAO,EACL,gBAAgB,EAChB,wBAAwB,EACxB,mBAAmB,EACnB,qBAAqB,EACrB,cAAc,EACd,kBAAkB,EAClB,cAAc,EACd,iBAAiB,EACjB,iBAAiB,EACjB,mBAAmB,EACnB,gBAAgB,EAChB,iBAAiB,EACjB,sBAAsB,EACtB,gBAAgB,EAChB,oBAAoB,EACpB,wBAAwB,EACxB,oBAAoB,EACpB,mBAAmB,EACnB,aAAa,EACb,mBAAmB,EACnB,uBAAuB,GACxB,MAAM,cAAc,CAAC;AACtB,OAAO,EACL,UAAU,EACV,aAAa,EACb,WAAW,EACX,YAAY,GAOb,MAAM,aAAa,CAAC;AACrB,OAAO,EACL,gBAAgB,EAChB,SAAS,EACT,iBAAiB,EACjB,aAAa,EACb,2BAA2B,EAC3B,kBAAkB,EAClB,eAAe,EACf,kBAAkB,EAClB,kBAAkB,EAClB,aAAa,EACb,eAAe,EACf,YAAY,EACZ,eAAe,EACf,cAAc,EACd,iBAAiB,GAGlB,MAAM,eAAe,CAAC;AACvB,OAAO,EAAE,SAAS,EAAE,MAAM,WAAW,CAAC;AACtC,OAAO,EACL,gBAAgB,EAChB,gBAAgB,EAChB,eAAe,EACf,uBAAuB,EACvB,yBAAyB,EACzB,gBAAgB,EAChB,kBAAkB,EAClB,eAAe,EACf,oBAAoB,EACpB,sBAAsB,EACtB,cAAc,EACd,gBAAgB,GACjB,MAAM,cAAc,CAAC;AACtB,OAAO,EACL,cAAc,EACd,eAAe,EACf,mBAAmB,EACnB,mBAAmB,GACpB,MAAM,cAAc,CAAC;AACtB,OAAO,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AAC5C,OAAO,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AACvC,OAAO,EACL,UAAU,EACV,cAAc,EACd,eAAe,EACf,YAAY,GAKb,MAAM,YAAY,CAAC;AACpB,OAAO,EACL,eAAe,EACf,wBAAwB,EACxB,cAAc,EACd,eAAe,EACf,cAAc,EACd,YAAY,EACZ,wBAAwB,EACxB,eAAe,EACf,cAAc,EACd,QAAQ,EACR,aAAa,GAId,MAAM,aAAa,CAAC"}
|
package/dist/quorum.d.ts
ADDED
|
@@ -0,0 +1,245 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* §9.3 step 7b -- the AT-* quorum and §8.6b's AB-*, run in the CUSTOMER's own
|
|
3
|
+
* process against the CUSTOMER's own signed bundle.
|
|
4
|
+
*
|
|
5
|
+
* # Why this exists (ACP-406 gap 1)
|
|
6
|
+
*
|
|
7
|
+
* Until this module, a customer verifying a ZIFFER receipt checked the
|
|
8
|
+
* signature and the bindings and **trusted us for the approvals**: the header
|
|
9
|
+
* table in `verify.ts` said "7b -- NO, needs the attester registry". A
|
|
10
|
+
* compromised receipt-signing substrate could therefore emit a floor-HIGH
|
|
11
|
+
* receipt carrying fabricated `attestation_digests`, and every customer-side
|
|
12
|
+
* verifier would accept it. The registry is in the customer's OWN signed
|
|
13
|
+
* bundle -- the tree they already load for `policy_bundle_hash` -- so nothing
|
|
14
|
+
* about that trust was necessary. This is the third implementation of the
|
|
15
|
+
* step, after `reference/src/acp_executor.py::_verify_quorum` and
|
|
16
|
+
* `crates/acp-decision/src/quorum.rs`, and the clause names are theirs.
|
|
17
|
+
*
|
|
18
|
+
* # AT-9 is TWO requirements and they fail closed on disjoint inputs
|
|
19
|
+
*
|
|
20
|
+
* 1. The threshold is **recomputed** from the signed bundle's `quorum_k`
|
|
21
|
+
* (PB-6) and never read from an attestation. Through v1.3.14 the reference
|
|
22
|
+
* read `entries[0].required_count` -- asking the party under verification
|
|
23
|
+
* how many signatures to demand -- and one compromised attester key signing
|
|
24
|
+
* one object carrying `required_count: 1` executed a floor-HIGH action.
|
|
25
|
+
* 2. **Every** entry's `required_count` must equal `quorum_k`. That is a
|
|
26
|
+
* CONSENT check (AT-3), not a threshold one: two humans approving while both
|
|
27
|
+
* objects say `3` means they approved believing a third reviewer existed.
|
|
28
|
+
*
|
|
29
|
+
* Deleting (2) cannot lower a quorum; deleting (1) cannot detect an attester
|
|
30
|
+
* who signed under a different stated threshold. Keeping only (1) satisfies
|
|
31
|
+
* INV-1-HIGH while silently executing actions no attester agreed to.
|
|
32
|
+
*
|
|
33
|
+
* # What this CANNOT check customer-side, and why -- read before trusting a pass
|
|
34
|
+
*
|
|
35
|
+
* These are absences, not agreements. Each one is a step of §9.3 this package
|
|
36
|
+
* does not run, and each is disclosed here rather than approximated:
|
|
37
|
+
*
|
|
38
|
+
* - **Whether a quorum was required at all.** §9.3 step 7 recomputes the
|
|
39
|
+
* floor-only risk from the bundle's `floors.json` and `risk_functions.json`;
|
|
40
|
+
* this package does not grade, so it cannot know that a receipt carrying an
|
|
41
|
+
* EMPTY attestation list should have carried a quorum. A receipt with no
|
|
42
|
+
* attestations passes 7b vacuously (AB-1's own note covers the legitimate
|
|
43
|
+
* LOW/MEDIUM case) and {@link verifyQuorum} returns `null` so the caller can
|
|
44
|
+
* see that nothing was verified. **Reading `risk_level_floor_only` off the
|
|
45
|
+
* receipt instead would be X1 -- the defect where a compromised issuer
|
|
46
|
+
* asserting `LOW` suppressed attestation entirely** -- so it is not read.
|
|
47
|
+
* - **`obj.floor_only_risk` against the recomputed grade** (7b(iii), TR-8), for
|
|
48
|
+
* the same reason: there is no recomputed grade here to compare against.
|
|
49
|
+
* - **Single-use of the recomputed `attestation_id`** (7b(v), CL-3). That needs
|
|
50
|
+
* a linearizable Consumption Ledger and this package holds none. Replay
|
|
51
|
+
* protection that forgets is not replay protection, so it is named rather
|
|
52
|
+
* than half-built.
|
|
53
|
+
* - **HM-4 (f)'s stored signature counter** is `T` at this boundary: the caller
|
|
54
|
+
* hands in what it stored and MUST persist what {@link QuorumOutcome}
|
|
55
|
+
* returns. A caller passing an empty map every time has switched (f) off for
|
|
56
|
+
* a credential that has signed before.
|
|
57
|
+
*
|
|
58
|
+
* # One deliberate NARROWING beyond both engine implementations
|
|
59
|
+
*
|
|
60
|
+
* AT-1 says role membership "is resolved against the attester registry", and
|
|
61
|
+
* neither engine implementation resolves it: `quorum.rs` records that
|
|
62
|
+
* `AttesterRole` is generated and read by nothing, and the Python reference has
|
|
63
|
+
* no role field at all. This one does, because the customer's registry carries
|
|
64
|
+
* `role` and their bundle is the authority on who may approve: an entry counts
|
|
65
|
+
* toward the quorum only if its attester's REGISTRY role is named in the
|
|
66
|
+
* object's `required_roles`. An empty list means the rule demanded a quorum and
|
|
67
|
+
* named no role, so any enrolled attester satisfies it (AT-1 as amended in
|
|
68
|
+
* v1.3.32, ACP-308) -- which is byte-for-byte the engine's behaviour, and is the
|
|
69
|
+
* case every ZIFFER deployment is in today except where the policy engine sets
|
|
70
|
+
* `["approver"]`.
|
|
71
|
+
*
|
|
72
|
+
* This is a NARROWER acceptance, never a wider one, and it is stated because a
|
|
73
|
+
* third implementation that refuses what the other two accept is a divergence
|
|
74
|
+
* even when it is the safer side. Its strength is bounded and that is disclosed
|
|
75
|
+
* too: `required_roles` is read from the OBJECT (class **B** -- signed by the
|
|
76
|
+
* attester, evidence of what they were shown), because the bundle names no
|
|
77
|
+
* per-rule role list for it to be recomputed from. A compromised issuer that
|
|
78
|
+
* writes an empty list degrades this check to the engine's behaviour and no
|
|
79
|
+
* further.
|
|
80
|
+
*
|
|
81
|
+
* # Suite 12 classification -- R / B / T for every control input read here
|
|
82
|
+
*
|
|
83
|
+
* | input | class | why |
|
|
84
|
+
* | --- | :---: | --- |
|
|
85
|
+
* | `quorumK` | **R** | from the signed bundle, never an attestation (AT-9) |
|
|
86
|
+
* | attester keys and credentials | **R** | read out of the signed registry after the bundle's own signature checked; `rpId` above all, because HM-4 (c) compares the assertion's origin against THIS and an origin taken from the assertion would compare a value with itself |
|
|
87
|
+
* | `floor` | **R** | the signed manifest's `min_suite` (CR-4) |
|
|
88
|
+
* | `policyBundleHash`, `bundleEpoch` | **R** | the bundle the caller trusts; the object's copies are compared against them (7b(iii)) |
|
|
89
|
+
* | the eleven AT-1 fields | **B** | the attester signature covers the derived id, which covers the whole object |
|
|
90
|
+
* | `obj.proposal_hash` | **B** | and compared against the hash this verifier recomputed from the caller's own proposal bytes (Y1) |
|
|
91
|
+
* | `obj.required_count` | **B** | and compared against `quorumK` (AT-9's consent half) |
|
|
92
|
+
* | `obj.required_roles` | **B** | signed, and resolved against the registry; see the narrowing above for what it does NOT prove |
|
|
93
|
+
* | `entry.attester` | **B** | a name SELECTS a key; the signature establishes identity (ACK-4) |
|
|
94
|
+
* | `entry.attestation_id` | **R** | derived; a transmitted value is compared, never used (Y1b) |
|
|
95
|
+
* | `attestation_digests` | **B** | inside the signed receipt body (AB-5), and each entry's digest is recomputed from the received bytes (AB-1) |
|
|
96
|
+
* | `entry.kind` | **B** | bound by the entry digest under the receipt signature (AB-1). **NARROWED RESIDUAL, not closed**: the attester does not sign `kind`, so the ISSUER still chooses per entry whose signature counts as an approval |
|
|
97
|
+
* | `webauthnCounters` | **T** | the caller's stored counters; this package holds no ledger and says so above |
|
|
98
|
+
*/
|
|
99
|
+
import { type Suite } from './suite.js';
|
|
100
|
+
/**
|
|
101
|
+
* AT-8b: the Attestation Object schema is CLOSED. Exactly this field set, no
|
|
102
|
+
* more and no less.
|
|
103
|
+
*
|
|
104
|
+
* An unknown field is refused rather than ignored and a missing one is never
|
|
105
|
+
* defaulted (Z4). Normalising either would let an issuer add a field a future
|
|
106
|
+
* verifier reads, or drop one this verifier checks, without invalidating a
|
|
107
|
+
* signature that covers only what is present.
|
|
108
|
+
*/
|
|
109
|
+
export declare const AT1_FIELDS: readonly string[];
|
|
110
|
+
/** A machine attester's hybrid pair, decoded from the signed registry. */
|
|
111
|
+
export interface HybridAttester {
|
|
112
|
+
readonly kind: 'hybrid';
|
|
113
|
+
/** Ed25519 verification key, 32 raw bytes. */
|
|
114
|
+
readonly classical: Uint8Array;
|
|
115
|
+
/** ML-DSA-65 verification key, 1,952 raw bytes. */
|
|
116
|
+
readonly pq: Uint8Array;
|
|
117
|
+
/** The registry's `role`, or null where the entry declares none. */
|
|
118
|
+
readonly role: string | null;
|
|
119
|
+
}
|
|
120
|
+
/**
|
|
121
|
+
* HM-1 -- a human attester's enrolled credential, as the SIGNED registry
|
|
122
|
+
* carries it.
|
|
123
|
+
*
|
|
124
|
+
* No private key is reachable from here: `publicKey` is the COSE_Key the
|
|
125
|
+
* authenticator returned at registration and the private half is on the
|
|
126
|
+
* person's phone or security key. That is the strongest custody statement in
|
|
127
|
+
* this package, and the one a software key file could never make.
|
|
128
|
+
*/
|
|
129
|
+
export interface WebauthnAttester {
|
|
130
|
+
readonly kind: 'webauthn';
|
|
131
|
+
/** The approval origin's host. Signed policy (HM-4 (c), (d)). */
|
|
132
|
+
readonly rpId: string;
|
|
133
|
+
/** What the Consumption Ledger keys the signature counter by (HM-4 (f)). */
|
|
134
|
+
readonly credentialId: string;
|
|
135
|
+
/** The COSE_Key bytes, base64-decoded by the caller's bundle loader. */
|
|
136
|
+
readonly publicKey: Uint8Array;
|
|
137
|
+
/** `webauthn-es256` or `webauthn-ed25519` (HM-1). */
|
|
138
|
+
readonly alg: string;
|
|
139
|
+
/** The registry's `role`, or null where the entry declares none. */
|
|
140
|
+
readonly role: string | null;
|
|
141
|
+
}
|
|
142
|
+
/**
|
|
143
|
+
* One registry identity: a machine's hybrid pair or a person's WebAuthn
|
|
144
|
+
* credential.
|
|
145
|
+
*
|
|
146
|
+
* A TAGGED union here because it is a tagged union in the signed document
|
|
147
|
+
* (`attesters.schema.json`, v1.3.30). A kind guessed from which fields are
|
|
148
|
+
* present is how a machine entry that lost its `pq` leg reads as a human.
|
|
149
|
+
*/
|
|
150
|
+
export type AttesterCredential = HybridAttester | WebauthnAttester;
|
|
151
|
+
/**
|
|
152
|
+
* The quorum policy. **Every field comes from the customer's SIGNED bundle**,
|
|
153
|
+
* and nothing here may be sourced from the receipt or from an Attestation
|
|
154
|
+
* Object -- that is AT-9 for `quorumK`, PB-KEY for `attesters`, CR-4 for the
|
|
155
|
+
* floor (taken from the {@link import('./verify.js').TrustAnchor}'s `minSuite`,
|
|
156
|
+
* so the package has one definition of the floor and not two).
|
|
157
|
+
*/
|
|
158
|
+
export interface QuorumPolicy {
|
|
159
|
+
/** PB-6. The number of DISTINCT approvals a floor-HIGH action requires. */
|
|
160
|
+
readonly quorumK: number;
|
|
161
|
+
/**
|
|
162
|
+
* The attester registry: identity -> credential. PB-7 distinctness over the
|
|
163
|
+
* keys is the BUNDLE LOADER's obligation and is assumed to have run; a second
|
|
164
|
+
* copy here would be two definitions of one rule, so this module depends on
|
|
165
|
+
* that check rather than restating it.
|
|
166
|
+
*/
|
|
167
|
+
readonly attesters: ReadonlyMap<string, AttesterCredential>;
|
|
168
|
+
/** AT-10: per-identity enrolled assurance, from the signed registry. */
|
|
169
|
+
readonly assurances: ReadonlyMap<string, string>;
|
|
170
|
+
/** AT-10: the registry's floor (`min_attester_assurance`). */
|
|
171
|
+
readonly minAssurance: string;
|
|
172
|
+
/** Step 4's trusted bundle hash, compared against each object's (7b(iii)). */
|
|
173
|
+
readonly policyBundleHash: string;
|
|
174
|
+
/** Step 4's trusted bundle epoch, compared against each object's (7b(iii)). */
|
|
175
|
+
readonly bundleEpoch: number;
|
|
176
|
+
/**
|
|
177
|
+
* HM-4 (f): the signature counter this verifier has STORED per
|
|
178
|
+
* `credential_id`. **T at this package's boundary** -- see the module header.
|
|
179
|
+
* A credential absent from the map reads as 0, which is what a credential
|
|
180
|
+
* that has never been seen has.
|
|
181
|
+
*/
|
|
182
|
+
readonly webauthnCounters?: ReadonlyMap<string, number>;
|
|
183
|
+
}
|
|
184
|
+
/** What {@link verifyQuorum} concluded. */
|
|
185
|
+
export interface QuorumOutcome {
|
|
186
|
+
/** The operator, from the VERIFIED objects (Y4) -- never the receipt body. */
|
|
187
|
+
readonly operator: string;
|
|
188
|
+
/** The distinct attesters whose approvals were counted, sorted. */
|
|
189
|
+
readonly approvals: readonly string[];
|
|
190
|
+
/**
|
|
191
|
+
* HM-4 (f): the counter each credential's assertion carried, by
|
|
192
|
+
* `credential_id`. **The caller MUST persist these**; a verifier that accepts
|
|
193
|
+
* an assertion and does not advance the stored counter has accepted the same
|
|
194
|
+
* assertion twice.
|
|
195
|
+
*/
|
|
196
|
+
readonly webauthnCounters: ReadonlyMap<string, number>;
|
|
197
|
+
}
|
|
198
|
+
/** The values every attestation is checked against, established by the caller. */
|
|
199
|
+
export interface DecisionBasis {
|
|
200
|
+
/** The hash this verifier recomputed from the caller's own proposal bytes. */
|
|
201
|
+
readonly proposalHash: string;
|
|
202
|
+
/** The receipt's `issued_at`, already parsed at step 5, epoch seconds. */
|
|
203
|
+
readonly receiptIssuedAt: number;
|
|
204
|
+
/** The CR-4 floor from the signed manifest, as a parsed suite. */
|
|
205
|
+
readonly floor: Suite;
|
|
206
|
+
}
|
|
207
|
+
/**
|
|
208
|
+
* AT-8a -- derive an Attestation Object's id from its canonical bytes.
|
|
209
|
+
* **Derived, never read**: the id names a binding, and a transmitted name for a
|
|
210
|
+
* binding is not evidence of one (Y1b).
|
|
211
|
+
*/
|
|
212
|
+
export declare function attestationId(obj: unknown): string;
|
|
213
|
+
/**
|
|
214
|
+
* AB-1 -- the receipt's commitment to ONE attestation entry.
|
|
215
|
+
*
|
|
216
|
+
* ENTRY-SCOPED, NEVER OBJECT-SCOPED, and this is the whole trap.
|
|
217
|
+
* {@link attestationId} already exists and is `h(obj)` -- reusing it here is the
|
|
218
|
+
* obvious move and it is wrong. {@link AT1_FIELDS} is closed over the OBJECT: it
|
|
219
|
+
* contains no `kind`, no `attester` and no `sig`. Quorum composition reads
|
|
220
|
+
* `kind` and `attester` from the ENTRY and the attester signs neither, so an
|
|
221
|
+
* object-scoped digest lets an attacker on the transport path flip `kind` from
|
|
222
|
+
* `confirmation` to `approval` while every digest still matches.
|
|
223
|
+
*
|
|
224
|
+
* The two identifiers MUST NOT be merged: `attestation_id` is what a ledger
|
|
225
|
+
* consumes for single-use under CL-3, because the same object replayed inside a
|
|
226
|
+
* different entry is still a replay. This digest is what the receipt authorised,
|
|
227
|
+
* byte for byte.
|
|
228
|
+
*/
|
|
229
|
+
export declare function entryDigest(entry: unknown): string;
|
|
230
|
+
/**
|
|
231
|
+
* §9.3 step 7b over the attestations travelling beside one receipt.
|
|
232
|
+
*
|
|
233
|
+
* @param policy the customer's own signed-bundle quorum policy.
|
|
234
|
+
* @param basis the values recomputed by `verifyReceipt` before this runs.
|
|
235
|
+
* @param entries `receipt.attestations`, as parsed JSON.
|
|
236
|
+
* @param digests `receipt.attestation_digests`, as parsed JSON.
|
|
237
|
+
* @returns the outcome, or `null` when no attestations travelled and none were
|
|
238
|
+
* committed to -- the vacuous LOW/MEDIUM case of AB-1's own note.
|
|
239
|
+
* `null` means "nothing was verified", never "a quorum held": see the
|
|
240
|
+
* module header on why this package cannot tell that a quorum was
|
|
241
|
+
* REQUIRED.
|
|
242
|
+
* @throws {@link Refusal} with the engine's clause names.
|
|
243
|
+
*/
|
|
244
|
+
export declare function verifyQuorum(policy: QuorumPolicy, basis: DecisionBasis, entries: unknown, digests: unknown): QuorumOutcome | null;
|
|
245
|
+
//# sourceMappingURL=quorum.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"quorum.d.ts","sourceRoot":"","sources":["../src/quorum.ts"],"names":[],"mappings":"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"}
|