@blockcast/mmt-container 0.4.1 → 0.5.0-main.34c7b9c2cfa0

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.
Files changed (87) hide show
  1. package/README.md +2 -2
  2. package/dist/browser-runtime.js +3769 -364
  3. package/dist/browser-runtime.js.map +4 -4
  4. package/dist/cmcd-producer.d.ts +5 -1
  5. package/dist/cmcd-producer.d.ts.map +1 -1
  6. package/dist/cmcd-producer.js.map +2 -2
  7. package/dist/delivery-catalog.js +18 -2
  8. package/dist/delivery-catalog.js.map +2 -2
  9. package/dist/fec-manager.d.ts +21 -16
  10. package/dist/fec-manager.d.ts.map +1 -1
  11. package/dist/fec-manager.js +197 -80
  12. package/dist/fec-manager.js.map +3 -3
  13. package/dist/held-layer-admission.d.ts +58 -0
  14. package/dist/held-layer-admission.d.ts.map +1 -0
  15. package/dist/held-layer-admission.js +105 -0
  16. package/dist/held-layer-admission.js.map +7 -0
  17. package/dist/index.d.ts +1 -1
  18. package/dist/index.d.ts.map +1 -1
  19. package/dist/index.js.map +2 -2
  20. package/dist/mmtp-container-parser.d.ts +10 -0
  21. package/dist/mmtp-container-parser.d.ts.map +1 -1
  22. package/dist/mmtp-container-parser.js +31 -1
  23. package/dist/mmtp-container-parser.js.map +2 -2
  24. package/dist/mmtp-container-parser.no-modules.js +2713 -1024
  25. package/dist/mmtp-container-parser.no-modules.js.map +4 -4
  26. package/dist/mmtp-decode-pipeline.js +31 -1
  27. package/dist/mmtp-decode-pipeline.js.map +2 -2
  28. package/dist/mmtp-fec-session.d.ts +36 -3
  29. package/dist/mmtp-fec-session.d.ts.map +1 -1
  30. package/dist/mmtp-fec-session.js +114 -5
  31. package/dist/mmtp-fec-session.js.map +3 -3
  32. package/dist/mmtp-router.d.ts +96 -29
  33. package/dist/mmtp-router.d.ts.map +1 -1
  34. package/dist/mmtp-router.js +522 -205
  35. package/dist/mmtp-router.js.map +2 -2
  36. package/dist/multicast-auth-catalog.d.ts +10 -2
  37. package/dist/multicast-auth-catalog.d.ts.map +1 -1
  38. package/dist/multicast-auth-catalog.js +422 -22
  39. package/dist/multicast-auth-catalog.js.map +4 -4
  40. package/dist/multicast-manager.d.ts +78 -11
  41. package/dist/multicast-manager.d.ts.map +1 -1
  42. package/dist/multicast-manager.js +3663 -333
  43. package/dist/multicast-manager.js.map +4 -4
  44. package/dist/multicast-transport.d.ts +4 -1
  45. package/dist/multicast-transport.d.ts.map +1 -1
  46. package/dist/multicast-transport.js +20 -3
  47. package/dist/multicast-transport.js.map +2 -2
  48. package/dist/no-modules.d.ts +1 -2
  49. package/dist/no-modules.d.ts.map +1 -1
  50. package/dist/no-modules.js +2699 -1008
  51. package/dist/no-modules.js.map +4 -4
  52. package/dist/repair-fetch.d.ts +50 -10
  53. package/dist/repair-fetch.d.ts.map +1 -1
  54. package/dist/repair-fetch.js +62 -20
  55. package/dist/repair-fetch.js.map +2 -2
  56. package/dist/wasm-mmtp-container-parser.js +31 -1
  57. package/dist/wasm-mmtp-container-parser.js.map +2 -2
  58. package/package.json +7 -15
  59. package/src/cmcd-producer.ts +6 -1
  60. package/src/fec-manager.ts +147 -131
  61. package/src/held-layer-admission.ts +161 -0
  62. package/src/index.ts +6 -9
  63. package/src/mmtp-container-parser.ts +48 -0
  64. package/src/mmtp-fec-session.ts +76 -3
  65. package/src/mmtp-router.ts +637 -274
  66. package/src/multicast-auth-catalog.ts +81 -8
  67. package/src/multicast-manager.ts +274 -49
  68. package/src/multicast-transport.ts +6 -2
  69. package/src/no-modules.ts +1 -6
  70. package/src/repair-fetch.ts +154 -34
  71. package/test-vectors/catalog/negative/multicast-auth-padded-key.json +0 -1
  72. package/test-vectors/catalog/negative/multicast-auth-reused-track-format.json +0 -1
  73. package/test-vectors/catalog/negative/multicast-auth-root-dotted-key.json +0 -1
  74. package/test-vectors/catalog/negative/multicast-auth-trailing-pad-bits.json +0 -1
  75. package/test-vectors/repair-policy-v1.json +113 -0
  76. package/dist/manifest-auth-plan.d.ts +0 -31
  77. package/dist/manifest-auth-plan.d.ts.map +0 -1
  78. package/dist/manifest-auth-plan.js +0 -426
  79. package/dist/manifest-auth-plan.js.map +0 -7
  80. package/dist/source-auth.d.ts +0 -2
  81. package/dist/source-auth.d.ts.map +0 -1
  82. package/dist/source-auth.js +0 -3912
  83. package/dist/source-auth.js.map +0 -7
  84. package/src/manifest-auth-plan.ts +0 -55
  85. package/src/source-auth.ts +0 -1
  86. package/test-vectors/generate-source-auth-fixture.mjs +0 -114
  87. package/test-vectors/source-auth-v1.json +0 -61
@@ -14,7 +14,7 @@
14
14
  * The rules are `multicastCatalogIssues` in `@blockcast/mmt-base`, shared with
15
15
  * the transport receivers; this module decodes what they admit.
16
16
  */
17
- import { type ManifestKey } from "@blockcast/mmt-manifest-verify";
17
+ import { type BcpV2Key } from "@blockcast/mmt-manifest-verify";
18
18
  export type MulticastAuthScheme = "bc-provenance";
19
19
  export type MulticastAuthSig = "ed25519";
20
20
  /** Default `maxAuthDelayMs` and `manifestTimerMs` of an endpoint's `auth`. */
@@ -82,10 +82,12 @@ export interface ResolvedMulticastAuthFlow {
82
82
  name: string;
83
83
  packetId: number;
84
84
  }>;
85
+ /** `ctx` recomputed from the catalog (7.2.4); present when `namespaceFields` was given. */
86
+ ctx?: Uint8Array;
85
87
  }
86
88
  export interface ResolvedMulticastAuthConfig {
87
89
  /** Decoded keys, ascending by `firstEpoch`. */
88
- keys: ManifestKey[];
90
+ keys: BcpV2Key[];
89
91
  minEpoch: number;
90
92
  flows: ResolvedMulticastAuthFlow[];
91
93
  }
@@ -98,10 +100,16 @@ export interface ResolvedMulticastAuthConfig {
98
100
  * `firstEpoch`, the retired root key) throws, so nothing is admitted and
99
101
  * nothing falls back to unauthenticated reception. An endpoint the rules make
100
102
  * a receiver ignore yields no flow; the others still bind.
103
+ *
104
+ * `namespaceFields` are the Track Namespace Fields of the catalog track, as
105
+ * MOQT carries them. With them every flow carries the recomputed `ctx`, which
106
+ * the receiver compares against each record; without them `ctx` is carried
107
+ * blind (7.2.4).
101
108
  */
102
109
  export declare function resolveMulticastAuthCatalog(catalog: unknown, options?: {
103
110
  requireAuth?: boolean;
104
111
  catalogNamespace?: string;
112
+ namespaceFields?: readonly (string | Uint8Array)[];
105
113
  }): ResolvedMulticastAuthConfig | undefined;
106
114
  /** The key that signs a record of `kid` at `epoch`, or `undefined` when that
107
115
  * `kid` does not sign it (7.2.7: such a record is dropped before verification). */
@@ -1 +1 @@
1
- {"version":3,"file":"multicast-auth-catalog.d.ts","sourceRoot":"","sources":["../src/multicast-auth-catalog.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AAGH,OAAO,EAAkB,KAAK,WAAW,EAAE,MAAM,gCAAgC,CAAC;AAElF,MAAM,MAAM,mBAAmB,GAAG,eAAe,CAAC;AAClD,MAAM,MAAM,gBAAgB,GAAG,SAAS,CAAC;AAIzC,8EAA8E;AAC9E,eAAO,MAAM,yBAAyB,MAAM,CAAC;AAC7C,eAAO,MAAM,yBAAyB,KAAK,CAAC;AAK5C;wCACwC;AACxC,wBAAgB,eAAe,CAAC,KAAK,EAAE,UAAU,GAAG,MAAM,CAczD;AAUD;yEACyE;AACzE,wBAAgB,eAAe,CAAC,IAAI,EAAE,MAAM,GAAG,UAAU,CAyBxD;AAED;6DAC6D;AAC7D,wBAAgB,sBAAsB,CAAC,SAAS,EAAE,MAAM,GAAG,UAAU,CAQpE;AAED;2EAC2E;AAC3E,MAAM,WAAW,gBAAgB;IAChC,GAAG,EAAE,MAAM,CAAC;IACZ,SAAS,EAAE,MAAM,CAAC;IAClB,UAAU,EAAE,MAAM,CAAC;CACnB;AAED,4EAA4E;AAC5E,MAAM,WAAW,mBAAmB;IACnC,MAAM,EAAE,mBAAmB,CAAC;IAC5B,OAAO,EAAE,CAAC,CAAC;IACX,GAAG,EAAE,gBAAgB,CAAC;IACtB,8DAA8D;IAC9D,IAAI,EAAE,gBAAgB,EAAE,CAAC;IACzB,iDAAiD;IACjD,QAAQ,EAAE,MAAM,CAAC;CACjB;AAED,oFAAoF;AACpF,MAAM,WAAW,kBAAkB;IAClC,2EAA2E;IAC3E,YAAY,EAAE,MAAM,CAAC;IACrB,yCAAyC;IACzC,QAAQ,EAAE,MAAM,CAAC;IACjB,qDAAqD;IACrD,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,6BAA6B;IAC7B,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,8BAA8B;IAC9B,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,uCAAuC;IACvC,aAAa,CAAC,EAAE,MAAM,CAAC;CACvB;AAED;4BAC4B;AAC5B,wBAAgB,qBAAqB,CAAC,GAAG,EAAE,OAAO,GAAG,GAAG,IAAI,mBAAmB,CAE9E;AAED,2EAA2E;AAC3E,MAAM,WAAW,yBAAyB;IACzC,sDAAsD;IACtD,aAAa,EAAE,MAAM,CAAC;IACtB,gEAAgE;IAChE,MAAM,EAAE,MAAM,CAAC;IACf,YAAY,EAAE,MAAM,CAAC;IACrB,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,EAAE,MAAM,CAAC;IAClB,YAAY,EAAE,MAAM,CAAC;IACrB,QAAQ,EAAE,MAAM,CAAC;IACjB,cAAc,EAAE,MAAM,CAAC;IACvB,eAAe,EAAE,MAAM,CAAC;IACxB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,MAAM,EAAE,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;CAClD;AAED,MAAM,WAAW,2BAA2B;IAC3C,+CAA+C;IAC/C,IAAI,EAAE,WAAW,EAAE,CAAC;IACpB,QAAQ,EAAE,MAAM,CAAC;IACjB,KAAK,EAAE,yBAAyB,EAAE,CAAC;CACnC;AAED;;;;;;;;;GASG;AACH,wBAAgB,2BAA2B,CAC1C,OAAO,EAAE,OAAO,EAChB,OAAO,GAAE;IAAE,WAAW,CAAC,EAAE,OAAO,CAAC;IAAC,gBAAgB,CAAC,EAAE,MAAM,CAAA;CAAO,GAChE,2BAA2B,GAAG,SAAS,CA6CzC;AAED;mFACmF;AACnF,wBAAgB,mBAAmB,CAClC,QAAQ,EAAE,2BAA2B,EACrC,GAAG,EAAE,MAAM,EACX,KAAK,EAAE,MAAM,GACX,UAAU,GAAG,SAAS,CAExB"}
1
+ {"version":3,"file":"multicast-auth-catalog.d.ts","sourceRoot":"","sources":["../src/multicast-auth-catalog.ts"],"names":[],"mappings":"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"}
@@ -264,25 +264,324 @@ function multicastCatalogIssues(catalog, options = {}) {
264
264
  return issues;
265
265
  }
266
266
 
267
- // ../mmt-manifest-verify/dist/source-auth.js
268
- var SOURCE_AUTH_MAX_TRUE_LENGTH = 16 * 1024 * 1024;
269
- var SIGNATURE_DOMAIN = new TextEncoder().encode("blockcast-mmt-root-v1\0\0\0");
270
-
271
- // ../mmt-manifest-verify/dist/verifier.js
272
- function manifestKeyFor(keys, epoch, kid) {
273
- if (new Set(keys.map((key) => key.kid)).size !== keys.length)
274
- return void 0;
275
- if (new Set(keys.map((key) => key.firstEpoch)).size !== keys.length)
276
- return void 0;
277
- let signer;
278
- for (const key of keys) {
279
- if (key.firstEpoch <= epoch && (signer === void 0 || key.firstEpoch > signer.firstEpoch))
280
- signer = key;
267
+ // ../mmt-manifest-verify/node_modules/@noble/hashes/esm/utils.js
268
+ function isBytes(a) {
269
+ return a instanceof Uint8Array || ArrayBuffer.isView(a) && a.constructor.name === "Uint8Array";
270
+ }
271
+ function abytes(b, ...lengths) {
272
+ if (!isBytes(b))
273
+ throw new Error("Uint8Array expected");
274
+ if (lengths.length > 0 && !lengths.includes(b.length))
275
+ throw new Error("Uint8Array expected of length " + lengths + ", got length=" + b.length);
276
+ }
277
+ function aexists(instance, checkFinished = true) {
278
+ if (instance.destroyed)
279
+ throw new Error("Hash instance has been destroyed");
280
+ if (checkFinished && instance.finished)
281
+ throw new Error("Hash#digest() has already been called");
282
+ }
283
+ function aoutput(out, instance) {
284
+ abytes(out);
285
+ const min = instance.outputLen;
286
+ if (out.length < min) {
287
+ throw new Error("digestInto() expects output buffer of length at least " + min);
281
288
  }
282
- if (signer === void 0 || kid !== void 0 && signer.kid !== kid)
283
- return void 0;
284
- return signer.publicKey;
285
289
  }
290
+ function clean(...arrays) {
291
+ for (let i = 0; i < arrays.length; i++) {
292
+ arrays[i].fill(0);
293
+ }
294
+ }
295
+ function createView(arr) {
296
+ return new DataView(arr.buffer, arr.byteOffset, arr.byteLength);
297
+ }
298
+ function rotr(word, shift) {
299
+ return word << 32 - shift | word >>> shift;
300
+ }
301
+ function utf8ToBytes(str) {
302
+ if (typeof str !== "string")
303
+ throw new Error("string expected");
304
+ return new Uint8Array(new TextEncoder().encode(str));
305
+ }
306
+ function toBytes(data) {
307
+ if (typeof data === "string")
308
+ data = utf8ToBytes(data);
309
+ abytes(data);
310
+ return data;
311
+ }
312
+ var Hash = class {
313
+ };
314
+ function createHasher(hashCons) {
315
+ const hashC = (msg) => hashCons().update(toBytes(msg)).digest();
316
+ const tmp = hashCons();
317
+ hashC.outputLen = tmp.outputLen;
318
+ hashC.blockLen = tmp.blockLen;
319
+ hashC.create = () => hashCons();
320
+ return hashC;
321
+ }
322
+
323
+ // ../mmt-manifest-verify/node_modules/@noble/hashes/esm/_md.js
324
+ function setBigUint64(view, byteOffset, value, isLE) {
325
+ if (typeof view.setBigUint64 === "function")
326
+ return view.setBigUint64(byteOffset, value, isLE);
327
+ const _32n = BigInt(32);
328
+ const _u32_max = BigInt(4294967295);
329
+ const wh = Number(value >> _32n & _u32_max);
330
+ const wl = Number(value & _u32_max);
331
+ const h = isLE ? 4 : 0;
332
+ const l = isLE ? 0 : 4;
333
+ view.setUint32(byteOffset + h, wh, isLE);
334
+ view.setUint32(byteOffset + l, wl, isLE);
335
+ }
336
+ function Chi(a, b, c) {
337
+ return a & b ^ ~a & c;
338
+ }
339
+ function Maj(a, b, c) {
340
+ return a & b ^ a & c ^ b & c;
341
+ }
342
+ var HashMD = class extends Hash {
343
+ constructor(blockLen, outputLen, padOffset, isLE) {
344
+ super();
345
+ this.finished = false;
346
+ this.length = 0;
347
+ this.pos = 0;
348
+ this.destroyed = false;
349
+ this.blockLen = blockLen;
350
+ this.outputLen = outputLen;
351
+ this.padOffset = padOffset;
352
+ this.isLE = isLE;
353
+ this.buffer = new Uint8Array(blockLen);
354
+ this.view = createView(this.buffer);
355
+ }
356
+ update(data) {
357
+ aexists(this);
358
+ data = toBytes(data);
359
+ abytes(data);
360
+ const { view, buffer, blockLen } = this;
361
+ const len = data.length;
362
+ for (let pos = 0; pos < len; ) {
363
+ const take = Math.min(blockLen - this.pos, len - pos);
364
+ if (take === blockLen) {
365
+ const dataView = createView(data);
366
+ for (; blockLen <= len - pos; pos += blockLen)
367
+ this.process(dataView, pos);
368
+ continue;
369
+ }
370
+ buffer.set(data.subarray(pos, pos + take), this.pos);
371
+ this.pos += take;
372
+ pos += take;
373
+ if (this.pos === blockLen) {
374
+ this.process(view, 0);
375
+ this.pos = 0;
376
+ }
377
+ }
378
+ this.length += data.length;
379
+ this.roundClean();
380
+ return this;
381
+ }
382
+ digestInto(out) {
383
+ aexists(this);
384
+ aoutput(out, this);
385
+ this.finished = true;
386
+ const { buffer, view, blockLen, isLE } = this;
387
+ let { pos } = this;
388
+ buffer[pos++] = 128;
389
+ clean(this.buffer.subarray(pos));
390
+ if (this.padOffset > blockLen - pos) {
391
+ this.process(view, 0);
392
+ pos = 0;
393
+ }
394
+ for (let i = pos; i < blockLen; i++)
395
+ buffer[i] = 0;
396
+ setBigUint64(view, blockLen - 8, BigInt(this.length * 8), isLE);
397
+ this.process(view, 0);
398
+ const oview = createView(out);
399
+ const len = this.outputLen;
400
+ if (len % 4)
401
+ throw new Error("_sha2: outputLen should be aligned to 32bit");
402
+ const outLen = len / 4;
403
+ const state = this.get();
404
+ if (outLen > state.length)
405
+ throw new Error("_sha2: outputLen bigger than state");
406
+ for (let i = 0; i < outLen; i++)
407
+ oview.setUint32(4 * i, state[i], isLE);
408
+ }
409
+ digest() {
410
+ const { buffer, outputLen } = this;
411
+ this.digestInto(buffer);
412
+ const res = buffer.slice(0, outputLen);
413
+ this.destroy();
414
+ return res;
415
+ }
416
+ _cloneInto(to) {
417
+ to || (to = new this.constructor());
418
+ to.set(...this.get());
419
+ const { blockLen, buffer, length, finished, destroyed, pos } = this;
420
+ to.destroyed = destroyed;
421
+ to.finished = finished;
422
+ to.length = length;
423
+ to.pos = pos;
424
+ if (length % blockLen)
425
+ to.buffer.set(buffer);
426
+ return to;
427
+ }
428
+ clone() {
429
+ return this._cloneInto();
430
+ }
431
+ };
432
+ var SHA256_IV = /* @__PURE__ */ Uint32Array.from([
433
+ 1779033703,
434
+ 3144134277,
435
+ 1013904242,
436
+ 2773480762,
437
+ 1359893119,
438
+ 2600822924,
439
+ 528734635,
440
+ 1541459225
441
+ ]);
442
+
443
+ // ../mmt-manifest-verify/node_modules/@noble/hashes/esm/sha2.js
444
+ var SHA256_K = /* @__PURE__ */ Uint32Array.from([
445
+ 1116352408,
446
+ 1899447441,
447
+ 3049323471,
448
+ 3921009573,
449
+ 961987163,
450
+ 1508970993,
451
+ 2453635748,
452
+ 2870763221,
453
+ 3624381080,
454
+ 310598401,
455
+ 607225278,
456
+ 1426881987,
457
+ 1925078388,
458
+ 2162078206,
459
+ 2614888103,
460
+ 3248222580,
461
+ 3835390401,
462
+ 4022224774,
463
+ 264347078,
464
+ 604807628,
465
+ 770255983,
466
+ 1249150122,
467
+ 1555081692,
468
+ 1996064986,
469
+ 2554220882,
470
+ 2821834349,
471
+ 2952996808,
472
+ 3210313671,
473
+ 3336571891,
474
+ 3584528711,
475
+ 113926993,
476
+ 338241895,
477
+ 666307205,
478
+ 773529912,
479
+ 1294757372,
480
+ 1396182291,
481
+ 1695183700,
482
+ 1986661051,
483
+ 2177026350,
484
+ 2456956037,
485
+ 2730485921,
486
+ 2820302411,
487
+ 3259730800,
488
+ 3345764771,
489
+ 3516065817,
490
+ 3600352804,
491
+ 4094571909,
492
+ 275423344,
493
+ 430227734,
494
+ 506948616,
495
+ 659060556,
496
+ 883997877,
497
+ 958139571,
498
+ 1322822218,
499
+ 1537002063,
500
+ 1747873779,
501
+ 1955562222,
502
+ 2024104815,
503
+ 2227730452,
504
+ 2361852424,
505
+ 2428436474,
506
+ 2756734187,
507
+ 3204031479,
508
+ 3329325298
509
+ ]);
510
+ var SHA256_W = /* @__PURE__ */ new Uint32Array(64);
511
+ var SHA256 = class extends HashMD {
512
+ constructor(outputLen = 32) {
513
+ super(64, outputLen, 8, false);
514
+ this.A = SHA256_IV[0] | 0;
515
+ this.B = SHA256_IV[1] | 0;
516
+ this.C = SHA256_IV[2] | 0;
517
+ this.D = SHA256_IV[3] | 0;
518
+ this.E = SHA256_IV[4] | 0;
519
+ this.F = SHA256_IV[5] | 0;
520
+ this.G = SHA256_IV[6] | 0;
521
+ this.H = SHA256_IV[7] | 0;
522
+ }
523
+ get() {
524
+ const { A, B, C, D, E, F, G, H } = this;
525
+ return [A, B, C, D, E, F, G, H];
526
+ }
527
+ // prettier-ignore
528
+ set(A, B, C, D, E, F, G, H) {
529
+ this.A = A | 0;
530
+ this.B = B | 0;
531
+ this.C = C | 0;
532
+ this.D = D | 0;
533
+ this.E = E | 0;
534
+ this.F = F | 0;
535
+ this.G = G | 0;
536
+ this.H = H | 0;
537
+ }
538
+ process(view, offset) {
539
+ for (let i = 0; i < 16; i++, offset += 4)
540
+ SHA256_W[i] = view.getUint32(offset, false);
541
+ for (let i = 16; i < 64; i++) {
542
+ const W15 = SHA256_W[i - 15];
543
+ const W2 = SHA256_W[i - 2];
544
+ const s0 = rotr(W15, 7) ^ rotr(W15, 18) ^ W15 >>> 3;
545
+ const s1 = rotr(W2, 17) ^ rotr(W2, 19) ^ W2 >>> 10;
546
+ SHA256_W[i] = s1 + SHA256_W[i - 7] + s0 + SHA256_W[i - 16] | 0;
547
+ }
548
+ let { A, B, C, D, E, F, G, H } = this;
549
+ for (let i = 0; i < 64; i++) {
550
+ const sigma1 = rotr(E, 6) ^ rotr(E, 11) ^ rotr(E, 25);
551
+ const T1 = H + sigma1 + Chi(E, F, G) + SHA256_K[i] + SHA256_W[i] | 0;
552
+ const sigma0 = rotr(A, 2) ^ rotr(A, 13) ^ rotr(A, 22);
553
+ const T2 = sigma0 + Maj(A, B, C) | 0;
554
+ H = G;
555
+ G = F;
556
+ F = E;
557
+ E = D + T1 | 0;
558
+ D = C;
559
+ C = B;
560
+ B = A;
561
+ A = T1 + T2 | 0;
562
+ }
563
+ A = A + this.A | 0;
564
+ B = B + this.B | 0;
565
+ C = C + this.C | 0;
566
+ D = D + this.D | 0;
567
+ E = E + this.E | 0;
568
+ F = F + this.F | 0;
569
+ G = G + this.G | 0;
570
+ H = H + this.H | 0;
571
+ this.set(A, B, C, D, E, F, G, H);
572
+ }
573
+ roundClean() {
574
+ clean(SHA256_W);
575
+ }
576
+ destroy() {
577
+ this.set(0, 0, 0, 0, 0, 0, 0, 0);
578
+ clean(this.buffer);
579
+ }
580
+ };
581
+ var sha256 = /* @__PURE__ */ createHasher(() => new SHA256());
582
+
583
+ // ../mmt-manifest-verify/node_modules/@noble/hashes/esm/sha256.js
584
+ var sha2562 = sha256;
286
585
 
287
586
  // ../mmt-manifest-verify/dist/bc-provenance-v2.js
288
587
  var BCPV2_HEADER_LENGTH = 68;
@@ -291,6 +590,58 @@ var BCPV2_MIN_RECORD_LENGTH = BCPV2_HEADER_LENGTH + 32 + BCPV2_SIGNATURE_LENGTH;
291
590
  var text = new TextEncoder();
292
591
  var MAGIC = Uint8Array.from([77, 72, 77, 50]);
293
592
  var SIGNING_DOMAIN = text.encode("mcast-manifest-v2\0");
593
+ function u16(value) {
594
+ const result = new Uint8Array(2);
595
+ new DataView(result.buffer).setUint16(0, value);
596
+ return result;
597
+ }
598
+ function u32(value) {
599
+ const result = new Uint8Array(4);
600
+ new DataView(result.buffer).setUint32(0, value);
601
+ return result;
602
+ }
603
+ function concat(parts) {
604
+ const out = new Uint8Array(parts.reduce((n, p) => n + p.byteLength, 0));
605
+ let offset = 0;
606
+ for (const part of parts) {
607
+ out.set(part, offset);
608
+ offset += part.byteLength;
609
+ }
610
+ return out;
611
+ }
612
+ function lp16(value) {
613
+ const bytes = typeof value === "string" ? text.encode(value) : value;
614
+ if (bytes.byteLength > 65535)
615
+ throw new Error("lp16 field exceeds u16 length");
616
+ return concat([u16(bytes.byteLength), bytes]);
617
+ }
618
+ function bcProvenanceV2ParamsHash(params) {
619
+ const fec = params.fec;
620
+ return sha2562(concat([
621
+ text.encode("BCPV2-params"),
622
+ lp16(params.codec),
623
+ u32(params.timescale),
624
+ u32(params.groupDurationTicks),
625
+ lp16(fec ? fec.algorithm : "none"),
626
+ u32(fec?.sourceSymbols ?? 0),
627
+ u32(fec?.repairSymbols ?? 0),
628
+ u32(fec?.symbolSize ?? 0),
629
+ u32(fec?.interleaveDepthMs ?? 0)
630
+ ]));
631
+ }
632
+ function bcProvenanceV2Ctx(namespace, packetIds, params) {
633
+ const ids = [...packetIds].sort((a, b) => a - b);
634
+ if (namespace.length > 65535 || ids.length > 65535)
635
+ throw new Error("ctx field count exceeds u16");
636
+ return sha2562(concat([
637
+ text.encode("BCPV2-ctx"),
638
+ u16(namespace.length),
639
+ ...namespace.map(lp16),
640
+ u16(ids.length),
641
+ ...ids.map(u16),
642
+ bcProvenanceV2ParamsHash(params)
643
+ ]));
644
+ }
294
645
 
295
646
  // src/multicast-auth-catalog.ts
296
647
  var RAW_ED25519_KEY_LENGTH = 32;
@@ -374,10 +725,21 @@ function resolveMulticastAuthCatalog(catalog, options = {}) {
374
725
  }
375
726
  const ignored = new Set(issues.map((issue) => issue.endpointIndex));
376
727
  const endpoints = multicast["endpoints"] ?? [];
728
+ const catalogTracks = catalog["tracks"] ?? [];
377
729
  const flows = [];
378
730
  endpoints.forEach((endpoint, endpointIndex) => {
379
731
  if (ignored.has(endpointIndex)) return;
380
732
  const flowAuth = endpoint["auth"];
733
+ const tracks = (endpoint["tracks"] ?? []).map(({ name, packetId }) => ({
734
+ name,
735
+ packetId
736
+ }));
737
+ let ctx;
738
+ if (options.namespaceFields !== void 0) {
739
+ const params = ctxParams(catalogTracks, tracks);
740
+ if (params === void 0) return;
741
+ ctx = bcProvenanceV2Ctx(options.namespaceFields, tracks.map((track) => track.packetId), params);
742
+ }
381
743
  flows.push({
382
744
  endpointIndex,
383
745
  source: endpoint["sourceAddress"] ?? flowAuth.senderAddress,
@@ -389,10 +751,8 @@ function resolveMulticastAuthCatalog(catalog, options = {}) {
389
751
  maxAuthDelayMs: flowAuth.maxAuthDelayMs ?? DEFAULT_MAX_AUTH_DELAY_MS,
390
752
  manifestTimerMs: flowAuth.manifestTimerMs ?? DEFAULT_MANIFEST_TIMER_MS,
391
753
  ...flowAuth.manifestTrack === void 0 ? {} : { manifestTrack: flowAuth.manifestTrack },
392
- tracks: (endpoint["tracks"] ?? []).map(({ name, packetId }) => ({
393
- name,
394
- packetId
395
- }))
754
+ tracks,
755
+ ...ctx === void 0 ? {} : { ctx }
396
756
  });
397
757
  });
398
758
  return {
@@ -401,8 +761,43 @@ function resolveMulticastAuthCatalog(catalog, options = {}) {
401
761
  flows
402
762
  };
403
763
  }
764
+ function positiveInteger(value) {
765
+ return typeof value === "number" && Number.isSafeInteger(value) && value > 0 && value <= 4294967295 ? value : 0;
766
+ }
767
+ function ctxParams(catalogTracks, listed) {
768
+ const byName = new Map(catalogTracks.map((track) => [track["name"], track]));
769
+ const ordered = [...listed].sort((a, b) => a.packetId - b.packetId).map(({ name }) => byName.get(name));
770
+ let entry = ordered.find((track) => track !== void 0 && track["packaging"] !== "fec-repair");
771
+ if (entry === void 0) {
772
+ const repair = ordered.find((track) => track !== void 0);
773
+ if (repair === void 0) return void 0;
774
+ const depends = repair["depends"];
775
+ entry = Array.isArray(depends) && depends.length === 1 ? byName.get(depends[0]) : catalogTracks.find((track) => track["fec"]?.["repairTrack"] === repair["name"]);
776
+ if (entry === void 0) return void 0;
777
+ }
778
+ const timescale = positiveInteger(entry["timescale"]);
779
+ const ms = positiveInteger(entry["groupDurationMs"]);
780
+ const groupDurationTicks = positiveInteger(entry["groupDurationTicks"]) || positiveInteger(timescale && ms * timescale % 1e3 === 0 ? ms * timescale / 1e3 : 0);
781
+ const fec = entry["fec"];
782
+ return {
783
+ codec: typeof entry["codec"] === "string" ? entry["codec"] : "",
784
+ timescale,
785
+ groupDurationTicks,
786
+ ...fec === void 0 || fec === null ? {} : {
787
+ fec: {
788
+ algorithm: typeof fec["algorithm"] === "string" ? fec["algorithm"] : "",
789
+ sourceSymbols: positiveInteger(fec["sourceSymbols"]),
790
+ repairSymbols: positiveInteger(fec["repairSymbols"]),
791
+ symbolSize: positiveInteger(fec["symbolSize"]),
792
+ interleaveDepthMs: positiveInteger(fec["interleaveDepthMs"])
793
+ }
794
+ }
795
+ };
796
+ }
404
797
  function multicastAuthKeyFor(resolved, kid, epoch) {
405
- return manifestKeyFor(resolved.keys, epoch, kid);
798
+ const signers = resolved.keys.filter((key) => key.firstEpoch <= epoch);
799
+ const signer = signers[signers.length - 1];
800
+ return signer?.kid === kid ? signer.publicKey : void 0;
406
801
  }
407
802
  export {
408
803
  DEFAULT_MANIFEST_TIMER_MS,
@@ -414,4 +809,9 @@ export {
414
809
  multicastAuthKeyFor,
415
810
  resolveMulticastAuthCatalog
416
811
  };
812
+ /*! Bundled license information:
813
+
814
+ @noble/hashes/esm/utils.js:
815
+ (*! noble-hashes - MIT License (c) 2022 Paul Miller (paulmillr.com) *)
816
+ */
417
817
  //# sourceMappingURL=multicast-auth-catalog.js.map