Adiantum — это метод шифрования, разработанный для устройств под управлением Android 9 и выше, процессоры которых не поддерживают инструкции AES . Если вы поставляете устройства на базе ARM с расширениями криптографии ARMv8 или устройства на базе x86 с AES-NI, вам не следует использовать Adiantum. AES работает быстрее на этих платформах.
Для устройств, не поддерживающих инструкции AES на ЦП, Adiantum обеспечивает шифрование непосредственно на вашем устройстве с минимальными накладными расходами на производительность. Результаты бенчмарков см. в статье Adiantum . Исходный код для запуска бенчмарков на вашем оборудовании см. в исходном коде Adiantum на GitHub .
Для включения Adiantum на устройстве под управлением Android 9 или более поздней версии необходимо внести изменения в ядро и в пользовательское пространство.
Изменения ядра
Adiantum поддерживается ядрами Android Common Core версии 4.9 и выше.
Если ядро вашего устройства ещё не поддерживает Adiantum, выберите изменения, перечисленные ниже, с помощью функции cherry-pick. Если у вас возникли проблемы с выбором изменений, устройства, использующие полное шифрование диска (FDE), могут исключить патч fscrypt: :.
| Версия ядра | Патчи для Crypto и fscrypt | патч dm-crypt |
|---|---|---|
| 4.19 | ядро 4.19 | патч dm-crypt |
| 4.14 | ядро 4.14 | патч dm-crypt |
| 4.9 | ядро 4.9 | патч dm-crypt |
Включите Adiantum в ядре вашего компьютера.
Android 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
Android 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: Добавлена поддержка Adiantum
- cryptfs: Разрешить установку размера сектора dm-crypt
- cryptfs: округлить размер устройства dm-crypt до границы криптографического сектора в меньшую сторону
- cryptfs: улучшить логирование создания устройства dm-crypt
- libfscrypt: Добавлена поддержка Adiantum
- fs_mgr_fstab: Добавить поддержку Adiantum
Включите Adiantum на вашем устройстве.
Во-первых, убедитесь, что для вашего устройства параметр 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 rootadb shell dmesg
Если Adiantum включен корректно, в журнале ядра должно отобразиться следующее:
fscrypt: Adiantum using implementation "adiantum(xchacha12-neon,aes-arm,nhpoly1305-neon)"
Если вы включили шифрование метаданных, выполните также следующие действия, чтобы убедиться в корректной работе шифрования метаданных Adiantum:
adb rootadb 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 для параметра userdata установлено следующее:
forceencrypt=footer
Чтобы убедиться в работоспособности вашей реализации, создайте отчет об ошибке или запустите:
adb rootadb shell dmesg
Если Adiantum включен корректно, в журнале ядра должно отобразиться следующее:
device-mapper: crypt: adiantum(xchacha12,aes) using implementation "adiantum(xchacha12-neon,aes-arm,nhpoly1305-neon)"