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

Biểu tượng HAL DRM cho 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à trình bổ trợ DRM phải triển khai. Tài liệu này không mô tả các quy tắc về độ mạnh hoặc các quy tắc tuân thủ có thể được xác định bằng lược đồ DRM.

Khung

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

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

Việc có sẵn nội dung kỹ thuật số đa dạng là 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 rộng rãi, 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 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. Trình bổ trợ DRM được tích hợp với khung DRM của Android và có thể sử dụng biện pháp bảo vệ dựa trên phần cứng để bảo mật nội dung trả phí và thông tin đăng nhập của người dùng.

Tính năng bảo vệ nội dung do trình bổ trợ DRM cung cấp phụ thuộc vào tính 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 tính năng phần cứng của thiết bị phải bao gồm tính năng khởi động bảo mật phần cứng để thiết lập một chuỗi tin cậy về bảo mật và bảo vệ khoá mã hoá. Các tính năng bảo vệ nội dung của thiết bị phải bao gồm tính năng bảo vệ khung đã giải mã trong thiết bị và tính năng 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. Hoạt động bảo mật không bao giờ được triển khai ở một vị trí duy nhất trong ngăn xếp, mà phụ thuộc vào việc tích hợp phần cứng, phần mềm và dịch vụ. Để cung cấp một thiết bị an toàn, bạn cần kết hợp các chức năng bảo mật phần cứng, cơ chế khởi động đáng tin cậy và một 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.

Kiến trúc

Khung DRM được thiết kế để không phụ thuộc vào cách triển khai và rút gọn thông tin chi tiết về cách triển khai giao thức DRM cụ thể trong trình bổ trợ DRM dành riêng cho giao thức. Khung DRM bao gồm các API đơn giản để xử lý các thao tác DRM phức tạp, mua giấy phép, cấp phép thiết bị, liên kết nội dung DRM và giấy phép của nội dung đó, cuối cùng là giải mã nội dung DRM.

Khung DRM của Android được triển khai trong hai lớp cấu trúc:

  • API khung DRM được hiển thị với 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 trình bổ trợ DRM (trình đại diện) để xử lý việc quản lý quyền và giải mã cho nhiều giao thức DRM.
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

Hãy xem Android Media DRM Android Media Crypto để biết thêm thông tin chi tiết.

Trình bổ trợ DRM

Khi khởi động hệ thống, khung DRM sẽ quét các thực thể/dịch vụ HAL (mô tả trong tệp .rc ) và các trình bổ trợ sẽ được phát hiện. Máy chủ DRM cho nội dung đa phương tiện (mediadrmserver) tạo cả đối tượng CryptoHalDrmHal. Sau đó, CryptoHalDrmHal sẽ gọi các trình bổ trợ bằng cách triển khai theo nhà cung cấp.

Trình bổ trợ phải triển khai HAL liên kết. HAL 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 tạo lại HAL.

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

Triển khai

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

Cách triển khai API khung DRM mới bằng trình bổ trợ:

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

Các API được xác định trong từng phiên bản của IDrmPlugin.aidl, ICryptoPlugin.aidl, IDrmFactory.aidlICryptoFactory.aidl

aidl/PLATFORM_ROOT/hardware/interfaces/drm/

Thêm dịch vụ trình bổ trợ vào tệp bản dựng thiết bị

Ví dụ: để thêm tính năng 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 tệp 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>

STABLE AIDL VERSION (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, 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 /vendor

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

Xem phần Ngôn ngữ khởi tạo cho Android để biết thông tin chi tiết.

Triển khai trình bổ trợ

  1. Triển khai điểm truy cập main() trong service.cpp của dịch vụ trình bổ trợ.
  2. Triển khai ICryptoPlugin, IDrmPlugin, ICryptoFactoryIDrmFactory.
  3. Triển khai các API mới trong trình bổ trợ.

Thông tin chi tiết về trình bổ trợ DRM

Nhà cung cấp trình bổ trợ DRM triển khai DrmFactory, CryptoFactory và trình bổ trợ DRM.

DrmFactory

Lớp DrmHal tìm kiếm các dịch vụ trình bổ trợ DRM đã đăng ký và tạo các trình bổ trợ tương ứng hỗ trợ một giao thức mã hoá nhất định thông qua lớp DrmFactory.

IDrmFactory là điểm truy cập chính để tương tác với HAL drm của nhà cung cấp thông qua API createPlugin. API createPlugin được dùng để tạo các thực thể IDrmPlugin.

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

getSupportedCryptoSchemes trả về danh sách các giao thức mã hoá được hỗ trợ cho thực thể 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à máy trình bổ trợ có thể tạo các trình bổ trợ DRM hỗ trợ một lược đồ mã hoá nhất định (do một UUID chỉ định) hay không.

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

Xác định xem nhà máy trình bổ trợ có thể tạo các trình bổ trợ DRM hỗ trợ định dạng vùng chứa nội dung nghe nhìn nhất định do mimeType chỉ định 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);

Tạo trình bổ trợ DRM cho lược đồ mã hoá do UUID chỉ định.

CryptoFactory

Lớp CryptoHal tìm kiếm các dịch vụ trình bổ trợ DRM đã đăng ký và tạo các trình bổ trợ tương ứng hỗ trợ một giao thức mã hoá 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à máy mã hoá có thể tạo các trình bổ trợ mã hoá hỗ trợ một giao thức mã hoá nhất định do UUID chỉ định 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à máy trình bổ trợ có thể tạo các trình bổ trợ mã hoá hỗ trợ một lược đồ mã hoá nhất định (do mã nhận dạng duy nhất (UUID) chỉ định hay không).

API trình bổ trợ DRM

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