Habilita adiantum

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

En el caso de los dispositivos que no tienen estas instrucciones de CPU AES, Adiantum proporciona encriptación en tu dispositivo con una sobrecarga de rendimiento muy baja. Para obtener cifras de comparativas, consulta el documento de Adiantum. Para que la fuente de comparativas se ejecute en tu hardware, consulta la fuente de Adiantum en GitHub.

Para habilitar Adiantum en un dispositivo que ejecute Android 9 o versiones posteriores, debes realizar cambios en el kernel y en el espacio del usuario.

Cambios en el kernel

Los kernels comunes de Android, versión 4.9 y posteriores, admiten Adiantum.

Si el kernel de tu dispositivo aún no admite Adiantum, selecciona los cambios que se indican a continuación. Si tienes problemas para seleccionar los cambios, los dispositivos que usan la encriptación de disco completo (FDE) pueden excluir el parche fscrypt: .

Versión de kernel Parches de crypto y fscrypt Parche de dm-crypt
4.19 Kernel 4.19 Parche de dm-crypt
4.14 Kernel 4.14 Parche de dm-crypt
4.9 Kernel 4.9 Parche de dm-crypt

Habilita Adiantum en tu kernel

Android 11 y versiones posteriores

Si tu dispositivo se lanza con Android 11 o versiones posteriores, habilita los siguientes parámetros de configuración en la configuración del kernel del 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 tu dispositivo ejecuta un kernel de ARM de 32 bits, también habilita 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 tu dispositivo se lanza con Android 9 o 10, se necesitan parámetros de configuración del kernel ligeramente diferentes. Habilita los siguientes parámetros de configuración:

CONFIG_CRYPTO_ADIANTUM=y
CONFIG_DM_CRYPT=y

Si tu dispositivo usa encriptación basada en archivos, también habilita lo siguiente:

CONFIG_F2FS_FS_ENCRYPTION=y

Por último, si tu dispositivo ejecuta un kernel de ARM de 32 bits, habilita las instrucciones de 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 del usuario

En los dispositivos que ejecutan Android 10 o versiones posteriores, los cambios en el espacio del usuario de Adiantum ya están presentes.

Para dispositivos con Android 9, selecciona los siguientes cambios:

Cómo habilitar Adiantum en tu dispositivo

Primero, asegúrate de que PRODUCT_SHIPPING_API_LEVEL esté configurado correctamente para que coincida con la versión de Android con la que se inicia. Por ejemplo, un dispositivo que se lanza con Android 11 debe tener PRODUCT_SHIPPING_API_LEVEL := 30. Esto es importante porque algunos parámetros de configuración de encriptación tienen diferentes valores predeterminados en las distintas versiones de lanzamiento.

Dispositivos con encriptación basada en archivos

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

fileencryption=adiantum

Si tu dispositivo se lanza con Android 11 o una versión posterior, también se requiere habilitar la encriptación de metadatos. Para usar Adiantum para la encriptación de metadatos en el almacenamiento interno, el parámetro fs_mgr_flags para userdata también debe contener las siguientes opciones:

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

A continuación, habilita la encriptación Adiantum en el almacenamiento adaptable. Para ello, establece las siguientes propiedades del sistema en PRODUCT_PROPERTY_OVERRIDES:

En Android 11 y versiones posteriores, haz lo siguiente:

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

En Android 9 y 10, haz lo siguiente:

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

Por último, agrega blk-crypto-fallback.num_keyslots=1 a la línea de comandos del kernel de forma opcional. Esto reduce ligeramente el uso de memoria cuando se usa el cifrado de metadatos de Adiantum. Antes de hacerlo, verifica que la opción de montaje inlinecrypt no se especifique en fstab. Si se especifica, quítalo, ya que no es necesario para la encriptación de Adiantum y causa problemas de rendimiento cuando se usa en combinación con blk-crypto-fallback.num_keyslots=1.

Para verificar que tu implementación funcionó, toma un informe de errores o ejecuta el siguiente comando:

adb root
adb shell dmesg

Si Adiantum está habilitado correctamente, deberías ver lo siguiente en el registro del kernel:

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

Si habilitaste la encriptación de metadatos, también ejecuta el siguiente comando para verificar que la encriptación de metadatos de Adiantum esté habilitada correctamente:

adb root
adb shell dmctl table userdata

El tercer campo del resultado debería ser xchacha12,aes-adiantum-plain64.

Dispositivos con encriptación de disco completo

Para habilitar Adiantum y mejorar su rendimiento, establece 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 este parámetro de configuración, la partición de userdata debe comenzar en un desplazamiento alineado de 4096 bytes en el disco.

En fstab, para los datos del usuario, establece lo siguiente:

forceencrypt=footer

Para verificar que tu implementación funcionó, toma un informe de errores o ejecuta el siguiente comando:

adb root
adb shell dmesg

Si Adiantum está habilitado correctamente, deberías ver lo siguiente en el registro del kernel:

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