CAS-Framework

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

Die Hauptziele von Media CAS sind:

  • Bereitstellung einer öffentlichen Java API und eines nativen Plug-in-Frameworks, das von Drittanbietern und OEMs zur Unterstützung von CAS für Übertragungen von TV-Programmen unter Android verwendet werden kann.
  • Ein CAS-Framework in Android bereitstellen, mit dem ATV-OEMs einheitlich mit einer Vielzahl von CAS-Anbietern interagieren können.
  • Unterstützung mehrerer CAS-Anbieter von Drittanbietern mit nativen Plug-ins CAS-Plug-ins können anbieterspezifische Netzwerkprotokolle, EMM-/ECM-Formate (Entitlement Management Message/Entitlement Control Message) und Descrambler verwenden.
  • Unterstützung für Hardwaresicherheit wie Schlüsselleitern.
  • Unterstützung für vertrauenswürdige Ausführungsumgebungen (Trusted Execution Environments, TEEs) wie TrustZone.

Unterstützte Konfigurationen

Hardware-Tuner-Konfiguration

Wenn die Hardware für das Demultiplexen und Entschlüsseln von MPEG-Transportstreams verantwortlich ist, stellt das Tuner-Framework der TIS-App PSI-Daten (Programmspezifische Informationen für den bedingten Zugriff) zur Verfügung, um eine Schnittstelle zu hardwarebasierten TV-Tunern zu ermöglichen.

Zu den PSI-Daten für den bedingten Zugriff gehören CA-Beschreibungen, ECMs und EMMs. Über diese Strukturen kann das CAS-Plug-in die Schlüssel abrufen, die zum Entschlüsseln der Inhaltsstreams erforderlich sind.

Diagramm der Hardware-Tuner-Konfiguration

Abbildung 1: Hardware-Tuner-Konfiguration

Die Hardwarekonfiguration kann eine TEE-Schicht wie TrustZone haben, wie in Abbildung 1 dargestellt. Wenn keine TEE-Ebene vorhanden ist, kann ein CAS-Client-Plug-in mit Hardware-Schlüsselleiterdiensten kommunizieren, die von der Plattform bereitgestellt werden. Aufgrund von anbieterspezifischen Varianten dieser Schnittstellen werden sie von Media CAS nicht standardisiert.

Softwarekonfiguration

Vor Android 11 konnte das Media CAS-Framework noch zur Verarbeitung softwarebasierter Inhalte wie IPTV von IP-Multicast/Unicast verwendet werden. Die TIS-App ist für die Instanziierung und korrekte 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-Beschreibungen, ECMs und EMMs zu extrahieren. Wenn die App das MediaExtractor-Framework verwendet, kann sie die CAS-Sitzungsverwaltung, z. B. das Öffnen einer Sitzung und die Verarbeitung von EMM/ECM, an das MediaExtractor-Framework 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 mit den Media CAS Java APIs zu konfigurieren (z. B. wenn die App einen eigenen MPEG2-TS-Parser verwendet).

Diagramm der Tunerkonfiguration

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

Im Szenario mit Software-Extraktion benötigt der Extractor für jeden verschlüsselten Titel ein software- oder hardwarebasiertes Descramber-Objekt, unabhängig davon, ob für den Titel sichere Decoder erforderlich sind. Das hat folgende Gründe:

  • Wenn für den Titel keine sichere Dekodierung erforderlich ist, entschlüsselt der Extractor die Zugriffseinheit, um Puffer zu leeren, und extrahiert Samples, als wären sie aus einem unverschlüsselten Stream. So muss MediaCodec nicht am Entschlüsseln beteiligt sein.
  • Wenn für den Titel eine sichere Dekodierung erforderlich ist, benötigt der Extraktor möglicherweise weiterhin einen Dekoder. Das passiert, wenn der Transportstream auf Transportpaketebene verschlüsselt wird, wo der PES-Header (Packetized Elementary Stream) verschlüsselt wird. Der Extractor muss auf den PES-Header zugreifen, um bestimmte Informationen weiterzuleiten (z. B. den Präsentationszeitstempel).

    Der Descrambler wird vom Extractor nicht verwendet, wenn der Transportstream auf PES-Paketebene verschlüsselt ist und der PES-Header leer bleibt. Es ist jedoch nicht möglich, zu bestätigen, wann das Verschlüsseln stattfindet, bis das tatsächliche verschlüsselte Paket eintrifft. Der Einfachheit halber wird davon ausgegangen, dass ein Dekoder verwendet wird, wenn der Track anhand der Programmzuordnungstabelle (PMT) als verschlüsselt erkannt wird.

Einschränkungen der Softwarekonfiguration

Wenn für den Titel eine sichere Dekodierung erforderlich ist, muss der Entschlüsseler vorsichtig sein, wenn er einen Entschlüsselungsvorgang in Klartext-Buffers zulässt. Da eine unsichere Audio-Dekodierung erforderlich ist, sollte die Videodekodierung, wenn sichere Dekodierer erforderlich sind, in einer anderen Sitzung als die Audiodaten verschlüsselt werden. Das ECM für die Sitzung muss dem Plug-in signalisieren, dass ein sicherer Decoder erforderlich ist.

Alternativ muss das Plug-in einen Schlüssel zuverlässig mit seiner Sicherheitsrichtlinie verknüpfen können. Andernfalls kann die App ganz einfach Videoframes mit dem Audio-Entschlüsseler abrufen.

Auch wenn für die Sitzung ein sicherer Decoder erforderlich ist, wird der Extractor möglicherweise aufgefordert, eine kleine Menge an Daten auszugeben, um die Puffer zu leeren und den PES-Header zu verarbeiten. Damit eine schädliche App das Plug-in nicht dazu bringen kann, die gesamte Zugriffseinheit zurückzugeben, muss das Plug-in die Transportnutzlast parsen, um sicherzustellen, dass die Nutzlast mit einem PES-Header des entsprechenden Streamtyps beginnt. Andernfalls sollte das Plug-in die Anfrage ablehnen.

CA-Abstimmungssequenz

Wenn ein neuer Kanal angewählt wird, registriert sich das TIS-Modul, um CA-Beschreibungen, ECMs und EMMs vom PSI Tuner-Framework zu empfangen. Ein Zertifizierungsstellen-Beschreibungselement enthält die Zertifizierungsstellen-System-ID, mit der ein bestimmter Zertifizierungsstellenanbieter und andere anbieterspezifische Daten eindeutig identifiziert werden. TIS fragt den Media CAS ab, um festzustellen, ob ein CAS-Plug-in vorhanden ist, das den CA-Deskriptor verarbeiten kann.

Diagramm zur Anpassung von CAS-Inhalten

Abbildung 3: CAS-Inhalte optimieren

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

Beispiel für den Ablauf eines CAS-Plug-ins

TIS übergibt ECMs mithilfe von Media CAS APIs an das CAS-Plug-in. Ein ECM enthält das verschlüsselte Kontrollwort, das mithilfe von Informationen aus einem EMM-Dienst entschlüsselt werden muss. Das CAS-Plug-in bestimmt anhand der anbieterspezifischen Informationen im CA-Beschreibungselement, das über die setPrivateData()-Methode bereitgestellt wird, wie ein EMM für das Asset erworben wird.

EMMs können im Inhaltsstream oder per Out-of-Band-Nutzlast mit einer vom CA-Plug-in initiierten Netzwerkanfrage gesendet werden. TIS verwendet die processEMM()-Methode, um alle In-Band-EMMs an das CA-Plug-in zu senden.

Wenn für den Erhalt einer EMM eine Netzwerkanfrage erforderlich ist, ist das CA-Plug-in für die Durchführung der Netzwerktransaktion mit einem Lizenzserver verantwortlich.

Diagramm eines Beispiel-CAS

Abbildung 4: Beispiel für ein CAS-Plug-in für die EMM- und ECM-Verarbeitung

Wenn die EMM empfangen wird, wird sie vom CA-Plug-in analysiert, um den verschlüsselten Schlüssel zum Entschlüsseln des Kontrollworts zu erhalten. Der verschlüsselte EMM-Schlüssel und das verschlüsselte Kontrollwort können in eine Schlüsselleiter oder eine vertrauenswürdige Umgebung geladen werden, um das Kontrollwort zu entschlüsseln und den Inhaltsstream anschließend zu entschlüsseln.

Media CAS Java API

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

  • Listet alle verfügbaren CA-Plug-ins auf dem Gerät auf.

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

    MediaCas(int CA_system_id);
    MediaCas(@NonNull Context context, int casSystemId,
             @Nullable String tvInputServiceSessionId,
             @PriorityHintUseCaseType int priorityHint);
    
  • Registrieren Sie einen Ereignis-Listener und erlauben 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-Beschreibungsobjekt, der Tabelle für den bedingten Zugriff oder aus Out-of-Band-Quellen stammen. Dieser Wert ist nicht mit einer bestimmten Sitzung verknüpft.

    void setPrivateData(@NonNull byte[] data);
    
  • EMM-Paket verarbeiten

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

    void sendEvent(int event, int arg, @Nullable byte[] data);
    
  • Einen Bereitstellungsvorgang des angegebenen Typs für ein CA-System initiieren. Wenn ein Gerät sich zum ersten Mal für einen Pay-TV-Dienst registriert, muss es zuerst auf dem CAS-Server bereitgestellt werden. Geben Sie eine Reihe von zugehörigen Parametern für die Bereitstellung des Geräts an.

    void provision(String provisionString);
    
  • Lösen Sie eine Aktualisierung der Berechtigungen aus. Wenn ein Nutzer einen neuen Kanal abonniert (z. B. durch Beantworten einer Werbung oder Hinzufügen eines Kanals im elektronischen Programmführer (EPG)), sollte die App die CA-Clients anweisen können, Berechtigungsschlüssel zu aktualisieren.

    void refreshEntitlements(int refreshType);
    
  • Schließe 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();
    
  • Gib die privaten Daten der Zertifizierungsstelle aus einem CA-Beschreibungselement in der PMT an, die aus dem Bereich „Programminformationen“ oder „ES-Informationen“ stammen können, an eine CAS-Sitzung weiter.

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

    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 des Ereignisses ist spezifisch für das Schema und für das Framework nicht transparent.

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