Ramy CAS

Platforma systemów dostępu warunkowego do multimediów (Media CAS) udostępnia standardowe interfejsy API, które umożliwiają korzystanie z usług dostępu warunkowego (CA) na różnych urządzeniach do telewizji cyfrowej, w tym w systemach telewizji kablowej, satelitarnej, naziemnej i IPTV. Platforma współpracuje z platformą wejściową Androida TVplatformą tunera Androida TV, udostępniając interfejsy API Java wywoływane z aplikacji usługi wejścia TV (TIS).

Główne cele Media CAS są następujące:

  • Udostępnienie publicznego interfejsu Java API i platformy wtyczek natywnych, z których mogą korzystać deweloperzy zewnętrzni i producenci OEM, aby obsługiwać system CAS w przypadku telewizji nadawczej na Androidzie.
  • Zapewnienie w Androidzie struktury CAS, która umożliwia producentom OEM ATV współpracę z różnymi dostawcami CAS w spójny sposób.
  • Obsługa wielu zewnętrznych dostawców CAS za pomocą wtyczek natywnych. Wtyczki CAS 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ługiwać zabezpieczenia sprzętowe, takie jak łańcuchy 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 i deszyfrowanie strumienia transportowego MPEG, platforma tunera dostarcza do aplikacji TIS dane PSI (program-specific information) dotyczące dostępu warunkowego, aby umożliwić interfejs z tunerami telewizyjnymi opartymi na sprzęcie.

Dane PSI dostępu warunkowego obejmują deskryptory CA, ECM i EMM. Te struktury umożliwiają wtyczce CAS uzyskanie kluczy potrzebnych do odszyfrowania strumieni treści.

Diagram konfiguracji tunera sprzętowego.

Rysunek 1. Konfiguracja tunera sprzętowego

Konfiguracja sprzętowa może mieć warstwę TEE, np. TrustZone, co przedstawiono na rysunku 1. Jeśli nie ma warstwy TEE, wtyczka klienta CAS może komunikować się z usługami kluczy sprzętowych udostępnianymi przez platformę. Ze względu na różnice w tych interfejsach u poszczególnych dostawców Media CAS nie standaryzuje ich.

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/unicastu IP. Aplikacja TIS jest odpowiedzialna za tworzenie instancji obiektu Java Media CAS i jego prawidłowe udostępnianie.

Aplikacja może używać narzędzia MediaExtractor lub innych parserów MPEG2-TS do wyodrębniania danych PSI związanych z CA, takich jak deskryptory CA, ECM i EMM. Jeśli aplikacja korzysta z platformy MediaExtractor, może przekazać zarządzanie sesją CAS, np. otwieranie sesji i przetwarzanie EMM/ECM, do platformy MediaExtractor. Następnie MediaExtractor konfiguruje sesję CAS bezpośrednio za pomocą natywnego interfejsu API.

W przeciwnym razie aplikacja jest odpowiedzialna za wyodrębnianie danych PSI związanych z CA i konfigurowanie sesji CAS za pomocą interfejsów Media CAS Java API (np. gdy aplikacja używa własnego parsera MPEG2-TS).

Diagram konfiguracji tunera.

Rysunek 2. Konfiguracja wejścia IPTV, CAS i dekodera przy użyciu platformy MediaExtractor

W przypadku oprogramowania wyodrębniającego wymagany jest obiekt deszyfrujący oparty na oprogramowaniu lub sprzęcie dla każdego zaszyfrowanego utworu, niezależnie od tego, czy utwór wymaga bezpiecznych dekoderów. Wynika to z tych powodów:

  • Jeśli ścieżka nie wymaga bezpiecznego dekodowania, ekstraktor odszyfrowuje jednostkę dostępu, aby wyczyścić bufory, i wyodrębnia próbki tak, jakby pochodziły z niezaszyfrowanego strumienia. W ten sposób MediaCodec nie musi brać udziału w deszyfrowaniu.
  • Jeśli ścieżka wymaga bezpiecznego dekodowania, ekstraktor może nadal potrzebować deszyfratora. Dzieje się tak, gdy strumień transportowy jest szyfrowany na poziomie pakietu transportowego, w którym szyfrowany jest nagłówek spakowanego strumienia elementarnego (PES). Ekstraktor musi mieć dostęp do nagłówka PES, aby przekazywać dalej określone informacje (np. sygnaturę czasową prezentacji).

    Dekoder nie jest używany przez ekstraktor, jeśli strumień transportowy jest szyfrowany na poziomie pakietu PES, a nagłówek PES pozostaje nieszyfrowany. Nie można jednak potwierdzić, kiedy następuje szyfrowanie, dopóki nie dotrze zaszyfrowany pakiet. Dla uproszczenia załóżmy, że dekoder jest używany, jeśli ścieżka jest zaszyfrowana na podstawie tabeli mapowania programu (PMT).

Ograniczenia konfiguracji oprogramowania

Jeśli ścieżka wymaga bezpiecznego dekodowania, dekoder musi zachować ostrożność, gdy zezwala na operację deszyfrowania w buforach czystego tekstu. Ponieważ wymagane jest niezabezpieczone dekodowanie dźwięku, jeśli dekodowanie wideo wymaga bezpiecznych dekoderów, powinno być szyfrowane w innej sesji niż dźwięk. ECM 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, może być konieczne wygenerowanie niewielkiej ilości danych w celu wyczyszczenia buforów przez ekstraktor, aby przetworzyć nagłówek PES. Aby zapobiec zwracaniu przez złośliwą aplikację całego modułu 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ć prośbę.

Sekwencja dostrajania CA

Podczas przełączania na nowy kanał moduł TIS rejestruje się, aby otrzymywać deskryptory CA, ECM i EMM z platformy PSI Tuner. Deskryptor urzędu certyfikacji zawiera identyfikator systemu urzędu certyfikacji, który jednoznacznie identyfikuje konkretnego dostawcę urzędu certyfikacji i inne dane specyficzne dla dostawcy. TIS wysyła zapytanie do CAS multimediów, aby sprawdzić, czy istnieje wtyczka CAS, która może obsłużyć deskryptor CA.

Diagram dostrajania treści CAS.

Rysunek 3. Dostosowywanie treści CAS

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 wtyczki.

Przykładowy przepływ wtyczki CAS

TIS dostarcza ECM do wtyczki CAS za pomocą interfejsów Media CAS API. ECM zawiera zaszyfrowane słowo kontrolne, które należy odszyfrować za pomocą informacji z EMM. Wtyczka CAS określa, jak uzyskać EMM dla zasobu na podstawie informacji specyficznych dla dostawcy w deskryptorze CA, który jest dostarczany przez metodę setPrivateData().

EMM mogą być dostarczane w ramach strumienia treści lub poza nim za pomocą żądania sieciowego zainicjowanego przez wtyczkę CA. TIS używa processEMM() metody do dostarczania w pasmie komunikatów EMM do wtyczki CA.

Jeśli do uzyskania EMM wymagane jest żądanie sieciowe, wtyczka CA jest odpowiedzialna za przeprowadzenie transakcji sieciowej z serwerem licencji.

Diagram przykładowego systemu CAS.

Rysunek 4. Przykładowa wtyczka CAS 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 mogą być wczytywane do drabiny kluczy lub zaufanego środowiska w celu odszyfrowania słowa kontrolnego i późniejszego rozkodowania strumienia treści.

Media CAS Java API

Interfejs Media CAS Java API zawiera te metody:

  • Wyświetl wszystkie dostępne wtyczki 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 platforma Media CAS może obsługiwać jednocześnie wiele systemów CAS.

    MediaCas(int CA_system_id);
    MediaCas(@NonNull Context context, int casSystemId,
             @Nullable String tvInputServiceSessionId,
             @PriorityHintUseCaseType int priorityHint);
    
  • Zarejestruj odbiornik zdarzeń i pozwól aplikacji określić moduł obsługi, którego pętla jest używana.

    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łanie danych prywatnych do systemu CA. Dane prywatne mogą pochodzić z deskryptora CA, tabeli dostępu warunkowego lub źródeł zewnętrznych. Nie jest to powiązane z konkretną sesją.

    void setPrivateData(@NonNull byte[] data);
    
  • Przetwarzanie pakietu EMM

    void processEmm(@NonNull byte[] data, int offset, int length);
    
  • Wysyłanie zdarzenia do systemu CA. Format zdarzenia jest specyficzny dla schematu i nieprzejrzysty dla platformy.

    void sendEvent(int event, int arg, @Nullable byte[] data);
    
  • Rozpoczyna operację udostępniania określonego typu dla systemu urzędu certyfikacji. Gdy urządzenie rejestruje się w usłudze telewizji płatnej po raz pierwszy, musi najpierw zostać udostępnione na serwerze CAS. Podaj zestaw powiązanych parametrów, które mają zostać udostępnione urządzeniu.

    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), aplikacja powinna być w stanie poinformować klientów CA o konieczności odświeżenia 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();
    
  • Przekazywanie prywatnych danych CA z deskryptora CA w PMT, które mogą pochodzić z sekcji informacji o programie lub 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();
    
  • Wysyłanie zdarzenia sesji do systemu CA. Format zdarzenia jest specyficzny dla schematu i nieprzejrzysty dla platformy.

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