Kernel GKI mencakup modul kernel Linux yang disebut fips140.ko yang mematuhi persyaratan FIPS 140-3 untuk modul software kriptografis.
Modul ini dapat dikirimkan untuk sertifikasi FIPS jika produk yang menjalankan kernel GKI memerlukannya.
Persyaratan FIPS 140-3 berikut khususnya harus dipenuhi sebelum rutin kripto dapat digunakan:
- Modul harus memeriksa integritasnya sendiri sebelum menyediakan algoritma kriptografi.
- Modul harus menjalankan dan memverifikasi algoritma kriptografi yang disetujuinya menggunakan pengujian mandiri algoritma kriptografi 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, sertifikasi harus dilakukan ulang. Hal ini tidak sesuai 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, untuk memastikan bahwa perubahan yang tidak terkait dengan kriptografi tidak memerlukan evaluasi ulang kriptografi.
Kernel GKI dimaksudkan untuk diperbarui secara rutin selama masa pakainya yang didukung. Hal ini membuat seluruh kernel tidak dapat berada dalam batas modul FIPS, karena modul tersebut harus disertifikasi ulang setiap kali ada update kernel. Menentukan "modul FIPS" sebagai subset image kernel akan mengurangi masalah ini, tetapi tidak akan menyelesaikannya, karena konten biner "modul FIPS" akan tetap berubah lebih sering daripada yang diperlukan.
Sebelum versi kernel 6.1, pertimbangan lainnya adalah GKI dikompilasi dengan LTO (Link Time Optimization) diaktifkan, karena LTO merupakan prasyarat untuk Integritas Alur Kontrol 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 mengandalkan antarmuka
stabil yang diekspos oleh sumber kernel GKI yang digunakan untuk membangunnya. Artinya, modul dapat digunakan dengan rilis GKI yang berbeda dari generasi yang sama, dan modul harus diupdate dan dikirim ulang untuk mendapatkan sertifikasi hanya jika ada masalah yang diperbaiki dalam kode yang dibawa oleh modul itu sendiri.
Kapan harus menggunakan modul
Kernel GKI itu sendiri membawa kode yang bergantung pada rutin kripto yang juga dikemas ke dalam modul kernel FIPS 140-3. Oleh karena itu, rutin kripto bawaan sebenarnya tidak dipindahkan dari kernel GKI, tetapi disalin ke dalam modul. Saat modul dimuat, rutin kripto bawaan akan dibatalkan pendaftarannya dari Linux CryptoAPI dan digantikan oleh rutin yang dibawa oleh modul.
Artinya, modul fips140.ko sepenuhnya bersifat opsional, dan hanya masuk akal untuk men-deploy-nya jika sertifikasi FIPS 140-3 adalah persyaratan. Selain itu, modul tidak memberikan kemampuan tambahan, dan memuatnya secara tidak perlu hanya akan memengaruhi waktu booting, tanpa memberikan manfaat apa pun.
Cara men-deploy modul
Modul ini dapat dimasukkan 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.loaddi target.modules.loadmenyimpan daftar modul yang dimuat olehinitsaat perangkat di-boot.
Pemeriksaan mandiri integritas
Modul kernel FIPS 140-3 mengambil ringkasan HMAC-SHA256 dari bagian .code
dan .rodata sendiri pada waktu pemuatan modul, dan membandingkannya dengan ringkasan
yang dicatat dalam modul. Hal ini terjadi setelah pemuat modul Linux
telah melakukan modifikasi biasa seperti pemrosesan relokasi ELF dan
patching alternatif untuk errata CPU ke bagian tersebut. Langkah tambahan berikut dilakukan untuk memastikan bahwa ringkasan dapat direproduksi dengan benar:
- Relokasi ELF dipertahankan di dalam modul sehingga dapat diterapkan secara terbalik ke input HMAC.
- Modul ini membatalkan semua patch kode yang dibuat oleh kernel untuk Dynamic Shadow Call Stack. Secara khusus, modul ini menggantikan semua petunjuk yang melakukan push atau pop dari stack panggilan shadow dengan petunjuk Kode Autentikasi Pointer (PAC) yang ada sebelumnya.
- Semua penambalan kode lainnya dinonaktifkan untuk modul, termasuk kunci statis dan oleh karena itu titik pelacakan serta hook vendor.
Algoritma kriptografi melakukan pengujian mandiri
Modul kernel FIPS 140-3 memenuhi persyaratan pengujian mandiri algoritma kriptografi FIPS 140-3 dengan menerapkan pengujian jawaban yang diketahui. Pengujian yang diterapkan bervariasi menurut algoritma dan mematuhi Panduan Penerapan FIPS 140-3 10.3.A.
Umumnya, hanya satu vektor pengujian per algoritma yang diperlukan. Pengujian mandiri algoritma kriptografi FIPS dirancang untuk memvalidasi fungsi dasar saja. Pengujian komprehensif dilakukan secara terpisah, menggunakan Cryptographic Algorithm Validation Program (CAVP) dan rangkaian pengujian kriptografi kernel upstream.
Jika algoritma memiliki beberapa penerapan yang dapat diakses oleh pengguna atau digunakan oleh
layanan modul, FIPS 140-3 mewajibkan semua penerapan tersebut diuji sendiri. Hal ini relevan dengan strategi integrasi yang biasanya digunakan oleh Linux CryptoAPI, di mana setiap algoritma dapat memiliki beberapa implementasi yang dapat diakses pengguna. Misalnya, di kernel android16-6.12, SHA-256 memiliki tiga
implementasi: sha256-generic, sha256-arm64, dan sha256-ce. Di CPU dengan ekstensi kripto ARMv8, sha256-ce digunakan secara default, tetapi pengguna tetap dapat mengakses yang lain secara eksplisit. Oleh karena itu, modul melakukan pengujian mandiri pada ketiga
implementasi.
Di kernel android17-6.18 dan yang lebih baru, beberapa algoritma menggunakan strategi integrasi yang lebih sederhana. Misalnya, di kernel android17-6.18, SHA-256 memiliki
satu penerapan sha256-lib yang otomatis memilih kode yang sesuai
untuk CPU pada waktu pemuatan modul. Oleh karena itu, modul hanya melakukan pengujian mandiri
sha256-lib.
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, android15-6.6, android16-6.12, dan
android17-6.18, meskipun perbedaan antara versi kernel dicatat jika sesuai.
| Algoritma | Penerapan | Dapat disetujui | Definisi |
|---|---|---|---|
aes |
aes-generic, aes-arm64, aes-ce, library AES |
Ya | Block cipher AES biasa, tanpa mode operasi: Semua ukuran kunci (128 bit, 192 bit, dan 256 bit) didukung. Semua penerapan selain penerapan 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 penerapan aes apa pun menggunakan cmac(. 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 penerapan aes apa pun menggunakan ecb(. 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 penerapan aes apa pun menggunakan cbc(. 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 pencurian ciphertext: Konvensi yang digunakan adalah CS3; dua blok ciphertext terakhir ditukar tanpa syarat. Semua ukuran kunci AES didukung. Template cts dapat disusun dengan penerapan cbc apa pun menggunakan cts(. 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 penerapan aes apa pun menggunakan ctr(. Implementasi lainnya bersifat mandiri. |
xts(aes) |
xts (template), xts-aes-neon, xts-aes-neonbs, xts-aes-ce |
Ya | AES-XTS: Di kernel 6.1 dan yang lebih lama, semua ukuran kunci AES didukung; di kernel 6.6 dan yang lebih baru, hanya AES-128 dan AES-256 yang didukung. Template xts dapat disusun dengan penerapan ecb(aes) apa pun menggunakan xts(. Implementasi lainnya bersifat mandiri. Semua implementasi menerapkan pemeriksaan kunci lemah yang diwajibkan oleh FIPS; yaitu, kunci XTS yang bagian pertama dan keduanya sama akan ditolak. |
gcm(aes) |
gcm (template), gcm-aes-ce |
Tidak 1 | 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 disusun dengan penerapan ctr(aes) dan ghash menggunakan gcm_base(. Implementasi lainnya bersifat mandiri. |
sha1 |
Kernel 6.12 dan yang lebih lama: sha1-generic, sha1-ce |
Ya | Fungsi hash kriptografi SHA-1. Dihapus di kernel 6.18 dan yang lebih baru. |
sha224 |
Kernel 6.18 dan yang lebih baru: sha224-lib. Kernel 6.12 dan yang lebih lama: sha224-generic, sha224-arm64, sha224-ce |
Ya | Fungsi hash kriptografi SHA-224: Kode ini sama dengan SHA-256. |
sha256 |
Kernel 6.18 dan yang lebih baru: sha256-lib. Kernel 6.12 dan yang lebih lama: sha256-generic, sha256-arm64, sha256-ce, library SHA-256 |
Ya | Fungsi hash kriptografi SHA-256. |
sha384 |
Kernel 6.18 dan yang lebih baru: sha384-lib. Kernel 6.12 dan yang lebih lama: sha384-generic, sha384-arm64, sha384-ce |
Ya | Fungsi hash kriptografi SHA-384: Kode ini sama dengan SHA-512. |
sha512 |
Kernel 6.18 dan yang lebih baru: sha512-lib. Kernel 6.12 dan yang lebih lama: sha512-generic, sha512-arm64, sha512-ce |
Ya | Fungsi hash kriptografi SHA-512. |
sha3-224 |
Kernel 6.6 dan yang lebih tinggi: sha3-224-generic |
Ya | Fungsi hash kriptografi SHA3-224. |
sha3-256 |
Kernel 6.6 dan yang lebih tinggi: 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 |
Kernel 6.6 dan yang lebih tinggi: 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 |
Kernel 6.6 dan yang lebih tinggi: 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 | Keyed-hash message authentication code (HMAC): Template hmac dapat disusun dengan algoritma atau penerapan SHA apa pun menggunakan hmac( atau hmac(. |
stdrng |
Semua kernel: drbg_pr_hmac_sha256, drbg_pr_hmac_sha384, drbg_pr_hmac_sha512. Kernel 6.6 dan yang lebih rendah: drbg_pr_hmac_sha1 |
Ya | HMAC_DRBG di-instantiate dengan fungsi hash bernama dan dengan ketahanan prediksi diaktifkan: Pemeriksaan kesehatan disertakan. Pengguna antarmuka ini mendapatkan instance DRBG mereka sendiri. |
stdrng |
Semua kernel: drbg_nopr_hmac_sha256, drbg_nopr_hmac_sha384, drbg_nopr_hmac_sha512. Kernel 6.6 dan yang lebih rendah: drbg_nopr_hmac_sha1 |
Ya | Sama seperti algoritma drbg_pr_*, tetapi dengan ketahanan prediksi yang dinonaktifkan. Kode ini dibagikan dengan varian yang tahan prediksi. Di kernel 5.10, DRBG dengan prioritas tertinggi adalah drbg_nopr_hmac_sha256. Di kernel 5.15 dan yang lebih baru, nilainya adalah drbg_pr_hmac_sha512. |
jitterentropy_rng |
jitterentropy_rng |
Tidak | Jitter RNG, baik versi 2.2.0 (versi kernel 6.1 dan yang lebih lama) atau versi 3.4.0 (versi kernel 6.6 dan yang lebih baru). Pengguna antarmuka ini mendapatkan instance Jitter RNG mereka sendiri. Mereka tidak menggunakan kembali instance yang digunakan DRBG. |
xcbc(aes) |
xcbc-aes-neon, xcbc-aes-ce |
Tidak | |
xctr(aes) |
Kernel 5.15 dan yang lebih baru: xctr-aes-neon, xctr-aes-ce |
Tidak | |
cbcmac(aes) |
cbcmac-aes-neon, cbcmac-aes-ce |
Tidak | |
essiv(cbc(aes),sha256) |
essiv-cbc-aes-sha256-neon, essiv-cbc-aes-sha256-ce |
Tidak |
1. Penerapan AES-GCM modul dapat disetujui algoritma, tetapi tidak disetujui modul. Algoritma tersebut 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 membuat IV-nya sendiri.
Membangun modul dari sumber
Untuk Android 14 dan yang lebih tinggi (termasuk
android-mainline), bangun modul fips140.ko dari sumber menggunakan
perintah berikut.
Membangun dengan Bazel:
tools/bazel run //common:fips140_distMembangun 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 digest HMAC-SHA256 yang disematkan di dalamnya.
Panduan pengguna akhir
Panduan Crypto Officer
Untuk mengoperasikan modul kernel, sistem operasi harus dibatasi ke mode operasi operator tunggal. 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. Perangkat ini hanya beroperasi dalam mode operasi yang disetujui.
Petugas Kriptografi 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 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 terbatas pada algoritma yang disetujui. Untuk memenuhi persyaratan "indikator layanan" FIPS 140-3, modul ini menyediakan fungsi fips140_is_approved_service yang menunjukkan apakah suatu algoritma disetujui.
Error pengujian mandiri
Jika terjadi kegagalan uji mandiri, modul kernel akan menyebabkan kernel mengalami panik dan perangkat tidak akan melanjutkan booting. Jika mulai ulang perangkat tidak menyelesaikan masalah, perangkat harus di-boot ke mode pemulihan untuk memperbaiki masalah dengan mem-flash ulang perangkat.