GKI 커널에는 암호화 소프트웨어 모듈의 FIPS 140-3 요구사항을 준수하는 fips140.ko
라는 Linux 커널 모듈이 포함되어 있습니다. 이 모듈은 GKI 커널을 실행하는 제품에 필요한 경우 FIPS 인증을 위해 제출할 수 있습니다.
암호화 루틴을 사용하려면 특히 다음 FIPS 140-3 요구사항을 충족해야 합니다.
- 모듈은 암호화 알고리즘을 제공하기 전에 자체 무결성을 확인해야 합니다.
- 모듈은 알려진 답변 자동 테스트를 사용하여 승인된 암호화 알고리즘을 실행 및 확인한 후 제공해야 합니다.
별도의 커널 모듈인 이유
FIPS 140-3 검증은 소프트웨어나 하드웨어 기반 모듈이 일단 인증되면 변경되지 않는다는 개념을 바탕으로 합니다. 변경한 경우 재인증을 받아야 합니다. 이는 현재 사용되는 소프트웨어 개발 프로세스와 쉽게 일치하지 않으며, 이러한 요구사항의 결과 FIPS 소프트웨어 모듈은 일반적으로 암호화 구성요소에 최대한 중점을 두도록 설계되어 암호화와 관련 없는 변경사항은 암호화 재평가가 필요하지 않도록 합니다.
GKI 커널은 지원되는 전체 수명 동안 정기적으로 업데이트되도록 만들어졌습니다. 따라서 전체 커널이 FIPS 모듈 경계 내에 있도록 할 수 없습니다. 이러한 모듈은 모든 커널 업데이트 시 재인증되어야 하기 때문입니다. 'FIPS 모듈'이 커널 이미지의 하위 집합이 되도록 정의하면 이 문제를 완화할 수 있긴 하나, 이 경우에도 'FIPS module'의 바이너리 콘텐츠가 필요한 횟수보다 많이 변경되므로 문제가 해결되지는 않습니다.
커널 버전 6.1 이전에는 GKI가 LTO(링크 시간 최적화)가 설정된 상태로 컴파일되는 것도 또 한 가지 고려 사항이었습니다. 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의 입력에 역으로 적용될 수 있도록 모듈 내부에 유지됩니다.
- 정적 키와 tracepoint, 공급업체 후크를 포함하여 모듈의 다른 모든 코드 패치는 사용 중지됩니다.
알려진 답변 자동 테스트
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.15
, android14-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 암호화 해시 함수: 기존 CryptoAPI 인터페이스 외에 라이브러리 인터페이스가 SHA-256에도 제공됩니다. 이 라이브러리 인터페이스는 다른 구현을 사용합니다. |
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는 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-ce cbcmac-aes-neon |
아니요 | |
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 모듈 관점에서 승인된 알고리즘으로 간주될 수 없습니다. 이는 GCM의 FIPS 모듈 요구사항이 자체 IV를 생성하지 않는 GCM 구현과 호환되지 않기 때문입니다. ↩