DRM

Ícono de HAL de DRM de Android

En esta página, se proporciona una descripción general del framework de administración de derechos digitales (DRM) de Android y se presentan las interfaces que debe implementar un complemento de DRM. En esta página, no se describen las reglas de robustez ni de cumplimiento que podría definir un esquema de DRM.

Framework

La plataforma de Android proporciona un framework de DRM extensible que permite a las apps administrar contenido protegido por derechos según las restricciones de licencia asociadas con el contenido. El framework de DRM admite muchos esquemas de DRM. El fabricante del dispositivo determina qué esquemas de DRM admite un dispositivo. El framework de DRM proporciona una interfaz unificada para los desarrolladores de apps y oculta la complejidad de las operaciones de DRM. El framework de DRM proporciona un modo de operación coherente para el contenido protegido y no protegido. Los esquemas de DRM pueden definir modelos de uso complejos según los metadatos de la licencia. El framework de DRM proporciona la asociación entre el contenido y la licencia de DRM, y controla la administración de derechos. Esto permite que el reproductor multimedia se abstraiga del contenido protegido o no por DRM. Consulta MediaDrm para obtener la clase que permite obtener claves para desencriptar transmisiones de contenido multimedia protegidas.

En la Figura 1, se muestra la capa de extracción de hardware de DRM antes de Android 11, y en la Figura 2, se muestra la capa en Android 11 y versiones posteriores:

HAL de DRM de Android

Figura 1: Capa de abstracción de hardware de DRM anterior a Android 11

Inicio de la HAL de Android DRM en Android 11

Figura 2: Capa de abstracción de hardware de DRM a partir de Android 11

La disponibilidad de contenido digital enriquecido es importante para los usuarios que usan dispositivos móviles. Para que su contenido esté disponible en todo el mundo, los desarrolladores de Android y los publicadores de contenido digital necesitan una implementación de la DRM coherente que sea compatible con todo el ecosistema de Android. Para que ese contenido digital esté disponible en dispositivos Android y garantizar que haya al menos un DRM coherente disponible en todos los dispositivos, Google proporciona DRM sin tarifas de licencia en dispositivos Android compatibles. El complemento de DRM está integrado en el framework de DRM de Android y puede usar protección con copia de seguridad de hardware para proteger el contenido premium y las credenciales del usuario.

La protección del contenido que proporciona el complemento de DRM depende de las capacidades de seguridad y protección del contenido de la plataforma de hardware subyacente. Las funciones de hardware del dispositivo deben incluir un inicio 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 tramas desencriptadas en el dispositivo y la protección de contenido a través de un mecanismo de protección de salida de confianza. No todas las plataformas de hardware admiten todas las funciones de seguridad y protección de contenido anteriores. La seguridad nunca se implementa en un solo lugar de la pila, sino que se basa en la integración de hardware, software y servicios. La combinación de funciones de seguridad de hardware, un mecanismo de inicio confiable y un SO seguro y aislado para controlar las funciones de seguridad es fundamental para proporcionar un dispositivo seguro.

Arquitectura

El framework de DRM está diseñado para no depender de la implementación y abstrae los detalles de la implementación específica del esquema de DRM en un complemento de DRM específico del esquema. El framework de DRM incluye APIs simples para controlar operaciones de DRM complejas, adquirir licencias, aprovisionar el dispositivo, asociar el contenido de DRM y su licencia, y, por último, desencriptar el contenido de DRM.

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

  • Una API de framework de DRM, que se expone a las apps a través del framework de apps de Android
  • Un framework de DRM de código nativo, que expone una interfaz para que los complementos (agentes) de DRM controlen la administración de derechos y la desencriptación de varios esquemas de DRM

En la Figura 3, se muestra el framework de DRM antes de Android 11, y en la Figura 4, se muestra el framework en Android 11 y versiones posteriores:

Framework de DRM de Android

Figura 3: Marco de trabajo de DRM anterior a Android 11

Inicio del framework de DRM de Android en Android 11

Figura 4: Marco de trabajo de DRM a partir de Android 11

Consulta MediaDrm y MediaCrypto para obtener más información.

Complementos de DRM

Durante el inicio del sistema, el framework de DRM busca instancias y servicios de HAL (que se describen en los archivos .rc ) y descubre complementos. El servidor de DRM de contenido multimedia (mediadrmserver) crea objetos CryptoHal y DrmHal. Luego, CryptoHal y DrmHal llaman a los complementos con implementaciones específicas del proveedor.

Los complementos deben implementar HALs vinculados. Los HAL vinculados usan el Lenguaje de definición de la interfaz de Android (AIDL), que permite reemplazar el framework sin tener que volver a compilar los HAL.

Los proveedores o los creadores de SoC compilan los complementos y los colocan en una partición /vendor en el dispositivo. Todos los dispositivos que se lancen con Android 13 o versiones posteriores deben admitir HALs vinculados escritos en el lenguaje AIDL.

Implementación

Para implementar nuevas APIs de frameworks de DRM con un complemento, haz lo siguiente:

  1. Agrega el servicio del complemento a los archivos de compilación del dispositivo.
  2. Actualiza el manifiesto del dispositivo.
  3. Agrega permisos de SELinux.
  4. Crea un archivo .rc en /vendor.
  5. Implementa el complemento.

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

aidl/PLATFORM_ROOT/hardware/interfaces/drm/

Agrega el servicio del 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

Actualiza el manifiesto del dispositivo

El archivo vendor manifest.xml del 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 la API de AIDL (por ejemplo, 1, 2). Como alternativa, te recomendamos que uses vintf_fragments.

Agrega permisos de SELinux

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

Crea un archivo RC en /vendor.

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

Consulta Lenguaje de inicialización de Android para obtener más información.

Implementa el complemento

  1. Implementa el punto de entrada main() en service.cpp del servicio del plugin.
  2. Implementa ICryptoPlugin, IDrmPlugin, ICryptoFactory y IDrmFactory.
  3. Implementa las nuevas APIs en el complemento.

Detalles del complemento de DRM

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

Clase DrmFactory

La clase DrmHal busca servicios de complementos de 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 HAL de DRM de un proveedor a través del método createPlugin. Usa este método para crear instancias de IDrmPlugin.

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

getSupportedCryptoSchemes muestra una lista de esquemas de criptografía compatibles para la instancia de HAL de DRM de AIDL. Esta secuencia determina si la fábrica de complementos puede crear complementos de DRM que admitan un esquema de criptografía determinado, que se especifica con un 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);

Esta secuencia determina si la fábrica de complementos puede crear complementos de DRM que admitan un formato de contenedor multimedia determinado que especifique mimeType:

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

Esta secuencia construye un complemento de DRM para el esquema de criptografía especificado por 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);

Clase CryptoFactory

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

Esta secuencia determina si la fábrica de criptografía puede crear complementos de criptografía que admitan un esquema de criptografía determinado, que se especifica con un UUID:

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

Esta secuencia determina si la fábrica de complementos puede crear complementos de criptografía que admitan un esquema de criptografía determinado, que se especifica con 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);

APIs de complementos de DRM

Las APIs 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.