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ı kullanıldığında anahtar materyali, cihazdan ayıklanmaya karşı daha güvenli olur ve KeyMint (eski adıyla Keymaster), atlatılması zor kısıtlamalar uygular.
Ancak bu durum yalnızca Keystore anahtarlarının donanım destekli depolamada olduğu biliniyorsa geçerlidir. Keymaster 1'de uygulamaların veya uzak sunucuların bu durumu güvenilir bir şekilde doğrulaması mümkün değildi. Anahtar deposu arka plan programı, mevcut Keymaster donanım soyutlama katmanını (HAL) yükledi ve HAL'ın anahtarların donanım desteğiyle ilgili söylediklerine inandı.
Bu sorunu gidermek için Android 7.0'da (Keymaster 2) anahtar onayı, Android 8.0'da (Keymaster 3) ise kimlik onayı kullanıma sunuldu.
Anahtar onayı, asimetrik anahtar çiftinin donanım destekli olup olmadığını, anahtarın özelliklerini ve kullanımına uygulanan kısıtlamaları güçlü bir şekilde belirlemenin bir yolunu sunmayı amaçlar.
Kimlik doğrulama, 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'ye 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
, Keymaster cihaz yapısıdır.keyToAttest
,generateKey
için oluşturulan onaylama işleminden döndürülen anahtar blob'udur.attestParams
, onay için gerekli tüm parametrelerin listesidir. Bu kapsamdaTag::ATTESTATION_CHALLENGE
ve muhtemelenTag::RESET_SINCE_ID_ROTATION
ileTag::APPLICATION_ID
veTag::APPLICATION_DATA
yer alır. Anahtar oluşturma sırasında belirtilmişlerse anahtar blob'unun şifresini çözmek için son iki anahtar gereklidir.certChain
, sertifika dizisi döndüren çıktı parametresidir. 0. giriş, onay sertifikasıdır. Bu sertifika,keyToAttest
'daki anahtarı onaylar ve onay 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 onaylanmış anahtarda genel anahtar işlemi olarak kabul edilir. Örneğin, onaylı anahtarın kullanılabilmesi için kullanıcı kimlik doğrulaması gerekiyorsa kullanıcı kimlik doğrulaması olmadan onay oluşturulabilir.
Onay sertifikası
Onay sertifikası, onaylanmış anahtarın açıklamasını içeren isteğe bağlı bir onay uzantısına sahip standart bir X.509 sertifikasıdır. Sertifika, onaylı 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 ek alanlar içeremez. Bazı alanlar sabit bir alan değeri belirtir. CTS testleri, sertifika içeriğinin tam olarak tanımlandığı gibi olduğunu doğrular.
Certificate SEQUENCE
Alan adı (bkz. RFC 5280) | Değer |
---|---|
tbsCertificate | TBSCertificate SEQUENCE |
signatureAlgorithm | Anahtarı imzalamak için kullanılan algoritmanın AlgorithmIdentifier'ı: 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 |
INTEGER 1 (sabit değer: tüm sertifikalarda aynı) |
signature |
Anahtarı imzalamak için kullanılan algoritmanın AlgorithmIdentifier'ı: EC anahtarları için ECDSA, RSA anahtarları için RSA. |
issuer |
Toplu onay anahtarının konu alanıyla aynıdır. |
validity |
Tag::ACTIVE_DATETIME ve Tag::USAGE_EXPIRE_DATETIME değerlerini içeren iki tarih SEQUENCE'ı.
Bu değerler, 1 Ocak 1970'ten itibaren milisaniye cinsindendir.
Sertifikalardaki doğru tarih gösterimleri için RFC 5280'e bakın.Tag::ACTIVE_DATETIME yoksa Tag::CREATION_DATETIME değerini kullanın. If
Tag::USAGE_EXPIRE_DATETIME yoksa toplu onay anahtarı sertifikasının geçerlilik bitiş tarihini kullanın. |
subject |
CN = "Android Keystore Key" (sabit değer: tüm sertifikalarda aynıdır) |
subjectPublicKeyInfo |
Onaylanmış 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ış. |
extensions/CRL Distribution Points |
Değer HBD |
extensions/"attestation" |
OID 1.3.6.1.4.1.11129.2.1.17'dir. İç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 tasdik SEQUENCE'ının DER kodlamasını içeren bir OCTET_STRING olarak gösterilir. |
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ındaki cihaz durumu hakkında bilgiler içerir.
AIDL arayüzü spesifikasyonunda tanımlanan Keymaster/KeyMint etiket türleri, ASN.1 türlerine aşağıdaki şekilde çevrilir:
KeyMint veya Keymaster 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 bulunması doğru, bulunmaması yanlış anlamına gelir. |
BIGNUM |
Bu türde etiket olmadığı için eşleme tanımlanmamıştır. | |
BYTES |
OCTET_STRING |
Şema
Onay uzantısı içeriği, aşağıdaki ASN.1 şemasıyla açıklanır:
Sürüm 400
KeyDescription ::= SEQUENCE { attestationVersion 400, 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, moduleHash [724] 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), }
Sürüm 300
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), }
Sürüm 200
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), }
Sürüm 100
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 KeyMint veya Keymaster 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 sürüm 1.0 200 KeyMint sürüm 2.0 300 KeyMint sürüm 3.0 400 KeyMint sürüm 4.0 -
attestationSecurityLevel
-
Onaylı anahtarın depolandığı yerin güvenlik düzeyi.
-
keymasterVersion
/keyMintVersion
-
KeyMint veya Keymaster HAL uygulamasının sürümü.
Değer KeyMint veya Keymaster sürümü 2 Keymaster sürümü 2.0 3 Keymaster sürümü 3.0 4 Keymaster sürümü 4.0 41 Keymaster sürümü 4.1 100 KeyMint sürüm 1.0 200 KeyMint sürüm 2.0 300 KeyMint sürüm 3.0 400 KeyMint sürüm 4.0 -
keymasterSecurityLevel
/keyMintSecurityLevel
- KeyMint veya Keymaster 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, gizliliğe duyarlı bir cihaz tanımlayıcısı. Benzersiz kimlik istenmiyorsa bu alan boştur. Ayrıntılı bilgi için Benzersiz kimlik bölümünü inceleyin.
-
softwareEnforced
-
Android sistemi tarafından zorunlu kılınan KeyMint veya Keymaster
yetkilendirme listesi. Bu bilgiler, platformdaki kod tarafından toplanır veya oluşturulur. Cihaz, Android Platform Güvenlik Modeli'ne
(yani cihazın bootloader'ı kilitli ve
verifiedBootState
Verified
) uygun bir işletim sistemi çalıştırdığı sürece güvenilir olabilir. -
hardwareEnforced
- Cihazın güvenilir yürütme ortamı (TEE) veya StrongBox tarafından zorunlu kılınan KeyMint veya Keymaster 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, bir Keystore ile ilgili öğenin (ör. anahtar çifti ve onay) saldırılara karşı ne kadar dayanıklı olduğunu gösterir.
Değer | Anlamı |
---|---|
Software |
Cihazın Android sistemi Android Platform Güvenlik Modeli'ne uyduğu sürece güvenlidir (yani cihazın bootloader'ı kilitlidir ve verifiedBootState , Verified 'dır). |
TrustedEnvironment |
TEE'nin 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ümlerinde tanımlanmıştır. TEE'ler, uzaktan saldırılarla ele geçirilmeye karşı oldukça dirençli, doğrudan donanım saldırılarıyla ele geçirilmeye karşı ise orta düzeyde dirençlidir. |
StrongBox |
StrongBox'ın güvenliği ihlal edilmediği sürece güvenlidir. StrongBox, donanım güvenlik modülüne benzer bir güvenli öğede uygulanır. StrongBox'ın uygulama koşulları, Android Uyumluluk Tanımlama Belgesi'nin 9.11.2 bölümünde tanımlanmıştır. StrongBox, uzaktan saldırı ve doğrudan donanım saldırısı (ör. fiziksel kurcalama ve yan kanal saldırıları) yoluyla güvenlik ihlaline karşı son derece dirençlidir. |
AuthorizationList alanları
Her alan, AIDL arayüz spesifikasyonundaki bir Keymaster/KeyMint yetkilendirme etiketine karşılık gelir.
Spesifikasyon, yetkilendirme etiketleriyle ilgili doğru bilgilerin kaynağıdır: anlamları, içeriklerinin biçimi, KeyDescription
nesnesindeki softwareEnforced
veya hardwareEnforced
alanlarında görünmelerinin beklenip beklenmediği, diğer etiketlerle karşılıklı olarak hariç tutulup tutulmadıkları vb. Tüm AuthorizationList
alanları isteğe bağlıdır.
Her alan, EXPLICIT
anahtar oluşturma veya Keymaster etiket numarasına eşit, bağlama özgü bir etikete sahiptir. Bu etiket, AuthorizationList
içindeki 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ı, 10
olan INTEGER
ASN.1 türü için UNIVERSAL
sınıf etiketi yerine bağlama özgü 504
etiketini içerir.
-
purpose
-
1 etiket kimliği değerini kullanan
Tag::PURPOSE
yetkilendirme etiketine karşılık gelir. -
algorithm
-
2 etiket kimliği değerini kullanan
Tag::ALGORITHM
yetkilendirme etiketiyle eşleşir.Bir onay
AuthorizationList
nesnesinde algoritma değeri her zamanRSA
veyaEC
olur. -
keySize
-
3 etiket kimliği değerini kullanan
Tag::KEY_SIZE
yetkilendirme etiketiyle eşleşir. -
blockMode
-
4 etiket kimliği değerini kullanan
Tag::BLOCK_MODE
yetkilendirme etiketiyle eşleşir. -
digest
-
5 etiket kimliği değerini kullanan
Tag::DIGEST
yetkilendirme etiketiyle eşleşir. -
padding
-
6 etiket kimliği değerini kullanan
Tag::PADDING
yetkilendirme etiketiyle eşleşir. -
callerNonce
-
7 etiket kimliği değerini kullanan
Tag::CALLER_NONCE
yetkilendirme etiketiyle eşleşir. -
minMacLength
-
8 etiket kimliği değerini kullanan
Tag::MIN_MAC_LENGTH
yetkilendirme etiketiyle eşleşir. -
ecCurve
-
10 etiket kimliği değerini kullanan
Tag::EC_CURVE
yetkilendirme etiketiyle eşleşir.Android sistem anahtar deposunda imzalama ve doğrulama için ECDSA'yı kullanan bir eliptik eğri (EC) anahtar çifti oluşturmak üzere kullanılan parametreler kümesi.
-
rsaPublicExponent
-
200 etiket kimliği değerini kullanan
Tag::RSA_PUBLIC_EXPONENT
yetkilendirme etiketine karşılık gelir. -
mgfDigest
-
Yalnızca anahtar onayı sürümü >= 100'de bulunur.
203 etiket kimliği değerini kullananTag::RSA_OAEP_MGF_DIGEST
KeyMint yetkilendirme etiketiyle eşleşir. -
rollbackResistance
-
Yalnızca anahtar onayı sürümü >= 3'te bulunur.
303 etiket kimliği değerini kullanan
Tag::ROLLBACK_RESISTANCE
yetkilendirme etiketine karşılık gelir. -
earlyBootOnly
-
Yalnızca anahtar onayı sürümü >= 4'te bulunur.
305 etiket kimliği değerini kullanan
Tag::EARLY_BOOT_ONLY
yetkilendirme etiketine karşılık gelir. -
activeDateTime
-
400 etiket kimliği değerini kullanan
Tag::ACTIVE_DATETIME
yetkilendirme etiketiyle eşleşir. -
originationExpireDateTime
-
401 etiket kimliği değerini kullanan
Tag::ORIGINATION_EXPIRE_DATETIME
yetkilendirme etiketine karşılık gelir. -
usageExpireDateTime
-
402 etiket kimliği değerini kullanan
Tag::USAGE_EXPIRE_DATETIME
yetkilendirme etiketiyle eşleşir. -
usageCountLimit
-
405 etiket kimliği değerini kullanan
Tag::USAGE_COUNT_LIMIT
yetkilendirme etiketiyle eşleşir. -
userSecureId
-
502 etiket kimliği değerini kullanan
Tag::USER_SECURE_ID
yetkilendirme etiketiyle eşleşir. -
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 etiketiyle eşleşir. -
allowWhileOnBody
-
506 etiket kimliği değerini kullanan
Tag::ALLOW_WHILE_ON_BODY
yetkilendirme etiketiyle eşleşir.Kullanıcı cihazı vücudunda takmaya devam ediyorsa kimlik doğrulama zaman aşımı süresi dolduktan sonra anahtarın kullanılmasına izin verir. Cihazın kullanıcının vücudunda takılı olup olmadığını güvenli bir vücuda temas sensörünün belirlediğini unutmayın.
-
trustedUserPresenceReq
-
Yalnızca anahtar onayı sürümü >= 3'te bulunur.
507 etiket kimliği değerini kullanan
Tag::TRUSTED_USER_PRESENCE_REQUIRED
yetkilendirme etiketiyle eşleşir.Bu anahtarın yalnızca kullanıcının fiziksel varlığını kanıtlaması durumunda kullanılabileceğini belirtir. Aşağıda birkaç örnek verilmiştir:
- StrongBox anahtarı için StrongBox cihazındaki bir pine kablolu olarak bağlanmış bir donanım düğmesi.
- TEE anahtarı için parmak izi kimlik doğrulaması, TEE'nin tarayıcı üzerinde özel kontrolü olduğu ve parmak izi eşleştirme işlemini gerçekleştirdiği sürece varlık kanıtı sağlar.
-
trustedConfirmationReq
-
Yalnızca anahtar onayı sürümü >= 3'te bulunur.
508 etiket kimliği değerini kullanan
Tag::TRUSTED_CONFIRMATION_REQUIRED
yetkilendirme etiketiyle eşleşir.Anahtarın yalnızca kullanıcı, onay jetonu kullanarak imzalanacak verilerin onayını sağlarsa kullanılabileceğini belirtir. Kullanıcı onayı alma hakkında daha fazla bilgi için Android Protected Confirmation başlıklı makaleyi inceleyin.
Not: Bu etiket yalnızca
SIGN
amacı kullanılan anahtarlar için geçerlidir. -
unlockedDeviceReq
-
Yalnızca anahtar onayı sürümü >= 3'te bulunur.
509 etiket kimliği değerini kullanan
Tag::UNLOCKED_DEVICE_REQUIRED
yetkilendirme etiketiyle eşleşir. -
creationDateTime
-
701 etiket kimliği değerini kullanan
Tag::CREATION_DATETIME
yetkilendirme etiketiyle eşleşir. -
origin
-
702 etiket kimliği değerini kullanan
Tag::ORIGIN
yetkilendirme etiketiyle eşleşir. -
rootOfTrust
-
704 etiket kimliği değerini kullanan
Tag::ROOT_OF_TRUST
yetkilendirme etiketiyle eşleşir.Daha fazla bilgi için RootOfTrust veri yapısını açıklayan bölüme bakın.
-
osVersion
-
705 etiket kimliği değerini kullanan
Tag::OS_VERSION
yetkilendirme etiketine karşılık gelir.Keymaster ile ilişkili Android işletim sistemi sürümü, altı haneli bir tam sayı olarak belirtilir. Örneğin, 8.1.0 sürümü 080100 olarak gösterilir.
Bu değer yalnızca Keymaster 1.0 veya sonraki sürümlerin yetkilendirme listesinde yer alır.
-
osPatchLevel
-
706 etiket kimliği değerini kullanan
Tag::PATCHLEVEL
yetkilendirme etiketiyle eşleşir.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 gösterilir.
Bu değer yalnızca Keymaster 1.0 veya sonraki sürümlerin yetkilendirme listesinde yer alır.
-
attestationApplicationId
-
Yalnızca anahtar onayı sürümlerinde >= 2 bulunur.
709 etiket kimliği değerini kullanan
Tag::ATTESTATION_APPLICATION_ID
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ümlerinde >= 2 bulunur.
710 etiket kimliği değerini kullanan
Tag::ATTESTATION_ID_BRAND
yetkilendirme etiketiyle eşleşir. -
attestationIdDevice
-
Yalnızca anahtar onayı sürümlerinde >= 2 bulunur.
711 etiket kimliği değerini kullanan
Tag::ATTESTATION_ID_DEVICE
yetkilendirme etiketiyle eşleşir. -
attestationIdProduct
-
Yalnızca anahtar onayı sürümlerinde >= 2 bulunur.
712 etiket kimliği değerini kullanan
Tag::ATTESTATION_ID_PRODUCT
yetkilendirme etiketiyle eşleşir. -
attestationIdSerial
-
Yalnızca anahtar onayı sürümlerinde >= 2 bulunur.
713 etiket kimliği değerini kullanan
Tag::ATTESTATION_ID_SERIAL
yetkilendirme etiketiyle eşleşir. -
attestationIdImei
-
Yalnızca anahtar onayı sürümlerinde >= 2 bulunur.
714 etiket kimliği değerini kullanan
Tag::ATTESTATION_ID_IMEI
yetkilendirme etiketiyle eşleşir. -
attestationIdMeid
-
Yalnızca anahtar onayı sürümlerinde >= 2 bulunur.
715 etiket kimliği değerini kullanan
Tag::ATTESTATION_ID_MEID
yetkilendirme etiketiyle eşleşir. -
attestationIdManufacturer
-
Yalnızca anahtar onayı sürümlerinde >= 2 bulunur.
716 etiket kimliği değerini kullanan
Tag::ATTESTATION_ID_MANUFACTURER
yetkilendirme etiketine karşılık gelir. -
attestationIdModel
-
Yalnızca anahtar onayı sürümlerinde >= 2 bulunur.
717 etiket kimliği değerini kullanan
Tag::ATTESTATION_ID_MODEL
yetkilendirme etiketiyle eşleşir. -
vendorPatchLevel
-
Yalnızca anahtar onayı sürümü >= 3 olan cihazlarda bulunur.
718 etiket kimliği değerini kullanan
Tag::VENDOR_PATCHLEVEL
yetkilendirme etiketiyle eşleşir.Bu anahtarın kullanılabilmesi için cihaza yüklenmesi gereken tedarikçi resmi güvenlik yaması düzeyini belirtir. Değer, satıcı güvenlik yamasının tarihini temsil eden YYYYAAGG biçiminde görünür. Örneğin, satıcının 1 Ağustos 2018 tarihli güvenlik yaması yüklü bir Android cihazda anahtar oluşturulursa bu değer 20180801 olur.
-
bootPatchLevel
-
Yalnızca anahtar onayı sürümü >= 3 olan cihazlarda 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 görüntüsü güvenlik yaması düzeyini belirtir. Değer, sistem güvenlik yamasının tarihini temsil eden YYYYAAGG biçiminde gösterilir. Örneğin, sistemin 5 Ağustos 2018 tarihli güvenlik yaması yüklü bir Android cihazda anahtar oluşturulursa bu değer 20180805 olur.
-
deviceUniqueAttestation
-
Yalnızca anahtar onayı sürümü >= 4 olan cihazlarda bulunur.
720 etiket kimliği değerini kullanan
Tag::DEVICE_UNIQUE_ATTESTATION
yetkilendirme etiketiyle eşleşir. -
attestationIdSecondImei
-
Yalnızca anahtar onayı sürümlerinde >= 300 bulunur.
723 etiket kimliği değerini kullanan
Tag::ATTESTATION_ID_SECOND_IMEI
yetkilendirme etiketiyle eşleşir. -
moduleHash
-
Yalnızca anahtar onayı sürümlerinde >= 400 bulunur.
724 etiket kimliği değerini kullanan
Tag::MODULE_HASH
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 gerçekliğini doğrulamak için kullanılan ortak anahtarın güvenli karma değeri. 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üyle başlatıldığı anlamına gelir. -
verifiedBootState
- Cihazın doğrulanmış başlatma durumu.
-
verifiedBootHash
- Doğrulanmış Önyükleme ile korunan tüm verilerin özeti. Android Verified Boot referans uygulamasını kullanan cihazlarda bu alan, VBMeta özetini içerir.
VerifiedBootState değerleri
Değer | İlgili başlatma durumu | Anlamı |
---|---|---|
Verified |
GREEN |
Tam bir güven zinciri, donanımla korunan bir güven kökünden Doğrulanmış Başlatma tarafından doğrulanan bootloader'a ve tüm bölümlere kadar uzanır.
Bu durumda, verifiedBootKey alanı, cihaz üreticisi tarafından fabrikada cihazın ROM'una yerleştirilen sertifika olan yerleşik güven kökünün karmasını içerir. |
SelfSigned |
YELLOW |
Üretici tarafından fabrikada yerleştirilen güven kökü yerine Verified ile aynıdır. Ancak doğrulama, kullanıcı tarafından yapılandırılan bir güven kökü kullanılarak yapılmıştı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 serbestçe değiştirilebildiği için cihazın bütünlüğü, kullanıcı tarafından bant dışı olarak doğrulanmalıdır. Bu durumda verifiedBootKey alanı 32 baytlık sıfır içerir. |
Failed |
RED |
Cihaz doğrulanamadı. Bu durumda, diğer RootOfTrust alanlarının içeriğiyle ilgili herhangi bir garanti verilmez. |
AttestationApplicationId
Bu alan, Android platformunun hangi uygulamaların onay kapsamında gizli anahtar materyalini kullanmasına izin verildiği konusundaki görüşünü yansıtır. Yalnızca birden fazla paket aynı UID'yi paylaşıyorsa birden fazla paket içerebilir. AttestationApplicationId
alanındaki AuthorizationList
, 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
AttestationPackageInfo
nesneleri kümesi. signature_digests
-
Uygulamanın imzalama sertifikalarının SHA-256 özetleri. Bir uygulamanın birden fazla imzalama anahtarı sertifika zinciri olabilir. Her biri için "yaprak" sertifikası özetlenir ve
signature_digests
alanına yerleştirilir. Özetlenen veriler,getPackageInfo()
çağrısıyla döndürülenSignature
sınıfı için adlandırıldığından, uygulama imzaları değil, uygulamanın imzalama sertifikalarıdır. Bu nedenle alan adı yanıltıcıdır. Aşağıdaki kod snippet'inde bir örnek küme gösterilmektedir:{SHA256(PackageInfo.signature[0]), SHA256(PackageInfo.signature[1]), ...}
Temel hazırlık bilgileri uzantısı
Temel hazırlık bilgileri uzantısının OID'si
1.3.6.1.4.1.11129.2.1.30
. Uzantı, sağlama sunucusu tarafından cihaz hakkında bilinen bilgileri sağlar.
Şema
Uzantı, aşağıdaki CDDL şemasını kullanır:
{ 1 : int, ; certificates issued 4 : string, ; validated attested entity (STRONG_BOX/TEE) }
Harita sürüm içermez ve yeni isteğe bağlı alanlar eklenebilir.
-
certs_issued
-
Son 30 gün içinde cihaza verilen sertifikaların yaklaşık sayısı. Bu değer, ortalamadan birkaç kat büyükse olası kötüye kullanım sinyali olarak kullanılabilir.
-
validated_attested_entity
-
Doğrulanmış onaylı öğe, hazırlama sunucusu tarafından onaylı olduğu onaylanan cihaz türünü açıklayan bir dizedir. Örneğin,
STRONG_BOX
veyaTEE
.
Onay anahtarları
Biri RSA, diğeri ECDSA olmak üzere iki anahtar ve ilgili sertifika zincirleri cihaza güvenli bir şekilde sağlanır.
Android 12'de Uzaktan Anahtar Sağlama özelliği kullanıma sunulmuştu. Android 13'te ise cihazların bu özelliği uygulaması zorunlu tutuluyor. Uzaktan anahtar sağlama, sahadaki cihazlara uygulama başına ECDSA P256 onay sertifikaları sağlar. Bu sertifikaların kullanım süresi, fabrikada sağlanan sertifikalardan daha kısadır.
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'a bölünmesiyle hesaplanan ve kalan kısmın atıldığı "zamansal sayaç değeri"dir.T
, 30 günde bir değişir (2592000000 = 30 * 24 * 60 * 60 * 1000).C
,Tag::APPLICATION_ID
değeridir.R
, attest_key çağrısına yönelik attest_params parametresindeTag::RESET_SINCE_ID_ROTATION
varsa 1, etiket yoksa 0'dır.HBK
, Güvenilir Yürütme Ortamı tarafından bilinen ve hiçbir zaman açıklanmayan, donanıma bağlı benzersiz bir sırdır. Gizli anahtar en az 128 bit entropi içerir ve cihaza özeldir (128 bit entropi göz önüne alındığında olasılıksal benzersizlik kabul edilebilir). HBK, HMAC veya AES_CMAC aracılığıyla birleştirilmiş anahtar materyalinden türetilmelidir.
HMAC_SHA256 çıkışını 128 bit olarak kısaltın.
Birden fazla IMEI
Android 14, Android Anahtar Onaylama kaydında birden fazla IMEI'nin desteklenmesini sağlar. OEM'ler, ikinci bir IMEI için KeyMint etiketi ekleyerek bu özelliği uygulayabilir. Cihazlarda birden fazla hücresel radyo bulunması giderek yaygınlaşıyor ve OEM'ler artık iki IMEI'li cihazları destekleyebiliyor.
OEM'lerin, cihazlarında varsa ikincil bir IMEI'yi KeyMint uygulamalarına sağlaması gerekir. Böylece bu uygulamalar, ilk IMEI'yi onayladıkları şekilde ikincil IMEI'yi de onaylayabilir.
Kimlik onayı
Android 8.0, Keymaster 3'e sahip cihazlar için isteğe bağlı olarak kimlik doğrulama desteği içerir. Kimlik doğrulama, 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 cihazın kimliğini kanıtlayabilmek, gerçek sıfır dokunmayla uzaktan yapılandırma gibi kullanım alanlarının daha güvenli olmasını sağladığından (uzak taraf, kimliğini taklit eden bir cihazla değil, doğru cihazla iletişim kurduğundan emin olabilir) tüm Keymaster 3 uygulamalarının bu özelliği desteklemesi önemle tavsiye edilir.
Kimlik doğrulama, cihaz fabrikadan çıkmadan önce yalnızca TEE'nin erişebileceği cihazın donanım tanımlayıcılarının kopyalarını oluşturarak çalışır. Kullanıcılar, cihazın önyükleyicisinin kilidini açabilir ve sistem yazılımı ile 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ı onaylar ve sahtecilik girişimleri engellenir.
Kimlik onayı için ana API yüzeyi, Keymaster 2 ile kullanıma sunulan mevcut anahtar onayı mekanizmasının üzerine kurulmuştur. Keymaster tarafından tutulan bir anahtar için onay sertifikası istenirken arayan, cihazın donanım tanımlayıcılarının onay sertifikasının meta verilerine dahil edilmesini isteyebilir. Anahtar TEE'de tutuluyorsa 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. Donanım tanımlayıcılarının onay sertifikasına dahil edilmesi istendiğinde TEE, yalnızca fabrikada doldurulduğu şekilde depolamasında tutulan tanımlayıcıları onaylar.
Depolama alanı özellikleri
Cihazın tanımlayıcılarını içeren depolama alanının şu özelliklere sahip olması gerekir:
- Cihazın orijinal tanımlayıcılarından elde edilen 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 yok edebilir. Kalıcı imha, verilerin tamamen kaldırılması anlamına gelir. Bu durumda, ne fabrika ayarlarına sıfırlama ne de cihazda gerçekleştirilen başka bir işlem verileri geri yükleyebilir. Bu durum, özellikle kullanıcının önyükleyici 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ından türetilen verilerin yeni kopyalarını oluşturabilmelidir. Bu sayede, RMA'dan geçen bir cihaz tekrar kimlik doğrulama işlemi yapabilir. RMA tesisleri tarafından kullanılan mekanizma, kullanıcıların kendilerinin sahte kimliklerin onaylarını almasına olanak tanıyacağından korunmalıdır.
- TEE'de Keymaster güvenilir uygulaması dışında hiçbir kod, depolama alanında tutulan tanımlayıcıdan türetilmiş verileri okuyamaz.
- Depolama alanı kurcalamaya karşı korumalıdır: Depolama alanının içeriği değiştirildiyse TEE, bu durumu içeriğin kopyaları yok edilmiş gibi ele alır ve tüm kimlik doğrulama girişimlerini reddeder. Bu işlem, depolama alanının aşağıda açıklandığı şekilde imzalanması veya MAC'lenmesiyle uygulanır.
- Depolama alanında orijinal tanımlayıcılar bulunmuyor. Kimlik onayı bir sorgulama içerdiğinden, arayan her zaman onaylanacak tanımlayıcıları sağlar. TEE'nin yalnızca bu değerlerin başlangıçtaki değerlerle eşleştiğini doğrulaması gerekir. Bu doğrulama, değerler yerine orijinal değerlerin güvenli karma değerleri depolanarak sağlanır.
Yol çalışması
Yukarıda listelenen özelliklere sahip bir uygulama oluşturmak için kimlikten türetilmiş değerleri aşağıdaki yapıda saklayın. Sistemdeki normal yerler dışında, cihaz sahibinin rootlayarak değiştirebileceği kimlik değerlerinin başka kopyalarını saklamayın:
S = D || HMAC(HBK, D)
burada:
D = HMAC(HBK, ID1) || HMAC(HBK, ID2) || ... || HMAC(HBK, IDn)
HMAC
, uygun bir güvenli karma ile (SHA-256 önerilir) HMAC yapısıdır.HBK
, başka bir amaçla kullanılmayan, donanıma bağlı bir anahtardır.ID1...IDn
orijinal kimlik değerleridir; belirli bir değerin belirli bir dizinle ilişkilendirilmesi uygulamaya bağlıdır. Bunun nedeni, farklı cihazlarda farklı sayıda tanımlayıcı bulunmasıdır.||
birleştirme işlemini gösterir
HMAC çıkışları sabit boyutlu olduğundan, tek tek kimlik karmalarını veya D'nin HMAC'sini bulmak için başlık ya da başka bir yapı gerekmez. Onaylama işlemini gerçekleştirmek için sağlanan değerleri kontrol etmenin yanı sıra, uygulamaların S'den D'yi çıkararak, HMAC(HBK, D) değerini hesaplayarak ve bunu S'deki değerle karşılaştırarak hiçbir bireysel kimliğin değiştirilmediğini/bozulmadığını doğrulamak için S'yi doğrulaması gerekir. Ayrıca, uygulamalarda tüm bağımsız kimlik öğeleri ve S'nin doğrulanması için sabit süreli karşılaştırmalar kullanılmalıdır. Karşılaştırma süresi, sağlanan kimliklerin 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ğrulama, 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 onayını desteklemek için cihaz, bu tanımlayıcıları onaylar. Android'in çalıştığı tüm cihazlarda ilk altı bulunur ve bu özelliğin çalışması için gereklidir. Cihazda entegre hücresel radyolar varsa cihaz, radyoların IMEI ve/veya MEID'leri için de onaylamayı desteklemelidir.
Kimlik doğrulama, anahtar doğrulama işlemi yapılarak ve istekte doğrulanacak cihaz tanımlayıcıları eklenerek 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ğrulama özelliğini 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ğrulama işlemini destekliyorsa ve yukarıdaki etiketlerden biri veya daha fazlası anahtar doğrulama isteğine dahil edilmişse TEE, her bir etiketle birlikte sağlanan tanımlayıcını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 onaylama işlemi ErrorCode::CANNOT_ATTEST_IDS
ile başarısız olur. Aynı etiketin birden fazla kez sağlanması geçerlidir. Bu, örneğin IMEI'leri onaylarken yararlı olabilir:
Bir cihazda birden fazla IMEI'ye sahip birden fazla radyo olabilir. Her ATTESTATION_ID_IMEI
ile sağlanan değer, cihazın radyolarından biriyle eşleşiyorsa onay isteği geçerlidir. Aynı durum diğer tüm etiketler için de geçerlidir.
Onay başarılı olursa onaylanan kimlikler, yukarıdaki şemayı kullanarak verilen onay sertifikasının onay uzantısına (OID 1.3.6.1.4.1.11129.2.1.17) eklenir. Keymaster 2 onay şemasındaki değişiklikler yorumlarla birlikte kalın olarak gösterilir.
Java API
Bu bölüm yalnızca bilgilendirme amaçlıdır. Keymaster uygulayıcıları Java API'yi ne uygular ne de kullanır. Bu, uygulayıcıların özelliği uygulamaların nasıl kullandığını anlamasına yardımcı olmak için sağlanır. Sistem bileşenleri bunu farklı şekilde kullanabilir. Bu nedenle, bu bölümün normatif olarak ele alınmaması önemlidir.