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üvenli olmayan 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, IV'lerin veya nonce'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çevenin 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ı oluşturucudan 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 etmemesini sağlayacak şekilde yapılmalıdır.

Başlıca ö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 özelliklerden kaldırılır. Böylece, döndürülen keyblob incelenerek değerlerinin bulunması mümkün olmaz. Ancak bunlar, şifreleme yoluyla keyblob'a 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 çekilmeye karşı direnç Tag::ROLLBACK_RESISTANCE ile gösterilir ve bir anahtar deleteKey veya deleteAllKeys ile silindiğinde güvenli donanım, anahtarın bir daha asla kullanılamayacağını garanti eder.

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 işlem için genellikle tekrar oynatmaya karşı korumalı bellek blokları (RPMB) kullanılır. 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 anahtar oluşturma isteklerini karşılayamayabilir.

başlangıç

begin() giriş noktası, belirtilen amaç için belirtilen anahtarı kullanarak belirtilen parametrelerle (uygun olduğu ş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ış) 16. işlemin başlatılması için bir istek aldığında, yeni istenen işlemi başlatmak üzere begin()'yı çağırmadan önce etkin işlem sayısını 14'e düşürmek için en son kullanılan işlemde abort()'ı çağırı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()'da uygulanır. Tek istisna, anahtarın bir veya daha fazla Tag::USER_SECURE_ID değeri olup Tag::AUTH_TIMEOUT değerine sahip 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.