FIPS 140-3 sertifikalandırılabilir GKI kripto modülü

GKI çekirdeği, kriptografik yazılım modüllerine yönelik FIPS 140-3 gerekliliklerine uygun fips140.ko adında bir Linux çekirdek modülü içerir. Bu modül, GKI çekirdeğini çalıştıran ürün gerektiriyorsa FIPS sertifikası için gönderilebilir.

Kripto rutinlerinin kullanılabilmesi için özellikle aşağıdaki FIPS 140-3 gerekliliklerinin yerine getirilmesi gerekir:

  • Modül, kriptografik algoritmaları kullanıma sunmadan önce kendi bütünlüğünü kontrol etmelidir.
  • Modül, onaylı şifreleme algoritmalarını kullanıma sunmadan önce bilinen yanıtları kendi kendine test ederek kullanmalı 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ün bir kez sertifikalandırıldıktan sonra asla değiştirilmeyeceği fikrine dayanmaktadır. Değiştirilmesi halinde yeniden sertifikalandırılması gerekir. Bu, günümüzde kullanılan yazılım geliştirme süreçleriyle kolaylıkla eşleşmemektedir ve bu gereksinimin bir sonucu olarak, FIPS yazılım modülleri genellikle kriptografiyle ilgili olmayan değişikliklerin yapılmasını sağlamak için kriptografik bileşenlere mümkün olduğunca sıkı bir şekilde odaklanacak şekilde tasarlanmıştır. kriptografinin yeniden değerlendirilmesini gerektirmez.

GKI çekirdeğinin, desteklenen ömrü boyunca düzenli olarak güncellenmesi amaçlanmaktadır. Bu, tüm çekirdeğin FIPS modülü sınırları içinde olmasını imkansız hale getirir, çü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 hafifletebilir ancak "FIPS modülünün" ikili içerikleri hala ihtiyaç duyulandan çok daha sık değişeceğinden sorunu çözmez.

Çekirdek sürümü 6.1'den önce dikkate alınması gereken bir diğer husus, LTO'nun önemli bir güvenlik özelliği olan Kontrol Akışı Bütünlüğü için bir ön koşul olması nedeniyle GKI'nın LTO (Bağlantı Süresi Optimizasyonu) etkin olarak derlenmesiydi.

Bu nedenle, FIPS 140-3 gereksinimlerinin kapsadığı tüm kodlar, yalnızca oluşturulduğu GKI çekirdek kaynağı tarafından sunulan kararlı arayüzlere dayanan ayrı bir çekirdek modülü fips140.ko paketlenir. Bu, modülün aynı neslin farklı GKI sürümleriyle kullanılabileceğini ve yalnızca modülün taşıdığı kodda herhangi bir sorun düzeltilmişse güncellenmesi ve sertifikasyon için yeniden gönderilmesi gerektiğini garanti eder.

Modül ne zaman kullanılmalı?

GKI çekirdeğinin kendisi, FIPS 140-3 çekirdek modülünde de paketlenmiş olan kripto rutinlerine bağlı olan kodu taşır. Bu nedenle, yerleşik kripto rutinleri aslında GKI çekirdeğinin dışına taşınmaz, bunun yerine modüle kopyalanır. Modül yüklendiğinde yerleşik kripto rutinlerinin kaydı Linux CryptoAPI'den silinir ve bunların yerine modül tarafından taşınanlar geçer.

Bu, fips140.ko modülünün tamamen isteğe bağlı olduğu ve yalnızca FIPS 140-3 sertifikasının bir gereklilik olması durumunda dağıtılmasının mantıklı olduğu anlamına gelir. Bunun ötesinde, modül hiçbir ek işlevsellik sağlamaz ve gereksiz yere yüklenmesi muhtemelen herhangi bir fayda sağlamadan yalnızca önyükleme süresini etkiler.

Modül nasıl dağıtılır

Modül, aşağıdaki adımlar kullanılarak Android yapısına dahil edilebilir:

  • Modül adını BOARD_VENDOR_RAMDISK_KERNEL_MODULES ekleyin. Bu, modülün satıcının ramdisk'ine kopyalanmasına neden olur.
  • Modül adını BOARD_VENDOR_RAMDISK_KERNEL_MODULES_LOAD ekleyin. Bu, modül adının hedefteki modules.load dosyasına eklenmesine neden olur. modules.load cihaz önyüklendiğinde init tarafından yüklenen modüllerin listesini tutar.

Bütünlük öz kontrolü

FIPS 140-3 çekirdek modülü, modül yükleme süresinde kendi .code ve .rodata bölümlerinin HMAC-SHA256 özetini alır ve bunu modülde kaydedilen özetle karşılaştırır. Bu, Linux modül yükleyicisinin, ELF yer değiştirme işlemi ve bu bölümlere CPU hataları için alternatif yamalar gibi olağan değişiklikleri zaten yapmasından sonra gerçekleşir. Özetin doğru şekilde çoğaltılabilmesini sağlamak için aşağıdaki ek adımlar gerçekleştirilir:

  • ELF yer değiştirmeleri, HMAC girişine ters yönde uygulanabilmeleri için modülün içinde korunur.
  • Statik anahtarlar ve dolayısıyla izleme noktalarının yanı sıra satıcı kancaları da dahil olmak üzere, modül için diğer tüm kod yaması devre dışı bırakılır.

Bilinen yanıtlı kendi kendine testler

FIPS 140-3 gereksinimleri kapsamındaki uygulanan tüm algoritmaların, kullanılmadan önce yanıtı bilinen bir kendi kendine test gerçekleştirmesi gerekir. FIPS 140-3 Uygulama Kılavuzu 10.3.A'ya göre, hem şifreleme hem de ş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, aynı algoritmanın çeşitli uygulamalarının (özel kripto talimatları kullanan bir uygulama ve bu talimatları uygulamayan CPU'lar için bir geri dönüş gibi) bir arada var olabileceği bir algoritma öncelikleri kavramına sahiptir. Bu nedenle aynı algoritmanın tüm uygulamalarının test edilmesine ihtiyaç vardır. Bu gereklidir çünkü Linux CryptoAPI öncelik bazlı seçimin atlanmasına ve bunun yerine daha düşük öncelikli bir algoritmanın seçilmesine izin verir.

Modülde yer alan algoritmalar

FIPS 140-3 modülünde yer alan tüm algoritmalar aşağıdaki gibi listelenmiştir. Bu, android12-5.10 , android13-5.10 , android13-5.15 , android14-5.15 ve android14-6.1 çekirdek dalları için geçerlidir, ancak çekirdek sürümleri arasındaki farklar uygun yerlerde belirtilir.

Algoritma Uygulamalar Onaylanabilir Tanım
aes aes-generic , aes-arm64 , aes-ce , AES kitaplığı Evet Çalışma modu olmayan düz AES blok şifresi: Tüm anahtar boyutları (128 bit, 192 bit ve 256 bit) desteklenir. Kütüphane uygulaması dışındaki tüm uygulamalar, bir şablon aracılığıyla bir çalışma modu ile 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 herhangi bir aes 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 herhangi bir aes 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 herhangi bir aes 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 Şifreli metin çalma ile AES-CBC-CTS veya AES-CBC: Kullanılan kural CS3 ; 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 herhangi bir cbc 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 herhangi bir aes 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: Tüm AES anahtar boyutları desteklenir. xts şablonu, xts(<ecb(aes)-impl>) kullanılarak herhangi bir ecb(aes) uygulamasıyla oluşturulabilir. Diğer uygulamalar bağımsızdır. Tüm uygulamalar FIPS'in gerektirdiği zayıf anahtar kontrolünü uygular; yani birinci ve ikinci yarısı eşit olan XTS anahtarları reddedilir.
gcm(aes) gcm (şablon), gcm-aes-ce 1 numara 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'lerin sağlanmasından arayan kişi sorumludur. gcm şablonu, gcm_base(<ctr(aes)-impl>,<ghash-impl>) kullanılarak herhangi bir ctr(aes) ve ghash uygulamasıyla oluşturulabilir. Diğer uygulamalar bağımsızdır.
sha1 sha1-generic , sha1-ce Evet SHA-1 şifreleme karma işlevi
sha224 sha224-generic , sha224-arm64 , sha224-ce Evet SHA-224 şifreleme 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: Geleneksel CryptoAPI arayüzüne ek olarak SHA-256'ya bir kütüphane arayüzü sağlanır. Bu kütüphane arayüzü farklı bir uygulama kullanıyor.
sha384 sha384-generic , sha384-arm64 , sha384-ce Evet SHA-384 şifreleme karma işlevi: Kod, SHA-512 ile paylaşılır.
sha512 sha512-generic , sha512-arm64 , sha512-ce Evet SHA-512 şifreleme karma işlevi
hmac hmac (şablon) Evet HMAC (Anahtarlı Karma Mesaj Kimlik Doğrulama Kodu): hmac şablonu, hmac(<sha-alg>) veya hmac(<sha-impl>) kullanılarak herhangi bir SHA algoritması veya uygulamasıyla oluşturulabilir.
stdrng drbg_pr_hmac_sha1 , drbg_pr_hmac_sha256 , drbg_pr_hmac_sha384 , drbg_pr_hmac_sha512 Evet HMAC_DRBG, adlandırılmış karma işleviyle ve tahmin direnci etkinleştirilmiş şekilde başlatıldı: Durum denetimleri dahildir. Bu arayüzün kullanıcıları kendi DRBG örneklerine sahip olurlar.
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ıyor. Çekirdek 5.10 sürümünde en yüksek öncelikli DRBG drbg_nopr_hmac_sha256 . Çekirdek sürüm 5.15 ve sonrasında, drbg_pr_hmac_sha512 şeklindedir.
jitterentropy_rng jitterentropy_rng HAYIR Jitter RNG Sürüm 2.2.0 : Bu arayüzün kullanıcıları kendi Jitter RNG örneklerine sahip olurlar. DRBG'lerin kullandığı örnekleri yeniden kullanmazlar.
xcbc(aes) xcbc-aes-neon , xcbc-aes-ce HAYIR
xctr(aes) xctr-aes-neon , xctr-aes-ce HAYIR Yalnızca çekirdek sürümü 5.15 ve sonrasında mevcuttur.
cbcmac(aes) cbcmac-aes-neon , cbcmac-aes-ce HAYIR
essiv(cbc(aes),sha256) essiv-cbc-aes-sha256-neon , essiv-cbc-aes-sha256-ce HAYIR

Modülü kaynaktan oluşturun

Android 14 veya üzeri için ( android-mainline dahil), aşağıdaki komutları kullanarak fips140.ko modülünü kaynaktan oluşturun.

  • Bazel ile oluşturun:

    tools/bazel run //common:fips140_dist
    
  • build.sh (eski) ile derleyin:

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

Bu komutlar, çekirdeği ve içinde gömülü HMAC-SHA256 özet içeriklerini içeren fips140.ko modülünü içeren tam bir yapı gerçekleştirir.

Son kullanıcı rehberliği

Kripto Görevlisi rehberliği

Çekirdek modülünü çalıştırmak için işletim sisteminin tek operatörlü çalışma moduyla sınırlandırılması gerekir. Bu, işlemcideki bellek yönetimi donanımını kullanarak Android tarafından otomatik olarak gerçekleştirilir.

Çekirdek modülü ayrı olarak kurulamaz; aygıt yazılımının bir parçası olarak bulunur ve önyükleme sırasında otomatik olarak yüklenir. Yalnızca onaylanmış bir çalışma modunda çalışır.

Kripto Görevlisi, cihazı yeniden başlatarak istediği zaman kendi kendine testlerin yapılmasını sağlayabilir.

Kullanıcı rehberliği

Çekirdek modülünün kullanıcısı, şifreleme algoritmaları kullanması gereken diğer çekirdek bileşenleridir. Çekirdek modülü, algoritmaların kullanımında ek bir mantık sağlamaz ve bir şifreleme işleminin gerçekleştirilmesi için gereken sürenin ötesinde herhangi bir parametreyi saklamaz.

Algoritmaların FIPS uyumluluğu amacıyla kullanımı onaylanmış algoritmalarla sınırlıdır. FIPS 140-3 "hizmet göstergesi" gereksinimini karşılamak için modül, bir algoritmanın onaylanıp onaylanmadığını gösteren fips140_is_approved_service işlevini sağlar.

Kendi kendine test hataları

Kendi kendine testin başarısız olması durumunda, çekirdek modülü çekirdeğin paniğe kapılmasına neden olur ve aygıt önyüklemeye devam etmez. Cihazın yeniden başlatılması sorunu çözmezse, cihazın flaşını yeniden başlatarak sorunu düzeltmek için cihazın kurtarma moduna önyükleme yapması gerekir.


  1. Modülün AES-GCM uygulamalarının "algoritma onaylı" olması ancak "modül onaylı" olmaması bekleniyor. Doğrulanabilirler ancak AES-GCM, FIPS modülü açısından onaylanmış bir algoritma olarak değerlendirilemez. Bunun nedeni, GCM için FIPS modülü gereksinimlerinin, kendi IV'lerini oluşturmayan GCM uygulamalarıyla uyumsuz olmasıdır.