Habilitación de Adiantum

Adiantum es un método de encriptación diseñado para dispositivos que ejecutan Android 9 y versiones posteriores cuyas CPU carecen de instrucciones AES . Si envía un dispositivo basado en ARM con extensiones criptográficas ARMv8 o un dispositivo basado en x86 con AES-NI, no debe usar Adiantum. AES es más rápido en esas plataformas.

Para dispositivos que carecen de estas instrucciones de CPU AES, Adiantum proporciona cifrado en su dispositivo con muy poca sobrecarga de rendimiento. Para conocer los números de evaluación comparativa, consulte el documento de Adiantum . Para que la fuente de evaluación comparativa se ejecute en su hardware, consulte la fuente de Adiantum en GitHub .

Para habilitar Adiantum en un dispositivo con Android 9 o superior, debe realizar cambios en el kernel y en el espacio de usuario.

Cambios en el kernel

Adiantum es compatible con los núcleos comunes de Android, versión 4.9 y superior.

Si el kernel de su dispositivo aún no es compatible con Adiantum, elija los cambios que se enumeran a continuación. Si tiene problemas para elegir, los dispositivos que usan cifrado de disco completo (FDE) pueden excluir el parche fscrypt:

Versión del núcleo Parches criptográficos y fscrypt parche dm-crypt
4.19 Núcleo 4.19 parche dm-crypt
4.14 Núcleo 4.14 parche dm-crypt
4.9 Núcleo 4.9 parche dm-crypt

Habilite Adiantum en su kernel

Android 11 y superior

Si su dispositivo se inicia con Android 11 o superior, habilite las siguientes configuraciones en la configuración del kernel de su dispositivo:

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

Si su dispositivo ejecuta un kernel ARM de 32 bits, habilite también las instrucciones NEON para mejorar el rendimiento:

CONFIG_KERNEL_MODE_NEON=y
CONFIG_CRYPTO_AES_ARM=y
CONFIG_CRYPTO_CHACHA20_NEON=y
CONFIG_CRYPTO_NHPOLY1305_NEON=y

Android 9 y 10

Si su dispositivo se inicia con Android 9 o 10, se necesitan ajustes de configuración del kernel ligeramente diferentes. Habilite las siguientes configuraciones:

CONFIG_CRYPTO_ADIANTUM=y
CONFIG_DM_CRYPT=y

Si su dispositivo usa encriptación basada en archivos, habilite también:

CONFIG_F2FS_FS_ENCRYPTION=y

Finalmente, si su dispositivo ejecuta un kernel ARM de 32 bits, habilite las instrucciones NEON para mejorar el rendimiento:

CONFIG_KERNEL_MODE_NEON=y
CONFIG_CRYPTO_AES_ARM=y
CONFIG_CRYPTO_CHACHA20_NEON=y
CONFIG_CRYPTO_NHPOLY1305_NEON=y

Cambios en el espacio de usuario

Para dispositivos con Android 10 o superior, los cambios en el espacio de usuario de Adiantum ya están presentes.

Para dispositivos con Android 9, seleccione los siguientes cambios:

Habilite Adiantum en su dispositivo

Primero, asegúrese de que su dispositivo tenga PRODUCT_SHIPPING_API_LEVEL configurado correctamente para que coincida con la versión de Android con la que se inicia. Por ejemplo, un dispositivo que se inicia con Android 11 debe tener PRODUCT_SHIPPING_API_LEVEL := 30 . Esto es importante porque algunas de las configuraciones de cifrado tienen diferentes valores predeterminados en diferentes versiones de lanzamiento.

Dispositivos con cifrado basado en archivos

Para habilitar el cifrado basado en archivos de Adiantum en el almacenamiento interno de su dispositivo, agregue la siguiente opción a la última columna (la columna fs_mgr_flags ) de la fila para la partición de datos de userdata en el archivo fstab del dispositivo:

fileencryption=adiantum

Si su dispositivo se inicia con Android 11 o superior, también se requiere habilitar el cifrado de metadatos . Para usar Adiantum para el cifrado de metadatos en el almacenamiento interno, fs_mgr_flags para los datos de userdata también debe contener las siguientes opciones:

metadata_encryption=adiantum,keydirectory=/metadata/vold/metadata_encryption

A continuación, habilite el cifrado Adiantum en el almacenamiento adoptable . Para ello, establezca las siguientes propiedades del sistema en PRODUCT_PROPERTY_OVERRIDES :

Para Android 11 y superior:

ro.crypto.volume.options=adiantum
ro.crypto.volume.metadata.encryption=adiantum

Para Android 9 y 10:

ro.crypto.volume.contents_mode=adiantum
ro.crypto.volume.filenames_mode=adiantum
ro.crypto.fde_algorithm=adiantum
ro.crypto.fde_sector_size=4096

Finalmente, agregue opcionalmente blk-crypto-fallback.num_keyslots=1 a la línea de comando del kernel. Esto reducirá ligeramente el uso de la memoria cuando se utilice el cifrado de metadatos Adiantum. Antes de hacer esto, verifique que la opción de montaje inlinecrypt no esté especificada en fstab . Si se especifica, elimínelo, ya que no es necesario para el cifrado Adiantum y causa problemas de rendimiento cuando se usa en combinación con blk-crypto-fallback.num_keyslots=1 .

Para verificar que su implementación funcionó, tome un informe de error o ejecute:

adb root
adb shell dmesg

Si Adiantum está habilitado correctamente, debería ver esto en el registro del kernel:

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

Si habilitó el cifrado de metadatos, también ejecute lo siguiente para verificar que el cifrado de metadatos de Adiantum esté habilitado correctamente:

adb root
adb shell dmctl table userdata

El tercer campo de la salida debe ser xchacha12,aes-adiantum-plain64 .

Dispositivos con cifrado de disco completo

Para habilitar Adiantum y mejorar su rendimiento, establezca estas propiedades en PRODUCT_PROPERTY_OVERRIDES :

ro.crypto.fde_algorithm=adiantum
ro.crypto.fde_sector_size=4096

Establecer fde_sector_size en 4096 mejora el rendimiento, pero no es necesario para que Adiantum funcione. Para usar esta configuración, la partición de datos de usuario debe comenzar en un desplazamiento alineado de 4096 bytes en el disco.

En fstab , para el conjunto de datos de usuario:

forceencrypt=footer

Para verificar que su implementación funcionó, tome un informe de error o ejecute:

adb root
adb shell dmesg

Si Adiantum está habilitado correctamente, debería ver esto en el registro del kernel:

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