數字版權管理

Android DRM HAL圖標

本文檔概述了Android數字版權管理(DRM)框架,並介紹了DRM插件必須實現的接口。本文檔未描述DRM方案可能定義的健壯性規則或合規性規則。

框架

Android平台提供了可擴展的DRM框架,該框架使應用程序可以根據與內容相關聯的許可約束來管理受權限保護的內容。 DRM框架支持許多DRM方案。設備支持哪種DRM方案取決於設備製造商。 DRM框架為應用程序開發人員提供了統一的界面,並隱藏了DRM操作的複雜性。 DRM框架為受保護和不受保護的內容提供了一致的操作模式。 DRM方案可以通過許可證元數據定義復雜的使用模型。 DRM框架提供DRM內容和許可證之間的關聯,並處理權限管理。這使媒體播放器可以從受DRM保護的內容或不受保護的內容中抽像出來。有關該類,請參見MediaDrm以獲取用於解密受保護的媒體流的密鑰。

Android DRM HAL
圖1a。 Android 11之前的DRM硬件抽象層
Android DRM HAL發布R
圖1b。從Android 11開始的DRM硬件抽象層

豐富的數字內容的可用性對於移動設備上的用戶很重要。為了使其內容廣泛可用,Android開發人員和數字內容髮布者需要在整個Android生態系統中支持一致的DRM實現。為了使該數字內容在Android設備上可用,並確保所有設備上至少有一個一致的DRM,Google會在兼容的Android設備上提供無許可證費用的DRM。 DRM插件與Android DRM框架集成在一起,可以使用硬件支持的保護來保護高級內容和用戶憑據。

DRM插件提供的內容保護取決於基礎硬件平台的安全性和內容保護功能。設備的硬件功能應包括硬件安全啟動,以建立安全性和加密密鑰保護的信任鏈。設備的內容保護功能應包括保護設備中的解密幀以及通過受信任的輸出保護機制進行內容保護。並非所有的硬件平台都支持上述所有安全性和內容保護功能。安全性永遠不會在堆棧中的單個位置實現,而是依靠硬件,軟件和服務的集成。硬件安全功能,受信任的啟動機制以及用於處理安全功能的隔離安全操作系統的結合對於提供安全設備至關重要。

建築學

DRM框架被設計為與實現無關,並在特定於方案的DRM插件中抽象了特定DRM方案實現的細節。 DRM框架包括簡單的API,用於處理複雜的DRM操作,獲取許可證,供應設備,關聯DRM內容及其許可證,最後解密DRM內容。

Android DRM框架在兩個架構層中實現:

  • DRM框架API,通過Android應用程序框架向應用程序公開。
  • 本機代碼DRM框架,它公開了DRM插件(代理)的接口,以處理各種DRM方案的權限管理和解密。
Android DRM框架
圖2a。 Android 11之前的DRM框架
Android DRM框架
圖2b。從Android 11開始的DRM框架

有關更多詳細信息,請參見Android Media DRMAndroid Media Crypto

DRM插件

在系統啟動時,DRM框架掃描HAL實例/服務(在.rc文件中描述),並通過HIDL註冊表發現插件。媒體DRM服務器( mediadrmserver )創建CryptoHalDrmHal對象。然後, CryptoHalDrmHal調用具有特定於供應商的實現的插件。

插件應實現綁定的HAL。綁定的HAL使用HAL接口定義語言(HIDL) ,該語言允許在不重建HAL的情況下替換框架。

插件由供應商或SOC製造商構建,並放置在設備上的/vendor分區中。使用Android 8.0或更高版本啟動的所有設備都必須支持以HIDL語言編寫的綁定HAL。

執行

要通過插件實現新的DRM框架API,請執行以下操作:

  1. 將插件服務添加到設備的構建文件中。
  2. 更新設備清單。
  3. 添加SELinux權限。
  4. /vendor下創建一個.rc文件。
  5. 實現插件。

API在IDrmPlugin.halICryptoPlugin.halIDrmFactory.halICryptoFactory.hal每個版本中定義

PLATFORM_ROOT/hardware/interfaces/drm/VERSION/

將插件服務添加到設備構建文件

例如,要添加接口1.3支持, VENDOR DEVICE /device.mk文件必須包含android.hardware.drm@1.3-service.*軟件包:

R / Android 11中不推薦使用1.0到1.2版本。升級到R的設備仍然可以運行1.0到1.2版本。但是,使用R啟動的新設備只能運行version1.3。


  PRODUCT_PACKAGES += \
    android.hardware.drm@1.0-impl \
    android.hardware.drm@1.0-service \
    android.hardware.drm@1.3-service.clearkey \
    android.hardware.drm@1.3-service.widevine

更新設備清單

設備的vendor manifest.xml文件必須包含以下條目:


  <hal format="hidl">
    <name>android.hardware.drm</name>
      <transport>hwbinder</transport>
      <fqname>@1.3::ICryptoFactory/clearkey</fqname>
      <fqname>@1.3::IDrmFactory/clearkey</fqname>
      <fqname>@1.3::ICryptoFactory/widevine</fqname>
      <fqname>@1.3::IDrmFactory/widevine</fqname>
  </hal>

或者,我們建議使用vintf_fragments。

添加SELinux權限

  1. 添加到供應VENDOR DEVICE /sepolicy/vendor/file.te
    type mediadrm_vendor_data_file, file_type, data_file_type;
  2. 添加到VENDOR DEVICE /sepolicy/vendor/file_contexts

    我們建議使用正則表達式指定版本號,以避免對新版本進行更新,例如:

    /vendor/bin/hw/android\.hardware\.drm@\[0-9]+\.[0-9]+-service\.clearkey
          u:object_r:hal_drm_clearkey_exec:s0
    /data/vendor/mediadrm(/.*)? u:object_r:mediadrm_vendor_data_file:s0

    或者,如下所示更新版本號。

    /vendor/bin/hw/android\.hardware\.drm@1\.3-service\.clearkey
          u:object_r:hal_drm_clearkey_exec:s0
    /data/vendor/mediadrm(/.*)? u:object_r:mediadrm_vendor_data_file:s0
  3. 添加到device/sepolicy/vendor/hal_drm_clearkey.te
    allow hal_drm_clearkey mediadrm_vendor_data_file:dir create_dir_perms;
        allow hal_drm_clearkey mediadrm_vendor_data_file:file create_file_perms;
        

在/ vendor下創建一個.rc文件

.rc文件指定啟動服務時要執行的操作。

有關詳情,請參見Android初始化語言

實施插件

  1. 在插件服務的service.cpp中實現main()入口點。
  2. 實現ICryptoPluginIDrmPluginICryptoFactoryIDrmFactory
  3. 在插件中實現新的API。

DRM插件詳細信息

DRM插件供應商實現了DrmFactoryCryptoFactory和DRM插件。

DrmFactory

DrmHal類搜索註冊的DRM插件服務,並通過DrmFactory類構造支持給定加密方案的相應插件。

IDrmFactory是通過createPlugin API與供應商的drm HAL交互的主要入口點。 createPlugin API用於創建IDrmPlugin實例。 1.3 IDrmFactory必須始終創建1.2 IDrmPlugin接口,這些接口通過1.0 createPlugin方法返回。

Return<void> getSupportedCryptoSchemes(getSupportedCryptoSchemes_cb _hidl_cb);

1.3 IDrmFactory中的新增功能,getSupportedCryptoSchemes返回HIDL drm HAL實例支持的加密方案的列表。

Return<bool> isCryptoSchemeSupported(const hidl_array<uint8_t, 16>uuid);

確定插件工廠是否能夠構造支持給定加密方案(由UUID指定)的DRM插件。

Return<bool> isContentTypeSupported(const hidl_string &mimeType);

確定插件工廠是否能夠構造支持mimeType指定的給定媒體容器格式的DRM插件。

Return<void> createPlugin(const hidl_array<uint8_t, 16>uuid,
        const hidl_string& appPackageName, createPlugin_cb _hidl_cb);

為UUID指定的加密方案構造DRM插件。

加密工廠

CryptoHal類搜索註冊的DRM插件服務,並通過CryptoFactory類構造支持給定加密方案的相應插件。

Return<bool> isCryptoSchemeSupported(const hidl_array<uint8_t, 16>uuid);

確定加密工廠是否能夠構造支持給定加密方案(由UUID指定)的加密插件。

Return<void> createPlugin(const hidl_array<uint8_t, 16>uuid,
        const hidl_vec<uint8_t>initData, createPlugin_cb _hidl_cb)

確定插件工廠是否能夠構造支持給定加密方案(由UUID指定)的加密插件。

DRM插件

這些API在hardware/interfaces/drm/ VERSION /IDrmPlugin.halIDrmPlugin.h可以在out / Soong中找到相應的IDrmPlugin.h文件。