PlayReady 版本 4.5 中的新增功能
此页面概述 PlayReady 版本 4.4 和 PlayReady 版本 4.5 之间的最重大更改。
PlayReady 版本 4.5 中的常规更改
使用 PlayReady 服务器部署证书进行质询加密
在早期版本的 PlayReady 中,许可证获取和其他客户端质询始终使用固定公钥进行隐私加密。 从 PlayReady 4.5 开始,编码为仅与支持服务器通信的客户端可能会改为使用 Microsoft 颁发的 PlayReady 服务器部署证书隐私加密质询。 然后,PlayReady Server SDK 使用相应的私钥解密质询,由 PlayReady Server SDK 应用程序传递,而不是固定私钥。
许可证服务器时间
在早期版本的 PlayReady 中,使用安全时间功能通常需要客户端应用程序与单独的安全时间服务器通信,以获取用于设置其本地时钟的时间。 从 PlayReady 4.5 开始,编码为仅与支持服务器通信的客户端可能会在获取许可证期间使用 PlayReady Server SDK 提供的时间。 有关详细信息,请参阅 PlayReady 受信任的时钟。
密钥交换
使用许可证获取协议,PlayReady 客户端和服务器现在可以交换可用于加密、解密、签名和验证使用 PlayReady 保护密钥本身的任意应用程序提供的数据。 当客户端为 SL3000 时,密钥本身受受信任的执行环境保护。 有关详细信息,请参阅 PlayReady 密钥Exchange。
水印策略
添加了功能以简化使用 PlayReady 符合性规则定义的水印信号显式数字视频输出限制。
PlayReady Server SDK 版本 4.5 中的更改
常规服务器更改
密钥Exchange许可证可用于在获取许可证期间向客户端提供任意密钥。
如果客户端提供,则支持的水印技术将公开给 PlayReady Server SDK 应用程序。 这简化了使用 PlayReady 符合性规则定义的水印信号显式数字视频输出限制。
服务器 API 文档更改
已为 PlayReady Server SDK 的 .NET Standard 版本创建新的服务器 API 文档并发布。 Microsoft 建议迁移到 .NET Standard SDK。
PlayReady.chm 文件中包含的 PlayReady.chm 文件中的服务器 API 文档仅适用于 PlayReady Server SDK 的旧版.NET Framework版本。 本文档现在被视为已弃用,自 PlayReady 4.0 起尚未更新,并且不会收到将来的更新。
两个 SDK 中的大多数 API 都是相同的,因此 .NET Standard 文档应该足以满足大多数目的。 但是,类、接口和方法存在一些重大差异。
下面是两个 SDK 之间的一般差异。
.NET Standard SDK 在许多位置使用接口,.NET Framework SDK 使用类。
应用程序实现的 .NET Standard SDK 处理程序接口使用异步方法,其中.NET Framework SDK 使用同步方法。 因此,.Net Standard SDK 处理程序接口 API 名称以单词“Async”结尾,并返回 Task<类> ,而不是只返回类 (其中类特定于处理程序接口方法) 。
.NET Standard SDK 与传输无关。 因此,不会向应用程序直接提供 HTTP 上下文。 使用 ASP.NET Core时,请参阅 ASP.NET Core文档,尤其是 IHttpContextAccessor 接口。
.NET Standard SDK 不支持打包内容协议 (,例如 IPackagingDataAcquisitionHandler 不存在) 。 此功能将在 PlayReady 4.6 中还原。
下面是 PlayReady 4.5 中特定差异的完整列表。 此列表不包括仅在 .NET Standard SDK 中存在的功能,也不会列出要还原的所有打包类。
.NET Framework类或接口 | .NET Standard 等效项 | 差异 |
---|---|---|
ProtocolChallengeContext 类 | IProtocolChallengeContext 接口 | 如上所述,HttpRequest Request 属性仅存在于.NET Framework SDK 中。 |
ProtocolChallenge 类 | IProtocolChallenge 接口 | 无。 |
IDeleteLicenseHandler 接口 | 相同 | ProcessDeleteLicenseDataAsync 在.NET Framework SDK 中同步,如上所述。 |
DeleteLicenseDataChallenge 类 | IDeleteLicenseDataChallenge 接口 | 无。 |
IDomainHandler 接口 | 相同 | 如上文所述,HandleJoinDomainAsync 和 HandleLeaveDomainAsync 在 .NET Framework SDK 中同步。 |
JoinDomainChallenge 类 | IDomainChallenge 和 IJoinDomainChallenge 接口 | .NET Standard SDK 中不存在静态 JoinDomainChallenge.GenerateDomainKeyPair 方法。 此功能的丢失是在 PlayReady 4.6 中通过将它作为静态方法添加到 DomainCertificateBuilder 来修复的 bug。 |
LeaveDomainChallenge 类 | ILeaveDomainChallenge 接口 | 无。 |
ILicenseAcknowledgementHandler 接口 | 相同 | HandleLicenseAcknowledgementAsync 在.NET Framework SDK 中同步,如上所述。 |
LicenseAcknowledgementChallenge 类 | ILicenseAcknowledgementChallenge 接口 | 无。 |
ILicenseAcquisitionHandler 接口 | 相同 | HandleLicenseAcquisitionAsync 在.NET Framework SDK 中同步,如上所述。 |
LicenseChallenge 类 | ILicenseChallenge 接口 | 无。 |
IMeteringHandler 接口 | 相同 | 如上所述,GetMeteringCertificateAsync 和 ProcessMeteringDataAsync 在 .NET Framework SDK 中同步。 |
MeteringCertificateChallenge 类 | IMeteringCertificateChallenge 接口 | 无。 |
ProcessMeteringDataChallenge 类 | IProcessMeteringDataChallenge 接口 | 无。 |
ISecureStopHandler 接口 | 相同 | 如上所述,ProcessSecureStopDataAsync 在 .NET Framework SDK 中同步。 |
SecureStopDataChallenge 类 | ISecureStopDataChallenge 接口 | 获取 ISecureStop2Handler 的 GetSecureStopData 方法重载仅存在于.NET Framework SDK 中。 .NET Standard SDK 会像任何其他处理程序一样加载此处理程序。 |
ISecureStopHandler2 接口 | 相同 | 如上文所述,GetSecureStop2AESKeyAsync 在 .NET Framework SDK 中同步。 |
PlayReadyServerAuthorization 类 | 相同 | 类的方法在 .NET Standard SDK 的 .NET Framework SDK 和实例中是静态的。 |
服务器 API 更改
这只是一个概述。 有关详细信息,请参阅 服务器 API 文档 。
当未添加许可证时,LicenseResponse.GetLicenses 方法现在返回空数组而不是 null。
添加了以下类和枚举。
- AdvancedLicense 类 (抽象,继承自 License) - MediaLicense 中的子集现有属性和方法已移动到此类中,MediaLicense 现在继承自 AbstractLicense。 使用 MediaLicense 不需要应用程序更改。
- KeyExchangeLicense 类 (继承自 AdvancedLicense) - 用于在获取许可证期间为客户端提供任意密钥的许可证。
- KeyExchangeRight 类 (继承自 Right) - 用于指定密钥及其允许用于 KeyExchange 许可证的用法。
- KeyExchangeAlgorithm 枚举 - 用于指定 KeyExchange 许可证中密钥的允许用法。
- WatermarkVendor 类 - 用于向应用程序公开客户端支持的水印技术。
- LicenseServerTimeCertificate 类 - 用于包含用于对许可证获取响应中返回的许可证服务器时间进行签名的证书。
以下内容已添加到各个类。
- PlayReadyHeader 类公开标头是否指示对每流密钥的支持,以及它是否显式请求许可证。
- ContentKeyType 枚举添加值 KeyExchange。
- Certificate 类添加用于公开证书摘要和颁发者公钥的字节数组属性。
- License 类添加一个 guid 属性,该属性公开许可证的唯一 ID 和 IEnumerable<Right> 属性,以返回添加到许可证的权限。
- LicenseChallengeTeeAPIs 枚举为所有新的 PK 4.5 TEE API 添加值。
- LicenseChallengeReeFeatures 枚举为 LicenseServerTime 和 KeyExchange 添加值。
- LicenseChallenge 类将客户端支持的 KeyExchangeAlgorithms 列表、客户端支持的 WatermarkVendors、客户端的 TEE 和 REE 的 PK 版本 ((可能或可能不相同)) ,以及客户端是否需要当前 LicenseServerTime。
- LicenseResponse 类添加了 LicenseServerTimeCertificate 属性,用于设置用于对许可证获取响应中返回的许可证服务器时间进行签名的证书。
- ExplicitOutputRestrictionsConstants 类为 Watermark 和 InternalScreenOnly 添加常量。 有关这些 guid 的详细信息,请参阅 PlayReady 符合性规则。
PlayReady 设备移植工具包版本 4.5 中的更改
常规设备移植工具包更改
- 整个 PlayReady 设备移植工具包已更新为 Microsoft 源代码注释语言, (SAL) 2.0。
- 删除了仅在 Microsoft 内部实现中使用的一些不受支持的代码路径,以消除混淆并减少编译时间和二进制大小。 预计将来的版本中将包括此领域的进一步改进。
- 在基础编译器和计算机体系结构支持的情况下,本机 128 位整数类型现在可用于加速 ECC256 的默认实现。
- 添加了 SHA256 HMAC 算法的默认实现。
设备移植工具包 API 更改
这只是一个概述。 有关详细信息,请参阅 PlayReady 设备移植工具包 中关联代码注释中提供的 API 文档。
现在允许使用 PlayReady 服务器部署证书调用DRM_CDMI_SetServercertificate,以便隐私加密许可证获取和其他客户端质询。 此函数将转发到此方案中Drm_AppContext_SetProperty。 现有使用情况保持不变。
添加了以下公共函数:
- Drm_AppContext_SetProperty
- Drm_KeyExchange_Prepare
- Drm_KeyExchange_Perform
- Drm_KeyExchange_Close
添加了以下结构:
- DRM_DGP_REE_FEATURE_LIST_4_5
- DRM_DGP_TEE_API_LIST_4_5
添加了以下 TEE API:
- DRM_TEE_BASE_GetSystemTime2
- DRM_TEE_LICPREP_PackageKey2
- DRM_TEE_LICENSESERVERTIME_ProcessResponseData
- DRM_TEE_DECRYPT_PrepareToDecrypt2
- DRM_TEE_LICGEN_CompleteLicense2
- DRM_TEE_KEYEXCHANGE_Prepare
- DRM_TEE_KEYEXCHANGE_Perform
添加了以下 OEM TEE API:
- OEM_TEE_BASE_ECC256_SetKey
- OEM_TEE_CRYPTO_SHA256_HMAC_VerifyMAC
- OEM_TEE_CRYPTO_SHA256_HMAC_CreateMAC
- OEM_TEE_PERSISTENTSTORAGE_Read
- OEM_TEE_PERSISTENTSTORAGE_Write
- OEM_TEE_GetSupportedWatermarkVendors
以下 OEM TEE API 在未进行功能更改的情况下进行了重命名:
旧名称 | 新名称 |
---|---|
OEM_TEE_DECRYPT_UnshuffleScalableContentKeys | OEM_TEE_BASE_UnshuffleScalableContentKeys |
OEM_TEE_DECRYPT_CalculateContentKeyPrimeWithAES128Key | OEM_TEE_BASE_CalculateContentKeyPrimeWithAES128Key |
OEM_TEE_DECRYPT_DeriveScalableKeyWithAES128Key | OEM_TEE_BASE_DeriveScalableKeyWithAES128Key |
OEM_TEE_DECRYPT_InitUplinkXKey | OEM_TEE_BASE_InitUplinkXKey |
OEM_TEE_DECRYPT_UpdateUplinkXKey | OEM_TEE_BASE_UpdateUplinkXKey |
OEM_TEE_DECRYPT_DecryptContentKeysWithDerivedKeys | OEM_TEE_BASE_DecryptContentKeysWithDerivedKeys |
OEM_TEE_DECRYPT_EnforcePolicy | OEM_TEE_POLICY_Enforce |