DRM (Quản lý bản quyền nội dung số)

Biểu tượng HAL DRM của Android

Tài liệu này cung cấp thông tin tổng quan về khung quản lý quyền kỹ thuật số (DRM) của Android và giới thiệu các giao diện mà plugin DRM phải triển khai. Tài liệu này không mô tả các quy tắc về độ bền hoặc các quy tắc tuân thủ có thể được xác định bởi sơ đồ DRM.

Khung

Nền tảng Android cung cấp khung DRM có thể mở rộng cho phép ứng dụng quản lý nội dung được bảo vệ quyền theo các ràng buộc về giấy phép liên quan đến nội dung. Khung DRM hỗ trợ nhiều sơ đồ DRM; Sơ đồ DRM mà thiết bị hỗ trợ tùy thuộc vào nhà sản xuất thiết bị. Khung DRM cung cấp giao diện thống nhất cho các nhà phát triển ứng dụng và che giấu sự phức tạp của các hoạt động DRM. Khung DRM cung cấp chế độ hoạt động nhất quán cho nội dung được bảo vệ và không được bảo vệ. Lược đồ DRM có thể xác định các mô hình sử dụng phức tạp bằng siêu dữ liệu giấy phép. Khung DRM cung cấp sự liên kết giữa nội dung và giấy phép DRM, đồng thời xử lý việc quản lý quyền. Điều này cho phép trình phát đa phương tiện được tách khỏi nội dung được bảo vệ hoặc không được bảo vệ bằng DRM. Xem MediaDrm để biết lớp để lấy khóa giải mã các luồng phương tiện được bảo vệ.

HAL DRM của Android
Hình 1a. Lớp trừu tượng phần cứng DRM trước Android 11
Android DRM HAL đăng R
Hình 1b. Lớp trừu tượng phần cứng DRM bắt đầu từ Android 11

Sự sẵn có của nội dung số phong phú rất quan trọng đối với người dùng trên thiết bị di động. Để cung cấp nội dung của họ một cách rộng rãi, các nhà phát triển Android và nhà xuất bản nội dung kỹ thuật số cần triển khai DRM nhất quán được hỗ trợ trên toàn hệ sinh thái Android. Để cung cấp nội dung kỹ thuật số đó trên các thiết bị Android và để đảm bảo rằng có ít nhất một DRM nhất quán trên tất cả các thiết bị, Google cung cấp DRM mà không tính phí giấy phép trên các thiết bị Android tương thích. Plugin DRM được tích hợp với khung DRM của Android và có thể sử dụng tính năng bảo vệ dựa trên phần cứng để bảo mật nội dung cao cấp và thông tin đăng nhập của người dùng.

Khả năng bảo vệ nội dung do plugin DRM cung cấp phụ thuộc vào khả năng bảo mật và bảo vệ nội dung của nền tảng phần cứng cơ bản. Các khả năng phần cứng của thiết bị phải bao gồm khả năng khởi động an toàn phần cứng để thiết lập chuỗi tin cậy về bảo mật và bảo vệ các khóa mật mã. Khả năng bảo vệ nội dung của thiết bị phải bao gồm bảo vệ các khung được giải mã trong thiết bị và bảo vệ nội dung thông qua cơ chế bảo vệ đầu ra đáng tin cậy. Không phải nền tảng phần cứng nào cũng hỗ trợ tất cả các tính năng bảo mật và bảo vệ nội dung nêu trên. Bảo mật không bao giờ được triển khai ở một nơi duy nhất trong ngăn xếp mà thay vào đó dựa vào sự tích hợp của phần cứng, phần mềm và dịch vụ. Sự kết hợp giữa các chức năng bảo mật phần cứng, cơ chế khởi động đáng tin cậy và hệ điều hành bảo mật riêng biệt để xử lý các chức năng bảo mật là rất quan trọng để cung cấp một thiết bị bảo mật.

Ngành kiến ​​​​trúc

Khung DRM được thiết kế để triển khai bất khả tri và tóm tắt các chi tiết về việc triển khai lược đồ DRM cụ thể trong plugin DRM dành riêng cho lược đồ. Khung DRM bao gồm các API đơn giản để xử lý các hoạt động DRM phức tạp, lấy giấy phép, cung cấp thiết bị, liên kết nội dung DRM và giấy phép của nó, cuối cùng là giải mã nội dung DRM.

Khung DRM Android được triển khai theo hai lớp kiến ​​trúc:

  • API khung DRM, được hiển thị cho các ứng dụng thông qua khung ứng dụng Android.
  • Khung DRM mã gốc, hiển thị giao diện cho các plugin (tác nhân) DRM để xử lý việc quản lý và giải mã quyền cho các sơ đồ DRM khác nhau.
Khung DRM của Android
Hình 2a. Khung DRM trước Android 11
Khung DRM của Android
Hình 2b. Khung DRM bắt đầu từ Android 11

Xem Android Media DRMAndroid Media Crypto để biết thêm chi tiết.

Plugin DRM

Khi khởi động hệ thống, khung DRM sẽ quét các phiên bản/dịch vụ HAL (được mô tả trong tệp .rc ) và phát hiện các plugin. Media DRM Server ( mediadrmserver ) tạo cả đối tượng CryptoHalDrmHal . Sau đó, CryptoHalDrmHal gọi các plugin bằng cách triển khai dành riêng cho nhà cung cấp.

Các plugin nên triển khai HAL được liên kết. HAL được liên kết sử dụng Ngôn ngữ định nghĩa giao diện Android (AIDL) , cho phép thay thế khung mà không cần phải xây dựng lại HAL.

Các plugin được các nhà cung cấp hoặc nhà sản xuất SOC xây dựng và đặt trong phân vùng /vendor trên thiết bị. Tất cả các thiết bị chạy Android 13 trở lên đều phải hỗ trợ HAL liên kết được viết bằng ngôn ngữ AIDL.

Thực hiện

Các thiết bị GMS và AOSP phát hành cho Android 13 phải sử dụng giao diện AIDL.

Để triển khai API khung DRM mới bằng plugin:

  1. Thêm dịch vụ plugin vào tệp bản dựng của thiết bị.
  2. Cập nhật bảng kê khai thiết bị.
  3. Thêm quyền SELinux.
  4. Tạo tệp .rc trong /vendor .
  5. Triển khai plugin.

API được xác định trong mỗi phiên bản của IDrmPlugin.aidl , ICryptoPlugin.aidl , IDrmFactory.aidlICryptoFactory.aidl

aidl/PLATFORM_ROOT/hardware/interfaces/drm/

Thêm dịch vụ plugin vào tệp xây dựng thiết bị

Ví dụ: để thêm hỗ trợ giao diện AIDL, tệp VENDOR DEVICE /device.mk phải bao gồm các gói android.hardware.drm-service.* :


  PRODUCT_PACKAGES += \
    android.hardware.drm-service.clearkey \
    android.hardware.drm-service.widevine

Cập nhật bảng kê khai thiết bị

Tệp vendor manifest.xml cho thiết bị phải bao gồm các mục sau:

  <hal format="aidl">
    <name>android.hardware.drm</name>
    <version>STABLE AIDL VERSION</version>
      <fqname>ICryptoFactory/clearkey</fqname>
      <fqname>IDrmFactory/clearkey</fqname>
      <fqname>ICryptoFactory/widevine</fqname>
      <fqname>IDrmFactory/widevine</fqname>
  </hal>

PHIÊN BẢN AIDL ỔN ĐỊNH là số phiên bản của mỗi bản phát hành API AIDL (ví dụ: 1, 2). Ngoài ra, chúng tôi khuyên bạn nên sử dụng vintf_fragments.

Thêm quyền SELinux

  1. Thêm vào VENDOR DEVICE /sepolicy/vendor/file.te
    type mediadrm_vendor_data_file, file_type, data_file_type;
  2. Thêm vào VENDOR DEVICE /sepolicy/vendor/file_contexts
        /vendor/bin/hw/android\.hardware\.drm-service\.clearkey  u:object_r:hal_drm_clearkey_exec:s0
    /data/vendor/mediadrm(/.*)? u:object_r:mediadrm_vendor_data_file:s0
  3. Thêm vào device/sepolicy/vendor/hal_drm_clearkey.te
        vndbinder_use(hal_drm_clearkey)
        allow hal_drm_clearkey servicemanager:binder { call transfer };
        allow hal_drm_clearkey hal_drm_service:service_manager add;
        allow hal_drm_clearkey { appdomain -isolated_app }:fd use;
        get_prop(ramdump, public_vendor_default_prop)
        

Tạo tệp RC trong/nhà cung cấp

Tệp .rc chỉ định các hành động được thực hiện khi dịch vụ được khởi chạy.

Xem Ngôn ngữ ban đầu của Android để biết chi tiết.

Triển khai plugin

  1. Triển khai điểm vào main() trong service.cpp của dịch vụ plugin.
  2. Triển khai ICryptoPlugin , IDrmPlugin , ICryptoFactoryIDrmFactory .
  3. Triển khai các API mới trong plugin.

Chi tiết plugin DRM

Các nhà cung cấp plugin DRM triển khai plugin DrmFactory , CryptoFactory và DRM.

DrmFactory

Lớp DrmHal tìm kiếm các dịch vụ plugin DRM đã đăng ký và xây dựng các plugin tương ứng hỗ trợ sơ đồ mật mã nhất định thông qua lớp DrmFactory .

IDrmFactory là điểm truy cập chính để tương tác với drm HAL của nhà cung cấp thông qua API createPlugin. API createPlugin được sử dụng để tạo phiên bản IDrmPlugin.

::ndk::ScopedAStatus getSupportedCryptoSchemes(
    std::vector<::aidl::android::hardware::drm::Uuid>* _aidl_return);

getSupportedCryptoSchemes trả về danh sách các lược đồ mật mã được hỗ trợ cho phiên bản AIDL drm HAL.

::ndk::ScopedAStatus isCryptoSchemeSupported(
    const ::aidl::android::hardware::drm::Uuid& in_uuid,
    const std::string& in_mimeType,
    ::aidl::android::hardware::drm::SecurityLevel in_securityLevel,
    bool* _aidl_return);

Xác định xem nhà sản xuất plugin có thể xây dựng các plugin DRM hỗ trợ sơ đồ mật mã nhất định do UUID chỉ định hay không.

::ndk::ScopedAStatus isContentTypeSupported(const std::string& in_mimeType,
    bool* _aidl_return);

Xác định xem nhà sản xuất plugin có thể xây dựng các plugin DRM hỗ trợ định dạng vùng chứa phương tiện nhất định được chỉ định bởi mimeType hay không.

::ndk::ScopedAStatus createPlugin(
    const ::aidl::android::hardware::drm::Uuid& in_uuid,
    const std::string& in_appPackageName,
    std::shared_ptr<::aidl::android::hardware::drm::IDrmPlugin>* _aidl_return);

Xây dựng plugin DRM cho sơ đồ mật mã do UUID chỉ định.

Nhà máy tiền điện tử

Lớp CryptoHal tìm kiếm các dịch vụ plugin DRM đã đăng ký và xây dựng các plugin tương ứng hỗ trợ sơ đồ mật mã nhất định thông qua lớp CryptoFactory .

::ndk::ScopedAStatus isCryptoSchemeSupported(
    const ::aidl::android::hardware::drm::Uuid& in_uuid,
    bool* _aidl_return);

Xác định xem nhà sản xuất tiền điện tử có thể xây dựng các plugin tiền điện tử hỗ trợ sơ đồ tiền điện tử nhất định được chỉ định bởi UUID hay không.

::ndk::ScopedAStatus createPlugin(
    const ::aidl::android::hardware::drm::Uuid& in_uuid,
    const std::vector<uint8_t>& in_initData,
    std::shared_ptr<::aidl::android::hardware::drm::ICryptoPlugin>* _aidl_return);

Xác định xem nhà sản xuất plugin có thể xây dựng các plugin tiền điện tử hỗ trợ sơ đồ tiền điện tử nhất định do UUID chỉ định hay không.

API plugin DRM

Các API được xác định trong hardware/interfaces/drm/aidl/aidl_api/android.hardware.drm/ VERSION /android/hardware/drm/IDrmPlugin.aidl . Tệp IDrmPlugin.h tương ứng có thể được tìm thấy trong out/Soong sau khi xây dựng.