DRM

значок Android DRM HAL

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

Рамки

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

На рисунке 1 показан слой извлечения DRM-защиты до Android 11, а на рисунке 2 — слой в Android 11 и более поздних версиях:

Android DRM HAL

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

Android DRM HAL запускается в Android 11.

Рисунок 2. Уровень аппаратной абстракции 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.

На рисунке 3 показана структура DRM до Android 11, а на рисунке 4 — структура в Android 11 и более поздних версиях:

Android DRM-фреймворк

Рисунок 3. Структура DRM до Android 11.

Система DRM для Android начинает работу в Android 11.

Рисунок 4. Структура DRM, запущенная в Android 11.

Более подробную информацию см. в описаниях MediaDrm и MediaCrypto .

Плагины DRM

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

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

Плагины создаются производителями или разработчиками SOC и размещаются в разделе /vendor на устройстве. Все устройства, выпущенные с Android 13 или выше, должны поддерживать HAL-интерфейсы с привязкой к драйверам, написанные на языке 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 — это номер версии каждого выпуска 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 поставщика через метод createPlugin . Используйте этот метод для создания экземпляров IDrmPlugin .

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

getSupportedCryptoSchemes возвращает список поддерживаемых криптографических схем для экземпляра AIDL DRM HAL. Эта последовательность определяет, может ли фабрика плагинов создавать DRM-плагины, поддерживающие заданную криптографическую схему, которая задается 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);

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

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

Эта последовательность создает плагин DRM для криптографической схемы, заданной 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);

Класс CryptoFactory

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

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

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

API плагинов DRM

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