FIPS 140-3 인증 가능한 GKI 암호화 모듈

GKI 커널에는 암호화 소프트웨어 모듈에 대한 FIPS 140-3 요구 사항을 준수하는 fips140.ko 라는 Linux 커널 모듈이 포함되어 있습니다. GKI 커널을 실행하는 제품에 필요한 경우 FIPS 인증을 위해 이 모듈을 제출할 수 있습니다.

암호화 루틴을 사용하려면 특히 다음 FIPS 140-3 요구 사항을 충족해야 합니다.

  • 모듈은 암호화 알고리즘을 사용 가능하게 만들기 전에 자체 무결성을 확인해야 합니다.
  • 모듈은 승인된 암호화 알고리즘을 사용 가능하게 하기 전에 알려진 답변 자체 테스트를 통해 실행하고 검증해야 합니다.

별도의 커널 모듈이 필요한 이유

FIPS 140-3 검증은 일단 소프트웨어 또는 하드웨어 기반 모듈이 인증되면 절대 변경되지 않는다는 아이디어를 기반으로 합니다. 변경된 경우에는 재인증을 받아야 합니다. 이는 현재 사용 중인 소프트웨어 개발 프로세스와 쉽게 일치하지 않으며 이러한 요구 사항의 결과로 FIPS 소프트웨어 모듈은 일반적으로 암호화와 관련되지 않은 변경 사항이 수행되도록 보장하기 위해 암호화 구성 요소에 최대한 집중하도록 설계되었습니다. 암호화에 대한 재평가가 필요하지 않습니다.

GKI 커널은 지원되는 전체 수명 동안 정기적으로 업데이트되도록 설계되었습니다. 이로 인해 전체 커널이 FIPS 모듈 경계 내에 있는 것이 불가능해집니다. 이러한 모듈은 모든 커널 업데이트 시마다 재인증되어야 하기 때문입니다. "FIPS 모듈"을 커널 이미지의 하위 집합으로 정의하면 이 문제가 완화될 수 있지만 해결되지는 않습니다. "FIPS 모듈"의 바이너리 콘텐츠는 여전히 필요한 것보다 훨씬 더 자주 변경되기 때문입니다.

커널 버전 6.1 이전에는 LTO(링크 시간 최적화)가 활성화된 상태에서 GKI가 컴파일되었다는 또 다른 고려 사항이 있었습니다. LTO는 중요한 보안 기능인 제어 흐름 무결성을 위한 전제 조건이기 때문입니다.

따라서 FIPS 140-3 요구 사항이 적용되는 모든 코드는 빌드된 GKI 커널 소스에 의해 노출된 안정적인 인터페이스에만 의존하는 별도의 커널 모듈 fips140.ko 로 패키지됩니다. 이렇게 하면 모듈을 동일한 세대의 다양한 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 커널 모듈은 모듈 로드 시 자체 .code.rodata 섹션의 HMAC-SHA256 다이제스트를 가져와 모듈에 기록된 다이제스트와 비교합니다. 이는 Linux 모듈 로더가 ELF 재배치 처리 및 해당 섹션에 대한 CPU 오류에 대한 대체 패치와 같은 일반적인 수정을 이미 수행한 후에 발생합니다. 다이제스트가 올바르게 재생될 수 있도록 다음과 같은 추가 단계가 수행됩니다.

  • ELF 재배치는 모듈 내부에 보존되므로 HMAC의 입력에 역으로 적용될 수 있습니다.
  • 정적 키, 추적점 및 공급업체 후크를 포함하여 모듈에 대한 다른 모든 코드 패치가 비활성화됩니다.

알려진 답변 자체 테스트

FIPS 140-3 요구 사항이 적용되는 구현된 알고리즘은 사용하기 전에 알려진 답변 자체 테스트를 수행해야 합니다. FIPS 140-3 구현 지침 10.3.A 에 따르면 암호화 및 암호 해독이 모두 테스트되는 한 지원되는 키 길이를 사용하는 알고리즘당 단일 테스트 벡터로 충분합니다.

Linux CryptoAPI에는 동일한 알고리즘의 여러 구현(예: 특수 암호화 지침을 사용하는 구현 및 해당 지침을 구현하지 않는 CPU에 대한 대체)이 공존할 수 있는 알고리즘 우선 순위 개념이 있습니다. 따라서 동일한 알고리즘의 모든 구현을 테스트할 필요가 있습니다. 이는 Linux CryptoAPI가 우선순위 기반 선택을 회피하고 대신 우선순위가 낮은 알고리즘을 선택할 수 있도록 허용하기 때문에 필요합니다.

모듈에 포함된 알고리즘

FIPS 140-3 모듈에 포함된 모든 알고리즘은 다음과 같습니다. 이는 android12-5.10 , android13-5.10 , android13-5.15 , android14-5.15android14-6.1 커널 브랜치에 적용되지만 커널 버전 간의 차이점은 해당되는 곳에 명시되어 있습니다.

연산 구현 승인 가능 정의
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 템플릿은 cmac(<aes-impl>) 사용하여 aes 를 구현하여 구성할 수 있습니다. 다른 구현은 독립형입니다.
ecb(aes) ecb (템플릿), ecb-aes-neon , ecb-aes-neonbs , ecb-aes-ce AES-ECB: 모든 AES 키 크기가 지원됩니다. ecb 템플릿은 ecb(<aes-impl>) 사용하여 aes 를 구현하여 구성할 수 있습니다. 다른 구현은 독립형입니다.
cbc(aes) cbc (템플릿), cbc-aes-neon , cbc-aes-neonbs , cbc-aes-ce AES-CBC: 모든 AES 키 크기가 지원됩니다. cbc 템플릿은 ctr(<aes-impl>) 사용하여 aes 를 구현하여 구성할 수 있습니다. 다른 구현은 독립형입니다.
cts(cbc(aes)) cts (템플릿), cts-cbc-aes-neon , cts-cbc-aes-ce 암호문 도용이 포함된 AES-CBC-CTS 또는 AES-CBC: 사용되는 규칙은 CS3 입니다. 마지막 두 암호문 블록은 무조건 교체됩니다. 모든 AES 키 크기가 지원됩니다. cts 템플릿은 cts(<cbc(aes)-impl>) 사용하여 모든 cbc 구현으로 구성될 수 있습니다. 다른 구현은 독립형입니다.
ctr(aes) ctr (템플릿), ctr-aes-neon , ctr-aes-neonbs , ctr-aes-ce AES-CTR: 모든 AES 키 크기가 지원됩니다. ctr 템플릿은 ctr(<aes-impl>) 사용하여 aes 를 구현하여 구성할 수 있습니다. 다른 구현은 독립형입니다.
xts(aes) xts (템플릿), xts-aes-neon , xts-aes-neonbs , xts-aes-ce AES-XTS: 모든 AES 키 크기가 지원됩니다. xts 템플릿은 xts(<ecb(aes)-impl>) 사용하여 ecb(aes) 를 구현하여 구성할 수 있습니다. 다른 구현은 독립형입니다. 모든 구현은 FIPS에서 요구하는 취약한 키 검사를 구현합니다. 즉, 첫 번째 절반과 두 번째 절반이 동일한 XTS 키는 거부됩니다.
gcm(aes) gcm (템플릿), gcm-aes-ce 1 AES-GCM: 모든 AES 키 크기가 지원됩니다. 96비트 IV만 지원됩니다. 이 모듈의 다른 모든 AES 모드와 마찬가지로 호출자는 IV를 제공할 책임이 있습니다. gcm 템플릿은 gcm_base(<ctr(aes)-impl>,<ghash-impl>) 사용하여 ctr(aes)ghash 의 구현으로 구성될 수 있습니다. 다른 구현은 독립형입니다.
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(Keyed-Hash Message Authentication Code): hmac 템플릿은 hmac(<sha-alg>) 또는 hmac(<sha-impl>) 사용하여 SHA 알고리즘 또는 구현으로 구성될 수 있습니다.
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: 이 인터페이스의 사용자는 자신만의 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 포함)에서는 다음을 사용하여 GKI 커널 소스에서 fips140.ko 모듈을 빌드할 수 있습니다.

tools/bazel run //common:fips140_dist

Android 13 이하에서는 다음을 사용하여 GKI 커널 소스에서 fips140.ko 모듈을 빌드할 수 있습니다.

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

이는 콘텐츠의 올바른 HMAC-SHA256 다이제스트가 포함된 커널 및 fips140.ko 모듈을 사용하여 전체 빌드를 수행합니다.

Android 14 이상에서는 다음 명령어를 사용하여 build/build.sh 대신 Bazel 로 빌드하세요.

tools/bazel run //common:fips140_dist

최종 사용자 지침

암호화 담당자 지침

커널 모듈을 작동하려면 운영 체제를 단일 운영자 작동 모드로 제한해야 합니다. 이는 프로세서의 메모리 관리 하드웨어를 사용하여 Android에서 자동으로 처리됩니다.

커널 모듈은 별도로 설치할 수 없습니다. 이는 장치 펌웨어의 일부로 포함되어 있으며 부팅 시 자동으로 로드됩니다. 승인된 작동 모드에서만 작동합니다.

암호화 담당자는 장치를 다시 시작하여 언제든지 자체 테스트를 실행할 수 있습니다.

사용자 안내

커널 모듈의 사용자는 암호화 알고리즘을 사용해야 하는 다른 커널 구성 요소입니다. 커널 모듈은 알고리즘 사용 시 추가 논리를 제공하지 않으며 암호화 작업을 수행하는 데 필요한 시간 이상의 매개변수를 저장하지 않습니다.

FIPS 준수 목적으로 알고리즘을 사용하는 것은 승인된 알고리즘으로 제한됩니다. FIPS 140-3 "서비스 표시기" 요구 사항을 충족하기 위해 모듈은 알고리즘 승인 여부를 나타내는 fips140_is_approved_service 함수를 제공합니다.

자체 테스트 오류

자체 테스트가 실패하는 경우 커널 모듈로 인해 커널이 패닉 상태가 되고 장치가 계속 부팅되지 않습니다. 장치를 재부팅해도 문제가 해결되지 않으면 장치를 복구 모드로 부팅하여 장치를 다시 플래시하여 문제를 해결해야 합니다.


  1. 모듈의 AES-GCM 구현은 "알고리즘 승인"이 가능하지만 "모듈 승인"은 불가능할 것으로 예상됩니다. 검증될 수 있지만 AES-GCM은 FIPS 모듈 관점에서 승인된 알고리즘으로 간주될 수 없습니다. 이는 GCM에 대한 FIPS 모듈 요구 사항이 자체 IV를 생성하지 않는 GCM 구현과 호환되지 않기 때문입니다.