DRM

סמל של Android DRM HAL

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

Framework

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

איור 1 מציג את שכבת החילוץ של חומרת ה-DRM לפני Android מגרסה 11, ואיור 2 מציג את השכבה ב-Android מגרסה 11 ואילך:

‫Android DRM HAL

איור 1. שכבת הפשטת חומרה של DRM לפני Android 11.

‫Android DRM HAL החל מ-Android 11

איור 2. שיטת הפשטת חומרה (HAL) של DRM החל מ-Android 11.

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

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

ארכיטקטורה

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

מסגרת ה-DRM של Android מיושמת בשתי שכבות ארכיטקטוניות:

  • ‫API של מסגרת DRM, שגלוי לאפליקציות דרך מסגרת האפליקציות של Android
  • מסגרת DRM של קוד מקורי, שחושפת ממשק לתוספי DRM (סוכנים) כדי לטפל בניהול זכויות ובפענוח של תוכניות DRM שונות

איור 3 מציג את מסגרת ה-DRM לפני Android 11, ואיור 4 מציג את המסגרת ב-Android 11 ומעלה:

מסגרת DRM ב-Android

איור 3. מסגרת DRM לפני Android 11.

מסגרת Android DRM החל מ-Android 11

איור 4. מסגרת DRM החל מ-Android 11.

פרטים נוספים זמינים במאמרים בנושא MediaDrm ו-MediaCrypto.

פלאגינים של DRM

בזמן הפעלת המערכת, מסגרת ה-DRM סורקת מופעים ושירותים של HAL (שמתוארים בקובצי .rc ) ומגלה תוספים. שרת DRM של מדיה (mediadrmserver) יוצר אובייקטים של CryptoHal וגם של DrmHal. ‫CryptoHal ו-DrmHal ואז קוראים לפלאגינים עם הטמעות ספציפיות לספק.

תוספים צריכים להטמיע HALs עם binder. ב-HALs עם Binder נעשה שימוש בשפה לעיצוב ממשקים ב-Android‏ (AIDL), שמאפשרת להחליף את המסגרת בלי לבנות מחדש את ה-HALs.

תוספים נוצרים על ידי ספקים או יצרני SOC ומוצבים במחיצה /vendorבמכשיר. כל המכשירים שהושקו עם Android מגרסה 13 ואילך חייבים לתמוך ב-HALs עם binder שנכתבו בשפת AIDL.

הטמעה

כדי להטמיע ממשקי API חדשים של מסגרות DRM באמצעות פלאגין:

  1. מוסיפים את שירות הפלאגין לקובצי ה-build של המכשיר.
  2. מעדכנים את קובץ המניפסט של המכשיר.
  3. מוסיפים הרשאות SELinux.
  4. יוצרים קובץ .rc בתיקייה /vendor.
  5. מטמיעים את הפלאגין.

ממשקי ה-API מוגדרים בכל גרסה של IDrmPlugin.aidl,‏ ICryptoPlugin.aidl,‏ IDrmFactory.aidl ו-ICryptoFactory.aidl.

aidl/PLATFORM_ROOT/hardware/interfaces/drm/

הוספת שירות פלאגין לקבצי build של המכשיר

לדוגמה, כדי להוסיף תמיכה בממשק AIDL, קובץ VENDOR DEVICE/device.mk צריך לכלול את חבילות android.hardware.drm-service.* הבאות:

  PRODUCT_PACKAGES += \
    android.hardware.drm-service.clearkey \
    android.hardware.drm-service.widevine

עדכון מניפסט המכשיר

קובץ vendor manifest.xml של המכשיר חייב לכלול את הרשומות הבאות:

  <hal format="aidl">
    <name>android.hardware.drm</name>
    <version>STABLE AIDL VERSION</version>
      <fqname>ICryptoFactory/clearkey</fqname>
      <fqname>IDrmFactory/clearkey</fqname>
      <fqname>ICryptoFactory/widevine</fqname>
      <fqname>IDrmFactory/widevine</fqname>
  </hal>

גרסת ה-AIDL היציבה היא מספר הגרסה של כל מהדורה של AIDL API (לדוגמה, 1, 2). לחלופין, מומלץ להשתמש ב-vintf_fragments.

הוספת הרשאות SELinux

  1. הוספת הרשאות ל-VENDOR DEVICE/sepolicy/vendor/file.te:
    type mediadrm_vendor_data_file, file_type, data_file_type;
  2. הוספת הרשאות ל-VENDOR DEVICE/sepolicy/vendor/file_contexts:
        /vendor/bin/hw/android\.hardware\.drm-service\.clearkey  u:object_r:hal_drm_clearkey_exec:s0
    /data/vendor/mediadrm(/.*)? u:object_r:mediadrm_vendor_data_file:s0
  3. הוספת הרשאות ל-device/sepolicy/vendor/hal_drm_clearkey.te:
        vndbinder_use(hal_drm_clearkey)
        allow hal_drm_clearkey servicemanager:binder { call transfer };
        allow hal_drm_clearkey hal_drm_service:service_manager add;
        allow hal_drm_clearkey { appdomain -isolated_app }:fd use;
        get_prop(ramdump, public_vendor_default_prop)
        

יצירת קובץ RC בתיקייה ‎ /vendor

קובץ .rc מציין את הפעולות שיש לבצע כשמפעילים שירות.

פרטים נוספים זמינים במאמר בנושא שפת ההפעלה של Android.

הטמעה של הפלאגין

  1. מטמיעים את נקודת הכניסה main() ב-service.cpp של שירות הפלאגין.
  2. הטמעה של ICryptoPlugin, IDrmPlugin, ICryptoFactory ו-IDrmFactory.
  3. מטמיעים את ממשקי ה-API החדשים בתוסף.

פרטים על תוסף DRM

ספקי פלאגינים של DRM מטמיעים את DrmFactory, CryptoFactory ואת פלאגין ה-DRM.

‫DrmFactory class

המחלקות DrmHal מחפשות שירותי פלאגין רשומים של DRM ויוצרות פלאגינים תואמים שתומכים בסכמת הצפנה נתונה באמצעות המחלקה DrmFactory.

IDrmFactory היא נקודת הכניסה העיקרית לאינטראקציה עם DRM HAL של ספק באמצעות השיטה createPlugin. משתמשים בשיטה הזו כדי ליצור מכונות IDrmPlugin.

::ndk::ScopedAStatus getSupportedCryptoSchemes(
    std::vector<::aidl::android::hardware::drm::Uuid>* _aidl_return);

getSupportedCryptoSchemes מחזירה רשימה של תוכניות הצפנה נתמכות עבור מופע AIDL DRM HAL. הרצף הזה קובע אם מפעל הפלאגינים יכול ליצור פלאגינים של DRM שתומכים בסכימת הצפנה מסוימת, שמצוינת על ידי UUID:

::ndk::ScopedAStatus isCryptoSchemeSupported(
    const ::aidl::android::hardware::drm::Uuid& in_uuid,
    const std::string& in_mimeType,
    ::aidl::android::hardware::drm::SecurityLevel in_securityLevel,
    bool* _aidl_return);

הרצף הזה קובע אם מפעל הפלאגינים יכול ליצור פלאגינים של DRM שתומכים בפורמט נתון של קובץ מדיה שצוין על ידי mimeType:

::ndk::ScopedAStatus isContentTypeSupported(const std::string& in_mimeType,
    bool* _aidl_return);

הרצף הזה יוצר פלאגין DRM עבור תוכנית ההצפנה שצוינה על ידי UUID:

::ndk::ScopedAStatus createPlugin(
    const ::aidl::android::hardware::drm::Uuid& in_uuid,
    const std::string& in_appPackageName,
    std::shared_ptr<::aidl::android::hardware::drm::IDrmPlugin>* _aidl_return);

הסיווג CryptoFactory

המחלקות CryptoHal מחפשות שירותי פלאגין רשומים של DRM ויוצרות פלאגינים תואמים שתומכים בסכמת הצפנה נתונה באמצעות המחלקה CryptoFactory.

הרצף הזה קובע אם מפעל הקריפטו יכול ליצור תוספי קריפטו שתומכים בסכימת קריפטו מסוימת, שמצוינת על ידי UUID:

::ndk::ScopedAStatus isCryptoSchemeSupported(
    const ::aidl::android::hardware::drm::Uuid& in_uuid,
    bool* _aidl_return);

הרצף הזה קובע אם מפעל הפלאגינים יכול ליצור פלאגינים קריפטוגרפיים שתומכים בסכימת הצפנה נתונה, שמצוינת על ידי UUID:

::ndk::ScopedAStatus createPlugin(
    const ::aidl::android::hardware::drm::Uuid& in_uuid,
    const std::vector<uint8_t>& in_initData,
    std::shared_ptr<::aidl::android::hardware::drm::ICryptoPlugin>* _aidl_return);

‫DRM plugin APIs

ממשקי ה-API מוגדרים ב-hardware/interfaces/drm/aidl/aidl_api/android.hardware.drm/ VERSION/android/hardware/drm/IDrmPlugin.aidl. אחרי ה-build, אפשר למצוא את קובץ IDrmPlugin.h המתאים ב-out/Soong.