记录这么一个有些过时了的 DRM 方案, 不是初衷,只是之前测试部门抛过来一个问题: “我们需不需要像 xx 厂商一样去搭建一系列 OMA DRM 用例? ”
本来按计划,应该早些投身于 Widevine 的规划的,但忽然公司关于整个项目的时间表 delay 了, 呵呵, 忽然发觉还是局外人看的准, 好吧,闲着也是闲着, 评估一下 OMA DRM 吧; // MAGIC1. DO NOT TOUCH http://blog.youkuaiyun.com/leonxu_sjtu
为偷懒, OMA DRM 的 SPEC 这里不做描述了, OMA 是 Open Mobile Alliance, 可以去 http://openmobilealliance.org/wp/index.html 下载所有 spec , 如 http://openmobilealliance.org/release/DRM/
Android 的 DRM Framework 这里不做描述了, 可以百度出一堆, 这一块框架也多年未变;
这里只描述下 Android 环境下对 OMA DRM 的验证, 准确的说是对 Forward Lock 的验证;
只验 FL 一来是因为 Android 只有 FL 的 plugin : frameworks/av/drm/libdrmframework/plugins/forward-lock/FwdLockEngine
某通倒是提供了更全的插件库, 可以支持 FL/CD/SD 且同时包含了更多的文件类型, 给出了 native 实现和 java demo, 但是某通在它的 oma drm doc 中鄙视了一番 android 之后, 随后在 Android M 之后的版本就把它炫耀的这些插件库从自己的编译脚本中移除,哎, 不知道怎么形容这货 ~ // MAGIC2 DO NOT TOUCH http://blog.youkuaiyun.com/leonxu_sjtu
二来是因为 Combined Delivery 和 Seperate Delivery 搭建服务器会麻烦一些, 除 http server 外还需要建一个 Push Initiator 来传 Rights 文件 ;
如下图:
先从代码走起吧, 我们能从 oma drm spec 图上看到 Forward-Lock 传送的是明文, 服务器上的文件发送到设备端, 并没有做加密, 除了添加 dm 信息;
那是设备端下载文件的时候做加密吗? 是的... 下载的时候调用 android DRM api 的 convertData 来加密 !
上层封装是在 frameworks/base/drm/java/android/drm/DrmOutputStream.java
public void write(byte[] buffer, int offset, int count) throws IOException {
Arrays.checkOffsetAndCount(buffer.length, offset, count);final byte[] exactBuffer;
if (count == buffer.length) {
exactBuffer = buffer;