ניהול זכויות דיגיטליות (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 שונות.
מסגרת DRM ל-Android
איור 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 חדשים של frameworks ל-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.