��<!doctype html><html lang="en"> <head> <meta content="text/html; charset=utf-8" http-equiv="Content-Type"> <title>DASH-IF Implementation Guidelines: Content Protection Information Exchange Format (CPIX)</title> <meta content="width=device-width, initial-scale=1, shrink-to-fit=no" name="viewport"> <style data-fill-with="stylesheet">/****************************************************************************** * Style sheet for the W3C specifications * * * Special classes handled by this style sheet include: * * Indices * - .toc for the Table of Contents (<ol class="toc">) * + <span class="secno"> for the section numbers * - #toc for the Table of Contents (<nav id="toc">) * - ul.index for Indices (<a href="#ref">term</a><span>, in �N.M</span>) * - table.index for Index Tables (e.g. for properties or elements) * * Structural Markup * - table.data for general data tables * -> use 'scope' attribute, <colgroup>, <thead>, and <tbody> for best results ! * -> use <table class='complex data'> for extra-complex tables * -> use <td class='long'> for paragraph-length cell content * -> use <td class='pre'> when manual line breaks/indentation would help readability * - dl.switch for switch statements * - ol.algorithm for algorithms (helps to visualize nesting) * - .figure and .caption (HTML4) and figure and figcaption (HTML5) * -> .sidefigure for right-floated figures * - ins/del * * Code * - pre and code * * Special Sections * - .note for informative notes (div, p, span, aside, details) * - .example for informative examples (div, p, pre, span) * - .issue for issues (div, p, span) * - .assertion for assertions (div, p, span) * - .advisement for loud normative statements (div, p, strong) * - .annoying-warning for spec obsoletion notices (div, aside, details) * * Definition Boxes * - pre.def for WebIDL definitions * - table.def for tables that define other entities (e.g. CSS properties) * - dl.def for definition lists that define other entitles (e.g. HTML elements) * * Numbering * - .secno for section numbers in .toc and headings (<span class='secno'>3.2</span>) * - .marker for source-inserted example/figure/issue numbers (<span class='marker'>Issue 4</span>) * - ::before styled for CSS-generated issue/example/figure numbers: * -> Documents wishing to use this only need to add * figcaption::before, * .caption::before { content: "Figure " counter(figure) " "; } * .example::before { content: "Example " counter(example) " "; } * .issue::before { content: "Issue " counter(issue) " "; } * * Header Stuff (ignore, just don't conflict with these classes) * - .head for the header * - .copyright for the copyright * * Miscellaneous * - .overlarge for things that should be as wide as possible, even if * that overflows the body text area. This can be used on an item or * on its container, depending on the effect desired. * Note that this styling basically doesn't help at all when printing, * since A4 paper isn't much wider than the max-width here. * It's better to design things to fit into a narrower measure if possible. * - js-added ToC jump links (see fixup.js) * ******************************************************************************/ /******************************************************************************/ /* Body */ /******************************************************************************/ body { counter-reset: example figure issue; /* Layout */ max-width: 50em; /* limit line length to 50em for readability */ margin: 0 auto; /* center text within page */ padding: 1.6em 1.5em 2em 50px; /* assume 16px font size for downlevel clients */ padding: 1.6em 1.5em 2em calc(26px + 1.5em); /* leave space for status flag */ /* Typography */ line-height: 1.5; font-family: sans-serif; widows: 2; orphans: 2; word-wrap: break-word; overflow-wrap: break-word; hyphens: auto; /* Colors */ color: black; background: white top left fixed no-repeat; background-size: 25px auto; } /******************************************************************************/ /* Front Matter & Navigation */ /******************************************************************************/ /** Header ********************************************************************/ div.head { margin-bottom: 1em } div.head hr { border-style: solid; } div.head h1 { font-weight: bold; margin: 0 0 .1em; font-size: 220%; } div.head h2 { margin-bottom: 1.5em;} /** W3C Logo ******************************************************************/ .head .logo { float: right; margin: 0.4rem 0 0.2rem .4rem; } .head img[src*="logos/W3C"] { display: block; border: solid #1a5e9a; border-width: .65rem .7rem .6rem; border-radius: .4rem; background: #1a5e9a; color: white; font-weight: bold; } .head a:hover > img[src*="logos/W3C"], .head a:focus > img[src*="logos/W3C"] { opacity: .8; } .head a:active > img[src*="logos/W3C"] { background: #c00; border-color: #c00; } /* see also additional rules in Link Styling section */ /** Copyright *****************************************************************/ p.copyright, p.copyright small { font-size: small } /** Back to Top / ToC Toggle **************************************************/ @media print { #toc-nav { display: none; } } @media not print { #toc-nav { position: fixed; z-index: 2; bottom: 0; left: 0; margin: 0; min-width: 1.33em; border-top-right-radius: 2rem; box-shadow: 0 0 2px; font-size: 1.5em; color: black; } #toc-nav > a { display: block; white-space: nowrap; height: 1.33em; padding: .1em 0.3em; margin: 0; background: white; box-shadow: 0 0 2px; border: none; border-top-right-radius: 1.33em; background: white; } #toc-nav > #toc-jump { padding-bottom: 2em; margin-bottom: -1.9em; } #toc-nav > a:hover, #toc-nav > a:focus { background: #f8f8f8; } #toc-nav > a:not(:hover):not(:focus) { color: #707070; } /* statusbar gets in the way on keyboard focus; remove once browsers fix */ #toc-nav > a[href="#toc"]:not(:hover):focus:last-child { padding-bottom: 1.5rem; } #toc-nav:not(:hover) > a:not(:focus) > span + span { /* Ideally this uses :focus-within on #toc-nav */ display: none; } #toc-nav > a > span + span { padding-right: 0.2em; } #toc-toggle-inline { vertical-align: 0.05em; font-size: 80%; color: gray; color: hsla(203,20%,40%,.7); border-style: none; background: transparent; position: relative; } #toc-toggle-inline:hover:not(:active), #toc-toggle-inline:focus:not(:active) { text-shadow: 1px 1px silver; top: -1px; left: -1px; } #toc-nav :active { color: #C00; } } /** ToC Sidebar ***************************************************************/ /* Floating sidebar */ @media screen { body.toc-sidebar #toc { position: fixed; top: 0; bottom: 0; left: 0; width: 23.5em; max-width: 80%; max-width: calc(100% - 2em - 26px); overflow: auto; padding: 0 1em; padding-left: 42px; padding-left: calc(1em + 26px); background: inherit; background-color: #f7f8f9; z-index: 1; box-shadow: -.1em 0 .25em rgba(0,0,0,.1) inset; } body.toc-sidebar #toc h2 { margin-top: .8rem; font-variant: small-caps; font-variant: all-small-caps; text-transform: lowercase; font-weight: bold; color: gray; color: hsla(203,20%,40%,.7); } body.toc-sidebar #toc-jump:not(:focus) { width: 0; height: 0; padding: 0; position: absolute; overflow: hidden; } } /* Hide main scroller when only the ToC is visible anyway */ @media screen and (max-width: 28em) { body.toc-sidebar { overflow: hidden; } } /* Sidebar with its own space */ @media screen and (min-width: 78em) { body:not(.toc-inline) #toc { position: fixed; top: 0; bottom: 0; left: 0; width: 23.5em; overflow: auto; padding: 0 1em; padding-left: 42px; padding-left: calc(1em + 26px); background: inherit; background-color: #f7f8f9; z-index: 1; box-shadow: -.1em 0 .25em rgba(0,0,0,.1) inset; } body:not(.toc-inline) #toc h2 { margin-top: .8rem; font-variant: small-caps; font-variant: all-small-caps; text-transform: lowercase; font-weight: bold; color: gray; color: hsla(203,20%,40%,.7); } body:not(.toc-inline) { padding-left: 29em; } /* See also Overflow section at the bottom */ body:not(.toc-inline) #toc-jump:not(:focus) { width: 0; height: 0; padding: 0; position: absolute; overflow: hidden; } } @media screen and (min-width: 90em) { body:not(.toc-inline) { margin: 0 4em; } } /******************************************************************************/ /* Sectioning */ /******************************************************************************/ /** Headings ******************************************************************/ h1, h2, h3, h4, h5, h6, dt { page-break-after: avoid; page-break-inside: avoid; font: 100% sans-serif; /* Reset all font styling to clear out UA styles */ font-family: inherit; /* Inherit the font family. */ line-height: 1.2; /* Keep wrapped headings compact */ hyphens: manual; /* Hyphenated headings look weird */ } h2, h3, h4, h5, h6 { margin-top: 3rem; } h1, h2, h3 { color: #005A9C; background: transparent; } h1 { font-size: 170%; } h2 { font-size: 140%; } h3 { font-size: 120%; } h4 { font-weight: bold; } h5 { font-style: italic; } h6 { font-variant: small-caps; } dt { font-weight: bold; } /** Subheadings ***************************************************************/ h1 + h2, #subtitle { /* #subtitle is a subtitle in an H2 under the H1 */ margin-top: 0; } h2 + h3, h3 + h4, h4 + h5, h5 + h6 { margin-top: 1.2em; /* = 1 x line-height */ } /** Section divider ***********************************************************/ :not(.head) > hr { font-size: 1.5em; text-align: center; margin: 1em auto; height: auto; border: transparent solid 0; background: transparent; } :not(.head) > hr::before { content: "\2727\2003\2003\2727\2003\2003\2727"; } /******************************************************************************/ /* Paragraphs and Lists */ /******************************************************************************/ p { margin: 1em 0; } dd > p:first-child, li > p:first-child { margin-top: 0; } ul, ol { margin-left: 0; padding-left: 2em; } li { margin: 0.25em 0 0.5em; padding: 0; } dl dd { margin: 0 0 .5em 2em; } .head dd + dd { /* compact for header */ margin-top: -.5em; } /* Style for algorithms */ ol.algorithm ol:not(.algorithm), .algorithm > ol ol:not(.algorithm) { border-left: 0.5em solid #DEF; } /* Put nice boxes around each algorithm. */ [data-algorithm]:not(.heading) { padding: .5em; border: thin solid #ddd; border-radius: .5em; margin: .5em calc(-0.5em - 1px); } [data-algorithm]:not(.heading) > :first-child { margin-top: 0; } [data-algorithm]:not(.heading) > :last-child { margin-bottom: 0; } /* Style for switch/case <dl>s */ dl.switch > dd > ol.only, dl.switch > dd > .only > ol { margin-left: 0; } dl.switch > dd > ol.algorithm, dl.switch > dd > .algorithm > ol { margin-left: -2em; } dl.switch { padding-left: 2em; } dl.switch > dt { text-indent: -1.5em; margin-top: 1em; } dl.switch > dt + dt { margin-top: 0; } dl.switch > dt::before { content: '\21AA'; padding: 0 0.5em 0 0; display: inline-block; width: 1em; text-align: right; line-height: 0.5em; } /** Terminology Markup ********************************************************/ /******************************************************************************/ /* Inline Markup */ /******************************************************************************/ /** Terminology Markup ********************************************************/ dfn { /* Defining instance */ font-weight: bolder; } a > i { /* Instance of term */ font-style: normal; } dt dfn code, code.idl { font-size: medium; } dfn var { font-style: normal; } /** Change Marking ************************************************************/ del { color: red; text-decoration: line-through; } ins { color: #080; text-decoration: underline; } /** Miscellaneous improvements to inline formatting ***************************/ sup { vertical-align: super; font-size: 80% } /******************************************************************************/ /* Code */ /******************************************************************************/ /** General monospace/pre rules ***********************************************/ pre, code, samp { font-family: Menlo, Consolas, "DejaVu Sans Mono", Monaco, monospace; font-size: .9em; page-break-inside: avoid; hyphens: none; text-transform: none; } pre code, code code { font-size: 100%; } pre { margin-top: 1em; margin-bottom: 1em; overflow: auto; } /** Inline Code fragments *****************************************************/ /* Do something nice. */ /******************************************************************************/ /* Links */ /******************************************************************************/ /** General Hyperlinks ********************************************************/ /* We hyperlink a lot, so make it less intrusive */ a[href] { color: #034575; text-decoration: none; border-bottom: 1px solid #707070; /* Need a bit of extending for it to look okay */ padding: 0 1px 0; margin: 0 -1px 0; } a:visited { border-bottom-color: #BBB; } /* Use distinguishing colors when user is interacting with the link */ a[href]:focus, a[href]:hover { background: #f8f8f8; background: rgba(75%, 75%, 75%, .25); border-bottom-width: 3px; margin-bottom: -2px; } a[href]:active { color: #C00; border-color: #C00; } /* Backout above styling for W3C logo */ .head .logo, .head .logo a { border: none; text-decoration: none; background: transparent; } /******************************************************************************/ /* Images */ /******************************************************************************/ img { border-style: none; } /* For autogen numbers, add .caption::before, figcaption::before { content: "Figure " counter(figure) ". "; } */ figure, .figure, .sidefigure { page-break-inside: avoid; text-align: center; margin: 2.5em 0; } .figure img, .sidefigure img, figure img, .figure object, .sidefigure object, figure object { max-width: 100%; margin: auto; } .figure pre, .sidefigure pre, figure pre { text-align: left; display: table; margin: 1em auto; } .figure table, figure table { margin: auto; } @media screen and (min-width: 20em) { .sidefigure { float: right; width: 50%; margin: 0 0 0.5em 0.5em } } .caption, figcaption, caption { font-style: italic; font-size: 90%; } .caption::before, figcaption::before, figcaption > .marker { font-weight: bold; } .caption, figcaption { counter-increment: figure; } /* DL list is indented 2em, but figure inside it is not */ dd > .figure, dd > figure { margin-left: -2em } /******************************************************************************/ /* Colored Boxes */ /******************************************************************************/ .issue, .note, .example, .assertion, .advisement, blockquote { padding: .5em; border: .5em; border-left-style: solid; page-break-inside: avoid; } span.issue, span.note { padding: .1em .5em .15em; border-right-style: solid; } .issue, .note, .example, .advisement, .assertion, blockquote { margin: 1em auto; } .note > p:first-child, .issue > p:first-child, blockquote > :first-child { margin-top: 0; } blockquote > :last-child { margin-bottom: 0; } /** Blockquotes ***************************************************************/ blockquote { border-color: silver; } /** Open issue ****************************************************************/ .issue { border-color: #E05252; background: #FBE9E9; counter-increment: issue; overflow: auto; } .issue::before, .issue > .marker { text-transform: uppercase; color: #AE1E1E; padding-right: 1em; text-transform: uppercase; } /* Add .issue::before { content: "Issue " counter(issue) " "; } for autogen numbers, or use class="marker" to mark up the issue number in source. */ /** Example *******************************************************************/ .example { border-color: #E0CB52; background: #FCFAEE; counter-increment: example; overflow: auto; clear: both; } .example::before, .example > .marker { text-transform: uppercase; color: #827017; min-width: 7.5em; display: block; } /* Add .example::before { content: "Example " counter(example) " "; } for autogen numbers, or use class="marker" to mark up the example number in source. */ /** Non-normative Note ********************************************************/ .note { border-color: #52E052; background: #E9FBE9; overflow: auto; } .note::before, .note > .marker, details.note > summary::before, details.note > summary > .marker { text-transform: uppercase; display: block; color: hsl(120, 70%, 30%); } /* Add .note::before { content: "Note"; } for autogen label, or use class="marker" to mark up the label in source. */ details.note > summary { display: block; color: hsl(120, 70%, 30%); } details.note[open] > summary { border-bottom: 1px silver solid; } /** Assertion Box *************************************************************/ /* for assertions in algorithms */ .assertion { border-color: #AAA; background: #EEE; } /** Advisement Box ************************************************************/ /* for attention-grabbing normative statements */ .advisement { border-color: orange; border-style: none solid; background: #FFEECC; } strong.advisement { display: block; text-align: center; } .advisement > .marker { color: #B35F00; } /** Spec Obsoletion Notice ****************************************************/ /* obnoxious obsoletion notice for older/abandoned specs. */ details { display: block; } summary { font-weight: bolder; } .annoying-warning:not(details), details.annoying-warning:not([open]) > summary, details.annoying-warning[open] { background: #fdd; color: red; font-weight: bold; padding: .75em 1em; border: thick red; border-style: solid; border-radius: 1em; } .annoying-warning :last-child { margin-bottom: 0; } @media not print { details.annoying-warning[open] { position: fixed; left: 1em; right: 1em; bottom: 1em; z-index: 1000; } } details.annoying-warning:not([open]) > summary { text-align: center; } /** Entity Definition Boxes ***************************************************/ .def { padding: .5em 1em; background: #DEF; margin: 1.2em 0; border-left: 0.5em solid #8CCBF2; } /******************************************************************************/ /* Tables */ /******************************************************************************/ th, td { text-align: left; text-align: start; } /** Property/Descriptor Definition Tables *************************************/ table.def { /* inherits .def box styling, see above */ width: 100%; border-spacing: 0; } table.def td, table.def th { padding: 0.5em; vertical-align: baseline; border-bottom: 1px solid #bbd7e9; } table.def > tbody > tr:last-child th, table.def > tbody > tr:last-child td { border-bottom: 0; } table.def th { font-style: italic; font-weight: normal; padding-left: 1em; width: 3em; } /* For when values are extra-complex and need formatting for readability */ table td.pre { white-space: pre-wrap; } /* A footnote at the bottom of a def table */ table.def td.footnote { padding-top: 0.6em; } table.def td.footnote::before { content: " "; display: block; height: 0.6em; width: 4em; border-top: thin solid; } /** Data tables (and properly marked-up index tables) *************************/ /* <table class="data"> highlights structural relationships in a table when correct markup is used (e.g. thead/tbody, th vs. td, scope attribute) Use class="complex data" for particularly complicated tables -- (This will draw more lines: busier, but clearer.) Use class="long" on table cells with paragraph-like contents (This will adjust text alignment accordingly.) Alternately use class="longlastcol" on tables, to have the last column assume "long". */ table { word-wrap: normal; overflow-wrap: normal; hyphens: manual; } table.data, table.index { margin: 1em auto; border-collapse: collapse; border: hidden; width: 100%; } table.data caption, table.index caption { max-width: 50em; margin: 0 auto 1em; } table.data td, table.data th, table.index td, table.index th { padding: 0.5em 1em; border-width: 1px; border-color: silver; border-top-style: solid; } table.data thead td:empty { padding: 0; border: 0; } table.data thead, table.index thead, table.data tbody, table.index tbody { border-bottom: 2px solid; } table.data colgroup, table.index colgroup { border-left: 2px solid; } table.data tbody th:first-child, table.index tbody th:first-child { border-right: 2px solid; border-top: 1px solid silver; padding-right: 1em; } table.data th[colspan], table.data td[colspan] { text-align: center; } table.complex.data th, table.complex.data td { border: 1px solid silver; text-align: center; } table.data.longlastcol td:last-child, table.data td.long { vertical-align: baseline; text-align: left; } table.data img { vertical-align: middle; } /* Alternate table alignment rules table.data, table.index { text-align: center; } table.data thead th[scope="row"], table.index thead th[scope="row"] { text-align: right; } table.data tbody th:first-child, table.index tbody th:first-child { text-align: right; } Possible extra rowspan handling table.data tbody th[rowspan]:not([rowspan='1']), table.index tbody th[rowspan]:not([rowspan='1']), table.data tbody td[rowspan]:not([rowspan='1']), table.index tbody td[rowspan]:not([rowspan='1']) { border-left: 1px solid silver; } table.data tbody th[rowspan]:first-child, table.index tbody th[rowspan]:first-child, table.data tbody td[rowspan]:first-child, table.index tbody td[rowspan]:first-child{ border-left: 0; border-right: 1px solid silver; } */ /******************************************************************************/ /* Indices */ /******************************************************************************/ /** Table of Contents *********************************************************/ .toc a { /* More spacing; use padding to make it part of the click target. */ padding-top: 0.1rem; /* Larger, more consistently-sized click target */ display: block; /* Reverse color scheme */ color: black; border-color: #3980B5; border-bottom-width: 3px !important; margin-bottom: 0px !important; } .toc a:visited { border-color: #054572; } .toc a:not(:focus):not(:hover) { /* Allow colors to cascade through from link styling */ border-bottom-color: transparent; } .toc, .toc ol, .toc ul, .toc li { list-style: none; /* Numbers must be inlined into source */ /* because generated content isn't search/selectable and markers can't do multilevel yet */ margin: 0; padding: 0; line-height: 1.1rem; /* consistent spacing */ } /* ToC not indented until third level, but font style & margins show hierarchy */ .toc > li { font-weight: bold; } .toc > li li { font-weight: normal; } .toc > li li li { font-size: 95%; } .toc > li li li li { font-size: 90%; } .toc > li li li li .secno { font-size: 85%; } .toc > li li li li li { font-size: 85%; } .toc > li li li li li .secno { font-size: 100%; } /* @supports not (display:grid) { */ .toc > li { margin: 1.5rem 0; } .toc > li li { margin: 0.3rem 0; } .toc > li li li { margin-left: 2rem; } /* Section numbers in a column of their own */ .toc .secno { float: left; width: 4rem; white-space: nowrap; } .toc li { clear: both; } :not(li) > .toc { margin-left: 5rem; } .toc .secno { margin-left: -5rem; } .toc > li li li .secno { margin-left: -7rem; } .toc > li li li li .secno { margin-left: -9rem; } .toc > li li li li li .secno { margin-left: -11rem; } /* Tighten up indentation in narrow ToCs */ @media (max-width: 30em) { :not(li) > .toc { margin-left: 4rem; } .toc .secno { margin-left: -4rem; } .toc > li li li { margin-left: 1rem; } .toc > li li li .secno { margin-left: -5rem; } .toc > li li li li .secno { margin-left: -6rem; } .toc > li li li li li .secno { margin-left: -7rem; } } /* } */ @supports (display:grid) { /* Use #toc over .toc to override non-@supports rules. */ #toc { display: grid; align-content: start; grid-template-columns: auto 1fr; grid-column-gap: 1rem; column-gap: 1rem; grid-row-gap: .6rem; row-gap: .6rem; } #toc h2 { grid-column: 1 / -1; margin-bottom: 0; } #toc ol, #toc li, #toc a { display: contents; /* Switch <a> to subgrid when supported */ } #toc span { margin: 0; } #toc > .toc > li > a > span { /* The spans of the top-level list, comprising the first items of each top-level section. */ margin-top: 1.1rem; } #toc#toc .secno { /* Ugh, need more specificity to override base.css */ grid-column: 1; width: auto; margin-left: 0; } #toc .content { grid-column: 2; width: auto; margin-right: 1rem; } #toc .content:hover { background: rgba(75%, 75%, 75%, .25); border-bottom: 3px solid #054572; margin-bottom: -3px; } #toc li li li .content { margin-left: 1rem; } #toc li li li li .content { margin-left: 2rem; } } /** Index *********************************************************************/ /* Index Lists: Layout */ ul.index { margin-left: 0; columns: 15em; text-indent: 1em hanging; } ul.index li { margin-left: 0; list-style: none; break-inside: avoid; } ul.index li li { margin-left: 1em } ul.index dl { margin-top: 0; } ul.index dt { margin: .2em 0 .2em 20px;} ul.index dd { margin: .2em 0 .2em 40px;} /* Index Lists: Typography */ ul.index ul, ul.index dl { font-size: smaller; } @media not print { ul.index li span { white-space: nowrap; color: transparent; } ul.index li a:hover + span, ul.index li a:focus + span { color: #707070; } } /** Index Tables *****************************************************/ /* See also the data table styling section, which this effectively subclasses */ table.index { font-size: small; border-collapse: collapse; border-spacing: 0; text-align: left; margin: 1em 0; } table.index td, table.index th { padding: 0.4em; } table.index tr:hover td:not([rowspan]), table.index tr:hover th:not([rowspan]) { background: #f7f8f9; } /* The link in the first column in the property table (formerly a TD) */ table.index th:first-child a { font-weight: bold; } /******************************************************************************/ /* Print */ /******************************************************************************/ @media print { /* Pages have their own margins. */ html { margin: 0; } /* Serif for print. */ body { font-family: serif; } } @page { margin: 1.5cm 1.1cm; } /******************************************************************************/ /* Legacy */ /******************************************************************************/ /* This rule is inherited from past style sheets. No idea what it's for. */ .hide { display: none } /******************************************************************************/ /* Overflow Control */ /******************************************************************************/ .figure .caption, .sidefigure .caption, figcaption { /* in case figure is overlarge, limit caption to 50em */ max-width: 50rem; margin-left: auto; margin-right: auto; } .overlarge > table { /* limit preferred width of table */ max-width: 50em; margin-left: auto; margin-right: auto; } @media (min-width: 55em) { .overlarge { margin-left: calc(13px + 26.5rem - 50vw); margin-right: calc(13px + 26.5rem - 50vw); max-width: none; } } @media screen and (min-width: 78em) { body:not(.toc-inline) .overlarge { /* 30.5em body padding 50em content area */ margin-left: calc(40em - 50vw) !important; margin-right: calc(40em - 50vw) !important; } } @media screen and (min-width: 90em) { body:not(.toc-inline) .overlarge { /* 4em html margin 30.5em body padding 50em content area */ margin-left: 0 !important; margin-right: calc(84.5em - 100vw) !important; } } @media not print { .overlarge { overflow-x: auto; /* See Lea Verou's explanation background-attachment: * http://lea.verou.me/2012/04/background-attachment-local/ * background: top left / 4em 100% linear-gradient(to right, #ffffff, rgba(255, 255, 255, 0)) local, top right / 4em 100% linear-gradient(to left, #ffffff, rgba(255, 255, 255, 0)) local, top left / 1em 100% linear-gradient(to right, #c3c3c5, rgba(195, 195, 197, 0)) scroll, top right / 1em 100% linear-gradient(to left, #c3c3c5, rgba(195, 195, 197, 0)) scroll, white; background-repeat: no-repeat; */ } } </style> <meta content="Bikeshed version 10ff3eb4050069e20bb9b943c8b76fe5bfe3a48f" name="generator"> <link href="https://dashif.org/guidelines/" rel="canonical"> <style>/* style-md-lists */ /* This is a weird hack for me not yet following the commonmark spec regarding paragraph and lists. */ [data-md] > :first-child { margin-top: 0; } [data-md] > :last-child { margin-bottom: 0; }</style> <style>/* style-selflinks */ .heading, .issue, .note, .example, li, dt { position: relative; } a.self-link { position: absolute; top: 0; left: calc(-1 * (3.5rem - 26px)); width: calc(3.5rem - 26px); height: 2em; text-align: center; border: none; transition: opacity .2s; opacity: .5; } a.self-link:hover { opacity: 1; } .heading > a.self-link { font-size: 83%; } li > a.self-link { left: calc(-1 * (3.5rem - 26px) - 2em); } dfn > a.self-link { top: auto; left: auto; opacity: 0; width: 1.5em; height: 1.5em; background: gray; color: white; font-style: normal; transition: opacity .2s, background-color .2s, color .2s; } dfn:hover > a.self-link { opacity: 1; } dfn > a.self-link:hover { color: black; } a.self-link::before { content: "�"; } .heading > a.self-link::before { content: "�"; } dfn > a.self-link::before { content: "#"; }</style> <style>/* style-counters */ body { counter-reset: example figure issue; } .issue { counter-increment: issue; } .issue:not(.no-marker)::before { content: "Issue " counter(issue); } .example { counter-increment: example; } .example:not(.no-marker)::before { content: "Example " counter(example); } .invalid.example:not(.no-marker)::before, .illegal.example:not(.no-marker)::before { content: "Invalid Example" counter(example); } figcaption { counter-increment: figure; } figcaption:not(.no-marker)::before { content: "Figure " counter(figure) " "; }</style> <style>/* style-autolinks */ .css.css, .property.property, .descriptor.descriptor { color: #005a9c; font-size: inherit; font-family: inherit; } .css::before, .property::before, .descriptor::before { content: " "; } .css::after, .property::after, .descriptor::after { content: " "; } .property, .descriptor { /* Don't wrap property and descriptor names */ white-space: nowrap; } .type { /* CSS value <type> */ font-style: italic; } pre .property::before, pre .property::after { content: ""; } [data-link-type="property"]::before, [data-link-type="propdesc"]::before, [data-link-type="descriptor"]::before, [data-link-type="value"]::before, [data-link-type="function"]::before, [data-link-type="at-rule"]::before, [data-link-type="selector"]::before, [data-link-type="maybe"]::before { content: " "; } [data-link-type="property"]::after, [data-link-type="propdesc"]::after, [data-link-type="descriptor"]::after, [data-link-type="value"]::after, [data-link-type="function"]::after, [data-link-type="at-rule"]::after, [data-link-type="selector"]::after, [data-link-type="maybe"]::after { content: " "; } [data-link-type].production::before, [data-link-type].production::after, .prod [data-link-type]::before, .prod [data-link-type]::after { content: ""; } [data-link-type=element], [data-link-type=element-attr] { font-family: Menlo, Consolas, "DejaVu Sans Mono", monospace; font-size: .9em; } [data-link-type=element]::before { content: "<" } [data-link-type=element]::after { content: ">" } [data-link-type=biblio] { white-space: pre; }</style> <style>/* style-dfn-panel */ .dfn-panel { position: absolute; z-index: 35; height: auto; width: -webkit-fit-content; width: fit-content; max-width: 300px; max-height: 500px; overflow: auto; padding: 0.5em 0.75em; font: small Helvetica Neue, sans-serif, Droid Sans Fallback; background: #DDDDDD; color: black; border: outset 0.2em; } .dfn-panel:not(.on) { display: none; } .dfn-panel * { margin: 0; padding: 0; text-indent: 0; } .dfn-panel > b { display: block; } .dfn-panel a { color: black; } .dfn-panel a:not(:hover) { text-decoration: none !important; border-bottom: none !important; } .dfn-panel > b + b { margin-top: 0.25em; } .dfn-panel ul { padding: 0; } .dfn-panel li { list-style: inside; } .dfn-panel.activated { display: inline-block; position: fixed; left: .5em; bottom: 2em; margin: 0 auto; max-width: calc(100vw - 1.5em - .4em - .5em); max-height: 30vh; } .dfn-paneled { cursor: pointer; } </style> <style>/* style-syntax-highlighting */ .highlight:not(.idl) { background: hsl(24, 20%, 95%); } code.highlight { padding: .1em; border-radius: .3em; } pre.highlight, pre > code.highlight { display: block; padding: 1em; margin: .5em 0; overflow: auto; border-radius: 0; } c-[a] { color: #990055 } /* Keyword.Declaration */ c-[b] { color: #990055 } /* Keyword.Type */ c-[c] { color: #708090 } /* Comment */ c-[d] { color: #708090 } /* Comment.Multiline */ c-[e] { color: #0077aa } /* Name.Attribute */ c-[f] { color: #669900 } /* Name.Tag */ c-[g] { color: #222222 } /* Name.Variable */ c-[k] { color: #990055 } /* Keyword */ c-[l] { color: #000000 } /* Literal */ c-[m] { color: #000000 } /* Literal.Number */ c-[n] { color: #0077aa } /* Name */ c-[o] { color: #999999 } /* Operator */ c-[p] { color: #999999 } /* Punctuation */ c-[s] { color: #a67f59 } /* Literal.String */ c-[t] { color: #a67f59 } /* Literal.String.Single */ c-[u] { color: #a67f59 } /* Literal.String.Double */ c-[cp] { color: #708090 } /* Comment.Preproc */ c-[c1] { color: #708090 } /* Comment.Single */ c-[cs] { color: #708090 } /* Comment.Special */ c-[kc] { color: #990055 } /* Keyword.Constant */ c-[kn] { color: #990055 } /* Keyword.Namespace */ c-[kp] { color: #990055 } /* Keyword.Pseudo */ c-[kr] { color: #990055 } /* Keyword.Reserved */ c-[ld] { color: #000000 } /* Literal.Date */ c-[nc] { color: #0077aa } /* Name.Class */ c-[no] { color: #0077aa } /* Name.Constant */ c-[nd] { color: #0077aa } /* Name.Decorator */ c-[ni] { color: #0077aa } /* Name.Entity */ c-[ne] { color: #0077aa } /* Name.Exception */ c-[nf] { color: #0077aa } /* Name.Function */ c-[nl] { color: #0077aa } /* Name.Label */ c-[nn] { color: #0077aa } /* Name.Namespace */ c-[py] { color: #0077aa } /* Name.Property */ c-[ow] { color: #999999 } /* Operator.Word */ c-[mb] { color: #000000 } /* Literal.Number.Bin */ c-[mf] { color: #000000 } /* Literal.Number.Float */ c-[mh] { color: #000000 } /* Literal.Number.Hex */ c-[mi] { color: #000000 } /* Literal.Number.Integer */ c-[mo] { color: #000000 } /* Literal.Number.Oct */ c-[sb] { color: #a67f59 } /* Literal.String.Backtick */ c-[sc] { color: #a67f59 } /* Literal.String.Char */ c-[sd] { color: #a67f59 } /* Literal.String.Doc */ c-[se] { color: #a67f59 } /* Literal.String.Escape */ c-[sh] { color: #a67f59 } /* Literal.String.Heredoc */ c-[si] { color: #a67f59 } /* Literal.String.Interpol */ c-[sx] { color: #a67f59 } /* Literal.String.Other */ c-[sr] { color: #a67f59 } /* Literal.String.Regex */ c-[ss] { color: #a67f59 } /* Literal.String.Symbol */ c-[vc] { color: #0077aa } /* Name.Variable.Class */ c-[vg] { color: #0077aa } /* Name.Variable.Global */ c-[vi] { color: #0077aa } /* Name.Variable.Instance */ c-[il] { color: #000000 } /* Literal.Number.Integer.Long */ </style> <body class="h-entry"> <div class="head"> <p data-fill-with="logo"><a href="https://dashif.org/"><img src="Images/DASH-IF.png"></a> </p> <h1 class="p-name no-ref" id="title">DASH-IF Implementation Guidelines: Content Protection Information Exchange Format (CPIX)</h1> <h2 class="no-num no-toc no-ref heading settled" id="subtitle"><span class="content">Commit Snapshot, <time class="dt-updated" datetime="2019-03-22">22 March 2019</time></span></h2> <div data-fill-with="spec-metadata"> <dl> <dt>This version: <dd><a class="u-url" href="https://dashif.org/guidelines/">https://dashif.org/guidelines/</a> <dt>Issue Tracking: <dd><a href="https://github.com/Dash-Industry-Forum/CPIX/issues">GitHub</a> <dt class="editor">Editors: <dd class="editor p-author h-card vcard"><span class="p-name fn">DASH-IF IOP</span> (<span class="p-org org">Content Protection and Security task force</span>) <dd class="editor p-author h-card vcard"><span class="p-name fn"></span> </dl> </div> <div data-fill-with="warning"></div> <hr title="Separator for header"> </div> <div data-fill-with="at-risk"></div> <nav data-fill-with="table-of-contents" id="toc"> <h2 class="no-num no-toc no-ref" id="contents">Table of Contents</h2> <ol class="toc" role="directory"> <li><a href="#scope"><span class="secno">1</span> <span class="content">Scope</span></a> <li><a href="#disclaimer"><span class="secno">2</span> <span class="content">Disclaimer</span></a> <li> <a href="#main-intro"><span class="secno">3</span> <span class="content">Introduction</span></a> <ol class="toc"> <li><a href="#intro-conformance"><span class="secno">3.1</span> <span class="content">Normative Language</span></a> <li><a href="#intro-terms"><span class="secno">3.2</span> <span class="content">Terms &amp; Definitions</span></a> </ol> <li> <a href="#usecases"><span class="secno">4</span> <span class="content">Use Cases and Requirements</span></a> <ol class="toc"> <li><a href="#architecture"><span class="secno">4.1</span> <span class="content">Overview of the End to End Architecture</span></a> <li> <a href="#usecases-packaging"><span class="secno">4.2</span> <span class="content">Use Cases for the Preparation of Content</span></a> <ol class="toc"> <li><a href="#usecases-packaging-ondemand"><span class="secno">4.2.1</span> <span class="content">On-Demand Content</span></a> <li><a href="#usecases-packaging-live"><span class="secno">4.2.2</span> <span class="content">Live Content</span></a> <li><a href="#usecases-packaging-catchup"><span class="secno">4.2.3</span> <span class="content">Catch-up</span></a> <li><a href="#usecases-packaging-est"><span class="secno">4.2.4</span> <span class="content">Electronic Sell Through</span></a> </ol> <li> <a href="#usecases-exchange"><span class="secno">4.3</span> <span class="content">Exchange over an Interface</span></a> <ol class="toc"> <li><a href="#usecase-delivery-to-one"><span class="secno">4.3.1</span> <span class="content">Content Key Delivery to One Entity</span></a> <li><a href="#usecase-secure-delivery-to-many"><span class="secno">4.3.2</span> <span class="content">Secure Content Key Delivery to Several Entities</span></a> <li> <a href="#usecase-usagerules"><span class="secno">4.3.3</span> <span class="content">Content Key Delivery with Usage Rules</span></a> <ol class="toc"> <li><a href="#usecase-usagerules-labelfilter"><span class="secno">4.3.3.1</span> <span class="content">Label Filter</span></a> <li><a href="#usecase-usagerules-periodfilter"><span class="secno">4.3.3.2</span> <span class="content">Key Period Filter</span></a> <li><a href="#usecase-usagerules-policyfilters"><span class="secno">4.3.3.3</span> <span class="content">Policy-based Filters</span></a> </ol> <li><a href="#usecase-drm-signaling"><span class="secno">4.3.4</span> <span class="content"><span>Content Key</span> Delivery with DRM Signaling</span></a> <li><a href="#usecase-incremental-authoring"><span class="secno">4.3.5</span> <span class="content">Incremental Update and Extension of the Document</span></a> <li><a href="#usecase-hierarchy-delivery"><span class="secno">4.3.6</span> <span class="content">Content Key Hierarchy Delivery for Content Packaging</span></a> <li><a href="#usecase-rootkey-delivery"><span class="secno">4.3.7</span> <span class="content">Root Key Delivery for License Server Operation</span></a> </ol> <li> <a href="#workflows"><span class="secno">4.4</span> <span class="content">Workflow Examples</span></a> <ol class="toc"> <li> <a href="#workflows-intro"><span class="secno">4.4.1</span> <span class="content">Encryptor Producer and Encryptor Consumer</span></a> <ol class="toc"> <li><a href="#workflows-encryptorproducer"><span class="secno">4.4.1.1</span> <span class="content">Encryptor Producer</span></a> <li><a href="#workflows-encryptorconsumer"><span class="secno">4.4.1.2</span> <span class="content">Encryptor Consumer</span></a> <li><a href="#workflows-multiple-producers"><span class="secno">4.4.1.3</span> <span class="content">Multiple Producers</span></a> </ol> </ol> <li><a href="#main-requirements"><span class="secno">4.5</span> <span class="content">Requirements</span></a> </ol> <li> <a href="#schema"><span class="secno">5</span> <span class="content">XSD Schema Definition</span></a> <ol class="toc"> <li><a href="#schema-structure"><span class="secno">5.1</span> <span class="content">Structure Overview</span></a> <li> <a href="#schema-datamodel"><span class="secno">5.2</span> <span class="content">Hierarchical data model</span></a> <ol class="toc"> <li><a href="#schema-cpix"><span class="secno">5.2.1</span> <span class="content"><span><code class="highlight">CPIX</code></span> Element</span></a> <li><a href="#schema-deliverydatalist"><span class="secno">5.2.2</span> <span class="content"><span><code class="highlight">DeliveryDataList</code></span> Element</span></a> <li><a href="#schema-deliverydata"><span class="secno">5.2.3</span> <span class="content"><span><code class="highlight">DeliveryData</code></span> Element</span></a> <li><a href="#schema-contentkeylist"><span class="secno">5.2.4</span> <span class="content"><span><code class="highlight">ContentKeyList</code></span> Element</span></a> <li><a href="#schema-contentkey"><span class="secno">5.2.5</span> <span class="content"><span><code class="highlight">ContentKey</code></span> Element</span></a> <li><a href="#schema-drmsystemlist"><span class="secno">5.2.6</span> <span class="content"><span><code class="highlight">DRMSystemList</code></span> Element</span></a> <li><a href="#schema-drmsystem"><span class="secno">5.2.7</span> <span class="content"><span><code class="highlight">DRMSystem</code></span> Element</span></a> <li><a href="#schema-HLSsignalingdata"><span class="secno">5.2.8</span> <span class="content"><span><code class="highlight">HLSSignalingData</code></span> Element</span></a> <li><a href="#schema-contentkeyperiodlist"><span class="secno">5.2.9</span> <span class="content"><span><code class="highlight">ContentKeyPeriodList</code></span> Element</span></a> <li><a href="#schema-contentkeyperiod"><span class="secno">5.2.10</span> <span class="content"><span><code class="highlight">ContentKeyPeriod</code></span> Element</span></a> <li><a href="#schema-contentkeyusagerulelist"><span class="secno">5.2.11</span> <span class="content"><span><code class="highlight">ContentKeyUsageRuleList</code></span> Element</span></a> <li><a href="#schema-contentkeyusagerule"><span class="secno">5.2.12</span> <span class="content"><span><code class="highlight">ContentKeyUsageRule</code></span> Element</span></a> <li> <a href="#schema-usagerulefilter"><span class="secno">5.2.13</span> <span class="content"><span><code class="highlight">Usage Rules Filters</code></span></span></a> <ol class="toc"> <li><a href="#schema-usagerulefilter-intro"><span class="secno">5.2.13.1</span> <span class="content"><span><code class="highlight"> Introduction</code></span></span></a> <li><a href="#schema-keyperiodfilter"><span class="secno">5.2.13.2</span> <span class="content"><span><code class="highlight">KeyPeriodFilter</code></span> Element</span></a> <li><a href="#schema-labelfilter"><span class="secno">5.2.13.3</span> <span class="content"><span><code class="highlight">LabelFilter</code></span> Element</span></a> <li><a href="#schema-videofilter"><span class="secno">5.2.13.4</span> <span class="content"><span><code class="highlight">VideoFilter</code></span> Element</span></a> <li><a href="#schema-audiofilter"><span class="secno">5.2.13.5</span> <span class="content"><span><code class="highlight">AudioFilter</code></span> Element</span></a> <li><a href="#schema-bitratefilter"><span class="secno">5.2.13.6</span> <span class="content"><span><code class="highlight">BitrateFilter</code></span> Element</span></a> </ol> <li><a href="#schema-updatehistoryitemlist"><span class="secno">5.2.14</span> <span class="content"><span><code class="highlight">UpdateHistoryItemList</code></span> Element</span></a> <li><a href="#schema-updatehistoryitem"><span class="secno">5.2.15</span> <span class="content"><span><code class="highlight">UpdateHistoryItem</code></span> Element</span></a> </ol> </ol> <li> <a href="#keys"><span class="secno">6</span> <span class="content">Key Management</span></a> <ol class="toc"> <li> <a href="#keys-enc"><span class="secno">6.1</span> <span class="content">Key Encryption in the CPIX Document</span></a> <ol class="toc"> <li><a href="#keys-enc-keytypes"><span class="secno">6.1.1</span> <span class="content">Keys Used to Secure the CPIX Document</span></a> <li><a href="#keys-enc-mac"><span class="secno">6.1.2</span> <span class="content">Authenticated Encryption</span></a> <li><a href="#keys-enc-signatures"><span class="secno">6.1.3</span> <span class="content">Digital Signature</span></a> <li><a href="#keys-enc-algorithms"><span class="secno">6.1.4</span> <span class="content">Mandatory Algorithms</span></a> </ol> <li><a href="#keys-rotation"><span class="secno">6.2</span> <span class="content">Key Rotation Support</span></a> <li><a href="#keys-hierarchies"><span class="secno">6.3</span> <span class="content">Hierarchical Keys</span></a> </ol> <li><a href="#examples"><span class="secno">7</span> <span class="content">Examples</span></a> <li> <a href="#index"><span class="secno"></span> <span class="content">Index</span></a> <ol class="toc"> <li><a href="#index-defined-here"><span class="secno"></span> <span class="content">Terms defined by this specification</span></a> </ol> <li> <a href="#references"><span class="secno"></span> <span class="content">References</span></a> <ol class="toc"> <li><a href="#normative"><span class="secno"></span> <span class="content">Normative References</span></a> </ol> </ol> </nav> <main> <h2 class="heading settled" data-level="1" id="scope"><span class="secno">1. </span><span class="content">Scope</span><a class="self-link" href="#scope"></a></h2> <p>The scope of this document is to define a Content Protection Information Exchange Format (CPIX). A CPIX document contains keys and DRM information used for encrypting and protecting content and can be used for exchanging this information among entities needing it in many possibly different workflows for preparing, for example, DASH or HLS content. The CPIX document itself can be encrypted, signed and authenticated so that its receivers can be sure that its confidentiality, source and integrity are also protected.</p> <p>This specification describes version 2.2 of the CPIX document format. Detailed changes with respect to version 2.1 are tracked on <a href="https://github.com/Dash-Industry-Forum/CPIX/issues">GitHub</a>. Highlighted changes are:</p> <ul> <li data-md> <p>Bug fixes on the HLS signalization support.</p> </ul> <h2 class="heading settled" data-level="2" id="disclaimer"><span class="secno">2. </span><span class="content">Disclaimer</span><a class="self-link" href="#disclaimer"></a></h2> <p>This is a document made available by DASH-IF. The technology embodied in this document may involve the use of intellectual property rights, including patents and patent applications owned or controlled by any of the authors or developers of this document. No patent license, either implied or express, is granted to you by this document. DASH-IF has made no search or investigation for such rights and DASH-IF disclaims any duty to do so. The rights and obligations which apply to DASH-IF documents, as such rights and obligations are set forth and defined in the DASH-IF Bylaws and IPR Policy including, but not limited to, patent and other intellectual property license rights and obligations. A copy of the DASH-IF Bylaws and IPR Policy can be obtained at http://dashif.org/.</p> <p>The material contained herein is provided on an AS IS basis and to the maximum extent permitted by applicable law, this material is provided AS IS, and the authors and developers of this material and DASH-IF hereby disclaim all other warranties and conditions, either express, implied or statutory, including, but not limited to, any (if any) implied warranties, duties or conditions of merchantability, of fitness for a particular purpose, of accuracy or completeness of responses, of workmanlike effort, and of lack of negligence.</p> <p>In addition, this document may include references to documents and/or technologies controlled by third parties. Those third party documents and technologies may be subject to third party rules and licensing terms. No intellectual property license, either implied or express, to any third party material is granted to you by this document or DASH-IF. DASH-IF makes no any warranty whatsoever for such third party material.</p> <h2 class="heading settled" data-level="3" id="main-intro"><span class="secno">3. </span><span class="content">Introduction</span><a class="self-link" href="#main-intro"></a></h2> <p>This document defines a container allowing the exchange between entities of content protection information typically made of keys used for encrypting content and any associated DRM specific information. There may be one or several keys and these keys may be protected by one or several DRMs, hence there may be one or several DRM specific information. There is no assumption on the entities exchanging this information but it is not expected that a client device will use this exchange format. The goal is to allow entities involved in the content preparation workflow to get the content protection information so that, for example a DASH MPD can be generated with all content protection information.</p> <p>Because the defined container is not made for a specifically defined content preparation workflow but is generic, conformance is not considered to be a critical part of CPIX. As a consequence, no conformance is defined for this specification.</p> <h3 class="heading settled" data-level="3.1" id="intro-conformance"><span class="secno">3.1. </span><span class="content">Normative Language</span><a class="self-link" href="#intro-conformance"></a></h3> See <a data-link-type="biblio" href="#biblio-dash-if-iop">[DASH-IF-IOP]</a> section 2.3. <h3 class="heading settled" data-level="3.2" id="intro-terms"><span class="secno">3.2. </span><span class="content">Terms &amp; Definitions</span><a class="self-link" href="#intro-terms"></a></h3> <dl> <dt data-md><dfn class="dfn-paneled" data-dfn-type="dfn" data-noexport id="content">Content</dfn> <dd data-md> <p>One or more audio-visual elementary streams and the associated MPD if in DASH format.</p> <dt data-md><dfn class="dfn-paneled" data-dfn-type="dfn" data-noexport id="content-key">Content Key</dfn> <dd data-md> <p>A cryptographic key used for encrypting part of the <a data-link-type="dfn" href="#content" id="ref-for-content">Content</a>.</p> <dt data-md><dfn class="dfn-paneled" data-dfn-type="dfn" data-noexport id="content-protection">Content Protection</dfn> <dd data-md> <p>The mechanism ensuring that only authorized devices get access to <a data-link-type="dfn" href="#content" id="ref-for-content`$">Content</a>.</p> <dt data-md><dfn class="dfn-paneled" data-dfn-type="dfn" data-noexport id="drm-signaling">DRM Signaling</dfn> <dd data-md> <p>The DRM specific information to be added in <a data-link-type="dfn" href="#content" id="ref-for-contenta$">Content</a> for proper operation of the DRM system when authorizing a device for this <a data-link-type="dfn" href="#content" id="ref-for-contentb$">Content</a>. It is made of proprietary information for licensing and key retrieval.</p> <dt data-md><dfn class="dfn-paneled" data-dfn-type="dfn" data-noexport id="document-key">Document Key</dfn> <dd data-md> <p>A cryptographic key used for encrypting the <a data-link-type="dfn" href="#content-key" id="ref-for-content-key">Content Key</a>(s) in the CPIX document.</p> <dt data-md><dfn class="dfn-paneled" data-dfn-type="dfn" data-noexport id="pssh">PSSH</dfn> <dd data-md> <p>Protection System Specific Header box that is part of an ISOBMFF file. This box contains <a data-link-type="dfn" href="#drm-signaling" id="ref-for-drm-signaling">DRM Signaling</a>.</p> <dt data-md><dfn class="dfn-paneled" data-dfn-type="dfn" data-noexport id="content-key-context">Content Key Context</dfn> <dd data-md> <p>The portion of a media stream which is encrypted with a specific <a data-link-type="dfn" href="#content-key" id="ref-for-content-key`$">Content Key</a>.</p> </dl> <h2 class="heading settled" data-level="4" id="usecases"><span class="secno">4. </span><span class="content">Use Cases and Requirements</span><a class="self-link" href="#usecases"></a></h2> <p><a data-link-type="dfn" href="#content-key" id="ref-for-content-keya$">Content Key</a>s and <a data-link-type="dfn" href="#drm-signaling" id="ref-for-drm-signaling`$">DRM Signaling</a>, a.k.a. content protection information need to be created and exchanged between some system entities when preparing <a data-link-type="dfn" href="#content" id="ref-for-contentc$">Content</a>. The flows of information are of very different nature depending on where <a data-link-type="dfn" href="#content-key" id="ref-for-content-keyb$">Content Key</a>s are created and also depending on the type of <a data-link-type="dfn" href="#content" id="ref-for-contentd$">Content</a> that can be either On-Demand or Live.</p> <p>This section presents different use cases where such exchanges are required. <a href="#architecture">�4.1 Overview of the End to End Architecture</a> is an overview of the general context in which exchange of content protection information is happening, <a href="#usecases-packaging">�4.2 Use Cases for the Preparation of Content</a> describes some workflows for content creation and <a href="#usecases-exchange">�4.3 Exchange over an Interface</a> goes in the details of how content protection information can be exchanged over an interface between two entities.</p> <h3 class="heading settled" data-level="4.1" id="architecture"><span class="secno">4.1. </span><span class="content">Overview of the End to End Architecture</span><a class="self-link" href="#architecture"></a></h3> <p>This informative section gives a general overview of the context in which content protection information need to be exchanged between entities in the backend. It completes section 7.5 of <a data-link-type="biblio" href="#biblio-dash-if-iop">[DASH-IF-IOP]</a> by putting more emphasis on the backend aspects.</p> <p>This informative section takes DASH content as an example for providing more specific and clear understanding, but this can be generalized to other streaming formats, such as HLS.</p> <figure> <img src="Images/Architecture.png"> <figcaption>Logical roles that exchange DRM information and media.</figcaption> </figure> <p>The figure above shows logical entities that may send or receive DRM information such as media keys, asset identifiers, licenses, and license acquisition information. A physical entity may combine multiple logical roles, and the point of origin for information, such as media keys and asset identifiers, can differ; so various information flows are possible. This is an informative example of how the roles are distributed to facilitate the description of workflow and use cases. Alternative roles and functions can be applied to create conformant content. The different roles are:</p> <p><strong>Content Provider</strong> - A publisher who provides the rights and rules for delivering protected media, also possibly source media (mezzanine format, for transcoding), asset identifiers, key identifiers (KID), key values, encoding instructions, and content description metadata.</p> <p><strong>Encoder</strong> - A service provider who encodes media in a specified set of formats with different bitrates and resolutions etc., possibly determined by the publisher.</p> <p><strong>Packager / Encryptor</strong> - A service provider who encrypts and packages media, inserting <a data-link-type="dfn" href="#drm-signaling" id="ref-for-drm-signalinga$">DRM Signaling</a> and metadata into the media files. In the case of DASH packaging, this consists of adding the default_KID in the file header tenc box, initialization vectors and subsample byte ranges in track fragments indexed by saio and saiz boxes, and possibly one or more <a data-link-type="dfn" href="#pssh" id="ref-for-pssh">PSSH</a> boxes containing license acquisition information (from the DRM Service). Tracks that are partially encrypted or encrypted with multiple keys require sample to group boxes and sample group description boxes in each track fragment to associate different KIDs to groups of samples. The Packager could originate values for KIDs, <a data-link-type="dfn" href="#content-key" id="ref-for-content-keyc$">Content Key</a>s, encryption layout, etc., then send that information to other entities that need it, including the DRM Service and Streamer, and probably the Content Provider. However, the Packager could receive that information from a different point of origin, such as the Content Provider or DRM Service.</p> <p><strong>Manifest Creator</strong> - A service provider which generates the media manifests which group the various media files into a coherent presentation. These manifest files may contain <a data-link-type="dfn" href="#drm-signaling" id="ref-for-drm-signalingb$">DRM Signaling</a> information. For DASH, the MPD Creator is assumed to create one or more types of DASH MPD files, and provide indexing of Segments and/or sidx indexes for download so that players can byte range index Subsegments. The MPD must include descriptors for Common Encryption and DRM key management systems, and should include identification of the default_KID for each AdaptationSet element, and sufficient information in UUID ContentProtection Descriptor elements to acquire a DRM license. The default_KID is available from the Packager and any other role that created it, and the DRM specific information is available from the DRM Service.</p> <p><strong>DRM Client</strong> - It gets information from different sources: media manifest files, media files, and DRM licenses.</p> <p><strong>DRM Service</strong> - The DRM Service creates licenses containing a protected <a data-link-type="dfn" href="#content-key" id="ref-for-content-keyd$">Content Key</a> that can only be decrypted by a trusted DRM Client.</p> <p>The DRM Service needs to know the default_KID and DRM SystemID and possibly other information like asset ID and player domain ID in order to create and download one or more licenses required for a Presentation on a particular device. Each DRM system has different license acquisition information, a slightly different license acquisition protocol, and a different license format with different playback rules, output rules, revocation and renewal system, etc. For DASH, the DRM Service typically must supply the Streamer and the Packager license acquisition information for each UUID ContentProtection Descriptor element or <a data-link-type="dfn" href="#pssh" id="ref-for-pssh`$">PSSH</a> box, respectively.</p> <p>The DRM Service may also provide logic to manage key rotation, DRM domain management, revocation and renewal and other <a data-link-type="dfn" href="#content-protection" id="ref-for-content-protection">Content Protection</a> related features.</p> <h3 class="heading settled" data-level="4.2" id="usecases-packaging"><span class="secno">4.2. </span><span class="content">Use Cases for the Preparation of Content</span><a class="self-link" href="#usecases-packaging"></a></h3> <p>This informative section describes some workflows for content preparation where content protection information is exchanged between or carried through some entities.</p> <p>As for the previous section, this informative section takes DASH content as an example for providing more specific and clear understanding, but this can be generalized to other streaming formats, such as HLS.</p> <h4 class="heading settled" data-level="4.2.1" id="usecases-packaging-ondemand"><span class="secno">4.2.1. </span><span class="content">On-Demand Content</span><a class="self-link" href="#usecases-packaging-ondemand"></a></h4> <p>The flow for preparing On-Demand Content requires that a media asset is available non-encrypted, ideally in the maximum resolution so that an adaptive streaming presentation can be prepared.</p> <p>One possible flow is that a Content Management System (CMS) creates a workflow ensuring that DASH Content is prepared. The CMS makes the file available to a transcoder. The transcoder outputs the segmented files that can be encrypted. The encryption engine either generates the <a data-link-type="dfn" href="#content-key" id="ref-for-content-keye$">Content Key</a>s or requests them from a DRM system. The DRM system also provides <a data-link-type="dfn" href="#pssh" id="ref-for-pssha$">PSSH</a> boxes to be added to the media files, as well as ContentProtection elements to be added to the MPD file. When the encrypted DASH Content is ready, the MPD is generated by a MPD Generator It asks the DRM system the required <a data-link-type="dfn" href="#drm-signaling" id="ref-for-drm-signalingc$">DRM Signaling</a> to be added in the MPD. DASH content is then uploaded by the CMS on a CDN making it available to users. In parallel, editorial metadata is exported to the Portal, enabling access to users. DRM systems receive relevant metadata information that needs to be included in the license (output controls) when creating a license.</p> <p>This flow is summarized in the figure below where arrows show the flow of information.</p> <figure> <img src="Images/ExampleWorkflow-OnDemand.png"> <figcaption>Example of workflow for On-Demand Content preparation.</figcaption> </figure> <h4 class="heading settled" data-level="4.2.2" id="usecases-packaging-live"><span class="secno">4.2.2. </span><span class="content">Live Content</span><a class="self-link" href="#usecases-packaging-live"></a></h4> <p>Metadata is regularly imported with new or updated information. Metadata can include different type of information on the EPG events such as the duration of the event, the list of actors, the output controls usage rules, a purchase window, etc.</p> <p>Content is continuously received, transcoded in the desired format and encrypted if any type of entitlement is required.</p> <p>One or many <a data-link-type="dfn" href="#content-key" id="ref-for-content-keyf$">Content Key</a>s can be used if key rotation is used or not. Such setting is static and configuration is hard-coded in the relevant equipment, hence a Content Management System is not required for this workflow to operate. As for Content on-Demand, keys are generated by the encryption engine or the DRM system and are available to all DRM systems and the encryption engine at the right moment depending on how these keys are used. The encoder requests to the DRM systems their specific signaling, if any, to be added in the MPD.</p> <p>Encrypted segments and the media manifest are uploaded on a CDN making it available to users.</p> <p>Metadata is exported to the Portal, enabling access to users. DRM systems receive relevant metadata information that needs to be included in the license (output controls).</p> <p>This flow is summarized in the figure below where arrows show the flow of information.</p> <figure> <img src="Images/ExampleWorkflow-Live.png"> <figcaption>Example of workflow for Live Content preparation.</figcaption> </figure> <h4 class="heading settled" data-level="4.2.3" id="usecases-packaging-catchup"><span class="secno">4.2.3. </span><span class="content">Catch-up</span><a class="self-link" href="#usecases-packaging-catchup"></a></h4> <p>Live Content has already been encoded and encrypted (if required) for Live unicast. All DRM systems have access to the keys.</p> <p>Additional metadata may be required for ensuring that events are effectively available in catch-up. These are made available to the Portal and some Live events are identified as being able to be replayed as On-demand. Optionally, the operator may choose to replace the advertising content with targeted ads.</p> <h4 class="heading settled" data-level="4.2.4" id="usecases-packaging-est"><span class="secno">4.2.4. </span><span class="content">Electronic Sell Through</span><a class="self-link" href="#usecases-packaging-est"></a></h4> <p>In order to make available its Content in a defined and controlled quality, a content owner is preparing it. Preparation includes transcoding to the desired format and encryption of the resulting segments. The content owner is generating also the <a data-link-type="dfn" href="#content-key" id="ref-for-content-keyg$">Content Key</a>(s). At the end of the process, <a data-link-type="dfn" href="#content" id="ref-for-contente$">Content</a> is ready and stored along with the <a data-link-type="dfn" href="#content-key" id="ref-for-content-keyh$">Content Key</a>(s).</p> <p>Later the content owner distributes the prepared <a data-link-type="dfn" href="#content" id="ref-for-contentf$">Content</a> to multiple locations, in addition metadata describing it is also made available to retail platforms so that it becomes salable on multiples Portals. In parallel, the content owner distributes the <a data-link-type="dfn" href="#content-key" id="ref-for-content-key`$�$">Content Key</a>(s) to any authorized DRM system. A DRM system is authorized if it is one used by one of the Portal that has this <a data-link-type="dfn" href="#content" id="ref-for-contentg$">Content</a> for sale.</p> <h3 class="heading settled" data-level="4.3" id="usecases-exchange"><span class="secno">4.3. </span><span class="content">Exchange over an Interface</span><a class="self-link" href="#usecases-exchange"></a></h3> <p>This informative section gives details on how content protection information is exchanged or transferred over an interface between two or more entities.</p> <h4 class="heading settled" data-level="4.3.1" id="usecase-delivery-to-one"><span class="secno">4.3.1. </span><span class="content">Content Key Delivery to One Entity</span><a class="self-link" href="#usecase-delivery-to-one"></a></h4> <p>In the simplest use case, content protection information is made of a <a data-link-type="dfn" href="#content-key" id="ref-for-content-key`$`$">Content Key</a>. One entity sends a <a data-link-type="dfn" href="#content-key" id="ref-for-content-key`$a$">Content Key</a> to the other entity.</p> <figure> <img src="Diagrams/UseCase-ClearDeliveryToOne.png"> <figcaption>Content Key delivery to one entity.</figcaption> </figure> <p>The primary data model carried by content protection information document is made of one to many <a data-link-type="dfn" href="#content-key" id="ref-for-content-key`$b$">Content Key</a>s with their associated KeyIDs. Any context or meaning is attributed externally. The document simply serves as a standard way to serialize <a data-link-type="dfn" href="#content-key" id="ref-for-content-key`$c$">Content Key</a>s for delivery.</p> <h4 class="heading settled" data-level="4.3.2" id="usecase-secure-delivery-to-many"><span class="secno">4.3.2. </span><span class="content">Secure Content Key Delivery to Several Entities</span><a class="self-link" href="#usecase-secure-delivery-to-many"></a></h4> <p>This use case is an extension of <a href="#usecase-delivery-to-one">�4.3.1 Content Key Delivery to One Entity</a> and is compatible with the use cases presented in the following sections.</p> <figure> <img src="Diagrams/UseCase-EncryptedDeliveryToMany.png"> <figcaption>Secure Content Key delivery to Several Entities.</figcaption> </figure> <p>The entities exchanging <a data-link-type="dfn" href="#content-key" id="ref-for-content-key`$d$">Content Key</a>s may want to rely upon a trust relationship that ensures authentication and privacy of communications. Such a mechanism can be provided by the communication protocol used to deliver the document but the document can also be self-protected. CPIX documents can deliver <a data-link-type="dfn" href="#content-key" id="ref-for-content-key`$e$">Content Key</a>s in encrypted and digitally signed form, enabling confidentiality, authentication and nonrepudiation.</p> <p>In situations with more than one recipient, the document allows each one to decrypt the <a data-link-type="dfn" href="#content-key" id="ref-for-content-key`$f$">Content Key</a>s using its own private key.</p> <h4 class="heading settled" data-level="4.3.3" id="usecase-usagerules"><span class="secno">4.3.3. </span><span class="content">Content Key Delivery with Usage Rules</span><a class="self-link" href="#usecase-usagerules"></a></h4> <p>These use cases are extension of <a href="#usecase-delivery-to-one">�4.3.1 Content Key Delivery to One Entity</a> and present different rules that can be applied on a <a data-link-type="dfn" href="#content-key" id="ref-for-content-key`$g$">Content Key</a> when delivered to an entity. Each usage rule defines a set of filters that are used to define a <a data-link-type="dfn" href="#content-key-context" id="ref-for-content-key-context">Content Key Context</a>. If a rule match is found, the <a data-link-type="dfn" href="#content-key" id="ref-for-content-key`$h$">Content Key</a> referenced by the usage rule is to be used to encrypt the <a data-link-type="dfn" href="#content-key-context" id="ref-for-content-key-context`$">Content Key Context</a> defined by the rule.</p> <figure> <img src="Diagrams/UseCase-DeliveryWithUsageRules.png"> <figcaption>Content Key Delivery with key usage rules.</figcaption> </figure> <h5 class="heading settled" data-level="4.3.3.1" id="usecase-usagerules-labelfilter"><span class="secno">4.3.3.1. </span><span class="content">Label Filter</span><a class="self-link" href="#usecase-usagerules-labelfilter"></a></h5> <p>This use case adds information to <a data-link-type="dfn" href="#content-key" id="ref-for-content-keya$�$">Content Key</a>s that specifies how they are to be mapped to labelled <a data-link-type="dfn" href="#content-key-context" id="ref-for-content-key-contexta$">Content Key Context</a>s, where the labeling system has been pre-agreed between the producer and consumer of the CPIX document.</p> <p>For example, labels might be the IDs of DASH adaptation sets or, for more compatibility with formats other than DASH, names of media files/directories or input values for arbitrary custom logic.</p> <p>The recipient will use the added information to map <a data-link-type="dfn" href="#content-key" id="ref-for-content-keya$`$">Content Key</a>s to <a data-link-type="dfn" href="#content-key-context" id="ref-for-content-key-contextb$">Content Key Context</a>s defined by labels.</p> <h5 class="heading settled" data-level="4.3.3.2" id="usecase-usagerules-periodfilter"><span class="secno">4.3.3.2. </span><span class="content">Key Period Filter</span><a class="self-link" href="#usecase-usagerules-periodfilter"></a></h5> <p>This use case adds information to <a data-link-type="dfn" href="#content-key" id="ref-for-content-keya$a$">Content Key</a>s that specifies how they are to be mapped to key periods, a.k.a. crypto-periods for <a data-link-type="dfn" href="#content-key" id="ref-for-content-keya$b$">Content Key</a> rotation. The mapping is accomplished by defining key periods and mapping <a data-link-type="dfn" href="#content-key" id="ref-for-content-keya$c$">Content Key</a>s to any number of key periods.</p> <p>The recipient will use the added information to map <a data-link-type="dfn" href="#content-key" id="ref-for-content-keya$d$">Content Key</a>s to time periods.</p> <h5 class="heading settled" data-level="4.3.3.3" id="usecase-usagerules-policyfilters"><span class="secno">4.3.3.3. </span><span class="content">Policy-based Filters</span><a class="self-link" href="#usecase-usagerules-policyfilters"></a></h5> <p>This use case associates policy-based information with <a data-link-type="dfn" href="#content-key" id="ref-for-content-keya$e$">Content Key</a>s, constraining how they define <a data-link-type="dfn" href="#content-key-context" id="ref-for-content-key-contextc$">Content Key Context</a>s. Policy based filters are, for example, video or audio stream attributes and bitrate ranges.</p> <p>The recipient will use the added information to map <a data-link-type="dfn" href="#content-key" id="ref-for-content-keya$f$">Content Key</a>s to <a data-link-type="dfn" href="#content-key-context" id="ref-for-content-key-contextd$">Content Key Context</a>s according to the defined policy.</p> <p>Having no policy in some dimension means that the <a data-link-type="dfn" href="#content-key-context" id="ref-for-content-key-contexte$">Content Key Context</a> is not constrained in that dimension. For example, if the HDR policy is not specified, the <a data-link-type="dfn" href="#content-key-context" id="ref-for-content-key-contextf$">Content Key Context</a> may include both HDR and non-HDR media.</p> <h4 class="heading settled" data-level="4.3.4" id="usecase-drm-signaling"><span class="secno">4.3.4. </span><span class="content"><a data-link-type="dfn" href="#content-key" id="ref-for-content-keya$g$">Content Key</a> Delivery with DRM Signaling</span><a class="self-link" href="#usecase-drm-signaling"></a></h4> <p>This use case is an extension of <a href="#usecase-delivery-to-one">�4.3.1 Content Key Delivery to One Entity</a> and is compatible with <a href="#usecase-usagerules">�4.3.3 Content Key Delivery with Usage Rules</a>.</p> <p>This use case adds <a data-link-type="dfn" href="#drm-signaling" id="ref-for-drm-signalingd$">DRM Signaling</a> information to each <a data-link-type="dfn" href="#content-key" id="ref-for-content-keya$h$">Content Key</a>. The recipient may embed this signaling into the data streams it generates.</p> <figure> <img src="Diagrams/UseCase-DeliveryWithDrmSignaling.png"> <figcaption>Content Key Delivery with DRM Signaling.</figcaption> </figure> <p>The primary data model carried by content protection information document needs then to include zero to many DRM system signaling elements, each element consisting of a DRM system ID, some signaling information such as for example signaling data for a DASH manifest or a HLS playlist or signaling data for an ISOBMFF file.</p> <p>The use of 3rd party extensions enable the inclusion of DRM system signaling in forms suitable for other media delivery technologies.</p> <p>The recipient may use the part of signaling data that it understands and knows how to embed into its output, ignoring signaling data that targets other media delivery technologies.</p> <h4 class="heading settled" data-level="4.3.5" id="usecase-incremental-authoring"><span class="secno">4.3.5. </span><span class="content">Incremental Update and Extension of the Document</span><a class="self-link" href="#usecase-incremental-authoring"></a></h4> <p>This use case illustrates the usage of the content protection information document in a realistic workflow comprising multiple cooperating components that require a standardized data format for content protection information exchange.</p> <figure> <img src="Diagrams/UseCase-DeliveryWithIncrementalUpdate_Part1.png"> <img src="Diagrams/UseCase-DeliveryWithIncrementalUpdate_Part2.png"> <figcaption>Incremental Update and Extension of the Document.</figcaption> </figure> <p>Each component participating in such a workflow is the authority on a particular aspect. For example, the Key Server manages <a data-link-type="dfn" href="#content-key" id="ref-for-content-keyb$�$">Content Key</a>s and usage rules and may define the key periods, the DRM System knows how to define the correct <a data-link-type="dfn" href="#drm-signaling" id="ref-for-drm-signalinge$">DRM Signaling</a> and the Encryption Engine might want to inform the Packager what representations the <a data-link-type="dfn" href="#content-key" id="ref-for-content-keyb$`$">Content Key</a>s actually got mapped to (the Packager might not have enough information to resolve usage rules based on detailed metadata, so the Encryption Engine could define a new set of usage rules that are simple enough for the Packager to understand, e.g. by making use of label filters).</p> <p>As the document travels in the workflow, each component adds the elements containing the content protection items it generates (key periods, usage rules, <a data-link-type="dfn" href="#content-key" id="ref-for-content-keyb$a$">Content Key</a>s, <a data-link-type="dfn" href="#drm-signaling" id="ref-for-drm-signalingf$">DRM Signaling</a>, etc), making it suitable for the next component that will make use of it. After each modification, the added elements may be signed to maintain a chain of trust on each set of elements individually. The document in its entirety may also be signed to authenticate the document as a whole.</p> <p>Note that in the above example, the <a data-link-type="dfn" href="#content-key" id="ref-for-content-keyb$b$">Content Key</a> material itself is encrypted for the Encryption Engine. Despite the fact that many other components participate in the workflow, they do not have access to <a data-link-type="dfn" href="#content-key" id="ref-for-content-keyb$c$">Content Key</a>s.</p> <h4 class="heading settled" data-level="4.3.6" id="usecase-hierarchy-delivery"><span class="secno">4.3.6. </span><span class="content">Content Key Hierarchy Delivery for Content Packaging</span><a class="self-link" href="#usecase-hierarchy-delivery"></a></h4> <p>Some DRM systems enable the use of hierarchy of keys, where the set of keys delivered to clients (root keys) within licenses differs from the set of keys used to encrypt Content (leaf keys). Doing so enable DRM systems to separate content encryption and commercial offer management.</p> <p>Packaging content that uses a key hierarchy requires the Packager to know:</p> <ul> <li data-md> <p>The leaf keys.</p> <li data-md> <p>The KIDs of the root keys (but not the root keys themselves).</p> <li data-md> <p>DRM system signaling data for both root and leaf keys.</p> </ul> <p>To fulfill this use case, CPIX enables the above data to be exchanged.</p> <h4 class="heading settled" data-level="4.3.7" id="usecase-rootkey-delivery"><span class="secno">4.3.7. </span><span class="content">Root Key Delivery for License Server Operation</span><a class="self-link" href="#usecase-rootkey-delivery"></a></h4> <p>Some DRM systems enable the use of hierarchical keys, where the set of keys delivered to clients (root keys) differs from the set of keys used to encrypt Content (leaf keys).</p> <p>When, for example, key creation is not a function of the license server, creating licenses in scenarios that use hierarchical keys requires the license server to know the root keys. CPIX enables root keys to be delivered to license servers.</p> <p>The exchange of root keys is technically identical to the exchange of non-hierarchical <a data-link-type="dfn" href="#content-key" id="ref-for-content-keyb$d$">Content Key</a>s as described in <a href="#usecase-delivery-to-one">�4.3.1 Content Key Delivery to One Entity</a>. It is expected that the recipient of a CPIX document in this use case is already aware of the hierarchical nature of the keys within, without any signaling in the CPIX document.</p> <h3 class="heading settled" data-level="4.4" id="workflows"><span class="secno">4.4. </span><span class="content">Workflow Examples</span><a class="self-link" href="#workflows"></a></h3> <h4 class="heading settled" data-level="4.4.1" id="workflows-intro"><span class="secno">4.4.1. </span><span class="content">Encryptor Producer and Encryptor Consumer</span><a class="self-link" href="#workflows-intro"></a></h4> <p>There are many workflows that are possible, depending on which entities provide information in the CPIX document, and which entities consume that information. Two simple single-producer, single-consumer examples are illustrated below:</p> <figure> <img src="Images/Workflow-EncryptorProducer.png"> <figcaption>Encryptor Producer.</figcaption> </figure> <figure> <img src="Images/Workflow-EncryptorConsumer.png"> <figcaption>Encryptor Consumer.</figcaption> </figure> <p>All workflows require that content protection information and <a data-link-type="dfn" href="#content-key" id="ref-for-content-keyb$e$">Content Key</a>s be exchanged between two or more entities. In the examples above the entities are the Encryptor and DRM System:</p> <ul> <li data-md> <p>The Encryptor Producer example allows, in this case, the Encryptor to generate <a data-link-type="dfn" href="#content-key" id="ref-for-content-keyb$f$">Content Key</a>s and to push them to one or many DRM systems. The Encryptor could expect to receive from the DRM systems some <a data-link-type="dfn" href="#drm-signaling" id="ref-for-drm-signalingg$">DRM Signaling</a>.</p> <li data-md> <p>The Encryptor Consumer example allows the Encryptor to pull <a data-link-type="dfn" href="#content-key" id="ref-for-content-keyb$g$">Content Key</a>s and <a data-link-type="dfn" href="#drm-signaling" id="ref-for-drm-signalingh$">DRM Signaling</a> from a DRM system. In this case, <a data-link-type="dfn" href="#content-key" id="ref-for-content-keyb$h$">Content Key</a>s are generated by the DRM System.</p> </ul> <p>The document allows supporting both workflows above in addition to other workflows not explicitly described here.</p> <p>Before exchanging key information in a secure manner, the entities which exchange key material must know about each other and share public keys so that one entity could encrypt data and the other entity could decrypt it. This important step of Trust establishment is out of the scope of this document.</p> <h5 class="heading settled" data-level="4.4.1.1" id="workflows-encryptorproducer"><span class="secno">4.4.1.1. </span><span class="content">Encryptor Producer</span><a class="self-link" href="#workflows-encryptorproducer"></a></h5> <p>This informative section shows a possible workflow for securing the exchange of the key information between entities when the Encryptor generates the <a data-link-type="dfn" href="#content-key" id="ref-for-content-keyc$�$">Content Key</a>s. In this example, the Encryptor is the entity which is taking responsibility for generating the <a data-link-type="dfn" href="#content-key" id="ref-for-content-keyc$`$">Content Key</a>s, protecting them and pushing them to the DRM Systems.</p> <ul> <li data-md> <p>The first step is the Trust establishment. Public keys must be exchanged between two or more entities (the Encryptors and the DRM Systems) prior exchanges.</p> <li data-md> <p>Once the Trust is established and the necessary associated key material is shared between entities, <a data-link-type="dfn" href="#content-key" id="ref-for-content-keyc$a$">Content Key</a>s can be exchanged. The Encryptor is encrypting these keys using DRM Systems public keys. The DRM Systems can decrypt using their own private key.</p> <li data-md> <p>The Encryptor provides crypto material required to uniquely identify the entity capable of decrypting the media.</p> </ul> <p>All these steps are summarized in the figure below.</p> <figure> <img src="Images/Workflow-EncryptorProducer-Steps.png"> <figcaption>Encryptor Producer example steps.</figcaption> </figure> <h5 class="heading settled" data-level="4.4.1.2" id="workflows-encryptorconsumer"><span class="secno">4.4.1.2. </span><span class="content">Encryptor Consumer</span><a class="self-link" href="#workflows-encryptorconsumer"></a></h5> <p>This informative section shows a possible workflow for securing the exchange of the key information between entities when the DRM System generates the <a data-link-type="dfn" href="#content-key" id="ref-for-content-keyc$b$">Content Key</a>s. In this model, the Encryptor can pull documents directly from a DRM System. In this case, the DRM System is generating <a data-link-type="dfn" href="#content-key" id="ref-for-content-keyc$c$">Content Key</a>s and is encrypting them for a secure delivery to the Encryptor.</p> <ul> <li data-md> <p>As in the case of the Encryptor Producer model, the first step is the Trust establishment. Public keys must be exchanged between two or more entities (the Encryptors and the DRM System) prior exchanges.</p> <li data-md> <p>The DRM System will use the public key of the Encryptor to encrypt keys to be inserted in the document and will send it to Encryptor.</p> <li data-md> <p>The Encryptor can decrypt the <a data-link-type="dfn" href="#content-key" id="ref-for-content-keyc$d$">Content Key</a>s using its private key.</p> </ul> <p>All these steps are summarized in the figure below.</p> <figure> <img src="Images/Workflow-EncryptorConsumer-Steps.png"> <figcaption>Encryptor Consumer example steps.</figcaption> </figure> <h5 class="heading settled" data-level="4.4.1.3" id="workflows-multiple-producers"><span class="secno">4.4.1.3. </span><span class="content">Multiple Producers</span><a class="self-link" href="#workflows-multiple-producers"></a></h5> <p>This informative section illustrates that it is possible to have more complex workflows than those previously illustrated. In one such example, for DASH content, a media packager might define the types of streams in the presentation, an Encryptor might generate the <a data-link-type="dfn" href="#content-key" id="ref-for-content-keyc$e$">Content Key</a>s, a DRM System might generate other <a data-link-type="dfn" href="#drm-signaling" id="ref-for-drm-signaling`$�$">DRM Signaling</a>, An Encryptor and an MPD Generator might be the consumers of the final document. In such workflows, the document gets passed from entity to entity in sequence, with each entity adding top-level elements, and recording the update.</p> <figure> <img src="Images/Workflow-MultipleProducers.png"> <figcaption>Multiple Producers example.</figcaption> </figure> <ul> <li data-md> <p>The first step is the Trust establishment. Public keys must be exchanged between two or more entities prior to exchanges.</p> <li data-md> <p>Once the Trust is established and the necessary associated key material is shared between entities, <a data-link-type="dfn" href="#content-key" id="ref-for-content-keyc$f$">Content Key</a>s can be exchanged.</p> <li data-md> <p>The Packager provides identification of the receivers and the various stream encoding criteria (usage rules) in version 1 of the document.</p> <li data-md> <p>The Encryptor adds key information in version 2 of the document. These elements only contain Keys and no DRM information.</p> <li data-md> <p>The DRM System imports the <a data-link-type="dfn" href="#content-key" id="ref-for-content-keyc$g$">Content Key</a>s stored in the document, and adds its own information in version 3 of the document, which is the finalized version.</p> <li data-md> <p>The Encryptor extracts content protection information from the document to be embedded in the media (e.g. <a data-link-type="dfn" href="#pssh" id="ref-for-psshb$">PSSH</a> boxes).</p> <li data-md> <p>The MPD Generator also extracts content protection related information from the document to be embedded in the MPD document (e.g. <a data-link-type="dfn" href="#pssh" id="ref-for-psshc$">PSSH</a> boxes, key IDs).</p> </ul> <p>All these steps are summarized in the figure below.</p> <figure> <img src="Images/Workflow-MultipleProducers-Steps.png"> <figcaption>Multiple Producers example steps.</figcaption> </figure> <h3 class="heading settled" data-level="4.5" id="main-requirements"><span class="secno">4.5. </span><span class="content">Requirements</span><a class="self-link" href="#main-requirements"></a></h3> <p>It shall be possible to exchange <a data-link-type="dfn" href="#content-key" id="ref-for-content-keyc$h$">Content Key</a>(s) and <a data-link-type="dfn" href="#drm-signaling" id="ref-for-drm-signaling`$`$">DRM Signaling</a> between entities involved in Content preparation workflows, an example of such interface where the exchange shall be possible is between a DRM system and the encryption engine.</p> <p>It shall be possible that the manifest generator receives <a data-link-type="dfn" href="#drm-signaling" id="ref-for-drm-signaling`$a$">DRM Signaling</a> for several DRM systems and/or content formats</p> <p>Update of <a data-link-type="dfn" href="#content-key" id="ref-for-content-keyd$�$">Content Key</a>(s) shall be possible at periodic time or based on events. Some period of time could be in the clear (no encryption).</p> <p>It shall allow generating MPD conformant to <a data-link-type="biblio" href="#biblio-dash-if-iop">[DASH-IF-IOP]</a>.</p> <p><a data-link-type="dfn" href="#content-key" id="ref-for-content-keyd$`$">Content Key</a>(s) shall be secured over the interface.</p> <p>Entities exchanging content protection information should be authenticated.</p> <h2 class="heading settled" data-level="5" id="schema"><span class="secno">5. </span><span class="content">XSD Schema Definition</span><a class="self-link" href="#schema"></a></h2> <p>This section describes the Content Protection Information eXchange (CPIX) format to provide a framework to securely exchange <a data-link-type="dfn" href="#content-key" id="ref-for-content-keyd$a$">Content Key</a>(s) and <a data-link-type="dfn" href="#drm-signaling" id="ref-for-drm-signaling`$b$">DRM Signaling</a> between different system entities (see Section 2). This is an XML file that is described by the XSD provided in <a data-link-type="biblio" href="#biblio-cpix-xsd">[CPIX-XSD]</a>. This section describes in details elements part of the schema.</p> <h3 class="heading settled" data-level="5.1" id="schema-structure"><span class="secno">5.1. </span><span class="content">Structure Overview</span><a class="self-link" href="#schema-structure"></a></h3> <p>The structure is articulated around <a data-link-type="dfn" href="#content-key" id="ref-for-content-keyd$b$">Content Key</a>s and the accompanying material. The document contains all the information required for allowing any entitled entity to get access to or add in the <a data-link-type="dfn" href="#content-key" id="ref-for-content-keyd$c$">Content Key</a>s and either consume or add material, such as time constraint, DRM information to the CPIX document. The same XML file can be shared between several receiving entities. Hence, each one must be able to decrypt keys and must be properly identified.</p> <p>Taking this into account, the CPIX document contains lists of elements:</p> <ul> <li data-md> <p>DeliveryDataList: This list contains instances of DeliveryData, each of which describes an entity entitled to decrypt <a data-link-type="dfn" href="#content-key" id="ref-for-content-keyd$d$">Content Key</a>s contained in the CPIX document.</p> <li data-md> <p>ContentKeyList: This list contains instances of ContentKey, each of which contains a <a data-link-type="dfn" href="#content-key" id="ref-for-content-keyd$e$">Content Key</a> used for encrypting media.</p> <li data-md> <p>DRMSystemList: This list contains instances of DRMSystem, each of which contains the signaling data to associate one DRM system with one <a data-link-type="dfn" href="#content-key" id="ref-for-content-keyd$f$">Content Key</a>.</p> <li data-md> <p>ContentKeyPeriodList: This list contains instances of ContentKeyPeriod, each of which defines a time period that may be referenced by the key period filters included in <a data-link-type="dfn" href="#content-key" id="ref-for-content-keyd$g$">Content Key</a> usage rules.</p> <li data-md> <p>ContentKeyUsageRuleList: This list contains instances of ContentKeyUsageRule, which maps a <a data-link-type="dfn" href="#content-key" id="ref-for-content-keyd$h$">Content Key</a> to one or more <a data-link-type="dfn" href="#content-key-context" id="ref-for-content-key-contextg$">Content Key Context</a>s.</p> <li data-md> <p>UpdateHistoryItemList: This list contains instances of UpdateHistoryItem, each of which contains an update version number and an identifier of the entity which produced the update. Other elements in the document are linked to a specific update by update version number (via the <code class="highlight"><a data-link-type="element-sub" href="#element-attrdef-updatehistoryitem-updateversion" id="ref-for-element-attrdef-updatehistoryitem-updateversion">updateVersion</a></code> attribute).</p> <li data-md> <p>Signature: Each instance of this element contains a digital signature <a data-link-type="biblio" href="#biblio-xmldsig-core">[XMLDSIG-CORE]</a> over either the entire document or a subset of XML elements.</p> </ul> <p>The <a data-link-type="dfn" href="#content-key" id="ref-for-content-keye$�$">Content Key</a>s can be encrypted inside the XML file using the public keys of the recipients, identified in the DeliveryData elements. The XML file also allows storing the <a data-link-type="dfn" href="#content-key" id="ref-for-content-keye$`$">Content Key</a>s in the clear, in which case the security of the <a data-link-type="dfn" href="#content-key" id="ref-for-content-keye$a$">Content Key</a>s is contingent on the security of the communication channel used to deliver the CPIX document to the recipients.</p> <p>The figure below shows the first elements and a high-level view of the structure. Detailed description of the structure is given in the following sections.</p> <figure> <img src="Images/Schema-TopLevel.png"> <figcaption>Content Protection Information Exchange Format high level view.</figcaption> </figure> <h3 class="heading settled" data-level="5.2" id="schema-datamodel"><span class="secno">5.2. </span><span class="content">Hierarchical data model</span><a class="self-link" href="#schema-datamodel"></a></h3> <p>In this section the following conventions are used:</p> <ul> <li data-md> <p>Element names are in <code class="highlight">PascalCase</code> and attribute names are in <code class="highlight">camelCase</code>.</p> <li data-md> <p>Each type member is suffixed with its use requirements and its data type.</p> <li data-md> <p>Child element use requirements specify the number of elements allowed (<code class="highlight">min...max</code>) where N means unbounded.</p> <li data-md> <p>Attribute use requirements indicate M=Mandatory, O=Optional, OD=Optional with Default Value, CM=Conditionally Mandatory.</p> </ul> <p>Child elements must be in the order specified here. Attributes may be in any order.</p> <p>The XSD schema for this model is provided in <a data-link-type="biblio" href="#biblio-cpix-xsd">[CPIX-XSD]</a>. In addition to types defined in this document, the CPIX data model references types defined in <a data-link-type="biblio" href="#biblio-xmlschema11-2">[XMLSCHEMA11-2]</a>, <a data-link-type="biblio" href="#biblio-rfc6030">[RFC6030]</a>, <a data-link-type="biblio" href="#biblio-xmldsig-core">[XMLDSIG-CORE]</a> and <a data-link-type="biblio" href="#biblio-xmlenc-core">[XMLENC-CORE]</a>. External data types are prefixed with <code class="highlight">xs:</code>, <code class="highlight">pskc:</code>, <code class="highlight">ds:</code> and <code class="highlight">xenc:</code> respectively.</p> <h4 class="heading settled" data-level="5.2.1" id="schema-cpix"><span class="secno">5.2.1. </span><span class="content"><dfn data-dfn-type="element" data-export id="elementdef-cpix"><code class="highlight">CPIX</code><a class="self-link" href="#elementdef-cpix"></a></dfn> Element</span><a class="self-link" href="#schema-cpix"></a></h4> <p>The root element that carries the Content Protection Information for a set of media assets.</p> <dl> <dt data-md><dfn data-dfn-for="CPIX" data-dfn-type="element-attr" data-export id="element-attrdef-cpix-id"><code class="highlight">id</code><a class="self-link" href="#element-attrdef-cpix-id"></a></dfn> (O, xs:ID) <dd data-md> <p>Specifies an identifier for the CPIX document. It is recommended to use an identifier that is unique within the scope in which this file is published.</p> <dt data-md><dfn data-dfn-for="CPIX" data-dfn-type="element-attr" data-export id="element-attrdef-cpix-contentid"><code class="highlight">contentId</code><a class="self-link" href="#element-attrdef-cpix-contentid"></a></dfn> (O, xs:string) <dd data-md> <p>Specifies an identifier for the asset or content that is been protected by the keys carried in this CPIX document. It is recommended to use an identifier that is unique within the scope in which this file is published.</p> <dt data-md><dfn data-dfn-for="CPIX" data-dfn-type="element-attr" data-export id="element-attrdef-cpix-name"><code class="highlight">name</code><a class="self-link" href="#element-attrdef-cpix-name"></a></dfn> (O, xs:string) <dd data-md> <p>The name of the presentation.</p> <dt data-md><dfn data-dfn-for="CPIX" data-dfn-type="element-attr" data-export id="element-attrdef-cpix-deliverydatalist"><code class="highlight">DeliveryDataList</code><a class="self-link" href="#element-attrdef-cpix-deliverydatalist"></a></dfn> (0...1, <code class="highlight"><a data-link-type="element" href="#elementdef-deliverydatalist" id="ref-for-elementdef-deliverydatalist">DeliveryDataList</a></code>) <dd data-md> <p>A container for <code class="highlight"><a data-link-type="element" href="#elementdef-deliverydata" id="ref-for-elementdef-deliverydata">DeliveryData</a></code> elements. If not present, <a data-link-type="dfn" href="#content-key" id="ref-for-content-keye$b$">Content Key</a>s in the document are delivered in the clear, without encryption.</p> <dt data-md><dfn data-dfn-for="CPIX" data-dfn-type="element-attr" data-export id="element-attrdef-cpix-contentkeylist"><code class="highlight">ContentKeyList</code><a class="self-link" href="#element-attrdef-cpix-contentkeylist"></a></dfn> (0...1, <code class="highlight"><a data-link-type="element" href="#elementdef-contentkeylist" id="ref-for-elementdef-contentkeylist">ContentKeyList</a></code>) <dd data-md> <p>A container for <code class="highlight"><a data-link-type="element" href="#elementdef-contentkey" id="ref-for-elementdef-contentkey">ContentKey</a></code> elements.</p> <dt data-md><dfn data-dfn-for="CPIX" data-dfn-type="element-attr" data-export id="element-attrdef-cpix-drmsystemlist"><code class="highlight">DRMSystemList</code><a class="self-link" href="#element-attrdef-cpix-drmsystemlist"></a></dfn> (0...1, <code class="highlight"><a data-link-type="element" href="#elementdef-drmsystemlist" id="ref-for-elementdef-drmsystemlist">DRMSystemList</a></code>) <dd data-md> <p>A container for <code class="highlight"><a data-link-type="element" href="#elementdef-drmsystem" id="ref-for-elementdef-drmsystem">DRMSystem</a></code> elements. If not present, the document does not contain any DRM system signaling data.</p> <dt data-md><dfn data-dfn-for="CPIX" data-dfn-type="element-attr" data-export id="element-attrdef-cpix-contentkeyperiodlist"><code class="highlight">ContentKeyPeriodList</code><a class="self-link" href="#element-attrdef-cpix-contentkeyperiodlist"></a></dfn> (0...1, <code class="highlight"><a data-link-type="element" href="#elementdef-contentkeyperiodlist" id="ref-for-elementdef-contentkeyperiodlist">ContentKeyPeriodList</a></code>) <dd data-md> <p>A container for <code class="highlight"><a data-link-type="element" href="#elementdef-contentkeyperiod" id="ref-for-elementdef-contentkeyperiod">ContentKeyPeriod</a></code> elements.</p> <dt data-md><dfn data-dfn-for="CPIX" data-dfn-type="element-attr" data-export id="element-attrdef-cpix-contentkeyusagerulelist"><code class="highlight">ContentKeyUsageRuleList</code><a class="self-link" href="#element-attrdef-cpix-contentkeyusagerulelist"></a></dfn> (0...1, <code class="highlight"><a data-link-type="element" href="#elementdef-contentkeyusagerulelist" id="ref-for-elementdef-contentkeyusagerulelist">ContentKeyUsageRuleList</a></code>) <dd data-md> <p>Container for <code class="highlight"><a data-link-type="element" href="#elementdef-contentkeyusagerule" id="ref-for-elementdef-contentkeyusagerule">ContentKeyUsageRule</a></code> elements. If not present, the document does not define <a data-link-type="dfn" href="#content-key-context" id="ref-for-content-key-contexth$">Content Key Context</a>s and an external mechanism is required for synchronizing the content creation workflow.</p> <dt data-md><dfn data-dfn-for="CPIX" data-dfn-type="element-attr" data-export id="element-attrdef-cpix-updatehistoryitemlist"><code class="highlight">UpdateHistoryItemList</code><a class="self-link" href="#element-attrdef-cpix-updatehistoryitemlist"></a></dfn> (0...1, <code class="highlight"><a data-link-type="element" href="#elementdef-updatehistoryitemlist" id="ref-for-elementdef-updatehistoryitemlist">UpdateHistoryItemList</a></code>) <dd data-md> <p>Container for <code class="highlight"><a data-link-type="element" href="#elementdef-updatehistoryitem" id="ref-for-elementdef-updatehistoryitem">UpdateHistoryItem</a></code> elements.</p> <dt data-md><dfn data-dfn-for="CPIX" data-dfn-type="element-attr" data-export id="element-attrdef-cpix-signature"><code class="highlight">Signature</code><a class="self-link" href="#element-attrdef-cpix-signature"></a></dfn> (0...N, ds:Signature) <dd data-md> <p>Digital signature as defined in <a data-link-type="biblio" href="#biblio-xmldsig-core">[XMLDSIG-CORE]</a>. Each signature signs either the full document or any set of elements within the CPIX document. Every digital signature must contain an X.509 certificate identifying the signer and the associated public key.</p> </dl> <p><img src="Images/Schema-Cpix.png"></p> <h4 class="heading settled" data-level="5.2.2" id="schema-deliverydatalist"><span class="secno">5.2.2. </span><span class="content"><dfn class="dfn-paneled" data-dfn-type="element" data-export id="elementdef-deliverydatalist"><code class="highlight">DeliveryDataList</code></dfn> Element</span><a class="self-link" href="#schema-deliverydatalist"></a></h4> <dl> <dt data-md><dfn data-dfn-for="DeliveryDataList" data-dfn-type="element-attr" data-export id="element-attrdef-deliverydatalist-id"><code class="highlight">id</code><a class="self-link" href="#element-attrdef-deliverydatalist-id"></a></dfn> (O, xs:ID) <dd data-md> <p>Specifies an identifier for the element. It is recommended to use an identifier that is unique within the scope in which this CPIX document is published.</p> <dt data-md><dfn data-dfn-for="DeliveryDataList" data-dfn-type="element-attr" data-export id="element-attrdef-deliverydatalist-updateversion"><code class="highlight">updateVersion</code><a class="self-link" href="#element-attrdef-deliverydatalist-updateversion"></a></dfn> (O, xs:integer) <dd data-md> <p>Matches the <code class="highlight"><a data-link-type="element-sub" href="#element-attrdef-updatehistoryitem-updateversion" id="ref-for-element-attrdef-updatehistoryitem-updateversion`$">updateVersion</a></code> attribute of the <code class="highlight"><a data-link-type="element" href="#elementdef-updatehistoryitem" id="ref-for-elementdef-updatehistoryitem`$">UpdateHistoryItem</a></code> element providing details on when this element was added or updated.</p> <dt data-md><dfn data-dfn-for="DeliveryDataList" data-dfn-type="element-attr" data-export id="element-attrdef-deliverydatalist-deliverydata"><code class="highlight">DeliveryData</code><a class="self-link" href="#element-attrdef-deliverydatalist-deliverydata"></a></dfn> (0...N, <code class="highlight"><a data-link-type="element" href="#elementdef-deliverydata" id="ref-for-elementdef-deliverydata`$">DeliveryData</a></code>) <dd data-md> <p>Contains the required information allowing defining which entities can get access to the <a data-link-type="dfn" href="#content-key" id="ref-for-content-keye$c$">Content Key</a>s delivered in this document.</p> <dd data-md> <p>There is one <code class="highlight"><a data-link-type="element" href="#elementdef-deliverydata" id="ref-for-elementdef-deliverydataa$">DeliveryData</a></code> element per entity capable of accessing encrypted <a data-link-type="dfn" href="#content-key" id="ref-for-content-keye$d$">Content Key</a>s stored in this document. If this element is not present, then the <a data-link-type="dfn" href="#content-key" id="ref-for-content-keye$e$">Content Key</a>s are in the clear in the file.</p> </dl> <p><img src="Images/Schema-DeliveryDataList.png"></p> <h4 class="heading settled" data-level="5.2.3" id="schema-deliverydata"><span class="secno">5.2.3. </span><span class="content"><dfn class="dfn-paneled" data-dfn-type="element" data-export id="elementdef-deliverydata"><code class="highlight">DeliveryData</code></dfn> Element</span><a class="self-link" href="#schema-deliverydata"></a></h4> <dl> <dt data-md><dfn data-dfn-for="DeliveryData" data-dfn-type="element-attr" data-export id="element-attrdef-deliverydata-id"><code class="highlight">id</code><a class="self-link" href="#element-attrdef-deliverydata-id"></a></dfn> (O, xs:ID) <dd data-md> <p>Specifies an identifier for the element. It is recommended to use an identifier that is unique within the scope in which this CPIX document is published.</p> <dt data-md><dfn data-dfn-for="DeliveryData" data-dfn-type="element-attr" data-export id="element-attrdef-deliverydata-updateversion"><code class="highlight">updateVersion</code><a class="self-link" href="#element-attrdef-deliverydata-updateversion"></a></dfn> (O, xs:integer) <dd data-md> <p>Matches the <code class="highlight"><a data-link-type="element-sub" href="#element-attrdef-updatehistoryitem-updateversion" id="ref-for-element-attrdef-updatehistoryitem-updateversiona$">updateVersion</a></code> attribute of the <code class="highlight"><a data-link-type="element" href="#elementdef-updatehistoryitem" id="ref-for-elementdef-updatehistoryitema$">UpdateHistoryItem</a></code> element providing details on when this element was added or updated.</p> <dt data-md><dfn data-dfn-for="DeliveryData" data-dfn-type="element-attr" data-export id="element-attrdef-deliverydata-name"><code class="highlight">name</code><a class="self-link" href="#element-attrdef-deliverydata-name"></a></dfn> (O, xs:string) <dd data-md> <p>Name of the Delivery Data.</p> <dt data-md><dfn data-dfn-for="DeliveryData" data-dfn-type="element-attr" data-export id="element-attrdef-deliverydata-deliverykey"><code class="highlight">DeliveryKey</code><a class="self-link" href="#element-attrdef-deliverydata-deliverykey"></a></dfn> (1, ds:KeyInfoType) <dd data-md> <p>Contains an X.509 certificate that identifies the intended recipient and the public key that was used to encrypt the <a data-link-type="dfn" href="#document-key" id="ref-for-document-key">Document Key</a>.</p> <dd data-md> <p>Refer to <a href="#keys-enc">�6.1 Key Encryption in the CPIX Document</a> for a description of the key management within the CPIX document.</p> <dt data-md><dfn class="dfn-paneled" data-dfn-for="DeliveryData" data-dfn-type="element-attr" data-export id="element-attrdef-deliverydata-documentkey"><code class="highlight">DocumentKey</code></dfn> (1, cpix:KeyType) <dd data-md> <p>Contains the key that was used for encrypting the <a data-link-type="dfn" href="#content-key" id="ref-for-content-keye$f$">Content Key</a> stored in each <code class="highlight"><a data-link-type="element" href="#elementdef-contentkey" id="ref-for-elementdef-contentkey`$">ContentKey</a></code> element. The <a data-link-type="dfn" href="#document-key" id="ref-for-document-key`$">Document Key</a> is encrypted using the public key listed in the recipient s X.509 certificate.</p> <dd data-md> <p>This is an extension of <code class="highlight">KeyType</code> defined in <a data-link-type="biblio" href="#biblio-rfc6030">[RFC6030]</a>. The attributes <code class="highlight">id</code> and <code class="highlight">Algorithm</code> are optional in this extension.</p> <dd data-md> <p>Refer to <a href="#keys-enc">�6.1 Key Encryption in the CPIX Document</a> for a description of the key management within the CPIX document.</p> <dt data-md><dfn data-dfn-for="DeliveryData" data-dfn-type="element-attr" data-export id="element-attrdef-deliverydata-macmethod"><code class="highlight">MACMethod</code><a class="self-link" href="#element-attrdef-deliverydata-macmethod"></a></dfn> (0...1, pskc:MACMethodType) <dd data-md> <p>Identifies the MAC algorithm and contains the MAC key used to implement authenticated encryption of <a data-link-type="dfn" href="#content-key" id="ref-for-content-keye$g$">Content Key</a>s. The MAC key is encrypted using the public key listed in the recipient s X.509 certificate.</p> <dd data-md> <p>Refer to <a href="#keys-enc">�6.1 Key Encryption in the CPIX Document</a> for a description of the key management within the CPIX document.</p> <dt data-md><dfn data-dfn-for="DeliveryData" data-dfn-type="element-attr" data-export id="element-attrdef-deliverydata-description"><code class="highlight">Description</code><a class="self-link" href="#element-attrdef-deliverydata-description"></a></dfn> (0...1, xs:string) <dd data-md> <p>A description of the element.</p> <dt data-md><dfn data-dfn-for="DeliveryData" data-dfn-type="element-attr" data-export id="element-attrdef-deliverydata-sendingentity"><code class="highlight">SendingEntity</code><a class="self-link" href="#element-attrdef-deliverydata-sendingentity"></a></dfn> (0...1, xs:string) <dd data-md> <p>The name of the entity generating this CPIX document.</p> <dt data-md><dfn data-dfn-for="DeliveryData" data-dfn-type="element-attr" data-export id="element-attrdef-deliverydata-senderpointofcontact"><code class="highlight">SenderPointOfContact</code><a class="self-link" href="#element-attrdef-deliverydata-senderpointofcontact"></a></dfn> (0...1, xs:string) <dd data-md> <p>Contact information, such as an email address, of the Sender.</p> <dt data-md><dfn data-dfn-for="DeliveryData" data-dfn-type="element-attr" data-export id="element-attrdef-deliverydata-receivingentity"><code class="highlight">ReceivingEntity</code><a class="self-link" href="#element-attrdef-deliverydata-receivingentity"></a></dfn> (0...1, xs:string) <dd data-md> <p>The name of the entity capable of decrypting <a data-link-type="dfn" href="#content-key" id="ref-for-content-keye$h$">Content Key</a>s in this CPIX document.</p> </dl> <p><img src="Images/Schema-DeliveryData.png"></p> <h4 class="heading settled" data-level="5.2.4" id="schema-contentkeylist"><span class="secno">5.2.4. </span><span class="content"><dfn class="dfn-paneled" data-dfn-type="element" data-export id="elementdef-contentkeylist"><code class="highlight">ContentKeyList</code></dfn> Element</span><a class="self-link" href="#schema-contentkeylist"></a></h4> <dl> <dt data-md><dfn data-dfn-for="ContentKeyList" data-dfn-type="element-attr" data-export id="element-attrdef-contentkeylist-id"><code class="highlight">id</code><a class="self-link" href="#element-attrdef-contentkeylist-id"></a></dfn> (O, xs:ID) <dd data-md> <p>Specifies an identifier for the element. It is recommended to use an identifier that is unique within the scope in which this CPIX document is published.</p> <dt data-md><dfn data-dfn-for="ContentKeyList" data-dfn-type="element-attr" data-export id="element-attrdef-contentkeylist-updateversion"><code class="highlight">updateVersion</code><a class="self-link" href="#element-attrdef-contentkeylist-updateversion"></a></dfn> (O, xs:integer) <dd data-md> <p>Matches the <code class="highlight"><a data-link-type="element-sub" href="#element-attrdef-updatehistoryitem-updateversion" id="ref-for-element-attrdef-updatehistoryitem-updateversionb$">updateVersion</a></code> attribute of the <code class="highlight"><a data-link-type="element" href="#elementdef-updatehistoryitem" id="ref-for-elementdef-updatehistoryitemb$">UpdateHistoryItem</a></code> element providing details on when this element was added or updated.</p> <dt data-md><dfn data-dfn-for="ContentKeyList" data-dfn-type="element-attr" data-export id="element-attrdef-contentkeylist-contentkey"><code class="highlight">ContentKey</code><a class="self-link" href="#element-attrdef-contentkeylist-contentkey"></a></dfn> (0...N, <code class="highlight"><a data-link-type="element" href="#elementdef-contentkey" id="ref-for-elementdef-contentkeya$">ContentKey</a></code>) <dd data-md> <p>Contains all information on a <a data-link-type="dfn" href="#content-key" id="ref-for-content-keyf$�$">Content Key</a> used to encrypt one or more <a data-link-type="dfn" href="#content-key-context" id="ref-for-content-key-context`$�$">Content Key Context</a>s.</p> </dl> <p><img src="Images/Schema-ContentKeyList.png"></p> <h4 class="heading settled" data-level="5.2.5" id="schema-contentkey"><span class="secno">5.2.5. </span><span class="content"><dfn class="dfn-paneled" data-dfn-type="element" data-export id="elementdef-contentkey"><code class="highlight">ContentKey</code></dfn> Element</span><a class="self-link" href="#schema-contentkey"></a></h4> <p>This is an extension of <code class="highlight">KeyType</code> defined in <a data-link-type="biblio" href="#biblio-rfc6030">[RFC6030]</a>. The attributes <code class="highlight">id</code> and <code class="highlight">Algorithm</code> are optional in this extension.</p> <p>The key this element contains can be encrypted. If it is encrypted, it is encrypted with the key that is under the <code class="highlight"><a data-link-type="element-sub" href="#element-attrdef-deliverydata-documentkey" id="ref-for-element-attrdef-deliverydata-documentkey">DocumentKey</a></code> element part of the <code class="highlight"><a data-link-type="element" href="#elementdef-deliverydata" id="ref-for-elementdef-deliverydatab$">DeliveryData</a></code>. Refer to <a href="#keys-enc">�6.1 Key Encryption in the CPIX Document</a> for a description of the key management within the CPIX document.</p> <dl> <dt data-md><dfn data-dfn-for="ContentKey" data-dfn-type="element-attr" data-export id="element-attrdef-contentkey-id"><code class="highlight">id</code><a class="self-link" href="#element-attrdef-contentkey-id"></a></dfn> (O, xs:ID) <dd data-md> <p>Specifies an identifier for the element. It is recommended to use an identifier that is unique within the scope in which this CPIX document is published.</p> <dt data-md><dfn data-dfn-for="ContentKey" data-dfn-type="element-attr" data-export id="element-attrdef-contentkey-algorithm"><code class="highlight">Algorithm</code><a class="self-link" href="#element-attrdef-contentkey-algorithm"></a></dfn> (O, xs:ID) <dd data-md> <p>This is an attribute inherited from <a data-link-type="biblio" href="#biblio-rfc6039">[RFC6039]</a> and made optional in this specification.</p> <dt data-md><dfn class="dfn-paneled" data-dfn-for="ContentKey" data-dfn-type="element-attr" data-export id="element-attrdef-contentkey-kid"><code class="highlight">kid</code></dfn> (M, xs:string) <dd data-md> <p>The unique identifier of the <a data-link-type="dfn" href="#content-key" id="ref-for-content-keyf$`$">Content Key</a>.</p> <dt data-md><dfn data-dfn-for="ContentKey" data-dfn-type="element-attr" data-export id="element-attrdef-contentkey-explicitiv"><code class="highlight">explicitIV</code><a class="self-link" href="#element-attrdef-contentkey-explicitiv"></a></dfn> (O, xs:base64binary) <dd data-md> <p>The IV to use when solution-specific logic requires a single explicit IV to be associated with a <a data-link-type="dfn" href="#content-key" id="ref-for-content-keyf$a$">Content Key</a>.</p> <dd data-md> <p>The primary use case is to enable the use of DRM systems that associate a single IV with each <a data-link-type="dfn" href="#content-key" id="ref-for-content-keyf$b$">Content Key</a> and whose DRM client implementations are unable to extract the IV from the content, requiring the license server to deliver the IV together with the <a data-link-type="dfn" href="#content-key" id="ref-for-content-keyf$c$">Content Key</a> upon request. A CPIX document can be used to supply the <a data-link-type="dfn" href="#content-key" id="ref-for-content-keyf$d$">Content Key</a> and IV together to the license server.</p> <dd data-md> <p>Use of this attribute is not recommended except for compatibility with such DRM systems. Even if present in a CPIX document, the attribute should be ignored if solution-specific logic does not require it to be used.</p> <dt data-md><dfn class="dfn-paneled" data-dfn-for="ContentKey" data-dfn-type="element-attr" data-export id="element-attrdef-contentkey-dependsonkey"><code class="highlight">dependsOnKey</code></dfn> (O, xs:string) <dd data-md> <p>This attribute signals that the <a data-link-type="dfn" href="#content-key" id="ref-for-content-keyf$e$">Content Key</a> is a leaf key in a key hierarchy. It references the <code class="highlight"><a data-link-type="element-sub" href="#element-attrdef-contentkey-kid" id="ref-for-element-attrdef-contentkey-kid">kid</a></code> attribute of another <code class="highlight"><a data-link-type="element" href="#elementdef-contentkey" id="ref-for-elementdef-contentkeyb$">ContentKey</a></code> element describing the root key.</p> <dd data-md> <p>The referenced key shall not be a leaf key.</p> <dd data-md> <p>If this attribute is not specified, the <a data-link-type="dfn" href="#content-key" id="ref-for-content-keyf$f$">Content Key</a> is either a root key or does not participate in a key hierarchy. The CPIX document format does not make a distinction between these two cases.</p> </dl> <p><img src="Images/Schema-ContentKey.png"></p> <h4 class="heading settled" data-level="5.2.6" id="schema-drmsystemlist"><span class="secno">5.2.6. </span><span class="content"><dfn class="dfn-paneled" data-dfn-type="element" data-export id="elementdef-drmsystemlist"><code class="highlight">DRMSystemList</code></dfn> Element</span><a class="self-link" href="#schema-drmsystemlist"></a></h4> <dl> <dt data-md><dfn data-dfn-for="DRMSystemList" data-dfn-type="element-attr" data-export id="element-attrdef-drmsystemlist-id"><code class="highlight">id</code><a class="self-link" href="#element-attrdef-drmsystemlist-id"></a></dfn> (O, xs:ID) <dd data-md> <p>Specifies an identifier for the element. It is recommended to use an identifier that is unique within the scope in which this CPIX document is published.</p> <dt data-md><dfn data-dfn-for="DRMSystemList" data-dfn-type="element-attr" data-export id="element-attrdef-drmsystemlist-updateversion"><code class="highlight">updateVersion</code><a class="self-link" href="#element-attrdef-drmsystemlist-updateversion"></a></dfn> (O, xs:integer) <dd data-md> <p>Matches the <code class="highlight"><a data-link-type="element-sub" href="#element-attrdef-updatehistoryitem-updateversion" id="ref-for-element-attrdef-updatehistoryitem-updateversionc$">updateVersion</a></code> attribute of the <code class="highlight"><a data-link-type="element" href="#elementdef-updatehistoryitem" id="ref-for-elementdef-updatehistoryitemc$">UpdateHistoryItem</a></code> element providing details on when this element was added or updated.</p> <dt data-md><dfn data-dfn-for="DRMSystemList" data-dfn-type="element-attr" data-export id="element-attrdef-drmsystemlist-drmsystem"><code class="highlight">DRMSystem</code><a class="self-link" href="#element-attrdef-drmsystemlist-drmsystem"></a></dfn> (0...N, <code class="highlight"><a data-link-type="element" href="#elementdef-drmsystem" id="ref-for-elementdef-drmsystem`$">DRMSystem</a></code>) <dd data-md> <p><a data-link-type="dfn" href="#drm-signaling" id="ref-for-drm-signaling`$c$">DRM Signaling</a> of a DRM system associated with a <a data-link-type="dfn" href="#content-key" id="ref-for-content-keyf$g$">Content Key</a>.</p> </dl> <p><img src="Images/Schema-DRMSystemList.png"></p> <h4 class="heading settled" data-level="5.2.7" id="schema-drmsystem"><span class="secno">5.2.7. </span><span class="content"><dfn class="dfn-paneled" data-dfn-type="element" data-export id="elementdef-drmsystem"><code class="highlight">DRMSystem</code></dfn> Element</span><a class="self-link" href="#schema-drmsystem"></a></h4> <p>The <code class="highlight"><a data-link-type="element" href="#elementdef-drmsystem" id="ref-for-elementdef-drmsystema$">DRMSystem</a></code> element contains all information on a DRM system that can be used for retrieving licenses for getting access to content. This specification defines elements for DRM system signaling in DASH, ISOBMFF, Smooth Streaming, HLS amd HDS formats. Implementations may extend CPIX documents with additional elements to provide DRM system signaling information for other formats.</p> <dl> <dt data-md><dfn data-dfn-for="DRMSystem" data-dfn-type="element-attr" data-export id="element-attrdef-drmsystem-id"><code class="highlight">id</code><a class="self-link" href="#element-attrdef-drmsystem-id"></a></dfn> (O, xs:ID) <dd data-md> <p>Specifies an identifier for the element. It is recommended to use an identifier that is unique within the scope in which this CPIX document is published.</p> <dt data-md><dfn data-dfn-for="DRMSystem" data-dfn-type="element-attr" data-export id="element-attrdef-drmsystem-updateversion"><code class="highlight">updateVersion</code><a class="self-link" href="#element-attrdef-drmsystem-updateversion"></a></dfn> (O, xs:integer) <dd data-md> <p>Matches the <code class="highlight"><a data-link-type="element-sub" href="#element-attrdef-updatehistoryitem-updateversion" id="ref-for-element-attrdef-updatehistoryitem-updateversiond$">updateVersion</a></code> attribute of the <code class="highlight"><a data-link-type="element" href="#elementdef-updatehistoryitem" id="ref-for-elementdef-updatehistoryitemd$">UpdateHistoryItem</a></code> element providing details on when this element was added or updated.</p> <dt data-md><dfn data-dfn-for="DRMSystem" data-dfn-type="element-attr" data-export id="element-attrdef-drmsystem-systemid"><code class="highlight">systemId</code><a class="self-link" href="#element-attrdef-drmsystem-systemid"></a></dfn> (M, xs:string) <dd data-md> <p>This is the unique identifier of the DRM system. Values are published by <a data-link-type="biblio" href="#biblio-dash-systemids">[DASH-SystemIDs]</a>.</p> <dt data-md><dfn data-dfn-for="DRMSystem" data-dfn-type="element-attr" data-export id="element-attrdef-drmsystem-kid"><code class="highlight">kid</code><a class="self-link" href="#element-attrdef-drmsystem-kid"></a></dfn> (M, xs:string) <dd data-md> <p>Matches the <code class="highlight"><a data-link-type="element-sub" href="#element-attrdef-contentkey-kid" id="ref-for-element-attrdef-contentkey-kid`$">kid</a></code> attribute of the <code class="highlight"><a data-link-type="element" href="#elementdef-contentkey" id="ref-for-elementdef-contentkeyc$">ContentKey</a></code> this element references.</p> <dt data-md><dfn data-dfn-for="DRMSystem" data-dfn-type="element-attr" data-export id="element-attrdef-drmsystem-name"><code class="highlight">name</code><a class="self-link" href="#element-attrdef-drmsystem-name"></a></dfn> (O, xs:string) <dd data-md> <p>This is a human-readable name and version of the DRM system. This can be used in DASH MPD as the value for the <code class="highlight">@value</code> attribute of the <code class="highlight">ContentProtection</code> element.</p> <dt data-md><dfn data-dfn-for="DRMSystem" data-dfn-type="element-attr" data-export id="element-attrdef-drmsystem-pssh"><code class="highlight">PSSH</code><a class="self-link" href="#element-attrdef-drmsystem-pssh"></a></dfn> (0...1, xs:base64binary) <dd data-md> <p>This is the full <a data-link-type="dfn" href="#pssh" id="ref-for-psshd$">PSSH</a> box that should be added to ISOBMFF files encrypted with the referenced <a data-link-type="dfn" href="#content-key" id="ref-for-content-keyf$h$">Content Key</a>.</p> <dd data-md> <p>When the key is a leaf key in a key hierarchy, the value is inserted under the moof boxes.</p> <dd data-md> <p>This element should not be used when the key is not part of a key hierarchy or is a root key in a key hierarchy. Instead, the DRM system signaling should be carried by the format-specific data structures such <code class="highlight"><a data-link-type="element-sub" href="#element-attrdef-drmsystem-contentprotectiondata" id="ref-for-element-attrdef-drmsystem-contentprotectiondata">ContentProtectionData</a></code>. See <a data-link-type="biblio" href="#biblio-dash-if-iop">[DASH-IF-IOP]</a> section 7.7.1. If this element is used in the above circumstances, the value is inserted under the moov box.</p> <dd data-md> <p>This element has meaning only when the media content is in the ISOBMFF format.</p> <dt data-md><dfn class="dfn-paneled" data-dfn-for="DRMSystem" data-dfn-type="element-attr" data-export id="element-attrdef-drmsystem-contentprotectiondata"><code class="highlight">ContentProtectionData</code></dfn> (0...1, xs:base64binary) <dd data-md> <p>This is the full well-formed standalone XML fragment to be added to the DASH manifest under the ContentProtection element for this DRM system. This is UTF-8 text without a byte order mark.</p> <dd data-md> <p>This element shall not be used if the referenced <a data-link-type="dfn" href="#content-key" id="ref-for-content-keyg$�$">Content Key</a> is a leaf key in a key hierarchy.</p> <dd data-md> <p>This element has meaning only when a DASH manifest is created for the media content.</p> <dt data-md><dfn data-dfn-for="DRMSystem" data-dfn-type="element-attr" data-export id="element-attrdef-drmsystem-uriextxkey"><code class="highlight">URIExtXKey</code><a class="self-link" href="#element-attrdef-drmsystem-uriextxkey"></a></dfn> (0...1, xs:base64binary) <dd data-md> <p>This is the full data to be added in the URI parameter of the EXT-X-KEY tag of a HLS playlist. This is UTF-8 text without a byte order mark.</p> <dd data-md> <p>This element is present only when the content is in the HLS format.</p> <dd data-md> <p>The use of this element is deprecated. Using <code class="highlight"><a data-link-type="element-sub" href="#element-attrdef-drmsystem-hlssignalingdata" id="ref-for-element-attrdef-drmsystem-hlssignalingdata">HLSSignalingData</a></code> is recommended.</p> <dt data-md><dfn class="dfn-paneled" data-dfn-for="DRMSystem" data-dfn-type="element-attr" data-export id="element-attrdef-drmsystem-hlssignalingdata"><code class="highlight">HLSSignalingData</code></dfn> (0...2, <code class="highlight"><a data-link-type="element" href="#elementdef-hlssignalingdata" id="ref-for-elementdef-hlssignalingdata">HLSSignalingData</a></code>) <dd data-md> <p>This is the full data including the #EXT-X-KEY or #EXT-X-SESSION-KEY tag of a HLS playlist depending on the destination of the data (see <a href="#schema-HLSsignalingdata">�5.2.8 HLSSignalingData Element</a>). This may contain multiple lines allowing to add lines with proprietary tags and values. This is UTF-8 text without a byte order mark.</p> <dd data-md> <p>This element shall not be used if the referenced <a data-link-type="dfn" href="#content-key" id="ref-for-content-keyg$`$">Content Key</a> is a leaf key in a key hierarchy.</p> <dd data-md> <p>This element has meaning only when a HLS playlist is created for the media content.</p> <dt data-md><dfn data-dfn-for="DRMSystem" data-dfn-type="element-attr" data-export id="element-attrdef-drmsystem-smoothstreamingprotectionheaderdata"><code class="highlight">SmoothStreamingProtectionHeaderData</code><a class="self-link" href="#element-attrdef-drmsystem-smoothstreamingprotectionheaderdata"></a></dfn> (0...1, xs:string) <dd data-md> <p>This is the inner text of the ProtectionHeader XML element to be added to the Smooth Streaming manifest for this DRM system. This is UTF-8 text without a byte order mark.</p> <dd data-md> <p>This element shall not be used if the referenced <a data-link-type="dfn" href="#content-key" id="ref-for-content-keyg$a$">Content Key</a> is a leaf key in a key hierarchy.</p> <dd data-md> <p>This element has meaning only when a Smooth Streaming manifest is created for the media content.</p> <dt data-md><dfn data-dfn-for="DRMSystem" data-dfn-type="element-attr" data-export data-lt="HDSSignalingData" id="element-attrdef-drmsystem-hdssignalingdata"><code class="highlight">HDSSignalingData </code><a class="self-link" href="#element-attrdef-drmsystem-hdssignalingdata"></a></dfn> (0...1, xs:base64binary) <dd data-md> <p>This is the full drmAdditionalHeader element to be added to the HDS playlist (including the beginning and ending tags). This is UTF-8 text without a byte order mark.</p> <dd data-md> <p>This element shall not be used if the referenced <a data-link-type="dfn" href="#content-key" id="ref-for-content-keyg$b$">Content Key</a> is a leaf key in a key hierarchy.</p> <dd data-md> <p>This element has meaning only when a Flash media manifest is created for the media content.</p> </dl> <p>Additional child elements not defined by DASH-IF may be present containing signaling data for other media formats. Such elements must appear after any elements defined here.</p> <p><img src="Images/Schema-DRMSystem.png"></p> <h4 class="heading settled" data-level="5.2.8" id="schema-HLSsignalingdata"><span class="secno">5.2.8. </span><span class="content"><dfn class="dfn-paneled" data-dfn-type="element" data-export id="elementdef-hlssignalingdata"><code class="highlight">HLSSignalingData</code></dfn> Element</span><a class="self-link" href="#schema-HLSsignalingdata"></a></h4> <p>The HLSSignalingData allows carrying base64 encoded text. It has an optional attribute allowing to define where this data is to be placed, either in the master playlist or in the media playlist. It allows having different proprietary signaling in these locations. In a <code class="highlight"><a data-link-type="element" href="#elementdef-drmsystem" id="ref-for-elementdef-drmsystemb$">DRMSystem</a></code> element, every <code class="highlight"><a data-link-type="element" href="#elementdef-hlssignalingdata" id="ref-for-elementdef-hlssignalingdata`$">HLSSignalingData</a></code> SHALL have a different <code class="highlight"><a data-link-type="element-sub" href="#element-attrdef-hlssignalingdata-playlist" id="ref-for-element-attrdef-hlssignalingdata-playlist">playlist</a></code> value if present. If <code class="highlight"><a data-link-type="element-sub" href="#element-attrdef-hlssignalingdata-playlist" id="ref-for-element-attrdef-hlssignalingdata-playlist`$">playlist</a></code> is not present then the HLSSignalingData goes in the media playlist and there is no signaling in the master playlist (in this case, there is only one HLSSignalingData element in the <code class="highlight"><a data-link-type="element" href="#elementdef-drmsystem" id="ref-for-elementdef-drmsystemc$">DRMSystem</a></code> element).</p> <dl> <dt data-md><dfn class="dfn-paneled" data-dfn-for="HLSSignalingData" data-dfn-type="element-attr" data-export id="element-attrdef-hlssignalingdata-playlist"><code class="highlight">playlist</code></dfn> (O, restricted xs:string) <dd data-md> <p>Specifies the destination of the data carried by this element. It can only have two values <code class="highlight">master</code> and <code class="highlight">media</code>. There is a uniqueness rule for this attribute. If two elements are added under a <code class="highlight"><a data-link-type="element" href="#elementdef-drmsystem" id="ref-for-elementdef-drmsystemd$">DRMSystem</a></code> element, they SHALL not have the same <code class="highlight"><a data-link-type="element-sub" href="#element-attrdef-hlssignalingdata-playlist" id="ref-for-element-attrdef-hlssignalingdata-playlista$">playlist</a></code> value.</p> </dl> <p><img src="Images/Schema-HLSSignalingData.png"></p> <h4 class="heading settled" data-level="5.2.9" id="schema-contentkeyperiodlist"><span class="secno">5.2.9. </span><span class="content"><dfn class="dfn-paneled" data-dfn-type="element" data-export id="elementdef-contentkeyperiodlist"><code class="highlight">ContentKeyPeriodList</code></dfn> Element</span><a class="self-link" href="#schema-contentkeyperiodlist"></a></h4> <dl> <dt data-md><dfn data-dfn-for="ContentKeyPeriodList" data-dfn-type="element-attr" data-export id="element-attrdef-contentkeyperiodlist-id"><code class="highlight">id</code><a class="self-link" href="#element-attrdef-contentkeyperiodlist-id"></a></dfn> (O, xs:ID) <dd data-md> <p>Specifies an identifier for the element. It is recommended to use an identifier that is unique within the scope in which this CPIX document is published.</p> <dt data-md><dfn data-dfn-for="ContentKeyPeriodList" data-dfn-type="element-attr" data-export id="element-attrdef-contentkeyperiodlist-updateversion"><code class="highlight">updateVersion</code><a class="self-link" href="#element-attrdef-contentkeyperiodlist-updateversion"></a></dfn> (O, xs:integer) <dd data-md> <p>Matches the <code class="highlight"><a data-link-type="element-sub" href="#element-attrdef-updatehistoryitem-updateversion" id="ref-for-element-attrdef-updatehistoryitem-updateversione$">updateVersion</a></code> attribute of the <code class="highlight"><a data-link-type="element" href="#elementdef-updatehistoryitem" id="ref-for-elementdef-updatehistoryiteme$">UpdateHistoryItem</a></code> element providing details on when this element was added or updated.</p> <dt data-md><dfn data-dfn-for="ContentKeyPeriodList" data-dfn-type="element-attr" data-export id="element-attrdef-contentkeyperiodlist-contentkeyperiod"><code class="highlight">ContentKeyPeriod</code><a class="self-link" href="#element-attrdef-contentkeyperiodlist-contentkeyperiod"></a></dfn> (0...N, <code class="highlight"><a data-link-type="element" href="#elementdef-contentkeyperiod" id="ref-for-elementdef-contentkeyperiod`$">ContentKeyPeriod</a></code>) <dd data-md> <p>A list of ContentKeyPeriod element. For every <a data-link-type="dfn" href="#content-key" id="ref-for-content-keyg$c$">Content Key</a>, ContentKeyPeriod elements cover non ovelapping periods of time. The concatenation of all period of times may not fully cover the <a data-link-type="dfn" href="#content" id="ref-for-contenth$">Content</a> as some parts may be in the clear.</p> </dl> <p><img src="Images/Schema-ContentKeyPeriodList.png"></p> <h4 class="heading settled" data-level="5.2.10" id="schema-contentkeyperiod"><span class="secno">5.2.10. </span><span class="content"><dfn class="dfn-paneled" data-dfn-type="element" data-export id="elementdef-contentkeyperiod"><code class="highlight">ContentKeyPeriod</code></dfn> Element</span><a class="self-link" href="#schema-contentkeyperiod"></a></h4> <p>When <code class="highlight"><a data-link-type="element-sub" href="#element-attrdef-contentkeyperiod-start" id="ref-for-element-attrdef-contentkeyperiod-start">start</a></code> and <code class="highlight"><a data-link-type="element-sub" href="#element-attrdef-contentkeyperiod-end" id="ref-for-element-attrdef-contentkeyperiod-end">end</a></code> are present, the interval is defined by [<code class="highlight"><a data-link-type="element-sub" href="#element-attrdef-contentkeyperiod-start" id="ref-for-element-attrdef-contentkeyperiod-start`$">start</a></code>, <code class="highlight"><a data-link-type="element-sub" href="#element-attrdef-contentkeyperiod-end" id="ref-for-element-attrdef-contentkeyperiod-end`$">end</a></code>), meaning that the key is in use at the start time but not at the end time. If neither are specified, then it is assumed that the encryptor is determining the key period boundaries internally, and other components do not need to be aware of them. In this case, the key periods are referenced simply by a sequence number (<code class="highlight"><a data-link-type="element-sub" href="#element-attrdef-contentkeyperiod-index" id="ref-for-element-attrdef-contentkeyperiod-index">index</a></code>). An example of this would be an encryptor which rotates the keys once an hour, and not necessarily at specific times.</p> <dl> <dt data-md><dfn class="dfn-paneled" data-dfn-for="ContentKeyPeriod" data-dfn-type="element-attr" data-export id="element-attrdef-contentkeyperiod-id"><code class="highlight">id</code></dfn> (O, xs:ID) <dd data-md> <p>Specifies an identifier for the element. It is recommended to use an identifier that is unique within the scope in which this CPIX document is published.</p> <dt data-md><dfn class="dfn-paneled" data-dfn-for="ContentKeyPeriod" data-dfn-type="element-attr" data-export id="element-attrdef-contentkeyperiod-index"><code class="highlight">index</code></dfn> (O, xs:integer) <dd data-md> <p>Numerical index for the key period. Mutually exclusive with <code class="highlight"><a data-link-type="element-sub" href="#element-attrdef-contentkeyperiod-start" id="ref-for-element-attrdef-contentkeyperiod-starta$">start</a></code> and <code class="highlight"><a data-link-type="element-sub" href="#element-attrdef-contentkeyperiod-end" id="ref-for-element-attrdef-contentkeyperiod-enda$">end</a></code>.</p> <dt data-md><dfn class="dfn-paneled" data-dfn-for="ContentKeyPeriod" data-dfn-type="element-attr" data-export id="element-attrdef-contentkeyperiod-start"><code class="highlight">start</code></dfn> (O, xs:dateTime) <dd data-md> <p>Wall clock (Live) or media time (VOD) for the start time for the period. Mutually inclusive with <code class="highlight"><a data-link-type="element-sub" href="#element-attrdef-contentkeyperiod-end" id="ref-for-element-attrdef-contentkeyperiod-endb$">end</a></code>, and mutually exclusive with <code class="highlight"><a data-link-type="element-sub" href="#element-attrdef-contentkeyperiod-index" id="ref-for-element-attrdef-contentkeyperiod-index`$">index</a></code>.</p> <dt data-md><dfn class="dfn-paneled" data-dfn-for="ContentKeyPeriod" data-dfn-type="element-attr" data-export id="element-attrdef-contentkeyperiod-end"><code class="highlight">end</code></dfn> (O, xs:dateTime) <dd data-md> <p>Wall clock (Live) or media time (VOD) for the end time for the period. Mutually inclusive with <code class="highlight"><a data-link-type="element-sub" href="#element-attrdef-contentkeyperiod-start" id="ref-for-element-attrdef-contentkeyperiod-startb$">start</a></code>, and mutually exclusive with <code class="highlight"><a data-link-type="element-sub" href="#element-attrdef-contentkeyperiod-index" id="ref-for-element-attrdef-contentkeyperiod-indexa$">index</a></code>.</p> </dl> <p><img src="Images/Schema-ContentKeyPeriod.png"></p> <h4 class="heading settled" data-level="5.2.11" id="schema-contentkeyusagerulelist"><span class="secno">5.2.11. </span><span class="content"><dfn class="dfn-paneled" data-dfn-type="element" data-export id="elementdef-contentkeyusagerulelist"><code class="highlight">ContentKeyUsageRuleList</code></dfn> Element</span><a class="self-link" href="#schema-contentkeyusagerulelist"></a></h4> <dl> <dt data-md><dfn data-dfn-for="ContentKeyUsageRuleList" data-dfn-type="element-attr" data-export id="element-attrdef-contentkeyusagerulelist-id"><code class="highlight">id</code><a class="self-link" href="#element-attrdef-contentkeyusagerulelist-id"></a></dfn> (O, xs:ID) <dd data-md> <p>Specifies an identifier for the element. It is recommended to use an identifier that is unique within the scope in which this CPIX document is published.</p> <dt data-md><dfn data-dfn-for="ContentKeyUsageRuleList" data-dfn-type="element-attr" data-export id="element-attrdef-contentkeyusagerulelist-updateversion"><code class="highlight">updateVersion</code><a class="self-link" href="#element-attrdef-contentkeyusagerulelist-updateversion"></a></dfn> (O, xs:integer) <dd data-md> <p>Matches the <code class="highlight"><a data-link-type="element-sub" href="#element-attrdef-updatehistoryitem-updateversion" id="ref-for-element-attrdef-updatehistoryitem-updateversionf$">updateVersion</a></code> attribute of the <code class="highlight"><a data-link-type="element" href="#elementdef-updatehistoryitem" id="ref-for-elementdef-updatehistoryitemf$">UpdateHistoryItem</a></code> element providing details on when this element was added or updated.</p> <dt data-md><dfn data-dfn-for="ContentKeyUsageRuleList" data-dfn-type="element-attr" data-export id="element-attrdef-contentkeyusagerulelist-contentkeyusagerule"><code class="highlight">ContentKeyUsageRule</code><a class="self-link" href="#element-attrdef-contentkeyusagerulelist-contentkeyusagerule"></a></dfn> (0...N, <code class="highlight"><a data-link-type="element" href="#elementdef-contentkeyusagerule" id="ref-for-elementdef-contentkeyusagerule`$">ContentKeyUsageRule</a></code>) <dd data-md> <p>A rule which defines a <a data-link-type="dfn" href="#content-key-context" id="ref-for-content-key-context`$`$">Content Key Context</a>.</p> </dl> <p><img src="Images/Schema-ContentKeyUsageRuleList.png"></p> <h4 class="heading settled" data-level="5.2.12" id="schema-contentkeyusagerule"><span class="secno">5.2.12. </span><span class="content"><dfn class="dfn-paneled" data-dfn-type="element" data-export id="elementdef-contentkeyusagerule"><code class="highlight">ContentKeyUsageRule</code></dfn> Element</span><a class="self-link" href="#schema-contentkeyusagerule"></a></h4> <dl> <dt data-md><dfn data-dfn-for="ContentKeyUsageRule" data-dfn-type="element-attr" data-export id="element-attrdef-contentkeyusagerule-id"><code class="highlight">id</code><a class="self-link" href="#element-attrdef-contentkeyusagerule-id"></a></dfn> (O, xs:ID) <dd data-md> <p>Specifies an identifier for the element. It is recommended to use an identifier that is unique within the scope in which this CPIX document is published.</p> <dt data-md><dfn data-dfn-for="ContentKeyUsageRule" data-dfn-type="element-attr" data-export id="element-attrdef-contentkeyusagerule-kid"><code class="highlight">kid</code><a class="self-link" href="#element-attrdef-contentkeyusagerule-kid"></a></dfn> (M, xs:string) <dd data-md> <p>Matches the <code class="highlight"><a data-link-type="element-sub" href="#element-attrdef-contentkey-kid" id="ref-for-element-attrdef-contentkey-kida$">kid</a></code> attribute of the <code class="highlight"><a data-link-type="element" href="#elementdef-contentkey" id="ref-for-elementdef-contentkeyd$">ContentKey</a></code> this element references.</p> <dd data-md> <p>In hierarchical key scenarios, this shall reference a leaf key, not a root key.</p> <dt data-md><dfn class="dfn-paneled" data-dfn-for="ContentKeyUsageRule" data-dfn-type="element-attr" data-export id="element-attrdef-contentkeyusagerule-intendedtracktype"><code class="highlight">intendedTrackType</code></dfn> (O, xs:string) <dd data-md> <p>Specifies the type of media track which corresponds to the streams which match the rules defined in this <code class="highlight"><a data-link-type="element" href="#elementdef-contentkeyusagerule" id="ref-for-elementdef-contentkeyusagerulea$">ContentKeyUsageRule</a></code> element.</p> <dd data-md> <p>Examples of types for the media track might be UHD, UHD+HFR. See <a href="#schema-labelfilter">�5.2.13.3 LabelFilter Element</a> for more details.</p> <dt data-md><dfn data-dfn-for="ContentKeyUsageRule" data-dfn-type="element-attr" data-export id="element-attrdef-contentkeyusagerule-keyperiodfilter"><code class="highlight">KeyPeriodFilter</code><a class="self-link" href="#element-attrdef-contentkeyusagerule-keyperiodfilter"></a></dfn> (0...N, <code class="highlight"><a data-link-type="element" href="#elementdef-keyperiodfilter" id="ref-for-elementdef-keyperiodfilter">KeyPeriodFilter</a></code>) <dd data-md> <p>Defines a period of time constraints for the <a data-link-type="dfn" href="#content-key-context" id="ref-for-content-key-context`$a$">Content Key Context</a>.</p> <dd data-md> <p>This filter links ContentKey and ContentKeyPeriod elements.</p> <dt data-md><dfn data-dfn-for="ContentKeyUsageRule" data-dfn-type="element-attr" data-export id="element-attrdef-contentkeyusagerule-labelfilter"><code class="highlight">LabelFilter</code><a class="self-link" href="#element-attrdef-contentkeyusagerule-labelfilter"></a></dfn> (0...N, <code class="highlight"><a data-link-type="element" href="#elementdef-labelfilter" id="ref-for-elementdef-labelfilter">LabelFilter</a></code>) <dd data-md> <p>Defines a label association for the <a data-link-type="dfn" href="#content-key-context" id="ref-for-content-key-context`$b$">Content Key Context</a>.</p> <dt data-md><dfn data-dfn-for="ContentKeyUsageRule" data-dfn-type="element-attr" data-export id="element-attrdef-contentkeyusagerule-videofilter"><code class="highlight">VideoFilter</code><a class="self-link" href="#element-attrdef-contentkeyusagerule-videofilter"></a></dfn> (0...N, <code class="highlight"><a data-link-type="element" href="#elementdef-videofilter" id="ref-for-elementdef-videofilter">VideoFilter</a></code>) <dd data-md> <p>Defines video constraints to be associated with the <a data-link-type="dfn" href="#content-key-context" id="ref-for-content-key-context`$c$">Content Key Context</a>.</p> <dd data-md> <p>This filter can only be used on media content of type video.</p> <dt data-md><dfn data-dfn-for="ContentKeyUsageRule" data-dfn-type="element-attr" data-export id="element-attrdef-contentkeyusagerule-audiofilter"><code class="highlight">AudioFilter</code><a class="self-link" href="#element-attrdef-contentkeyusagerule-audiofilter"></a></dfn> (0...N, <code class="highlight"><a data-link-type="element" href="#elementdef-audiofilter" id="ref-for-elementdef-audiofilter">AudioFilter</a></code>) <dd data-md> <p>Defines audio constraints to be associated with the <a data-link-type="dfn" href="#content-key-context" id="ref-for-content-key-context`$d$">Content Key Context</a>.</p> <dd data-md> <p>This filter can only be used on media content of type audio.</p> <dt data-md><dfn data-dfn-for="ContentKeyUsageRule" data-dfn-type="element-attr" data-export id="element-attrdef-contentkeyusagerule-bitratefilter"><code class="highlight">BitrateFilter</code><a class="self-link" href="#element-attrdef-contentkeyusagerule-bitratefilter"></a></dfn> (0...N, <code class="highlight"><a data-link-type="element" href="#elementdef-bitratefilter" id="ref-for-elementdef-bitratefilter">BitrateFilter</a></code>) <dd data-md> <p>Defines bitrate constraints to be associated with the <a data-link-type="dfn" href="#content-key-context" id="ref-for-content-key-context`$e$">Content Key Context</a>.</p> </dl> <p>Additional child elements not defined by DASH-IF may be present containing proprietary filters. Such elements must appear after any elements defined here.</p> <p><img src="Images/Schema-ContentKeyUsageRule.png"></p> <h4 class="heading settled" data-level="5.2.13" id="schema-usagerulefilter"><span class="secno">5.2.13. </span><span class="content"><dfn data-dfn-type="element" data-export id="elementdef-usage-rules-filters"><code class="highlight">Usage Rules Filters</code><a class="self-link" href="#elementdef-usage-rules-filters"></a></dfn></span><a class="self-link" href="#schema-usagerulefilter"></a></h4> <h5 class="heading settled" data-level="5.2.13.1" id="schema-usagerulefilter-intro"><span class="secno">5.2.13.1. </span><span class="content"><dfn data-dfn-type="element" data-export data-lt="Introduction" id="elementdef-introduction"><code class="highlight"> Introduction</code><a class="self-link" href="#elementdef-introduction"></a></dfn></span><a class="self-link" href="#schema-usagerulefilter-intro"></a></h5> <p>There can be several filters defined within a single <code class="highlight"><a data-link-type="element" href="#elementdef-contentkeyusagerule" id="ref-for-elementdef-contentkeyusageruleb$">ContentKeyUsageRule</a></code>. In this case, all rules apply identically, the entity generating the <code class="highlight"><a data-link-type="element" href="#elementdef-contentkeyusagerule" id="ref-for-elementdef-contentkeyusagerulec$">ContentKeyUsageRule</a></code> element or adding a new rule is responsible for ensuring that they do not contradict each other. A set of rules that would match multiple <a data-link-type="dfn" href="#content-key" id="ref-for-content-keyg$d$">Content Key</a>s to a single <a data-link-type="dfn" href="#content-key-context" id="ref-for-content-key-context`$f$">Content Key Context</a> is invalid.</p> <p>If more than one of a particular type of filter (e.g. <code class="highlight"><a data-link-type="element" href="#elementdef-keyperiodfilter" id="ref-for-elementdef-keyperiodfilter`$">KeyPeriodFilter</a></code>) is present within a <code class="highlight"><a data-link-type="element" href="#elementdef-contentkeyusagerule" id="ref-for-elementdef-contentkeyusageruled$">ContentKeyUsageRule</a></code>, then they are first aggregated with a logical OR operator. After that, different types of filters are aggregated with a logical AND operator. For example, a rule that defines a label filter for stream-1, a label filter for steam-2 and a video filter would be matched as (stream-1 OR stream-2) AND video.</p> <p>A scenario where multiple <a data-link-type="dfn" href="#content-key" id="ref-for-content-keyg$e$">Content Key</a>s can be mapped to a single <a data-link-type="dfn" href="#content-key-context" id="ref-for-content-key-context`$g$">Content Key Context</a> shall be considered invalid. A CPIX document must always match exactly zero or one <a data-link-type="dfn" href="#content-key" id="ref-for-content-keyg$f$">Content Key</a>s to any <a data-link-type="dfn" href="#content-key-context" id="ref-for-content-key-context`$h$">Content Key Context</a>.</p> <p>A usage rule shall be considered unusable if it contains a child element whose meaning is unknown (i.e. a filter of an unknown type) or which cannot be processed for any other reason (e.g. <code class="highlight"><a data-link-type="element-sub" href="#element-attrdef-videofilter-minpixels" id="ref-for-element-attrdef-videofilter-minpixels">minPixels</a></code> is defined but the implementation does not know the pixel count of the video samples). An entity interpreting the <code class="highlight"><a data-link-type="element" href="#elementdef-contentkeyusagerule" id="ref-for-elementdef-contentkeyusagerulee$">ContentKeyUsageRule</a></code> element shall not perform <a data-link-type="dfn" href="#content-key" id="ref-for-content-keyg$g$">Content Key</a>(s) mapping to <a data-link-type="dfn" href="#content-key-context" id="ref-for-content-key-contexta$�$">Content Key Context</a>s if any unusable usage rules exist. An entity that is not interpreting the <code class="highlight"><a data-link-type="element" href="#elementdef-contentkeyusagerule" id="ref-for-elementdef-contentkeyusagerulef$">ContentKeyUsageRule</a></code> element (doing, for example, only storage of the CPIX document for latter distribution to another entity) can perform any processing on the document.</p> <p>Processing of the <a data-link-type="dfn" href="#content-key" id="ref-for-content-keyg$h$">Content Key</a>(s) referenced by any unusable usage rules must not be performed. The usable part of the document can be processed normally.</p> <p>There can be many different sources for defining usage rules, for example, they can be the result of a right holder requirement or a decision to encrypt separately SD, HD and UHD tracks. The CPIX document does not keep track of the source of these rules, it only defines how to maps <a data-link-type="dfn" href="#content-key" id="ref-for-content-keyh$�$">Content Key</a>s to tracks.</p> <h5 class="heading settled" data-level="5.2.13.2" id="schema-keyperiodfilter"><span class="secno">5.2.13.2. </span><span class="content"><dfn class="dfn-paneled" data-dfn-type="element" data-export id="elementdef-keyperiodfilter"><code class="highlight">KeyPeriodFilter</code></dfn> Element</span><a class="self-link" href="#schema-keyperiodfilter"></a></h5> <dl> <dt data-md><dfn data-dfn-for="KeyPeriodFilter" data-dfn-type="element-attr" data-export id="element-attrdef-keyperiodfilter-periodid"><code class="highlight">periodId</code><a class="self-link" href="#element-attrdef-keyperiodfilter-periodid"></a></dfn> (M, xs:ID) <dd data-md> <p>This references a <code class="highlight"><a data-link-type="element" href="#elementdef-contentkeyperiod" id="ref-for-elementdef-contentkeyperioda$">ContentKeyPeriod</a></code> element by <code class="highlight"><a data-link-type="element-sub" href="#element-attrdef-contentkeyperiod-id" id="ref-for-element-attrdef-contentkeyperiod-id">id</a></code>. The filter will only match samples that belong to the referenced key period.</p> </dl> <p><img src="Images/Schema-KeyPeriodFilter.png"></p> <h5 class="heading settled" data-level="5.2.13.3" id="schema-labelfilter"><span class="secno">5.2.13.3. </span><span class="content"><dfn class="dfn-paneled" data-dfn-type="element" data-export id="elementdef-labelfilter"><code class="highlight">LabelFilter</code></dfn> Element</span><a class="self-link" href="#schema-labelfilter"></a></h5> <dl> <dt data-md><dfn class="dfn-paneled" data-dfn-for="LabelFilter" data-dfn-type="element-attr" data-export id="element-attrdef-labelfilter-label"><code class="highlight">label</code></dfn> (M, xs:string) <dd data-md> <p>The filter will only match samples that carry a matching label. The exact meaning of labels is implementation-defined and must be agreed upon in advance by the producer and consumer of the CPIX document.</p> </dl> <p><img src="Images/Schema-LabelFilter.png"></p> <p>The <code class="highlight"><a data-link-type="element-sub" href="#element-attrdef-labelfilter-label" id="ref-for-element-attrdef-labelfilter-label">label</a></code> attribute is meant for triggering a particular <code class="highlight"><a data-link-type="element" href="#elementdef-contentkeyusagerule" id="ref-for-elementdef-contentkeyusageruleg$">ContentKeyUsageRule</a></code> by using pre-agreed upon label strings. Its value may or may not correspond to media track types. One example is a label such as UHD that can be used to match the corresponding <code class="highlight"><a data-link-type="element" href="#elementdef-contentkeyusagerule" id="ref-for-elementdef-contentkeyusageruleh$">ContentKeyUsageRule</a></code> element when used as an input or selector for a content encryptor, media packager, MPD generator or license service to select a specific <a data-link-type="dfn" href="#content-key" id="ref-for-content-keyh$`$">Content Key</a>, populate the ContentProtection element, or include the corresponding key in a content license. Another example is if there is a previous agreement defined outside of a CPIX document that "blue tracks" are encrypted with the <a data-link-type="dfn" href="#content-key" id="ref-for-content-keyh$a$">Content Key</a> 1234 and "green tracks" are encrypted with the <a data-link-type="dfn" href="#content-key" id="ref-for-content-keyh$b$">Content Key</a> 5678. The labels can be used in this case to identify the suitable tracks (without expressing the specifics of the agreement itself).</p> <p>In contrast, the <code class="highlight"><a data-link-type="element-sub" href="#element-attrdef-contentkeyusagerule-intendedtracktype" id="ref-for-element-attrdef-contentkeyusagerule-intendedtracktype">intendedTrackType</a></code> attribute of <code class="highlight"><a data-link-type="element" href="#elementdef-contentkeyusagerule" id="ref-for-elementdef-contentkeyusagerule`$�$">ContentKeyUsageRule</a></code> is used to assign a track type to the media streams which match the filters. The value of the string may not be pre-agreed between the various entities making use of the CPIX document. Said differently, the <code class="highlight"><a data-link-type="element-sub" href="#element-attrdef-contentkeyusagerule-intendedtracktype" id="ref-for-element-attrdef-contentkeyusagerule-intendedtracktype`$">intendedTrackType</a></code> attribute is a metadata that states business logic. For example, a rule can be that all low resolutions streams are encrypted with the same <a data-link-type="dfn" href="#content-key" id="ref-for-content-keyh$c$">Content Key</a>. The value lowRes matches this rule. It has no function in defining what <a data-link-type="dfn" href="#content-key" id="ref-for-content-keyh$d$">Content Key</a> are matched to what tracks, it simply acts as a label to allow business logic to say authorize the use of lowRes <a data-link-type="dfn" href="#content-key" id="ref-for-content-keyh$e$">Content Key</a> and then a CPIX processor can find the rules that matches the right <a data-link-type="dfn" href="#content-key" id="ref-for-content-keyh$f$">Content Key</a>s for lowRes and thereby associated with low resolution tracks.</p> <p class="note" role="note"><span>Note:</span> If a specific key is to be used for more than one type of track (this is not recommended), then there ought to be multiple <code class="highlight"><a data-link-type="element" href="#elementdef-contentkeyusagerule" id="ref-for-elementdef-contentkeyusagerule`$`$">ContentKeyUsageRule</a></code> elements, one for each track type, even if they all reference the same <a data-link-type="dfn" href="#content-key" id="ref-for-content-keyh$g$">Content Key</a> with the same <code class="highlight"><a data-link-type="element-sub" href="#element-attrdef-contentkey-kid" id="ref-for-element-attrdef-contentkey-kidb$">kid</a></code>.</p> <h5 class="heading settled" data-level="5.2.13.4" id="schema-videofilter"><span class="secno">5.2.13.4. </span><span class="content"><dfn class="dfn-paneled" data-dfn-type="element" data-export id="elementdef-videofilter"><code class="highlight">VideoFilter</code></dfn> Element</span><a class="self-link" href="#schema-videofilter"></a></h5> <p>If present, even without any attributes, the filter will only match video samples.</p> <dl> <dt data-md><dfn class="dfn-paneled" data-dfn-for="VideoFilter" data-dfn-type="element-attr" data-export id="element-attrdef-videofilter-minpixels"><code class="highlight">minPixels</code></dfn> (O, xs:integer) <dd data-md> <p>The filter will only match video samples that contain at least this many pixels (encoded width x height before considering pixel/sample aspect ratio). The default value is 0 (zero).</p> <dt data-md><dfn class="dfn-paneled" data-dfn-for="VideoFilter" data-dfn-type="element-attr" data-export id="element-attrdef-videofilter-maxpixels"><code class="highlight">maxPixels</code></dfn> (O, xs:integer) <dd data-md> <p>The filter will not match video samples that contain more than this number of pixels (encoded width x height before considering pixel/sample aspect ratio). The default value is MAX_UINT32.</p> <dt data-md><dfn data-dfn-for="VideoFilter" data-dfn-type="element-attr" data-export id="element-attrdef-videofilter-hdr"><code class="highlight">hdr</code><a class="self-link" href="#element-attrdef-videofilter-hdr"></a></dfn> (O, xs:boolean) <dd data-md> <p>Boolean value indicating whether the matching video stream is encoded in HDR.</p> <dt data-md><dfn data-dfn-for="VideoFilter" data-dfn-type="element-attr" data-export id="element-attrdef-videofilter-wcg"><code class="highlight">wcg</code><a class="self-link" href="#element-attrdef-videofilter-wcg"></a></dfn> (O, xs:boolean) <dd data-md> <p>Boolean value indicating whether the matching video stream is encoded in WCG.</p> <dt data-md><dfn class="dfn-paneled" data-dfn-for="VideoFilter" data-dfn-type="element-attr" data-export id="element-attrdef-videofilter-minfps"><code class="highlight">minFps</code></dfn> (O, xs:integer) <dd data-md> <p>Minimum nominal number of frames per second for the video stream. For interlaced video, this is half the number of fields per second.</p> <dt data-md><dfn class="dfn-paneled" data-dfn-for="VideoFilter" data-dfn-type="element-attr" data-export id="element-attrdef-videofilter-maxfps"><code class="highlight">maxFps</code></dfn> (O, xs:integer) <dd data-md> <p>Maximum nominal number of frames per second for the video stream. For interlaced video, this is half the number of fields per second.</p> </dl> <p>When <code class="highlight"><a data-link-type="element-sub" href="#element-attrdef-videofilter-minpixels" id="ref-for-element-attrdef-videofilter-minpixels`$">minPixels</a></code> and <code class="highlight"><a data-link-type="element-sub" href="#element-attrdef-videofilter-maxpixels" id="ref-for-element-attrdef-videofilter-maxpixels">maxPixels</a></code> are present, the interval is defined by [<code class="highlight"><a data-link-type="element-sub" href="#element-attrdef-videofilter-minpixels" id="ref-for-element-attrdef-videofilter-minpixelsa$">minPixels</a></code>, <code class="highlight"><a data-link-type="element-sub" href="#element-attrdef-videofilter-maxpixels" id="ref-for-element-attrdef-videofilter-maxpixels`$">maxPixels</a></code>], meaning that the filter is used for content with video samples that contain <code class="highlight"><a data-link-type="element-sub" href="#element-attrdef-videofilter-minpixels" id="ref-for-element-attrdef-videofilter-minpixelsb$">minPixels</a></code> pixels and is used for content with video samples that contain <code class="highlight"><a data-link-type="element-sub" href="#element-attrdef-videofilter-maxpixels" id="ref-for-element-attrdef-videofilter-maxpixelsa$">maxPixels</a></code> pixels.</p> <p>When <code class="highlight"><a data-link-type="element-sub" href="#element-attrdef-videofilter-minfps" id="ref-for-element-attrdef-videofilter-minfps">minFps</a></code> and <code class="highlight"><a data-link-type="element-sub" href="#element-attrdef-videofilter-maxfps" id="ref-for-element-attrdef-videofilter-maxfps">maxFps</a></code> are present, the interval is defined by (<code class="highlight"><a data-link-type="element-sub" href="#element-attrdef-videofilter-minfps" id="ref-for-element-attrdef-videofilter-minfps`$">minFps</a></code>, <code class="highlight"><a data-link-type="element-sub" href="#element-attrdef-videofilter-maxfps" id="ref-for-element-attrdef-videofilter-maxfps`$">maxFps</a></code>], meaning that the filter is not used for content with nominal FPS equal to <code class="highlight"><a data-link-type="element-sub" href="#element-attrdef-videofilter-minfps" id="ref-for-element-attrdef-videofilter-minfpsa$">minFps</a></code> but is used for content with nominal FPS equal to <code class="highlight"><a data-link-type="element-sub" href="#element-attrdef-videofilter-maxfps" id="ref-for-element-attrdef-videofilter-maxfpsa$">maxFps</a></code>.</p> <p><img src="Images/Schema-VideoFilter.png"></p> <h5 class="heading settled" data-level="5.2.13.5" id="schema-audiofilter"><span class="secno">5.2.13.5. </span><span class="content"><dfn class="dfn-paneled" data-dfn-type="element" data-export id="elementdef-audiofilter"><code class="highlight">AudioFilter</code></dfn> Element</span><a class="self-link" href="#schema-audiofilter"></a></h5> <p>If present, even without any attributes, the filter will only match audio samples.</p> <dl> <dt data-md><dfn class="dfn-paneled" data-dfn-for="AudioFilter" data-dfn-type="element-attr" data-export id="element-attrdef-audiofilter-minchannels"><code class="highlight">minChannels</code></dfn> (O, xs:integer) <dd data-md> <p>The filter will only match audio samples that contain at least this many channels. The default value is 0 (zero).</p> <dt data-md><dfn class="dfn-paneled" data-dfn-for="AudioFilter" data-dfn-type="element-attr" data-export id="element-attrdef-audiofilter-maxchannels"><code class="highlight">maxChannels</code></dfn> (O, xs:integer) <dd data-md> <p>The filter will not match audio samples that contain more than this number of channels. The default value is MAX_UINT32.</p> </dl> <p>When <code class="highlight"><a data-link-type="element-sub" href="#element-attrdef-audiofilter-minchannels" id="ref-for-element-attrdef-audiofilter-minchannels">minChannels</a></code> and <code class="highlight"><a data-link-type="element-sub" href="#element-attrdef-audiofilter-maxchannels" id="ref-for-element-attrdef-audiofilter-maxchannels">maxChannels</a></code> are present, the interval is defined by [<code class="highlight"><a data-link-type="element-sub" href="#element-attrdef-audiofilter-minchannels" id="ref-for-element-attrdef-audiofilter-minchannels`$">minChannels</a></code>, <code class="highlight"><a data-link-type="element-sub" href="#element-attrdef-audiofilter-maxchannels" id="ref-for-element-attrdef-audiofilter-maxchannels`$">maxChannels</a></code>], meaning that the filter is used for content with audio samples that have <code class="highlight"><a data-link-type="element-sub" href="#element-attrdef-audiofilter-minchannels" id="ref-for-element-attrdef-audiofilter-minchannelsa$">minChannels</a></code> audio channels and is used for content with audio samples that have <code class="highlight"><a data-link-type="element-sub" href="#element-attrdef-audiofilter-maxchannels" id="ref-for-element-attrdef-audiofilter-maxchannelsa$">maxChannels</a></code> audio channels.</p> <p><img src="Images/Schema-AudioFilter.png"></p> <h5 class="heading settled" data-level="5.2.13.6" id="schema-bitratefilter"><span class="secno">5.2.13.6. </span><span class="content"><dfn class="dfn-paneled" data-dfn-type="element" data-export id="elementdef-bitratefilter"><code class="highlight">BitrateFilter</code></dfn> Element</span><a class="self-link" href="#schema-bitratefilter"></a></h5> <dl> <dt data-md><dfn class="dfn-paneled" data-dfn-for="BitrateFilter" data-dfn-type="element-attr" data-export id="element-attrdef-bitratefilter-minbitrate"><code class="highlight">minBitrate</code></dfn> (O, xs:integer) <dd data-md> <p>The filter will only match samples from streams with a nominal bitrate in Mb/s of at least this value. The default value is 0 (zero).</p> <dd data-md> <p>At least one of <code class="highlight"><a data-link-type="element-sub" href="#element-attrdef-bitratefilter-minbitrate" id="ref-for-element-attrdef-bitratefilter-minbitrate">minBitrate</a></code> and <code class="highlight"><a data-link-type="element-sub" href="#element-attrdef-bitratefilter-maxbitrate" id="ref-for-element-attrdef-bitratefilter-maxbitrate">maxBitrate</a></code> must be specified.</p> <dt data-md><dfn class="dfn-paneled" data-dfn-for="BitrateFilter" data-dfn-type="element-attr" data-export id="element-attrdef-bitratefilter-maxbitrate"><code class="highlight">maxBitrate</code></dfn> (O, xs:integer) <dd data-md> <p>The filter will not match samples from streams with a nominal bitrate in Mb/s that exceeds this value. The default value is MAX_UINT32.</p> <dd data-md> <p>At least one of <code class="highlight"><a data-link-type="element-sub" href="#element-attrdef-bitratefilter-minbitrate" id="ref-for-element-attrdef-bitratefilter-minbitrate`$">minBitrate</a></code> and <code class="highlight"><a data-link-type="element-sub" href="#element-attrdef-bitratefilter-maxbitrate" id="ref-for-element-attrdef-bitratefilter-maxbitrate`$">maxBitrate</a></code> must be specified.</p> </dl> <p>When <code class="highlight"><a data-link-type="element-sub" href="#element-attrdef-bitratefilter-minbitrate" id="ref-for-element-attrdef-bitratefilter-minbitratea$">minBitrate</a></code> and <code class="highlight"><a data-link-type="element-sub" href="#element-attrdef-bitratefilter-maxbitrate" id="ref-for-element-attrdef-bitratefilter-maxbitratea$">maxBitrate</a></code> are present, the interval is defined by [<code class="highlight"><a data-link-type="element-sub" href="#element-attrdef-bitratefilter-minbitrate" id="ref-for-element-attrdef-bitratefilter-minbitrateb$">minBitrate</a></code>, <code class="highlight"><a data-link-type="element-sub" href="#element-attrdef-bitratefilter-maxbitrate" id="ref-for-element-attrdef-bitratefilter-maxbitrateb$">maxBitrate</a></code>], meaning that the filter is used for content with bitrate of <code class="highlight"><a data-link-type="element-sub" href="#element-attrdef-bitratefilter-minbitrate" id="ref-for-element-attrdef-bitratefilter-minbitratec$">minBitrate</a></code> and is used for content with bitrate of <code class="highlight"><a data-link-type="element-sub" href="#element-attrdef-bitratefilter-maxbitrate" id="ref-for-element-attrdef-bitratefilter-maxbitratec$">maxBitrate</a></code>.</p> <p><img src="Images/Schema-BitrateFilter.png"></p> <h4 class="heading settled" data-level="5.2.14" id="schema-updatehistoryitemlist"><span class="secno">5.2.14. </span><span class="content"><dfn class="dfn-paneled" data-dfn-type="element" data-export id="elementdef-updatehistoryitemlist"><code class="highlight">UpdateHistoryItemList</code></dfn> Element</span><a class="self-link" href="#schema-updatehistoryitemlist"></a></h4> <dl> <dt data-md><dfn data-dfn-for="UpdateHistoryItemList" data-dfn-type="element-attr" data-export id="element-attrdef-updatehistoryitemlist-id"><code class="highlight">id</code><a class="self-link" href="#element-attrdef-updatehistoryitemlist-id"></a></dfn> (O, xs:ID) <dd data-md> <p>Specifies an identifier for the element. It is recommended to use an identifier that is unique within the scope in which this CPIX document is published.</p> <dt data-md><dfn data-dfn-for="UpdateHistoryItemList" data-dfn-type="element-attr" data-export id="element-attrdef-updatehistoryitemlist-updatehistoryitem"><code class="highlight">UpdateHistoryItem</code><a class="self-link" href="#element-attrdef-updatehistoryitemlist-updatehistoryitem"></a></dfn> (0...N, <code class="highlight"><a data-link-type="element" href="#elementdef-updatehistoryitem" id="ref-for-elementdef-updatehistoryitemg$">UpdateHistoryItem</a></code>) <dd data-md> <p>It contains metadata about an update made to the CPIX document. There should be one entry for each instance in which an entity updated the document.</p> </dl> <p><img src="Images/Schema-UpdateHistoryItemList.png"></p> <h4 class="heading settled" data-level="5.2.15" id="schema-updatehistoryitem"><span class="secno">5.2.15. </span><span class="content"><dfn class="dfn-paneled" data-dfn-type="element" data-export id="elementdef-updatehistoryitem"><code class="highlight">UpdateHistoryItem</code></dfn> Element</span><a class="self-link" href="#schema-updatehistoryitem"></a></h4> <dl> <dt data-md><dfn data-dfn-for="UpdateHistoryItem" data-dfn-type="element-attr" data-export id="element-attrdef-updatehistoryitem-id"><code class="highlight">id</code><a class="self-link" href="#element-attrdef-updatehistoryitem-id"></a></dfn> (O, xs:ID) <dd data-md> <p>Specifies an identifier for the element. It is recommended to use an identifier that is unique within the scope in which this CPIX document is published.</p> <dt data-md><dfn class="dfn-paneled" data-dfn-for="UpdateHistoryItem" data-dfn-type="element-attr" data-export id="element-attrdef-updatehistoryitem-updateversion"><code class="highlight">updateVersion</code></dfn> (M, xs:integer) <dd data-md> <p>The is the ID referenced by other elements in the document. It is strongly recommended to use an identifier that is unique within the scope in which this CPIX document is published.</p> <dt data-md><dfn data-dfn-for="UpdateHistoryItem" data-dfn-type="element-attr" data-export id="element-attrdef-updatehistoryitem-index"><code class="highlight">index</code><a class="self-link" href="#element-attrdef-updatehistoryitem-index"></a></dfn> (M, xs:string) <dd data-md> <p>This is the version number for the document update. Each <code class="highlight"><a data-link-type="element" href="#elementdef-updatehistoryitem" id="ref-for-elementdef-updatehistoryitemh$">UpdateHistoryItem</a></code> element contains a unique value for this attribute. It is a monotonically increasing number, starting at value 1.</p> <dt data-md><dfn data-dfn-for="UpdateHistoryItem" data-dfn-type="element-attr" data-export id="element-attrdef-updatehistoryitem-source"><code class="highlight">source</code><a class="self-link" href="#element-attrdef-updatehistoryitem-source"></a></dfn> (M, xs:string) <dd data-md> <p>This is the identifier for the entity which performed the document update.</p> <dt data-md><dfn data-dfn-for="UpdateHistoryItem" data-dfn-type="element-attr" data-export id="element-attrdef-updatehistoryitem-date"><code class="highlight">date</code><a class="self-link" href="#element-attrdef-updatehistoryitem-date"></a></dfn> (M, xs:dateTime) <dd data-md> <p>This is the date and time when the document update was performed.</p> </dl> <p><img src="Images/Schema-UpdateHistoryItem.png"></p> <h2 class="heading settled" data-level="6" id="keys"><span class="secno">6. </span><span class="content">Key Management</span><a class="self-link" href="#keys"></a></h2> <h3 class="heading settled" data-level="6.1" id="keys-enc"><span class="secno">6.1. </span><span class="content">Key Encryption in the CPIX Document</span><a class="self-link" href="#keys-enc"></a></h3> <p>The CPIX document allows exchanging <a data-link-type="dfn" href="#content-key" id="ref-for-content-keyh$h$">Content Key</a>s in the clear but this is not a recommended method as it relies on the security of the communication mechanism used to deliver the CPIX document to the recipients, which may not be sufficient to adequately protect the <a data-link-type="dfn" href="#content-key" id="ref-for-content-key`$�$�$">Content Key</a>s.</p> <p><a data-link-type="dfn" href="#content-key" id="ref-for-content-key`$�$`$">Content Key</a>s can be delivered encrypted within the document itself and in this case, a multi-level structure of encryption keys is used for an efficient encryption avoiding duplication of encrypted content and expensive encryption methods. This section describes the mechanism that shall be used when encryption of the <a data-link-type="dfn" href="#content-key" id="ref-for-content-key`$�$a$">Content Key</a>s in the document is used.</p> <h4 class="heading settled" data-level="6.1.1" id="keys-enc-keytypes"><span class="secno">6.1.1. </span><span class="content">Keys Used to Secure the CPIX Document</span><a class="self-link" href="#keys-enc-keytypes"></a></h4> <p>The document contains the following keys:</p> <p><strong>Content Keys</strong></p> <p>Each ContentKey element contains one <a data-link-type="dfn" href="#content-key" id="ref-for-content-key`$�$b$">Content Key</a> that is used for encrypting an asset or crypto period of an asset or that acts as a dependency for the use of other <a data-link-type="dfn" href="#content-key" id="ref-for-content-key`$�$c$">Content Key</a>s (when a key hierarchy is used). Typically, for Common Encryption as supported in <a data-link-type="biblio" href="#biblio-dash-if-iop">[DASH-IF-IOP]</a>, these keys are 128-bit keys used with the AES cipher.</p> <p><strong>Document Key</strong></p> <p>For every CPIX document, a <a data-link-type="dfn" href="#document-key" id="ref-for-document-keya$">Document Key</a> is created. It is used for encrypting every <a data-link-type="dfn" href="#content-key" id="ref-for-content-key`$�$d$">Content Key</a>. The <a data-link-type="dfn" href="#document-key" id="ref-for-document-keyb$">Document Key</a> is a 256-bit key and the encryption algorithm used for encrypting every <a data-link-type="dfn" href="#content-key" id="ref-for-content-key`$�$e$">Content Key</a> is AES. The <a data-link-type="dfn" href="#document-key" id="ref-for-document-keyc$">Document Key</a> is part of each <code class="highlight"><a data-link-type="element" href="#elementdef-deliverydata" id="ref-for-elementdef-deliverydatac$">DeliveryData</a></code> element. It is itself encrypted in the document, using the public key of each recipient.</p> <p><strong>Delivery Keys</strong></p> <p>Each <code class="highlight"><a data-link-type="element" href="#elementdef-deliverydata" id="ref-for-elementdef-deliverydatad$">DeliveryData</a></code> element identifies a Delivery Key, which is a public key from a key pair owned by the intended recipient. The Delivery Key is identified in the <code class="highlight"><a data-link-type="element" href="#elementdef-deliverydata" id="ref-for-elementdef-deliverydatae$">DeliveryData</a></code> element by including the X.509 certificate of the intended recipient. The Delivery Key is used for encrypting the <a data-link-type="dfn" href="#document-key" id="ref-for-document-keyd$">Document Key</a> using an algorithm that is described within the CPIX document, according to <a data-link-type="biblio" href="#biblio-xmlenc-core">[XMLENC-CORE]</a>.</p> <p>The below figure gives the schema of encryption of the different keys when there are several <code class="highlight"><a data-link-type="element" href="#elementdef-deliverydata" id="ref-for-elementdef-deliverydataf$">DeliveryData</a></code> elements and several <code class="highlight"><a data-link-type="element" href="#elementdef-contentkey" id="ref-for-elementdef-contentkeye$">ContentKey</a></code> Elements. The <a data-link-type="dfn" href="#document-key" id="ref-for-document-keye$">Document Key</a> allows reducing the numbers of <code class="highlight"><a data-link-type="element" href="#elementdef-contentkey" id="ref-for-elementdef-contentkeyf$">ContentKey</a></code> Elements as the <a data-link-type="dfn" href="#content-key" id="ref-for-content-key`$�$f$">Content Key</a> they contain are all encrypted by the same <a data-link-type="dfn" href="#document-key" id="ref-for-document-keyf$">Document Key</a>.</p> <figure> <img src="Diagrams/DocumentKeyStructure.png"> <figcaption>Encryption relationships within the CPIX document. Blue indicates encrypted data.</figcaption> </figure> <h4 class="heading settled" data-level="6.1.2" id="keys-enc-mac"><span class="secno">6.1.2. </span><span class="content">Authenticated Encryption</span><a class="self-link" href="#keys-enc-mac"></a></h4> <p><strong>MAC Key</strong></p> <p>For every CPIX document, a MAC Key is created. It is used to calculate the MAC of every encrypted <a data-link-type="dfn" href="#content-key" id="ref-for-content-key`$�$g$">Content Key</a>. The <code class="highlight"><a data-link-type="element" href="#elementdef-deliverydata" id="ref-for-elementdef-deliverydatag$">DeliveryData</a></code> element identifies the MAC algorithm and provides the MAC Key, encrypted with the Delivery Key, for each recipient.</p> <p><strong>Authenticated Encryption of Content Keys</strong></p> <p>Implementations shall provide a MAC for every encrypted <a data-link-type="dfn" href="#content-key" id="ref-for-content-key`$�$h$">Content Key</a> and shall verify the MAC before attempting to decrypt any encrypted <a data-link-type="dfn" href="#content-key" id="ref-for-content-key`$`$�$">Content Key</a>. The purpose of the MAC is to protect against cryptographic vulnerabilities in the receiving application; it is not used as a general purpose authentication mechanism.</p> <p>The MAC is calculated over the data in the <code class="highlight">CipherValue</code> element (the concatenated IV and encrypted <a data-link-type="dfn" href="#content-key" id="ref-for-content-key`$`$`$">Content Key</a>) and stored in the <code class="highlight">ValueMac</code> element under the Secret element for each encrypted <a data-link-type="dfn" href="#content-key" id="ref-for-content-key`$`$a$">Content Key</a>.</p> <h4 class="heading settled" data-level="6.1.3" id="keys-enc-signatures"><span class="secno">6.1.3. </span><span class="content">Digital Signature</span><a class="self-link" href="#keys-enc-signatures"></a></h4> <p>Every element in the document that has an @id attribute can be signed according to <a data-link-type="biblio" href="#biblio-xmldsig-core">[XMLDSIG-CORE]</a>. Furthermore, the document (including any other signatures) can be signed as a whole.</p> <p>Upon loading a CPIX document, implementations should verify that signatures are present on entities that are expected to be signed and verify all digital signatures that are present. Implementations should refuse to process a document if expected signatures are missing or if the signatures cannot be verified or if the signers are not trusted as authoritative sources for the signed data.</p> <p>Implementations should sign any elements that recipients wish to authenticate. Note that modifying any signed data will require any signatures on the data to be removed and/or re-applied. This requires the appropriate consideration and trust model design in content processing workflow creation (out of scope of this specification).</p> <h4 class="heading settled" data-level="6.1.4" id="keys-enc-algorithms"><span class="secno">6.1.4. </span><span class="content">Mandatory Algorithms</span><a class="self-link" href="#keys-enc-algorithms"></a></h4> <p>The following table gives the identification of the algorithms that shall be used for encryption, signature, MAC creation.</p> <table class="def"> <tbody> <tr> <th>Usage <th>Algorithm <tr> <td>Content Key wrapping <td>AES256-CBC, PKCS #7 padding <tr> <td>Encrypted key MAC <td>HMAC-SHA512 <tr> <td>Document Key wrapping <td>RSA-OAEP-MGF1-SHA1 <tr> <td>Digital signature <td>RSASSA-PKCS1-v1_5 <tr> <td>Digital signature digest <td>SHA-512 <tr> <td>Digital signature canonicalization <td>Canonimal XML 1.0 (omits comments) </table> <p>For RSA, the recommended minimum key size is 3072 bits and is it not recommended to use certificates that are signed using SHA-1.</p> <h3 class="heading settled" data-level="6.2" id="keys-rotation"><span class="secno">6.2. </span><span class="content">Key Rotation Support</span><a class="self-link" href="#keys-rotation"></a></h3> <p>A CPIX document can contain content protection information for multiple crypto-periods, or period of time for content encrypted using key rotation. In this case, the document shall contain one or more <code class="highlight"><a data-link-type="element" href="#elementdef-contentkey" id="ref-for-elementdef-contentkeyg$">ContentKey</a></code> elements, one per crypto-period which the document covers. Each <code class="highlight"><a data-link-type="element" href="#elementdef-contentkey" id="ref-for-elementdef-contentkeyh$">ContentKey</a></code> element contains the key material for a single crypto-period. The crypto-period itself is identified by the <code class="highlight"><a data-link-type="element" href="#elementdef-contentkeyperiod" id="ref-for-elementdef-contentkeyperiodb$">ContentKeyPeriod</a></code> element, that includes <code class="highlight"><a data-link-type="element-sub" href="#element-attrdef-contentkeyperiod-start" id="ref-for-element-attrdef-contentkeyperiod-startc$">start</a></code>/<code class="highlight"><a data-link-type="element-sub" href="#element-attrdef-contentkeyperiod-end" id="ref-for-element-attrdef-contentkeyperiod-endc$">end</a></code> or <code class="highlight"><a data-link-type="element-sub" href="#element-attrdef-contentkeyperiod-index" id="ref-for-element-attrdef-contentkeyperiod-indexb$">index</a></code> attributes.</p> <p>Key rotation may be supported in complex workflows, with one entity requesting <a data-link-type="dfn" href="#drm-signaling" id="ref-for-drm-signaling`$d$">DRM Signaling</a> for multiple crypto periods, and another entity providing the requested information (keys, DRM system-specific information for the crypto period, etc).</p> <p>Content encrypted using key rotation may also have periods in the clear that are not encrypted. In this case, there is no <a data-link-type="dfn" href="#content-key" id="ref-for-content-key`$`$b$">Content Key</a> for these periods. A CPIX document will carry no specific information allowing to know that some periods are not encrypted. The information that content is encrypted or not would be known by either looking at the playlist/manifest or any other specific deployment source of data (such as EPG, a metadata server).</p> <h3 class="heading settled" data-level="6.3" id="keys-hierarchies"><span class="secno">6.3. </span><span class="content">Hierarchical Keys</span><a class="self-link" href="#keys-hierarchies"></a></h3> <p>Some DRM systems support the use of hierarchical keys, where the keys used to encrypt media samples (leaf keys) are not usable without a second set of keys (root keys). The mechanism by which root keys are used to protect leaf keys is DRM system specific.</p> <p>CPIX supports expressing two-level key hierarchies, where each leaf key has exactly one root key that is required in order to use the leaf key. Both root keys and leaf keys are represented using <code class="highlight"><a data-link-type="element" href="#elementdef-contentkey" id="ref-for-elementdef-contentkey`$�$">ContentKey</a></code> elements, with leaf keys indicated by the presence of a <code class="highlight"><a data-link-type="element-sub" href="#element-attrdef-contentkey-dependsonkey" id="ref-for-element-attrdef-contentkey-dependsonkey">dependsOnKey</a></code> reference to the root key as described in <a href="#schema-contentkey">�5.2.5 ContentKey Element</a>.</p> <p>When using hierarchical keys, only the leaf keys shall be used to encrypt media content. Therefore, root keys must not be referenced by any <code class="highlight"><a data-link-type="element" href="#elementdef-contentkeyusagerule" id="ref-for-elementdef-contentkeyusagerule`$a$">ContentKeyUsageRule</a></code> elements.</p> <p>The usage of DRM system signaling data is different when hierarchical keys are used. The differences are described in <a href="#schema-drmsystem">�5.2.7 DRMSystem Element</a>.</p> <p>Any DRM system specific functionality associated with key hierarchies exists on the DRM layer. It may affect the DRM system signaling data but not the keys themselves.</p> <h2 class="heading settled" data-level="7" id="examples"><span class="secno">7. </span><span class="content">Examples</span><a class="self-link" href="#examples"></a></h2> <p><a href="https://github.com/Dash-Industry-Forum/cpix-test-vectors">Example CPIX documents are available on GitHub</a>.</p> <p>The examples contain valid data unless explicitly noted otherwise. Their contents are described on the referenced page.</p> </main> <div data-fill-with="conformance"></div> <script> (function() { "use strict"; var collapseSidebarText = '<span aria-hidden="true">�!</span> ' + '<span>Collapse Sidebar</span>'; var expandSidebarText = '<span aria-hidden="true">�!</span> ' + '<span>Pop Out Sidebar</span>'; var tocJumpText = '<span aria-hidden="true">�!</span> ' + '<span>Jump to Table of Contents</span>'; var sidebarMedia = window.matchMedia('screen and (min-width: 78em)'); var autoToggle = function(e){ toggleSidebar(e.matches) }; if(sidebarMedia.addListener) { sidebarMedia.addListener(autoToggle); } function toggleSidebar(on) { if (on == undefined) { on = !document.body.classList.contains('toc-sidebar'); } /* Don t scroll to compensate for the ToC if we re above it already. */ var headY = 0; var head = document.querySelector('.head'); if (head) { // terrible approx of "top of ToC" headY += head.offsetTop + head.offsetHeight; } var skipScroll = window.scrollY < headY; var toggle = document.getElementById('toc-toggle'); var tocNav = document.getElementById('toc'); if (on) { var tocHeight = tocNav.offsetHeight; document.body.classList.add('toc-sidebar'); document.body.classList.remove('toc-inline'); toggle.innerHTML = collapseSidebarText; if (!skipScroll) { window.scrollBy(0, 0 - tocHeight); } tocNav.focus(); sidebarMedia.addListener(autoToggle); // auto-collapse when out of room } else { document.body.classList.add('toc-inline'); document.body.classList.remove('toc-sidebar'); toggle.innerHTML = expandSidebarText; if (!skipScroll) { window.scrollBy(0, tocNav.offsetHeight); } if (toggle.matches(':hover')) { /* Unfocus button when not using keyboard navigation, because I don t know where else to send the focus. */ toggle.blur(); } } } function createSidebarToggle() { /* Create the sidebar toggle in JS; it shouldn t exist when JS is off. */ var toggle = document.createElement('a'); /* This should probably be a button, but appearance isn t standards-track.*/ toggle.id = 'toc-toggle'; toggle.class = 'toc-toggle'; toggle.href = '#toc'; toggle.innerHTML = collapseSidebarText; sidebarMedia.addListener(autoToggle); var toggler = function(e) { e.preventDefault(); sidebarMedia.removeListener(autoToggle); // persist explicit off states toggleSidebar(); return false; } toggle.addEventListener('click', toggler, false); /* Get <nav id=toc-nav>, or make it if we don t have one. */ var tocNav = document.getElementById('toc-nav'); if (!tocNav) { tocNav = document.createElement('p'); tocNav.id = 'toc-nav'; /* Prepend for better keyboard navigation */ document.body.insertBefore(tocNav, document.body.firstChild); } /* While we re at it, make sure we have a Jump to Toc link. */ var tocJump = document.getElementById('toc-jump'); if (!tocJump) { tocJump = document.createElement('a'); tocJump.id = 'toc-jump'; tocJump.href = '#toc'; tocJump.innerHTML = tocJumpText; tocNav.appendChild(tocJump); } tocNav.appendChild(toggle); } var toc = document.getElementById('toc'); if (toc) { createSidebarToggle(); toggleSidebar(sidebarMedia.matches); /* If the sidebar has been manually opened and is currently overlaying the text (window too small for the MQ to add the margin to body), then auto-close the sidebar once you click on something in there. */ toc.addEventListener('click', function(e) { if(e.target.tagName.toLowerCase() == "a" && document.body.classList.contains('toc-sidebar') && !sidebarMedia.matches) { toggleSidebar(false); } }, false); } else { console.warn("Can t find Table of Contents. Please use <nav id='toc'> around the ToC."); } /* Wrap tables in case they overflow */ var tables = document.querySelectorAll(':not(.overlarge) > table.data, :not(.overlarge) > table.index'); var numTables = tables.length; for (var i = 0; i < numTables; i++) { var table = tables[i]; var wrapper = document.createElement('div'); wrapper.className = 'overlarge'; table.parentNode.insertBefore(wrapper, table); wrapper.appendChild(table); } })(); </script> <h2 class="no-num no-ref heading settled" id="index"><span class="content">Index</span><a class="self-link" href="#index"></a></h2> <h3 class="no-num no-ref heading settled" id="index-defined-here"><span class="content">Terms defined by this specification</span><a class="self-link" href="#index-defined-here"></a></h3> <ul class="index"> <li><a href="#element-attrdef-contentkey-algorithm">Algorithm</a><span>, in �5.2.5</span> <li> AudioFilter <ul> <li><a href="#elementdef-audiofilter">(element)</a><span>, in �5.2.13.5</span> <li><a href="#element-attrdef-contentkeyusagerule-audiofilter">element-attr for ContentKeyUsageRule</a><span>, in �5.2.12</span> </ul> <li> BitrateFilter <ul> <li><a href="#elementdef-bitratefilter">(element)</a><span>, in �5.2.13.6</span> <li><a href="#element-attrdef-contentkeyusagerule-bitratefilter">element-attr for ContentKeyUsageRule</a><span>, in �5.2.12</span> </ul> <li><a href="#content">Content</a><span>, in �3.2</span> <li><a href="#element-attrdef-cpix-contentid">contentId</a><span>, in �5.2.1</span> <li> ContentKey <ul> <li><a href="#elementdef-contentkey">(element)</a><span>, in �5.2.5</span> <li><a href="#element-attrdef-contentkeylist-contentkey">element-attr for ContentKeyList</a><span>, in �5.2.4</span> </ul> <li><a href="#content-key">Content Key</a><span>, in �3.2</span> <li><a href="#content-key-context">Content Key Context</a><span>, in �3.2</span> <li> ContentKeyList <ul> <li><a href="#elementdef-contentkeylist">(element)</a><span>, in �5.2.4</span> <li><a href="#element-attrdef-cpix-contentkeylist">element-attr for CPIX</a><span>, in �5.2.1</span> </ul> <li> ContentKeyPeriod <ul> <li><a href="#elementdef-contentkeyperiod">(element)</a><span>, in �5.2.10</span> <li><a href="#element-attrdef-contentkeyperiodlist-contentkeyperiod">element-attr for ContentKeyPeriodList</a><span>, in �5.2.9</span> </ul> <li> ContentKeyPeriodList <ul> <li><a href="#elementdef-contentkeyperiodlist">(element)</a><span>, in �5.2.9</span> <li><a href="#element-attrdef-cpix-contentkeyperiodlist">element-attr for CPIX</a><span>, in �5.2.1</span> </ul> <li> ContentKeyUsageRule <ul> <li><a href="#elementdef-contentkeyusagerule">(element)</a><span>, in �5.2.12</span> <li><a href="#element-attrdef-contentkeyusagerulelist-contentkeyusagerule">element-attr for ContentKeyUsageRuleList</a><span>, in �5.2.11</span> </ul> <li> ContentKeyUsageRuleList <ul> <li><a href="#elementdef-contentkeyusagerulelist">(element)</a><span>, in �5.2.11</span> <li><a href="#element-attrdef-cpix-contentkeyusagerulelist">element-attr for CPIX</a><span>, in �5.2.1</span> </ul> <li><a href="#content-protection">Content Protection</a><span>, in �3.2</span> <li><a href="#element-attrdef-drmsystem-contentprotectiondata">ContentProtectionData</a><span>, in �5.2.7</span> <li><a href="#elementdef-cpix">CPIX</a><span>, in �5.2.1</span> <li><a href="#element-attrdef-updatehistoryitem-date">date</a><span>, in �5.2.15</span> <li> DeliveryData <ul> <li><a href="#elementdef-deliverydata">(element)</a><span>, in �5.2.3</span> <li><a href="#element-attrdef-deliverydatalist-deliverydata">element-attr for DeliveryDataList</a><span>, in �5.2.2</span> </ul> <li> DeliveryDataList <ul> <li><a href="#elementdef-deliverydatalist">(element)</a><span>, in �5.2.2</span> <li><a href="#element-attrdef-cpix-deliverydatalist">element-attr for CPIX</a><span>, in �5.2.1</span> </ul> <li><a href="#element-attrdef-deliverydata-deliverykey">DeliveryKey</a><span>, in �5.2.3</span> <li><a href="#element-attrdef-contentkey-dependsonkey">dependsOnKey</a><span>, in �5.2.5</span> <li><a href="#element-attrdef-deliverydata-description">Description</a><span>, in �5.2.3</span> <li><a href="#document-key">Document Key</a><span>, in �3.2</span> <li><a href="#element-attrdef-deliverydata-documentkey">DocumentKey</a><span>, in �5.2.3</span> <li><a href="#drm-signaling">DRM Signaling</a><span>, in �3.2</span> <li> DRMSystem <ul> <li><a href="#elementdef-drmsystem">(element)</a><span>, in �5.2.7</span> <li><a href="#element-attrdef-drmsystemlist-drmsystem">element-attr for DRMSystemList</a><span>, in �5.2.6</span> </ul> <li> DRMSystemList <ul> <li><a href="#elementdef-drmsystemlist">(element)</a><span>, in �5.2.6</span> <li><a href="#element-attrdef-cpix-drmsystemlist">element-attr for CPIX</a><span>, in �5.2.1</span> </ul> <li><a href="#element-attrdef-contentkeyperiod-end">end</a><span>, in �5.2.10</span> <li><a href="#element-attrdef-contentkey-explicitiv">explicitIV</a><span>, in �5.2.5</span> <li><a href="#element-attrdef-videofilter-hdr">hdr</a><span>, in �5.2.13.4</span> <li><a href="#element-attrdef-drmsystem-hdssignalingdata">HDSSignalingData</a><span>, in �5.2.7</span> <li> HLSSignalingData <ul> <li><a href="#elementdef-hlssignalingdata">(element)</a><span>, in �5.2.8</span> <li><a href="#element-attrdef-drmsystem-hlssignalingdata">element-attr for DRMSystem</a><span>, in �5.2.7</span> </ul> <li> id <ul> <li><a href="#element-attrdef-cpix-id">element-attr for CPIX</a><span>, in �5.2.1</span> <li><a href="#element-attrdef-contentkey-id">element-attr for ContentKey</a><span>, in �5.2.5</span> <li><a href="#element-attrdef-contentkeylist-id">element-attr for ContentKeyList</a><span>, in �5.2.4</span> <li><a href="#element-attrdef-contentkeyperiod-id">element-attr for ContentKeyPeriod</a><span>, in �5.2.10</span> <li><a href="#element-attrdef-contentkeyperiodlist-id">element-attr for ContentKeyPeriodList</a><span>, in �5.2.9</span> <li><a href="#element-attrdef-contentkeyusagerule-id">element-attr for ContentKeyUsageRule</a><span>, in �5.2.12</span> <li><a href="#element-attrdef-contentkeyusagerulelist-id">element-attr for ContentKeyUsageRuleList</a><span>, in �5.2.11</span> <li><a href="#element-attrdef-drmsystem-id">element-attr for DRMSystem</a><span>, in �5.2.7</span> <li><a href="#element-attrdef-drmsystemlist-id">element-attr for DRMSystemList</a><span>, in �5.2.6</span> <li><a href="#element-attrdef-deliverydata-id">element-attr for DeliveryData</a><span>, in �5.2.3</span> <li><a href="#element-attrdef-deliverydatalist-id">element-attr for DeliveryDataList</a><span>, in �5.2.2</span> <li><a href="#element-attrdef-updatehistoryitem-id">element-attr for UpdateHistoryItem</a><span>, in �5.2.15</span> <li><a href="#element-attrdef-updatehistoryitemlist-id">element-attr for UpdateHistoryItemList</a><span>, in �5.2.14</span> </ul> <li> index <ul> <li><a href="#element-attrdef-contentkeyperiod-index">element-attr for ContentKeyPeriod</a><span>, in �5.2.10</span> <li><a href="#element-attrdef-updatehistoryitem-index">element-attr for UpdateHistoryItem</a><span>, in �5.2.15</span> </ul> <li><a href="#element-attrdef-contentkeyusagerule-intendedtracktype">intendedTrackType</a><span>, in �5.2.12</span> <li><a href="#elementdef-introduction">Introduction</a><span>, in �5.2.13.1</span> <li> KeyPeriodFilter <ul> <li><a href="#elementdef-keyperiodfilter">(element)</a><span>, in �5.2.13.2</span> <li><a href="#element-attrdef-contentkeyusagerule-keyperiodfilter">element-attr for ContentKeyUsageRule</a><span>, in �5.2.12</span> </ul> <li> kid <ul> <li><a href="#element-attrdef-contentkey-kid">element-attr for ContentKey</a><span>, in �5.2.5</span> <li><a href="#element-attrdef-contentkeyusagerule-kid">element-attr for ContentKeyUsageRule</a><span>, in �5.2.12</span> <li><a href="#element-attrdef-drmsystem-kid">element-attr for DRMSystem</a><span>, in �5.2.7</span> </ul> <li><a href="#element-attrdef-labelfilter-label">label</a><span>, in �5.2.13.3</span> <li> LabelFilter <ul> <li><a href="#elementdef-labelfilter">(element)</a><span>, in �5.2.13.3</span> <li><a href="#element-attrdef-contentkeyusagerule-labelfilter">element-attr for ContentKeyUsageRule</a><span>, in �5.2.12</span> </ul> <li><a href="#element-attrdef-deliverydata-macmethod">MACMethod</a><span>, in �5.2.3</span> <li><a href="#element-attrdef-bitratefilter-maxbitrate">maxBitrate</a><span>, in �5.2.13.6</span> <li><a href="#element-attrdef-audiofilter-maxchannels">maxChannels</a><span>, in �5.2.13.5</span> <li><a href="#element-attrdef-videofilter-maxfps">maxFps</a><span>, in �5.2.13.4</span> <li><a href="#element-attrdef-videofilter-maxpixels">maxPixels</a><span>, in �5.2.13.4</span> <li><a href="#element-attrdef-bitratefilter-minbitrate">minBitrate</a><span>, in �5.2.13.6</span> <li><a href="#element-attrdef-audiofilter-minchannels">minChannels</a><span>, in �5.2.13.5</span> <li><a href="#element-attrdef-videofilter-minfps">minFps</a><span>, in �5.2.13.4</span> <li><a href="#element-attrdef-videofilter-minpixels">minPixels</a><span>, in �5.2.13.4</span> <li> name <ul> <li><a href="#element-attrdef-cpix-name">element-attr for CPIX</a><span>, in �5.2.1</span> <li><a href="#element-attrdef-drmsystem-name">element-attr for DRMSystem</a><span>, in �5.2.7</span> <li><a href="#element-attrdef-deliverydata-name">element-attr for DeliveryData</a><span>, in �5.2.3</span> </ul> <li><a href="#element-attrdef-keyperiodfilter-periodid">periodId</a><span>, in �5.2.13.2</span> <li><a href="#element-attrdef-hlssignalingdata-playlist">playlist</a><span>, in �5.2.8</span> <li> PSSH <ul> <li><a href="#pssh">definition of</a><span>, in �3.2</span> <li><a href="#element-attrdef-drmsystem-pssh">element-attr for DRMSystem</a><span>, in �5.2.7</span> </ul> <li><a href="#element-attrdef-deliverydata-receivingentity">ReceivingEntity</a><span>, in �5.2.3</span> <li><a href="#element-attrdef-deliverydata-senderpointofcontact">SenderPointOfContact</a><span>, in �5.2.3</span> <li><a href="#element-attrdef-deliverydata-sendingentity">SendingEntity</a><span>, in �5.2.3</span> <li><a href="#element-attrdef-cpix-signature">Signature</a><span>, in �5.2.1</span> <li><a href="#element-attrdef-drmsystem-smoothstreamingprotectionheaderdata">SmoothStreamingProtectionHeaderData</a><span>, in �5.2.7</span> <li><a href="#element-attrdef-updatehistoryitem-source">source</a><span>, in �5.2.15</span> <li><a href="#element-attrdef-contentkeyperiod-start">start</a><span>, in �5.2.10</span> <li><a href="#element-attrdef-drmsystem-systemid">systemId</a><span>, in �5.2.7</span> <li> UpdateHistoryItem <ul> <li><a href="#elementdef-updatehistoryitem">(element)</a><span>, in �5.2.15</span> <li><a href="#element-attrdef-updatehistoryitemlist-updatehistoryitem">element-attr for UpdateHistoryItemList</a><span>, in �5.2.14</span> </ul> <li> UpdateHistoryItemList <ul> <li><a href="#elementdef-updatehistoryitemlist">(element)</a><span>, in �5.2.14</span> <li><a href="#element-attrdef-cpix-updatehistoryitemlist">element-attr for CPIX</a><span>, in �5.2.1</span> </ul> <li> updateVersion <ul> <li><a href="#element-attrdef-contentkeylist-updateversion">element-attr for ContentKeyList</a><span>, in �5.2.4</span> <li><a href="#element-attrdef-contentkeyperiodlist-updateversion">element-attr for ContentKeyPeriodList</a><span>, in �5.2.9</span> <li><a href="#element-attrdef-contentkeyusagerulelist-updateversion">element-attr for ContentKeyUsageRuleList</a><span>, in �5.2.11</span> <li><a href="#element-attrdef-drmsystem-updateversion">element-attr for DRMSystem</a><span>, in �5.2.7</span> <li><a href="#element-attrdef-drmsystemlist-updateversion">element-attr for DRMSystemList</a><span>, in �5.2.6</span> <li><a href="#element-attrdef-deliverydata-updateversion">element-attr for DeliveryData</a><span>, in �5.2.3</span> <li><a href="#element-attrdef-deliverydatalist-updateversion">element-attr for DeliveryDataList</a><span>, in �5.2.2</span> <li><a href="#element-attrdef-updatehistoryitem-updateversion">element-attr for UpdateHistoryItem</a><span>, in �5.2.15</span> </ul> <li><a href="#element-attrdef-drmsystem-uriextxkey">URIExtXKey</a><span>, in �5.2.7</span> <li><a href="#elementdef-usage-rules-filters">Usage Rules Filters</a><span>, in �5.2.13</span> <li> VideoFilter <ul> <li><a href="#elementdef-videofilter">(element)</a><span>, in �5.2.13.4</span> <li><a href="#element-attrdef-contentkeyusagerule-videofilter">element-attr for ContentKeyUsageRule</a><span>, in �5.2.12</span> </ul> <li><a href="#element-attrdef-videofilter-wcg">wcg</a><span>, in �5.2.13.4</span> </ul> <h2 class="no-num no-ref heading settled" id="references"><span class="content">References</span><a class="self-link" href="#references"></a></h2> <h3 class="no-num no-ref heading settled" id="normative"><span class="content">Normative References</span><a class="self-link" href="#normative"></a></h3> <dl> <dt id="biblio-cpix-xsd">[CPIX-XSD] <dd><a href="https://dashif.org/guidelines/">CPIX XML Schema</a>. URL: <a href="https://dashif.org/guidelines/">https://dashif.org/guidelines/</a> <dt id="biblio-dash-if-iop">[DASH-IF-IOP] <dd><a href="https://dashif.org/guidelines/">Guidelines for Implementation: DASH-IF Interoperability Points, version 4.1, September 2017.</a>. URL: <a href="https://dashif.org/guidelines/">https://dashif.org/guidelines/</a> <dt id="biblio-dash-systemids">[DASH-SystemIDs] <dd><a href="https://dashif.org/identifiers/content_protection/">DASH-IF registry of DRM System IDs.</a>. URL: <a href="https://dashif.org/identifiers/content_protection/">https://dashif.org/identifiers/content_protection/</a> <dt id="biblio-rfc2119">[RFC2119] <dd>S. Bradner. <a href="https://tools.ietf.org/html/rfc2119">Key words for use in RFCs to Indicate Requirement Levels</a>. March 1997. Best Current Practice. URL: <a href="https://tools.ietf.org/html/rfc2119">https://tools.ietf.org/html/rfc2119</a> <dt id="biblio-rfc6030">[RFC6030] <dd>RFC 6030, Portable Symmetric Key Container (PSKC), October 2010.. <dt id="biblio-rfc6039">[RFC6039] <dd>V. Manral; et al. <a href="https://tools.ietf.org/html/rfc6039">Issues with Existing Cryptographic Protection Methods for Routing Protocols</a>. October 2010. Informational. URL: <a href="https://tools.ietf.org/html/rfc6039">https://tools.ietf.org/html/rfc6039</a> <dt id="biblio-xmldsig-core">[XMLDSIG-CORE] <dd>Donald Eastlake; Joseph Reagle; David Solo; et al. <a href="https://www.w3.org/TR/xmldsig-core/">XML Signature Syntax and Processing (Second Edition)</a>. 10 June 2008. REC. URL: <a href="https://www.w3.org/TR/xmldsig-core/">https://www.w3.org/TR/xmldsig-core/</a> <dt id="biblio-xmlenc-core">[XMLENC-CORE] <dd>Donald Eastlake; Joseph Reagle. <a href="https://www.w3.org/TR/xmlenc-core/">XML Encryption Syntax and Processing</a>. 10 December 2002. REC. URL: <a href="https://www.w3.org/TR/xmlenc-core/">https://www.w3.org/TR/xmlenc-core/</a> <dt id="biblio-xmlschema11-2">[XMLSCHEMA11-2] <dd>David Peterson; et al. <a href="https://www.w3.org/TR/xmlschema11-2/">W3C XML Schema Definition Language (XSD) 1.1 Part 2: Datatypes</a>. 5 April 2012. REC. URL: <a href="https://www.w3.org/TR/xmlschema11-2/">https://www.w3.org/TR/xmlschema11-2/</a> </dl> <aside class="dfn-panel" data-for="content"> <b><a href="#content">#content</a></b><b>Referenced in:</b> <ul> <li><a href="#ref-for-content">3.2. Terms &amp; Definitions</a> <a href="#ref-for-content`$">(2)</a> <a href="#ref-for-contenta$">(3)</a> <a href="#ref-for-contentb$">(4)</a> <li><a href="#ref-for-contentc$">4. Use Cases and Requirements</a> <a href="#ref-for-contentd$">(2)</a> <li><a href="#ref-for-contente$">4.2.4. Electronic Sell Through</a> <a href="#ref-for-contentf$">(2)</a> <a href="#ref-for-contentg$">(3)</a> <li><a href="#ref-for-contenth$">5.2.9. ContentKeyPeriodList Element</a> </ul> </aside> <aside class="dfn-panel" data-for="content-key"> <b><a href="#content-key">#content-key</a></b><b>Referenced in:</b> <ul> <li><a href="#ref-for-content-key">3.2. Terms &amp; Definitions</a> <a href="#ref-for-content-key`$">(2)</a> <li><a href="#ref-for-content-keya$">4. Use Cases and Requirements</a> <a href="#ref-for-content-keyb$">(2)</a> <li><a href="#ref-for-content-keyc$">4.1. Overview of the End to End Architecture</a> <a href="#ref-for-content-keyd$">(2)</a> <li><a href="#ref-for-content-keye$">4.2.1. On-Demand Content</a> <li><a href="#ref-for-content-keyf$">4.2.2. Live Content</a> <li><a href="#ref-for-content-keyg$">4.2.4. Electronic Sell Through</a> <a href="#ref-for-content-keyh$">(2)</a> <a href="#ref-for-content-key`$�$">(3)</a> <li><a href="#ref-for-content-key`$`$">4.3.1. Content Key Delivery to One Entity</a> <a href="#ref-for-content-key`$a$">(2)</a> <a href="#ref-for-content-key`$b$">(3)</a> <a href="#ref-for-content-key`$c$">(4)</a> <li><a href="#ref-for-content-key`$d$">4.3.2. Secure Content Key Delivery to Several Entities</a> <a href="#ref-for-content-key`$e$">(2)</a> <a href="#ref-for-content-key`$f$">(3)</a> <li><a href="#ref-for-content-key`$g$">4.3.3. Content Key Delivery with Usage Rules</a> <a href="#ref-for-content-key`$h$">(2)</a> <li><a href="#ref-for-content-keya$�$">4.3.3.1. Label Filter</a> <a href="#ref-for-content-keya$`$">(2)</a> <li><a href="#ref-for-content-keya$a$">4.3.3.2. Key Period Filter</a> <a href="#ref-for-content-keya$b$">(2)</a> <a href="#ref-for-content-keya$c$">(3)</a> <a href="#ref-for-content-keya$d$">(4)</a> <li><a href="#ref-for-content-keya$e$">4.3.3.3. Policy-based Filters</a> <a href="#ref-for-content-keya$f$">(2)</a> <li><a href="#ref-for-content-keya$g$">4.3.4. Content Key Delivery with DRM Signaling</a> <a href="#ref-for-content-keya$h$">(2)</a> <li><a href="#ref-for-content-keyb$�$">4.3.5. Incremental Update and Extension of the Document</a> <a href="#ref-for-content-keyb$`$">(2)</a> <a href="#ref-for-content-keyb$a$">(3)</a> <a href="#ref-for-content-keyb$b$">(4)</a> <a href="#ref-for-content-keyb$c$">(5)</a> <li><a href="#ref-for-content-keyb$d$">4.3.7. Root Key Delivery for License Server Operation</a> <li><a href="#ref-for-content-keyb$e$">4.4.1. Encryptor Producer and Encryptor Consumer</a> <a href="#ref-for-content-keyb$f$">(2)</a> <a href="#ref-for-content-keyb$g$">(3)</a> <a href="#ref-for-content-keyb$h$">(4)</a> <li><a href="#ref-for-content-keyc$�$">4.4.1.1. Encryptor Producer</a> <a href="#ref-for-content-keyc$`$">(2)</a> <a href="#ref-for-content-keyc$a$">(3)</a> <li><a href="#ref-for-content-keyc$b$">4.4.1.2. Encryptor Consumer</a> <a href="#ref-for-content-keyc$c$">(2)</a> <a href="#ref-for-content-keyc$d$">(3)</a> <li><a href="#ref-for-content-keyc$e$">4.4.1.3. Multiple Producers</a> <a href="#ref-for-content-keyc$f$">(2)</a> <a href="#ref-for-content-keyc$g$">(3)</a> <li><a href="#ref-for-content-keyc$h$">4.5. Requirements</a> <a href="#ref-for-content-keyd$�$">(2)</a> <a href="#ref-for-content-keyd$`$">(3)</a> <li><a href="#ref-for-content-keyd$a$">5. XSD Schema Definition</a> <li><a href="#ref-for-content-keyd$b$">5.1. Structure Overview</a> <a href="#ref-for-content-keyd$c$">(2)</a> <a href="#ref-for-content-keyd$d$">(3)</a> <a href="#ref-for-content-keyd$e$">(4)</a> <a href="#ref-for-content-keyd$f$">(5)</a> <a href="#ref-for-content-keyd$g$">(6)</a> <a href="#ref-for-content-keyd$h$">(7)</a> <a href="#ref-for-content-keye$�$">(8)</a> <a href="#ref-for-content-keye$`$">(9)</a> <a href="#ref-for-content-keye$a$">(10)</a> <li><a href="#ref-for-content-keye$b$">5.2.1. CPIX Element</a> <li><a href="#ref-for-content-keye$c$">5.2.2. DeliveryDataList Element</a> <a href="#ref-for-content-keye$d$">(2)</a> <a href="#ref-for-content-keye$e$">(3)</a> <li><a href="#ref-for-content-keye$f$">5.2.3. DeliveryData Element</a> <a href="#ref-for-content-keye$g$">(2)</a> <a href="#ref-for-content-keye$h$">(3)</a> <li><a href="#ref-for-content-keyf$�$">5.2.4. ContentKeyList Element</a> <li><a href="#ref-for-content-keyf$`$">5.2.5. ContentKey Element</a> <a href="#ref-for-content-keyf$a$">(2)</a> <a href="#ref-for-content-keyf$b$">(3)</a> <a href="#ref-for-content-keyf$c$">(4)</a> <a href="#ref-for-content-keyf$d$">(5)</a> <a href="#ref-for-content-keyf$e$">(6)</a> <a href="#ref-for-content-keyf$f$">(7)</a> <li><a href="#ref-for-content-keyf$g$">5.2.6. DRMSystemList Element</a> <li><a href="#ref-for-content-keyf$h$">5.2.7. DRMSystem Element</a> <a href="#ref-for-content-keyg$�$">(2)</a> <a href="#ref-for-content-keyg$`$">(3)</a> <a href="#ref-for-content-keyg$a$">(4)</a> <a href="#ref-for-content-keyg$b$">(5)</a> <li><a href="#ref-for-content-keyg$c$">5.2.9. ContentKeyPeriodList Element</a> <li><a href="#ref-for-content-keyg$d$">5.2.13.1. Introduction</a> <a href="#ref-for-content-keyg$e$">(2)</a> <a href="#ref-for-content-keyg$f$">(3)</a> <a href="#ref-for-content-keyg$g$">(4)</a> <a href="#ref-for-content-keyg$h$">(5)</a> <a href="#ref-for-content-keyh$�$">(6)</a> <li><a href="#ref-for-content-keyh$`$">5.2.13.3. LabelFilter Element</a> <a href="#ref-for-content-keyh$a$">(2)</a> <a href="#ref-for-content-keyh$b$">(3)</a> <a href="#ref-for-content-keyh$c$">(4)</a> <a href="#ref-for-content-keyh$d$">(5)</a> <a href="#ref-for-content-keyh$e$">(6)</a> <a href="#ref-for-content-keyh$f$">(7)</a> <a href="#ref-for-content-keyh$g$">(8)</a> <li><a href="#ref-for-content-keyh$h$">6.1. Key Encryption in the CPIX Document</a> <a href="#ref-for-content-key`$�$�$">(2)</a> <a href="#ref-for-content-key`$�$`$">(3)</a> <a href="#ref-for-content-key`$�$a$">(4)</a> <li><a href="#ref-for-content-key`$�$b$">6.1.1. Keys Used to Secure the CPIX Document</a> <a href="#ref-for-content-key`$�$c$">(2)</a> <a href="#ref-for-content-key`$�$d$">(3)</a> <a href="#ref-for-content-key`$�$e$">(4)</a> <a href="#ref-for-content-key`$�$f$">(5)</a> <li><a href="#ref-for-content-key`$�$g$">6.1.2. Authenticated Encryption</a> <a href="#ref-for-content-key`$�$h$">(2)</a> <a href="#ref-for-content-key`$`$�$">(3)</a> <a href="#ref-for-content-key`$`$`$">(4)</a> <a href="#ref-for-content-key`$`$a$">(5)</a> <li><a href="#ref-for-content-key`$`$b$">6.2. Key Rotation Support</a> </ul> </aside> <aside class="dfn-panel" data-for="content-protection"> <b><a href="#content-protection">#content-protection</a></b><b>Referenced in:</b> <ul> <li><a href="#ref-for-content-protection">4.1. Overview of the End to End Architecture</a> </ul> </aside> <aside class="dfn-panel" data-for="drm-signaling"> <b><a href="#drm-signaling">#drm-signaling</a></b><b>Referenced in:</b> <ul> <li><a href="#ref-for-drm-signaling">3.2. Terms &amp; Definitions</a> <li><a href="#ref-for-drm-signaling`$">4. Use Cases and Requirements</a> <li><a href="#ref-for-drm-signalinga$">4.1. Overview of the End to End Architecture</a> <a href="#ref-for-drm-signalingb$">(2)</a> <li><a href="#ref-for-drm-signalingc$">4.2.1. On-Demand Content</a> <li><a href="#ref-for-drm-signalingd$">4.3.4. Content Key Delivery with DRM Signaling</a> <li><a href="#ref-for-drm-signalinge$">4.3.5. Incremental Update and Extension of the Document</a> <a href="#ref-for-drm-signalingf$">(2)</a> <li><a href="#ref-for-drm-signalingg$">4.4.1. Encryptor Producer and Encryptor Consumer</a> <a href="#ref-for-drm-signalingh$">(2)</a> <li><a href="#ref-for-drm-signaling`$�$">4.4.1.3. Multiple Producers</a> <li><a href="#ref-for-drm-signaling`$`$">4.5. Requirements</a> <a href="#ref-for-drm-signaling`$a$">(2)</a> <li><a href="#ref-for-drm-signaling`$b$">5. XSD Schema Definition</a> <li><a href="#ref-for-drm-signaling`$c$">5.2.6. DRMSystemList Element</a> <li><a href="#ref-for-drm-signaling`$d$">6.2. Key Rotation Support</a> </ul> </aside> <aside class="dfn-panel" data-for="document-key"> <b><a href="#document-key">#document-key</a></b><b>Referenced in:</b> <ul> <li><a href="#ref-for-document-key">5.2.3. DeliveryData Element</a> <a href="#ref-for-document-key`$">(2)</a> <li><a href="#ref-for-document-keya$">6.1.1. Keys Used to Secure the CPIX Document</a> <a href="#ref-for-document-keyb$">(2)</a> <a href="#ref-for-document-keyc$">(3)</a> <a href="#ref-for-document-keyd$">(4)</a> <a href="#ref-for-document-keye$">(5)</a> <a href="#ref-for-document-keyf$">(6)</a> </ul> </aside> <aside class="dfn-panel" data-for="pssh"> <b><a href="#pssh">#pssh</a></b><b>Referenced in:</b> <ul> <li><a href="#ref-for-pssh">4.1. Overview of the End to End Architecture</a> <a href="#ref-for-pssh`$">(2)</a> <li><a href="#ref-for-pssha$">4.2.1. On-Demand Content</a> <li><a href="#ref-for-psshb$">4.4.1.3. Multiple Producers</a> <a href="#ref-for-psshc$">(2)</a> <li><a href="#ref-for-psshd$">5.2.7. DRMSystem Element</a> </ul> </aside> <aside class="dfn-panel" data-for="content-key-context"> <b><a href="#content-key-context">#content-key-context</a></b><b>Referenced in:</b> <ul> <li><a href="#ref-for-content-key-context">4.3.3. Content Key Delivery with Usage Rules</a> <a href="#ref-for-content-key-context`$">(2)</a> <li><a href="#ref-for-content-key-contexta$">4.3.3.1. Label Filter</a> <a href="#ref-for-content-key-contextb$">(2)</a> <li><a href="#ref-for-content-key-contextc$">4.3.3.3. Policy-based Filters</a> <a href="#ref-for-content-key-contextd$">(2)</a> <a href="#ref-for-content-key-contexte$">(3)</a> <a href="#ref-for-content-key-contextf$">(4)</a> <li><a href="#ref-for-content-key-contextg$">5.1. Structure Overview</a> <li><a href="#ref-for-content-key-contexth$">5.2.1. CPIX Element</a> <li><a href="#ref-for-content-key-context`$�$">5.2.4. ContentKeyList Element</a> <li><a href="#ref-for-content-key-context`$`$">5.2.11. ContentKeyUsageRuleList Element</a> <li><a href="#ref-for-content-key-context`$a$">5.2.12. ContentKeyUsageRule Element</a> <a href="#ref-for-content-key-context`$b$">(2)</a> <a href="#ref-for-content-key-context`$c$">(3)</a> <a href="#ref-for-content-key-context`$d$">(4)</a> <a href="#ref-for-content-key-context`$e$">(5)</a> <li><a href="#ref-for-content-key-context`$f$">5.2.13.1. Introduction</a> <a href="#ref-for-content-key-context`$g$">(2)</a> <a href="#ref-for-content-key-context`$h$">(3)</a> <a href="#ref-for-content-key-contexta$�$">(4)</a> </ul> </aside> <aside class="dfn-panel" data-for="elementdef-deliverydatalist"> <b><a href="#elementdef-deliverydatalist">#elementdef-deliverydatalist</a></b><b>Referenced in:</b> <ul> <li><a href="#ref-for-elementdef-deliverydatalist">5.2.1. CPIX Element</a> </ul> </aside> <aside class="dfn-panel" data-for="elementdef-deliverydata"> <b><a href="#elementdef-deliverydata">#elementdef-deliverydata</a></b><b>Referenced in:</b> <ul> <li><a href="#ref-for-elementdef-deliverydata">5.2.1. CPIX Element</a> <li><a href="#ref-for-elementdef-deliverydata`$">5.2.2. DeliveryDataList Element</a> <a href="#ref-for-elementdef-deliverydataa$">(2)</a> <li><a href="#ref-for-elementdef-deliverydatab$">5.2.5. ContentKey Element</a> <li><a href="#ref-for-elementdef-deliverydatac$">6.1.1. Keys Used to Secure the CPIX Document</a> <a href="#ref-for-elementdef-deliverydatad$">(2)</a> <a href="#ref-for-elementdef-deliverydatae$">(3)</a> <a href="#ref-for-elementdef-deliverydataf$">(4)</a> <li><a href="#ref-for-elementdef-deliverydatag$">6.1.2. Authenticated Encryption</a> </ul> </aside> <aside class="dfn-panel" data-for="element-attrdef-deliverydata-documentkey"> <b><a href="#element-attrdef-deliverydata-documentkey">#element-attrdef-deliverydata-documentkey</a></b><b>Referenced in:</b> <ul> <li><a href="#ref-for-element-attrdef-deliverydata-documentkey">5.2.5. ContentKey Element</a> </ul> </aside> <aside class="dfn-panel" data-for="elementdef-contentkeylist"> <b><a href="#elementdef-contentkeylist">#elementdef-contentkeylist</a></b><b>Referenced in:</b> <ul> <li><a href="#ref-for-elementdef-contentkeylist">5.2.1. CPIX Element</a> </ul> </aside> <aside class="dfn-panel" data-for="elementdef-contentkey"> <b><a href="#elementdef-contentkey">#elementdef-contentkey</a></b><b>Referenced in:</b> <ul> <li><a href="#ref-for-elementdef-contentkey">5.2.1. CPIX Element</a> <li><a href="#ref-for-elementdef-contentkey`$">5.2.3. DeliveryData Element</a> <li><a href="#ref-for-elementdef-contentkeya$">5.2.4. ContentKeyList Element</a> <li><a href="#ref-for-elementdef-contentkeyb$">5.2.5. ContentKey Element</a> <li><a href="#ref-for-elementdef-contentkeyc$">5.2.7. DRMSystem Element</a> <li><a href="#ref-for-elementdef-contentkeyd$">5.2.12. ContentKeyUsageRule Element</a> <li><a href="#ref-for-elementdef-contentkeye$">6.1.1. Keys Used to Secure the CPIX Document</a> <a href="#ref-for-elementdef-contentkeyf$">(2)</a> <li><a href="#ref-for-elementdef-contentkeyg$">6.2. Key Rotation Support</a> <a href="#ref-for-elementdef-contentkeyh$">(2)</a> <li><a href="#ref-for-elementdef-contentkey`$�$">6.3. Hierarchical Keys</a> </ul> </aside> <aside class="dfn-panel" data-for="element-attrdef-contentkey-kid"> <b><a href="#element-attrdef-contentkey-kid">#element-attrdef-contentkey-kid</a></b><b>Referenced in:</b> <ul> <li><a href="#ref-for-element-attrdef-contentkey-kid">5.2.5. ContentKey Element</a> <li><a href="#ref-for-element-attrdef-contentkey-kid`$">5.2.7. DRMSystem Element</a> <li><a href="#ref-for-element-attrdef-contentkey-kida$">5.2.12. ContentKeyUsageRule Element</a> <li><a href="#ref-for-element-attrdef-contentkey-kidb$">5.2.13.3. LabelFilter Element</a> </ul> </aside> <aside class="dfn-panel" data-for="element-attrdef-contentkey-dependsonkey"> <b><a href="#element-attrdef-contentkey-dependsonkey">#element-attrdef-contentkey-dependsonkey</a></b><b>Referenced in:</b> <ul> <li><a href="#ref-for-element-attrdef-contentkey-dependsonkey">6.3. Hierarchical Keys</a> </ul> </aside> <aside class="dfn-panel" data-for="elementdef-drmsystemlist"> <b><a href="#elementdef-drmsystemlist">#elementdef-drmsystemlist</a></b><b>Referenced in:</b> <ul> <li><a href="#ref-for-elementdef-drmsystemlist">5.2.1. CPIX Element</a> </ul> </aside> <aside class="dfn-panel" data-for="elementdef-drmsystem"> <b><a href="#elementdef-drmsystem">#elementdef-drmsystem</a></b><b>Referenced in:</b> <ul> <li><a href="#ref-for-elementdef-drmsystem">5.2.1. CPIX Element</a> <li><a href="#ref-for-elementdef-drmsystem`$">5.2.6. DRMSystemList Element</a> <li><a href="#ref-for-elementdef-drmsystema$">5.2.7. DRMSystem Element</a> <li><a href="#ref-for-elementdef-drmsystemb$">5.2.8. HLSSignalingData Element</a> <a href="#ref-for-elementdef-drmsystemc$">(2)</a> <a href="#ref-for-elementdef-drmsystemd$">(3)</a> </ul> </aside> <aside class="dfn-panel" data-for="element-attrdef-drmsystem-contentprotectiondata"> <b><a href="#element-attrdef-drmsystem-contentprotectiondata">#element-attrdef-drmsystem-contentprotectiondata</a></b><b>Referenced in:</b> <ul> <li><a href="#ref-for-element-attrdef-drmsystem-contentprotectiondata">5.2.7. DRMSystem Element</a> </ul> </aside> <aside class="dfn-panel" data-for="element-attrdef-drmsystem-hlssignalingdata"> <b><a href="#element-attrdef-drmsystem-hlssignalingdata">#element-attrdef-drmsystem-hlssignalingdata</a></b><b>Referenced in:</b> <ul> <li><a href="#ref-for-element-attrdef-drmsystem-hlssignalingdata">5.2.7. DRMSystem Element</a> </ul> </aside> <aside class="dfn-panel" data-for="elementdef-hlssignalingdata"> <b><a href="#elementdef-hlssignalingdata">#elementdef-hlssignalingdata</a></b><b>Referenced in:</b> <ul> <li><a href="#ref-for-elementdef-hlssignalingdata">5.2.7. DRMSystem Element</a> <li><a href="#ref-for-elementdef-hlssignalingdata`$">5.2.8. HLSSignalingData Element</a> </ul> </aside> <aside class="dfn-panel" data-for="element-attrdef-hlssignalingdata-playlist"> <b><a href="#element-attrdef-hlssignalingdata-playlist">#element-attrdef-hlssignalingdata-playlist</a></b><b>Referenced in:</b> <ul> <li><a href="#ref-for-element-attrdef-hlssignalingdata-playlist">5.2.8. HLSSignalingData Element</a> <a href="#ref-for-element-attrdef-hlssignalingdata-playlist`$">(2)</a> <a href="#ref-for-element-attrdef-hlssignalingdata-playlista$">(3)</a> </ul> </aside> <aside class="dfn-panel" data-for="elementdef-contentkeyperiodlist"> <b><a href="#elementdef-contentkeyperiodlist">#elementdef-contentkeyperiodlist</a></b><b>Referenced in:</b> <ul> <li><a href="#ref-for-elementdef-contentkeyperiodlist">5.2.1. CPIX Element</a> </ul> </aside> <aside class="dfn-panel" data-for="elementdef-contentkeyperiod"> <b><a href="#elementdef-contentkeyperiod">#elementdef-contentkeyperiod</a></b><b>Referenced in:</b> <ul> <li><a href="#ref-for-elementdef-contentkeyperiod">5.2.1. CPIX Element</a> <li><a href="#ref-for-elementdef-contentkeyperiod`$">5.2.9. ContentKeyPeriodList Element</a> <li><a href="#ref-for-elementdef-contentkeyperioda$">5.2.13.2. KeyPeriodFilter Element</a> <li><a href="#ref-for-elementdef-contentkeyperiodb$">6.2. Key Rotation Support</a> </ul> </aside> <aside class="dfn-panel" data-for="element-attrdef-contentkeyperiod-id"> <b><a href="#element-attrdef-contentkeyperiod-id">#element-attrdef-contentkeyperiod-id</a></b><b>Referenced in:</b> <ul> <li><a href="#ref-for-element-attrdef-contentkeyperiod-id">5.2.13.2. KeyPeriodFilter Element</a> </ul> </aside> <aside class="dfn-panel" data-for="element-attrdef-contentkeyperiod-index"> <b><a href="#element-attrdef-contentkeyperiod-index">#element-attrdef-contentkeyperiod-index</a></b><b>Referenced in:</b> <ul> <li><a href="#ref-for-element-attrdef-contentkeyperiod-index">5.2.10. ContentKeyPeriod Element</a> <a href="#ref-for-element-attrdef-contentkeyperiod-index`$">(2)</a> <a href="#ref-for-element-attrdef-contentkeyperiod-indexa$">(3)</a> <li><a href="#ref-for-element-attrdef-contentkeyperiod-indexb$">6.2. Key Rotation Support</a> </ul> </aside> <aside class="dfn-panel" data-for="element-attrdef-contentkeyperiod-start"> <b><a href="#element-attrdef-contentkeyperiod-start">#element-attrdef-contentkeyperiod-start</a></b><b>Referenced in:</b> <ul> <li><a href="#ref-for-element-attrdef-contentkeyperiod-start">5.2.10. ContentKeyPeriod Element</a> <a href="#ref-for-element-attrdef-contentkeyperiod-start`$">(2)</a> <a href="#ref-for-element-attrdef-contentkeyperiod-starta$">(3)</a> <a href="#ref-for-element-attrdef-contentkeyperiod-startb$">(4)</a> <li><a href="#ref-for-element-attrdef-contentkeyperiod-startc$">6.2. Key Rotation Support</a> </ul> </aside> <aside class="dfn-panel" data-for="element-attrdef-contentkeyperiod-end"> <b><a href="#element-attrdef-contentkeyperiod-end">#element-attrdef-contentkeyperiod-end</a></b><b>Referenced in:</b> <ul> <li><a href="#ref-for-element-attrdef-contentkeyperiod-end">5.2.10. ContentKeyPeriod Element</a> <a href="#ref-for-element-attrdef-contentkeyperiod-end`$">(2)</a> <a href="#ref-for-element-attrdef-contentkeyperiod-enda$">(3)</a> <a href="#ref-for-element-attrdef-contentkeyperiod-endb$">(4)</a> <li><a href="#ref-for-element-attrdef-contentkeyperiod-endc$">6.2. Key Rotation Support</a> </ul> </aside> <aside class="dfn-panel" data-for="elementdef-contentkeyusagerulelist"> <b><a href="#elementdef-contentkeyusagerulelist">#elementdef-contentkeyusagerulelist</a></b><b>Referenced in:</b> <ul> <li><a href="#ref-for-elementdef-contentkeyusagerulelist">5.2.1. CPIX Element</a> </ul> </aside> <aside class="dfn-panel" data-for="elementdef-contentkeyusagerule"> <b><a href="#elementdef-contentkeyusagerule">#elementdef-contentkeyusagerule</a></b><b>Referenced in:</b> <ul> <li><a href="#ref-for-elementdef-contentkeyusagerule">5.2.1. CPIX Element</a> <li><a href="#ref-for-elementdef-contentkeyusagerule`$">5.2.11. ContentKeyUsageRuleList Element</a> <li><a href="#ref-for-elementdef-contentkeyusagerulea$">5.2.12. ContentKeyUsageRule Element</a> <li><a href="#ref-for-elementdef-contentkeyusageruleb$">5.2.13.1. Introduction</a> <a href="#ref-for-elementdef-contentkeyusagerulec$">(2)</a> <a href="#ref-for-elementdef-contentkeyusageruled$">(3)</a> <a href="#ref-for-elementdef-contentkeyusagerulee$">(4)</a> <a href="#ref-for-elementdef-contentkeyusagerulef$">(5)</a> <li><a href="#ref-for-elementdef-contentkeyusageruleg$">5.2.13.3. LabelFilter Element</a> <a href="#ref-for-elementdef-contentkeyusageruleh$">(2)</a> <a href="#ref-for-elementdef-contentkeyusagerule`$�$">(3)</a> <a href="#ref-for-elementdef-contentkeyusagerule`$`$">(4)</a> <li><a href="#ref-for-elementdef-contentkeyusagerule`$a$">6.3. Hierarchical Keys</a> </ul> </aside> <aside class="dfn-panel" data-for="element-attrdef-contentkeyusagerule-intendedtracktype"> <b><a href="#element-attrdef-contentkeyusagerule-intendedtracktype">#element-attrdef-contentkeyusagerule-intendedtracktype</a></b><b>Referenced in:</b> <ul> <li><a href="#ref-for-element-attrdef-contentkeyusagerule-intendedtracktype">5.2.13.3. LabelFilter Element</a> <a href="#ref-for-element-attrdef-contentkeyusagerule-intendedtracktype`$">(2)</a> </ul> </aside> <aside class="dfn-panel" data-for="elementdef-keyperiodfilter"> <b><a href="#elementdef-keyperiodfilter">#elementdef-keyperiodfilter</a></b><b>Referenced in:</b> <ul> <li><a href="#ref-for-elementdef-keyperiodfilter">5.2.12. ContentKeyUsageRule Element</a> <li><a href="#ref-for-elementdef-keyperiodfilter`$">5.2.13.1. Introduction</a> </ul> </aside> <aside class="dfn-panel" data-for="elementdef-labelfilter"> <b><a href="#elementdef-labelfilter">#elementdef-labelfilter</a></b><b>Referenced in:</b> <ul> <li><a href="#ref-for-elementdef-labelfilter">5.2.12. ContentKeyUsageRule Element</a> </ul> </aside> <aside class="dfn-panel" data-for="element-attrdef-labelfilter-label"> <b><a href="#element-attrdef-labelfilter-label">#element-attrdef-labelfilter-label</a></b><b>Referenced in:</b> <ul> <li><a href="#ref-for-element-attrdef-labelfilter-label">5.2.13.3. LabelFilter Element</a> </ul> </aside> <aside class="dfn-panel" data-for="elementdef-videofilter"> <b><a href="#elementdef-videofilter">#elementdef-videofilter</a></b><b>Referenced in:</b> <ul> <li><a href="#ref-for-elementdef-videofilter">5.2.12. ContentKeyUsageRule Element</a> </ul> </aside> <aside class="dfn-panel" data-for="element-attrdef-videofilter-minpixels"> <b><a href="#element-attrdef-videofilter-minpixels">#element-attrdef-videofilter-minpixels</a></b><b>Referenced in:</b> <ul> <li><a href="#ref-for-element-attrdef-videofilter-minpixels">5.2.13.1. Introduction</a> <li><a href="#ref-for-element-attrdef-videofilter-minpixels`$">5.2.13.4. VideoFilter Element</a> <a href="#ref-for-element-attrdef-videofilter-minpixelsa$">(2)</a> <a href="#ref-for-element-attrdef-videofilter-minpixelsb$">(3)</a> </ul> </aside> <aside class="dfn-panel" data-for="element-attrdef-videofilter-maxpixels"> <b><a href="#element-attrdef-videofilter-maxpixels">#element-attrdef-videofilter-maxpixels</a></b><b>Referenced in:</b> <ul> <li><a href="#ref-for-element-attrdef-videofilter-maxpixels">5.2.13.4. VideoFilter Element</a> <a href="#ref-for-element-attrdef-videofilter-maxpixels`$">(2)</a> <a href="#ref-for-element-attrdef-videofilter-maxpixelsa$">(3)</a> </ul> </aside> <aside class="dfn-panel" data-for="element-attrdef-videofilter-minfps"> <b><a href="#element-attrdef-videofilter-minfps">#element-attrdef-videofilter-minfps</a></b><b>Referenced in:</b> <ul> <li><a href="#ref-for-element-attrdef-videofilter-minfps">5.2.13.4. VideoFilter Element</a> <a href="#ref-for-element-attrdef-videofilter-minfps`$">(2)</a> <a href="#ref-for-element-attrdef-videofilter-minfpsa$">(3)</a> </ul> </aside> <aside class="dfn-panel" data-for="element-attrdef-videofilter-maxfps"> <b><a href="#element-attrdef-videofilter-maxfps">#element-attrdef-videofilter-maxfps</a></b><b>Referenced in:</b> <ul> <li><a href="#ref-for-element-attrdef-videofilter-maxfps">5.2.13.4. VideoFilter Element</a> <a href="#ref-for-element-attrdef-videofilter-maxfps`$">(2)</a> <a href="#ref-for-element-attrdef-videofilter-maxfpsa$">(3)</a> </ul> </aside> <aside class="dfn-panel" data-for="elementdef-audiofilter"> <b><a href="#elementdef-audiofilter">#elementdef-audiofilter</a></b><b>Referenced in:</b> <ul> <li><a href="#ref-for-elementdef-audiofilter">5.2.12. ContentKeyUsageRule Element</a> </ul> </aside> <aside class="dfn-panel" data-for="element-attrdef-audiofilter-minchannels"> <b><a href="#element-attrdef-audiofilter-minchannels">#element-attrdef-audiofilter-minchannels</a></b><b>Referenced in:</b> <ul> <li><a href="#ref-for-element-attrdef-audiofilter-minchannels">5.2.13.5. AudioFilter Element</a> <a href="#ref-for-element-attrdef-audiofilter-minchannels`$">(2)</a> <a href="#ref-for-element-attrdef-audiofilter-minchannelsa$">(3)</a> </ul> </aside> <aside class="dfn-panel" data-for="element-attrdef-audiofilter-maxchannels"> <b><a href="#element-attrdef-audiofilter-maxchannels">#element-attrdef-audiofilter-maxchannels</a></b><b>Referenced in:</b> <ul> <li><a href="#ref-for-element-attrdef-audiofilter-maxchannels">5.2.13.5. AudioFilter Element</a> <a href="#ref-for-element-attrdef-audiofilter-maxchannels`$">(2)</a> <a href="#ref-for-element-attrdef-audiofilter-maxchannelsa$">(3)</a> </ul> </aside> <aside class="dfn-panel" data-for="elementdef-bitratefilter"> <b><a href="#elementdef-bitratefilter">#elementdef-bitratefilter</a></b><b>Referenced in:</b> <ul> <li><a href="#ref-for-elementdef-bitratefilter">5.2.12. ContentKeyUsageRule Element</a> </ul> </aside> <aside class="dfn-panel" data-for="element-attrdef-bitratefilter-minbitrate"> <b><a href="#element-attrdef-bitratefilter-minbitrate">#element-attrdef-bitratefilter-minbitrate</a></b><b>Referenced in:</b> <ul> <li><a href="#ref-for-element-attrdef-bitratefilter-minbitrate">5.2.13.6. BitrateFilter Element</a> <a href="#ref-for-element-attrdef-bitratefilter-minbitrate`$">(2)</a> <a href="#ref-for-element-attrdef-bitratefilter-minbitratea$">(3)</a> <a href="#ref-for-element-attrdef-bitratefilter-minbitrateb$">(4)</a> <a href="#ref-for-element-attrdef-bitratefilter-minbitratec$">(5)</a> </ul> </aside> <aside class="dfn-panel" data-for="element-attrdef-bitratefilter-maxbitrate"> <b><a href="#element-attrdef-bitratefilter-maxbitrate">#element-attrdef-bitratefilter-maxbitrate</a></b><b>Referenced in:</b> <ul> <li><a href="#ref-for-element-attrdef-bitratefilter-maxbitrate">5.2.13.6. BitrateFilter Element</a> <a href="#ref-for-element-attrdef-bitratefilter-maxbitrate`$">(2)</a> <a href="#ref-for-element-attrdef-bitratefilter-maxbitratea$">(3)</a> <a href="#ref-for-element-attrdef-bitratefilter-maxbitrateb$">(4)</a> <a href="#ref-for-element-attrdef-bitratefilter-maxbitratec$">(5)</a> </ul> </aside> <aside class="dfn-panel" data-for="elementdef-updatehistoryitemlist"> <b><a href="#elementdef-updatehistoryitemlist">#elementdef-updatehistoryitemlist</a></b><b>Referenced in:</b> <ul> <li><a href="#ref-for-elementdef-updatehistoryitemlist">5.2.1. CPIX Element</a> </ul> </aside> <aside class="dfn-panel" data-for="elementdef-updatehistoryitem"> <b><a href="#elementdef-updatehistoryitem">#elementdef-updatehistoryitem</a></b><b>Referenced in:</b> <ul> <li><a href="#ref-for-elementdef-updatehistoryitem">5.2.1. CPIX Element</a> <li><a href="#ref-for-elementdef-updatehistoryitem`$">5.2.2. DeliveryDataList Element</a> <li><a href="#ref-for-elementdef-updatehistoryitema$">5.2.3. DeliveryData Element</a> <li><a href="#ref-for-elementdef-updatehistoryitemb$">5.2.4. ContentKeyList Element</a> <li><a href="#ref-for-elementdef-updatehistoryitemc$">5.2.6. DRMSystemList Element</a> <li><a href="#ref-for-elementdef-updatehistoryitemd$">5.2.7. DRMSystem Element</a> <li><a href="#ref-for-elementdef-updatehistoryiteme$">5.2.9. ContentKeyPeriodList Element</a> <li><a href="#ref-for-elementdef-updatehistoryitemf$">5.2.11. ContentKeyUsageRuleList Element</a> <li><a href="#ref-for-elementdef-updatehistoryitemg$">5.2.14. UpdateHistoryItemList Element</a> <li><a href="#ref-for-elementdef-updatehistoryitemh$">5.2.15. UpdateHistoryItem Element</a> </ul> </aside> <aside class="dfn-panel" data-for="element-attrdef-updatehistoryitem-updateversion"> <b><a href="#element-attrdef-updatehistoryitem-updateversion">#element-attrdef-updatehistoryitem-updateversion</a></b><b>Referenced in:</b> <ul> <li><a href="#ref-for-element-attrdef-updatehistoryitem-updateversion">5.1. Structure Overview</a> <li><a href="#ref-for-element-attrdef-updatehistoryitem-updateversion`$">5.2.2. DeliveryDataList Element</a> <li><a href="#ref-for-element-attrdef-updatehistoryitem-updateversiona$">5.2.3. DeliveryData Element</a> <li><a href="#ref-for-element-attrdef-updatehistoryitem-updateversionb$">5.2.4. ContentKeyList Element</a> <li><a href="#ref-for-element-attrdef-updatehistoryitem-updateversionc$">5.2.6. DRMSystemList Element</a> <li><a href="#ref-for-element-attrdef-updatehistoryitem-updateversiond$">5.2.7. DRMSystem Element</a> <li><a href="#ref-for-element-attrdef-updatehistoryitem-updateversione$">5.2.9. ContentKeyPeriodList Element</a> <li><a href="#ref-for-element-attrdef-updatehistoryitem-updateversionf$">5.2.11. ContentKeyUsageRuleList Element</a> </ul> </aside> <script>/* script-dfn-panel */ document.body.addEventListener("click", function(e) { var queryAll = function(sel) { return [].slice.call(document.querySelectorAll(sel)); } // Find the dfn element or panel, if any, that was clicked on. var el = e.target; var target; var hitALink = false; while(el.parentElement) { if(el.tagName == "A") { // Clicking on a link in a <dfn> shouldn't summon the panel hitALink = true; } if(el.classList.contains("dfn-paneled")) { target = "dfn"; break; } if(el.classList.contains("dfn-panel")) { target = "dfn-panel"; break; } el = el.parentElement; } if(target != "dfn-panel") { // Turn off any currently "on" or "activated" panels. queryAll(".dfn-panel.on, .dfn-panel.activated").forEach(function(el){ el.classList.remove("on"); el.classList.remove("activated"); }); } if(target == "dfn" && !hitALink) { // open the panel var dfnPanel = document.querySelector(".dfn-panel[data-for='" + el.id + "']"); if(dfnPanel) { dfnPanel.classList.add("on"); var rect = el.getBoundingClientRect(); dfnPanel.style.left = window.scrollX + rect.right + 5 + "px"; dfnPanel.style.top = window.scrollY + rect.top + "px"; var panelRect = dfnPanel.getBoundingClientRect(); var panelWidth = panelRect.right - panelRect.left; if(panelRect.right > document.body.scrollWidth && (rect.left - (panelWidth + 5)) > 0) { // Reposition, because the panel is overflowing dfnPanel.style.left = window.scrollX + rect.left - (panelWidth + 5) + "px"; } } else { console.log("Couldn't find .dfn-panel[data-for='" + el.id + "']"); } } else if(target == "dfn-panel") { // Switch it to "activated" state, which pins it. el.classList.add("activated"); el.style.left = null; el.style.top = null; } }); </script>