DRM

Значок Android DRM HAL

На этой странице приводится обзор фреймворка Android для управления цифровыми правами (DRM) и рассказывается об интерфейсах, которые должен реализовать плагин DRM. На этой странице не описаны правила надежности или соответствия, которые могут быть определены схемой DRM.

Framework

Платформа Android предоставляет расширяемую платформу DRM, которая позволяет приложениям управлять контентом, защищенным авторскими правами, в соответствии с лицензионными ограничениями, связанными с контентом. Платформа DRM поддерживает множество схем DRM. Производитель устройства определяет, какие схемы DRM поддерживаются устройством. Фреймворк DRM предоставляет разработчикам приложений единый интерфейс и скрывает сложные операции DRM. Фреймворк DRM обеспечивает согласованный режим работы для защищенного и незащищенного контента. Схемы DRM позволяют определять сложные модели использования с помощью метаданных лицензий. Фреймворк DRM обеспечивает связь между контентом, защищенным DRM, и лицензией, а также управляет правами. Это позволяет медиапроигрывателю абстрагироваться от контента, защищенного или не защищенного DRM. Подробнее о классе MediaDrm, который позволяет получать ключи для расшифровки защищенных медиапотоков…

На рисунке 1 показан уровень извлечения аппаратного обеспечения DRM до Android 11, а на рисунке 2 – уровень в Android 11 и более поздних версиях:

Android DRM HAL

Рисунок 1. Уровень абстракции оборудования DRM до Android 11.

Android DRM HAL, начиная с Android 11

Рисунок 2. Уровень аппаратной абстракции DRM, начиная с Android 11.

Пользователям мобильных устройств важно иметь доступ к разнообразному цифровому контенту. Чтобы контент был доступен широкому кругу пользователей, разработчикам приложений для Android и издателям цифрового контента необходимо реализовать единую систему управления цифровыми правами, которая поддерживается во всей экосистеме Android. Чтобы цифровой контент был доступен на устройствах Android и чтобы на всех устройствах была хотя бы одна совместимая система DRM, Google предоставляет DRM без платы за лицензию на совместимых устройствах Android. Плагин DRM интегрирован с фреймворком DRM Android и может использовать аппаратную защиту для защиты платного контента и учетных данных пользователей.

Защита контента, предоставляемая плагином DRM, зависит от возможностей безопасности и защиты контента базовой аппаратной платформы. Аппаратные возможности устройства должны включать аппаратную безопасную загрузку для создания цепочки доверия и защиты криптографических ключей. Функции защиты контента на устройстве должны включать защиту расшифрованных кадров на устройстве и защиту контента с помощью надежного механизма защиты выходных данных. Не все аппаратные платформы поддерживают все перечисленные выше функции безопасности и защиты контента. Безопасность никогда не реализуется в одном месте стека, а вместо этого полагается на интеграцию аппаратного обеспечения, программного обеспечения и сервисов. Сочетание аппаратных функций безопасности, механизма доверенной загрузки и изолированной безопасной ОС для обработки функций безопасности имеет решающее значение для обеспечения безопасности устройства.

Архитектура

Структура DRM разработана таким образом, чтобы не зависеть от реализации и абстрагироваться от деталей реализации определенной схемы DRM в плагине DRM, относящемся к этой схеме. Фреймворк DRM включает простые API для выполнения сложных операций DRM, получения лицензий, подготовки устройства, связывания контента DRM и его лицензии и, наконец, расшифровки контента DRM.

Фреймворк DRM для Android реализован на двух архитектурных уровнях:

  • API фреймворка DRM, который предоставляется приложениям через фреймворк приложений Android.
  • Фреймворк DRM с собственным кодом, который предоставляет интерфейс для плагинов DRM (агентов), чтобы управлять правами и расшифровывать контент для различных схем DRM.

На рисунке 3 показана структура DRM до Android 11, а на рисунке 4 – структура в Android 11 и более поздних версиях ОС:

Фреймворк Android DRM

Рисунок 3. Фреймворк DRM до Android 11.

Фреймворк Android DRM, начиная с Android 11

Рисунок 4. Фреймворк DRM, начиная с Android 11.

Подробную информацию можно найти в документации по MediaDrm и MediaCrypto.

Плагины DRM

При запуске системы фреймворк DRM сканирует экземпляры HAL и сервисы (описанные в файлах .rc ) и обнаруживает плагины. Сервер Media DRM (mediadrmserver) создает объекты CryptoHal и DrmHal. CryptoHal и DrmHal вызывают плагины с реализациями для конкретных поставщиков.

Плагины должны реализовывать HAL с использованием Binder. В HAL, использующих Binder, применяется язык описания интерфейсов Android (AIDL), который позволяет заменять фреймворк без пересборки HAL.

Плагины создаются поставщиками или производителями процессоров и помещаются в раздел /vendor на устройстве. Все устройства, на которых установлена ОС Android 13 или более поздняя версия, должны поддерживать HAL-интерфейсы, написанные на языке AIDL.

Реализация

Чтобы реализовать новые API фреймворков DRM с помощью плагина:

  1. Добавьте сервис плагинов в файлы сборки устройства.
  2. Обновите манифест устройства.
  3. Добавьте разрешения SELinux.
  4. Создайте файл .rc в папке /vendor.
  5. Реализуйте плагин.

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

  1. Добавьте разрешения для VENDOR DEVICE/sepolicy/vendor/file.te:
    type mediadrm_vendor_data_file, file_type, data_file_type;
  2. Добавьте разрешения для 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
  3. Добавьте разрешения для 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 Init Language.

Как реализовать плагин

  1. Реализуйте точку входа main() в service.cpp сервиса плагина.
  2. Внедрите правила ICryptoPlugin, IDrmPlugin, ICryptoFactory и IDrmFactory.
  3. Реализуйте новые API в плагине.

Сведения о плагине DRM

Поставщики плагинов DRM реализуют DrmFactory, CryptoFactory и плагин DRM.

Класс DrmFactory

Класс DrmHal ищет зарегистрированные сервисы плагинов DRM и создает соответствующие плагины, которые поддерживают заданную схему шифрования, с помощью класса DrmFactory.

IDrmFactory – основная точка входа для взаимодействия с HAL DRM поставщика с помощью метода 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.