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.
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.
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:
- Agregue el servicio de complemento a los archivos de compilación del dispositivo.
- Actualice el manifiesto del dispositivo.
- Agregue permisos de SELinux.
- Cree un archivo
.rc
en/vendor
. - 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
- Agregar al
VENDOR DEVICE /sepolicy/vendor/file.te
type mediadrm_vendor_data_file, file_type, data_file_type;
- 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 - 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
- Implemente el punto de entrada
main()
enservice.cpp
del servicio de complemento. - Implemente
ICryptoPlugin
,IDrmPlugin
,ICryptoFactory
eIDrmFactory
. - 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 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.