במסמך הזה מופיעה סקירה כללית של מסגרת ניהול הזכויות הדיגיטליות (DRM) של Android, ומתוארים הממשקים שעל יישומי פלאגין של DRM להטמיע. המסמך הזה לא מתאר כללי עמידות או כללי תאימות שיכולים להיות מוגדרים לפי סכימה של DRM.
Framework
פלטפורמת Android מספקת מסגרת DRM נרחבת שמאפשרת לאפליקציות לנהל תוכן מוגן בזכויות בהתאם למגבלות הרישיון שמשויכות לתוכן. מסגרת ה-DRM תומכת במספר רב של סכמות DRM. יצרן המכשיר קובע באילו סכמות DRM המכשיר יתמוך. מסגרת ה-DRM מספקת ממשק מאוחד למפתחי אפליקציות ומסתירה את המורכבות של פעולות ה-DRM. מסגרת ה-DRM מספקת מצב פעולה עקבי לתוכן מוגן ולא מוגן. סכמות של DRM יכולות להגדיר מודלים מורכבים של שימוש לפי מטא-נתונים של רישיון. מסגרת ה-DRM מספקת את השיוך בין תוכן ה-DRM לרישיון, ומטפלת בניהול הזכויות. כך ניתן להפריד את נגן המדיה מתוכן מוגן DRM או תוכן לא מוגן. במאמר MediaDrm מוסבר איך הכיתה יכולה לקבל מפתחות לפענוח של שידורי מדיה מוגנים.
זמינות של תוכן דיגיטלי עשיר חשובה למשתמשים במכשירים ניידים. כדי שהתוכן שלהם יהיה זמין לכמה שיותר אנשים, למפתחי Android ולבעלי תוכן דיגיטלי צריכה להיות הטמעה עקבית של DRM שנתמכת בסביבה העסקית של Android. כדי שהתוכן הדיגיטלי יהיה זמין במכשירי Android, וכדי לוודא שיש לפחות מערכת DRM אחת עקבית שזמינה בכל המכשירים, Google מספקת DRM ללא עמלות רישיון במכשירי Android תואמים. הפלאגין של DRM משולב במסגרת DRM של Android, והוא יכול להשתמש בהגנה שמבוססת על חומרה כדי לאבטח תוכן פרימיום ופרטי כניסה של משתמשים.
הגנה על התוכן שמספקת התוסף ל-DRM תלויה באבטחה וביכולות להגנה על תוכן של פלטפורמת החומרה הבסיסית. יכולות החומרה של המכשיר צריכות לכלול אתחול מאובטח בחומרה כדי ליצור שרשרת אמון של אבטחה והגנה על מפתחות קריפטוגרפיים. יכולות ההגנה על תוכן במכשיר צריכות לכלול הגנה על פריימים מפוענחים במכשיר והגנה על תוכן באמצעות מנגנון הגנה מהימן על פלט. לא כל פלטפורמות החומרה תומכות בכל התכונות של האבטחה וההגנה על התוכן שמפורטות למעלה. אבטחה אף פעם לא מיושמת במקום אחד בסטאק, אלא מסתמכת על השילוב של חומרה, תוכנה ושירותים. השילוב של פונקציות אבטחה בחומרה, מנגנון הפעלה מהימן ומערכת הפעלה מאובטחת ומבודדת לטיפול בפונקציות אבטחה חיוני ליצירת מכשיר מאובטח.
ארכיטקטורה
מסגרת DRM תוכננה כך שלא ניתן יהיה להטמיע אותה, ומופשטת את הפרטים של ההטמעה הספציפית של סכימת DRM בפלאגין DRM ספציפי לסכימה. מסגרת ה-DRM כוללת ממשקי API פשוטים לטיפול בפעולות DRM מורכבות, לרכישת רישיונות, להקצאת המכשיר, לשיוך תוכן DRM לרישיון שלו ולפענוח תוכן DRM.
מסגרת Android DRM מיושמת בשתי שכבות ארכיטקטוניות:
- ממשק API של מסגרת DRM, שגלוי לאפליקציות דרך מסגרת האפליקציות של Android.
- מסגרת DRM לקוד מקורי, שמציגה ממשק ל-plug-ins (סוכנים) של DRM כדי לטפל בניהול זכויות ובפענוח של סכמות DRM שונות.
פרטים נוספים זמינים במאמרים Android Media DRM ו- Android Media Crypto.
יישומי פלאגין DRM
כשמפעילים את המערכת, המערכת מחפשת את ה-framework של DRM למכונות/שירותים של HAL (מתוארים בקובצי .rc
) ויישומי פלאגין. שרת Media DRM (mediadrmserver
) יוצר גם אובייקטים מסוג CryptoHal
וגם אובייקטים מסוג DrmHal
.
CryptoHal
ו-DrmHal
, ואז קוראים לפלאגינים עם הטמעות ספציפיות לספק.
בפלאגינים צריך להטמיע HALs מצורפים. Binderized HALs משתמשים בשפת ההגדרה של Android Interface (AIDL), שמאפשרת להחליף את ה-framework בלי שתצטרכו ליצור מחדש את רכיבי HAL.
יישומי הפלאגין נוצרים על ידי ספקים או על ידי יצרני SOC, ומכניסים אותם למחיצת /vendor
במכשיר. כל המכשירים שמושקעים עם Android 13 ואילך חייבים לתמוך ב-HALs מצורפים שנכתבים בשפת AIDL.
הטמעה
במכשירי GMS ו-AOSP שמיועדים ל-Android 13, צריך להשתמש בממשק 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>
STABLE AIDL VERSION הוא מספר הגרסה של כל מהדורת 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 Init Language.
הטמעת הפלאגין
- מטמיעים את נקודת הכניסה
main()
ב-service.cpp
של שירות הפלאגין. - מטמיעים את
ICryptoPlugin
,IDrmPlugin
,ICryptoFactory
ו-IDrmFactory
. - מטמיעים את ממשקי ה-API החדשים בפלאגין.
פרטי הפלאגין של DRM
ספקי פלאגינים של DRM מטמיעים את DrmFactory
, את CryptoFactory
ואת הפלאגין של DRM.
Drm לפרויקט
הכיתה DrmHal
מחפשת שירותי פלאגין רשומים של DRM ויוצרת פלאגינים תואמים שתומכים בסכימת הצפנה נתונה באמצעות הכיתה DrmFactory
.
IDrmFactory היא נקודת הכניסה הראשית לאינטראקציה עם HAL של DRM של ספק באמצעות createPlugin API. ממשק ה-API של createPlugin משמש ליצירת מכונות IDrmPlugin.
::ndk::ScopedAStatus getSupportedCryptoSchemes( std::vector<::aidl::android::hardware::drm::Uuid>* _aidl_return);
הפונקציה getsupportedCryptoSchemes מחזירה רשימה של סכימות קריפטו נתמכות למכונת AIDL drm HAL.
::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.