quadro CAS

Il framework Media Conditional Access Systems (Media CAS) fornisce API standard per abilitare servizi di accesso condizionato (CA) su una gamma di hardware TV digitale, inclusi sistemi digitali via cavo, satellitari, terrestri e sistemi IPTV. Il framework funziona con il framework Android TV Input e il framework Android TV Tuner , fornendo API Java richiamate dall'app TV Input Service (TIS).

Gli obiettivi principali di Media CAS sono i seguenti.

  • Fornire un'API Java pubblica e un framework di plug-in nativo che possa essere utilizzato da sviluppatori di terze parti e OEM per supportare CAS per la trasmissione TV in Android.
  • Fornire un framework CAS all'interno di Android che consenta agli OEM ATV di interagire con una varietà di fornitori CAS in modo coerente.
  • Supporta più fornitori CAS di terze parti utilizzando plug-in nativi. I plug-in CAS potrebbero utilizzare protocolli di rete specifici del fornitore, formati di messaggi di gestione dei diritti (EMM)/messaggi di controllo dei diritti (ECM) e descrambler.
  • Supporta la sicurezza hardware come le scale chiave.
  • Supporta ambienti di esecuzione affidabili (TEE) come TrustZone.

Configurazioni supportate

Configurazione del sintonizzatore hardware

Se l'hardware è responsabile del demultiplexing e della decodifica del flusso di trasporto MPEG, il framework Tuner fornisce dati PSI (program-specific information) ad accesso condizionato all'app TIS per interfacciarsi con i sintonizzatori TV basati su hardware.

I dati PSI ad accesso condizionato includono descrittori CA, ECM ed EMM. Queste strutture consentono al plug-in CAS di ottenere le chiavi necessarie per decrittografare i flussi di contenuto.

Diagramma della configurazione hardware del sintonizzatore.

Figura 1. Configurazione del sintonizzatore hardware

La configurazione hardware potrebbe avere un livello TEE, come TrustZone, illustrato nella Figura 1. Se non è presente un livello TEE, un plug-in client CAS può comunicare con i servizi ladder della chiave hardware forniti dalla piattaforma. A causa delle variazioni specifiche del fornitore di queste interfacce, Media CAS non le standardizza.

Configurazione del software

Prima di Android 11, il framework Media CAS poteva ancora essere utilizzato per elaborare contenuti basati su software, come IPTV da IP multicast/unicast. L'app TIS è responsabile della creazione di istanze e del corretto provisioning dell'oggetto Media CAS Java.

L'app potrebbe utilizzare MediaExtractor o altri parser MPEG2-TS per estrarre dati PSI relativi a CA, come descrittori CA, ECM ed EMM. Se l'app utilizza il framework MediaExtractor, può delegare la gestione della sessione CAS, ad esempio l'apertura di una sessione e l'elaborazione EMM/ECM, al framework MediaExtractor. MediaExtractor configura quindi la sessione CAS utilizzando direttamente l'API nativa.

In caso contrario, l'app è responsabile dell'estrazione dei dati PSI relativi alla CA e della configurazione della sessione CAS utilizzando le API Java Media CAS (ad esempio, quando l'app utilizza il proprio parser MPEG2-TS).

Diagramma della configurazione del sintonizzatore.

Figura 2. Configurazione dell'ingresso IPTV, CAS e descrambler utilizzando il framework MediaExtractor

Nello scenario dell'estrazione software, l'estrattore richiede un oggetto descrambler basato su software o hardware per ogni traccia criptata, indipendentemente dal fatto che la traccia richieda decodificatori sicuri. Ciò è dovuto a quanto segue.

  • Se la traccia non richiede una decodifica sicura, l'estrattore decodifica l'unità di accesso per pulire i buffer ed estrae i campioni come da un flusso pulito. In questo modo MediaCodec non ha bisogno di essere coinvolto nella decodifica.
  • Se la traccia richiede una decodifica sicura, l'estrattore potrebbe comunque aver bisogno di un decodificatore. Ciò accade quando il flusso di trasporto viene criptato a livello del pacchetto di trasporto, dove viene criptata l'intestazione del flusso elementare pacchettottato (PES). L'estrattore deve accedere all'intestazione PES per eseguire il downstream di determinate informazioni (ad esempio, il timestamp della presentazione).

    Il descrambler non viene utilizzato dall'estrattore se il flusso di trasporto viene criptato a livello del pacchetto PES, dove l'intestazione PES viene lasciata libera. Tuttavia, non è possibile confermare quando avviene la codifica finché non arriva il pacchetto criptato vero e proprio. Per semplicità, supponiamo che venga utilizzato un descrambler se si determina che la traccia è criptata in base alla tabella di mappatura del programma (PMT).

Limitazioni della configurazione del software

Quando la traccia richiede una decodifica sicura, il decodificatore deve essere cauto quando esegue un'operazione di decodifica nei buffer vuoti. Poiché è necessaria una decodifica audio non sicura, se la decodifica video richiede decodificatori sicuri, dovrebbe essere codificata in una sessione diversa da quella audio. L'ECM della sessione deve segnalare al plugin che è necessario un decodificatore sicuro.

In alternativa, il plugin deve essere in grado di collegare in modo affidabile una chiave alla sua politica di sicurezza. Altrimenti, l'app può facilmente ottenere fotogrammi video con il decodificatore audio.

Anche quando la sessione richiede un decodificatore sicuro, potrebbe essere richiesto di produrre una piccola quantità di dati per cancellare i buffer dall'estrattore per elaborare l'intestazione PES. Per impedire a un'app dannosa di far sì che il plug-in restituisca l'intera unità di accesso, il plug-in deve analizzare il payload di trasporto per garantire che il payload inizi con un'intestazione PES del tipo di flusso appropriato. Altrimenti, il plugin dovrebbe negare la richiesta.

Sequenza di ottimizzazione CA

Quando si sintonizza su un nuovo canale, il modulo TIS si registra per ricevere descrittori CA, ECM ed EMM dal framework PSI Tuner. Un descrittore CA contiene l'ID del sistema CA, che identifica in modo univoco uno specifico fornitore di CA e altri dati specifici del fornitore. TIS interroga Media CAS per determinare se esiste un plug-in CAS in grado di gestire il descrittore CA.

Diagramma di ottimizzazione del contenuto CAS.

Figura 3. Ottimizzazione del contenuto CAS

Se l'ID del sistema CA è supportato, viene creata un'istanza di Media CAS e i dati privati ​​del fornitore dal descrittore CA vengono forniti al plug-in. Quindi, vengono aperte nuove sessioni in Media CAS per gestire i flussi audio e video. Le sessioni appena aperte ricevono ECM ed EMM per il plugin.

Esempio di flusso del plug-in CAS

TIS fornisce ECM al plug-in CAS utilizzando le API Media CAS. Un ECM contiene la parola di controllo crittografata, che deve essere decrittografata utilizzando le informazioni provenienti da un EMM. Il plug-in CAS determina come acquisire un EMM per la risorsa in base alle informazioni specifiche del fornitore nel descrittore CA, fornito dal metodo setPrivateData() .

Gli EMM potrebbero essere consegnati in banda nel flusso di contenuti o fuori banda utilizzando una richiesta di rete avviata dal plug-in CA. TIS utilizza il metodo processEMM() per fornire qualsiasi EMM in banda al plug-in CA.

Se è necessaria una richiesta di rete per ottenere un EMM, il plug-in CA è responsabile dell'esecuzione della transazione di rete con un server di licenza.

Diagramma di un esempio CAS.

Figura 4. Esempio di plug-in CAS per l'elaborazione EMM ed ECM

Quando viene ricevuto l'EMM, il plug-in CA lo analizza per ottenere la chiave crittografata per decrittografare la parola di controllo. La chiave EMM crittografata e la parola di controllo crittografata potrebbero essere caricate in una chiave ladder o in un ambiente attendibile per eseguire la decrittografia della parola di controllo e la successiva decodifica del flusso di contenuto.

API Java CAS multimediale

L'API Java Media CAS contiene i seguenti metodi.

  • Elenca tutti i plug-in CA disponibili sul dispositivo.

    class MediaCas.PluginDescriptor {
      public String getName();
      public int getSystemId();
    }
    static PluginDescriptor[] enumeratePlugins();
    
  • Costruisci un'istanza Media CAS per il sistema CA specificato. Ciò significa che il framework Media CAS può gestire più sistemi CAS contemporaneamente.

    MediaCas(int CA_system_id);
    MediaCas(@NonNull Context context, int casSystemId,
             @Nullable String tvInputServiceSessionId,
             @PriorityHintUseCaseType int priorityHint);
    
  • Registra un listener di eventi e consenti all'app di specificare un gestore di cui viene utilizzato il looper.

    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);
    
  • Invia i dati privati ​​per il sistema CA. I dati privati ​​possono provenire dal descrittore CA, dalla tabella di accesso condizionato o da fonti fuori banda. Questo non è associato a una sessione particolare.

    void setPrivateData(@NonNull byte[] data);
    
  • Elabora un pacchetto EMM.

    void processEmm(@NonNull byte[] data, int offset, int length);
    
  • Invia un evento a un sistema CA. Il formato dell'evento è specifico rispetto allo schema e opaco rispetto al quadro.

    void sendEvent(int event, int arg, @Nullable byte[] data);
    
  • Avvia un'operazione di provisioning del tipo specificato per un sistema CA. Quando un dispositivo si iscrive per la prima volta a un servizio di pay TV, è necessario prima effettuare il provisioning sul server CAS. Fornire una serie di parametri correlati al dispositivo per il provisioning.

    void provision(String provisionString);
    
  • Attiva un aggiornamento dei diritti. Quando un utente si iscrive a un nuovo canale (ad esempio, rispondendo a un annuncio pubblicitario o aggiungendo un canale nella guida elettronica ai programmi (EPG)), l'app dovrebbe essere in grado di dire ai client CA di aggiornare le chiavi di autorizzazione.

    void refreshEntitlements(int refreshType);
    
  • Chiudere l'oggetto Media CAS.

    void close();
    
  • Apri una sessione.

    Session openSession();
    Session openSession(@SessionUsage int sessionUsage, @ScramblingMode int scramblingMode);
    
  • Chiude una sessione aperta in precedenza.

    void Session#close();
    
  • Fornire i dati privati ​​della CA da un descrittore CA nel PMT, che può provenire dalla sezione Informazioni sul programma o Informazioni ES, a una sessione CAS.

    void Session#setPrivateData(@NonNull byte[] sessionId, @NonNull byte[] data);
    
  • Elabora un pacchetto ECM per una sessione.

    void Session#processEcm(@NonNull byte[] data, int offset, int length);
    
  • Ottieni l'ID della sessione.

    byte[] Session#getSessionId();
    
  • Invia un evento di sessione a un sistema CA. Il formato dell'evento è specifico del progetto ed è opaco rispetto al quadro.

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