KeyMint işlevleri

Bu sayfada, KeyMint donanım soyutlama katmanını (HAL) uygulayanlara yardımcı olacak ek ayrıntılar ve yönergeler verilmektedir. HAL'nin birincil dokümanı AIDL arayüz spesifikasyonudur.

API'nin hatalı kullanımı

Arayanlar, API parametreleri olarak geçerli olan ancak sonuçtaki anahtarları güvensiz veya kullanılamaz hale getiren yetkilendirmelerle KeyMint anahtarları oluşturabilir. KeyMint uygulamalarının bu gibi durumlarda başarısız olması veya teşhis yayınlaması gerekmez. Çok küçük anahtarların kullanılması, alakasız giriş parametrelerinin belirtilmesi, başlatma vektörlerinin veya tek kullanımlık sayıların yeniden kullanılması, amaçsız (dolayısıyla işe yaramaz) anahtarların oluşturulması gibi durumlar uygulamalar tarafından teşhis edilmemelidir.

KeyMint modüllerine yapılan çağrıların mantıklı ve faydalı olmasını sağlamak uygulamaların, çerçevelerin ve Android Keystore'un sorumluluğundadır.

addRngEntropy giriş noktası

addRngEntropy giriş noktası, rastgele sayılar, anahtarlar ve başlatma vektörleri oluşturmak için KeyMint uygulamasının kullandığı havuza arayan tarafından sağlanan entropiyi ekler.

KeyMint uygulamaları, sağlanan entropiyi havuzlarına güvenli bir şekilde karıştırmalıdır. Bu havuzda, donanım rastgele sayı üretecinden dahili olarak oluşturulan entropi de bulunmalıdır. Karıştırma işlemi, addRngEntropy tarafından sağlanan bitler veya donanım tarafından oluşturulan bitler (ancak ikisi birden değil) üzerinde tam kontrol sahibi olan bir saldırganın, entropi havuzundan oluşturulan bitleri tahmin etmede önemli bir avantaj elde etmeyeceği şekilde yapılmalıdır.

Temel özellikler

KeyMint anahtarları oluşturan mekanizmaların (generateKey, importKey ve importWrappedKey) her biri, yeni oluşturulan anahtarın özelliklerini döndürür. Bu özellikler, her bir özelliği zorunlu kılan güvenlik düzeylerine uygun şekilde bölünür. Döndürülen özellikler, anahtar oluşturma için belirtilen tüm parametreleri (Tag::APPLICATION_ID ve Tag::APPLICATION_DATA hariç) içerir. Bu etiketler anahtar parametrelere dahil edilirse döndürülen anahtar blobu incelenerek değerlerinin bulunması mümkün olmaması için döndürülen özelliklerden kaldırılır. Ancak bunlar, keyblob'a kriptografik olarak bağlıdır. Bu nedenle, anahtar kullanıldığında doğru değerler sağlanmazsa kullanım başarısız olur. Benzer şekilde, Tag::ROOT_OF_TRUST, anahtara kriptografik olarak bağlıdır ancak anahtar oluşturma veya içe aktarma sırasında belirtilemez ve hiçbir zaman döndürülmez.

KeyMint uygulaması, sağlanan etiketlere ek olarak anahtarın oluşturulma şeklini (KeyOrigin::GENERATED, KeyOrigin::IMPORTED veya KeyOrigin::SECURELY_IMPORTED) belirten Tag::ORIGIN etiketini de ekler.

Geri alma direnci

Geri alma direnci Tag::ROLLBACK_RESISTANCE ile gösterilir ve bir anahtar deleteKey veya deleteAllKeys ile silindiğinde güvenli donanımın bu anahtarın bir daha asla kullanılamayacağını garanti ettiği anlamına gelir.

KeyMint uygulamaları, oluşturulan veya içe aktarılan anahtar materyalini, şifrelenmiş ve kimliği doğrulanmış bir biçim olan anahtar blobu olarak arayana döndürür. Keystore, keyblob'u sildiğinde anahtar kaybolur ancak daha önce anahtar materyalini almayı başarmış bir saldırgan, anahtarı cihaza geri yükleyebilir.

Güvenli donanım, silinen anahtarların daha sonra geri yüklenemeyeceğini garanti ediyorsa anahtar, geri alma işlemine karşı dirençlidir. Bu işlem genellikle ek anahtar meta verilerini, saldırgan tarafından değiştirilemeyen güvenilir bir konumda depolayarak yapılır. Mobil cihazlarda bu amaçla kullanılan mekanizma genellikle tekrar oynatmaya karşı korumalı bellek bloklarıdır (RPMB). Oluşturulabilecek anahtar sayısı esasen sınırsız olduğundan ve geri alma direnci için kullanılan güvenilir depolama alanı boyutu sınırlı olabileceğinden, depolama alanı dolduğunda uygulama, geri alma dirençli anahtarlar oluşturma isteklerini karşılayamayabilir.

başla

begin() giriş noktası, belirtilen amaç için belirtilen anahtar kullanılarak belirtilen parametrelerle (uygun şekilde) bir şifreleme işlemi başlatır. İşlemi tamamlamak için kullanılan yeni bir IKeyMintOperation Binder nesnesi döndürür. Ayrıca, kimliği doğrulanmış işlemlerde kimlik doğrulama jetonunun bir parçası olarak kullanılan bir sorgulama değeri döndürülür.

KeyMint uygulaması en az 16 eşzamanlı işlemi destekler. Anahtar deposu 15 anahtar kullanır ve vold için şifre şifrelemede kullanılacak bir anahtar bırakır. Keystore'da 15 işlem devam ederken (begin() çağrılmış ancak finish veya abort çağrılmamış) ve 16. işlemi başlatma isteği alındığında, en son kullanılan işlemde abort() çağrılır. Böylece, yeni istenen işlemi başlatmak için begin() çağrılmadan önce etkin işlem sayısı 14'e düşürülür.

Anahtar oluşturma veya içe aktarma sırasında Tag::APPLICATION_ID ya da Tag::APPLICATION_DATA belirtilmişse begin() çağrıları, bu yöntemin params bağımsız değişkeninde başlangıçta belirtilen değerlerle birlikte bu etiketleri içermelidir.

Hata işleme

IKeyMintOperation üzerindeki bir yöntem ErrorCode::OK dışında bir hata kodu döndürürse işlem iptal edilir ve işlem Binder nesnesi geçersiz kılınır. Nesnenin gelecekteki tüm kullanımları ErrorCode::INVALID_OPERATION_HANDLE değerini döndürür.

Yetkilendirme zorunluluğu

Anahtar yetkilendirme zorunluluğu öncelikle begin() içinde uygulanır. Tek istisna, anahtarın bir veya daha fazla Tag::USER_SECURE_ID değeri olduğu ve Tag::AUTH_TIMEOUT değerinin olmadığı durumdur.

Bu durumda, anahtarın işlem başına yetkilendirme yapılması gerekir ve update() veya finish() yöntemleri, authToken bağımsız değişkeninde bir kimlik doğrulama jetonu alır. Jetonun geçerli olduğundan emin olmak için KeyMint uygulaması:

  • Kimlik doğrulama jetonundaki HMAC imzasını doğrular.
  • Jetonun, anahtarla ilişkilendirilmiş bir kullanıcı kimliğiyle eşleşen güvenli bir kullanıcı kimliği içerdiğini kontrol eder.
  • Jetonun kimlik doğrulama türünün anahtarın Tag::USER_AUTH_TYPE ile eşleşip eşleşmediğini kontrol eder.
  • Jetonun, mevcut işlem için zorluk değerini zorluk alanında içerdiğini kontrol eder.

Bu koşullar karşılanmazsa KeyMint, ErrorCode::KEY_USER_NOT_AUTHENTICATED değerini döndürür.

Arayan, update() ve finish()'ye yapılan her aramada kimlik doğrulama jetonunu sağlar. Uygulama, jetonu yalnızca bir kez doğrulayabilir.