הצפנה של דיסק מלא

הצפנת דיסק מלא היא התהליך של קידוד כל נתוני המשתמשים במכשיר Android באמצעות מפתח מוצפן. אחרי שהמכשיר מוצפן, כל הנתונים שנוצרו על ידי משתמשים מוצפן באופן אוטומטי לפני שמירתו לדיסק וכל הקריאות תפענחו את הנתונים באופן אוטומטי לפני שתחזירו אותם לתהליך הקריאה.

ב-Android נוספה הצפנת דיסק מלא, אבל היא הושקה ב-Android 5.0. את התכונות החדשות הבאות:

  • יצירה של הצפנה מהירה, שמצפינה רק בלוקים בשימוש במחיצה של הנתונים כדי למנוע שההפעלה הראשונה תימשך זמן רב. רק במערכות קבצים ext4 ו-f2fs תומכים כרגע בהצפנה מהירה.
  • הוספנו את הדגל fstab‏ forceencrypt להצפנה בהפעלה הראשונה.
  • נוספה תמיכה בתבניות ובהצפנה ללא סיסמה.
  • נוספה אחסון של מפתח ההצפנה שמבוסס על חומרה באמצעות יכולת החתימה של סביבת מחשוב אמינה (TEE) (למשל ב-TrustZone). מידע נוסף מופיע במאמר אחסון המפתח המוצפן פרטים.

זהירות: מכשירים שודרגו ל-Android 5.0 ולאחר מכן ניתן להחזיר למצב מוצפן על ידי איפוס לנתוני היצרן. גרסת Android 5.0 חדשה מכשירים שהוצפנו בהפעלה הראשונה לא ניתן להחזיר למצב לא מוצפן.

איך פועלת ההצפנה של דיסק מלא ב-Android

הצפנת הדיסק המלאה של Android מבוססת על dm-crypt, שהיא תכונה של הליבה שפועלת בשכבת מכשיר הבלוק. לכן, ההצפנה פועלת עם Embedded MultiMediaCard‏ (eMMC) ומכשירי פלאש דומים שמציגים את עצמם לליבה כמכשירי בלוק. אי אפשר לבצע הצפנה באמצעות YAFFS, שמדברת ישירות עם צ'יפ פלאש NAND גולמי.

אלגוריתם ההצפנה הוא 128 Advanced Encryption Standard (AES) עם שרשורי הצפנה עם בלוקים (CBC) ו-ESSIV:SHA256. מפתח המאסטר מוצפן באמצעות AES ב-128 ביט דרך קריאות לספריית OpenSSL. צריך להשתמש ב-128 ביט או יותר למפתח (אפשר להשתמש ב-256 ביט).

הערה:יצרני ציוד מקורי יכולים להשתמש בגרסת 128 ביט ומעלה כדי להצפין את מפתח המאסטר.

בגרסה Android 5.0 קיימים ארבעה סוגים של מצבי הצפנה:

  • ברירת מחדל
  • קוד אימות
  • סיסמה
  • קו ביטול נעילה

בהפעלה הראשונה, המכשיר יוצר מפתח ראשי של 128 ביט שנוצר באופן אקראי, ולאחר מכן מבצע עליו גיבוב באמצעות סיסמת ברירת מחדל ומלח ששמור. סיסמת ברירת המחדל היא: "default_password" עם זאת, על ה-hash שנוצר חותמים גם באמצעות TEE (כמו TrustZone), שבו נעשה שימוש ב-hash של החתימה כדי להצפין את מפתח המאסטר.

הסיסמה שמוגדרת כברירת מחדל מופיעה בקובץ cryptfs.cpp בפרויקט Android Open Source.

כשהמשתמש מגדיר קוד אימות/כרטיס או סיסמה במכשיר, רק המפתח של 128 ביט. מוצפן מחדש ומאוחסן. (כלומר, שינויים בקוד האימות/בסיסמאות/בתבניות של המשתמשים לא גורמים להצפנה מחדש של נתוני המשתמש). חשוב לזכור שמכשיר מנוהל עשוי להיות כפוף להגבלות על קוד אימות, קו ביטול נעילה או סיסמה.

ההצפנה מנוהלת על ידי init ו-vold. init קורא ל-vold, והמאפיינים להפעלה אירועים באתחול. חלקים אחרים במערכת לבדוק גם את המאפיינים כדי לבצע משימות כמו סטטוס של דיווח, לבקש או בקשה לאיפוס להגדרות המקוריות במקרה של שגיאה חמורה. להפעלה תכונות הצפנה ב-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.

תהליכים

יש ארבעה תהליכי עבודה במכשיר מוצפן. המכשיר מוצפן רק פעם אחת, ואז מתבצע תהליך הפעלה רגיל.

  • הצפנת מכשיר שלא היה מוצפן בעבר:
    • הצפנת מכשיר חדש באמצעות forceencrypt: הצפנה נדרשת בהפעלה הראשונה (החל מ-Android L).
    • הצפנת מכשיר קיים: הצפנה ביוזמת המשתמש (Android K וגרסאות קודמות).
  • הפעלת מכשיר מוצפן:
    • הפעלת מכשיר מוצפן ללא סיסמה: הפעלת מכשיר מוצפן שלא הוגדרה לו סיסמה (רלוונטי למכשירים עם Android מגרסה 5.0 ואילך).
    • הפעלת מכשיר מוצפן עם סיסמה: אתחול של מכשיר מוצפן הגדיר סיסמה.

בנוסף לתהליכים האלה, המכשיר לא יכול להצפין את /data. כל אחד מהתהליכים מוסבר בפירוט בהמשך.

הצפנת מכשיר חדש באמצעות forceencrypt

זהו הפעלת האתחול הראשונה הרגילה במכשיר Android 5.0.

  1. זיהוי מערכת קבצים לא מוצפנת באמצעות הדגל forceencrypt

    הקובץ /data לא מוצפן, אבל צריך לבצע אותו כי הפקודה forceencrypt מורה על כך. ביטול הטעינה של /data.

  2. התחלת ההצפנה של /data

    vold.decrypt = "trigger_encryption" מפעיל את init.rc, מה שגורם ל-vold להצפין את /data ללא סיסמה. (לא הוגדר כי המכשיר אמור להיות חדש).

  3. Mount tmpfs

    vold מחבר את tmpfs /data (באמצעות אפשרויות tmpfs מ-ro.crypto.tmpfs_options) ומגדיר את המאפיין vold.encrypt_progress לערך 0. השדה vold מכין את קוד האימות /data לאתחול של מערכת מוצפנת, ומגדיר את נכס vold.decrypt ב: trigger_restart_min_framework

  4. הצגת המסגרת כדי להציג את ההתקדמות

    מכיוון שבמכשיר אין כמעט נתונים להצפנה, סרגל ההתקדמות לא יופיע לעיתים קרובות כי ההצפנה מתבצעת במהירות. למידע נוסף על ממשק המשתמש של ההתקדמות, ראו הצפנת מכשיר קיים.

  5. כשהנתונים ב-/data מוצפנים, מסירים את המסגרת

    vold מגדיר את vold.decrypt כ trigger_default_encryption שמתחילה ב שירות defaultcrypto. (הפעולה הזו מפעילה את התהליך שמתואר בהמשך, שבו מטעינים את נתוני ה-userdata המוצפנים שמוגדרים כברירת מחדל). trigger_default_encryption בודק את סוג ההצפנה כדי לבדוק אם /data מוצפן עם או בלי סיסמה. מכיוון שמכשירי Android 5.0 מוצפנים בהפעלה הראשונה, צריך לא הוגדרה סיסמה, לכן אנחנו מפענחים וטוענים את /data.

  6. טעינה /data

    לאחר מכן init טוענת את /data ב-RAMDisk של tmpfs פרמטרים שהיא אוספת מ-ro.crypto.tmpfs_options, שמוגדר ב-init.rc.

  7. התחלת מסגרת

    vold מגדיר את vold.decrypt לערך trigger_restart_framework, וכך ממשיך תהליך האתחול הרגיל.

הצפנת מכשיר קיים

זה מה שקורה כשאתם מצפינים מכשיר Android K או קודם לכן, לא מוצפן, שהועתק לגרסה L.

התהליך הזה מופעל ביוזמת המשתמש והוא נקרא 'הצפנה במקום' בקוד. כשמשתמש בוחר להצפין מכשיר, ממשק המשתמש מוודא הסוללה טעונה במלואה ומתאם ה-AC מחובר, כך שיש מספיק כוח כדי לסיים את תהליך ההצפנה.

אזהרה: אם סוללת המכשיר מתרוקנת והוא ייכבה לפני שהוא הסתיים בזמן ההצפנה, נתוני הקובץ נשארים במצב מוצפן חלקית. המכשיר צריך יתבצע איפוס להגדרות המקוריות וכל הנתונים יאבדו.

כדי להפעיל הצפנה במקום, vold מפעיל לולאה כדי לקרוא כל אחד מהם של התקן הבלוק האמיתי, ואז לכתוב למכשיר לבלוקים וירטואליים. vold בודק אם מגזר מסוים נמצא לשימוש לפני קריאה וכתיבה, להצפין מהר יותר במכשיר חדש שאין בו מספיק נתונים או שאין בו נתונים בכלל.

מצב המכשיר: מגדירים את ro.crypto.state = "unencrypted" ומפעילים את הטריגר on nonencrypted init כדי להמשיך את האתחול.

  1. בדיקת הסיסמה

    ממשק המשתמש מפעיל את הפקודה vold באמצעות הפקודה cryptfs enablecrypto inplace כאשר passwd הוא הסיסמה של המשתמש במסך הנעילה.

  2. הסרת המסגרת

    vold בודקת אם יש שגיאות, מחזירה -1 אם לא ניתן להצפין ומדפיסה את הסיבה ביומן. אם הוא יכול להצפין, הוא מגדיר את הנכס vold.decrypt לערך trigger_shutdown_framework. כתוצאה מכך, init.rc יפסיק את השירותים בקטגוריות late_start ו-main.

  3. יצירת כותרת תחתונה של מטבעות וירטואליים
  4. יצירת קובץ נתיב ניווט
  5. הפעלה מחדש
  6. זיהוי קובץ נתיב ניווט
  7. התחלת ההצפנה של /data

    לאחר מכן, vold מגדיר את מיפוי הקריפטו, שיוצר מכשיר וירטואלי של בלוקים קריפטוגרפיים שממופה למכשיר הבלוקים האמיתי, אבל מצפין כל מגזר בזמן הכתיבה ומפענח כל מגזר בזמן הקריאה. לאחר מכן, vold יוצר את המטא-נתונים של הקריפטו וכותב אותם.

  8. בזמן ההצפנה, צריך לטעון את tmpf

    vold טוען tmpfs /data (באמצעות אפשרויות tmpfs מ-ro.crypto.tmpfs_options) ומגדיר את המאפיין vold.encrypt_progress ל-0. vold מכין את tmpfs‏/data להפעלה של מערכת מוצפנת ומגדיר את המאפיין vold.decrypt לערך: trigger_restart_min_framework

  9. הצגת המסגרת כדי להציג את ההתקדמות

    trigger_restart_min_framework גורם ל-init.rc להפעיל את סוג השירותים main. כשהמסגרת מזהה שהערך של vold.encrypt_progress מוגדר כ-0, היא מציגה את ממשק המשתמש של סרגל ההתקדמות, שמבצע שאילתה על המאפיין הזה כל חמש שניות ומעדכן את סרגל ההתקדמות. לולאת ההצפנה מתעדכנת vold.encrypt_progress בכל פעם מצפין אחוז נוסף מהמחיצה.

  10. כשהמזהה /data מוצפן, צריך לעדכן את הכותרת התחתונה של ההצפנה

    כשהצפנת /data מסתיימת, vold מנקה את הדגל ENCRYPTION_IN_PROGRESS במטא-נתונים.

    לאחר שנעילת המכשיר מתבטלת בהצלחה, הסיסמה משמשת כדי להצפין את מפתח המאסטר והכותרת התחתונה של ההצפנה מתעדכנת.

    אם ההפעלה מחדש נכשלת מסיבה כלשהי, vold מגדיר את המאפיין vold.encrypt_progress לערך error_reboot_failed, ובממשק המשתמש אמורה להופיע הודעה שמבקשת מהמשתמש ללחוץ על לחצן כדי להפעיל מחדש. לא צפוי מצב כזה.

איך מפעילים מכשיר מוצפן עם הצפנה כברירת מחדל

זה מה שקורה כשמפעילים מכשיר מוצפן ללא סיסמה. מכיוון שמכשירי Android 5.0 מוצפנים בהפעלה הראשונה, לא אמורה להיות הגדרה ולכן זהו מצב ברירת המחדל להצפנה.

  1. זיהוי /data מוצפן ללא סיסמה

    אני רוצה לזהות שמכשיר Android מוצפן כי /data אחד מהדגלים encryptable או שלא ניתן לטעון אותו, forceencrypt מוגדר.

    הפונקציה vold מגדירה את הערך של vold.decrypt בתור trigger_default_encryption, שמפעיל את השירות defaultcrypto. trigger_default_encryption בודק את סוג ההצפנה כדי לראות אם /data מוצפן עם או ללא סיסמה.

  2. פענוח /נתונים

    יצירת המכשיר dm-crypt מעל מכשיר הבלוק, כדי שהמכשיר יהיה מוכן לשימוש.

  3. טעינה של ‎/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 בפעם הראשונה מאז האתחול.

  4. מסגרת התחלה

    עכשיו המסגרת מפעילה את כל השירותים שלה באמצעות /data המוצפן, והמערכת מוכנה לשימוש.

הפעלת מכשיר מוצפן ללא הצפנת ברירת מחדל

זה מה שקורה כשמפעילים מכשיר מוצפן שיש לו סיסמה. הסיסמה של המכשיר יכולה להיות קוד אימות, קו ביטול נעילה או סיסמה.

  1. זיהוי מכשיר מוצפן באמצעות סיסמה

    זיהוי שמכשיר Android מוצפן מפני שהדגל ro.crypto.state = "encrypted"

    vold מגדיר את vold.decrypt כ-trigger_restart_min_framework כי /data מוצפן באמצעות סיסמה.

  2. Mount tmpfs

    init מגדיר חמישה מאפיינים לשמירת אפשרויות הטעינה הראשוניות נתון עבור /data עם פרמטרים שהועברו מ-init.rc. vold משתמש במאפיינים הבאים כדי להגדיר את מיפוי הקריפטו:

    1. ro.crypto.fs_type
    2. ro.crypto.fs_real_blkdev
    3. ro.crypto.fs_mnt_point
    4. ro.crypto.fs_options
    5. ro.crypto.fs_flags (מספר הקסדצימלי בן 8 ספרות של ASCII שלפני 0x)
  3. הפעלת המסגרת כדי להציג בקשה להזנת סיסמה

    ה-framework מתחיל לפעול ומזהה שהערך של vold.decrypt מוגדר trigger_restart_min_framework. זה אומר ל-framework שמופעלת בדיסק tmpfs /data וצריך לקבל את סיסמת המשתמש.

    עם זאת, קודם צריך לוודא שהדיסק הוצפן בצורה תקינה. הוא שולח את הפקודה cryptfs cryptocomplete אל vold. הפונקציה vold מחזירה את הערך 0 אם ההצפנה הושלמה, את הערך -1 אם הייתה שגיאה פנימית או את הערך -2 אם ההצפנה לא הושלמה. vold קובע זאת על ידי חיפוש הדגל CRYPTO_ENCRYPTION_IN_PROGRESS במטא-נתונים של הקריפטו. אם היא מוגדרת, תהליך ההצפנה נקטע ואין שאפשר להשתמש בהם במכשיר. אם הפונקציה vold מחזירה שגיאה, ממשק המשתמש להציג הודעה למשתמש שעליו להפעיל מחדש את המכשיר ולאפס אותו להגדרות המקוריות, ולספק למשתמש צריך ללחוץ על לחצן כדי לעשות זאת.

  4. הצפנת הנתונים באמצעות סיסמה

    אחרי ביצוע של cryptfs cryptocomplete בהצלחה, ה-framework מציג ממשק משתמש שמבקש את סיסמת הדיסק. ממשק המשתמש בודק את הסיסמה על ידי שולח את הפקודה cryptfs checkpw אל vold. אם נכונה (שנקבעת לאחר טעינה מוצלחת של /data פוענח במיקום זמני ולאחר מכן מנתק אותו), השם של מכשיר הבלוק המפוענח בנכס המפוענח נשמר על ידי vold ro.crypto.fs_crypto_blkdev ומחזירה את הסטטוס 0 לממשק המשתמש. אם הסיסמה שגויה, היא מחזירה לממשק המשתמש את המספר 1.

  5. הפסקת המסגרת

    בממשק המשתמש מוצגת גרפיקה של אתחול קריפטוגרפיה, ולאחר מכן מתבצעת קריאה ל-vold עם הפקודה cryptfs restart. המאפיין vold מוגדר vold.decrypt עד trigger_reset_main, וזו הסיבה init.rc כדי לבצע class_reset main. הפעולה הזו תפסיק את כל השירותים במחלקה הראשית, וכך ניתן לנתק את הטעינה של /data ה-tmpf.

  6. טעינה /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 מפעיל שוב את השירותים ב-class main, וגם מפעיל את השירותים ב-class late_start בפעם הראשונה מאז האתחול.

  7. התחלת המסגרת המלאה

    עכשיו ה-framework מפעיל את כל השירותים שלה באמצעות /data המפוענח והמערכת מוכנה לשימוש.

נכשלה

יכולות להיות כמה סיבות לכך שמכשיר לא מצליח לפענח. המכשיר מתחיל בסדרת השלבים הרגילה לאתחול:

  1. זיהוי מכשיר מוצפן עם סיסמה
  2. טעינה של tmpfs
  3. הפעלת המסגרת להצגת בקשה להזנת סיסמה

אבל אחרי שהמסגרת נפתחת, יכולות להתרחש במכשיר כמה שגיאות:

  • הסיסמה תואמת אבל לא ניתן לפענח את הנתונים
  • המשתמש מזין סיסמה שגויה 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 לסיסמה של המשתמש ולנתוני ה-salt המאוחסנים. כדי שהמפתח יהיה עמיד במתקפות מחוץ לקופסה, אנחנו מרחיבים את האלגוריתם הזה על ידי חתימה על המפתח שנוצר באמצעות מפתח TEE מאוחסן. לאחר מכן, החתימה המתקבלת הופכת למפתח באורך מתאים באמצעות שימוש נוסף ב-Scrypt. לאחר מכן, המפתח הזה משמש להצפנה ולפענוח של מפתח המאסטר. כדי לאחסן את המפתח הזה:

  1. יצירת מפתח להצפנת דיסק (DEK) ורנדום של 16 בייטים ומלח של 16 בייטים.
  2. מחילים את scrypt על הסיסמה של המשתמש ועל המלח כדי ליצור מפתח ביניים 1 (IK1) באורך 32 בייטים.
  3. Pad IK1 עם אפס בייטים לגודל המפתח הפרטי המקושר לחומרה (HBK). באופן ספציפי, אנחנו מוסיפים את הנתונים הבאים: 00 || IK1 || 00..00; בייט אחד של אפס, 32 בייטים של IK1, 223 בייטים של אפס.
  4. שלחו IK1 מרופד עם HBK כדי להפיק IK2 של 256 בייט.
  5. מחילים scrypt על IK2 ו-salt (אותו המלח כמו בשלב 2) כדי ליצור IK3 32 בייטים.
  6. משתמשים ב-16 הביטים הראשונים של IK3 בתור KEK וב-16 הביטים האחרונים בתור IV.
  7. הצפנת DEK באמצעות AES_CBC, עם מפתח KEK ווקטור אתחול IV.

שינוי הסיסמה

כשמשתמש בוחר לשנות או להסיר את הסיסמה שלו בהגדרות, ממשק המשתמש שולח הפקודה cryptfs changepw אל vold, vold מצפין מחדש את מפתח המאסטר של הדיסק באמצעות הסיסמה החדשה.

מאפייני הצפנה

vold ו-init מתקשרים זה עם זה באמצעות הגדרת מאפיינים. בהמשך מופיעה רשימה של מאפיינים זמינים להצפנה.

מאפייני Vold

נכס תיאור
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 כדי להפעיל את ה-framework האמיתי וכל השירותים.
vold.decrypt trigger_shutdown_framework יש להגדיר ב-vold כדי לכבות את ה-framework המלא כדי להתחיל בהצפנה.
vold.decrypt trigger_restart_min_framework מוגדר ב-vold כדי להפעיל את ממשק המשתמש של סרגל ההתקדמות להצפנה בקשה לסיסמה, בהתאם הערך של ro.crypto.state.
vold.encrypt_progress כשה-framework מתחיל, אם המאפיין הזה מוגדר, מזינים את מצב ממשק המשתמש של סרגל ההתקדמות.
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.

מאפייני אתחול

נכס תיאור
ro.crypto.fs_crypto_blkdev מוגדר על ידי הפקודה vold checkpw לשימוש מאוחר יותר באמצעות הפקודה vold restart.
ro.crypto.state unencrypted הוגדר על ידי init כדי לציין שהמערכת הזו פועלת עם שרת לא מוצפן /data ro.crypto.state encrypted. מוגדר על ידי init כדי לומר המערכת הזו פועלת עם /data מוצפן.

ro.crypto.fs_type
ro.crypto.fs_real_blkdev
ro.crypto.fs_mnt_point
ro.crypto.fs_options
ro.crypto.fs_flags

חמשת הנכסים האלה מוגדרים על ידי init כשמתבצע ניסיון לטעון את /data עם פרמטרים שמועברים מ- init.rc. vold משתמש בהם כדי להגדיר את מיפוי הקריפטו.
ro.crypto.tmpfs_options המשתנה מוגדר על ידי init.rc עם האפשרויות ש-init צריכה להשתמש בהן כשטעינה את מערכת הקבצים /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