چارچوب CAS

چارچوب سیستم های دسترسی شرطی رسانه (Media CAS) API های استانداردی را برای فعال کردن خدمات دسترسی مشروط (CA) در طیفی از سخت افزارهای تلویزیون دیجیتال، از جمله کابل دیجیتال، ماهواره، سیستم های زمینی و سیستم های IPTV ارائه می دهد. این چارچوب با چارچوب ورودی Android TV و چارچوب Android TV Tuner کار می‌کند و APIهای جاوا را ارائه می‌کند که از برنامه سرویس ورودی تلویزیون (TIS) فراخوانی شده‌اند.

اهداف اصلی Media CAS به شرح زیر است.

  • یک Java API عمومی و چارچوب پلاگین بومی ارائه کنید که می تواند توسط توسعه دهندگان شخص ثالث و OEM ها برای پشتیبانی از CAS برای پخش تلویزیون در Android استفاده شود.
  • یک چارچوب CAS در Android ارائه کنید که به OEM های ATV اجازه می دهد با انواع فروشندگان CAS به شیوه ای سازگار تعامل داشته باشند.
  • از چندین فروشنده CAS شخص ثالث با استفاده از افزونه های بومی پشتیبانی کنید. افزونه‌های CAS ممکن است از پروتکل‌های شبکه خاص فروشنده، فرمت‌های پیام مدیریت استحقاق (EMM)/پیام کنترل حق (ECM) و حذف‌کننده‌ها استفاده کنند.
  • از امنیت سخت افزاری مانند نردبان کلید پشتیبانی کنید.
  • از محیط های اجرایی قابل اعتماد (TEEs) مانند TrustZone پشتیبانی کنید.

تنظیمات پشتیبانی شده

پیکربندی تیونر سخت افزار

اگر سخت‌افزار وظیفه مالتیپلکس کردن و حذف کردن جریان انتقال MPEG را بر عهده دارد، چارچوب تیونر داده‌های اطلاعات ویژه برنامه (PSI) دسترسی مشروط را به برنامه TIS به منظور ارتباط با تیونرهای تلویزیون مبتنی بر سخت‌افزار ارائه می‌کند.

داده های PSI دسترسی مشروط شامل توصیفگرهای CA، ECM و EMM است. این ساختارها پلاگین CAS را قادر می سازد تا کلیدهای مورد نیاز برای رمزگشایی جریان های محتوا را به دست آورد.

نمودار پیکربندی تیونر سخت افزار.

شکل 1. پیکربندی تیونر سخت افزار

پیکربندی سخت افزار ممکن است دارای یک لایه TEE باشد، مانند TrustZone، که در شکل 1 نشان داده شده است. اگر یک لایه TEE وجود نداشته باشد، یک پلاگین مشتری CAS می تواند با خدمات نردبان کلید سخت افزاری ارائه شده توسط پلت فرم ارتباط برقرار کند. با توجه به تغییرات خاص فروشنده این رابط ها، Media CAS آنها را استاندارد نمی کند.

پیکربندی نرم افزار

قبل از اندروید 11، چارچوب Media CAS همچنان می‌توانست برای پردازش محتوای مبتنی بر نرم‌افزار، مانند IPTV از IP multicast/unicast استفاده شود. برنامه TIS مسئول نمونه سازی و ارائه صحیح شی Media CAS Java است.

این برنامه ممکن است از MediaExtractor یا سایر تجزیه‌کننده‌های MPEG2-TS برای استخراج داده‌های PSI مربوط به CA، مانند توصیفگرهای CA، ECM، و EMM استفاده کند. اگر برنامه از چارچوب MediaExtractor استفاده می‌کند، می‌تواند مدیریت جلسه CAS، مانند باز کردن یک جلسه و پردازش EMM/ECM را به چارچوب MediaExtractor واگذار کند. سپس MediaExtractor جلسه CAS را با استفاده از API اصلی به طور مستقیم پیکربندی می کند.

در غیر این صورت، برنامه مسئول استخراج داده های PSI مربوط به CA و پیکربندی جلسه CAS با استفاده از Media CAS Java API است (به عنوان مثال، زمانی که برنامه از تجزیه کننده MPEG2-TS خود استفاده می کند).

نمودار پیکربندی تیونر.

شکل 2. ورودی IPTV، CAS و پیکربندی descrambler با استفاده از چارچوب MediaExtractor

در سناریوی استخراج‌کننده نرم‌افزار، استخراج‌کننده به یک شی decrambler مبتنی بر نرم‌افزار یا سخت‌افزار برای هر مسیر درهم، صرف‌نظر از اینکه آیا مسیر به رمزگشاهای امن نیاز دارد یا خیر، نیاز دارد. این به دلیل موارد زیر است.

  • اگر مسیر به رمزگشایی ایمن نیاز نداشته باشد، استخراج‌کننده واحد دسترسی را برای پاک کردن بافرها پاکسازی می‌کند و نمونه‌ها را مانند یک جریان واضح استخراج می‌کند. به این ترتیب MediaCodec نیازی به دخالت در رمزگشایی ندارد.
  • اگر مسیر به رمزگشایی ایمن نیاز داشته باشد، ممکن است استخراج کننده همچنان به یک decrambler نیاز داشته باشد. این زمانی اتفاق می افتد که جریان حمل و نقل در سطح بسته حمل و نقل، جایی که سربرگ جریان اولیه بسته بندی شده (PES) درهم می شود، درهم می شود. استخراج‌کننده باید به هدر PES برای پایین‌دستی اطلاعات خاصی (مثلاً مهر زمانی ارائه) دسترسی داشته باشد.

    اگر جریان انتقال در سطح بسته PES درهم باشد، جایی که هدر PES واضح باقی می‌ماند، استخراج‌کننده از رمزگشا استفاده نمی‌کند. با این حال، تا زمانی که بسته درهم شده واقعی نرسد، نمی‌توان زمان وقوع درهم‌سازی را تأیید کرد. برای سادگی، فرض کنید اگر مسیر بر اساس جدول نقشه‌برداری برنامه (PMT) درهم می‌شود، از یک descrambler استفاده می‌شود.

محدودیت های پیکربندی نرم افزار

هنگامی که مسیر به رمزگشایی ایمن نیاز دارد، Descrambler باید در هنگام اجازه دادن به یک عملیات descramble در بافرهای واضح محتاط باشد. از آنجایی که رمزگشایی صوتی ناامن مورد نیاز است، اگر رمزگشایی ویدیو به رمزگشاهای ایمن نیاز دارد، باید در جلسه ای متفاوت از صدا درهم شود. ECM برای جلسه باید به پلاگین سیگنال دهد که به رمزگشای ایمن نیاز است.

از طرف دیگر، افزونه باید بتواند به طور قابل اعتماد یک کلید را به خط مشی امنیتی خود گره بزند. در غیر این صورت، برنامه به راحتی می تواند فریم های ویدئویی را با حذف کننده صدا دریافت کند.

حتی زمانی که جلسه به رمزگشای ایمن نیاز دارد، ممکن است از آن خواسته شود که مقدار کمی داده برای پاک کردن بافرها توسط استخراج کننده برای پردازش هدر PES خروجی بگیرد. برای جلوگیری از اینکه یک برنامه مخرب باعث شود پلاگین کل واحد دسترسی را بازگرداند، افزونه باید محموله حمل و نقل را تجزیه کند تا مطمئن شود که محموله با هدر PES از نوع جریان مناسب شروع می شود. در غیر این صورت، افزونه باید درخواست را رد کند.

دنباله تنظیم CA

هنگام تنظیم به یک کانال جدید، ماژول TIS برای دریافت توصیفگرهای CA، ECM و EMM از چارچوب تیونر PSI ثبت می‌شود. یک توصیفگر CA حاوی شناسه سیستم CA است که به طور منحصر به فرد یک فروشنده CA خاص و سایر داده های خاص فروشنده را شناسایی می کند. TIS از Media CAS پرس و جو می کند تا مشخص کند آیا افزونه CAS وجود دارد که بتواند توصیفگر CA را مدیریت کند.

نمودار تنظیم محتوای CAS.

شکل 3. تنظیم محتوای CAS

اگر شناسه سیستم CA پشتیبانی شود، نمونه‌ای از Media CAS ایجاد می‌شود و داده‌های خصوصی فروشنده از توصیف‌گر CA به افزونه ارائه می‌شود. سپس، جلسات جدیدی در Media CAS برای رسیدگی به جریان های صوتی و تصویری باز می شود. جلسات تازه باز شده ECM و EMM برای افزونه دریافت می کنند.

نمونه جریان پلاگین CAS

TIS ECM ها را با استفاده از Media CAS API به پلاگین CAS تحویل می دهد. یک ECM حاوی کلمه کنترل رمزگذاری شده است که باید با استفاده از اطلاعات یک EMM رمزگشایی شود. افزونه CAS نحوه به دست آوردن یک EMM برای دارایی را بر اساس اطلاعات خاص فروشنده در توصیفگر CA، که توسط متد setPrivateData() ارائه می شود، تعیین می کند.

EMM ها ممکن است در باند در جریان محتوا یا خارج از باند با استفاده از یک درخواست شبکه که توسط افزونه CA آغاز شده است، تحویل داده شوند. TIS از روش processEMM() برای تحویل هر EMM در باند به پلاگین CA استفاده می کند.

اگر درخواست شبکه برای دریافت EMM مورد نیاز باشد، افزونه CA مسئول انجام تراکنش شبکه با یک سرور مجوز است.

نمودار یک نمونه CAS.

شکل 4. نمونه پلاگین CAS برای پردازش EMM و ECM

هنگامی که EMM دریافت می شود، پلاگین CA آن را برای بدست آوردن کلید رمزگذاری شده برای رمزگشایی کلمه کنترل تجزیه می کند. کلید EMM رمزگذاری شده و کلمه کنترل رمزگذاری شده ممکن است در یک نردبان کلید یا محیط قابل اعتماد بارگیری شوند تا رمزگشایی کلمه کنترلی و پس از آن رمزگشایی جریان محتوا انجام شود.

Media CAS Java API

Media CAS Java API شامل متدهای زیر است.

  • همه افزونه‌های CA موجود در دستگاه را فهرست کنید.

    class MediaCas.PluginDescriptor {
      public String getName();
      public int getSystemId();
    }
    static PluginDescriptor[] enumeratePlugins();
    
  • یک نمونه Media CAS برای سیستم CA مشخص شده بسازید. این بدان معناست که چارچوب Media 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 ارسال کنید. داده های خصوصی می توانند از توصیفگر CA، جدول دسترسی شرطی یا منابع خارج از باند به دست آیند. این مربوط به جلسه خاصی نیست.

    void setPrivateData(@NonNull byte[] data);
    
  • یک بسته EMM را پردازش کنید.

    void processEmm(@NonNull byte[] data, int offset, int length);
    
  • یک رویداد را به یک سیستم CA ارسال کنید. قالب رویداد مختص طرح و غیرشفاف به چارچوب است.

    void sendEvent(int event, int arg, @Nullable byte[] data);
    
  • یک عملیات تامین از نوع مشخص شده برای یک سیستم CA را آغاز کنید. هنگامی که دستگاهی برای اولین بار برای سرویس تلویزیون پولی ثبت نام می کند، ابتدا باید به سرور CAS ارائه شود. مجموعه ای از پارامترهای مرتبط را برای تهیه به دستگاه ارائه دهید.

    void provision(String provisionString);
    
  • ایجاد تجدید حقوق هنگامی که کاربر در یک کانال جدید مشترک می شود (مثلاً با پاسخ دادن به یک آگهی یا با افزودن یک کانال در راهنمای برنامه الکترونیکی (EPG))، برنامه باید بتواند به مشتریان CA بگوید کلیدهای حق را به روز کنند.

    void refreshEntitlements(int refreshType);
    
  • شی Media CAS را ببندید.

    void close();
    
  • یک جلسه باز کنید

    Session openSession();
    Session openSession(@SessionUsage int sessionUsage, @ScramblingMode int scramblingMode);
    
  • یک جلسه از قبل باز شده را ببندید.

    void Session#close();
    
  • داده‌های خصوصی CA را از یک توصیفگر CA در PMT، که می‌تواند از بخش اطلاعات برنامه یا اطلاعات ES، به جلسه CAS باشد، ارائه دهید.

    void Session#setPrivateData(@NonNull byte[] sessionId, @NonNull byte[] data);
    
  • یک بسته ECM را برای یک جلسه پردازش کنید.

    void Session#processEcm(@NonNull byte[] data, int offset, int length);
    
  • شناسه جلسه را دریافت کنید.

    byte[] Session#getSessionId();
    
  • یک رویداد جلسه را به یک سیستم CA ارسال کنید. قالب رویداد مختص طرح است و نسبت به چارچوب نامشخص است.

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