![Значок Android DRM HAL](https://source.android.com/static/devices/images/ape_fwk_hal_drm.png?authuser=19&hl=ru)
В этом документе представлен обзор платформы управления цифровыми правами (DRM) Android и представлены интерфейсы, которые должен реализовывать подключаемый модуль DRM. В этом документе не описываются правила устойчивости или правила соответствия, которые могут быть определены схемой DRM.
Рамки
Платформа Android предоставляет расширяемую структуру DRM, которая позволяет приложениям управлять защищенным контентом в соответствии с лицензионными ограничениями, связанными с контентом. Платформа DRM поддерживает множество схем DRM; Какие схемы DRM поддерживает устройство, зависит от производителя устройства. Платформа DRM предоставляет унифицированный интерфейс для разработчиков приложений и скрывает сложность операций DRM. Платформа DRM обеспечивает согласованный режим работы для защищенного и незащищенного содержимого. Схемы DRM могут определять сложные модели использования с помощью метаданных лицензии. Платформа DRM обеспечивает связь между содержимым DRM и лицензией и управляет правами. Это позволяет медиаплееру быть абстрагированным от контента, защищенного или незащищенного DRM. См. MediaDrm для получения ключей для расшифровки защищенных медиапотоков.
![HAL-управление цифровыми правами для Android](https://source.android.com/static/devices/images/ape_fwk_drm.png?authuser=19&hl=ru)
![Android DRM HAL после R](https://source.android.com/static/devices/images/ape_fwk_drm_postQ.png?authuser=19&hl=ru)
Доступность богатого цифрового контента важна для пользователей мобильных устройств. Чтобы сделать свой контент широко доступным, разработчикам 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](https://source.android.com/static/devices/images/ape_fwk_drm_2.png?authuser=19&hl=ru)
![Платформа управления цифровыми правами Android](https://source.android.com/static/devices/images/ape_fwk_drm_2_postO.png?authuser=19&hl=ru)
Дополнительные сведения см. в разделах 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 с помощью плагина:
- Добавьте сервис плагинов в файлы сборки устройства.
- Обновите манифест устройства.
- Добавьте разрешения SELinux.
- Создайте файл
.rc
в каталоге/vendor
. - Реализовать плагин.
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
для устройства должен содержать следующие записи:
android.hardware.drm hwbinder @1.3::ICryptoFactory/clearkey @1.3::IDrmFactory/clearkey @1.3::ICryptoFactory/widevine @1.3::IDrmFactory/widevine
В качестве альтернативы мы рекомендуем использовать vintf_fragments.
Добавление разрешений SELinux
- Добавить в
VENDOR DEVICE /sepolicy/vendor/file.te
type mediadrm_vendor_data_file, file_type, data_file_type;
- Добавить в
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 - Добавить в
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 .
Реализация плагина
- Реализуйте точку входа
main()
вservice.cpp
службы плагина. -
ICryptoPlugin
,IDrmPlugin
,ICryptoFactory
иIDrmFactory
. - Реализуйте новые 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](https://source.android.com/static/devices/images/ape_fwk_hal_drm.png?authuser=19&hl=ru)
В этом документе представлен обзор платформы управления цифровыми правами (DRM) Android и представлены интерфейсы, которые должен реализовывать подключаемый модуль DRM. В этом документе не описываются правила устойчивости или правила соответствия, которые могут быть определены схемой DRM.
Рамки
Платформа Android предоставляет расширяемую структуру DRM, которая позволяет приложениям управлять защищенным контентом в соответствии с лицензионными ограничениями, связанными с контентом. Платформа DRM поддерживает множество схем DRM; Какие схемы DRM поддерживает устройство, зависит от производителя устройства. Платформа DRM предоставляет унифицированный интерфейс для разработчиков приложений и скрывает сложность операций DRM. Платформа DRM обеспечивает согласованный режим работы для защищенного и незащищенного содержимого. Схемы DRM могут определять сложные модели использования с помощью метаданных лицензии. Платформа DRM обеспечивает связь между содержимым DRM и лицензией и управляет правами. Это позволяет медиаплееру быть абстрагированным от контента, защищенного или незащищенного DRM. См. MediaDrm для получения ключей для расшифровки защищенных медиапотоков.
![HAL-управление цифровыми правами для Android](https://source.android.com/static/devices/images/ape_fwk_drm.png?authuser=19&hl=ru)
![Android DRM HAL после R](https://source.android.com/static/devices/images/ape_fwk_drm_postQ.png?authuser=19&hl=ru)
Доступность богатого цифрового контента важна для пользователей мобильных устройств. Чтобы сделать свой контент широко доступным, разработчикам 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](https://source.android.com/static/devices/images/ape_fwk_drm_2.png?authuser=19&hl=ru)
![Платформа управления цифровыми правами Android](https://source.android.com/static/devices/images/ape_fwk_drm_2_postO.png?authuser=19&hl=ru)
Дополнительные сведения см. в разделах 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 с помощью плагина:
- Добавьте сервис плагинов в файлы сборки устройства.
- Обновите манифест устройства.
- Добавьте разрешения SELinux.
- Создайте файл
.rc
в каталоге/vendor
. - Реализовать плагин.
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
для устройства должен содержать следующие записи:
android.hardware.drm hwbinder @1.3::ICryptoFactory/clearkey @1.3::IDrmFactory/clearkey @1.3::ICryptoFactory/widevine @1.3::IDrmFactory/widevine
В качестве альтернативы мы рекомендуем использовать vintf_fragments.
Добавление разрешений SELinux
- Добавить в
VENDOR DEVICE /sepolicy/vendor/file.te
type mediadrm_vendor_data_file, file_type, data_file_type;
- Добавить в
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 - Добавить в
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 .
Реализация плагина
- Реализуйте точку входа
main()
вservice.cpp
службы плагина. -
ICryptoPlugin
,IDrmPlugin
,ICryptoFactory
иIDrmFactory
. - Реализуйте новые 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 после сборки.