attenu-guard 0.1.0 → 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/CHANGELOG.md +34 -0
- package/README.md +12 -4
- package/dist/cjs/audit.d.ts +1 -0
- package/dist/cjs/audit.d.ts.map +1 -1
- package/dist/cjs/audit.js +9 -5
- package/dist/cjs/audit.js.map +1 -1
- package/dist/cjs/canonical.d.ts +21 -69
- package/dist/cjs/canonical.d.ts.map +1 -1
- package/dist/cjs/canonical.js +198 -171
- package/dist/cjs/canonical.js.map +1 -1
- package/dist/cjs/evidence.d.ts +1 -0
- package/dist/cjs/evidence.d.ts.map +1 -1
- package/dist/cjs/evidence.js +8 -3
- package/dist/cjs/evidence.js.map +1 -1
- package/dist/cjs/index.d.ts +4 -4
- package/dist/cjs/index.d.ts.map +1 -1
- package/dist/cjs/index.js +14 -5
- package/dist/cjs/index.js.map +1 -1
- package/dist/cjs/wire.d.ts +136 -1
- package/dist/cjs/wire.d.ts.map +1 -1
- package/dist/cjs/wire.js +405 -2
- package/dist/cjs/wire.js.map +1 -1
- package/dist/esm/audit.d.ts +1 -0
- package/dist/esm/audit.d.ts.map +1 -1
- package/dist/esm/audit.js +10 -6
- package/dist/esm/audit.js.map +1 -1
- package/dist/esm/canonical.d.ts +21 -69
- package/dist/esm/canonical.d.ts.map +1 -1
- package/dist/esm/canonical.js +192 -168
- package/dist/esm/canonical.js.map +1 -1
- package/dist/esm/evidence.d.ts +1 -0
- package/dist/esm/evidence.d.ts.map +1 -1
- package/dist/esm/evidence.js +8 -3
- package/dist/esm/evidence.js.map +1 -1
- package/dist/esm/index.d.ts +4 -4
- package/dist/esm/index.d.ts.map +1 -1
- package/dist/esm/index.js +3 -3
- package/dist/esm/index.js.map +1 -1
- package/dist/esm/wire.d.ts +136 -1
- package/dist/esm/wire.d.ts.map +1 -1
- package/dist/esm/wire.js +400 -2
- package/dist/esm/wire.js.map +1 -1
- package/package.json +1 -1
package/dist/cjs/wire.js
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
/**
|
|
3
|
-
* wire.ts — the signing
|
|
3
|
+
* wire.ts — the Delegation Token: signing backends + offline chain verification.
|
|
4
4
|
*
|
|
5
5
|
* Anchors and delegation tokens are signed over canonical JSON bytes. Two
|
|
6
6
|
* backends ship, matching the Python library's `attenu_guard.wire`:
|
|
@@ -9,13 +9,34 @@
|
|
|
9
9
|
* `Ed25519Signer` the production signer the Internet-Draft requires, with
|
|
10
10
|
* `Ed25519Verifier` for anyone holding only the public half.
|
|
11
11
|
*
|
|
12
|
+
* The second half of the module is `load()`: the Offline Verification Algorithm
|
|
13
|
+
* of draft-asor-wimse-agent-delegation-chain-00, ported from `wire.py`'s
|
|
14
|
+
* `load()`. A Delegation Token is a compact, JWT-shaped, JWS-signed object
|
|
15
|
+
* carrying one hop's `Authority` plus enough chain-linkage state (`del_depth`,
|
|
16
|
+
* `del_max_depth`, `par_hash`) that an Enforcement Point can verify an entire
|
|
17
|
+
* Delegation Chain with no call to an authorization server. The 17 interop
|
|
18
|
+
* vectors under `test/fixtures/vectors/` are the check on that port: they are
|
|
19
|
+
* generated by the Python reference implementation and each declares the exact
|
|
20
|
+
* reason it must be accepted or rejected for.
|
|
21
|
+
*
|
|
22
|
+
* This module MINTS nothing. Serialization (`serialize`/`serialize_chain` in
|
|
23
|
+
* Python) is the issuing side and lives with whoever holds the signing key;
|
|
24
|
+
* what a TypeScript enforcement point needs is the verifying side.
|
|
25
|
+
*
|
|
12
26
|
* Everything here is built on Node's own `node:crypto`, so the package keeps
|
|
13
27
|
* zero runtime dependencies. Ed25519 keys are wrapped in the fixed DER prefixes
|
|
14
28
|
* below rather than pulled from a library.
|
|
15
29
|
*/
|
|
16
30
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
17
|
-
exports.Ed25519Verifier = exports.Ed25519Signer = exports.HS256TestSigner = void 0;
|
|
31
|
+
exports.VerifiedChain = exports.WireError = exports.WireReasonCode = exports.Ed25519Verifier = exports.Ed25519Signer = exports.HS256TestSigner = void 0;
|
|
32
|
+
exports.b64urlEncode = b64urlEncode;
|
|
33
|
+
exports.b64urlDecode = b64urlDecode;
|
|
34
|
+
exports.load = load;
|
|
18
35
|
const node_crypto_1 = require("node:crypto");
|
|
36
|
+
const node_util_1 = require("node:util");
|
|
37
|
+
const authority_js_1 = require("./authority.js");
|
|
38
|
+
const canonical_js_1 = require("./canonical.js");
|
|
39
|
+
const reasons_js_1 = require("./reasons.js");
|
|
19
40
|
/**
|
|
20
41
|
* stdlib HMAC-SHA256 signer — the default for tests, examples and local dev,
|
|
21
42
|
* because it needs no key management at all.
|
|
@@ -162,4 +183,386 @@ class Ed25519Verifier {
|
|
|
162
183
|
}
|
|
163
184
|
}
|
|
164
185
|
exports.Ed25519Verifier = Ed25519Verifier;
|
|
186
|
+
// ===========================================================================
|
|
187
|
+
// base64url (RFC 7515 §2: standard base64, `+`/`/` -> `-`/`_`, no `=` padding)
|
|
188
|
+
// ===========================================================================
|
|
189
|
+
/** Encode `data` as unpadded base64url — the encoding every token part uses. */
|
|
190
|
+
function b64urlEncode(data) {
|
|
191
|
+
return data.toString("base64url");
|
|
192
|
+
}
|
|
193
|
+
const B64URL = /^[A-Za-z0-9_-]*$/;
|
|
194
|
+
/**
|
|
195
|
+
* Decode unpadded base64url. Node re-pads internally, so a token part never has
|
|
196
|
+
* to carry `=`.
|
|
197
|
+
*
|
|
198
|
+
* The alphabet and length are checked first, and a bad string throws. Node's own
|
|
199
|
+
* decoder is lenient — it silently drops characters outside the alphabet — which
|
|
200
|
+
* would turn a garbage `par_hash` into a *hash* mismatch instead of the
|
|
201
|
+
* malformed input it actually is. Python's `b64url_decode` raises there and
|
|
202
|
+
* `load()` reports `malformed`; this check is what keeps the two reporting the
|
|
203
|
+
* same reason for the same bytes. A length of 1 mod 4 encodes no whole byte and
|
|
204
|
+
* is rejected for the same reason.
|
|
205
|
+
*/
|
|
206
|
+
function b64urlDecode(s) {
|
|
207
|
+
if (!B64URL.test(s) || s.length % 4 === 1) {
|
|
208
|
+
throw new Error(`not valid base64url: ${JSON.stringify(s)}`);
|
|
209
|
+
}
|
|
210
|
+
return Buffer.from(s, "base64url");
|
|
211
|
+
}
|
|
212
|
+
// ===========================================================================
|
|
213
|
+
// Errors / reason codes
|
|
214
|
+
// ===========================================================================
|
|
215
|
+
/**
|
|
216
|
+
* Wire-verification-specific reason codes, string constants (same pattern as
|
|
217
|
+
* `ReasonCode` — see reasons.ts). `EXPIRED` is not reinvented: it aliases
|
|
218
|
+
* `ReasonCode.EXPIRED` verbatim (identical string, identical meaning: a
|
|
219
|
+
* time-bound invariant failed), covering both "now is past exp" and "exp is not
|
|
220
|
+
* monotonic along the chain" — the draft treats both as the same class of check
|
|
221
|
+
* (verification step 5).
|
|
222
|
+
*/
|
|
223
|
+
exports.WireReasonCode = {
|
|
224
|
+
SIGNATURE_INVALID: "signature_invalid",
|
|
225
|
+
PAR_HASH_MISMATCH: "par_hash_mismatch",
|
|
226
|
+
DEPTH_INVALID: "depth_invalid",
|
|
227
|
+
NOT_NARROWER: "not_narrower",
|
|
228
|
+
MALFORMED: "malformed",
|
|
229
|
+
NON_FINITE: "non_finite",
|
|
230
|
+
DUPLICATE_MEMBER: "duplicate_member",
|
|
231
|
+
CANONICALIZATION_REQUIRED: "canonicalization_required",
|
|
232
|
+
NON_CANONICAL: "non_canonical",
|
|
233
|
+
EXPIRED: reasons_js_1.ReasonCode.EXPIRED, // "expired" — reuse, don't reinvent
|
|
234
|
+
};
|
|
235
|
+
/**
|
|
236
|
+
* Thrown by `load()` on the FIRST verification failure (the draft: "denying on
|
|
237
|
+
* the first failure") — offline chain verification is fail-fast and fail-closed,
|
|
238
|
+
* not an aggregation of every problem found.
|
|
239
|
+
*
|
|
240
|
+
* The constructor takes `(reason, message)`, mirroring Python's `WireError` so
|
|
241
|
+
* the two `load()`s read the same line for line. That is the opposite order to
|
|
242
|
+
* `AuthorityError(message, reason)`; here the reason code is the contract and
|
|
243
|
+
* the message is the human gloss.
|
|
244
|
+
*/
|
|
245
|
+
class WireError extends Error {
|
|
246
|
+
reason;
|
|
247
|
+
constructor(reason, message = "") {
|
|
248
|
+
super(message);
|
|
249
|
+
this.name = "WireError";
|
|
250
|
+
this.reason = reason;
|
|
251
|
+
}
|
|
252
|
+
}
|
|
253
|
+
exports.WireError = WireError;
|
|
254
|
+
function isJsonObject(value) {
|
|
255
|
+
return value !== null && typeof value === "object" && !Array.isArray(value);
|
|
256
|
+
}
|
|
257
|
+
function parseToken(token) {
|
|
258
|
+
const parts = token.split(".");
|
|
259
|
+
if (parts.length !== 3) {
|
|
260
|
+
throw new WireError(exports.WireReasonCode.MALFORMED, `expected 3 dot-separated parts, got ${parts.length}`);
|
|
261
|
+
}
|
|
262
|
+
const [headerB64, payloadB64, sigB64] = parts;
|
|
263
|
+
let headerBytes;
|
|
264
|
+
let payloadBytes;
|
|
265
|
+
let sig;
|
|
266
|
+
try {
|
|
267
|
+
headerBytes = b64urlDecode(headerB64);
|
|
268
|
+
payloadBytes = b64urlDecode(payloadB64);
|
|
269
|
+
sig = b64urlDecode(sigB64);
|
|
270
|
+
}
|
|
271
|
+
catch (e) {
|
|
272
|
+
throw new WireError(exports.WireReasonCode.MALFORMED, `could not decode token: ${String(e)}`);
|
|
273
|
+
}
|
|
274
|
+
let headerRaw;
|
|
275
|
+
let payloadRaw;
|
|
276
|
+
try {
|
|
277
|
+
const decoder = new node_util_1.TextDecoder("utf-8", { fatal: true });
|
|
278
|
+
headerRaw = (0, canonical_js_1.parseJson)(decoder.decode(headerBytes));
|
|
279
|
+
payloadRaw = (0, canonical_js_1.parseJson)(decoder.decode(payloadBytes));
|
|
280
|
+
}
|
|
281
|
+
catch (e) {
|
|
282
|
+
if (e instanceof canonical_js_1.DuplicateMemberError) {
|
|
283
|
+
throw new WireError(exports.WireReasonCode.DUPLICATE_MEMBER, e.message);
|
|
284
|
+
}
|
|
285
|
+
if (e instanceof canonical_js_1.NonFiniteNumberError) {
|
|
286
|
+
throw new WireError(exports.WireReasonCode.NON_FINITE, e.message);
|
|
287
|
+
}
|
|
288
|
+
if (e instanceof canonical_js_1.CanonicalizationError) {
|
|
289
|
+
throw new WireError(exports.WireReasonCode.NON_CANONICAL, e.message);
|
|
290
|
+
}
|
|
291
|
+
throw new WireError(exports.WireReasonCode.MALFORMED, `could not parse token JSON: ${String(e)}`);
|
|
292
|
+
}
|
|
293
|
+
const header = (0, canonical_js_1.toPlain)(headerRaw);
|
|
294
|
+
const payload = (0, canonical_js_1.toPlain)(payloadRaw);
|
|
295
|
+
if (!isJsonObject(header) || !isJsonObject(payload)) {
|
|
296
|
+
throw new WireError(exports.WireReasonCode.MALFORMED, "header/payload must be JSON objects");
|
|
297
|
+
}
|
|
298
|
+
if (header["c14n"] !== "JCS") {
|
|
299
|
+
throw new WireError(exports.WireReasonCode.CANONICALIZATION_REQUIRED, "token header must declare c14n='JCS'");
|
|
300
|
+
}
|
|
301
|
+
let canonicalHeader;
|
|
302
|
+
let canonicalPayload;
|
|
303
|
+
try {
|
|
304
|
+
canonicalHeader = (0, canonical_js_1.canonicalJson)(headerRaw);
|
|
305
|
+
canonicalPayload = (0, canonical_js_1.canonicalJson)(payloadRaw);
|
|
306
|
+
}
|
|
307
|
+
catch (e) {
|
|
308
|
+
if (e instanceof canonical_js_1.NonFiniteNumberError) {
|
|
309
|
+
throw new WireError(exports.WireReasonCode.NON_FINITE, e.message);
|
|
310
|
+
}
|
|
311
|
+
if (e instanceof canonical_js_1.CanonicalizationError) {
|
|
312
|
+
throw new WireError(exports.WireReasonCode.NON_CANONICAL, e.message);
|
|
313
|
+
}
|
|
314
|
+
throw e;
|
|
315
|
+
}
|
|
316
|
+
if (!headerBytes.equals(Buffer.from(canonicalHeader, "utf8")) ||
|
|
317
|
+
!payloadBytes.equals(Buffer.from(canonicalPayload, "utf8"))) {
|
|
318
|
+
throw new WireError(exports.WireReasonCode.NON_CANONICAL, "token header and payload must be RFC 8785 JCS bytes");
|
|
319
|
+
}
|
|
320
|
+
return {
|
|
321
|
+
header,
|
|
322
|
+
payload,
|
|
323
|
+
payloadRaw: payloadRaw,
|
|
324
|
+
sig,
|
|
325
|
+
// ASCII, not utf8: the signing input is by definition the two base64url
|
|
326
|
+
// parts and a dot, so any byte outside ASCII could not have decoded.
|
|
327
|
+
signingInput: Buffer.from(`${headerB64}.${payloadB64}`, "ascii"),
|
|
328
|
+
};
|
|
329
|
+
}
|
|
330
|
+
/**
|
|
331
|
+
* Rebuild the FULL `Authority` a token carries, including `ttl` (recovered as
|
|
332
|
+
* `exp - iat`), so `load()` can hand the very same `Authority.isNarrowerThan`
|
|
333
|
+
* the library uses for in-process attenuation. The draft's subsumption relation
|
|
334
|
+
* and the library relation must be the same relation, so this reconstitutes an
|
|
335
|
+
* `Authority` rather than comparing claim shapes by hand.
|
|
336
|
+
*
|
|
337
|
+
* `ttl` is deliberately absent from `authorization_details` on the wire: token
|
|
338
|
+
* lifetime is carried once, at the top level, in the standard `iat`/`exp`
|
|
339
|
+
* claims, where it cannot drift out of sync with itself.
|
|
340
|
+
*/
|
|
341
|
+
function authorityFromPayload(payload) {
|
|
342
|
+
const details = payload["authorization_details"];
|
|
343
|
+
if (!Array.isArray(details) || details.length === 0) {
|
|
344
|
+
throw new WireError(exports.WireReasonCode.MALFORMED, "authorization_details missing or empty");
|
|
345
|
+
}
|
|
346
|
+
const d0 = details[0];
|
|
347
|
+
if (!isJsonObject(d0) || d0["type"] !== "agent_delegation") {
|
|
348
|
+
throw new WireError(exports.WireReasonCode.MALFORMED, "authorization_details[0].type must be 'agent_delegation'");
|
|
349
|
+
}
|
|
350
|
+
const iat = payload["iat"];
|
|
351
|
+
const exp = payload["exp"];
|
|
352
|
+
if (typeof iat !== "number" || typeof exp !== "number") {
|
|
353
|
+
throw new WireError(exports.WireReasonCode.MALFORMED, "iat/exp missing or not numeric");
|
|
354
|
+
}
|
|
355
|
+
const wire = {
|
|
356
|
+
scopes: d0["scopes"] ?? [],
|
|
357
|
+
constraints: d0["constraints"] ?? [],
|
|
358
|
+
ttl: exp - iat,
|
|
359
|
+
};
|
|
360
|
+
try {
|
|
361
|
+
return authority_js_1.Authority.fromWire(wire);
|
|
362
|
+
}
|
|
363
|
+
catch (e) {
|
|
364
|
+
// A malformed constraint shape, and anything else the ceiling registry
|
|
365
|
+
// refuses to build: the token is unusable, so fail closed.
|
|
366
|
+
throw new WireError(exports.WireReasonCode.MALFORMED, `invalid authorization_details: ${String(e)}`);
|
|
367
|
+
}
|
|
368
|
+
}
|
|
369
|
+
// ===========================================================================
|
|
370
|
+
// load() — the Offline Verification Algorithm
|
|
371
|
+
// ===========================================================================
|
|
372
|
+
/**
|
|
373
|
+
* A chain that passed every check in `load()`. It carries only what an
|
|
374
|
+
* Enforcement Point needs afterwards: the LEAF authority — the only authority
|
|
375
|
+
* ever checked against an attempted action — plus enough raw material to log
|
|
376
|
+
* and debug with.
|
|
377
|
+
*/
|
|
378
|
+
class VerifiedChain {
|
|
379
|
+
tokens;
|
|
380
|
+
payloads;
|
|
381
|
+
leafAuthority;
|
|
382
|
+
depth;
|
|
383
|
+
delMaxDepth;
|
|
384
|
+
constructor(tokens, payloads, leafAuthority, depth, delMaxDepth) {
|
|
385
|
+
this.tokens = tokens;
|
|
386
|
+
this.payloads = payloads;
|
|
387
|
+
this.leafAuthority = leafAuthority;
|
|
388
|
+
this.depth = depth;
|
|
389
|
+
this.delMaxDepth = delMaxDepth;
|
|
390
|
+
}
|
|
391
|
+
/**
|
|
392
|
+
* Authorize `scope` (with request context `ctx`) against the LEAF authority.
|
|
393
|
+
* Delegates entirely to `Authority.permits`; no policy logic is reimplemented
|
|
394
|
+
* here, so a decision taken from a verified chain and a decision taken
|
|
395
|
+
* in-process are the same decision.
|
|
396
|
+
*/
|
|
397
|
+
permits(scope, ctx = null) {
|
|
398
|
+
return this.leafAuthority.permits(scope, ctx);
|
|
399
|
+
}
|
|
400
|
+
}
|
|
401
|
+
exports.VerifiedChain = VerifiedChain;
|
|
402
|
+
/**
|
|
403
|
+
* Run the Offline Verification Algorithm over `tokens` (`[DT_0, ..., DT_n]`,
|
|
404
|
+
* root-first) and, on success, return a `VerifiedChain`. Denies on the FIRST
|
|
405
|
+
* failure by throwing a `WireError` whose `.reason` is one of the
|
|
406
|
+
* `WireReasonCode` constants.
|
|
407
|
+
*
|
|
408
|
+
* `signer` verifies every token in the chain — this implementation's
|
|
409
|
+
* simplifying trust model, matching Python's, is ONE signer/key material per
|
|
410
|
+
* whole chain. A production multi-issuer deployment would generalize `signer`
|
|
411
|
+
* into a `kid`-keyed resolver, which is a straightforward extension left out
|
|
412
|
+
* here.
|
|
413
|
+
*
|
|
414
|
+
* Steps performed, in the draft's own order:
|
|
415
|
+
* 1. JWS signature of every DT_i (+ the alg-confusion guard: the header's
|
|
416
|
+
* declared `alg` must equal `signer.alg` — never trust a token's own claim
|
|
417
|
+
* about which algorithm verifies it), plus the optional `rootKeyIds`
|
|
418
|
+
* restriction on DT_0.
|
|
419
|
+
* 2. The `par_hash` byte-commitment for every i > 0, compared in constant
|
|
420
|
+
* time; DT_0 MUST NOT carry one.
|
|
421
|
+
* 3. `del_depth`/`del_max_depth` bounds.
|
|
422
|
+
* 4. Subsumption: DT_i's authority `isNarrowerThan` DT_{i-1}'s for every
|
|
423
|
+
* i > 0 — REUSES the core's own relation (authority.ts); not
|
|
424
|
+
* reimplemented here.
|
|
425
|
+
* 5. Time: `now <= exp` (and `now >= nbf` where present) for every DT_i, and
|
|
426
|
+
* `exp` non-increasing along the chain.
|
|
427
|
+
*
|
|
428
|
+
* OUT OF SCOPE, as in the Python reference implementation — documented here
|
|
429
|
+
* rather than silently skipped: step 6 (`cnf`/DPoP holder-binding proof) and
|
|
430
|
+
* step 7 (Token Status List revocation). Neither is checked.
|
|
431
|
+
*/
|
|
432
|
+
function load(tokens, signer, options = {}) {
|
|
433
|
+
const { rootKeyIds = null, now = 0 } = options;
|
|
434
|
+
if (tokens.length === 0) {
|
|
435
|
+
throw new WireError(exports.WireReasonCode.MALFORMED, "empty token chain");
|
|
436
|
+
}
|
|
437
|
+
const parsed = tokens.map((t) => parseToken(t));
|
|
438
|
+
// ---- step 1: signatures -------------------------------------------------
|
|
439
|
+
const trustedRoots = rootKeyIds === null ? null : new Set(rootKeyIds);
|
|
440
|
+
for (let i = 0; i < parsed.length; i++) {
|
|
441
|
+
const { header, sig, signingInput } = parsed[i];
|
|
442
|
+
const alg = header["alg"];
|
|
443
|
+
if (alg !== signer.alg) {
|
|
444
|
+
throw new WireError(exports.WireReasonCode.SIGNATURE_INVALID, `token[${i}] header alg ${JSON.stringify(alg)} != signer alg ${JSON.stringify(signer.alg)}`);
|
|
445
|
+
}
|
|
446
|
+
const kid = typeof header["kid"] === "string" ? header["kid"] : null;
|
|
447
|
+
if (i === 0 && trustedRoots !== null && !trustedRoots.has(kid)) {
|
|
448
|
+
throw new WireError(exports.WireReasonCode.SIGNATURE_INVALID, `root token kid ${JSON.stringify(kid)} not in trusted rootKeyIds`);
|
|
449
|
+
}
|
|
450
|
+
if (!signer.verify(signingInput, sig, kid)) {
|
|
451
|
+
throw new WireError(exports.WireReasonCode.SIGNATURE_INVALID, `token[${i}] signature does not verify`);
|
|
452
|
+
}
|
|
453
|
+
}
|
|
454
|
+
// ---- step 2: par_hash byte-commitment (constant-time, over hex) ---------
|
|
455
|
+
// The commitment is over the PARENT's signing input — its exact serialized
|
|
456
|
+
// bytes — which is what makes a spliced chain detectable even when the
|
|
457
|
+
// substituted parent is broad enough that subsumption alone would pass it.
|
|
458
|
+
if ("par_hash" in parsed[0].payload) {
|
|
459
|
+
throw new WireError(exports.WireReasonCode.MALFORMED, "DT_0 (del_depth 0) MUST NOT carry par_hash");
|
|
460
|
+
}
|
|
461
|
+
for (let i = 1; i < parsed.length; i++) {
|
|
462
|
+
const expectedHex = (0, node_crypto_1.createHash)("sha256").update(parsed[i - 1].signingInput).digest("hex");
|
|
463
|
+
const gotB64 = parsed[i].payload["par_hash"];
|
|
464
|
+
if (typeof gotB64 !== "string") {
|
|
465
|
+
throw new WireError(exports.WireReasonCode.PAR_HASH_MISMATCH, `token[${i}] missing par_hash`);
|
|
466
|
+
}
|
|
467
|
+
let gotHex;
|
|
468
|
+
try {
|
|
469
|
+
gotHex = b64urlDecode(gotB64).toString("hex");
|
|
470
|
+
}
|
|
471
|
+
catch (e) {
|
|
472
|
+
throw new WireError(exports.WireReasonCode.MALFORMED, `token[${i}] par_hash is not valid base64url: ${String(e)}`);
|
|
473
|
+
}
|
|
474
|
+
if (!constantTimeEqualAscii(expectedHex, gotHex)) {
|
|
475
|
+
throw new WireError(exports.WireReasonCode.PAR_HASH_MISMATCH, `token[${i}] par_hash does not match parent token[${i - 1}]'s signing input ` +
|
|
476
|
+
"(splice, wrong parent, or tampered parent)");
|
|
477
|
+
}
|
|
478
|
+
}
|
|
479
|
+
// ---- step 3: del_depth / del_max_depth ----------------------------------
|
|
480
|
+
const rootPayload = parsed[0].payload;
|
|
481
|
+
if (rootPayload["del_depth"] !== 0) {
|
|
482
|
+
throw new WireError(exports.WireReasonCode.DEPTH_INVALID, "DT_0.del_depth must be 0");
|
|
483
|
+
}
|
|
484
|
+
const delMaxDepth = rootPayload["del_max_depth"];
|
|
485
|
+
if (typeof delMaxDepth !== "number" ||
|
|
486
|
+
!isIntegerLiteral(parsed[0].payloadRaw["del_max_depth"]) ||
|
|
487
|
+
delMaxDepth <= 0) {
|
|
488
|
+
throw new WireError(exports.WireReasonCode.DEPTH_INVALID, "DT_0.del_max_depth must be a positive integer");
|
|
489
|
+
}
|
|
490
|
+
// `del_max_depth` is the maximum chain LENGTH (a token count) while
|
|
491
|
+
// `del_depth` is a 0-based index, so the leaf's index must be strictly below
|
|
492
|
+
// it — a 3-token chain has a leaf at del_depth 2 and needs del_max_depth >= 3.
|
|
493
|
+
const n = parsed.length - 1;
|
|
494
|
+
if (!(n < delMaxDepth)) {
|
|
495
|
+
throw new WireError(exports.WireReasonCode.DEPTH_INVALID, `chain length ${n + 1} exceeds del_max_depth ${delMaxDepth} ` +
|
|
496
|
+
`(need leaf del_depth ${n} < del_max_depth)`);
|
|
497
|
+
}
|
|
498
|
+
for (let i = 0; i < parsed.length; i++) {
|
|
499
|
+
if (parsed[i].payload["del_depth"] !== i) {
|
|
500
|
+
throw new WireError(exports.WireReasonCode.DEPTH_INVALID, `token[${i}].del_depth = ${JSON.stringify(parsed[i].payload["del_depth"])}, expected ${i}`);
|
|
501
|
+
}
|
|
502
|
+
}
|
|
503
|
+
// ---- step 4: subsumption (reuse Authority.isNarrowerThan) ---------------
|
|
504
|
+
const authorities = parsed.map((p) => authorityFromPayload(p.payload));
|
|
505
|
+
for (let i = 1; i < authorities.length; i++) {
|
|
506
|
+
if (!authorities[i].isNarrowerThan(authorities[i - 1])) {
|
|
507
|
+
throw new WireError(exports.WireReasonCode.NOT_NARROWER, `token[${i}] authority is not narrower than token[${i - 1}]'s ` +
|
|
508
|
+
"(widened scope, loosened/dropped ceiling, or looser ttl)");
|
|
509
|
+
}
|
|
510
|
+
}
|
|
511
|
+
// ---- step 5: time -------------------------------------------------------
|
|
512
|
+
let prevExp = null;
|
|
513
|
+
for (let i = 0; i < parsed.length; i++) {
|
|
514
|
+
const payload = parsed[i].payload;
|
|
515
|
+
const exp = payload["exp"];
|
|
516
|
+
if (typeof exp !== "number") {
|
|
517
|
+
throw new WireError(exports.WireReasonCode.MALFORMED, `token[${i}] missing numeric exp`);
|
|
518
|
+
}
|
|
519
|
+
// `nbf` is optional; absent or null means "no lower bound". Anything else
|
|
520
|
+
// that is not a number is refused rather than ignored — Python compares it
|
|
521
|
+
// to `now` directly and raises a TypeError that escapes `load()`, so a
|
|
522
|
+
// caller catching only `WireError` would see the chain neither accepted nor
|
|
523
|
+
// cleanly rejected. Failing closed here is the safe reading of both.
|
|
524
|
+
const nbf = payload["nbf"];
|
|
525
|
+
if (nbf !== undefined && nbf !== null) {
|
|
526
|
+
if (typeof nbf !== "number") {
|
|
527
|
+
throw new WireError(exports.WireReasonCode.MALFORMED, `token[${i}] nbf is not numeric`);
|
|
528
|
+
}
|
|
529
|
+
if (now < nbf) {
|
|
530
|
+
throw new WireError(exports.WireReasonCode.EXPIRED, `token[${i}] not yet valid: now=${now} < nbf=${nbf}`);
|
|
531
|
+
}
|
|
532
|
+
}
|
|
533
|
+
if (now > exp) {
|
|
534
|
+
throw new WireError(exports.WireReasonCode.EXPIRED, `token[${i}] expired: now=${now} > exp=${exp}`);
|
|
535
|
+
}
|
|
536
|
+
if (prevExp !== null && exp > prevExp) {
|
|
537
|
+
throw new WireError(exports.WireReasonCode.EXPIRED, `token[${i}] exp=${exp} exceeds parent token[${i - 1}] exp=${prevExp} ` +
|
|
538
|
+
"(exp must be monotonic non-increasing along the chain)");
|
|
539
|
+
}
|
|
540
|
+
prevExp = exp;
|
|
541
|
+
}
|
|
542
|
+
// ---- steps 6-7: OUT OF SCOPE (see the doc comment) ----------------------
|
|
543
|
+
// step 6: cnf/DPoP holder-binding proof — not checked.
|
|
544
|
+
// step 7: Token Status List revocation — not checked.
|
|
545
|
+
return new VerifiedChain([...tokens], parsed.map((p) => p.payload), authorities[authorities.length - 1], parsed[parsed.length - 1].payload["del_depth"], delMaxDepth);
|
|
546
|
+
}
|
|
547
|
+
/**
|
|
548
|
+
* Did the issuer write an integer, as opposed to a value that merely equals one?
|
|
549
|
+
* `parseJson` keeps every number's original literal precisely so this question
|
|
550
|
+
* can still be asked after parsing.
|
|
551
|
+
*/
|
|
552
|
+
function isIntegerLiteral(value) {
|
|
553
|
+
if (value instanceof canonical_js_1.RawNumber)
|
|
554
|
+
return /^-?\d+$/.test(value.raw);
|
|
555
|
+
return typeof value === "number" && Number.isInteger(value);
|
|
556
|
+
}
|
|
557
|
+
/**
|
|
558
|
+
* Compare two ASCII strings without an early exit, so a near-miss and a wild
|
|
559
|
+
* miss take the same time. `timingSafeEqual` throws on unequal lengths, so the
|
|
560
|
+
* length is checked first — that leak is only the digest length, which is fixed
|
|
561
|
+
* and public anyway.
|
|
562
|
+
*/
|
|
563
|
+
function constantTimeEqualAscii(a, b) {
|
|
564
|
+
const ab = Buffer.from(a, "ascii");
|
|
565
|
+
const bb = Buffer.from(b, "ascii");
|
|
566
|
+
return ab.length === bb.length && (0, node_crypto_1.timingSafeEqual)(ab, bb);
|
|
567
|
+
}
|
|
165
568
|
//# sourceMappingURL=wire.js.map
|
package/dist/cjs/wire.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"wire.js","sourceRoot":"","sources":["../../src/wire.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"wire.js","sourceRoot":"","sources":["../../src/wire.ts"],"names":[],"mappings":";AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;GA2BG;;;AAiNH,oCAEC;AAgBD,oCAKC;AAkRD,oBAsKC;AA9pBD,6CAUqB;AACrB,yCAAwC;AAExC,iDAA2C;AAC3C,iDAUwB;AAExB,6CAAyD;AAazD;;;;;;;;;;;GAWG;AACH,MAAa,eAAe;IAKP;IAJV,GAAG,GAAG,OAAO,CAAC;IACd,GAAG,CAAS;IAErB,YACmB,MAAc,EAC/B,GAAG,GAAG,MAAM;QADK,WAAM,GAAN,MAAM,CAAQ;QAG/B,IAAI,CAAC,GAAG,GAAG,GAAG,CAAC;IACjB,CAAC;IAED,IAAI,CAAC,YAAoB;QACvB,OAAO,IAAA,wBAAU,EAAC,QAAQ,EAAE,IAAI,CAAC,MAAM,CAAC,CAAC,MAAM,CAAC,YAAY,CAAC,CAAC,MAAM,EAAE,CAAC;IACzE,CAAC;IAED,MAAM,CAAC,YAAoB,EAAE,GAAW,EAAE,MAAsB;QAC9D,yEAAyE;QACzE,yEAAyE;QACzE,4DAA4D;QAC5D,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;QACzC,OAAO,QAAQ,CAAC,MAAM,KAAK,GAAG,CAAC,MAAM,IAAI,IAAA,6BAAe,EAAC,QAAQ,EAAE,GAAG,CAAC,CAAC;IAC1E,CAAC;CACF;AAtBD,0CAsBC;AAED,+EAA+E;AAC/E,+EAA+E;AAC/E,+DAA+D;AAC/D,MAAM,mBAAmB,GAAG,MAAM,CAAC,IAAI,CAAC,0BAA0B,EAAE,KAAK,CAAC,CAAC;AAC3E,MAAM,oBAAoB,GAAG,MAAM,CAAC,IAAI,CAAC,kCAAkC,EAAE,KAAK,CAAC,CAAC;AAEpF,SAAS,gBAAgB,CAAC,GAAW;IACnC,IAAI,GAAG,CAAC,MAAM,KAAK,EAAE,EAAE,CAAC;QACtB,MAAM,IAAI,KAAK,CAAC,0CAA0C,GAAG,CAAC,MAAM,EAAE,CAAC,CAAC;IAC1E,CAAC;IACD,OAAO,IAAA,6BAAe,EAAC;QACrB,GAAG,EAAE,MAAM,CAAC,MAAM,CAAC,CAAC,mBAAmB,EAAE,GAAG,CAAC,CAAC;QAC9C,MAAM,EAAE,KAAK;QACb,IAAI,EAAE,MAAM;KACb,CAAC,CAAC;AACL,CAAC;AAED,SAAS,iBAAiB,CAAC,GAAW;IACpC,IAAI,GAAG,CAAC,MAAM,KAAK,EAAE,EAAE,CAAC;QACtB,MAAM,IAAI,KAAK,CAAC,2CAA2C,GAAG,CAAC,MAAM,EAAE,CAAC,CAAC;IAC3E,CAAC;IACD,OAAO,IAAA,8BAAgB,EAAC;QACtB,GAAG,EAAE,MAAM,CAAC,MAAM,CAAC,CAAC,oBAAoB,EAAE,GAAG,CAAC,CAAC;QAC/C,MAAM,EAAE,KAAK;QACb,IAAI,EAAE,OAAO;KACd,CAAC,CAAC;AACL,CAAC;AAED,SAAS,cAAc,CAAC,GAAc;IACpC,MAAM,GAAG,GAAG,GAAG,CAAC,MAAM,CAAC,EAAE,MAAM,EAAE,KAAK,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC,CAAC;IACxD,OAAO,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,QAAQ,CAAC,GAAG,CAAC,MAAM,GAAG,EAAE,CAAC,CAAC,CAAC;AACpD,CAAC;AAED,SAAS,eAAe,CAAC,GAAc;IACrC,MAAM,GAAG,GAAG,GAAG,CAAC,MAAM,CAAC,EAAE,MAAM,EAAE,KAAK,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC,CAAC;IACzD,OAAO,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,QAAQ,CAAC,GAAG,CAAC,MAAM,GAAG,EAAE,CAAC,CAAC,CAAC;AACpD,CAAC;AAED;;;;;GAKG;AACH,MAAa,aAAa;IACf,GAAG,GAAG,OAAO,CAAC;IACd,GAAG,CAAS;IACJ,UAAU,CAAY;IACtB,SAAS,CAAY;IAEtC,YAAY,UAAsB,EAAE,GAAG,GAAG,WAAW;QACnD,IAAI,UAAU,KAAK,SAAS,EAAE,CAAC;YAC7B,MAAM,IAAI,GAAG,IAAA,iCAAmB,EAAC,SAAS,CAAC,CAAC;YAC5C,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC,UAAU,CAAC;YAClC,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC,SAAS,CAAC;QAClC,CAAC;aAAM,CAAC;YACN,IAAI,CAAC,UAAU,GAAG,UAAU,CAAC;YAC7B,IAAI,CAAC,SAAS,GAAG,IAAA,6BAAe,EAAC,UAAU,CAAC,CAAC;QAC/C,CAAC;QACD,IAAI,CAAC,GAAG,GAAG,GAAG,CAAC;IACjB,CAAC;IAED,qDAAqD;IACrD,MAAM,CAAC,QAAQ,CAAC,GAAG,GAAG,WAAW;QAC/B,OAAO,IAAI,aAAa,CAAC,SAAS,EAAE,GAAG,CAAC,CAAC;IAC3C,CAAC;IAED,yEAAyE;IACzE,MAAM,CAAC,gBAAgB,CAAC,GAAW,EAAE,GAAG,GAAG,WAAW;QACpD,OAAO,IAAI,aAAa,CAAC,iBAAiB,CAAC,GAAG,CAAC,EAAE,GAAG,CAAC,CAAC;IACxD,CAAC;IAED,IAAI,CAAC,YAAoB;QACvB,OAAO,IAAA,kBAAU,EAAC,IAAI,EAAE,YAAY,EAAE,IAAI,CAAC,UAAU,CAAC,CAAC;IACzD,CAAC;IAED,MAAM,CAAC,YAAoB,EAAE,GAAW,EAAE,MAAsB;QAC9D,IAAI,CAAC;YACH,OAAO,IAAA,oBAAY,EAAC,IAAI,EAAE,YAAY,EAAE,IAAI,CAAC,SAAS,EAAE,GAAG,CAAC,CAAC;QAC/D,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,KAAK,CAAC;QACf,CAAC;IACH,CAAC;IAED,6EAA6E;IAC7E,cAAc;QACZ,OAAO,cAAc,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;IACxC,CAAC;IAED,0EAA0E;IAC1E,eAAe;QACb,OAAO,eAAe,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;IAC1C,CAAC;CACF;AAjDD,sCAiDC;AAED;;;;GAIG;AACH,MAAa,eAAe;IACjB,GAAG,GAAG,OAAO,CAAC;IACd,GAAG,CAAS;IACJ,SAAS,CAAY;IAEtC,YAAY,cAAsB,EAAE,GAAG,GAAG,WAAW;QACnD,IAAI,CAAC,SAAS,GAAG,gBAAgB,CAAC,cAAc,CAAC,CAAC;QAClD,IAAI,CAAC,GAAG,GAAG,GAAG,CAAC;IACjB,CAAC;IAED,IAAI,CAAC,aAAqB;QACxB,MAAM,IAAI,KAAK,CAAC,sDAAsD,CAAC,CAAC;IAC1E,CAAC;IAED,MAAM,CAAC,YAAoB,EAAE,GAAW,EAAE,MAAsB;QAC9D,IAAI,CAAC;YACH,OAAO,IAAA,oBAAY,EAAC,IAAI,EAAE,YAAY,EAAE,IAAI,CAAC,SAAS,EAAE,GAAG,CAAC,CAAC;QAC/D,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,KAAK,CAAC;QACf,CAAC;IACH,CAAC;IAED,cAAc;QACZ,OAAO,cAAc,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;IACxC,CAAC;CACF;AAzBD,0CAyBC;AAED,8EAA8E;AAC9E,+EAA+E;AAC/E,8EAA8E;AAE9E,gFAAgF;AAChF,SAAgB,YAAY,CAAC,IAAY;IACvC,OAAO,IAAI,CAAC,QAAQ,CAAC,WAAW,CAAC,CAAC;AACpC,CAAC;AAED,MAAM,MAAM,GAAG,kBAAkB,CAAC;AAElC;;;;;;;;;;;GAWG;AACH,SAAgB,YAAY,CAAC,CAAS;IACpC,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,MAAM,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC;QAC1C,MAAM,IAAI,KAAK,CAAC,wBAAwB,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;IAC/D,CAAC;IACD,OAAO,MAAM,CAAC,IAAI,CAAC,CAAC,EAAE,WAAW,CAAC,CAAC;AACrC,CAAC;AAED,8EAA8E;AAC9E,wBAAwB;AACxB,8EAA8E;AAE9E;;;;;;;GAOG;AACU,QAAA,cAAc,GAAG;IAC5B,iBAAiB,EAAE,mBAAmB;IACtC,iBAAiB,EAAE,mBAAmB;IACtC,aAAa,EAAE,eAAe;IAC9B,YAAY,EAAE,cAAc;IAC5B,SAAS,EAAE,WAAW;IACtB,UAAU,EAAE,YAAY;IACxB,gBAAgB,EAAE,kBAAkB;IACpC,yBAAyB,EAAE,2BAA2B;IACtD,aAAa,EAAE,eAAe;IAC9B,OAAO,EAAE,uBAAU,CAAC,OAAO,EAAE,oCAAoC;CACzD,CAAC;AAIX;;;;;;;;;GASG;AACH,MAAa,SAAU,SAAQ,KAAK;IACzB,MAAM,CAAS;IAExB,YAAY,MAAc,EAAE,OAAO,GAAG,EAAE;QACtC,KAAK,CAAC,OAAO,CAAC,CAAC;QACf,IAAI,CAAC,IAAI,GAAG,WAAW,CAAC;QACxB,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;IACvB,CAAC;CACF;AARD,8BAQC;AAqBD,SAAS,YAAY,CAAC,KAAc;IAClC,OAAO,KAAK,KAAK,IAAI,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;AAC9E,CAAC;AAED,SAAS,UAAU,CAAC,KAAa;IAC/B,MAAM,KAAK,GAAG,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;IAC/B,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACvB,MAAM,IAAI,SAAS,CACjB,sBAAc,CAAC,SAAS,EACxB,uCAAuC,KAAK,CAAC,MAAM,EAAE,CACtD,CAAC;IACJ,CAAC;IACD,MAAM,CAAC,SAAS,EAAE,UAAU,EAAE,MAAM,CAAC,GAAG,KAAiC,CAAC;IAC1E,IAAI,WAAmB,CAAC;IACxB,IAAI,YAAoB,CAAC;IACzB,IAAI,GAAW,CAAC;IAChB,IAAI,CAAC;QACH,WAAW,GAAG,YAAY,CAAC,SAAS,CAAC,CAAC;QACtC,YAAY,GAAG,YAAY,CAAC,UAAU,CAAC,CAAC;QACxC,GAAG,GAAG,YAAY,CAAC,MAAM,CAAC,CAAC;IAC7B,CAAC;IAAC,OAAO,CAAC,EAAE,CAAC;QACX,MAAM,IAAI,SAAS,CAAC,sBAAc,CAAC,SAAS,EAAE,2BAA2B,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;IACxF,CAAC;IAED,IAAI,SAAgB,CAAC;IACrB,IAAI,UAAiB,CAAC;IACtB,IAAI,CAAC;QACH,MAAM,OAAO,GAAG,IAAI,uBAAW,CAAC,OAAO,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;QAC1D,SAAS,GAAG,IAAA,wBAAS,EAAC,OAAO,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC,CAAC;QACnD,UAAU,GAAG,IAAA,wBAAS,EAAC,OAAO,CAAC,MAAM,CAAC,YAAY,CAAC,CAAC,CAAC;IACvD,CAAC;IAAC,OAAO,CAAC,EAAE,CAAC;QACX,IAAI,CAAC,YAAY,mCAAoB,EAAE,CAAC;YACtC,MAAM,IAAI,SAAS,CAAC,sBAAc,CAAC,gBAAgB,EAAE,CAAC,CAAC,OAAO,CAAC,CAAC;QAClE,CAAC;QACD,IAAI,CAAC,YAAY,mCAAoB,EAAE,CAAC;YACtC,MAAM,IAAI,SAAS,CAAC,sBAAc,CAAC,UAAU,EAAE,CAAC,CAAC,OAAO,CAAC,CAAC;QAC5D,CAAC;QACD,IAAI,CAAC,YAAY,oCAAqB,EAAE,CAAC;YACvC,MAAM,IAAI,SAAS,CAAC,sBAAc,CAAC,aAAa,EAAE,CAAC,CAAC,OAAO,CAAC,CAAC;QAC/D,CAAC;QACD,MAAM,IAAI,SAAS,CAAC,sBAAc,CAAC,SAAS,EAAE,+BAA+B,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;IAC5F,CAAC;IAED,MAAM,MAAM,GAAG,IAAA,sBAAO,EAAO,SAAS,CAAC,CAAC;IACxC,MAAM,OAAO,GAAG,IAAA,sBAAO,EAAO,UAAU,CAAC,CAAC;IAC1C,IAAI,CAAC,YAAY,CAAC,MAAM,CAAC,IAAI,CAAC,YAAY,CAAC,OAAO,CAAC,EAAE,CAAC;QACpD,MAAM,IAAI,SAAS,CAAC,sBAAc,CAAC,SAAS,EAAE,qCAAqC,CAAC,CAAC;IACvF,CAAC;IACD,IAAI,MAAM,CAAC,MAAM,CAAC,KAAK,KAAK,EAAE,CAAC;QAC7B,MAAM,IAAI,SAAS,CACjB,sBAAc,CAAC,yBAAyB,EACxC,sCAAsC,CACvC,CAAC;IACJ,CAAC;IACD,IAAI,eAAuB,CAAC;IAC5B,IAAI,gBAAwB,CAAC;IAC7B,IAAI,CAAC;QACH,eAAe,GAAG,IAAA,4BAAa,EAAC,SAAS,CAAC,CAAC;QAC3C,gBAAgB,GAAG,IAAA,4BAAa,EAAC,UAAU,CAAC,CAAC;IAC/C,CAAC;IAAC,OAAO,CAAC,EAAE,CAAC;QACX,IAAI,CAAC,YAAY,mCAAoB,EAAE,CAAC;YACtC,MAAM,IAAI,SAAS,CAAC,sBAAc,CAAC,UAAU,EAAE,CAAC,CAAC,OAAO,CAAC,CAAC;QAC5D,CAAC;QACD,IAAI,CAAC,YAAY,oCAAqB,EAAE,CAAC;YACvC,MAAM,IAAI,SAAS,CAAC,sBAAc,CAAC,aAAa,EAAE,CAAC,CAAC,OAAO,CAAC,CAAC;QAC/D,CAAC;QACD,MAAM,CAAC,CAAC;IACV,CAAC;IACD,IACE,CAAC,WAAW,CAAC,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,eAAe,EAAE,MAAM,CAAC,CAAC;QACzD,CAAC,YAAY,CAAC,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,gBAAgB,EAAE,MAAM,CAAC,CAAC,EAC3D,CAAC;QACD,MAAM,IAAI,SAAS,CACjB,sBAAc,CAAC,aAAa,EAC5B,qDAAqD,CACtD,CAAC;IACJ,CAAC;IACD,OAAO;QACL,MAAM;QACN,OAAO;QACP,UAAU,EAAE,UAAmC;QAC/C,GAAG;QACH,wEAAwE;QACxE,qEAAqE;QACrE,YAAY,EAAE,MAAM,CAAC,IAAI,CAAC,GAAG,SAAS,IAAI,UAAU,EAAE,EAAE,OAAO,CAAC;KACjE,CAAC;AACJ,CAAC;AAED;;;;;;;;;;GAUG;AACH,SAAS,oBAAoB,CAAC,OAA6B;IACzD,MAAM,OAAO,GAAG,OAAO,CAAC,uBAAuB,CAAC,CAAC;IACjD,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACpD,MAAM,IAAI,SAAS,CAAC,sBAAc,CAAC,SAAS,EAAE,wCAAwC,CAAC,CAAC;IAC1F,CAAC;IACD,MAAM,EAAE,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC;IACtB,IAAI,CAAC,YAAY,CAAC,EAAE,CAAC,IAAI,EAAE,CAAC,MAAM,CAAC,KAAK,kBAAkB,EAAE,CAAC;QAC3D,MAAM,IAAI,SAAS,CACjB,sBAAc,CAAC,SAAS,EACxB,0DAA0D,CAC3D,CAAC;IACJ,CAAC;IACD,MAAM,GAAG,GAAG,OAAO,CAAC,KAAK,CAAC,CAAC;IAC3B,MAAM,GAAG,GAAG,OAAO,CAAC,KAAK,CAAC,CAAC;IAC3B,IAAI,OAAO,GAAG,KAAK,QAAQ,IAAI,OAAO,GAAG,KAAK,QAAQ,EAAE,CAAC;QACvD,MAAM,IAAI,SAAS,CAAC,sBAAc,CAAC,SAAS,EAAE,gCAAgC,CAAC,CAAC;IAClF,CAAC;IACD,MAAM,IAAI,GAAG;QACX,MAAM,EAAE,EAAE,CAAC,QAAQ,CAAC,IAAI,EAAE;QAC1B,WAAW,EAAE,EAAE,CAAC,aAAa,CAAC,IAAI,EAAE;QACpC,GAAG,EAAE,GAAG,GAAG,GAAG;KACf,CAAC;IACF,IAAI,CAAC;QACH,OAAO,wBAAS,CAAC,QAAQ,CAAC,IAAa,CAAC,CAAC;IAC3C,CAAC;IAAC,OAAO,CAAC,EAAE,CAAC;QACX,uEAAuE;QACvE,2DAA2D;QAC3D,MAAM,IAAI,SAAS,CAAC,sBAAc,CAAC,SAAS,EAAE,kCAAkC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;IAC/F,CAAC;AACH,CAAC;AAED,8EAA8E;AAC9E,8CAA8C;AAC9C,8EAA8E;AAE9E;;;;;GAKG;AACH,MAAa,aAAa;IAEb;IACA;IACA;IACA;IACA;IALX,YACW,MAAyB,EACzB,QAAyC,EACzC,aAAwB,EACxB,KAAa,EACb,WAAmB;QAJnB,WAAM,GAAN,MAAM,CAAmB;QACzB,aAAQ,GAAR,QAAQ,CAAiC;QACzC,kBAAa,GAAb,aAAa,CAAW;QACxB,UAAK,GAAL,KAAK,CAAQ;QACb,gBAAW,GAAX,WAAW,CAAQ;IAC3B,CAAC;IAEJ;;;;;OAKG;IACH,OAAO,CAAC,KAAa,EAAE,MAAsB,IAAI;QAC/C,OAAO,IAAI,CAAC,aAAa,CAAC,OAAO,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC;IAChD,CAAC;CACF;AAlBD,sCAkBC;AAkBD;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA6BG;AACH,SAAgB,IAAI,CAClB,MAAyB,EACzB,MAAc,EACd,UAAuB,EAAE;IAEzB,MAAM,EAAE,UAAU,GAAG,IAAI,EAAE,GAAG,GAAG,CAAC,EAAE,GAAG,OAAO,CAAC;IAC/C,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACxB,MAAM,IAAI,SAAS,CAAC,sBAAc,CAAC,SAAS,EAAE,mBAAmB,CAAC,CAAC;IACrE,CAAC;IAED,MAAM,MAAM,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,CAAC;IAEhD,4EAA4E;IAC5E,MAAM,YAAY,GAAG,UAAU,KAAK,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,GAAG,CAAC,UAAU,CAAC,CAAC;IACtE,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QACvC,MAAM,EAAE,MAAM,EAAE,GAAG,EAAE,YAAY,EAAE,GAAG,MAAM,CAAC,CAAC,CAAE,CAAC;QACjD,MAAM,GAAG,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC;QAC1B,IAAI,GAAG,KAAK,MAAM,CAAC,GAAG,EAAE,CAAC;YACvB,MAAM,IAAI,SAAS,CACjB,sBAAc,CAAC,iBAAiB,EAChC,SAAS,CAAC,gBAAgB,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,kBAAkB,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,CAC5F,CAAC;QACJ,CAAC;QACD,MAAM,GAAG,GAAG,OAAO,MAAM,CAAC,KAAK,CAAC,KAAK,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;QACrE,IAAI,CAAC,KAAK,CAAC,IAAI,YAAY,KAAK,IAAI,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC;YAC/D,MAAM,IAAI,SAAS,CACjB,sBAAc,CAAC,iBAAiB,EAChC,kBAAkB,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,4BAA4B,CAClE,CAAC;QACJ,CAAC;QACD,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,YAAY,EAAE,GAAG,EAAE,GAAG,CAAC,EAAE,CAAC;YAC3C,MAAM,IAAI,SAAS,CACjB,sBAAc,CAAC,iBAAiB,EAChC,SAAS,CAAC,6BAA6B,CACxC,CAAC;QACJ,CAAC;IACH,CAAC;IAED,4EAA4E;IAC5E,2EAA2E;IAC3E,uEAAuE;IACvE,2EAA2E;IAC3E,IAAI,UAAU,IAAI,MAAM,CAAC,CAAC,CAAE,CAAC,OAAO,EAAE,CAAC;QACrC,MAAM,IAAI,SAAS,CAAC,sBAAc,CAAC,SAAS,EAAE,4CAA4C,CAAC,CAAC;IAC9F,CAAC;IACD,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QACvC,MAAM,WAAW,GAAG,IAAA,wBAAU,EAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,GAAG,CAAC,CAAE,CAAC,YAAY,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;QAC3F,MAAM,MAAM,GAAG,MAAM,CAAC,CAAC,CAAE,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC;QAC9C,IAAI,OAAO,MAAM,KAAK,QAAQ,EAAE,CAAC;YAC/B,MAAM,IAAI,SAAS,CAAC,sBAAc,CAAC,iBAAiB,EAAE,SAAS,CAAC,oBAAoB,CAAC,CAAC;QACxF,CAAC;QACD,IAAI,MAAc,CAAC;QACnB,IAAI,CAAC;YACH,MAAM,GAAG,YAAY,CAAC,MAAM,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;QAChD,CAAC;QAAC,OAAO,CAAC,EAAE,CAAC;YACX,MAAM,IAAI,SAAS,CACjB,sBAAc,CAAC,SAAS,EACxB,SAAS,CAAC,sCAAsC,MAAM,CAAC,CAAC,CAAC,EAAE,CAC5D,CAAC;QACJ,CAAC;QACD,IAAI,CAAC,sBAAsB,CAAC,WAAW,EAAE,MAAM,CAAC,EAAE,CAAC;YACjD,MAAM,IAAI,SAAS,CACjB,sBAAc,CAAC,iBAAiB,EAChC,SAAS,CAAC,0CAA0C,CAAC,GAAG,CAAC,oBAAoB;gBAC3E,4CAA4C,CAC/C,CAAC;QACJ,CAAC;IACH,CAAC;IAED,4EAA4E;IAC5E,MAAM,WAAW,GAAG,MAAM,CAAC,CAAC,CAAE,CAAC,OAAO,CAAC;IACvC,IAAI,WAAW,CAAC,WAAW,CAAC,KAAK,CAAC,EAAE,CAAC;QACnC,MAAM,IAAI,SAAS,CAAC,sBAAc,CAAC,aAAa,EAAE,0BAA0B,CAAC,CAAC;IAChF,CAAC;IACD,MAAM,WAAW,GAAG,WAAW,CAAC,eAAe,CAAC,CAAC;IACjD,IACE,OAAO,WAAW,KAAK,QAAQ;QAC/B,CAAC,gBAAgB,CAAC,MAAM,CAAC,CAAC,CAAE,CAAC,UAAU,CAAC,eAAe,CAAC,CAAC;QACzD,WAAW,IAAI,CAAC,EAChB,CAAC;QACD,MAAM,IAAI,SAAS,CACjB,sBAAc,CAAC,aAAa,EAC5B,+CAA+C,CAChD,CAAC;IACJ,CAAC;IACD,oEAAoE;IACpE,6EAA6E;IAC7E,+EAA+E;IAC/E,MAAM,CAAC,GAAG,MAAM,CAAC,MAAM,GAAG,CAAC,CAAC;IAC5B,IAAI,CAAC,CAAC,CAAC,GAAG,WAAW,CAAC,EAAE,CAAC;QACvB,MAAM,IAAI,SAAS,CACjB,sBAAc,CAAC,aAAa,EAC5B,gBAAgB,CAAC,GAAG,CAAC,0BAA0B,WAAW,GAAG;YAC3D,wBAAwB,CAAC,mBAAmB,CAC/C,CAAC;IACJ,CAAC;IACD,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QACvC,IAAI,MAAM,CAAC,CAAC,CAAE,CAAC,OAAO,CAAC,WAAW,CAAC,KAAK,CAAC,EAAE,CAAC;YAC1C,MAAM,IAAI,SAAS,CACjB,sBAAc,CAAC,aAAa,EAC5B,SAAS,CAAC,iBAAiB,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC,CAAE,CAAC,OAAO,CAAC,WAAW,CAAC,CAAC,cAAc,CAAC,EAAE,CAC5F,CAAC;QACJ,CAAC;IACH,CAAC;IAED,4EAA4E;IAC5E,MAAM,WAAW,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,oBAAoB,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC;IACvE,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,WAAW,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QAC5C,IAAI,CAAC,WAAW,CAAC,CAAC,CAAE,CAAC,cAAc,CAAC,WAAW,CAAC,CAAC,GAAG,CAAC,CAAE,CAAC,EAAE,CAAC;YACzD,MAAM,IAAI,SAAS,CACjB,sBAAc,CAAC,YAAY,EAC3B,SAAS,CAAC,0CAA0C,CAAC,GAAG,CAAC,MAAM;gBAC7D,0DAA0D,CAC7D,CAAC;QACJ,CAAC;IACH,CAAC;IAED,4EAA4E;IAC5E,IAAI,OAAO,GAAkB,IAAI,CAAC;IAClC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QACvC,MAAM,OAAO,GAAG,MAAM,CAAC,CAAC,CAAE,CAAC,OAAO,CAAC;QACnC,MAAM,GAAG,GAAG,OAAO,CAAC,KAAK,CAAC,CAAC;QAC3B,IAAI,OAAO,GAAG,KAAK,QAAQ,EAAE,CAAC;YAC5B,MAAM,IAAI,SAAS,CAAC,sBAAc,CAAC,SAAS,EAAE,SAAS,CAAC,uBAAuB,CAAC,CAAC;QACnF,CAAC;QACD,0EAA0E;QAC1E,2EAA2E;QAC3E,uEAAuE;QACvE,4EAA4E;QAC5E,qEAAqE;QACrE,MAAM,GAAG,GAAG,OAAO,CAAC,KAAK,CAAC,CAAC;QAC3B,IAAI,GAAG,KAAK,SAAS,IAAI,GAAG,KAAK,IAAI,EAAE,CAAC;YACtC,IAAI,OAAO,GAAG,KAAK,QAAQ,EAAE,CAAC;gBAC5B,MAAM,IAAI,SAAS,CAAC,sBAAc,CAAC,SAAS,EAAE,SAAS,CAAC,sBAAsB,CAAC,CAAC;YAClF,CAAC;YACD,IAAI,GAAG,GAAG,GAAG,EAAE,CAAC;gBACd,MAAM,IAAI,SAAS,CACjB,sBAAc,CAAC,OAAO,EACtB,SAAS,CAAC,wBAAwB,GAAG,UAAU,GAAG,EAAE,CACrD,CAAC;YACJ,CAAC;QACH,CAAC;QACD,IAAI,GAAG,GAAG,GAAG,EAAE,CAAC;YACd,MAAM,IAAI,SAAS,CAAC,sBAAc,CAAC,OAAO,EAAE,SAAS,CAAC,kBAAkB,GAAG,UAAU,GAAG,EAAE,CAAC,CAAC;QAC9F,CAAC;QACD,IAAI,OAAO,KAAK,IAAI,IAAI,GAAG,GAAG,OAAO,EAAE,CAAC;YACtC,MAAM,IAAI,SAAS,CACjB,sBAAc,CAAC,OAAO,EACtB,SAAS,CAAC,SAAS,GAAG,yBAAyB,CAAC,GAAG,CAAC,SAAS,OAAO,GAAG;gBACrE,wDAAwD,CAC3D,CAAC;QACJ,CAAC;QACD,OAAO,GAAG,GAAG,CAAC;IAChB,CAAC;IAED,4EAA4E;IAC5E,yDAAyD;IACzD,wDAAwD;IAExD,OAAO,IAAI,aAAa,CACtB,CAAC,GAAG,MAAM,CAAC,EACX,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,EAC5B,WAAW,CAAC,WAAW,CAAC,MAAM,GAAG,CAAC,CAAE,EACpC,MAAM,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC,CAAE,CAAC,OAAO,CAAC,WAAW,CAAW,EACzD,WAAW,CACZ,CAAC;AACJ,CAAC;AAED;;;;GAIG;AACH,SAAS,gBAAgB,CAAC,KAAwB;IAChD,IAAI,KAAK,YAAY,wBAAS;QAAE,OAAO,SAAS,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;IACjE,OAAO,OAAO,KAAK,KAAK,QAAQ,IAAI,MAAM,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC;AAC9D,CAAC;AAED;;;;;GAKG;AACH,SAAS,sBAAsB,CAAC,CAAS,EAAE,CAAS;IAClD,MAAM,EAAE,GAAG,MAAM,CAAC,IAAI,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC;IACnC,MAAM,EAAE,GAAG,MAAM,CAAC,IAAI,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC;IACnC,OAAO,EAAE,CAAC,MAAM,KAAK,EAAE,CAAC,MAAM,IAAI,IAAA,6BAAe,EAAC,EAAE,EAAE,EAAE,CAAC,CAAC;AAC5D,CAAC"}
|
package/dist/esm/audit.d.ts
CHANGED
package/dist/esm/audit.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"audit.d.ts","sourceRoot":"","sources":["../../src/audit.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAMH,OAAO,EAKL,KAAK,KAAK,EACX,MAAM,gBAAgB,CAAC;AACxB,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,WAAW,CAAC;AAExC,eAAO,MAAM,cAAc,IAAI,CAAC;AAChC,eAAO,MAAM,OAAO,QAAiB,CAAC;AAEtC,8BAA8B;AAC9B,MAAM,MAAM,WAAW,GAAG,MAAM,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC;AAEhD,0EAA0E;AAC1E,MAAM,WAAW,IAAI;IACnB,KAAK,CAAC,KAAK,EAAE,WAAW,GAAG,IAAI,CAAC;CACjC;AAED,oDAAoD;AACpD,MAAM,WAAW,MAAM;IACrB,CAAC,EAAE,MAAM,CAAC;IACV,QAAQ,EAAE,MAAM,CAAC;IACjB,GAAG,EAAE,MAAM,CAAC;IACZ,IAAI,EAAE,MAAM,CAAC;IACb,EAAE,EAAE,MAAM,GAAG,MAAM,CAAC;IACpB,GAAG,EAAE,MAAM,GAAG,IAAI,CAAC;IACnB,GAAG,EAAE,MAAM,CAAC;IACZ,0DAA0D;IAC1D,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,CAAC,GAAG,EAAE,MAAM,GAAG,KAAK,GAAG,SAAS,CAAC;CAClC;AAED,oEAAoE;AACpE,wBAAgB,SAAS,CAAC,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,WAAW,GAAG,MAAM,CAKxE;AAeD,MAAM,WAAW,YAAY;IAC3B,sEAAsE;IACtE,IAAI,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACrB,+DAA+D;IAC/D,KAAK,CAAC,EAAE,SAAS,IAAI,EAAE,CAAC;CACzB;AAED,8CAA8C;AAC9C,qBAAa,QAAQ;IACnB,QAAQ,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC;IAC7B,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAkB;IACxC,OAAO,CAAC,IAAI,CAAW;IACvB,OAAO,CAAC,GAAG,CAAK;IAChB,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAqB;IAE9C;;;;OAIG;gBACS,IAAI,GAAE,YAAY,GAAG,MAAM,GAAG,IAAS;IAUnD,MAAM,CAAC,KAAK,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,GAAG,MAAM,EAAE,MAAM,GAAE,WAAgB,GAAG,WAAW;
|
|
1
|
+
{"version":3,"file":"audit.d.ts","sourceRoot":"","sources":["../../src/audit.ts"],"names":[],"mappings":"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"}
|
package/dist/esm/audit.js
CHANGED
|
@@ -13,7 +13,7 @@
|
|
|
13
13
|
import { createHash } from "node:crypto";
|
|
14
14
|
import { appendFileSync, mkdirSync, readFileSync, writeFileSync } from "node:fs";
|
|
15
15
|
import { dirname } from "node:path";
|
|
16
|
-
import { canonicalBytes,
|
|
16
|
+
import { canonicalBytes, canonicalJson, parseJson, toPlain, } from "./canonical.js";
|
|
17
17
|
export const SCHEMA_VERSION = 1;
|
|
18
18
|
export const GENESIS = "0".repeat(64);
|
|
19
19
|
/** `sha256(prev_hash || canonical(event-without-hash))`, as hex. */
|
|
@@ -59,6 +59,7 @@ export class AuditLog {
|
|
|
59
59
|
append(event, ts, fields = {}) {
|
|
60
60
|
const payload = {
|
|
61
61
|
v: SCHEMA_VERSION,
|
|
62
|
+
c14n: "JCS",
|
|
62
63
|
seq: this.seq,
|
|
63
64
|
ts,
|
|
64
65
|
event,
|
|
@@ -70,9 +71,7 @@ export class AuditLog {
|
|
|
70
71
|
this.seq += 1;
|
|
71
72
|
this._entries.push(payload);
|
|
72
73
|
if (this.path) {
|
|
73
|
-
|
|
74
|
-
// its DEFAULT separators, not the compact pair the hash is taken over.
|
|
75
|
-
appendFileSync(this.path, pyJsonDumps(payload) + "\n");
|
|
74
|
+
appendFileSync(this.path, canonicalJson(payload) + "\n");
|
|
76
75
|
}
|
|
77
76
|
for (const sink of this.sinks)
|
|
78
77
|
sink.write(payload);
|
|
@@ -106,7 +105,7 @@ export class AuditLog {
|
|
|
106
105
|
*/
|
|
107
106
|
anchor(signer, ts = 0) {
|
|
108
107
|
const [seq, head] = this.head();
|
|
109
|
-
const body = { v: SCHEMA_VERSION, chain_id: this.chainIdHint(), seq, head, ts };
|
|
108
|
+
const body = { v: SCHEMA_VERSION, c14n: "JCS", chain_id: this.chainIdHint(), seq, head, ts };
|
|
110
109
|
return {
|
|
111
110
|
...body,
|
|
112
111
|
kid: signer.kid ?? null,
|
|
@@ -116,8 +115,10 @@ export class AuditLog {
|
|
|
116
115
|
/** The chain reproduces AND its head matches a SIGNED anchor. */
|
|
117
116
|
static verifyAnchor(entries, anchor, signer) {
|
|
118
117
|
const a = anchor ?? {};
|
|
118
|
+
if (toPlain(a["c14n"]) !== "JCS")
|
|
119
|
+
return [false, "anchor canonicalization is not JCS"];
|
|
119
120
|
const body = {};
|
|
120
|
-
for (const k of ["v", "chain_id", "seq", "head", "ts"])
|
|
121
|
+
for (const k of ["v", "c14n", "chain_id", "seq", "head", "ts"])
|
|
121
122
|
body[k] = a[k] ?? null;
|
|
122
123
|
const sigHex = toPlain(a["sig"]) ?? "";
|
|
123
124
|
if (typeof sigHex !== "string" || !/^(?:[0-9a-fA-F]{2})*$/.test(sigHex)) {
|
|
@@ -144,6 +145,9 @@ export class AuditLog {
|
|
|
144
145
|
let prev = GENESIS;
|
|
145
146
|
let expectedSeq = 0;
|
|
146
147
|
for (const e of entries) {
|
|
148
|
+
if (toPlain(e["c14n"]) !== "JCS") {
|
|
149
|
+
return [false, `canonicalization is not JCS at seq ${expectedSeq}`];
|
|
150
|
+
}
|
|
147
151
|
const seq = asNumber(e["seq"]);
|
|
148
152
|
if (seq !== expectedSeq) {
|
|
149
153
|
return [false, `seq gap at ${expectedSeq} (got ${formatSeq(e["seq"])})`];
|
package/dist/esm/audit.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"audit.js","sourceRoot":"","sources":["../../src/audit.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAEH,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACzC,OAAO,EAAE,cAAc,EAAE,SAAS,EAAE,YAAY,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AACjF,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAEpC,OAAO,EACL,cAAc,EACd,SAAS,EACT,
|
|
1
|
+
{"version":3,"file":"audit.js","sourceRoot":"","sources":["../../src/audit.ts"],"names":[],"mappings":"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"}
|