Modul kripto GKI bersertifikasi FIPS 140-3

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 secara khusus harus dipenuhi sebelum rutinitas kripto dapat digunakan:

  • Modul tersebut harus memeriksa integritasnya sendiri sebelum menyediakan algoritma kriptografi.
  • Modul ini harus menjalankan dan memverifikasi algoritma kriptografis yang disetujui menggunakan uji mandiri dengan jawaban yang diketahui sebelum menyediakannya.

Mengapa modul kernel terpisah

Validasi FIPS 140-3 didasarkan pada gagasan bahwa setelah modul berbasis software atau hardware disertifikasi, modul tersebut tidak akan pernah berubah. Jika diubah, produk tersebut harus disertifikasi ulang. Hal ini tidak cocok dengan proses pengembangan software yang digunakan saat ini. Oleh karena itu, modul software FIPS umumnya dirancang agar berfokus pada komponen kriptografis sedemikian mungkin, untuk memastikan bahwa perubahan yang tidak terkait dengan kriptografi tidak memerlukan evaluasi ulang kriptografi.

Kernel GKI dimaksudkan untuk diupdate secara rutin selama seluruh masa aktifnya yang didukung. Hal ini membuat seluruh kernel tidak mungkin berada dalam batas modul FIPS, sehingga modul semacam itu perlu disertifikasi ulang setiap kali update kernel. Mendefinisikan "modul FIPS" sebagai subset image kernel akan mengurangi 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 lain 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 menjamin bahwa modul dapat digunakan dengan rilis GKI yang berbeda dari generasi yang sama, dan bahwa modul harus diperbarui serta dikirim ulang untuk sertifikasi hanya jika ada masalah yang diperbaiki dalam kode yang dibawa oleh modul itu sendiri.

Kapan harus menggunakan modul

Kernel GKI 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 bersifat opsional, dan hanya masuk akal untuk men-deploy-nya jika sertifikasi FIPS 140-3 merupakan persyaratan. Di luar itu, modul tidak menyediakan fungsi tambahan, dan memuatnya 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 ke modules.load pada target. modules.load menyimpan daftar modul yang dimuat oleh init saat perangkat melakukan booting.

Pemeriksaan mandiri integritas

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 tercatat dalam modul. Hal ini terjadi setelah loader modul Linux melakukan modifikasi biasa, seperti pemrosesan relokasi ELF dan alternatif patching untuk CPU errata ke bagian tersebut. Langkah-langkah tambahan berikut diambil untuk memastikan ringkasan dapat direproduksi dengan benar:

  • Relokasi ELF dipertahankan di dalam modul sehingga dapat diterapkan terbalik terhadap input HMAC.
  • Modul ini membalikkan patch kode apa pun yang dibuat oleh kernel untuk Dynamic Shadow Call Stack. Secara khusus, modul ini mengganti setiap petunjuk yang mendorong atau muncul dari stack panggilan bayangan dengan petunjuk Kode Autentikasi Pointer (PAC) yang awalnya ada.
  • Semua patching kode lainnya dinonaktifkan untuk modul, termasuk kunci statis, dan tracepoint serta hook vendor.

Tes mandiri dengan jawaban yang diketahui

Setiap algoritma yang diimplementasikan yang tercakup dalam persyaratan FIPS 140-3 harus melakukan uji mandiri dengan jawaban yang diketahui sebelum digunakan. Menurut Panduan Penerapan FIPS 140-3 10.3.A, satu vektor pengujian per algoritma yang menggunakan salah satu panjang kunci yang didukung sudah cukup untuk cipher, selama enkripsi dan dekripsi diuji.

CryptoAPI Linux memiliki konsep prioritas algoritma, dengan beberapa implementasi (seperti salah satunya menggunakan petunjuk kripto khusus, dan fallback untuk CPU yang tidak mengimplementasikan petunjuk tersebut) dari algoritma yang sama dapat beroperasi berdampingan. Oleh karena itu, Anda perlu menguji semua implementasi algoritma yang sama. Hal ini diperlukan karena Linux CryptoAPI mengizinkan pemilihan berbasis prioritas untuk diabaikan, dan agar algoritma dengan prioritas lebih rendah 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 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 ciphertext terakhir ditukar tanpa syarat.Semua ukuran kunci AES didukung.Template cts dapat dibuat dengan implementasi cbc menggunakan cts(<cbc(aes)-impl>).Penerapan 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; 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 mengimplementasikan pemeriksaan kunci lemah yang diwajibkan oleh FIPS; yaitu, kunci XTS yang bagian pertama dan keduanya setara 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 tradisional. 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 yang 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, atribut ini 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 modul fips140.ko dengan konten ringkasan HMAC-SHA256 yang disematkan di dalamnya.

Panduan pengguna akhir

Panduan Petugas Kripto

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. Solusi ini hanya beroperasi dalam mode operasi yang disetujui.

Crypto Officer 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 menyediakan fungsi fips140_is_approved_service yang menunjukkan apakah algoritma disetujui.

Error pengujian mandiri

Jika terjadi kegagalan uji mandiri, modul kernel akan menyebabkan kernel panik dan perangkat tidak dapat melanjutkan booting. Jika mulai ulang perangkat tidak menyelesaikan masalah, perangkat harus melakukan booting ke mode pemulihan untuk memperbaiki masalah dengan mem-flash ulang perangkat.


  1. Implementasi AES-GCM modul diharapkan dapat "disetujui algoritma" tetapi tidak "disetujui modul". AES-GCM 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.