Anahtar Deposu, şifreleme anahtarlarını kontrollü bir şekilde oluşturmak, depolamak ve kullanmak için daha güvenli bir yer sağlar. Donanım destekli anahtar depolama alanı mevcut olduğunda ve kullanıldığında anahtar materyali, cihazdan ayıklama işlemine karşı daha güvenli olur ve Keymaster, ihlal edilmesi zor olan kısıtlamalar uygular.
Ancak bu durum yalnızca anahtar mağazası anahtarlarının donanım destekli depolama alanında olduğu biliniyorsa geçerlidir. Keymaster 1'de, uygulamaların veya uzak sunucuların bu durumun geçerli olup olmadığını güvenilir bir şekilde doğrulaması mümkün değildi. Anahtar deposu arka plan programı, mevcut anahtar denetleyicisi HAL'yi yüklemiştir ve anahtarların donanımla yedeklenmesiyle ilgili olarak HAL'nin söylediklerine inanmıştır.
Keymaster bunu düzeltmek için Android 7.0'da (Keymaster 2) anahtar onayını ve Android 8.0'da (Keymaster 3) kimlik onayını kullanıma sundu.
Anahtar onayı, asimetrik bir anahtar çiftinin donanım destekli olup olmadığını, anahtarın özelliklerini ve kullanımına uygulanan kısıtlamaları kesin olarak belirlemenin bir yolunu sunmayı amaçlar.
Kimlik doğrulaması, cihazın seri numarası veya IMEI gibi donanım tanımlayıcılarının kanıtını sağlamasına olanak tanır.
Anahtar onayı
Android 7.0, anahtar onayını desteklemek için HAL'ye bir etiket, tür ve yöntem grubu sunmuştur.
Etiketler
Tag::ATTESTATION_CHALLENGE
Tag::INCLUDE_UNIQUE_ID
Tag::RESET_SINCE_ID_ROTATION
Tür
Keymaster 2 ve önceki sürümler
typedef struct { keymaster_blob_t* entries; size_t entry_count; } keymaster_cert_chain_t;
AttestKey
yöntem
Keymaster 3
attestKey(vec<uint8_t> keyToAttest, vec<KeyParameter> attestParams) generates(ErrorCode error, vec<vec<uint8_t>> certChain);
Keymaster 2 ve altı
keymaster_error_t (*attest_key)(const struct keymaster2_device* dev, const keymaster_key_blob_t* key_to_attest, const keymaster_key_param_set_t* attest_params, keymaster_cert_chain_t* cert_chain);
dev
, keymaster cihaz yapısıdır.keyToAttest
, doğrulamanın oluşturulduğugenerateKey
kaynağından döndürülen anahtar blob'udur.attestParams
, onay için gerekli olan tüm parametrelerin listesidir. BunaTag::ATTESTATION_CHALLENGE
ve muhtemelenTag::RESET_SINCE_ID_ROTATION
ileTag::APPLICATION_ID
veTag::APPLICATION_DATA
dahildir. Anahtar oluşturma sırasında belirtilmişse son ikisi, anahtar blob'unun şifresini çözmek için gereklidir.certChain
, bir sertifika dizisi döndüren çıkış parametresidir. 0 numaralı giriş, doğrulama sertifikası olduğundankeyToAttest
kaynağından gelen anahtarı doğrular ve doğrulama uzantısını içerir.
attestKey
yöntemi, herhangi bir zamanda çağrılabileceği ve yetkilendirme kısıtlamalarını karşılaması gerekmediği için onaylanan anahtar üzerinde ortak anahtar işlemi olarak kabul edilir. Örneğin, doğrulanmış anahtarın kullanılması için kullanıcı kimlik doğrulamasının gerekli olduğu durumlarda, kullanıcı kimlik doğrulaması olmadan doğrulama oluşturulabilir.
Onay sertifikası
Onay sertifikası, onaylı anahtarın açıklamasını içeren isteğe bağlı bir onay uzantısı içeren standart bir X.509 sertifikasıdır. Sertifika, sertifikalı bir onay anahtarıyla imzalanmış olmalıdır. Onay anahtarı, onaylanan anahtardan farklı bir algoritma kullanabilir.
Onay sertifikası aşağıdaki tablodaki alanları içerir ve başka alan içeremez. Bazı alanlar sabit bir alan değeri belirtir. CTS testleri, sertifika içeriğinin tam olarak tanımlandığı şekilde olduğunu doğrular.
Sertifika SEQUENCE
Alan adı (bkz. RFC 5280) | Değer |
---|---|
tbsCertificate | TBSSertifika SEQUENCE |
signatureAlgorithm | Anahtarı imzalamak için kullanılan algoritmanın AlgorithmIdentifier değeri: EC anahtarları için ECDSA, RSA anahtarları için RSA. |
signatureValue | BIT STRING, ASN.1 DER kodlu tbsCertificate üzerinde hesaplanan imza. |
TBSCertificate SEQUENCE
Alan adı (bkz. RFC 5280) | Değer |
---|---|
version |
INTEGER 2 (v3 sertifikası anlamına gelir) |
serialNumber |
TAM SAYI 1 (sabit değer: tüm sertifikalarda aynıdır) |
signature |
Anahtarı imzalamak için kullanılan algoritmanın AlgorithmIdentifier değeri: EC anahtarları için ECDSA, RSA anahtarları için RSA. |
issuer |
Toplu sertifika anahtarının konu alanıyla aynı. |
validity |
Tag::ACTIVE_DATETIME ve Tag::USAGE_EXPIRE_DATETIME değerlerini içeren iki tarihten oluşan SIRA.
Bu değerler 1 Ocak 1970'den itibaren milisaniye cinsindendir.
Sertifikalarda doğru tarih temsilleri için RFC 5280'e bakın.Tag::ACTIVE_DATETIME mevcut değilse Tag::CREATION_DATETIME değerini kullanın. Tag::USAGE_EXPIRE_DATETIME yoksa toplu sertifika doğrulama anahtarı sertifikasının geçerlilik bitiş tarihini kullanın. |
subject |
CN = "Android Anahtar Deposu Anahtarı" (sabit değer: tüm sertifikalarda aynıdır) |
subjectPublicKeyInfo |
Onaylı ortak anahtarı içeren SubjectPublicKeyInfo. |
extensions/Key Usage |
dijital imza: Anahtarın amacı KeyPurpose::SIGN veya KeyPurpose::VERIFY ise ayarlayın. Diğer tüm bitler ayarlanmamıştır. |
extensions/CRL Distribution Points |
Değer HBD |
extensions/"attestation" |
OID, 1.3.6.1.4.1.11129.2.1.17'dir; içerik, aşağıdaki Onay uzantısı bölümünde tanımlanmıştır. Tüm X.509 sertifika uzantılarında olduğu gibi, içerik de doğrulama SEQUENCE'sinin DER kodlamasını içeren bir OCTET_STRING olarak temsil edilir. |
Onay uzantısı
attestation
uzantısının OID'si 1.3.6.1.4.1.11129.2.1.17
. Onaylanan anahtar çifti ve anahtar oluşturma sırasında cihazın durumu hakkında bilgi içerir.
AIDL arayüzü spesifikasyonunda tanımlanan Keymaster/KeyMint etiket türleri aşağıdaki gibi ASN.1 türlerine dönüştürülür:
Keymaster/KeyMint türü | ASN.1 türü | Notlar |
---|---|---|
ENUM |
INTEGER |
|
ENUM_REP |
SET of INTEGER |
|
UINT |
INTEGER |
|
UINT_REP |
SET of INTEGER |
|
ULONG |
INTEGER |
|
ULONG_REP |
SET of INTEGER |
|
DATE |
INTEGER |
1 Ocak 1970 00:00:00 GMT'den itibaren milisaniye. |
BOOL |
NULL |
Etiketin varlığı doğru, yokluğu yanlış anlamına gelir. |
BIGNUM |
Bu türde etiket yok, bu nedenle eşleme tanımlanmadı. | |
BYTES |
OCTET_STRING |
Şema
Onay uzantısı içeriği aşağıdaki ASN.1 şemasıyla açıklanır:
300 sürümü
KeyDescription ::= SEQUENCE { attestationVersion 300, attestationSecurityLevel SecurityLevel, keyMintVersion INTEGER, keyMintSecurityLevel SecurityLevel, attestationChallenge OCTET_STRING, uniqueId OCTET_STRING, softwareEnforced AuthorizationList, hardwareEnforced AuthorizationList, } SecurityLevel ::= ENUMERATED { Software (0), TrustedEnvironment (1), StrongBox (2), } AuthorizationList ::= SEQUENCE { purpose [1] EXPLICIT SET OF INTEGER OPTIONAL, algorithm [2] EXPLICIT INTEGER OPTIONAL, keySize [3] EXPLICIT INTEGER OPTIONAL, digest [5] EXPLICIT SET OF INTEGER OPTIONAL, padding [6] EXPLICIT SET OF INTEGER OPTIONAL, ecCurve [10] EXPLICIT INTEGER OPTIONAL, rsaPublicExponent [200] EXPLICIT INTEGER OPTIONAL, mgfDigest [203] EXPLICIT SET OF INTEGER OPTIONAL, rollbackResistance [303] EXPLICIT NULL OPTIONAL, earlyBootOnly [305] EXPLICIT NULL OPTIONAL, activeDateTime [400] EXPLICIT INTEGER OPTIONAL, originationExpireDateTime [401] EXPLICIT INTEGER OPTIONAL, usageExpireDateTime [402] EXPLICIT INTEGER OPTIONAL, usageCountLimit [405] EXPLICIT INTEGER OPTIONAL, noAuthRequired [503] EXPLICIT NULL OPTIONAL, userAuthType [504] EXPLICIT INTEGER OPTIONAL, authTimeout [505] EXPLICIT INTEGER OPTIONAL, allowWhileOnBody [506] EXPLICIT NULL OPTIONAL, trustedUserPresenceRequired [507] EXPLICIT NULL OPTIONAL, trustedConfirmationRequired [508] EXPLICIT NULL OPTIONAL, unlockedDeviceRequired [509] EXPLICIT NULL OPTIONAL, creationDateTime [701] EXPLICIT INTEGER OPTIONAL, origin [702] EXPLICIT INTEGER OPTIONAL, rootOfTrust [704] EXPLICIT RootOfTrust OPTIONAL, osVersion [705] EXPLICIT INTEGER OPTIONAL, osPatchLevel [706] EXPLICIT INTEGER OPTIONAL, attestationApplicationId [709] EXPLICIT OCTET_STRING OPTIONAL, attestationIdBrand [710] EXPLICIT OCTET_STRING OPTIONAL, attestationIdDevice [711] EXPLICIT OCTET_STRING OPTIONAL, attestationIdProduct [712] EXPLICIT OCTET_STRING OPTIONAL, attestationIdSerial [713] EXPLICIT OCTET_STRING OPTIONAL, attestationIdImei [714] EXPLICIT OCTET_STRING OPTIONAL, attestationIdMeid [715] EXPLICIT OCTET_STRING OPTIONAL, attestationIdManufacturer [716] EXPLICIT OCTET_STRING OPTIONAL, attestationIdModel [717] EXPLICIT OCTET_STRING OPTIONAL, vendorPatchLevel [718] EXPLICIT INTEGER OPTIONAL, bootPatchLevel [719] EXPLICIT INTEGER OPTIONAL, deviceUniqueAttestation [720] EXPLICIT NULL OPTIONAL, attestationIdSecondImei [723] EXPLICIT OCTET_STRING OPTIONAL, } RootOfTrust ::= SEQUENCE { verifiedBootKey OCTET_STRING, deviceLocked BOOLEAN, verifiedBootState VerifiedBootState, verifiedBootHash OCTET_STRING, } VerifiedBootState ::= ENUMERATED { Verified (0), SelfSigned (1), Unverified (2), Failed (3), }
200 sürümü
KeyDescription ::= SEQUENCE { attestationVersion 200, attestationSecurityLevel SecurityLevel, keyMintVersion INTEGER, keyMintSecurityLevel SecurityLevel, attestationChallenge OCTET_STRING, uniqueId OCTET_STRING, softwareEnforced AuthorizationList, hardwareEnforced AuthorizationList, } SecurityLevel ::= ENUMERATED { Software (0), TrustedEnvironment (1), StrongBox (2), } AuthorizationList ::= SEQUENCE { purpose [1] EXPLICIT SET OF INTEGER OPTIONAL, algorithm [2] EXPLICIT INTEGER OPTIONAL, keySize [3] EXPLICIT INTEGER OPTIONAL, digest [5] EXPLICIT SET OF INTEGER OPTIONAL, padding [6] EXPLICIT SET OF INTEGER OPTIONAL, ecCurve [10] EXPLICIT INTEGER OPTIONAL, rsaPublicExponent [200] EXPLICIT INTEGER OPTIONAL, mgfDigest [203] EXPLICIT SET OF INTEGER OPTIONAL, rollbackResistance [303] EXPLICIT NULL OPTIONAL, earlyBootOnly [305] EXPLICIT NULL OPTIONAL, activeDateTime [400] EXPLICIT INTEGER OPTIONAL, originationExpireDateTime [401] EXPLICIT INTEGER OPTIONAL, usageExpireDateTime [402] EXPLICIT INTEGER OPTIONAL, usageCountLimit [405] EXPLICIT INTEGER OPTIONAL, noAuthRequired [503] EXPLICIT NULL OPTIONAL, userAuthType [504] EXPLICIT INTEGER OPTIONAL, authTimeout [505] EXPLICIT INTEGER OPTIONAL, allowWhileOnBody [506] EXPLICIT NULL OPTIONAL, trustedUserPresenceRequired [507] EXPLICIT NULL OPTIONAL, trustedConfirmationRequired [508] EXPLICIT NULL OPTIONAL, unlockedDeviceRequired [509] EXPLICIT NULL OPTIONAL, creationDateTime [701] EXPLICIT INTEGER OPTIONAL, origin [702] EXPLICIT INTEGER OPTIONAL, rootOfTrust [704] EXPLICIT RootOfTrust OPTIONAL, osVersion [705] EXPLICIT INTEGER OPTIONAL, osPatchLevel [706] EXPLICIT INTEGER OPTIONAL, attestationApplicationId [709] EXPLICIT OCTET_STRING OPTIONAL, attestationIdBrand [710] EXPLICIT OCTET_STRING OPTIONAL, attestationIdDevice [711] EXPLICIT OCTET_STRING OPTIONAL, attestationIdProduct [712] EXPLICIT OCTET_STRING OPTIONAL, attestationIdSerial [713] EXPLICIT OCTET_STRING OPTIONAL, attestationIdImei [714] EXPLICIT OCTET_STRING OPTIONAL, attestationIdMeid [715] EXPLICIT OCTET_STRING OPTIONAL, attestationIdManufacturer [716] EXPLICIT OCTET_STRING OPTIONAL, attestationIdModel [717] EXPLICIT OCTET_STRING OPTIONAL, vendorPatchLevel [718] EXPLICIT INTEGER OPTIONAL, bootPatchLevel [719] EXPLICIT INTEGER OPTIONAL, deviceUniqueAttestation [720] EXPLICIT NULL OPTIONAL, } RootOfTrust ::= SEQUENCE { verifiedBootKey OCTET_STRING, deviceLocked BOOLEAN, verifiedBootState VerifiedBootState, verifiedBootHash OCTET_STRING, } VerifiedBootState ::= ENUMERATED { Verified (0), SelfSigned (1), Unverified (2), Failed (3), }
100 sürümü
KeyDescription ::= SEQUENCE { attestationVersion 100, attestationSecurityLevel SecurityLevel, keyMintVersion INTEGER, keyMintSecurityLevel SecurityLevel, attestationChallenge OCTET_STRING, uniqueId OCTET_STRING, softwareEnforced AuthorizationList, hardwareEnforced AuthorizationList, } SecurityLevel ::= ENUMERATED { Software (0), TrustedEnvironment (1), StrongBox (2), } AuthorizationList ::= SEQUENCE { purpose [1] EXPLICIT SET OF INTEGER OPTIONAL, algorithm [2] EXPLICIT INTEGER OPTIONAL, keySize [3] EXPLICIT INTEGER OPTIONAL, digest [5] EXPLICIT SET OF INTEGER OPTIONAL, padding [6] EXPLICIT SET OF INTEGER OPTIONAL, ecCurve [10] EXPLICIT INTEGER OPTIONAL, rsaPublicExponent [200] EXPLICIT INTEGER OPTIONAL, mgfDigest [203] EXPLICIT SET OF INTEGER OPTIONAL, rollbackResistance [303] EXPLICIT NULL OPTIONAL, earlyBootOnly [305] EXPLICIT NULL OPTIONAL, activeDateTime [400] EXPLICIT INTEGER OPTIONAL, originationExpireDateTime [401] EXPLICIT INTEGER OPTIONAL, usageExpireDateTime [402] EXPLICIT INTEGER OPTIONAL, usageCountLimit [405] EXPLICIT INTEGER OPTIONAL, noAuthRequired [503] EXPLICIT NULL OPTIONAL, userAuthType [504] EXPLICIT INTEGER OPTIONAL, authTimeout [505] EXPLICIT INTEGER OPTIONAL, allowWhileOnBody [506] EXPLICIT NULL OPTIONAL, trustedUserPresenceRequired [507] EXPLICIT NULL OPTIONAL, trustedConfirmationRequired [508] EXPLICIT NULL OPTIONAL, unlockedDeviceRequired [509] EXPLICIT NULL OPTIONAL, creationDateTime [701] EXPLICIT INTEGER OPTIONAL, origin [702] EXPLICIT INTEGER OPTIONAL, rootOfTrust [704] EXPLICIT RootOfTrust OPTIONAL, osVersion [705] EXPLICIT INTEGER OPTIONAL, osPatchLevel [706] EXPLICIT INTEGER OPTIONAL, attestationApplicationId [709] EXPLICIT OCTET_STRING OPTIONAL, attestationIdBrand [710] EXPLICIT OCTET_STRING OPTIONAL, attestationIdDevice [711] EXPLICIT OCTET_STRING OPTIONAL, attestationIdProduct [712] EXPLICIT OCTET_STRING OPTIONAL, attestationIdSerial [713] EXPLICIT OCTET_STRING OPTIONAL, attestationIdImei [714] EXPLICIT OCTET_STRING OPTIONAL, attestationIdMeid [715] EXPLICIT OCTET_STRING OPTIONAL, attestationIdManufacturer [716] EXPLICIT OCTET_STRING OPTIONAL, attestationIdModel [717] EXPLICIT OCTET_STRING OPTIONAL, vendorPatchLevel [718] EXPLICIT INTEGER OPTIONAL, bootPatchLevel [719] EXPLICIT INTEGER OPTIONAL, deviceUniqueAttestation [720] EXPLICIT NULL OPTIONAL, } RootOfTrust ::= SEQUENCE { verifiedBootKey OCTET_STRING, deviceLocked BOOLEAN, verifiedBootState VerifiedBootState, verifiedBootHash OCTET_STRING, } VerifiedBootState ::= ENUMERATED { Verified (0), SelfSigned (1), Unverified (2), Failed (3), }
Sürüm 4
KeyDescription ::= SEQUENCE { attestationVersion 4, attestationSecurityLevel SecurityLevel, keymasterVersion INTEGER, keymasterSecurityLevel SecurityLevel, attestationChallenge OCTET_STRING, uniqueId OCTET_STRING, softwareEnforced AuthorizationList, hardwareEnforced AuthorizationList, } SecurityLevel ::= ENUMERATED { Software (0), TrustedEnvironment (1), StrongBox (2), } AuthorizationList ::= SEQUENCE { purpose [1] EXPLICIT SET OF INTEGER OPTIONAL, algorithm [2] EXPLICIT INTEGER OPTIONAL, keySize [3] EXPLICIT INTEGER OPTIONAL, digest [5] EXPLICIT SET OF INTEGER OPTIONAL, padding [6] EXPLICIT SET OF INTEGER OPTIONAL, ecCurve [10] EXPLICIT INTEGER OPTIONAL, rsaPublicExponent [200] EXPLICIT INTEGER OPTIONAL, rollbackResistance [303] EXPLICIT NULL OPTIONAL, earlyBootOnly [305] EXPLICIT NULL OPTIONAL, activeDateTime [400] EXPLICIT INTEGER OPTIONAL, originationExpireDateTime [401] EXPLICIT INTEGER OPTIONAL, usageExpireDateTime [402] EXPLICIT INTEGER OPTIONAL, noAuthRequired [503] EXPLICIT NULL OPTIONAL, userAuthType [504] EXPLICIT INTEGER OPTIONAL, authTimeout [505] EXPLICIT INTEGER OPTIONAL, allowWhileOnBody [506] EXPLICIT NULL OPTIONAL, trustedUserPresenceRequired [507] EXPLICIT NULL OPTIONAL, trustedConfirmationRequired [508] EXPLICIT NULL OPTIONAL, unlockedDeviceRequired [509] EXPLICIT NULL OPTIONAL, allApplications [600] EXPLICIT NULL OPTIONAL, creationDateTime [701] EXPLICIT INTEGER OPTIONAL, origin [702] EXPLICIT INTEGER OPTIONAL, rootOfTrust [704] EXPLICIT RootOfTrust OPTIONAL, osVersion [705] EXPLICIT INTEGER OPTIONAL, osPatchLevel [706] EXPLICIT INTEGER OPTIONAL, attestationApplicationId [709] EXPLICIT OCTET_STRING OPTIONAL, attestationIdBrand [710] EXPLICIT OCTET_STRING OPTIONAL, attestationIdDevice [711] EXPLICIT OCTET_STRING OPTIONAL, attestationIdProduct [712] EXPLICIT OCTET_STRING OPTIONAL, attestationIdSerial [713] EXPLICIT OCTET_STRING OPTIONAL, attestationIdImei [714] EXPLICIT OCTET_STRING OPTIONAL, attestationIdMeid [715] EXPLICIT OCTET_STRING OPTIONAL, attestationIdManufacturer [716] EXPLICIT OCTET_STRING OPTIONAL, attestationIdModel [717] EXPLICIT OCTET_STRING OPTIONAL, vendorPatchLevel [718] EXPLICIT INTEGER OPTIONAL, bootPatchLevel [719] EXPLICIT INTEGER OPTIONAL, deviceUniqueAttestation [720] EXPLICIT NULL OPTIONAL, } RootOfTrust ::= SEQUENCE { verifiedBootKey OCTET_STRING, deviceLocked BOOLEAN, verifiedBootState VerifiedBootState, verifiedBootHash OCTET_STRING, } VerifiedBootState ::= ENUMERATED { Verified (0), SelfSigned (1), Unverified (2), Failed (3), }
Sürüm 3
KeyDescription ::= SEQUENCE { attestationVersion 3, attestationSecurityLevel SecurityLevel, keymasterVersion INTEGER, keymasterSecurityLevel SecurityLevel, attestationChallenge OCTET_STRING, uniqueId OCTET_STRING, softwareEnforced AuthorizationList, hardwareEnforced AuthorizationList, } SecurityLevel ::= ENUMERATED { Software (0), TrustedEnvironment (1), StrongBox (2), } AuthorizationList ::= SEQUENCE { purpose [1] EXPLICIT SET OF INTEGER OPTIONAL, algorithm [2] EXPLICIT INTEGER OPTIONAL, keySize [3] EXPLICIT INTEGER OPTIONAL, digest [5] EXPLICIT SET OF INTEGER OPTIONAL, padding [6] EXPLICIT SET OF INTEGER OPTIONAL, ecCurve [10] EXPLICIT INTEGER OPTIONAL, rsaPublicExponent [200] EXPLICIT INTEGER OPTIONAL, rollbackResistance [303] EXPLICIT NULL OPTIONAL, activeDateTime [400] EXPLICIT INTEGER OPTIONAL, originationExpireDateTime [401] EXPLICIT INTEGER OPTIONAL, usageExpireDateTime [402] EXPLICIT INTEGER OPTIONAL, noAuthRequired [503] EXPLICIT NULL OPTIONAL, userAuthType [504] EXPLICIT INTEGER OPTIONAL, authTimeout [505] EXPLICIT INTEGER OPTIONAL, allowWhileOnBody [506] EXPLICIT NULL OPTIONAL, trustedUserPresenceRequired [507] EXPLICIT NULL OPTIONAL, trustedConfirmationRequired [508] EXPLICIT NULL OPTIONAL, unlockedDeviceRequired [509] EXPLICIT NULL OPTIONAL, allApplications [600] EXPLICIT NULL OPTIONAL, creationDateTime [701] EXPLICIT INTEGER OPTIONAL, origin [702] EXPLICIT INTEGER OPTIONAL, rootOfTrust [704] EXPLICIT RootOfTrust OPTIONAL, osVersion [705] EXPLICIT INTEGER OPTIONAL, osPatchLevel [706] EXPLICIT INTEGER OPTIONAL, attestationApplicationId [709] EXPLICIT OCTET_STRING OPTIONAL, attestationIdBrand [710] EXPLICIT OCTET_STRING OPTIONAL, attestationIdDevice [711] EXPLICIT OCTET_STRING OPTIONAL, attestationIdProduct [712] EXPLICIT OCTET_STRING OPTIONAL, attestationIdSerial [713] EXPLICIT OCTET_STRING OPTIONAL, attestationIdImei [714] EXPLICIT OCTET_STRING OPTIONAL, attestationIdMeid [715] EXPLICIT OCTET_STRING OPTIONAL, attestationIdManufacturer [716] EXPLICIT OCTET_STRING OPTIONAL, attestationIdModel [717] EXPLICIT OCTET_STRING OPTIONAL, vendorPatchLevel [718] EXPLICIT INTEGER OPTIONAL, bootPatchLevel [719] EXPLICIT INTEGER OPTIONAL, } RootOfTrust ::= SEQUENCE { verifiedBootKey OCTET_STRING, deviceLocked BOOLEAN, verifiedBootState VerifiedBootState, verifiedBootHash OCTET_STRING, } VerifiedBootState ::= ENUMERATED { Verified (0), SelfSigned (1), Unverified (2), Failed (3), }
Sürüm 2
KeyDescription ::= SEQUENCE { attestationVersion 2, attestationSecurityLevel SecurityLevel, keymasterVersion INTEGER, keymasterSecurityLevel SecurityLevel, attestationChallenge OCTET_STRING, uniqueId OCTET_STRING, softwareEnforced AuthorizationList, hardwareEnforced AuthorizationList, } SecurityLevel ::= ENUMERATED { Software (0), TrustedEnvironment (1), } AuthorizationList ::= SEQUENCE { purpose [1] EXPLICIT SET OF INTEGER OPTIONAL, algorithm [2] EXPLICIT INTEGER OPTIONAL, keySize [3] EXPLICIT INTEGER OPTIONAL, digest [5] EXPLICIT SET OF INTEGER OPTIONAL, padding [6] EXPLICIT SET OF INTEGER OPTIONAL, ecCurve [10] EXPLICIT INTEGER OPTIONAL, rsaPublicExponent [200] EXPLICIT INTEGER OPTIONAL, activeDateTime [400] EXPLICIT INTEGER OPTIONAL, originationExpireDateTime [401] EXPLICIT INTEGER OPTIONAL, usageExpireDateTime [402] EXPLICIT INTEGER OPTIONAL, noAuthRequired [503] EXPLICIT NULL OPTIONAL, userAuthType [504] EXPLICIT INTEGER OPTIONAL, authTimeout [505] EXPLICIT INTEGER OPTIONAL, allowWhileOnBody [506] EXPLICIT NULL OPTIONAL, allApplications [600] EXPLICIT NULL OPTIONAL, creationDateTime [701] EXPLICIT INTEGER OPTIONAL, origin [702] EXPLICIT INTEGER OPTIONAL, rollbackResistant [703] EXPLICIT NULL OPTIONAL, rootOfTrust [704] EXPLICIT RootOfTrust OPTIONAL, osVersion [705] EXPLICIT INTEGER OPTIONAL, osPatchLevel [706] EXPLICIT INTEGER OPTIONAL, attestationApplicationId [709] EXPLICIT OCTET_STRING OPTIONAL, attestationIdBrand [710] EXPLICIT OCTET_STRING OPTIONAL, attestationIdDevice [711] EXPLICIT OCTET_STRING OPTIONAL, attestationIdProduct [712] EXPLICIT OCTET_STRING OPTIONAL, attestationIdSerial [713] EXPLICIT OCTET_STRING OPTIONAL, attestationIdImei [714] EXPLICIT OCTET_STRING OPTIONAL, attestationIdMeid [715] EXPLICIT OCTET_STRING OPTIONAL, attestationIdManufacturer [716] EXPLICIT OCTET_STRING OPTIONAL, attestationIdModel [717] EXPLICIT OCTET_STRING OPTIONAL, } RootOfTrust ::= SEQUENCE { verifiedBootKey OCTET_STRING, deviceLocked BOOLEAN, verifiedBootState VerifiedBootState, } VerifiedBootState ::= ENUMERATED { Verified (0), SelfSigned (1), Unverified (2), Failed (3), }
Sürüm 1
KeyDescription ::= SEQUENCE { attestationVersion 1, attestationSecurityLevel SecurityLevel, keymasterVersion INTEGER, keymasterSecurityLevel SecurityLevel, attestationChallenge OCTET_STRING, uniqueId OCTET_STRING, softwareEnforced AuthorizationList, hardwareEnforced AuthorizationList, } SecurityLevel ::= ENUMERATED { Software (0), TrustedEnvironment (1), } AuthorizationList ::= SEQUENCE { purpose [1] EXPLICIT SET OF INTEGER OPTIONAL, algorithm [2] EXPLICIT INTEGER OPTIONAL, keySize [3] EXPLICIT INTEGER OPTIONAL, digest [5] EXPLICIT SET OF INTEGER OPTIONAL, padding [6] EXPLICIT SET OF INTEGER OPTIONAL, ecCurve [10] EXPLICIT INTEGER OPTIONAL, rsaPublicExponent [200] EXPLICIT INTEGER OPTIONAL, activeDateTime [400] EXPLICIT INTEGER OPTIONAL, originationExpireDateTime [401] EXPLICIT INTEGER OPTIONAL, usageExpireDateTime [402] EXPLICIT INTEGER OPTIONAL, noAuthRequired [503] EXPLICIT NULL OPTIONAL, userAuthType [504] EXPLICIT INTEGER OPTIONAL, authTimeout [505] EXPLICIT INTEGER OPTIONAL, allowWhileOnBody [506] EXPLICIT NULL OPTIONAL, allApplications [600] EXPLICIT NULL OPTIONAL, creationDateTime [701] EXPLICIT INTEGER OPTIONAL, origin [702] EXPLICIT INTEGER OPTIONAL, rollbackResistant [703] EXPLICIT NULL OPTIONAL, rootOfTrust [704] EXPLICIT RootOfTrust OPTIONAL, osVersion [705] EXPLICIT INTEGER OPTIONAL, osPatchLevel [706] EXPLICIT INTEGER OPTIONAL, } RootOfTrust ::= SEQUENCE { verifiedBootKey OCTET_STRING, deviceLocked BOOLEAN, verifiedBootState VerifiedBootState, } VerifiedBootState ::= ENUMERATED { Verified (0), SelfSigned (1), Unverified (2), Failed (3), }
KeyDescription alanları
-
attestationVersion
-
ASN.1 şema sürümü.
Değer Keymaster/KeyMint sürümü 1 Keymaster sürümü 2.0 2 Keymaster sürümü 3.0 3 Keymaster sürümü 4.0 4 Keymaster sürümü 4.1 100 KeyMint 1.0 sürümü 200 KeyMint sürüm 2.0 300 KeyMint 3.0 sürümü -
attestationSecurityLevel
-
Onaylı anahtarın depolandığı konumun güvenlik düzeyi.
-
keymasterVersion
/keyMintVersion
-
Keymaster/KeyMint donanım soyutlama katmanı (HAL) uygulamasının sürümü.
Değer Keymaster/KeyMint sürümü 2 Keymaster 2.0 sürümü 3 Keymaster sürümü 3.0 4 Keymaster sürümü 4.0 41 Keymaster 4.1 sürümü 100 KeyMint 1.0 sürümü 200 KeyMint sürüm 2.0 300 KeyMint sürüm 3.0 -
keymasterSecurityLevel
/keyMintSecurityLevel
- Keymaster/KeyMint uygulamasının güvenlik düzeyi.
-
attestationChallenge
- Anahtar oluşturma sırasında sağlanan zorluk.
-
uniqueId
- Sistem uygulamalarının anahtar oluşturma sırasında isteyebileceği, gizlilik açısından hassas bir cihaz tanımlayıcısı. Benzersiz kimlik istenmezse bu alan boş bırakılır. Ayrıntılar için Benzersiz kimlik bölümüne bakın.
-
softwareEnforced
-
Android sistemi tarafından zorunlu kılınan Keymaster/KeyMint
yetkilendirme listesi. Bu bilgiler platformdaki kod tarafından toplanır veya oluşturulur ve cihazın sistem bölümünde depolanır. Cihaz, Android Platform Güvenlik Modeli'ne uygun bir işletim sistemi çalıştırdığı sürece (yani cihazın bootloader'ı kilitli ve
verifiedBootState
Verified
olduğu sürece) güvenilirdir. -
hardwareEnforced
- Cihazın Güvenilir Yürütme Ortamı (TEE) veya StrongBox tarafından zorunlu kılınan Keymaster/KeyMint yetkilendirme listesi. Bu bilgiler, güvenli donanımdaki kod tarafından toplanır veya oluşturulur ve platform tarafından kontrol edilmez. Örneğin, bilgiler bootloader'dan veya platforma güvenmeyi gerektirmeyen güvenli bir iletişim kanalı üzerinden gelebilir.
SecurityLevel değerleri
SecurityLevel
değeri, Anahtar Deposu ile ilişkili bir öğenin (örneğin, anahtar çifti ve onay) saldırıya ne kadar dirençli olduğunu gösterir.
Değer | Anlamı |
---|---|
Software |
Cihazın Android sistemi Android Platform Güvenlik Modeli'ne uygun olduğu sürece güvenlidir (yani cihazın bootloader'ı kilitliyse ve verifiedBootState Verified ise). |
TrustedEnvironment |
Güvenilir Yürütme Ortamı (TEE) güvenliği ihlal edilmediği sürece güvenlidir. TEE'ler için izolasyon koşulları, Android Uyumluluk Tanımlama Belgesi'nin 9.11 [C-1-1] ila [C-1-4]bölümleri TEE'ler uzaktan saldırılara karşı yüksek, doğrudan donanım saldırılarına karşı ise orta düzeyde dirençlidir. |
StrongBox |
StrongBox'un güvenliği ihlal edilmediği sürece güvenlidir. StrongBox, donanım güvenlik modülüne benzer bir güvenli unsurda uygulanır. StrongBox uygulama gereksinimleri, Android Uyumluluk Tanımlama Belgesi'nin 9.11.2 bölümünde tanımlanmıştır. StrongBox, uzaktan saldırıya ve doğrudan donanım saldırısı (ör. fiziksel müdahale ve yan kanal saldırıları) yoluyla saldırıya karşı son derece dayanıklıdır. |
AuthorizationList alanları
Her alan, AIDL arayüz spesifikasyonundaki bir Keymaster/KeyMint yetkilendirme etiketine karşılık gelir.
Spesifikasyon, yetkilendirme etiketleriyle ilgili doğru bilgi kaynağıdır: Anlamları, içeriklerinin biçimi, KeyDescription
nesnesinde softwareEnforced
veya hardwareEnforced
alanlarında görünmeleri beklenip beklenmediği, diğer etiketlerle birbirini hariç tutup tutmadığı vb. Tüm AuthorizationList
alanları isteğe bağlıdır.
Her alanın, Keymaster/KeyMint etiket numarasına eşit bir EXPLICIT
bağlama özgü etiketi vardır. Bu etiket, AuthorizationList
'daki verilerin daha kompakt bir şekilde gösterilmesini sağlar. Bu nedenle ASN.1 ayrıştırıcısı, her bağlama özgü etiket için beklenen veri türünü bilmelidir. Örneğin,
Tag::USER_AUTH_TYPE
ENUM | 504
olarak tanımlanır. Onay uzantısı şemasında, AuthorizationList
içindeki purpose
alanı userAuthType [504] EXPLICIT INTEGER OPTIONAL
olarak belirtilir. Bu nedenle, ASN.1 kodlaması, ASN.1 türü INTEGER
için UNIVERSAL
sınıf etiketi yerine bağlama özgü etiket 504
(10
) içerir.
-
purpose
-
Etiket kimliği değeri 1 olan
Tag::PURPOSE
yetkilendirme etiketine karşılık gelir. -
algorithm
-
2 değerine sahip bir etiket kimliği kullanan
Tag::ALGORITHM
yetkilendirme etiketine karşılık gelir.Bir doğrulama
AuthorizationList
nesnesinde algoritma değeri her zamanRSA
veyaEC
olur. -
keySize
-
3 değerine sahip bir etiket kimliği kullanan
Tag::KEY_SIZE
yetkilendirme etiketine karşılık gelir. -
digest
-
5 kimlik değeri kullanan
Tag::DIGEST
yetkilendirme etiketine karşılık gelir. -
padding
-
Tag::PADDING
yetkilendirme etiketine karşılık gelir. Bu etiket, 6 değerine sahip bir etiket kimliği kullanır. -
ecCurve
-
10 değerini kullanan
Tag::EC_CURVE
yetkilendirme etiketine karşılık gelir.Android sistem anahtar deposunda imzalama ve doğrulama için ECDSA kullanan bir eliptik eğri (EC) anahtar çifti oluşturmak için kullanılan parametre grubu.
-
rsaPublicExponent
-
Etiket kimliği değeri 200 olan
Tag::RSA_PUBLIC_EXPONENT
yetkilendirme etiketine karşılık gelir. -
mgfDigest
-
Yalnızca anahtar onayı sürümü >= 100'de mevcut.
203 kimlikli etiket değerini kullananTag::RSA_OAEP_MGF_DIGEST
KeyMint -
rollbackResistance
-
Yalnızca anahtar onay sürümü >= 3'te mevcut.
303 kimlik değerini kullanan
Tag::ROLLBACK_RESISTANCE
yetkilendirme etiketine karşılık gelir. -
earlyBootOnly
-
Yalnızca anahtar onay sürümü >= 4'te mevcut.
305 etiket kimliği değerini kullanan
Tag::EARLY_BOOT_ONLY
yetkilendirme etiketine karşılık gelir. -
activeDateTime
-
400 değerinde bir etiket kimliği kullanan
Tag::ACTIVE_DATETIME
yetkilendirme etiketine karşılık gelir. -
originationExpireDateTime
-
401 kimlikli etiket değerini kullanan
Tag::ORIGINATION_EXPIRE_DATETIME
Keymaster yetkilendirme etiketine karşılık gelir. -
usageExpireDateTime
-
402 etiket kimliği değerini kullanan
Tag::USAGE_EXPIRE_DATETIME
yetkilendirme etiketine karşılık gelir. -
usageCountLimit
-
405 etiket kimliği değerini kullanan
Tag::USAGE_COUNT_LIMIT
yetkilendirme etiketine karşılık gelir. -
noAuthRequired
-
503 etiket kimliği değerini kullanan
Tag::NO_AUTH_REQUIRED
yetkilendirme etiketine karşılık gelir. -
userAuthType
-
Etiket kimliği değeri 504 olan
Tag::USER_AUTH_TYPE
yetkilendirme etiketine karşılık gelir. -
authTimeout
-
505 etiket kimliği değerini kullanan
Tag::AUTH_TIMEOUT
yetkilendirme etiketine karşılık gelir. -
allowWhileOnBody
-
Etiket kimliği değeri 506 olan
Tag::ALLOW_WHILE_ON_BODY
yetkilendirme etiketine karşılık gelir.Kullanıcı cihazı hâlâ üzerinde taşıyorsa kimlik doğrulama zaman aşımı süresinden sonra anahtarın kullanılmasına izin verir. Cihazın kullanıcının üzerinde takılı olup olmadığını güvenli bir vücut üzerinde sensörün belirlediğini unutmayın.
-
trustedUserPresenceRequired
-
Yalnızca anahtar doğrulama sürümünün 3 veya sonraki sürümlerinde bulunur.
507 değerinde bir etiket kimliği kullanan
Tag::TRUSTED_USER_PRESENCE_REQUIRED
izin etiketine karşılık gelir.Bu anahtarın yalnızca kullanıcı fiziksel olarak orada olduğunu kanıtlamışsa kullanılabileceğini belirtir. Aşağıda konuyla ilgili olarak bazı örnekler verilmiştir:
- StrongBox anahtarı için StrongBox cihazındaki bir pime kabloyla bağlı donanım düğmesi.
- TEE anahtarı için parmak izi kimlik doğrulaması, TEE'nin tarayıcı üzerinde özel kontrole sahip olduğu ve parmak izi eşleştirme işlemini gerçekleştirdiği sürece varlığın kanıtını sağlar.
-
trustedConfirmationRequired
-
Yalnızca anahtar onay sürümü >= 3'te mevcut.
508 kimlikli bir etiket değeri kullanan
Tag::TRUSTED_CONFIRMATION_REQUIRED
izin etiketine karşılık gelir.Anahtarın yalnızca kullanıcının onay jetonu kullanarak imzalanmak istenen verileri onayladığında kullanılabileceğini belirtir. Kullanıcı onayı alma hakkında daha fazla bilgi için Android Korumalı Onayı bölümüne göz atın.
Not: Bu etiket yalnızca
SIGN
amacını kullanan anahtarlar için geçerlidir. -
unlockedDeviceRequired
-
Yalnızca anahtar doğrulama sürümünün 3 veya sonraki sürümlerinde bulunur.
509 etiket kimliği değerini kullanan
Tag::UNLOCKED_DEVICE_REQUIRED
yetkilendirme etiketine karşılık gelir. -
allApplications
-
600 değerinde bir etiket kimliği kullanan
Tag::ALL_APPLICATIONS
yetkilendirme etiketine karşılık gelir.Bir cihazdaki tüm uygulamaların anahtar çiftine erişip erişemeyeceğini belirtir.
-
applicationId
-
601 kimlikli etiket kullanan
Tag::APPLICATION_ID
yetkilendirme etiketine karşılık gelir. -
creationDateTime
-
701 etiket kimliği değerini kullanan
Tag::CREATION_DATETIME
yetkilendirme etiketine karşılık gelir. -
origin
-
702 kimlik değerini kullanan
Tag::ORIGIN
yetkilendirme etiketine karşılık gelir. -
rollbackResistant
-
Yalnızca 1 ve 2 numaralı anahtar onayı sürümlerinde bulunur.
703 kimlik değerini kullanan
Tag::ROLLBACK_RESISTANT
yetkilendirme etiketine karşılık gelir. -
rootOfTrust
-
704 etiket kimliği değerini kullanan
Tag::ROOT_OF_TRUST
yetkilendirme etiketine karşılık gelir.Daha fazla bilgi için RootOfTrust veri yapısını açıklayan bölüme bakın.
-
osVersion
-
705 kimlikli etiket değerini kullanan
Tag::OS_VERSION
yetkilendirme etiketine karşılık gelir.Keymaster ile ilişkili Android işletim sisteminin sürümü. Altı haneli bir tam sayı olarak belirtilir. Örneğin, 8.1.0 sürümü 080100 olarak temsil edilir.
Yalnızca Keymaster 1.0 veya sonraki sürümler bu değeri yetkilendirme listesine dahil eder.
-
osPatchLevel
-
Etiket kimliği değeri 706 olan
Tag::PATCHLEVEL
yetkilendirme etiketine karşılık gelir.Keymaster'da kullanılan güvenlik yamasıyla ilişkili ay ve yıl, altı haneli bir tam sayı olarak belirtilir. Örneğin, Ağustos 2018 yaması 201808 olarak temsil edilir.
Yetkilendirme listesinde bu değeri yalnızca Keymaster sürüm 1.0 veya sonraki sürümler bulunur.
-
attestationApplicationId
-
Yalnızca 2 ve üzeri anahtar doğrulama sürümlerinde bulunur.
709 kimlikli etiket değerini kullanan
Tag::ATTESTATION_APPLICATION_ID
Keymaster yetkilendirme etiketine karşılık gelir.Daha fazla bilgi için AttestationApplicationId veri yapısını açıklayan bölüme bakın.
-
attestationIdBrand
-
Yalnızca anahtar onay sürümleri >= 2'de mevcut.
710 kimlik değerini kullanan
Tag::ATTESTATION_ID_BRAND
Keymaster etiketine karşılık gelir. -
attestationIdDevice
-
Yalnızca 2 ve üzeri anahtar doğrulama sürümlerinde bulunur.
Etiket kimliği değeri 711 olan
Tag::ATTESTATION_ID_DEVICE
Keymaster etiketine karşılık gelir. -
attestationIdProduct
-
Yalnızca 2 ve üzeri anahtar doğrulama sürümlerinde bulunur.
712 kimlik değerini kullanan
Tag::ATTESTATION_ID_PRODUCT
Keymaster etiketine karşılık gelir. -
attestationIdSerial
-
Yalnızca anahtar onay sürümleri >= 2'de mevcut.
713 kimlik değerini kullanan
Tag::ATTESTATION_ID_SERIAL
Keymaster etiketine karşılık gelir. -
attestationIdImei
-
Yalnızca anahtar onay sürümleri >= 2'de mevcut.
714 etiket kimliği değerini kullanan
Tag::ATTESTATION_ID_IMEI
yetkilendirme etiketine karşılık gelir. -
attestationIdMeid
-
Yalnızca 2 ve üzeri anahtar doğrulama sürümlerinde bulunur.
715 kimlik değerini kullanan
Tag::ATTESTATION_ID_MEID
yetkilendirme etiketine karşılık gelir. -
attestationIdManufacturer
-
Yalnızca 2 ve üzeri anahtar doğrulama sürümlerinde bulunur.
716 kimlikli bir etiket değeri kullanan
Tag::ATTESTATION_ID_MANUFACTURER
yetkilendirme etiketine karşılık gelir. -
attestationIdModel
-
Yalnızca 2 ve üzeri anahtar doğrulama sürümlerinde bulunur.
717 etiket kimliği değerini kullanan
Tag::ATTESTATION_ID_MODEL
yetkilendirme etiketine karşılık gelir. -
vendorPatchLevel
-
Yalnızca anahtar onay sürümleri >= 3'te mevcut.
718 kimlikli bir etiket değeri kullanan
Tag::VENDOR_PATCHLEVEL
izin etiketine karşılık gelir.Bu anahtarın kullanılabilmesi için cihaza yüklenmesi gereken tedarikçi firma resmi güvenlik yaması düzeyini belirtir. Değer, tedarikçi firma güvenlik yamasının tarihini temsil eden YYYYAAGG şeklinde görünür. Örneğin, bir Android cihazda tedarikçi firmanın 1 Ağustos 2018 güvenlik yaması yüklüyken bir anahtar oluşturulduysa bu değer 20180801 olur.
-
bootPatchLevel
-
Yalnızca 3 ve sonraki anahtar doğrulama sürümlerinde bulunur.
719 etiket kimliği değerini kullanan
Tag::BOOT_PATCHLEVEL
yetkilendirme etiketine karşılık gelir.Bu anahtarın kullanılabilmesi için cihaza yüklenmesi gereken çekirdek resmi güvenlik yaması düzeyini belirtir. Değer, sistem güvenlik yamasının tarihini temsil eden YYYYAAGG biçiminde görünür. Örneğin, bir Android cihazda sistemde 5 Ağustos 2018 güvenlik yaması yüklüyken bir anahtar oluşturulduysa bu değer 20180805 olur.
-
deviceUniqueAttestation
-
Yalnızca 4 ve sonraki anahtar doğrulama sürümlerinde bulunur.
720 etiket kimliği değerini kullanan
Tag::DEVICE_UNIQUE_ATTESTATION
yetkilendirme etiketine karşılık gelir. -
attestationIdSecondImei
-
Yalnızca 300 ve üzeri anahtar doğrulama sürümlerinde bulunur.
723 kimlikli bir etiket değeri kullanan
Tag::ATTESTATION_ID_SECOND_IMEI
yetkilendirme etiketine karşılık gelir.
RootOfTrust alanları
-
verifiedBootKey
- Doğrulanmış Başlatma kapsamında, cihaz başlatma sırasında yürütülen tüm kodların bütünlüğünü ve özgünlüğünü doğrulamak için kullanılan ortak anahtarın güvenli bir karması. SHA-256 önerilir.
-
deviceLocked
-
Cihazın bootloader'ının kilitli olup olmadığı.
true
, cihazın Doğrulanmış Başlatma tarafından başarıyla doğrulanmış imzalı bir görüntüyü başlattığı anlamına gelir. -
verifiedBootState
- Cihazın Doğrulanmış Başlatma durumu.
-
verifiedBootHash
- Doğrulanmış Önyükleme ile korunan tüm verilerin özeti. Android Doğrulanmış Başlatma referans uygulamasını kullanan cihazlarda bu alan VBMeta özetini içerir.
VerifiedBootState değerleri
Değer | İlgili başlatma durumu | Anlamı |
---|---|---|
Verified |
GREEN |
Donanım korumalı bir güven kökünden bootloader'a ve Doğrulanmış Başlatma tarafından doğrulanan tüm bölümlere kadar uzanan tam bir güven zinciri vardır.
Bu durumda verifiedBootKey alanı, yerleşik güven kökü'nün karma oluşturma değerini içerir. Yerleşik güven kökü, cihaz üreticisi tarafından fabrikada cihazın ROM'una yerleştirilen sertifikadır. |
SelfSigned |
YELLOW |
Doğrulamanın, üretici tarafından fabrikada yerleştirilen güven kökü yerine kullanıcı tarafından yapılandırılmış bir güven kökü kullanılarak yapılması dışında Verified ile aynıdır.
Bu durumda verifiedBootKey alanı, kullanıcı tarafından yapılandırılan ortak anahtarın karma değerini içerir. |
Unverified |
ORANGE |
Cihazın bootloader'ının kilidi açık olduğundan güven zinciri oluşturulamaz. Cihaz özgürce değiştirilebildiğinden cihazın bütünlüğü kullanıcı tarafından bant dışı olarak doğrulanmalıdır. Bu durumda verifiedBootKey alanı 32 bayt sıfır içerir. |
Failed |
RED |
Cihaz doğrulanamadı. Bu durumda, diğer RootOfTrust alanlarının içerikleri hakkında herhangi bir garanti verilmez. |
AttestationApplicationId
Bu alan, Android platformunun, hangi uygulamaların doğrulama kapsamında gizli anahtar materyalini kullanmasına izin verildiğine dair fikrini yansıtır. Yalnızca birden fazla paket aynı UID'yi paylaşıyorsa birden fazla paket içerebilir. AuthorizationList
içindeki AttestationApplicationId
alanı OCTET_STRING
türündedir ve aşağıdaki ASN.1 şemasına göre biçimlendirilmiştir:
AttestationApplicationId ::= SEQUENCE { package_infos SET OF AttestationPackageInfo, signature_digests SET OF OCTET_STRING, } AttestationPackageInfo ::= SEQUENCE { package_name OCTET_STRING, version INTEGER, }
package_infos
-
Her biri bir paketin adını ve sürüm numarasını sağlayan bir
AttestationPackageInfo
nesnesi grubu. signature_digests
-
Uygulamanın imzalama sertifikalarının SHA-256 özet dizisi. Bir uygulamanın birden fazla imzalama anahtarı sertifika zinciri olabilir. Her biri için "yaprak" sertifikası özetlenir ve
signature_digests
alanına yerleştirilir. Alan adı yanıltıcıdır. Çünkü sıkıştırılmış veriler,getPackageInfo()
çağrısı tarafından döndürülenSignature
sınıfına göre adlandırıldığı için uygulama imzaları değil, uygulamanın imzalama sertifikalarıdır. Aşağıdaki kod snippet'inde bir örnek küme gösterilmektedir:{SHA256(PackageInfo.signature[0]), SHA256(PackageInfo.signature[1]), ...}
Benzersiz kimlik
Benzersiz kimlik, cihazı tanımlayan 128 bitlik bir değerdir ancak yalnızca sınırlı bir süre için geçerlidir. Değer şu şekilde hesaplanır:
HMAC_SHA256(T || C || R, HBK)
Nerede:
T
,Tag::CREATION_DATETIME
değerinin 2592000000'e bölünmesiyle ve kalanın atılmasıyla hesaplanan "zamansal sayaç değeridir".T
30 günde bir değişir (2592000000 = 30 * 24 * 60 * 60 * 1000).C
,Tag::APPLICATION_ID
değerini ifade eder.Tag::RESET_SINCE_ID_ROTATION
, attest_key çağrısının attest_params parametresinde varsa 1, etiket yoksa 0 değerine sahiptir.R
HBK
, Güvenilir Yürütme Ortamı tarafından bilinen ve hiçbir zaman açığa çıkmayan, donanıma bağlı benzersiz bir anahtardır. Gizli anahtar en az 128 bit entropi içerir ve cihaza özgüdür (128 bit entropi olduğunda olasılıksal benzersizlik kabul edilir). HBK, HMAC veya AES_CMAC aracılığıyla çok kaynaklı anahtar materyalinden türetilmelidir.
HMAC_SHA256 çıkışını 128 bit olarak kısaltın.
Onay anahtarları ve sertifikalar
Bir RSA ve bir ECDSA olmak üzere iki anahtar ve ilgili sertifika zincirleri cihaza güvenli bir şekilde hazırlanır.
Android 12'de uzaktan anahtar sağlama özelliği kullanıma sunulmuştur. Android 13'te ise cihazların bu özelliği uygulamasını zorunlu kılar. Uzaktan Anahtar Hazırlama, sahadaki cihazlara uygulama başına ECDSA P256 doğrulama sertifikaları sağlar. Bu sertifikaların geçerlilik süresi, fabrikada sağlanan sertifikalardan daha kısadır.
Birden fazla IMEI
Android 14, Android Anahtar Doğrulaması kaydında birden fazla IMEI desteği ekler. OEM'ler, ikinci bir IMEI için KeyMint etiketi ekleyerek bu özelliği uygulayabilir. Cihazların birden fazla hücresel radyoya sahip olması giderek daha yaygın hale gelmektedir ve OEM'ler artık iki IMEI'ye sahip cihazları destekleyebilmektedir.
OEM'lerin, cihazlarında varsa KeyMint uygulamalarında temel hazırlığı yapılan ikincil bir IMEI'ye sahip olması gerekir. Böylece bu uygulamalar, birincil IMEI'yi doğruladıkları şekilde ikincil IMEI'yi de doğrulayabilir.
Kimlik doğrulaması
Android 8.0, Keymaster 3'e sahip cihazlar için isteğe bağlı kimlik onayı desteği içerir. Kimlik doğrulaması, cihazın seri numarası veya IMEI gibi donanım tanımlayıcılarının kanıtını sağlamasına olanak tanır. İsteğe bağlı bir özellik olsa da tüm Keymaster 3 uygulamalarının bu özellik için destek sağlaması önemle tavsiye edilir. Bunun nedeni, cihazın kimliğini kanıtlayabilmek sayesinde gerçek sıfır dokunuşlu uzak yapılandırma gibi kullanım alanlarının daha güvenli olmasıdır (uzak taraf, kimliğini taklit eden bir cihazla değil, doğru cihazla konuştuğundan emin olabilir).
Kimlik doğrulaması, cihazın fabrikadan çıkmadan önce donanım tanımlayıcılarının yalnızca Güvenilir Yürütme Ortamı'nın (TEE) erişebileceği kopyalarını oluşturarak çalışır. Kullanıcı, cihazın önyükleyicisinin kilidini açabilir, sistem yazılımını ve Android çerçeveleri tarafından bildirilen tanımlayıcıları değiştirebilir. TEE tarafından tutulan tanımlayıcıların kopyaları bu şekilde değiştirilemez. Bu sayede cihaz kimliği onayı yalnızca cihazın orijinal donanım tanımlayıcılarını doğrular ve kimliğe bürünme girişimlerini engeller.
Kimlik onayı için ana API yüzeyi, Keymaster 2 ile kullanıma sunulan mevcut anahtar onay mekanizmasının üzerine kurulur. Anahtar yöneticisi tarafından tutulan bir anahtar için doğrulama sertifikası isteğinde bulunurken arayan, cihazın donanım tanımlayıcılarının doğrulama sertifikasının meta verilerine eklenmesini isteyebilir. Anahtar TEE'de tutulursa sertifika, bilinen bir güven köküne geri döner. Bu tür bir sertifikanın alıcısı, sertifikanın ve donanım tanımlayıcıları da dahil olmak üzere içeriğinin TEE tarafından yazıldığını doğrulayabilir. Onay sertifikasına donanım tanımlayıcılarının eklenmesi istendiğinde TEE, yalnızca depolama alanında bulunan tanımlayıcıları fabrika katında doldurulduğu şekilde onaylar.
Depolama özellikleri
Cihazın tanımlayıcılarını içeren depolama alanının aşağıdaki özelliklere sahip olması gerekir:
- Cihazın orijinal tanımlayıcılarından türetilen değerler, cihaz fabrikadan çıkmadan önce depolama alanına kopyalanır.
destroyAttestationIds()
yöntemi, tanımlayıcıdan türetilmiş verilerin bu kopyasını kalıcı olarak kaldırabilir. Kalıcı imha, verilerin tamamen kaldırıldığı anlamına gelir. Bu durumda, fabrika ayarlarına sıfırlama veya cihazda yapılan başka bir işlemle veriler geri yüklenemez. Bu, özellikle kullanıcının önyükleyicinin kilidini açtığı, sistem yazılımını değiştirdiği ve Android çerçeveleri tarafından döndürülen tanımlayıcıları değiştirdiği cihazlar için önemlidir.- RMA tesisleri, donanım tanımlayıcısı türetilmiş verilerin yeni kopyalarını oluşturabilmelidir. Bu sayede, RMA'dan geçen bir cihaz tekrar kimlik doğrulaması yapabilir. RMA tesisleri tarafından kullanılan mekanizma, kullanıcıların kendileri çağırmaması için korunmalıdır. Aksi takdirde, kullanıcılar sahte kimliklerle ilgili doğrulama elde edebilir.
- TEE'deki Keymaster güvenilir uygulaması dışında hiçbir kod, depolama alanında tutulan tanımlayıcıdan türetilen verileri okuyamaz.
- Depolama alanında değişiklik yapıldığına izin verilmez: Depolama alanının içeriği değiştirilmişse TEE, içeriğin kopyaları imha edilmiş gibi davranıp kimlik doğrulama girişimlerini reddeder. Bu işlem, aşağıda açıklandığı şekilde depolama alanını imzalamak veya MAC'le yapmak suretiyle uygulanır.
- Depolama alanında orijinal tanımlayıcılar bulunmaz. Kimlik doğrulaması bir istem içerdiğinden, arayan her zaman doğrulanacak tanımlayıcıları sağlar. TEE'nin tek yapması gereken, bu değerlerin orijinal değerlerle eşleştiğini doğrulamaktır. Bu doğrulama, değerlerin yerine orijinal değerlerin güvenli karma oluşturma işlemlerinin depolanmasıyla sağlanır.
İnşaat
Yukarıda listelenen özelliklere sahip bir uygulama oluşturmak için kimlikten türetilen değerleri aşağıdaki S yapısında depolayın. Sistemdeki normal yerler (cihaz sahibinin kök erişimi sağlayarak değiştirebileceği yerler) dışında, kimlik değerlerinin başka kopyalarını saklamayın:
S = D || HMAC(HBK, D)
where:
D = HMAC(HBK, ID1) || HMAC(HBK, ID2) || ... || HMAC(HBK, IDn)
HMAC
, uygun bir güvenli karmaya sahip HMAC yapısıdır (SHA-256 önerilir)HBK
, başka bir amaç için kullanılmayan donanıma bağlı bir anahtardırID1...IDn
orijinal kimlik değerleridir; farklı cihazların farklı sayıda tanımlayıcısı olduğundan belirli bir değerin belirli bir dizinle ilişkilendirilmesi uygulamaya bağlıdır||
, dize birleştirme işlemini temsil eder.
HMAC çıkışları sabit boyutta olduğundan ayrı kimlik karmalarını veya D'nin HMAC'sini bulmak için herhangi bir üst bilgi veya başka bir yapı gerekmez. Doğrulama yapmak için sağlanan değerleri kontrol etmenin yanı sıra, uygulamaların S'den D'yi çıkararak, HMAC'yi(HBK, D) hesaplayarak ve hiçbir kimliğin değiştirilmediğinden/bozulmadığından emin olmak için S'deki değerle karşılaştırarak S'yi doğrulaması gerekir. Ayrıca uygulamalar, tüm bağımsız kimlik öğeleri ve S doğrulaması için sabit zamanlı karşılaştırmalar kullanmalıdır. Karşılaştırma süresi, sağlanan kimlik sayısına ve testin herhangi bir bölümünün doğru eşleşmesine bakılmaksızın sabit olmalıdır.
Donanım tanımlayıcıları
Kimlik doğrulaması aşağıdaki donanım tanımlayıcılarını destekler:
Build.BRAND
tarafından Android'de döndürüldüğü şekliyle marka adı- Android'de
Build.DEVICE
tarafından döndürülen cihaz adı - Android'de
Build.PRODUCT
tarafından döndürülen ürün adı - Android'de
Build.MANUFACTURER
tarafından döndürülen üretici adı - Android'de
Build.MODEL
tarafından döndürülen model adı - Seri numarası
- Tüm radyoların IMEI'leri
- Tüm radyoların MEID'leri
Cihaz kimliği doğrulamasını desteklemek için cihaz bu tanımlayıcıları doğrular. Android çalıştıran tüm cihazlar ilk altı sürüme sahiptir ve bu özelliğin çalışması için bunlar gereklidir. Cihazda entegre hücresel radyolar varsa radyoların IMEI ve/veya MEID'leri için de doğrulama desteklenmelidir.
Anahtar doğrulaması yapılarak ve isteğe doğrulanacak cihaz tanımlayıcıları ekleyerek kimlik doğrulaması istenir. Tanımlayıcılar şu şekilde etiketlenir:
ATTESTATION_ID_BRAND
ATTESTATION_ID_DEVICE
ATTESTATION_ID_PRODUCT
ATTESTATION_ID_MANUFACTURER
ATTESTATION_ID_MODEL
ATTESTATION_ID_SERIAL
ATTESTATION_ID_IMEI
ATTESTATION_ID_MEID
Onaylanacak tanımlayıcı, UTF-8 ile kodlanmış bir bayt dizesidir. Bu biçim, sayısal tanımlayıcılar için de geçerlidir. Onaylanacak her tanımlayıcı, UTF-8 kodlu bir dize olarak ifade edilir.
Cihaz kimlik doğrulamayı desteklemiyorsa (veya destroyAttestationIds()
daha önce çağrıldıysa ve cihaz artık kimliklerini doğrulayamıyorsa) bu etiketlerden birini veya daha fazlasını içeren tüm anahtar doğrulama istekleri ErrorCode::CANNOT_ATTEST_IDS
ile başarısız olur.
Cihaz kimlik doğrulamayı destekliyorsa ve yukarıdaki etiketlerden biri veya daha fazlası bir anahtar doğrulama isteğine dahil edilmişse TEE, etiketlerin her biriyle birlikte sağlanan tanımlayıcıların donanım tanımlayıcılarının kopyasıyla eşleştiğini doğrular. Bir veya daha fazla tanımlayıcı eşleşmezse onayın tamamı ErrorCode::CANNOT_ATTEST_IDS
ile başarısız olur. Aynı etiketin birden fazla kez sağlanabilmesi geçerlidir. Bu, örneğin IMEI'leri doğrularken yararlı olabilir:
Bir cihazda birden fazla IMEI'ye sahip birden fazla radyo olabilir. Her ATTESTATION_ID_IMEI
ile birlikte sağlanan değer, cihazın radyolarından biriyle eşleşiyorsa doğrulama isteği geçerlidir. Diğer tüm etiketler için de aynı durum geçerlidir.
Onay başarılı olursa onaylı kimlikler, yukarıdaki şemadan yararlanılarak düzenlenen onay sertifikasının onay uzantısına (OID 1.3.6.1.4.1.11129.2.1.17) eklenir. Keymaster 2 onay şemasında yapılan değişiklikler yorumlarla birlikte kalın harflerle gösterilir.
Java API
Bu bölüm yalnızca bilgilendirme amaçlıdır. Keymaster uygulamaları, Java API'yi uygulamaz veya kullanmaz. Bu bilgi, uygulayıcıların özelliğin uygulamalar tarafından nasıl kullanıldığını anlamalarına yardımcı olmak için sağlanmıştır. Sistem bileşenleri bu özelliği farklı şekilde kullanabilir. Bu nedenle, bu bölümün normatif olarak ele alınmaması önemlidir.