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 после сборки.