关于 Android 的 OMA DRM 验证

这篇博客详细介绍了在Android环境下对OMA DRM(尤其是Forward Lock)的验证过程。内容涉及DRM Framework、Android的DrmOutputStream以及加密和解密的流程。作者通过分析源代码,展示了如何在Android设备上实现和验证OMA DRM的Forward Lock机制,并指出在Android M及后续版本中,由于系统改动,OMA DRM的功能逐渐被弃用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

记录这么一个有些过时了的 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;
 

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值