Framework CAS

Le framework des systèmes d'accès conditionnel à médias (Media CAS) fournit des API standards permettant d'activer des services d'accès conditionnel (CA) sur une gamme de matériel de télévision numérique, y compris les systèmes numériques par câble, satellite, terrestre et IPTV. Le framework fonctionne avec le framework d'entrée Android TV et le framework Android TV Tuner, en fournissant des API Java appelées à partir de l'application TV Input Service (TIS).

Les principaux objectifs de Media CAS sont les suivants :

  • Fournir une API Java publique et un framework de plug-ins natifs pouvant être utilisés par les développeurs tiers et les OEM afin de prendre en charge CAS pour la TV hertzienne sur Android.
  • Fournir un framework CAS dans Android qui permet aux OEM ATV d'interagir de manière cohérente avec différents fournisseurs de CAS.
  • Prise en charge de plusieurs fournisseurs de CAS tiers à l'aide de plug-ins natifs. Les plug-ins CAS peuvent utiliser des protocoles réseau spécifiques au fournisseur, des formats de message de gestion des droits d'accès (EMM)/de contrôle des droits d'accès (ECM) et des décodeurs.
  • assurer la sécurité matérielle, comme les échelles de clés ;
  • Compatibilité avec les environnements d'exécution sécurisés (TEE) tels que TrustZone.

Configurations compatibles

Configuration de Hardware Tuner

Si le matériel est responsable du démultiplexage et du désembrouillage du flux de transport MPEG, le framework Tuner fournit des informations spécifiques au programme (PSI) d'accès conditionnel à l'application TIS afin de s'interfacer avec des tuners TV basés sur le matériel.

L'accès conditionnel aux données PSI inclut des descripteurs d'autorité de certification, des ECM et des EMM. Ces structures permettent au plug-in CAS d'obtenir les clés nécessaires pour déchiffrer les flux de contenu.

Schéma de la configuration du tuner matériel.

Figure 1 : Configuration du tuner matériel

La configuration matérielle peut comporter une couche TEE, telle que TrustZone, comme illustré dans la figure 1. S'il n'y a pas de couche TEE, un plug-in client CAS peut communiquer avec les services de hiérarchie de clés matérielles fournis par la plate-forme. En raison des variantes de ces interfaces spécifiques aux fournisseurs, Media CAS ne les standardise pas.

Configuration logicielle

Avant Android 11, le framework Media CAS pouvait encore être utilisé pour traiter du contenu logiciel, tel que l'IPTV à partir de la multidiffusion/unicast IP. L'application TIS est chargée d'instancier et de provisionner correctement l'objet Java Media CAS.

L'application peut utiliser MediaExtractor ou d'autres analyseurs MPEG2-TS pour extraire les données PSI liées à l'autorité de certification, telles que les descripteurs d'autorité de certification, les ECM et les EMM. Si l'application utilise le framework MediaExtractor, elle peut déléguer la gestion des sessions CAS, comme l'ouverture d'une session et le traitement d'EMM/ECM, au framework MediaExtractor. MediaExtractor configure ensuite la session CAS directement à l'aide de l'API native.

Sinon, l'application est chargée d'extraire les données PSI liées à l'autorité de certification et de configurer la session CAS à l'aide des API Media CAS Java (par exemple, lorsque l'application utilise son propre analyseur MPEG2-TS).

Schéma de la configuration du tuner.

Figure 2. Configuration d'entrée, d'autorité de certification et de désembrouilleur IPTV à l'aide du framework MediaExtractor

Dans le scénario de l'extracteur logiciel, l'extracteur nécessite un objet de décodage logiciel ou matériel pour chaque piste brouillée, que la piste appelle ou non des décodeurs sécurisés. Cela est dû aux éléments suivants.

  • Si le titre ne nécessite pas de décodage sécurisé, l'extracteur déchiffre l'unité d'accès pour vider les tampons et extrait des échantillons comme s'il s'agissait d'un flux clair. De cette façon, MediaCodec n'a pas besoin d'être impliqué dans le déchiffrement.
  • Si la piste nécessite un décodage sécurisé, l'extracteur peut toujours avoir besoin d'un décodage. Cela se produit lorsque le flux de transport est brouillé au niveau du paquet de transport, où l'en-tête du flux élémentaire empaqueté (PES) est brouillé. L'extracteur doit accéder à l'en-tête PES pour transmettre certaines informations en aval (par exemple, le code temporel de la présentation).

    Le décodeur n'est pas utilisé par l'extracteur si le flux de transport est encodé au niveau du paquet PES, où l'en-tête PES est laissé clair. Toutefois, il n'est pas possible de confirmer le moment où le chiffrement se produit tant que le paquet chiffré n'est pas arrivé. Par souci de simplicité, supposons qu'un décodeur soit utilisé si la piste est déterminée comme étant encodée en fonction de la table de mappage de programme (PMT).

Limites de la configuration logicielle

Lorsque la piste nécessite un décodage sécurisé, le désembrouilleur doit faire preuve de prudence lorsqu'il laisse une opération de décodage dans des tampons clairs. Étant donné que le décodage audio non sécurisé est obligatoire, si le décodage vidéo nécessite des décodeurs sécurisés, il doit être brouillé sur une session différente de l'audio. L'ECM de la session doit signaler au plug-in qu'un décodeur sécurisé est requis.

Le plug-in doit également pouvoir associer de manière fiable une clé à sa stratégie de sécurité. Sinon, l'application peut facilement obtenir des images vidéo avec le décodeur audio.

Même lorsque la session nécessite un décodeur sécurisé, l'extracteur peut être invité à générer une petite quantité de données pour vider les tampons afin de traiter l'en-tête PES. Pour empêcher une application malveillante de faire renvoyer l'unité d'accès complète par le plug-in, celui-ci doit analyser la charge utile de transport pour s'assurer qu'elle commence par un en-tête PES du type de flux approprié. Sinon, le plug-in doit refuser la requête.

Séquence de réglage de la CA

Lors du réglage d'un nouveau canal, le module TIS s'enregistre pour recevoir les descripteurs d'autorité de certification, les ECM et les EMM du framework PSI Tuner. Un descripteur d'autorité de certification contient l'ID système de l'autorité de certification, qui identifie de manière unique un fournisseur d'autorité de certification spécifique et d'autres données spécifiques au fournisseur. TIS interroge le CAS multimédia pour déterminer si un plug-in CAS peut gérer le descripteur d'autorité de certification.

Schéma de réglage du contenu du CAS.

Figure 3. Ajuster le contenu du CAS

Si l'ID système de l'autorité de certification est compatible, une instance du CAS multimédia est créée et les données privées du fournisseur du descripteur de l'autorité de certification sont fournies au plug-in. Ensuite, de nouvelles sessions sont ouvertes dans Media CAS pour gérer les flux audio et vidéo. Les nouvelles sessions ouvertes reçoivent des ECM et des EMM pour le plug-in.

Exemple de flux du plug-in CAS

TIS transmet les ECM au plug-in CAS à l'aide des API Media CAS. Un ECM contient le mot de contrôle chiffré, qui doit être déchiffré à l'aide des informations d'un EMM. Le plug-in CAS détermine comment acquérir un fournisseur EMM pour l'élément en fonction des informations spécifiques au fournisseur contenues dans le descripteur de l'autorité de certification, qui est fournie par la méthode setPrivateData().

Les EMM peuvent être fournis en bande dans le flux de contenu ou hors bande à l'aide d'une requête réseau initiée par le plug-in CA. TIS utilise la méthode processEMM() pour transmettre tous les EMM en bande au plug-in d'autorité de certification.

Si une requête réseau est requise pour obtenir un EMM, le plug-in de l'autorité de certification est chargé d'effectuer la transaction réseau avec un serveur de licence.

Schéma d'un exemple de CAS.

Figure 4. Exemple de plug-in CAS pour le traitement EMM et ECM

Une fois la carte EMM reçue, le plug-in d'autorité de certification l'analyse pour obtenir la clé chiffrée permettant de déchiffrer le mot de contrôle. La clé EMM chiffrée et le mot de contrôle chiffré peuvent être chargés dans une échelle de clés ou un environnement de confiance pour effectuer le déchiffrement du mot de contrôle et le déchiffrement ultérieur du flux de contenu.

API Java Media CAS

L'API Java Media CAS contient les méthodes suivantes.

  • Répertoriez tous les plug-ins d'autorité de certification disponibles sur l'appareil.

    class MediaCas.PluginDescriptor {
      public String getName();
      public int getSystemId();
    }
    static PluginDescriptor[] enumeratePlugins();
    
  • Créez une instance Media CAS pour le système d'autorité de certification spécifié. Cela signifie que le framework Media CAS peut gérer plusieurs systèmes CAS simultanément.

    MediaCas(int CA_system_id);
    MediaCas(@NonNull Context context, int casSystemId,
             @Nullable String tvInputServiceSessionId,
             @PriorityHintUseCaseType int priorityHint);
    
  • Enregistrez un écouteur d'événements et autorisez l'application à spécifier un gestionnaire dont le looper est utilisé.

    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);
    
  • Envoyez les données privées pour le système d'autorité de certification. Les données privées peuvent provenir du descripteur de l'autorité de certification, de la table d'accès conditionnel ou de sources hors bande. Il n'est pas associé à une session spécifique.

    void setPrivateData(@NonNull byte[] data);
    
  • Traiter un paquet EMM.

    void processEmm(@NonNull byte[] data, int offset, int length);
    
  • Envoyer un événement à un système de certification. Le format de l'événement est spécifique au schéma et opaque pour le framework.

    void sendEvent(int event, int arg, @Nullable byte[] data);
    
  • Lancez une opération de provisionnement du type spécifié pour un système d'autorité de certification. Lorsqu'un appareil s'inscrit à un service de télévision payante pour la première fois, il doit d'abord être provisionné sur le serveur CAS. Fournissez un ensemble de paramètres associés à l'appareil pour le provisionnement.

    void provision(String provisionString);
    
  • Déclencher une actualisation des droits d'accès. Lorsqu'un utilisateur s'abonne à une nouvelle chaîne (par exemple, en répondant à une publicité ou en ajoutant une chaîne dans le guide électronique des programmes (EPG)), l'application doit pouvoir demander aux clients de l'autorité de certification de mettre à jour les clés d'accès.

    void refreshEntitlements(int refreshType);
    
  • Fermez l'objet Media CAS.

    void close();
    
  • Ouvrez une session.

    Session openSession();
    Session openSession(@SessionUsage int sessionUsage, @ScramblingMode int scramblingMode);
    
  • Fermez une session ouverte précédemment.

    void Session#close();
    
  • Fournissez les données privées de l'autorité de certification à partir d'un descripteur d'autorité de certification dans le PMT, qui peut provenir de la section "Informations sur le programme" ou "Informations sur l'ES", à une session CAS.

    void Session#setPrivateData(@NonNull byte[] sessionId, @NonNull byte[] data);
    
  • Traiter un paquet ECM pour une session.

    void Session#processEcm(@NonNull byte[] data, int offset, int length);
    
  • Obtenez l'ID de session.

    byte[] Session#getSessionId();
    
  • Envoyer un événement de session à un système d'autorité de certification Le format de l'événement est spécifique au schéma et opaque pour le framework.

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