Ядро 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-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: интерфейс библиотеки предоставляется для 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
, которая указывает, одобрен ли алгоритм.
Ошибки самопроверки
В случае сбоя самопроверки модуль ядра вызывает панику ядра, и устройство не продолжает загрузку. Если перезагрузка устройства не решает проблему, устройство должно загрузиться в режиме восстановления, чтобы устранить проблему путем перепрошивки устройства.
Ожидается, что реализации модуля AES-GCM могут быть «утверждены алгоритмом», но не «утверждены модулем». Их можно проверить, но AES-GCM нельзя считать утвержденным алгоритмом с точки зрения модуля FIPS. Это связано с тем, что требования модуля FIPS для GCM несовместимы с реализациями GCM, которые не создают свои собственные IV. ↩