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