Marco CAS

El marco de los sistemas de acceso condicional a los medios (Media CAS) proporciona API estándar para habilitar los servicios de acceso condicional (CA) en una variedad de hardware de TV digital, incluidos los sistemas de cable digital, satélite, terrestre y sistemas de IPTV. El marco funciona con el marco de entrada de Android TV y el marco de sintonizador de TV de Android, y proporciona las API de Java que se invocan desde la aplicación TV Input Service (TIS).

Los principales objetivos de Media CAS son los siguientes.

  • Proporcione una API pública de Java y un marco de complementos nativos que puedan usar los desarrolladores de terceros y los OEM para admitir CAS para la transmisión de TV en Android.
  • Proporcione un marco de CAS dentro de Android que permita a los OEM de ATV interoperar con una variedad de proveedores de CAS de manera consistente.
  • Admite múltiples proveedores de CAS de terceros mediante complementos nativos. Los complementos CAS pueden usar protocolos de red específicos del proveedor, formatos de mensajes de administración de derechos (EMM)/mensajes de control de derechos (ECM) y decodificadores.
  • Apoye la seguridad del hardware, como escaleras clave.
  • Admite entornos de ejecución de confianza (TEE) como TrustZone.

Configuraciones admitidas

Configuración del sintonizador de hardware

Si el hardware es responsable de la desmultiplexación y descifrado del flujo de transporte MPEG, el marco Tuner proporciona datos de información específica del programa (PSI) de acceso condicional a la aplicación TIS para interactuar con los sintonizadores de TV basados ​​en hardware.

Los datos de PSI de acceso condicional incluyen descriptores de CA, ECM y EMM. Estas estructuras permiten que el complemento CAS obtenga las claves necesarias para descifrar los flujos de contenido.

Diagrama de la configuración del sintonizador de hardware.

Figura 1. Configuración del sintonizador de hardware

La configuración de hardware puede tener una capa TEE, como TrustZone, que se ilustra en la Figura 1. Si no hay una capa TEE, un complemento de cliente CAS puede comunicarse con los servicios de escalera de clave de hardware proporcionados por la plataforma. Debido a las variaciones específicas del proveedor de estas interfaces, Media CAS no las estandariza.

Configuración de software

Antes de Android 11, el marco Media CAS todavía se podía usar para procesar contenido basado en software, como IPTV de multidifusión/unidifusión IP. La aplicación TIS es responsable de instanciar y aprovisionar correctamente el objeto Java de Media CAS.

La aplicación puede usar MediaExtractor u otros analizadores MPEG2-TS para extraer datos de PSI relacionados con CA, como descriptores de CA, ECM y EMM. Si la aplicación utiliza el marco MediaExtractor, puede delegar la gestión de la sesión CAS, como abrir una sesión y procesar EMM/ECM, al marco MediaExtractor. Luego, MediaExtractor configura la sesión de CAS usando la API nativa directamente.

De lo contrario, la aplicación es responsable de extraer los datos de PSI relacionados con CA y configurar la sesión de CAS mediante las API Java de Media CAS (por ejemplo, cuando la aplicación utiliza su propio analizador MPEG2-TS).

Diagrama de la configuración del Tuner.

Figura 2. Configuración de entrada de IPTV, CAS y decodificador utilizando el marco MediaExtractor

En el escenario del extractor de software, el extractor requiere un objeto decodificador basado en software o hardware para cada pista codificada, independientemente de si la pista requiere decodificadores seguros. Esto se debe a lo siguiente.

  • Si la pista no requiere una decodificación segura, el extractor descodifica la unidad de acceso para borrar los búferes y extrae las muestras como si fuera un flujo claro. De esta manera, MediaCodec no necesita estar involucrado en la decodificación.
  • Si la pista requiere una decodificación segura, es posible que el extractor aún necesite un decodificador. Esto sucede cuando el flujo de transporte se codifica en el nivel del paquete de transporte, donde se codifica el encabezado del flujo elemental empaquetado (PES). El extractor necesita acceder al encabezado PES para descargar cierta información (por ejemplo, la marca de tiempo de la presentación).

    El extractor no utiliza el decodificador si el flujo de transporte está codificado en el nivel de paquete PES, donde el encabezado PES se deja en blanco. Sin embargo, no es posible confirmar cuándo ocurre la codificación hasta que llega el paquete codificado real. Para simplificar, suponga que se usa un decodificador si se determina que la pista está codificada según la tabla de asignación de programas (PMT).

Limitaciones de la configuración del software

Cuando la pista requiere una decodificación segura, el descifrador debe tener cuidado al permitir que una operación de descifrado se borre en los búferes. Debido a que se requiere una decodificación de audio insegura, si la decodificación de video requiere decodificadores seguros, debe codificarse en una sesión diferente a la del audio. El ECM para la sesión debe señalar al complemento que se requiere un decodificador seguro.

Alternativamente, el complemento debe poder vincular de manera confiable una clave a su política de seguridad. De lo contrario, la aplicación puede obtener fácilmente fotogramas de video con el decodificador de audio.

Incluso cuando la sesión requiere un decodificador seguro, es posible que el extractor le solicite generar una pequeña cantidad de datos para borrar los búferes y procesar el encabezado PES. Para evitar que una aplicación malintencionada haga que el complemento devuelva la unidad de acceso completa, el complemento debe analizar la carga útil de transporte para asegurarse de que la carga útil comience con un encabezado PES del tipo de flujo adecuado. De lo contrario, el complemento debería rechazar la solicitud.

Secuencia de sintonización CA

Al sintonizar un nuevo canal, el módulo TIS se registra para recibir descriptores de CA, ECM y EMM del marco PSI Tuner. Un descriptor de CA contiene el ID del sistema de CA, que identifica de forma exclusiva a un proveedor de CA específico y otros datos específicos del proveedor. TIS consulta Media CAS para determinar si existe un complemento de CAS que pueda manejar el descriptor de CA.

Diagrama de ajuste del contenido CAS.

Figura 3. Ajuste del contenido de CAS

Si se admite el ID del sistema de CA, se crea una instancia de Media CAS y los datos privados del proveedor del descriptor de CA se proporcionan al complemento. Luego, se abren nuevas sesiones en Media CAS para manejar las transmisiones de audio y video. Las sesiones recién abiertas reciben ECM y EMM para el complemento.

Ejemplo de flujo de complemento de CAS

TIS entrega ECM al complemento CAS utilizando las API de Media CAS. Un ECM contiene la palabra de control cifrada, que debe descifrarse utilizando información de un EMM. El complemento CAS determina cómo adquirir un EMM para el activo en función de la información específica del proveedor en el descriptor de CA, que proporciona el método setPrivateData() .

Los EMM pueden entregarse en banda en el flujo de contenido o fuera de banda mediante una solicitud de red iniciada por el complemento de CA. TIS utiliza el método processEMM() para entregar cualquier EMM en banda al complemento de CA.

Si se requiere una solicitud de red para obtener un EMM, el complemento de CA es responsable de realizar la transacción de red con un servidor de licencias.

Diagrama de un ejemplo CAS.

Figura 4. Ejemplo de complemento CAS para procesamiento de EMM y ECM

Cuando se recibe el EMM, el complemento de CA lo analiza para obtener la clave cifrada para descifrar la palabra de control. La clave de EMM cifrada y la palabra de control cifrada se pueden cargar en una escalera de claves o en un entorno de confianza para realizar el descifrado de la palabra de control y el posterior descifrado del flujo de contenido.

API Java de Media CAS

La API Java de Media CAS contiene los siguientes métodos.

  • Enumere todos los complementos de CA disponibles en el dispositivo.

    class MediaCas.PluginDescriptor {
      public String getName();
      public int getSystemId();
    }
    static PluginDescriptor[] enumeratePlugins();
    
  • Construya una instancia de Media CAS para el sistema CA especificado. Esto significa que el marco Media CAS puede manejar múltiples sistemas CAS simultáneamente.

    MediaCas(int CA_system_id);
    MediaCas(@NonNull Context context, int casSystemId,
             @Nullable String tvInputServiceSessionId,
             @PriorityHintUseCaseType int priorityHint);
    
  • Registre un detector de eventos y permita que la aplicación especifique un controlador cuyo looper se utilice.

    interface MediaCas.EventListener {
      void onEvent(MediaCas, int event, int arg, byte[] data);
      void onSessionEvent(@NonNull MediaCas mediaCas, @NonNull Session session, int event, int arg, @Nullable byte[] data);
      void onPluginStatusUpdate(@NonNull MediaCas mediaCas, @PluginStatus int status, int arg);
      void onResourceLost(@NonNull MediaCas mediaCas);
    }
    void setEventListener(MediaCas.EventListener listener, Handler handler);
    
  • Envía los datos privados para el sistema CA. Los datos privados pueden provenir del descriptor de CA, la tabla de acceso condicional o fuentes fuera de banda. Esto no está asociado con una sesión en particular.

    void setPrivateData(@NonNull byte[] data);
    
  • Procesar un paquete EMM.

    void processEmm(@NonNull byte[] data, int offset, int length);
    
  • Envía un evento a un sistema de CA. El formato del evento es específico al esquema y opaco al marco.

    void sendEvent(int event, int arg, @Nullable byte[] data);
    
  • Inicie una operación de aprovisionamiento del tipo especificado para un sistema CA. Cuando un dispositivo se suscribe a un servicio de televisión de pago por primera vez, primero debe aprovisionarse en el servidor CAS. Proporcione un conjunto de parámetros relacionados con el dispositivo para el aprovisionamiento.

    void provision(String provisionString);
    
  • Activar una actualización de derechos. Cuando un usuario se suscribe a un nuevo canal (por ejemplo, respondiendo a un anuncio o agregando un canal en la guía electrónica de programas (EPG)), la aplicación debería poder decirles a los clientes de CA que actualicen las claves de autorización.

    void refreshEntitlements(int refreshType);
    
  • Cierre el objeto Media CAS.

    void close();
    
  • Abre una sesión.

    Session openSession();
    Session openSession(@SessionUsage int sessionUsage, @ScramblingMode int scramblingMode);
    
  • Cierra una sesión abierta anteriormente.

    void Session#close();
    
  • Proporcione los datos privados de CA desde un descriptor de CA en el PMT, que puede ser de la sección de información del programa o de información de ES, a una sesión de CAS.

    void Session#setPrivateData(@NonNull byte[] sessionId, @NonNull byte[] data);
    
  • Procesar un paquete ECM para una sesión.

    void Session#processEcm(@NonNull byte[] data, int offset, int length);
    
  • Obtenga el ID de la sesión.

    byte[] Session#getSessionId();
    
  • Envíe un evento de sesión a un sistema de CA. El formato del evento es específico al esquema y es opaco al marco.

    void Session#sendSessionEvent(int event, int arg, @Nullable byte[] data);