מסגרת CAS

מסגרת מערכות הגישה המותנית למדיה (Media CAS) מספקת ממשקי API סטנדרטיים כדי לאפשר שירותי גישה מותנית (CA) במגוון חומרת טלוויזיה דיגיטלית, כולל כבלים דיגיטליים, לוויין, מערכות יבשתיות ומערכות IPTV. המסגרת פועלת עם מסגרת Android TV Input ו- Android TV Tuner , ומספקת ממשקי API של Java המופעלים מאפליקציית TV Input Service (TIS).

המטרות העיקריות של Media CAS הן כדלקמן.

  • ספק Java API ציבורי ומסגרת פלאגין מקורית שיכולים לשמש מפתחי צד שלישי ויצרני OEM כדי לתמוך ב-CAS עבור טלוויזיה בשידור באנדרואיד.
  • ספק מסגרת CAS בתוך אנדרואיד המאפשרת ליצרני OEM של טרקטורונים לפעול באופן עקבי עם מגוון ספקי CAS.
  • תמיכה במספר ספקי CAS של צד שלישי באמצעות תוספים מקוריים. תוספים של CAS עשויים להשתמש בפרוטוקולי רשת ספציפיים לספקים, בפורמטים של הודעת ניהול זכאות (EMM)/הודעות בקרת זכאות (ECM) ובפורמטים.
  • תמיכה באבטחת חומרה כגון סולמות מפתחות.
  • תמיכה בסביבות ביצוע מהימנות (TEEs) כגון TrustZone.

תצורות נתמכות

תצורת מקלט חומרה

אם החומרה אחראית על דה-multiplexing ו-Descrambling של זרם MPEG, Tuner Framework מספקת נתוני מידע ספציפי לתוכנית (PSI) לגישה מותנית לאפליקציית TIS על מנת להתממשק עם מקלטי טלוויזיה מבוססי חומרה.

נתוני PSI של גישה מותנית כוללים מתארי CA, ECMs ו-EMMs. מבנים אלה מאפשרים לפלאגין 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, ל- Framework MediaExtractor. MediaExtractor מגדיר את הפעלת ה-CAS באמצעות ממשק ה-API המקורי.

אחרת, האפליקציה אחראית לחילוץ נתוני PSI הקשורים ל-CA ולקבוע את הפעלת ה-CAS באמצעות Media CAS Java APIs (לדוגמה, כאשר האפליקציה משתמשת במנתח MPEG2-TS משלה).

תרשים של תצורת הטיונר.

איור 2. תצורת קלט IPTV, CAS ו-Descrambler באמצעות ה-framework MediaExtractor

בתרחיש מחלץ התוכנה, המחלץ דורש אובייקט מפענח מבוסס תוכנה או חומרה עבור כל רצועה מקושקשת, ללא קשר אם המסלול דורש מפענחים מאובטחים. זה נובע מהדברים הבאים.

  • אם המסלול אינו מצריך פענוח מאובטח, המחלץ מבטל את יחידת הגישה כדי לנקות מאגרים ומחלץ דגימות כאילו מזרם צלול. בדרך זו, MediaCodec לא צריך להיות מעורב בביטול השינוי.
  • אם הרצועה דורשת פענוח מאובטח, ייתכן שהחולץ עדיין זקוק ל-Descrambler. זה קורה כאשר זרם ההובלה מעורפל ברמת חבילת התעבורה, כאשר כותרת הזרם היסודי של החבילות (PES) מעורפלת. המחלץ צריך לגשת לכותרת PES כדי למורד מידע מסוים (לדוגמה, חותמת הזמן של המצגת).

    ה-Descrambler אינו בשימוש על-ידי המחלץ אם זרם ההובלה מעורפל ברמת מנות PES, כאשר כותרת ה-PES נותרה נקייה. עם זאת, לא ניתן לאשר מתי הערבול מתרחש עד להגעת החבילה המעורערת בפועל. למען הפשטות, נניח שמשתמש ב-Descrambler אם נקבע שהמסלול יהיה מעורפל על סמך טבלת מיפוי התוכניות (PMT).

מגבלות של תצורת תוכנה

כאשר הרצועה דורשת פענוח מאובטח, ה-Descrambler צריך להיות זהיר כשהוא נותן לפעולת ה-Descramble למאגרים ברורים. מכיוון שדרוש פענוח אודיו לא מאובטח, אם פענוח וידאו דורש מפענחים מאובטחים, יש לערבב אותו בהפעלה שונה מזו של אודיו. ה-ECM עבור הפגישה חייב לאותת לפלאגין שנדרש מפענח מאובטח.

לחלופין, התוסף חייב להיות מסוגל לקשור באופן אמין מפתח למדיניות האבטחה שלו. אחרת, האפליקציה יכולה לקבל בקלות מסגרות וידאו עם מהפך האודיו.

גם כאשר ההפעלה דורשת מפענח מאובטח, ייתכן שתתבקש להוציא כמות קטנה של נתונים כדי לנקות מאגרים על ידי המחלץ כדי לעבד את כותרת PES. כדי למנוע מאפליקציה זדונית לגרום לפלאגין להחזיר את כל יחידת הגישה, התוסף צריך לנתח את מטען התחבורה כדי להבטיח שהמטען מתחיל עם כותרת PES מסוג הזרם המתאים. אחרת, התוסף אמור לדחות את הבקשה.

רצף כוונון CA

בעת כוונון לערוץ חדש, מודול TIS נרשם לקבלת מתארי CA, ECMs ו-EMMs ממסגרת PSI Tuner. מתאר CA מכיל את מזהה מערכת CA, המזהה באופן ייחודי ספק CA ספציפי ונתונים ספציפיים אחרים לספק. TIS שואל את Media CAS כדי לקבוע אם קיים תוסף CAS שיכול להתמודד עם מתאר CA.

תרשים של כוונון תוכן CAS.

איור 3. כוונון תוכן CAS

אם מזהה מערכת CA נתמך, נוצר מופע של Media CAS והנתונים הפרטיים של הספק מתאר CA מסופקים לפלאגין. לאחר מכן, הפעלות חדשות נפתחות ב- Media CAS כדי לטפל בזרמי האודיו והווידאו. הסשנים החדשים שנפתחו מקבלים ECMs ו-EMMs עבור הפלאגין.

זרימת תוסף CAS לדוגמה

TIS מספקת ECMs לפלאגין CAS באמצעות Media CAS APIs. ECM מכיל את מילת הבקרה המוצפנת, אותה יש לפענח באמצעות מידע מ-EMM. הפלאגין CAS קובע כיצד לרכוש EMM עבור הנכס בהתבסס על מידע ספציפי לספק במתאר CA, אשר מסופק על ידי שיטת setPrivateData() ‎.

EMMs עשויים להיות מסופקים בפס בזרם התוכן או מחוץ לפס באמצעות בקשת רשת שיזמה הפלאגין CA. TIS משתמש בשיטת processEMM() כדי לספק כל EMMs בפס לפלאגין 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);