@blockcast/mmt-container 0.1.0-main.149f78a4adae
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 +432 -0
- package/dist/.build-stamp +0 -0
- package/dist/__tests__/test-utils.d.ts +71 -0
- package/dist/__tests__/test-utils.d.ts.map +1 -0
- package/dist/align.d.ts +148 -0
- package/dist/align.d.ts.map +1 -0
- package/dist/align.js +88 -0
- package/dist/align.js.map +7 -0
- package/dist/audio-init-parser.d.ts +66 -0
- package/dist/audio-init-parser.d.ts.map +1 -0
- package/dist/audio-init-parser.js +118 -0
- package/dist/audio-init-parser.js.map +7 -0
- package/dist/audio-ring-buffer.d.ts +50 -0
- package/dist/audio-ring-buffer.d.ts.map +1 -0
- package/dist/audio-ring-buffer.js +93 -0
- package/dist/audio-ring-buffer.js.map +7 -0
- package/dist/authored-timing.d.ts +32 -0
- package/dist/authored-timing.d.ts.map +1 -0
- package/dist/authored-timing.js +32 -0
- package/dist/authored-timing.js.map +7 -0
- package/dist/browser-runtime.js +17109 -0
- package/dist/browser-runtime.js.map +7 -0
- package/dist/carp-catalog.d.ts +318 -0
- package/dist/carp-catalog.d.ts.map +1 -0
- package/dist/carp-catalog.js +549 -0
- package/dist/carp-catalog.js.map +7 -0
- package/dist/catalog-fec-params.d.ts +82 -0
- package/dist/catalog-fec-params.d.ts.map +1 -0
- package/dist/catalog-fec-params.js +66 -0
- package/dist/catalog-fec-params.js.map +7 -0
- package/dist/catalog-network-source.d.ts +19 -0
- package/dist/catalog-network-source.d.ts.map +1 -0
- package/dist/catalog-network-source.js +22 -0
- package/dist/catalog-network-source.js.map +7 -0
- package/dist/catalog-validator.d.ts +18 -0
- package/dist/catalog-validator.d.ts.map +1 -0
- package/dist/catalog-validator.js +7747 -0
- package/dist/catalog-validator.js.map +7 -0
- package/dist/cmaf-block-assembler.d.ts +168 -0
- package/dist/cmaf-block-assembler.d.ts.map +1 -0
- package/dist/cmaf-block-assembler.js +1755 -0
- package/dist/cmaf-block-assembler.js.map +7 -0
- package/dist/cmaf-group-batcher.d.ts +38 -0
- package/dist/cmaf-group-batcher.d.ts.map +1 -0
- package/dist/cmaf-group-batcher.js +195 -0
- package/dist/cmaf-group-batcher.js.map +7 -0
- package/dist/cmcd-producer.d.ts +104 -0
- package/dist/cmcd-producer.d.ts.map +1 -0
- package/dist/cmcd-producer.js +207 -0
- package/dist/cmcd-producer.js.map +7 -0
- package/dist/codec-utils.d.ts +235 -0
- package/dist/codec-utils.d.ts.map +1 -0
- package/dist/codec-utils.js +1225 -0
- package/dist/codec-utils.js.map +7 -0
- package/dist/fec-codec.d.ts +32 -0
- package/dist/fec-codec.d.ts.map +1 -0
- package/dist/fec-codec.js +47 -0
- package/dist/fec-codec.js.map +7 -0
- package/dist/fec-manager.d.ts +266 -0
- package/dist/fec-manager.d.ts.map +1 -0
- package/dist/fec-manager.js +1447 -0
- package/dist/fec-manager.js.map +7 -0
- package/dist/fec-starvation-detector.d.ts +59 -0
- package/dist/fec-starvation-detector.d.ts.map +1 -0
- package/dist/fec-starvation-detector.js +75 -0
- package/dist/fec-starvation-detector.js.map +7 -0
- package/dist/fec-worker-setup.d.ts +76 -0
- package/dist/fec-worker-setup.d.ts.map +1 -0
- package/dist/fec-worker-setup.js +603 -0
- package/dist/fec-worker-setup.js.map +7 -0
- package/dist/fmp4-completion.d.ts +30 -0
- package/dist/fmp4-completion.d.ts.map +1 -0
- package/dist/fmp4-completion.js +21 -0
- package/dist/fmp4-completion.js.map +7 -0
- package/dist/fmp4-reader.d.ts +37 -0
- package/dist/fmp4-reader.d.ts.map +1 -0
- package/dist/fmp4-reader.js +100 -0
- package/dist/fmp4-reader.js.map +7 -0
- package/dist/index.d.ts +47 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +330 -0
- package/dist/index.js.map +7 -0
- package/dist/iso-bmff-timing.d.ts +47 -0
- package/dist/iso-bmff-timing.d.ts.map +1 -0
- package/dist/iso-bmff-timing.js +526 -0
- package/dist/iso-bmff-timing.js.map +7 -0
- package/dist/loc.d.ts +68 -0
- package/dist/loc.d.ts.map +1 -0
- package/dist/loc.js +143 -0
- package/dist/loc.js.map +7 -0
- package/dist/manifest-auth-plan.d.ts +30 -0
- package/dist/manifest-auth-plan.d.ts.map +1 -0
- package/dist/manifest-auth-plan.js +1267 -0
- package/dist/manifest-auth-plan.js.map +7 -0
- package/dist/media-router.d.ts +338 -0
- package/dist/media-router.d.ts.map +1 -0
- package/dist/media-router.js +802 -0
- package/dist/media-router.js.map +7 -0
- package/dist/mfu-reassembler.d.ts +264 -0
- package/dist/mfu-reassembler.d.ts.map +1 -0
- package/dist/mfu-reassembler.js +2668 -0
- package/dist/mfu-reassembler.js.map +7 -0
- package/dist/mfu-reassembly-policy.d.ts +24 -0
- package/dist/mfu-reassembly-policy.d.ts.map +1 -0
- package/dist/mfu-reassembly-policy.js +99 -0
- package/dist/mfu-reassembly-policy.js.map +7 -0
- package/dist/mmtp-container-parser.d.ts +304 -0
- package/dist/mmtp-container-parser.d.ts.map +1 -0
- package/dist/mmtp-container-parser.js +5378 -0
- package/dist/mmtp-container-parser.js.map +7 -0
- package/dist/mmtp-container-parser.no-modules.js +7853 -0
- package/dist/mmtp-container-parser.no-modules.js.map +7 -0
- package/dist/mmtp-decode-pipeline.d.ts +96 -0
- package/dist/mmtp-decode-pipeline.d.ts.map +1 -0
- package/dist/mmtp-decode-pipeline.js +5589 -0
- package/dist/mmtp-decode-pipeline.js.map +7 -0
- package/dist/mmtp-router.d.ts +383 -0
- package/dist/mmtp-router.d.ts.map +1 -0
- package/dist/mmtp-router.js +8384 -0
- package/dist/mmtp-router.js.map +7 -0
- package/dist/mmtp-to-cmaf.d.ts +166 -0
- package/dist/mmtp-to-cmaf.d.ts.map +1 -0
- package/dist/mmtp-to-cmaf.js +781 -0
- package/dist/mmtp-to-cmaf.js.map +7 -0
- package/dist/multicast-auth-catalog.d.ts +115 -0
- package/dist/multicast-auth-catalog.d.ts.map +1 -0
- package/dist/multicast-auth-catalog.js +202 -0
- package/dist/multicast-auth-catalog.js.map +7 -0
- package/dist/multicast-input.d.ts +107 -0
- package/dist/multicast-input.d.ts.map +1 -0
- package/dist/multicast-input.js +256 -0
- package/dist/multicast-input.js.map +7 -0
- package/dist/multicast-manager.d.ts +330 -0
- package/dist/multicast-manager.d.ts.map +1 -0
- package/dist/multicast-manager.js +11032 -0
- package/dist/multicast-manager.js.map +7 -0
- package/dist/multicast-transport.d.ts +62 -0
- package/dist/multicast-transport.d.ts.map +1 -0
- package/dist/multicast-transport.js +338 -0
- package/dist/multicast-transport.js.map +7 -0
- package/dist/multicast-unwrap.d.ts +57 -0
- package/dist/multicast-unwrap.d.ts.map +1 -0
- package/dist/multicast-unwrap.js +384 -0
- package/dist/multicast-unwrap.js.map +7 -0
- package/dist/no-modules.d.ts +9 -0
- package/dist/no-modules.d.ts.map +1 -0
- package/dist/no-modules.js +7819 -0
- package/dist/no-modules.js.map +7 -0
- package/dist/phase14-catalog-override.d.ts +126 -0
- package/dist/phase14-catalog-override.d.ts.map +1 -0
- package/dist/phase14-catalog-override.js +155 -0
- package/dist/phase14-catalog-override.js.map +7 -0
- package/dist/repair-fetch.d.ts +58 -0
- package/dist/repair-fetch.d.ts.map +1 -0
- package/dist/repair-fetch.js +117 -0
- package/dist/repair-fetch.js.map +7 -0
- package/dist/sample-combiner.d.ts +182 -0
- package/dist/sample-combiner.d.ts.map +1 -0
- package/dist/sample-combiner.js +571 -0
- package/dist/sample-combiner.js.map +7 -0
- package/dist/signaling.d.ts +29 -0
- package/dist/signaling.d.ts.map +1 -0
- package/dist/signaling.js +232 -0
- package/dist/signaling.js.map +7 -0
- package/dist/source-auth.d.ts +2 -0
- package/dist/source-auth.d.ts.map +1 -0
- package/dist/source-auth.js +1220 -0
- package/dist/source-auth.js.map +7 -0
- package/dist/switching-set-alignment.d.ts +61 -0
- package/dist/switching-set-alignment.d.ts.map +1 -0
- package/dist/switching-set-alignment.js +85 -0
- package/dist/switching-set-alignment.js.map +7 -0
- package/dist/timestamp-codec.d.ts +34 -0
- package/dist/timestamp-codec.d.ts.map +1 -0
- package/dist/timestamp-codec.js +456 -0
- package/dist/timestamp-codec.js.map +7 -0
- package/dist/track-pipeline-setup.d.ts +72 -0
- package/dist/track-pipeline-setup.d.ts.map +1 -0
- package/dist/track-pipeline-setup.js +306 -0
- package/dist/track-pipeline-setup.js.map +7 -0
- package/dist/track-pipeline.d.ts +121 -0
- package/dist/track-pipeline.d.ts.map +1 -0
- package/dist/track-pipeline.js +229 -0
- package/dist/track-pipeline.js.map +7 -0
- package/dist/track-session.d.ts +269 -0
- package/dist/track-session.d.ts.map +1 -0
- package/dist/track-session.js +597 -0
- package/dist/track-session.js.map +7 -0
- package/dist/transport-pool.d.ts +69 -0
- package/dist/transport-pool.d.ts.map +1 -0
- package/dist/transport-pool.js +88 -0
- package/dist/transport-pool.js.map +7 -0
- package/dist/wasm-mfu-reassembler.d.ts +81 -0
- package/dist/wasm-mfu-reassembler.d.ts.map +1 -0
- package/dist/wasm-mfu-reassembler.js +1915 -0
- package/dist/wasm-mfu-reassembler.js.map +7 -0
- package/dist/wasm-mmtp-container-parser.d.ts +10 -0
- package/dist/wasm-mmtp-container-parser.d.ts.map +1 -0
- package/dist/wasm-mmtp-container-parser.js +5635 -0
- package/dist/wasm-mmtp-container-parser.js.map +7 -0
- package/node_modules/@blockcast/fec-worker/README.md +213 -0
- package/node_modules/@blockcast/fec-worker/dist/.build-stamp +0 -0
- package/node_modules/@blockcast/fec-worker/dist/fec-worker-client.d.ts +80 -0
- package/node_modules/@blockcast/fec-worker/dist/fec-worker-client.d.ts.map +1 -0
- package/node_modules/@blockcast/fec-worker/dist/fec-worker-client.js +270 -0
- package/node_modules/@blockcast/fec-worker/dist/fec-worker-client.js.map +1 -0
- package/node_modules/@blockcast/fec-worker/dist/fec-worker-types.d.ts +252 -0
- package/node_modules/@blockcast/fec-worker/dist/fec-worker-types.d.ts.map +1 -0
- package/node_modules/@blockcast/fec-worker/dist/fec-worker-types.js +11 -0
- package/node_modules/@blockcast/fec-worker/dist/fec-worker-types.js.map +1 -0
- package/node_modules/@blockcast/fec-worker/dist/fec-worker.d.ts +14 -0
- package/node_modules/@blockcast/fec-worker/dist/fec-worker.d.ts.map +1 -0
- package/node_modules/@blockcast/fec-worker/dist/fec-worker.js +565 -0
- package/node_modules/@blockcast/fec-worker/dist/fec-worker.js.map +7 -0
- package/node_modules/@blockcast/fec-worker/dist/index.d.ts +10 -0
- package/node_modules/@blockcast/fec-worker/dist/index.d.ts.map +1 -0
- package/node_modules/@blockcast/fec-worker/dist/index.js +8 -0
- package/node_modules/@blockcast/fec-worker/dist/index.js.map +1 -0
- package/node_modules/@blockcast/fec-worker/dist/shred-fec-worker.d.ts +20 -0
- package/node_modules/@blockcast/fec-worker/dist/shred-fec-worker.d.ts.map +1 -0
- package/node_modules/@blockcast/fec-worker/dist/shred-fec-worker.js +349 -0
- package/node_modules/@blockcast/fec-worker/dist/shred-fec-worker.js.map +7 -0
- package/node_modules/@blockcast/fec-worker/dist/shred-worker-client.d.ts +104 -0
- package/node_modules/@blockcast/fec-worker/dist/shred-worker-client.d.ts.map +1 -0
- package/node_modules/@blockcast/fec-worker/dist/shred-worker-client.js +181 -0
- package/node_modules/@blockcast/fec-worker/dist/shred-worker-client.js.map +1 -0
- package/node_modules/@blockcast/fec-worker/dist/shred-worker-types.d.ts +179 -0
- package/node_modules/@blockcast/fec-worker/dist/shred-worker-types.d.ts.map +1 -0
- package/node_modules/@blockcast/fec-worker/dist/shred-worker-types.js +47 -0
- package/node_modules/@blockcast/fec-worker/dist/shred-worker-types.js.map +1 -0
- package/node_modules/@blockcast/fec-worker/dist/transfer.d.ts +9 -0
- package/node_modules/@blockcast/fec-worker/dist/transfer.d.ts.map +1 -0
- package/node_modules/@blockcast/fec-worker/dist/transfer.js +13 -0
- package/node_modules/@blockcast/fec-worker/dist/transfer.js.map +1 -0
- package/node_modules/@blockcast/fec-worker/package.json +59 -0
- package/node_modules/@blockcast/fec-worker/src/fec-worker-client.ts +309 -0
- package/node_modules/@blockcast/fec-worker/src/fec-worker-types.ts +268 -0
- package/node_modules/@blockcast/fec-worker/src/fec-worker.ts +1048 -0
- package/node_modules/@blockcast/fec-worker/src/index.ts +32 -0
- package/node_modules/@blockcast/fec-worker/src/shred-fec-worker.ts +558 -0
- package/node_modules/@blockcast/fec-worker/src/shred-worker-client.ts +222 -0
- package/node_modules/@blockcast/fec-worker/src/shred-worker-types.ts +194 -0
- package/node_modules/@blockcast/fec-worker/src/transfer.ts +12 -0
- package/node_modules/@blockcast/mmt-alta-parse/README.md +181 -0
- package/node_modules/@blockcast/mmt-alta-parse/dist/.build-stamp +0 -0
- package/node_modules/@blockcast/mmt-alta-parse/dist/index.d.ts +57 -0
- package/node_modules/@blockcast/mmt-alta-parse/dist/index.d.ts.map +1 -0
- package/node_modules/@blockcast/mmt-alta-parse/dist/index.js +115 -0
- package/node_modules/@blockcast/mmt-alta-parse/dist/index.js.map +1 -0
- package/node_modules/@blockcast/mmt-alta-parse/package.json +50 -0
- package/node_modules/@blockcast/mmt-alta-parse/src/index.ts +136 -0
- package/node_modules/@blockcast/mmt-base/README.md +120 -0
- package/node_modules/@blockcast/mmt-base/dist/.build-stamp +0 -0
- package/node_modules/@blockcast/mmt-base/dist/index.d.ts +2 -0
- package/node_modules/@blockcast/mmt-base/dist/index.d.ts.map +1 -0
- package/node_modules/@blockcast/mmt-base/dist/index.js +2 -0
- package/node_modules/@blockcast/mmt-base/dist/index.js.map +1 -0
- package/node_modules/@blockcast/mmt-base/dist/mmtp.d.ts +275 -0
- package/node_modules/@blockcast/mmt-base/dist/mmtp.d.ts.map +1 -0
- package/node_modules/@blockcast/mmt-base/dist/mmtp.js +644 -0
- package/node_modules/@blockcast/mmt-base/dist/mmtp.js.map +1 -0
- package/node_modules/@blockcast/mmt-base/package.json +49 -0
- package/node_modules/@blockcast/mmt-base/src/index.ts +1 -0
- package/node_modules/@blockcast/mmt-base/src/mmtp.ts +898 -0
- package/node_modules/@blockcast/mmt-fec/README.md +270 -0
- package/node_modules/@blockcast/mmt-fec/dist/.build-stamp +0 -0
- package/node_modules/@blockcast/mmt-fec/dist/block-manager.d.ts +80 -0
- package/node_modules/@blockcast/mmt-fec/dist/block-manager.d.ts.map +1 -0
- package/node_modules/@blockcast/mmt-fec/dist/block-manager.js +294 -0
- package/node_modules/@blockcast/mmt-fec/dist/block-manager.js.map +1 -0
- package/node_modules/@blockcast/mmt-fec/dist/block-processor.d.ts +72 -0
- package/node_modules/@blockcast/mmt-fec/dist/block-processor.d.ts.map +1 -0
- package/node_modules/@blockcast/mmt-fec/dist/block-processor.js +192 -0
- package/node_modules/@blockcast/mmt-fec/dist/block-processor.js.map +1 -0
- package/node_modules/@blockcast/mmt-fec/dist/cmaf-recovery.d.ts +46 -0
- package/node_modules/@blockcast/mmt-fec/dist/cmaf-recovery.d.ts.map +1 -0
- package/node_modules/@blockcast/mmt-fec/dist/cmaf-recovery.js +96 -0
- package/node_modules/@blockcast/mmt-fec/dist/cmaf-recovery.js.map +1 -0
- package/node_modules/@blockcast/mmt-fec/dist/cmaf-symbols.d.ts +33 -0
- package/node_modules/@blockcast/mmt-fec/dist/cmaf-symbols.d.ts.map +1 -0
- package/node_modules/@blockcast/mmt-fec/dist/cmaf-symbols.js +57 -0
- package/node_modules/@blockcast/mmt-fec/dist/cmaf-symbols.js.map +1 -0
- package/node_modules/@blockcast/mmt-fec/dist/fec-block-mapper.d.ts +185 -0
- package/node_modules/@blockcast/mmt-fec/dist/fec-block-mapper.d.ts.map +1 -0
- package/node_modules/@blockcast/mmt-fec/dist/fec-block-mapper.js +273 -0
- package/node_modules/@blockcast/mmt-fec/dist/fec-block-mapper.js.map +1 -0
- package/node_modules/@blockcast/mmt-fec/dist/index.d.ts +22 -0
- package/node_modules/@blockcast/mmt-fec/dist/index.d.ts.map +1 -0
- package/node_modules/@blockcast/mmt-fec/dist/index.js +22 -0
- package/node_modules/@blockcast/mmt-fec/dist/index.js.map +1 -0
- package/node_modules/@blockcast/mmt-fec/dist/loc-symbols.d.ts +20 -0
- package/node_modules/@blockcast/mmt-fec/dist/loc-symbols.d.ts.map +1 -0
- package/node_modules/@blockcast/mmt-fec/dist/loc-symbols.js +28 -0
- package/node_modules/@blockcast/mmt-fec/dist/loc-symbols.js.map +1 -0
- package/node_modules/@blockcast/mmt-fec/dist/oti.d.ts +174 -0
- package/node_modules/@blockcast/mmt-fec/dist/oti.d.ts.map +1 -0
- package/node_modules/@blockcast/mmt-fec/dist/oti.js +256 -0
- package/node_modules/@blockcast/mmt-fec/dist/oti.js.map +1 -0
- package/node_modules/@blockcast/mmt-fec/dist/reorder-buffer.d.ts +41 -0
- package/node_modules/@blockcast/mmt-fec/dist/reorder-buffer.d.ts.map +1 -0
- package/node_modules/@blockcast/mmt-fec/dist/reorder-buffer.js +81 -0
- package/node_modules/@blockcast/mmt-fec/dist/reorder-buffer.js.map +1 -0
- package/node_modules/@blockcast/mmt-fec/node_modules/@blockcast/mmt-alta-parse/README.md +181 -0
- package/node_modules/@blockcast/mmt-fec/node_modules/@blockcast/mmt-alta-parse/dist/.build-stamp +0 -0
- package/node_modules/@blockcast/mmt-fec/node_modules/@blockcast/mmt-alta-parse/dist/index.d.ts +57 -0
- package/node_modules/@blockcast/mmt-fec/node_modules/@blockcast/mmt-alta-parse/dist/index.d.ts.map +1 -0
- package/node_modules/@blockcast/mmt-fec/node_modules/@blockcast/mmt-alta-parse/dist/index.js +115 -0
- package/node_modules/@blockcast/mmt-fec/node_modules/@blockcast/mmt-alta-parse/dist/index.js.map +1 -0
- package/node_modules/@blockcast/mmt-fec/node_modules/@blockcast/mmt-alta-parse/package.json +50 -0
- package/node_modules/@blockcast/mmt-fec/node_modules/@blockcast/mmt-alta-parse/src/index.ts +136 -0
- package/node_modules/@blockcast/mmt-fec/node_modules/@blockcast/mmt-base/README.md +120 -0
- package/node_modules/@blockcast/mmt-fec/node_modules/@blockcast/mmt-base/dist/.build-stamp +0 -0
- package/node_modules/@blockcast/mmt-fec/node_modules/@blockcast/mmt-base/dist/index.d.ts +2 -0
- package/node_modules/@blockcast/mmt-fec/node_modules/@blockcast/mmt-base/dist/index.d.ts.map +1 -0
- package/node_modules/@blockcast/mmt-fec/node_modules/@blockcast/mmt-base/dist/index.js +2 -0
- package/node_modules/@blockcast/mmt-fec/node_modules/@blockcast/mmt-base/dist/index.js.map +1 -0
- package/node_modules/@blockcast/mmt-fec/node_modules/@blockcast/mmt-base/dist/mmtp.d.ts +275 -0
- package/node_modules/@blockcast/mmt-fec/node_modules/@blockcast/mmt-base/dist/mmtp.d.ts.map +1 -0
- package/node_modules/@blockcast/mmt-fec/node_modules/@blockcast/mmt-base/dist/mmtp.js +644 -0
- package/node_modules/@blockcast/mmt-fec/node_modules/@blockcast/mmt-base/dist/mmtp.js.map +1 -0
- package/node_modules/@blockcast/mmt-fec/node_modules/@blockcast/mmt-base/package.json +49 -0
- package/node_modules/@blockcast/mmt-fec/node_modules/@blockcast/mmt-base/src/index.ts +1 -0
- package/node_modules/@blockcast/mmt-fec/node_modules/@blockcast/mmt-base/src/mmtp.ts +898 -0
- package/node_modules/@blockcast/mmt-fec/package.json +79 -0
- package/node_modules/@blockcast/mmt-fec/src/block-manager.ts +369 -0
- package/node_modules/@blockcast/mmt-fec/src/block-processor.ts +277 -0
- package/node_modules/@blockcast/mmt-fec/src/cmaf-recovery.ts +127 -0
- package/node_modules/@blockcast/mmt-fec/src/cmaf-symbols.ts +68 -0
- package/node_modules/@blockcast/mmt-fec/src/fec-block-mapper.ts +332 -0
- package/node_modules/@blockcast/mmt-fec/src/index.ts +77 -0
- package/node_modules/@blockcast/mmt-fec/src/loc-symbols.ts +34 -0
- package/node_modules/@blockcast/mmt-fec/src/oti.ts +319 -0
- package/node_modules/@blockcast/mmt-fec/src/reorder-buffer.ts +101 -0
- package/node_modules/@blockcast/mmt-manifest-verify/dist/.build-stamp +0 -0
- package/node_modules/@blockcast/mmt-manifest-verify/dist/admission.d.ts +28 -0
- package/node_modules/@blockcast/mmt-manifest-verify/dist/admission.d.ts.map +1 -0
- package/node_modules/@blockcast/mmt-manifest-verify/dist/admission.js +128 -0
- package/node_modules/@blockcast/mmt-manifest-verify/dist/admission.js.map +1 -0
- package/node_modules/@blockcast/mmt-manifest-verify/dist/index.d.ts +4 -0
- package/node_modules/@blockcast/mmt-manifest-verify/dist/index.d.ts.map +1 -0
- package/node_modules/@blockcast/mmt-manifest-verify/dist/index.js +4 -0
- package/node_modules/@blockcast/mmt-manifest-verify/dist/index.js.map +1 -0
- package/node_modules/@blockcast/mmt-manifest-verify/dist/source-auth.d.ts +37 -0
- package/node_modules/@blockcast/mmt-manifest-verify/dist/source-auth.d.ts.map +1 -0
- package/node_modules/@blockcast/mmt-manifest-verify/dist/source-auth.js +179 -0
- package/node_modules/@blockcast/mmt-manifest-verify/dist/source-auth.js.map +1 -0
- package/node_modules/@blockcast/mmt-manifest-verify/dist/verifier.d.ts +90 -0
- package/node_modules/@blockcast/mmt-manifest-verify/dist/verifier.d.ts.map +1 -0
- package/node_modules/@blockcast/mmt-manifest-verify/dist/verifier.js +462 -0
- package/node_modules/@blockcast/mmt-manifest-verify/dist/verifier.js.map +1 -0
- package/node_modules/@blockcast/mmt-manifest-verify/package.json +45 -0
- package/node_modules/@blockcast/mmt-manifest-verify/src/admission.ts +171 -0
- package/node_modules/@blockcast/mmt-manifest-verify/src/index.ts +3 -0
- package/node_modules/@blockcast/mmt-manifest-verify/src/source-auth.ts +230 -0
- package/node_modules/@blockcast/mmt-manifest-verify/src/verifier.ts +636 -0
- package/node_modules/@noble/hashes/LICENSE +21 -0
- package/node_modules/@noble/hashes/README.md +521 -0
- package/node_modules/@noble/hashes/_assert.d.ts +17 -0
- package/node_modules/@noble/hashes/_assert.d.ts.map +1 -0
- package/node_modules/@noble/hashes/_assert.js +18 -0
- package/node_modules/@noble/hashes/_assert.js.map +1 -0
- package/node_modules/@noble/hashes/_blake.d.ts +14 -0
- package/node_modules/@noble/hashes/_blake.d.ts.map +1 -0
- package/node_modules/@noble/hashes/_blake.js +50 -0
- package/node_modules/@noble/hashes/_blake.js.map +1 -0
- package/node_modules/@noble/hashes/_md.d.ts +51 -0
- package/node_modules/@noble/hashes/_md.d.ts.map +1 -0
- package/node_modules/@noble/hashes/_md.js +162 -0
- package/node_modules/@noble/hashes/_md.js.map +1 -0
- package/node_modules/@noble/hashes/_u64.d.ts +55 -0
- package/node_modules/@noble/hashes/_u64.d.ts.map +1 -0
- package/node_modules/@noble/hashes/_u64.js +90 -0
- package/node_modules/@noble/hashes/_u64.js.map +1 -0
- package/node_modules/@noble/hashes/argon2.d.ts +32 -0
- package/node_modules/@noble/hashes/argon2.d.ts.map +1 -0
- package/node_modules/@noble/hashes/argon2.js +401 -0
- package/node_modules/@noble/hashes/argon2.js.map +1 -0
- package/node_modules/@noble/hashes/blake1.d.ts +106 -0
- package/node_modules/@noble/hashes/blake1.d.ts.map +1 -0
- package/node_modules/@noble/hashes/blake1.js +459 -0
- package/node_modules/@noble/hashes/blake1.js.map +1 -0
- package/node_modules/@noble/hashes/blake2.d.ts +116 -0
- package/node_modules/@noble/hashes/blake2.d.ts.map +1 -0
- package/node_modules/@noble/hashes/blake2.js +420 -0
- package/node_modules/@noble/hashes/blake2.js.map +1 -0
- package/node_modules/@noble/hashes/blake2b.d.ts +11 -0
- package/node_modules/@noble/hashes/blake2b.d.ts.map +1 -0
- package/node_modules/@noble/hashes/blake2b.js +14 -0
- package/node_modules/@noble/hashes/blake2b.js.map +1 -0
- package/node_modules/@noble/hashes/blake2s.d.ts +20 -0
- package/node_modules/@noble/hashes/blake2s.d.ts.map +1 -0
- package/node_modules/@noble/hashes/blake2s.js +24 -0
- package/node_modules/@noble/hashes/blake2s.js.map +1 -0
- package/node_modules/@noble/hashes/blake3.d.ts +54 -0
- package/node_modules/@noble/hashes/blake3.d.ts.map +1 -0
- package/node_modules/@noble/hashes/blake3.js +255 -0
- package/node_modules/@noble/hashes/blake3.js.map +1 -0
- package/node_modules/@noble/hashes/crypto.d.ts +2 -0
- package/node_modules/@noble/hashes/crypto.d.ts.map +1 -0
- package/node_modules/@noble/hashes/crypto.js +5 -0
- package/node_modules/@noble/hashes/crypto.js.map +1 -0
- package/node_modules/@noble/hashes/cryptoNode.d.ts +2 -0
- package/node_modules/@noble/hashes/cryptoNode.d.ts.map +1 -0
- package/node_modules/@noble/hashes/cryptoNode.js +18 -0
- package/node_modules/@noble/hashes/cryptoNode.js.map +1 -0
- package/node_modules/@noble/hashes/eskdf.d.ts +47 -0
- package/node_modules/@noble/hashes/eskdf.d.ts.map +1 -0
- package/node_modules/@noble/hashes/eskdf.js +166 -0
- package/node_modules/@noble/hashes/eskdf.js.map +1 -0
- package/node_modules/@noble/hashes/esm/_assert.d.ts +17 -0
- package/node_modules/@noble/hashes/esm/_assert.d.ts.map +1 -0
- package/node_modules/@noble/hashes/esm/_assert.js +15 -0
- package/node_modules/@noble/hashes/esm/_assert.js.map +1 -0
- package/node_modules/@noble/hashes/esm/_blake.d.ts +14 -0
- package/node_modules/@noble/hashes/esm/_blake.d.ts.map +1 -0
- package/node_modules/@noble/hashes/esm/_blake.js +45 -0
- package/node_modules/@noble/hashes/esm/_blake.js.map +1 -0
- package/node_modules/@noble/hashes/esm/_md.d.ts +51 -0
- package/node_modules/@noble/hashes/esm/_md.d.ts.map +1 -0
- package/node_modules/@noble/hashes/esm/_md.js +155 -0
- package/node_modules/@noble/hashes/esm/_md.js.map +1 -0
- package/node_modules/@noble/hashes/esm/_u64.d.ts +55 -0
- package/node_modules/@noble/hashes/esm/_u64.d.ts.map +1 -0
- package/node_modules/@noble/hashes/esm/_u64.js +67 -0
- package/node_modules/@noble/hashes/esm/_u64.js.map +1 -0
- package/node_modules/@noble/hashes/esm/argon2.d.ts +32 -0
- package/node_modules/@noble/hashes/esm/argon2.d.ts.map +1 -0
- package/node_modules/@noble/hashes/esm/argon2.js +392 -0
- package/node_modules/@noble/hashes/esm/argon2.js.map +1 -0
- package/node_modules/@noble/hashes/esm/blake1.d.ts +106 -0
- package/node_modules/@noble/hashes/esm/blake1.d.ts.map +1 -0
- package/node_modules/@noble/hashes/esm/blake1.js +452 -0
- package/node_modules/@noble/hashes/esm/blake1.js.map +1 -0
- package/node_modules/@noble/hashes/esm/blake2.d.ts +116 -0
- package/node_modules/@noble/hashes/esm/blake2.d.ts.map +1 -0
- package/node_modules/@noble/hashes/esm/blake2.js +413 -0
- package/node_modules/@noble/hashes/esm/blake2.js.map +1 -0
- package/node_modules/@noble/hashes/esm/blake2b.d.ts +11 -0
- package/node_modules/@noble/hashes/esm/blake2b.d.ts.map +1 -0
- package/node_modules/@noble/hashes/esm/blake2b.js +11 -0
- package/node_modules/@noble/hashes/esm/blake2b.js.map +1 -0
- package/node_modules/@noble/hashes/esm/blake2s.d.ts +20 -0
- package/node_modules/@noble/hashes/esm/blake2s.d.ts.map +1 -0
- package/node_modules/@noble/hashes/esm/blake2s.js +21 -0
- package/node_modules/@noble/hashes/esm/blake2s.js.map +1 -0
- package/node_modules/@noble/hashes/esm/blake3.d.ts +54 -0
- package/node_modules/@noble/hashes/esm/blake3.d.ts.map +1 -0
- package/node_modules/@noble/hashes/esm/blake3.js +251 -0
- package/node_modules/@noble/hashes/esm/blake3.js.map +1 -0
- package/node_modules/@noble/hashes/esm/crypto.d.ts +2 -0
- package/node_modules/@noble/hashes/esm/crypto.d.ts.map +1 -0
- package/node_modules/@noble/hashes/esm/crypto.js +2 -0
- package/node_modules/@noble/hashes/esm/crypto.js.map +1 -0
- package/node_modules/@noble/hashes/esm/cryptoNode.d.ts +2 -0
- package/node_modules/@noble/hashes/esm/cryptoNode.d.ts.map +1 -0
- package/node_modules/@noble/hashes/esm/cryptoNode.js +15 -0
- package/node_modules/@noble/hashes/esm/cryptoNode.js.map +1 -0
- package/node_modules/@noble/hashes/esm/eskdf.d.ts +47 -0
- package/node_modules/@noble/hashes/esm/eskdf.d.ts.map +1 -0
- package/node_modules/@noble/hashes/esm/eskdf.js +160 -0
- package/node_modules/@noble/hashes/esm/eskdf.js.map +1 -0
- package/node_modules/@noble/hashes/esm/hkdf.d.ts +36 -0
- package/node_modules/@noble/hashes/esm/hkdf.d.ts.map +1 -0
- package/node_modules/@noble/hashes/esm/hkdf.js +82 -0
- package/node_modules/@noble/hashes/esm/hkdf.js.map +1 -0
- package/node_modules/@noble/hashes/esm/hmac.d.ts +35 -0
- package/node_modules/@noble/hashes/esm/hmac.d.ts.map +1 -0
- package/node_modules/@noble/hashes/esm/hmac.js +86 -0
- package/node_modules/@noble/hashes/esm/hmac.js.map +1 -0
- package/node_modules/@noble/hashes/esm/index.d.ts +2 -0
- package/node_modules/@noble/hashes/esm/index.d.ts.map +1 -0
- package/node_modules/@noble/hashes/esm/index.js +33 -0
- package/node_modules/@noble/hashes/esm/index.js.map +1 -0
- package/node_modules/@noble/hashes/esm/legacy.d.ts +71 -0
- package/node_modules/@noble/hashes/esm/legacy.d.ts.map +1 -0
- package/node_modules/@noble/hashes/esm/legacy.js +281 -0
- package/node_modules/@noble/hashes/esm/legacy.js.map +1 -0
- package/node_modules/@noble/hashes/esm/package.json +10 -0
- package/node_modules/@noble/hashes/esm/pbkdf2.d.ts +23 -0
- package/node_modules/@noble/hashes/esm/pbkdf2.d.ts.map +1 -0
- package/node_modules/@noble/hashes/esm/pbkdf2.js +97 -0
- package/node_modules/@noble/hashes/esm/pbkdf2.js.map +1 -0
- package/node_modules/@noble/hashes/esm/ripemd160.d.ts +13 -0
- package/node_modules/@noble/hashes/esm/ripemd160.d.ts.map +1 -0
- package/node_modules/@noble/hashes/esm/ripemd160.js +13 -0
- package/node_modules/@noble/hashes/esm/ripemd160.js.map +1 -0
- package/node_modules/@noble/hashes/esm/scrypt.d.ts +34 -0
- package/node_modules/@noble/hashes/esm/scrypt.d.ts.map +1 -0
- package/node_modules/@noble/hashes/esm/scrypt.js +228 -0
- package/node_modules/@noble/hashes/esm/scrypt.js.map +1 -0
- package/node_modules/@noble/hashes/esm/sha1.d.ts +11 -0
- package/node_modules/@noble/hashes/esm/sha1.d.ts.map +1 -0
- package/node_modules/@noble/hashes/esm/sha1.js +11 -0
- package/node_modules/@noble/hashes/esm/sha1.js.map +1 -0
- package/node_modules/@noble/hashes/esm/sha2.d.ts +159 -0
- package/node_modules/@noble/hashes/esm/sha2.d.ts.map +1 -0
- package/node_modules/@noble/hashes/esm/sha2.js +375 -0
- package/node_modules/@noble/hashes/esm/sha2.js.map +1 -0
- package/node_modules/@noble/hashes/esm/sha256.d.ts +20 -0
- package/node_modules/@noble/hashes/esm/sha256.d.ts.map +1 -0
- package/node_modules/@noble/hashes/esm/sha256.js +20 -0
- package/node_modules/@noble/hashes/esm/sha256.js.map +1 -0
- package/node_modules/@noble/hashes/esm/sha3-addons.d.ts +142 -0
- package/node_modules/@noble/hashes/esm/sha3-addons.d.ts.map +1 -0
- package/node_modules/@noble/hashes/esm/sha3-addons.js +393 -0
- package/node_modules/@noble/hashes/esm/sha3-addons.js.map +1 -0
- package/node_modules/@noble/hashes/esm/sha3.d.ts +53 -0
- package/node_modules/@noble/hashes/esm/sha3.d.ts.map +1 -0
- package/node_modules/@noble/hashes/esm/sha3.js +234 -0
- package/node_modules/@noble/hashes/esm/sha3.js.map +1 -0
- package/node_modules/@noble/hashes/esm/sha512.d.ts +26 -0
- package/node_modules/@noble/hashes/esm/sha512.d.ts.map +1 -0
- package/node_modules/@noble/hashes/esm/sha512.js +26 -0
- package/node_modules/@noble/hashes/esm/sha512.js.map +1 -0
- package/node_modules/@noble/hashes/esm/utils.d.ts +161 -0
- package/node_modules/@noble/hashes/esm/utils.d.ts.map +1 -0
- package/node_modules/@noble/hashes/esm/utils.js +281 -0
- package/node_modules/@noble/hashes/esm/utils.js.map +1 -0
- package/node_modules/@noble/hashes/hkdf.d.ts +36 -0
- package/node_modules/@noble/hashes/hkdf.d.ts.map +1 -0
- package/node_modules/@noble/hashes/hkdf.js +88 -0
- package/node_modules/@noble/hashes/hkdf.js.map +1 -0
- package/node_modules/@noble/hashes/hmac.d.ts +35 -0
- package/node_modules/@noble/hashes/hmac.d.ts.map +1 -0
- package/node_modules/@noble/hashes/hmac.js +91 -0
- package/node_modules/@noble/hashes/hmac.js.map +1 -0
- package/node_modules/@noble/hashes/index.d.ts +1 -0
- package/node_modules/@noble/hashes/index.d.ts.map +1 -0
- package/node_modules/@noble/hashes/index.js +33 -0
- package/node_modules/@noble/hashes/index.js.map +1 -0
- package/node_modules/@noble/hashes/legacy.d.ts +71 -0
- package/node_modules/@noble/hashes/legacy.d.ts.map +1 -0
- package/node_modules/@noble/hashes/legacy.js +287 -0
- package/node_modules/@noble/hashes/legacy.js.map +1 -0
- package/node_modules/@noble/hashes/package.json +266 -0
- package/node_modules/@noble/hashes/pbkdf2.d.ts +23 -0
- package/node_modules/@noble/hashes/pbkdf2.d.ts.map +1 -0
- package/node_modules/@noble/hashes/pbkdf2.js +101 -0
- package/node_modules/@noble/hashes/pbkdf2.js.map +1 -0
- package/node_modules/@noble/hashes/ripemd160.d.ts +13 -0
- package/node_modules/@noble/hashes/ripemd160.d.ts.map +1 -0
- package/node_modules/@noble/hashes/ripemd160.js +16 -0
- package/node_modules/@noble/hashes/ripemd160.js.map +1 -0
- package/node_modules/@noble/hashes/scrypt.d.ts +34 -0
- package/node_modules/@noble/hashes/scrypt.d.ts.map +1 -0
- package/node_modules/@noble/hashes/scrypt.js +232 -0
- package/node_modules/@noble/hashes/scrypt.js.map +1 -0
- package/node_modules/@noble/hashes/sha1.d.ts +11 -0
- package/node_modules/@noble/hashes/sha1.d.ts.map +1 -0
- package/node_modules/@noble/hashes/sha1.js +14 -0
- package/node_modules/@noble/hashes/sha1.js.map +1 -0
- package/node_modules/@noble/hashes/sha2.d.ts +159 -0
- package/node_modules/@noble/hashes/sha2.d.ts.map +1 -0
- package/node_modules/@noble/hashes/sha2.js +384 -0
- package/node_modules/@noble/hashes/sha2.js.map +1 -0
- package/node_modules/@noble/hashes/sha256.d.ts +20 -0
- package/node_modules/@noble/hashes/sha256.d.ts.map +1 -0
- package/node_modules/@noble/hashes/sha256.js +23 -0
- package/node_modules/@noble/hashes/sha256.js.map +1 -0
- package/node_modules/@noble/hashes/sha3-addons.d.ts +142 -0
- package/node_modules/@noble/hashes/sha3-addons.d.ts.map +1 -0
- package/node_modules/@noble/hashes/sha3-addons.js +402 -0
- package/node_modules/@noble/hashes/sha3-addons.js.map +1 -0
- package/node_modules/@noble/hashes/sha3.d.ts +53 -0
- package/node_modules/@noble/hashes/sha3.d.ts.map +1 -0
- package/node_modules/@noble/hashes/sha3.js +239 -0
- package/node_modules/@noble/hashes/sha3.js.map +1 -0
- package/node_modules/@noble/hashes/sha512.d.ts +26 -0
- package/node_modules/@noble/hashes/sha512.d.ts.map +1 -0
- package/node_modules/@noble/hashes/sha512.js +29 -0
- package/node_modules/@noble/hashes/sha512.js.map +1 -0
- package/node_modules/@noble/hashes/src/_assert.ts +22 -0
- package/node_modules/@noble/hashes/src/_blake.ts +50 -0
- package/node_modules/@noble/hashes/src/_md.ts +176 -0
- package/node_modules/@noble/hashes/src/_u64.ts +91 -0
- package/node_modules/@noble/hashes/src/argon2.ts +497 -0
- package/node_modules/@noble/hashes/src/blake1.ts +534 -0
- package/node_modules/@noble/hashes/src/blake2.ts +486 -0
- package/node_modules/@noble/hashes/src/blake2b.ts +10 -0
- package/node_modules/@noble/hashes/src/blake2s.ts +20 -0
- package/node_modules/@noble/hashes/src/blake3.ts +272 -0
- package/node_modules/@noble/hashes/src/crypto.ts +9 -0
- package/node_modules/@noble/hashes/src/cryptoNode.ts +15 -0
- package/node_modules/@noble/hashes/src/eskdf.ts +187 -0
- package/node_modules/@noble/hashes/src/hkdf.ts +88 -0
- package/node_modules/@noble/hashes/src/hmac.ts +94 -0
- package/node_modules/@noble/hashes/src/index.ts +31 -0
- package/node_modules/@noble/hashes/src/legacy.ts +293 -0
- package/node_modules/@noble/hashes/src/pbkdf2.ts +122 -0
- package/node_modules/@noble/hashes/src/ripemd160.ts +12 -0
- package/node_modules/@noble/hashes/src/scrypt.ts +257 -0
- package/node_modules/@noble/hashes/src/sha1.ts +10 -0
- package/node_modules/@noble/hashes/src/sha2.ts +402 -0
- package/node_modules/@noble/hashes/src/sha256.ts +24 -0
- package/node_modules/@noble/hashes/src/sha3-addons.ts +499 -0
- package/node_modules/@noble/hashes/src/sha3.ts +258 -0
- package/node_modules/@noble/hashes/src/sha512.ts +34 -0
- package/node_modules/@noble/hashes/src/utils.ts +395 -0
- package/node_modules/@noble/hashes/utils.d.ts +161 -0
- package/node_modules/@noble/hashes/utils.d.ts.map +1 -0
- package/node_modules/@noble/hashes/utils.js +313 -0
- package/node_modules/@noble/hashes/utils.js.map +1 -0
- package/package.json +203 -0
- package/schemas/catalog.schema.json +283 -0
- package/src/align.ts +235 -0
- package/src/audio-init-parser.ts +189 -0
- package/src/audio-ring-buffer.ts +120 -0
- package/src/authored-timing.ts +63 -0
- package/src/carp-catalog.ts +776 -0
- package/src/catalog-fec-params.ts +167 -0
- package/src/catalog-network-source.ts +49 -0
- package/src/catalog-validator.ts +34 -0
- package/src/cmaf-block-assembler.ts +1058 -0
- package/src/cmaf-group-batcher.ts +104 -0
- package/src/cmcd-producer.ts +329 -0
- package/src/codec-utils.ts +1539 -0
- package/src/fec-codec.ts +61 -0
- package/src/fec-manager.ts +1939 -0
- package/src/fec-starvation-detector.ts +128 -0
- package/src/fec-worker-setup.ts +177 -0
- package/src/fmp4-completion.ts +47 -0
- package/src/fmp4-reader.ts +112 -0
- package/src/index.ts +443 -0
- package/src/iso-bmff-timing.ts +688 -0
- package/src/loc.ts +181 -0
- package/src/manifest-auth-plan.ts +107 -0
- package/src/media-router.ts +1185 -0
- package/src/mfu-reassembler.ts +2842 -0
- package/src/mfu-reassembly-policy.ts +134 -0
- package/src/mmtp-container-parser.ts +1498 -0
- package/src/mmtp-decode-pipeline.ts +315 -0
- package/src/mmtp-router.ts +3027 -0
- package/src/mmtp-to-cmaf.ts +956 -0
- package/src/multicast-auth-catalog.ts +340 -0
- package/src/multicast-input.ts +439 -0
- package/src/multicast-manager.ts +1503 -0
- package/src/multicast-transport.ts +320 -0
- package/src/multicast-unwrap.ts +132 -0
- package/src/no-modules.ts +20 -0
- package/src/phase14-catalog-override.ts +336 -0
- package/src/repair-fetch.ts +217 -0
- package/src/sample-combiner.ts +846 -0
- package/src/signaling.ts +78 -0
- package/src/source-auth.ts +1 -0
- package/src/switching-set-alignment.ts +109 -0
- package/src/timestamp-codec.ts +265 -0
- package/src/track-pipeline-setup.ts +189 -0
- package/src/track-pipeline.ts +332 -0
- package/src/track-session.ts +778 -0
- package/src/transport-pool.ts +128 -0
- package/src/wasm-mfu-reassembler.ts +372 -0
- package/src/wasm-mmtp-container-parser.ts +23 -0
- package/test-vectors/align.json +199 -0
- package/test-vectors/catalog/README.md +25 -0
- package/test-vectors/catalog/negative/legacy-selection-params.json +15 -0
- package/test-vectors/catalog/negative/missing-mmtp-fields.json +12 -0
- package/test-vectors/catalog/negative/multicast-auth-padded-key.json +37 -0
- package/test-vectors/catalog/negative/multicast-auth-reused-track-format.json +53 -0
- package/test-vectors/catalog/negative/multicast-auth-trailing-pad-bits.json +37 -0
- package/test-vectors/catalog/negative/multicast-endpoint-missing-protocol-and-source.json +24 -0
- package/test-vectors/catalog/negative/network-source-object.json +25 -0
- package/test-vectors/catalog/negative/raptorq-unaligned-symbol.json +26 -0
- package/test-vectors/catalog/negative/repair-track-legacy-shape.json +18 -0
- package/test-vectors/catalog/negative/track-role-empty.json +16 -0
- package/test-vectors/catalog/negative/track-role-non-string.json +16 -0
- package/test-vectors/catalog/positive/fec-multicast.json +51 -0
- package/test-vectors/catalog/positive/flat-av.json +30 -0
- package/test-vectors/catalog/positive/multicast-auth-rotation.json +55 -0
- package/test-vectors/catalog/positive/ticks-and-mixed-timescales.json +39 -0
- package/test-vectors/catalog/positive/track-role.json +49 -0
- package/test-vectors/catalog/releases/moqcast-native-v16-v1/catalog.json +65 -0
- package/test-vectors/catalog/releases/moqcast-native-v16-v1.archive.sha256 +1 -0
- package/test-vectors/catalog-multicast-auth-v1.json +26 -0
- package/test-vectors/catalog-validation.json +148 -0
- package/test-vectors/catalog-validator-public-api.mjs +25 -0
- package/test-vectors/generate-source-auth-fixture.mjs +114 -0
- package/test-vectors/source-auth-v1.json +61 -0
- package/test-vectors/subsample-placement-v1.json +230 -0
|
@@ -0,0 +1,272 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Blake3 fast hash is Blake2 with reduced security (round count). Can also be used as MAC & KDF.
|
|
3
|
+
*
|
|
4
|
+
* It is advertised as "the fastest cryptographic hash". However, it isn't true in JS.
|
|
5
|
+
* Why is this so slow? While it should be 6x faster than blake2b, perf diff is only 20%:
|
|
6
|
+
*
|
|
7
|
+
* * There is only 30% reduction in number of rounds from blake2s
|
|
8
|
+
* * Speed-up comes from tree structure, which is parallelized using SIMD & threading.
|
|
9
|
+
* These features are not present in JS, so we only get overhead from trees.
|
|
10
|
+
* * Parallelization only happens on 1024-byte chunks: there is no benefit for small inputs.
|
|
11
|
+
* * It is still possible to make it faster using: a) loop unrolling b) web workers c) wasm
|
|
12
|
+
* @module
|
|
13
|
+
*/
|
|
14
|
+
import { SHA256_IV } from './_md.ts';
|
|
15
|
+
import { fromBig } from './_u64.ts';
|
|
16
|
+
import { BLAKE2, compress } from './blake2.ts';
|
|
17
|
+
// prettier-ignore
|
|
18
|
+
import {
|
|
19
|
+
abytes, aexists, anumber, aoutput,
|
|
20
|
+
clean, createXOFer, swap32IfBE, toBytes, u32, u8,
|
|
21
|
+
type CHashXO, type HashXOF, type Input
|
|
22
|
+
} from './utils.ts';
|
|
23
|
+
|
|
24
|
+
// Flag bitset
|
|
25
|
+
const B3_Flags = {
|
|
26
|
+
CHUNK_START: 0b1,
|
|
27
|
+
CHUNK_END: 0b10,
|
|
28
|
+
PARENT: 0b100,
|
|
29
|
+
ROOT: 0b1000,
|
|
30
|
+
KEYED_HASH: 0b10000,
|
|
31
|
+
DERIVE_KEY_CONTEXT: 0b100000,
|
|
32
|
+
DERIVE_KEY_MATERIAL: 0b1000000,
|
|
33
|
+
} as const;
|
|
34
|
+
|
|
35
|
+
const B3_IV = SHA256_IV.slice();
|
|
36
|
+
|
|
37
|
+
const B3_SIGMA: Uint8Array = /* @__PURE__ */ (() => {
|
|
38
|
+
const Id = Array.from({ length: 16 }, (_, i) => i);
|
|
39
|
+
const permute = (arr: number[]) =>
|
|
40
|
+
[2, 6, 3, 10, 7, 0, 4, 13, 1, 11, 12, 5, 9, 14, 15, 8].map((i) => arr[i]);
|
|
41
|
+
const res: number[] = [];
|
|
42
|
+
for (let i = 0, v = Id; i < 7; i++, v = permute(v)) res.push(...v);
|
|
43
|
+
return Uint8Array.from(res);
|
|
44
|
+
})();
|
|
45
|
+
|
|
46
|
+
/**
|
|
47
|
+
* Ensure to use EITHER `key` OR `context`, not both.
|
|
48
|
+
*
|
|
49
|
+
* * `key`: 32-byte MAC key.
|
|
50
|
+
* * `context`: string for KDF. Should be hardcoded, globally unique, and application - specific.
|
|
51
|
+
* A good default format for the context string is "[application] [commit timestamp] [purpose]".
|
|
52
|
+
*/
|
|
53
|
+
export type Blake3Opts = { dkLen?: number; key?: Input; context?: Input };
|
|
54
|
+
|
|
55
|
+
/** Blake3 hash. Can be used as MAC and KDF. */
|
|
56
|
+
export class BLAKE3 extends BLAKE2<BLAKE3> implements HashXOF<BLAKE3> {
|
|
57
|
+
private chunkPos = 0; // Position of current block in chunk
|
|
58
|
+
private chunksDone = 0; // How many chunks we already have
|
|
59
|
+
private flags = 0 | 0;
|
|
60
|
+
private IV: Uint32Array;
|
|
61
|
+
private state: Uint32Array;
|
|
62
|
+
private stack: Uint32Array[] = [];
|
|
63
|
+
// Output
|
|
64
|
+
private posOut = 0;
|
|
65
|
+
private bufferOut32 = new Uint32Array(16);
|
|
66
|
+
private bufferOut: Uint8Array;
|
|
67
|
+
private chunkOut = 0; // index of output chunk
|
|
68
|
+
private enableXOF = true;
|
|
69
|
+
|
|
70
|
+
constructor(opts: Blake3Opts = {}, flags = 0) {
|
|
71
|
+
super(64, opts.dkLen === undefined ? 32 : opts.dkLen);
|
|
72
|
+
const { key, context } = opts;
|
|
73
|
+
const hasContext = context !== undefined;
|
|
74
|
+
if (key !== undefined) {
|
|
75
|
+
if (hasContext) throw new Error('Only "key" or "context" can be specified at same time');
|
|
76
|
+
const k = toBytes(key).slice();
|
|
77
|
+
abytes(k, 32);
|
|
78
|
+
this.IV = u32(k);
|
|
79
|
+
swap32IfBE(this.IV);
|
|
80
|
+
this.flags = flags | B3_Flags.KEYED_HASH;
|
|
81
|
+
} else if (hasContext) {
|
|
82
|
+
const ctx = toBytes(context);
|
|
83
|
+
const contextKey = new BLAKE3({ dkLen: 32 }, B3_Flags.DERIVE_KEY_CONTEXT)
|
|
84
|
+
.update(ctx)
|
|
85
|
+
.digest();
|
|
86
|
+
this.IV = u32(contextKey);
|
|
87
|
+
swap32IfBE(this.IV);
|
|
88
|
+
this.flags = flags | B3_Flags.DERIVE_KEY_MATERIAL;
|
|
89
|
+
} else {
|
|
90
|
+
this.IV = B3_IV.slice();
|
|
91
|
+
this.flags = flags;
|
|
92
|
+
}
|
|
93
|
+
this.state = this.IV.slice();
|
|
94
|
+
this.bufferOut = u8(this.bufferOut32);
|
|
95
|
+
}
|
|
96
|
+
// Unused
|
|
97
|
+
protected get(): [] {
|
|
98
|
+
return [];
|
|
99
|
+
}
|
|
100
|
+
protected set(): void {}
|
|
101
|
+
private b2Compress(counter: number, flags: number, buf: Uint32Array, bufPos: number = 0) {
|
|
102
|
+
const { state: s, pos } = this;
|
|
103
|
+
const { h, l } = fromBig(BigInt(counter), true);
|
|
104
|
+
// prettier-ignore
|
|
105
|
+
const { v0, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15 } =
|
|
106
|
+
compress(
|
|
107
|
+
B3_SIGMA, bufPos, buf, 7,
|
|
108
|
+
s[0], s[1], s[2], s[3], s[4], s[5], s[6], s[7],
|
|
109
|
+
B3_IV[0], B3_IV[1], B3_IV[2], B3_IV[3], h, l, pos, flags
|
|
110
|
+
);
|
|
111
|
+
s[0] = v0 ^ v8;
|
|
112
|
+
s[1] = v1 ^ v9;
|
|
113
|
+
s[2] = v2 ^ v10;
|
|
114
|
+
s[3] = v3 ^ v11;
|
|
115
|
+
s[4] = v4 ^ v12;
|
|
116
|
+
s[5] = v5 ^ v13;
|
|
117
|
+
s[6] = v6 ^ v14;
|
|
118
|
+
s[7] = v7 ^ v15;
|
|
119
|
+
}
|
|
120
|
+
protected compress(buf: Uint32Array, bufPos: number = 0, isLast: boolean = false): void {
|
|
121
|
+
// Compress last block
|
|
122
|
+
let flags = this.flags;
|
|
123
|
+
if (!this.chunkPos) flags |= B3_Flags.CHUNK_START;
|
|
124
|
+
if (this.chunkPos === 15 || isLast) flags |= B3_Flags.CHUNK_END;
|
|
125
|
+
if (!isLast) this.pos = this.blockLen;
|
|
126
|
+
this.b2Compress(this.chunksDone, flags, buf, bufPos);
|
|
127
|
+
this.chunkPos += 1;
|
|
128
|
+
// If current block is last in chunk (16 blocks), then compress chunks
|
|
129
|
+
if (this.chunkPos === 16 || isLast) {
|
|
130
|
+
let chunk = this.state;
|
|
131
|
+
this.state = this.IV.slice();
|
|
132
|
+
// If not the last one, compress only when there are trailing zeros in chunk counter
|
|
133
|
+
// chunks used as binary tree where current stack is path. Zero means current leaf is finished and can be compressed.
|
|
134
|
+
// 1 (001) - leaf not finished (just push current chunk to stack)
|
|
135
|
+
// 2 (010) - leaf finished at depth=1 (merge with last elm on stack and push back)
|
|
136
|
+
// 3 (011) - last leaf not finished
|
|
137
|
+
// 4 (100) - leafs finished at depth=1 and depth=2
|
|
138
|
+
for (let last, chunks = this.chunksDone + 1; isLast || !(chunks & 1); chunks >>= 1) {
|
|
139
|
+
if (!(last = this.stack.pop())) break;
|
|
140
|
+
this.buffer32.set(last, 0);
|
|
141
|
+
this.buffer32.set(chunk, 8);
|
|
142
|
+
this.pos = this.blockLen;
|
|
143
|
+
this.b2Compress(0, this.flags | B3_Flags.PARENT, this.buffer32, 0);
|
|
144
|
+
chunk = this.state;
|
|
145
|
+
this.state = this.IV.slice();
|
|
146
|
+
}
|
|
147
|
+
this.chunksDone++;
|
|
148
|
+
this.chunkPos = 0;
|
|
149
|
+
this.stack.push(chunk);
|
|
150
|
+
}
|
|
151
|
+
this.pos = 0;
|
|
152
|
+
}
|
|
153
|
+
_cloneInto(to?: BLAKE3): BLAKE3 {
|
|
154
|
+
to = super._cloneInto(to) as BLAKE3;
|
|
155
|
+
const { IV, flags, state, chunkPos, posOut, chunkOut, stack, chunksDone } = this;
|
|
156
|
+
to.state.set(state.slice());
|
|
157
|
+
to.stack = stack.map((i) => Uint32Array.from(i));
|
|
158
|
+
to.IV.set(IV);
|
|
159
|
+
to.flags = flags;
|
|
160
|
+
to.chunkPos = chunkPos;
|
|
161
|
+
to.chunksDone = chunksDone;
|
|
162
|
+
to.posOut = posOut;
|
|
163
|
+
to.chunkOut = chunkOut;
|
|
164
|
+
to.enableXOF = this.enableXOF;
|
|
165
|
+
to.bufferOut32.set(this.bufferOut32);
|
|
166
|
+
return to;
|
|
167
|
+
}
|
|
168
|
+
destroy(): void {
|
|
169
|
+
this.destroyed = true;
|
|
170
|
+
clean(this.state, this.buffer32, this.IV, this.bufferOut32);
|
|
171
|
+
clean(...this.stack);
|
|
172
|
+
}
|
|
173
|
+
// Same as b2Compress, but doesn't modify state and returns 16 u32 array (instead of 8)
|
|
174
|
+
private b2CompressOut() {
|
|
175
|
+
const { state: s, pos, flags, buffer32, bufferOut32: out32 } = this;
|
|
176
|
+
const { h, l } = fromBig(BigInt(this.chunkOut++));
|
|
177
|
+
swap32IfBE(buffer32);
|
|
178
|
+
// prettier-ignore
|
|
179
|
+
const { v0, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15 } =
|
|
180
|
+
compress(
|
|
181
|
+
B3_SIGMA, 0, buffer32, 7,
|
|
182
|
+
s[0], s[1], s[2], s[3], s[4], s[5], s[6], s[7],
|
|
183
|
+
B3_IV[0], B3_IV[1], B3_IV[2], B3_IV[3], l, h, pos, flags
|
|
184
|
+
);
|
|
185
|
+
out32[0] = v0 ^ v8;
|
|
186
|
+
out32[1] = v1 ^ v9;
|
|
187
|
+
out32[2] = v2 ^ v10;
|
|
188
|
+
out32[3] = v3 ^ v11;
|
|
189
|
+
out32[4] = v4 ^ v12;
|
|
190
|
+
out32[5] = v5 ^ v13;
|
|
191
|
+
out32[6] = v6 ^ v14;
|
|
192
|
+
out32[7] = v7 ^ v15;
|
|
193
|
+
out32[8] = s[0] ^ v8;
|
|
194
|
+
out32[9] = s[1] ^ v9;
|
|
195
|
+
out32[10] = s[2] ^ v10;
|
|
196
|
+
out32[11] = s[3] ^ v11;
|
|
197
|
+
out32[12] = s[4] ^ v12;
|
|
198
|
+
out32[13] = s[5] ^ v13;
|
|
199
|
+
out32[14] = s[6] ^ v14;
|
|
200
|
+
out32[15] = s[7] ^ v15;
|
|
201
|
+
swap32IfBE(buffer32);
|
|
202
|
+
swap32IfBE(out32);
|
|
203
|
+
this.posOut = 0;
|
|
204
|
+
}
|
|
205
|
+
protected finish(): void {
|
|
206
|
+
if (this.finished) return;
|
|
207
|
+
this.finished = true;
|
|
208
|
+
// Padding
|
|
209
|
+
clean(this.buffer.subarray(this.pos));
|
|
210
|
+
// Process last chunk
|
|
211
|
+
let flags = this.flags | B3_Flags.ROOT;
|
|
212
|
+
if (this.stack.length) {
|
|
213
|
+
flags |= B3_Flags.PARENT;
|
|
214
|
+
swap32IfBE(this.buffer32);
|
|
215
|
+
this.compress(this.buffer32, 0, true);
|
|
216
|
+
swap32IfBE(this.buffer32);
|
|
217
|
+
this.chunksDone = 0;
|
|
218
|
+
this.pos = this.blockLen;
|
|
219
|
+
} else {
|
|
220
|
+
flags |= (!this.chunkPos ? B3_Flags.CHUNK_START : 0) | B3_Flags.CHUNK_END;
|
|
221
|
+
}
|
|
222
|
+
this.flags = flags;
|
|
223
|
+
this.b2CompressOut();
|
|
224
|
+
}
|
|
225
|
+
private writeInto(out: Uint8Array) {
|
|
226
|
+
aexists(this, false);
|
|
227
|
+
abytes(out);
|
|
228
|
+
this.finish();
|
|
229
|
+
const { blockLen, bufferOut } = this;
|
|
230
|
+
for (let pos = 0, len = out.length; pos < len; ) {
|
|
231
|
+
if (this.posOut >= blockLen) this.b2CompressOut();
|
|
232
|
+
const take = Math.min(blockLen - this.posOut, len - pos);
|
|
233
|
+
out.set(bufferOut.subarray(this.posOut, this.posOut + take), pos);
|
|
234
|
+
this.posOut += take;
|
|
235
|
+
pos += take;
|
|
236
|
+
}
|
|
237
|
+
return out;
|
|
238
|
+
}
|
|
239
|
+
xofInto(out: Uint8Array): Uint8Array {
|
|
240
|
+
if (!this.enableXOF) throw new Error('XOF is not possible after digest call');
|
|
241
|
+
return this.writeInto(out);
|
|
242
|
+
}
|
|
243
|
+
xof(bytes: number): Uint8Array {
|
|
244
|
+
anumber(bytes);
|
|
245
|
+
return this.xofInto(new Uint8Array(bytes));
|
|
246
|
+
}
|
|
247
|
+
digestInto(out: Uint8Array): Uint8Array {
|
|
248
|
+
aoutput(out, this);
|
|
249
|
+
if (this.finished) throw new Error('digest() was already called');
|
|
250
|
+
this.enableXOF = false;
|
|
251
|
+
this.writeInto(out);
|
|
252
|
+
this.destroy();
|
|
253
|
+
return out;
|
|
254
|
+
}
|
|
255
|
+
digest(): Uint8Array {
|
|
256
|
+
return this.digestInto(new Uint8Array(this.outputLen));
|
|
257
|
+
}
|
|
258
|
+
}
|
|
259
|
+
|
|
260
|
+
/**
|
|
261
|
+
* BLAKE3 hash function. Can be used as MAC and KDF.
|
|
262
|
+
* @param msg - message that would be hashed
|
|
263
|
+
* @param opts - `dkLen` for output length, `key` for MAC mode, `context` for KDF mode
|
|
264
|
+
* @example
|
|
265
|
+
* const data = new Uint8Array(32);
|
|
266
|
+
* const hash = blake3(data);
|
|
267
|
+
* const mac = blake3(data, { key: new Uint8Array(32) });
|
|
268
|
+
* const kdf = blake3(data, { context: 'application name' });
|
|
269
|
+
*/
|
|
270
|
+
export const blake3: CHashXO = /* @__PURE__ */ createXOFer<BLAKE3, Blake3Opts>(
|
|
271
|
+
(opts) => new BLAKE3(opts)
|
|
272
|
+
);
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Internal webcrypto alias.
|
|
3
|
+
* We use WebCrypto aka globalThis.crypto, which exists in browsers and node.js 16+.
|
|
4
|
+
* See utils.ts for details.
|
|
5
|
+
* @module
|
|
6
|
+
*/
|
|
7
|
+
declare const globalThis: Record<string, any> | undefined;
|
|
8
|
+
export const crypto: any =
|
|
9
|
+
typeof globalThis === 'object' && 'crypto' in globalThis ? globalThis.crypto : undefined;
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Internal webcrypto alias.
|
|
3
|
+
* We prefer WebCrypto aka globalThis.crypto, which exists in node.js 16+.
|
|
4
|
+
* Falls back to Node.js built-in crypto for Node.js <=v14.
|
|
5
|
+
* See utils.ts for details.
|
|
6
|
+
* @module
|
|
7
|
+
*/
|
|
8
|
+
// @ts-ignore
|
|
9
|
+
import * as nc from 'node:crypto';
|
|
10
|
+
export const crypto: any =
|
|
11
|
+
nc && typeof nc === 'object' && 'webcrypto' in nc
|
|
12
|
+
? (nc.webcrypto as any)
|
|
13
|
+
: nc && typeof nc === 'object' && 'randomBytes' in nc
|
|
14
|
+
? nc
|
|
15
|
+
: undefined;
|
|
@@ -0,0 +1,187 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Experimental KDF for AES.
|
|
3
|
+
*/
|
|
4
|
+
import { hkdf } from './hkdf.ts';
|
|
5
|
+
import { pbkdf2 as _pbkdf2 } from './pbkdf2.ts';
|
|
6
|
+
import { scrypt as _scrypt } from './scrypt.ts';
|
|
7
|
+
import { sha256 } from './sha256.ts';
|
|
8
|
+
import { abytes, bytesToHex, clean, createView, hexToBytes, kdfInputToBytes } from './utils.ts';
|
|
9
|
+
|
|
10
|
+
// A tiny KDF for various applications like AES key-gen.
|
|
11
|
+
// Uses HKDF in a non-standard way, so it's not "KDF-secure", only "PRF-secure".
|
|
12
|
+
// Which is good enough: assume sha2-256 retained preimage resistance.
|
|
13
|
+
|
|
14
|
+
const SCRYPT_FACTOR = 2 ** 19;
|
|
15
|
+
const PBKDF2_FACTOR = 2 ** 17;
|
|
16
|
+
|
|
17
|
+
// Scrypt KDF
|
|
18
|
+
export function scrypt(password: string, salt: string): Uint8Array {
|
|
19
|
+
return _scrypt(password, salt, { N: SCRYPT_FACTOR, r: 8, p: 1, dkLen: 32 });
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
// PBKDF2-HMAC-SHA256
|
|
23
|
+
export function pbkdf2(password: string, salt: string): Uint8Array {
|
|
24
|
+
return _pbkdf2(sha256, password, salt, { c: PBKDF2_FACTOR, dkLen: 32 });
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
// Combines two 32-byte byte arrays
|
|
28
|
+
function xor32(a: Uint8Array, b: Uint8Array): Uint8Array {
|
|
29
|
+
abytes(a, 32);
|
|
30
|
+
abytes(b, 32);
|
|
31
|
+
const arr = new Uint8Array(32);
|
|
32
|
+
for (let i = 0; i < 32; i++) {
|
|
33
|
+
arr[i] = a[i] ^ b[i];
|
|
34
|
+
}
|
|
35
|
+
return arr;
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
function strHasLength(str: string, min: number, max: number): boolean {
|
|
39
|
+
return typeof str === 'string' && str.length >= min && str.length <= max;
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
/**
|
|
43
|
+
* Derives main seed. Takes a lot of time. Prefer `eskdf` method instead.
|
|
44
|
+
*/
|
|
45
|
+
export function deriveMainSeed(username: string, password: string): Uint8Array {
|
|
46
|
+
if (!strHasLength(username, 8, 255)) throw new Error('invalid username');
|
|
47
|
+
if (!strHasLength(password, 8, 255)) throw new Error('invalid password');
|
|
48
|
+
// Declared like this to throw off minifiers which auto-convert .fromCharCode(1) to actual string.
|
|
49
|
+
// String with non-ascii may be problematic in some envs
|
|
50
|
+
const codes = { _1: 1, _2: 2 };
|
|
51
|
+
const sep = { s: String.fromCharCode(codes._1), p: String.fromCharCode(codes._2) };
|
|
52
|
+
const scr = scrypt(password + sep.s, username + sep.s);
|
|
53
|
+
const pbk = pbkdf2(password + sep.p, username + sep.p);
|
|
54
|
+
const res = xor32(scr, pbk);
|
|
55
|
+
clean(scr, pbk);
|
|
56
|
+
return res;
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
type AccountID = number | string;
|
|
60
|
+
|
|
61
|
+
/**
|
|
62
|
+
* Converts protocol & accountId pair to HKDF salt & info params.
|
|
63
|
+
*/
|
|
64
|
+
function getSaltInfo(protocol: string, accountId: AccountID = 0) {
|
|
65
|
+
// Note that length here also repeats two lines below
|
|
66
|
+
// We do an additional length check here to reduce the scope of DoS attacks
|
|
67
|
+
if (!(strHasLength(protocol, 3, 15) && /^[a-z0-9]{3,15}$/.test(protocol))) {
|
|
68
|
+
throw new Error('invalid protocol');
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
// Allow string account ids for some protocols
|
|
72
|
+
const allowsStr = /^password\d{0,3}|ssh|tor|file$/.test(protocol);
|
|
73
|
+
let salt: Uint8Array; // Extract salt. Default is undefined.
|
|
74
|
+
if (typeof accountId === 'string') {
|
|
75
|
+
if (!allowsStr) throw new Error('accountId must be a number');
|
|
76
|
+
if (!strHasLength(accountId, 1, 255))
|
|
77
|
+
throw new Error('accountId must be string of length 1..255');
|
|
78
|
+
salt = kdfInputToBytes(accountId);
|
|
79
|
+
} else if (Number.isSafeInteger(accountId)) {
|
|
80
|
+
if (accountId < 0 || accountId > Math.pow(2, 32) - 1) throw new Error('invalid accountId');
|
|
81
|
+
// Convert to Big Endian Uint32
|
|
82
|
+
salt = new Uint8Array(4);
|
|
83
|
+
createView(salt).setUint32(0, accountId, false);
|
|
84
|
+
} else {
|
|
85
|
+
throw new Error('accountId must be a number' + (allowsStr ? ' or string' : ''));
|
|
86
|
+
}
|
|
87
|
+
const info = kdfInputToBytes(protocol);
|
|
88
|
+
return { salt, info };
|
|
89
|
+
}
|
|
90
|
+
|
|
91
|
+
type OptsLength = { keyLength: number };
|
|
92
|
+
type OptsMod = { modulus: bigint };
|
|
93
|
+
type KeyOpts = undefined | OptsLength | OptsMod;
|
|
94
|
+
|
|
95
|
+
function countBytes(num: bigint): number {
|
|
96
|
+
if (typeof num !== 'bigint' || num <= BigInt(128)) throw new Error('invalid number');
|
|
97
|
+
return Math.ceil(num.toString(2).length / 8);
|
|
98
|
+
}
|
|
99
|
+
|
|
100
|
+
/**
|
|
101
|
+
* Parses keyLength and modulus options to extract length of result key.
|
|
102
|
+
* If modulus is used, adds 64 bits to it as per FIPS 186 B.4.1 to combat modulo bias.
|
|
103
|
+
*/
|
|
104
|
+
function getKeyLength(options: KeyOpts): number {
|
|
105
|
+
if (!options || typeof options !== 'object') return 32;
|
|
106
|
+
const hasLen = 'keyLength' in options;
|
|
107
|
+
const hasMod = 'modulus' in options;
|
|
108
|
+
if (hasLen && hasMod) throw new Error('cannot combine keyLength and modulus options');
|
|
109
|
+
if (!hasLen && !hasMod) throw new Error('must have either keyLength or modulus option');
|
|
110
|
+
// FIPS 186 B.4.1 requires at least 64 more bits
|
|
111
|
+
const l = hasMod ? countBytes(options.modulus) + 8 : options.keyLength;
|
|
112
|
+
if (!(typeof l === 'number' && l >= 16 && l <= 8192)) throw new Error('invalid keyLength');
|
|
113
|
+
return l;
|
|
114
|
+
}
|
|
115
|
+
|
|
116
|
+
/**
|
|
117
|
+
* Converts key to bigint and divides it by modulus. Big Endian.
|
|
118
|
+
* Implements FIPS 186 B.4.1, which removes 0 and modulo bias from output.
|
|
119
|
+
*/
|
|
120
|
+
function modReduceKey(key: Uint8Array, modulus: bigint): Uint8Array {
|
|
121
|
+
const _1 = BigInt(1);
|
|
122
|
+
const num = BigInt('0x' + bytesToHex(key)); // check for ui8a, then bytesToNumber()
|
|
123
|
+
const res = (num % (modulus - _1)) + _1; // Remove 0 from output
|
|
124
|
+
if (res < _1) throw new Error('expected positive number'); // Guard against bad values
|
|
125
|
+
const len = key.length - 8; // FIPS requires 64 more bits = 8 bytes
|
|
126
|
+
const hex = res.toString(16).padStart(len * 2, '0'); // numberToHex()
|
|
127
|
+
const bytes = hexToBytes(hex);
|
|
128
|
+
if (bytes.length !== len) throw new Error('invalid length of result key');
|
|
129
|
+
return bytes;
|
|
130
|
+
}
|
|
131
|
+
|
|
132
|
+
// We are not using classes because constructor cannot be async
|
|
133
|
+
export interface ESKDF {
|
|
134
|
+
/**
|
|
135
|
+
* Derives a child key. Child key will not be associated with any
|
|
136
|
+
* other child key because of properties of underlying KDF.
|
|
137
|
+
*
|
|
138
|
+
* @param protocol - 3-15 character protocol name
|
|
139
|
+
* @param accountId - numeric identifier of account
|
|
140
|
+
* @param options - `keyLength: 64` or `modulus: 41920438n`
|
|
141
|
+
* @example deriveChildKey('aes', 0)
|
|
142
|
+
*/
|
|
143
|
+
deriveChildKey: (protocol: string, accountId: AccountID, options?: KeyOpts) => Uint8Array;
|
|
144
|
+
/**
|
|
145
|
+
* Deletes the main seed from eskdf instance
|
|
146
|
+
*/
|
|
147
|
+
expire: () => void;
|
|
148
|
+
/**
|
|
149
|
+
* Account fingerprint
|
|
150
|
+
*/
|
|
151
|
+
fingerprint: string;
|
|
152
|
+
}
|
|
153
|
+
|
|
154
|
+
/**
|
|
155
|
+
* ESKDF
|
|
156
|
+
* @param username - username, email, or identifier, min: 8 characters, should have enough entropy
|
|
157
|
+
* @param password - password, min: 8 characters, should have enough entropy
|
|
158
|
+
* @example
|
|
159
|
+
* const kdf = await eskdf('example-university', 'beginning-new-example');
|
|
160
|
+
* const key = kdf.deriveChildKey('aes', 0);
|
|
161
|
+
* console.log(kdf.fingerprint);
|
|
162
|
+
* kdf.expire();
|
|
163
|
+
*/
|
|
164
|
+
export async function eskdf(username: string, password: string): Promise<ESKDF> {
|
|
165
|
+
// We are using closure + object instead of class because
|
|
166
|
+
// we want to make `seed` non-accessible for any external function.
|
|
167
|
+
let seed: Uint8Array | undefined = deriveMainSeed(username, password);
|
|
168
|
+
|
|
169
|
+
function deriveCK(protocol: string, accountId: AccountID = 0, options?: KeyOpts): Uint8Array {
|
|
170
|
+
abytes(seed, 32);
|
|
171
|
+
const { salt, info } = getSaltInfo(protocol, accountId); // validate protocol & accountId
|
|
172
|
+
const keyLength = getKeyLength(options); // validate options
|
|
173
|
+
const key = hkdf(sha256, seed!, salt, info, keyLength);
|
|
174
|
+
// Modulus has already been validated
|
|
175
|
+
return options && 'modulus' in options ? modReduceKey(key, options.modulus) : key;
|
|
176
|
+
}
|
|
177
|
+
function expire() {
|
|
178
|
+
if (seed) seed.fill(1);
|
|
179
|
+
seed = undefined;
|
|
180
|
+
}
|
|
181
|
+
// prettier-ignore
|
|
182
|
+
const fingerprint = Array.from(deriveCK('fingerprint', 0))
|
|
183
|
+
.slice(0, 6)
|
|
184
|
+
.map((char) => char.toString(16).padStart(2, '0').toUpperCase())
|
|
185
|
+
.join(':');
|
|
186
|
+
return Object.freeze({ deriveChildKey: deriveCK, expire, fingerprint });
|
|
187
|
+
}
|
|
@@ -0,0 +1,88 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* HKDF (RFC 5869): extract + expand in one step.
|
|
3
|
+
* See https://soatok.blog/2021/11/17/understanding-hkdf/.
|
|
4
|
+
* @module
|
|
5
|
+
*/
|
|
6
|
+
import { hmac } from './hmac.ts';
|
|
7
|
+
import { ahash, anumber, type CHash, clean, type Input, toBytes } from './utils.ts';
|
|
8
|
+
|
|
9
|
+
/**
|
|
10
|
+
* HKDF-extract from spec. Less important part. `HKDF-Extract(IKM, salt) -> PRK`
|
|
11
|
+
* Arguments position differs from spec (IKM is first one, since it is not optional)
|
|
12
|
+
* @param hash - hash function that would be used (e.g. sha256)
|
|
13
|
+
* @param ikm - input keying material, the initial key
|
|
14
|
+
* @param salt - optional salt value (a non-secret random value)
|
|
15
|
+
*/
|
|
16
|
+
export function extract(hash: CHash, ikm: Input, salt?: Input): Uint8Array {
|
|
17
|
+
ahash(hash);
|
|
18
|
+
// NOTE: some libraries treat zero-length array as 'not provided';
|
|
19
|
+
// we don't, since we have undefined as 'not provided'
|
|
20
|
+
// https://github.com/RustCrypto/KDFs/issues/15
|
|
21
|
+
if (salt === undefined) salt = new Uint8Array(hash.outputLen);
|
|
22
|
+
return hmac(hash, toBytes(salt), toBytes(ikm));
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
const HKDF_COUNTER = /* @__PURE__ */ Uint8Array.from([0]);
|
|
26
|
+
const EMPTY_BUFFER = /* @__PURE__ */ Uint8Array.of();
|
|
27
|
+
|
|
28
|
+
/**
|
|
29
|
+
* HKDF-expand from the spec. The most important part. `HKDF-Expand(PRK, info, L) -> OKM`
|
|
30
|
+
* @param hash - hash function that would be used (e.g. sha256)
|
|
31
|
+
* @param prk - a pseudorandom key of at least HashLen octets (usually, the output from the extract step)
|
|
32
|
+
* @param info - optional context and application specific information (can be a zero-length string)
|
|
33
|
+
* @param length - length of output keying material in bytes
|
|
34
|
+
*/
|
|
35
|
+
export function expand(hash: CHash, prk: Input, info?: Input, length: number = 32): Uint8Array {
|
|
36
|
+
ahash(hash);
|
|
37
|
+
anumber(length);
|
|
38
|
+
const olen = hash.outputLen;
|
|
39
|
+
if (length > 255 * olen) throw new Error('Length should be <= 255*HashLen');
|
|
40
|
+
const blocks = Math.ceil(length / olen);
|
|
41
|
+
if (info === undefined) info = EMPTY_BUFFER;
|
|
42
|
+
// first L(ength) octets of T
|
|
43
|
+
const okm = new Uint8Array(blocks * olen);
|
|
44
|
+
// Re-use HMAC instance between blocks
|
|
45
|
+
const HMAC = hmac.create(hash, prk);
|
|
46
|
+
const HMACTmp = HMAC._cloneInto();
|
|
47
|
+
const T = new Uint8Array(HMAC.outputLen);
|
|
48
|
+
for (let counter = 0; counter < blocks; counter++) {
|
|
49
|
+
HKDF_COUNTER[0] = counter + 1;
|
|
50
|
+
// T(0) = empty string (zero length)
|
|
51
|
+
// T(N) = HMAC-Hash(PRK, T(N-1) | info | N)
|
|
52
|
+
HMACTmp.update(counter === 0 ? EMPTY_BUFFER : T)
|
|
53
|
+
.update(info)
|
|
54
|
+
.update(HKDF_COUNTER)
|
|
55
|
+
.digestInto(T);
|
|
56
|
+
okm.set(T, olen * counter);
|
|
57
|
+
HMAC._cloneInto(HMACTmp);
|
|
58
|
+
}
|
|
59
|
+
HMAC.destroy();
|
|
60
|
+
HMACTmp.destroy();
|
|
61
|
+
clean(T, HKDF_COUNTER);
|
|
62
|
+
return okm.slice(0, length);
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
/**
|
|
66
|
+
* HKDF (RFC 5869): derive keys from an initial input.
|
|
67
|
+
* Combines hkdf_extract + hkdf_expand in one step
|
|
68
|
+
* @param hash - hash function that would be used (e.g. sha256)
|
|
69
|
+
* @param ikm - input keying material, the initial key
|
|
70
|
+
* @param salt - optional salt value (a non-secret random value)
|
|
71
|
+
* @param info - optional context and application specific information (can be a zero-length string)
|
|
72
|
+
* @param length - length of output keying material in bytes
|
|
73
|
+
* @example
|
|
74
|
+
* import { hkdf } from '@noble/hashes/hkdf';
|
|
75
|
+
* import { sha256 } from '@noble/hashes/sha2';
|
|
76
|
+
* import { randomBytes } from '@noble/hashes/utils';
|
|
77
|
+
* const inputKey = randomBytes(32);
|
|
78
|
+
* const salt = randomBytes(32);
|
|
79
|
+
* const info = 'application-key';
|
|
80
|
+
* const hk1 = hkdf(sha256, inputKey, salt, info, 32);
|
|
81
|
+
*/
|
|
82
|
+
export const hkdf = (
|
|
83
|
+
hash: CHash,
|
|
84
|
+
ikm: Input,
|
|
85
|
+
salt: Input | undefined,
|
|
86
|
+
info: Input | undefined,
|
|
87
|
+
length: number
|
|
88
|
+
): Uint8Array => expand(hash, extract(hash, ikm, salt), info, length);
|
|
@@ -0,0 +1,94 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* HMAC: RFC2104 message authentication code.
|
|
3
|
+
* @module
|
|
4
|
+
*/
|
|
5
|
+
import { abytes, aexists, ahash, clean, Hash, toBytes, type CHash, type Input } from './utils.ts';
|
|
6
|
+
|
|
7
|
+
export class HMAC<T extends Hash<T>> extends Hash<HMAC<T>> {
|
|
8
|
+
oHash: T;
|
|
9
|
+
iHash: T;
|
|
10
|
+
blockLen: number;
|
|
11
|
+
outputLen: number;
|
|
12
|
+
private finished = false;
|
|
13
|
+
private destroyed = false;
|
|
14
|
+
|
|
15
|
+
constructor(hash: CHash, _key: Input) {
|
|
16
|
+
super();
|
|
17
|
+
ahash(hash);
|
|
18
|
+
const key = toBytes(_key);
|
|
19
|
+
this.iHash = hash.create() as T;
|
|
20
|
+
if (typeof this.iHash.update !== 'function')
|
|
21
|
+
throw new Error('Expected instance of class which extends utils.Hash');
|
|
22
|
+
this.blockLen = this.iHash.blockLen;
|
|
23
|
+
this.outputLen = this.iHash.outputLen;
|
|
24
|
+
const blockLen = this.blockLen;
|
|
25
|
+
const pad = new Uint8Array(blockLen);
|
|
26
|
+
// blockLen can be bigger than outputLen
|
|
27
|
+
pad.set(key.length > blockLen ? hash.create().update(key).digest() : key);
|
|
28
|
+
for (let i = 0; i < pad.length; i++) pad[i] ^= 0x36;
|
|
29
|
+
this.iHash.update(pad);
|
|
30
|
+
// By doing update (processing of first block) of outer hash here we can re-use it between multiple calls via clone
|
|
31
|
+
this.oHash = hash.create() as T;
|
|
32
|
+
// Undo internal XOR && apply outer XOR
|
|
33
|
+
for (let i = 0; i < pad.length; i++) pad[i] ^= 0x36 ^ 0x5c;
|
|
34
|
+
this.oHash.update(pad);
|
|
35
|
+
clean(pad);
|
|
36
|
+
}
|
|
37
|
+
update(buf: Input): this {
|
|
38
|
+
aexists(this);
|
|
39
|
+
this.iHash.update(buf);
|
|
40
|
+
return this;
|
|
41
|
+
}
|
|
42
|
+
digestInto(out: Uint8Array): void {
|
|
43
|
+
aexists(this);
|
|
44
|
+
abytes(out, this.outputLen);
|
|
45
|
+
this.finished = true;
|
|
46
|
+
this.iHash.digestInto(out);
|
|
47
|
+
this.oHash.update(out);
|
|
48
|
+
this.oHash.digestInto(out);
|
|
49
|
+
this.destroy();
|
|
50
|
+
}
|
|
51
|
+
digest(): Uint8Array {
|
|
52
|
+
const out = new Uint8Array(this.oHash.outputLen);
|
|
53
|
+
this.digestInto(out);
|
|
54
|
+
return out;
|
|
55
|
+
}
|
|
56
|
+
_cloneInto(to?: HMAC<T>): HMAC<T> {
|
|
57
|
+
// Create new instance without calling constructor since key already in state and we don't know it.
|
|
58
|
+
to ||= Object.create(Object.getPrototypeOf(this), {});
|
|
59
|
+
const { oHash, iHash, finished, destroyed, blockLen, outputLen } = this;
|
|
60
|
+
to = to as this;
|
|
61
|
+
to.finished = finished;
|
|
62
|
+
to.destroyed = destroyed;
|
|
63
|
+
to.blockLen = blockLen;
|
|
64
|
+
to.outputLen = outputLen;
|
|
65
|
+
to.oHash = oHash._cloneInto(to.oHash);
|
|
66
|
+
to.iHash = iHash._cloneInto(to.iHash);
|
|
67
|
+
return to;
|
|
68
|
+
}
|
|
69
|
+
clone(): HMAC<T> {
|
|
70
|
+
return this._cloneInto();
|
|
71
|
+
}
|
|
72
|
+
destroy(): void {
|
|
73
|
+
this.destroyed = true;
|
|
74
|
+
this.oHash.destroy();
|
|
75
|
+
this.iHash.destroy();
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
/**
|
|
80
|
+
* HMAC: RFC2104 message authentication code.
|
|
81
|
+
* @param hash - function that would be used e.g. sha256
|
|
82
|
+
* @param key - message key
|
|
83
|
+
* @param message - message data
|
|
84
|
+
* @example
|
|
85
|
+
* import { hmac } from '@noble/hashes/hmac';
|
|
86
|
+
* import { sha256 } from '@noble/hashes/sha2';
|
|
87
|
+
* const mac1 = hmac(sha256, 'key', 'message');
|
|
88
|
+
*/
|
|
89
|
+
export const hmac: {
|
|
90
|
+
(hash: CHash, key: Input, message: Input): Uint8Array;
|
|
91
|
+
create(hash: CHash, key: Input): HMAC<any>;
|
|
92
|
+
} = (hash: CHash, key: Input, message: Input): Uint8Array =>
|
|
93
|
+
new HMAC<any>(hash, key).update(message).digest();
|
|
94
|
+
hmac.create = (hash: CHash, key: Input) => new HMAC<any>(hash, key);
|