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_CHALLENGETag::INCLUDE_UNIQUE_IDTag::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,generateKeyiç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_CHALLENGEve muhtemelenTag::RESET_SINCE_ID_ROTATIONileTag::APPLICATION_IDveTag::APPLICATION_DATAyer 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 INTEGER, # Value 400
attestationSecurityLevel SecurityLevel,
keyMintVersion INTEGER, # Value 400
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,
blockMode [4] EXPLICIT SET OF INTEGER OPTIONAL,
digest [5] EXPLICIT SET OF INTEGER OPTIONAL,
padding [6] EXPLICIT SET OF INTEGER OPTIONAL,
callerNonce [7] EXPLICIT NULL OPTIONAL,
minMacLength [8] EXPLICIT 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,
userSecureId [502] EXPLICIT INTEGER OPTIONAL,
noAuthRequired [503] EXPLICIT NULL OPTIONAL,
userAuthType [504] EXPLICIT INTEGER OPTIONAL,
authTimeout [505] EXPLICIT INTEGER OPTIONAL,
allowWhileOnBody [506] EXPLICIT NULL OPTIONAL,
trustedUserPresenceReq [507] EXPLICIT NULL OPTIONAL,
trustedConfirmationReq [508] EXPLICIT NULL OPTIONAL,
unlockedDeviceReq [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,
}
Modules ::= SET OF Module
Module ::= SEQUENCE {
packageName OCTET_STRING,
version INTEGER,
}
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 INTEGER, # Value 300
attestationSecurityLevel SecurityLevel,
keyMintVersion INTEGER, # Value 300
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,
blockMode [4] EXPLICIT SET OF INTEGER OPTIONAL,
digest [5] EXPLICIT SET OF INTEGER OPTIONAL,
padding [6] EXPLICIT SET OF INTEGER OPTIONAL,
callerNonce [7] EXPLICIT NULL OPTIONAL,
minMacLength [8] EXPLICIT 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,
userSecureId [502] EXPLICIT INTEGER OPTIONAL,
noAuthRequired [503] EXPLICIT NULL OPTIONAL,
userAuthType [504] EXPLICIT INTEGER OPTIONAL,
authTimeout [505] EXPLICIT INTEGER OPTIONAL,
allowWhileOnBody [506] EXPLICIT NULL OPTIONAL,
trustedUserPresenceReq [507] EXPLICIT NULL OPTIONAL,
trustedConfirmationReq [508] EXPLICIT NULL OPTIONAL,
unlockedDeviceReq [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 INTEGER, # Value 200
attestationSecurityLevel SecurityLevel,
keyMintVersion INTEGER, # Value 200
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,
trustedUserPresenceReq [507] EXPLICIT NULL OPTIONAL,
trustedConfirmationReq [508] EXPLICIT NULL OPTIONAL,
unlockedDeviceReq [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 INTEGER, # Value 100
attestationSecurityLevel SecurityLevel,
keyMintVersion INTEGER, # Value 100
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,
trustedUserPresenceReq [507] EXPLICIT NULL OPTIONAL,
trustedConfirmationReq [508] EXPLICIT NULL OPTIONAL,
unlockedDeviceReq [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 INTEGER, # Value 4
attestationSecurityLevel SecurityLevel,
keymasterVersion INTEGER, # Value 41
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,
blockMode [4] EXPLICIT SET OF INTEGER OPTIONAL,
digest [5] EXPLICIT SET OF INTEGER OPTIONAL,
padding [6] EXPLICIT SET OF INTEGER OPTIONAL,
callerNonce [7] EXPLICIT NULL OPTIONAL,
minMacLength [8] EXPLICIT 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,
userSecureId [502] EXPLICIT INTEGER OPTIONAL,
noAuthRequired [503] EXPLICIT NULL OPTIONAL,
userAuthType [504] EXPLICIT INTEGER OPTIONAL,
authTimeout [505] EXPLICIT INTEGER OPTIONAL,
allowWhileOnBody [506] EXPLICIT NULL OPTIONAL,
trustedUserPresenceReq [507] EXPLICIT NULL OPTIONAL,
trustedConfirmationReq [508] EXPLICIT NULL OPTIONAL,
unlockedDeviceReq [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 3
KeyDescription ::= SEQUENCE {
attestationVersion INTEGER, # Value 3
attestationSecurityLevel SecurityLevel,
keymasterVersion INTEGER, # Value 4
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,
blockMode [4] EXPLICIT SET OF INTEGER OPTIONAL,
digest [5] EXPLICIT SET OF INTEGER OPTIONAL,
padding [6] EXPLICIT SET OF INTEGER OPTIONAL,
callerNonce [7] EXPLICIT NULL OPTIONAL,
minMacLength [8] EXPLICIT 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,
userSecureId [502] EXPLICIT INTEGER OPTIONAL,
noAuthRequired [503] EXPLICIT NULL OPTIONAL,
userAuthType [504] EXPLICIT INTEGER OPTIONAL,
authTimeout [505] EXPLICIT INTEGER OPTIONAL,
allowWhileOnBody [506] EXPLICIT NULL OPTIONAL,
trustedUserPresenceReq [507] EXPLICIT NULL OPTIONAL,
trustedConfirmationReq [508] EXPLICIT NULL OPTIONAL,
unlockedDeviceReq [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,
}
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 INTEGER, # Value 2
attestationSecurityLevel SecurityLevel,
keymasterVersion INTEGER, # Value 3
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 INTEGER, # Value 1
attestationSecurityLevel SecurityLevel,
keymasterVersion INTEGER, # Value 2
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 Unique ID (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
verifiedBootStateVerified) 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::PURPOSEyetkilendirme etiketine karşılık gelir. -
algorithm -
2 etiket kimliği değerini kullanan
Tag::ALGORITHMyetkilendirme etiketiyle eşleşir.Bir onay
AuthorizationListnesnesinde algoritma değeri her zamanRSAveyaEColur. -
keySize -
3 etiket kimliği değerini kullanan
Tag::KEY_SIZEyetkilendirme etiketiyle eşleşir. -
blockMode -
4 etiket kimliği değerini kullanan
Tag::BLOCK_MODEyetkilendirme etiketiyle eşleşir. -
digest -
5 etiket kimliği değerini kullanan
Tag::DIGESTyetkilendirme etiketiyle eşleşir. -
padding -
6 etiket kimliği değerini kullanan
Tag::PADDINGyetkilendirme etiketiyle eşleşir. -
callerNonce -
7 etiket kimliği değerini kullanan
Tag::CALLER_NONCEyetkilendirme etiketiyle eşleşir. -
minMacLength -
8 etiket kimliği değerini kullanan
Tag::MIN_MAC_LENGTHyetkilendirme etiketiyle eşleşir. -
ecCurve -
10 etiket kimliği değerini kullanan
Tag::EC_CURVEyetkilendirme 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_EXPONENTyetkilendirme 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_DIGESTKeyMint 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_RESISTANCEyetkilendirme 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_ONLYyetkilendirme etiketine karşılık gelir. -
activeDateTime -
400 etiket kimliği değerini kullanan
Tag::ACTIVE_DATETIMEyetkilendirme etiketiyle eşleşir. -
originationExpireDateTime -
401 etiket kimliği değerini kullanan
Tag::ORIGINATION_EXPIRE_DATETIMEyetkilendirme etiketine karşılık gelir. -
usageExpireDateTime -
402 etiket kimliği değerini kullanan
Tag::USAGE_EXPIRE_DATETIMEyetkilendirme etiketiyle eşleşir. -
usageCountLimit -
405 etiket kimliği değerini kullanan
Tag::USAGE_COUNT_LIMITyetkilendirme etiketiyle eşleşir. -
userSecureId -
502 etiket kimliği değerini kullanan
Tag::USER_SECURE_IDyetkilendirme etiketiyle eşleşir. -
noAuthRequired -
503 etiket kimliği değerini kullanan
Tag::NO_AUTH_REQUIREDyetkilendirme etiketine karşılık gelir. -
userAuthType -
504 etiket kimliği değerini kullanan
Tag::USER_AUTH_TYPEyetkilendirme etiketine karşılık gelir. -
authTimeout -
505 etiket kimliği değerini kullanan
Tag::AUTH_TIMEOUTyetkilendirme etiketiyle eşleşir. -
allowWhileOnBody -
506 etiket kimliği değerini kullanan
Tag::ALLOW_WHILE_ON_BODYyetkilendirme 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_REQUIREDyetkilendirme etiketiyle eşleşir.Bu anahtarın yalnızca kullanıcının fiziksel varlığını kanıtlaması durumunda kullanılabileceğini belirtir. Bu duruma örnek olarak aşağıdakiler verilebilir:
- 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_REQUIREDyetkilendirme 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
SIGNamacı 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_REQUIREDyetkilendirme etiketiyle eşleşir. -
creationDateTime -
701 etiket kimliği değerini kullanan
Tag::CREATION_DATETIMEyetkilendirme etiketiyle eşleşir. -
origin -
702 etiket kimliği değerini kullanan
Tag::ORIGINyetkilendirme etiketiyle eşleşir. -
rootOfTrust -
704 etiket kimliği değerini kullanan
Tag::ROOT_OF_TRUSTyetkilendirme 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_VERSIONyetkilendirme 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::PATCHLEVELyetkilendirme 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_IDyetkilendirme 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_BRANDyetkilendirme etiketiyle eşleşir. -
attestationIdDevice -
Yalnızca anahtar onayı sürümlerinde >= 2 bulunur.
711 etiket kimliği değerini kullanan
Tag::ATTESTATION_ID_DEVICEyetkilendirme etiketiyle eşleşir. -
attestationIdProduct -
Yalnızca anahtar onayı sürümlerinde >= 2 bulunur.
712 etiket kimliği değerini kullanan
Tag::ATTESTATION_ID_PRODUCTyetkilendirme etiketiyle eşleşir. -
attestationIdSerial -
Yalnızca anahtar onayı sürümlerinde >= 2 bulunur.
713 etiket kimliği değerini kullanan
Tag::ATTESTATION_ID_SERIALyetkilendirme etiketiyle eşleşir. -
attestationIdImei -
Yalnızca anahtar onayı sürümlerinde >= 2 bulunur.
714 etiket kimliği değerini kullanan
Tag::ATTESTATION_ID_IMEIyetkilendirme etiketiyle eşleşir. -
attestationIdMeid -
Yalnızca anahtar onayı sürümlerinde >= 2 bulunur.
715 etiket kimliği değerini kullanan
Tag::ATTESTATION_ID_MEIDyetkilendirme etiketiyle eşleşir. -
attestationIdManufacturer -
Yalnızca anahtar onayı sürümlerinde >= 2 bulunur.
716 etiket kimliği değerini kullanan
Tag::ATTESTATION_ID_MANUFACTURERyetkilendirme 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_MODELyetkilendirme 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_PATCHLEVELyetkilendirme 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_PATCHLEVELyetkilendirme 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_ATTESTATIONyetkilendirme 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_IMEIyetkilendirme etiketiyle eşleşir. -
moduleHash -
Yalnızca anahtar onayı sürümlerinde >= 400 bulunur.
724 etiket kimliği değerini kullanan
Tag::MODULE_HASHyetkilendirme 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 kodun bütünlüğünü ve gerçekliğini 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ü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
AttestationPackageInfonesneleri 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_digestsalanına yerleştirilir. Özetlenen veriler,getPackageInfo()çağrısıyla döndürülenSignaturesı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ı değeri, şu Concise Data Definition Language (CDDL) şemasına uygun Concise Binary Object Representation (CBOR) verilerinden oluşur:
{
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_BOXveyaTEE.
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_DATETIMEdeğ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_IDdeğeridir.R, attest_key çağrısına yönelik attest_params parametresindeTag::RESET_SINCE_ID_ROTATIONvarsa 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'deki 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)
Neresi:
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...IDnorijinal 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 S'yi doğrulaması gerekir. Bu şekilde, hiçbir bireysel kimliğin değiştirilmediği/bozulmadığı doğrulanır. 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.BRANDtarafından döndürülen marka adı - Android'de
Build.DEVICEtarafından döndürülen cihaz adı - Android'de
Build.PRODUCTtarafından döndürülen ürün adı - Android'de
Build.MANUFACTURERtarafından döndürülen üretici adı - Android'de
Build.MODELtarafı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_BRANDATTESTATION_ID_DEVICEATTESTATION_ID_PRODUCTATTESTATION_ID_MANUFACTURERATTESTATION_ID_MODELATTESTATION_ID_SERIALATTESTATION_ID_IMEIATTESTATION_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.