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

GKI çekirdeği, fips140.ko adlı bir Linux çekirdeği modülü içerir. Bu modül, kriptografik yazılım modülleri için FIPS 140-3 şartlarına uygundur. GKI çekirdeğini çalıştıran ürün bunu gerektiriyorsa bu modül FIPS sertifikası için 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, onaylanmış kriptografik algoritmalarını kullanıma sunmadan önce bilinen yanıtlı 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ün onaylandıktan sonra hiçbir zaman değiştirilmemesi fikrine dayanır. Değiştirildiyse yeniden sertifikalandırılmalıdır. Bu, günümüzde kullanılan yazılım geliştirme süreçleriyle tam olarak eşleşmez. Bu şartın bir sonucu olarak FIPS yazılım modülleri, genellikle şifrelemeyle ilgili olmayan değişikliklerin şifrelemenin yeniden değerlendirilmesini gerektirmemesi için şifreleme bileşenlerine mümkün olduğunca sıkı şekilde odaklanacak şekilde tasarlanır.

GKI çekirdeğinin, desteklenen kullanım ömrü boyunca düzenli olarak güncellenmesi amaçlanmıştır. Bu nedenle, her çekirdek güncellemesinde yeniden sertifikalanması gereken bu tür bir modülün tüm çekirdeğin FIPS modülü sınırı içinde olması mümkün değildir. "FIPS modülü"nü çekirdek görüntüsünün bir alt kümesi olarak tanımlamak bu sorunu hafifletir ancak "FIPS modülü"nün ikili içeriği yine de gerekenden çok daha sık değişeceğinden sorunu çözmez.

Çekirdek sürümü 6.1'den önce, GKI'nın LTO (Bağlantı Sırasında Optimizasyon) etkinken derlenmesi de dikkate alınması gereken bir noktaydı. LTO, önemli bir güvenlik özelliği olan Denetimli Akış Bütünlüğü için ön koşuldu.

Bu nedenle, FIPS 140-3 şartları kapsamındaki tüm kod, yalnızca oluşturulduğu GKI çekirdek kaynağı tarafından sunulan kararlı arayüzleri kullanan ayrı bir çekirdek modülüne fips140.ko paketlenir. Bu, modülün aynı neslin farklı GKI sürümleriyle kullanılabileceği ve yalnızca modülün taşıdığı kodda herhangi bir sorun düzeltildiyse güncellenmesi ve sertifika için yeniden gönderilmesi gerektiği anlamına gelir.

Modülü ne zaman kullanmalısınız?

GKI çekirdeği, FIPS 140-3 çekirdek modülüne de paketlenmiş şifreleme rutinlerine bağlı kodlar içerir. Bu nedenle, yerleşik kripto rutinleri aslında GKI çekirdeğinden çıkarılmaz, modüle kopyalanır. Modül yüklendiğinde, yerleşik şifreleme rutinleri Linux CryptoAPI'den devre dışı bırakılır ve modül tarafından taşınan rutinlerle değiştirilir.

Bu, fips140.ko modülünün tamamen isteğe bağlı olduğu ve yalnızca FIPS 140-3 sertifikası zorunluysa dağıtılmasının mantıklı olduğu anlamına gelir. Bunun dışında modül ek özellik sağlamaz ve gereksiz yere yüklenmesi, herhangi bir fayda sağlamadan yalnızca önyükleme süresini etkileyebilir.

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 alanına ekleyin. Bu, modülün tedarikçi 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 alanına eklenmesine neden olur. modules.load, cihaz açıldığında init tarafından yüklenen modüllerin listesini tutar.

Bütünlük 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 modüle kaydedilen özetle karşılaştırır. Bu işlem, Linux modülü yükleyicisi ELF taşıma işlemi ve CPU düzeltmelerine yönelik alternatif yamalar 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 taşıma işlemleri, HMAC girişine ters olarak uygulanabilmeleri için modül içinde korunur.
  • Modül, Dinamik Gölge Çağrı Yığını için çekirdek tarafından yapılan tüm kod yamalarını tersine çevirir. Daha açık belirtmek gerekirse modül, gölge çağrı yığınından iten veya yığına ekleyen 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ı ve tedarikçi bağlantı noktaları da dahil olmak üzere modül için diğer tüm kod yamaları devre dışı bırakılır.

Bilinen yanıtlı kendi kendine testler

FIPS 140-3 şartları kapsamındaki uygulanan 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, 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'de, aynı algoritmanın birkaç farklı uygulamasının (ör. özel şifreleme talimatlarını kullanan bir uygulama ve bu talimatları uygulamayan CPU'lar için yedek) birlikte bulunabileceği bir algoritma öncelikleri kavramı vardır. 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ği için bu gereklidir.

Modüle dahil edilen 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 ç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 olmayan 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 aracılığıyla bir çalışma moduyla derlenebilir.
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 Şifre metni hırsızlığı içeren AES-CBC-CTS veya AES-CBC: Kullanılan sözleşme CS3'tür; son iki şifre metni bloğu koşulsuz olarak değiştirilir.Tüm AES anahtar boyutları desteklenir. cts şablonu, cts(<cbc(aes)-impl>) kullanılarak cbc'un herhangi bir uygulamasıyla derlenebilir. 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: 6.1 ve önceki çekirdek sürümlerinde tüm AES anahtar boyutları desteklenir; 6.6 ve sonraki çekirdek sürümlerinde yalnızca AES-128 ve AES-256 desteklenir. xts şablonu, xts(<ecb(aes)-impl>) kullanılarak ecb(aes)'un herhangi bir uygulamasıyla derlenebilir. Diğer uygulamalar bağımsızdır. Tüm uygulamalar, FIPS tarafından zorunlu kılınan zayıf anahtar kontrolünü uygular. 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ğlamaktan arayan sorumludur. gcm şablonu, gcm_base(<ctr(aes)-impl>,<ghash-impl>) kullanılarak ctr(aes) ve ghash'nin herhangi bir uygulamasıyla derlenebilir. 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 kriptografik karma işlevi: Kod, SHA-256 ile paylaşılır.
sha256 sha256-generic, sha256-arm64, sha256-ce, SHA-256 kitaplığı Evet SHA-256 şifreleme karma işlevi: Standart CryptoAPI arayüzüne ek olarak SHA-256'ya bir kitaplık arayüzü sağlanır. Bu kitaplık arayüzünde farklı bir uygulama kullanılıyor.
sha384 sha384-generic, sha384-arm64, sha384-ce Evet SHA-384 kriptografik karma işlevi: Kod, SHA-512 ile paylaşılır.
sha512 sha512-generic, sha512-arm64, sha512-ce Evet SHA-512 kriptografik 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 Önceki ile aynıdır ancak 256 bit özet uzunluğuna (SHA3-256) sahiptir. Tüm özet uzunlukları aynı Keccak uygulamasını kullanır.
sha3-384 sha3-384-generic Evet Önceki ile aynıdır ancak 384 bit özet uzunluğuna (SHA3-384) sahiptir. Tüm özet uzunlukları aynı Keccak uygulamasını kullanır.
sha3-512 sha3-512-generic Evet Önceki ile aynıdır ancak 512 bit özet uzunluğuna (SHA3-512) sahiptir. Tüm özet uzunlukları aynı Keccak uygulamasını kullanır.
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ı ya da uygulamasıyla derlenebilir.
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şlevle ve tahmine karşı direnç etkinleştirilmiş şekilde örneklenir: Sağlık kontrolleri dahildir. Bu arayüz 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 tahmine karşı direnç 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'tür. 5.15 ve sonraki çekirdek sürümlerinde bu değer drbg_pr_hmac_sha512'tür.
jitterentropy_rng jitterentropy_rng Hayır Jitter RNG, 2.2.0 sürümü (çekirdek sürümü 6.1 ve önceki sürümler) veya 3.4.0 sürümü (çekirdek sürümü 6.6 ve sonraki sürümler). Bu arayüz 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 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ü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 (eski) ile oluşturma:

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

Bu komutlar, çekirdek ve HMAC-SHA256 özet içeriği yerleştirilmiş fips140.ko modülü dahil olmak üzere tam bir derleme gerçekleştirir.

Son kullanıcılara yönelik rehberlik

Kripto para birimi sorumlusu rehberliği

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

Çekirdek modülü ayrı olarak yüklenemez. Cihaz donanım yazılımının bir parçası olarak dahil edilir ve önyükleme sırasında otomatik olarak yüklenir. Yalnızca onaylanmış bir çalışma modunda çalışır.

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

Kullanıcılara yönelik rehberlik

Çekirdek modülünün kullanıcısı, 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şlemini gerçekleştirmek için gereken sürenin ötesinde herhangi bir parametre saklamaz.

Algoritmaların FIPS uygunluğu amacıyla kullanımı, onaylanmış algoritmalarla sınırlıdır. Modül, FIPS 140-3 "hizmet göstergesi" şartını karşılamak için 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 paniğe kapılmasına neden olur ve cihazın önyüklemesi devam etmez. Cihazın yeniden başlatılması sorunu çözmezse cihazı yeniden flaşlayarak sorunu düzeltmek için cihazın kurtarma modunda başlatılması gerekir.


  1. Modülün AES-GCM uygulamalarının "modül onaylı" değil, "algoritma onaylı" olması 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ü koşullarının, kendi IV'lerini oluşturmayan GCM uygulamalarıyla uyumlu olmamasıdır.