GKI çekirdeği, kriptografik yazılım modülleri için FIPS 140-3 şartlarına uygun fips140.ko
adlı bir Linux çekirdek modülü içerir. Bu modül, GKI çekirdeğini çalıştıran ürünün FIPS sertifikası alması gerekiyorsa gönderilebilir.
Şifreleme rutinlerinin kullanılabilmesi için özellikle aşağıdaki FIPS 140-3 şartlarının karşılanması gerekir:
- Modül, kriptografik algoritmaları kullanıma sunmadan önce kendi bütünlüğünü kontrol etmelidir.
- Modül, onaylı kriptografik algoritmalarını kullanıma sunmadan önce bilinen cevaplı kendi kendine testler kullanarak çalıştırmalı ve doğrulamalıdır.
Neden ayrı bir çekirdek modülü?
FIPS 140-3 doğrulaması, yazılım veya donanım tabanlı bir modül sertifikalandırıldıktan sonra hiçbir zaman değiştirilmeyeceği fikrine dayanır. Değiştirilirse yeniden sertifikalandırılması gerekir. Bu, günümüzde kullanılan yazılım geliştirme süreçleriyle kolayca eşleşmez. Bu şartın bir sonucu olarak, kriptografiyle ilgili olmayan değişikliklerin kriptografinin yeniden değerlendirilmesini gerektirmemesi için FIPS yazılım modülleri genellikle kriptografik bileşenlere mümkün olduğunca sıkı bir şekilde odaklanacak şekilde tasarlanır.
GKI çekirdeğinin, desteklenen kullanım ömrü boyunca düzenli olarak güncellenmesi amaçlanmaktadır. Bu durum, çekirdeğin tamamının FIPS modül sınırları içinde olmasını imkansız kılar. Çünkü böyle bir modülün her çekirdek güncellemesinde yeniden sertifikalandırılması gerekir. "FIPS modülünü" çekirdek görüntüsünün bir alt kümesi olarak tanımlamak bu sorunu hafifletir ancak çözmez. Çünkü "FIPS modülünün" ikili içerikleri yine de gerekenden çok daha sık değişir.
Çekirdek sürümü 6.1'den önce, GKI'nin LTO (Bağlantı Zamanı Optimizasyonu) etkinleştirilmiş şekilde derlenmesi de dikkate alınması gereken bir noktaydı. Bunun nedeni, LTO'nun önemli bir güvenlik özelliği olan Kontrol Akışı Bütünlüğü için ön koşul olmasıydı.
Bu nedenle, FIPS 140-3 şartları kapsamındaki tüm kodlar, yalnızca oluşturulduğu GKI çekirdek kaynağı tarafından sunulan kararlı arayüzlere dayanan ayrı bir çekirdek modülünde fips140.ko
paketlenir. Bu, modülün aynı neslin farklı GKI sürümleriyle kullanılabileceği ve yalnızca modülün kendisi tarafından taşınan kodda herhangi bir sorun düzeltildiyse güncellenip yeniden sertifikalandırılmak üzere gönderilmesi gerektiği anlamına gelir.
Modül ne zaman kullanılır?
GKI çekirdeği, FIPS 140-3 çekirdek modülüne de paketlenmiş olan şifreleme rutinlerine bağlı kodu taşır. Bu nedenle, yerleşik kripto rutinleri GKI çekirdeğinden taşınmaz, bunun yerine modüle kopyalanır. Modül yüklendiğinde yerleşik kripto rutinlerinin kaydı Linux CryptoAPI'den kaldırılır ve bu rutinlerin yerini modülün taşıdığı rutinler alır.
Bu, fips140.ko
modülünün tamamen isteğe bağlı olduğu ve yalnızca FIPS 140-3 sertifikası gerekiyorsa dağıtılmasının mantıklı olduğu anlamına gelir. Bunun dışında, modül ek özellikler sağlamaz ve gereksiz yere yüklenmesi herhangi bir fayda sağlamadan yalnızca başlatma süresini etkiler.
Modülün dağıtılması
Modül, aşağıdaki adımlar kullanılarak Android derlemesine dahil edilebilir:
- Modül adını
BOARD_VENDOR_RAMDISK_KERNEL_MODULES
'ya ekleyin. Bu, modülün tedarikçi ramdisk'ine kopyalanmasına neden olur. - Modül adını
BOARD_VENDOR_RAMDISK_KERNEL_MODULES_LOAD
'ya ekleyin. Bu durum, hedeftekimodules.load
öğesine modül adının eklenmesine neden olur.modules.load
, cihaz başlatıldığındainit
tarafından yüklenen modüllerin listesini tutar.
Bütünlükle ilgili kendi kendine kontrol
FIPS 140-3 çekirdek modülü, modül yükleme sırasında kendi .code
ve .rodata
bölümlerinin HMAC-SHA256 özetini alır ve bunu modülde kayıtlı özetle karşılaştırır. Bu işlem, Linux modül yükleyicisi ELF yeniden konumlandırma işleme ve CPU hataları için alternatif yama gibi normal değişiklikleri yaptıktan sonra gerçekleşir. Özetin doğru şekilde yeniden oluşturulabilmesi için aşağıdaki ek adımlar uygulanır:
- ELF yeniden konumlandırmaları, HMAC girişine ters sırada uygulanabilmeleri için modülün içinde korunur.
- Modül, çekirdek tarafından Dynamic Shadow Call Stack için yapılan tüm kod yamalarını geri alır. Daha net bir ifadeyle, modül, gölge çağrı yığınından push veya pop işlemlerini gerçekleştiren talimatların yerini, başlangıçta mevcut olan işaretçi kimlik doğrulama kodu (PAC) talimatlarıyla değiştirir.
- Statik anahtarlar ve dolayısıyla izleme noktaları ile tedarikçi kancaları da dahil olmak üzere modül için diğer tüm kod yamaları devre dışı bırakılır.
Bilinen cevaplı kendi kendine testler
FIPS 140-3 şartları kapsamında olan tüm uygulanan algoritmalar, kullanılmadan önce bilinen cevaplı bir kendi kendine test gerçekleştirmelidir. FIPS 140-3 Implementation Guidance 10.3.A'ya göre, şifreleme ve şifre çözme test edildiği sürece, desteklenen anahtar uzunluklarından herhangi birini kullanan algoritma başına tek bir test vektörü şifreler için yeterlidir.
Linux CryptoAPI'de algoritma öncelikleri kavramı vardır. Aynı algoritmanın çeşitli uygulamaları (ör. özel şifreleme talimatlarını kullanan ve bu talimatları uygulamayan CPU'lar için yedek) birlikte bulunabilir. Bu nedenle, aynı algoritmanın tüm uygulamalarının test edilmesi gerekir. Linux CryptoAPI, önceliğe dayalı seçimin atlanmasına ve bunun yerine daha düşük öncelikli bir algoritmanın seçilmesine izin verdiğinden bu gereklidir.
Modülde yer alan algoritmalar
FIPS 140-3 modülüne dahil edilen tüm algoritmalar aşağıda listelenmiştir.
Bu durum android12-5.10
, android13-5.10
, android13-5.15
, android14-5.15
, android14-6.1
ve android15-6.6
çekirdek dalları için geçerlidir. Ancak uygun yerlerde çekirdek sürümleri arasındaki farklar belirtilir.
Algoritma | Uygulamalar | Onaylanabilir | Tanım |
---|---|---|---|
aes |
aes-generic , aes-arm64 , aes-ce , AES kitaplığı |
Evet | İşlem modu olmayan düz AES blok şifreleme: Tüm anahtar boyutları (128 bit, 192 bit ve 256 bit) desteklenir. Kitaplık uygulaması dışındaki tüm uygulamalar, bir şablon aracılığıyla işlem moduyla oluşturulabilir. |
cmac(aes) |
cmac (şablon), cmac-aes-neon , cmac-aes-ce |
Evet | AES-CMAC: Tüm AES anahtar boyutları desteklenir. cmac şablonu, cmac(<aes-impl>) kullanılarak aes 'nin herhangi bir uygulamasıyla oluşturulabilir. Diğer uygulamalar bağımsızdır. |
ecb(aes) |
ecb (şablon), ecb-aes-neon , ecb-aes-neonbs , ecb-aes-ce |
Evet | AES-ECB: Tüm AES anahtar boyutları desteklenir. ecb şablonu, ecb(<aes-impl>) kullanılarak aes 'nin herhangi bir uygulamasıyla oluşturulabilir. Diğer uygulamalar bağımsızdır. |
cbc(aes) |
cbc (şablon), cbc-aes-neon , cbc-aes-neonbs , cbc-aes-ce |
Evet | AES-CBC: Tüm AES anahtar boyutları desteklenir. cbc şablonu, ctr(<aes-impl>) kullanılarak aes 'nin herhangi bir uygulamasıyla oluşturulabilir. Diğer uygulamalar bağımsızdır. |
cts(cbc(aes)) |
cts (şablon), cts-cbc-aes-neon , cts-cbc-aes-ce |
Evet | AES-CBC-CTS veya şifreli metin çalma ile AES-CBC: Kullanılan kural CS3 'dır. Son iki şifreli metin bloğu koşulsuz olarak değiştirilir. Tüm AES anahtar boyutları desteklenir. cts şablonu, cts(<cbc(aes)-impl>) kullanılarak cbc 'nin herhangi bir uygulamasıyla oluşturulabilir. Diğer uygulamalar bağımsızdır. |
ctr(aes) |
ctr (şablon), ctr-aes-neon , ctr-aes-neonbs , ctr-aes-ce |
Evet | AES-CTR: Tüm AES anahtar boyutları desteklenir. ctr şablonu, ctr(<aes-impl>) kullanılarak aes 'nin herhangi bir uygulamasıyla oluşturulabilir. Diğer uygulamalar bağımsızdır. |
xts(aes) |
xts (şablon), xts-aes-neon , xts-aes-neonbs , xts-aes-ce |
Evet | AES-XTS: 6.1 ve önceki çekirdek sürümlerinde tüm AES anahtar boyutları desteklenir. 6.6 ve sonraki çekirdek sürümlerinde ise yalnızca AES-128 ve AES-256 desteklenir. xts şablonu, xts(<ecb(aes)-impl>) kullanılarak ecb(aes) 'nin herhangi bir uygulamasıyla oluşturulabilir. Diğer uygulamalar bağımsızdır. Tüm uygulamalarda FIPS'in gerektirdiği zayıf anahtar kontrolü uygulanır. Yani, ilk ve ikinci yarısı eşit olan XTS anahtarları reddedilir. |
gcm(aes) |
gcm (şablon), gcm-aes-ce |
Hayır1 | AES-GCM: Tüm AES anahtar boyutları desteklenir. Yalnızca 96 bit IV'ler desteklenir. Bu modüldeki diğer tüm AES modlarında olduğu gibi, IV'leri sağlama sorumluluğu arayana aittir. gcm şablonu, gcm_base(<ctr(aes)-impl>,<ghash-impl>) kullanılarak ctr(aes) ve ghash 'nin tüm uygulamalarıyla oluşturulabilir. Diğer uygulamalar bağımsızdır. |
sha1 |
sha1-generic , sha1-ce |
Evet | SHA-1 şifreli karma işlevi |
sha224 |
sha224-generic , sha224-arm64 , sha224-ce |
Evet | SHA-224 şifreli karma işlevi: Kod, SHA-256 ile paylaşılır. |
sha256 |
sha256-generic , sha256-arm64 , sha256-ce , SHA-256 kitaplığı |
Evet | SHA-256 kriptografik karma işlevi: Standart CryptoAPI arayüzüne ek olarak SHA-256 için bir kitaplık arayüzü sağlanır. Bu kitaplık arayüzü farklı bir uygulama kullanıyor. |
sha384 |
sha384-generic , sha384-arm64 , sha384-ce |
Evet | SHA-384 şifreli karma işlevi: Kod, SHA-512 ile paylaşılır. |
sha512 |
sha512-generic , sha512-arm64 , sha512-ce |
Evet | SHA-512 şifreli karma işlevi |
sha3-224 |
sha3-224-generic |
Evet | SHA3-224 şifreli karma işlevi. Yalnızca 6.6 ve sonraki çekirdek sürümlerinde bulunur. |
sha3-256 |
sha3-256-generic |
Evet | Öncekiyle aynıdır ancak 256 bit özet uzunluğuna (SHA3-256) sahiptir. Tüm özet uzunluklarında aynı Keccak uygulaması kullanılır. |
sha3-384 |
sha3-384-generic |
Evet | Öncekiyle aynıdır ancak 384 bit özet uzunluğuna (SHA3-384) sahiptir. Tüm özet uzunluklarında aynı Keccak uygulaması kullanılır. |
sha3-512 |
sha3-512-generic |
Evet | Öncekiyle aynıdır ancak 512 bit özet uzunluğuna (SHA3-512) sahiptir. Tüm özet uzunluklarında aynı Keccak uygulaması kullanılır. |
hmac |
hmac (şablon) |
Evet | HMAC (Keyed-Hash Message Authentication Code): hmac şablonu, hmac(<sha-alg>) veya hmac(<sha-impl>) kullanılarak herhangi bir SHA algoritması ya da uygulamasıyla oluşturulabilir. |
stdrng |
drbg_pr_hmac_sha1 , drbg_pr_hmac_sha256 , drbg_pr_hmac_sha384 , drbg_pr_hmac_sha512 |
Evet | Adlandırılmış karma işleviyle ve tahmin direnci etkinleştirilmiş olarak oluşturulan HMAC_DRBG: Sağlık kontrolleri dahildir. Bu arayüzün kullanıcıları kendi DRBG örneklerini alır. |
stdrng |
drbg_nopr_hmac_sha1 , drbg_nopr_hmac_sha256 , drbg_nopr_hmac_sha384 , drbg_nopr_hmac_sha512 |
Evet | drbg_pr_* algoritmalarıyla aynıdır ancak tahmin direnci devre dışıdır. Kod, tahmine dirençli varyantla paylaşılır. Çekirdek sürümü 5.10'da en yüksek öncelikli DRBG drbg_nopr_hmac_sha256 'dir. Çekirdek sürümü 5.15 ve sonraki sürümlerde drbg_pr_hmac_sha512 'dır. |
jitterentropy_rng |
jitterentropy_rng |
Hayır | Jitter RNG, 2.2.0 sürümü (çekirdek sürümü 6.1 ve daha eski) veya 3.4.0 sürümü (çekirdek sürümü 6.6 ve daha yeni) Bu arayüzün kullanıcıları kendi Jitter RNG örneklerini alır. DRBG'lerin kullandığı örnekleri yeniden kullanmazlar. |
xcbc(aes) |
xcbc-aes-neon , xcbc-aes-ce |
Hayır | |
xctr(aes) |
xctr-aes-neon , xctr-aes-ce |
Hayır | Yalnızca çekirdek sürümü 5.15 ve sonraki sürümlerde bulunur. |
cbcmac(aes) |
cbcmac-aes-neon , cbcmac-aes-ce |
Hayır | |
essiv(cbc(aes),sha256) |
essiv-cbc-aes-sha256-neon , essiv-cbc-aes-sha256-ce |
Hayır |
Modülü kaynaktan derleme
Android 14 ve sonraki sürümlerde (android-mainline
dahil) aşağıdaki komutları kullanarak fips140.ko
modülünü kaynaktan oluşturun.
Bazel ile derleme:
tools/bazel run //common:fips140_dist
build.sh
(eski) ile geliştirme:BUILD_CONFIG=common/build.config.gki.aarch64.fips140 build/build.sh
Bu komutlar, çekirdek ve HMAC-SHA256 özet içeriklerinin yerleştirildiği fips140.ko
modülü de dahil olmak üzere tam bir derleme gerçekleştirir.
Son kullanıcı rehberi
Kripto görevlisi rehberliği
Çekirdek modülünün çalışması için işletim sisteminin tek bir operatör çalışma moduyla sınırlandırılması gerekir. Bu işlem, işlemcideki bellek yönetimi donanımı kullanılarak Android tarafından otomatik olarak gerçekleştirilir.
Çekirdek modülü ayrı olarak yüklenemez. Cihaz yazılımının bir parçası olarak bulunur ve başlatma sırasında otomatik olarak yüklenir. Yalnızca onaylanmış bir çalışma modunda çalışır.
Kripto görevlisi, cihazı yeniden başlatarak kendi kendine testlerin herhangi bir zamanda çalıştırılmasını sağlayabilir.
Kullanıcı rehberi
Çekirdek modülünü kullananlar, kriptografik algoritmaları kullanması gereken diğer çekirdek bileşenleridir. Çekirdek modülü, algoritmaların kullanımında ek mantık sağlamaz ve şifreleme işlemi gerçekleştirmek için gereken sürenin ötesinde herhangi bir parametre depolamaz.
Algoritmaların FIPS uyumluluğu amacıyla kullanımı, onaylı algoritmalarla sınırlıdır. FIPS 140-3 "hizmet göstergesi" şartını karşılamak için modül, bir algoritmanın onaylanıp onaylanmadığını belirten bir işlev fips140_is_approved_service
sağlar.
Kendi kendine test hataları
Kendi kendine test başarısız olursa çekirdek modülü, çekirdeğin panik yapmasına neden olur ve cihaz başlatılmaya devam etmez. Cihazın yeniden başlatılması sorunu çözmezse cihazın yeniden başlatılarak sorunun düzeltilmesi için kurtarma modunda başlatılması gerekir.
-
Modülün AES-GCM uygulamalarının "algoritma onaylı" olması beklenir ancak "modül onaylı" olması beklenmez. Doğrulanabilir ancak AES-GCM, FIPS modülü açısından onaylı bir algoritma olarak kabul edilemez. Bunun nedeni, GCM için FIPS modülü gereksinimlerinin, kendi IV'lerini oluşturmayan GCM uygulamalarıyla uyumsuz olmasıdır. ↩