DRM

Icono DRM HAL de Android

Este documento proporciona una descripción general del marco de gestión de derechos digitales (DRM) de Android e introduce las interfaces que debe implementar un complemento DRM. Este documento no describe reglas de solidez ni reglas de cumplimiento que puedan definirse mediante un esquema DRM.

Estructura

La plataforma Android proporciona un marco DRM extensible que permite a las aplicaciones administrar contenido protegido por derechos de acuerdo con las restricciones de licencia asociadas con el contenido. El marco DRM soporta muchos esquemas DRM; Los esquemas DRM que admite un dispositivo dependen del fabricante del dispositivo. El marco DRM proporciona una interfaz unificada para los desarrolladores de aplicaciones y oculta la complejidad de las operaciones DRM. El marco DRM proporciona un modo de operación consistente para contenido protegido y no protegido. Los esquemas DRM pueden definir modelos de uso complejos mediante metadatos de licencia. El marco DRM proporciona la asociación entre el contenido DRM y la licencia, y maneja la gestión de derechos. Esto permite que el reproductor multimedia se abstraiga del contenido protegido o no protegido por DRM. Consulte MediaDrm para conocer la clase sobre cómo obtener claves para descifrar transmisiones multimedia protegidas.

Android DRM-HAL
Figura 1a. Capa de abstracción de hardware DRM antes de Android 11
Android DRM HAL publicación R
Figura 1b. Capa de abstracción de hardware DRM a partir de Android 11

La disponibilidad de contenido digital enriquecido es importante para los usuarios de dispositivos móviles. Para que su contenido esté ampliamente disponible, los desarrolladores de Android y los editores de contenido digital necesitan una implementación DRM consistente compatible en todo el ecosistema de Android. Para que ese contenido digital esté disponible en dispositivos Android y garantizar que haya al menos un DRM consistente disponible en todos los dispositivos, Google proporciona DRM sin cargos de licencia en dispositivos Android compatibles. El complemento DRM está integrado con el marco DRM de Android y puede utilizar protección respaldada por hardware para proteger el contenido premium y las credenciales de usuario.

La protección de contenido proporcionada por el complemento DRM depende de las capacidades de seguridad y protección de contenido de la plataforma de hardware subyacente. Las capacidades de hardware del dispositivo deben incluir un arranque seguro de hardware para establecer una cadena de confianza de seguridad y protección de claves criptográficas. Las capacidades de protección de contenido del dispositivo deben incluir la protección de fotogramas descifrados en el dispositivo y la protección de contenido a través de un mecanismo de protección de salida confiable. No todas las plataformas de hardware admiten todas las funciones de seguridad y protección de contenido mencionadas anteriormente. La seguridad nunca se implementa en un solo lugar de la pila, sino que depende de la integración de hardware, software y servicios. La combinación de funciones de seguridad de hardware, un mecanismo de arranque confiable y un sistema operativo seguro aislado para manejar las funciones de seguridad es fundamental para proporcionar un dispositivo seguro.

Arquitectura

El marco DRM está diseñado para ser independiente de la implementación y abstrae los detalles de la implementación del esquema DRM específico en un complemento DRM específico del esquema. El marco DRM incluye API simples para manejar operaciones DRM complejas, adquirir licencias, aprovisionar el dispositivo, asociar contenido DRM y su licencia y, finalmente, descifrar contenido DRM.

El marco DRM de Android se implementa en dos capas arquitectónicas:

  • Una API de marco DRM, que está expuesta a aplicaciones a través del marco de aplicaciones de Android.
  • Un marco DRM de código nativo, que expone una interfaz para complementos (agentes) DRM para manejar la gestión de derechos y el descifrado para varios esquemas DRM.
Marco DRM de Android
Figura 2a. Marco DRM antes de Android 11
Marco DRM de Android
Figura 2b. Marco DRM a partir de Android 11

Consulte Android Media DRM y Android Media Crypto para obtener más detalles.

Complementos DRM

Al iniciar el sistema, el marco DRM busca instancias/servicios HAL (descritos en archivos .rc ) y descubre complementos. Media DRM Server ( mediadrmserver ) crea objetos CryptoHal y DrmHal . Luego, CryptoHal y DrmHal llaman a los complementos con implementaciones específicas del proveedor.

Los complementos deben implementar HAL enlazados. Los HAL enlazados utilizan el lenguaje de definición de interfaz de Android (AIDL) , que permite reemplazar el marco sin tener que reconstruir los HAL.

Los complementos los crean proveedores o fabricantes de SOC y se colocan en una partición /vendor en el dispositivo. Todos los dispositivos que se inician con Android 13 o superior deben admitir HAL enlazados escritos en el lenguaje AIDL.

Implementación

Los dispositivos GMS y AOSP lanzados para Android 13 deben usar la interfaz AIDL.

Para implementar nuevas API de marcos DRM mediante un complemento:

  1. Agregue el servicio de complemento a los archivos de compilación del dispositivo.
  2. Actualice el manifiesto del dispositivo.
  3. Agregue permisos de SELinux.
  4. Cree un archivo .rc en /vendor .
  5. Implementar el complemento.

Las API se definen en cada versión de IDrmPlugin.aidl , ICryptoPlugin.aidl , IDrmFactory.aidl y ICryptoFactory.aidl

aidl/PLATFORM_ROOT/hardware/interfaces/drm/

Agregar servicio de complemento a los archivos de compilación del dispositivo

Por ejemplo, para agregar compatibilidad con la interfaz AIDL, el archivo VENDOR DEVICE /device.mk debe incluir los paquetes android.hardware.drm-service.* :


  PRODUCT_PACKAGES += \
    android.hardware.drm-service.clearkey \
    android.hardware.drm-service.widevine

Actualizar el manifiesto del dispositivo

El archivo vendor manifest.xml para el dispositivo debe incluir las siguientes entradas:

  <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>

La VERSIÓN ESTABLE DE AIDL es el número de versión de cada versión de API AIDL (por ejemplo, 1, 2). Como alternativa, recomendamos utilizar vintf_fragments.

Agregar permisos de SELinux

  1. Agregar al VENDOR DEVICE /sepolicy/vendor/file.te
    type mediadrm_vendor_data_file, file_type, data_file_type;
  2. Agregar al 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. Agregar 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)
        

Cree un archivo RC en /vendor

El archivo .rc especifica las acciones que se deben realizar cuando se inicia un servicio.

Consulte Idioma de inicio de Android para obtener más detalles.

Implementar el complemento

  1. Implemente el punto de entrada main() en service.cpp del servicio de complemento.
  2. Implemente ICryptoPlugin , IDrmPlugin , ICryptoFactory e IDrmFactory .
  3. Implemente las nuevas API en el complemento.

Detalles del complemento DRM

Los proveedores de complementos DRM implementan DrmFactory , CryptoFactory y el complemento DRM.

DrmFábrica

La clase DrmHal busca servicios de complementos DRM registrados y construye los complementos correspondientes que admiten un esquema criptográfico determinado a través de la clase DrmFactory .

IDrmFactory es el punto de entrada principal para interactuar con el drm HAL de un proveedor a través de la API createPlugin. La API createPlugin se utiliza para crear instancias de IDrmPlugin.

::ndk::ScopedAStatus getSupportedCryptoSchemes(
    std::vector<::aidl::android::hardware::drm::Uuid>* _aidl_return);

getSupportedCryptoSchemes devuelve una lista de esquemas criptográficos admitidos para la instancia 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);

Determina si la fábrica de complementos puede construir complementos DRM que admitan un esquema criptográfico determinado, que se especifica mediante un UUID.

::ndk::ScopedAStatus isContentTypeSupported(const std::string& in_mimeType,
    bool* _aidl_return);

Determina si la fábrica de complementos puede construir complementos DRM que admitan un formato de contenedor de medios determinado especificado por 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);

Construye un complemento DRM para el esquema criptográfico especificado por UUID.

Criptofábrica

La clase CryptoHal busca servicios de complementos DRM registrados y construye los complementos correspondientes que admiten un esquema criptográfico determinado a través de la clase CryptoFactory .

::ndk::ScopedAStatus isCryptoSchemeSupported(
    const ::aidl::android::hardware::drm::Uuid& in_uuid,
    bool* _aidl_return);

Determina si la fábrica de cifrado puede construir complementos de cifrado que admitan un esquema de cifrado determinado, que se especifica mediante un 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);

Determina si la fábrica de complementos puede construir complementos criptográficos que admitan un esquema criptográfico determinado, que se especifica mediante un UUID.

API de complementos DRM

Las API se definen en hardware/interfaces/drm/aidl/aidl_api/android.hardware.drm/ VERSION /android/hardware/drm/IDrmPlugin.aidl . El archivo IDrmPlugin.h correspondiente se puede encontrar en out/Soong después de la compilación.