啟用 adiantum

Adiantum 是一種加密方法,專為搭載 Android 9 以上版本的裝置設計,且 CPU 的 CPU 缺少 AES 指令。如果您要運送的 ARM 型裝置採用 ARMv8 加密編譯擴充功能,或採用 AES-NI 的 x86 型裝置,則不應使用 Adiantum。AES 在這些平台上的速度較快。

對於缺少這些 AES CPU 指令的裝置,Adiantum 會在裝置上提供加密功能,且不會造成太多效能開銷。如需基準化數字,請參閱 Adiantum 文件。如要取得在硬體上執行的基準測試來源,請參閱 GitHub 上的 Adiantum 來源

如要在搭載 Android 9 以上版本的裝置上啟用 Adiantum,您需要進行核心變更和使用者空間變更。

核心變更

Android 通用核心 4.9 以上版本支援 Adiantum。

如果裝置的核心尚未支援 Adiantum,請選擇性採用下列變更。如果無法挑選成功,使用全磁碟加密 (FDE) 的裝置可以排除 fscrypt: 修補程式。

核心版本 Crypto 和 fscrypt 修補程式 dm-crypt 個修補程式
4.19 4.19 核心 dm-crypt 修補程式
4.14 4.14 核心 dm-crypt 修補程式
4.9 4.9 核心 dm-crypt 修補程式

在核心中啟用 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

如果您的裝置執行的是 32 位元 ARM 核心,請同時啟用 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

最後,如果您的裝置執行的是 32 位元 ARM 核心,請啟用 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 的裝置,請挑選下列變更:

在裝置中啟用 Adiantum

首先,請確認裝置的 PRODUCT_SHIPPING_API_LEVEL 設定正確無誤,以符合啟動時的 Android 版本。舉例來說,推出時搭載 Android 11 的裝置必須有 PRODUCT_SHIPPING_API_LEVEL := 30。這點很重要,因為部分加密設定在不同發布版本中具有不同的預設值。

採用檔案式加密機制的裝置

如要在裝置的內部儲存空間中啟用 Adiantum 檔案式加密功能,請在裝置 fstab 檔案中 userdata 分區的資料列最後一欄 (fs_mgr_flags 欄) 新增下列選項:

fileencryption=adiantum

如果裝置搭載的是 Android 11 以上版本,則也必須啟用中繼資料加密。如要使用 Adiantum 進行內部儲存空間的中繼資料加密,userdatafs_mgr_flags 必須包含下列選項:

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 中繼資料加密功能時,稍微降低記憶體用量。執行這項操作前,請先確認 fstab 中未指定 inlinecrypt 掛載選項。如果已指定,請移除,因為 Adiantum 加密不需要此值,且與 blk-crypto-fallback.num_keyslots=1 搭配使用時會導致效能問題。

如要確認導入作業是否成功,請擷取錯誤報告或執行以下操作:

adb root
adb shell dmesg

如果 Adiantum 已正確啟用,核心記錄中應會顯示下列內容:

fscrypt: Adiantum using implementation "adiantum(xchacha12-neon,aes-arm,nhpoly1305-neon)"

如果您已啟用中繼資料加密,請同時執行下列指令,確認是否已正確啟用 Adiantum 中繼資料加密:

adb root
adb 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 root
adb shell dmesg

如果 Adiantum 已正確啟用,核心記錄中應會顯示下列內容:

device-mapper: crypt: adiantum(xchacha12,aes) using implementation "adiantum(xchacha12-neon,aes-arm,nhpoly1305-neon)"