Repository navigation
Add capability preflight, with content protection as the first probe type - #29
Open
deisenbacher wants to merge 2 commits into
Open
deisenbacher wants to merge 2 commits into
deisenbacher wants to merge 2 commits into
Conversation
Defines the org.ietf.moq.cmsf.contentprotection probe type for the MSF preflight (moq-wg/msf#214): canary keys with the preflight nonce bound into integrity-protected init data, result values including signed CDM challenges, an outputProtection field for minimum HDCP, security guidance, and the probe type registration.
Per review on moq-wg/msf#214, define the preflight exchange in CMSF instead of MSF. The mechanism (catalog fields, request, response, decision, token acquisition, probe registry) is written without DRM assumptions. Content protection is the first probe type, alongside decode, display and clock probes. Identifiers move to the org.ietf.moq.cmsf namespace and the probe registry becomes the "CMSF Preflight Probe Types" registry.
deisenbacher
force-pushed
the
preflight-contentprotection
branch
from
October 30, 2026 14:14
30afc0a to
46bea6f
Compare
4 tasks
This branch has not been deployed
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Add capability preflight, with content protection as the first probe type
Proposed by @deisenbacher. This PR is now the home of the capability preflight
proposal, replacing moq-wg/msf#214. Following review there (@wilaw), the whole
mechanism lives in CMSF, where it has direct use, instead of in MSF. It does
not depend on any MSF change.
Summary
This PR adds an optional preflight exchange to CMSF. Before a publisher
issues authorization for certain tracks, the subscriber reports its decoding,
display and content protection capabilities. The publisher then authorizes
exactly the tracks the subscriber can, and is permitted to, consume.
It fills a gap in MSF, which says token acquisition is out of scope. Preflight
is an optional, in-band way to acquire a token whose scope reflects the
subscriber's verified capabilities.
The mechanism is written to be independent of DRM: the catalog fields,
request, response, decision and probe registry make no content protection
assumptions. What gets checked is defined by probe types. Content
protection is the first one, with decode, display and clock probes alongside
it. If a non-DRM use emerges later (for example platform attestation for clear
content), the mechanism can move into MSF without changing its shape.
Why validate the client before media access
Today an MSF session runs in this order: catalog, token, SUBSCRIBE, media,
license. The first check that inspects the client itself, such as its DRM
security level, happens at license acquisition. By then the client has already
learned every track name, been authorized by the relay, and downloaded the
encrypted media. That ordering has real security costs:
client's security level is enforced. A single key-policy mistake, such as one
key shared across renditions or across audio and video, exposes premium
content to any client that holds a token. Preflight adds an independent gate
at the relay, driven by the same decision as the license.
bulk FETCH encrypted 4K groups whether or not it could ever be licensed for
them. The more widely encrypted media is distributed, the more any later key
compromise is worth, and high-bitrate tracks cost relay and CDN egress.
Preflight limits track access to clients that have met the requirements.
robustness, HDCP status, decode support) can be altered by page script.
Preflight lets the publisher check verifiable evidence, such as a license
request signed by the client's CDM with a fresh nonce embedded, before any
token is issued. Spoofed claims and replayed challenges are caught before
the client touches media.
and license policy are decided separately, a client can be authorized for a
rendition it will be refused a key for. ABR selects it and playback stalls.
Preflight derives both from one decision, so the catalog, the relay scope
and the license policy agree.
posture is the same principle as device-posture checks in zero-trust
access: the client gets exactly what it can safely and legitimately use,
and nothing it would have to be refused later.
Preflight does not replace DRM or the authorization scheme. Both still enforce.
It makes sure they are fed the same, verified view of the client before media
access begins.
What this enables
select a rendition that will fail at license time.
specs (CMSF) define their own verifiable probes without MSF needing to know
about DRM.
Diagrams
Where the client is checked
flowchart LR subgraph today["Today"] direction LR A1[catalog] --> A2[token] --> A3[SUBSCRIBE] --> A4[media] --> A5["license<br/>(first client check)"] end subgraph pre["With preflight"] direction LR B1[catalog] --> B2["preflight<br/>(verified client check)"] --> B3[scoped token] --> B4["SUBSCRIBE<br/>(relay enforces scope)"] --> B5[media] --> B6["license<br/>(second, independent check)"] endPreflight exchange, track access and license
Spoofed client is stopped before media access
An L3-only client claims hardware DRM and replays an L1 challenge captured
from another device.
Design
preflightfield naming a request track (an eventtimeline) and either an HTTPS
submitUrior asubmitTrackpublish track.preflightRequired: true.Subscribers MUST NOT SUBSCRIBE or FETCH them before a decision.
nonce, anexpirestime, and aprobesobjectkeyed by probe type.
{"unsupported": true}.authorizedTracks, optionaldeniedTrackswith reasons,the catalog to use, and the
authorizationtokens keyed by the existingMSF
authInfoscheme identifiers. Out-of-scope requests fail with theexisting insufficient-scope handling.
fallbackCataloggives subscribers that don't support preflight, or whosepreflight fails, something to play.
nonce in an integrity-protected field (Widevine PSSH content_id, PlayReady
CUSTOMATTRIBUTES, FairPlay content identifier). The subscriber returns the
CDM-signed license request, so the publisher verifies the security level
itself instead of trusting reported robustness.
Preflight results are explicitly advisory. Enforcement stays with the
authorization scheme and the content protection system.
Changes to draft-ietf-moq-cmsf.md
outputProtectionfield (minimum HDCP version, informative)preflightat root,preflightRequiredon tracks), exchange, request, response, decision, token acquisition via preflight, two ASCII figures (check ordering, exchange sequence)org.ietf.moq.cmsf.contentprotection: canary keys,robustnessLadder, HDCP, schemes, canary playback, session types, nonce binding figure, informative robustness table), decode, display and clock probesorg.ietf.moq.cmsf.preflight.request/.responsein the "MSF Event Timeline Types" registry. Creates the "CMSF Preflight Probe Types" registry (Specification Required) with four initial entriesNot in this PR
deliberately left to application-defined probe types because of their
fingerprinting impact.
Dependencies
tracks, variable substitution and authorization as they exist today. The
normative MSF reference is still draft-ietf-moq-msf-01 and may need bumping
to a version that contains those sections.
Open questions for the WG
submitUriacceptable, or should the exchange be MoQT-only(
submitTrack)? The HTTPS path is included because current web playerscan't yet publish on
publishTracks, and it fits existing API gateways.reference a token endpoint defined by the authorization scheme (C4M,
Privacy Pass)?
proposed), so it can be shared if preflight later moves to MSF, or in a
CMSF-specific group? Or should probe types share the event timeline types
registry?
preflightRequiredinstead be expressed insideauthInfo?is a per-session namespace sufficient?
acceptable, DRM-neutral way to bind evidence, or should each DRM system's
binding be specified separately?
outputProtectionbe normative for subscribers (e.g. MUST NOT selecta track whose HDCP requirement is not met), or stay informative?
to a registry or an external reference such as DASH-IF?
scope for CMSF, or better left to DASH-IF ECCP?
Checklist
makebuilds without new warnings{{preflight}},{{preflightrequired}},{{preflightworkflow}},{{cppreflight}},{{outputprotection}},{{iana-preflight-probe-types}})