@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.
- package/README.md +2 -2
- package/dist/browser-runtime.js +3769 -364
- package/dist/browser-runtime.js.map +4 -4
- package/dist/cmcd-producer.d.ts +5 -1
- package/dist/cmcd-producer.d.ts.map +1 -1
- package/dist/cmcd-producer.js.map +2 -2
- package/dist/delivery-catalog.js +18 -2
- package/dist/delivery-catalog.js.map +2 -2
- package/dist/fec-manager.d.ts +21 -16
- package/dist/fec-manager.d.ts.map +1 -1
- package/dist/fec-manager.js +197 -80
- package/dist/fec-manager.js.map +3 -3
- package/dist/held-layer-admission.d.ts +58 -0
- package/dist/held-layer-admission.d.ts.map +1 -0
- package/dist/held-layer-admission.js +105 -0
- package/dist/held-layer-admission.js.map +7 -0
- package/dist/index.d.ts +1 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js.map +2 -2
- package/dist/mmtp-container-parser.d.ts +10 -0
- package/dist/mmtp-container-parser.d.ts.map +1 -1
- package/dist/mmtp-container-parser.js +31 -1
- package/dist/mmtp-container-parser.js.map +2 -2
- package/dist/mmtp-container-parser.no-modules.js +2713 -1024
- package/dist/mmtp-container-parser.no-modules.js.map +4 -4
- package/dist/mmtp-decode-pipeline.js +31 -1
- package/dist/mmtp-decode-pipeline.js.map +2 -2
- package/dist/mmtp-fec-session.d.ts +36 -3
- package/dist/mmtp-fec-session.d.ts.map +1 -1
- package/dist/mmtp-fec-session.js +114 -5
- package/dist/mmtp-fec-session.js.map +3 -3
- package/dist/mmtp-router.d.ts +96 -29
- package/dist/mmtp-router.d.ts.map +1 -1
- package/dist/mmtp-router.js +522 -205
- package/dist/mmtp-router.js.map +2 -2
- package/dist/multicast-auth-catalog.d.ts +10 -2
- package/dist/multicast-auth-catalog.d.ts.map +1 -1
- package/dist/multicast-auth-catalog.js +422 -22
- package/dist/multicast-auth-catalog.js.map +4 -4
- package/dist/multicast-manager.d.ts +78 -11
- package/dist/multicast-manager.d.ts.map +1 -1
- package/dist/multicast-manager.js +3663 -333
- package/dist/multicast-manager.js.map +4 -4
- package/dist/multicast-transport.d.ts +4 -1
- package/dist/multicast-transport.d.ts.map +1 -1
- package/dist/multicast-transport.js +20 -3
- package/dist/multicast-transport.js.map +2 -2
- package/dist/no-modules.d.ts +1 -2
- package/dist/no-modules.d.ts.map +1 -1
- package/dist/no-modules.js +2699 -1008
- package/dist/no-modules.js.map +4 -4
- package/dist/repair-fetch.d.ts +50 -10
- package/dist/repair-fetch.d.ts.map +1 -1
- package/dist/repair-fetch.js +62 -20
- package/dist/repair-fetch.js.map +2 -2
- package/dist/wasm-mmtp-container-parser.js +31 -1
- package/dist/wasm-mmtp-container-parser.js.map +2 -2
- package/package.json +7 -15
- package/src/cmcd-producer.ts +6 -1
- package/src/fec-manager.ts +147 -131
- package/src/held-layer-admission.ts +161 -0
- package/src/index.ts +6 -9
- package/src/mmtp-container-parser.ts +48 -0
- package/src/mmtp-fec-session.ts +76 -3
- package/src/mmtp-router.ts +637 -274
- package/src/multicast-auth-catalog.ts +81 -8
- package/src/multicast-manager.ts +274 -49
- package/src/multicast-transport.ts +6 -2
- package/src/no-modules.ts +1 -6
- package/src/repair-fetch.ts +154 -34
- package/test-vectors/catalog/negative/multicast-auth-padded-key.json +0 -1
- package/test-vectors/catalog/negative/multicast-auth-reused-track-format.json +0 -1
- package/test-vectors/catalog/negative/multicast-auth-root-dotted-key.json +0 -1
- package/test-vectors/catalog/negative/multicast-auth-trailing-pad-bits.json +0 -1
- package/test-vectors/repair-policy-v1.json +113 -0
- package/dist/manifest-auth-plan.d.ts +0 -31
- package/dist/manifest-auth-plan.d.ts.map +0 -1
- package/dist/manifest-auth-plan.js +0 -426
- package/dist/manifest-auth-plan.js.map +0 -7
- package/dist/source-auth.d.ts +0 -2
- package/dist/source-auth.d.ts.map +0 -1
- package/dist/source-auth.js +0 -3912
- package/dist/source-auth.js.map +0 -7
- package/src/manifest-auth-plan.ts +0 -55
- package/src/source-auth.ts +0 -1
- package/test-vectors/generate-source-auth-fixture.mjs +0 -114
- 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
|
|
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:
|
|
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,
|
|
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/
|
|
268
|
-
|
|
269
|
-
|
|
270
|
-
|
|
271
|
-
|
|
272
|
-
|
|
273
|
-
|
|
274
|
-
|
|
275
|
-
|
|
276
|
-
|
|
277
|
-
|
|
278
|
-
|
|
279
|
-
|
|
280
|
-
|
|
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
|
|
393
|
-
|
|
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
|
-
|
|
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
|