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.

Фреймворк Android DRM, начиная с Android 11

Рисунок 4. Структура DRM, начиная с Android 11.

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

DRM-плагины

При запуске системы фреймворк DRM сканирует экземпляры и службы HAL (описанные в .rc файлах) и обнаруживает подключаемые модули. Медиа-сервер DRM ( 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 после сборки.