certyfikowany moduł kryptograficzny GKI z certyfikatem FIPS 140-3

Jądro GKI zawiera Moduł jądra systemu Linux o nazwie fips140.ko, który jest zgodny z Wymagania FIPS 140-3 modułów oprogramowania kryptograficznego. Ten moduł można przesłać do standardu FIPS , jeśli wymaga tego usługa z jądrem GKI.

W szczególności te wymagania FIPS 140-3 należy spełnić przed możesz zastosować procedury kryptograficzne:

  • Przed rozpoczęciem tworzenia algorytmów kryptograficznych moduł musi sprawdzić własną integralność i dostępności informacji.
  • Moduł musi sprawdzać i weryfikować zatwierdzone algorytmy kryptograficzne przy użyciu testów autotestów ze znanymi odpowiedziami.

Dlaczego oddzielny moduł jądra

Walidacja FIPS 140-3 opiera się na założeniu, że gdy oprogramowanie lub sprzęt moduł został certyfikowany, nigdy nie jest zmieniany. Jeśli została zmieniona, musi być ponownie uzyskać certyfikat. To nie odpowiada procesom tworzenia oprogramowania w obecnie używanych systemów FIPS. W związku z tym moduły oprogramowania FIPS jest zazwyczaj skoncentrowany na komponentach kryptograficznych aby mieć pewność, że zmiany niezwiązane z kryptografią mogą wymagać ponownej oceny kryptografii.

Jądro GKI powinno być regularnie aktualizowane przez cały okres długość życia. Uniemożliwia to umieszczenie całego jądra w standardzie FIPS. granicą modułu, w związku z czym taki moduł wymagałby ponownego certyfikatu dla każdego jądra systemu . Definiowanie modułu FIPS jako podzbioru obrazu jądra, ale nie pozwoli go rozwiązać, ponieważ zawartość binarna „Moduł FIPS” zmieniałyby się znacznie częściej, niż trzeba.

Przed wersją 6.1 jądra można było wziąć pod uwagę także fakt, że GKI została skompilowana z Włączono LTO (optymalizacja czasu połączenia), ponieważ był on niezbędnym elementem kontroli Integralność przepływu, czyli ważna funkcja zabezpieczeń.

Dlatego cały kod objęty normą FIPS 140-3 znajduje się w pakiecie. do osobnego modułu jądra fips140.ko, który opiera się wyłącznie na stabilnej wersji udostępnianych przez źródło jądra GKI, z którego zostało utworzone. Ten co oznacza, że moduł może być używany z różnymi wersjami GKI tego samego oraz że należy je zaktualizować i ponownie przesłać wyłącznie w celu uzyskania certyfikatu sprawdź, czy w kodzie umieszczonym przez moduł nie występują żadne błędy.

Kiedy używać modułu

Jądro GKI zawiera kod zależny od procedur kryptograficznych, są także spakowane do modułu jądra FIPS 140-3. W związku z tym wbudowane kryptowaluty że rutyny nie są przenoszone z jądra GKI, lecz są kopiowane do w module. Po wczytaniu modułu wbudowane procedury kryptograficzne są wyrejestrowane z interfejsu Linux CryptoAPI i zastąpione przez interfejsy obsługiwane przez .

Oznacza to, że moduł fips140.ko jest całkowicie opcjonalny. Zapewnia jedynie warto wdrożyć go, jeśli wymagana jest certyfikacja FIPS 140-3. Poza tym moduł nie ma żadnych dodatkowych funkcji, a ładowanie go niepotrzebnie co zwykle nie wpływa na czas uruchamiania, nie przynosząc żadnych korzyści.

Jak wdrożyć moduł

Moduł można włączyć do kompilacji Androida, wykonując te czynności:

  • Dodaj nazwę modułu do pola BOARD_VENDOR_RAMDISK_KERNEL_MODULES. Powoduje to, że który ma zostać skopiowany do folderu pamięci RAM dostawcy.
  • Dodaj nazwę modułu do pola BOARD_VENDOR_RAMDISK_KERNEL_MODULES_LOAD. Ten powoduje, że nazwa modułu jest dodawana do elementu modules.load w elemencie docelowym. modules.load zawiera listę modułów ładowanych przez tag init, gdy uruchamianie urządzenia.

Samodzielne sprawdzenie integralności

Moduł jądra FIPS 140-3 wykorzystuje skrót HMAC-SHA256 z własnego skrótu .code i .rodata w czasie wczytywania modułu, i porównuje go ze skrótem omówione w ramach modułu. Odbywa się to po tym, jak w programie ładującym moduł po wprowadzeniu standardowych zmian, takich jak przetwarzanie relokacji ELF i lub instalowanie poprawek błędów procesora w tych sekcjach. Poniżej podejmowane są dodatkowe działania, aby skrót mógł zostać odtworzony prawidłowo:

  • Relokacje ELF są zachowywane w module, więc można je zastosować na dane wejściowe HMAC.
  • Moduł odwraca wszystkie poprawki kodu wprowadzone przez jądro na potrzeby kreacji dynamicznych Stos wywołań cieni. W szczególności moduł zastępuje wszelkie instrukcje, które wypychanie lub wyskakujące okienko ze stosu wywołań cienia za pomocą kodu uwierzytelniania wskaźnika (PAC), które były dostępne pierwotnie.
  • Instalowanie poprawek kodu we wszystkich innych przypadkach jest wyłączone w module, w tym klucze statyczne i oraz punkty zaczepienia dostawcy.

Autotesty dotyczące znanej odpowiedzi

Wszystkie zaimplementowane algorytmy objęte normą FIPS 140-3 muszą jak sprawdzić znaną odpowiedź przed jej użyciem. Zgodnie z normą FIPS 140-3 Wskazówki dotyczące wdrażania 10.3.A. jeden wektor testowy na algorytm przy użyciu dowolnej z obsługiwanych długości kluczy to wystarczającą do szyfrowania, jeśli testowane jest zarówno szyfrowanie, jak i odszyfrowywanie.

W Linuksie CryptoAPI można znaleźć priorytety algorytmu, przy czym kilka z nich implementacji (np. wykorzystującą specjalne instrukcje dotyczące kryptografii, a kod zastępczy dla procesorów, które nie stosują tych instrukcji) tego samego algorytmu może współistnieć. Należy więc testować wszystkie implementacje tego samego algorytmem bezpieczeństwa. Jest to konieczne, ponieważ interfejs Linux CryptoAPI zezwala pomijanego wyboru i dla algorytmu o niższym priorytecie została wybrana.

Algorytmy zawarte w module

Wszystkie algorytmy uwzględnione w module FIPS 140-3 są wymienione poniżej. Dotyczy to tych usług: android12-5.10, android13-5.10, android13-5.15, jednak gałęzie jądra android14-5.15, android14-6.1 i android15-6.6 tam, gdzie ma to uzasadnienie, różnice między wersjami jądra.

Algorytm Implementacje Odpowiednia Definicja
aes aes-generic, aes-arm64, aes-ce, biblioteka AES Tak Zwykły szyfr blokowy AES bez trybu działania: obsługiwane są wszystkie rozmiary kluczy (128-, 192-bitowe i 256-bitowe). Wszystkie implementacje inne niż implementacja biblioteki można skomponować z trybem działania z poziomu szablonu.
cmac(aes) cmac (szablon), cmac-aes-neon, cmac-aes-ce Tak AES-CMAC: obsługiwane są wszystkie rozmiary kluczy AES. Szablon cmac może być utworzony z dowolną implementacją elementu aes za pomocą atrybutu cmac(<aes-impl>). Pozostałe implementacje są niezależne.
ecb(aes) ecb (szablon), ecb-aes-neon, ecb-aes-neonbs, ecb-aes-ce Tak AES-ECB: obsługiwane są wszystkie rozmiary kluczy AES. Szablon ecb może być utworzony z dowolną implementacją elementu aes za pomocą atrybutu ecb(<aes-impl>). Pozostałe implementacje są niezależne.
cbc(aes) cbc (szablon), cbc-aes-neon, cbc-aes-neonbs, cbc-aes-ce Tak AES-CBC: obsługiwane są wszystkie rozmiary kluczy AES. Szablon cbc może być utworzony z dowolną implementacją elementu aes za pomocą atrybutu ctr(<aes-impl>). Pozostałe implementacje są niezależne.
cts(cbc(aes)) cts (szablon), cts-cbc-aes-neon, cts-cbc-aes-ce Tak AES-CBC-CTS lub AES-CBC z kradzieżą tekstu zaszyfrowanego: stosowana konwencja to CS3; ostatnie dwa bloki tekstu zaszyfrowanego są zastępowane bezwarunkowo.Obsługiwane są wszystkie rozmiary kluczy AES.Szablon cts może być utworzony z dowolną implementacją elementu cbc za pomocą atrybutu cts(<cbc(aes)-impl>).Pozostałe implementacje są niezależne.
ctr(aes) ctr (szablon), ctr-aes-neon, ctr-aes-neonbs, ctr-aes-ce Tak AES-CTR: obsługiwane są wszystkie rozmiary kluczy AES. Szablon ctr może być utworzony z dowolną implementacją elementu aes za pomocą atrybutu ctr(<aes-impl>). Pozostałe implementacje są niezależne.
xts(aes) xts (szablon), xts-aes-neon, xts-aes-neonbs, xts-aes-ce Tak AES-XTS: w jądrze w wersji 6.1 lub starszej obsługiwane są wszystkie rozmiary kluczy AES. w jądrze w wersji 6.6 lub nowszej obsługiwane są tylko AES-128 i AES-256. Szablon xts może być utworzony z dowolną implementacją elementu ecb(aes) za pomocą atrybutu xts(<ecb(aes)-impl>). Pozostałe implementacje są niezależne. we wszystkich implementacjach stosuje się słabą kontrolę klucza wymaganą przez FIPS; czyli klucze XTS, których pierwsza i druga połowa są równe, są odrzucane.
gcm(aes) gcm (szablon), gcm-aes-ce Nr1 AES-GCM: obsługiwane są wszystkie rozmiary kluczy AES. Obsługiwane są tylko 96-bitowe pliki IV. Tak jak w przypadku wszystkich innych trybów AES w tym module, za dostarczanie IV odpowiada element wywołujący. Szablon gcm może zawierać dowolne implementacje komponentów ctr(aes) i ghash w języku gcm_base(<ctr(aes)-impl>,<ghash-impl>). Pozostałe implementacje są niezależne.
sha1 sha1-generic, sha1-ce Tak kryptograficzna funkcja skrótu SHA-1,
sha224 sha224-generic, sha224-arm64, sha224-ce Tak Funkcja szyfrowania SHA-224: kod jest udostępniany z wykorzystaniem algorytmu SHA-256.
sha256 Biblioteka sha256-generic, sha256-arm64, sha256-ce, SHA-256 Tak Funkcja skrótu kryptograficznego SHA-256: oprócz standardowego interfejsu CryptoAPI interfejs biblioteki SHA-256 jest udostępniany. Interfejs tego biblioteki ma inną implementację.
sha384 sha384-generic, sha384-arm64, sha384-ce Tak Funkcja szyfrowania SHA-384: kod jest udostępniany z wykorzystaniem algorytmu SHA-512.
sha512 sha512-generic, sha512-arm64, sha512-ce Tak Kryptograficzna funkcja skrótu SHA-512
sha3-224 sha3-224-generic Tak kryptograficzna funkcja skrótu SHA3-224, Występuje tylko w jądrze w wersji 6.6 lub nowszej.
sha3-256 sha3-256-generic Tak Tak samo jak wyżej, ale z 256-bitowym skrótem o długości SHA3-256. Wszystkie długości skrótu używają tej samej implementacji Keccak.
sha3-384 sha3-384-generic Tak Tak samo jak wyżej, ale z 384-bitowym skrótem o długości SHA3-384. Wszystkie długości skrótu używają tej samej implementacji Keccak.
sha3-512 sha3-512-generic Tak Tak samo jak wyżej, ale z 512-bitowym skrótem o długości SHA3-512. Wszystkie długości skrótu używają tej samej implementacji Keccak.
hmac hmac (szablon) Tak HMAC (Keyed-Hash Message Authentication Code): szablon hmac może zawierać dowolny algorytm SHA lub implementację przy użyciu hmac(<sha-alg>) bądź hmac(<sha-impl>).
stdrng drbg_pr_hmac_sha1, drbg_pr_hmac_sha256, drbg_pr_hmac_sha384, drbg_pr_hmac_sha512 Tak Wystąpienie HMAC_DRBG z nazwaną funkcją skrótu i włączoną odpornością na prognozy: uwzględniane są kontrole stanu. Użytkownicy tego interfejsu otrzymują własne instancje DRBG.
stdrng drbg_nopr_hmac_sha1, drbg_nopr_hmac_sha256, drbg_nopr_hmac_sha384, drbg_nopr_hmac_sha512 Tak Taki sam jak algorytm drbg_pr_*, ale z wyłączoną odpornością na prognozy. Kod jest udostępniany wariantowi odpornem na prognozy. W jądrze w wersji 5.10 DRBG o najwyższym priorytecie to drbg_nopr_hmac_sha256. W jądrze w wersji 5.15 lub nowszej jest to drbg_pr_hmac_sha512.
jitterentropy_rng jitterentropy_rng Nie Jitter RNG w wersji 2.2.0 (jądro w wersji 6.1 lub starszej) lub 3.4.0 (jądro w wersji 6.6 lub nowszej). Użytkownicy tego interfejsu otrzymują własne instancje zakłóceń RNG. Nie używają ponownie instancji używanych przez DRBG.
xcbc(aes) xcbc-aes-neon, xcbc-aes-ce Nie
xctr(aes) xctr-aes-neon, xctr-aes-ce Nie Występuje tylko w jądrze w wersji 5.15 lub nowszej.
cbcmac(aes) cbcmac-aes-neon, cbcmac-aes-ce Nie
essiv(cbc(aes),sha256) essiv-cbc-aes-sha256-neon, essiv-cbc-aes-sha256-ce Nie

Skompiluj moduł na podstawie źródła

Na Androida 14 i nowszego (w tym android-mainline), utwórz moduł fips140.ko ze źródła za pomocą tych poleceń.

  • Tworzenie w Bazelu:

    tools/bazel run //common:fips140_dist
    
  • Kompilacja z wykorzystaniem build.sh (starsza wersja):

    BUILD_CONFIG=common/build.config.gki.aarch64.fips140 build/build.sh
    

Te polecenia wykonują pełną kompilację, w tym jądro i fips140.ko z umieszczoną w nim treścią skrótu HMAC-SHA256.

Wskazówki dla użytkowników

Wskazówki dla dyrektora ds. kryptowalut

Aby można było obsługiwać moduł jądra, system operacyjny musi być ograniczony do w trybie działania pojedynczego operatora. Android obsługuje to automatycznie przez wykorzystanie w procesorze sprzętu do zarządzania pamięcią.

Moduł jądra nie może być zainstalowany oddzielnie; jest częścią oprogramowania urządzenia i automatycznie załadowany podczas uruchamiania. Działa ona tylko zatwierdzony tryb działania.

Crypto Officer może uruchomić autotesty w dowolnym momencie, uruchamiając je ponownie urządzenia.

Wskazówki dla użytkownika

Użytkownikiem modułu jądra są inne komponenty jądra, które muszą do algorytmów kryptograficznych. Moduł jądra nie udostępnia dodatkowej logiki wykorzystanie algorytmów i nie przechowuje żadnych parametrów poza czasem potrzebne do przeprowadzenia operacji kryptograficznej.

Użycie algorytmów do celów zgodności z FIPS jest ograniczone do zatwierdzonych za pomocą algorytmów. W celu spełnienia wymogów standardu FIPS 140-3 „service wskaźniki” funkcji moduł zawiera funkcję fips140_is_approved_service, która wskazuje, czy algorytm został zatwierdzony.

Błędy autotestu

W przypadku niepowodzenia autotestu moduł jądra powoduje uruchomienie panik i urządzenie nie będzie dalej uruchamiać się. Jeśli ponowne uruchomienie urządzenia nie rozwiąże problemu, urządzenie musi uruchomić się w trybie przywracania, aby naprawić błąd problem, ponownie instalując urządzenie.


  1. Implementacje AES-GCM w module mogą być „algorytmem”, zatwierdzone” ale nie „moduł zatwierdzony”. Można je zweryfikować, ale AES-GCM nie można uznać za zatwierdzony algorytm z punktu widzenia modułu FIPS. Dzieje się tak, ponieważ wymagania modułu FIPS w GCM są niezgodne z implementacje GCM, które nie generują własnych identyfikatorów IV;