Включение Адиантума

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:

Версия ядра Крипто- и 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 выберите следующие изменения:

Включите Адиантум на вашем устройстве

Сначала убедитесь, что на вашем устройстве 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)"
,

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:

Версия ядра Крипто- и 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 выберите следующие изменения:

Включите Адиантум на вашем устройстве

Сначала убедитесь, что на вашем устройстве 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)"