CAS-Framework

Das Framework für Media Conditional Access Systems (Media CAS) stellt Standard-APIs bereit, um Conditional Access (CA)-Dienste auf einer Reihe von digitaler TV-Hardware zu ermöglichen, einschließlich digitaler Kabel-, Satelliten-, terrestrische Systeme und IPTV-Systeme. Der Rahmen arbeitet mit den Android TV Input Rahmen und Android TV - Tuner - Framework , Java - APIs bereitstellt aufgerufen aus dem TV - Eingabedienst (TIS) App.

Die Hauptziele von Media CAS sind wie folgt.

  • Stellen Sie eine öffentliche Java-API und ein natives Plug-in-Framework bereit, die von Drittanbietern und OEMs verwendet werden können, um CAS für Broadcast-TV in Android zu unterstützen.
  • Stellen Sie ein CAS-Framework in Android bereit, mit dem ATV-OEMs auf konsistente Weise mit einer Vielzahl von CAS-Anbietern zusammenarbeiten können.
  • Unterstützen Sie mehrere CAS-Drittanbieter mit nativen Plugins. CAS-Plugins können herstellerspezifische Netzwerkprotokolle, Berechtigungsverwaltungsnachrichten (EMM)/Berechtigungskontrollnachrichten (ECM)-Formate und Descrambler verwenden.
  • Unterstützt Hardwaresicherheit wie Schlüsselleitern.
  • Unterstützt Trusted Execution Environments (TEEs) wie TrustZone.

Unterstützte Konfigurationen

Hardware-Tuner-Konfiguration

Wenn die Hardware für MPEG - Transportstrom Demultiplexen und Entwürfeln verantwortlich ist, Tuner Rahmen bietet Zugangsprogrammspezifische Informationen (PSI) Daten in dem TIS - App , um Schnittstelle mit Hardware-basierten TV - Tuner.

PSI-Daten mit bedingtem Zugriff umfassen 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 - Konfiguration Tuner

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

Softwarekonfiguration

Vor Android 11 konnte das Media CAS-Framework noch verwendet werden, um softwarebasierte Inhalte wie IPTV aus IP-Multicast/Unicast zu verarbeiten. Die TIS-App ist für die Instanziierung und ordnungsgemäße Bereitstellung des Media CAS Java-Objekts verantwortlich.

Die App kann MediaExtractor oder andere MPEG2-TS-Parser verwenden, um CA-bezogene PSI-Daten wie CA-Deskriptoren, ECMs und EMMs zu extrahieren. Wenn die App das Framework MediaExtractor verwendet, kann sie das CAS-Sitzungsmanagement, wie das Öffnen einer Sitzung und die Verarbeitung von EMM/ECM, an das Framework MediaExtractor delegieren. MediaExtractor konfiguriert dann die CAS-Sitzung direkt mit der nativen 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 - Eingang, CAS und Descrambler Konfiguration des Rahmen MediaExtractor mit

Im Software-Extraktor-Szenario benötigt der Extraktor ein software- oder hardwarebasiertes Descrambler-Objekt für jede verschlüsselte Spur, unabhängig davon, ob die Spur sichere Decoder erfordert. Dies liegt an folgendem.

  • Wenn die Spur keine sichere Dekodierung erfordert, entwürfelt der Extraktor die Zugriffseinheit, um Puffer zu löschen, und extrahiert Abtastwerte wie aus einem klaren Strom. Auf diese Weise MediaCodec muss nicht im Entscrambelungs beteiligt sein.
  • Wenn der Track eine sichere Dekodierung erfordert, benötigt der Extraktor möglicherweise noch einen Entwürfler. Dies geschieht, wenn der Transportstrom auf Transportpaketebene verschlüsselt wird, wo der Header des paketierten Elementarstroms (PES) verschlüsselt wird. Der Extraktor muss auf den PES-Header zugreifen, um nachgelagerte bestimmte Informationen (z. B. den Präsentationszeitstempel) zu erhalten.

    Der Entwürfler wird vom Extraktor nicht verwendet, wenn der Transportstrom auf PES-Paketebene verschlüsselt wird, wo der PES-Header freigelassen wird. Es ist jedoch nicht möglich zu bestätigen, wann die Verschlüsselung stattfindet, bis das tatsächliche verschlüsselte Paket ankommt. Der Einfachheit halber sei angenommen, dass ein Entwürfler verwendet wird, wenn basierend auf der Programmabbildungstabelle (PMT) bestimmt wird, dass die Spur verwürfelt ist.

Einschränkungen der Softwarekonfiguration

Wenn die Spur eine sichere Dekodierung erfordert, muss der Entwürfler vorsichtig sein, wenn er eine Entwürfelungsoperation in klare 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. Das 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 Videoframes abrufen.

Selbst wenn die Sitzung einen sicheren Decoder erfordert, kann sie vom Extraktor aufgefordert werden, eine kleine Datenmenge auszugeben, um Puffer zu löschen, um 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 Streamtyps beginnt. Andernfalls sollte das Plugin die Anfrage ablehnen.

CA-Tuning-Sequenz

Beim Abstimmen auf einen neuen Kanal registriert sich das TIS-Modul, um CA-Deskriptoren, ECMs und EMMs vom PSI-Tuner-Framework zu empfangen. Ein CA-Deskriptor enthält die CA-System-ID, die einen bestimmten CA-Anbieter und andere herstellerspezifische Daten eindeutig identifiziert. TIS fragt das Medien-CAS ab, um festzustellen, ob ein CAS-Plugin vorhanden ist, das den CA-Deskriptor verarbeiten kann.

Diagramm des Tuning-CAS-Inhalts.

Abbildung 3. Tuning CAS Inhalt

Wenn die CA-System-ID unterstützt wird, wird eine Instanz des Media-CAS erstellt und die privaten Anbieterdaten aus dem CA-Deskriptor werden dem Plugin bereitgestellt. Dann 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 Plugin.

CAS-Plug-in-Beispielablauf

TIS liefert ECMs an das CAS-Plugin mithilfe von Media CAS-APIs. Ein ECM enthält das verschlüsselte Steuerwort, das mit Informationen aus einem EMM entschlüsselt werden muss. Die CAS - Plugin legt fest , wie ein EMM für den Vermögenswert auf herstellerspezifischen Informationen in dem CA - Descriptor Basis zu erwerben, die von der vorgesehen ist setPrivateData() Methode.

EMMs können bandförmig im Inhaltsstream oder out-of-band mithilfe einer vom CA-Plug-in initiierten Netzwerkanforderung bereitgestellt werden. TIS verwendet die processEMM() Methode jeden in der Band EMM an die CA - Plugin zu liefern.

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 CAS - Plugin für EMM und ECM - Verarbeitung

Wenn die EMM empfangen wird, parst das CA-Plugin sie, um den verschlüsselten Schlüssel zum Entschlüsseln des Kontrollworts 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 Entschlüsselung des Steuerworts 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. 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-Deskriptor, der Conditional Access Table oder Out-of-Band-Quellen stammen. Dies ist nicht mit einer bestimmten Sitzung verbunden.

    void setPrivateData(@NonNull byte[] data);
    
  • Verarbeiten eines EMM-Pakets.

    void processEmm(@NonNull byte[] data, int offset, int length);
    
  • Senden Sie ein Ereignis an ein CA-System. Das Format der Veranstaltung ist spezifisch für das Programm und undurchsichtig für den Rahmen.

    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 zuerst dem CAS-Server bereitgestellt werden. Stellen Sie dem Gerät einen Satz zugehöriger Parameter für die 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 reagiert 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 bereit, die aus dem Programminfo- oder ES-Info-Abschnitt stammen können.

    void Session#setPrivateData(@NonNull byte[] sessionId, @NonNull byte[] data);
    
  • Verarbeiten eines ECM-Pakets 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 programmspezifisch und für den Rahmen undurchsichtig.

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