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 hedeftekimodules.load
öğesine eklenmesine neden olur.modules.load
, cihaz başlatıldığındainit
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.
-
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.↩