KeyMint işlevleri

Bu sayfada, KeyMint donanım soyutlama katmanını (HAL) uygulayan kullanıcılara yardımcı olacak ek ayrıntılar ve yönergeler sağlanmaktadır. HAL'in birincil dokümanı AIDL arayüz spesifikasyonudur.

API'nin kötüye kullanımı

Arama yapanlar, API parametreleri olarak geçerli olan ancak oluşturulan 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 vermesi gerekmez. Çok küçük anahtarların kullanılması, alakasız giriş parametrelerinin belirtilmesi, IV'lerin veya tek seferlik anahtarların yeniden kullanılması, anahtarların amaçsız (ve dolayısıyla işe yaramaz) şekilde oluşturulması ve benzeri durumlar, uygulamalar tarafından teşhis edilmemelidir.

KeyMint modüllerine yapılan çağrıların makul ve yararlı olmasını sağlamak uygulamaların, çerçevenin ve Android Keystore'un sorumluluğundadır.

addRngEntropy giriş noktası

addRngEntropy giriş noktası, KeyMint uygulaması tarafından anahtarlar ve IV'ler için rastgele sayı oluşturmak amacıyla kullanılan havuza arayan tarafından sağlanan entropi ekler.

KeyMint uygulamalarının, sağlanan entropiyi havuzlarına güvenli bir şekilde karıştırması gerekir. Bu havuz, donanım rastgele sayı üreticiden dahili olarak oluşturulan entropi de içermelidir. Karıştırma işlemi, addRngEntropy tarafından sağlanan bitlerin veya donanım tarafından oluşturulan bitlerin (ancak her ikisinin de değil) tam kontrolüne sahip bir saldırganın, entropi havuzundan oluşturulan bitleri tahmin etme konusunda önemli bir avantaj elde etmemesi için yapılmalıdır.

Temel özellikler

KeyMint anahtarları oluşturan mekanizmaların (generateKey, importKey ve importWrappedKey) her biri, yeni oluşturulan anahtarın özelliklerini, her bir özelliğin uygulandığı güvenlik düzeylerine uygun şekilde bölünmüş şekilde döndürür. Döndürülen özellikler, Tag::APPLICATION_ID ve Tag::APPLICATION_DATA hariç olmak üzere anahtar oluşturma için belirtilen tüm parametreleri içerir. Bu etiketler anahtar parametrelerine dahil edilirse döndürülen anahtar kümesini inceleyerek değerlerinin bulunamaması için döndürülen özelliklerden kaldırılır. Ancak anahtar blob'una kriptografik olarak bağlı olduklarından, 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 Tag::ORIGIN değerini de ekler. Bu değer, anahtarın oluşturulma şeklini (KeyOrigin::GENERATED, KeyOrigin::IMPORTED veya KeyOrigin::SECURELY_IMPORTED) belirtir.

Geri alma direnci

Geri alma koruması Tag::ROLLBACK_RESISTANCE ile gösterilir ve bir anahtar deleteKey veya deleteAllKeys ile silindikten sonra güvenli donanımın bu anahtarın bir daha kullanılamamasını sağladığı anlamına gelir.

KeyMint uygulamaları, oluşturulan veya içe aktarılan anahtar materyalini anahtar kümesi olarak çağırana döndürür. Bu anahtar kümesi, şifrelenmiş ve kimliği doğrulanmış bir formdur. Anahtar mağazası, anahtar kümesini 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üklenemediğinden emin oluyorsa anahtar geri alma işlemine karşı dayanıklıdır. Bu işlem genellikle ek anahtar meta verilerinin, saldırgan tarafından değiştirilemeyecek güvenilir bir konumda depolanmasıyla yapılır. Mobil cihazlarda bunun için kullanılan mekanizma genellikle yeniden oynatma korumalı bellek bloklarıdır (RPMB). Oluşturulabilecek anahtar sayısı temelde sınırsız olduğundan ve geri alma işlemine karşı direnç için kullanılan güvenilir depolama alanı boyut olarak sınırlı olabileceğinden, depolama alanı dolu olduğunda geri alma işlemine karşı dirençli anahtar oluşturma istekleri uygulamada başarısız olabilir.

başla

begin() giriş noktası, belirtilen anahtarı kullanarak belirtilen amaç için belirtilen parametrelerle (uygun olduğunda) 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 istem değeri döndürülür.

KeyMint uygulaması en az 16 eşzamanlı işlemi destekler. Anahtar deposu en fazla 15 anahtar kullanır ve şifre şifreleme için vold'e bir anahtar bırakır. Keystore'da devam eden 15 işlem olduğunda (begin() çağrılmış ancak finish veya abort çağrılmamışsa) ve 16. işlemi başlatma isteği aldığında, yeni istenen işlemi başlatmak için begin()'ü ç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 veya 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 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 kullanımları ErrorCode::INVALID_OPERATION_HANDLE değerini döndürür.

Yetkilendirme yaptırımı

Anahtar yetkilendirme yaptırımı öncelikle begin()'te gerçekleştirilir. Tek istisna, anahtarın bir veya daha fazla Tag::USER_SECURE_ID değerine sahip olduğu ve Tag::AUTH_TIMEOUT değerine sahip olmadığı durumdur.

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

  • Kimlik doğrulama jetonundaki HMAC imzasını doğrular.
  • Jetonun, anahtarla ilişkilendirilen kimlikle eşleşen güvenli bir kullanıcı kimliği içerip içermediğ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, challenge alanında geçerli işlem için challenge değerini içerdiğini kontrol eder.

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

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