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 ), а подключаемые модули обнаруживаются через реестр HIDL. Media DRM Server ( mediadrmserver ) создает объекты CryptoHal и DrmHal . CryptoHal и DrmHal вызывают плагины с реализациями, специфичными для поставщиков.

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

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

Реализация

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

  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 и подключаемый модуль DRM.

DrmFactory

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

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

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.

КриптоФабрика

Класс 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 после сборки. , Значок 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 ), а подключаемые модули обнаруживаются через реестр HIDL. Media DRM Server ( mediadrmserver ) создает объекты CryptoHal и DrmHal . CryptoHal и DrmHal вызывают плагины с реализациями, специфичными для поставщиков.

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

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

Реализация

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

  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 и подключаемый модуль DRM.

DrmFactory

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

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

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.

КриптоФабрика

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