HDMI HDCP加密认证与链路故障调试 - 第2节

2. HDCP核心架构:发送端(TX)与接收端(RX)角色定义

好,咱们直接切入正题。HDCP这套协议,说白了就是一套「谁可以看,谁不可以看」的认证机制。整个体系里只有两种角色:发送端(TX)和接收端(RX)。

我刚开始接触HDCP时,以为TX就是播放器,RX就是显示器。后来踩了坑才发现——没那么简单。你想想看,一个机顶盒既能输出画面给电视(此时它是TX),又能接收手机投屏(此时它又是RX)。同一个设备,角色可以切换。

2.1 发送端(TX)的核心职责

TX的任务很明确:保护内容,直到它安全到达合法的RX手里。

  • 发起认证:TX主动向RX发送认证请求,验证对方是否持有合法密钥
  • 加密内容:使用会话密钥对音视频流进行AES-128加密
  • 管理密钥:维护全局密钥、设备密钥,并在每次会话中生成唯一的会话密钥
  • 检测篡改:周期性检查RX的回应,防止中间人攻击

重要:TX必须实现「永不发送未加密内容」的硬逻辑。我在项目中见过一个bug——TX在认证失败后,竟然回退到了明文传输。这直接违反了HDCP规范,流片回来才发现,改都没法改。

2.2 接收端(RX)的核心职责

RX相对被动,但绝不是「躺平」的角色。它需要证明自己是合法的。

  • 响应认证:收到TX的挑战后,用设备密钥计算并返回回应值
  • 解密内容:使用协商好的会话密钥解密数据流
  • 报告状态:向TX反馈链路完整性信息
  • 限制输出:如果RX本身也是中继设备,它必须保证下游设备同样合法

个人经验:RX的密钥存储是个大坑。我曾经遇到一款芯片,设备密钥竟然存储在可读的Flash区域。攻击者只要用逻辑分析仪就能把密钥dump出来。嗯,后来我们改成了OTP(一次性可编程)存储,才算安心。

3. HDCP系统拓扑结构(树形级联)

单个TX对单个RX,那是理想情况。现实中,一个播放器可能连着一个功放,功放再连电视——这就是级联。

HDCP支持最多7级级联,且总设备数不能超过127个。为什么是7级?我记得当初看规范时,他们给出的理由是「延迟和密钥管理复杂度的平衡」。说白了,级联太深,认证延迟会大到影响用户体验。

3.1 树形拓扑的特点

  • 根节点:最上游的TX,通常是播放器或PC显卡
  • 中间节点:既是RX又是TX的设备,比如功放、HDMI切换器
  • 叶子节点:最终的显示设备,只做RX

每个中间节点都要维护两张表:一张是上游的父设备信息,一张是下游的子设备列表。我见过一个实现,中间节点在子设备热插拔时没有及时更新密钥表,导致整个链路认证失败。排查了三天,最后发现是链表操作漏了个free()。

避坑指南:我曾经在级联超过5层时遇到过「认证超时」的问题。原因是每个节点都要做完整的AKSV交换和密钥派生,累积延迟超过了HDCP规定的100ms上限。解决方案是优化密钥派生算法,把软件计算改成硬件加速。

4. 密钥体系概览(全局密钥/设备密钥/会话密钥)

HDCP的密钥体系,我习惯把它比作「三层门禁」:

  • 全局密钥:整栋大楼的万能钥匙,所有合法设备都知道
  • 设备密钥:每个房间的独立门禁卡,设备出厂时烧录
  • 会话密钥:每次开门时生成的临时密码,用完即弃

4.1 全局密钥(Global Key)

全局密钥由HDCP LLC(授权机构)保管,所有合法设备都预置了同一份。它主要用于加密传输设备密钥。

密钥名称 长度 用途
全局常量(ksv) 40位 设备身份标识
全局私钥 56位 加密设备密钥

注意:全局密钥一旦泄露,整个HDCP体系就废了。2010年就发生过一次大规模泄露,HDCP 1.x的全局密钥被公开,导致大量设备需要升级到2.x。嗯,这就是为什么现在HDCP 2.2改用公钥体系了。

4.2 设备密钥(Device Key)

每个设备出厂时,会从HDCP LLC申请一组唯一的设备密钥。这组密钥包含:

  • 设备私钥:40位,存储在安全区域,不可读取
  • 设备证书:包含公钥和数字签名,用于认证

我在项目中遇到过最头疼的问题——设备密钥的备份。有些客户要求支持「密钥恢复」功能,但HDCP规范明确禁止导出设备私钥。最后我们只能设计了一个硬件安全模块(HSM),在芯片内部做密钥备份和恢复,外部完全不可见。

4.3 会话密钥(Session Key)

每次建立HDCP连接时,TX和RX会协商出一个临时会话密钥。这个密钥只对当前会话有效,断开连接后立即销毁。

会话密钥的生成过程:

// 伪代码:会话密钥派生
session_key = AES_128(device_private_key, random_nonce)
// 其中random_nonce由TX生成,每次会话不同

个人建议:会话密钥的随机数生成器一定要用硬件真随机数发生器(TRNG)。我见过用软件伪随机数发生器的实现,结果每次上电后生成的nonce序列都一样——攻击者只要录一次就能重放攻击。你说这多危险?

知识体系总览

下面这张图,是我自己整理的核心架构关系。你看一眼就能明白TX、RX、密钥体系是怎么串起来的:

HDCP核心架构总览 发送端(TX) 发起认证 加密内容 管理密钥 中继节点 既是RX也是TX 转发认证 维护子设备表 接收端(RX) 响应认证 解密内容 限制输出 密钥体系 全局密钥 所有设备共享 用于加密传输 设备密钥 每设备唯一 出厂烧录 会话密钥 临时生成 用完即弃 图例: TX 中继 RX 密钥关联

这张图里,你从左往右看:TX发起认证,经过中继节点转发,最终到达RX。而密钥体系贯穿始终——全局密钥负责「你是谁」,设备密钥负责「你从哪里来」,会话密钥负责「这次会话安全吗」。

嗯,核心架构就这些。下一节我们会深入AKSV交换的具体流程,到时候我会拿一个实际抓包的数据来演示。


可可精品资料库