啟用鐵線蓮

Adiantum 是一種加密方法,專為運行 Android 9 及更高版本且 CPU 缺乏AES指令的設備設計。如果您要運送帶有 ARMv8 加密擴展的基於 ARM 的設備或帶有 AES-NI 的基於 x86 的設備,則不應使用 Adiantum。 AES 在這些平台上更快。

對於缺少這些 AES CPU 指令的設備,Adiantum 在您的設備上提供加密,性能開銷非常小。有關基準數據,請參閱Adiantum 論文。有關在您的硬件上運行的基準測試源,請參閱GitHub 上的 Adiantum 源

要在運行 Android 9 或更高版本的設備上啟用 Adiantum,您需要進行內核更改和用戶空間更改。

內核更改

Android 通用內核 4.9 及更高版本支持 Adiantum。

如果您設備的內核還沒有 Adiantum 支持,請選擇下面列出的更改。如果您在挑選時遇到問題,使用全盤加密(FDE) 的設備可以排除fscrypt:補丁。

內核版本加密和 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

安卓 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 進行元數據加密,用戶數據的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 元數據加密時,這將稍微減少內存使用量。在執行此操作之前,請確認inlinecrypt掛載選項未在fstab中指定。如果已指定,請將其刪除,因為 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)"