Ativar adiantum

O Adiantum é um método de criptografia projetado para dispositivos com Android 9 e versões mais recentes com CPUs sem 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, não use o Adiantum. O AES é mais rápido nessas plataformas.

Para dispositivos que não têm essas instruções de CPU AES, o Adiantum oferece criptografia no seu dispositivo com pouquíssima sobrecarga de desempenho. Para números de comparativo de mercado, consulte o documento da Adiantum (em inglês). Para que a origem da comparação seja executada no seu hardware, consulte a fonte do Adiantum no GitHub (em inglês).

Para ativar o Adiantum em um dispositivo com o Android 9 ou versões mais recentes, é necessário fazer mudanças no kernel e no espaço do usuário.

Mudanças no kernel

O Adiantum tem suporte dos kernels comuns do Android, versão 4.9 e mais recentes.

Se o kernel do seu dispositivo ainda não tiver suporte ao Adiantum, escolha as mudanças listadas abaixo. Se você tiver problemas para selecionar o que precisa, os dispositivos que usam a criptografia de disco completo (FDE) podem excluir o patch fscrypt: .

Versão do kernel Patches de Crypto e fscrypt Patch dm-crypt
4,19 Kernel 4.19 Correção dm-crypt
4.14 Kernel 4.14 Patch dm-crypt
4,9 Kernel 4.9 Correção dm-crypt

Ativar o Adiantum no kernel

Android 11 e versões mais recentes

Se o dispositivo estiver sendo iniciado com o Android 11 ou mais recente, ative as seguintes configurações na configuração do kernel do 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 dispositivo estiver executando um kernel ARM de 32 bits, ative também as instruções do 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 dispositivo estiver sendo iniciado com o Android 9 ou 10, serão necessárias configurações do kernel um pouco diferentes. Ative as seguintes configurações:

CONFIG_CRYPTO_ADIANTUM=y
CONFIG_DM_CRYPT=y

Caso seu dispositivo use criptografia baseada em arquivos, ative também:

CONFIG_F2FS_FS_ENCRYPTION=y

Por fim, se o dispositivo executar um kernel ARM de 32 bits, ative as instruções do 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

Mudanças no espaço do usuário

Para dispositivos com o Android 10 ou versões mais recentes, as mudanças no espaço do usuário do Adiantum já estão presentes.

Para dispositivos com o Android 9, escolha as seguintes mudanças:

Ativar o Adiantum no dispositivo

Primeiro, verifique se a PRODUCT_SHIPPING_API_LEVEL do dispositivo está definida corretamente para corresponder à versão do Android com que está sendo iniciada. Por exemplo, um dispositivo iniciado com o Android 11 precisa ter PRODUCT_SHIPPING_API_LEVEL := 30. Isso é importante porque algumas configurações de criptografia têm padrões diferentes em versões de lançamento distintas.

Dispositivos com criptografia baseada em arquivos

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

fileencryption=adiantum

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

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

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

Para o Android 11 e versões mais recentes:

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

Para o 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

Por fim, adicione blk-crypto-fallback.num_keyslots=1 à linha de comando do kernel. Isso reduz um pouco o uso da memória quando a criptografia de metadados Adiantum é usada. Antes de fazer isso, verifique se a opção de ativação inlinecrypt não está especificada em fstab. Se ele for especificado, remova-o, já que ele 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 a implementação funcionou, gere um relatório do bug ou execute:

adb root
adb shell dmesg

Se o Adiantum estiver ativado corretamente, você verá isso no registro 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 precisa ser xchacha12,aes-adiantum-plain64.

Dispositivos com criptografia de disco completo

Para ativar o Adiantum e melhorar o 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 isso não é necessário para que Adiantum funcione. Para usar essa configuração, a partição de dados do usuário precisa começar em um deslocamento alinhado de 4096 bytes no disco.

No fstab, para o conjunto de dados do usuário:

forceencrypt=footer

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

adb root
adb shell dmesg

Se o Adiantum estiver ativado corretamente, você verá isso no registro do kernel:

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