@atrib/verify 0.7.10 → 0.8.1
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/LICENSE +1 -1
- package/README.md +72 -5
- package/dist/anchor-plurality.d.ts +142 -0
- package/dist/anchor-plurality.d.ts.map +1 -0
- package/dist/anchor-plurality.js +473 -0
- package/dist/anchor-plurality.js.map +1 -0
- package/dist/authorization-evidence.d.ts +6 -2
- package/dist/authorization-evidence.d.ts.map +1 -1
- package/dist/authorization-evidence.js +21 -0
- package/dist/authorization-evidence.js.map +1 -1
- package/dist/delegation.d.ts +186 -0
- package/dist/delegation.d.ts.map +1 -0
- package/dist/delegation.js +319 -0
- package/dist/delegation.js.map +1 -0
- package/dist/evidence-envelope.d.ts +205 -0
- package/dist/evidence-envelope.d.ts.map +1 -0
- package/dist/evidence-envelope.js +378 -0
- package/dist/evidence-envelope.js.map +1 -0
- package/dist/index.d.ts +10 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +16 -0
- package/dist/index.js.map +1 -1
- package/dist/session-checkpoint.d.ts +200 -0
- package/dist/session-checkpoint.d.ts.map +1 -0
- package/dist/session-checkpoint.js +421 -0
- package/dist/session-checkpoint.js.map +1 -0
- package/dist/verify-record.d.ts +43 -0
- package/dist/verify-record.d.ts.map +1 -1
- package/dist/verify-record.js +25 -1
- package/dist/verify-record.js.map +1 -1
- package/dist/x401-evidence.d.ts +94 -0
- package/dist/x401-evidence.d.ts.map +1 -0
- package/dist/x401-evidence.js +560 -0
- package/dist/x401-evidence.js.map +1 -0
- package/package.json +6 -3
|
@@ -0,0 +1,473 @@
|
|
|
1
|
+
// SPDX-License-Identifier: Apache-2.0
|
|
2
|
+
/**
|
|
3
|
+
* Anchor plurality verification (D138, spec §2.11.7-§2.11.13).
|
|
4
|
+
*
|
|
5
|
+
* Implements the verifier side of the anchor interface over §2.11.3
|
|
6
|
+
* `log_proofs` arrays:
|
|
7
|
+
*
|
|
8
|
+
* - `anchor_type` discrimination per §2.11.9: absent = `atrib-log`
|
|
9
|
+
* carrying the legacy `(log_id, checkpoint, inclusion_proof)` triple,
|
|
10
|
+
* so every existing bundle parses unchanged, byte-for-byte.
|
|
11
|
+
* - Malformation rules (a)/(b) per §2.11.9: a malformed element is
|
|
12
|
+
* excluded from every count except `proof_count` / `malformed_count`
|
|
13
|
+
* and never invalidates the bundle or the record. Malformation takes
|
|
14
|
+
* precedence over unknown-type surfacing: an element that violates
|
|
15
|
+
* rule (b) is malformed even when its `anchor_type` is unregistered.
|
|
16
|
+
* - Unknown-type forward compatibility: surfaced in `unknown_types`,
|
|
17
|
+
* never counted toward plurality, never invalidating — the same rule
|
|
18
|
+
* as unknown event types (§1.2.4).
|
|
19
|
+
* - The `anchor_plurality` annotation per §2.11.11, with
|
|
20
|
+
* `single_anchor: true` as a TIER, never a failure — signal not block,
|
|
21
|
+
* exactly like `cross_attestation_missing` (D052) and
|
|
22
|
+
* `in_envelope: false` (D051).
|
|
23
|
+
* - The §2.11.4 hard conditions, UNCHANGED: `cross_log_threshold_not_met`
|
|
24
|
+
* (consumer threshold M, default 1) and
|
|
25
|
+
* `cross_log_equivocation_detected` (pairwise committed-leaf-byte
|
|
26
|
+
* comparison across trusted logs) are the only hard rejections;
|
|
27
|
+
* censorship-shaped disagreement is flagged
|
|
28
|
+
* (`cross_log_censorship_suspected`) with the silent log identified,
|
|
29
|
+
* never rejected.
|
|
30
|
+
*
|
|
31
|
+
* Every verification here is a pure function of the bundle, the record
|
|
32
|
+
* hash, and the caller's trust configuration (§2.11.7(c)): no network, no
|
|
33
|
+
* wall clock, no randomness. Two runs on identical input produce identical
|
|
34
|
+
* output — the same determinism discipline as §4.6.
|
|
35
|
+
*
|
|
36
|
+
* The `rfc3161-tsa` and `opentimestamps` payload interiors are STRUCTURAL
|
|
37
|
+
* in this revision, matching the conformance corpus
|
|
38
|
+
* (spec/conformance/2.11/anchors/): the commitment-binding fields
|
|
39
|
+
* (`hashed_message_hex` / `commitment_hex`) MUST equal the bundle's record
|
|
40
|
+
* hash and are checked; the DER TimeStampToken and serialized `.ots` bytes
|
|
41
|
+
* are carried opaquely. Implementations with real RFC 3161 / OTS verifiers
|
|
42
|
+
* additionally verify those payloads and treat a cryptographic failure as
|
|
43
|
+
* an invalid proof.
|
|
44
|
+
*/
|
|
45
|
+
import * as ed from '@noble/ed25519';
|
|
46
|
+
import { sha512 } from '@noble/hashes/sha2.js';
|
|
47
|
+
import { base64urlDecode, hexEncode, leafHash, sha256, verifyInclusion, } from '@atrib/mcp';
|
|
48
|
+
// @noble/ed25519 v3 needs sha512 wired via the hashes object. Idempotent;
|
|
49
|
+
// the same wiring @atrib/mcp performs on load, repeated so this module is
|
|
50
|
+
// safe to import in isolation.
|
|
51
|
+
ed.hashes.sha512 = sha512;
|
|
52
|
+
ed.hashes.sha512Async = (m) => Promise.resolve(sha512(m));
|
|
53
|
+
const utf8 = new TextEncoder();
|
|
54
|
+
const utf8Decode = new TextDecoder();
|
|
55
|
+
/** §2.11.10 domain-separation prefix for the anchoring-claim artifact. */
|
|
56
|
+
export const ANCHOR_CLAIM_PREFIX = 'atrib-anchor/v1:';
|
|
57
|
+
/** Registered non-atrib-log anchor types per the §2.11.8 v1 registry. */
|
|
58
|
+
export const REGISTERED_NON_LOG_ANCHOR_TYPES = new Set([
|
|
59
|
+
'sigstore-rekor',
|
|
60
|
+
'rfc3161-tsa',
|
|
61
|
+
'opentimestamps',
|
|
62
|
+
]);
|
|
63
|
+
// ── Internals ────────────────────────────────────────────────────────
|
|
64
|
+
function b64decode(s) {
|
|
65
|
+
return new Uint8Array(Buffer.from(s, 'base64'));
|
|
66
|
+
}
|
|
67
|
+
/**
|
|
68
|
+
* JCS-equivalent serialization for the FLAT objects the corpus signs
|
|
69
|
+
* (ASCII string / integer values only): JSON.stringify with sorted keys.
|
|
70
|
+
*/
|
|
71
|
+
function sortedJson(obj) {
|
|
72
|
+
const sorted = {};
|
|
73
|
+
for (const key of Object.keys(obj).sort()) {
|
|
74
|
+
const value = obj[key];
|
|
75
|
+
if (value !== undefined)
|
|
76
|
+
sorted[key] = value;
|
|
77
|
+
}
|
|
78
|
+
return JSON.stringify(sorted);
|
|
79
|
+
}
|
|
80
|
+
/** §2.4.2 key_id = SHA-256(key_name || 0x0A || 0x01 || public_key_bytes)[:4] */
|
|
81
|
+
function computeKeyId(origin, publicKey) {
|
|
82
|
+
const nameBytes = utf8.encode(origin);
|
|
83
|
+
const preimage = new Uint8Array(nameBytes.length + 2 + publicKey.length);
|
|
84
|
+
preimage.set(nameBytes, 0);
|
|
85
|
+
preimage[nameBytes.length] = 0x0a;
|
|
86
|
+
preimage[nameBytes.length + 1] = 0x01;
|
|
87
|
+
preimage.set(publicKey, nameBytes.length + 2);
|
|
88
|
+
return sha256(preimage).slice(0, 4);
|
|
89
|
+
}
|
|
90
|
+
/** Parse a §2.4.3 signed note (3-line body + blank line + signature line). */
|
|
91
|
+
function parseCheckpoint(checkpoint) {
|
|
92
|
+
const lines = checkpoint.split('\n');
|
|
93
|
+
if (lines.length < 5)
|
|
94
|
+
return null;
|
|
95
|
+
const origin = lines[0];
|
|
96
|
+
const sizeStr = lines[1];
|
|
97
|
+
const rootB64 = lines[2];
|
|
98
|
+
if (origin === undefined || sizeStr === undefined || rootB64 === undefined)
|
|
99
|
+
return null;
|
|
100
|
+
if (lines[3] !== '')
|
|
101
|
+
return null;
|
|
102
|
+
const sigLine = lines[4];
|
|
103
|
+
if (sigLine === undefined)
|
|
104
|
+
return null;
|
|
105
|
+
const m = sigLine.match(/^[—-] (\S+) (\S+)\s*$/);
|
|
106
|
+
if (!m)
|
|
107
|
+
return null;
|
|
108
|
+
const sigOrigin = m[1];
|
|
109
|
+
if (sigOrigin !== origin)
|
|
110
|
+
return null;
|
|
111
|
+
const decoded = b64decode(m[2]);
|
|
112
|
+
if (decoded.length !== 4 + 64)
|
|
113
|
+
return null;
|
|
114
|
+
if (!/^\d+$/.test(sizeStr))
|
|
115
|
+
return null;
|
|
116
|
+
const body = `${origin}\n${sizeStr}\n${rootB64}\n`;
|
|
117
|
+
return {
|
|
118
|
+
origin,
|
|
119
|
+
treeSize: Number(sizeStr),
|
|
120
|
+
root: b64decode(rootB64),
|
|
121
|
+
bodyBytes: utf8.encode(body),
|
|
122
|
+
keyId: decoded.slice(0, 4),
|
|
123
|
+
signature: decoded.slice(4),
|
|
124
|
+
};
|
|
125
|
+
}
|
|
126
|
+
/** Verify a signed checkpoint against a trust-material entry. */
|
|
127
|
+
async function verifyCheckpoint(checkpoint, material) {
|
|
128
|
+
const parsed = parseCheckpoint(checkpoint);
|
|
129
|
+
if (!parsed)
|
|
130
|
+
return null;
|
|
131
|
+
if (parsed.origin !== material.origin)
|
|
132
|
+
return null;
|
|
133
|
+
const pubkey = b64decode(material.pubkey_b64);
|
|
134
|
+
const expectedKeyId = computeKeyId(material.origin, pubkey);
|
|
135
|
+
if (hexEncode(parsed.keyId) !== hexEncode(expectedKeyId))
|
|
136
|
+
return null;
|
|
137
|
+
const ok = await ed.verifyAsync(parsed.signature, parsed.bodyBytes, pubkey);
|
|
138
|
+
return ok ? parsed : null;
|
|
139
|
+
}
|
|
140
|
+
// ── Per-element verification (§2.11.7(c) pure function) ─────────────
|
|
141
|
+
/**
|
|
142
|
+
* Verify one `log_proofs` element against the bundle's `record_hash` and
|
|
143
|
+
* the caller's trust material. Pure: no network, no clock, no randomness.
|
|
144
|
+
* Never throws; unexpected failures surface as `invalid` (§5.8).
|
|
145
|
+
*/
|
|
146
|
+
export async function verifyAnchorProofElement(el, recordHash, trust) {
|
|
147
|
+
try {
|
|
148
|
+
return await verifyElementInner(el, recordHash, trust);
|
|
149
|
+
}
|
|
150
|
+
catch {
|
|
151
|
+
return {
|
|
152
|
+
status: 'invalid',
|
|
153
|
+
anchorType: typeof el?.anchor_type === 'string' ? el.anchor_type : 'atrib-log',
|
|
154
|
+
anchorId: typeof el?.anchor_id === 'string'
|
|
155
|
+
? el.anchor_id
|
|
156
|
+
: typeof el?.log_id === 'string'
|
|
157
|
+
? el.log_id
|
|
158
|
+
: '',
|
|
159
|
+
attestedTimeMs: null,
|
|
160
|
+
entryBytesB64: null,
|
|
161
|
+
};
|
|
162
|
+
}
|
|
163
|
+
}
|
|
164
|
+
async function verifyElementInner(el, recordHash, trust) {
|
|
165
|
+
// Guard non-object elements as malformed rather than crashing on access.
|
|
166
|
+
if (typeof el !== 'object' || el === null) {
|
|
167
|
+
return {
|
|
168
|
+
status: 'malformed',
|
|
169
|
+
anchorType: 'atrib-log',
|
|
170
|
+
anchorId: '',
|
|
171
|
+
attestedTimeMs: null,
|
|
172
|
+
entryBytesB64: null,
|
|
173
|
+
};
|
|
174
|
+
}
|
|
175
|
+
const anchorType = el.anchor_type;
|
|
176
|
+
const recordHashHex = recordHash.startsWith('sha256:')
|
|
177
|
+
? recordHash.slice('sha256:'.length)
|
|
178
|
+
: recordHash;
|
|
179
|
+
// Rule (a): anchor_type absent (or explicit "atrib-log") requires the
|
|
180
|
+
// legacy (log_id, checkpoint, inclusion_proof) triple; when the
|
|
181
|
+
// discriminator is absent a `proof` object is additionally forbidden.
|
|
182
|
+
if (anchorType === undefined || anchorType === 'atrib-log') {
|
|
183
|
+
if (typeof el.log_id !== 'string' ||
|
|
184
|
+
typeof el.checkpoint !== 'string' ||
|
|
185
|
+
!Array.isArray(el.inclusion_proof) ||
|
|
186
|
+
(anchorType === undefined && el.proof !== undefined)) {
|
|
187
|
+
return {
|
|
188
|
+
status: 'malformed',
|
|
189
|
+
anchorType: 'atrib-log',
|
|
190
|
+
anchorId: typeof el.log_id === 'string' ? el.log_id : '',
|
|
191
|
+
attestedTimeMs: null,
|
|
192
|
+
entryBytesB64: null,
|
|
193
|
+
};
|
|
194
|
+
}
|
|
195
|
+
const base = {
|
|
196
|
+
anchorType: 'atrib-log',
|
|
197
|
+
anchorId: el.log_id,
|
|
198
|
+
attestedTimeMs: null,
|
|
199
|
+
entryBytesB64: el.entry_bytes_b64 ?? null,
|
|
200
|
+
};
|
|
201
|
+
const material = trust.trust_material.logs[el.log_id];
|
|
202
|
+
if (!material || typeof el.entry_bytes_b64 !== 'string' || typeof el.log_index !== 'number') {
|
|
203
|
+
return { ...base, status: 'invalid' };
|
|
204
|
+
}
|
|
205
|
+
const parsed = await verifyCheckpoint(el.checkpoint, material);
|
|
206
|
+
if (!parsed)
|
|
207
|
+
return { ...base, status: 'invalid' };
|
|
208
|
+
const entryBytes = b64decode(el.entry_bytes_b64);
|
|
209
|
+
// The 90-byte entry embeds record_hash at bytes [1..33] (§2.3.1).
|
|
210
|
+
if (entryBytes.length !== 90 || hexEncode(entryBytes.slice(1, 33)) !== recordHashHex) {
|
|
211
|
+
return { ...base, status: 'invalid' };
|
|
212
|
+
}
|
|
213
|
+
const proof = el.inclusion_proof.map(b64decode);
|
|
214
|
+
const ok = verifyInclusion(el.log_index, parsed.treeSize, leafHash(entryBytes), proof, parsed.root);
|
|
215
|
+
return { ...base, status: ok ? 'verified' : 'invalid' };
|
|
216
|
+
}
|
|
217
|
+
// Rule (b): anchor_type present and != "atrib-log" requires anchor_id +
|
|
218
|
+
// proof. Malformation takes precedence over unknown-type surfacing: an
|
|
219
|
+
// element violating rule (b) is malformed per §2.11.9(e) even when its
|
|
220
|
+
// anchor_type is unregistered.
|
|
221
|
+
if (typeof el.anchor_id !== 'string' || typeof el.proof !== 'object' || el.proof === null) {
|
|
222
|
+
return {
|
|
223
|
+
status: 'malformed',
|
|
224
|
+
anchorType,
|
|
225
|
+
anchorId: el.anchor_id ?? '',
|
|
226
|
+
attestedTimeMs: null,
|
|
227
|
+
entryBytesB64: null,
|
|
228
|
+
};
|
|
229
|
+
}
|
|
230
|
+
const base = {
|
|
231
|
+
anchorType,
|
|
232
|
+
anchorId: el.anchor_id,
|
|
233
|
+
attestedTimeMs: null,
|
|
234
|
+
entryBytesB64: null,
|
|
235
|
+
};
|
|
236
|
+
if (!REGISTERED_NON_LOG_ANCHOR_TYPES.has(anchorType)) {
|
|
237
|
+
// Forward compatibility (§2.11.8): surfaced, not counted, never invalidating.
|
|
238
|
+
return { ...base, status: 'unknown' };
|
|
239
|
+
}
|
|
240
|
+
const proof = el.proof;
|
|
241
|
+
if (anchorType === 'sigstore-rekor') {
|
|
242
|
+
const material = trust.trust_material.rekor?.[el.anchor_id];
|
|
243
|
+
const entryBodyB64 = proof['entry_body_b64'];
|
|
244
|
+
const logIndex = proof['log_index'];
|
|
245
|
+
const checkpoint = proof['checkpoint'];
|
|
246
|
+
const inclusionProof = proof['inclusion_proof'];
|
|
247
|
+
const integratedTimeMs = proof['integrated_time_ms'];
|
|
248
|
+
const setB64 = proof['signed_entry_timestamp_b64'];
|
|
249
|
+
if (!material ||
|
|
250
|
+
typeof entryBodyB64 !== 'string' ||
|
|
251
|
+
typeof logIndex !== 'number' ||
|
|
252
|
+
typeof checkpoint !== 'string' ||
|
|
253
|
+
!Array.isArray(inclusionProof) ||
|
|
254
|
+
typeof integratedTimeMs !== 'number' ||
|
|
255
|
+
typeof setB64 !== 'string') {
|
|
256
|
+
return { ...base, status: 'invalid' };
|
|
257
|
+
}
|
|
258
|
+
// 1. Reconstruct the anchor-claim artifact from the bundle's record_hash
|
|
259
|
+
// (§2.11.10). An entry whose artifact does not reconstruct is an
|
|
260
|
+
// INVALID proof — not counted, not equivocation — even when its
|
|
261
|
+
// embedded signature is genuinely valid over its own artifact.
|
|
262
|
+
const expectedArtifact = ANCHOR_CLAIM_PREFIX + recordHash;
|
|
263
|
+
const bodyBytes = b64decode(entryBodyB64);
|
|
264
|
+
let body;
|
|
265
|
+
try {
|
|
266
|
+
body = JSON.parse(utf8Decode.decode(bodyBytes));
|
|
267
|
+
}
|
|
268
|
+
catch {
|
|
269
|
+
return { ...base, status: 'invalid' };
|
|
270
|
+
}
|
|
271
|
+
const artifactB64 = body['artifact_b64'];
|
|
272
|
+
const pubB64url = body['public_key_b64url'];
|
|
273
|
+
const sigB64url = body['signature_b64url'];
|
|
274
|
+
if (typeof artifactB64 !== 'string' ||
|
|
275
|
+
typeof pubB64url !== 'string' ||
|
|
276
|
+
typeof sigB64url !== 'string') {
|
|
277
|
+
return { ...base, status: 'invalid' };
|
|
278
|
+
}
|
|
279
|
+
const artifactBytes = b64decode(artifactB64);
|
|
280
|
+
const artifact = utf8Decode.decode(artifactBytes);
|
|
281
|
+
if (artifact !== expectedArtifact || !artifact.startsWith(ANCHOR_CLAIM_PREFIX)) {
|
|
282
|
+
return { ...base, status: 'invalid' };
|
|
283
|
+
}
|
|
284
|
+
// 2. Verify the FRESH anchoring signature over the artifact bytes —
|
|
285
|
+
// never the record's own signature (§2.11.10).
|
|
286
|
+
const sigOk = await ed.verifyAsync(base64urlDecode(sigB64url), artifactBytes, base64urlDecode(pubB64url));
|
|
287
|
+
if (!sigOk)
|
|
288
|
+
return { ...base, status: 'invalid' };
|
|
289
|
+
// 3. Verify the inclusion proof against the checkpoint.
|
|
290
|
+
const parsed = await verifyCheckpoint(checkpoint, material);
|
|
291
|
+
if (!parsed)
|
|
292
|
+
return { ...base, status: 'invalid' };
|
|
293
|
+
const inclusionOk = verifyInclusion(logIndex, parsed.treeSize, leafHash(bodyBytes), inclusionProof.map(b64decode), parsed.root);
|
|
294
|
+
if (!inclusionOk)
|
|
295
|
+
return { ...base, status: 'invalid' };
|
|
296
|
+
// 4. Verify the signed entry timestamp over the reconstructed input.
|
|
297
|
+
const setInput = sortedJson({
|
|
298
|
+
entry_body_b64: entryBodyB64,
|
|
299
|
+
integrated_time_ms: integratedTimeMs,
|
|
300
|
+
log_index: logIndex,
|
|
301
|
+
});
|
|
302
|
+
const setOk = await ed.verifyAsync(b64decode(setB64), utf8.encode(setInput), b64decode(material.pubkey_b64));
|
|
303
|
+
if (!setOk)
|
|
304
|
+
return { ...base, status: 'invalid' };
|
|
305
|
+
return { ...base, status: 'verified', attestedTimeMs: integratedTimeMs };
|
|
306
|
+
}
|
|
307
|
+
if (anchorType === 'rfc3161-tsa') {
|
|
308
|
+
// STRUCTURAL verification in this revision: the commitment-binding
|
|
309
|
+
// field must equal the bundle's record hash; the DER token is opaque.
|
|
310
|
+
// A token whose hashedMessage differs is an invalid proof, not
|
|
311
|
+
// equivocation (§2.11.11).
|
|
312
|
+
const hashedMessageHex = proof['hashed_message_hex'];
|
|
313
|
+
const tokenB64 = proof['timestamp_token_b64'];
|
|
314
|
+
const genTimeMs = proof['gen_time_ms'];
|
|
315
|
+
if (typeof hashedMessageHex !== 'string' ||
|
|
316
|
+
typeof tokenB64 !== 'string' ||
|
|
317
|
+
typeof genTimeMs !== 'number' ||
|
|
318
|
+
hashedMessageHex !== recordHashHex ||
|
|
319
|
+
b64decode(tokenB64).length === 0) {
|
|
320
|
+
return { ...base, status: 'invalid' };
|
|
321
|
+
}
|
|
322
|
+
return { ...base, status: 'verified', attestedTimeMs: genTimeMs };
|
|
323
|
+
}
|
|
324
|
+
// opentimestamps. A `pending` proof is carried and upgraded in place
|
|
325
|
+
// later (§2.11.8); it counts in pending_count, never toward plurality.
|
|
326
|
+
const commitmentHex = proof['commitment_hex'];
|
|
327
|
+
const otsB64 = proof['ots_b64'];
|
|
328
|
+
const status = proof['status'];
|
|
329
|
+
if (typeof commitmentHex !== 'string' ||
|
|
330
|
+
typeof otsB64 !== 'string' ||
|
|
331
|
+
commitmentHex !== recordHashHex ||
|
|
332
|
+
b64decode(otsB64).length === 0) {
|
|
333
|
+
return { ...base, status: 'invalid' };
|
|
334
|
+
}
|
|
335
|
+
if (status === 'pending')
|
|
336
|
+
return { ...base, status: 'pending' };
|
|
337
|
+
const attestedTimeMs = proof['attested_time_ms'];
|
|
338
|
+
if (status !== 'complete' || typeof attestedTimeMs !== 'number') {
|
|
339
|
+
return { ...base, status: 'invalid' };
|
|
340
|
+
}
|
|
341
|
+
return { ...base, status: 'verified', attestedTimeMs };
|
|
342
|
+
}
|
|
343
|
+
/**
|
|
344
|
+
* Operator-group key for independence counting (§2.11.11): the declared
|
|
345
|
+
* group when the trust config names one, else one group per distinct
|
|
346
|
+
* `(anchor_type, anchor_id)` pair (the default grouping).
|
|
347
|
+
*/
|
|
348
|
+
export function anchorOperatorGroup(anchorType, anchorId, trust) {
|
|
349
|
+
for (const g of trust.operator_groups ?? []) {
|
|
350
|
+
for (const m of g.members) {
|
|
351
|
+
if (m.anchor_type === anchorType && m.anchor_id === anchorId)
|
|
352
|
+
return `group:${g.group}`;
|
|
353
|
+
}
|
|
354
|
+
}
|
|
355
|
+
return `pair:${anchorType} ${anchorId}`;
|
|
356
|
+
}
|
|
357
|
+
// ── Bundle-level verdict (§2.11.11 annotation + §2.11.4 hard conditions) ──
|
|
358
|
+
/**
|
|
359
|
+
* Compute the `anchor_plurality` annotation and the unchanged §2.11.4 hard
|
|
360
|
+
* conditions for a proof bundle. Deterministic: identical bundle + trust
|
|
361
|
+
* config + not-found responses in, identical verdict out. Never throws;
|
|
362
|
+
* a structurally hopeless bundle degrades to zero counts (§5.8).
|
|
363
|
+
*
|
|
364
|
+
* `single_anchor: true` is a TIER: the record stays valid, `hard_reject`
|
|
365
|
+
* stays false. Hard rejection is reserved for `cross_log_threshold_not_met`
|
|
366
|
+
* and `cross_log_equivocation_detected`; `cross_log_censorship_suspected`
|
|
367
|
+
* is a flag, not a rejection.
|
|
368
|
+
*/
|
|
369
|
+
export async function verifyAnchorPlurality(bundle, trust, notFoundResponses = []) {
|
|
370
|
+
const elements = typeof bundle === 'object' && bundle !== null && Array.isArray(bundle.log_proofs)
|
|
371
|
+
? bundle.log_proofs
|
|
372
|
+
: [];
|
|
373
|
+
const recordHash = typeof bundle === 'object' && bundle !== null && typeof bundle.record_hash === 'string'
|
|
374
|
+
? bundle.record_hash
|
|
375
|
+
: '';
|
|
376
|
+
const results = [];
|
|
377
|
+
for (const el of elements) {
|
|
378
|
+
results.push(await verifyAnchorProofElement(el, recordHash, trust));
|
|
379
|
+
}
|
|
380
|
+
const malformedIndices = [];
|
|
381
|
+
const invalidIndices = [];
|
|
382
|
+
const unknownTypes = [];
|
|
383
|
+
const groups = new Set();
|
|
384
|
+
const times = [];
|
|
385
|
+
let verified = 0;
|
|
386
|
+
let pending = 0;
|
|
387
|
+
results.forEach((r, i) => {
|
|
388
|
+
if (r.status === 'malformed')
|
|
389
|
+
malformedIndices.push(i);
|
|
390
|
+
if (r.status === 'invalid')
|
|
391
|
+
invalidIndices.push(i);
|
|
392
|
+
if (r.status === 'unknown' && !unknownTypes.includes(r.anchorType)) {
|
|
393
|
+
unknownTypes.push(r.anchorType);
|
|
394
|
+
}
|
|
395
|
+
if (r.status === 'pending')
|
|
396
|
+
pending += 1;
|
|
397
|
+
if (r.status === 'verified') {
|
|
398
|
+
verified += 1;
|
|
399
|
+
groups.add(anchorOperatorGroup(r.anchorType, r.anchorId, trust));
|
|
400
|
+
if (r.attestedTimeMs !== null)
|
|
401
|
+
times.push(r.attestedTimeMs);
|
|
402
|
+
}
|
|
403
|
+
});
|
|
404
|
+
const requiredAnchors = trust.required_anchors ?? 2;
|
|
405
|
+
const thresholdM = trust.threshold_m ?? 1;
|
|
406
|
+
const trustedLogs = trust.trusted_logs ?? [];
|
|
407
|
+
// §2.11.4 threshold: count verified atrib-log proofs in the trusted set.
|
|
408
|
+
// Untrusted-set proofs are surfaced, never counted toward M.
|
|
409
|
+
const trustedVerified = results.filter((r) => r.status === 'verified' && r.anchorType === 'atrib-log' && trustedLogs.includes(r.anchorId));
|
|
410
|
+
const untrustedSurfaced = results
|
|
411
|
+
.filter((r) => r.status === 'verified' && r.anchorType === 'atrib-log' && !trustedLogs.includes(r.anchorId))
|
|
412
|
+
.map((r) => r.anchorId);
|
|
413
|
+
const thresholdNotMet = trustedVerified.length < thresholdM;
|
|
414
|
+
// §2.11.4 step 4, unchanged: pairwise committed-leaf-byte comparison
|
|
415
|
+
// across trusted logs for the same record_hash.
|
|
416
|
+
let equivocation = false;
|
|
417
|
+
let disagreeingPair = null;
|
|
418
|
+
for (let i = 0; i < trustedVerified.length; i++) {
|
|
419
|
+
for (let j = i + 1; j < trustedVerified.length; j++) {
|
|
420
|
+
const a = trustedVerified[i];
|
|
421
|
+
const b = trustedVerified[j];
|
|
422
|
+
if (a.entryBytesB64 !== null && b.entryBytesB64 !== null && a.entryBytesB64 !== b.entryBytesB64) {
|
|
423
|
+
equivocation = true;
|
|
424
|
+
disagreeingPair = {
|
|
425
|
+
log_id_a: a.anchorId,
|
|
426
|
+
leaf_hash_a_hex: hexEncode(leafHash(b64decode(a.entryBytesB64))),
|
|
427
|
+
log_id_b: b.anchorId,
|
|
428
|
+
leaf_hash_b_hex: hexEncode(leafHash(b64decode(b.entryBytesB64))),
|
|
429
|
+
};
|
|
430
|
+
}
|
|
431
|
+
}
|
|
432
|
+
}
|
|
433
|
+
// §2.11.4 censorship-shaped equivocation: a trusted log reports not-found
|
|
434
|
+
// inside the epoch window while another trusted log holds a verified
|
|
435
|
+
// proof. Flag, not rejection; the silent log is identified.
|
|
436
|
+
let censorship = false;
|
|
437
|
+
let silentLog = null;
|
|
438
|
+
for (const nf of notFoundResponses) {
|
|
439
|
+
if (nf.status === 'not_found' && trustedLogs.includes(nf.log_id) && trustedVerified.length > 0) {
|
|
440
|
+
censorship = true;
|
|
441
|
+
silentLog = nf.log_id;
|
|
442
|
+
}
|
|
443
|
+
}
|
|
444
|
+
const independentCount = groups.size;
|
|
445
|
+
const annotation = {
|
|
446
|
+
proof_count: elements.length,
|
|
447
|
+
verified_count: verified,
|
|
448
|
+
pending_count: pending,
|
|
449
|
+
malformed_count: malformedIndices.length,
|
|
450
|
+
unknown_types: unknownTypes,
|
|
451
|
+
independent_count: independentCount,
|
|
452
|
+
plurality_met: independentCount >= requiredAnchors,
|
|
453
|
+
single_anchor: independentCount === 1,
|
|
454
|
+
equivocation_detected: equivocation,
|
|
455
|
+
anchored_at_range_ms: times.length > 0 ? [Math.min(...times), Math.max(...times)] : null,
|
|
456
|
+
};
|
|
457
|
+
return {
|
|
458
|
+
anchor_plurality: annotation,
|
|
459
|
+
malformed_indices: malformedIndices,
|
|
460
|
+
invalid_indices: invalidIndices,
|
|
461
|
+
trusted_verified_count: trustedVerified.length,
|
|
462
|
+
cross_log_threshold_not_met: thresholdNotMet,
|
|
463
|
+
cross_log_equivocation_detected: equivocation,
|
|
464
|
+
cross_log_censorship_suspected: censorship,
|
|
465
|
+
silent_log: silentLog,
|
|
466
|
+
untrusted_surfaced: untrustedSurfaced,
|
|
467
|
+
disagreeing_pair: disagreeingPair,
|
|
468
|
+
// Hard rejection is reserved for the §2.11.4 conditions. single_anchor
|
|
469
|
+
// is a tier, never a failure (§2.11.11).
|
|
470
|
+
hard_reject: thresholdNotMet || equivocation,
|
|
471
|
+
};
|
|
472
|
+
}
|
|
473
|
+
//# sourceMappingURL=anchor-plurality.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"anchor-plurality.js","sourceRoot":"","sources":["../src/anchor-plurality.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import type { JWK, JSONWebKeySet, JWTPayload } from 'jose';
|
|
2
2
|
import type { AAuthAuthorizationEvidenceInput, AAuthAuthorizationEvidenceVerification } from './aauth-evidence.js';
|
|
3
3
|
import type { DpopReplayCache } from './dpop-replay-cache.js';
|
|
4
|
+
import type { X401AuthorizationEvidenceInput, X401AuthorizationEvidenceVerification } from './x401-evidence.js';
|
|
4
5
|
export type EvidenceCheckStatus = 'passed' | 'failed' | 'unresolved' | 'not_checked';
|
|
5
6
|
export type OAuthSignaturePolicy = 'require' | 'best-effort' | 'off';
|
|
6
7
|
export type OAuthEvidenceProtocol = 'oauth2' | 'mcp_oauth';
|
|
@@ -151,9 +152,12 @@ export declare function verifyOAuthAuthorizationEvidence(input: OAuthAuthorizati
|
|
|
151
152
|
export type AuthorizationEvidenceInput = {
|
|
152
153
|
protocol?: 'aauth';
|
|
153
154
|
aauth: AAuthAuthorizationEvidenceInput;
|
|
155
|
+
} | {
|
|
156
|
+
protocol?: 'x401';
|
|
157
|
+
x401: X401AuthorizationEvidenceInput;
|
|
154
158
|
} | {
|
|
155
159
|
protocol?: OAuthEvidenceProtocol;
|
|
156
160
|
oauth: OAuthAuthorizationEvidenceInput;
|
|
157
|
-
} | AAuthAuthorizationEvidenceInput | OAuthAuthorizationEvidenceInput;
|
|
158
|
-
export declare function verifyAuthorizationEvidence(evidence: AuthorizationEvidenceInput): Promise<EvidenceVerificationBlock | AAuthAuthorizationEvidenceVerification>;
|
|
161
|
+
} | AAuthAuthorizationEvidenceInput | X401AuthorizationEvidenceInput | OAuthAuthorizationEvidenceInput;
|
|
162
|
+
export declare function verifyAuthorizationEvidence(evidence: AuthorizationEvidenceInput): Promise<EvidenceVerificationBlock | AAuthAuthorizationEvidenceVerification | X401AuthorizationEvidenceVerification>;
|
|
159
163
|
//# sourceMappingURL=authorization-evidence.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"authorization-evidence.d.ts","sourceRoot":"","sources":["../src/authorization-evidence.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"authorization-evidence.d.ts","sourceRoot":"","sources":["../src/authorization-evidence.ts"],"names":[],"mappings":"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"}
|
|
@@ -2,6 +2,7 @@
|
|
|
2
2
|
import { base64urlEncode, sha256 } from '@atrib/mcp';
|
|
3
3
|
import { calculateJwkThumbprint, createLocalJWKSet, decodeJwt, decodeProtectedHeader, importJWK, jwtVerify, } from 'jose';
|
|
4
4
|
import { verifyAAuthAuthorizationEvidence } from './aauth-evidence.js';
|
|
5
|
+
import { verifyX401AuthorizationEvidence } from './x401-evidence.js';
|
|
5
6
|
function asArray(value) {
|
|
6
7
|
if (typeof value === 'string')
|
|
7
8
|
return [value];
|
|
@@ -426,6 +427,17 @@ function isAAuthAuthorizationEvidenceInput(evidence) {
|
|
|
426
427
|
'httpSignature' in evidence ||
|
|
427
428
|
'r3' in evidence);
|
|
428
429
|
}
|
|
430
|
+
function isX401AuthorizationEvidenceInput(evidence) {
|
|
431
|
+
if (evidence.protocol === 'x401')
|
|
432
|
+
return true;
|
|
433
|
+
return ('headers' in evidence ||
|
|
434
|
+
'headerSet' in evidence ||
|
|
435
|
+
'proofRequest' in evidence ||
|
|
436
|
+
'proofResponse' in evidence ||
|
|
437
|
+
'proofResult' in evidence ||
|
|
438
|
+
'resultVerified' in evidence ||
|
|
439
|
+
'tokenVerified' in evidence);
|
|
440
|
+
}
|
|
429
441
|
export async function verifyAuthorizationEvidence(evidence) {
|
|
430
442
|
if ('aauth' in evidence) {
|
|
431
443
|
return verifyAAuthAuthorizationEvidence({
|
|
@@ -433,6 +445,15 @@ export async function verifyAuthorizationEvidence(evidence) {
|
|
|
433
445
|
protocol: 'aauth',
|
|
434
446
|
});
|
|
435
447
|
}
|
|
448
|
+
if ('x401' in evidence) {
|
|
449
|
+
return verifyX401AuthorizationEvidence({
|
|
450
|
+
...evidence.x401,
|
|
451
|
+
protocol: 'x401',
|
|
452
|
+
});
|
|
453
|
+
}
|
|
454
|
+
if (isX401AuthorizationEvidenceInput(evidence)) {
|
|
455
|
+
return verifyX401AuthorizationEvidence(evidence);
|
|
456
|
+
}
|
|
436
457
|
if (isAAuthAuthorizationEvidenceInput(evidence)) {
|
|
437
458
|
return verifyAAuthAuthorizationEvidence(evidence);
|
|
438
459
|
}
|