Adiantum — это метод шифрования, разработанный для устройств под управлением Android 9 и выше, в процессорах которых отсутствуют инструкции AES . Если вы отправляете устройство на базе ARM с расширениями криптографии ARMv8 или устройство на базе x86 с AES-NI, вам не следует использовать Adiantum. На этих платформах AES работает быстрее.
Для устройств, на которых отсутствуют эти инструкции ЦП AES, Adiantum обеспечивает шифрование на вашем устройстве с очень небольшим снижением производительности. Сравнительные данные см. в статье Adiantum . Исходный код для тестирования производительности на вашем оборудовании см. в исходном коде Adiantum на GitHub .
Чтобы включить Adiantum на устройстве под управлением Android 9 или более поздней версии, вам необходимо внести изменения в ядро и в пользовательское пространство.
Изменения ядра
Adiantum поддерживается распространенными ядрами Android версии 4.9 и выше.
Если ядро вашего устройства еще не поддерживает Adiantum, выберите изменения, перечисленные ниже. Если у вас возникли проблемы с выбором вишни, устройства, использующие полнодисковое шифрование (FDE), могут исключить fscrypt:
patch.
Версия ядра | Патчи Crypto и fscrypt | патч dm-crypt |
---|---|---|
4.19 | ядро 4.19 | патч dm-crypt |
4.14 | ядро 4.14 | патч dm-crypt |
4.9 | ядро 4.9 | патч dm-crypt |
Включите Adiantum в вашем ядре
Андроид 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
Андроид 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 выберите следующие изменения:
- cryptfs: добавить поддержку адиантума
- cryptfs: разрешить установку размера сектора dm-crypt
- cryptfs: округлить размер устройства dm-crypt до границы криптосектора
- cryptfs: улучшено ведение журнала создания устройства dm-crypt.
- libfscrypt: добавлена поддержка Adiantum
- fs_mgr_fstab: Добавить поддержку Адиантума
Включите Адиантум на вашем устройстве
Во-первых, убедитесь, что PRODUCT_SHIPPING_API_LEVEL
на вашем устройстве правильно установлен в соответствии с версией Android, с которой оно запускается. Например, устройство с Android 11 должно иметь PRODUCT_SHIPPING_API_LEVEL := 30
. Это важно, потому что некоторые параметры шифрования имеют разные значения по умолчанию в разных версиях запуска.
Устройства с файловым шифрованием
Чтобы включить файловое шифрование Adiantum во внутренней памяти вашего устройства, добавьте следующий параметр в последний столбец (столбец fs_mgr_flags ) строки для userdata
пользовательских данных в fstab
устройства:
fileencryption=adiantum
Если ваше устройство запускается с Android 11 или более поздней версии, также необходимо включить шифрование метаданных . Чтобы использовать Adiantum для шифрования метаданных во внутреннем хранилище, fs_mgr_flags для пользовательских userdata
также должен содержать следующие параметры:
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. Прежде чем сделать это, убедитесь, что параметр монтирования inlinecrypt
не указан в fstab
. Если он указан, удалите его, так как он не нужен для шифрования Adiantum и вызывает проблемы с производительностью при использовании в сочетании с blk-crypto-fallback.num_keyslots=1
.
Чтобы убедиться, что ваша реализация работает, возьмите отчет об ошибке или запустите:
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. Чтобы использовать этот параметр, раздел пользовательских данных должен начинаться с выровненного смещения на 4096 байт на диске.
В fstab
для набора пользовательских данных:
forceencrypt=footer
Чтобы убедиться, что ваша реализация работает, возьмите отчет об ошибке или запустите:
adb root
adb shell dmesg
Если Adiantum включен правильно, вы должны увидеть это в журнале ядра:
device-mapper: crypt: adiantum(xchacha12,aes) using implementation "adiantum(xchacha12-neon,aes-arm,nhpoly1305-neon)"