הצפנת הדיסק במלואו היא תהליך של קידוד כל נתוני המשתמש במכשיר Android באמצעות מפתח מוצפן. אחרי שמצפינים מכשיר, כל הנתונים שהמשתמש יוצר מוצפנים באופן אוטומטי לפני שהם נשמרים בדיסק, וכל הקריאות מפענחות את הנתונים באופן אוטומטי לפני שהם מוחזרים לתהליך הקורא.
הצפנה מלאה של הדיסק הושקה ב-Android 4.4, אבל ב-Android 5.0 הושקו התכונות החדשות האלה:
- יצירת הצפנה מהירה, שמצפינה רק בלוקים בשימוש במחיצת הנתונים כדי למנוע אתחול ראשון ארוך. נכון לעכשיו, רק מערכות הקבצים ext4 ו-f2fs תומכות בהצפנה מהירה.
- נוסף
forceencryptהדגל fstab להצפנה בהפעלה הראשונה. - הוספנו תמיכה בתבניות ובהצפנה ללא סיסמה.
- נוסף אחסון של מפתח ההצפנה שמגובה בחומרה באמצעות יכולת החתימה של סביבת מחשוב אמינה (TEE) (למשל ב-TrustZone). פרטים נוספים זמינים במאמר בנושא אחסון המפתח המוצפן.
זהירות: מכשירים ששודרגו ל-Android 5.0 ואחר כך הוצפן יכולים לחזור למצב לא מוצפן באמצעות איפוס לנתוני היצרן. אי אפשר להחזיר למצב לא מוצפן מכשירי Android 5.0 חדשים שהוצפנו בהפעלה הראשונה.
איך פועלת הצפנה מלאה של הדיסק ב-Android
הצפנה מלאה של הדיסק ב-Android מבוססת על dm-crypt, שהיא תכונה של ליבת המערכת שפועלת בשכבת מכשיר הבלוקים. לכן, ההצפנה פועלת עם Embedded MultiMediaCard (eMMC) ועם מכשירי פלאש דומים שמוצגים לליבת המערכת כמכשירי בלוק. אי אפשר להצפין עם YAFFS, שמתקשר ישירות עם שבב NAND flash גולמי.
אלגוריתם ההצפנה הוא 128 Advanced Encryption Standard (AES) עם cipher-block chaining (CBC) ו-ESSIV:SHA256. מפתח המאסטר מוצפן באמצעות 128-bit AES דרך קריאות לספריית OpenSSL. חובה להשתמש במפתח באורך 128 ביט לפחות (אפשר גם 256 ביט).
הערה: יצרני ציוד מקורי יכולים להשתמש בהצפנה של 128 ביט ומעלה כדי להצפין את מפתח המאסטר.
בגרסה 5.0 של Android יש ארבעה סוגים של מצבי הצפנה:
- ברירת מחדל
- קוד אימות
- סיסמה
- קו ביטול נעילה
באתחול הראשון, המכשיר יוצר מפתח ראשי בן 128 ביט שנוצר באופן אקראי, ואז מבצע גיבוב שלו באמצעות סיסמת ברירת מחדל ומלח מאוחסן. סיסמת ברירת המחדל היא: default_password. עם זאת, הגיבוב שמתקבל נחתם גם באמצעות TEE (כמו TrustZone), שמשתמש בגיבוב של החתימה כדי להצפין את מפתח המאסטר.
אפשר למצוא את סיסמת ברירת המחדל שמוגדרת בקובץ cryptfs.cpp של פרויקט הקוד הפתוח של Android.
כשהמשתמש מגדיר קוד אימות, סיסמה או קו ביטול נעילה במכשיר, רק המפתח בן 128 הביטים מוצפן מחדש ונשמר. (כלומר, שינויים בקוד האימות, בסיסמה או בתבנית של המשתמש לא גורמים להצפנה מחדש של נתוני המשתמש). חשוב לזכור שמכשיר מנוהל עשוי להיות כפוף להגבלות על קוד אימות, קו ביטול נעילה או סיסמה.
ההצפנה מנוהלת על ידי init ועל ידי vold.
init קורא ל-vold, ו-vold מגדיר מאפיינים להפעלת אירועים ב-init. חלקים אחרים במערכת בודקים גם את המאפיינים כדי לבצע משימות כמו דיווח על סטטוס, בקשת סיסמה או הצעה לאיפוס להגדרות המפעל במקרה של שגיאה חמורה. כדי להפעיל תכונות הצפנה ב-vold, המערכת משתמשת בפקודות cryptfs של כלי שורת הפקודה vdc: checkpw,
restart, enablecrypto, changepw,
cryptocomplete, verifypw, setfield,
getfield, mountdefaultencrypted, getpwtype,
getpw ו-clearpw.
כדי להצפין, לפענח או למחוק את /data, /data
אסור שהיא תהיה מותקנת. עם זאת, כדי להציג ממשק משתמש כלשהו, המסגרת צריכה להתחיל לפעול, והיא דורשת את /data כדי לפעול. כדי לפתור את הבעיה הזו, מערכת קבצים זמנית מותקנת ב-/data.
כך מערכת Android יכולה להציג בקשות להזנת סיסמאות, להראות את ההתקדמות או להציע מחיקת נתונים לפי הצורך. ההגבלה היא שכדי לעבור ממערכת הקבצים הזמנית למערכת הקבצים האמיתית /data, המערכת צריכה לעצור כל תהליך עם קבצים פתוחים במערכת הקבצים הזמנית ולהפעיל מחדש את התהליכים האלה במערכת הקבצים האמיתית /data. כדי לעשות את זה, כל השירותים צריכים להיות באחת משלוש קבוצות: core, main ו-late_start.
-
core: לא מכבים את המחשב אחרי ההפעלה. -
main: מכבים את המחשב ומפעילים אותו מחדש אחרי שמזינים את הסיסמה לדיסק. -
late_start: לא מתחיל עד ש-/dataמפוענח ומותקן.
כדי להפעיל את הפעולות האלה, המאפיין vold.decrypt מוגדר למחרוזות שונות.
כדי להפסיק ולהפעיל מחדש שירותים, משתמשים בפקודות init:
-
class_reset: מפסיק שירות אבל מאפשר להפעיל אותו מחדש באמצעות class_start. -
class_start: הפעלה מחדש של שירות. -
class_stop: מפסיק שירות ומוסיף דגלSVC_DISABLED. שירותים שהופסקו לא מגיבים ל-class_start.
Flows
יש ארבעה תהליכים למכשיר מוצפן. מכשיר מוצפן רק פעם אחת ואז מתבצעת הפעלה רגילה.
- הצפנה של מכשיר שלא הוצפן בעבר:
- הצפנת מכשיר חדש באמצעות
forceencrypt: הצפנה חובה בהפעלה הראשונה (החל מ-Android L). - הצפנה של מכשיר קיים: הצפנה שמתבצעת על ידי המשתמש (Android K ומטה).
- הצפנת מכשיר חדש באמצעות
- הפעלה של מכשיר מוצפן:
- הפעלה של מכשיר מוצפן ללא סיסמה: אתחול של מכשיר מוצפן שלא הוגדרה לו סיסמה (רלוונטי למכשירים עם Android מגרסה 5.0 ואילך).
- הפעלה של מכשיר מוצפן באמצעות סיסמה: אתחול של מכשיר מוצפן שמוגדרת בו סיסמה.
בנוסף לתהליכים האלה, יכול להיות שהמכשיר לא יצליח להצפין את /data.
בהמשך מוסבר כל אחד מהתהליכים בפירוט.
הצפנת מכשיר חדש באמצעות forceencrypt
זוהי האתחול הראשון הרגיל של מכשיר Android 5.0.
- זיהוי מערכת קבצים לא מוצפנת באמצעות הדגל
forceencrypt/dataלא מוצפן אבל צריך להיות מוצפן כיforceencryptמחייב זאת. ביטול הטעינה של/data. - התחלת ההצפנה
/data
vold.decrypt = "trigger_encryption"triggersinit.rc, which causesvoldto encrypt/datawith no password. (לא מוגדר כלום כי זה אמור להיות מכשיר חדש). - Mount tmpfs
voldיוצר tmpfs/data(באמצעות האפשרויות של tmpfs מ-ro.crypto.tmpfs_options) ומגדיר את המאפייןvold.encrypt_progressל-0. voldמכין את tmpfs/dataלהפעלה של מערכת מוצפנת ומגדיר את המאפייןvold.decryptלערך:trigger_restart_min_framework - הצגת מסגרת לתיאור ההתקדמות
במכשיר כמעט אין נתונים להצפנה, ולכן סרגל ההתקדמות לא יופיע לעיתים קרובות כי ההצפנה מתבצעת במהירות. מידע נוסף על ממשק המשתמש של ההתקדמות מופיע במאמר בנושא הצפנת מכשיר קיים.
- When
/datais encrypted, take down the framework
voldמגדיר אתvold.decryptל-trigger_default_encryption, וכך מתחיל השירותdefaultcrypto. (כך מתחיל התהליך שמתואר בהמשך להרכבת נתוני משתמש מוצפנים שמוגדרים כברירת מחדל). trigger_default_encryptionבודק את סוג ההצפנה כדי לראות אם/dataמוצפן עם סיסמה או בלי סיסמה. מכיוון שמכשירי Android 5.0 מוצפנים בהפעלה הראשונה, לא אמורה להיות סיסמה מוגדרת. לכן אנחנו מפענחים ומעלים את/data. - Mount
/data
initואז טוען את/dataב-RAMDisk של tmpfs באמצעות פרמטרים שהוא מקבל מ-ro.crypto.tmpfs_options, שמוגדר ב-init.rc. - הפעלת מסגרת
voldמגדיר אתvold.decryptל-trigger_restart_framework, וממשיך בתהליך האתחול הרגיל.
הצפנה של מכשיר קיים
זה מה שקורה כשמצפינים מכשיר Android K או גרסה מוקדמת יותר שלא הוצפנה והועברה ל-L.
התהליך הזה מתחיל על ידי המשתמש והוא נקרא 'הצפנה במקום' בקוד. כשמשתמש בוחר להצפין מכשיר, ממשק המשתמש מוודא שהסוללה טעונה במלואה ומתאם ה-AC מחובר, כדי שיהיה מספיק חשמל להשלמת תהליך ההצפנה.
אזהרה: אם הסוללה של המכשיר מתרוקנת והוא נכבה לפני שההצפנה מסתיימת, נתוני הקובץ נשארים במצב של הצפנה חלקית. המכשיר חייב לעבור איפוס להגדרות המקוריות וכל הנתונים לא נשמרים.
כדי להפעיל הצפנה במקום, vold מתחיל לולאה לקריאת כל סקטור של מכשיר הבלוק האמיתי ואז כתיבה שלו למכשיר הבלוק המוצפן. vold בודק אם סקטור נמצא בשימוש לפני שהוא קורא אותו וכותב בו, מה שהופך את ההצפנה למהירה הרבה יותר במכשיר חדש שיש בו מעט נתונים או שאין בו נתונים בכלל.
מצב המכשיר: מגדירים את ro.crypto.state = "unencrypted"
ומפעילים את טריגר on nonencrypted init כדי להמשיך בהפעלה.
- בדיקת הסיסמה
ממשק המשתמש קורא לפקודה
voldעם הפקודהcryptfs enablecrypto inplace, כאשרpasswdהיא הסיסמה של מסך הנעילה של המשתמש. - הסרת המסגרת
הפונקציה
voldבודקת אם יש שגיאות, מחזירה -1 אם היא לא מצליחה להצפין, ומדפיסה סיבה ביומן. אם אפשר להצפין, המאפייןvold.decryptמוגדר לערךtrigger_shutdown_framework. כתוצאה מכך,init.rcמפסיק את השירותים בכיתותlate_startו-main. - יצירת כותרת תחתונה עם הצפנה
- יצירת קובץ של נתיב הניווט
- הפעלה מחדש
- זיהוי קובץ של נתיב ניווט
- התחלת ההצפנה
/datavoldואז מגדיר את מיפוי ההצפנה, שיוצר מכשיר וירטואלי של בלוק הצפנה שממופה למכשיר הבלוקים האמיתי, אבל מצפין כל סקטור בזמן הכתיבה ומפענח כל סקטור בזמן הקריאה. voldיוצר וכותב את המטא-נתונים של המטבעות הווירטואליים. - בזמן ההצפנה, טוענים את tmpfs
voldיוצרת נקודת הרכבה של tmpfs/data(באמצעות האפשרויות של tmpfs מתוךro.crypto.tmpfs_options) ומגדירה את המאפייןvold.encrypt_progressל-0. voldמכין את tmpfs/dataלהפעלה של מערכת מוצפנת ומגדיר את המאפייןvold.decryptלערך:trigger_restart_min_framework - הצגת מסגרת לתיאור ההתקדמות
trigger_restart_min_frameworkגורם ל-init.rcלהתחיל את מחלקת השירותיםmain. כשהמסגרת מזהה שהערך שלvold.encrypt_progressהוא 0, היא מציגה את ממשק המשתמש של סרגל ההתקדמות, שמבצע שאילתה לגבי המאפיין הזה כל חמש שניות ומעדכן את סרגל ההתקדמות. הלולאה של ההצפנה מתעדכנתvold.encrypt_progressבכל פעם שהיא מצפינה עוד אחוז מהמחיצה. - כש-
/dataמוצפן, מעדכנים את הכותרת התחתונה של ההצפנהכש
/dataמוצפן בהצלחה,voldמסיר את הסימון של הדגלENCRYPTION_IN_PROGRESSבמטא-נתונים.כשהמכשיר נפתח בהצלחה, הסיסמה משמשת להצפנת המפתח הראשי, והכותרת התחתונה של ההצפנה מתעדכנת.
אם האתחול מחדש נכשל מסיבה כלשהי,
voldמגדיר את המאפייןvold.encrypt_progressלערךerror_reboot_failed, ובממשק המשתמש תוצג הודעה שבה המשתמש מתבקש ללחוץ על לחצן כדי לבצע אתחול מחדש. לא צפוי שזה יקרה.
הפעלה של מכשיר מוצפן עם הצפנה שמוגדרת כברירת מחדל
זה מה שקורה כשמפעילים מכשיר מוצפן ללא סיסמה. מכשירי Android מגרסה 5.0 מוצפנים בהפעלה הראשונה, ולכן לא אמורה להיות סיסמה מוגדרת, וזהו מצב ההצפנה שמוגדרת כברירת מחדל.
- זיהוי של
/dataמוצפנים ללא סיסמההמערכת מזהה שהמכשיר מוצפן כי אי אפשר לטעון את
/dataומוגדר אחד מהדגליםencryptableאוforceencrypt.
voldמגדיר אתvold.decryptל-trigger_default_encryption, וכך מתחיל את השירותdefaultcrypto. trigger_default_encryptionבודקים את סוג ההצפנה כדי לראות אם/dataמוצפן עם סיסמה או בלי סיסמה. - Decrypt /data
יוצר את מכשיר
dm-cryptמעל מכשיר החסימה, כך שהמכשיר מוכן לשימוש. - טעינת /data
voldואז מפעיל את המחיצה האמיתית/dataשפוענחה ואז מכין את המחיצה החדשה. הוא מגדיר את המאפייןvold.post_fs_data_doneל-0 ואז מגדיר אתvold.decryptל-trigger_post_fs_data. בעקבות זאת, הפקודות שלpost-fs-dataמופעלות ב-init.rc. הם יוצרים את כל הספריות או הקישורים הנדרשים ואז מגדירים אתvold.post_fs_data_doneל-1.אחרי ש-
voldמזהה את הערך 1 במאפיין הזה, הוא מגדיר את המאפייןvold.decryptלערך:trigger_restart_framework.. כתוצאה מכך,init.rcמתחיל להפעיל מחדש את השירותים בכיתהmain, וגם מתחיל להפעיל את השירותים בכיתהlate_startבפעם הראשונה מאז האתחול. - הפעלת מסגרת
עכשיו המסגרת מפעילה את כל השירותים שלה באמצעות
/dataשפוענח, והמערכת מוכנה לשימוש.
הפעלה של מכשיר מוצפן ללא הצפנה שמוגדרת כברירת מחדל
זה מה שקורה כשמפעילים מכשיר מוצפן עם סיסמה מוגדרת. הסיסמה של המכשיר יכולה להיות קוד אימות, קו ביטול נעילה או סיסמה.
- זיהוי מכשיר מוצפן עם סיסמה
לזהות שמכשיר Android מוצפן כי הדגל
ro.crypto.state = "encrypted"voldמגדיר אתvold.decryptל-trigger_restart_min_frameworkכי/dataמוצפן באמצעות סיסמה. - Mount tmpfs
initמגדיר חמישה מאפיינים לשמירת אפשרויות ההרכבה הראשוניות שצוינו עבור/dataעם פרמטרים שהועברו מ-init.rc.voldמשתמש במאפיינים האלה כדי להגדיר את מיפוי ההצפנה:ro.crypto.fs_typero.crypto.fs_real_blkdevro.crypto.fs_mnt_pointro.crypto.fs_optionsro.crypto.fs_flags(מספר הקסדצימלי בן 8 הספרות ב-ASCII, שקודם לו 0x)
- הפעלת מסגרת להצגת בקשה להזנת סיסמה
המסגרת מופעלת ורואה שהערך של
vold.decryptמוגדר ל-trigger_restart_min_framework. ההגדרה הזו מציינת למסגרת שהיא מופעלת בדיסק tmpfs/dataושהיא צריכה לקבל את סיסמת המשתמש.אבל קודם צריך לוודא שהדיסק הוצפן בצורה תקינה. היא שולחת את הפקודה
cryptfs cryptocompleteאלvold. הפונקציהvoldמחזירה 0 אם ההצפנה הושלמה בהצלחה, -1 אם הייתה שגיאה פנימית או -2 אם ההצפנה לא הושלמה בהצלחה. voldקובע את זה על ידי בדיקה של דגלCRYPTO_ENCRYPTION_IN_PROGRESSבמטא-נתונים של ההצפנה. אם היא מוגדרת, סימן שהייתה הפרעה לתהליך ההצפנה ואין נתונים שמישים במכשיר. אם הפקודהvoldמחזירה שגיאה, בממשק המשתמש צריכה להופיע הודעה למשתמש להפעיל מחדש את המכשיר ולאפס אותו להגדרות המקוריות, וצריך להיות לחצן שאפשר ללחוץ עליו כדי לעשות זאת. - פענוח נתונים באמצעות סיסמה
אחרי ש-
cryptfs cryptocompleteיסתיים בהצלחה, יוצג בממשק המשתמש של המסגרת חלון עם בקשה להזין את הסיסמה של הדיסק. ממשק המשתמש בודק את הסיסמה על ידי שליחת הפקודהcryptfs checkpwאלvold. אם הסיסמה נכונה (הסיסמה נקבעת על ידי טעינה מוצלחת של/dataמפוענח במיקום זמני, ואז ביטול הטעינה שלו),voldשומר את השם של התקן הבלוק המפוענח במאפייןro.crypto.fs_crypto_blkdevומחזיר סטטוס 0 לממשק המשתמש. אם הסיסמה שגויה, הפונקציה מחזירה -1 לממשק המשתמש. - Stop framework
ממשק המשתמש מציג גרפיקה של אתחול מוצפן ואז קורא ל-
voldעם הפקודהcryptfs restart. הקודvoldמגדיר את המאפייןvold.decryptלערךtrigger_reset_main, וכתוצאה מכךinit.rcמבצעclass_reset main. הפעולה הזו מפסיקה את כל השירותים בכיתה הראשית, וכך מאפשרת לבטל את הטעינה של tmpfs/data. - Mount
/dataלאחר מכן,
voldמטמיע את מחיצת/dataהאמיתית שפוענחה ומכין את המחיצה החדשה (יכול להיות שהיא לא הוכנה אף פעם אם היא הוצפנה באמצעות האפשרות 'מחיקה', שלא נתמכת בגרסה הראשונה). הוא מגדיר את המאפייןvold.post_fs_data_doneל-0 ואז מגדיר אתvold.decryptל-trigger_post_fs_data. כתוצאה מכך,init.rcמריץ את הפקודותpost-fs-dataשלו. הם יוצרים את הספריות או הקישורים הנדרשים ואז מגדירים אתvold.post_fs_data_doneל-1. כש-voldרואה את הערך 1 במאפיין הזה, הוא מגדיר את המאפייןvold.decryptלערךtrigger_restart_framework. כתוצאה מכך,init.rcיתחיל שוב את השירותים בכיתהmainוגם יתחיל את השירותים בכיתהlate_startבפעם הראשונה מאז האתחול. - התחלת השימוש ב-Framework מלא
עכשיו המסגרת מפעילה את כל השירותים שלה באמצעות מערכת הקבצים המפוענחת
/dataוהמערכת מוכנה לשימוש.
נכשלה
יכולות להיות כמה סיבות לכך שמכשיר לא מצליח לפענח את הנתונים. המכשיר מתחיל עם סדרת השלבים הרגילה לאתחול:
- זיהוי מכשיר מוצפן באמצעות סיסמה
- טעינת tmpfs
- התחלת מסגרת להצגת בקשה להזנת סיסמה
אבל אחרי שהמסגרת נפתחת, יכול להיות שיתרחשו במכשיר כמה שגיאות:
- הסיסמה תואמת אבל אי אפשר לפענח את הנתונים
- המשתמש מזין סיסמה שגויה 30 פעמים
אם השגיאות האלה לא נפתרות, מבקשים מהמשתמש לאפס את המכשיר להגדרות המקוריות:
אם vold מזהה שגיאה במהלך תהליך ההצפנה, ואם עדיין לא נמחקו נתונים והמסגרת פעילה, vold מגדיר את המאפיין vold.encrypt_progress לערך error_not_encrypted.
בממשק המשתמש מוצגת למשתמש הנחיה להפעיל מחדש את המחשב והתראה על כך שתהליך ההצפנה לא התחיל אף פעם. אם השגיאה מתרחשת אחרי שהמסגרת נסגרת, אבל לפני שממשק המשתמש של סרגל ההתקדמות מוצג, vold מפעיל מחדש את המערכת. אם ההפעלה מחדש נכשלת, הפונקציה מגדירה את vold.encrypt_progress ל-error_shutting_down ומחזירה -1, אבל לא יהיה שום דבר שיקבל את השגיאה. זה לא אמור לקרות.
אם vold מזהה שגיאה במהלך תהליך ההצפנה, הוא מגדיר את vold.encrypt_progress לערך error_partially_encrypted ומחזיר את הערך -1. בממשק המשתמש תוצג הודעה שההצפנה נכשלה, ויוצג כפתור שמאפשר למשתמש לאפס את המכשיר להגדרות המקוריות.
אחסון המפתח המוצפן
המפתח המוצפן מאוחסן במטא-נתונים של ההצפנה. הגיבוי בחומרה מיושם באמצעות יכולת החתימה של סביבת מחשוב אמינה (TEE). בעבר, הצפנו את מפתח המאסטר באמצעות מפתח שנוצר על ידי החלת scrypt על הסיסמה של המשתמש והמלח המאוחסן. כדי שהמפתח יהיה עמיד בפני מתקפות מחוץ לתיבה, אנחנו מרחיבים את האלגוריתם הזה על ידי חתימה על המפתח שמתקבל באמצעות מפתח TEE מאוחסן. לאחר מכן, החתימה שמתקבלת הופכת למפתח באורך המתאים על ידי יישום נוסף של scrypt. לאחר מכן המפתח הזה משמש להצפנה ולפענוח של מפתח המאסטר. כדי לאחסן את המפתח הזה:
- יצירת מפתח הצפנה רנדומלי לדיסק (DEK) באורך 16 בייט ומלח באורך 16 בייט.
- מחילים scrypt על סיסמת המשתמש ועל ה-salt כדי ליצור מפתח ביניים 1 (IK1) בגודל 32 בייט.
- מוסיפים ל-IK1 אפסים עד לגודל של המפתח הפרטי שקשור לחומרה (HBK). באופן ספציפי, הריפוד הוא: 00 || IK1 || 00..00; אפס אחד בבייט, 32 בייטים של IK1, 223 אפסים בבייטים.
- חותמים על IK1 עם ריפוד באמצעות HBK כדי ליצור IK2 בגודל 256 בייט.
- מחילים scrypt על IK2 ומלח (אותו מלח כמו בשלב 2) כדי ליצור IK3 בגודל 32 בייט.
- משתמשים ב-16 הבייטים הראשונים של IK3 כ-KEK וב-16 הבייטים האחרונים כ-IV.
- הצפנה של DEK באמצעות AES_CBC, עם מפתח KEK ווקטור אתחול IV.
שינוי הסיסמה
כשמשתמש בוחר לשנות או להסיר את הסיסמה שלו בהגדרות, ממשק המשתמש שולח את הפקודה cryptfs changepw אל vold, ו-vold מצפין מחדש את מפתח הראשי של הדיסק באמצעות הסיסמה החדשה.
מאפייני הצפנה
vold ו-init מתקשרים ביניהם באמצעות הגדרת מאפיינים. הנה רשימה של מאפיינים זמינים להצפנה.
מאפייני נפח
| נכס | תיאור |
|---|---|
vold.decrypt trigger_encryption |
להצפין את הכונן ללא סיסמה. |
vold.decrypt trigger_default_encryption |
בודקים את הכונן כדי לראות אם הוא מוצפן ללא סיסמה.
אם כן, מבטלים את ההצפנה ומפעילים אותו,
אחרת מגדירים את vold.decrypt ל-trigger_restart_min_framework. |
vold.decrypt trigger_reset_main |
ההגדרה הזו מוגדרת על ידי vold כדי לכבות את ממשק המשתמש שמבקש את סיסמת הדיסק. |
vold.decrypt trigger_post_fs_data |
ההגדרה מתבצעת על ידי vold כדי להכין את /data עם הספריות הנדרשות וכו'. |
vold.decrypt trigger_restart_framework |
מוגדר על ידי vold כדי להפעיל את המסגרת האמיתית ואת כל השירותים. |
vold.decrypt trigger_shutdown_framework |
מוגדר על ידי vold כדי לכבות את המסגרת המלאה ולהתחיל בהצפנה. |
vold.decrypt trigger_restart_min_framework |
הערך מוגדר על ידי vold כדי להפעיל את ממשק המשתמש של סרגל ההתקדמות להצפנה או כדי להציג בקשה להזנת סיסמה, בהתאם לערך של ro.crypto.state. |
vold.encrypt_progress |
כשהמסגרת מתחילה לפעול, אם המאפיין הזה מוגדר, המערכת נכנסת למצב ממשק משתמש של סרגל התקדמות. |
vold.encrypt_progress 0 to 100 |
בממשק המשתמש של סרגל ההתקדמות צריך להופיע ערך האחוז שהוגדר. |
vold.encrypt_progress error_partially_encrypted |
בממשק המשתמש של סרגל ההתקדמות צריכה להופיע הודעה על כך שההצפנה נכשלה, וצריכה להיות למשתמש אפשרות לאפס את המכשיר להגדרות המקוריות. |
vold.encrypt_progress error_reboot_failed |
בממשק המשתמש של סרגל ההתקדמות צריכה להופיע הודעה שאומרת שההצפנה הושלמה, וצריך להיות כפתור שמאפשר למשתמש להפעיל מחדש את המכשיר. השגיאה הזו לא אמורה לקרות. |
vold.encrypt_progress error_not_encrypted |
בממשק המשתמש של סרגל ההתקדמות צריכה להופיע הודעה שאומרת שהתרחשה שגיאה, שלא בוצע הצפנה של נתונים ולא אבדו נתונים, וצריך להיות לחצן שמאפשר למשתמש להפעיל מחדש את המערכת. |
vold.encrypt_progress error_shutting_down |
ממשק המשתמש של סרגל ההתקדמות לא פועל, ולכן לא ברור מי מגיב לשגיאה הזו. בכל מקרה, זה לא אמור לקרות. |
vold.post_fs_data_done 0 |
הוגדרה על ידי vold ממש לפני ההגדרה של vold.decrypt
לערך trigger_post_fs_data. |
vold.post_fs_data_done 1 |
מגדירים את התזכורת init.rc או init.rc מיד אחרי שמסיימים את המשימה post-fs-data. |
מאפייני init
| נכס | תיאור |
|---|---|
ro.crypto.fs_crypto_blkdev |
מוגדר על ידי הפקודה vold checkpw לשימוש מאוחר יותר על ידי הפקודה vold restart. |
ro.crypto.state unencrypted |
הוגדר על ידי init כדי לציין שהמערכת הזו פועלת עם /data ro.crypto.state encrypted לא מוצפן. ההגדרה נקבעה על ידי init כדי לציין
שהמערכת הזו פועלת עם /data מוצפן. |
|
חמשת המאפיינים האלה מוגדרים על ידי init כשהוא מנסה לטעון את /data עם פרמטרים שמועברים מ-init.rc. vold משתמש בהם כדי להגדיר את מיפוי ההצפנה. |
ro.crypto.tmpfs_options |
המשתנה מוגדר על ידי init.rc עם האפשרויות שצריך להשתמש בהן כשמטעינים את מערכת הקבצים /data tmpfs. |
פעולות init
on post-fs-data on nonencrypted on property:vold.decrypt=trigger_reset_main on property:vold.decrypt=trigger_post_fs_data on property:vold.decrypt=trigger_restart_min_framework on property:vold.decrypt=trigger_restart_framework on property:vold.decrypt=trigger_shutdown_framework on property:vold.decrypt=trigger_encryption on property:vold.decrypt=trigger_default_encryption