Ramy CAS

Struktura systemów dostępu warunkowego Media (Media CAS) zapewnia standardowe interfejsy API umożliwiające usługi dostępu warunkowego (CA) na szeregu sprzętu telewizji cyfrowej, w tym w cyfrowych systemach telewizji kablowej, satelitarnej, naziemnej i systemach IPTV. Struktura współpracuje z platformą Android TV Input i platformą Android TV Tuner , udostępniając interfejsy API Java wywoływane z aplikacji TV Input Service (TIS).

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

  • Zapewnij publiczny interfejs API języka Java i natywną platformę wtyczek, z której mogą korzystać programiści zewnętrzni i producenci OEM w celu obsługi CAS w przypadku transmisji telewizyjnej w systemie Android.
  • Zapewnij środowisko CAS w systemie Android, które umożliwia producentom OEM pojazdów ATV spójną współpracę z różnymi dostawcami CAS.
  • Obsługa wielu zewnętrznych dostawców CAS przy użyciu natywnych wtyczek. Wtyczki CAS mogą korzystać z protokołów sieciowych specyficznych dla dostawcy, formatów komunikatu zarządzania uprawnieniami (EMM)/komunikatu kontroli uprawnień (ECM) i deszyfratorów.
  • Obsługuj zabezpieczenia sprzętowe, takie jak drabiny kluczowe.
  • Obsługa zaufanych środowisk wykonawczych (TEE), takich jak TrustZone.

Obsługiwane konfiguracje

Konfiguracja tunera sprzętowego

Jeśli sprzęt jest odpowiedzialny za demultipleksację i deszyfrowanie strumienia transportowego MPEG, środowisko Tuner zapewnia dostęp warunkowy do danych specyficznych dla programu (PSI) do aplikacji TIS w celu współpracy ze sprzętowymi tunerami telewizyjnymi.

Dane PSI o dostępie warunkowym obejmują deskryptory CA, ECM i EMM. Struktury te umożliwiają wtyczce CAS uzyskanie kluczy potrzebnych do odszyfrowania strumieni treści.

Schemat konfiguracji sprzętowej tunera.

Rysunek 1. Konfiguracja tunera sprzętowego

Konfiguracja sprzętowa może obejmować warstwę TEE, taką jak TrustZone, co pokazano na rysunku 1. Jeśli nie ma warstwy TEE, wtyczka klienta CAS może komunikować się z usługami drabinki kluczy sprzętowych udostępnianymi przez platformę. Ze względu na specyficzne dla dostawcy różnice w tych interfejsach, firma Media CAS nie standaryzuje ich.

Konfiguracja oprogramowania

Przed Androidem 11 platforma Media CAS mogła być nadal używana do przetwarzania treści opartych na oprogramowaniu, takich jak IPTV z IP multicast/unicast. Aplikacja TIS jest odpowiedzialna za tworzenie instancji i prawidłowe udostępnianie obiektu Media CAS Java.

Aplikacja może używać MediaExtractora lub innych analizatorów MPEG2-TS do wyodrębniania danych PSI związanych z urzędem certyfikacji, takich jak deskryptory urzędu certyfikacji, ECM i EMM. Jeśli aplikacja korzysta ze struktury MediaExtractor, może delegować zarządzanie sesjami CAS, takie jak otwieranie sesji i przetwarzanie EMM/ECM, do platformy MediaExtractor. Następnie MediaExtractor konfiguruje sesję CAS bezpośrednio przy użyciu natywnego interfejsu API.

W przeciwnym razie aplikacja jest odpowiedzialna za wyodrębnienie danych PSI związanych z CA i skonfigurowanie sesji CAS przy użyciu interfejsów API Media CAS Java (na przykład, gdy aplikacja korzysta z własnego analizatora składni MPEG2-TS).

Schemat konfiguracji tunera.

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

W scenariuszu ekstraktora oprogramowania ekstraktor wymaga programowego lub sprzętowego obiektu deszyfrującego dla każdej zaszyfrowanej ścieżki, niezależnie od tego, czy ścieżka wymaga bezpiecznych dekoderów. Dzieje się tak z następujących powodów.

  • Jeśli ścieżka nie wymaga bezpiecznego dekodowania, ekstraktor deszyfruje jednostkę dostępową w celu wyczyszczenia buforów i wyodrębnia próbki tak, jakby były z czystego strumienia. W ten sposób MediaCodec nie musi być zaangażowany w deszyfrowanie.
  • 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, gdzie szyfrowany jest nagłówek pakietowego strumienia podstawowego (PES). Ekstraktor musi uzyskać dostęp do nagłówka PES, aby pobrać określone informacje (na przykład znacznik czasu prezentacji).

    Deszyfrator nie jest używany przez ekstraktor, jeśli strumień transportowy jest szyfrowany na poziomie pakietu PES, gdzie nagłówek PES pozostaje czysty. Jednakże nie można potwierdzić, kiedy nastąpi szyfrowanie, dopóki nie dotrze rzeczywisty zaszyfrowany pakiet. Dla uproszczenia załóżmy, że używany jest deszyfrator, jeśli na podstawie tabeli mapowania programu (PMT) ustalono, że ścieżka jest zaszyfrowana.

Ograniczenia konfiguracji oprogramowania

Gdy ścieżka wymaga bezpiecznego dekodowania, deszyfrator musi zachować ostrożność, pozwalając na operację dekodowania do czystych buforów. Ponieważ wymagane jest niepewne dekodowanie dźwięku, jeśli dekodowanie wideo wymaga bezpiecznych dekoderów, powinno zostać zakodowane w innej sesji niż dźwięk. Moduł ECM sesji musi zasygnalizować wtyczce, że wymagany jest bezpieczny dekoder.

Alternatywnie wtyczka musi być w stanie niezawodnie powiązać klucz ze swoją polityką bezpieczeństwa. W przeciwnym razie aplikacja może łatwo uzyskać klatki wideo za pomocą dekodera audio.

Nawet jeśli sesja wymaga bezpiecznego dekodera, może zostać poproszona o przesłanie niewielkiej ilości danych w celu wyczyszczenia buforów przez ekstraktor w celu przetworzenia nagłówka 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 ładunek zaczyna się od nagłówka PES odpowiedniego typu strumienia. W przeciwnym razie wtyczka powinna odrzucić żądanie.

Sekwencja strojenia CA

Podczas strojenia nowego kanału moduł TIS rejestruje się w celu odbierania deskryptorów 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 Media CAS, aby ustalić, czy istnieje wtyczka CAS, która może obsłużyć deskryptor urzędu certyfikacji.

Schemat strojenia zawartości CAS.

Rysunek 3. Dostrajanie zawartości CAS

Jeśli obsługiwany jest identyfikator systemu CA, tworzona jest instancja Media CAS, a do wtyczki dostarczane są prywatne dane dostawcy z deskryptora urzędu certyfikacji. Następnie otwierane są nowe sesje w Media CAS w celu obsługi strumieni audio i wideo. Nowo otwarte sesje otrzymują wiadomości ECM i EMM dla wtyczki.

Przykładowy przepływ wtyczki CAS

TIS dostarcza ECM do wtyczki CAS przy użyciu interfejsów API Media CAS. ECM zawiera zaszyfrowane słowo kontrolne, które należy odszyfrować przy użyciu informacji z EMM. Wtyczka CAS określa sposób uzyskania komunikatu EMM dla zasobu w oparciu o informacje specyficzne dla dostawcy zawarte w deskryptorze urzędu certyfikacji, które są dostarczane przez metodę setPrivateData() .

Komunikaty EMM mogą być dostarczane w paśmie w strumieniu treści lub poza pasmem przy użyciu żądania sieciowego inicjowanego przez wtyczkę CA. TIS używa metody processEMM() do dostarczania dowolnych komunikatów EMM w paśmie do wtyczki CA.

Jeśli do uzyskania wiadomości EMM wymagane jest żądanie sieciowe, wtyczka CA odpowiada za wykonanie transakcji sieciowej z serwerem licencji.

Schemat przykładowego CAS.

Rysunek 4. Przykładowa wtyczka CAS do przetwarzania EMM i ECM

Po odebraniu wiadomości EMM wtyczka urzędu certyfikacji analizuje ją w celu uzyskania zaszyfrowanego klucza umożliwiającego odszyfrowanie słowa kontrolnego. Zaszyfrowany klucz EMM i zaszyfrowane słowo kontrolne mogą zostać załadowane do drabiny kluczy lub zaufanego środowiska w celu przeprowadzenia deszyfrowania słowa kontrolnego, a następnie deszyfrowania strumienia treści.

Media CAS Java API

Interfejs API Java Media CAS zawiera następujące metody.

  • Lista wszystkich dostępnych wtyczek CA na urządzeniu.

    class MediaCas.PluginDescriptor {
      public String getName();
      public int getSystemId();
    }
    static PluginDescriptor[] enumeratePlugins();
    
  • Skonstruuj instancję Media CAS dla określonego systemu urzędu certyfikacji. Oznacza to, że framework Media CAS może jednocześnie obsługiwać wiele systemów CAS.

    MediaCas(int CA_system_id);
    MediaCas(@NonNull Context context, int casSystemId,
             @Nullable String tvInputServiceSessionId,
             @PriorityHintUseCaseType int priorityHint);
    
  • Zarejestruj detektor zdarzeń i zezwól aplikacji na określenie procedury obsługi, której używany jest 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);
    
  • Wyślij prywatne dane do systemu CA. Dane prywatne mogą pochodzić z deskryptora urzędu certyfikacji, tabeli dostępu warunkowego lub źródeł pozapasmowych. Nie jest to powiązane z konkretną sesją.

    void setPrivateData(@NonNull byte[] data);
    
  • Przetwórz pakiet EMM.

    void processEmm(@NonNull byte[] data, int offset, int length);
    
  • Wyślij zdarzenie do systemu CA. Format wydarzenia jest specyficzny dla schematu i nieprzejrzysty dla ram.

    void sendEvent(int event, int arg, @Nullable byte[] data);
    
  • Zainicjuj operację udostępniania określonego typu dla systemu CA. Kiedy urządzenie po raz pierwszy rejestruje się w usłudze płatnej telewizji, musi najpierw zostać przydzielone do serwera CAS. Podaj zestaw powiązanych parametrów urządzeniu na potrzeby aprowizacji.

    void provision(String provisionString);
    
  • Wywołaj odświeżenie uprawnień. Gdy użytkownik subskrybuje nowy kanał (na przykład odpowiadając na reklamę lub dodając kanał w elektronicznym przewodniku po programach (EPG)), aplikacja powinna być w stanie poinformować klientów urzędu certyfikacji 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 poprzednio otwartą sesję.

    void Session#close();
    
  • Podaj prywatne dane urzędu certyfikacji z deskryptora urzędu certyfikacji w pliku PMT, który może pochodzić z sekcji informacji o programie lub informacji o programie ES, do sesji CAS.

    void Session#setPrivateData(@NonNull byte[] sessionId, @NonNull byte[] data);
    
  • Przetwórz pakiet ECM dla 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 wydarzenia jest specyficzny dla schematu i jest nieprzejrzysty dla ram.

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