ניהול זכויות דיגיטליות (DRM)

סמל Android DRM HAL

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

Framework

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

Android DRM HAL
איור 1א'. שכבת החומרה להפשטה של DRM לפני Android 11
Android DRM HAL post R
איור 1ב. שכבת הפשטת החומרה של 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 בקוד מקורי, שמציגה ממשק ל-plug-ins (סוכנים) של DRM כדי לטפל בניהול זכויות ובפענוח של סכמות DRM שונות.
Android DRM Framework
איור 2א. מסגרת DRM לפני Android 11
Android DRM Framework
איור 2ב. מסגרת DRM החל מ-Android 11

פרטים נוספים זמינים במאמרים Android Media DRM ו- Android Media Crypto.

פלאגינים של DRM

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

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

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

הטמעה

במכשירי GMS ו-AOSP שמיועדים ל-Android 13, צריך להשתמש בממשק 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>

STABLE AIDL VERSION הוא מספר הגרסה של כל מהדורה של 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 Init Language.

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

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

פרטי הפלאגין של DRM

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

DrmFactory

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

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

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

הפונקציה getSupportedCryptoSchemes מחזירה רשימה של שיטות הצפנה נתמכות למכונה של HAL DRM ב-AIDL.

::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 שתומכים בסכימת הצפנה נתונה, שצוינה באמצעות UUID.

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

הפונקציה קובעת אם מפעל הפלאגינים יכול ליצור פלאגינים של DRM שתומכים בפורמט נתון של מאגר מדיה שצוין ב-mimeType.

::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);

יצירת פלאגין DRM לסכמת ההצפנה שצוינה על ידי UUID.

CryptoFactory

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

::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);

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

ממשקי API של יישומי פלאגין ל-DRM

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