
בדף הזה מובאת סקירה כללית של מסגרת ניהול הזכויות הדיגיטליות (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 ואילך:
איור 1. שכבת הפשטת חומרה של DRM לפני 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 ומעלה:
איור 3. מסגרת 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 באמצעות פלאגין:
- מוסיפים את שירות הפלאגין לקובצי ה-build של המכשיר.
- מעדכנים את קובץ המניפסט של המכשיר.
- מוסיפים הרשאות SELinux.
- יוצרים קובץ
.rc
בתיקייה/vendor
. - מטמיעים את הפלאגין.
ממשקי ה-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
- הוספת הרשאות ל-
VENDOR DEVICE/sepolicy/vendor/file.te
:
type mediadrm_vendor_data_file, file_type, data_file_type;
- הוספת הרשאות ל-
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 - הוספת הרשאות ל-
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.
הטמעה של הפלאגין
- מטמיעים את נקודת הכניסה
main()
ב-service.cpp
של שירות הפלאגין. - הטמעה של
ICryptoPlugin
,IDrmPlugin
,ICryptoFactory
ו-IDrmFactory
. - מטמיעים את ממשקי ה-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
.