Framework CAS

Il framework dei sistemi di accesso condizionato ai media (Media CAS) fornisce API standard per abilitare i servizi di accesso condizionato (CA) su una gamma di hardware TV digitale, inclusi i sistemi digitali via cavo, satellitari, terrestri e IPTV. Le opere quadro con il quadro di input Android TV e framework Android sintonizzatore TV , fornendo Java API invocati dalla app servizio TV di ingresso (TIS).

Gli obiettivi principali di Media CAS sono i seguenti.

  • Fornire un'API Java pubblica e un framework plug-in nativo che può essere utilizzato da sviluppatori di terze parti e OEM per supportare CAS per la trasmissione TV in Android.
  • Fornisci un framework CAS all'interno di Android che consente 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 decodificatori.
  • Supporta la sicurezza dell'hardware come le scale chiave.
  • Supporta ambienti di esecuzione affidabili (TEE) come TrustZone.

Configurazioni supportate

Configurazione del sintonizzatore hardware

Se l'hardware è responsabile dei trasporti flusso MPEG demultiplexing e decodifica, quadro Tuner fornisce informazioni di accesso condizionato programma specifico (PSI) i dati per l'applicazione TIS al fine di interfaccia con i sintonizzatori TV basate su hardware.

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

Schema della configurazione del Tuner hardware.

Figura 1. Configurazione Tuner 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 chiave hardware forniti dalla piattaforma. A causa delle variazioni specifiche del fornitore di queste interfacce, Media CAS non le standardizza.

Configurazione 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 dell'istanza e del provisioning corretto dell'oggetto Java Media CAS.

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, come l'apertura di una sessione e l'elaborazione di 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 di Media CAS (ad esempio, quando l'app utilizza il proprio parser MPEG2-TS).

Schema della configurazione del sintonizzatore.

Ingresso figura 2. IPTV, CAS, e la configurazione descrambler usando l'MediaExtractor quadro

Nello scenario dell'estrattore software, l'estrattore richiede un oggetto descrambler basato su software o hardware per ogni traccia codificata, 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 cancellare 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 codificato a livello di pacchetto di trasporto, dove viene codificato l'intestazione del flusso elementare a pacchetto (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 codificato a livello di pacchetto PES, dove l'intestazione PES viene lasciata libera. Tuttavia, non è possibile confermare quando avviene lo scrambling fino all'arrivo del pacchetto criptato vero e proprio. Per semplicità, supponiamo che venga utilizzato un descrambler se si determina che la traccia è codificata 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 consente un'operazione di decodifica in buffer liberi. Poiché è necessaria una decodifica audio non sicura, se la decodifica video richiede decodificatori sicuri, dovrebbe essere codificata in una sessione diversa dall'audio. L'ECM per la sessione deve segnalare al plugin che è necessario un decodificatore sicuro.

In alternativa, il plugin deve essere in grado di legare 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 inviare una piccola quantità di dati per cancellare i buffer dall'estrattore per elaborare l'intestazione PES. Per evitare che un'app dannosa faccia in modo 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. In caso contrario, il plugin dovrebbe negare la richiesta.

Sequenza di accordatura 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 di sistema CA, che identifica in modo univoco un fornitore CA specifico e altri dati specifici del fornitore. TIS interroga il Media CAS per determinare se esiste un plug-in CAS in grado di gestire il descrittore CA.

Schema di ottimizzazione del contenuto CAS.

Contenuto figura 3. sintonia CAS

Se l'ID di 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 plug-in.

Esempio di flusso di 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 decifrata utilizzando le informazioni di un EMM. Il plugin CAS determina come acquisire un EMM per l'attività sulla base delle informazioni vendor-specifiche nel descrittore di CA, che è fornito dal setPrivateData() metodo.

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 processEMM() metodo per consegnare tutti in EMMs banda al plugin 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.

Schema di un esempio CAS.

Plug Figura 4. Esempio CAS per EMM ed elaborazione ECM

Quando l'EMM viene ricevuto, 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 scala di chiavi o in un ambiente attendibile per eseguire la decrittografia della parola di controllo e la successiva decodifica del flusso di contenuti.

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();
    
  • Costruire 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 condizionale o da origini 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 per lo schema e opaco per il 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, deve prima essere fornito al server CAS. Fornire un set 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 sulla guida elettronica ai programmi (EPG)), l'app dovrebbe essere in grado di indicare 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);
    
  • Chiudere 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 per lo schema ed è opaco per il quadro.

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