En este documento, 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 este documento, no se describen las reglas de robustez ni de cumplimiento que puede 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, como los esquemas de DRM que admite un dispositivo dependen del fabricante. El framework de DRM proporciona una interfaz unificada para los desarrolladores de aplicaciones 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.
La disponibilidad de contenido digital enriquecido es importante para los usuarios que usan 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 coherente 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 de contenido que proporciona el complemento de DRM depende de las funciones de seguridad y protección de 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 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 inicio confiable y un SO seguro 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 manejar operaciones complejas de DRM, adquirir licencias, aprovisionar el dispositivo, asociar 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 marco de DRM, que se expone a las apps a través del framework de aplicaciones para Android.
- Un framework de DRM de código nativo, que expone una interfaz para que los complementos de DRM (agentes) controlen la administración de derechos y la desencriptación de varios esquemas de DRM.
Consulta Android Media DRM y Android Media Crypto para obtener más detalles.
Complementos de DRM
Cuando se inicia el sistema, el framework de DRM busca instancias o servicios de HAL (que se describen en los archivos .rc
) y se descubren los complementos. El servidor 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. Las HAL enlazadas usan el Lenguaje de definición de la interfaz de Android (AIDL), que permite reemplazar el framework sin tener que volver a compilar las 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
Las versiones de dispositivos con GMS y AOSP para Android 13 deben usar la interfaz de AIDL.
Para implementar nuevas APIs de frameworks de DRM con un complemento, haz lo siguiente:
- Agrega el servicio de complementos 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/
Cómo agregar un servicio de complemento a archivos de compilación de dispositivos
Por ejemplo, para agregar compatibilidad con la interfaz de 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 STABLE AIDL VERSION es el número de versión de cada versión de la API de AIDL (p.ej., 1, 2). Como alternativa, te recomendamos que uses vintf_fragments.
Agrega permisos de SELinux
- Agregar a
VENDOR DEVICE/sepolicy/vendor/file.te
type mediadrm_vendor_data_file, file_type, data_file_type;
- Agregar 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 - Agregar 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 realizarán cuando se inicie 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 complemento. - 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.
DrmFactory
La clase DrmHal
busca servicios de complementos de DRM registrados y construye los complementos correspondientes que admiten un esquema de criptografía 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 de la API de createPlugin. La API createPlugin se usa 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.
::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 crear complementos de DRM que admitan un esquema de criptografía determinado, que se especifica con un UUID.
::ndk::ScopedAStatus isContentTypeSupported(const std::string& in_mimeType, bool* _aidl_return);
Determina si la fábrica de complementos puede crear complementos de DRM que admitan un determinado formato de contenedor de contenido multimedia 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);
Crea un complemento de DRM para el esquema criptográfico que especifica el UUID.
CryptoFactory
La clase CryptoHal
busca servicios de complementos de DRM registrados y construye los complementos correspondientes que admiten un esquema de criptografía 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 criptografía 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);
Determina si la fábrica de complementos puede crear complementos criptográficos que admitan un esquema criptográfico determinado, especificado por un UUID.
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.