
בדף הזה מופיעה סקירה כללית על מסגרת ניהול הזכויות הדיגיטליות (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. שיטת הפשטת חומרה (HAL) של 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 בקוד מקורי, שמציגה ממשק ל-plug-ins (סוכנים) של 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 מצורפים. ב-HALs מצורפים ל-Binder נעשה שימוש ב-Android Interface Definition Language (AIDL), שמאפשר להחליף את המסגרת בלי צורך לבנות מחדש את ה-HALs.
יצרנים או יוצרים של SOC יוצרים את הפלאגינים ומכניסים אותם למחיצה /vendor
במכשיר. כל המכשירים שמושקעים עם Android מגרסה 13 ואילך חייבים לתמוך ב-HALs מצורפים שנכתבים בשפת 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 היציבה היא מספר הגרסה של כל מהדורת API של AIDL (לדוגמה, 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 Init Language.
הטמעת הפלאגין
- מטמיעים את נקודת הכניסה
main()
ב-service.cpp
של שירות הפלאגין. - מטמיעים את
ICryptoPlugin
,IDrmPlugin
,ICryptoFactory
ו-IDrmFactory
. - מטמיעים את ממשקי ה-API החדשים בפלאגין.
פרטי הפלאגין של DRM
ספקי הפלאגין של DRM מטמיעים את DrmFactory
, את CryptoFactory
ואת הפלאגין של DRM.
הכיתה DrmFactory
הכיתה DrmHal
מחפשת שירותי פלאגין רשומים של DRM ויוצרת פלאגינים תואמים שתומכים בסכימת הצפנה נתונה באמצעות הכיתה DrmFactory
.
IDrmFactory
היא נקודת הכניסה הראשית לאינטראקציה עם HAL של DRM של ספק באמצעות השיטה createPlugin
. משתמשים בשיטה הזו כדי ליצור מכונות IDrmPlugin
.
::ndk::ScopedAStatus getSupportedCryptoSchemes( std::vector<::aidl::android::hardware::drm::Uuid>* _aidl_return);
getSupportedCryptoSchemes
מחזיר רשימה של סכמות הצפנה נתמכות עבור מופע ה-HAL של AIDL DRM. התהליך הזה קובע אם מפעל הפלאגינים יכול ליצור פלאגינים של 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);
ממשקי API של יישומי פלאגין ל-DRM
ממשקי ה-API מוגדרים ב-hardware/interfaces/drm/aidl/aidl_api/android.hardware.drm/
VERSION/android/hardware/drm/IDrmPlugin.aidl
. הקובץ IDrmPlugin.h
התואם נמצא ב-out/Soong
אחרי ה-build.