Google se compromete a impulsar la igualdad racial para las comunidades afrodescendientes. Obtén información al respecto.
Se usó la API de Cloud Translation para traducir esta página.
Switch to English

DRM

Icono de 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 robustez o reglas de cumplimiento que puedan estar definidas por un esquema de DRM.

Marco de referencia

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 de DRM admite un dispositivo depende del fabricante del dispositivo. El marco de DRM proporciona una interfaz unificada para los desarrolladores de aplicaciones y oculta la complejidad de las operaciones de DRM. El marco DRM proporciona un modo de funcionamiento coherente para contenido protegido y no protegido. Los esquemas DRM pueden definir modelos de uso complejos mediante metadatos de licencia. El marco de DRM proporciona la asociación entre el contenido de DRM y la licencia, y se encarga de la gestión de derechos. Esto permite que el reproductor multimedia se abstraiga del contenido protegido o no protegido por DRM. Vea MediaDrm para la clase para obtener claves para descifrar transmisiones de medios protegidas.

Android DRM HAL
Figura 1a. Capa de abstracción de hardware DRM antes de Android 11
Android DRM HAL post 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 ese contenido digital esté disponible en dispositivos Android y para garantizar que haya al menos un DRM consistente disponible en todos los dispositivos, Google proporciona DRM sin tarifas 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 asegurar contenido premium y 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 protección de tramas descifradas en el dispositivo y protección de contenido a través de un mecanismo de protección de salida confiable. No todas las plataformas de hardware son compatibles con 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 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 el contenido DRM y su licencia, y finalmente descifrar el contenido DRM.

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

  • Una API de marco de DRM, que está expuesta a aplicaciones a través del marco de aplicación de Android.
  • Un marco DRM de código nativo, que expone una interfaz para complementos DRM (agentes) para manejar la administración de derechos y el descifrado para varios esquemas DRM.
Marco de DRM de Android
Figura 2a. Marco DRM antes de Android 11
Marco de 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 de DRM escanea las instancias / servicios de HAL (descritos en los archivos .rc ) y los complementos se descubren a través del registro de 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 enlazados. Los HAL vinculados utilizan el lenguaje de definición de interfaz HAL (HIDL) , que permite reemplazar el marco sin tener que reconstruir los HAL.

Los complementos son creados por proveedores o fabricantes de SOC y se colocan en una partición /vendor en el dispositivo. Todos los dispositivos que se inician con Android 8.0 o superior deben admitir HAL vinculados escritos en el 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. Implementa 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 un 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 actualizan a R aún pueden ejecutar las versiones 1.0 a 1.2. Sin embargo, los dispositivos nuevos que se inician 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 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 al 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 nuevas versiones, 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. Agregar al 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;
        

Crear un archivo .rc en / vendor

El archivo .rc especifica las acciones que se deben tomar cuando se lanza un servicio.

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

Implementando el complemento

  1. Implemente el punto de entrada main() en service.cpp del service.cpp de complementos.
  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 los complementos DrmFactory , CryptoFactory y DRM.

DrmFactory

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

IDrmFactory es el principal punto de entrada para interactuar con drm HAL de un proveedor a través de la API createPlugin. La API createPlugin se utiliza para crear instancias 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 de cifrado admitidos para la instancia de HAL drm de HIDL.

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 de cifrado 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 determinado 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 de cifrado especificado por UUID.

CryptoFactory

La clase CryptoHal busca servicios de complementos DRM registrados y construye los complementos correspondientes que admiten un esquema de cifrado determinado 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 después de la compilación.