В этом документе представлен обзор платформы управления цифровыми правами (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 интегрирован с платформой Android DRM и может использовать аппаратную защиту для защиты премиум-контента и учетных данных пользователя.
Защита контента, обеспечиваемая подключаемым модулем 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
) и обнаруживает подключаемые модули. Сервер Media DRM ( mediadrmserver
) создает объекты CryptoHal
и DrmHal
. CryptoHal
и DrmHal
затем вызывают плагины с реализациями, зависящими от поставщика.
Плагины должны реализовывать связанные HAL. Binderized HAL используют язык определения интерфейса Android (AIDL) , который позволяет заменять платформу без необходимости пересборки HAL.
Плагины создаются поставщиками или производителями SOC и помещаются в раздел /vendor
на устройстве. Все устройства, запускаемые с Android 13 или более поздней версии, должны поддерживать связанные HAL, написанные на языке AIDL.
Выполнение
Устройства GMS и AOSP для Android 13 должны использовать интерфейс 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 — это номер версии каждого выпуска AIDL API (например, 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 поставщика через API createPlugin. API createPlugin используется для создания экземпляров IDrmPlugin.
::ndk::ScopedAStatus getSupportedCryptoSchemes( std::vector<::aidl::android::hardware::drm::Uuid>* _aidl_return);
getSupportedCryptoSchemes возвращает список поддерживаемых криптосхем для экземпляра AIDL drm HAL.
::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, поддерживающие заданную схему шифрования, заданную UUID.
::ndk::ScopedAStatus isContentTypeSupported(const std::string& in_mimeType, bool* _aidl_return);
Определяет, может ли фабрика плагинов создавать плагины DRM, поддерживающие данный формат медиаконтейнера, указанный mimeType
.
::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);
Создает плагин DRM для криптосхемы, указанной UUID.
КриптоФабрика
Класс CryptoHal
ищет зарегистрированные службы подключаемых модулей DRM и создает соответствующие подключаемые модули, поддерживающие заданную схему шифрования, через класс CryptoFactory
.
::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);
Определяет, может ли фабрика плагинов создавать криптографические плагины, поддерживающие данную криптосхему, заданную UUID.
API-интерфейсы плагинов DRM
API определены вhardware/interfaces/drm/aidl/aidl_api/android.hardware.drm/ VERSION /android/hardware/drm/IDrmPlugin.aidl
. Соответствующий файл IDrmPlugin.h
можно найти в папке out/Soong после сборки.