Ядро 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
. Это приведет к копированию модуля на ramdisk поставщика. - Добавьте имя модуля в
BOARD_VENDOR_RAMDISK_KERNEL_MODULES_LOAD
. Это приведет к добавлению имени модуля вmodules.load
на целевом устройстве.modules.load
содержит список модулей, которые загружаютсяinit
при загрузке устройства.
Самопроверка целостности
Модуль ядра FIPS 140-3 берет дайджест HMAC-SHA256 своих собственных разделов .code
и .rodata
во время загрузки модуля и сравнивает его с дайджестом, записанным в модуле. Это происходит после того, как загрузчик модуля Linux уже выполнил обычные изменения, такие как обработка перемещения ELF и альтернативные исправления для ошибок ЦП в этих разделах. Для обеспечения корректного воспроизведения дайджеста выполняются следующие дополнительные шаги:
- Перемещения ELF сохраняются внутри модуля, поэтому их можно применять в обратном порядке ко входу HMAC.
- Модуль отменяет любые исправления кода, которые были сделаны ядром для Dynamic Shadow Call Stack. В частности, модуль заменяет любые инструкции, которые выталкивают или выталкивают из теневого стека вызовов, на инструкции Pointer Authentication Code (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. ↩