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

הצפנת הדיסק במלואו היא תהליך של קידוד כל נתוני המשתמש במכשיר 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. מפתח המאסטר מוצפן באמצעות AES של 128 ביט דרך קריאות לספריית 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.

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

    /data לא מוצפן אבל צריך להיות מוצפן כי forceencrypt מחייב זאת. ביטול ההצבה /data.

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

    vold.decrypt = "trigger_encryption" triggers init.rc, which causes vold to encrypt /data with no password. (לא מוגדר כלום כי זה אמור להיות מכשיר חדש).

  3. Mount tmpfs

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

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

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

  5. When /data is encrypted, take down the framework

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

  6. Mount /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. בזמן ההצפנה, טוענים את tmpfs

    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 מוצפנים ללא סיסמה

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

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

  2. Decrypt /data

    יוצר את מכשיר dm-crypt מעל מכשיר החסימה, כך שהמכשיר מוכן לשימוש.

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

  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. הפעלת מסגרת להצגת בקשה להזנת סיסמה

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

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

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

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

  5. Stop framework

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

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

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

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

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

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 עם האפשרויות שצריך להשתמש בהן כשמטעינים את מערכת הקבצים /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