Platforma Media Conditional Access Systems (Media CAS) udostępnia standardowe interfejsy API, które umożliwiają korzystanie z usług dostępu warunkowego (CA) na różnych urządzeniach telewizji cyfrowej, w tym w systemach telewizji cyfrowej, satelitarnej, naziemnej i IPTV. Platforma współpracuje z platformą Android TV Input i platformą Android TV Tuner, udostępniając interfejsy Java API wywoływane z aplikacji TV Input Service (TIS).
Główne cele platformy Media CAS:
- Udostępnienie publicznego interfejsu Java API i platformy wtyczek natywnych, z których mogą korzystać deweloperzy zewnętrzni i producenci OEM, aby obsługiwać dostęp warunkowy w telewizji naziemnej w Androidzie.
- Udostępnienie w Androidzie platformy dostępu warunkowego, która umożliwia producentom OEM telewizorów z Androidem spójną współpracę z różnymi dostawcami dostępu warunkowego.
- Obsługa wielu zewnętrznych dostawców dostępu warunkowego za pomocą wtyczek natywnych. Wtyczki dostępu warunkowego mogą używać protokołów sieciowych specyficznych dla dostawcy, formatów wiadomości zarządzania uprawnieniami (EMM) lub wiadomości kontroli uprawnień (ECM) oraz dekoderó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 jest odpowiedzialny za demultipleksowanie strumienia transportowego MPEG i dekodowanie, platforma Tuner udostępnia aplikacji TIS dane PSI (program-specific information) dotyczące dostępu warunkowego, aby umożliwić współpracę z tunerami telewizyjnymi opartymi na sprzęcie.
Dane PSI dostępu warunkowego obejmują deskryptory CA, ECM i EMM. Te struktury umożliwiają wtyczce dostępu warunkowego uzyskanie kluczy potrzebnych do odszyfrowania strumieni treści.
Rysunek 1. Konfiguracja tunera sprzętowego
Konfiguracja sprzętowa może mieć warstwę TEE, taką jak TrustZone, co przedstawiono na rysunku 1. Jeśli nie ma warstwy TEE, wtyczka klienta dostępu warunkowego może komunikować się z usługami drabinki kluczy sprzętowych udostępnianymi przez platformę. Ze względu na różnice w tych interfejsach specyficzne dla dostawcy platforma Media CAS ich nie standaryzuje.
Konfiguracja oprogramowania
Przed Androidem 11 platforma Media CAS mogła być używana do przetwarzania treści opartych na oprogramowaniu, takich jak IPTV z multicastu lub unicastu IP. Aplikacja TIS jest odpowiedzialna za utworzenie instancji i prawidłowe udostępnienie obiektu Java Media CAS.
Aplikacja może używać MediaExtractor lub innych parserów MPEG2-TS do wyodrębniania danych PSI związanych z dostępem warunkowym, takich jak deskryptory CA, ECM i EMM. Jeśli aplikacja używa platformy MediaExtractor, może przekazać zarządzanie sesją dostępu warunkowego, np. otwieranie sesji i przetwarzanie EMM/ECM, do platformy MediaExtractor. MediaExtractor konfiguruje wtedy sesję dostępu warunkowego bezpośrednio za pomocą natywnego interfejsu API.
W przeciwnym razie aplikacja jest odpowiedzialna za wyodrębnienie danych PSI związanych z dostępem warunkowym i skonfigurowanie sesji dostępu warunkowego za pomocą interfejsów Java API Media CAS (np. gdy aplikacja używa własnego parsera MPEG2-TS).
Rysunek 2. Konfiguracja wejścia IPTV, dostępu warunkowego i dekodera za pomocą platformy MediaExtractor
W przypadku ekstraktora oprogramowania ekstraktor wymaga obiektu dekodera opartego na oprogramowaniu lub sprzęcie dla każdej zaszyfrowanej ścieżki, niezależnie od tego, czy ścieżka wymaga bezpiecznych dekoderów. Wynika to z tych powodów:
- Jeśli ścieżka nie wymaga bezpiecznego dekodowania, ekstraktor dekoduje jednostkę dostępu do czystych buforów i wyodrębnia próbki tak, jakby pochodziły z czystego strumienia. W ten sposób
MediaCodecnie musi brać udziału w dekodowaniu. Jeśli ścieżka wymaga bezpiecznego dekodowania, ekstraktor może nadal potrzebować dekodera. Dzieje się tak, gdy strumień transportowy jest szyfrowany na poziomie pakietu transportowego, gdzie szyfrowany jest nagłówek spakowanego strumienia elementarnego (PES). Ekstraktor musi mieć dostęp do nagłówka PES, aby przekazywać informacje do dalszego przetwarzania (np. sygnaturę czasową prezentacji).
Ekstraktor nie używa dekodera, jeśli strumień transportowy jest szyfrowany na poziomie pakietu PES, gdzie nagłówek PES pozostaje czysty. Nie można jednak potwierdzić, kiedy następuje szyfrowanie, dopóki nie dotrze rzeczywisty zaszyfrowany pakiet. Dla uproszczenia przyjmijmy, że dekoder jest używany, jeśli na podstawie tabeli mapowania programu (PMT) stwierdzono, że ścieżka jest zaszyfrowana.
Ograniczenia konfiguracji oprogramowania
Gdy ścieżka wymaga bezpiecznego dekodowania, dekoder musi zachować ostrożność, gdy zezwala na operację dekodowania do czystych buforów. Ponieważ wymagane jest niezabezpieczone dekodowanie dźwięku, jeśli dekodowanie wideo wymaga bezpiecznych dekoderów, należy je szyfrować w innej sesji niż dźwięk. ECM dla sesji musi sygnalizować wtyczce, że wymagany jest bezpieczny dekoder.
Wtyczka musi też być w stanie niezawodnie powiązać klucz z zasadami bezpieczeństwa. W przeciwnym razie aplikacja może łatwo uzyskać klatki wideo za pomocą dekodera dźwięku.
Nawet jeśli sesja wymaga bezpiecznego dekodera, ekstraktor może poprosić o wygenerowanie niewielkiej ilości danych do czystych buforów, aby przetworzyć nagłówek PES. Aby uniemożliwić złośliwej aplikacji zwrócenie przez wtyczkę całej jednostki dostępu, wtyczka musi przeanalizować ładunek transportowy, aby upewnić się, że zaczyna się on od nagłówka PES odpowiedniego typu strumienia. W przeciwnym razie wtyczka powinna odrzucić żądanie.
Sekwencja dostrajania dostępu warunkowego
Podczas dostrajania do nowego kanału moduł TIS rejestruje się, aby otrzymywać deskryptory CA, ECM i EMM z platformy PSI Tuner. Deskryptor CA zawiera identyfikator systemu CA, który jednoznacznie identyfikuje konkretnego dostawcę CA i inne dane specyficzne dla dostawcy. TIS wysyła zapytanie do Media CAS, aby sprawdzić, czy istnieje wtyczka CA, która może obsługiwać deskryptor CA.
Rysunek 3. Dostrajanie treści dostępu warunkowego
Jeśli identyfikator systemu CA jest obsługiwany, tworzona jest instancja Media CAS, a dane prywatne dostawcy z deskryptora CA są przekazywane do wtyczki. Następnie w Media CAS otwierane są nowe sesje do obsługi strumieni audio i wideo. Nowo otwarte sesje otrzymują ECM i EMM dla wtyczki.
Przykładowy przepływ wtyczki dostępu warunkowego
TIS dostarcza ECM do wtyczki dostępu warunkowego za pomocą interfejsów API Media CAS. ECM zawiera zaszyfrowane słowo kontrolne, które należy odszyfrować za pomocą informacji z EMM. Wtyczka dostępu warunkowego określa, jak uzyskać EMM dla zasobu, na podstawie informacji specyficznych dla dostawcy w deskryptorze CA, które są udostępniane 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() do dostarczania wtyczce CA wszystkich EMM w paśmie.
Jeśli do uzyskania EMM wymagane jest żądanie sieciowe, wtyczka CA jest odpowiedzialna za przeprowadzenie transakcji sieciowej z serwerem licencji.
Rysunek 4. Przykładowa wtyczka dostępu warunkowego do przetwarzania EMM i ECM
Po otrzymaniu EMM wtyczka CA analizuje go, aby uzyskać zaszyfrowany klucz do odszyfrowania słowa kontrolnego. Zaszyfrowany klucz EMM i zaszyfrowane słowo kontrolne można załadować do drabinki kluczy lub zaufanego środowiska, aby przeprowadzić odszyfrowanie słowa kontrolnego i późniejsze dekodowanie strumienia treści.
Interfejs Java API Media CAS
Interfejs Java API Media CAS zawiera te metody:
Wyświetla listę wszystkich dostępnych wtyczek CA na urządzeniu.
class MediaCas.PluginDescriptor { public String getName(); public int getSystemId(); } static PluginDescriptor[] enumeratePlugins();Tworzy instancję Media CAS dla określonego systemu CA. Oznacza to, że platforma Media CAS może obsługiwać jednocześnie wiele systemów CA.
MediaCas(int CA_system_id); MediaCas(@NonNull Context context, int casSystemId, @Nullable String tvInputServiceSessionId, @PriorityHintUseCaseType int priorityHint);Rejestruje detektor zdarzeń i umożliwia aplikacji określenie modułu obsługi, którego looper jest 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ła dane prywatne dla systemu CA. Dane prywatne mogą pochodzić z deskryptora CA, tabeli dostępu warunkowego lub źródeł poza pasmem. Nie są one powiązane z konkretną sesją.
void setPrivateData(@NonNull byte[] data);Przetwarza pakiet EMM.
void processEmm(@NonNull byte[] data, int offset, int length);Wysyła zdarzenie do systemu CA. Format zdarzenia jest specyficzny dla schematu i nieprzejrzysty dla platformy.
void sendEvent(int event, int arg, @Nullable byte[] data);Inicjuje operację udostępniania określonego typu dla systemu CA. Gdy urządzenie po raz pierwszy rejestruje się w usłudze płatnej telewizji, musi najpierw zostać udostępnione na serwerze CA. Udostępnia urządzeniu zestaw powiązanych parametrów do udostępniania.
void provision(String provisionString);Wywołuje odświeżenie uprawnień. Gdy użytkownik subskrybuje nowy kanał (np. odpowiadając na reklamę lub dodając kanał w elektronicznym przewodniku po programach (EPG)), aplikacja powinna być w stanie poinformować klientów CA, aby odświeżyli klucze uprawnień.
void refreshEntitlements(int refreshType);Zamyka obiekt Media CAS.
void close();Otwiera sesję.
Session openSession(); Session openSession(@SessionUsage int sessionUsage, @ScramblingMode int scramblingMode);Zamyka wcześniej otwartą sesję.
void Session#close();Udostępnia sesji CA dane prywatne CA z deskryptora CA w PMT, które mogą pochodzić z sekcji informacji o programie lub informacji ES.
void Session#setPrivateData(@NonNull byte[] sessionId, @NonNull byte[] data);Przetwarza pakiet ECM dla sesji.
void Session#processEcm(@NonNull byte[] data, int offset, int length);Pobiera identyfikator sesji.
byte[] Session#getSessionId();Wysyła zdarzenie sesji do systemu CA. Format zdarzenia jest specyficzny dla schematu i nieprzejrzysty dla platformy.
void Session#sendSessionEvent(int event, int arg, @Nullable byte[] data);