啟用鐵線蓮

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 的設備,請選擇以下變更:

在您的裝置中啟用鐵線蕨

首先,請確保您的裝置已正確設定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)"

如果您啟用了元資料加密,您還需執行以下命令來驗證 Ad​​iantum 元資料加密是否已正確啟用:

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)"