Habilitando Adiantum

Adiantum é um método de criptografia projetado para dispositivos que executam o Android 9 e superior cujas CPUs não possuem instruções AES . Se você estiver enviando um dispositivo baseado em ARM com extensões de criptografia ARMv8 ou um dispositivo baseado em x86 com AES-NI, você não deve usar o Adiantum. O AES é mais rápido nessas plataformas.

Para dispositivos sem essas instruções de CPU AES, o Adiantum fornece criptografia em seu dispositivo com muito pouca sobrecarga de desempenho. Para números de benchmarking, veja o artigo da Adiantum . Para que a fonte de benchmarking seja executada em seu hardware, consulte a fonte Adiantum no GitHub .

Para habilitar o Adiantum em um dispositivo com Android 9 ou superior, você precisa fazer alterações no kernel e no espaço do usuário.

Alterações do kernel

Adiantum é suportado pelos kernels comuns do Android, versão 4.9 e superior.

Se o kernel do seu dispositivo ainda não tiver suporte para Adiantum, escolha as alterações listadas abaixo. Se você estiver tendo problemas para escolher, os dispositivos que usam criptografia de disco completo (FDE) podem excluir o patch fscrypt:

Versão do kernel Patches de criptografia e fscrypt patch dm-crypt
4.19 núcleo 4.19 patch dm-crypt
4.14 núcleo 4.14 patch dm-crypt
4.9 núcleo 4.9 patch dm-crypt

Habilite o Adiantum em seu kernel

Android 11 e superior

Se o seu dispositivo estiver sendo iniciado com o Android 11 ou superior, ative as seguintes configurações na configuração do kernel do seu 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

Se o seu dispositivo estiver executando um kernel ARM de 32 bits, ative também as instruções NEON para melhorar o desempenho:

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

Android 9 e 10

Se o seu dispositivo estiver sendo iniciado com o Android 9 ou 10, serão necessárias configurações de kernel ligeiramente diferentes. Habilite as seguintes configurações:

CONFIG_CRYPTO_ADIANTUM=y
CONFIG_DM_CRYPT=y

Se o seu dispositivo usa criptografia baseada em arquivo, ative também:

CONFIG_F2FS_FS_ENCRYPTION=y

Por fim, se o seu dispositivo executa um kernel ARM de 32 bits, habilite as instruções NEON para melhorar o desempenho:

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

Alterações no espaço do usuário

Para dispositivos com Android 10 ou superior, as alterações do espaço de usuário do Adiantum já estão presentes.

Para dispositivos que executam o Android 9, escolha as seguintes alterações:

Ative o Adiantum no seu dispositivo

Primeiro, verifique se o PRODUCT_SHIPPING_API_LEVEL do seu dispositivo está configurado corretamente para corresponder à versão do Android com a qual está sendo iniciado. Por exemplo, um dispositivo iniciado com o Android 11 deve ter PRODUCT_SHIPPING_API_LEVEL := 30 . Isso é importante porque algumas das configurações de criptografia têm padrões diferentes em diferentes versões de inicialização.

Dispositivos com criptografia baseada em arquivo

Para habilitar a criptografia baseada em arquivo Adiantum no armazenamento interno do seu dispositivo, adicione a seguinte opção à última coluna (a coluna fs_mgr_flags ) da linha da partição userdata no arquivo fstab do dispositivo:

fileencryption=adiantum

Se o seu dispositivo for iniciado com o Android 11 ou superior, também será necessário ativar a criptografia de metadados . Para usar Adiantum para criptografia de metadados em armazenamento interno, o fs_mgr_flags para userdata também deve conter as seguintes opções:

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

Em seguida, habilite a criptografia Adiantum no armazenamento adotável . Para fazer isso, defina as seguintes propriedades do sistema em PRODUCT_PROPERTY_OVERRIDES :

Para Android 11 e superior:

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

Para Android 9 e 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, opcionalmente, adicione blk-crypto-fallback.num_keyslots=1 à linha de comando do kernel. Isso reduzirá um pouco o uso de memória quando a criptografia de metadados Adiantum for usada. Antes de fazer isso, verifique se a opção de montagem inlinecrypt não está especificada no fstab . Se for especificado, remova-o, pois não é necessário para a criptografia Adiantum e causa problemas de desempenho quando usado em combinação com blk-crypto-fallback.num_keyslots=1 .

Para verificar se sua implementação funcionou, faça um relatório de bug ou execute:

adb root
adb shell dmesg

Se o Adiantum estiver habilitado corretamente, você deverá ver isso no log do kernel:

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

Se você ativou a criptografia de metadados, execute também o seguinte para verificar se a criptografia de metadados Adiantum está ativada corretamente:

adb root
adb shell dmctl table userdata

O terceiro campo da saída deve ser xchacha12,aes-adiantum-plain64 .

Dispositivos com criptografia de disco completo

Para habilitar o Adiantum e melhorar seu desempenho, defina estas propriedades em PRODUCT_PROPERTY_OVERRIDES :

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

Definir fde_sector_size como 4096 melhora o desempenho, mas não é necessário para que o Adiantum funcione. Para usar essa configuração, a partição userdata deve começar em um deslocamento alinhado no disco de 4096 bytes.

No fstab , para o conjunto userdata:

forceencrypt=footer

Para verificar se sua implementação funcionou, faça um relatório de bug ou execute:

adb root
adb shell dmesg

Se o Adiantum estiver habilitado corretamente, você deverá ver isso no log do kernel:

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