HDCP(High -bandwidth Digital Content Protection) ,用以保护数字内容。
HDCP在2.0以前的版本都主要是配合HDMI等需要有线连接的设备的,随着网络的发展,数字内容的保护需求明显增加,为了新的应用的需要,HDCP2.0出现了,它只是需要TCP/IP连接即可,这样HDCP就可以应用在更多的场合。
Android 4.2 在WIFI Display下添加了HDCP的接口,开发者若需要支持HDCP,则需要按照接口生成名为libstagefright_hdcp.的系统动态库。然后WifiDisplay 会透过mediaplayerservice提供的接口来访问。
其中初始化,包括AKE,LC,SKE的部分调用接口initAsync ,然后是数据的加解密接口,及结束HDCP的接口。
HDCP由SansaSecurity授权,获得版权后,将public key certificate导入项目即可,因为是批量授权,所以可以项目通用。
HDCP设备间的连接的建立, 需要通过复杂的验证过程,其流程大致如图:
1、建立tcp的套接字,等待source端来connect。端口号在WiFiDisplay的M3阶段透过字串 "wfd_content_protection: HDCP2.0 port=35000\r\n"告诉了source端。 当两端的tcp连接成功创建后,等待source端的验证动作。
2、HDCP设备相互验证分为三步进行,AKE(Authentication and Key Exchange)是验证的第一步。它主要的操作就是source端来验证HDCP Receiver的public key certificate(包括Receiver ID 和RSA public key)。它们之间会交换Km。
3、LC(Locality Check ),当在AKE阶段,sink端计算出的H‘和source端计算的H相等时,source端会继续下部验证,即LC,否则会终止TCP连接。LC通过一个消息对的时间来确定是不是两个相对较近的设备在连接,如果一个消息对的时间超过了7ms,则表示locality check 失败。
4、SKE(Session Key Exchange),在成功完成了前几步之后,source端和sink端就可以开始session key(ks)的交换。
5、ks成功后,source就完成了传输音视频数据传输前的所有准备,传输音视频数据时,source端会拿Ks加密,sink端会拿Ks解密。
加解密使用AES算法。