Modul kripto GKI bersertifikat FIPS 140-3

Kernel GKI menyertakan modul kernel Linux yang disebut fips140.ko yang mematuhi persyaratan FIPS 140-3 untuk modul perangkat lunak kriptografi. Modul ini dapat diajukan untuk sertifikasi FIPS jika produk yang menjalankan kernel GKI memerlukannya.

Persyaratan FIPS 140-3 berikut khususnya harus dipenuhi sebelum rutinitas kripto dapat digunakan:

  • Modul harus memeriksa integritasnya sendiri sebelum membuat algoritma kriptografi tersedia.
  • Modul harus menjalankan dan memverifikasi algoritme kriptografi yang disetujui menggunakan tes mandiri dengan jawaban yang diketahui sebelum menyediakannya.

Mengapa modul kernel terpisah

Validasi FIPS 140-3 didasarkan pada gagasan bahwa setelah modul berbasis perangkat lunak atau perangkat keras telah disertifikasi, modul tersebut tidak akan pernah berubah. Jika diubah, harus disertifikasi ulang. Hal ini tidak sesuai dengan proses pengembangan perangkat lunak yang digunakan saat ini, dan sebagai akibat dari persyaratan ini, modul perangkat lunak FIPS umumnya dirancang untuk fokus pada komponen kriptografi, untuk memastikan bahwa perubahan yang tidak terkait dengan kriptografi dapat dilakukan. tidak memerlukan evaluasi ulang kriptografi.

Kernel GKI dimaksudkan untuk diperbarui secara berkala selama masa pakainya yang didukung. Hal ini membuat seluruh kernel tidak mungkin berada dalam batas modul FIPS, karena modul tersebut perlu disertifikasi ulang pada setiap pembaruan kernel. Mendefinisikan "modul FIPS" sebagai bagian dari citra kernel akan mengurangi masalah ini tetapi tidak akan menyelesaikannya, karena konten biner dari "modul FIPS" masih akan berubah lebih sering daripada yang diperlukan.

Sebelum kernel versi 6.1, pertimbangan lain adalah bahwa GKI dikompilasi dengan LTO (Link Time Optimization) diaktifkan, karena LTO merupakan 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 mengandalkan antarmuka stabil yang diekspos oleh sumber kernel GKI tempat kode tersebut dibuat. Hal ini menjamin bahwa modul dapat digunakan dengan rilis GKI berbeda pada generasi yang sama, dan modul harus diperbarui dan dikirim ulang untuk sertifikasi hanya jika ada masalah yang diperbaiki pada kode yang dibawa oleh modul itu sendiri.

Kapan 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, rutinitas kripto bawaan tidak benar-benar dipindahkan dari kernel GKI melainkan disalin ke dalam modul. Saat modul dimuat, rutinitas kripto bawaan akan dibatalkan pendaftarannya dari Linux CryptoAPI dan digantikan oleh rutinitas yang dibawa oleh modul.

Artinya, modul fips140.ko sepenuhnya opsional, dan masuk akal untuk menerapkannya jika sertifikasi FIPS 140-3 merupakan persyaratan. Selain itu, modul ini tidak menyediakan fungsionalitas tambahan, dan memuatnya secara tidak perlu hanya akan memengaruhi waktu booting, tanpa memberikan manfaat apa pun.

Cara menyebarkan 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 ke modules.load pada target. modules.load menyimpan daftar modul yang dimuat oleh init saat perangkat melakukan booting.

Integritas memeriksa diri sendiri

Modul kernel FIPS 140-3 mengambil intisari HMAC-SHA256 dari bagian .code dan .rodata miliknya sendiri pada waktu buka modul, dan membandingkannya dengan intisari yang dicatat dalam modul. Hal ini terjadi setelah pemuat modul Linux melakukan modifikasi biasa seperti pemrosesan relokasi ELF dan patching alternatif untuk kesalahan CPU pada bagian tersebut. Langkah-langkah tambahan berikut diambil untuk memastikan bahwa intisari dapat direproduksi dengan benar:

  • Relokasi ELF disimpan di dalam modul sehingga dapat diterapkan secara terbalik ke input HMAC.
  • Semua patching kode lainnya dinonaktifkan untuk modul, termasuk kunci statis dan karenanya titik jejak serta kait vendor.

Tes mandiri yang jawabannya diketahui

Algoritme apa pun yang diimplementasikan yang tercakup dalam persyaratan FIPS 140-3 harus melakukan tes mandiri dengan jawaban yang diketahui sebelum digunakan. Menurut Panduan Implementasi FIPS 140-3 10.3.A , satu vektor pengujian per algoritme menggunakan salah satu panjang kunci yang didukung sudah cukup untuk sandi, selama enkripsi dan dekripsi diuji.

Linux CryptoAPI memiliki gagasan tentang prioritas algoritme, di mana beberapa implementasi (seperti implementasi yang menggunakan instruksi kripto khusus, dan fallback untuk CPU yang tidak mengimplementasikan instruksi tersebut) dari algoritme yang sama dapat hidup berdampingan. Oleh karena itu, ada kebutuhan untuk menguji semua implementasi algoritma yang sama. Hal ini diperlukan karena Linux CryptoAPI mengizinkan pemilihan berdasarkan prioritas untuk dikesampingkan, dan sebagai gantinya algoritma dengan prioritas lebih rendah dipilih.

Algoritma termasuk 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 , dan android14-6.1 , meskipun perbedaan antara versi kernel akan diperhatikan jika diperlukan.

Algoritma Implementasi Dapat disetujui Definisi
aes aes-generic , aes-arm64 , aes-ce , perpustakaan AES Ya Cipher blok AES biasa, tanpa mode operasi: Semua ukuran kunci (128 bit, 192 bit, dan 256 bit) didukung. Semua implementasi selain implementasi perpustakaan dapat disusun dengan mode operasi melalui template.
cmac(aes) cmac (templat), cmac-aes-neon , cmac-aes-ce Ya AES-CMAC: Semua ukuran kunci AES didukung. Templat cmac dapat dibuat dengan implementasi aes apa pun menggunakan cmac(<aes-impl>) . Implementasi lainnya bersifat mandiri.
ecb(aes) ecb (templat), ecb-aes-neon , ecb-aes-neonbs , ecb-aes-ce Ya AES-ECB: Semua ukuran kunci AES didukung. Templat ecb dapat dibuat dengan implementasi aes apa pun menggunakan ecb(<aes-impl>) . Implementasi lainnya bersifat mandiri.
cbc(aes) cbc (templat), cbc-aes-neon , cbc-aes-neonbs , cbc-aes-ce Ya AES-CBC: Semua ukuran kunci AES didukung. Templat cbc dapat dibuat dengan implementasi aes apa pun menggunakan ctr(<aes-impl>) . Implementasi lainnya bersifat mandiri.
cts(cbc(aes)) cts (templat), 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. Templat cts dapat dibuat dengan implementasi cbc apa pun menggunakan cts(<cbc(aes)-impl>) . Implementasi lainnya bersifat mandiri.
ctr(aes) ctr (templat), ctr-aes-neon , ctr-aes-neonbs , ctr-aes-ce Ya AES-CTR: Semua ukuran kunci AES didukung. Templat ctr dapat dibuat dengan implementasi aes apa pun menggunakan ctr(<aes-impl>) . Implementasi lainnya bersifat mandiri.
xts(aes) xts (templat), xts-aes-neon , xts-aes-neonbs , xts-aes-ce Ya AES-XTS: Semua ukuran kunci AES didukung. Templat xts dapat dibuat dengan implementasi ecb(aes) apa pun menggunakan xts(<ecb(aes)-impl>) . Implementasi lainnya bersifat mandiri. Semua implementasi menerapkan pemeriksaan kunci lemah yang disyaratkan oleh FIPS; yaitu, kunci XTS yang bagian pertama dan kedua sama akan ditolak.
gcm(aes) gcm (templat), gcm-aes-ce No 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 infus. Templat gcm dapat dibuat dengan implementasi ctr(aes) dan ghash apa pun 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 sha256-generic , sha256-arm64 , sha256-ce , perpustakaan SHA-256 Ya Fungsi hash kriptografi SHA-256: Antarmuka perpustakaan disediakan untuk SHA-256 selain antarmuka CryptoAPI tradisional. Antarmuka perpustakaan 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
hmac hmac (templat) Ya HMAC (Kode Otentikasi Pesan Hash Berkunci): Templat hmac dapat dibuat dengan algoritme 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 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 resistensi prediksi dinonaktifkan. Kode tersebut dibagikan dengan varian yang tahan prediksi. Pada kernel versi 5.10, DRBG dengan prioritas tertinggi adalah drbg_nopr_hmac_sha256 . Di kernel versi 5.15 dan yang lebih baru, ini adalah drbg_pr_hmac_sha512 .
jitterentropy_rng jitterentropy_rng TIDAK Versi 2.2.0 dari Jitter RNG : Pengguna antarmuka ini mendapatkan instance Jitter RNG mereka sendiri. Mereka tidak menggunakan kembali contoh yang digunakan DRBG.
xcbc(aes) xcbc-aes-neon , xcbc-aes-ce TIDAK
xctr(aes) xctr-aes-neon , xctr-aes-ce TIDAK Hanya ada di kernel versi 5.15 dan yang lebih baru.
cbcmac(aes) cbcmac-aes-neon , cbcmac-aes-ce TIDAK
essiv(cbc(aes),sha256) essiv-cbc-aes-sha256-neon , essiv-cbc-aes-sha256-ce TIDAK

Bangun modul dari sumber

Untuk Android 14 atau lebih baru (termasuk android-mainline ), buat modul fips140.ko dari sumber menggunakan perintah berikut.

  • Bangun dengan Bazel:

    tools/bazel run //common:fips140_dist
    
  • Bangun dengan build.sh (warisan):

    BUILD_CONFIG=common/build.config.gki.aarch64.fips140 build/build.sh
    

Perintah-perintah ini melakukan pembangunan penuh termasuk kernel dan modul fips140.ko dengan konten intisari HMAC-SHA256 yang tertanam di dalamnya.

Panduan pengguna akhir

Panduan Petugas Kripto

Untuk mengoperasikan modul kernel, sistem operasi harus dibatasi pada mode operasi operator tunggal. Ini ditangani secara otomatis oleh Android menggunakan perangkat keras manajemen memori di prosesor.

Modul kernel tidak dapat diinstal secara terpisah; itu disertakan sebagai bagian dari firmware perangkat dan dimuat secara otomatis saat boot. Ini hanya beroperasi dalam mode operasi yang disetujui.

Petugas Kripto dapat menjalankan pengujian mandiri 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 melebihi 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 suatu algoritma disetujui.

Kesalahan tes mandiri

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


  1. Diharapkan implementasi AES-GCM modul dapat "disetujui algoritma" tetapi tidak "disetujui modul". Mereka 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.