Kernel GKI mencakup
Modul kernel Linux yang disebut fips140.ko
yang mematuhi
Persyaratan FIPS 140-3
untuk modul perangkat lunak kriptografi. Modul ini dapat dikirimkan untuk FIPS
sertifikasi jika produk yang menjalankan
{i>kernel<i} GKI memerlukannya.
Persyaratan FIPS 140-3 berikut secara khusus harus dipenuhi sebelum rutinitas kripto dapat digunakan:
- Modul tersebut harus memeriksa integritasnya sendiri sebelum membuat algoritma kriptografi yang tersedia.
- Modul ini harus menjalankan dan memverifikasi algoritma kriptografinya yang disetujui menggunakan tes mandiri dengan jawaban yang telah diketahui sebelum menyediakannya.
Mengapa modul kernel terpisah
Validasi FIPS 140-3 didasarkan pada gagasan bahwa sekali perangkat lunak atau perangkat keras telah disertifikasi, modul ini tidak pernah berubah. Jika diubah, harus tersertifikasi ulang. Proses ini tidak cocok dengan proses pengembangan perangkat lunak dalam digunakan saat ini, dan sebagai akibat dari persyaratan ini, modul perangkat lunak FIPS yang dirancang untuk fokus pada komponen kriptografi. untuk memastikan bahwa perubahan yang tidak terkait dengan kriptografi tidak terkait dengan memerlukan evaluasi ulang kriptografi tersebut.
Kernel GKI dimaksudkan untuk diperbarui secara rutin selama seluruh masa hidup Anda. Hal ini membuat seluruh {i> kernel<i} tidak layak berada dalam FIPS batas modul, sehingga modul perlu disertifikasi ulang pada setiap {i>kernel<i} memperbarui. Menentukan "modul FIPS" menjadi subset dari gambar kernel akan mengurangi masalah ini tetapi tidak akan menyelesaikannya, karena isi biner dari "Modul FIPS" masih akan berubah jauh lebih sering dari yang dibutuhkan.
Sebelum {i>kernel<i} versi 6.1, pertimbangan lain adalah bahwa GKI dikompilasi dengan LTO (Pengoptimalan Waktu Penautan) diaktifkan, karena LTO merupakan prasyarat untuk Kontrol Integritas Alur yang merupakan fitur keamanan penting.
Oleh karena itu, semua kode yang dicakup
oleh persyaratan FIPS 140-3 dikemas
menjadi modul kernel terpisah fips140.ko
yang hanya bergantung pada jaringan
yang diekspos oleh sumber {i>
kernel<i} GKI tempatnya dibangun. Ini
berarti modul tersebut dapat digunakan
dengan rilis GKI yang berbeda
pembuatan, dan harus diperbarui serta
dikirimkan ulang untuk sertifikasi saja
jika ada masalah yang diperbaiki dalam kode yang dibawa oleh modul itu sendiri.
Kapan harus menggunakan modul
{i>Kernel<i} GKI sendiri membawa kode yang tergantung pada rutinitas kripto yang juga dikemas ke dalam modul {i>kernel<i} FIPS 140-3. Oleh karena itu, kriptografi{i> <i}bawaan dan rutinitas itu tidak benar-benar dipindahkan dari {i>kernel<i} GKI, melainkan disalin ke modul ini. Ketika modul dimuat, rutinitas kripto bawaan akan dibatalkan pendaftarannya dari CryptoAPI Linux dan digantikan oleh yang ruang lingkup modul ini.
Ini berarti bahwa modul fips140.ko
sepenuhnya opsional, dan hanya membuat
masuk akal untuk menerapkannya jika
sertifikasi FIPS 140-3 adalah persyaratan. Lebih dari itu,
modul ini tidak memberikan kemampuan tambahan, dan memuatnya secara tidak perlu
hanya mempengaruhi waktu {i>booting<i},
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 untuk disalin ke {i>ramdisk<i} vendor. - Tambahkan nama modul ke
BOARD_VENDOR_RAMDISK_KERNEL_MODULES_LOAD
. Ini menyebabkan nama modul ditambahkan kemodules.load
pada target.modules.load
menyimpan daftar modul yang dimuat olehinit
saat booting perangkat.
Pemeriksaan mandiri integritas
Modul kernel FIPS 140-3 mengambil ringkasan HMAC-SHA256 dari .code
-nya sendiri
dan .rodata
pada waktu muat modul, lalu membandingkannya dengan ringkasan
direkam dalam modul. Ini terjadi setelah loader modul Linux memiliki
sudah melakukan modifikasi biasa seperti pemrosesan relokasi ELF dan
alternatif {i>patching<i} untuk
CPU errata ke bagian-bagian itu. Hal berikut
langkah tambahan diambil untuk memastikan
bahwa ringkasan dapat direproduksi
dengan benar:
- Relokasi ELF disimpan di dalam modul sehingga dapat diterapkan dalam terbalik ke input HMAC.
- Modul ini membalikkan patch kode apa pun yang dibuat oleh kernel untuk Dynamic Stack Panggilan Bayangan. Secara khusus, modul menggantikan instruksi apa pun yang dorong atau keluar dari stack panggilan bayangan dengan Kode Autentikasi Pointer (PAC) yang ada di awal.
- Semua patching kode lainnya dinonaktifkan untuk modul, termasuk kunci statis dan oleh karena itu, tracepoint serta hook vendor.
Tes mandiri dengan jawaban yang diketahui
Setiap algoritma yang diimplementasikan yang dicakup oleh persyaratan FIPS 140-3 harus melakukan tes mandiri dengan jawaban yang diketahui sebelum digunakan. Menurut laporan FIPS 140-3 Panduan Penerapan 10.3.A, vektor uji tunggal per algoritma yang menggunakan salah satu panjang kunci yang didukung memadai untuk penyandian, selama enkripsi dan dekripsi diuji.
CryptoAPI Linux memiliki gagasan tentang prioritas algoritma, di mana beberapa (seperti penggunaan petunjuk kripto khusus, dan penggantian untuk CPU yang tidak menerapkan petunjuk tersebut) dari algoritma yang sama mungkin terjadi berdampingan. Karenanya, perlu menguji semua implementasi dari algoritme. Hal ini diperlukan karena Linux CryptoAPI mengizinkan prioritas dikesampingkan, dan untuk algoritma dengan prioritas lebih rendah dipilih sebagai gantinya.
Algoritma yang disertakan dalam modul
Semua algoritma yang disertakan dalam modul FIPS 140-3 tercantum sebagai berikut.
Ini berlaku untuk android12-5.10
, android13-5.10
, android13-5.15
,
Namun, cabang kernel android14-5.15
, android14-6.1
, dan android15-6.6
perbedaan antara versi {i>kernel<i}
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 dibuat dengan implementasi aes 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 dibuat dengan implementasi aes 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 dibuat dengan implementasi aes 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 teks tersandi terakhir
ditukar tanpa syarat.Semua ukuran kunci AES didukung.Template cts dapat dibuat dengan implementasi cbc 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 dibuat dengan implementasi aes 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; di 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 diwajibkan oleh FIPS; yaitu, kunci XTS dengan bagian pertama dan kedua yang 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 kriptografi SHA-224: Kode dibagikan dengan SHA-256. |
sha256 |
Library sha256-generic , sha256-arm64 , sha256-ce , SHA-256 |
Ya | Fungsi hash kriptografi SHA-256: Antarmuka library disediakan untuk SHA-256 sebagai tambahan untuk antarmuka CryptoAPI standar. Antarmuka library ini menggunakan implementasi yang berbeda. |
sha384 |
sha384-generic , sha384-arm64 , sha384-ce |
Ya | Fungsi hash kriptografi SHA-384: Kode 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 dalam kernel versi 6.6 dan yang lebih tinggi. |
sha3-256 |
sha3-256-generic |
Ya | Sama seperti sebelumnya, tetapi dengan panjang digest 256-bit (SHA3-256). Semua durasi ringkasan menggunakan implementasi Keccak yang sama. |
sha3-384 |
sha3-384-generic |
Ya | Sama seperti sebelumnya, tetapi dengan panjang digest 384-bit (SHA3-384). Semua durasi ringkasan menggunakan implementasi Keccak yang sama. |
sha3-512 |
sha3-512-generic |
Ya | Sama seperti sebelumnya, tetapi dengan panjang digest 512-bit (SHA3-512). Semua durasi ringkasan menggunakan implementasi Keccak yang sama. |
hmac |
hmac (template) |
Ya | HMAC (Keyed-Hash Message Authentication Code): Template hmac dapat dibuat dengan algoritma SHA atau implementasi 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 ketahanan prediksi diaktifkan: Health check disertakan. Pengguna antarmuka ini mendapatkan instance DRBG-nya 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 ketahanan prediksi dinonaktifkan. Kode tersebut dibagikan dengan varian yang tahan prediksi. Dalam kernel versi 5.10, DRBG dengan prioritas tertinggi adalah drbg_nopr_hmac_sha256 . Pada kernel versi 5.15 dan yang lebih tinggi, atributnya 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 |
Membuat modul dari sumber
Untuk Android 14 dan yang lebih baru (termasuk
android-mainline
), buat modul fips140.ko
dari sumber menggunakan
perintah berikut.
Membangun dengan Bazel:
tools/bazel run //common:fips140_dist
Bangun dengan
build.sh
(lama):BUILD_CONFIG=common/build.config.gki.aarch64.fips140 build/build.sh
Perintah ini menjalankan build lengkap, termasuk kernel dan fips140.ko
dengan konten intisari
HMAC-SHA256 yang disematkan di dalamnya.
Panduan pengguna akhir
Panduan Petugas Kripto
Untuk mengoperasikan modul {i>kernel<i}, sistem operasi harus dibatasi hanya mode operasi operator tunggal. Ini ditangani secara otomatis oleh Android menggunakan perangkat keras manajemen memori dalam prosesor.
Modul {i>kernel<i} tidak dapat diinstal secara terpisah; hal ini disertakan sebagai bagian dari {i>firmware perangkat<i} dan dimuat secara otomatis saat {i>booting<i}. AI hanya beroperasi di yang disetujui.
Petugas Kripto dapat menyebabkan tes mandiri dijalankan kapan saja dengan memulai ulang perangkat.
Panduan pengguna
Pengguna modul {i>kernel<i} adalah komponen {i> kernel<i} lain yang perlu menggunakan algoritme kriptografi. Modul {i>kernel<i} tidak menyediakan 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 dibatasi hanya pada
algoritme. Untuk memenuhi "indikator layanan" FIPS 140-3 persyaratan,
menyediakan fungsi fips140_is_approved_service
yang menunjukkan apakah
algoritma disetujui.
Error pengujian mandiri
Jika terjadi kegagalan uji mandiri, modul {i>kernel<i} akan menyebabkan {i>kernel<i} panik dan perangkat tidak melanjutkan {i>booting<i}. Jika {i>reboot<i} perangkat melakukan tidak menyelesaikan masalah, perangkat harus {i>booting<i} ke mode pemulihan untuk memperbaiki masalah dengan mem-flash ulang perangkat.
-
Implementasi AES-GCM modul diharapkan bisa berupa "algoritma disetujui" tetapi bukan "modul disetujui". URL tersebut dapat divalidasi, namun 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 sendiri. ↩