Le framework Media conditional access systems (Media CAS) fournit des API standards pour activer les services d'accès conditionnel (AC) sur une gamme de matériel de télévision numérique, y compris les systèmes de câble numérique, satellite, terrestre et IPTV. Le framework fonctionne avec le framework Android TV Input et le framework Android TV Tuner, et fournit des API Java appelées depuis l'application TV Input Service (TIS).
Voici les principaux objectifs de Media CAS.
- Fournir une API Java publique et un framework de plug-ins natifs pouvant être utilisés par des développeurs tiers et des OEM pour prendre en charge le CAS pour la télévision hertzienne dans Android.
- Fournir un framework CAS dans Android qui permet aux OEM ATV d'interagir avec différents fournisseurs CAS de manière cohérente.
- Prend en charge plusieurs fournisseurs CAS tiers à l'aide de plug-ins natifs. Les plug-ins CAS peuvent utiliser des protocoles réseau, des formats de messages de gestion des droits d'accès (EMM, entitlement management message) ou de messages de contrôle des droits d'accès (ECM, entitlement control message) et des désembrouilleurs spécifiques aux fournisseurs.
- Prend en charge la sécurité matérielle, comme les chaînes de clés.
- Prend en charge les 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écryptage du flux de transport MPEG, le framework Tuner fournit des données PSI (Program-Specific Information) d'accès conditionnel à l'application TIS afin d'interagir avec les tuners TV matériels.
Les données PSI d'accès conditionnel incluent les descripteurs CA, les ECM et les EMM. Ces structures permettent au plug-in CAS d'obtenir les clés nécessaires au déchiffrement des flux de contenu.
Figure 1 : Configuration du tuner matériel
La configuration matérielle peut comporter une couche TEE, telle que TrustZone, comme illustré sur la figure 1. En l'absence de couche TEE, un plug-in client CAS peut communiquer avec les services de chaîne 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 logicielle
Avant Android 11, le framework Media CAS pouvait encore être utilisé pour traiter le contenu logiciel, tel que l'IPTV à partir du 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 à l'AC, telles que les descripteurs AC, 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 des EMM/ECM, au framework MediaExtractor. MediaExtractor configure ensuite la session CAS à l'aide de l'API native directement.
Sinon, l'application est responsable de l'extraction des données PSI liées à l'autorité de certification 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).
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 de logiciel, l'extracteur nécessite un objet de désembrouillage logiciel ou matériel pour chaque piste brouillée, que la piste nécessite ou non des décodeurs sécurisés. Cela est dû aux raisons suivantes.
- Si la piste ne nécessite pas de décodage sécurisé, l'extracteur décode l'unité d'accès pour vider les tampons et extrait les échantillons comme s'il s'agissait d'un flux clair. Ainsi,
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ésembrouilleur. Cela se produit lorsque le flux de transport est brouillé au niveau du paquet de transport, où l'en-tête PES (Packetized Elementary Stream) 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é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 est laissé clair. Toutefois, il n'est pas possible de confirmer le moment où le brouillage se produit tant que le paquet brouillé réel n'est pas arrivé. Par souci de simplicité, supposons qu'un décodeur est utilisé si la piste est considérée comme brouillée en fonction de la table de mappage des programmes (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 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 brouillé dans une session différente de celle de l'audio. Le module ECM de la session doit signaler au plug-in qu'un décodeur sécurisé est requis.
Sinon, le plug-in doit 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é, elle peut être invitée à générer une petite quantité de données pour vider les tampons par l'extracteur afin de traiter l'en-tête PES. Pour empêcher une application malveillante de faire en sorte que le plug-in renvoie l'intégralité de l'unité d'accès, le plug-in 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 demande.
Séquence de réglage de l'autorité de certification
Lorsqu'il se connecte à une nouvelle chaîne, le module TIS s'enregistre pour recevoir les descripteurs CA, les ECM et les EMM du framework PSI Tuner. Un descripteur d'AC contient l'ID système de l'AC, qui identifie de manière unique un fournisseur d'AC spécifique et d'autres données spécifiques au fournisseur. TIS interroge Media CAS pour déterminer s'il existe un plug-in CAS capable de gérer le descripteur CA.
Figure 3. Ajuster le contenu du CAS
Si l'ID du système CA est compatible, une instance de Media CAS est créée et les données privées du fournisseur provenant du descripteur CA sont fournies au plug-in. De nouvelles sessions sont ensuite 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 plug-in.
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 le composant en fonction des informations spécifiques au fournisseur dans le descripteur CA, qui est fourni par la méthode setPrivateData()
.
Les EMM peuvent être fournis 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 fournir les EMM intégrées au plug-in CA.
Si une requête réseau est nécessaire pour obtenir un EMM, le plug-in CA est responsable de l'exécution de la transaction réseau avec un serveur de licence.
Figure 4. Exemple de plug-in CAS pour le traitement EMM et ECM
Lorsque l'EMM est reçu, le plug-in CA 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 chaîne de clés ou un environnement de confiance pour déchiffrer le mot de contrôle et désembrouiller ensuite le 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();
Construisez une instance MediaCAS 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é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 CA, de la table d'accès conditionnel ou de sources hors bande. Cela 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 d'autorité de certification. Le format de l'événement est spécifique au schéma et opaque au framework.
void sendEvent(int event, int arg, @Nullable byte[] data);
Lance une opération de provisionnement du type spécifié pour un système CA. Lorsqu'un appareil s'abonne à 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éclenchez l'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 indiquer 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 d'AC dans la PMT, qui peut provenir de la section d'informations sur le programme ou d'informations sur l'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 d'autorité de certification. Le format de l'événement est spécifique au schéma et opaque au framework.
void Session#sendSessionEvent(int event, int arg, @Nullable byte[] data);