Platforma Media CAS udostępnia standardowe interfejsy API umożliwiające obsługę usług warunkowego dostępu (CA) w przypadku różnych urządzeń do cyfrowej telewizji, w tym systemów telewizji kablowej, satelitarnej i naziemnej oraz systemów IPTV. Platforma współpracuje ze platformą wprowadzania danych Android TV i platformą Android TV Tuner, udostępniając interfejsy API w języku Java wywoływane z aplikacji Usługa wejścia TV (TIS).
Główne cele Media CAS:
- Udostępnianie publicznego interfejsu Java API i ramowego środowiska natywnych wtyczek, które mogą być używane przez zewnętrznych programistów i producentów OEM do obsługi CAS w przypadku transmisji telewizyjnych na Androidzie.
- Udostępniać w Androidzie platformę CAS, która umożliwia OEM-om ATV współpracę z różnymi dostawcami usług CAS w sposób spójny.
- Obsługuj wielu zewnętrznych dostawców CAS za pomocą natywnych wtyczek. Wtyczki CAS mogą używać protokołów sieciowych specyficznych dla dostawcy, formatów wiadomości dotyczących zarządzania uprawnieniami (EMM) lub kontroli uprawnień (ECM) oraz deskryptorów.
- Obsługa zabezpieczeń sprzętowych, takich jak drabinki kluczy.
- obsługa zaufanych środowisk wykonawczych (TEE), takich jak TrustZone;
Obsługiwane konfiguracje
Konfiguracja tunera sprzętowego
Jeśli sprzęt odpowiada za demultipleksowanie i dekodowanie strumienia transportowego MPEG, ramka tunera przekazuje aplikacji TIS dane o programach (PSI) dotyczące warunkowego dostępu, aby umożliwić jej współpracę z tunerami telewizyjnymi opartymi na sprzęcie.
Dane PSI dostępu warunkowego obejmują deskryptory urzędów certyfikacji, ECM i dostawców usług EMM. Te struktury umożliwiają wtyczce CAS uzyskiwanie kluczy potrzebnych do odszyfrowywania strumieni treści.
Rysunek 1. Konfiguracja tunera sprzętowego
Konfiguracja sprzętowa może zawierać warstwę TEE, taką jak TrustZone, jak pokazano na rysunku 1. Jeśli nie ma warstwy TEE, wtyczka klienta CAS może komunikować się z usługami schodów kluczy sprzętowych udostępnianych przez platformę. Ze względu na różnice w tych interfejsach zależne od dostawcy Media CAS nie standaryzuje ich.
Konfiguracja oprogramowania
Przed Androidem 11 framework Media CAS można było nadal używać do przetwarzania treści opartych na oprogramowaniu, takich jak IPTV z multicastu/unicastu IP. Aplikacja TIS odpowiada za tworzenie instancji i prawidłowe inicjowanie obiektu Java Media CAS.
Aplikacja może używać MediaExtractor lub innych parserów MPEG2-TS do wyodrębniania danych PSI związanych z CA, takich jak opisy CA, ECM i EMM. Jeśli aplikacja korzysta z platformy MediaExtractor, może przekazać zarządzanie sesjami CAS, np. otwieranie sesji i przetwarzanie usług EMM/ECM, do platformy MediaExtractor. MediaExtractor następnie konfiguruje sesję CAS bezpośrednio za pomocą natywnego interfejsu API.
W przeciwnym razie aplikacja jest odpowiedzialna za wyodrębnienie danych PSI związanych z CA oraz skonfigurowanie sesji CAS za pomocą interfejsów API Media CAS w języku Java (np. gdy aplikacja używa własnego parsowania MPEG2-TS).
Rysunek 2. Konfiguracja wejścia IPTV, CAS i dekodera za pomocą platformy MediaExtractor
W sytuacji, gdy wyodrębniacz oprogramowania wymaga obiektu deszyfrującego oprogramowania lub sprzętu dla każdego zakodowanego utworu, niezależnie od tego, czy utwór wymaga bezpiecznych deszyfrowników. Wynika to z tych czynników:
- Jeśli ścieżka nie wymaga bezpiecznego dekodowania, moduł wyodrębniania dekoduje jednostkę dostępu, aby wyczyścić bufory i wyodrębniać próbki, tak jakby były to czyste strumienie. Dzięki temu
MediaCodec
nie musi uczestniczyć w dekodowaniu. Jeśli ścieżka wymaga bezpiecznego dekodowania, wyodrębnianie może wymagać dekodera. Dzieje się tak, gdy strumień transportu jest zaszyfrowany na poziomie pakietu transportowego, gdzie nagłówek pakietów strumienia podstawowego (PES) jest zaszyfrowany. Aby wyodrębniacz mógł przekazać określone informacje (np. sygnaturę czasową prezentacji), musi mieć dostęp do nagłówka PES.
Rozszyfrator nie jest używany przez ekstraktor, jeśli strumień transportowy jest zaszyfrowany na poziomie pakietu PES, gdzie nagłówek PES jest pusty. Nie można jednak potwierdzić, kiedy nastąpiło zaszyfrowanie, dopóki nie dotrze zaszyfrowany pakiet. Dla uproszczenia przyjmijmy, że dekoder jest używany, jeśli ścieżka jest zaszyfrowana na podstawie tabeli mapowania programu (PMT).
Ograniczenia konfiguracji oprogramowania
Gdy ścieżka wymaga bezpiecznego dekodowania, dekoder musi zachować ostrożność, udostępniając operację odszyfrowania w czystych buforach. Ponieważ wymagane jest niezabezpieczone dekodowanie dźwięku, to jeśli dekodowanie wideo wymaga bezpiecznych dekoderów, należy je zakodować w innej sesji niż dźwięk. ECM sesji musi przekazać wtyczce informację, że wymagany jest bezpieczny dekoder.
Ewentualnie wtyczka musi być w stanie niezawodnie powiązać klucz ze swoją zasadą zabezpieczeń. W przeciwnym razie aplikacja może łatwo pobierać klatki wideo za pomocą dekodera dźwięku.
Nawet jeśli sesja wymaga bezpiecznego dekodera, może być poproszona o wydanie niewielkiej ilości danych, aby oczyszczyć bufory ekstraktora w celu przetworzenia nagłówka PES. Aby zapobiec temu, aby złośliwa aplikacja zmusiła wtyczkę do zwrócenia całego zasobu dostępu, wtyczka musi przeanalizować ładunek transportowy, aby upewnić się, że ładunek zaczyna się nagłówkiem PES odpowiedniego typu strumienia. W przeciwnym razie wtyczka powinna odrzucić żądanie.
Sekwencja dostrajania urzędu certyfikacji
Podczas dostrajania do nowego kanału moduł TIS rejestruje się, aby otrzymywać deskryptory CA, ECM i dostawców usług EMM z platformy PSI Tuner. Deskryptor urzędu certyfikacji zawiera identyfikator systemu CA, który jednoznacznie identyfikuje konkretnego dostawcę urzędu certyfikacji i inne dane zależne od dostawcy. TIS wysyła zapytania do Media CAS, aby określić, czy istnieje wtyczka CAS, która może obsłużyć deskryptor urzędu certyfikacji.
Rysunek 3. Dostosowywanie treści CAS
Jeśli identyfikator systemu CAS jest obsługiwany, tworzona jest instancja Media CAS, a do wtyczki przesyłane są prywatne dane dostawcy z deskryptora urzędu certyfikacji. Następnie w Media CAS otwierane są nowe sesje, aby obsługiwać strumienie audio i wideo. Nowo otwarte sesje otrzymają usług EMM i ECM dla wtyczki.
Przykładowy przepływ wtyczki CAS
TIS dostarcza moduły ECM do wtyczki CAS za pomocą interfejsów Media CAS API. ECM zawiera zaszyfrowane słowo kontrolne, które musi zostać odszyfrowane przy użyciu informacji z usług EMM. Wtyczka CAS określa sposób pozyskania dostawcy usług EMM dla zasobu na podstawie informacji o konkretnych dostawcach w deskryptorze urzędu certyfikacji, które są dostarczane przez metodę setPrivateData()
.
EMM mogą być dostarczane w paśmie w strumieniu treści lub poza pasmem za pomocą żądania sieciowego zainicjowanego przez wtyczkę CA. TIS używa metody processEMM()
, aby dostarczać do wtyczki urzędu certyfikacji dowolnych dostawców usług EMM w paśmie.
Jeśli do uzyskania dostawcy usług EMM wymagane jest żądanie sieciowe, wtyczka CA odpowiada za przeprowadzenie transakcji sieciowej z serwerem licencji.
Rysunek 4. Przykładowa wtyczka CAS do przetwarzania usług EMM i ECM
Po otrzymaniu EMM wtyczka CA analizuje go, aby uzyskać klucz szyfrowania, który odszyfruje słowo sterujące. Zaszyfrowany klucz EMM i zaszyfrowane słowo kontrolne mogą zostać załadowane do drabiny kluczy lub zaufanej grupy, aby przeprowadzić odszyfrowanie słowa kontrolnego i dalsze odszyfrowywanie strumienia danych.
Media CAS Java API
Interfejs Media CAS Java API zawiera poniższe metody.
Lista wszystkich dostępnych wtyczek CA na urządzeniu.
class MediaCas.PluginDescriptor { public String getName(); public int getSystemId(); } static PluginDescriptor[] enumeratePlugins();
Utwórz instancję Media CAS dla określonego systemu CA. Oznacza to, że framework Media CAS może obsługiwać wiele systemów CAS jednocześnie.
MediaCas(int CA_system_id); MediaCas(@NonNull Context context, int casSystemId, @Nullable String tvInputServiceSessionId, @PriorityHintUseCaseType int priorityHint);
Zarejestrowanie detektora zdarzeń i pozwolenie aplikacji na określenie modułu obsługi, którego looper będzie używany.
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);
Wysyłaj prywatne dane do systemu CA. Dane prywatne mogą pochodzić z deskryptora urzędu certyfikacji, tabeli dostępu warunkowego lub źródeł spoza zakresu. Nie jest ona powiązana z żadną konkretną sesją.
void setPrivateData(@NonNull byte[] data);
Przetwórz pakiet EMM.
void processEmm(@NonNull byte[] data, int offset, int length);
wysyłać zdarzenie do systemu CA. Format zdarzenia jest specyficzny dla schematu i nieprzezroczysty dla struktury.
void sendEvent(int event, int arg, @Nullable byte[] data);
Zainicjuj operację udostępniania określonego typu dla systemu CA. Gdy urządzenie po raz pierwszy zarejestruje się w usłudze płatnej telewizji, musi zostać najpierw udostępnione na serwerze CAS. Podaj zestaw parametrów powiązanych z urządzeniem na potrzeby jego wdrożenia.
void provision(String provisionString);
Aktywuj odświeżanie uprawnień. Gdy użytkownik zasubskrybuje nowy kanał (np. odpowiadając na reklamę lub dodając kanał w elektronicznym przewodniku po programach (EPG), aplikacja powinna być w stanie poprosić klientów z urzędu certyfikacji o odświeżenie kluczy uprawnień).
void refreshEntitlements(int refreshType);
Zamknij obiekt Media CAS.
void close();
Otwórz sesję.
Session openSession(); Session openSession(@SessionUsage int sessionUsage, @ScramblingMode int scramblingMode);
Zamknij wcześniej otwartą sesję.
void Session#close();
Podaj prywatne dane urzędu certyfikacji z deskryptora urzędu certyfikacji w PMT. Mogą one pochodzić z sekcji informacji o programie lub sekcji informacji o ES do sesji CAS.
void Session#setPrivateData(@NonNull byte[] sessionId, @NonNull byte[] data);
Przetwarzanie pakietu ECM na potrzeby sesji.
void Session#processEcm(@NonNull byte[] data, int offset, int length);
Uzyskaj identyfikator sesji.
byte[] Session#getSessionId();
Wyślij zdarzenie sesji do systemu CA. Format zdarzenia jest specyficzny dla schematu i jest nieprzejrzysty dla struktury.
void Session#sendSessionEvent(int event, int arg, @Nullable byte[] data);