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 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, kullanıma sunmadan önce bilinen yanıtlı kendi kendine testler kullanarak onaylanmış şifreleme algoritmalarını uygulamalı 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 sertifikalandırılması sonrasında hiçbir zaman değiştirilmeyeceği fikrine dayanır. Değiştirildiyse yeniden sertifikalandırılmalıdır. 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ğ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ün" çekirdek görüntüsünün bir alt kümesi olarak tanımlanması, bu sorunu azaltır ancak "FIPS modülünün" ikili içeriği yine de gerekenden çok daha sık değişeceğinden çözüm olmaz.

Ç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 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 paketlenmiştir. 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ğ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 rutinleri Linux CryptoAPI'den devre dışı bırakılır ve modül tarafından taşınan rutinlerle değiştirilir.

Yani fips140.ko modülü tamamen isteğe bağlıdır ve yalnızca FIPS 140-3 sertifikası gerekliyse dağıtılabilir. 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 alanına 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 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 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ıtlarla yapılan 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 aes'un herhangi bir uygulamasıyla derlenebilir. 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'un herhangi bir uygulamasıyla derlenebilir. 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'un herhangi bir uygulamasıyla derlenebilir. 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 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-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 şifreli 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ır.
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 kriptografik karma işlevi. Yalnızca 6.6 ve sonraki çekirdek sürümlerinde bulunur.
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ü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 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 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 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şlemcideki bellek yönetimi donanımı kullanılarak Android tarafından 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 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ı için ek mantık sağlamaz ve kriptografik bir işlem yapmak için gereken süreden daha fazla parametre depolamaz.

FIPS uyumluluğu amacıyla algoritmaların kullanımı, onaylı 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.