DRM

Значок Android DRM HAL

В этом документе представлен обзор платформы управления цифровыми правами (DRM) Android и представлены интерфейсы, которые должен реализовать плагин DRM. В этом документе не описываются правила надежности или правила соответствия, которые могут быть определены схемой DRM.

Рамки

Платформа Android предоставляет расширяемую структуру DRM, которая позволяет приложениям управлять контентом, защищенным правами, в соответствии с лицензионными ограничениями, связанными с контентом. Платформа DRM поддерживает множество схем DRM; какие схемы DRM поддерживает устройство, зависит от производителя устройства. Платформа DRM предоставляет унифицированный интерфейс для разработчиков приложений и скрывает сложность операций DRM. Структура DRM обеспечивает согласованный режим работы для защищенного и незащищенного контента. Схемы DRM могут определять сложные модели использования с помощью метаданных лицензии. Структура DRM обеспечивает связь между контентом DRM и лицензией, а также обеспечивает управление правами. Это позволяет медиаплееру абстрагироваться от контента, защищенного или незащищенного DRM. См. MediaDrm для класса, чтобы получить ключи для расшифровки защищенных медиапотоков.

Android DRM HAL
Рисунок 1а. Уровень аппаратной абстракции DRM до Android 11
Android DRM HAL пост R
Рисунок 1б. Уровень аппаратной абстракции DRM, начиная с Android 11.

Доступность насыщенного цифрового контента важна для пользователей мобильных устройств. Чтобы сделать свой контент широко доступным, разработчикам Android и издателям цифрового контента необходима последовательная реализация DRM, поддерживаемая во всей экосистеме Android. Чтобы сделать этот цифровой контент доступным на устройствах Android и гарантировать, что на всех устройствах доступен хотя бы один согласованный DRM, Google предоставляет DRM без лицензионных сборов на совместимых устройствах Android. Плагин DRM интегрирован с платформой Android DRM и может использовать аппаратную защиту для защиты премиум-контента и учетных данных пользователя.

Защита контента, обеспечиваемая подключаемым модулем DRM, зависит от возможностей безопасности и защиты контента базовой аппаратной платформы. Аппаратные возможности устройства должны включать аппаратную безопасную загрузку для создания цепочки доверия безопасности и защиты криптографических ключей. Возможности защиты контента устройства должны включать защиту расшифрованных кадров в устройстве и защиту контента с помощью доверенного механизма защиты вывода. Не все аппаратные платформы поддерживают все вышеперечисленные функции безопасности и защиты контента. Безопасность никогда не реализуется в одном месте стека, а опирается на интеграцию оборудования, программного обеспечения и служб. Сочетание аппаратных функций безопасности, надежного механизма загрузки и изолированной безопасной ОС для выполнения функций безопасности имеет решающее значение для обеспечения безопасности устройства.

Архитектура

Платформа DRM разработана так, чтобы быть независимой от реализации и абстрагирует детали реализации конкретной схемы DRM в подключаемом модуле DRM для конкретной схемы. Платформа DRM включает в себя простые API-интерфейсы для обработки сложных операций DRM, получения лицензий, подготовки устройства, связывания контента DRM и его лицензии и, наконец, расшифровки контента DRM.

Платформа Android DRM реализована на двух архитектурных уровнях:

  • API платформы DRM, который доступен приложениям через платформу приложений Android.
  • Платформа DRM с собственным кодом, которая предоставляет интерфейс для подключаемых модулей (агентов) DRM для управления правами и расшифровки для различных схем DRM.
Платформа DRM для Android
Рисунок 2а. Платформа DRM до Android 11
Платформа DRM для Android
Рисунок 2б. Платформа DRM, начиная с Android 11

Дополнительные сведения см. в разделах Android Media DRM и Android Media Crypto .

Плагины DRM

При запуске системы платформа DRM сканирует экземпляры/службы HAL (описанные в файлах .rc ) и обнаруживает подключаемые модули. Сервер Media DRM ( mediadrmserver ) создает объекты CryptoHal и DrmHal . CryptoHal и DrmHal затем вызывают плагины с реализациями, зависящими от поставщика.

Плагины должны реализовывать связанные HAL. Binderized HAL используют язык определения интерфейса Android (AIDL) , который позволяет заменять платформу без необходимости пересборки HAL.

Плагины создаются поставщиками или производителями SOC и помещаются в раздел /vendor на устройстве. Все устройства, запускаемые с Android 13 или более поздней версии, должны поддерживать связанные HAL, написанные на языке AIDL.

Выполнение

Устройства GMS и AOSP для Android 13 должны использовать интерфейс AIDL.

Чтобы реализовать новые API-интерфейсы DRM-инфраструктуры с помощью плагина:

  1. Добавьте службу плагина в файлы сборки устройства.
  2. Обновите манифест устройства.
  3. Добавьте разрешения SELinux.
  4. Создайте файл .rc в каталоге /vendor .
  5. Реализовать плагин.

API определены в каждой версии IDrmPlugin.aidl , ICryptoPlugin.aidl , IDrmFactory.aidl и ICryptoFactory.aidl

aidl/PLATFORM_ROOT/hardware/interfaces/drm/

Добавить службу плагина в файлы сборки устройства

Например, чтобы добавить поддержку интерфейса AIDL, файл VENDOR DEVICE /device.mk должен включать пакеты android.hardware.drm-service.* :


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

Обновите манифест устройства

Файл vendor manifest.xml для устройства должен содержать следующие записи:

  <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>

СТАБИЛЬНАЯ ВЕРСИЯ AIDL — это номер версии каждого выпуска AIDL API (например, 1, 2). В качестве альтернативы мы рекомендуем использовать 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-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
        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)
        

Создайте файл RC в /vendor.

Файл .rc определяет действия, которые необходимо выполнить при запуске службы.

Подробности см. в разделе «Язык инициализации Android» .

Реализуйте плагин

  1. Реализуйте точку входа main() в service.cpp службы плагина.
  2. Реализуйте ICryptoPlugin , IDrmPlugin , ICryptoFactory и IDrmFactory .
  3. Внедрите новые API в плагин.

Подробности о плагине DRM

Поставщики плагинов DRM реализуют плагин DrmFactory , CryptoFactory и DRM.

DrmFactory

Класс DrmHal ищет зарегистрированные службы подключаемых модулей DRM и создает соответствующие подключаемые модули, поддерживающие заданную схему шифрования, через класс DrmFactory .

IDrmFactory — это основная точка входа для взаимодействия с drm HAL поставщика через API createPlugin. API createPlugin используется для создания экземпляров IDrmPlugin.

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

getSupportedCryptoSchemes возвращает список поддерживаемых криптосхем для экземпляра 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);

Определяет, может ли фабрика плагинов создавать плагины DRM, поддерживающие заданную схему шифрования, заданную UUID.

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

Определяет, может ли фабрика плагинов создавать плагины DRM, поддерживающие данный формат медиаконтейнера, указанный mimeType .

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

Создает плагин DRM для криптосхемы, указанной UUID.

КриптоФабрика

Класс CryptoHal ищет зарегистрированные службы подключаемых модулей DRM и создает соответствующие подключаемые модули, поддерживающие заданную схему шифрования, через класс CryptoFactory .

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

Определяет, может ли криптофабрика создавать криптографические плагины, поддерживающие данную криптосхему, заданную UUID.

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

Определяет, может ли фабрика плагинов создавать криптографические плагины, поддерживающие данную криптосхему, заданную UUID.

API-интерфейсы плагинов DRM

API определены в hardware/interfaces/drm/aidl/aidl_api/android.hardware.drm/ VERSION /android/hardware/drm/IDrmPlugin.aidl . Соответствующий файл IDrmPlugin.h можно найти в папке out/Soong после сборки.