🔑 Widevine 基础与密钥位置
理解Widevine密钥的写入,首先需要了解几个核心概念:
- Widevine DRM:这是Google推出的内容数字版权管理方案,用于保护媒体内容不被非法复制和分发。它通过加密媒体内容和安全管理解密密钥来实现。
- 安全级别:Widevine定义了三种安全级别,其对密钥的处理和保护力度不同,关键区别如下表:
| 安全级别 | 密钥与加解密操作位置 | 视频路径 | 适用场景 |
|---|---|---|---|
| L1 | TEE | 安全视频路径 | 高质量内容(如4K) |
| L2 | 富操作系统(如Android) | 普通视频路径 | 基本保护需求 |
| L3 | 富操作系统 | 普通视频路径 | 最低级别保护 |
-
Keybox:这是一个包含设备唯一密钥材料的安全数据结构,是设备在Widevine生态系统中的信任根。一个标准的Keybox通常包含以下字段:
Device ID: 32字节,标识设备的唯一字符串。Device Key: 16字节,分配给设备的AES密钥,用于保护授权。Key Data: 72字节,加密的数据。Magic: 4字节,固定为"kbox" (0x6b626f78),用于识别有效的Keybox。CRC: 4字节,用于验证Keybox数据的完整性。- Keybox总大小为128字节。
-
密钥写入位置:对于L1级别,Keybox最终必须存储在受硬件保护的区域。在MTK平台上,这通常意味着:
- TEE:这是与Android(Rich OS)隔离的安全执行环境。MTK平台使用自家的Trustonic TEE方案或开源的OP-TEE。
- TEE中的安全存储:Keybox会被写入到TEE内部的安全存储区域,该区域通常由SoC的TrustZone技术提供硬件隔离保护,普通操作系统无法直接访问。
🛠️ MTK平台Widevine密钥写入流程
在MTK平台上,Widevine L1 Keybox的写入通常贯穿于设备生产的多个阶段,其核心流程和关键操作可以概括为:
下面我们来分步解析图中的关键环节:
-
密钥准备与转换
- Google会为每个设备或设备型号提供对应的Keybox文件(通常是XML格式)。
- OEM厂商需要使用MTK提供的专用打包工具(可能类似于其他芯片平台如瑞芯微的
rkpacker_widevine或海思的HiDRMTool),将XML格式的Keybox转换成MTK平台可识别的二进制格式(例如.kdb文件)。这个工具可能由MTK直接提供给合作的OEM厂商。
-
烧录密钥
烧录过程依赖于设备的启动状态和MTK提供的工具链:-
途径一:生产模式(Bootloader/LK阶段)
这是最常见的方式,通过MTK的烧录工具(可能是一个Windows可执行程序,如KeyWrite或SP Flash Tool的特定功能)完成。- 设备进入Download模式或Bootloader模式。
- 工具通过USB连接设备,将转换后的Keybox文件发送给设备的Little Kernel (LK) 或 Bootloader。
- LK/Bootloader内部调用安全启动服务,通过TrustZone的监控模式调用将Keybox写入TEE环境下的安全存储区域。这一步是关键,确保了密钥在写入过程中也受到保护。
-
途径二:正常系统下的工具写入
设备正常启动后,可能存在通过厂商定制App或系统服务来写入Keybox的情景。这个App或服务会:- 请求高级权限(如
system权限)。 - 调用MTK提供的厂商专用API(例如
vendor.mediatek.hardware.drm命名空间下的HIDL/IInterface服务)。 - 最终,这些API会通过QSEECom(Qualcomm)或类似MTK的安全通信驱动,向TEE环境发送指令,完成Keybox的写入。
- 请求高级权限(如
-
-
TEE环境内的处理
无论通过哪种途径,密钥最终都会到达TEE。在TEE内:- Widevine TA 被调用。
- 该TA会验证Keybox的完整性(检查Magic和CRC)。
- 如果验证通过,它将Keybox的敏感部分(如Device Key)写入到硬件的安全存储(如efuse)或由TEE内核管理的、基于硬件的加密安全存储中。
🔍 代码实现与日志分析
由于MTK平台的代码多为闭源,如下示例和思路主要基于通用Android DRM实现和部分信息推测。
代码实现概览
-
上层调用(仅供参考)
在Android系统中,应用层通过MediaDrm API与DRM框架交互,但密钥的注入通常由系统进程完成。以下代码展示了原理,并非MTK实际代码:// 1. 创建MediaDrm实例,使用Widevine的UUID UUID widevineUuid = new UUID(-0x121074568629b532L, -0x5c37d8232ae2de13L); MediaDrm mediaDrm = new MediaDrm(widevineUuid); // 2. 打开一个会话(Session) byte[] sessionId = mediaDrm.openSession(); // 3. 获取密钥请求(这通常由license server触发,此处展示 provisioning) // 对于Keybox注入,可能使用特定的"provisioning"请求类型。 String provisionRequest = mediaDrm.getPropertyString("provisioning-request"); // ... 将provisionRequest发送到 provisioning server ... // 4. 提供密钥响应(包含Keybox或授权) byte[] keyResponse = // ... 从服务器接收的响应数据,或由工具生成的Keybox数据 ... mediaDrm.provideKeyResponse(sessionId, keyResponse); // 5. 查询设备安全级别 String securityLevel = mediaDrm.getPropertyString("securityLevel"); Log.d("Widevine", "Current security level: " + securityLevel); // 期望输出: "L1" -
底层TEE通信(概念性)
更深层的调用会涉及到原生层和TEE驱动:// 原生层 (可能通过 vendor.mediatek.hardware.drm@1.0-service 调用) // 调用 MediaDrmPlugin 的 getPropertyByteArray 或 setPropertyByteArray // 这些调用最终会通过 ioctl 到达 /dev/qseecom (或MTK等效驱动) // TEE侧 (Widevine TA 内部逻辑) // 当接收到来自非安全世界的 "PROVISION_KEYBOX" 命令时: // - 验证调用者权限 (通过TEE内核) // - 解析传入的Keybox数据 // - 验证Magic和CRC // - 调用 TEE_WriteObjectData() 或直接访问安全硬件,将密钥存入安全存储
日志分析
分析日志是排查Widevine密钥问题的关键。你需要使用 adb logcat 并过滤相关标签。
-
查找关键日志标签:
MediaDrmWVDrmEngine(Widevine DRM Engine)OEMCrypto(Widevine的硬件抽象层)QSEECom或MTK相关的安全驱动标签(如MTK_TZ_DRM)
-
成功写入的日志特征:
I/WVDrmEngine: Provisioning: Keybox received. D/OEMCrypto: OEMCrypto_ProvisionKeybox: Success. (Keybox写入TEE成功) I/WVDrmEngine: Provisioning: Keybox stored successfully. I/MediaDrm: Security level: L1在系统属性或DRM信息查询中,你应能看到:
I/WVDrmEngine: getSecurityLevel: L1 -
常见失败场景与日志:
- Keybox格式错误:
E/WVDrmEngine: Provisioning: Invalid keybox magic. E/OEMCrypto: OEMCrypto_ProvisionKeybox: ERROR_BAD_MAGIC - CRC校验失败:
E/WVDrmEngine: Provisioning: Keybox CRC mismatch. E/OEMCrypto: OEMCrypto_ProvisionKeybox: ERROR_CRC_FAILED - TEE通信或安全存储失败:
E/QSEECom: send_cmd: ioctl failed. errno = 110 (Timeout) E/OEMCrypto: OEMCrypto_ProvisionKeybox: ERROR_UNKNOWN_FAILURE E/WVDrmEngine: Provisioning: Failed to provision device. - 降级为L3:
这通常意味着Keybox写入失败、TEE中的Widevine TA未正确集成或硬件不支持L1。W/WVDrmEngine: Failed to initialize L1 security. Falling back to L3. I/MediaDrm: Security level: L3
- Keybox格式错误:
💎 总结
在MTK平台上实现Widevine L1的关键在于将唯一的Keybox安全地写入到由TrustZone技术保护的TEE安全存储中。这个过程严重依赖MTK提供的专有工具、Bootloader支持和TEE环境。排查问题时,结合上层MediaDrm日志和底层OEMCrypto/TEE驱动日志至关重要。
587

被折叠的 条评论
为什么被折叠?



