Anahtar ve kimlik onayı

Anahtar Deposu, şifreleme anahtarlarını kontrollü bir şekilde oluşturmak, depolamak ve kullanmak için daha güvenli bir yer sağlar. Donanım destekli anahtar depolama alanı mevcut olduğunda ve kullanıldığında anahtar materyali, cihazdan ayıklama işlemine karşı daha güvenli olur ve Keymaster, ihlal edilmesi zor olan kısıtlamalar uygular.

Ancak bu durum yalnızca anahtar mağazası anahtarlarının donanım destekli depolama alanında olduğu biliniyorsa geçerlidir. Keymaster 1'de, uygulamaların veya uzak sunucuların bu durumun geçerli olup olmadığını güvenilir bir şekilde doğrulaması mümkün değildi. Anahtar deposu arka plan programı, mevcut anahtar denetleyicisi HAL'yi yüklemiştir ve anahtarların donanımla yedeklenmesiyle ilgili olarak HAL'nin söylediklerine inanmıştır.

Keymaster bunu düzeltmek için Android 7.0'da (Keymaster 2) anahtar onayını ve Android 8.0'da (Keymaster 3) kimlik onayını kullanıma sundu.

Anahtar onayı, asimetrik bir anahtar çiftinin donanım destekli olup olmadığını, anahtarın özelliklerini ve kullanımına uygulanan kısıtlamaları kesin olarak belirlemenin bir yolunu sunmayı amaçlar.

Kimlik doğrulaması, cihazın seri numarası veya IMEI gibi donanım tanımlayıcılarının kanıtını sağlamasına olanak tanır.

Anahtar onayı

Android 7.0, anahtar onayını desteklemek için HAL'ye bir etiket, tür ve yöntem grubu sunmuştur.

Etiketler

  • Tag::ATTESTATION_CHALLENGE
  • Tag::INCLUDE_UNIQUE_ID
  • Tag::RESET_SINCE_ID_ROTATION

Tür

Keymaster 2 ve önceki sürümler

typedef struct {
    keymaster_blob_t* entries;
    size_t entry_count;
} keymaster_cert_chain_t;

AttestKey yöntem

Keymaster 3

    attestKey(vec<uint8_t> keyToAttest, vec<KeyParameter> attestParams)
        generates(ErrorCode error, vec<vec<uint8_t>> certChain);

Keymaster 2 ve altı

keymaster_error_t (*attest_key)(const struct keymaster2_device* dev,
        const keymaster_key_blob_t* key_to_attest,
        const keymaster_key_param_set_t* attest_params,
        keymaster_cert_chain_t* cert_chain);
  • dev, keymaster cihaz yapısıdır.
  • keyToAttest, doğrulamanın oluşturulduğu generateKey kaynağından döndürülen anahtar blob'udur.
  • attestParams, onay için gerekli olan tüm parametrelerin listesidir. Buna Tag::ATTESTATION_CHALLENGE ve muhtemelen Tag::RESET_SINCE_ID_ROTATION ile Tag::APPLICATION_ID ve Tag::APPLICATION_DATA dahildir. Anahtar oluşturma sırasında belirtilmişse son ikisi, anahtar blob'unun şifresini çözmek için gereklidir.
  • certChain, bir sertifika dizisi döndüren çıkış parametresidir. 0 numaralı giriş, doğrulama sertifikası olduğundan keyToAttest kaynağından gelen anahtarı doğrular ve doğrulama uzantısını içerir.

attestKey yöntemi, herhangi bir zamanda çağrılabileceği ve yetkilendirme kısıtlamalarını karşılaması gerekmediği için onaylanan anahtar üzerinde ortak anahtar işlemi olarak kabul edilir. Örneğin, doğrulanmış anahtarın kullanılması için kullanıcı kimlik doğrulamasının gerekli olduğu durumlarda, kullanıcı kimlik doğrulaması olmadan doğrulama oluşturulabilir.

Onay sertifikası

Onay sertifikası, onaylı anahtarın açıklamasını içeren isteğe bağlı bir onay uzantısı içeren standart bir X.509 sertifikasıdır. Sertifika, sertifikalı bir onay anahtarıyla imzalanmış olmalıdır. Onay anahtarı, onaylanan anahtardan farklı bir algoritma kullanabilir.

Onay sertifikası aşağıdaki tablodaki alanları içerir ve başka alan içeremez. Bazı alanlar sabit bir alan değeri belirtir. CTS testleri, sertifika içeriğinin tam olarak tanımlandığı şekilde olduğunu doğrular.

Sertifika SEQUENCE

Alan adı (bkz. RFC 5280) Değer
tbsCertificate TBSSertifika SEQUENCE
signatureAlgorithm Anahtarı imzalamak için kullanılan algoritmanın AlgorithmIdentifier değeri:
EC anahtarları için ECDSA, RSA anahtarları için RSA.
signatureValue BIT STRING, ASN.1 DER kodlu tbsCertificate üzerinde hesaplanan imza.

TBSCertificate SEQUENCE

Alan adı (bkz. RFC 5280) Değer
version INTEGER 2 (v3 sertifikası anlamına gelir)
serialNumber TAM SAYI 1 (sabit değer: tüm sertifikalarda aynıdır)
signature Anahtarı imzalamak için kullanılan algoritmanın AlgorithmIdentifier değeri: EC anahtarları için ECDSA, RSA anahtarları için RSA.
issuer Toplu sertifika anahtarının konu alanıyla aynı.
validity Tag::ACTIVE_DATETIME ve Tag::USAGE_EXPIRE_DATETIME değerlerini içeren iki tarihten oluşan SIRA. Bu değerler 1 Ocak 1970'den itibaren milisaniye cinsindendir. Sertifikalarda doğru tarih temsilleri için RFC 5280'e bakın.
Tag::ACTIVE_DATETIME mevcut değilse Tag::CREATION_DATETIME değerini kullanın. Tag::USAGE_EXPIRE_DATETIME yoksa toplu sertifika doğrulama anahtarı sertifikasının geçerlilik bitiş tarihini kullanın.
subject CN = "Android Anahtar Deposu Anahtarı" (sabit değer: tüm sertifikalarda aynıdır)
subjectPublicKeyInfo Onaylı ortak anahtarı içeren SubjectPublicKeyInfo.
extensions/Key Usage dijital imza: Anahtarın amacı KeyPurpose::SIGN veya KeyPurpose::VERIFY ise ayarlayın. Diğer tüm bitler ayarlanmamıştır.
extensions/CRL Distribution Points Değer HBD
extensions/"attestation" OID, 1.3.6.1.4.1.11129.2.1.17'dir; içerik, aşağıdaki Onay uzantısı bölümünde tanımlanmıştır. Tüm X.509 sertifika uzantılarında olduğu gibi, içerik de doğrulama SEQUENCE'sinin DER kodlamasını içeren bir OCTET_STRING olarak temsil edilir.

Onay uzantısı

attestation uzantısının OID'si 1.3.6.1.4.1.11129.2.1.17. Onaylanan anahtar çifti ve anahtar oluşturma sırasında cihazın durumu hakkında bilgi içerir.

AIDL arayüzü spesifikasyonunda tanımlanan Keymaster/KeyMint etiket türleri aşağıdaki gibi ASN.1 türlerine dönüştürülür:

Keymaster/KeyMint türü ASN.1 türü Notlar
ENUM INTEGER
ENUM_REP SET of INTEGER
UINT INTEGER
UINT_REP SET of INTEGER
ULONG INTEGER
ULONG_REP SET of INTEGER
DATE INTEGER 1 Ocak 1970 00:00:00 GMT'den itibaren milisaniye.
BOOL NULL Etiketin varlığı doğru, yokluğu yanlış anlamına gelir.
BIGNUM Bu türde etiket yok, bu nedenle eşleme tanımlanmadı.
BYTES OCTET_STRING

Şema

Onay uzantısı içeriği aşağıdaki ASN.1 şemasıyla açıklanır:

300 sürümü

KeyDescription ::= SEQUENCE {
    attestationVersion  300,
    attestationSecurityLevel  SecurityLevel,
    keyMintVersion  INTEGER,
    keyMintSecurityLevel  SecurityLevel,
    attestationChallenge  OCTET_STRING,
    uniqueId  OCTET_STRING,
    softwareEnforced  AuthorizationList,
    hardwareEnforced  AuthorizationList,
}

SecurityLevel ::= ENUMERATED {
    Software  (0),
    TrustedEnvironment  (1),
    StrongBox  (2),
}

AuthorizationList ::= SEQUENCE {
    purpose  [1] EXPLICIT SET OF INTEGER OPTIONAL,
    algorithm  [2] EXPLICIT INTEGER OPTIONAL,
    keySize  [3] EXPLICIT INTEGER OPTIONAL,
    digest  [5] EXPLICIT SET OF INTEGER OPTIONAL,
    padding  [6] EXPLICIT SET OF INTEGER OPTIONAL,
    ecCurve  [10] EXPLICIT INTEGER OPTIONAL,
    rsaPublicExponent  [200] EXPLICIT INTEGER OPTIONAL,
    mgfDigest  [203] EXPLICIT SET OF INTEGER OPTIONAL,
    rollbackResistance  [303] EXPLICIT NULL OPTIONAL,
    earlyBootOnly  [305] EXPLICIT NULL OPTIONAL,
    activeDateTime  [400] EXPLICIT INTEGER OPTIONAL,
    originationExpireDateTime  [401] EXPLICIT INTEGER OPTIONAL,
    usageExpireDateTime  [402] EXPLICIT INTEGER OPTIONAL,
    usageCountLimit  [405] EXPLICIT INTEGER OPTIONAL,
    noAuthRequired  [503] EXPLICIT NULL OPTIONAL,
    userAuthType  [504] EXPLICIT INTEGER OPTIONAL,
    authTimeout  [505] EXPLICIT INTEGER OPTIONAL,
    allowWhileOnBody  [506] EXPLICIT NULL OPTIONAL,
    trustedUserPresenceRequired  [507] EXPLICIT NULL OPTIONAL,
    trustedConfirmationRequired  [508] EXPLICIT NULL OPTIONAL,
    unlockedDeviceRequired  [509] EXPLICIT NULL OPTIONAL,
    creationDateTime  [701] EXPLICIT INTEGER OPTIONAL,
    origin  [702] EXPLICIT INTEGER OPTIONAL,
    rootOfTrust  [704] EXPLICIT RootOfTrust OPTIONAL,
    osVersion  [705] EXPLICIT INTEGER OPTIONAL,
    osPatchLevel  [706] EXPLICIT INTEGER OPTIONAL,
    attestationApplicationId  [709] EXPLICIT OCTET_STRING OPTIONAL,
    attestationIdBrand  [710] EXPLICIT OCTET_STRING OPTIONAL,
    attestationIdDevice  [711] EXPLICIT OCTET_STRING OPTIONAL,
    attestationIdProduct  [712] EXPLICIT OCTET_STRING OPTIONAL,
    attestationIdSerial  [713] EXPLICIT OCTET_STRING OPTIONAL,
    attestationIdImei  [714] EXPLICIT OCTET_STRING OPTIONAL,
    attestationIdMeid  [715] EXPLICIT OCTET_STRING OPTIONAL,
    attestationIdManufacturer  [716] EXPLICIT OCTET_STRING OPTIONAL,
    attestationIdModel  [717] EXPLICIT OCTET_STRING OPTIONAL,
    vendorPatchLevel  [718] EXPLICIT INTEGER OPTIONAL,
    bootPatchLevel  [719] EXPLICIT INTEGER OPTIONAL,
    deviceUniqueAttestation  [720] EXPLICIT NULL OPTIONAL,
    attestationIdSecondImei  [723] EXPLICIT OCTET_STRING OPTIONAL,
}

RootOfTrust ::= SEQUENCE {
    verifiedBootKey  OCTET_STRING,
    deviceLocked  BOOLEAN,
    verifiedBootState  VerifiedBootState,
    verifiedBootHash OCTET_STRING,
}

VerifiedBootState ::= ENUMERATED {
    Verified  (0),
    SelfSigned  (1),
    Unverified  (2),
    Failed  (3),
}

200 sürümü

KeyDescription ::= SEQUENCE {
    attestationVersion  200,
    attestationSecurityLevel  SecurityLevel,
    keyMintVersion  INTEGER,
    keyMintSecurityLevel  SecurityLevel,
    attestationChallenge  OCTET_STRING,
    uniqueId  OCTET_STRING,
    softwareEnforced  AuthorizationList,
    hardwareEnforced  AuthorizationList,
}

SecurityLevel ::= ENUMERATED {
    Software  (0),
    TrustedEnvironment  (1),
    StrongBox  (2),
}

AuthorizationList ::= SEQUENCE {
    purpose  [1] EXPLICIT SET OF INTEGER OPTIONAL,
    algorithm  [2] EXPLICIT INTEGER OPTIONAL,
    keySize  [3] EXPLICIT INTEGER OPTIONAL,
    digest  [5] EXPLICIT SET OF INTEGER OPTIONAL,
    padding  [6] EXPLICIT SET OF INTEGER OPTIONAL,
    ecCurve  [10] EXPLICIT INTEGER OPTIONAL,
    rsaPublicExponent  [200] EXPLICIT INTEGER OPTIONAL,
    mgfDigest  [203] EXPLICIT SET OF INTEGER OPTIONAL,
    rollbackResistance  [303] EXPLICIT NULL OPTIONAL,
    earlyBootOnly  [305] EXPLICIT NULL OPTIONAL,
    activeDateTime  [400] EXPLICIT INTEGER OPTIONAL,
    originationExpireDateTime  [401] EXPLICIT INTEGER OPTIONAL,
    usageExpireDateTime  [402] EXPLICIT INTEGER OPTIONAL,
    usageCountLimit  [405] EXPLICIT INTEGER OPTIONAL,
    noAuthRequired  [503] EXPLICIT NULL OPTIONAL,
    userAuthType  [504] EXPLICIT INTEGER OPTIONAL,
    authTimeout  [505] EXPLICIT INTEGER OPTIONAL,
    allowWhileOnBody  [506] EXPLICIT NULL OPTIONAL,
    trustedUserPresenceRequired  [507] EXPLICIT NULL OPTIONAL,
    trustedConfirmationRequired  [508] EXPLICIT NULL OPTIONAL,
    unlockedDeviceRequired  [509] EXPLICIT NULL OPTIONAL,
    creationDateTime  [701] EXPLICIT INTEGER OPTIONAL,
    origin  [702] EXPLICIT INTEGER OPTIONAL,
    rootOfTrust  [704] EXPLICIT RootOfTrust OPTIONAL,
    osVersion  [705] EXPLICIT INTEGER OPTIONAL,
    osPatchLevel  [706] EXPLICIT INTEGER OPTIONAL,
    attestationApplicationId  [709] EXPLICIT OCTET_STRING OPTIONAL,
    attestationIdBrand  [710] EXPLICIT OCTET_STRING OPTIONAL,
    attestationIdDevice  [711] EXPLICIT OCTET_STRING OPTIONAL,
    attestationIdProduct  [712] EXPLICIT OCTET_STRING OPTIONAL,
    attestationIdSerial  [713] EXPLICIT OCTET_STRING OPTIONAL,
    attestationIdImei  [714] EXPLICIT OCTET_STRING OPTIONAL,
    attestationIdMeid  [715] EXPLICIT OCTET_STRING OPTIONAL,
    attestationIdManufacturer  [716] EXPLICIT OCTET_STRING OPTIONAL,
    attestationIdModel  [717] EXPLICIT OCTET_STRING OPTIONAL,
    vendorPatchLevel  [718] EXPLICIT INTEGER OPTIONAL,
    bootPatchLevel  [719] EXPLICIT INTEGER OPTIONAL,
    deviceUniqueAttestation  [720] EXPLICIT NULL OPTIONAL,
}

RootOfTrust ::= SEQUENCE {
    verifiedBootKey  OCTET_STRING,
    deviceLocked  BOOLEAN,
    verifiedBootState  VerifiedBootState,
    verifiedBootHash OCTET_STRING,
}

VerifiedBootState ::= ENUMERATED {
    Verified  (0),
    SelfSigned  (1),
    Unverified  (2),
    Failed  (3),
}

100 sürümü

KeyDescription ::= SEQUENCE {
    attestationVersion  100,
    attestationSecurityLevel  SecurityLevel,
    keyMintVersion  INTEGER,
    keyMintSecurityLevel  SecurityLevel,
    attestationChallenge  OCTET_STRING,
    uniqueId  OCTET_STRING,
    softwareEnforced  AuthorizationList,
    hardwareEnforced  AuthorizationList,
}

SecurityLevel ::= ENUMERATED {
    Software  (0),
    TrustedEnvironment  (1),
    StrongBox  (2),
}

AuthorizationList ::= SEQUENCE {
    purpose  [1] EXPLICIT SET OF INTEGER OPTIONAL,
    algorithm  [2] EXPLICIT INTEGER OPTIONAL,
    keySize  [3] EXPLICIT INTEGER OPTIONAL,
    digest  [5] EXPLICIT SET OF INTEGER OPTIONAL,
    padding  [6] EXPLICIT SET OF INTEGER OPTIONAL,
    ecCurve  [10] EXPLICIT INTEGER OPTIONAL,
    rsaPublicExponent  [200] EXPLICIT INTEGER OPTIONAL,
    mgfDigest  [203] EXPLICIT SET OF INTEGER OPTIONAL,
    rollbackResistance  [303] EXPLICIT NULL OPTIONAL,
    earlyBootOnly  [305] EXPLICIT NULL OPTIONAL,
    activeDateTime  [400] EXPLICIT INTEGER OPTIONAL,
    originationExpireDateTime  [401] EXPLICIT INTEGER OPTIONAL,
    usageExpireDateTime  [402] EXPLICIT INTEGER OPTIONAL,
    usageCountLimit  [405] EXPLICIT INTEGER OPTIONAL,
    noAuthRequired  [503] EXPLICIT NULL OPTIONAL,
    userAuthType  [504] EXPLICIT INTEGER OPTIONAL,
    authTimeout  [505] EXPLICIT INTEGER OPTIONAL,
    allowWhileOnBody  [506] EXPLICIT NULL OPTIONAL,
    trustedUserPresenceRequired  [507] EXPLICIT NULL OPTIONAL,
    trustedConfirmationRequired  [508] EXPLICIT NULL OPTIONAL,
    unlockedDeviceRequired  [509] EXPLICIT NULL OPTIONAL,
    creationDateTime  [701] EXPLICIT INTEGER OPTIONAL,
    origin  [702] EXPLICIT INTEGER OPTIONAL,
    rootOfTrust  [704] EXPLICIT RootOfTrust OPTIONAL,
    osVersion  [705] EXPLICIT INTEGER OPTIONAL,
    osPatchLevel  [706] EXPLICIT INTEGER OPTIONAL,
    attestationApplicationId  [709] EXPLICIT OCTET_STRING OPTIONAL,
    attestationIdBrand  [710] EXPLICIT OCTET_STRING OPTIONAL,
    attestationIdDevice  [711] EXPLICIT OCTET_STRING OPTIONAL,
    attestationIdProduct  [712] EXPLICIT OCTET_STRING OPTIONAL,
    attestationIdSerial  [713] EXPLICIT OCTET_STRING OPTIONAL,
    attestationIdImei  [714] EXPLICIT OCTET_STRING OPTIONAL,
    attestationIdMeid  [715] EXPLICIT OCTET_STRING OPTIONAL,
    attestationIdManufacturer  [716] EXPLICIT OCTET_STRING OPTIONAL,
    attestationIdModel  [717] EXPLICIT OCTET_STRING OPTIONAL,
    vendorPatchLevel  [718] EXPLICIT INTEGER OPTIONAL,
    bootPatchLevel  [719] EXPLICIT INTEGER OPTIONAL,
    deviceUniqueAttestation  [720] EXPLICIT NULL OPTIONAL,
}

RootOfTrust ::= SEQUENCE {
    verifiedBootKey  OCTET_STRING,
    deviceLocked  BOOLEAN,
    verifiedBootState  VerifiedBootState,
    verifiedBootHash OCTET_STRING,
}

VerifiedBootState ::= ENUMERATED {
    Verified  (0),
    SelfSigned  (1),
    Unverified  (2),
    Failed  (3),
}

Sürüm 4

KeyDescription ::= SEQUENCE {
    attestationVersion  4,
    attestationSecurityLevel  SecurityLevel,
    keymasterVersion  INTEGER,
    keymasterSecurityLevel  SecurityLevel,
    attestationChallenge  OCTET_STRING,
    uniqueId  OCTET_STRING,
    softwareEnforced  AuthorizationList,
    hardwareEnforced  AuthorizationList,
}

SecurityLevel ::= ENUMERATED {
    Software  (0),
    TrustedEnvironment  (1),
    StrongBox  (2),
}

AuthorizationList ::= SEQUENCE {
    purpose  [1] EXPLICIT SET OF INTEGER OPTIONAL,
    algorithm  [2] EXPLICIT INTEGER OPTIONAL,
    keySize  [3] EXPLICIT INTEGER OPTIONAL,
    digest  [5] EXPLICIT SET OF INTEGER OPTIONAL,
    padding  [6] EXPLICIT SET OF INTEGER OPTIONAL,
    ecCurve  [10] EXPLICIT INTEGER OPTIONAL,
    rsaPublicExponent  [200] EXPLICIT INTEGER OPTIONAL,
    rollbackResistance  [303] EXPLICIT NULL OPTIONAL,
    earlyBootOnly  [305] EXPLICIT NULL OPTIONAL,
    activeDateTime  [400] EXPLICIT INTEGER OPTIONAL,
    originationExpireDateTime  [401] EXPLICIT INTEGER OPTIONAL,
    usageExpireDateTime  [402] EXPLICIT INTEGER OPTIONAL,
    noAuthRequired  [503] EXPLICIT NULL OPTIONAL,
    userAuthType  [504] EXPLICIT INTEGER OPTIONAL,
    authTimeout  [505] EXPLICIT INTEGER OPTIONAL,
    allowWhileOnBody  [506] EXPLICIT NULL OPTIONAL,
    trustedUserPresenceRequired  [507] EXPLICIT NULL OPTIONAL,
    trustedConfirmationRequired  [508] EXPLICIT NULL OPTIONAL,
    unlockedDeviceRequired  [509] EXPLICIT NULL OPTIONAL,
    allApplications  [600] EXPLICIT NULL OPTIONAL,
    creationDateTime  [701] EXPLICIT INTEGER OPTIONAL,
    origin  [702] EXPLICIT INTEGER OPTIONAL,
    rootOfTrust  [704] EXPLICIT RootOfTrust OPTIONAL,
    osVersion  [705] EXPLICIT INTEGER OPTIONAL,
    osPatchLevel  [706] EXPLICIT INTEGER OPTIONAL,
    attestationApplicationId  [709] EXPLICIT OCTET_STRING OPTIONAL,
    attestationIdBrand  [710] EXPLICIT OCTET_STRING OPTIONAL,
    attestationIdDevice  [711] EXPLICIT OCTET_STRING OPTIONAL,
    attestationIdProduct  [712] EXPLICIT OCTET_STRING OPTIONAL,
    attestationIdSerial  [713] EXPLICIT OCTET_STRING OPTIONAL,
    attestationIdImei  [714] EXPLICIT OCTET_STRING OPTIONAL,
    attestationIdMeid  [715] EXPLICIT OCTET_STRING OPTIONAL,
    attestationIdManufacturer  [716] EXPLICIT OCTET_STRING OPTIONAL,
    attestationIdModel  [717] EXPLICIT OCTET_STRING OPTIONAL,
    vendorPatchLevel  [718] EXPLICIT INTEGER OPTIONAL,
    bootPatchLevel  [719] EXPLICIT INTEGER OPTIONAL,
    deviceUniqueAttestation  [720] EXPLICIT NULL OPTIONAL,
}

RootOfTrust ::= SEQUENCE {
    verifiedBootKey  OCTET_STRING,
    deviceLocked  BOOLEAN,
    verifiedBootState  VerifiedBootState,
    verifiedBootHash OCTET_STRING,
}

VerifiedBootState ::= ENUMERATED {
    Verified  (0),
    SelfSigned  (1),
    Unverified  (2),
    Failed  (3),
}

Sürüm 3

KeyDescription ::= SEQUENCE {
    attestationVersion  3,
    attestationSecurityLevel  SecurityLevel,
    keymasterVersion  INTEGER,
    keymasterSecurityLevel  SecurityLevel,
    attestationChallenge  OCTET_STRING,
    uniqueId  OCTET_STRING,
    softwareEnforced  AuthorizationList,
    hardwareEnforced  AuthorizationList,
}

SecurityLevel ::= ENUMERATED {
    Software  (0),
    TrustedEnvironment  (1),
    StrongBox  (2),
}

AuthorizationList ::= SEQUENCE {
    purpose  [1] EXPLICIT SET OF INTEGER OPTIONAL,
    algorithm  [2] EXPLICIT INTEGER OPTIONAL,
    keySize  [3] EXPLICIT INTEGER OPTIONAL,
    digest  [5] EXPLICIT SET OF INTEGER OPTIONAL,
    padding  [6] EXPLICIT SET OF INTEGER OPTIONAL,
    ecCurve  [10] EXPLICIT INTEGER OPTIONAL,
    rsaPublicExponent  [200] EXPLICIT INTEGER OPTIONAL,
    rollbackResistance  [303] EXPLICIT NULL OPTIONAL,
    activeDateTime  [400] EXPLICIT INTEGER OPTIONAL,
    originationExpireDateTime  [401] EXPLICIT INTEGER OPTIONAL,
    usageExpireDateTime  [402] EXPLICIT INTEGER OPTIONAL,
    noAuthRequired  [503] EXPLICIT NULL OPTIONAL,
    userAuthType  [504] EXPLICIT INTEGER OPTIONAL,
    authTimeout  [505] EXPLICIT INTEGER OPTIONAL,
    allowWhileOnBody  [506] EXPLICIT NULL OPTIONAL,
    trustedUserPresenceRequired  [507] EXPLICIT NULL OPTIONAL,
    trustedConfirmationRequired  [508] EXPLICIT NULL OPTIONAL,
    unlockedDeviceRequired  [509] EXPLICIT NULL OPTIONAL,
    allApplications  [600] EXPLICIT NULL OPTIONAL,
    creationDateTime  [701] EXPLICIT INTEGER OPTIONAL,
    origin  [702] EXPLICIT INTEGER OPTIONAL,
    rootOfTrust  [704] EXPLICIT RootOfTrust OPTIONAL,
    osVersion  [705] EXPLICIT INTEGER OPTIONAL,
    osPatchLevel  [706] EXPLICIT INTEGER OPTIONAL,
    attestationApplicationId  [709] EXPLICIT OCTET_STRING OPTIONAL,
    attestationIdBrand  [710] EXPLICIT OCTET_STRING OPTIONAL,
    attestationIdDevice  [711] EXPLICIT OCTET_STRING OPTIONAL,
    attestationIdProduct  [712] EXPLICIT OCTET_STRING OPTIONAL,
    attestationIdSerial  [713] EXPLICIT OCTET_STRING OPTIONAL,
    attestationIdImei  [714] EXPLICIT OCTET_STRING OPTIONAL,
    attestationIdMeid  [715] EXPLICIT OCTET_STRING OPTIONAL,
    attestationIdManufacturer  [716] EXPLICIT OCTET_STRING OPTIONAL,
    attestationIdModel  [717] EXPLICIT OCTET_STRING OPTIONAL,
    vendorPatchLevel  [718] EXPLICIT INTEGER OPTIONAL,
    bootPatchLevel  [719] EXPLICIT INTEGER OPTIONAL,
}

RootOfTrust ::= SEQUENCE {
    verifiedBootKey  OCTET_STRING,
    deviceLocked  BOOLEAN,
    verifiedBootState  VerifiedBootState,
    verifiedBootHash OCTET_STRING,
}

VerifiedBootState ::= ENUMERATED {
    Verified  (0),
    SelfSigned  (1),
    Unverified  (2),
    Failed  (3),
}

Sürüm 2

KeyDescription ::= SEQUENCE {
    attestationVersion  2,
    attestationSecurityLevel  SecurityLevel,
    keymasterVersion  INTEGER,
    keymasterSecurityLevel  SecurityLevel,
    attestationChallenge  OCTET_STRING,
    uniqueId  OCTET_STRING,
    softwareEnforced  AuthorizationList,
    hardwareEnforced  AuthorizationList,
}

SecurityLevel ::= ENUMERATED {
    Software  (0),
    TrustedEnvironment  (1),
}

AuthorizationList ::= SEQUENCE {
    purpose  [1] EXPLICIT SET OF INTEGER OPTIONAL,
    algorithm  [2] EXPLICIT INTEGER OPTIONAL,
    keySize  [3] EXPLICIT INTEGER OPTIONAL,
    digest  [5] EXPLICIT SET OF INTEGER OPTIONAL,
    padding  [6] EXPLICIT SET OF INTEGER OPTIONAL,
    ecCurve  [10] EXPLICIT INTEGER OPTIONAL,
    rsaPublicExponent  [200] EXPLICIT INTEGER OPTIONAL,
    activeDateTime  [400] EXPLICIT INTEGER OPTIONAL,
    originationExpireDateTime  [401] EXPLICIT INTEGER OPTIONAL,
    usageExpireDateTime  [402] EXPLICIT INTEGER OPTIONAL,
    noAuthRequired  [503] EXPLICIT NULL OPTIONAL,
    userAuthType  [504] EXPLICIT INTEGER OPTIONAL,
    authTimeout  [505] EXPLICIT INTEGER OPTIONAL,
    allowWhileOnBody  [506] EXPLICIT NULL OPTIONAL,
    allApplications  [600] EXPLICIT NULL OPTIONAL,
    creationDateTime  [701] EXPLICIT INTEGER OPTIONAL,
    origin  [702] EXPLICIT INTEGER OPTIONAL,
    rollbackResistant  [703] EXPLICIT NULL OPTIONAL,
    rootOfTrust  [704] EXPLICIT RootOfTrust OPTIONAL,
    osVersion  [705] EXPLICIT INTEGER OPTIONAL,
    osPatchLevel  [706] EXPLICIT INTEGER OPTIONAL,
    attestationApplicationId  [709] EXPLICIT OCTET_STRING OPTIONAL,
    attestationIdBrand  [710] EXPLICIT OCTET_STRING OPTIONAL,
    attestationIdDevice  [711] EXPLICIT OCTET_STRING OPTIONAL,
    attestationIdProduct  [712] EXPLICIT OCTET_STRING OPTIONAL,
    attestationIdSerial  [713] EXPLICIT OCTET_STRING OPTIONAL,
    attestationIdImei  [714] EXPLICIT OCTET_STRING OPTIONAL,
    attestationIdMeid  [715] EXPLICIT OCTET_STRING OPTIONAL,
    attestationIdManufacturer  [716] EXPLICIT OCTET_STRING OPTIONAL,
    attestationIdModel  [717] EXPLICIT OCTET_STRING OPTIONAL,
}

RootOfTrust ::= SEQUENCE {
    verifiedBootKey  OCTET_STRING,
    deviceLocked  BOOLEAN,
    verifiedBootState  VerifiedBootState,
}

VerifiedBootState ::= ENUMERATED {
    Verified  (0),
    SelfSigned  (1),
    Unverified  (2),
    Failed  (3),
}

Sürüm 1

KeyDescription ::= SEQUENCE {
    attestationVersion  1,
    attestationSecurityLevel  SecurityLevel,
    keymasterVersion  INTEGER,
    keymasterSecurityLevel  SecurityLevel,
    attestationChallenge  OCTET_STRING,
    uniqueId  OCTET_STRING,
    softwareEnforced  AuthorizationList,
    hardwareEnforced  AuthorizationList,
}

SecurityLevel ::= ENUMERATED {
    Software  (0),
    TrustedEnvironment  (1),
}

AuthorizationList ::= SEQUENCE {
    purpose  [1] EXPLICIT SET OF INTEGER OPTIONAL,
    algorithm  [2] EXPLICIT INTEGER OPTIONAL,
    keySize  [3] EXPLICIT INTEGER OPTIONAL,
    digest  [5] EXPLICIT SET OF INTEGER OPTIONAL,
    padding  [6] EXPLICIT SET OF INTEGER OPTIONAL,
    ecCurve  [10] EXPLICIT INTEGER OPTIONAL,
    rsaPublicExponent  [200] EXPLICIT INTEGER OPTIONAL,
    activeDateTime  [400] EXPLICIT INTEGER OPTIONAL,
    originationExpireDateTime  [401] EXPLICIT INTEGER OPTIONAL,
    usageExpireDateTime  [402] EXPLICIT INTEGER OPTIONAL,
    noAuthRequired  [503] EXPLICIT NULL OPTIONAL,
    userAuthType  [504] EXPLICIT INTEGER OPTIONAL,
    authTimeout  [505] EXPLICIT INTEGER OPTIONAL,
    allowWhileOnBody  [506] EXPLICIT NULL OPTIONAL,
    allApplications  [600] EXPLICIT NULL OPTIONAL,
    creationDateTime  [701] EXPLICIT INTEGER OPTIONAL,
    origin  [702] EXPLICIT INTEGER OPTIONAL,
    rollbackResistant  [703] EXPLICIT NULL OPTIONAL,
    rootOfTrust  [704] EXPLICIT RootOfTrust OPTIONAL,
    osVersion  [705] EXPLICIT INTEGER OPTIONAL,
    osPatchLevel  [706] EXPLICIT INTEGER OPTIONAL,
}

RootOfTrust ::= SEQUENCE {
    verifiedBootKey  OCTET_STRING,
    deviceLocked  BOOLEAN,
    verifiedBootState  VerifiedBootState,
}

VerifiedBootState ::= ENUMERATED {
    Verified  (0),
    SelfSigned  (1),
    Unverified  (2),
    Failed  (3),
}

KeyDescription alanları

attestationVersion
ASN.1 şema sürümü.
DeğerKeymaster/KeyMint sürümü
1Keymaster sürümü 2.0
2Keymaster sürümü 3.0
3Keymaster sürümü 4.0
4Keymaster sürümü 4.1
100KeyMint 1.0 sürümü
200KeyMint sürüm 2.0
300KeyMint 3.0 sürümü
attestationSecurityLevel

Onaylı anahtarın depolandığı konumun güvenlik düzeyi.

keymasterVersion/keyMintVersion
Keymaster/KeyMint donanım soyutlama katmanı (HAL) uygulamasının sürümü.
DeğerKeymaster/KeyMint sürümü
2Keymaster 2.0 sürümü
3Keymaster sürümü 3.0
4Keymaster sürümü 4.0
41Keymaster 4.1 sürümü
100KeyMint 1.0 sürümü
200KeyMint sürüm 2.0
300KeyMint sürüm 3.0
keymasterSecurityLevel/keyMintSecurityLevel
Keymaster/KeyMint uygulamasının güvenlik düzeyi.
attestationChallenge
Anahtar oluşturma sırasında sağlanan zorluk.
uniqueId
Sistem uygulamalarının anahtar oluşturma sırasında isteyebileceği, gizlilik açısından hassas bir cihaz tanımlayıcısı. Benzersiz kimlik istenmezse bu alan boş bırakılır. Ayrıntılar için Benzersiz kimlik bölümüne bakın.
softwareEnforced
Android sistemi tarafından zorunlu kılınan Keymaster/KeyMint yetkilendirme listesi. Bu bilgiler platformdaki kod tarafından toplanır veya oluşturulur ve cihazın sistem bölümünde depolanır. Cihaz, Android Platform Güvenlik Modeli'ne uygun bir işletim sistemi çalıştırdığı sürece (yani cihazın bootloader'ı kilitli ve verifiedBootState Verified olduğu sürece) güvenilirdir.
hardwareEnforced
Cihazın Güvenilir Yürütme Ortamı (TEE) veya StrongBox tarafından zorunlu kılınan Keymaster/KeyMint yetkilendirme listesi. Bu bilgiler, güvenli donanımdaki kod tarafından toplanır veya oluşturulur ve platform tarafından kontrol edilmez. Örneğin, bilgiler bootloader'dan veya platforma güvenmeyi gerektirmeyen güvenli bir iletişim kanalı üzerinden gelebilir.

SecurityLevel değerleri

SecurityLevel değeri, Anahtar Deposu ile ilişkili bir öğenin (örneğin, anahtar çifti ve onay) saldırıya ne kadar dirençli olduğunu gösterir.

Değer Anlamı
Software Cihazın Android sistemi Android Platform Güvenlik Modeli'ne uygun olduğu sürece güvenlidir (yani cihazın bootloader'ı kilitliyse ve verifiedBootState Verified ise).
TrustedEnvironment Güvenilir Yürütme Ortamı (TEE) güvenliği ihlal edilmediği sürece güvenlidir. TEE'ler için izolasyon koşulları, Android Uyumluluk Tanımlama Belgesi'nin 9.11 [C-1-1] ila [C-1-4]bölümleri TEE'ler uzaktan saldırılara karşı yüksek, doğrudan donanım saldırılarına karşı ise orta düzeyde dirençlidir.
StrongBox StrongBox'un güvenliği ihlal edilmediği sürece güvenlidir. StrongBox, donanım güvenlik modülüne benzer bir güvenli unsurda uygulanır. StrongBox uygulama gereksinimleri, Android Uyumluluk Tanımlama Belgesi'nin 9.11.2 bölümünde tanımlanmıştır. StrongBox, uzaktan saldırıya ve doğrudan donanım saldırısı (ör. fiziksel müdahale ve yan kanal saldırıları) yoluyla saldırıya karşı son derece dayanıklıdır.

AuthorizationList alanları

Her alan, AIDL arayüz spesifikasyonundaki bir Keymaster/KeyMint yetkilendirme etiketine karşılık gelir. Spesifikasyon, yetkilendirme etiketleriyle ilgili doğru bilgi kaynağıdır: Anlamları, içeriklerinin biçimi, KeyDescription nesnesinde softwareEnforced veya hardwareEnforced alanlarında görünmeleri beklenip beklenmediği, diğer etiketlerle birbirini hariç tutup tutmadığı vb. Tüm AuthorizationList alanları isteğe bağlıdır.

Her alanın, Keymaster/KeyMint etiket numarasına eşit bir EXPLICIT bağlama özgü etiketi vardır. Bu etiket, AuthorizationList'daki verilerin daha kompakt bir şekilde gösterilmesini sağlar. Bu nedenle ASN.1 ayrıştırıcısı, her bağlama özgü etiket için beklenen veri türünü bilmelidir. Örneğin, Tag::USER_AUTH_TYPE ENUM | 504 olarak tanımlanır. Onay uzantısı şemasında, AuthorizationList içindeki purpose alanı userAuthType [504] EXPLICIT INTEGER OPTIONAL olarak belirtilir. Bu nedenle, ASN.1 kodlaması, ASN.1 türü INTEGER için UNIVERSAL sınıf etiketi yerine bağlama özgü etiket 504 (10) içerir.

purpose
Etiket kimliği değeri 1 olan Tag::PURPOSE yetkilendirme etiketine karşılık gelir.
algorithm

2 değerine sahip bir etiket kimliği kullanan Tag::ALGORITHM yetkilendirme etiketine karşılık gelir.

Bir doğrulama AuthorizationList nesnesinde algoritma değeri her zaman RSA veya EC olur.

keySize
3 değerine sahip bir etiket kimliği kullanan Tag::KEY_SIZE yetkilendirme etiketine karşılık gelir.
digest
5 kimlik değeri kullanan Tag::DIGEST yetkilendirme etiketine karşılık gelir.
padding
Tag::PADDING yetkilendirme etiketine karşılık gelir. Bu etiket, 6 değerine sahip bir etiket kimliği kullanır.
ecCurve

10 değerini kullanan Tag::EC_CURVE yetkilendirme etiketine karşılık gelir.

Android sistem anahtar deposunda imzalama ve doğrulama için ECDSA kullanan bir eliptik eğri (EC) anahtar çifti oluşturmak için kullanılan parametre grubu.

rsaPublicExponent
Etiket kimliği değeri 200 olan Tag::RSA_PUBLIC_EXPONENT yetkilendirme etiketine karşılık gelir.
mgfDigest

Yalnızca anahtar onayı sürümü >= 100'de mevcut.

203 kimlikli etiket değerini kullanan Tag::RSA_OAEP_MGF_DIGEST KeyMint
rollbackResistance

Yalnızca anahtar onay sürümü >= 3'te mevcut.

303 kimlik değerini kullanan Tag::ROLLBACK_RESISTANCE yetkilendirme etiketine karşılık gelir.

earlyBootOnly

Yalnızca anahtar onay sürümü >= 4'te mevcut.

305 etiket kimliği değerini kullanan Tag::EARLY_BOOT_ONLY yetkilendirme etiketine karşılık gelir.

activeDateTime
400 değerinde bir etiket kimliği kullanan Tag::ACTIVE_DATETIME yetkilendirme etiketine karşılık gelir.
originationExpireDateTime
401 kimlikli etiket değerini kullanan Tag::ORIGINATION_EXPIRE_DATETIME Keymaster yetkilendirme etiketine karşılık gelir.
usageExpireDateTime
402 etiket kimliği değerini kullanan Tag::USAGE_EXPIRE_DATETIME yetkilendirme etiketine karşılık gelir.
usageCountLimit
405 etiket kimliği değerini kullanan Tag::USAGE_COUNT_LIMIT yetkilendirme etiketine karşılık gelir.
noAuthRequired

503 etiket kimliği değerini kullanan Tag::NO_AUTH_REQUIRED yetkilendirme etiketine karşılık gelir.

userAuthType
Etiket kimliği değeri 504 olan Tag::USER_AUTH_TYPE yetkilendirme etiketine karşılık gelir.
authTimeout
505 etiket kimliği değerini kullanan Tag::AUTH_TIMEOUT yetkilendirme etiketine karşılık gelir.
allowWhileOnBody

Etiket kimliği değeri 506 olan Tag::ALLOW_WHILE_ON_BODY yetkilendirme etiketine karşılık gelir.

Kullanıcı cihazı hâlâ üzerinde taşıyorsa kimlik doğrulama zaman aşımı süresinden sonra anahtarın kullanılmasına izin verir. Cihazın kullanıcının üzerinde takılı olup olmadığını güvenli bir vücut üzerinde sensörün belirlediğini unutmayın.

trustedUserPresenceRequired

Yalnızca anahtar doğrulama sürümünün 3 veya sonraki sürümlerinde bulunur.

507 değerinde bir etiket kimliği kullanan Tag::TRUSTED_USER_PRESENCE_REQUIRED izin etiketine karşılık gelir.

Bu anahtarın yalnızca kullanıcı fiziksel olarak orada olduğunu kanıtlamışsa kullanılabileceğini belirtir. Aşağıda konuyla ilgili olarak bazı örnekler verilmiştir:

  • StrongBox anahtarı için StrongBox cihazındaki bir pime kabloyla bağlı donanım düğmesi.
  • TEE anahtarı için parmak izi kimlik doğrulaması, TEE'nin tarayıcı üzerinde özel kontrole sahip olduğu ve parmak izi eşleştirme işlemini gerçekleştirdiği sürece varlığın kanıtını sağlar.
trustedConfirmationRequired

Yalnızca anahtar onay sürümü >= 3'te mevcut.

508 kimlikli bir etiket değeri kullanan Tag::TRUSTED_CONFIRMATION_REQUIRED izin etiketine karşılık gelir.

Anahtarın yalnızca kullanıcının onay jetonu kullanarak imzalanmak istenen verileri onayladığında kullanılabileceğini belirtir. Kullanıcı onayı alma hakkında daha fazla bilgi için Android Korumalı Onayı bölümüne göz atın.

Not: Bu etiket yalnızca SIGN amacını kullanan anahtarlar için geçerlidir.

unlockedDeviceRequired

Yalnızca anahtar doğrulama sürümünün 3 veya sonraki sürümlerinde bulunur.

509 etiket kimliği değerini kullanan Tag::UNLOCKED_DEVICE_REQUIRED yetkilendirme etiketine karşılık gelir.

allApplications

600 değerinde bir etiket kimliği kullanan Tag::ALL_APPLICATIONS yetkilendirme etiketine karşılık gelir.

Bir cihazdaki tüm uygulamaların anahtar çiftine erişip erişemeyeceğini belirtir.

applicationId
601 kimlikli etiket kullanan Tag::APPLICATION_ID yetkilendirme etiketine karşılık gelir.
creationDateTime
701 etiket kimliği değerini kullanan Tag::CREATION_DATETIME yetkilendirme etiketine karşılık gelir.
origin

702 kimlik değerini kullanan Tag::ORIGIN yetkilendirme etiketine karşılık gelir.

rollbackResistant

Yalnızca 1 ve 2 numaralı anahtar onayı sürümlerinde bulunur.

703 kimlik değerini kullanan Tag::ROLLBACK_RESISTANT yetkilendirme etiketine karşılık gelir.

rootOfTrust

704 etiket kimliği değerini kullanan Tag::ROOT_OF_TRUST yetkilendirme etiketine karşılık gelir.

Daha fazla bilgi için RootOfTrust veri yapısını açıklayan bölüme bakın.

osVersion

705 kimlikli etiket değerini kullanan Tag::OS_VERSION yetkilendirme etiketine karşılık gelir.

Keymaster ile ilişkili Android işletim sisteminin sürümü. Altı haneli bir tam sayı olarak belirtilir. Örneğin, 8.1.0 sürümü 080100 olarak temsil edilir.

Yalnızca Keymaster 1.0 veya sonraki sürümler bu değeri yetkilendirme listesine dahil eder.

osPatchLevel

Etiket kimliği değeri 706 olan Tag::PATCHLEVEL yetkilendirme etiketine karşılık gelir.

Keymaster'da kullanılan güvenlik yamasıyla ilişkili ay ve yıl, altı haneli bir tam sayı olarak belirtilir. Örneğin, Ağustos 2018 yaması 201808 olarak temsil edilir.

Yetkilendirme listesinde bu değeri yalnızca Keymaster sürüm 1.0 veya sonraki sürümler bulunur.

attestationApplicationId

Yalnızca 2 ve üzeri anahtar doğrulama sürümlerinde bulunur.

709 kimlikli etiket değerini kullanan Tag::ATTESTATION_APPLICATION_ID Keymaster yetkilendirme etiketine karşılık gelir.

Daha fazla bilgi için AttestationApplicationId veri yapısını açıklayan bölüme bakın.

attestationIdBrand

Yalnızca anahtar onay sürümleri >= 2'de mevcut.

710 kimlik değerini kullanan Tag::ATTESTATION_ID_BRAND Keymaster etiketine karşılık gelir.

attestationIdDevice

Yalnızca 2 ve üzeri anahtar doğrulama sürümlerinde bulunur.

Etiket kimliği değeri 711 olan Tag::ATTESTATION_ID_DEVICE Keymaster etiketine karşılık gelir.

attestationIdProduct

Yalnızca 2 ve üzeri anahtar doğrulama sürümlerinde bulunur.

712 kimlik değerini kullanan Tag::ATTESTATION_ID_PRODUCT Keymaster etiketine karşılık gelir.

attestationIdSerial

Yalnızca anahtar onay sürümleri >= 2'de mevcut.

713 kimlik değerini kullanan Tag::ATTESTATION_ID_SERIAL Keymaster etiketine karşılık gelir.

attestationIdImei

Yalnızca anahtar onay sürümleri >= 2'de mevcut.

714 etiket kimliği değerini kullanan Tag::ATTESTATION_ID_IMEI yetkilendirme etiketine karşılık gelir.

attestationIdMeid

Yalnızca 2 ve üzeri anahtar doğrulama sürümlerinde bulunur.

715 kimlik değerini kullanan Tag::ATTESTATION_ID_MEID yetkilendirme etiketine karşılık gelir.

attestationIdManufacturer

Yalnızca 2 ve üzeri anahtar doğrulama sürümlerinde bulunur.

716 kimlikli bir etiket değeri kullanan Tag::ATTESTATION_ID_MANUFACTURER yetkilendirme etiketine karşılık gelir.

attestationIdModel

Yalnızca 2 ve üzeri anahtar doğrulama sürümlerinde bulunur.

717 etiket kimliği değerini kullanan Tag::ATTESTATION_ID_MODEL yetkilendirme etiketine karşılık gelir.

vendorPatchLevel

Yalnızca anahtar onay sürümleri >= 3'te mevcut.

718 kimlikli bir etiket değeri kullanan Tag::VENDOR_PATCHLEVEL izin etiketine karşılık gelir.

Bu anahtarın kullanılabilmesi için cihaza yüklenmesi gereken tedarikçi firma resmi güvenlik yaması düzeyini belirtir. Değer, tedarikçi firma güvenlik yamasının tarihini temsil eden YYYYAAGG şeklinde görünür. Örneğin, bir Android cihazda tedarikçi firmanın 1 Ağustos 2018 güvenlik yaması yüklüyken bir anahtar oluşturulduysa bu değer 20180801 olur.

bootPatchLevel

Yalnızca 3 ve sonraki anahtar doğrulama sürümlerinde bulunur.

719 etiket kimliği değerini kullanan Tag::BOOT_PATCHLEVEL yetkilendirme etiketine karşılık gelir.

Bu anahtarın kullanılabilmesi için cihaza yüklenmesi gereken çekirdek resmi güvenlik yaması düzeyini belirtir. Değer, sistem güvenlik yamasının tarihini temsil eden YYYYAAGG biçiminde görünür. Örneğin, bir Android cihazda sistemde 5 Ağustos 2018 güvenlik yaması yüklüyken bir anahtar oluşturulduysa bu değer 20180805 olur.

deviceUniqueAttestation

Yalnızca 4 ve sonraki anahtar doğrulama sürümlerinde bulunur.

720 etiket kimliği değerini kullanan Tag::DEVICE_UNIQUE_ATTESTATION yetkilendirme etiketine karşılık gelir.

attestationIdSecondImei

Yalnızca 300 ve üzeri anahtar doğrulama sürümlerinde bulunur.

723 kimlikli bir etiket değeri kullanan Tag::ATTESTATION_ID_SECOND_IMEI yetkilendirme etiketine karşılık gelir.

RootOfTrust alanları

verifiedBootKey
Doğrulanmış Başlatma kapsamında, cihaz başlatma sırasında yürütülen tüm kodların bütünlüğünü ve özgünlüğünü doğrulamak için kullanılan ortak anahtarın güvenli bir karması. SHA-256 önerilir.
deviceLocked
Cihazın bootloader'ının kilitli olup olmadığı. true, cihazın Doğrulanmış Başlatma tarafından başarıyla doğrulanmış imzalı bir görüntüyü başlattığı anlamına gelir.
verifiedBootState
Cihazın Doğrulanmış Başlatma durumu.
verifiedBootHash
Doğrulanmış Önyükleme ile korunan tüm verilerin özeti. Android Doğrulanmış Başlatma referans uygulamasını kullanan cihazlarda bu alan VBMeta özetini içerir.

VerifiedBootState değerleri

Değer İlgili başlatma durumu Anlamı
Verified GREEN Donanım korumalı bir güven kökünden bootloader'a ve Doğrulanmış Başlatma tarafından doğrulanan tüm bölümlere kadar uzanan tam bir güven zinciri vardır. Bu durumda verifiedBootKey alanı, yerleşik güven kökü'nün karma oluşturma değerini içerir. Yerleşik güven kökü, cihaz üreticisi tarafından fabrikada cihazın ROM'una yerleştirilen sertifikadır.
SelfSigned YELLOW Doğrulamanın, üretici tarafından fabrikada yerleştirilen güven kökü yerine kullanıcı tarafından yapılandırılmış bir güven kökü kullanılarak yapılması dışında Verified ile aynıdır. Bu durumda verifiedBootKey alanı, kullanıcı tarafından yapılandırılan ortak anahtarın karma değerini içerir.
Unverified ORANGE Cihazın bootloader'ının kilidi açık olduğundan güven zinciri oluşturulamaz. Cihaz özgürce değiştirilebildiğinden cihazın bütünlüğü kullanıcı tarafından bant dışı olarak doğrulanmalıdır. Bu durumda verifiedBootKey alanı 32 bayt sıfır içerir.
Failed RED Cihaz doğrulanamadı. Bu durumda, diğer RootOfTrust alanlarının içerikleri hakkında herhangi bir garanti verilmez.

AttestationApplicationId

Bu alan, Android platformunun, hangi uygulamaların doğrulama kapsamında gizli anahtar materyalini kullanmasına izin verildiğine dair fikrini yansıtır. Yalnızca birden fazla paket aynı UID'yi paylaşıyorsa birden fazla paket içerebilir. AuthorizationList içindeki AttestationApplicationId alanı OCTET_STRING türündedir ve aşağıdaki ASN.1 şemasına göre biçimlendirilmiştir:

AttestationApplicationId ::= SEQUENCE {
    package_infos  SET OF AttestationPackageInfo,
    signature_digests  SET OF OCTET_STRING,
}

AttestationPackageInfo ::= SEQUENCE {
    package_name  OCTET_STRING,
    version  INTEGER,
}
package_infos
Her biri bir paketin adını ve sürüm numarasını sağlayan bir AttestationPackageInfo nesnesi grubu.
signature_digests

Uygulamanın imzalama sertifikalarının SHA-256 özet dizisi. Bir uygulamanın birden fazla imzalama anahtarı sertifika zinciri olabilir. Her biri için "yaprak" sertifikası özetlenir ve signature_digests alanına yerleştirilir. Alan adı yanıltıcıdır. Çünkü sıkıştırılmış veriler, getPackageInfo() çağrısı tarafından döndürülen Signature sınıfına göre adlandırıldığı için uygulama imzaları değil, uygulamanın imzalama sertifikalarıdır. Aşağıdaki kod snippet'inde bir örnek küme gösterilmektedir:

{SHA256(PackageInfo.signature[0]), SHA256(PackageInfo.signature[1]), ...}
    

Benzersiz kimlik

Benzersiz kimlik, cihazı tanımlayan 128 bitlik bir değerdir ancak yalnızca sınırlı bir süre için geçerlidir. Değer şu şekilde hesaplanır:

HMAC_SHA256(T || C || R, HBK)

Nerede:

  • T, Tag::CREATION_DATETIME değerinin 2592000000'e bölünmesiyle ve kalanın atılmasıyla hesaplanan "zamansal sayaç değeridir". T 30 günde bir değişir (2592000000 = 30 * 24 * 60 * 60 * 1000).
  • C, Tag::APPLICATION_ID değerini ifade eder.
  • Tag::RESET_SINCE_ID_ROTATION, attest_key çağrısının attest_params parametresinde varsa 1, etiket yoksa 0 değerine sahiptir.R
  • HBK, Güvenilir Yürütme Ortamı tarafından bilinen ve hiçbir zaman açığa çıkmayan, donanıma bağlı benzersiz bir anahtardır. Gizli anahtar en az 128 bit entropi içerir ve cihaza özgüdür (128 bit entropi olduğunda olasılıksal benzersizlik kabul edilir). HBK, HMAC veya AES_CMAC aracılığıyla çok kaynaklı anahtar materyalinden türetilmelidir.

HMAC_SHA256 çıkışını 128 bit olarak kısaltın.

Onay anahtarları ve sertifikalar

Bir RSA ve bir ECDSA olmak üzere iki anahtar ve ilgili sertifika zincirleri cihaza güvenli bir şekilde hazırlanır.

Android 12'de uzaktan anahtar sağlama özelliği kullanıma sunulmuştur. Android 13'te ise cihazların bu özelliği uygulamasını zorunlu kılar. Uzaktan Anahtar Hazırlama, sahadaki cihazlara uygulama başına ECDSA P256 doğrulama sertifikaları sağlar. Bu sertifikaların geçerlilik süresi, fabrikada sağlanan sertifikalardan daha kısadır.

Birden fazla IMEI

Android 14, Android Anahtar Doğrulaması kaydında birden fazla IMEI desteği ekler. OEM'ler, ikinci bir IMEI için KeyMint etiketi ekleyerek bu özelliği uygulayabilir. Cihazların birden fazla hücresel radyoya sahip olması giderek daha yaygın hale gelmektedir ve OEM'ler artık iki IMEI'ye sahip cihazları destekleyebilmektedir.

OEM'lerin, cihazlarında varsa KeyMint uygulamalarında temel hazırlığı yapılan ikincil bir IMEI'ye sahip olması gerekir. Böylece bu uygulamalar, birincil IMEI'yi doğruladıkları şekilde ikincil IMEI'yi de doğrulayabilir.

Kimlik doğrulaması

Android 8.0, Keymaster 3'e sahip cihazlar için isteğe bağlı kimlik onayı desteği içerir. Kimlik doğrulaması, cihazın seri numarası veya IMEI gibi donanım tanımlayıcılarının kanıtını sağlamasına olanak tanır. İsteğe bağlı bir özellik olsa da tüm Keymaster 3 uygulamalarının bu özellik için destek sağlaması önemle tavsiye edilir. Bunun nedeni, cihazın kimliğini kanıtlayabilmek sayesinde gerçek sıfır dokunuşlu uzak yapılandırma gibi kullanım alanlarının daha güvenli olmasıdır (uzak taraf, kimliğini taklit eden bir cihazla değil, doğru cihazla konuştuğundan emin olabilir).

Kimlik doğrulaması, cihazın fabrikadan çıkmadan önce donanım tanımlayıcılarının yalnızca Güvenilir Yürütme Ortamı'nın (TEE) erişebileceği kopyalarını oluşturarak çalışır. Kullanıcı, cihazın önyükleyicisinin kilidini açabilir, sistem yazılımını ve Android çerçeveleri tarafından bildirilen tanımlayıcıları değiştirebilir. TEE tarafından tutulan tanımlayıcıların kopyaları bu şekilde değiştirilemez. Bu sayede cihaz kimliği onayı yalnızca cihazın orijinal donanım tanımlayıcılarını doğrular ve kimliğe bürünme girişimlerini engeller.

Kimlik onayı için ana API yüzeyi, Keymaster 2 ile kullanıma sunulan mevcut anahtar onay mekanizmasının üzerine kurulur. Anahtar yöneticisi tarafından tutulan bir anahtar için doğrulama sertifikası isteğinde bulunurken arayan, cihazın donanım tanımlayıcılarının doğrulama sertifikasının meta verilerine eklenmesini isteyebilir. Anahtar TEE'de tutulursa sertifika, bilinen bir güven köküne geri döner. Bu tür bir sertifikanın alıcısı, sertifikanın ve donanım tanımlayıcıları da dahil olmak üzere içeriğinin TEE tarafından yazıldığını doğrulayabilir. Onay sertifikasına donanım tanımlayıcılarının eklenmesi istendiğinde TEE, yalnızca depolama alanında bulunan tanımlayıcıları fabrika katında doldurulduğu şekilde onaylar.

Depolama özellikleri

Cihazın tanımlayıcılarını içeren depolama alanının aşağıdaki özelliklere sahip olması gerekir:

  • Cihazın orijinal tanımlayıcılarından türetilen değerler, cihaz fabrikadan çıkmadan önce depolama alanına kopyalanır.
  • destroyAttestationIds() yöntemi, tanımlayıcıdan türetilmiş verilerin bu kopyasını kalıcı olarak kaldırabilir. Kalıcı imha, verilerin tamamen kaldırıldığı anlamına gelir. Bu durumda, fabrika ayarlarına sıfırlama veya cihazda yapılan başka bir işlemle veriler geri yüklenemez. Bu, özellikle kullanıcının önyükleyicinin kilidini açtığı, sistem yazılımını değiştirdiği ve Android çerçeveleri tarafından döndürülen tanımlayıcıları değiştirdiği cihazlar için önemlidir.
  • RMA tesisleri, donanım tanımlayıcısı türetilmiş verilerin yeni kopyalarını oluşturabilmelidir. Bu sayede, RMA'dan geçen bir cihaz tekrar kimlik doğrulaması yapabilir. RMA tesisleri tarafından kullanılan mekanizma, kullanıcıların kendileri çağırmaması için korunmalıdır. Aksi takdirde, kullanıcılar sahte kimliklerle ilgili doğrulama elde edebilir.
  • TEE'deki Keymaster güvenilir uygulaması dışında hiçbir kod, depolama alanında tutulan tanımlayıcıdan türetilen verileri okuyamaz.
  • Depolama alanında değişiklik yapıldığına izin verilmez: Depolama alanının içeriği değiştirilmişse TEE, içeriğin kopyaları imha edilmiş gibi davranıp kimlik doğrulama girişimlerini reddeder. Bu işlem, aşağıda açıklandığı şekilde depolama alanını imzalamak veya MAC'le yapmak suretiyle uygulanır.
  • Depolama alanında orijinal tanımlayıcılar bulunmaz. Kimlik doğrulaması bir istem içerdiğinden, arayan her zaman doğrulanacak tanımlayıcıları sağlar. TEE'nin tek yapması gereken, bu değerlerin orijinal değerlerle eşleştiğini doğrulamaktır. Bu doğrulama, değerlerin yerine orijinal değerlerin güvenli karma oluşturma işlemlerinin depolanmasıyla sağlanır.

İnşaat

Yukarıda listelenen özelliklere sahip bir uygulama oluşturmak için kimlikten türetilen değerleri aşağıdaki S yapısında depolayın. Sistemdeki normal yerler (cihaz sahibinin kök erişimi sağlayarak değiştirebileceği yerler) dışında, kimlik değerlerinin başka kopyalarını saklamayın:

S = D || HMAC(HBK, D)

where:

  • D = HMAC(HBK, ID1) || HMAC(HBK, ID2) || ... || HMAC(HBK, IDn)
  • HMAC, uygun bir güvenli karmaya sahip HMAC yapısıdır (SHA-256 önerilir)
  • HBK, başka bir amaç için kullanılmayan donanıma bağlı bir anahtardır
  • ID1...IDn orijinal kimlik değerleridir; farklı cihazların farklı sayıda tanımlayıcısı olduğundan belirli bir değerin belirli bir dizinle ilişkilendirilmesi uygulamaya bağlıdır
  • ||, dize birleştirme işlemini temsil eder.

HMAC çıkışları sabit boyutta olduğundan ayrı kimlik karmalarını veya D'nin HMAC'sini bulmak için herhangi bir üst bilgi veya başka bir yapı gerekmez. Doğrulama yapmak için sağlanan değerleri kontrol etmenin yanı sıra, uygulamaların S'den D'yi çıkararak, HMAC'yi(HBK, D) hesaplayarak ve hiçbir kimliğin değiştirilmediğinden/bozulmadığından emin olmak için S'deki değerle karşılaştırarak S'yi doğrulaması gerekir. Ayrıca uygulamalar, tüm bağımsız kimlik öğeleri ve S doğrulaması için sabit zamanlı karşılaştırmalar kullanmalıdır. Karşılaştırma süresi, sağlanan kimlik sayısına ve testin herhangi bir bölümünün doğru eşleşmesine bakılmaksızın sabit olmalıdır.

Donanım tanımlayıcıları

Kimlik doğrulaması aşağıdaki donanım tanımlayıcılarını destekler:

  1. Build.BRAND tarafından Android'de döndürüldüğü şekliyle marka adı
  2. Android'de Build.DEVICE tarafından döndürülen cihaz adı
  3. Android'de Build.PRODUCT tarafından döndürülen ürün adı
  4. Android'de Build.MANUFACTURER tarafından döndürülen üretici adı
  5. Android'de Build.MODEL tarafından döndürülen model adı
  6. Seri numarası
  7. Tüm radyoların IMEI'leri
  8. Tüm radyoların MEID'leri

Cihaz kimliği doğrulamasını desteklemek için cihaz bu tanımlayıcıları doğrular. Android çalıştıran tüm cihazlar ilk altı sürüme sahiptir ve bu özelliğin çalışması için bunlar gereklidir. Cihazda entegre hücresel radyolar varsa radyoların IMEI ve/veya MEID'leri için de doğrulama desteklenmelidir.

Anahtar doğrulaması yapılarak ve isteğe doğrulanacak cihaz tanımlayıcıları ekleyerek kimlik doğrulaması istenir. Tanımlayıcılar şu şekilde etiketlenir:

  • ATTESTATION_ID_BRAND
  • ATTESTATION_ID_DEVICE
  • ATTESTATION_ID_PRODUCT
  • ATTESTATION_ID_MANUFACTURER
  • ATTESTATION_ID_MODEL
  • ATTESTATION_ID_SERIAL
  • ATTESTATION_ID_IMEI
  • ATTESTATION_ID_MEID

Onaylanacak tanımlayıcı, UTF-8 ile kodlanmış bir bayt dizesidir. Bu biçim, sayısal tanımlayıcılar için de geçerlidir. Onaylanacak her tanımlayıcı, UTF-8 kodlu bir dize olarak ifade edilir.

Cihaz kimlik doğrulamayı desteklemiyorsa (veya destroyAttestationIds() daha önce çağrıldıysa ve cihaz artık kimliklerini doğrulayamıyorsa) bu etiketlerden birini veya daha fazlasını içeren tüm anahtar doğrulama istekleri ErrorCode::CANNOT_ATTEST_IDS ile başarısız olur.

Cihaz kimlik doğrulamayı destekliyorsa ve yukarıdaki etiketlerden biri veya daha fazlası bir anahtar doğrulama isteğine dahil edilmişse TEE, etiketlerin her biriyle birlikte sağlanan tanımlayıcıların donanım tanımlayıcılarının kopyasıyla eşleştiğini doğrular. Bir veya daha fazla tanımlayıcı eşleşmezse onayın tamamı ErrorCode::CANNOT_ATTEST_IDS ile başarısız olur. Aynı etiketin birden fazla kez sağlanabilmesi geçerlidir. Bu, örneğin IMEI'leri doğrularken yararlı olabilir: Bir cihazda birden fazla IMEI'ye sahip birden fazla radyo olabilir. Her ATTESTATION_ID_IMEI ile birlikte sağlanan değer, cihazın radyolarından biriyle eşleşiyorsa doğrulama isteği geçerlidir. Diğer tüm etiketler için de aynı durum geçerlidir.

Onay başarılı olursa onaylı kimlikler, yukarıdaki şemadan yararlanılarak düzenlenen onay sertifikasının onay uzantısına (OID 1.3.6.1.4.1.11129.2.1.17) eklenir. Keymaster 2 onay şemasında yapılan değişiklikler yorumlarla birlikte kalın harflerle gösterilir.

Java API

Bu bölüm yalnızca bilgilendirme amaçlıdır. Keymaster uygulamaları, Java API'yi uygulamaz veya kullanmaz. Bu bilgi, uygulayıcıların özelliğin uygulamalar tarafından nasıl kullanıldığını anlamalarına yardımcı olmak için sağlanmıştır. Sistem bileşenleri bu özelliği farklı şekilde kullanabilir. Bu nedenle, bu bölümün normatif olarak ele alınmaması önemlidir.