מסגרת CAS

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

היעדים העיקריים של Media CAS הם:

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

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

הגדרת טיונר החומרה

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

נתוני PSI של גישה מותנית כוללים מתארי CA, ECM ו-EMM. המבנים האלה מאפשרים לפלאגין CAS לקבל את המפתחות הנדרשים לפענוח של מקורות התוכן.

דיאגרמה של הגדרת הטיונר בחומרה.

איור 1. הגדרת טיונר החומרה

הגדרות החומרה עשויות לכלול שכבת TEE, כמו TrustZone, שמתוארת באיור 1. אם אין שכבת TEE, פלאגין של לקוח CAS יכול לתקשר עם שירותי שרשת מפתחות לחומרה שסופקו על ידי הפלטפורמה. בגלל וריאציות ספציפיות לספקים של הממשקים האלה, ה-CAS של המדיה לא מבצע סטנדרטיזציה.

תצורת התוכנה

לפני Android 11, עדיין אפשר היה להשתמש ב-Media CAS ב-Media CAS כדי לעבד תוכן מבוסס תוכנה, כמו IPTV מריבוי שידורים של IP או unicast. אפליקציית TIS אחראית ליצור את אובייקט Media CAS Java ולהגדיר אותו בצורה תקינה.

יכול להיות שהאפליקציה תשתמש ב-MediaExtractor או בניתחים אחרים של MPEG2-TS כדי לחלץ נתוני PSI שקשורים ל-CA, כמו מתארי CA, הודעות ECM והודעות EMM. אם האפליקציה משתמשת ב-framework Mediaחלץ את קבצים, היא יכולה לתת ל-MediaScriptor ל-framework את יכולות ניהול הסשנים של CAS, כמו פתיחת סשנים ועיבוד של EMM/ECM. לאחר מכן, MediaExtractor מגדיר את סשן ה-CAS באמצעות ה-API המקורי ישירות.

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

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

איור 2. תצורת קלט של IPTV, CAS ומפענח, באמצעות framework Mediaחלץ

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

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

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

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

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

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

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

רצף כוונון של רשות אישורים

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

תרשים של התאמת התוכן של CAS.

איור 3. התאמת התוכן של CAS

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

תהליך לדוגמה של פלאגין CAS

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

יכול להיות שספקי EMM יועברו לתדר הסטרימינג של התוכן או מחוץ למסגרת באמצעות בקשת רשת שנשלחה על ידי הפלאגין של CA. TIS משתמשת ב-method processEMM() כדי להעביר כל ספק EMM בתדר לפלאגין של CA.

אם נדרשת בקשת רשת כדי לקבל EMM, הפלאגין של CA אחראי לבצע את העסקה ברשת עם שרת הרישיונות.

דיאגרמה של דוגמה ל-CAS.

איור 4. דוגמה לפלאגין של CAS לעיבוד EMM ו-ECM

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

ממשק API של Media CAS Java

ממשק ה-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);
    
  • רושמים מאזין לאירועים ומאפשרים לאפליקציה לציין גורם מטפל שבו נעשה שימוש בלולאה.

    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, מטבלת הגישה המותנית או ממקורות מחוץ לתדר. המידע הזה לא משויך לסשן מסוים.

    void setPrivateData(@NonNull byte[] data);
    
  • עיבוד חבילת EMM.

    void processEmm(@NonNull byte[] data, int offset, int length);
    
  • שליחת אירוע למערכת CA. פורמט האירוע הוא ספציפי לסכמה והוא אטום ל-framework.

    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. פורמט האירוע הוא ספציפי לסכמה והוא אטום ל-framework.

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