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ı mevcutsa ve kullanılıyorsa anahtar materyali, cihazdan ayıklama işlemine karşı daha güvenlidir ve Anahtar Yöneticisi, 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 mağazası daemon'ı, mevcut anahtar yöneticisi HAL'i yükledi ve anahtarların donanım desteğiyle ilgili olarak HAL'in söylediklerine inandı.
Keymaster, bu sorunu gidermek için Android 7.0'da (Keymaster 2) anahtar doğrulamasını ve Android 8.0'da (Keymaster 3) kimlik doğrulaması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 tasdikini desteklemek için HAL'e bir dizi etiket, tür ve yöntem ekledi.
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öntemi
Keymaster 3
attestKey(vec<uint8_t> keyToAttest, vec<KeyParameter> attestParams) generates(ErrorCode error, vec<vec<uint8_t>> certChain);
Keymaster 2 ve önceki sürümler
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
, anahtar yöneticisi cihaz yapısıdır.keyToAttest
, doğrulamanın oluşturulduğugenerateKey
kaynağından döndürülen anahtar blob'udur.attestParams
, doğrulama için gerekli tüm parametrelerin bir listesidir. BunaTag::ATTESTATION_CHALLENGE
ve muhtemelenTag::RESET_SINCE_ID_ROTATION
ile birlikteTag::APPLICATION_ID
veTag::APPLICATION_DATA
da dahildir. Anahtar oluşturma sırasında belirtilmişse son ikisi, anahtar blob'unun şifresini çözmek için gereklidir.certChain
, 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ılabildiği ve yetkilendirme kısıtlamalarını karşılaması gerekmediği için onaylı anahtar üzerinde bir genel 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. Onaylama 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ı (RFC 5280'e bakın) | Değer |
---|---|
tbsCertificate | TBSCertificate 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ı (RFC 5280'e bakın) | 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ıdır. |
validity |
Tag::ACTIVE_DATETIME ve Tag::USAGE_EXPIRE_DATETIME değerlerini içeren iki tarihten oluşan SEQUENCE.
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 |
digitalSignature: Anahtarın amacı KeyPurpose::SIGN veya KeyPurpose::VERIFY ise ayarlanır. 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 Attestation 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, ASN.1 türlerine aşağıdaki şekilde çevrilir:
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 cinsinden. |
BOOL |
NULL |
Etiketin varlığı doğru, yokluğu yanlış anlamına gelir. |
BIGNUM |
Bu türde etiket olmadığından eşleme tanımlanmaz. | |
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 2.0 sürümü 2 Keymaster sürümü 3.0 3 Keymaster sürümü 4.0 4 Keymaster 4.1 sürümü 100 KeyMint 1.0 sürümü 200 KeyMint 2.0 sürümü 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 2.0 sürümü 300 KeyMint 3.0 sürümü -
keymasterSecurityLevel
/keyMintSecurityLevel
- Keymaster/KeyMint uygulamasının güvenlik seviyesi.
-
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 istenmiyorsa bu alan boştur. 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 deposuyla ilgili bir öğenin (ör. anahtar çifti ve doğrulama) saldırıya karşı ne kadar dayanıklı 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ının (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'un uygulama koşulları, Android Uyumluluk Tanımlama Belgesi'nin 9.11.2 numaralı 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
-
1 değerine sahip bir etiket kimliği kullanan
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
-
200 değerinde bir etiket kimliği kullanan
Tag::RSA_PUBLIC_EXPONENT
yetkilendirme etiketine karşılık gelir. -
mgfDigest
-
Yalnızca anahtar doğrulama sürümünde >= 100 mevcuttur.
203 kimlikli etiket değerini kullananTag::RSA_OAEP_MGF_DIGEST
KeyMint -
rollbackResistance
-
Yalnızca anahtar doğrulama sürümünün 3 veya sonraki sürümlerinde bulunur.
303 kimlik değerini kullanan
Tag::ROLLBACK_RESISTANCE
yetkilendirme etiketine karşılık gelir. -
earlyBootOnly
-
Yalnızca anahtar doğrulama sürümünde >= 4 mevcuttur.
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
-
504 etiket kimliği değerini kullanan
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
-
506 etiket kimliği değerini kullanan
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 doğrulama sürümünün 3 veya sonraki sürümlerinde bulunur.
508 değerinde bir etiket kimliği 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 başlıklı makaleyi inceleyin.
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 kimlikli bir etiket kullanan
Tag::UNLOCKED_DEVICE_REQUIRED
izin etiketine karşılık gelir. -
allApplications
-
600 etiket kimliği değerini 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 kimlikli bir etiket 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
-
706 etiket kimliği değerini kullanan
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.
Yalnızca Keymaster 1.0 veya sonraki sürümler bu değeri yetkilendirme listesine dahil eder.
-
attestationApplicationId
-
Yalnızca 2 ve sonraki 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 2 ve sonraki anahtar doğrulama sürümlerinde bulunur.
710 kimlik değerini kullanan
Tag::ATTESTATION_ID_BRAND
Keymaster etiketine karşılık gelir. -
attestationIdDevice
-
Yalnızca 2 ve sonraki anahtar doğrulama sürümlerinde bulunur.
711 kimlik değerini kullanan
Tag::ATTESTATION_ID_DEVICE
Keymaster etiketine karşılık gelir. -
attestationIdProduct
-
Yalnızca 2 ve sonraki 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 2 ve sonraki anahtar doğrulama sürümlerinde bulunur.
713 kimlik değerini kullanan
Tag::ATTESTATION_ID_SERIAL
Keymaster etiketine karşılık gelir. -
attestationIdImei
-
Yalnızca 2 ve sonraki anahtar doğrulama sürümlerinde bulunur.
714 etiket kimliği değerini kullanan
Tag::ATTESTATION_ID_IMEI
yetkilendirme etiketine karşılık gelir. -
attestationIdMeid
-
Yalnızca 2 ve sonraki 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 sonraki 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 sonraki 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 3 ve üzeri anahtar doğrulama sürümlerinde bulunur.
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 biçiminde 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 üzeri anahtar doğrulama sürümlerinde bulunur.
719 etiket kimliği değerini kullanan
Tag::BOOT_PATCHLEVEL
izin 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 üzeri anahtar doğrulama sürümlerinde bulunur.
720 değerinde bir etiket kimliği kullanan
Tag::DEVICE_UNIQUE_ATTESTATION
izin etiketine karşılık gelir. -
attestationIdSecondImei
-
Yalnızca 300 ve üzeri anahtar doğrulama sürümlerinde bulunur.
723 kimlikli etiket değerini kullanan
Tag::ATTESTATION_ID_SECOND_IMEI
yetkilendirme etiketine karşılık gelir.
RootOfTrust alanları
-
verifiedBootKey
- Doğrulanmış Başlatma kapsamında cihazın başlatılması sırasında çalıştırılan tüm kodun bütünlüğünü ve özgünlüğünü doğrulamak için kullanılan ortak anahtarın güvenli 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 |
Tam güven zinciri, 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 uzanır.
Bu durumda verifiedBootKey alanı, yerleşik güven kökü'nün karma oluşturma işlemini 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 kurulamıyor. 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ı ayrıştırılır ve
signature_digests
alanına yerleştirilir. Alan adı yanıltıcıdır. ÇünkügetPackageInfo()
çağrısı tarafından döndürülenSignature
sınıfına göre adlandırıldığı için, sindirilmiş veriler 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ı yalnızca sınırlı bir süre boyunca tanımlayan 128 bitlik bir değerdir. 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 bu ortam tarafından açıklanmayan, 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 birleştirilmiş anahtar materyalinden türetilmelidir.
HMAC_SHA256 çıkışını 128 bit olarak kısaltın.
Attestation 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 yaygınlaşıyor ve OEM'ler artık iki IMEI'ye sahip cihazları destekleyebiliyor.
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.
Provizyon bilgileri uzantısı
Temel hazırlama bilgileri uzantısının OID'si 1.3.6.1.4.1.11129.2.1.30
. Uzantı, cihaz sağlama sunucusu tarafından cihaz hakkında bilinen bilgileri sağlar.
Şema
Uzantı, aşağıdaki CDDL şemasını izler:
{ 1 : int, ; certificates issued }
Haritanın sürümü kaldırılır ve yeni isteğe bağlı alanlar eklenebilir.
-
certs_issued
-
Son 30 gün içinde cihaza verilen yaklaşık sertifika sayısı. Bu değer, ortalamadan birkaç kat daha büyükse olası kötüye kullanım sinyali olarak kullanılabilir.
Kimlik doğrulaması
Android 8.0, Keymaster 3'e sahip cihazlar için kimlik doğrulaması için isteğe bağlı destek 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 (uzaktan 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 tasdiki yalnızca cihazın orijinal donanım tanımlayıcılarını doğrular ve kimliğe bürünme girişimlerini engeller.
Kimlik doğrulaması için ana API yüzeyi, Keymaster 2 ile kullanıma sunulan mevcut anahtar doğrulama mekanizmasının üzerine inşa edilmiştir. 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 bağlanır. 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ı eklemesi istendiğinde TEE, yalnızca fabrikada doldurulduğu şekilde depolama alanında bulunan tanımlayıcıları onaylar.
Depolama alanı ö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üretilen verilerin bu kopyasını kalıcı olarak imha edebilir. 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ı, bozulmaya karşı korumalıdır: Depolama alanındaki içerik değiştirilirse TEE, içeriğin kopyaları yok edilmiş gibi davranır ve tüm 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, bunların orijinal değerleriyle 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, tek tek kimlik karmalarını veya D'nin HMAC'sini bulmak için başlık veya başka bir yapı gerekmez. Doğrulama yapmak için sağlanan değerleri kontrol etmenin yanı sıra, uygulamaların D'yi S'den çı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, tüm kimlik öğeleri ve S'nin doğrulanması için uygulamalarda sabit süreli karşılaştırmalar kullanılmalıdır. Karşılaştırma süresi, sağlanan kimlik sayısından ve testin herhangi bir bölümünün doğru eşleşmesinden bağımsız olarak sabit olmalıdır.
Donanım tanımlayıcıları
Kimlik doğrulaması aşağıdaki donanım tanımlayıcılarını destekler:
- Android'de
Build.BRAND
tarafından döndürülen 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 işletim sistemini kullanan tüm cihazlarda ilk altı özellik bulunur ve bu özelliklerin bu özelliğin çalışması için gereklidir. Cihazda entegre hücresel radyolar varsa cihaz, radyoların IMEI'leri ve/veya MEID'leri için de doğrulamayı desteklemelidir.
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 doğrulamanı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 doğrulama şemasında yapılan değişiklikler, yorumlarla birlikte kalın olarak gösterilmiştir.
Java API
Bu bölüm yalnızca bilgilendirme amaçlıdır. Anahtar yöneticisi uygulayıcıları Java API'yi uygulamaz veya kullanmaz. Bu, uygulama geliştiricilerin özelliğin uygulamalar tarafından nasıl kullanıldığını anlamalarına yardımcı olmak için sağlanır. Sistem bileşenleri bu özelliği farklı şekilde kullanabilir. Bu nedenle, bu bölümün normatif olarak ele alınmaması çok önemlidir.