מסגרת 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) ובמפענחים.
- תמיכה באבטחת חומרה כמו מדרגות מפתחות.
- תמיכה בסביבות מחשוב אמינות (TEEs) כמו 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
בתרחיש של חילוץ תוכנה, האובייקט של החילוץ דורש אובייקט של פענוח (descrambler) מבוסס תוכנה או חומרה לכל טראק מוצפן, ללא קשר לשאלה אם הטראק דורש מפענחים מאובטחים. הסיבות לכך מפורטות בהמשך.
- אם לא נדרש פענוח מאובטח של הרצועה, כלי החילוץ מבטל את ההצפנה של יחידת הגישה כדי לנקות את המאגרים, ומחלץ דגימות כאילו מדובר בזרם לא מוצפן. כך לא צריך לערב את
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, תוסף ה-CA אחראי לביצוע העסקה ברשת עם שרת הרישיונות.
איור 4. דוגמה לפלאגין CAS לעיבוד EMM ו-ECM
כשמקבלים את ה-EMM, התוסף CA מנתח אותו כדי לקבל את המפתח המוצפן לפענוח מילת הבקרה. יכול להיות שמפתח ה-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);רישום של רכיב event listener והרשאה לאפליקציה לציין handler שנעשה בו שימוש ב-אובייקט להרצת לולאת הודעות בתוך תהליך (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)), האפליקציה צריכה להיות מסוגלת להורות ללקוחות ה-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);