CAS-Framework

Das Media Conditional Access Systems (Media CAS)-Framework bietet Standard-APIs, um Conditional Access (CA)-Dienste auf einer Reihe digitaler TV-Hardware zu ermöglichen, einschließlich digitaler Kabel-, Satelliten-, terrestrischer Systeme und IPTV-Systeme. Das Framework funktioniert mit dem Android TV Input-Framework und dem Android TV Tuner-Framework und stellt Java-APIs bereit, die von der TV Input Service (TIS)-App aufgerufen werden.

Die Hauptziele von Media CAS sind folgende.

  • Stellen Sie eine öffentliche Java-API und ein natives Plugin-Framework bereit, die von Drittentwicklern und OEMs verwendet werden können, um CAS für Rundfunkfernsehen in Android zu unterstützen.
  • Stellen Sie ein CAS-Framework in Android bereit, das ATV-OEMs die konsistente Zusammenarbeit mit einer Vielzahl von CAS-Anbietern ermöglicht.
  • Unterstützen Sie mehrere CAS-Drittanbieter mithilfe nativer Plugins. CAS-Plugins verwenden möglicherweise herstellerspezifische Netzwerkprotokolle, Formate für Berechtigungsverwaltungsnachrichten (EMM)/Berechtigungskontrollnachrichten (ECM) und Descrambler.
  • Unterstützen Sie Hardware-Sicherheit wie Schlüsselleitern.
  • Unterstützen Sie vertrauenswürdige Ausführungsumgebungen (TEEs) wie TrustZone.

Unterstützte Konfigurationen

Hardware-Tuner-Konfiguration

Wenn die Hardware für das Demultiplexen und Entschlüsseln des MPEG-Transportstroms verantwortlich ist, stellt das Tuner-Framework der TIS-App programmspezifische Informationsdaten (Conditional Access Program Specific Information, PSI) zur Verfügung, um eine Schnittstelle mit hardwarebasierten TV-Tunern herzustellen.

Zu den PSI-Daten für bedingten Zugriff gehören CA-Deskriptoren, ECMs und EMMs. Diese Strukturen ermöglichen es dem CAS-Plugin, Schlüssel zu erhalten, die zum Entschlüsseln der Inhaltsströme erforderlich sind.

Diagramm der Hardware-Tuner-Konfiguration.

Abbildung 1. Hardware-Tuner-Konfiguration

Die Hardwarekonfiguration verfügt möglicherweise über eine TEE-Schicht wie TrustZone, die in Abbildung 1 dargestellt ist. Wenn keine TEE-Schicht vorhanden ist, kann ein CAS-Client-Plugin mit den von der Plattform bereitgestellten Hardware-Schlüsselleiterdiensten kommunizieren. Aufgrund herstellerspezifischer Variationen dieser Schnittstellen werden sie von Media CAS nicht standardisiert.

Softwarekonfiguration

Vor Android 11 konnte das Media CAS-Framework noch zur Verarbeitung softwarebasierter Inhalte genutzt werden, etwa IPTV aus IP-Multicast/Unicast. Die TIS-App ist für die Instanziierung und ordnungsgemäße Bereitstellung des Media CAS Java-Objekts verantwortlich.

Die App verwendet möglicherweise MediaExtractor oder andere MPEG2-TS-Parser, um CA-bezogene PSI-Daten wie CA-Deskriptoren, ECMs und EMMs zu extrahieren. Wenn die App das Framework MediaExtractor verwendet, kann sie die CAS-Sitzungsverwaltung, z. B. das Öffnen einer Sitzung und die Verarbeitung von EMM/ECM, an das Framework MediaExtractor delegieren. MediaExtractor konfiguriert dann die CAS-Sitzung direkt über die native API.

Andernfalls ist die App dafür verantwortlich, die CA-bezogenen PSI-Daten zu extrahieren und die CAS-Sitzung mithilfe der Media CAS Java-APIs zu konfigurieren (z. B. wenn die App ihren eigenen MPEG2-TS-Parser verwendet).

Diagramm der Tuner-Konfiguration.

Abbildung 2. IPTV-Eingabe, CAS und Descrambler-Konfiguration mit dem Framework MediaExtractor

Im Software-Extraktor-Szenario benötigt der Extraktor für jede verschlüsselte Spur ein software- oder hardwarebasiertes Descrambler-Objekt, unabhängig davon, ob die Spur sichere Decoder erfordert. Dies ist auf Folgendes zurückzuführen.

  • Wenn für die Spur keine sichere Dekodierung erforderlich ist, entschlüsselt der Extraktor die Zugriffseinheit, um Puffer zu löschen, und extrahiert Samples wie aus einem klaren Stream. Auf diese Weise muss MediaCodec nicht an der Entschlüsselung beteiligt sein.
  • Wenn die Spur eine sichere Dekodierung erfordert, benötigt der Extraktor möglicherweise noch einen Descrambler. Dies geschieht, wenn der Transportstrom auf Transportpaketebene verschlüsselt wird, wobei der PES-Header (Packetized Elementary Stream) verschlüsselt wird. Der Extraktor muss auf den PES-Header zugreifen, um bestimmte Informationen weiterzuleiten (z. B. den Präsentationszeitstempel).

    Der Descrambler wird vom Extraktor nicht verwendet, wenn der Transportstrom auf PES-Paketebene verschlüsselt wird, wobei der PES-Header frei bleibt. Es ist jedoch nicht möglich, den Zeitpunkt der Verschlüsselung zu bestätigen, bis das tatsächlich verschlüsselte Paket eintrifft. Der Einfachheit halber wird davon ausgegangen, dass ein Descrambler verwendet wird, wenn anhand der Programmzuordnungstabelle (PMT) festgestellt wird, dass der Titel verschlüsselt ist.

Einschränkungen der Softwarekonfiguration

Wenn die Spur eine sichere Dekodierung erfordert, muss der Entschlüsseler vorsichtig sein, wenn er einen Entschlüsselungsvorgang in freie Puffer überlässt. Da eine unsichere Audiodecodierung erforderlich ist, sollte die Videodecodierung, wenn sie sichere Decoder erfordert, in einer anderen Sitzung als Audio verschlüsselt werden. Der ECM für die Sitzung muss dem Plugin signalisieren, dass ein sicherer Decoder erforderlich ist.

Alternativ muss das Plugin in der Lage sein, einen Schlüssel zuverlässig an seine Sicherheitsrichtlinie zu binden. Andernfalls kann die App mit dem Audio-Descrambler problemlos Videobilder abrufen.

Selbst wenn für die Sitzung ein sicherer Decoder erforderlich ist, wird er möglicherweise aufgefordert, eine kleine Datenmenge auszugeben, um Puffer durch den Extraktor zu löschen und den PES-Header zu verarbeiten. Um zu verhindern, dass eine bösartige App das Plugin dazu bringt, die gesamte Zugriffseinheit zurückzugeben, muss das Plugin die Transportnutzlast analysieren, um sicherzustellen, dass die Nutzlast mit einem PES-Header des entsprechenden Stream-Typs beginnt. Andernfalls sollte das Plugin die Anfrage ablehnen.

CA-Tuning-Sequenz

Beim Einstellen auf einen neuen Kanal registriert sich das TIS-Modul für den Empfang von CA-Deskriptoren, ECMs und EMMs vom PSI-Tuner-Framework. Ein CA-Deskriptor enthält die CA-System-ID, die einen bestimmten CA-Anbieter eindeutig identifiziert, sowie andere anbieterspezifische Daten. TIS fragt den Media CAS ab, um festzustellen, ob ein CAS-Plugin vorhanden ist, das den CA-Deskriptor verarbeiten kann.

Diagramm zur Optimierung des CAS-Inhalts.

Abbildung 3. CAS-Inhalt optimieren

Wenn die CA-System-ID unterstützt wird, wird eine Instanz des Media CAS erstellt und die privaten Daten des Anbieters aus dem CA-Deskriptor werden dem Plugin bereitgestellt. Anschließend werden in Media CAS neue Sitzungen geöffnet, um die Audio- und Videostreams zu verarbeiten. Die neu eröffneten Sitzungen erhalten ECMs und EMMs für das Plugin.

Beispiel für einen CAS-Plugin-Ablauf

TIS liefert ECMs über Media CAS-APIs an das CAS-Plugin. Ein ECM enthält das verschlüsselte Steuerwort, das mithilfe von Informationen aus einem EMM entschlüsselt werden muss. Das CAS-Plugin bestimmt, wie ein EMM für das Asset bezogen wird, basierend auf herstellerspezifischen Informationen im CA-Deskriptor, der von der setPrivateData() Methode bereitgestellt wird.

EMMs können In-Band im Content-Stream oder Out-of-Band mithilfe einer vom CA-Plugin initiierten Netzwerkanforderung bereitgestellt werden. TIS verwendet die Methode processEMM() , um beliebige In-Band-EMMs an das CA-Plugin zu übermitteln.

Wenn eine Netzwerkanfrage erforderlich ist, um ein EMM zu erhalten, ist das CA-Plugin für die Durchführung der Netzwerktransaktion mit einem Lizenzserver verantwortlich.

Diagramm eines Beispiel-CAS.

Abbildung 4. Beispiel eines CAS-Plugins für die EMM- und ECM-Verarbeitung

Wenn das EMM empfangen wird, analysiert das CA-Plugin es, um den verschlüsselten Schlüssel zum Entschlüsseln des Steuerworts zu erhalten. Der verschlüsselte EMM-Schlüssel und das verschlüsselte Steuerwort können in eine Schlüsselleiter oder eine vertrauenswürdige Umgebung geladen werden, um die Steuerwort-Entschlüsselung und die anschließende Entschlüsselung des Inhaltsstroms durchzuführen.

Medien-CAS-Java-API

Die Media CAS Java API enthält die folgenden Methoden.

  • Listen Sie alle verfügbaren CA-Plugins auf dem Gerät auf.

    class MediaCas.PluginDescriptor {
      public String getName();
      public int getSystemId();
    }
    static PluginDescriptor[] enumeratePlugins();
    
  • Erstellen Sie eine Media CAS-Instanz für das angegebene CA-System. Dies bedeutet, dass das Media CAS-Framework mehrere CAS-Systeme gleichzeitig verwalten kann.

    MediaCas(int CA_system_id);
    MediaCas(@NonNull Context context, int casSystemId,
             @Nullable String tvInputServiceSessionId,
             @PriorityHintUseCaseType int priorityHint);
    
  • Registrieren Sie einen Ereignis-Listener und ermöglichen Sie der App, einen Handler anzugeben, dessen Looper verwendet wird.

    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);
    
  • Senden Sie die privaten Daten für das CA-System. Die privaten Daten können aus dem CA-Deskriptor, der Tabelle für bedingten Zugriff oder Out-of-Band-Quellen stammen. Dies ist nicht mit einer bestimmten Sitzung verbunden.

    void setPrivateData(@NonNull byte[] data);
    
  • Verarbeiten Sie ein EMM-Paket.

    void processEmm(@NonNull byte[] data, int offset, int length);
    
  • Senden Sie ein Ereignis an ein CA-System. Das Format der Veranstaltung ist schemaspezifisch und für das Framework nicht transparent.

    void sendEvent(int event, int arg, @Nullable byte[] data);
    
  • Initiieren Sie einen Bereitstellungsvorgang des angegebenen Typs für ein CA-System. Wenn sich ein Gerät zum ersten Mal für einen Pay-TV-Dienst anmeldet, muss es zunächst auf dem CAS-Server bereitgestellt werden. Stellen Sie dem Gerät einen Satz verwandter Parameter zur Bereitstellung bereit.

    void provision(String provisionString);
    
  • Lösen Sie eine Aktualisierung der Berechtigungen aus. Wenn ein Benutzer einen neuen Kanal abonniert (z. B. indem er auf eine Werbung antwortet oder einen Kanal zum elektronischen Programmführer (EPG) hinzufügt), sollte die App in der Lage sein, die CA-Clients anzuweisen, die Berechtigungsschlüssel zu aktualisieren.

    void refreshEntitlements(int refreshType);
    
  • Schließen Sie das Media CAS-Objekt.

    void close();
    
  • Öffnen Sie eine Sitzung.

    Session openSession();
    Session openSession(@SessionUsage int sessionUsage, @ScramblingMode int scramblingMode);
    
  • Schließen Sie eine zuvor geöffnete Sitzung.

    void Session#close();
    
  • Stellen Sie einer CAS-Sitzung die privaten CA-Daten aus einem CA-Deskriptor im PMT zur Verfügung, der aus dem Abschnitt „Programminfo“ oder „ES-Info“ stammen kann.

    void Session#setPrivateData(@NonNull byte[] sessionId, @NonNull byte[] data);
    
  • Verarbeiten Sie ein ECM-Paket für eine Sitzung.

    void Session#processEcm(@NonNull byte[] data, int offset, int length);
    
  • Rufen Sie die Sitzungs-ID ab.

    byte[] Session#getSessionId();
    
  • Senden Sie ein Sitzungsereignis an ein CA-System. Das Format der Veranstaltung ist schemaspezifisch und für das Framework nicht transparent.

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