启用 Adiantum

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: 补丁程序。

内核版本 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 文件级加密,请将以下选项添加到 userdata 分区所在行的最后一列(fs_mgr_flags 列)中该设备的 fstab 文件中:

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 结合使用时,还会引发性能问题。

如需验证您的实现是否有效,请生成 bug 报告或运行以下命令:

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 无需此设置也可正常运行。如需使用此设置,userdata 分区必须以磁盘上 4096 字节对齐的偏移量开始。

fstab 中,对 userdata 设置以下选项:

forceencrypt=footer

如需验证您的实现是否有效,请生成 bug 报告或运行以下命令:

adb root
adb shell dmesg

如果正确启用了 Adiantum,您应该会在内核日志中看到以下内容:

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