

本文為英文版的機器翻譯版本，如內容有任何歧義或不一致之處，概以英文版為準。

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

加密合約會根據軌跡特性，定義哪些內容金鑰正在保護指定串流集中的追蹤。

雖然 是建議的業界最佳實務，但在串流集中對不同音軌使用多個內容金鑰並非強制性，但建議使用 - 至少兩個不同的內容金鑰，一個用於音訊音軌，另一個用於視訊音軌。可以使用單一內容金鑰來加密多個軌道，但需要在加密程式傳送至金鑰提供者的 CPIX 文件中明確發出訊號。一般而言，加密程式一律準確描述需要多少內容金鑰，以及如何利用這些金鑰來加密各種媒體軌。

**原則**  
加密合約位於 CPIX 文件的 `<cpix:ContentKeyUsageRuleList>`區段。在本節中， `<cpix:ContentKeyList>` 區段中定義的每個內容金鑰對應至特定`<cpix:ContentKeyUsageRule>`元素，其中應包含：
+ 可以參考一或多個子元件的`ContentKeyUsageRule@intendedTrackType`屬性，如果使用多個子元件，則以「＋」符號分隔。的值`ContentKeyUsageRule@intendedTrackType`在加密合約中應是唯一的，不能用於多個`ContentKeyUsageRule`元素。
+ 一或多個 `<cpix:AudioFilter>` 或 `<cpix:VideoFilter>` 子元素，取決於`ContentKeyUsageRule@intendedTrackType`屬性的值。

管理此關係的規則如下：
+ 當串流集的所有音訊和視訊軌都需要使用唯一的內容金鑰保護時，`'ALL'`必須使用字串做為`ContentKeyUsageRule@intendedTrackType`屬性值。範例 1 顯示這類使用案例。在這種情況下，應同時包含不含任何屬性的 `<cpix:AudioFilter />`和`<cpix:VideoFilter />`子元素。`<cpix:AudioFilter>` 和/或 `<cpix:VideoFilter>` 元素的任何其他組合在此特定內容中無效。
+ 對於所有其他使用案例，可以自由定義`ContentKeyUsageRule@intendedTrackType`屬性的值，且 `<cpix:AudioFilter />`和`<cpix:VideoFilter />`子元素的數量必須對應至透過 '\+' 符號彙總的子元件數量。當`ContentKeyUsageRule@intendedTrackType`屬性值中存在單一子元件時，範例 2/3/4/5/6/7/9/10 會說明此需求。範例 8 會在使用多個子元件時加以說明：由具有不同屬性值的兩個不同`<cpix:VideoFilter>`子元素`ContentKeyUsageRule@intendedTrackType="SD+HD"`描述，而由具有不同屬性值的三個不同`<cpix:VideoFilter>`子元素`ContentKeyUsageRule@intendedTrackType="HDR+HFR+UHD"`描述。

**篩選條件**  
CPIX 定義多個篩選元素和屬性，但 SPEKE 僅支援其中一部分。下表摘要說明這些差異：


| CPIX 篩選條件類型 | 整體 SPEKE 支援 | SPEKE 支援的篩選條件屬性 | SPEKE 不支援篩選條件屬性 | 
| --- | --- | --- | --- | 
| <cpix：VideoFilter> | 是 | minPixels、maxPixels、hdr、minFps、maxFps （選用屬性） | wcg | 
| <cpix：AudioFilter> | 是 | minChannels、maxChannels （選用屬性） |  | 
| <cpix：KeyPeriodFilter> | 是 | periodId （必要屬性） |  | 
| <cpix：BitrateFilter> | 否 | N/A | N/A | 
| <cpix：LabelFilter> | 否 | N/A | N/A | 

根據 VideoFilter 的 CPIX 規格，【minPixels， maxPixels】 是兩個維度中的所有包含範圍，而 (minFps， maxFps】 僅包含 maxFps 維度。對於 AudioFilter，【minChannels， maxChannels】 是兩個維度中的包含範圍。

**有問題的情況**  
在某些情況下，加密合約中提供的資訊可能是部分、不明確或錯誤。在這些情況下，加密程式和金鑰提供者的行為必須適當，並保證對內容提供適當的保護。下表顯示在這些情況下的建議行為：


| 在這種情況下 | 加密程式應該/應... | 金鑰提供者應該/應... | 
| --- | --- | --- | 
| 沒有規則適用於串流集中的一或多個音軌 （請參閱下面的範例 3) | 加密程式應查看其組態 (CPIX 承載外部），並確認相關軌道不需要加密。如果不是預期，加密程式應該擲回錯誤並停止處理。 |  *不相關：金鑰提供者不了解串流集結構。* | 
| 多個規則重疊，並建議多個內容金鑰來加密特定軌道 | 加密程式應該按照文件的順序套用最後一個成功評估的 ContentKeyUsageRule。 |  *不相關：金鑰提供者不了解串流集結構。* | 
| 加密合約會在單一 SPEKE 請求/回應週期中變更 | 加密程式應引發例外狀況並停止處理，因為金鑰提供者不負責定義加密合約。 | 為避免這種情況發生，金鑰提供者不得修改 SPEKE 請求的 CPIX 承載中收到的加密合約。 | 
| 格式錯誤的加密合約：intendedTrackType/Filters 基數限制例外狀況、不支援的篩選條件或屬性 | 加密程式應引發例外狀況、停止處理，且不會將 SPEKE 請求傳送至金鑰提供者，因為這很可能會導致內容保護錯誤，或使某些軌跡未受保護。 | 金鑰提供者應引發例外狀況，並傳回「格式化加密合約」錯誤。 | 
| 格式良好的加密合約，但違反 DRM 安全層級限制：例如，請求單一內容金鑰來保護音訊音軌和 UHD 視訊音軌 | 如果加密程式了解 DRM 安全層級限制，應該引發例外狀況、停止處理，而且不會將 SPEKE 請求傳送給金鑰提供者，因為這很可能會導致內容保護錯誤。 | 金鑰提供者應引發例外狀況，並傳回「不支援請求的 CPIX 加密合約」錯誤。 | 
| 缺少加密合約 | 加密程式不應傳送不包含任何 VideoFilter 或 AudioFilter 元素的 CPIX 文件。 | 金鑰提供者應引發例外狀況，並傳回「缺少 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>
```