Google 致力于为黑人社区推动种族平等。查看具体举措
Эта страница была переведа с помощью Cloud Translation API.
Switch to English

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
Рисунок 1b. Уровень аппаратной абстракции 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.
Платформа Android DRM
Рисунок 2а. Фреймворк DRM до Android 11
Платформа Android DRM
Рисунок 2b. Фреймворк DRM, начиная с Android 11

Смотрите Android Media DRM и Android Media Crypto для получения дополнительной информации.

Плагины DRM

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

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

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

Реализация

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

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

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

PLATFORM_ROOT/hardware/interfaces/drm/VERSION/

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

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

Версии от 1.0 до 1.2 объявлены устаревшими в R / Android 11. Устройства, обновляющиеся до R, по-прежнему могут работать с версиями от 1.0 до 1.2. Однако новые устройства, запускаемые с R, должны работать только с версией 1.3.


  PRODUCT_PACKAGES += \
    android.hardware.drm@1.0-impl \
    android.hardware.drm@1.0-service \
    android.hardware.drm@1.3-service.clearkey \
    android.hardware.drm@1.3-service.widevine

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

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


  <hal format="hidl">
    <name>android.hardware.drm</name>
      <transport>hwbinder</transport>
      <fqname>@1.3::ICryptoFactory/clearkey</fqname>
      <fqname>@1.3::IDrmFactory/clearkey</fqname>
      <fqname>@1.3::ICryptoFactory/widevine</fqname>
      <fqname>@1.3::IDrmFactory/widevine</fqname>
  </hal>

В качестве альтернативы мы рекомендуем использовать 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@\[0-9]+\.[0-9]+-service\.clearkey
          u:object_r:hal_drm_clearkey_exec:s0
    /data/vendor/mediadrm(/.*)? u:object_r:mediadrm_vendor_data_file:s0

    Либо обновите номера версий, как показано ниже.

    /vendor/bin/hw/android\.hardware\.drm@1\.3-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
    allow hal_drm_clearkey mediadrm_vendor_data_file:dir create_dir_perms;
        allow hal_drm_clearkey mediadrm_vendor_data_file:file create_file_perms;
        

Создание файла .rc в / vendor

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

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

Реализация плагина

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

Детали плагина DRM

Поставщики подключаемых модулей DRM реализуют DrmFactory CryptoFactory DrmFactory , CryptoFactory и DRM.

DrmFactory

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

IDrmFactory - это основная точка входа для взаимодействия с DRM HAL поставщика через API createPlugin. API createPlugin используется для создания экземпляров IDrmPlugin. 1.3 IDrmFactory всегда должен создавать интерфейсы 1.2 IDrmPlugin, которые возвращаются через метод 1.0 createPlugin.

Return<void> getSupportedCryptoSchemes(getSupportedCryptoSchemes_cb _hidl_cb);

Функция getSupportedCryptoSchemes, появившаяся в версии 1.3 IDrmFactory, возвращает список поддерживаемых криптографических схем для экземпляра HIDL drm HAL.

Return<bool> isCryptoSchemeSupported(const hidl_array<uint8_t, 16>uuid);

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

Return<bool> isContentTypeSupported(const hidl_string &mimeType);

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

Return<void> createPlugin(const hidl_array<uint8_t, 16>uuid,
        const hidl_string& appPackageName, createPlugin_cb _hidl_cb);

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

CryptoFactory

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

Return<bool> isCryptoSchemeSupported(const hidl_array<uint8_t, 16>uuid);

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

Return<void> createPlugin(const hidl_array<uint8_t, 16>uuid,
        const hidl_vec<uint8_t>initData, createPlugin_cb _hidl_cb)

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

Плагин DRM

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