В этом документе представлен обзор платформы управления цифровыми правами (DRM) Android и представлены интерфейсы, которые должен реализовывать подключаемый модуль DRM. В этом документе не описываются правила устойчивости или правила соответствия, которые могут быть определены схемой DRM.
Рамки
Платформа Android предоставляет расширяемую структуру DRM, которая позволяет приложениям управлять защищенным контентом в соответствии с лицензионными ограничениями, связанными с контентом. Платформа DRM поддерживает множество схем DRM; Какие схемы DRM поддерживает устройство, зависит от производителя устройства. Платформа DRM предоставляет унифицированный интерфейс для разработчиков приложений и скрывает сложность операций DRM. Платформа DRM обеспечивает согласованный режим работы для защищенного и незащищенного содержимого. Схемы DRM могут определять сложные модели использования с помощью метаданных лицензии. Платформа DRM обеспечивает связь между содержимым DRM и лицензией и управляет правами. Это позволяет медиаплееру быть абстрагированным от контента, защищенного или незащищенного DRM. См. MediaDrm для получения ключей для расшифровки защищенных медиапотоков.
Доступность богатого цифрового контента важна для пользователей мобильных устройств. Чтобы сделать свой контент широко доступным, разработчикам 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 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 после сборки. , В этом документе представлен обзор платформы управления цифровыми правами (DRM) Android и представлены интерфейсы, которые должен реализовывать подключаемый модуль DRM. В этом документе не описываются правила устойчивости или правила соответствия, которые могут быть определены схемой DRM.
Рамки
Платформа Android предоставляет расширяемую структуру DRM, которая позволяет приложениям управлять защищенным контентом в соответствии с лицензионными ограничениями, связанными с контентом. Платформа DRM поддерживает множество схем DRM; Какие схемы DRM поддерживает устройство, зависит от производителя устройства. Платформа DRM предоставляет унифицированный интерфейс для разработчиков приложений и скрывает сложность операций DRM. Платформа DRM обеспечивает согласованный режим работы для защищенного и незащищенного содержимого. Схемы DRM могут определять сложные модели использования с помощью метаданных лицензии. Платформа DRM обеспечивает связь между содержимым DRM и лицензией и управляет правами. Это позволяет медиаплееру быть абстрагированным от контента, защищенного или незащищенного DRM. См. MediaDrm для получения ключей для расшифровки защищенных медиапотоков.
Доступность богатого цифрового контента важна для пользователей мобильных устройств. Чтобы сделать свой контент широко доступным, разработчикам 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 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 после сборки.