Kernel GKI menyertakan
modul kernel Linux yang disebut fips140.ko
yang mematuhi
persyaratan FIPS 140-3
untuk modul software kriptografi. Modul ini dapat dikirimkan untuk sertifikasi
FIPS jika produk yang menjalankan kernel GKI memerlukannya.
Persyaratan FIPS 140-3 berikut secara khusus harus dipenuhi sebelum rutinitas kripto digunakan:
- Modul harus memeriksa integritasnya sendiri sebelum menyediakan algoritma kriptografis.
- Modul ini harus menjalankan dan memverifikasi algoritma kriptografis yang disetujui menggunakan uji mandiri dengan jawaban yang diketahui sebelum menyediakannya.
Alasan modul kernel terpisah
Validasi FIPS 140-3 didasarkan pada gagasan bahwa setelah modul berbasis software atau hardware disertifikasi, modul tersebut tidak akan pernah diubah. Jika diubah, sertifikat harus disertifikasi ulang. Hal ini tidak cocok dengan proses pengembangan software yang digunakan saat ini, dan sebagai akibat dari persyaratan ini, modul software FIPS umumnya dirancang agar berfokus seketat mungkin pada komponen kriptografi agar memastikan bahwa perubahan yang tidak terkait dengan kriptografi tidak memerlukan evaluasi ulang kriptografi.
Kernel GKI dimaksudkan untuk diperbarui secara rutin selama seluruh masa aktifnya yang didukung. Hal ini membuat seluruh kernel tidak dapat berada dalam batas modul FIPS, karena modul tersebut harus disertifikasi ulang pada setiap update kernel. Menentukan "modul FIPS" sebagai subset dari image kernel akan memitigasi masalah ini, tetapi tidak akan menyelesaikannya, karena konten biner "modul FIPS" masih akan berubah jauh lebih sering daripada yang diperlukan.
Sebelum kernel versi 6.1, pertimbangan lainnya adalah GKI dikompilasi dengan LTO (Link Time Optimization) diaktifkan, karena LTO adalah prasyarat untuk Control Flow Integrity yang merupakan fitur keamanan penting.
Oleh karena itu, semua kode yang tercakup dalam persyaratan FIPS 140-3 dikemas
ke dalam modul kernel terpisah fips140.ko
yang hanya bergantung pada antarmuka
stabil yang diekspos oleh sumber kernel GKI tempatnya dibangun. Hal ini
berarti bahwa modul dapat digunakan dengan rilis GKI yang berbeda dari generasi
yang sama, dan modul tersebut hanya boleh diupdate dan dikirim ulang untuk sertifikasi
jika ada masalah yang diperbaiki dalam kode yang dibawa oleh modul itu sendiri.
Kapan modul harus digunakan
Kernel GKI itu sendiri membawa kode yang bergantung pada rutinitas kripto yang juga dikemas ke dalam modul kernel FIPS 140-3. Oleh karena itu, rutin kripto bawaan sebenarnya tidak dipindahkan dari kernel GKI, melainkan disalin ke dalam modul. Saat modul dimuat, rutinitas kripto bawaan akan dibatalkan pendaftarannya dari CryptoAPI Linux dan digantikan oleh rutinitas kripto yang dibawa oleh modul.
Artinya, modul fips140.ko
sepenuhnya opsional, dan hanya
membuat sense untuk men-deploy-nya jika sertifikasi FIPS 140-3 adalah persyaratan. Selain itu,
modul tidak memberikan kemampuan tambahan, dan memuat modul yang tidak perlu
hanya akan memengaruhi waktu booting, tanpa memberikan manfaat apa pun.
Cara men-deploy modul
Modul ini dapat disertakan ke dalam build Android menggunakan langkah-langkah berikut:
- Tambahkan nama modul ke
BOARD_VENDOR_RAMDISK_KERNEL_MODULES
. Hal ini menyebabkan modul disalin ke ramdisk vendor. - Tambahkan nama modul ke
BOARD_VENDOR_RAMDISK_KERNEL_MODULES_LOAD
. Hal ini menyebabkan nama modul ditambahkan kemodules.load
pada target.modules.load
menyimpan daftar modul yang dimuat olehinit
saat perangkat melakukan booting.
Pemeriksaan integritas mandiri
Modul kernel FIPS 140-3 mengambil ringkasan HMAC-SHA256 dari bagian .code
dan .rodata
-nya sendiri pada waktu pemuatan modul, dan membandingkannya dengan ringkasan
yang dicatat dalam modul. Hal ini terjadi setelah loader modul Linux
telah melakukan modifikasi biasa seperti pemrosesan relokasi ELF dan
patching alternatif untuk errata CPU ke bagian tersebut. Langkah-langkah
tambahan berikut diambil untuk memastikan ringkasan dapat direproduksi
dengan benar:
- Relokasi ELF dipertahankan di dalam modul sehingga dapat diterapkan secara terbalik ke input HMAC.
- Modul ini membalikkan patch kode apa pun yang dibuat oleh kernel untuk Dynamic Shadow Call Stack. Secara khusus, modul ini mengganti petunjuk apa pun yang didorong atau dikeluarkan dari stack panggilan bayangan dengan petunjuk Kode Autentikasi Pointer (PAC) yang ada awalnya.
- Semua patching kode lainnya dinonaktifkan untuk modul, termasuk kunci statis, dan tracepoint serta hook vendor.
Pengujian mandiri dengan jawaban yang diketahui
Setiap algoritma yang diterapkan dan tercakup dalam persyaratan FIPS 140-3 harus melakukan pengujian mandiri dengan jawaban yang diketahui sebelum digunakan. Menurut Panduan Implementasi FIPS 140-3 10.3.A, satu vektor pengujian per algoritma menggunakan salah satu panjang kunci yang didukung sudah memadai untuk cipher, selama enkripsi dan dekripsi diuji.
Linux CryptoAPI memiliki konsep prioritas algoritma, dengan beberapa implementasi (seperti yang menggunakan petunjuk kripto khusus, dan penggantian untuk CPU yang tidak menerapkan petunjuk tersebut) dari algoritma yang sama dapat bersama-sama. Oleh karena itu, Anda perlu menguji semua implementasi algoritma yang sama. Hal ini diperlukan karena Linux CryptoAPI mengizinkan pemilihan berbasis prioritas untuk diabaikan, dan algoritma dengan prioritas lebih rendah untuk dipilih.
Algoritma yang disertakan dalam modul
Semua algoritma yang disertakan dalam modul FIPS 140-3 tercantum sebagai berikut.
Hal ini berlaku untuk cabang kernel android12-5.10
, android13-5.10
, android13-5.15
,
android14-5.15
, android14-6.1
, dan android15-6.6
, meskipun
perbedaan antara versi kernel akan dicatat jika perlu.
Algoritme | Implementasi | Dapat disetujui | Definisi |
---|---|---|---|
aes |
aes-generic , aes-arm64 , aes-ce , library AES |
Ya | Cipher blok AES biasa, tanpa mode operasi: Semua ukuran kunci (128 bit, 192 bit, dan 256 bit) didukung. Semua implementasi selain implementasi library dapat disusun dengan mode operasi melalui template. |
cmac(aes) |
cmac (template), cmac-aes-neon , cmac-aes-ce |
Ya | AES-CMAC: Semua ukuran kunci AES didukung. Template cmac dapat disusun dengan implementasi aes apa pun menggunakan cmac(<aes-impl>) . Implementasi lainnya bersifat mandiri. |
ecb(aes) |
ecb (template), ecb-aes-neon , ecb-aes-neonbs , ecb-aes-ce |
Ya | AES-ECB: Semua ukuran kunci AES didukung. Template ecb dapat disusun dengan implementasi aes apa pun menggunakan ecb(<aes-impl>) . Implementasi lainnya bersifat mandiri. |
cbc(aes) |
cbc (template), cbc-aes-neon , cbc-aes-neonbs , cbc-aes-ce |
Ya | AES-CBC: Semua ukuran kunci AES didukung. Template cbc dapat disusun dengan implementasi aes apa pun menggunakan ctr(<aes-impl>) . Implementasi lainnya bersifat mandiri. |
cts(cbc(aes)) |
cts (template), cts-cbc-aes-neon , cts-cbc-aes-ce |
Ya | AES-CBC-CTS atau AES-CBC dengan ciphertext mencuri: Konvensi yang digunakan adalah CS3 ; dua blok ciphertext terakhir ditukar tanpa syarat.Semua ukuran kunci AES didukung. Template cts dapat disusun dengan implementasi cbc apa pun menggunakan cts(<cbc(aes)-impl>) . Implementasi lainnya bersifat mandiri. |
ctr(aes) |
ctr (template), ctr-aes-neon , ctr-aes-neonbs , ctr-aes-ce |
Ya | AES-CTR: Semua ukuran kunci AES didukung. Template ctr dapat disusun dengan implementasi aes apa pun menggunakan ctr(<aes-impl>) . Implementasi lainnya bersifat mandiri. |
xts(aes) |
xts (template), xts-aes-neon , xts-aes-neonbs , xts-aes-ce |
Ya | AES-XTS: Dalam kernel versi 6.1 dan yang lebih rendah, semua ukuran kunci AES didukung; dalam kernel versi 6.6 dan yang lebih tinggi, hanya AES-128 dan AES-256 yang didukung. Template xts dapat dibuat dengan implementasi ecb(aes) menggunakan xts(<ecb(aes)-impl>) . Implementasi lainnya bersifat mandiri. Semua implementasi menerapkan pemeriksaan kunci lemah yang diperlukan oleh FIPS; yaitu, kunci XTS yang paruh pertama dan keduanya sama akan ditolak. |
gcm(aes) |
gcm (template), gcm-aes-ce |
Tidak1 | AES-GCM: Semua ukuran kunci AES didukung. Hanya IV 96-bit yang didukung. Seperti semua mode AES lainnya dalam modul ini, pemanggil bertanggung jawab untuk menyediakan IV. Template gcm dapat dibuat dengan implementasi ctr(aes) dan ghash menggunakan gcm_base(<ctr(aes)-impl>,<ghash-impl>) . Implementasi lainnya bersifat mandiri. |
sha1 |
sha1-generic , sha1-ce |
Ya | Fungsi hash kriptografi SHA-1 |
sha224 |
sha224-generic , sha224-arm64 , sha224-ce |
Ya | Fungsi hash kriptografis SHA-224: Kode ini digunakan bersama dengan SHA-256. |
sha256 |
sha256-generic , sha256-arm64 , sha256-ce , library SHA-256 |
Ya | Fungsi hash kriptografi SHA-256: Antarmuka library disediakan untuk SHA-256 selain antarmuka CryptoAPI standar. Antarmuka library ini menggunakan implementasi yang berbeda. |
sha384 |
sha384-generic , sha384-arm64 , sha384-ce |
Ya | Fungsi hash kriptografi SHA-384: Kode ini dibagikan dengan SHA-512. |
sha512 |
sha512-generic , sha512-arm64 , sha512-ce |
Ya | Fungsi hash kriptografi SHA-512 |
sha3-224 |
sha3-224-generic |
Ya | Fungsi hash kriptografis SHA3-224. Hanya ada di kernel versi 6.6 dan yang lebih tinggi. |
sha3-256 |
sha3-256-generic |
Ya | Sama seperti sebelumnya, tetapi dengan panjang ringkasan 256-bit (SHA3-256). Semua panjang ringkasan menggunakan implementasi Keccak yang sama. |
sha3-384 |
sha3-384-generic |
Ya | Sama seperti sebelumnya, tetapi dengan panjang ringkasan 384-bit (SHA3-384). Semua panjang ringkasan menggunakan implementasi Keccak yang sama. |
sha3-512 |
sha3-512-generic |
Ya | Sama seperti sebelumnya, tetapi dengan panjang ringkasan 512-bit (SHA3-512). Semua panjang ringkasan menggunakan implementasi Keccak yang sama. |
hmac |
hmac (template) |
Ya | HMAC (Keyed-Hash Message Authentication Code): Template hmac dapat disusun dengan algoritma atau implementasi SHA apa pun menggunakan hmac(<sha-alg>) atau hmac(<sha-impl>) . |
stdrng |
drbg_pr_hmac_sha1 , drbg_pr_hmac_sha256 , drbg_pr_hmac_sha384 , drbg_pr_hmac_sha512 |
Ya | HMAC_DRBG dibuat instance-nya dengan fungsi hash bernama dan dengan resistensi prediksi diaktifkan: Pemeriksaan kesehatan disertakan. Pengguna antarmuka ini mendapatkan instance DRBG mereka sendiri. |
stdrng |
drbg_nopr_hmac_sha1 , drbg_nopr_hmac_sha256 , drbg_nopr_hmac_sha384 , drbg_nopr_hmac_sha512 |
Ya | Sama seperti algoritma drbg_pr_* , tetapi dengan resistensi prediksi dinonaktifkan. Kode dibagikan ke varian yang tahan prediksi. Pada kernel versi 5.10, DRBG dengan prioritas tertinggi adalah drbg_nopr_hmac_sha256 . Pada kernel versi 5.15 dan yang lebih baru, nilainya adalah drbg_pr_hmac_sha512 . |
jitterentropy_rng |
jitterentropy_rng |
Tidak | Jitter RNG, versi 2.2.0 (kernel versi 6.1 dan yang lebih lama) atau versi 3.4.0 (kernel versi 6.6 dan yang lebih baru). Pengguna antarmuka ini mendapatkan instance Jitter RNG mereka sendiri. Klien tidak menggunakan kembali instance yang digunakan DRBG. |
xcbc(aes) |
xcbc-aes-neon , xcbc-aes-ce |
Tidak | |
xctr(aes) |
xctr-aes-neon , xctr-aes-ce |
Tidak | Hanya ada dalam kernel versi 5.15 dan yang lebih tinggi. |
cbcmac(aes) |
cbcmac-aes-neon , cbcmac-aes-ce |
Tidak | |
essiv(cbc(aes),sha256) |
essiv-cbc-aes-sha256-neon , essiv-cbc-aes-sha256-ce |
Tidak |
Mem-build modul dari sumber
Untuk Android 14 dan yang lebih tinggi (termasuk
android-mainline
), buat modul fips140.ko
dari sumber menggunakan
perintah berikut.
Membangun dengan Bazel:
tools/bazel run //common:fips140_dist
Build dengan
build.sh
(lama):BUILD_CONFIG=common/build.config.gki.aarch64.fips140 build/build.sh
Perintah ini melakukan build lengkap termasuk kernel dan modul
fips140.ko
dengan konten ringkasan HMAC-SHA256 yang disematkan di dalamnya.
Panduan pengguna akhir
Panduan Petugas Keamanan Crypto
Untuk mengoperasikan modul kernel, sistem operasi harus dibatasi ke satu mode operasi operator. Hal ini ditangani secara otomatis oleh Android menggunakan hardware pengelolaan memori di prosesor.
Modul kernel tidak dapat diinstal secara terpisah; modul ini disertakan sebagai bagian dari firmware perangkat dan dimuat secara otomatis saat booting. Mode ini hanya beroperasi dalam mode operasi yang disetujui.
Petugas Crypto dapat menyebabkan pengujian mandiri dijalankan kapan saja dengan memulai ulang perangkat.
Panduan pengguna
Pengguna modul kernel adalah komponen kernel lain yang perlu menggunakan algoritma kriptografi. Modul kernel tidak memberikan logika tambahan dalam penggunaan algoritma, dan tidak menyimpan parameter apa pun di luar waktu yang diperlukan untuk melakukan operasi kriptografi.
Penggunaan algoritma untuk tujuan kepatuhan FIPS terbatas pada algoritma yang disetujui. Untuk memenuhi persyaratan "indikator layanan" FIPS 140-3, modul menyediakan fungsi fips140_is_approved_service
yang menunjukkan apakah algoritma disetujui.
Error pengujian mandiri
Jika terjadi kegagalan pengujian mandiri, modul kernel akan menyebabkan kernel panik dan perangkat tidak melanjutkan booting. Jika memulai ulang perangkat tidak menyelesaikan masalah, perangkat harus melakukan booting ke mode pemulihan untuk memperbaiki masalah dengan mem-flash ulang perangkat.
-
Implementasi AES-GCM modul diharapkan dapat "disetujui algoritma", tetapi tidak "disetujui modul". Algoritma ini dapat divalidasi, tetapi AES-GCM tidak dapat dianggap sebagai algoritma yang disetujui dari sudut pandang modul FIPS. Hal ini karena persyaratan modul FIPS untuk GCM tidak kompatibel dengan implementasi GCM yang tidak menghasilkan IV-nya sendiri. ↩