
На этой странице представлен обзор платформы управления цифровыми правами (DRM) Android и представлены интерфейсы, которые должен реализовать плагин DRM. На этой странице не описаны правила надежности или правила соответствия, которые могут быть определены схемой DRM.
Рамки
Платформа Android предоставляет расширяемую структуру DRM, которая позволяет приложениям управлять контентом, защищенным правами, в соответствии с лицензионными ограничениями, связанными с контентом. Платформа DRM поддерживает множество схем DRM; Производитель устройства определяет, какие схемы DRM поддерживает устройство. Платформа DRM предоставляет унифицированный интерфейс для разработчиков приложений и скрывает сложность операций DRM. Структура DRM обеспечивает согласованный режим работы для защищенного и незащищенного контента. Схемы DRM могут определять сложные модели использования с помощью метаданных лицензии. Структура DRM обеспечивает связь между контентом DRM и лицензией, а также обеспечивает управление правами. Это позволяет медиаплееру абстрагироваться от контента, защищенного или незащищенного DRM. См. MediaDrm для класса, чтобы получить ключи для расшифровки защищенных медиапотоков.
На рисунке 1 показан уровень аппаратного извлечения DRM до версии Android 11, а на рисунке 2 показан уровень в Android 11 и более поздних версиях:
Рисунок 1. Уровень аппаратной абстракции DRM до версии Android 11.
Рисунок 2. Уровень аппаратной абстракции 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.
На рисунке 3 показана платформа DRM до версии Android 11, а на рисунке 4 показана платформа в Android 11 и более поздних версиях:
Рисунок 3. Платформа DRM до версии Android 11.
Рисунок 4. Платформа DRM, начиная с Android 11.
Дополнительные сведения см. в MediaDrm и MediaCrypto .
Плагины DRM
При запуске системы платформа DRM сканирует экземпляры и службы HAL (описанные в файлах .rc
) и обнаруживает подключаемые модули. Сервер Media DRM ( mediadrmserver
) создает объекты CryptoHal
и DrmHal
. CryptoHal
и DrmHal
затем вызывают плагины с реализациями, зависящими от поставщика.
Плагины должны реализовывать связанные HAL. Binderized HAL используют язык определения интерфейса Android (AIDL) , который позволяет заменять платформу без необходимости пересборки HAL.
Плагины создаются поставщиками или производителями SOC и помещаются в раздел /vendor
на устройстве. Все устройства, запускаемые с Android 13 или более поздней версии, должны поддерживать связанные HAL, написанные на языке AIDL.
Выполнение
Чтобы реализовать новые API-интерфейсы DRM-инфраструктуры с помощью плагина:
- Добавьте службу плагина в файлы сборки устройства.
- Обновите манифест устройства.
- Добавьте разрешения SELinux.
- Создайте файл
.rc
в каталоге/vendor
. - Реализовать плагин.
API определены в каждой версии IDrmPlugin.aidl
, ICryptoPlugin.aidl
, IDrmFactory.aidl
и ICryptoFactory.aidl
.
aidl/PLATFORM_ROOT/hardware/interfaces/drm/
Добавить службу плагина в файлы сборки устройства
Например, чтобы добавить поддержку интерфейса AIDL, файл VENDOR DEVICE /device.mk
должен включать пакеты android.hardware.drm-service.*
:
PRODUCT_PACKAGES += \ android.hardware.drm-service.clearkey \ android.hardware.drm-service.widevine
Обновите манифест устройства
Файл vendor manifest.xml
для устройства должен содержать следующие записи:
<hal format="aidl"> <name>android.hardware.drm</name> <version>STABLE AIDL VERSION</version> <fqname>ICryptoFactory/clearkey</fqname> <fqname>IDrmFactory/clearkey</fqname> <fqname>ICryptoFactory/widevine</fqname> <fqname>IDrmFactory/widevine</fqname> </hal>
Стабильная версия AIDL — это номер версии каждого выпуска API AIDL (например, 1, 2). В качестве альтернативы мы рекомендуем использовать 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-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
:vndbinder_use(hal_drm_clearkey) allow hal_drm_clearkey servicemanager:binder { call transfer }; allow hal_drm_clearkey hal_drm_service:service_manager add; allow hal_drm_clearkey { appdomain -isolated_app }:fd use; get_prop(ramdump, public_vendor_default_prop)
Создайте файл RC в /vendor.
Файл .rc
определяет действия, которые необходимо выполнить при запуске службы.
Подробности см. в разделе «Язык инициализации Android» .
Реализуйте плагин
- Реализуйте точку входа
main()
в файлеservice.cpp
службы плагина. - Реализуйте
ICryptoPlugin
,IDrmPlugin
,ICryptoFactory
иIDrmFactory
. - Внедрите новые API в плагин.
Подробности о плагине DRM
Поставщики плагинов DRM реализуют DrmFactory
, CryptoFactory
и плагин DRM.
Класс DrmFactory
Класс DrmHal
ищет зарегистрированные службы подключаемых модулей DRM и создает соответствующие подключаемые модули, поддерживающие заданную схему шифрования, через класс DrmFactory
.
IDrmFactory
— это основная точка входа для взаимодействия с DRM HAL поставщика посредством метода createPlugin
. Используйте этот метод для создания экземпляров IDrmPlugin
.
::ndk::ScopedAStatus getSupportedCryptoSchemes( std::vector<::aidl::android::hardware::drm::Uuid>* _aidl_return);
getSupportedCryptoSchemes
возвращает список поддерживаемых криптосхем для экземпляра AIDL DRM HAL. Эта последовательность определяет, может ли фабрика плагинов создавать плагины DRM, поддерживающие данную криптосхему, заданную UUID:
::ndk::ScopedAStatus isCryptoSchemeSupported( const ::aidl::android::hardware::drm::Uuid& in_uuid, const std::string& in_mimeType, ::aidl::android::hardware::drm::SecurityLevel in_securityLevel, bool* _aidl_return);
Эта последовательность определяет, может ли фабрика плагинов создавать плагины DRM, поддерживающие данный формат медиаконтейнера, указанный mimeType
:
::ndk::ScopedAStatus isContentTypeSupported(const std::string& in_mimeType, bool* _aidl_return);
Эта последовательность создает плагин DRM для криптосхемы, указанной UUID:
::ndk::ScopedAStatus createPlugin( const ::aidl::android::hardware::drm::Uuid& in_uuid, const std::string& in_appPackageName, std::shared_ptr<::aidl::android::hardware::drm::IDrmPlugin>* _aidl_return);
Класс КриптоФабрики
Класс CryptoHal
ищет зарегистрированные службы подключаемых модулей DRM и создает соответствующие подключаемые модули, поддерживающие заданную схему шифрования, через класс CryptoFactory
.
Эта последовательность определяет, может ли криптофабрика создавать криптографические плагины, поддерживающие данную криптосхему, заданную UUID:
::ndk::ScopedAStatus isCryptoSchemeSupported( const ::aidl::android::hardware::drm::Uuid& in_uuid, bool* _aidl_return);
Эта последовательность определяет, может ли фабрика плагинов создавать криптографические плагины, поддерживающие данную криптосхему, заданную UUID:
::ndk::ScopedAStatus createPlugin( const ::aidl::android::hardware::drm::Uuid& in_uuid, const std::vector<uint8_t>& in_initData, std::shared_ptr<::aidl::android::hardware::drm::ICryptoPlugin>* _aidl_return);
API-интерфейсы плагинов DRM
API определены вhardware/interfaces/drm/aidl/aidl_api/android.hardware.drm/ VERSION /android/hardware/drm/IDrmPlugin.aidl
. Соответствующий файл IDrmPlugin.h
можно найти в out/Soong
после сборки.