DRM

Ícono de HAL DRM de Android

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

Estructura

La plataforma Android proporciona un marco DRM extensible que permite que las aplicaciones administren contenido protegido por derechos de acuerdo con las restricciones de licencia asociadas con el contenido. El marco DRM admite muchos esquemas DRM; qué esquemas DRM admite un dispositivo depende 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 por 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 para obtener claves para descifrar flujos de medios protegidos.

HAL DRM de Android
Figura 1a. Capa de abstracción de hardware DRM antes de Android 11
Android DRM HAL publicar 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 de DRM consistente compatible con todo el ecosistema de Android. Para que el 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 cargos de licencia en dispositivos Android compatibles. El complemento DRM está integrado con el marco DRM de Android y puede usar 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 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 marcos 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 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 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 se expone a las aplicaciones a través del marco de aplicaciones de Android.
  • Un marco DRM de código nativo, que expone una interfaz para complementos DRM (agentes) 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 los complementos se descubren a través del registro HIDL. Media DRM Server ( mediadrmserver ) crea objetos CryptoHal y DrmHal . CryptoHal y DrmHal luego llaman a los complementos con implementaciones específicas del proveedor.

Los complementos deben implementar HAL encuadernados. Las HAL enlazadas usan el lenguaje de definición de interfaz HAL (HIDL) , que permite reemplazar el marco sin tener que reconstruir las HAL.

Los complementos son creados por proveedores o creadores de SOC y se colocan en una partición /vendor en el dispositivo. Todos los dispositivos que se inicien con Android 8.0 o superior deben admitir HAL encuadernados escritos en lenguaje HIDL.

Implementación

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.hal , ICryptoPlugin.hal , IDrmFactory.hal e ICryptoFactory.hal

PLATFORM_ROOT/hardware/interfaces/drm/VERSION/

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

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

Las versiones 1.0 a 1.2 están obsoletas en R/Android 11. Los dispositivos que se actualicen a R aún pueden ejecutar las versiones 1.0 a 1.2. Sin embargo, los nuevos dispositivos que se inicien con R deben ejecutar solo la versión 1.3.


  PRODUCT_PACKAGES += \
    android.hardware.drm@1.0-impl \
    android.hardware.drm@1.0-service \
    android.hardware.drm@1.3-service.clearkey \
    android.hardware.drm@1.3-service.widevine

Actualización del manifiesto del dispositivo

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


  <hal format="hidl">
    <name>android.hardware.drm</name>
      <transport>hwbinder</transport>
      <fqname>@1.3::ICryptoFactory/clearkey</fqname>
      <fqname>@1.3::IDrmFactory/clearkey</fqname>
      <fqname>@1.3::ICryptoFactory/widevine</fqname>
      <fqname>@1.3::IDrmFactory/widevine</fqname>
  </hal>

Alternativamente, recomendamos usar vintf_fragments.

Agregar permisos de SELinux

  1. Agregar a VENDOR DEVICE /sepolicy/vendor/file.te
    type mediadrm_vendor_data_file, file_type, data_file_type;
  2. Agregar a VENDOR DEVICE /sepolicy/vendor/file_contexts

    Recomendamos usar expresiones regulares para especificar los números de versión para evitar realizar actualizaciones para nuevos lanzamientos, por ejemplo:

    /vendor/bin/hw/android\.hardware\.drm@\[0-9]+\.[0-9]+-service\.clearkey
          u:object_r:hal_drm_clearkey_exec:s0
    /data/vendor/mediadrm(/.*)? u:object_r:mediadrm_vendor_data_file:s0

    Alternativamente, actualice los números de versión como se muestra a continuación.

    /vendor/bin/hw/android\.hardware\.drm@1\.3-service\.clearkey
          u:object_r:hal_drm_clearkey_exec:s0
    /data/vendor/mediadrm(/.*)? u:object_r:mediadrm_vendor_data_file:s0
  3. Añadir a device/sepolicy/vendor/hal_drm_clearkey.te
    allow hal_drm_clearkey mediadrm_vendor_data_file:dir create_dir_perms;
        allow hal_drm_clearkey mediadrm_vendor_data_file:file create_file_perms;
        

Creación de un archivo .rc en /proveedor

El archivo .rc especifica las acciones que se realizarán cuando se inicie un servicio.

Consulte Idioma de inicio de Android para obtener más información.

Implementando 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 complementos DRM.

Drm Factory

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

IDrmFactory es el principal punto de entrada 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. 1.3 IDrmFactory siempre debe crear interfaces 1.2 IDrmPlugin, que se devuelven a través del método 1.0 createPlugin.

Return<void> getSupportedCryptoSchemes(getSupportedCryptoSchemes_cb _hidl_cb);

Como novedad en 1.3 IDrmFactory, getSupportedCryptoSchemes devuelve una lista de esquemas criptográficos admitidos para la instancia HIDL drm HAL.

Return<bool> isCryptoSchemeSupported(const hidl_array<uint8_t, 16>uuid);

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

Return<bool> isContentTypeSupported(const hidl_string &mimeType);

Determina si la fábrica de complementos puede construir complementos DRM que admitan un formato de contenedor de medios dado especificado por mimeType .

Return<void> createPlugin(const hidl_array<uint8_t, 16>uuid,
        const hidl_string& appPackageName, createPlugin_cb _hidl_cb);

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 dado a través de la clase CryptoFactory .

Return<bool> isCryptoSchemeSupported(const hidl_array<uint8_t, 16>uuid);

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.

Return<void> createPlugin(const hidl_array<uint8_t, 16>uuid,
        const hidl_vec<uint8_t>initData, createPlugin_cb _hidl_cb)

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.

Complemento DRM

Las API se definen en hardware/interfaces/drm/ VERSION /IDrmPlugin.hal . El archivo IDrmPlugin.h correspondiente se puede encontrar en out/Soong after the build.