DRM, DRM

Значок Android DRM HAL

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

Рамки

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

HAL-управление цифровыми правами для Android
Рисунок 1а. Слой аппаратной абстракции DRM до Android 11
Android DRM HAL после R
Рисунок 1б. Слой аппаратной абстракции DRM, начиная с Android 11

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

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

Архитектура

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

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

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

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

Плагины DRM

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

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

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

Реализация

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

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

  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 — это номер версии каждого выпуска API AIDL (например, 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 после сборки.