DRM

Biểu tượng HAL DRM Android

Trang 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. Trang này không mô tả các quy tắc về độ ổn định hoặc quy tắc tuân thủ có thể được xác định theo một lược đồ DRM.

Framework

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ệ bằng quyền theo các ràng buộc về giấy phép liên kết với nội dung đó. Khung DRM hỗ trợ nhiều lược đồ DRM; nhà sản xuất thiết bị sẽ xác định những lược đồ DRM mà thiết bị hỗ trợ. Khung DRM cung cấp một giao diện hợp nhất cho nhà phát triển ứng dụng và ẩn đi sự phức tạp của các thao tác 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 lượ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 đa phương tiện được trừu tượng hoá khỏi nội dung được bảo vệ bằng DRM hoặc không được bảo vệ. Hãy xem MediaDrm để biết lớp dùng để lấy khoá giải mã các luồng nội dung đa phương tiện được bảo vệ.

Hình 1 cho thấy lớp trích xuất phần cứng DRM trước Android 11 và Hình 2 cho thấy lớp này trong Android 11 trở lên:

HAL DRM Android

Hình 1. Lớp trừu tượng phần cứng DRM trước Android 11.

Android DRM HAL bắt đầu từ Android 11

Hình 2. 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ố phong phú 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 của mình một cách 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 một cách triển khai DRM nhất quán được hỗ trợ trên toàn bộ 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 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 xác thực 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 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 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 an toàn bằng phần cứng để thiết lập chuỗi tin cậy về bảo mật và bảo vệ các khoá mật mã. 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ệ các khung hình đã 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. Tính nă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à thay vào đó, dựa vào việc tích hợp phần cứng, phần mềm và dịch vụ. Việc 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à 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ị an toàn.

Kiến trúc

Khung DRM được thiết kế để không phụ thuộc vào cách triển khai và trừu tượng hoá các chi tiết của việc triển khai lược đồ DRM cụ thể trong một trình bổ trợ DRM dành riêng cho lược đồ. Khung DRM bao gồm các API đơn giản để xử lý các thao tác 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ội dung đó, đồng thời giải mã nội dung DRM.

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

  • API khung DRM được cung cấp cho các ứng dụng thông qua khung ứng dụng Android
  • Khung DRM mã gốc cung cấp một giao diện cho các trình bổ trợ DRM (tác nhân) để xử lý việc quản lý quyền và giải mã cho nhiều lược đồ DRM

Hình 3 cho thấy khung DRM trước Android 11 và Hình 4 cho thấy khung này trong Android 11 trở lên:

Khung DRM của Android

Hình 3. Khung DRM trước Android 11.

Khung DRM của Android bắt đầu từ Android 11

Hình 4. Khung DRM bắt đầu từ Android 11.

Hãy xem MediaDrmMediaCrypto để 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ể và dịch vụ HAL (được mô tả trong các tệp .rc ) và phát hiện các trình bổ trợ. 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 dành riêng cho nhà cung cấp.

Các trình bổ trợ phải triển khai các HAL được liên kết. Các 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 các HAL.

Các trình bổ trợ đượ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ị ra mắt bằng Android 13 trở lên phải hỗ trợ các HAL được liên kết được viết bằng ngôn ngữ AIDL.

Triển khai

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

  1. Thêm dịch vụ trình bổ trợ vào các 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.aidl, và ICryptoFactory.aidl.

aidl/PLATFORM_ROOT/hardware/interfaces/drm/

Thêm dịch vụ trình bổ trợ vào các 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>

Phiên bản AIDL ổn định là số phiên bản của từng 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 quyền vào VENDOR DEVICE/sepolicy/vendor/file.te:
    type mediadrm_vendor_data_file, file_type, data_file_type;
  2. Thêm quyền 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 quyền 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 một dịch vụ được khởi chạy.

Hãy xem Ngôn ngữ khởi động Android để biết thông tin chi tiết.

Triển khai trình bổ trợ

  1. Triển khai điểm vào main() trong service.cpp của dịch vụ trình bổ trợ.
  2. Triển khai ICryptoPlugin, IDrmPlugin, ICryptoFactory, và IDrmFactory.
  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.

Lớp 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 lược đồ mật mã nhất định thông qua lớp DrmFactory.

IDrmFactory là điểm vào chính để tương tác với HAL DRM của nhà cung cấp thông qua phương thức createPlugin. Sử dụng phương thức này để tạo IDrmPlugin thực thể.

::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 thực thể HAL DRM AIDL. Trình tự này 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ật mã nhất định hay không, được chỉ định theo UUID:

::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);

Trình tự này 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 định dạng vùng chứa nội dung đa phương tiện nhất định được chỉ định theo mimeType hay không:

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

Trình tự này tạo một trình bổ trợ DRM cho lược đồ mật mã được chỉ định theo UUID:

::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);

Lớp 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 lược đồ mật mã nhất định thông qua lớp CryptoFactory.

Trình tự này xác định xem nhà máy mật mã có thể tạo các trình bổ trợ mật mã hỗ trợ một lược đồ mật mã nhất định được chỉ định theo UUID hay không:

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

Trình tự này xác định xem nhà máy trình bổ trợ có thể tạo các trình bổ trợ mật mã hỗ trợ một lược đồ mật mã nhất định được chỉ định theo 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);

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 xây dựng.