Il framework Media Condition Access Systems (Media CAS) fornisce API per abilitare i servizi di accesso condizionato (CA) su un'ampia gamma di TV digitali hardware, inclusi i sistemi digitali via cavo, satellitari, terrestri e IPTV sistemi diversi. Il framework funziona con 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 possono essere utilizzati da sviluppatori e OEM di terze parti per supportare le CA per le trasmissioni TV in Android.
- Fornire in Android un framework CAS che consenta agli OEM ATV di interagire. con vari fornitori CAS in modo coerente.
- Supporta più fornitori CAS di terze parti utilizzando plug-in nativi. I plug-in CAS possono utilizzare protocolli di rete specifici del fornitore, i formati messaggio di gestione (EMM)/messaggio di controllo dei diritti (ECM), e decodificatori.
- Supporta la sicurezza hardware, ad esempio le scale a pioli.
- Supporta ambienti di esecuzione attendibili (TEE) come TrustZone.
Configurazioni supportate
Configurazione del sintonizzatore hardware
Se l'hardware è responsabile del demultiplexing dello stream di trasporto MPEG e decodifica, framework di ottimizzazione fornisce informazioni specifiche del programma di accesso condizionato al App TIS per interfacciarsi con sintonizzatori TV basati su hardware.
I dati PSI con accesso condizionale includono descrittori CA, ECM ed EMM. Questi strutture consentono al plug-in CAS di ottenere le chiavi necessarie per decriptare stream di contenuti.
Figura 1. Configurazione del sintonizzatore hardware
La configurazione hardware potrebbe avere un livello TEE, ad esempio TrustZone, come illustrato nella Figura 1. Se non è presente un livello TEE, viene richiesto un client CAS il plug-in può comunicare con i servizi ladder delle chiavi hardware completamente gestita. A causa delle varianti di queste interfacce specifiche del fornitore, Media CAS e non standard.
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 della creazione di un'istanza e della corretta il provisioning dell'oggetto Java Media CAS.
L'app potrebbe utilizzare MediaExtractor o altri parser MPEG2-TS per estrarre Dati PSI correlati alla CA, ad esempio descrittori della CA, ECM ed EMM. Se l'app utilizza il framework MediaExtractor, può delegare la sessione CAS come l'apertura di una sessione e l'elaborazione di EMM/ECM, nel framework MediaExtractor. MediaExtractor configura quindi la sessione CAS utilizzando il linguaggio nativo dell'API.
In caso contrario, l'app è responsabile dell'estrazione dei dati PSI relativi all'autorità di certificazione e Configurazione della sessione CAS utilizzando le API Java Media CAS (ad esempio, se l'app usa il proprio parser MPEG2-TS).
Figura 2. Configurazione di input IPTV, CAS e decodificatore utilizzando MediaExtractor del framework
Nello scenario di estrazione di software, l'estrattore richiede un software o decodificatore basato su hardware per ogni traccia criptata, a prescindere dal fatto che la traccia richiami decoder sicuri. Ciò è dovuto a per eseguire le operazioni indicate di seguito.
- Se la traccia non richiede una decodifica sicura, l'estrattore decodifica
l'unità di accesso per cancellare i buffer ed estrarre i campioni come se
un flusso cristallino. In questo modo
MediaCodec
non deve essere coinvolto nel la decodificazione. Se la traccia richiede la decodifica sicura, l'estrattore potrebbe comunque è necessario usare un decodificatore. Questo accade quando il flusso di trasporto criptati a livello del pacchetto di trasporto, dove gli elementi l'intestazione stream (PES) è crittografata. L'estrattore deve accedere al PES per eseguire lo streaming di determinate informazioni (ad esempio, la presentazione timestamp).
Il decodificatore non viene utilizzato dall'estrattore se il flusso di trasporto viene criptati a livello del pacchetto PES, dove l'intestazione PES è lasciata vuota. Tuttavia, non è possibile confermare quando avviene lo scrambling finché non viene eseguita arriva un pacchetto criptato reale. Per semplicità, supponiamo che venga utilizzato un decodificatore se viene stabilito che la traccia è criptata in base alla mappatura del programma (PMT).
Limitazioni della configurazione software
Se la traccia richiede la decodifica sicura, il decodificatore deve essere fare attenzione quando si lascia che un'operazione di decodifica in modo chiaro buffer. Perché è necessaria una decodifica audio non sicura, se la decodifica video richiede decoder sicuri, dovrebbe essere criptato in una sessione diversa dall'audio. L'ECM per la sessione deve segnalare al plug-in che un decoder sicuro è obbligatorio.
In alternativa, il plug-in deve essere in grado di collegare in modo affidabile chiave alle sue norme di sicurezza. Altrimenti, l'app può recuperare facilmente i fotogrammi chiave con il decodificatore audio.
Anche quando la sessione richiede un decoder sicuro, chiesto 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 rendere il plug-in restituisce 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 flusso appropriato di testo. In caso contrario, il plug-in deve rifiutare la richiesta.
Sequenza di ottimizzazione CA
Durante l'ottimizzazione su un nuovo canale, il modulo TIS si registra per ricevere CA descrittori, ECM ed EMM dal framework PSI Tuner. Un descrittore CA contiene l'ID sistema CA, che identifica in modo univoco una CA specifica del fornitore e altri dati specifici del fornitore. Il TIS esegue query Media CAS per determinare se esiste un plug-in CAS in grado di gestire il descrittore CA.
Figura 3. Ottimizzazione del contenuto CAS
Se l'ID di sistema CA è supportato, viene creata un'istanza della CAS multimediale e i dati privati del fornitore provenienti dal descrittore della CA vengono forniti al plug-in. Successivamente, in Media CAS vengono aperte nuove sessioni per gestire audio e video i flussi di dati. Le sessioni appena aperte ricevono ECM ed EMM per il plug-in.
Esempio di flusso del plug-in CAS
TIS fornisce gli ECM al plug-in CAS utilizzando le API Media CAS. Un sistema ECM
contiene la parola di controllo criptata, che deve essere decriptata
utilizzando le informazioni di un EMM. Il plug-in CAS determina come acquisire
un EMM per l'asset in base alle informazioni specifiche del fornitore nella
Descrittore CA, fornito dal metodo setPrivateData()
.
I provider EMM possono essere inseriti in una "banda" nello stream di contenuti o al di fuori della banda utilizzando un
richiesta di rete avviata dal plug-in CA. Il TIS utilizza il metodo processEMM()
per consegnare qualsiasi EMM in banda al plug-in CA.
Se è necessaria una richiesta di rete per ottenere un EMM, il plug-in CA viene responsabile dell'esecuzione della transazione di rete con un server licenze.
Figura 4. Plug-in CAS di esempio per l'elaborazione EMM ed ECM
Quando viene ricevuto l'EMM, il plug-in CA lo analizza per ottenere la chiave criptata per decriptare la parola di controllo. L'EMM criptato la chiave e la parola di controllo crittografata potrebbero essere caricate in un key ladder o per eseguire la decrittografia della parola di controllo e la decodifica del flusso di contenuti.
API Media CAS Java
L'API Media CAS Java 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();
Crea 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 e 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 essere dal descrittore della CA, dalla tabella di accesso condizionale da fonti di banda. Non è associato a una sessione specifica.
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 rispetto al framework.
void sendEvent(int event, int arg, @Nullable byte[] data);
Avvia un'operazione di provisioning del tipo specificato per una CA di un sistema operativo completo. Quando un dispositivo si registra a un servizio di pay TV per la prima volta, deve essere sottoposto a provisioning sul server CAS per prima cosa. Fornisci una serie di parametri correlati al dispositivo per il provisioning.
void provision(String provisionString);
Attivare un aggiornamento dei diritti. Quando un utente si abbona a un nuovo canale (ad esempio, rispondendo a un annuncio o aggiungendo un canale nella guida elettronica ai programmi (EPG), l'app dovrebbe comunicare ai client CA di aggiornare le chiavi dei diritti.
void refreshEntitlements(int refreshType);
Chiudi l'oggetto Media CAS.
void close();
Apri una sessione.
Session openSession(); Session openSession(@SessionUsage int sessionUsage, @ScramblingMode int scramblingMode);
Chiudi una sessione aperta in precedenza.
void Session#close();
Fornire i dati privati della CA da un descrittore della CA nel PMT, che può essere dalle informazioni sul programma o dalla sezione delle informazioni sull'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);
Recupera l'ID sessione.
byte[] Session#getSessionId();
Invia un evento di sessione a un sistema CA. Il formato di l'evento è specifico per lo schema ed è opaco rispetto al framework.
void Session#sendSessionEvent(int event, int arg, @Nullable byte[] data);