Framework CAS

Le framework Media CAS (Media Conditional Access Systems) fournit des API standards pour activer les services d'accès conditionnel (CA) sur une gamme d'équipements de télévision numérique, y compris les systèmes de câble, de satellite, terrestres et IPTV numériques. Le framework fonctionne avec le framework d'entrée Android TV et le framework de tuner Android TV, fournissant des API Java appelées depuis l'application TV Input Service (TIS).

Les principaux objectifs de Media CAS sont les suivants :

  • Fournissez une API Java publique et un framework de plug-in natif que les développeurs tiers et les OEM peuvent utiliser pour prendre en charge le CAS pour la télévision diffusée 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.
  • Prendre en charge la sécurité matérielle, comme les échelles de clés
  • Prise en charge des environnements d'exécution sécurisés (TEE), tels que TrustZone.

Configurations compatibles

Configuration du tuner matériel

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

Les données PSI d'accès conditionnel incluent les descripteurs de CA, les ECM et les 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 spécifiques au fournisseur de ces interfaces, Media CAS ne les standardise pas.

Configuration logicielle

Avant Android 11, le framework Media CAS pouvait toujours être utilisé pour traiter les contenus basés sur des logiciels, tels que l'IPTV à partir de la diffusion multicast/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 aux CA, telles que les descripteurs CA, 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 à la CA et de configurer la session CAS à l'aide des API Java Media CAS (par exemple, lorsque l'application utilise son propre analyseur MPEG2-TS).

Schéma de la configuration du tuner.

Figure 2. Configuration de l'entrée IPTV, du CAS et du décodeur à l'aide du framework MediaExtractor

Dans le scénario de l'extracteur logiciel, l'extracteur nécessite un objet décodeur logiciel ou matériel pour chaque piste encodée, que la piste appelle des décodeurs sécurisés ou non. 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 le titre nécessite un décodage sécurisé, l'extracteur peut toujours avoir besoin d'un décodeur. 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 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é vide. 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 le canal nécessite un décodage sécurisé, le décodeur doit être prudent lorsqu'il autorise une opération de déchiffrement 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 indiquer 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é, il peut être demandé à l'extracteur de générer une petite quantité de données pour effacer 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

Lorsque vous sélectionnez une nouvelle chaîne, le module TIS s'enregistre pour recevoir des descripteurs CA, des ECM et des 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 de l'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 de 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 d'informations provenant d'un EMM. Le plug-in CAS détermine comment acquérir un EMM pour l'asset en fonction des informations spécifiques au fournisseur dans le descripteur de l'autorité de certification, qui est fourni par la méthode setPrivateData().

Les EMM peuvent être diffusés en bande dans le flux de contenu ou en dehors de la bande à l'aide d'une requête réseau lancée par le plug-in de certification. TIS utilise la méthode processEMM() pour transmettre tous les EMM en bande au plug-in de l'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

Lorsque l'EMM est reçu, le plug-in de l'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 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 boucleur 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 d'autorité 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);
    
  • Fermer une session précédemment ouverte

    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 "Infos sur le programme" ou "Infos 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 est opaque pour le framework.

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