
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:
Figura 1: Capa de abstracción de hardware de DRM anterior a 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:
Figura 3: Marco de trabajo de DRM anterior a 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:
- Agrega el servicio del complemento a los archivos de compilación del dispositivo.
- Actualiza el manifiesto del dispositivo.
- Agrega permisos de SELinux.
- Crea un archivo
.rc
en/vendor
. - 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
- Agrega permisos a
VENDOR DEVICE/sepolicy/vendor/file.te
:
type mediadrm_vendor_data_file, file_type, data_file_type;
- 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 - 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
- Implementa el punto de entrada
main()
enservice.cpp
del servicio del plugin. - Implementa
ICryptoPlugin
,IDrmPlugin
,ICryptoFactory
yIDrmFactory
. - 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 enhardware/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.