Adiantum היא שיטת הצפנה שמיועדת למכשירים עם Android מגרסה 9 ואילך, שמעבדי ה-CPU שלהם לא כוללים הוראות AES. אם אתם שולחים מכשיר מבוסס-ARM עם תוספי הצפנה ARMv8 או מכשיר מבוסס-x86 עם AES-NI, אל תשתמשו ב-Adiantum. הצפנת AES מהירה יותר בפלטפורמות האלה.
במכשירים שחסרות בהם הוראות מעבד AES, Adiantum מספק הצפנה במכשיר עם תקורה נמוכה מאוד של ביצועים. למספרי השוואה, אפשר לעיין במאמר בנושא Adiantum. כדי להריץ את מקור ההשוואה על החומרה שלכם, אפשר לעיין במקור Adiantum ב-GitHub.
כדי להפעיל את Adiantum במכשיר עם Android מגרסה 9 ואילך, צריך לבצע שינויים בליבה ובמרחב המשתמש.
שינויים בליבה
Adiantum נתמך בליבות הנפוצות של Android, מגרסה 4.9 ואילך.
אם ליבת המכשיר שלכם לא תומכת כבר ב-Adiantum, השתמשו בקוד מהסתעפות אחרת (Cherry-picking) מהשינויים שמופיעים בהמשך. אם נתקלתם בבעיות בבחירת תיקונים ספציפיים, במכשירים שמשתמשים בהצפנה מלאה של הדיסק (FDE) אפשר להחריג את תיקון fscrypt: .
| גרסת ליבה | תיקונים של הצפנה ו-fscrypt | dm-crypt patch |
|---|---|---|
| 4.19 | 4.19 kernel | dm-crypt patch
|
| 4.14 | 4.14 kernel | dm-crypt patch
|
| 4.9 | 4.9 kernel | dm-crypt patch
|
הפעלת Adiantum בקרנל
Android מגרסה 11 ואילך
אם המכשיר מופעל עם Android 11 או גרסה מתקדמת יותר, צריך להפעיל את ההגדרות הבאות בקובץ ההגדרות של ליבת המכשיר:
CONFIG_CRYPTO_ADIANTUM=y CONFIG_FS_ENCRYPTION=y CONFIG_BLK_INLINE_ENCRYPTION=y CONFIG_BLK_INLINE_ENCRYPTION_FALLBACK=y CONFIG_FS_ENCRYPTION_INLINE_CRYPT=y CONFIG_DM_DEFAULT_KEY=y
אם במכשיר פועל ליבת ARM 32 ביט, צריך גם להפעיל הוראות NEON כדי לשפר את הביצועים:
CONFIG_KERNEL_MODE_NEON=y CONFIG_CRYPTO_AES_ARM=y CONFIG_CRYPTO_CHACHA20_NEON=y CONFIG_CRYPTO_NHPOLY1305_NEON=y
Android מגרסה 9 עד 10
אם המכשיר מופעל עם Android 9 או 10, צריך להגדיר הגדרות שונות מעט של תצורת ליבת המערכת. מפעילים את ההגדרות הבאות:
CONFIG_CRYPTO_ADIANTUM=y CONFIG_DM_CRYPT=y
אם במכשיר שלכם נעשה שימוש בהצפנה מבוססת-קבצים, צריך להפעיל גם את האפשרויות הבאות:
CONFIG_F2FS_FS_ENCRYPTION=y
לבסוף, אם במכשיר שלכם פועל ליבת ARM של 32 ביט, צריך להפעיל את הוראות NEON כדי לשפר את הביצועים:
CONFIG_KERNEL_MODE_NEON=y CONFIG_CRYPTO_AES_ARM=y CONFIG_CRYPTO_CHACHA20_NEON=y CONFIG_CRYPTO_NHPOLY1305_NEON=y
שינויים במרחב המשתמש
במכשירים עם Android מגרסה 10 ואילך, השינויים במרחב המשתמש של Adiantum כבר קיימים.
במכשירים עם Android 9, בוחרים את השינויים הבאים:
- cryptfs: Add Adiantum support
- cryptfs: Allow setting dm-crypt sector size
- cryptfs: round down dm-crypt device size to crypto sector boundary
- cryptfs: שיפור הרישום ביומן של יצירת מכשיר dm-crypt
- libfscrypt: הוספת תמיכה ב-Adiantum
- fs_mgr_fstab: Add Adiantum support
הפעלת Adiantum במכשיר
קודם כול, מוודאים שהערך של PRODUCT_SHIPPING_API_LEVEL מוגדר בצורה נכונה כך שיתאים לגרסת Android שמופעלת במכשיר. לדוגמה, במכשיר שמופעל עם Android 11 צריך להיות PRODUCT_SHIPPING_API_LEVEL := 30. זה חשוב כי לחלק מהגדרות ההצפנה יש ערכי ברירת מחדל שונים בגרסאות השקה שונות.
מכשירים עם הצפנה מבוססת-קובץ
כדי להפעיל הצפנה מבוססת-קובץ של Adiantum באחסון הפנימי של המכשיר, מוסיפים את האפשרות הבאה לעמודה האחרונה (העמודה fs_mgr_flags) בשורה של מחיצת userdata בקובץ fstab של המכשיר:
fileencryption=adiantum
אם המכשיר מושק עם Android מגרסה 11 ואילך, צריך גם להפעיל הצפנת מטא-נתונים. כדי להשתמש ב-Adiantum להצפנת מטא-נתונים באחסון הפנימי, הפרמטר fs_mgr_flags של userdata חייב לכלול גם את האפשרויות הבאות:
metadata_encryption=adiantum,keydirectory=/metadata/vold/metadata_encryption
בשלב הבא, מפעילים הצפנת Adiantum באחסון שניתן להתאמה. כדי לעשות זאת, מגדירים את מאפייני המערכת הבאים ב-PRODUCT_PROPERTY_OVERRIDES:
ב-Android מגרסה 11 ואילך:
ro.crypto.volume.options=adiantum ro.crypto.volume.metadata.encryption=adiantum
ב-Android מגרסה 9 ומגרסה 10:
ro.crypto.volume.contents_mode=adiantum ro.crypto.volume.filenames_mode=adiantum ro.crypto.fde_algorithm=adiantum ro.crypto.fde_sector_size=4096
בסוף, אם רוצים, מוסיפים blk-crypto-fallback.num_keyslots=1 לשורת הפקודה של ליבת המערכת. הפעולה הזו מפחיתה מעט את השימוש בזיכרון כשמשתמשים בהצפנת מטא-נתונים של Adiantum. לפני שעושים את זה, מוודאים שאפשרות ההרכבה inlinecryptfstab לא מצוינת.
אם הוא צוין, צריך להסיר אותו, כי הוא לא נחוץ להצפנת Adiantum, והוא גורם לבעיות בביצועים כשמשתמשים בו בשילוב עם blk-crypto-fallback.num_keyslots=1.
כדי לוודא שההטמעה עבדה, יוצרים דוח על באג או מריצים את הפקודה:
adb rootadb shell dmesg
אם Adiantum מופעל בצורה נכונה, אמור להופיע ביומן הליבה:
fscrypt: Adiantum using implementation "adiantum(xchacha12-neon,aes-arm,nhpoly1305-neon)"
אם הפעלתם הצפנה של מטא-נתונים, כדאי להריץ גם את הפקודה הבאה כדי לוודא שההצפנה של מטא-נתונים ב-Adiantum מופעלת בצורה תקינה:
adb rootadb shell dmctl table userdata
השדה השלישי בפלט צריך להיות
xchacha12,aes-adiantum-plain64.
מכשירים עם הצפנה מלאה של הדיסק
כדי להפעיל את Adiantum ולשפר את הביצועים שלו, מגדירים את המאפיינים האלה ב-PRODUCT_PROPERTY_OVERRIDES:
ro.crypto.fde_algorithm=adiantum ro.crypto.fde_sector_size=4096
הגדרה של fde_sector_size ל-4096 משפרת את הביצועים, אבל היא לא נדרשת כדי ש-Adiantum יפעל. כדי להשתמש בהגדרה הזו, מחיצת נתוני המשתמש צריכה להתחיל בהיסטור שמתאים ל-4096 בייטים בדיסק.
ב-fstab, להגדרת נתוני המשתמשים:
forceencrypt=footer
כדי לוודא שההטמעה עבדה, יוצרים דוח על באג או מריצים את הפקודה:
adb rootadb shell dmesg
אם Adiantum מופעל בצורה נכונה, אמור להופיע ביומן הליבה:
device-mapper: crypt: adiantum(xchacha12,aes) using implementation "adiantum(xchacha12-neon,aes-arm,nhpoly1305-neon)"