Google стремится продвигать расовую справедливость для черных сообществ. Смотри как.
Эта страница была переведа с помощью Cloud Translation API.
Switch to English

DRM

Значок Android DRM HAL

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

Фреймворк

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

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

Доступность богатого цифрового контента важна для пользователей на мобильных устройствах. Чтобы сделать свой контент широко доступным, разработчикам 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 Framework
Рисунок 2. Структура DRM

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

Плагины DRM

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

плагины должны реализовывать бинарные HAL. Binderized 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 .

PLATFORM_ROOT /hardware/interfaces/drm/ VERSION /

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

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


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

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

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


  <hal format="hidl">
    <name>android.hardware.drm</name>
      <transport>hwbinder</transport>
      <version>1.0</version>
      <interface>
        <name>ICryptoFactory</name>
        <instance>default</instance>
      </interface>
      <interface>
        <name>IDrmFactory</name>
        <instance>default</instance>
      </interface>
      <fqname>@1.2::ICryptoFactory/clearkey</fqname>
      <fqname>@1.2::IDrmFactory/clearkey</fqname>
      <fqname>@1.2::ICryptoFactory/widevine</fqname>
      <fqname>@1.2::IDrmFactory/widevine</fqname>
  </hal>

Добавление разрешений 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@1\.2-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 Init Language для деталей.

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

  1. Реализуйте точку входа main() в service.cpp службы плагинов.
  2. Реализовать CryptoFactory и DrmFactory .
  3. Реализуйте новые API в плагине.

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

Поставщики плагинов DRM внедряют плагин DrmFactory , CryptoFactory и DRM.

DrmFactory

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

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