Криптомодуль GKI, сертифицированный по стандарту FIPS 140-3.

Ядро 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.
  • Этот модуль отменяет любые изменения кода, внесенные ядром для динамического теневого стека вызовов. В частности, модуль заменяет любые инструкции, которые помещают (push) или извлекают (pop) элементы из теневого стека вызовов, инструкциями кода аутентификации указателя (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-ce1 AES-GCM: Поддерживаются все размеры ключей AES. Поддерживаются только 96-битные векторы инициализации (IV). Как и во всех других режимах AES в этом модуле, ответственность за предоставление векторов инициализации несет вызывающая сторона. Шаблон 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 (Keyed-Hash Message Authentication Code): Шаблон 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 , которая указывает, утвержден ли алгоритм.

Ошибки самотестирования

В случае сбоя самотестирования модуль ядра вызывает панику ядра, и устройство не продолжает загрузку. Если перезагрузка устройства не решает проблему, устройство должно загрузиться в режим восстановления для исправления проблемы путем перепрошивки устройства.


  1. Предполагается, что реализации AES-GCM в модуле могут быть «алгоритмически одобрены», но не «модуль одобрен». Они могут быть проверены, но AES-GCM не может считаться одобренным алгоритмом с точки зрения модуля FIPS. Это связано с тем, что требования модуля FIPS к GCM несовместимы с реализациями GCM, которые не генерируют собственные векторы инициализации (IV) .