PlayReady 标头规范
1.简介
此规范适用于使用 PlayReady Server SDK、PlayReady 设备移植工具包、Windows、Xbox、Windows Phone和 Silverlight 创建的任何最终产品。
1.1. 更改历史记录
版本 | 更改 |
---|---|
2021 年 9 月 8 日 | 将可选的 LICENSEREQUESTED 属性添加到 PROTECTINFO 节点。 |
2017 年 11 月 1 日 | 添加“语法要求”部分。 修复属性顺序不正确 (属性的多个示例必须按字母顺序) |
2017 年 7 月 12 日 | 从 PlayReady 版本 4 开始,支持添加 PlayReady 标头 4.3.0.0 部分。 添加语法要求,要求所有 XML 节点都必须通过结束标记显式关闭 |
2015 年 4 月 10 日 | 从 PlayReady 版本 3 开始支持添加 PlayReady 标头 4.2.0.0 部分 |
2011 年 9 月 | 从 PlayReady 版本 2 开始支持添加 PlayReady 标头 4.1.0.0 部分 |
2008 年 8 月 | PlayReady 版本 1 中支持 PlayReady 标头 4.0.0.0 的初始版本 |
2. PlayReady 对象 (PRO)
PlayReady 对象 (PRO) 包含以下字段。
字段名称 | 字段类型 | (位大小) | 说明 |
---|---|---|---|
长度 | DWORD | 32 | PlayReady 对象的长度(以字节为单位)。 此值不应超过 15 kb () KB) 。 |
PlayReady 对象记录计数 | WORD | 16 | 指定 PlayReady 对象中的 PlayReady 对象记录数。 |
PlayReady 对象记录 | BYTE 数组 | 多种多样 | 包含一个可变数量的记录,其中包含与许可证和许可证获取相关的信息。 |
2.1 PlayReady 对象记录
PlayReady 对象由名为 PlayReady 对象记录的其他子对象组成。 PlayReady 对象记录包含以下字段。
字段名称 | 字段类型 | (位大小) | 说明 |
---|---|---|---|
记录类型 | WORD | 16 | 指定记录值中存储的数据的类型。 |
记录长度 | WORD | 16 | 指定记录值的大小(以字节为单位)。 |
记录值 | BYTE 数组 | 多种多样 | 对象的内容取决于记录类型的值。 |
“记录类型”字段具有以下值之一。
值类型 | 说明 |
---|---|
0x0001 | 指示记录包含 PlayReady 标头 (PRH) 。 |
0x0002 | 保留。 |
0x0003 | 指示嵌入式许可证Microsoft Store (ELS) 。 |
2.2. PlayReady 对象示例
下图显示了包含 PlayReady 标头的 PlayReady 对象的分段 MP4 文件:
下图显示了此 MP4 文件的 HEX 视图:
3. PlayReady 标头 (PRH)
PlayReady 标头 (PRH) 由客户端用来查找或获取存储内容片段的许可证。 它使用 UTF-16 进行编码。
3.1 版本支持矩阵
PlayReady 标头 v4.3.0.0 | PlayReady 标头 v4.2.0.0 | PlayReady 标头 v4.1.0.0 | PlayReady 标头 v4.0.0.0 | |
---|---|---|---|---|
基于 PlayReady 4.0 SDK 的客户端 (请参阅说明 1) |
✓ | ✓ | ✓ | ✓ |
基于 PlayReady 3.0 SDK 的客户端 (请参阅注释 2) |
✓ | ✓ | ✓ | |
基于 PlayReady 2.x SDK 的客户端 (请参阅注释 3) |
✓ | ✓ | ||
基于 PlayReady 1.x SDK 的客户端 (请参阅注释 4) |
✓ |
注意:
- Xbox One版本 1709 或更高版本是 PlayReady 4.X 客户端。
- Windows 10 (所有版本) 和Xbox One版本 1703 或更高版本都是 PlayReady 3.X 客户端。 最新的非Windows设备 (例如,2017 年之后发布的智能电视) 是 PlayReady 3.X 客户端。
- Silverlight 和 Windows 8,8.1 是 PlayReady 2.X 客户端。 例如,大多数非Windows设备 (2011 年至 2017 年间发布的智能) 电视都是 PlayReady 2.X 客户端。
- 例如,大多数非Windows设备 (,2008 年至 2011 年间发布的智能电视) 是 PlayReady 1.X 客户端。
3.2. 语法要求
3.2.1. 规范化
XML 必须规范化。
3.2.2. 所有节点和属性名称区分大小写
支持
<KID VALUE="PV1LM/VEVk+kEOB8qqcWDg=="> </KID>
不支持
<KID value="PV1LM/VEVk+kEOB8qqcWDg=="> </KID>
<kid VALUE="PV1LM/VEVk+kEOB8qqcWDg=="> </kid>
3.2.3. 结束标记必须是显式的
所有 XML 节点都必须通过结束标记显式关闭,包括 CUSTOMATTRIBUTES 节点内的节点中的那些节点。
支持
<KID VALUE="PV1LM/VEVk+kEOB8qqcWDg=="> </KID>
<CUSTOMATTRIBUTES> <MyNode FooAttribute="Foo"> </MyNode> </CUSTOMATTRIBUTES>
不支持
<KID VALUE="PV1LM/VEVk+kEOB8qqcWDg=="> <CUSTOMATTRIBUTES> <MyNode FooAttribute="Foo"> </CUSTOMATTRIBUTES>
3.2.4. 命名空间属性
所有命名空间属性都必须显示在非命名空间属性之前。
支持
<WRMHEADER xmlns="http://schemas.microsoft.com/DRM/2007/03/PlayReadyHeader" version="4.3.0.0">
不支持
<WRMHEADER version="4.3.0.0" xmlns="http://schemas.microsoft.com/DRM/2007/03/PlayReadyHeader>
3.2.5. 字母顺序
所有属性必须按字母顺序排列,包括 CUSTOMATTRIBUTES 节点内的节点中的属性。
支持
<KID ALGID="AESCBC" VALUE="PV1LM/VEVk+kEOB8qqcWDg=="> </KID>
<CUSTOMATTRIBUTES> <MyNode BarAttribute="Bar" FooAttribute="Foo"> </MyNode> </CUSTOMATTRIBUTES>
不支持
<KID VALUE="PV1LM/VEVk+kEOB8qqcWDg==" ALGID="AESCBC"> </KID>
<CUSTOMATTRIBUTES> <MyNode FooAttribute="Foo" BarAttribute="Bar"> </MyNode> </CUSTOMATTRIBUTES>
3.3. v4.3.0.0
PlayReady Header v4.3.0.0 于 2017 年 9 月引入 PlayReady 版本 4.0,以支持标头中的 AESCBC 密钥。 此支持允许在 CBC 模式下加密内容,尤其是常见加密模式“cbcs”。 它还增加了 PlayReady 客户端与其他 DRM 系统的互操作性,以及现有内容。
3.3.1. 与其他版本的差异
从版本 4.0 开始,PlayReady SDK 和客户端能够处理 PlayReady 标头版本 4.0、4.1、4.2 和 4.3。 版本 4.0 之前的 PlayReady SDK 会在 v4.3 标头提供时返回“不支持的版本”错误。
与 v4.2.0.0 相比,PlayReady 标头格式 v.4.3.0.0 具有以下更改:
- WRMHEADER 元素的版本属性设置为字符串“4.3.0.0”。
- 在许可证获取请求中,位于 KID 元素内的 ALGID 属性可能缺失。 Microsoft 建议 ALGID 属性在内容中包含的标头中具有有效值。
- 当 ALGID 属性存在于任何 KID 元素中并且儿童元素中有多个 KID 元素时,所有 KID 元素都必须包含 ALGID 属性,并且属性值必须相同。
- 除了“AESCTR”外,位于 KID 元素内的 ALGID 属性现在还可以具有值“AESCBC”,前提是:
- 当 ALGID 属性设置为“AESCBC”时,不得包含 CHECKSUM 属性。
3.3.2. 示例
下面是带有 AESCBC 键的 PlayReady 标头 4.3.0.0 的示例:
<WRMHEADER xmlns="http://schemas.microsoft.com/DRM/2007/03/PlayReadyHeader" version="4.3.0.0">
<DATA>
<PROTECTINFO>
<KIDS>
<KID ALGID="AESCBC" VALUE="PV1LM/VEVk+kEOB8qqcWDg=="></KID>
<KID ALGID="AESCBC" VALUE="tuhDoKUN7EyxDPtMRNmhyA=="></KID>
</KIDS>
</PROTECTINFO>
<LA_URL>http://rm.contoso.com/rightsmanager.asmx</LA_URL>
<DS_ID>AH+03juKbUGbHl1V/QIwRA==</DS_ID>
</DATA>
</WRMHEADER>
下面是缺少 ALGID 的 PlayReady 标头 4.3.0.0 的示例:
<WRMHEADER xmlns="http://schemas.microsoft.com/DRM/2007/03/PlayReadyHeader" version="4.3.0.0">
<DATA>
<PROTECTINFO>
<KIDS>
<KID VALUE="PV1LM/VEVk+kEOB8qqcWDg=="></KID>
</KIDS>
</PROTECTINFO>
<LA_URL>http://rm.contoso.com/rightsmanager.asmx</LA_URL>
<DS_ID>AH+03juKbUGbHl1V/QIwRA==</DS_ID>
<DECRYPTORSETUP>ONDEMAND</DECRYPTORSETUP>
</DATA>
</WRMHEADER>
3.3.3. 格式
PlayReady 标头 v4.3.0.0 具有以下语法:
<WRMHEADER xmlns="http://schemas.microsoft.com/DRM/2007/03/PlayReadyHeader" version="4.3.0.0">
<DATA>
<PROTECTINFO LICENSEREQUESTED="true">
<KIDS>
<KID ALGID="value" CHECKSUM="base64-encoded value" VALUE="base64-encoded guid"></KID>
<KID ALGID="value" CHECKSUM="base64-encoded value" VALUE="base64-encoded guid"></KID>
<KID ALGID="value" CHECKSUM="base64-encoded value" VALUE="base64-encoded guid"></KID>
</KIDS>
</PROTECTINFO>
<LA_URL> URL for license acquisition </LA_URL>
<LUI_URL>
URL for Non-silent license acquisition web page
</LUI_URL>
<DS_ID> base64-encoded guid </DS_ID>
<CUSTOMATTRIBUTES xmlns="">
<mm:Publisher xmlns:mm="urn:schema-musicmogul-com">
<mm:Author>
Elvis Presley
</mm:Author>
<mm:CreationDate>
2007/08/21:12:00:00
</mm:CreationDate>
</mm:Publisher>
</CUSTOMATTRIBUTES>
<DECRYPTORSETUP>ONDEMAND</DECRYPTORSETUP>
</DATA>
</WRMHEADER>
下面介绍了这些标记。
标记名称 | 必须 | 说明 |
---|---|---|
WRMHEADER | 是 | 标头对象的最外部元素。 它可以包含一个 DATA 元素,并且必须包含一个版本属性。 标头的版本为“4.3.0.0”。 每当 Microsoft 定义新的强制标记或属性时,新版本号都会与这些标记或属性相关联。 如果版本大于写入客户端代码的版本,则客户端代码必须失败,因为这意味着标头包含客户端无法理解的强制标记。 如果版本小于或等于写入客户端代码的版本,则客户端代码可以安全地跳过它不理解的任何标记或属性。 |
DATA | 否 | 标头数据的容器元素,包括第三方标记。 WRMHEADER 元素中不能包含多个 DATA 元素。 |
PROTECTINFO | 否 | 指定零个或一个 KIDS 元素。 DATA 元素中不能包含多个 PROTECTINFO 元素。 (可选)包括 LICENSEREQUESTED 属性。 |
LICENSEREQUESTED | 否 | 指定许可证获取是否请求至少一个许可证。 如果存在,则必须设置为“true”或“false”,如果不存在,则假定设置为“true”。 在 4.5 之前,PlayReady 版本忽略此属性。 PlayReady Server SDK 应用程序可以随意忽略此属性;它只是信息性的。 |
孩子 | 否 | 指定可用于创建关联内容的解密器对象的一个或多个 KID 元素。 PROTECTINFO 节点下可能存在一个或零个 KIDS 元素。 |
孩子 | 否 | 包含给定许可证的所有密钥数据。 如果 KIDS 节点存在,则一个或多个 KID 元素必须存在于 KIDS 节点下。
KID 元素包含以下属性。 ALGID:可选。 指定加密算法。 可以设置为:“AESCTR”、“AESCBC”或“鸡尾酒”。 CHECKSUM:可选。 仅适用于 AESCTR 密钥。 包含使用 KID VALUE 属性和内容键计算的校验和。 有关详细信息,请参阅本文档的 “密钥校验和算法 ”部分。 如果 WRMHeader XML 中存在此节点,则其数据值必须为空。 值:必需。 包含 base64 编码的密钥 ID GUID 值。 请注意,此 GUID (DWORD、WORD、WORD、8 字节数组) 值必须是小字节字节顺序。 |
LA_URL | 否 | 包含许可证获取 Web 服务的 URL。 仅允许绝对 URL。 DATA 元素中不能包含多个LA_URL元素。 如果 WRMHeader XML 中存在此节点,则其数据值不得为空。 |
LUI_URL | 否 | 包含非无提示许可证获取网页的 URL。 仅允许绝对 URL。 DATA 元素中不能包含多个LUI_URL元素。 如果 WRMHeader XML 中存在此节点,则其数据值不得为空。 |
DS_ID | 否 | 域服务的服务 ID。 DATA 元素中最多只能包含一个DS_ID元素。 如果 WRMHeader XML 中存在此节点,则其数据值不得为空。 |
CUSTOMATTRIBUTES | 否 | 内容作者可以在此元素中添加自定义 XML。 Microsoft 代码不处理此元素中包含的任何数据。
DATA 元素中不能包含多个 CUSTOMATTRIBUTES 元素。 如果 WRMHeader XML 中存在此节点,则其数据值不得为空。 |
DECRYPTORSETUP | 否 | 此标记只能包含值“ONDEMAND”。 当 数据 节点中存在此标记并且其值设置为“ONDEMAND”时,它会向应用程序指示,它不应期望内容的完整许可证链可供获取或在客户端计算机上存在,然后再设置媒体图。 如果未设置此标记,则表示应用程序可以在设置媒体图之前强制实施要获取的许可证,或已在客户端计算机上存在许可证。 DATA 元素中不能包含多个 DECRYPTORSETUP 元素。 |
3.4. v4.2.0.0
PlayReady Header v4.2.0.0 在 2015 年 4 月的 PlayReady 版本 3.0 中引入,以允许单个标头中的多个 KID。 这意味着可以使用多个密钥来加密单个资产,例如,当必须使用不同于视频曲目的密钥加密音频曲目时。
3.4.1. 与其他版本的差异
PlayReady 3.0 SDK 及更高版本的客户端能够处理 v4.0、v4.1 和 v4.2 PlayReady 标头版本。 在 v4.2 标头提供时,以前的 PlayReady SDK 返回“不支持的版本”错误。 使用 v4.2 标头时,客户端必须知道它通过自定义特定于应用的机制使用哪个服务器版本。 PlayReady SDK 不提供获取此版本信息的本机方法。
与 v4.1.0.0 相比,PlayReady 标头格式 v.4.2.0.0 具有以下更改:
- WRMHEADER 元素的版本属性设置为字符串“4.2.0.0”。
- PROTECTINFO 元素内的 KID 元素已重命名为 KIDS,但仍是可选的。
- 多个 KID 元素位于 KIDS 元素内部。
3.4.2. 示例
具有两个 AESCTR 键的 PlayReady 标头 4.2.0.0:
<WRMHEADER xmlns="http://schemas.microsoft.com/DRM/2007/03/PlayReadyHeader" version="4.2.0.0">
<DATA>
<PROTECTINFO>
<KIDS>
<KID ALGID="AESCTR" CHECKSUM="xNvWVxoWk04=" VALUE="0IbHou/5s0yzM80yOkKEpQ=="></KID>
<KID ALGID="AESCTR" CHECKSUM="GnKaQIRacPU=" VALUE="/qgG2xbs4k2SKCxx6bhWqw=="></KID>
</KIDS>
</PROTECTINFO>
<LA_URL>http://rm.contoso.com/rightsmanager.asmx</LA_URL>
<DS_ID>AH+03juKbUGbHl1V/QIwRA==</DS_ID>
</DATA>
</WRMHEADER>
3.4.3. 格式
PlayReady 标头 v4.2.0.0 具有以下语法:
<WRMHEADER xmlns="http://schemas.microsoft.com/DRM/2007/03/PlayReadyHeader" version="4.2.0.0">
<DATA>
<PROTECTINFO>
<KIDS>
<KID ALGID="AESCTR" CHECKSUM="base64-encoded value" VALUE="base64-encoded guid"></KID>
<KID ALGID="AESCTR" CHECKSUM="base64-encoded value" VALUE="base64-encoded guid"></KID>
<KID ALGID="AESCTR" CHECKSUM="base64-encoded value" VALUE="base64-encoded guid"></KID>
</KIDS>
</PROTECTINFO>
<LA_URL> URL for license acquisition </LA_URL>
<LUI_URL>
URL for Non-silent license acquisition web page
</LUI_URL>
<DS_ID> base64-encoded guid </DS_ID>
<CUSTOMATTRIBUTES xmlns="">
<mm:Publisher xmlns:mm="urn:schema-musicmogul-com">
<mm:Author>
Elvis Presley
</mm:Author>
<mm:CreationDate>
2007/08/21:12:00:00
</mm:CreationDate>
</mm:Publisher>
</CUSTOMATTRIBUTES>
<DECRYPTORSETUP>ONDEMAND</DECRYPTORSETUP>
</DATA>
</WRMHEADER>
下面介绍了这些标记。
标记名称 | 必须 | 说明 |
---|---|---|
WRMHEADER | 是 | 标头对象的最外层元素。 它可以包含一个 DATA 元素,并且必须包含一个版本属性。 标头的版本为“4.2.0.0”。 每当 Microsoft 定义新的强制标记或属性时,新的版本号都会与这些标记或属性相关联。 如果版本大于写入客户端代码的版本,则客户端代码必须失败,因为它意味着标头包含客户端无法理解的强制标记。 如果版本小于或等于编写客户端代码的版本,则客户端代码可以安全地跳过它无法理解的任何标记或属性。 |
DATA | 否 | 标头数据的容器元素,包括第三方标记。 WRMHEADER 元素中最多只能包含一个 DATA 元素。 |
PROTECTINFO | 否 | 指定零个或一个 KIDS 元素。 DATA 元素中不能包含多个 PROTECTINFO 元素。 |
孩子 | 否 | 指定可用于为关联内容创建解密器对象的一个或多个 KID 元素。 PROTECTINFO 节点下可能存在一个或零个 KIDS 元素。 |
孩子 | 否 | 包含给定许可证的所有密钥数据。 如果存在 KIDS 节点,则必须在 KIDS 节点下存在一个或多个 KID 元素。
KID 元素包含以下属性。 ALGID:必需。 指定加密算法。 必须设置为:AESCTR 或鸡尾酒 校验和:可选。 包含使用 KID VALUE 和内容密钥计算的校验和。 有关详细信息,请参阅本文档的 密钥校验和算法 部分。 如果 WRMHeader XML 中存在此节点,则其数据值必须为空。 值:必需。 包含 base64 编码的密钥 ID GUID 值。 请注意,此 GUID (DWORD、WORD、WORD、8 字节数组) 值必须很少是尾字节顺序。 |
LA_URL | 否 | 包含许可证获取 Web 服务的 URL。 仅允许绝对 URL。 DATA 元素中不能包含多个LA_URL元素。 如果 WRMHeader XML 中存在此节点,则其数据值不得为空。 |
LUI_URL | 否 | 包含非无提示许可证获取网页的 URL。 仅允许绝对 URL。 DATA 元素中不能包含多个LUI_URL元素。 如果 WRMHeader XML 中存在此节点,则其数据值不得为空。 |
DS_ID | 否 | 域服务的服务 ID。 DATA 元素中不能包含多个DS_ID元素。 如果 WRMHeader XML 中存在此节点,则其数据值不得为空。 |
CUSTOMATTRIBUTES | 否 | 内容作者可以在此元素中添加任意 XML。 Microsoft 代码不处理此元素中包含的任何数据。
DATA 元素中不能包含多个 CUSTOMATTRIBUTES 元素。 如果 WRMHeader XML 中存在此节点,则其数据值不得为空。 |
DECRYPTORSETUP | 否 | 此标记只能包含值“ONDEMAND”。 当 数据 节点中存在此标记并且其值设置为“ONDEMAND”时,它会向应用程序指示,它不应期望内容的完整许可证链可供获取或在客户端计算机上存在,然后再设置媒体图。 如果未设置此标记,则表示应用程序可以在设置媒体图之前强制实施要获取的许可证,或已在客户端计算机上存在许可证。 DATA 元素中不能包含多个 DECRYPTORSETUP 元素。 |
3.5. v4.1.0.0
PlayReady Header v4.1.0.0 在 2011 年 9 月推出 PlayReady 版本 2.0,以支持嵌入在流中的可缩放叶许可证的实时线性流。 这种类型的流要求客户端绑定可缩放的根许可证,而不知道将在解密器中使用的内容加密密钥。
3.5.1. 与其他版本的差异
PlayReady 2.0 SDK 及更高版本的客户端能够处理 v4.0 和 v4.1 PlayReady 标头版本。 在 v4.1 标头提供时,以前的 PlayReady SDK 返回“不支持的版本”错误。
与 v4.0.0.0 相比,PlayReady 标头格式 v.4.1.0.0 具有以下更改:
- WRMHEADER 元素的版本属性设置为字符串“4.1.0.0”。
- DATA 元素包含可选的 DECRYPTORSETUP 元素。
- KID 元素位于 PROTECTINFO 元素内部,是可选的,而不是必需元素。
- KID 元素包含 ALGID (所需的属性) 、CHECKSUM (可选) 和 VALUE (所需的) 。
- KEYLEN 元素已被删除。 KEYLEN 属性以前用于消除具有不同长度密钥的鸡尾酒许可证。 v4.1 标头将打破支持除 8 字节鸡尾酒键之外的任何功能。 如果使用非 8 字节的鸡尾酒键,则必须使用 v4.0 标头。
- ALGID 和 CHECKSUM 元素已被删除,因为它们的数据包含在 KID 元素的属性中。
3.5.2. 格式
PlayReady 标头 v4.1.0.0 具有以下语法:
<WRMHEADER xmlns="http://schemas.microsoft.com/DRM/2007/03/PlayReadyHeader" version="4.1.0.0">
<DATA>
<PROTECTINFO>
<KID ALGID="AESCTR" CHECKSUM="base64-encoded value" VALUE="base64-encoded guid"></KID>
</PROTECTINFO>
<LA_URL> URL for license acquisition </LA_URL>
<LUI_URL>
URL for Non-silent license acquisition web page
</LUI_URL>
<DS_ID> base64-encoded guid </DS_ID>
<CUSTOMATTRIBUTES xmlns="">
<mm:Publisher xmlns:mm="urn:schema-musicmogul-com">
<mm:Author>
Elvis Presley
</mm:Author>
<mm:CreationDate>
2007/08/21:12:00:00
</mm:CreationDate>
</mm:Publisher>
</CUSTOMATTRIBUTES>
<DECRYPTORSETUP>ONDEMAND</DECRYPTORSETUP>
</DATA>
</WRMHEADER>
下面介绍了这些标记。
标记名称 | 必须 | 说明 |
---|---|---|
WRMHEADER | 是 | 标头对象的最外层元素。 它可以包含一个 DATA 元素,并且必须包含一个版本属性。 标头的版本为“4.1.0.0”。 每当 Microsoft 定义新的强制标记或属性时,新的版本号都会与这些标记或属性相关联。 如果版本大于写入客户端代码的版本,则客户端代码必须失败,因为它意味着标头包含客户端无法理解的强制标记。 如果版本小于或等于编写客户端代码的版本,则客户端代码可以安全地跳过它无法理解的任何标记或属性。 |
DATA | 否 | 标头数据的容器元素,包括第三方标记。 WRMHEADER 元素中不能包含多个 DATA 元素。 |
PROTECTINFO | 否 | 指定可用于为关联内容创建解密器对象的零个或一个 KID 元素。 DATA 元素中不能包含多个 PROTECTINFO 元素。 |
孩子 | 否 | 包含给定许可证的所有密钥数据。
PROTECTINFO 节点下可能存在一个或零 KID 元素。
KID 元素包含以下属性。 值:必需。 包含 base64 编码的密钥 ID GUID 值。 请注意,此 GUID (DWORD、WORD、WORD、8 字节数组) 值必须是小尾字节顺序。 ALGID:必需。 指定加密算法。 必须设置为:“AESCTR”或“COCKTAIL” CHECKSUM:可选。 包含使用 KID VALUE 和内容密钥计算的校验和。 有关详细信息,请参阅本文档的 密钥校验和算法 部分。 如果 WRMHeader XML 中存在此节点,则其数据值必须为空。 |
LA_URL | 否 | 包含许可证获取 Web 服务的 URL。 仅允许绝对 URL。 DATA 元素中不能包含多个LA_URL元素。 如果 WRMHeader XML 中存在此节点,则其数据值不得为空。 |
LUI_URL | 否 | 包含非无提示许可证获取网页的 URL。 仅允许绝对 URL。 DATA 元素中不能包含多个LUI_URL元素。 如果 WRMHeader XML 中存在此节点,则其数据值不得为空。 |
DS_ID | 否 | 域服务的服务 ID。 DATA 元素中不能包含多个DS_ID元素。 如果 WRMHeader XML 中存在此节点,则其数据值不得为空。 |
CUSTOMATTRIBUTES | 否 | 内容作者可以在此元素中添加任意 XML。 Microsoft 代码不处理此元素中包含的任何数据。 DATA 元素中最多只能包含一个 CUSTOMATTRIBUTES 元素。 如果 WRMHeader XML 中存在此节点,则其数据值不得为空。 |
DECRYPTORSETUP | 否 | 此标记只能包含值“ONDEMAND”。 当 DATA 节点中存在的此标记及其值设置为“ONDEMAND”时,它会向应用程序指示,在设置媒体图之前,它不应期望内容的完整许可证链可供获取或已存在于客户端计算机上。 如果未设置此标记,则表示应用程序可以在设置媒体图之前强制实施要获取的许可证,或已在客户端计算机上存在许可证。 DATA 元素中最多只能包含一个 DECRYPTORSETUP 元素。 |
v4.1 的说明:
- PlayReady 标头中的所有 XML 标记和属性均由 Microsoft 定义。 唯一的例外是 CUSTOMATTRIBUTES 元素的内容。 PlayReady PC 应用程序开发人员不得在 CUSTOMATTRIBUTES 元素之外添加任何自定义标记。
- PlayReady 标头应遵守 W3C 规范 XML v1.1 规范。
- PlayReady 标头不包含格式正确的 XML 中所需的顶级
?XML
标记。 - 建议此字段的大小不应超过 1 KB。
3.6. v4.0.0.0
PlayReady Header v4.0.0.0 在 2008 年通过 PlayReady 版本 1.0 引入,并允许单个 AESCTR 密钥支持 AES 加密内容,或支持 WMDRM 加密内容的 COCKTAIL 密钥。
3.6.1. 示例
PlayReady 标头 4.0.0.0
<WRMHEADER xmlns="http://schemas.microsoft.com/DRM/2007/03/PlayReadyHeader" version="4.0.0.0">
<DATA>
<PROTECTINFO>
<ALGID>AESCTR</ALGID>
<KEYLEN>16</KEYLEN>
</PROTECTINFO>
<KID>q5HgCTj40kGeNVhTH9Gexw==</KID>
<CHECKSUM>w+OZVr8vzrQ=</CHECKSUM>
<LA_URL>http://rm.contoso.com/rightsmanager.asmx</LA_URL>
<CUSTOMATTRIBUTES>
<IIS_DRM_VERSION>8.0.1705.19</IIS_DRM_VERSION>
</CUSTOMATTRIBUTES>
</DATA>
</WRMHEADER>
Base64 编码的 PlayReady 对象,其中包含 PlayReady 标头 4.0.0.0
XAMAAAEAAQBSAzwAVwBSAE0ASABFAEEARABFAFIAIAB4AG0AbABuAHMAPQAiAGgAdAB0AHAAOgAvAC8AcwBjAGgAZQBtAGEAcwAuAG0AaQBjAHIAbwBzAG8AZgB0AC4AYwBvAG0ALwBEAFIATQAvADIAMAAwADcALwAwADMALwBQAGwAYQB5AFIAZQBhAGQAeQBIAGUAYQBkAGUAcgAiACAAdgBlAHIAcwBpAG8AbgA9ACIANAAuADAALgAwAC4AMAAiAD4APABEAEEAVABBAD4APABQAFIATwBUAEUAQwBUAEkATgBGAE8APgA8AEsARQBZAEwARQBOAD4AMQA2ADwALwBLAEUAWQBMAEUATgA+ADwAQQBMAEcASQBEAD4AQQBFAFMAQwBUAFIAPAAvAEEATABHAEkARAA+ADwALwBQAFIATwBUAEUAQwBUAEkATgBGAE8APgA8AEsASQBEAD4AcQA1AEgAZwBDAFQAagA0ADAAawBHAGUATgBWAGgAVABIADkARwBlAHgAdwA9AD0APAAvAEsASQBEAD4APABDAEgARQBDAEsAUwBVAE0APgB3ACsATwBaAFYAcgA4AHYAegByAFEAPQA8AC8AQwBIAEUAQwBLAFMAVQBNAD4APABMAEEAXwBVAFIATAA+AGgAdAB0AHAAcwA6AC8ALwBwAHIAbwBmAGYAaQBjAGkAYQBsAHMAaQB0AGUALgBrAGUAeQBkAGUAbABpAHYAZQByAHkALgBtAGUAZABpAGEAcwBlAHIAdgBpAGMAZQBzAC4AdwBpAG4AZABvAHcAcwAuAG4AZQB0AC8AUABsAGEAeQBSAGUAYQBkAHkALwA8AC8ATABBAF8AVQBSAEwAPgA8AEMAVQBTAFQATwBNAEEAVABUAFIASQBCAFUAVABFAFMAPgA8AEkASQBTAF8ARABSAE0AXwBWAEUAUgBTAEkATwBOAD4AOAAuADAALgAxADcAMAA1AC4AMQA5ADwALwBJAEkAUwBfAEQAUgBNAF8AVgBFAFIAUwBJAE8ATgA+ADwALwBDAFUAUwBUAE8ATQBBAFQAFQAVABSAEkAQgBVAFQARQBTAD4APAAvAEQAQQBUAEEAPgA8AC8AVwBSAE0ASABFAEEARABFAFIAPgA=
3.6.2. 格式
PlayReady 标头 v4.0.0.0 具有以下语法:
<WRMHEADER xmlns="http://schemas.microsoft.com/DRM/2007/03/PlayReadyHeader" version="4.0.0.0">
<DATA>
<PROTECTINFO>
<ALGID>AESCTR</ALGID>
<KEYLEN>16</KEYLEN>
</PROTECTINFO>
<LA_URL> URL for license acquisition </LA_URL>
<LUI_URL>
URL for Non-silent license acquisition web page
</LUI_URL>
<DS_ID>base64-encoded guid</DS_ID>
<KID>base64-encoded kid</KID>
<CUSTOMATTRIBUTES xmlns="">
<mm:Publisher xmlns:mm="urn:schema-musicmogul-com">
<mm:Author>
Elvis Presley
</mm:Author>
<mm:CreationDate>
2007/08/21:12:00:00
</mm:CreationDate>
</mm:Publisher>
</CUSTOMATTRIBUTES>
<CHECKSUM>
checksum of the content key for verification
</CHECKSUM>
</DATA>
</WRMHEADER>
下表描述了不同的标记。
标记名称 | 必须 | 说明 |
---|---|---|
WRMHEADER | 是 | 标头对象的最外部元素。 它可以包含一个 DATA 元素和一个版本属性。 标头的版本为“4.0.0.0”。 packager 的语义: 每当 Microsoft 定义新的强制标记或属性时,新版本号都与这些标记或属性相关联。 PlayReady 标头的版本必须设置为标头中存在的必需标记和属性的最高版本。 Client 的语义: 如果版本大于写入客户端代码的版本,则客户端代码必须失败,因为它意味着标头包含客户端无法理解的必需标记。 如果版本小于或等于为其编写客户端代码的版本,则客户端代码可以安全地跳过它无法理解的任何标记或属性。 |
DATA | 是 | 标头数据的容器元素,包括第三方标记。 |
PROTECTINFO | 是 | 使用 KEYLEN 和 ALGID 子元素指定加密的类型。 |
KEYLEN | 是 | 指定内容键的大小。 如果 ALGID 设置为“AESCTR”,并且 如果 ALGID 设置为“COCKTAIL”,则必须设置为 16。 |
ALGID | 是 | 指定加密算法。 必须设置为以下值:AESCTR: 对应于计数器模式下的 AES 算法。 鸡尾酒:对应于鸡尾酒算法。 |
孩子 | 是 | 包含 base64 编码的密钥 ID GUID 值。 请注意,此 GUID (DWORD、WORD、WORD、8 字节数组) 值必须是小字节字节顺序。 |
CHECKSUM | 否 | 包含使用 KID VALUE 和内容密钥计算的校验和。 有关详细信息,请参阅 “密钥校验和算法 ”部分。 以前版本的 PlayReady 将此字段视为必需,因此它应包含在要由旧版 PlayReady 使用的任何标头中。 |
LA_URL | 否 | 包含许可证获取 Web 服务的 URL。 仅允许绝对 URL。 |
LUI_URL | 否 | 包含非无提示许可证获取网页的 URL。 仅允许绝对 URL。 |
DS_ID | 否 | 域服务的服务 ID。 |
CUSTOMATTRIBUTES | 否 | 内容作者可以在此元素中添加任意 XML。 Microsoft 代码不处理此元素中包含的任何数据。 |
v4.0 的说明:
- PlayReady 标头中的所有 XML 标记和属性均由 Microsoft 定义。 唯一的例外是 CUSTOMATTRIBUTES 元素的内容。 PlayReady PC 应用程序开发人员不得在 CUSTOMATTRIBUTES 元素之外添加任何自定义标记,因为这样做可能与 Microsoft 定义的未来标记冲突。
- 容器元素中子元素的顺序并不重要。
- 请注意,PlayReady 标头不包含格式良好的 XML 中所需的顶级
?XML
标记。 - 建议此字段的大小不应超过 1 KB。
- PlayReady Server SDK 需要 1.2 版的 CHECKSUM。 自版本 1.5 起,PlayReady Server SDK 将 CHECKSUM 视为可选。 PlayReady 移植工具包 1.2 现出需要 CHECKSUM。 PlayReady 移植工具包 2.0 将 CHECKSUM 视为可选。
4. 嵌入式许可证Microsoft Store (ELS)
最好在以下条件下将空嵌入式许可证Microsoft Store添加到 PlayReady 对象:
- PlayReady 对象将插入到内容文件中。
- 内容可用于具有嵌入许可证的 PlayReady 域的上下文中。
这样,PlayReady 客户端只需填充现有的嵌入式许可证Microsoft Store即可进一步嵌入 PlayReady 对象中的域绑定许可证,并节省使用比初始许可证更大的新 PlayReady 对象重新标头整个文件的努力。
注意
请勿在 PlayReady 对象中包含空嵌入式许可证Microsoft Store,目的是在平滑流式处理客户端清单中作为 base-64 字符串插入。
注意
建议的大小为 10KB。
5. 密钥校验和算法
PlayReady 标头中的校验和算法旨在防范不匹配的密钥。 在 DRM 的早期,歌曲使用错误标记的密钥进行加密。 这导致在解密歌曲时播放白噪音。 如果歌曲播放得足够响亮,播放设备被摧毁。 通过校验和,内容密钥可以验证为用于加密文件的密钥。 算法的工作原理如下:
对于设置为“AESCBC”的 ALGID 值,未定义密钥校验和算法。 必须省略 CHECKSUM 属性。
对于设置为“AESCTR”的 ALGID 值,16 字节密钥 ID 使用 ECB 模式的 16 字节 AES 内容密钥进行加密。 提取缓冲区的前 8 个字节,并进行了 base64 编码。
对于设置为“COCKTAIL”的 ALGID 值,请执行以下步骤:
创建 21 字节缓冲区。
内容键放入缓冲区中,其余缓冲区填充为零。
对于五次迭代:
a. buffer = SHA-1 (缓冲区) 。
提取缓冲区的前 7 个字节,并对其进行 base64 编码。
执行这些步骤后,base64 编码的字节将用作校验和。
6. CUSTOMATTRIBUTES
服务提供商可以在 PlayReady 标头的 CUSTOMATTRIBUTES 元素中添加专有 XML。 保证 CUSTOMATTRIBUTES 元素中使用的任何标记不会与 Microsoft 定义的将来标记冲突。
Microsoft 代码不对此元素中的任何 XML 执行操作。 服务提供商的后端或其客户端代码是唯一解释此元素值的人。 例如,假设一个白色标签服务表示前端服务 AAA、BBB、CCC。 此类服务只能加密其内容库一次 (,因为这是一项昂贵的操作) ,但是当它向最终用户提供内容时,可以将 CUSTOMATTRIBUTES 设置为最终用户订阅的特定前端服务的名称。 当最终用户请求该内容的许可证时,这使白标签服务能够确定最终用户订阅的前端服务,以便它可以颁发不同的许可证。
此字段的大小不应超过 1 千字节 (KB) 。