Cadre CAS

Le cadre des systèmes d'accès conditionnel aux médias (Media CAS) fournit des API standard pour activer les services d'accès conditionnel (CA) sur une gamme de matériel de télévision numérique, notamment le câble numérique, le satellite, les systèmes terrestres et les systèmes IPTV. Le framework fonctionne avec le framework Android TV Input et le framework Android TV Tuner , fournissant des API Java invoquées à partir de l'application TV Input Service (TIS).

Les principaux objectifs de Media CAS sont les suivants.

  • Fournissez une API Java publique et un cadre de plug-in natif qui peuvent être utilisés par des développeurs tiers et des OEM pour prendre en charge CAS pour la diffusion télévisée sur Android.
  • Fournissez un cadre CAS dans Android qui permet aux OEM ATV d'interagir avec une variété de fournisseurs CAS de manière cohérente.
  • Prend en charge plusieurs fournisseurs CAS tiers à l’aide de plugins natifs. Les plug-ins CAS peuvent utiliser des protocoles réseau spécifiques au fournisseur, des formats de message de gestion des droits (EMM)/message de contrôle des droits (ECM) et des désembrouilleurs.
  • Prend en charge la sécurité matérielle telle que les échelles de clés.
  • Prend en charge les environnements d'exécution fiables (TEE) tels que TrustZone.

Configurations prises en charge

Configuration du tuner matériel

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

Les données PSI à accès conditionnel incluent les descripteurs CA, les ECM et les EMM. Ces structures permettent au plugin CAS d'obtenir les clés nécessaires au décryptage des flux de contenu.

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

Figure 1. Configuration du tuner matériel

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

Configuration du logiciel

Avant Android 11, le framework Media CAS pouvait encore être utilisé pour traiter du contenu logiciel, tel que l'IPTV à partir de multidiffusion/unicast IP. L'application TIS est responsable de l'instanciation et du provisionnement correct de 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'AC, 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 EMM/ECM, au framework MediaExtractor. MediaExtractor configure ensuite la session CAS à l'aide directement de l'API native.

Sinon, l'application est responsable de l'extraction des données PSI liées à l'AC et de la configuration de 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ésembrouilleur à l'aide du framework MediaExtractor

Dans le scénario de l'extracteur logiciel, l'extracteur nécessite un objet désembrouilleur logiciel ou matériel pour chaque piste brouillée, que la piste fasse ou non appel à des décodeurs sécurisés. Cela est dû à ce qui suit.

  • Si la piste ne nécessite pas de décodage sécurisé, l'extracteur désembrouille l'unité d'accès pour effacer les tampons et extrait les échantillons comme s'ils provenaient d'un flux clair. De cette façon MediaCodec n'a pas besoin d'être impliqué dans le décryptage.
  • Si la piste nécessite un décodage sécurisé, l'extracteur peut toujours avoir besoin d'un désembrouilleur. 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 en paquets (PES) est brouillé. L'extracteur doit accéder à l'en-tête PES pour avaler certaines informations (par exemple, l'horodatage de présentation).

    Le désembrouilleur n'est pas utilisé par l'extracteur si le flux de transport est brouillé au niveau du paquet PES, où l'en-tête PES reste clair. Cependant, il n'est pas possible de confirmer quand le brouillage a lieu jusqu'à ce que le paquet brouillé réel arrive. Pour plus de simplicité, supposons qu'un désembrouilleur soit utilisé si la piste est déterminée comme étant brouillée sur la base de la table de mappage de programme (PMT).

Limites de la configuration du logiciel

Lorsque la piste nécessite un décodage sécurisé, le désembrouilleur doit être prudent lorsqu'il autorise une opération de désembrouillage dans des tampons clairs. Étant donné qu'un décodage audio non sécurisé est requis, si le décodage vidéo nécessite des décodeurs sécurisés, il doit être crypté sur une session différente de l'audio. L'ECM de la session doit signaler au plugin qu'un décodeur sécurisé est requis.

Alternativement, le plugin doit être capable de lier de manière fiable une clé à sa politique de sécurité. Sinon, l'application peut facilement obtenir des images vidéo avec le désembrouilleur audio.

Même lorsque la session nécessite un décodeur sécurisé, il peut être demandé de produire une petite quantité de données pour effacer les tampons par l'extracteur afin de traiter l'en-tête PES. Pour empêcher une application malveillante de forcer le plugin à renvoyer l'intégralité de l'unité d'accès, le plugin doit analyser la charge utile de transport pour garantir que la charge utile commence par un en-tête PES du type de flux approprié. Sinon, le plugin devrait refuser la demande.

Séquence de réglage CA

Lors du réglage sur un nouveau canal, le module TIS s'enregistre pour recevoir les descripteurs CA, 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 ainsi que d'autres données spécifiques au fournisseur. TIS interroge le Media CAS pour déterminer s'il existe un plug-in CAS capable de gérer le descripteur CA.

Schéma de réglage du contenu CAS.

Figure 3. Réglage du contenu CAS

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

Exemple de flux de plug-in CAS

TIS fournit des 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 EMM pour l'actif en fonction des informations spécifiques au fournisseur dans le descripteur CA, fourni par la méthode setPrivateData() .

Les EMM peuvent être livrés 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 intra-bande au plug-in CA.

Si une requête réseau est requise pour obtenir un EMM, le plugin CA se charge d'effectuer la transaction réseau avec un serveur de licences.

Schéma d’un exemple CAS.

Figure 4. Exemple de plugin CAS pour le traitement EMM et ECM

Lorsque l'EMM est reçu, le plugin CA l'analyse pour obtenir la clé crypté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ésembrouillage ultérieur du flux de contenu.

API Java du CAS Média

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

  • Répertoriez tous les plugins CA disponibles sur l’appareil.

    class MediaCas.PluginDescriptor {
      public String getName();
      public int getSystemId();
    }
    static PluginDescriptor[] enumeratePlugins();
    
  • Construisez une instance Media CAS pour le système CA 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énement 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 CA. Les données privées peuvent provenir du descripteur CA, de la table d'accès conditionnel ou de sources hors bande. Ceci n’est pas associé à une session particulière.

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

    void processEmm(@NonNull byte[] data, int offset, int length);
    
  • Envoyez un événement à un système CA. Le format de l'événement est propre au dispositif et opaque au cadre.

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

    void provision(String provisionString);
    
  • Déclenchez une actualisation des droits. Lorsqu'un utilisateur s'abonne à une nouvelle chaîne (par exemple, en répondant à une publicité ou en ajoutant une chaîne sur le guide électronique des programmes (EPG)), l'application doit pouvoir demander aux clients CA d'actualiser les clés d'autorisation.

    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 précédemment ouverte.

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

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

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

    byte[] Session#getSessionId();
    
  • Envoyez un événement de session à un système CA. Le format de l'événement est spécifique au dispositif et est opaque au cadre.

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