Framework de CAS

El framework de sistemas de acceso condicional a medios (Media CAS) brinda APIs para habilitar servicios de acceso condicional (CA) en una variedad de TV digital hardware, incluidos cable digital, satélite, sistemas terrestres y IPTV de la seguridad de la información. El {i>framework<i} trabaja con el Framework de entrada de Android TV y el framework de Android TV Tuner, Proporcionar las APIs de Java que se invocan desde la app del servicio de entrada de TV (TIS)

Los objetivos principales de Media CAS son los siguientes.

  • Proporcionar una API pública de Java y un framework de complementos nativos que se puedan usar creada por desarrolladores externos y OEM con el fin de admitir CAS para la transmisión de TV en Android.
  • Proporcionar un framework de CAS en Android que permita la interoperabilidad de los OEM de ATV con una variedad de proveedores de CAS de manera coherente.
  • Admite varios proveedores de CAS externos mediante complementos nativos. Los complementos CAS pueden usar protocolos de red específicos del proveedor, autorización mensajes de administración (EMM) o mensajes de control de derechos (ECM), y decodificadores.
  • Brinda compatibilidad con la seguridad de hardware, como las llaves de acceso.
  • Brinda compatibilidad con entornos de ejecución confiables (TEE), como TrustZone.

Opciones de configuración compatibles

Configuración del sintonizador de hardware

Si el hardware es responsable de la demultiplexación de la transmisión de transporte de MPEG y descendente, framework de Tuner proporciona datos de información específica de programas de acceso condicional (PSI) al la app de TIS para interactuar con sintonizadores de TV basados en hardware.

Los datos de PSI de acceso condicional incluyen descriptores de la AC, ECM y EMM. Estos de datos permiten que el complemento CAS obtenga las claves necesarias para desencriptar el transmisiones continuas 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 de TEE, como TrustZone, como se ilustra en la Figura 1. Si no hay una capa TEE, un cliente CAS puede comunicarse con los servicios de escalera de claves de hardware que proporciona el 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 framework Media CAS podía usarse para procesar contenido basado en software, como IPTV desde IP multidifusión o unidifusión. La app de TIS es responsable de crear instancias y de crear que aprovisiona el objeto Media CAS de Java.

La app podría usar MediaExtractor u otros analizadores de MPEG2-TS para extraer Datos de PSI relacionados con AC, como descriptores de AC, ECM y EMM. Si la app usa el framework MediaExtractor, puede delegar la sesión de CAS administrada, como abrir una sesión y procesar la EMM/ECM, en el framework MediaExtractor. Luego, MediaExtractor configura la sesión CAS usando la API nativa directamente a la API.

De lo contrario, la app será responsable de extraer los datos de PSI relacionados con AC. configurar la sesión de CAS con las APIs de Media CAS Java (por ejemplo, cuando la app usa su propio analizador de MPEG2-TS).

Diagrama de la configuración del sintonizador.

Figura 2: entrada de IPTV, CAS y configuración de decodificador con el framework MediaExtractor

En el escenario de un extractor de software, este requiere un software o un objeto decodificador basado en hardware para cada pista desordenada, 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 la decodifica. la unidad de acceso para borrar los búferes y extraer muestras como si fueran de un y borrar la transmisión. De esta manera, MediaCodec no necesita participar en las o descendente.
  • Si la pista requiere una decodificación segura, es posible que el extractor necesitas un decodificador. Esto sucede cuando la transmisión de transporte se codificados en el nivel del paquete de transporte, donde los elementos El encabezado de transmisión (PES) está codificado. El extractor debe acceder al PES para transmitir cierta información (por ejemplo, la presentación una marca de tiempo).

    El extractor no usa el decodificador si la transmisión de transporte codificado en el nivel del paquete PES, donde el encabezado de PES se deja claro. Sin embargo, no es posible confirmar cuándo se produce la codificación llega el paquete desordenado real. Para simplificar, supongamos que se usa un decodificador. si se determina que el segmento está codificado según la asignación del programa (PMT).

Limitaciones de la configuración de software

Cuando la pista requiere una decodificación segura, el decodificador cauteloso a la hora de dejar que una operación decodificarla en claro tiempos de reserva. Debido a que se requiere una decodificación de audio no segura, si la decodificación de video requiere decodificadores seguros, debe codificarse en una sesión diferente al audio. La ECM de la sesión debe indicarle al complemento que un decodificador seguro es obligatorio.

Por otro lado, el complemento debe poder vincular de forma confiable una clave a su política de seguridad. De lo contrario, la app puede obtener fácilmente entre los fotogramas con el decodificador de audio.

Incluso cuando la sesión requiere un decodificador seguro, se podría el extractor debe generar una pequeña cantidad de datos para eliminar los búferes. para procesar el encabezado de PES. Para evitar que una app maliciosa cree el complemento devuelve toda la unidad de acceso, el complemento debe analizar la carga útil de transporte para asegurarse de que la carga útil comience con un encabezado PES de la transmisión correspondiente el tipo de letra. De lo contrario, el complemento debería rechazar la solicitud.

Secuencia de ajuste de CA

Cuando se sintoniza un nuevo canal, el módulo TIS se registra para recibir CA de Kubernetes, ECM y EMM del framework de PSI Tuner. Un descriptor de la AC contiene el ID del sistema de la AC, que identifica de forma exclusiva una AC específica. y otros datos específicos del proveedor. TIS consulta Media CAS para determinar si existe un complemento CAS que pueda controlar el descriptor de CA.

Diagrama del ajuste del contenido de CAS

Figura 3: Ajuste del contenido CAS

Si se admite el ID del sistema de la AC, se crea una instancia de Media CAS. y los datos privados del proveedor del descriptor de la AC se proporcionan al complemento. Luego, se abren nuevas sesiones en Media CAS para controlar el audio y el video. transmisiones continuas. Las sesiones abiertas recientemente reciben ECM y EMM del complemento.

Ejemplo de flujo del complemento CAS

TIS entrega ECM al complemento CAS mediante las APIs de Media CAS. Una ECM contiene la palabra de control encriptada que debe desencriptarse con información de una EMM. El complemento CAS determina cómo adquirir una EMM para el recurso según la información específica del proveedor en la Descriptor de CA, proporcionado por el método setPrivateData().

Las EMM se pueden entregar en banda en la transmisión de contenido o fuera de banda con un el complemento de CA inicia la solicitud de red. TIS usa el método processEMM() para entregar EMM en banda al complemento de CA.

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

Diagrama de un CAS de ejemplo

Figura 4: Ejemplo de complemento de CAS para el procesamiento de EMM y ECM

Cuando se recibe el EMM, el complemento de CA lo analiza para obtener la clave encriptada para desencriptar la palabra de control. El EMM encriptado clave y palabra de control encriptada se pueden cargar en una escalera de claves o para realizar la desencriptación de la palabra de control y la posterior la estructura de la transmisión de contenido.

API de Media CAS Java

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

  • Enumera todos los complementos de la AC disponibles en el dispositivo.

    class MediaCas.PluginDescriptor {
      public String getName();
      public int getSystemId();
    }
    static PluginDescriptor[] enumeratePlugins();
    
  • Crea una instancia de Media CAS para el sistema de AC especificado. Esto significa que El framework Media CAS puede manejar varios sistemas CAS simultáneamente.

    MediaCas(int CA_system_id);
    MediaCas(@NonNull Context context, int casSystemId,
             @Nullable String tvInputServiceSessionId,
             @PriorityHintUseCaseType int priorityHint);
    
  • Registrar un objeto de escucha de eventos y permitir que la aplicación especifique un controlador cuyo generador de bucles.

    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 de la AC. Los datos privados pueden desde el descriptor de AC, la tabla de acceso condicional o fuera de banda. Esto no está asociado con una sesión en particular.

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

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

    void sendEvent(int event, int arg, @Nullable byte[] data);
    
  • Iniciar una operación de aprovisionamiento del tipo especificado para una AC en un sistema de archivos. Cuando un dispositivo se registra en un servicio de TV pagado para primera vez, se debe aprovisionar en el servidor CAS antes de empezar. Proporciona un conjunto de parámetros relacionados al dispositivo para el aprovisionamiento.

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

    void refreshEntitlements(int refreshType);
    
  • Cierra 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();
    
  • Proporcionar los datos privados de la AC desde un descriptor de AC en el PMT, que se pueden desde la sección de información del programa o de ES) hasta una sesión de CAS.

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

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

    byte[] Session#getSessionId();
    
  • Envía un evento de sesión a un sistema de AC. El formato de el evento es específico del esquema y opaco para el framework.

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