Ядро GKI включает модуль ядра Linux fips140.ko
, соответствующий требованиям FIPS 140-3 к криптографическим программным модулям. Этот модуль может быть представлен на сертификацию FIPS, если это требуется для продукта, использующего ядро GKI.
В частности, перед использованием криптографических процедур необходимо выполнить следующие требования FIPS 140-3:
- Модуль должен проверить свою целостность, прежде чем предоставить доступ к криптографическим алгоритмам.
- Модуль должен проверить и протестировать свои утвержденные криптографические алгоритмы с помощью самотестирования с известными ответами, прежде чем сделать их доступными.
Зачем нужен отдельный модуль ядра?
Валидация по стандарту FIPS 140-3 основана на идее, что после сертификации программный или аппаратный модуль больше не подлежит изменению. В случае изменения он должен быть повторно сертифицирован. Это не совсем соответствует современным процессам разработки программного обеспечения, и в связи с этим требованием программные модули FIPS, как правило, разрабатываются с максимально возможной ориентацией на криптографические компоненты, чтобы гарантировать, что изменения, не связанные с криптографией, не потребуют повторной оценки криптографии.
Ядро GKI должно регулярно обновляться в течение всего срока его поддержки. Это делает невозможным включение всего ядра в границы модуля FIPS, поскольку такой модуль потребовал бы повторной сертификации при каждом обновлении ядра. Определение «модуля FIPS» как подмножества образа ядра смягчило бы эту проблему, но не решило бы её, поскольку двоичное содержимое «модуля FIPS» всё равно изменялось бы гораздо чаще, чем необходимо.
До версии ядра 6.1 еще одним соображением было то, что GKI был скомпилирован с включенной LTO (оптимизацией времени компоновки), поскольку LTO было необходимым условием для целостности потока управления , которая является важной функцией безопасности.
Таким образом, весь код, подпадающий под требования FIPS 140-3, упакован в отдельный модуль ядра fips140.ko
, который использует только стабильные интерфейсы, предоставляемые исходным кодом ядра GKI, на основе которого он был собран. Это означает, что модуль может использоваться с различными выпусками GKI того же поколения, и его необходимо обновлять и повторно отправлять на сертификацию только в случае исправления каких-либо проблем в коде самого модуля.
Когда использовать модуль
Само ядро GKI содержит код, зависящий от криптографических процедур, которые также упакованы в модуль ядра FIPS 140-3. Таким образом, встроенные криптографические процедуры фактически не выносятся из ядра GKI, а копируются в модуль. При загрузке модуля встроенные криптографические процедуры отменяются в Linux CryptoAPI и заменяются процедурами, содержащимися в модуле.
Это означает, что модуль fips140.ko
является полностью необязательным, и его использование имеет смысл только в случае наличия сертификации по FIPS 140-3. В остальном модуль не предоставляет никаких дополнительных возможностей, а его ненужная загрузка, скорее всего, только увеличит время загрузки, не давая никаких преимуществ.
Как развернуть модуль
Модуль можно включить в сборку Android, выполнив следующие шаги:
- Добавьте имя модуля в
BOARD_VENDOR_RAMDISK_KERNEL_MODULES
. Это приведёт к копированию модуля на виртуальный диск поставщика. - Добавьте имя модуля в
BOARD_VENDOR_RAMDISK_KERNEL_MODULES_LOAD
. Это приведёт к добавлению имени модуля вmodules.load
на целевом устройстве.modules.load
содержит список модулей, загружаемыхinit
при загрузке устройства.
Самопроверка целостности
Модуль ядра FIPS 140-3 берёт дайджест HMAC-SHA256 своих разделов .code
и .rodata
во время загрузки модуля и сравнивает его с дайджестом, записанным в модуле. Это происходит после того, как загрузчик модулей Linux уже внёс обычные изменения, такие как обработка перемещения ELF-файлов и исправление ошибок процессора в этих разделах. Для обеспечения корректного воспроизведения дайджеста выполняются следующие дополнительные шаги:
- Перемещения ELF сохраняются внутри модуля, чтобы их можно было применять в обратном порядке ко входу HMAC.
- Модуль отменяет все исправления кода, внесенные ядром для динамического теневого стека вызовов. В частности, модуль заменяет все инструкции, добавляющие или извлекающие данные из теневого стека вызовов, на инструкции кода аутентификации указателя (PAC), которые присутствовали изначально.
- Все остальные исправления кода отключены для модуля, включая статические ключи и, следовательно, точки трассировки, а также хуки поставщиков.
Самопроверки с известными ответами
Любые реализованные алгоритмы, соответствующие требованиям FIPS 140-3, должны пройти самотестирование с известным ответом перед использованием. Согласно Руководству по внедрению FIPS 140-3 10.3.A , для шифров достаточно одного тестового вектора на алгоритм с любой из поддерживаемых длин ключей, при условии, что тестируются как шифрование, так и дешифрование.
В Linux CryptoAPI есть понятие приоритетов алгоритмов, при котором несколько реализаций одного и того же алгоритма (например, одна, использующая специальные криптографические инструкции, и резервная для процессоров, не поддерживающих эти инструкции) могут существовать одновременно. Следовательно, необходимо протестировать все реализации одного и того же алгоритма. Это необходимо, поскольку Linux CryptoAPI позволяет обойти выбор на основе приоритета и выбрать алгоритм с более низким приоритетом.
Алгоритмы, включенные в модуль
Все алгоритмы, включённые в модуль FIPS 140-3, перечислены ниже. Это относится к ветвям ядра android12-5.10
, android13-5.10
, android13-5.15
, android14-5.15
, android14-6.1
и android15-6.6
, хотя различия между версиями ядра указаны там, где это необходимо.
Алгоритм | Реализации | Одобрено | Определение |
---|---|---|---|
aes | aes-generic , aes-arm64 , aes-ce , библиотека AES | Да | Обычный блочный шифр AES без режима работы: поддерживаются все размеры ключей (128 бит, 192 бита и 256 бит). Все реализации, кроме библиотечной, могут быть скомпонованы с режимом работы через шаблон. |
cmac(aes) | cmac (шаблон), cmac-aes-neon , cmac-aes-ce | Да | AES-CMAC: Поддерживаются все размеры ключей AES. Шаблон cmac можно создать с любой реализацией aes с помощью cmac(<aes-impl>) . Остальные реализации являются автономными. |
ecb(aes) | ecb (шаблон), ecb-aes-neon , ecb-aes-neonbs , ecb-aes-ce | Да | AES-ECB: Поддерживаются все размеры ключей AES. Шаблон ecb может быть составлен с использованием любой реализации aes с помощью ecb(<aes-impl>) . Остальные реализации являются автономными. |
cbc(aes) | cbc (шаблон), cbc-aes-neon , cbc-aes-neonbs , cbc-aes-ce | Да | AES-CBC: Поддерживаются все размеры ключей AES. Шаблон cbc можно создать с любой реализацией aes с помощью ctr(<aes-impl>) . Остальные реализации являются автономными. |
cts(cbc(aes)) | cts (шаблон), cts-cbc-aes-neon , cts-cbc-aes-ce | Да | AES-CBC-CTS или AES-CBC с кражей шифртекста: используется соглашение CS3 ; последние два блока шифртекста меняются местами без каких-либо условий. Поддерживаются все размеры ключей AES. Шаблон cts может быть составлен с использованием любой реализации cbc с помощью cts(<cbc(aes)-impl>) . Остальные реализации являются автономными. |
ctr(aes) | ctr (шаблон), ctr-aes-neon , ctr-aes-neonbs , ctr-aes-ce | Да | AES-CTR: Поддерживаются все размеры ключей AES. Шаблон ctr можно создать с любой реализацией aes с помощью ctr(<aes-impl>) . Остальные реализации являются автономными. |
xts(aes) | xts (шаблон), xts-aes-neon , xts-aes-neonbs , xts-aes-ce | Да | AES-XTS: В ядре версии 6.1 и ниже поддерживаются все размеры ключей AES; в ядре версии 6.6 и выше поддерживаются только AES-128 и AES-256. Шаблон xts может быть составлен с любой реализацией ecb(aes) с помощью xts(<ecb(aes)-impl>) . Остальные реализации являются автономными. Все реализации реализуют проверку слабости ключа, требуемую FIPS; то есть ключи XTS, у которых первая и вторая половины равны, отклоняются. |
gcm(aes) | gcm (шаблон), gcm-aes-ce | № 1 | AES-GCM: Поддерживаются все размеры ключей AES. Поддерживаются только 96-битные векторы инициализации (IV). Как и во всех других режимах AES в этом модуле, вызывающий код отвечает за предоставление векторов инициализации (IV). Шаблон gcm может быть составлен с использованием любых реализаций ctr(aes) и ghash с помощью gcm_base(<ctr(aes)-impl>,<ghash-impl>) . Остальные реализации являются автономными. |
sha1 | sha1-generic , sha1-ce | Да | Криптографическая хеш-функция SHA-1 |
sha224 | sha224-generic , sha224-arm64 , sha224-ce | Да | Криптографическая хеш-функция SHA-224: код используется совместно с SHA-256. |
sha256 | sha256-generic , sha256-arm64 , sha256-ce , библиотека SHA-256 | Да | Криптографическая хеш-функция SHA-256: В дополнение к стандартному интерфейсу CryptoAPI предоставляется библиотечный интерфейс для SHA-256. Этот библиотечный интерфейс использует другую реализацию. |
sha384 | sha384-generic , sha384-arm64 , sha384-ce | Да | Криптографическая хеш-функция SHA-384: код используется совместно с SHA-512. |
sha512 | sha512-generic , sha512-arm64 , sha512-ce | Да | Криптографическая хеш-функция SHA-512 |
sha3-224 | sha3-224-generic | Да | Криптографическая хеш-функция SHA3-224. Присутствует только в ядре версии 6.6 и выше. |
sha3-256 | sha3-256-generic | Да | То же, что и предыдущее, но с длиной дайджеста 256 бит (SHA3-256). Все длины дайджестов используют одну и ту же реализацию Keccak. |
sha3-384 | sha3-384-generic | Да | То же, что и предыдущее, но с длиной дайджеста 384 бита (SHA3-384). Все длины дайджестов используют одну и ту же реализацию Keccak. |
sha3-512 | sha3-512-generic | Да | То же, что и предыдущее, но с длиной дайджеста 512 бит (SHA3-512). Все длины дайджестов используют одну и ту же реализацию Keccak. |
hmac | hmac (шаблон) | Да | HMAC (код аутентификации сообщения с ключевым хэшем): шаблон hmac может быть составлен с использованием любого алгоритма SHA или реализации с использованием hmac(<sha-alg>) или hmac(<sha-impl>) . |
stdrng | drbg_pr_hmac_sha1 , drbg_pr_hmac_sha256 , drbg_pr_hmac_sha384 , drbg_pr_hmac_sha512 | Да | HMAC_DRBG, созданный с использованием именованной хеш-функции и с включённой устойчивостью к предсказаниям: включены проверки работоспособности. Пользователи этого интерфейса получают собственные экземпляры DRBG. |
stdrng | drbg_nopr_hmac_sha1 , drbg_nopr_hmac_sha256 , drbg_nopr_hmac_sha384 , drbg_nopr_hmac_sha512 | Да | Аналогично алгоритмам drbg_pr_* , но с отключенной защитой от предсказаний. Код аналогичен варианту с защитой от предсказаний. В ядре версии 5.10 DRBG с наивысшим приоритетом — drbg_nopr_hmac_sha256 . В ядре версии 5.15 и выше — drbg_pr_hmac_sha512 . |
jitterentropy_rng | jitterentropy_rng | Нет | Генератор случайных чисел Jitter RNG версии 2.2.0 (версия ядра 6.1 и ниже) или версии 3.4.0 (версия ядра 6.6 и выше). Пользователи этого интерфейса получают собственные экземпляры генератора случайных чисел Jitter RNG. Они не используют повторно экземпляры, используемые DRBG. |
xcbc(aes) | xcbc-aes-neon , xcbc-aes-ce | Нет | |
xctr(aes) | xctr-aes-neon , xctr-aes-ce | Нет | Присутствует только в ядре версии 5.15 и выше. |
cbcmac(aes) | cbcmac-aes-neon , cbcmac-aes-ce | Нет | |
essiv(cbc(aes),sha256) | essiv-cbc-aes-sha256-neon , essiv-cbc-aes-sha256-ce | Нет |
Сборка модуля из исходного кода
Для Android 14 и выше (включая android-mainline
) соберите модуль fips140.ko
из исходного кода с помощью следующих команд.
Сборка с помощью Bazel:
tools/bazel run //common:fips140_dist
Сборка с помощью
build.sh
(устаревшая версия):BUILD_CONFIG=common/build.config.gki.aarch64.fips140 build/build.sh
Эти команды выполняют полную сборку, включая ядро и модуль fips140.ko
со встроенным в него содержимым дайджеста HMAC-SHA256.
Руководство для конечного пользователя
Руководство для крипто-офицеров
Для работы модуля ядра операционная система должна быть ограничена однооператорным режимом работы. Android автоматически управляет этим, используя аппаратное обеспечение управления памятью в процессоре.
Модуль ядра не может быть установлен отдельно; он входит в состав прошивки устройства и загружается автоматически при загрузке. Он работает только в разрешённом режиме.
Сотрудник службы криптографии может в любой момент запустить самотестирование, перезапустив устройство.
Руководство пользователя
Пользователями модуля ядра являются другие компоненты ядра, которым необходимо использовать криптографические алгоритмы. Модуль ядра не предоставляет дополнительной логики для использования алгоритмов и не хранит никаких параметров, выходящих за рамки времени, необходимого для выполнения криптографической операции.
Использование алгоритмов для обеспечения соответствия стандарту FIPS ограничено утверждёнными алгоритмами. Для удовлетворения требования FIPS 140-3 «индикатор обслуживания» модуль предоставляет функцию fips140_is_approved_service
, которая указывает, утверждён ли алгоритм.
Ошибки самотестирования
В случае сбоя самотестирования модуль ядра вызывает панику ядра, и устройство прекращает загрузку. Если перезагрузка устройства не решает проблему, необходимо загрузить устройство в режиме восстановления, чтобы исправить её путём перепрошивки.
Ожидается, что реализации AES-GCM в модуле могут быть «одобрены как алгоритм», но не «одобрены как модуль». Они могут быть валидированы, но AES-GCM не может считаться одобренным алгоритмом с точки зрения модуля FIPS. Это связано с тем, что требования модуля FIPS к GCM несовместимы с реализациями GCM, которые не генерируют собственные векторы инициализации (IV). ↩