FIPS 140-3 sertifikalı GKI şifreleme modülü

GKI çekirdeği, şifreleme yazılımı modülleri için FIPS 140-3 gereksinimlerine uygun fips140.ko adlı bir Linux çekirdek modülü içerir. GKI çekirdeğini çalıştıran ürün için gerekliyse bu modül FIPS sertifikasına gönderilebilir.

Şifreleme rutinlerinin kullanılabilmesi için özellikle aşağıdaki FIPS 140-3 koşullarının karşılanması gerekir:

  • Modül, kriptografik algoritmaları kullanıma sunmadan önce kendi bütünlüğünü kontrol etmelidir.
  • Modül, kullanıma sunmadan önce bilinen yanıtlı kendi kendine testler kullanarak onaylanmış şifreleme algoritmalarını uygulamalı ve doğrulamalıdır.

Neden ayrı çekirdek modülü

FIPS 140-3 doğrulaması, yazılım veya donanım tabanlı bir modülün onaylandıktan sonra hiçbir zaman değiştirilmemesi fikrine dayanır. Değiştirilirse yeniden onaylanması gerekir. Bu, günümüzde kullanımda olan yazılım geliştirme süreçleriyle uyumlu değildir. Bu gereklilik nedeniyle FIPS yazılım modülleri, genellikle kriptografiyle ilgili olmayan değişikliklerin kriptografinin yeniden değerlendirilmesini gerektirmemesini sağlamak için kriptografik bileşenlere mümkün olduğunca sıkı bir şekilde odaklanacak şekilde tasarlanmıştır.

GKI çekirdeği, desteklenen kullanım ömrü boyunca düzenli olarak güncellenecek şekilde tasarlanmıştır. Bu, çekirdeğin tamamının FIPS modülü sınırları içinde olmasını olanaksız kılar. Çünkü böyle bir modülün, her çekirdek güncellemesinden sonra yeniden onaylanması gerekir. "FIPS modülünün" çekirdek görüntüsünün bir alt kümesi olarak tanımlanması, bu sorunu hafifletecektir ancak "FIPS modülünün" ikili içeriği yine de gerekenden çok daha sık değişeceğinden çünkü bu sorunu çözmez.

6.1 çekirdek sürümünden önce dikkat edilmesi gereken bir başka nokta da GKI'nın LTO (Bağlantı Süresi Optimizasyonu) etkinleştirilerek derlenmesiydi. Bunun nedeni, LTO'nun önemli bir güvenlik özelliği olan Akış Bütünlüğünü Kontrol Etme'nin ön koşulu olmasıydı.

Bu nedenle, FIPS 140-3 gereksinimlerinin kapsadığı tüm kodlar, yalnızca oluşturulduğu GKI çekirdek kaynağının kullanıma sunduğu kararlı arayüzlere dayanan ayrı bir çekirdek modülü (fips140.ko) halinde paketlenir. Bu, modülün aynı nesil farklı GKI sürümleriyle kullanılabilmesini ve yalnızca modülün kendisi tarafından taşınan kodda herhangi bir sorun giderilmişse güncellenip sertifika için yeniden gönderilmesi gerektiğini garanti eder.

Modül ne zaman kullanılır?

GKI çekirdeğinin kendisi, aynı zamanda FIPS 140-3 çekirdek modülüne dahil edilen kripto rutinlerine bağlı bir kod taşır. Bu nedenle, yerleşik şifreleme rutinleri aslında GKI çekirdeğinden taşınmaz, modüle kopyalanır. Modül yüklendiğinde, yerleşik şifreleme rutinlerinin Linux CryptoAPI'deki kaydı silinir ve bunların yerini modül tarafından taşınanlar alır.

Yani fips140.ko modülü tamamen isteğe bağlıdır ve yalnızca FIPS 140-3 sertifikası gerekliyse dağıtılabilir. Bunun ötesinde, modülün ek işlev sağlaması gerekmez ve gereksiz bir şekilde yüklenmesi yalnızca başlatma süresini etkiler. Üstelik herhangi bir fayda sağlamaz.

Modülü dağıtma

Modül, aşağıdaki adımlar uygulanarak Android derlemesine dahil edilebilir:

  • Modül adını BOARD_VENDOR_RAMDISK_KERNEL_MODULES öğesine ekleyin. Bu, modülün satıcı ramdisk'ine kopyalanmasına neden olur.
  • Modül adını BOARD_VENDOR_RAMDISK_KERNEL_MODULES_LOAD öğesine ekleyin. Bu, modül adının hedefteki modules.load öğesine eklenmesine neden olur. modules.load, cihaz başlatıldığında init tarafından yüklenen modüllerin listesini içerir.

Bütünlük kendi kendine kontrolü

FIPS 140-3 çekirdek modülü, modül yükleme zamanında kendi .code ve .rodata bölümlerinin HMAC-SHA256 özetini alıp modülde kaydedilen özetle karşılaştırır. Bu işlem, Linux modül yükleyicisi tarafından ELF yeniden konumlandırma işleme ve bu bölümlerdeki CPU hataları için yama uygulama gibi normal değişiklikler yapıldıktan sonra gerçekleşir. Özetin doğru şekilde yeniden üretilebilmesi için aşağıdaki ek adımlar gerçekleştirilir:

  • ELF yer değiştirmeleri, HMAC girişinin tersine uygulanabilmesi için modül içinde korunur.
  • Modül, Dinamik Gölge Çağrısı Yığını için çekirdek tarafından oluşturulan tüm kod yamalarını geri alır. Özellikle modül, gölge çağrısı yığınından itilen veya çıkan tüm talimatları başlangıçta mevcut olan İşaretçi Kimlik Doğrulama Kodu (PAC) talimatlarıyla değiştirir.
  • Statik anahtarlar ve dolayısıyla izleme noktaları ile satıcı kancaları dahil olmak üzere diğer tüm kod yamaları modül için devre dışı bırakılır.

Bilinen yanıtlarla yapılan kendi kendine testler

FIPS 140-3 şartlarının kapsamına giren uygulanan tüm algoritmaların, kullanılmadan önce bilinen yanıtlı bir kendi kendine test yapması gerekir. FIPS 140-3 Uygulama Kılavuzu 10.3.A'ya göre, desteklenen anahtar uzunluklarından herhangi birini kullanan her algoritma için tek bir test vektörü, hem şifreleme hem de şifre çözme test edildiği sürece şifreler için yeterlidir.

Linux CryptoAPI'de bir algoritma öncelikleri kavramı vardır. Bu algoritmada, aynı algoritmaya ait çeşitli uygulamalar (özel şifreleme talimatları kullanan bir uygulama ve bu talimatları uygulamayan CPU'lar için yedek gibi) birlikte kullanılabilir. Dolayısıyla, aynı algoritmanın tüm uygulamalarını test etmek gerekir. Linux CryptoAPI, önceliğe dayalı seçimin atlanmasına ve bunun yerine daha düşük öncelikli bir algoritmanın seçilmesine izin verdiği için bu gereklidir.

Modüle dahil edilen algoritmalar

FIPS 140-3 modülünde yer alan 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 çekirdek sürümleri arasındaki farklar uygun yerlerde belirtilmiştir.

Algoritma Uygulamalar Onaylanabilir Tanım
aes aes-generic, aes-arm64, aes-ce, AES kitaplığı Evet Çalışma modu olmadan düz AES blok şifresi: Tüm anahtar boyutları (128 bit, 192 bit ve 256 bit) desteklenir. Kitaplık uygulaması dışındaki tüm uygulamalar, bir şablon üzerinden çalışma 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 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 Şifrelenmiş metin çalma özelliğine sahip AES-CBC-CTS veya AES-CBC: Kullanılan kural CS3 şeklindedir; son iki şifrelenmiş metin bloğu koşulsuz olarak değiştirilir.Tüm AES anahtar boyutları desteklenir.cts şablonu, cts(<cbc(aes)-impl>) kullanılarak oluşturulmuş 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-TO: 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: 6.1 ve daha eski çekirdek sürümlerinde tüm AES anahtar boyutları desteklenir; çekirdek 6.6 ve sonraki sürümlerde ise yalnızca AES-128 ve AES-256 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'nin gerektirdiği zayıf anahtar kontrolünü uygular. Bu da birinci 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'lerin sağlanmasından arayan kişi sorumludur. gcm şablonu, gcm_base(<ctr(aes)-impl>,<ghash-impl>) kullanılarak tüm ctr(aes) ve ghash 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 şifreleme karma işlevi: Kod, SHA-256 ile paylaşılır.
sha256 sha256-generic, sha256-arm64, sha256-ce, SHA-256 kitaplığı Evet SHA-256 şifreli karma işlevi: SHA-256'ya geleneksel CryptoAPI arayüzüne ek olarak bir kitaplık arayüzü sağlanır. Bu kitaplık arayüzünde farklı bir uygulama kullanılmıştır.
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 ş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 mevcuttur.
sha3-256 sha3-256-generic Evet Öncekiyle aynı, ancak 256 bit özet uzunluğunda (SHA3-256). Tüm özet uzunlukları aynı Keccak uygulamasını kullanır.
sha3-384 sha3-384-generic Evet Öncekiyle aynı ancak 384 bit özet uzunluğunda (SHA3-384). Tüm özet uzunlukları aynı Keccak uygulamasını kullanır.
sha3-512 sha3-512-generic Evet Öncekiyle aynı, ancak 512 bit özet uzunluğunda (SHA3-512). Tüm özet uzunlukları aynı Keccak uygulamasını kullanır.
hmac hmac (şablon) Evet HMAC (Anahtarlı Karma İleti Kimlik Doğrulama Kodu): hmac şablonu, hmac(<sha-alg>) veya hmac(<sha-impl>) kullanılarak herhangi bir SHA algoritması veya uygulaması ile 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 etkinken: Durum denetimleri dahil edildi. 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ı ile aynı olsa da tahmin direnci devre dışıdır. Kod, tahmine dirençli varyantla paylaşılır. 5.10 çekirdek sürümünde en yüksek öncelikli DRBG, drbg_nopr_hmac_sha256 değeridir. 5.15 ve sonraki çekirdek sürümlerinde drbg_pr_hmac_sha512 değerine sahiptir.
jitterentropy_rng jitterentropy_rng Hayır Jitter RNG, sürüm 2.2.0 (çekirdek sürümü 6.1 ve önceki sürümler) veya sürüm 3.4.0 (çekirdek sürümü 6.6 ve sonrası). 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 5.15 ve sonraki çekirdek sürümlerinde mevcuttur.
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 derleyin

Android 14 ve sonraki sürümler (android-mainline dahil) için aşağıdaki komutları kullanarak fips140.ko modülünü kaynaktan derleyin.

  • Bazel ile derleme:

    tools/bazel run //common:fips140_dist
    
  • build.sh ile oluşturun (eski):

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

Bu komutlar, çekirdek ve içinde yerleşik HMAC-SHA256 özet içeriklerinin bulunduğu fips140.ko modülünü de içeren tam bir derleme gerçekleştirir.

Son kullanıcı rehberliği

Kripto yetkilisi rehberliği

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

Çekirdek modülü ayrı olarak yüklenemez. Cihaz donanım yazılımına dahildir ve başlatma sırasında otomatik olarak yüklenir. Yalnızca onaylanmış bir çalışma modunda çalışır.

Şifreleme Yetkilisi, cihazı yeniden başlatarak herhangi bir zamanda kendi kendine testlerin çalıştırılmasına neden olabilir.

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ı için ek mantık sağlamaz ve kriptografik bir işlem yapmak için gereken süreden daha fazla parametre depolamaz.

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

Kendi kendine test hataları

Kendi kendine test hatası olması durumunda çekirdek modülü, çekirdeğin paniğe kapılmasına neden olur ve cihaz başlatılmaya devam etmez. Cihazın yeniden başlatılması sorunu çözmezse yeniden başlatarak sorunu gidermek için cihazın kurtarma modunda başlatılması gerekir.


  1. Modülün AES-GCM uygulamalarının "algoritma onaylı" olması ancak "modül tarafından onaylı" olmaması beklenir. Doğrulanabilirler 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 uyumlu olmamasıdır.