GKI çekirdeği, kriptografik yazılım modülleri için FIPS 140-3 gereksinimlerine uyan fips140.ko
adlı bir Linux çekirdek modülü içerir. GKI çekirdeğini çalıştıran ürün gerektiriyorsa, bu modül FIPS sertifikası için gönderilebilir.
Kripto rutinlerinin kullanılabilmesi için özellikle aşağıdaki FIPS 140-3 gereklilikleri yerine getirilmelidir:
- 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 testleri kullanarak uygulamalı ve doğrulamalıdır.
Neden ayrı bir çekirdek modülü
FIPS 140-3 doğrulaması, bir yazılım veya donanım tabanlı modülün onaylandıktan sonra asla değiştirilemeyeceği fikrine dayanır. Değiştirilirse, yeniden sertifikalandırılmalıdır. Bu, günümüzde kullanılan yazılım geliştirme süreçleriyle kolayca eşleşmez ve bu gereksinimin bir sonucu olarak, FIPS yazılım modülleri, kriptografi ile ilgili olmayan değişikliklerin yapılmasını sağlamak için genellikle kriptografik bileşenlere mümkün olduğunca sıkı bir şekilde odaklanacak şekilde tasarlanır. kriptografinin yeniden değerlendirilmesini gerektirmez.
GKI çekirdeğinin, desteklenen tüm kullanım ömrü boyunca düzenli olarak güncellenmesi amaçlanmıştır. Bu, böyle bir modülün her çekirdek güncellemesinde yeniden onaylanması gerektiğinden, tüm çekirdeğin FIPS modülü sınırı içinde olmasını olanaksız hale getirir. Ayrıca, LTO önemli bir güvenlik özelliği olan CFI için bir ön koşul olduğundan GKI, LTO (Link Time Optimization) etkinleştirilmiş olarak derlenir. Bu, FIPS modülü sınırının yalnızca çekirdeğin kripto kodunun etrafına çizilmesini olanaksız kılar, çünkü böyle bir kod, ortaya çıkan ikili dosyada açıkça tanımlanmış bir konumda değildir. Çekirdek güncellemeleri kripto kodunu da değiştirebilir.
Bu nedenle, FIPS 140-3 gereksinimlerinin kapsadığı tüm kodlar, yalnızca oluşturulduğu GKI çekirdek kaynağı tarafından kullanıma sunulan kararlı arabirimlere dayanan ayrı bir çekirdek modülü fips140.ko
içinde paketlenir. Bu, modülün aynı neslin farklı GKI sürümleriyle kullanılabileceğini ve yalnızca modülün kendisi tarafından taşınan kodda herhangi bir sorun giderildiyse güncellenmesi ve sertifika için yeniden gönderilmesi gerektiğini garanti eder.
Modül ne zaman kullanılır?
GKI çekirdeğinin kendisi, yine FIPS 140-3 çekirdek modülünde 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 Linux CryptoAPI'den kaydı silinir ve modülün taşıdığı rutinlerin yerini alır.
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ı halinde konuşlandırılmasının mantıklı olduğu anlamına gelir. Bunun ötesinde, modül herhangi bir ek işlevsellik sağlamaz ve gereksiz yere yüklenmesi, herhangi bir fayda sağlamadan yalnızca önyükleme süresini etkileyebilir.
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
olarak ekleyin. Bu, modülün satıcı ramdisk'e kopyalanmasına neden olur. - Modül adını
BOARD_VENDOR_RAMDISK_KERNEL_MODULES_LOAD
. Bu, modül adının hedeftemodules.load
eklenmesine neden olur.modules.load
, aygıt önyüklendiğindeinit
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 modülde kaydedilen özet ile karşılaştırır. Bu, Linux modül yükleyicisi, ELF yer değiştirme işlemesi ve CPU hataları için bu bölümlere alternatif yamalar gibi olağan değişiklikleri zaten yaptıktan sonra gerçekleşir. Özetin doğru bir şekilde yeniden üretilebilmesini sağlamak için aşağıdaki ek adımlar atılır:
- ELF yer değiştirmeleri, HMAC girişine ters olarak uygulanabilmeleri için modülün içinde korunur.
- Statik anahtarlar ve dolayısıyla izleme noktaları ve satıcı kancaları dahil olmak üzere modül için diğer tüm kod düzeltme eki devre dışı bırakılır.
Bilinen yanıtlı kendi kendine testler
FIPS 140-3 gerekliliklerinin kapsadığı tüm uygulanan algoritmalar, kullanılmadan önce bir bilinen yanıtlı kendi kendine test gerçekleştirmelidir. 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 biri 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ı test etmeye ihtiyaç vardır. Bu gereklidir çünkü Linux CryptoAPI, önceliğe dayalı seçimin atlanmasına ve bunun yerine daha düşük öncelikli bir algoritmanın seçilmesine izin verir.
Modülde yer alan algoritmalar
android13-5.10 kaynaklarından derlendiğinde FIPS 140-3 modülüne dahil olan tüm algoritmalar aşağıdaki gibi sıralanmıştır.
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 üzerinden ç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 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 xts-aes-ce | Evet | AES-XTS: Tüm AES anahtar boyutları desteklenir. xts şablonu, xts(<ecb(aes)-impl>) ecb(aes) herhangi bir ecb(aes) uygulamasıyla oluşturulabilir. Diğer uygulamalar bağımsızdır. Tüm uygulamalar, FIPS tarafından gerekli görülen zayıf anahtar denetimini 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'leri sağlamaktan 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 sağlama işlevi: Kod, SHA-256 ile paylaşılır. |
sha256 | sha256-generic , sha256-arm64 , sha256-ce , SHA-256 kitaplığı | Evet | SHA-256 kriptografik hash işlevi: SHA-256'ya geleneksel CryptoAPI arabirimine ek olarak bir kitaplık arabirimi sağlanır. Bu kitaplık arabirimi farklı bir uygulama kullanır. |
sha384 | sha384-generic , sha384-arm64 , sha384-ce | Evet | SHA-384 kriptografik sağlama işlevi: Kod, SHA-512 ile paylaşılır. |
sha512 | sha512-generic , sha512-arm64 , sha512-ce | Evet | SHA-512 şifreleme sağlama 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ış hash işleviyle ve tahmin direnci etkinleştirilerek örneklendi: Durum denetimleri dahildir. Bu arayüzün kullanıcıları kendi DRBG örneklerine sahip olur. |
stdrng | drbg_nopr_hmac_sha1 , drbg_nopr_hmac_sha256 , drbg_nopr_hmac_sha384 , drbg_nopr_hmac_sha512 | Evet | drbg_pr_* algoritmalarıyla aynı, ancak tahmin direnci devre dışı. Kod, tahmine dayanıklı değişkenle paylaşılır. En yüksek önceliğe sahip DRBG, drbg_nopr_hmac_sha256 . |
jitterentropy_rng | jitterentropy_rng | Numara | Jitter RNG'nin 2.2.0 Sürümü : Bu arayüzün kullanıcıları kendi Jitter RNG örneklerine sahip olur. DRBG'lerin kullandığı örnekleri yeniden kullanmazlar. |
xcbc(aes) | xcbc-aes-neon , xcbc-aes-ce | Numara | |
cbcmac(aes) | cbcmac-aes-neon , cbcmac-aes-ce | Numara | |
essiv(cbc(aes),sha256) | essiv-cbc-aes-sha256-neon , essiv-cbc-aes-sha256-ce | Numara |
Modülü kaynaktan oluşturma
fips140.ko
modülü, aşağıdaki komut kullanılarak GKI çekirdek kaynaklarından oluşturulabilir:
BUILD_CONFIG=common/build.config.gki.aarch64.fips140 build/build.sh
Bu, içeriğinin doğru HMAC-SHA256 özeti gömülü olarak, çekirdek ve fips140.ko
modülü ile tam yapıyı gerçekleştirir.
Android 14 (AOSP deneysel) ve sonraki sürümlerde, aşağıdaki komutu kullanarak build/build.sh
yerine Bazel ile derleyin:
tools/bazel run //common:fips140_dist
Son kullanıcı rehberliği
Kripto Görevlisi rehberliği
Çekirdek modülünü çalıştırmak için, işletim sisteminin tek bir operatör çalışma moduyla sınırlandırılması gerekir. Bu, işlemcideki bellek yönetimi donanımı kullanılarak Android tarafından otomatik olarak gerçekleştirilir.
Çekirdek modülü ayrı olarak kurulamaz; aygıt üretici 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.
Kripto Görevlisi, herhangi bir zamanda cihazı yeniden başlatarak otomatik testlerin yapılmasını sağlayabilir.
Kullanıcı rehberliği
Ç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 kriptografik bir işlemi gerçekleştirmek için gereken sürenin ötesinde herhangi bir parametre saklamaz.
Algoritmaların FIPS uyumluluğ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 bir algoritmanın onaylanıp onaylanmadığını gösteren bir fips140_is_approved_service
işlevi sağlar.
Otomatik 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ı yeniden flaşlayarak sorunu düzeltmek için cihazın kurtarma modunda açılması gerekir.
Modülün AES-GCM uygulamalarının "algoritma onaylı" olması ancak "modül onaylı" olmaması beklenir. Doğrulanabilirler ancak AES-GCM, FIPS modülü açısından onaylanmış 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. ↩