چارچوب سیستمهای دسترسی مشروط به رسانه (Media CAS) رابطهای برنامهنویسی کاربردی (API) استانداردی را برای فعال کردن سرویسهای دسترسی مشروط (CA) در طیف وسیعی از سختافزارهای تلویزیون دیجیتال، از جمله کابل دیجیتال، ماهواره، سیستمهای زمینی و سیستمهای IPTV، ارائه میدهد. این چارچوب با چارچوب ورودی تلویزیون اندروید (Android TV Input Framework) و چارچوب تنظیمکننده تلویزیون اندروید (Android TV Tuner Framework ) کار میکند و رابطهای برنامهنویسی کاربردی جاوا (Java API) را که از برنامه سرویس ورودی تلویزیون (TIS) فراخوانی میشوند، ارائه میدهد.
اهداف اصلی Media CAS به شرح زیر است.
- یک API عمومی جاوا و چارچوب افزونه بومی ارائه میدهد که میتواند توسط توسعهدهندگان شخص ثالث و تولیدکنندگان اصلی تجهیزات (OEM) برای پشتیبانی از CAS برای پخش تلویزیونی در اندروید استفاده شود.
- یک چارچوب CAS در اندروید ارائه دهید که به تولیدکنندگان اصلی تجهیزات ATV اجازه میدهد تا با انواع فروشندگان CAS به شیوهای سازگار همکاری کنند.
- پشتیبانی از چندین فروشندهی CAS شخص ثالث با استفاده از افزونههای بومی. افزونههای CAS ممکن است از پروتکلهای شبکهی مختص فروشنده، قالبهای پیام مدیریت حق دسترسی (EMM)/پیام کنترل حق دسترسی (ECM) و رمزگشاییکنندهها استفاده کنند.
- از امنیت سختافزاری مانند نردبان کلید پشتیبانی کنید.
- از محیطهای اجرایی قابل اعتماد (TEE) مانند TrustZone پشتیبانی کنید.
پیکربندیهای پشتیبانیشده
پیکربندی تیونر سختافزاری
اگر سختافزار مسئول دیمالتیپلکس کردن و رمزگشایی جریان انتقال MPEG باشد، چارچوب Tuner دادههای اطلاعات خاص برنامه (PSI) را با دسترسی مشروط در اختیار برنامه TIS قرار میدهد تا با تیونرهای تلویزیون مبتنی بر سختافزار ارتباط برقرار کند.
دادههای PSI با دسترسی مشروط شامل توصیفگرهای CA، ECMها و EMMها هستند. این ساختارها افزونه CAS را قادر میسازند تا کلیدهای مورد نیاز برای رمزگشایی جریانهای محتوا را به دست آورد.

شکل ۱. پیکربندی تیونر سختافزاری
پیکربندی سختافزار ممکن است دارای یک لایه TEE باشد، مانند TrustZone که در شکل 1 نشان داده شده است. اگر لایه TEE وجود نداشته باشد، یک افزونه کلاینت CAS میتواند با سرویسهای نردبان کلید سختافزاری ارائه شده توسط پلتفرم ارتباط برقرار کند. به دلیل تغییرات خاص فروشنده در این رابطها، Media CAS آنها را استاندارد نمیکند.
پیکربندی نرمافزار
قبل از اندروید ۱۱، چارچوب Media CAS هنوز میتوانست برای پردازش محتوای مبتنی بر نرمافزار، مانند IPTV از IP multicast/unicast، مورد استفاده قرار گیرد. برنامه TIS مسئول نمونهسازی و آمادهسازی صحیح شیء جاوا Media CAS است.
این برنامه ممکن است از MediaExtractor یا سایر تجزیهکنندههای MPEG2-TS برای استخراج دادههای PSI مرتبط با CA، مانند توصیفکنندههای CA، ECMها و EMMها، استفاده کند. اگر برنامه از چارچوب MediaExtractor استفاده کند، میتواند مدیریت جلسه CAS، مانند باز کردن یک جلسه و پردازش EMM/ECM، را به چارچوب MediaExtractor واگذار کند. سپس MediaExtractor جلسه CAS را مستقیماً با استفاده از API بومی پیکربندی میکند.
در غیر این صورت، برنامه مسئول استخراج دادههای PSI مربوط به CA و پیکربندی جلسه CAS با استفاده از APIهای Media CAS Java است (برای مثال، وقتی برنامه از تجزیهکننده MPEG2-TS خود استفاده میکند).

شکل 2. ورودی IPTV، CAS و پیکربندی descrambler با استفاده از چارچوب MediaExtractor
در سناریوی استخراجکننده نرمافزاری، استخراجکننده برای هر آهنگ رمزگذاریشده، صرف نظر از اینکه آن آهنگ به رمزگشاهای امن نیاز دارد یا خیر، به یک شیء رمزگشایی مبتنی بر نرمافزار یا سختافزار نیاز دارد. این به دلایل زیر است.
- اگر آهنگ نیازی به رمزگشایی امن نداشته باشد، استخراجکننده، واحد دسترسی را رمزگشایی میکند تا بافرها پاک شوند و نمونهها را مانند یک جریان پاک استخراج کند. به این ترتیب نیازی نیست
MediaCodecدر رمزگشایی دخیل باشد. اگر مسیر به رمزگشایی امن نیاز داشته باشد، استخراجکننده ممکن است هنوز به یک رمزگشاییکننده نیاز داشته باشد. این اتفاق زمانی میافتد که جریان انتقال در سطح بسته انتقال، که در آن هدر جریان ابتدایی بستهبندیشده (PES) درهمتنیده است، درهمتنیده شود. استخراجکننده برای دریافت اطلاعات خاص (به عنوان مثال، مهر زمانی ارائه) باید به هدر PES دسترسی داشته باشد.
اگر جریان انتقال در سطح بسته PES، که در آن هدر PES خالی میماند، درهمسازی شود، استخراجکننده از رمزگشایی استفاده نمیکند. با این حال، تا زمانی که بسته درهمسازی شده واقعی نرسد، نمیتوان تأیید کرد که چه زمانی درهمسازی اتفاق میافتد. برای سادگی، فرض کنید اگر مسیر بر اساس جدول نگاشت برنامه (PMT) درهمسازی شده تشخیص داده شود، از رمزگشایی استفاده میشود.
محدودیتهای پیکربندی نرمافزار
وقتی آهنگ نیاز به رمزگشایی امن دارد، رمزگشاییکننده باید هنگام ارسال عملیات رمزگشایی به بافرهای پاک احتیاط کند. از آنجا که رمزگشایی صوتی ناامن مورد نیاز است، اگر رمزگشایی ویدیو به رمزگشاییهای امن نیاز داشته باشد، باید در یک جلسه متفاوت از صدا رمزگذاری شود. ECM مربوط به جلسه باید به افزونه علامت دهد که به یک رمزگشایی امن نیاز است.
از طرف دیگر، افزونه باید بتواند به طور قابل اعتمادی یک کلید را به سیاست امنیتی خود متصل کند. در غیر این صورت، برنامه به راحتی میتواند فریمهای ویدیویی را با رمزگشایی صدا دریافت کند.
حتی زمانی که جلسه به یک رمزگشای امن نیاز دارد، ممکن است از آن خواسته شود که مقدار کمی داده را برای پاک کردن بافرها توسط استخراجکننده برای پردازش هدر PES خروجی دهد. برای جلوگیری از اینکه یک برنامه مخرب افزونه را مجبور به بازگرداندن کل واحد دسترسی کند، افزونه باید بار داده انتقال را تجزیه کند تا اطمینان حاصل شود که بار داده با یک هدر PES از نوع جریان مناسب شروع میشود. در غیر این صورت، افزونه باید درخواست را رد کند.
توالی تنظیم CA
هنگام تنظیم کانال جدید، ماژول TIS برای دریافت توصیفگرهای CA، ECMها و EMMها از چارچوب PSI Tuner رجیستر میکند. توصیفگر CA شامل شناسه سیستم CA است که به طور منحصر به فرد یک فروشنده CA خاص و سایر دادههای خاص فروشنده را شناسایی میکند. TIS از Media CAS پرس و جو میکند تا مشخص کند که آیا افزونه CAS وجود دارد که بتواند توصیفگر CA را مدیریت کند یا خیر.

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

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