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 של קוד Native, שחושפת ממשק לפלאגינים של 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 עם binderization שנכתבו בשפת 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. הרצף הזה קובע אם פקטורי (factory) הפלאגינים יכול ליצור פלאגינים של ניהול זכויות דיגיטליות (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);

הרצף הזה קובע אם פקטורי (factory) הפלאגינים יכול ליצור פלאגינים קריפטוגרפיים שתומכים בסכמת הצפנה נתונה, שמצוינת על ידי מזהה ייחודי אוניברסלי (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);

ממשקי API של תוסף DRM

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