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.