

本文属于机器翻译版本。若本译文内容与英语原文存在差异，则一律以英文原文为准。

# SPEKE API v2
<a name="the-speke-api-v2"></a>

这是用于安全打包器和编码器密钥交换 (SPEKE) v2 的 REST API。使用此规范为使用加密的客户提供 DRM 版权保护。为了符合 SPEKE，您的 DRM 密钥提供程序必须公开本规范中描述的 REST API。加密程序对您的密钥提供程序进行 API 调用。

**注意**  
本规范中的代码示例仅用于说明目的。您无法运行这些示例，因为它们不是完整的 SPEKE 实现的一部分。

SPEKE 使用 DASH 行业论坛内容保护信息交换格式 (DASH-IF-CPIX) 数据结构定义进行密钥交换，但有一些限制。 DASH-IF-CPIX定义了一个架构，以提供从 DRM 平台到加密器的可扩展的多 DRM 交换。这使得在内容压缩和打包时允许对所有自适应比特率打包格式进行内容加密。自适应比特率打包格式包括 HLS、DASH 和 MSS。

从其 2.0 版本开始，SPEKE 与特定的 CPIX 版本保持一致：

在 SPEKE 方面，通过使用 `X-Speke-Version` HTTP 标头强制执行一致性；在 CPIX 方面，则通过使用 `CPIX@version` 属性来强制执行一致性。请求中缺少这些元素是 SPEKE v1 传统工作流的典型特征。在 SPEKE v2 工作流中，只有当密钥提供程序同时支持两个版本参数时，它才应处理 CPIX 文档。

有关交换格式的详细信息，请参阅 DASH 行业论坛 [CPIX 2.3 规范](https://dashif.org/docs/CPIX2.3/Cpix.html)。

总体而言，与 SPEKE v1.0 相比，SPEKE v2.0 带来了以下演变：
+ SPEKE XML 命名空间中的所有标签已弃用，改为使用 CPIX XML 命名空间中的等效标签
+  `SPEKE:ProtectionHeader` 已弃用并替换为 `CPIX:DRMSystem.SmoothStreamingProtectionHeaderData` 
+  `CPIX:URIExtXKey`、`SPEKE:KeyFormat` 和 `SPEKE:KeyFormatVersions` 已弃用并替换为 `CPIX:DRMSystem.HLSSignalingData` 
+  `CPIX@id` 替换为 `CPIX@contentId` 
+ 新的强制性 CPIX 属性：`CPIX@version`、`ContentKey@commonEncryptionScheme`
+ 新的可选 CPIX 元素：`DRMSystem.ContentProtectionData`
+ 支持多个内容密钥
+ SPEKE 和 CPIX 之间的跨版本控制机制
+ HTTP 标头的演变：新的 `X-Speke-Version` 标头，`Speke-User-Agent` 标头重命名为 `X-Speke-User-Agent` 
+ 检测信号 API 已弃用

由于 SPEKE v1.0 规范保持不变，因此现有实施无需更改即可继续支持 SPEKE v1.0 工作流。

**Topics**
+ [SPEKE API v2 - 有关 DASH-IF 规范的自定义项和约束](speke-constraints-v2.md)
+ [SPEKE API v2 - 标准负载组件](standard-payload-components-v2.md)
+ [SPEKE API v2 - 加密合约](encryption-contract-v2.md)
+ [SPEKE API v2 - 实时工作流方法调用示例](live-workflow-methods-v2.md)
+ [SPEKE API v2 - VOD 工作流方法调用示例](vod-workflow-method-v2.md)
+ [SPEKE API v2 - 内容密钥加密](content-key-encryption-v2.md)
+ [SPEKE API v2 - 覆盖密钥标识符](kid-override-v2.md)

# SPEKE API v2 - 有关 DASH-IF 规范的自定义项和约束
<a name="speke-constraints-v2"></a>

DASH 行业论坛 [CPIX 2.3 规范](https://dashif.org/docs/CPIX2.3/Cpix.html)支持大量使用案例和拓扑。SPEKE API v2.0 规范定义了 CPIX 配置文件和 CPIX 的 API。为了实现这两个目标，它遵循 CPIX 规范，并具有以下自定义项和约束：

**CPIX 配置文件**
+ SPEKE 遵循 Encryptor Consumer 工作流。
+ 对于加密的内容密钥，SPEKE 应用以下限制：
  + SPEKE 不支持请求或响应负载的数字签名验证（XMLDSIG）。
  + SPEKE 需要基于 2048 位 RSA 的证书。
+ SPEKE 仅利用 CPIX 功能的子集：
  + SPEKE 会忽略 `UpdateHistoryItemList` 功能。如果响应中包含该列表，则 SPEKE 会将其忽略。
  + SPEKE 省略了 root/leaf 关键功能。如果响应中包含 `ContentKey@dependsOnKey` 属性，则 SPEKE 会将其忽略。
  + SPEKE 会忽略 `BitrateFilter` 元素和 `VideoFilter@wcg` 属性。如果这些元素或属性存在于 CPIX 负载中，SPEKE 会将其忽略。
+ 在与 SPEKE v2 交换的 CPIX 文档中，只能使用[标准负载组件页面](standard-payload-components-v2.md)或[加密合同页面](encryption-contract-v2.md)上提及“支持”的元素或属性。
+ 由加密程序包含在 CPIX 请求中时，所有元素和属性都应在密钥提供程序 CPIX 响应中带有有效值。否则，加密程序应停止并引发错误。
+ SPEKE 支持使用 `KeyPeriodFilter` 元素进行密钥轮换。SPEKE 仅使用 `ContentKeyPeriod@index` 来跟踪密钥周期。
+ 对于 HLS 信令，必须使用多个 `DRMSystem.HLSSignalingData` 元素：一个元素的 `DRMSystem.HLSSignalingData@playlist` 属性值为“media”，另一个元素的 `DRMSystem.HLSSignalingData@playlist` 属性值为“master”。
+ 当请求密钥时，加密程序可能会在 `ContentKey` 元素上使用可选的 `@explicitIV` 属性。密钥提供程序可以使用 `@explicitIV` 来响应 IV，即使该属性未包含在请求中。
+ 加密程序创建密钥标识符 (`KID`)，这对于任何给定的内容 ID 和密钥周期保持不变。密钥提供程序在其对请求文档的响应中包含 `KID`。
+ 加密程序应包含 `CPIX@contentId` 属性的值。当收到此属性的空值时，密钥提供程序应返回一条错误，相应描述为“缺少 CPIX@contentId”。`CPIX@contentId` 值不能被密钥提供程序覆盖。

   `CPIX@id` 值（如果不为空）应被密钥提供程序忽略。
+ 加密程序应包含 `CPIX@version` 属性的值。当收到此属性的空值时，密钥提供程序应返回一条错误，相应描述为“缺少 CPIX@version”。收到带有不支持版本的请求时，密钥提供程序返回的错误描述应为“不支持的 CPIX@version”。

   `CPIX@version` 值不能被密钥提供程序覆盖。
+ 加密程序应包括每个所请求密钥的 `ContentKey@commonEncryptionScheme` 属性值。当收到此属性的空值时，密钥提供者应返回一条错误消息，描述为 “缺少 ContentKey @ commonEncryptionScheme for KID`id`”。

  唯一的 CPIX 文档不能混合不同 `ContentKey@commonEncryptionScheme` 属性的多个值。收到此类组合时，密钥提供者应返回错误信息，并说明为 “不合规 ContentKey @ commonEncryptionScheme 组合”。

  并非所有 `ContentKey@commonEncryptionScheme` 值都与所有 DRM 技术兼容。当收到这样的组合时，密钥提供者应返回一个错误，描述为 “ContentKey@ commonEncryptionScheme 不兼容 DRMSystem `id`”。

   `ContentKey@commonEncryptionScheme` 值不能被密钥提供程序覆盖。
+ 在 CPIX 响应正文中接收到 `DRMSystem@PSSH` 和 `DRMSystem.ContentProtectionData` innerXML `<pssh>` 元素的不通知时，加密程序应停止并引发错误。

**CPIX 的 API**
+ 密钥提供程序应包含 `X-Speke-User-Agent` HTTP 响应标头的值。
+ 符合 SPEKE 的加密程序充当客户端并向密钥提供程序端点发送 POST 操作。
+ 加密器应包含 `X-Speke-Version` HTTP 请求标头的值，请求中使用的 SPEKE 版本，表述为。 MajorVersion MinorVersion，比如 SPEKE v2.0 的 “2.0”。如果密钥提供程序不支持加密程序在当前请求中使用的 SPEKE 版本，则密钥提供程序将返回错误，相应描述为“不支持的 SPEKE 版本”，并且不会尝试尽力处理 CPIX 文档。

  密钥提供程序无法在响应请求时修改加密程序定义的 `X-Speke-Version` 标头值。
+ 在响应正文中收到错误时，加密程序应引发错误，并且不会使用 SPEKE v1.0 版本控制重试请求。

  如果密钥提供程序没有返回错误，但未能返回包含强制信息的 CPIX 文档，则加密程序应停止并引发错误。

下表汇总了消息正文中密钥提供程序必须返回的标准消息。错误情况下的 HTTP 响应代码应为 4XX 或 5XX，绝不会是 200。422 错误代码可用于所有与 SPEKE/CPIX 相关的错误。


| 错误案例 | 错误消息 | 
| --- | --- | 
|  CPIX@contentId 未定义  |  缺少 CPIX@contentId  | 
|  CPIX@version 未定义  |  缺少 CPIX@version  | 
|  不支持 CPIX@version  |  不支持的 CPIX@version  | 
|  ContentKey@ commonEncryptionScheme 未定义  |  KID 缺少 ContentKey @ commonEncryptionScheme `id`（其中`id`等于 ContentKey @kid 值）  | 
|  在单个 CPIX 文档中使用多个 ContentKey @ commonEncryptionScheme 值  |  不合规 ContentKey @ commonEncryptionScheme 组合  | 
|  ContentKey@ commonEncryptionScheme 与 DRM 技术不兼容  |  ContentKey@ commonEncryptionScheme 不兼容 DRMSystem `id`（其中`id`等于 DRMSystem @systemId 值）  | 
|  X-Speke-Version 标头值不是支持的 SPEKE 版本  |  不支持的 SPEKE 版本  | 
|  加密合约格式不正确  |  格式不正确的加密合约  | 
|  加密合约与 DRM 安全级别约束相矛盾  |  不支持请求的 CPIX 加密合约  | 
|  加密合同不包含任何 VideoFilter 或 AudioFilter 元素  |  缺少 CPIX 加密合约  | 

# SPEKE API v2 - 标准负载组件
<a name="standard-payload-components-v2"></a>

根据为给定内容定义的加密合约，通过单个 SPEKE 请求，加密程序可以请求多个内容密钥，以及针对多种打包格式的必要清单信令。

为了涵盖所有这些方面，标准的 CPIX 文档由三个强制列表部分组成，外加一个用于实时内容密钥轮换的可选列表部分。

**<cpix:CPIX><cpix: ContentKeyList > 分区和顶级元素**  
这是一个强制部分，与实时和 VOD 流式处理有关，其中定义加密程序需要使用的不同内容密钥。`<cpix:ContentKeyList>` 元素可以包含一个或多个 `<cpix:ContentKey>` 子元素，每个子元素都描述一个不同的内容密钥。

根据 CPIX 规范，`ContentKey@commonEncryptionScheme` 属性的可能值在 ISO 基础媒体文件格式文件通用加密规范（ISO/IEC 23001-7:2016）中定义：
+ 'cenc'：AES-CTR 模式完整样本和视频 NAL 子样本加密
+ 'cbc1'：AES-CBC 模式完整样本和视频 NAL 子样本加密
+ 'cens'：AES-CTR 模式部分视频 NAL 模式加密
+ 'cbcs'：AES-CBC 模式部分视频 NAL 模式加密

以下示例显示带有单个非加密内容密钥的 CPIX 文档：

```
<cpix:CPIX contentId="abc123" version="2.3" xmlns:cpix="urn:dashif:org:cpix" xmlns:pskc="urn:ietf:params:xml:ns:keyprov:pskc">
	<cpix:ContentKeyList>
		<cpix:ContentKey explicitIV="OFj2IjCsPJFfMAxmQxLGPw==" kid="98ee5596-cd3e-a20d-163a-e382420c6eff" commonEncryptionScheme="cbcs">
			<cpix:Data>
				<pskc:Secret>
					<pskc:PlainValue>5dGAgwGuUYu4dHeHtNlxJw==</pskc:PlainValue>
				</pskc:Secret>
			</cpix:Data>
		</cpix:ContentKey>
	</cpix:ContentKeyList>
	...
</cpix:CPIX>
```

默认情况下，内容密钥不加密，如下例所示。但是，加密器可以通过包含<cpix : >元素来请求对内容密钥进行加密。DeliveryDataList有关更多详细信息，请参阅“内容密钥加密”部分。


| SPEKE 支持的元素 | 强制属性 | 可选属性 | 强制子元素 | 可选子元素 | 
| --- | --- | --- | --- | --- | 
|  <cpix:CPIX>  |  contentId、version、xmlns:cpix、xmlns:pskc  |  name、xmlns:enc  |  一个 <cpix: ContentKeyList >，一个<cpix : List>，一个 <cpix: DRMSystem > ContentKeyUsageRuleList  |  一个 <cpix: DeliveryDataList >，一个 <cpix : >ContentKeyPeriodList  | 
|  <cpix : >ContentKeyList  |  -  |  id  |  至少有一个 <cpix : >ContentKey  |  -  | 
|  <cpix : >ContentKey  |  孩子， commonEncryptionScheme，数据  |  id、Algorithm、explicitIV  |  一个 <pskc:Secret>  |  -  | 
|  <pskc:Secret>  |  PlainValue 或者 EncryptedValue  |  ValueMAC  |  -  |  <enc: EncryptionMethod >，<enc : >CipherData  | 

**<cpix: 列表> 部分 DRMSystem**  
这是一个强制部分，与实时和 VOD 流式处理有关，其中定义需要与内容密钥结合利用的不同 DRM 系统。

以下示例显示了包含单个 DRM 系统规格的 PlayReady DRM 系统列表：

```
<cpix:DRMSystemList>
	<cpix:DRMSystem kid="98ee5596-cd3e-a20d-163a-e382420c6eff" systemId="9a04f079-9840-4286-ab92-e65be0885f95">
		<cpix:HLSSignalingData playlist="media">HicXmbZ2m[...]4==</cpix:HLSSignalingData>
		<cpix:HLSSignalingData playlist="master">HicXmbZ2m[...]jEi</cpix:HLSSignalingData>
		<cpix:ContentProtectionData>t7WwH24FI[...]YCC</cpix:ContentProtectionData>
		<cpix:PSSH>FFFFanBzc[...]A==</cpix:PSSH>
		<cpix:SmoothStreamingProtectionHeaderData>s5RrJ12HL[...]UBB</cpix:SmoothStreamingProtectionHeaderData>
	</cpix:DRMSystem>
</cpix:DRMSystemList>
```

有关 DRM 系统的完整列表IDs，请参阅 DASH-IF 标识符存储库的 “[内容保护” 部分](https://dashif.org/identifiers/content_protection/)。


| SPEKE 支持的元素 | 强制属性 | 可选属性 | 强制子元素 | 可选子元素 | 
| --- | --- | --- | --- | --- | 
|  <cpix：列表> DRMSystem  |  -  |  id  |  至少有一个 <cpix : >DRMSystem  |  -  | 
|  <cpix : >DRMSystem  |  kid、systemId  |  id、name、PSSH  |  -  |  ContentProtectionData， SmoothStreamingProtectionHeaderData，两个 <cpix：具有不同播放列表属性值的 HLSSignaling Data> 元素  | 

 如果将 ISO-BMFF 封装应用于媒体分段，则 `DRMSystem@PSSH` 为必填项。加密程序仅将 `DRMSystem.ContentProtectionData` innerXML `<pssh>` 元素用于清单信令目的。

如果存在 `DRMSystem@PSSH` 且 `DRMSystem.ContentProtectionData` 包含 innerXML `<pssh>` 元素，则两个值应相同。

如果要在 HLS 清单中传送 `DRMSystem` 信令，则必须在 CPIX 请求和响应中同时包含 `<cpix:HLSSignalingData playlist="media">` 和 `<cpix:HLSSignalingData playlist="master">` 元素。

**<cpix : >部分 ContentKeyPeriodList**  
这是一个可选部分，仅与实时流式处理有关，它定义了应用于内容的加密周期。

`<cpix:ContentKeyPeriodList>` 元素可以包含一个或多个 `<cpix:ContentKeyPeriod>` 子元素，每个子元素都描述了实时时间线中不同的加密周期。 UUIDs 作为 id 属性值的一部分使用是一种常用的方法。

```
<cpix:ContentKeyPeriodList>
	<cpix:ContentKeyPeriod id="keyPeriod_0909829f-40ff-4625-90fa-75da3e53278f" index="1" />
</cpix:ContentKeyPeriodList>
```


| SPEKE 支持的元素 | 强制属性 | 可选属性 | 强制子元素 | 可选子元素 | 
| --- | --- | --- | --- | --- | 
|  <cpix : >ContentKeyPeriodList  |  -  |  id  |  至少有一个 <cpix : >ContentKeyPeriod  |  -  | 
|  <cpix : >ContentKeyPeriod  |  id、index  |  -  |  -  |  -  | 

如果使用加密周期，则还需要将加密密钥附加到 CPIX 文档中的一个加密周期，如以下部分所示。

**<cpix : >部分 ContentKeyUsageRuleList**  
这是一个强制部分，与实时和 VOD 流式处理有关，定义了不同的内容密钥将如何保护流集内和加密周期的轨道。

<cpix: ContentKeyUsageRuleList > 元素可以包含一个或多个 <cpix: ContentKeyUsageRule > 子元素，每个子元素都描述了加密器可能在特定的加密期间应用给定内容密钥的轨道。<cpix: AudioFilter > 元素中至少需要一个 <cpix: VideoFilter > 或一个<cpix : >元素。ContentKeyUsageRule

以下示例显示了一个简单的列表，其中只有一条规则，将单个内容密钥应用于特定加密周期内的所有音频和视频轨道。

```
<cpix:ContentKeyUsageRuleList>
	<cpix:ContentKeyUsageRule kid="98ee5596-cd3e-a20d-163a-e382420c6eff" intendedTrackType="ALL">
		<cpix:KeyPeriodFilter periodId="keyPeriod_0909829f-40ff-4625-90fa-75da3e53278f"/>
		<cpix:AudioFilter />
		<cpix:VideoFilter />
	</cpix:ContentKeyUsageRule>
</cpix:ContentKeyUsageRuleList>
```


| SPEKE 支持的元素 | 强制属性 | 可选属性 | 强制子元素 | 可选子元素 | 
| --- | --- | --- | --- | --- | 
|  <cpix : >ContentKeyUsageRuleList  |  -  |  id  |  至少有一个 <cpix : >ContentKeyUsageRule  |  -  | 
|  <cpix : >ContentKeyUsageRule  |  孩子， intendedTrackType  |  -  |  至少一个 <cpix: AudioFilter > 或者一个 <cpix : >(\$1) VideoFilter  |  <cpix : >KeyPeriodFilter  | 
|  <cpix : >KeyPeriodFilter  |  periodId  |  -  |  -  |  -  | 
|  <cpix : >AudioFilter  |  -  |  minChannels、maxChannels  |  -  |  -  | 
|  <cpix : >VideoFilter  |  -  |  minPixels、maxPixels、hdr、minFps、maxFps  |  -  |  -  | 

 *（\$1）要详细了解如何使用单个或多个内容密钥来保护流集中的一个或多个轨道，请参阅[加密合约](encryption-contract-v2.md)文档部分。*

# SPEKE API v2 - 加密合约
<a name="encryption-contract-v2"></a>

加密合约根据轨道特征定义使用哪些内容密钥来保护给定流集中的哪些轨道。

建议将多个内容密钥用于流集中的不同轨道，但这并不是强制性，而是建议的行业最佳实践 - 至少使用两个不同的内容密钥，一个用于音频轨道，一个用于视频轨道。使用单个内容密钥加密多个轨道是可能的，但需要在加密程序发送给密钥提供程序的 CPIX 文档中明确发出信号。一般而言，加密程序总是准确描述需要多少内容密钥以及如何利用它们来加密各种媒体轨道。

**原则**  
加密合约位于 CPIX 文档的 `<cpix:ContentKeyUsageRuleList>` 部分。在此部分中，`<cpix:ContentKeyList>` 部分中定义的每个内容密钥都对应一个特定的 `<cpix:ContentKeyUsageRule>` 元素，其中应包括：
+ 可以引用一个或多个子组件的 `ContentKeyUsageRule@intendedTrackType` 属性，如果使用多个子组件，则用“\$1”符号分隔。`ContentKeyUsageRule@intendedTrackType` 的值在加密合约中应是唯一的，并且不能用于多个 `ContentKeyUsageRule` 元素。
+ 一个或多个 `<cpix:AudioFilter>` 或 `<cpix:VideoFilter>` 子元素，具体取决于 `ContentKeyUsageRule@intendedTrackType` 属性的值。

管理这种关系的规则如下：
+ 当需要使用唯一的内容密钥保护流集中的所有音频和视频轨道时，必须使用字符串 `'ALL'` 作为 `ContentKeyUsageRule@intendedTrackType` 属性值。示例 1 显示这样的使用案例。在这种情况下，应包括没有任何属性的 `<cpix:AudioFilter />` 和 `<cpix:VideoFilter />` 子元素。在此特定上下文中，任何其他`<cpix:AudioFilter>` and/or `<cpix:VideoFilter>`元素组合均无效。
+ 对于所有其他使用案例，可以自由定义 `ContentKeyUsageRule@intendedTrackType` 属性的值，并且 `<cpix:AudioFilter />` 和 `<cpix:VideoFilter />` 子元素的数量必须与通过“\$1”符号聚合的子组件数量相对应。示例 2/3/4/5/6/7/9/10 说明了当 `ContentKeyUsageRule@intendedTrackType` 属性值中存在单个子组件时的这一要求。示例 8 说明了使用多个子组件的情况：`ContentKeyUsageRule@intendedTrackType="SD+HD"` 由两个具有不同属性值的不同 `<cpix:VideoFilter>` 子元素描述，`ContentKeyUsageRule@intendedTrackType="HDR+HFR+UHD"` 由三个具有不同属性值的不同 `<cpix:VideoFilter>` 子元素描述。

**筛选条件**  
CPIX 定义了多个筛选元素和属性，但是 SPEKE 仅支持其中的一个子集。下表对这些不同情况进行了汇总：


| CPIX 筛选条件类型 | 整体 SPEKE 支持 | SPEKE 支持的筛选条件属性 | SPEKE 不支持的筛选条件属性 | 
| --- | --- | --- | --- | 
|  <cpix : >VideoFilter  |  是  |  minPixels、maxPixels、hdr、minFps、maxFps（可选属性）  |  wcg  | 
|  <cpix : >AudioFilter  |  是  |  minChannels、maxChannels（可选属性）  |  | 
|  <cpix : >KeyPeriodFilter  |  是  |  periodId（强制属性）  |  | 
|  <cpix : >BitrateFilter  |  否  |  不适用  |  不适用  | 
|  <cpix : >LabelFilter  |  否  |  不适用  |  不适用  | 

根据CPIX的规范 VideoFilter，[minPixels，maxPixels] 是两个维度的全包范围，而（minFPs，maxFPS）仅包含在maxFPS维度上。因为 AudioFilter，[minChannels，MaxChannels] 在两个维度上都是一个包含范围。

**问题情况**  
在某些情况下，加密合约中提供的信息可能不完整、含糊不清或存在错误。在这些情况下，加密程序和密钥提供程序必须采取适当的行为并保证对内容的适当保护。下表列出了在这些情况下的建议行为：


| 在这种情况下 | 加密器... should/shall  | 密钥提供商 should/shall ... | 
| --- | --- | --- | 
|  没有规则适用于流集中的一个或多个轨道（参见下面的示例 3）  |  加密程序应查看其配置（CPIX 负载外部），并验证相关轨道是否不需要加密。如果不是预期情况，则加密程序应引发错误并停止处理。  |   *不相关：密钥提供程序不了解流集结构。*  | 
|  多个规则重叠并建议使用多个内容密钥来加密特定轨道  |  加密器应按文档顺序应用最后一次 ContentKeyUsageRule 成功评估的结果。  |   *不相关：密钥提供程序不了解流集结构。*  | 
|  加密合约在单个 SPEKE request/response 周期内发生变化  |  加密程序应引发异常并停止处理，因为密钥提供程序不负责定义加密合约。  |  为了防止这种情况发生，密钥提供程序不得修改在 SPEKE 请求的 CPIX 负载中收到的加密合约。  | 
|  格式错误的加密合约： intendedTrackType/Filters 基数约束异常、不支持的过滤器或属性  |  加密器程序引发异常，停止处理，并且不向密钥提供程序发送 SPEKE 请求，因为这很可能会导致错误的内容保护或使某些轨道不受保护。  |  密钥提供程序应引发异常并返回“格式错误的加密合约”错误。  | 
|  格式良好的加密合约，但违反了 DRM 安全级别的约束：例如，要求使用单个内容密钥来保护音频轨道和超高清视频轨道  |  如果加密程序了解 DRM 安全级别约束，则应引发异常，停止处理，不向密钥提供程序发送 SPEKE 请求，因为这很可能会导致错误的内容保护。  |  密钥提供程序应引发异常并返回“不支持请求的 CPIX 加密合约”错误。  | 
|  缺少加密合约  |  加密器不得发送不包含任何或 VideoFilter 元素的CPIX文档。 AudioFilter   |  密钥提供程序应引发异常并返回“缺少 CPIX 加密合约”错误。  | 

**加密合约示例**  
 *示例 1：所有音频和视频轨道都使用一个内容密钥* 

```
<cpix:ContentKeyUsageRuleList>
	<cpix:ContentKeyUsageRule kid="98ee5596-cd3e-a20d-163a-e382420c6eff" intendedTrackType="ALL">
		<cpix:KeyPeriodFilter periodId="keyPeriod_0909829f-40ff-4625-90fa-75da3e53278f"/>
		<cpix:AudioFilter />
		<cpix:VideoFilter />
	</cpix:ContentKeyUsageRule>
</cpix:ContentKeyUsageRuleList>
```

 *示例 2：一个内容密钥用于所有视频轨道，一个内容密钥用于所有音频轨道* 

```
<cpix:ContentKeyUsageRuleList>
    <cpix:ContentKeyUsageRule kid="98ee5596-cd3e-a20d-163a-e382420c6eff" intendedTrackType="VIDEO">
        <cpix:KeyPeriodFilter periodId="keyPeriod_0909829f-40ff-4625-90fa-75da3e53278f"/>
        <cpix:VideoFilter />
    </cpix:ContentKeyUsageRule>
    <cpix:ContentKeyUsageRule kid="53abdba2-f210-43cb-bc90-f18f9a890a02" intendedTrackType="AUDIO">
        <cpix:KeyPeriodFilter periodId="keyPeriod_0909829f-40ff-4625-90fa-75da3e53278f"/>
        <cpix:AudioFilter />
    </cpix:ContentKeyUsageRule>
</cpix:ContentKeyUsageRuleList>
```

 *示例 3：一个内容密钥用于所有视频轨道和未加密的音频轨道* 

```
<cpix:ContentKeyUsageRuleList>
	<cpix:ContentKeyUsageRule kid="98ee5596-cd3e-a20d-163a-e382420c6eff" intendedTrackType="VIDEO">
		<cpix:KeyPeriodFilter periodId="keyPeriod_0909829f-40ff-4625-90fa-75da3e53278f"/>
		<cpix:VideoFilter />
	</cpix:ContentKeyUsageRule>
</cpix:ContentKeyUsageRuleList>
```

 *示例 4：多个内容密钥用于不同的视频轨道（SD/HD），一个内容密钥用于所有音频轨道* 

```
<cpix:ContentKeyUsageRuleList>
	<!-- Rule for SD video tracks (up to 1024x576) -->
	<cpix:ContentKeyUsageRule kid="98ee5596-cd3e-a20d-163a-e382420c6eff" intendedTrackType="SD">
		<cpix:KeyPeriodFilter periodId="keyPeriod_0909829f-40ff-4625-90fa-75da3e53278f"/>
		<cpix:VideoFilter maxPixels="589824" />
	</cpix:ContentKeyUsageRule>
	<!-- Rule for HD video tracks (more than 1024x576) -->
	<cpix:ContentKeyUsageRule kid="37e3de05-9a3b-4c69-8970-63c17a95e0b7" intendedTrackType="HD">
		<cpix:KeyPeriodFilter periodId="keyPeriod_0909829f-40ff-4625-90fa-75da3e53278f"/>
		<cpix:VideoFilter minPixels="589825" />
	</cpix:ContentKeyUsageRule>
	<!-- Rule for all audio tracks -->
	<cpix:ContentKeyUsageRule kid="53abdba2-f210-43cb-bc90-f18f9a890a02" intendedTrackType="AUDIO">
		<cpix:KeyPeriodFilter periodId="keyPeriod_0909829f-40ff-4625-90fa-75da3e53278f"/>
		<cpix:AudioFilter />
	</cpix:ContentKeyUsageRule>
</cpix:ContentKeyUsageRuleList>
```

 *示例 5：多个内容键用于不同的视频轨道 (SD/HD/UHD)，一个内容键用于所有音轨* 

```
<cpix:ContentKeyUsageRuleList>
	<!-- Rule for SD video tracks (up to 1024x576) -->
	<cpix:ContentKeyUsageRule kid="98ee5596-cd3e-a20d-163a-e382420c6eff" intendedTrackType="SD">
		<cpix:KeyPeriodFilter periodId="keyPeriod_0909829f-40ff-4625-90fa-75da3e53278f"/>
		<cpix:VideoFilter maxPixels="589824" />
	</cpix:ContentKeyUsageRule>
	<!-- Rule for HD video tracks (more than 1024x576, up to 1920x1080) -->
	<cpix:ContentKeyUsageRule kid="37e3de05-9a3b-4c69-8970-63c17a95e0b7" intendedTrackType="HD">
		<cpix:KeyPeriodFilter periodId="keyPeriod_0909829f-40ff-4625-90fa-75da3e53278f"/>
		<cpix:VideoFilter minPixels="589825" maxPixels="2073600" />
	</cpix:ContentKeyUsageRule>
	<!-- Rule for UHD video tracks (more than 1920x1080) -->
	<cpix:ContentKeyUsageRule kid="75c6fa78-8b5d-6d75-9653-26f41b78d1a3" intendedTrackType="UHD">
		<cpix:KeyPeriodFilter periodId="keyPeriod_0909829f-40ff-4625-90fa-75da3e53278f"/>
		<cpix:VideoFilter minPixels="2073601" />
	</cpix:ContentKeyUsageRule>
	<!-- Rule for all audio tracks -->
	<cpix:ContentKeyUsageRule kid="53abdba2-f210-43cb-bc90-f18f9a890a02" intendedTrackType="AUDIO">
		<cpix:KeyPeriodFilter periodId="keyPeriod_0909829f-40ff-4625-90fa-75da3e53278f"/>
		<cpix:AudioFilter />
	</cpix:ContentKeyUsageRule>
</cpix:ContentKeyUsageRuleList>
```

 *示例 6：多个内容键用于不同的视频轨道 (SD/HD/UHD1/UHD2)，一个内容键用于所有音轨* 

```
<cpix:ContentKeyUsageRuleList>
	<!-- Rule for SD video tracks (up to 1024x576) -->
	<cpix:ContentKeyUsageRule kid="98ee5596-cd3e-a20d-163a-e382420c6eff" intendedTrackType="SD">
		<cpix:KeyPeriodFilter periodId="keyPeriod_0909829f-40ff-4625-90fa-75da3e53278f"/>
		<cpix:VideoFilter maxPixels="589824" />
	</cpix:ContentKeyUsageRule>
	<!-- Rule for HD video tracks (more than 1024x576, up to 1920x1080) -->
	<cpix:ContentKeyUsageRule kid="37e3de05-9a3b-4c69-8970-63c17a95e0b7" intendedTrackType="HD">
		<cpix:KeyPeriodFilter periodId="keyPeriod_0909829f-40ff-4625-90fa-75da3e53278f"/>
		<cpix:VideoFilter minPixels="589825" maxPixels="2073600" />
	</cpix:ContentKeyUsageRule>
	<!-- Rule for UHD1 video tracks (more than 1920x1080, up to 4096x2160) -->
	<cpix:ContentKeyUsageRule kid="75c6fa78-8b5d-6d75-9653-26f41b78d1a3" intendedTrackType="UHD1">
		<cpix:KeyPeriodFilter periodId="keyPeriod_0909829f-40ff-4625-90fa-75da3e53278f"/>
		<cpix:VideoFilter minPixels="2073601" maxPixels="8847360" />
	</cpix:ContentKeyUsageRule>
	<!-- Rule for UHD2 video tracks (more than 4096x2160) -->
	<cpix:ContentKeyUsageRule kid="63d2ec36-6b7c-9f34-4546-97d01f36f7c5" intendedTrackType="UHD2">
		<cpix:KeyPeriodFilter periodId="keyPeriod_0909829f-40ff-4625-90fa-75da3e53278f"/>
		<cpix:VideoFilter minPixels="8847361" />
	</cpix:ContentKeyUsageRule>
	<!-- Rule for all audio tracks -->
	<cpix:ContentKeyUsageRule kid="53abdba2-f210-43cb-bc90-f18f9a890a02" intendedTrackType="AUDIO">
		<cpix:KeyPeriodFilter periodId="keyPeriod_0909829f-40ff-4625-90fa-75da3e53278f"/>
		<cpix:AudioFilter />
	</cpix:ContentKeyUsageRule>
</cpix:ContentKeyUsageRuleList>
```

 *示例 7：不同的视频轨道有多个内容键 (SD/HD1/HD2/UHD1/UHD2)，一个内容键用于所有音轨* 

```
<cpix:ContentKeyUsageRuleList>
	<!-- Rule for SD video tracks (up to 1024x576) -->
	<cpix:ContentKeyUsageRule kid="98ee5596-cd3e-a20d-163a-e382420c6eff" intendedTrackType="SD">
		<cpix:KeyPeriodFilter periodId="keyPeriod_0909829f-40ff-4625-90fa-75da3e53278f"/>
		<cpix:VideoFilter maxPixels="589824" />
	</cpix:ContentKeyUsageRule>
	<!-- Rule for HD1 video tracks (more than 1024x576, up to 1280x720) -->
	<cpix:ContentKeyUsageRule kid="37e3de05-9a3b-4c69-8970-63c17a95e0b7" intendedTrackType="HD1">
		<cpix:KeyPeriodFilter periodId="keyPeriod_0909829f-40ff-4625-90fa-75da3e53278f"/>
		<cpix:VideoFilter minPixels="589825" maxPixels="921600" />
	</cpix:ContentKeyUsageRule>
        <!-- Rule for HD2 video tracks (more than 1280x720, up to 1920x1080) -->
          <cpix:ContentKeyUsageRule kid="cda406d8-9d87-4f76-92da-31110e756176" intendedTrackType="HD2">
            <cpix:KeyPeriodFilter periodId="keyPeriod_0909829f-40ff-4625-90fa-75da3e53278f"/>
            <cpix:VideoFilter minPixels="921601" maxPixels="2073600" />
          </cpix:ContentKeyUsageRule>
	<!-- Rule for UHD1 video tracks (more than 1920x1080, up to 4096x2160) -->
	<cpix:ContentKeyUsageRule kid="75c6fa78-8b5d-6d75-9653-26f41b78d1a3" intendedTrackType="UHD1">
		<cpix:KeyPeriodFilter periodId="keyPeriod_0909829f-40ff-4625-90fa-75da3e53278f"/>
		<cpix:VideoFilter minPixels="2073601" maxPixels="8847360" />
	</cpix:ContentKeyUsageRule>
	<!-- Rule for UHD2 video tracks (more than 4096x2160) -->
	<cpix:ContentKeyUsageRule kid="63d2ec36-6b7c-9f34-4546-97d01f36f7c5" intendedTrackType="UHD2">
		<cpix:KeyPeriodFilter periodId="keyPeriod_0909829f-40ff-4625-90fa-75da3e53278f"/>
		<cpix:VideoFilter minPixels="8847361" />
	</cpix:ContentKeyUsageRule>
	<!-- Rule for all audio tracks -->
	<cpix:ContentKeyUsageRule kid="53abdba2-f210-43cb-bc90-f18f9a890a02" intendedTrackType="AUDIO">
		<cpix:KeyPeriodFilter periodId="keyPeriod_0909829f-40ff-4625-90fa-75da3e53278f"/>
		<cpix:AudioFilter />
	</cpix:ContentKeyUsageRule>
</cpix:ContentKeyUsageRuleList>
```

 *示例 8：多个内容密钥用于不同的视频轨道（基于多个属性类型），一个内容密钥用于所有音频轨道* 

```
<cpix:ContentKeyUsageRuleList>
	<!-- Rule for SD and HD video tracks-->
	<cpix:ContentKeyUsageRule kid="98ee5596-cd3e-a20d-163a-e382420c6eff" intendedTrackType="SD+HD">
		<cpix:KeyPeriodFilter periodId="keyPeriod_0909829f-40ff-4625-90fa-75da3e53278f"/>
		<cpix:VideoFilter maxPixels="442368" maxFps="30" hdr="false"/>
		<cpix:VideoFilter minPixels="442369" maxPixels="2073600" maxFps="30" hdr="false"/>
	</cpix:ContentKeyUsageRule>
	<!-- Rule for HDR, HFR and UHD video tracks-->
	<cpix:ContentKeyUsageRule kid="37e3de05-9a3b-4c69-8970-63c17a95e0b7" intendedTrackType="HDR+HFR+UHD">
		<cpix:KeyPeriodFilter periodId="keyPeriod_0909829f-40ff-4625-90fa-75da3e53278f"/>
		<cpix:VideoFilter hdr="true" />
		<cpix:VideoFilter minFps="30" />
		<cpix:VideoFilter minPixels="20736001" />
	</cpix:ContentKeyUsageRule>
	<!-- Rule for all audio tracks-->
	<cpix:ContentKeyUsageRule kid="53abdba2-f210-43cb-bc90-f18f9a890a02" intendedTrackType="AUDIO">
		<cpix:KeyPeriodFilter periodId="keyPeriod_0909829f-40ff-4625-90fa-75da3e53278f"/>
		<cpix:AudioFilter />
	</cpix:ContentKeyUsageRule>
</cpix:ContentKeyUsageRuleList>
```

 *示例 9：一个内容密钥用于所有视频轨道，多个内容密钥用于立体声和多声道音频轨道* 

```
<cpix:ContentKeyUsageRuleList>
	<!-- Rule for video tracks-->
	<cpix:ContentKeyUsageRule kid="98ee5596-cd3e-a20d-163a-e382420c6eff" intendedTrackType="VIDEO">
		<cpix:KeyPeriodFilter periodId="keyPeriod_0909829f-40ff-4625-90fa-75da3e53278f"/>
		<cpix:VideoFilter />
	</cpix:ContentKeyUsageRule>
	<!-- Rule for stereo audio tracks-->
	<cpix:ContentKeyUsageRule kid="53abdba2-f210-43cb-bc90-f18f9a890a02" intendedTrackType="STEREO_AUDIO">
		<cpix:KeyPeriodFilter periodId="keyPeriod_0909829f-40ff-4625-90fa-75da3e53278f"/>
		<cpix:AudioFilter maxChannels="2"/>
	</cpix:ContentKeyUsageRule>
	<!-- Rule for multichannel audio tracks-->
	<cpix:ContentKeyUsageRule kid="7ae8e96f-309e-42c3-a510-24023d923373" intendedTrackType="MULTICHANNEL_AUDIO">
		<cpix:KeyPeriodFilter periodId="keyPeriod_0909829f-40ff-4625-90fa-75da3e53278f"/>
		<AudioFilter minChannels="3"/>
	</cpix:ContentKeyUsageRule>
</cpix:ContentKeyUsageRuleList>
```

 *示例 10：一个内容密钥用于所有视频轨道，多个内容密钥用于立体声和两种类型的多声道音频轨道* 

```
<cpix:ContentKeyUsageRuleList>
	<!-- Rule for video tracks-->
	<cpix:ContentKeyUsageRule kid="98ee5596-cd3e-a20d-163a-e382420c6eff" intendedTrackType="VIDEO">
		<cpix:KeyPeriodFilter periodId="keyPeriod_0909829f-40ff-4625-90fa-75da3e53278f"/>
		<cpix:VideoFilter />
	</cpix:ContentKeyUsageRule>
	<!-- Rule for stereo audio tracks-->
	<cpix:ContentKeyUsageRule kid="53abdba2-f210-43cb-bc90-f18f9a890a02" intendedTrackType="STEREO_AUDIO">
		<cpix:KeyPeriodFilter periodId="keyPeriod_0909829f-40ff-4625-90fa-75da3e53278f"/>
		<cpix:AudioFilter maxChannels="2"/>
	</cpix:ContentKeyUsageRule>
	<!-- Rule for multichannel audio tracks (3 to 6 channels)-->
	<cpix:ContentKeyUsageRule kid="7ae8e96f-309e-42c3-a510-24023d923373" intendedTrackType="MULTICHANNEL_AUDIO_3_6">
		<cpix:KeyPeriodFilter periodId="keyPeriod_0909829f-40ff-4625-90fa-75da3e53278f"/>
		<cpix:AudioFilter minChannels="3" maxChannels="6"/>
	</cpix:ContentKeyUsageRule>
  <!-- Rule for multichannel audio tracks (7 channels and more)-->
	<cpix:ContentKeyUsageRule kid="81eb3761-55ff-4d22-a31d-94f01bbfd8ba" intendedTrackType="MULTICHANNEL_AUDIO_7">
		<cpix:KeyPeriodFilter periodId="keyPeriod_0909829f-40ff-4625-90fa-75da3e53278f"/>
		<cpix:AudioFilter minChannels="7"/>
	</cpix:ContentKeyUsageRule>
</cpix:ContentKeyUsageRuleList>
```

# SPEKE API v2 - 实时工作流方法调用示例
<a name="live-workflow-methods-v2"></a>

 *请求语法示例* 

以下 URL 是一个示例，并且不指示固定格式：

```
POST https://speke-compatible-server/speke/v2.0/copyProtection
```

 *请求正文* 

CPIX 文档。

 *请求标头* 


| Name | Type | 发生次数 | 说明 | 
| --- | --- | --- | --- | 
|   `AWS Authorization`   |  字符串  |  1..1  |  请参阅 [AWS Sigv4](https://docs.aws.amazon.com/general/latest/gr/sigv4_signing.html)   | 
|   `X-Amz-Security-Token`   |  字符串  |  1..1  |  请参阅 [AWS Sigv4](https://docs.aws.amazon.com/general/latest/gr/sigv4_signing.html)   | 
|   `X-Amz-Date`   |  字符串  |  1..1  |  请参阅 [AWS Sigv4](https://docs.aws.amazon.com/general/latest/gr/sigv4_signing.html)   | 
|   `Content-Type`   |  字符串  |  1..1  |  application/xml  | 
|   `X-Speke-Version`   |  字符串  |  1..1  |  与请求一起使用的 SPEKE API 版本，公式为。 MajorVersion MinorVersion，比如 SPEKE v2.0 的 “2.0”  | 

 *响应标头* 


| Name | Type | 发生次数 | 说明 | 
| --- | --- | --- | --- | 
|   `X-Speke-User-Agent`   |  字符串  |  1..1  |  用于标识密钥提供程序的字符串  | 
|   `Content-Type`   |  字符串  |  1..1  |  application/xml  | 
|   `X-Speke-Version`   |  字符串  |  1..1  |  与请求一起使用的 SPEKE API 版本，公式为。 MajorVersion MinorVersion，比如 SPEKE v2.0 的 “2.0”  | 

 *请求响应* 


| HTTP 代码 | 负载名称 | 发生次数 | 说明 | 
| --- | --- | --- | --- | 
|   `200 (Success)`   |  CPIX  |  1..1  |  DASH-CPIX 负载响应  | 
|   `4XX (Client error)`   |  客户端错误消息  |  1..1  |  客户端错误描述  | 
|   `5XX (Server error)`   |  服务器错误消息  |  1..1  |  服务器错误描述  | 

**注意**  
本部分中的示例不包含内容密钥加密。有关如何添加内容密钥加密的信息，请参阅[内容密钥加密](content-key-encryption-v2.md)。

 *带有明文密钥的实时示例请求负载* 

以下示例显示了从加密程序到 DRM 密钥提供程序的典型实时请求负载，一个内容密钥用于所有视频轨道，一个内容密钥用于所有音频轨道：

```
<cpix:CPIX contentId="abc123" version="2.3" xmlns:cpix="urn:dashif:org:cpix" xmlns:pskc="urn:ietf:params:xml:ns:keyprov:pskc">
	<cpix:ContentKeyList>
		<cpix:ContentKey explicitIV="OFj2IjCsPJFfMAxmQxLGPw==" kid="98ee5596-cd3e-a20d-163a-e382420c6eff" commonEncryptionScheme="cbcs"></cpix:ContentKey>
		<cpix:ContentKey explicitIV="L6jzdXrXAFbCJGBuMrrKrG==" kid="53abdba2-f210-43cb-bc90-f18f9a890a02" commonEncryptionScheme="cbcs"></cpix:ContentKey>
	</cpix:ContentKeyList>
	<cpix:DRMSystemList>
		<!-- FairPlay -->
		<cpix:DRMSystem kid="98ee5596-cd3e-a20d-163a-e382420c6eff" systemId="94ce86fb-07ff-4f43-adb8-93d2fa968ca2">
			<cpix:HLSSignalingData playlist="media"></cpix:HLSSignalingData>
			<cpix:HLSSignalingData playlist="master"></cpix:HLSSignalingData>
		</cpix:DRMSystem>
		<cpix:DRMSystem kid="53abdba2-f210-43cb-bc90-f18f9a890a02" systemId="94ce86fb-07ff-4f43-adb8-93d2fa968ca2">
			<cpix:HLSSignalingData playlist="media"></cpix:HLSSignalingData>
			<cpix:HLSSignalingData playlist="master"></cpix:HLSSignalingData>
		</cpix:DRMSystem>
		<!-- Widevine -->
		<cpix:DRMSystem kid="98ee5596-cd3e-a20d-163a-e382420c6eff" systemId="edef8ba9-79d6-4ace-a3c8-27dcd51d21ed">
			<cpix:HLSSignalingData playlist="media"></cpix:HLSSignalingData>
			<cpix:HLSSignalingData playlist="master"></cpix:HLSSignalingData>
			<cpix:ContentProtectionData></cpix:ContentProtectionData>
			<cpix:PSSH></cpix:PSSH>
		</cpix:DRMSystem>
		<cpix:DRMSystem kid="53abdba2-f210-43cb-bc90-f18f9a890a02" systemId="edef8ba9-79d6-4ace-a3c8-27dcd51d21ed">
			<cpix:HLSSignalingData playlist="media"></cpix:HLSSignalingData>
			<cpix:HLSSignalingData playlist="master"></cpix:HLSSignalingData>
			<cpix:ContentProtectionData></cpix:ContentProtectionData>
			<cpix:PSSH></cpix:PSSH>
		</cpix:DRMSystem>
		<!-- Playready -->
		<cpix:DRMSystem kid="98ee5596-cd3e-a20d-163a-e382420c6eff" systemId="9a04f079-9840-4286-ab92-e65be0885f95">
			<cpix:HLSSignalingData playlist="media"></cpix:HLSSignalingData>
			<cpix:HLSSignalingData playlist="master"></cpix:HLSSignalingData>
			<cpix:ContentProtectionData></cpix:ContentProtectionData>
			<cpix:PSSH></cpix:PSSH>
			<cpix:SmoothStreamingProtectionHeaderData></cpix:SmoothStreamingProtectionHeaderData>
		</cpix:DRMSystem>
		<cpix:DRMSystem kid="53abdba2-f210-43cb-bc90-f18f9a890a02" systemId="9a04f079-9840-4286-ab92-e65be0885f95">
			<cpix:HLSSignalingData playlist="media"></cpix:HLSSignalingData>
			<cpix:HLSSignalingData playlist="master"></cpix:HLSSignalingData>
			<cpix:ContentProtectionData></cpix:ContentProtectionData>
			<cpix:PSSH></cpix:PSSH>
			<cpix:SmoothStreamingProtectionHeaderData></cpix:SmoothStreamingProtectionHeaderData>
		</cpix:DRMSystem>
	</cpix:DRMSystemList>
	<cpix:ContentKeyPeriodList>
		<cpix:ContentKeyPeriod id="keyPeriod_0909829f-40ff-4625-90fa-75da3e53278f" index="1" />
	</cpix:ContentKeyPeriodList>
	<cpix:ContentKeyUsageRuleList>
		<cpix:ContentKeyUsageRule kid="98ee5596-cd3e-a20d-163a-e382420c6eff" intendedTrackType="VIDEO">
			<cpix:KeyPeriodFilter periodId="keyPeriod_0909829f-40ff-4625-90fa-75da3e53278f"/>
			<cpix:VideoFilter />
		</cpix:ContentKeyUsageRule>
		<cpix:ContentKeyUsageRule kid="53abdba2-f210-43cb-bc90-f18f9a890a02" intendedTrackType="AUDIO">
			<cpix:KeyPeriodFilter periodId="keyPeriod_0909829f-40ff-4625-90fa-75da3e53278f"/>
			<cpix:AudioFilter />
		</cpix:ContentKeyUsageRule>
	</cpix:ContentKeyUsageRuleList>
</cpix:CPIX>
```

 *带有明文密钥的实时示例响应负载* 

以下示例显示了来自 DRM 密钥提供程序的典型响应负载（为了便于阅读，返回值已使用 […​] 缩短）：

```
<cpix:CPIX contentId="abc123" version="2.3" xmlns:cpix="urn:dashif:org:cpix" xmlns:pskc="urn:ietf:params:xml:ns:keyprov:pskc">
	<cpix:ContentKeyList>
		<cpix:ContentKey explicitIV="OFj2IjCsPJFfMAxmQxLGPw==" kid="98ee5596-cd3e-a20d-163a-e382420c6eff" commonEncryptionScheme="cbcs">
			<cpix:Data>
				<pskc:Secret>
					<pskc:PlainValue>5dGAgwGuUYu4dHeHtNlxJw==</pskc:PlainValue>
				</pskc:Secret>
			</cpix:Data>
		</cpix:ContentKey>
		<cpix:ContentKey explicitIV="L6jzdXrXAFbCJGBuMrrKrG==" kid="53abdba2-f210-43cb-bc90-f18f9a890a02" commonEncryptionScheme="cbcs">
			<cpix:Data>
				<pskc:Secret>
					<pskc:PlainValue>h3toSFIlyAYpfXVQ795m6x==</pskc:PlainValue>
				</pskc:Secret>
			</cpix:Data>
		</cpix:ContentKey>
	</cpix:ContentKeyList>
	<cpix:DRMSystemList>
		<!-- FairPlay -->
		<cpix:DRMSystem kid="98ee5596-cd3e-a20d-163a-e382420c6eff" systemId="94ce86fb-07ff-4f43-adb8-93d2fa968ca2">
			<cpix:HLSSignalingData playlist="media">aHR0cHM6L[...]WZm</cpix:HLSSignalingData>
			<cpix:HLSSignalingData playlist="master">Y29tLmFwc[...]XJ5</cpix:HLSSignalingData>
		</cpix:DRMSystem>
		<cpix:DRMSystem kid="53abdba2-f210-43cb-bc90-f18f9a890a02" systemId="94ce86fb-07ff-4f43-adb8-93d2fa968ca2">
			<cpix:HLSSignalingData playlist="media">trBAnbMcj[...]u44</cpix:HLSSignalingData>
			<cpix:HLSSignalingData playlist="master">mn626PjyR[...]2fi</cpix:HLSSignalingData>
		</cpix:DRMSystem>
		<!-- Widevine -->
		<cpix:DRMSystem kid="98ee5596-cd3e-a20d-163a-e382420c6eff" systemId="edef8ba9-79d6-4ace-a3c8-27dcd51d21ed">
			<cpix:HLSSignalingData playlist="media">Ifa2V5LWl[...]nNB</cpix:HLSSignalingData>
			<cpix:HLSSignalingData playlist="master">oIARIQeSI[...]Nd2l</cpix:HLSSignalingData>
			<cpix:ContentProtectionData>RoNd2lkZXZ[...]Nib</cpix:ContentProtectionData>
			<cpix:PSSH>AAAAanBzc[...]A==</cpix:PSSH>
		</cpix:DRMSystem>
		<cpix:DRMSystem kid="53abdba2-f210-43cb-bc90-f18f9a890a02" systemId="edef8ba9-79d6-4ace-a3c8-27dcd51d21ed">
			<cpix:HLSSignalingData playlist="media">lTznjvtzL[...]GfJ</cpix:HLSSignalingData>
			<cpix:HLSSignalingData playlist="master">XgzdzQH7p[...]zeX</cpix:HLSSignalingData>
			<cpix:ContentProtectionData>TdgRnuJsZ[...]wDw</cpix:ContentProtectionData>
			<cpix:PSSH>mYZbjpWdS[...]D==</cpix:PSSH>
		</cpix:DRMSystem>
		<!-- Playready -->
		<cpix:DRMSystem kid="98ee5596-cd3e-a20d-163a-e382420c6eff" systemId="9a04f079-9840-4286-ab92-e65be0885f95">
			<cpix:HLSSignalingData playlist="media">HicXmbZ2m[...]4==</cpix:HLSSignalingData>
			<cpix:HLSSignalingData playlist="master">GVzdCIfa2[...]Eta</cpix:HLSSignalingData>
			<cpix:ContentProtectionData>t7WwH24FI[...]YCC</cpix:ContentProtectionData>
			<cpix:PSSH>FFFFanBzc[...]A==</cpix:PSSH>
			<cpix:SmoothStreamingProtectionHeaderData>s5RrJ12HL[...]UBB</cpix:SmoothStreamingProtectionHeaderData>
		</cpix:DRMSystem>
		<cpix:DRMSystem kid="53abdba2-f210-43cb-bc90-f18f9a890a02" systemId="9a04f079-9840-4286-ab92-e65be0885f95">
			<cpix:HLSSignalingData playlist="media">BptGzwis2[...]Iej</cpix:HLSSignalingData>
			<cpix:HLSSignalingData playlist="master">3c9SXdVa0[...]MBH</cpix:HLSSignalingData>
			<cpix:ContentProtectionData>HotJCMQyc[...]GpU</cpix:ContentProtectionData>
			<cpix:PSSH>S6UD43ybN[...]f==</cpix:PSSH>
			<cpix:SmoothStreamingProtectionHeaderData>VBFUv2or0[...]JeP</cpix:SmoothStreamingProtectionHeaderData>
		</cpix:DRMSystem>
	</cpix:DRMSystemList>
	<cpix:ContentKeyPeriodList>
		<cpix:ContentKeyPeriod id="keyPeriod_0909829f-40ff-4625-90fa-75da3e53278f" index="1" />
	</cpix:ContentKeyPeriodList>
	<cpix:ContentKeyUsageRuleList>
		<cpix:ContentKeyUsageRule kid="98ee5596-cd3e-a20d-163a-e382420c6eff" intendedTrackType="VIDEO">
			<cpix:KeyPeriodFilter periodId="keyPeriod_0909829f-40ff-4625-90fa-75da3e53278f"/>
			<cpix:VideoFilter />
		</cpix:ContentKeyUsageRule>
		<cpix:ContentKeyUsageRule kid="53abdba2-f210-43cb-bc90-f18f9a890a02" intendedTrackType="AUDIO">
			<cpix:KeyPeriodFilter periodId="keyPeriod_0909829f-40ff-4625-90fa-75da3e53278f"/>
			<cpix:AudioFilter />
		</cpix:ContentKeyUsageRule>
	</cpix:ContentKeyUsageRuleList>
</cpix:CPIX>
```

# SPEKE API v2 - VOD 工作流方法调用示例
<a name="vod-workflow-method-v2"></a>

 *请求语法示例* 

以下 URL 是一个示例，并且不指示固定格式。

```
POST https://speke-compatible-server/speke/v2.0/copyProtection
```

 *请求正文* 

CPIX 文档。

 *请求标头* 


| Name | Type | 发生次数 | 说明 | 
| --- | --- | --- | --- | 
|   `AWS Authorization`   |  字符串  |  1..1  |  请参阅 [AWS Sigv4](https://docs.aws.amazon.com/general/latest/gr/sigv4_signing.html)   | 
|   `X-Amz-Security-Token`   |  字符串  |  1..1  |  请参阅 [AWS Sigv4](https://docs.aws.amazon.com/general/latest/gr/sigv4_signing.html)   | 
|   `X-Amz-Date`   |  字符串  |  1..1  |  请参阅 [AWS Sigv4](https://docs.aws.amazon.com/general/latest/gr/sigv4_signing.html)   | 
|   `Content-Type`   |  字符串  |  1..1  |  application/xml  | 
|   `X-Speke-Version`   |  字符串  |  1..1  |  与请求一起使用的 SPEKE API 版本，公式为。 MajorVersion MinorVersion，比如 SPEKE v2.0 的 “2.0”  | 

 *响应标头* 


| Name | Type | 发生次数 | 说明 | 
| --- | --- | --- | --- | 
|   `X-Speke-User-Agent`   |  字符串  |  1..1  |  用于标识密钥提供程序的字符串  | 
|   `Content-Type`   |  字符串  |  1..1  |  application/xml  | 
|   `X-Speke-Version`   |  字符串  |  1..1  |  与请求一起使用的 SPEKE API 版本，公式为。 MajorVersion MinorVersion，比如 SPEKE v2.0 的 “2.0”  | 

 *请求响应* 


| HTTP 代码 | 负载名称 | 发生次数 | 说明 | 
| --- | --- | --- | --- | 
|   `200 (Success)`   |  CPIX  |  1..1  |  DASH-CPIX 负载响应  | 
|   `4XX (Client error)`   |  客户端错误消息  |  1..1  |  客户端错误描述  | 
|   `5XX (Server error)`   |  服务器错误消息  |  1..1  |  服务器错误描述  | 

**注意**  
本部分中的示例不包含内容密钥加密。有关如何添加内容密钥加密的信息，请参阅[内容密钥加密](content-key-encryption-v2.md)。

 *带有明文密钥的 VOD 示例请求负载* 

以下示例显示了从加密程序到 DRM 密钥提供程序的典型 VOD 请求负载，一个内容密钥用于所有视频轨道，一个内容密钥用于所有音频轨道：

```
<cpix:CPIX contentId="abc123" version="2.3" xmlns:cpix="urn:dashif:org:cpix" xmlns:pskc="urn:ietf:params:xml:ns:keyprov:pskc">
	<cpix:ContentKeyList>
		<cpix:ContentKey explicitIV="OFj2IjCsPJFfMAxmQxLGPw==" kid="98ee5596-cd3e-a20d-163a-e382420c6eff" commonEncryptionScheme="cbcs"></cpix:ContentKey>
		<cpix:ContentKey explicitIV="L6jzdXrXAFbCJGBuMrrKrG==" kid="53abdba2-f210-43cb-bc90-f18f9a890a02" commonEncryptionScheme="cbcs"></cpix:ContentKey>
	</cpix:ContentKeyList>
	<cpix:DRMSystemList>
		<!-- FairPlay -->
		<cpix:DRMSystem kid="98ee5596-cd3e-a20d-163a-e382420c6eff" systemId="94ce86fb-07ff-4f43-adb8-93d2fa968ca2">
			<cpix:HLSSignalingData playlist="media"></cpix:HLSSignalingData>
			<cpix:HLSSignalingData playlist="master"></cpix:HLSSignalingData>
		</cpix:DRMSystem>
		<cpix:DRMSystem kid="53abdba2-f210-43cb-bc90-f18f9a890a02" systemId="94ce86fb-07ff-4f43-adb8-93d2fa968ca2">
			<cpix:HLSSignalingData playlist="media"></cpix:HLSSignalingData>
			<cpix:HLSSignalingData playlist="master"></cpix:HLSSignalingData>
		</cpix:DRMSystem>
		<!-- Widevine -->
		<cpix:DRMSystem kid="98ee5596-cd3e-a20d-163a-e382420c6eff" systemId="edef8ba9-79d6-4ace-a3c8-27dcd51d21ed">
			<cpix:HLSSignalingData playlist="media"></cpix:HLSSignalingData>
			<cpix:HLSSignalingData playlist="master"></cpix:HLSSignalingData>
			<cpix:ContentProtectionData></cpix:ContentProtectionData>
			<cpix:PSSH></cpix:PSSH>
		</cpix:DRMSystem>
		<cpix:DRMSystem kid="53abdba2-f210-43cb-bc90-f18f9a890a02" systemId="edef8ba9-79d6-4ace-a3c8-27dcd51d21ed">
			<cpix:HLSSignalingData playlist="media"></cpix:HLSSignalingData>
			<cpix:HLSSignalingData playlist="master"></cpix:HLSSignalingData>
			<cpix:ContentProtectionData></cpix:ContentProtectionData>
			<cpix:PSSH></cpix:PSSH>
		</cpix:DRMSystem>
		<!-- Playready -->
		<cpix:DRMSystem kid="98ee5596-cd3e-a20d-163a-e382420c6eff" systemId="9a04f079-9840-4286-ab92-e65be0885f95">
			<cpix:HLSSignalingData playlist="media"></cpix:HLSSignalingData>
			<cpix:HLSSignalingData playlist="master"></cpix:HLSSignalingData>
			<cpix:ContentProtectionData></cpix:ContentProtectionData>
			<cpix:PSSH></cpix:PSSH>
			<cpix:SmoothStreamingProtectionHeaderData></cpix:SmoothStreamingProtectionHeaderData>
		</cpix:DRMSystem>
		<cpix:DRMSystem kid="53abdba2-f210-43cb-bc90-f18f9a890a02" systemId="9a04f079-9840-4286-ab92-e65be0885f95">
			<cpix:HLSSignalingData playlist="media"></cpix:HLSSignalingData>
			<cpix:HLSSignalingData playlist="master"></cpix:HLSSignalingData>
			<cpix:ContentProtectionData></cpix:ContentProtectionData>
			<cpix:PSSH></cpix:PSSH>
			<cpix:SmoothStreamingProtectionHeaderData></cpix:SmoothStreamingProtectionHeaderData>
		</cpix:DRMSystem>
	</cpix:DRMSystemList>
	<cpix:ContentKeyUsageRuleList>
		<cpix:ContentKeyUsageRule kid="98ee5596-cd3e-a20d-163a-e382420c6eff" intendedTrackType="VIDEO">
			<cpix:VideoFilter />
		</cpix:ContentKeyUsageRule>
		<cpix:ContentKeyUsageRule kid="53abdba2-f210-43cb-bc90-f18f9a890a02" intendedTrackType="AUDIO">
			<cpix:AudioFilter />
		</cpix:ContentKeyUsageRule>
	</cpix:ContentKeyUsageRuleList>
</cpix:CPIX>
```

 *带有明文密钥的 VOD 示例响应负载* 

以下示例显示了来自 DRM 密钥提供程序的典型响应负载（为了便于阅读，返回值已使用 […​] 缩短）：

```
<cpix:CPIX contentId="abc123" version="2.3" xmlns:cpix="urn:dashif:org:cpix" xmlns:pskc="urn:ietf:params:xml:ns:keyprov:pskc">
	<cpix:ContentKeyList>
		<cpix:ContentKey explicitIV="OFj2IjCsPJFfMAxmQxLGPw==" kid="98ee5596-cd3e-a20d-163a-e382420c6eff" commonEncryptionScheme="cbcs">
			<cpix:Data>
				<pskc:Secret>
					<pskc:PlainValue>5dGAgwGuUYu4dHeHtNlxJw==</pskc:PlainValue>
				</pskc:Secret>
			</cpix:Data>
		</cpix:ContentKey>
		<cpix:ContentKey explicitIV="L6jzdXrXAFbCJGBuMrrKrG==" kid="53abdba2-f210-43cb-bc90-f18f9a890a02" commonEncryptionScheme="cbcs">
			<cpix:Data>
				<pskc:Secret>
					<pskc:PlainValue>h3toSFIlyAYpfXVQ795m6x==</pskc:PlainValue>
				</pskc:Secret>
			</cpix:Data>
		</cpix:ContentKey>
	</cpix:ContentKeyList>
	<cpix:DRMSystemList>
		<!-- FairPlay -->
		<cpix:DRMSystem kid="98ee5596-cd3e-a20d-163a-e382420c6eff" systemId="94ce86fb-07ff-4f43-adb8-93d2fa968ca2">
			<cpix:HLSSignalingData playlist="media">aHR0cHM6L[...]WZm</cpix:HLSSignalingData>
			<cpix:HLSSignalingData playlist="master">Y29tLmFwc[...]XJ5</cpix:HLSSignalingData>
		</cpix:DRMSystem>
		<cpix:DRMSystem kid="53abdba2-f210-43cb-bc90-f18f9a890a02" systemId="94ce86fb-07ff-4f43-adb8-93d2fa968ca2">
			<cpix:HLSSignalingData playlist="media">trBAnbMcj[...]u44</cpix:HLSSignalingData>
			<cpix:HLSSignalingData playlist="master">mn626PjyR[...]2fi</cpix:HLSSignalingData>
		</cpix:DRMSystem>
		<!-- Widevine -->
		<cpix:DRMSystem kid="98ee5596-cd3e-a20d-163a-e382420c6eff" systemId="edef8ba9-79d6-4ace-a3c8-27dcd51d21ed">
			<cpix:HLSSignalingData playlist="media">Ifa2V5LWl[...]nNB</cpix:HLSSignalingData>
			<cpix:HLSSignalingData playlist="master">oIARIQeSI[...]Nd2l</cpix:HLSSignalingData>
			<cpix:ContentProtectionData>RoNd2lkZXZ[...]Nib</cpix:ContentProtectionData>
			<cpix:PSSH>AAAAanBzc[...]A==</cpix:PSSH>
		</cpix:DRMSystem>
		<cpix:DRMSystem kid="53abdba2-f210-43cb-bc90-f18f9a890a02" systemId="edef8ba9-79d6-4ace-a3c8-27dcd51d21ed">
			<cpix:HLSSignalingData playlist="media">lTznjvtzL[...]GfJ</cpix:HLSSignalingData>
			<cpix:HLSSignalingData playlist="master">XgzdzQH7p[...]zeX</cpix:HLSSignalingData>
			<cpix:ContentProtectionData>TdgRnuJsZ[...]wDw</cpix:ContentProtectionData>
			<cpix:PSSH>mYZbjpWdS[...]D==</cpix:PSSH>
		</cpix:DRMSystem>
		<!-- Playready -->
		<cpix:DRMSystem kid="98ee5596-cd3e-a20d-163a-e382420c6eff" systemId="9a04f079-9840-4286-ab92-e65be0885f95">
			<cpix:HLSSignalingData playlist="media">HicXmbZ2m[...]4==</cpix:HLSSignalingData>
			<cpix:HLSSignalingData playlist="master">GVzdCIfa2[...]Eta</cpix:HLSSignalingData>
			<cpix:ContentProtectionData>t7WwH24FI[...]YCC</cpix:ContentProtectionData>
			<cpix:PSSH>FFFFanBzc[...]A==</cpix:PSSH>
			<cpix:SmoothStreamingProtectionHeaderData>s5RrJ12HL[...]UBB</cpix:SmoothStreamingProtectionHeaderData>
		</cpix:DRMSystem>
		<cpix:DRMSystem kid="53abdba2-f210-43cb-bc90-f18f9a890a02" systemId="9a04f079-9840-4286-ab92-e65be0885f95">
			<cpix:HLSSignalingData playlist="media">BptGzwis2[...]Iej</cpix:HLSSignalingData>
			<cpix:HLSSignalingData playlist="master">3c9SXdVa0[...]MBH</cpix:HLSSignalingData>
			<cpix:ContentProtectionData>HotJCMQyc[...]GpU</cpix:ContentProtectionData>
			<cpix:PSSH>S6UD43ybN[...]f==</cpix:PSSH>
			<cpix:SmoothStreamingProtectionHeaderData>VBFUv2or0[...]JeP</cpix:SmoothStreamingProtectionHeaderData>
		</cpix:DRMSystem>
	</cpix:DRMSystemList>
	<cpix:ContentKeyUsageRuleList>
		<cpix:ContentKeyUsageRule kid="98ee5596-cd3e-a20d-163a-e382420c6eff" intendedTrackType="VIDEO">
			<cpix:VideoFilter />
		</cpix:ContentKeyUsageRule>
		<cpix:ContentKeyUsageRule kid="53abdba2-f210-43cb-bc90-f18f9a890a02" intendedTrackType="AUDIO">
			<cpix:AudioFilter />
		</cpix:ContentKeyUsageRule>
	</cpix:ContentKeyUsageRuleList>
</cpix:CPIX>
```

# SPEKE API v2 - 内容密钥加密
<a name="content-key-encryption-v2"></a>

您可以选择将内容密钥加密添加到 SPEKE 实现。内容密钥加密除了对内容本身进行加密外，还通过加密传输的内容密钥来确保全面 end-to-end保护。如果您未为密钥提供程序实现此项，则依靠传输层加密以及强大的身份验证来实现安全性。

要对在 AWS 云中运行的加密器使用内容密钥加密，客户需要将证书导入 AWS Certifice Manager，然后使用生成的证书 ARNs 进行加密活动。加密器使用证书 ARNs 和 ACM 服务向 DRM 密钥提供者提供加密的内容密钥。

**限制**  
SPEKE 支持具有以下限制的 DASH-IF CPIX 规范中指定的内容密钥加密：
+ SPEKE 不支持请求或响应负载的数字签名验证（XMLDSIG）。
+ SPEKE 需要基于 2048 位 RSA 的证书。

这些限制也在 [DASH-IF 规范的自定义项和约束](speke-constraints-v2.md)中列出。

**实现内容密钥加密**  
要提供内容密钥加密，请在您的 DRM 密钥提供程序实现中包含以下内容：
+ 处理请求和响应负载中的 `<cpix:DeliveryDataList>` 元素。
+ 在响应负载的 `<cpix:ContentKeyList>` 中提供加密值。

有关这些元素的更多信息，请参阅 [DASH-IF CPIX 2.3 规范](https://dashif.org/docs/CPIX2.3/Cpix.html)。

 *请求负载中的示例内容密钥加密元素 ` <cpix:DeliveryDataList> `* 

```
<cpix:CPIX contentId="abc123"
    version="2.3"
    xmlns:cpix="urn:dashif:org:cpix"
    xmlns:pskc="urn:ietf:params:xml:ns:keyprov:pskc">
    <cpix:DeliveryDataList>
        <cpix:DeliveryData id="<ORIGIN SERVER ID>">
            <cpix:DeliveryKey>
                <ds:X509Data>
                    <ds:X509Certificate><X.509 CERTIFICATE, BASE-64 ENCODED></ds:X509Certificate>
                </ds:X509Data>
            </cpix:DeliveryKey>
        </cpix:DeliveryData>
    </cpix:DeliveryDataList>
    <cpix:ContentKeyList>
     ...
    </cpix:ContentKeyList>
</cpix:CPIX>
```

 *响应负载中的示例内容密钥加密元素 ` <cpix:DeliveryDataList> `* 

```
<cpix:CPIX contentId="abc123"
    version="2.3"
    xmlns:cpix="urn:dashif:org:cpix"
    xmlns:pskc="urn:ietf:params:xml:ns:keyprov:pskc">
    <cpix:DeliveryDataList>
        <cpix:DeliveryData id="<ORIGIN SERVER ID>">
            <cpix:DeliveryKey>
                <ds:X509Data>
                    <ds:X509Certificate><X.509 CERTIFICATE, BASE-64 ENCODED></ds:X509Certificate>
                </ds:X509Data>
            </cpix:DeliveryKey>
            <cpix:DocumentKey Algorithm="http://www.w3.org/2001/04/xmlenc#aes256-cbc">
                <cpix:Data>
                    <pskc:Secret>
                        <pskc:EncryptedValue>
                            <enc:EncryptionMethod Algorithm="http://www.w3.org/2001/04/xmlenc#rsa-oaep-mgf1p" />
                            <enc:CipherData>
                                <enc:CipherValue><RSA CIPHER VALUE></enc:CipherValue>
                            </enc:CipherData>
                        </pskc:EncryptedValue>
                        <pskc:ValueMAC>qnei/5TsfUwDu+8bhsZrLjDRDngvmnUZD2eva7SfXWw=</pskc:ValueMAC>
                    </pskc:Secret>
                </cpix:Data>
            </cpix:DocumentKey>
            <cpix:MACMethod Algorithm="http://www.w3.org/2001/04/xmldsig-more#hmac-sha512">
                <cpix:Key>
                    <pskc:EncryptedValue>
                        <enc:EncryptionMethod Algorithm="http://www.w3.org/2001/04/xmlenc#rsa-oaep-mgf1p" />
                        <enc:CipherData>
                            <enc:CipherValue><RSA CIPHER VALUE></enc:CipherValue>
                        </enc:CipherData>
                    </pskc:EncryptedValue>
                    <pskc:ValueMAC>DGqdpHUfFKxdsO9+EWrPjtdTCVfjPLwwtzEcFC/j0xY=</pskc:ValueMAC>
                </cpix:Key>
            </cpix:MACMethod>
        </cpix:DeliveryData>
    </cpix:DeliveryDataList>
    <cpix:ContentKeyList>
     ...
    </cpix:ContentKeyList>
</cpix:CPIX>
```

 *响应负载中的示例内容密钥加密元素 ` <cpix:ContentKeyList> `* 

下面的示例显示了在响应负载的 `<cpix:ContentKeyList>` 元素中的加密内容密钥处理。这将使用 `<pskc:EncryptedValue>` 元素：

```
<cpix:ContentKeyList>
     <cpix:ContentKey explicitIV="OFj2IjCsPJFfMAxmQxLGPw==" kid="98ee5596-cd3e-a20d-163a-e382420c6eff" commonEncryptionScheme="cbcs">
         <cpix:Data>
             <pskc:Secret>
                 <pskc:EncryptedValue>
                     <enc:EncryptionMethod Algorithm="http://www.w3.org/2001/04/xmlenc#aes256-cbc" />
                     <enc:CipherData>
                         <enc:CipherValue>NJYebfvJ2TdMm3k6v+rLNVYb0NoTJoTLBBdbpe8nmilEfp82SKa7MkqTn2lmQBPB</enc:CipherValue>
                     </enc:CipherData>
                 </pskc:EncryptedValue>
                 <pskc:ValueMAC>t9lW4WCebfS1GP+dh0IicMs+2+jnrAmfDa4WU6VGHc4=</pskc:ValueMAC>
             </pskc:Secret>
         </cpix:Data>
     </cpix:ContentKey>
 </cpix:ContentKeyList>
```

相比而言，以下示例显示了类似的响应负载，其中包含以未加密的明文密钥形式提供的内容密钥。这将使用 `<pskc:PlainValue>` 元素：

```
<cpix:ContentKeyList>
    <cpix:ContentKey explicitIV="OFj2IjCsPJFfMAxmQxLGPw==" kid="98ee5596-cd3e-a20d-163a-e382420c6eff" commonEncryptionScheme="cbcs">
        <cpix:Data>
            <pskc:Secret>
                <pskc:PlainValue>5dGAgwGuUYu4dHeHtNlxJw==</pskc:PlainValue>
            </pskc:Secret>
        </cpix:Data>
    </cpix:ContentKey>
</cpix:ContentKeyList>
```

# SPEKE API v2 - 覆盖密钥标识符
<a name="kid-override-v2"></a>

每轮换一次密钥，加密程序就会创建一个新的密钥标识符 (KID)。它将 KID 传递到其请求中的 DRM 密钥提供程序。通常，使用相同 KID 的密钥提供程序会响应，但它可以在响应中提供其他 KID 值。

以下是 KID 为 `11111111-1111-1111-1111-111111111111` 的示例请求：

```
<cpix:CPIX contentId="abc123" version="2.3" xmlns:cpix="urn:dashif:org:cpix" xmlns:pskc="urn:ietf:params:xml:ns:keyprov:pskc">
	<cpix:ContentKeyList>
		<cpix:ContentKey explicitIV="OFj2IjCsPJFfMAxmQxLGPw==" kid="11111111-1111-1111-1111-111111111111" commonEncryptionScheme="cbcs"></cpix:ContentKey>
	</cpix:ContentKeyList>
	<cpix:DRMSystemList>
		<!-- Widevine -->
		<cpix:DRMSystem kid="11111111-1111-1111-1111-111111111111" systemId="edef8ba9-79d6-4ace-a3c8-27dcd51d21ed">
			<cpix:HLSSignalingData playlist="media"></cpix:HLSSignalingData>
			<cpix:HLSSignalingData playlist="master"></cpix:HLSSignalingData>
			<cpix:ContentProtectionData></cpix:ContentProtectionData>
			<cpix:PSSH></cpix:PSSH>
		</cpix:DRMSystem>
	</cpix:DRMSystemList>
	<cpix:ContentKeyPeriodList>
		<cpix:ContentKeyPeriod id="keyPeriod_0909829f-40ff-4625-90fa-75da3e53278f" index="1" />
	</cpix:ContentKeyPeriodList>
	<cpix:ContentKeyUsageRuleList>
		<cpix:ContentKeyUsageRule kid="11111111-1111-1111-1111-111111111111" intendedTrackType="VIDEO">
			<cpix:KeyPeriodFilter periodId="keyPeriod_0909829f-40ff-4625-90fa-75da3e53278f"/>
			<cpix:VideoFilter />
		</cpix:ContentKeyUsageRule>
	</cpix:ContentKeyUsageRuleList>
</cpix:CPIX>
```

以下响应将 KID 覆盖为 `22222222-2222-2222-2222-222222222222`：

```
<cpix:CPIX contentId="abc123" version="2.3" xmlns:cpix="urn:dashif:org:cpix" xmlns:pskc="urn:ietf:params:xml:ns:keyprov:pskc">
	<cpix:ContentKeyList>
		<cpix:ContentKey explicitIV="OFj2IjCsPJFfMAxmQxLGPw==" kid="22222222-2222-2222-2222-222222222222" commonEncryptionScheme="cbcs">
			<cpix:Data>
				<pskc:Secret>
					<pskc:PlainValue>5dGAgwGuUYu4dHeHtNlxJw==</pskc:PlainValue>
				</pskc:Secret>
			</cpix:Data>
		</cpix:ContentKey>
	</cpix:ContentKeyList>
	<cpix:DRMSystemList>
		<!-- Widevine -->
		<cpix:DRMSystem kid="22222222-2222-2222-2222-222222222222" systemId="edef8ba9-79d6-4ace-a3c8-27dcd51d21ed">
			<cpix:HLSSignalingData playlist="media">Ifa2V5LWl[...]nNB</cpix:HLSSignalingData>
			<cpix:HLSSignalingData playlist="master">oIARIQeSI[...]Nd2l</cpix:HLSSignalingData>
			<cpix:ContentProtectionData>RoNd2lkZXZ[...]Nib</cpix:ContentProtectionData>
			<cpix:PSSH>AAAAanBzc[...]A==</cpix:PSSH>
		</cpix:DRMSystem>
	</cpix:DRMSystemList>
	<cpix:ContentKeyPeriodList>
		<cpix:ContentKeyPeriod id="keyPeriod_0909829f-40ff-4625-90fa-75da3e53278f" index="1" />
	</cpix:ContentKeyPeriodList>
	<cpix:ContentKeyUsageRuleList>
		<cpix:ContentKeyUsageRule kid="22222222-2222-2222-2222-222222222222" intendedTrackType="VIDEO">
			<cpix:KeyPeriodFilter periodId="keyPeriod_0909829f-40ff-4625-90fa-75da3e53278f"/>
			<cpix:VideoFilter />
		</cpix:ContentKeyUsageRule>
	</cpix:ContentKeyUsageRuleList>
</cpix:CPIX>
```