सीएएस ढांचा

मीडिया कंडीशनल एक्सेस सिस्टम (मीडिया CAS) फ्रेमवर्क डिजिटल केबल, सैटेलाइट, टेरेस्ट्रियल सिस्टम और आईपीटीवी सिस्टम सहित डिजिटल टीवी हार्डवेयर की एक श्रृंखला पर कंडीशनल एक्सेस (CA) सेवाओं को सक्षम करने के लिए मानक एपीआई प्रदान करता है। फ्रेमवर्क एंड्रॉइड टीवी इनपुट फ्रेमवर्क और एंड्रॉइड टीवी ट्यूनर फ्रेमवर्क के साथ काम करता है, जो टीवी इनपुट सर्विस (टीआईएस) ऐप से प्राप्त जावा एपीआई प्रदान करता है।

मीडिया CAS के मुख्य उद्देश्य इस प्रकार हैं।

  • एक सार्वजनिक जावा एपीआई और देशी प्लगइन फ्रेमवर्क प्रदान करें जिसका उपयोग एंड्रॉइड में प्रसारण टीवी के लिए सीएएस का समर्थन करने के लिए तीसरे पक्ष के डेवलपर्स और ओईएम द्वारा किया जा सकता है।
  • एंड्रॉइड के भीतर एक सीएएस ढांचा प्रदान करें जो एटीवी ओईएम को विभिन्न सीएएस विक्रेताओं के साथ सुसंगत तरीके से बातचीत करने की सुविधा देता है।
  • देशी प्लगइन्स का उपयोग करके कई तृतीय-पक्ष CAS विक्रेताओं का समर्थन करें। CAS प्लगइन्स विक्रेता-विशिष्ट नेटवर्क प्रोटोकॉल, एंटाइटेलमेंट प्रबंधन संदेश (ईएमएम)/एंटाइटेलमेंट कंट्रोल मैसेज (ईसीएम) प्रारूप और डिस्क्रैम्बलर का उपयोग कर सकते हैं।
  • कुंजी सीढ़ी जैसी हार्डवेयर सुरक्षा का समर्थन करें।
  • ट्रस्टज़ोन जैसे विश्वसनीय निष्पादन वातावरण (टीईई) का समर्थन करें।

समर्थित कॉन्फ़िगरेशन

हार्डवेयर ट्यूनर कॉन्फ़िगरेशन

यदि हार्डवेयर एमपीईजी ट्रांसपोर्ट स्ट्रीम डिमल्टीप्लेक्सिंग और डिसक्रैम्बलिंग के लिए जिम्मेदार है, तो ट्यूनर फ्रेमवर्क हार्डवेयर-आधारित टीवी ट्यूनर के साथ इंटरफेस करने के लिए टीआईएस ऐप को सशर्त एक्सेस प्रोग्राम-विशिष्ट जानकारी (पीएसआई) डेटा प्रदान करता है।

सशर्त पहुंच पीएसआई डेटा में सीए डिस्क्रिप्टर, ईसीएम और ईएमएम शामिल हैं। ये संरचनाएँ CAS प्लगइन को सामग्री स्ट्रीम को डिक्रिप्ट करने के लिए आवश्यक कुंजियाँ प्राप्त करने में सक्षम बनाती हैं।

हार्डवेयर ट्यूनर कॉन्फ़िगरेशन का आरेख।

चित्र 1. हार्डवेयर ट्यूनर कॉन्फ़िगरेशन

हार्डवेयर कॉन्फ़िगरेशन में एक TEE परत हो सकती है, जैसे TrustZone, जिसे चित्र 1 में दिखाया गया है। यदि कोई TEE परत नहीं है, तो CAS क्लाइंट प्लगइन प्लेटफ़ॉर्म द्वारा प्रदान की गई हार्डवेयर कुंजी सीढ़ी सेवाओं के साथ संचार कर सकता है। इन इंटरफ़ेसों की विक्रेता-विशिष्ट विविधताओं के कारण, मीडिया CAS उन्हें मानकीकृत नहीं करता है।

सॉफ़्टवेयर कॉन्फ़िगरेशन

एंड्रॉइड 11 से पहले, मीडिया सीएएस फ्रेमवर्क का उपयोग अभी भी सॉफ्टवेयर-आधारित सामग्री को संसाधित करने के लिए किया जा सकता था, जैसे कि आईपी मल्टीकास्ट/यूनिकास्ट से आईपीटीवी। TIS ऐप मीडिया CAS जावा ऑब्जेक्ट को इंस्टेंट करने और ठीक से प्रोविज़न करने के लिए जिम्मेदार है।

ऐप CA-संबंधित PSI डेटा, जैसे CA डिस्क्रिप्टर, ECMs और EMM निकालने के लिए MediaExtractor या अन्य MPEG2-TS पार्सर्स का उपयोग कर सकता है। यदि ऐप फ़्रेमवर्क MediaExtractor का उपयोग करता है, तो यह CAS सत्र प्रबंधन, जैसे सत्र खोलना और EMM/ECM को संसाधित करना, फ़्रेमवर्क MediaExtractor को सौंप सकता है। MediaExtractor फिर सीधे मूल API का उपयोग करके CAS सत्र को कॉन्फ़िगर करता है।

अन्यथा, ऐप सीए-संबंधित पीएसआई डेटा निकालने और मीडिया सीएएस जावा एपीआई का उपयोग करके सीएएस सत्र को कॉन्फ़िगर करने के लिए ज़िम्मेदार है (उदाहरण के लिए, जब ऐप अपने स्वयं के एमपीईजी 2-टीएस पार्सर का उपयोग करता है)।

ट्यूनर कॉन्फ़िगरेशन का आरेख.

चित्र 2. फ्रेमवर्क मीडियाएक्सट्रैक्टर का उपयोग करके आईपीटीवी इनपुट, सीएएस और डिस्क्रैम्बलर कॉन्फ़िगरेशन

सॉफ़्टवेयर एक्सट्रैक्टर परिदृश्य में, एक्सट्रैक्टर को प्रत्येक स्क्रैम्बल ट्रैक के लिए एक सॉफ़्टवेयर या हार्डवेयर-आधारित डिस्क्रैम्बलर ऑब्जेक्ट की आवश्यकता होती है, भले ही ट्रैक को सुरक्षित डिकोडर की आवश्यकता हो। यह निम्नलिखित के कारण है.

  • यदि ट्रैक को सुरक्षित डिकोडिंग की आवश्यकता नहीं है, तो एक्सट्रैक्टर बफ़र्स को साफ़ करने के लिए एक्सेस यूनिट को हटा देता है और नमूने निकालता है जैसे कि एक स्पष्ट स्ट्रीम से। इस तरह MediaCodec डिस्क्रैम्बलिंग में शामिल होने की आवश्यकता नहीं है।
  • यदि ट्रैक को सुरक्षित डिकोडिंग की आवश्यकता है, तो एक्सट्रैक्टर को अभी भी डिस्क्रैम्बलर की आवश्यकता हो सकती है। ऐसा तब होता है जब ट्रांसपोर्ट स्ट्रीम को ट्रांसपोर्ट पैकेट स्तर पर स्क्रैम्बल किया जाता है, जहां पैकेटयुक्त प्राथमिक स्ट्रीम (पीईएस) हेडर को स्क्रैम्बल किया जाता है। एक्सट्रैक्टर को कुछ जानकारी (उदाहरण के लिए, प्रेजेंटेशन टाइमस्टैम्प) को डाउनस्ट्रीम करने के लिए पीईएस हेडर तक पहुंचने की आवश्यकता होती है।

    यदि ट्रांसपोर्ट स्ट्रीम को पीईएस पैकेट स्तर पर स्क्रैम्बल किया जाता है, जहां पीईएस हेडर को स्पष्ट छोड़ दिया जाता है, तो एक्सट्रैक्टर द्वारा डिस्क्रैम्बलर का उपयोग नहीं किया जाता है। हालाँकि, वास्तविक स्क्रैम्बल पैकेट आने तक यह पुष्टि करना संभव नहीं है कि स्क्रैम्बलिंग कब होती है। सरलता के लिए, मान लें कि यदि प्रोग्राम मैपिंग टेबल (पीएमटी) के आधार पर ट्रैक को स्क्रैम्बल करने के लिए निर्धारित किया जाता है तो एक डिस्क्रैम्बलर का उपयोग किया जाता है।

सॉफ़्टवेयर कॉन्फ़िगरेशन की सीमाएँ

जब ट्रैक को सुरक्षित डिकोडिंग की आवश्यकता होती है, तो डिस्क्रैम्बल ऑपरेशन को स्पष्ट बफ़र्स में जाने देते समय डिस्क्रैम्बलर को सतर्क रहने की आवश्यकता होती है। क्योंकि असुरक्षित ऑडियो डिकोडिंग की आवश्यकता होती है, यदि वीडियो डिकोडिंग के लिए सुरक्षित डिकोडर्स की आवश्यकता होती है, तो इसे ऑडियो से अलग सत्र में चलाया जाना चाहिए। सत्र के लिए ईसीएम को प्लगइन को संकेत देना चाहिए कि एक सुरक्षित डिकोडर की आवश्यकता है।

वैकल्पिक रूप से, प्लगइन को अपनी सुरक्षा नीति में एक कुंजी को विश्वसनीय रूप से जोड़ने में सक्षम होना चाहिए। अन्यथा, ऐप ऑडियो डिस्क्रैम्बलर के साथ आसानी से वीडियो फ़्रेम प्राप्त कर सकता है।

यहां तक ​​कि जब सत्र को एक सुरक्षित डिकोडर की आवश्यकता होती है, तब भी उसे PES हेडर को संसाधित करने के लिए एक्सट्रैक्टर द्वारा बफ़र्स को साफ़ करने के लिए थोड़ी मात्रा में डेटा आउटपुट करने के लिए कहा जा सकता है। किसी दुर्भावनापूर्ण ऐप को प्लगइन को संपूर्ण एक्सेस यूनिट वापस करने से रोकने के लिए, प्लगइन को ट्रांसपोर्ट पेलोड को पार्स करने की आवश्यकता है ताकि यह सुनिश्चित हो सके कि पेलोड उचित स्ट्रीम प्रकार के पीईएस हेडर से शुरू होता है। अन्यथा, प्लगइन को अनुरोध अस्वीकार कर देना चाहिए।

सीए ट्यूनिंग अनुक्रम

किसी नए चैनल पर ट्यूनिंग करते समय, टीआईएस मॉड्यूल पीएसआई ट्यूनर फ्रेमवर्क से सीए डिस्क्रिप्टर, ईसीएम और ईएमएम प्राप्त करने के लिए पंजीकृत होता है। सीए डिस्क्रिप्टर में सीए सिस्टम आईडी होता है, जो विशिष्ट सीए विक्रेता और अन्य विक्रेता-विशिष्ट डेटा की विशिष्ट पहचान करता है। टीआईएस यह निर्धारित करने के लिए मीडिया सीएएस से पूछताछ करता है कि क्या कोई सीएएस प्लगइन मौजूद है जो सीए डिस्क्रिप्टर को संभाल सकता है।

CAS सामग्री को ट्यून करने का आरेख।

चित्र 3. CAS सामग्री को ट्यून करना

यदि सीए सिस्टम आईडी समर्थित है, तो मीडिया सीएएस का एक उदाहरण बनाया जाता है और सीए डिस्क्रिप्टर से विक्रेता का निजी डेटा प्लगइन को प्रदान किया जाता है। फिर, ऑडियो और वीडियो स्ट्रीम को संभालने के लिए मीडिया CAS में नए सत्र खोले जाते हैं। नए खुले सत्रों को प्लगइन के लिए ईसीएम और ईएमएम प्राप्त होते हैं।

नमूना CAS प्लगइन प्रवाह

टीआईएस मीडिया सीएएस एपीआई का उपयोग करके सीएएस प्लगइन को ईसीएम वितरित करता है। ईसीएम में एन्क्रिप्टेड नियंत्रण शब्द होता है, जिसे ईएमएम से जानकारी का उपयोग करके डिक्रिप्ट करने की आवश्यकता होती है। CAS प्लगइन यह निर्धारित करता है कि CA डिस्क्रिप्टर में विक्रेता-विशिष्ट जानकारी के आधार पर परिसंपत्ति के लिए EMM कैसे प्राप्त किया जाए, जो setPrivateData() विधि द्वारा प्रदान किया जाता है।

ईएमएम को सीए प्लगइन द्वारा शुरू किए गए नेटवर्क अनुरोध का उपयोग करके सामग्री स्ट्रीम में बैंड में या बैंड से बाहर वितरित किया जा सकता है। टीआईएस किसी भी बैंड ईएमएम को सीए प्लगइन तक पहुंचाने के लिए processEMM() विधि का उपयोग करता है।

यदि ईएमएम प्राप्त करने के लिए नेटवर्क अनुरोध की आवश्यकता होती है, तो सीए प्लगइन लाइसेंस सर्वर के साथ नेटवर्क लेनदेन करने के लिए जिम्मेदार है।

एक उदाहरण CAS का आरेख.

चित्र 4. ईएमएम और ईसीएम प्रोसेसिंग के लिए उदाहरण सीएएस प्लगइन

जब ईएमएम प्राप्त होता है, तो सीए प्लगइन नियंत्रण शब्द को डिक्रिप्ट करने के लिए एन्क्रिप्टेड कुंजी प्राप्त करने के लिए इसे पार्स करता है। एन्क्रिप्टेड ईएमएम कुंजी और एन्क्रिप्टेड नियंत्रण शब्द को नियंत्रण शब्द डिक्रिप्शन और बाद में सामग्री स्ट्रीम के डिस्क्रैम्बलिंग करने के लिए कुंजी सीढ़ी या विश्वसनीय वातावरण में लोड किया जा सकता है।

मीडिया सीएएस जावा एपीआई

मीडिया CAS जावा एपीआई में निम्नलिखित विधियाँ शामिल हैं।

  • डिवाइस पर सभी उपलब्ध CA प्लगइन्स की सूची बनाएं।

    class MediaCas.PluginDescriptor {
      public String getName();
      public int getSystemId();
    }
    static PluginDescriptor[] enumeratePlugins();
    
  • निर्दिष्ट सीए सिस्टम के लिए मीडिया सीएएस उदाहरण का निर्माण करें। इसका मतलब यह है कि मीडिया CAS फ्रेमवर्क एक साथ कई CAS सिस्टम को संभाल सकता है।

    MediaCas(int CA_system_id);
    MediaCas(@NonNull Context context, int casSystemId,
             @Nullable String tvInputServiceSessionId,
             @PriorityHintUseCaseType int priorityHint);
    
  • एक ईवेंट श्रोता को पंजीकृत करें और ऐप को एक हैंडलर निर्दिष्ट करने की अनुमति दें जिसका लूपर उपयोग किया गया है।

    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);
    
  • CA सिस्टम के लिए निजी डेटा भेजें. निजी डेटा सीए डिस्क्रिप्टर, कंडीशनल एक्सेस टेबल या बैंड स्रोतों से आ सकता है। यह किसी विशेष सत्र से संबद्ध नहीं है.

    void setPrivateData(@NonNull byte[] data);
    
  • एक EMM पैकेट संसाधित करें.

    void processEmm(@NonNull byte[] data, int offset, int length);
    
  • सीए सिस्टम को एक ईवेंट भेजें। आयोजन का प्रारूप योजना के लिए विशिष्ट है और रूपरेखा के लिए अपारदर्शी है।

    void sendEvent(int event, int arg, @Nullable byte[] data);
    
  • सीए सिस्टम के लिए निर्दिष्ट प्रकार का प्रोविजनिंग ऑपरेशन आरंभ करें। जब कोई डिवाइस पहली बार पे टीवी सेवा के लिए साइन अप करता है, तो उसे पहले CAS सर्वर पर प्रावधानित होने की आवश्यकता होती है। प्रावधान के लिए डिवाइस को संबंधित मापदंडों का एक सेट प्रदान करें।

    void provision(String provisionString);
    
  • पात्रताओं का ताज़ाकरण ट्रिगर करें। जब कोई उपयोगकर्ता किसी नए चैनल की सदस्यता लेता है (उदाहरण के लिए, किसी विज्ञापन का जवाब देकर या इलेक्ट्रॉनिक प्रोग्राम गाइड (ईपीजी) पर एक चैनल जोड़कर), तो ऐप को सीए क्लाइंट को पात्रता कुंजियों को ताज़ा करने के लिए कहने में सक्षम होना चाहिए।

    void refreshEntitlements(int refreshType);
    
  • मीडिया CAS ऑब्जेक्ट बंद करें.

    void close();
    
  • एक सत्र खोलें.

    Session openSession();
    Session openSession(@SessionUsage int sessionUsage, @ScramblingMode int scramblingMode);
    
  • पहले से खोले गए सत्र को बंद करें.

    void Session#close();
    
  • पीएमटी में सीए डिस्क्रिप्टर से सीए निजी डेटा प्रदान करें, जो प्रोग्राम जानकारी या ईएस जानकारी अनुभाग से सीएएस सत्र में हो सकता है।

    void Session#setPrivateData(@NonNull byte[] sessionId, @NonNull byte[] data);
    
  • एक सत्र के लिए ईसीएम पैकेट संसाधित करें।

    void Session#processEcm(@NonNull byte[] data, int offset, int length);
    
  • सत्र आईडी प्राप्त करें.

    byte[] Session#getSessionId();
    
  • सीए सिस्टम को एक सत्र ईवेंट भेजें। इवेंट का प्रारूप योजना के लिए विशिष्ट है और रूपरेखा के लिए अपारदर्शी है।

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