מסגרת המערכות לגישה מותנית למדיה (Media CAS) מספקת ממשקי API סטנדרטיים כדי להפעיל שירותי גישה מותנית (CA) במגוון חומרה של טלוויזיה דיגיטלית, כולל כבלים דיגיטליים, לוויין, מערכות קרקעיות ומערכות IPTV. המסגרת פועלת עם מסגרת הקלט של Android TV ועם מסגרת הטיונר של Android TV, ומספקת Java API שמופעלים מאפליקציית TV Input Service (TIS).
אלה המטרות העיקריות של Media CAS.
- מספקת ממשק Java API ציבורי ומסגרת פלאגינים מקוריים שאפשר להשתמש בהם כדי לתמוך ב-CAS לשידורי טלוויזיה ב-Android. מפתחים של צד שלישי ויצרני ציוד מקורי יכולים להשתמש בהם.
- לספק מסגרת CAS בתוך Android שמאפשרת ליצרני ציוד מקורי של ATV לבצע אינטראופרביליות עם מגוון ספקי CAS באופן עקבי.
- תמיכה בכמה ספקי CAS של צד שלישי באמצעות פלאגינים מקוריים. תוספים של CAS עשויים להשתמש בפרוטוקולי רשת ספציפיים לספק, בפורמטים של הודעות ניהול הרשאות (EMM) או הודעות בקרת הרשאות (ECM) ובמפענחים.
- תמיכה באבטחת חומרה כמו מדרגות מפתחות.
- תמיכה בסביבות מחשוב אמינות (TEE) כמו TrustZone.
הגדרות נתמכות
הגדרה של טיונר חומרה
אם החומרה אחראית להסרת הריבוב ולפענוח של זרם התעבורה של MPEG, Tuner framework מספק נתונים של מידע ספציפי לתוכנית (PSI) של גישה מותנית לאפליקציית TIS כדי ליצור אינטראקציה עם מקלטי טלוויזיה מבוססי-חומרה.
נתוני PSI של גישה מותנית כוללים תיאורים של גישה מותנית, ECM ו-EMM. המבנים האלה מאפשרים לתוסף CAS לקבל את המפתחות שדרושים לפענוח של זרמי התוכן.
איור 1. הגדרה של טיונר חומרה
יכול להיות שלתצורת החומרה יש שכבת TEE, כמו TrustZone, כפי שמוצג באיור 1. אם אין שכבת TEE, תוסף של לקוח CAS יכול לתקשר עם שירותי סולם מפתחות החומרה שמסופקים על ידי הפלטפורמה. בגלל וריאציות ספציפיות לספקים של הממשקים האלה, Media CAS לא מבצע סטנדרטיזציה שלהם.
הגדרת תוכנה
בגרסאות Android 10 ומטה, עדיין אפשר להשתמש במסגרת Media CAS כדי לעבד תוכן מבוסס-תוכנה, כמו IPTV משידור מרובה כתובות/שידור לכתובת יחידה של IP. אפליקציית ה-TIS אחראית ליצירת מופע של אובייקט ה-Java של Media CAS ולהקצאת משאבים מתאימה שלו.
יכול להיות שהאפליקציה משתמשת ב-MediaExtractor או בכלי ניתוח אחרים של MPEG2-TS כדי לחלץ נתוני PSI שקשורים ל-CA, כמו מתארים של CA, ECM ו-EMM. אם האפליקציה משתמשת ב-framework MediaExtractor, היא יכולה להעביר את הניהול של סשן CAS, כמו פתיחת סשן ועיבוד EMM/ECM, ל-framework 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 של סוג הזרם המתאים. אחרת, הפלאגין צריך לדחות את הבקשה.
רצף הכוונון של רשות האישורים
כשעוברים לערוץ חדש, מודול ה-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 מעבירה ECM לתוסף CAS באמצעות ממשקי Media CAS API. ECM מכיל את מילת הבקרה המוצפנת, שצריך לפענח אותה באמצעות מידע מ-EMM. תוסף CAS קובע איך להשיג EMM עבור הנכס על סמך מידע ספציפי לספק בתיאור ה-CA, שמועבר באמצעות השיטה setPrivateData()
.
יכול להיות ש-EMM יועברו בתוך פס התדרים בזרם התוכן או מחוץ לפס התדרים באמצעות בקשת רשת שיוזמת התוסף CA. TIS משתמש בשיטה processEMM()
כדי להעביר את כל הודעות ה-EMM בתוך הפס לתקע ה-CA.
אם נדרשת בקשת רשת כדי לקבל EMM, תוסף רשות האישורים אחראי לביצוע העסקה ברשת עם שרת רישיונות.
איור 4. דוגמה לפלאגין CAS לעיבוד EMM ו-ECM
כשתוסף ה-CA מקבל את ה-EMM, הוא מנתח אותו כדי לקבל את המפתח המוצפן לפענוח של מילת הבקרה. יכול להיות שמפתח ה-EMM המוצפן ומילת הבקרה המוצפנת ייטענו לתוך היררכיית מפתחות או סביבה מהימנה כדי לבצע את פענוח מילת הבקרה ואת ביטול ההצפנה של זרם התוכן.
Media CAS Java API
ה-API של Media CAS Java מכיל את השיטות הבאות.
מציגה רשימה של כל התוספים הזמינים של 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);
רישום של מאזין לאירועים והרשאה לאפליקציה לציין גורם מטפל שנעשה בו שימוש ב-looper.
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)), האפליקציה צריכה להיות מסוגלת להורות ללקוחות של מערכת הגישה המותנית לרענן את מפתחות ההרשאה.
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);