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

Ядро GKI включает модуль ядра Linux под названием fips140.ko , который соответствует требованиям FIPS 140-3 для криптографических программных модулей. Этот модуль может быть отправлен на сертификацию FIPS, если это требуется продукту, работающему с ядром GKI.

Следующие требования FIPS 140-3, в частности, должны быть выполнены, прежде чем можно будет использовать процедуры шифрования:

  • Модуль должен проверить свою собственную целостность, прежде чем сделать доступными криптографические алгоритмы.
  • Модуль должен испытать и проверить свои утвержденные криптографические алгоритмы, используя самопроверки с известными ответами, прежде чем сделать их доступными.

Зачем отдельный модуль ядра

Проверка FIPS 140-3 основана на идее, что после сертификации программного или аппаратного модуля он никогда не меняется. В случае изменения необходимо пройти повторную сертификацию. Это не совсем соответствует процессам разработки программного обеспечения, используемым сегодня, и в результате этого требования программные модули FIPS обычно разрабатываются так, чтобы максимально сосредоточиться на криптографических компонентах, чтобы гарантировать, что изменения, не связанные с криптографией, не будут реализованы. не требуют повторной оценки криптографии.

Ядро GKI предназначено для регулярного обновления в течение всего поддерживаемого срока службы. Это делает невозможным нахождение всего ядра в пределах границ модуля FIPS, поскольку такой модуль необходимо повторно сертифицировать при каждом обновлении ядра. Кроме того, GKI скомпилирован с включенной функцией LTO (оптимизация времени соединения), поскольку LTO является необходимым условием для CFI , что является важной функцией безопасности. Это делает невозможным провести границу модуля FIPS только вокруг криптографического кода ядра, поскольку такой код не находится в четко определенном месте в результирующем двоичном файле. Обновления ядра также могут изменить криптографический код.

Поэтому весь код, на который распространяются требования 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.
  • Все остальные исправления кода отключены для модуля, включая статические ключи и, следовательно, точки трассировки, а также перехватчики поставщиков.

Самотестирование с известным ответом

Любые реализованные алгоритмы, на которые распространяются требования FIPS 140-3, перед использованием должны выполнить самотестирование с известным ответом. Согласно Руководству по внедрению FIPS 140-3 10.3.A , для шифров достаточно одного тестового вектора для каждого алгоритма, использующего любую из поддерживаемых длин ключей, если тестируются как шифрование, так и дешифрование.

Linux CryptoAPI имеет понятие приоритетов алгоритмов, где могут сосуществовать несколько реализаций (например, одна, использующая специальные криптоинструкции, и запасной вариант для процессоров, которые не реализуют эти инструкции) одного и того же алгоритма. Следовательно, необходимо протестировать все реализации одного и того же алгоритма. Это необходимо, потому что Linux CryptoAPI позволяет обойти выбор на основе приоритета и вместо этого выбрать алгоритм с более низким приоритетом.

Алгоритмы, включенные в модуль

Все алгоритмы, включенные в модуль FIPS 140-3 при сборке из исходников android13-5.10 , перечислены ниже.

Алгоритм Реализации Одобрено Определение
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: поддерживаются все размеры ключей AES. Шаблон xts может быть составлен с любой реализацией ecb(aes) с использованием xts(<ecb(aes)-impl>) . Остальные реализации автономны. Все реализации реализуют проверку слабого ключа, требуемую FIPS; то есть ключи XTS, первая и вторая половины которых совпадают, отклоняются.
gcm(aes) gcm (шаблон), gcm-aes-ce1 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: интерфейс библиотеки предоставляется для SHA-256 в дополнение к традиционному интерфейсу CryptoAPI. Этот интерфейс библиотеки использует другую реализацию.
sha384 sha384-generic , sha384-arm64 , sha384-ce Да Криптографическая хеш-функция SHA-384: код используется совместно с SHA-512.
sha512 sha512-generic , sha512-arm64 , sha512-ce Да Криптографическая хеш-функция SHA-512
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_* , но с отключенным сопротивлением прогнозированию. Код используется совместно с вариантом, устойчивым к прогнозированию. DRBG с наивысшим приоритетом — drbg_nopr_hmac_sha256 .
jitterentropy_rng jitterentropy_rng Нет Версия 2.2.0 Jitter RNG : пользователи этого интерфейса получают свои собственные экземпляры Jitter RNG. Они не используют экземпляры, которые используют DRBG.
xcbc(aes) xcbc-aes-neon , xcbc-aes-ce Нет
cbcmac(aes) cbcmac-aes-neon , cbcmac-aes-ce Нет
essiv(cbc(aes),sha256) essiv-cbc-aes-sha256-neon , essiv-cbc-aes-sha256-ce Нет

Сборка модуля из исходников

Модуль fips140.ko можно собрать из исходников ядра GKI с помощью следующей команды:

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.