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ı mevcutsa ve kullanılıyorsa anahtar materyali, cihazdan ayıklama işlemine karşı daha güvenlidir ve Anahtar Yöneticisi, ihlal edilmesi zor olan kısıtlamalar uygular.

Ancak bu durum yalnızca anahtar mağazası anahtarlarının donanım destekli depolama alanında olduğu biliniyorsa geçerlidir. Keymaster 1'de, uygulamaların veya uzak sunucuların bu durumun geçerli olup olmadığını güvenilir bir şekilde doğrulaması mümkün değildi. Anahtar mağazası daemon'ı, mevcut anahtar yöneticisi HAL'i yükledi ve anahtarların donanım desteğiyle ilgili olarak HAL'in söylediklerine inandı.

Keymaster, bu sorunu gidermek için Android 7.0'da (Keymaster 2) anahtar doğrulamasını ve Android 8.0'da (Keymaster 3) kimlik doğrulamasını kullanıma sundu.

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

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

Anahtar onayı

Android 7.0, anahtar tasdikini desteklemek için HAL'e bir dizi etiket, tür ve yöntem ekledi.

Etiketler

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

Tür

Keymaster 2 ve önceki sürümler

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

AttestKey yöntemi

Keymaster 3

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

Keymaster 2 ve önceki sürümler

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

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

Onay sertifikası

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

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

Sertifika SEQUENCE

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

TBSCertificate SEQUENCE

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

Onay uzantısı

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

AIDL arayüz spesifikasyonunda tanımlanan Keymaster/KeyMint etiket türleri, ASN.1 türlerine aşağıdaki şekilde çevrilir:

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

Şema

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

300 sürümü

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

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

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

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

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

200 sürümü

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

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

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

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

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

100 sürümü

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

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

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

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

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

Sürüm 4

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

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

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

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

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

Sürüm 3

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

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

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

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

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

Sürüm 2

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

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

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

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

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

Sürüm 1

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

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

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

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

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

KeyDescription alanları

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

SecurityLevel değerleri

SecurityLevel değeri, anahtar deposuyla ilgili bir öğenin (ör. anahtar çifti ve doğrulama) saldırıya karşı ne kadar dayanıklı olduğunu gösterir.

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

AuthorizationList alanları

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

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

purpose
1 değerine sahip bir etiket kimliği kullanan Tag::PURPOSE yetkilendirme etiketine karşılık gelir.
algorithm

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

Bir doğrulama AuthorizationList nesnesinde algoritma değeri her 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
200 değerinde bir etiket kimliği kullanan Tag::RSA_PUBLIC_EXPONENT yetkilendirme etiketine karşılık gelir.
mgfDigest

Yalnızca anahtar doğrulama sürümünde >= 100 mevcuttur.

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

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

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

earlyBootOnly

Yalnızca anahtar doğrulama sürümünde >= 4 mevcuttur.

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

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

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

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

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

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

trustedUserPresenceRequired

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

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

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

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

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

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

Anahtarın yalnızca kullanıcının onay jetonu kullanarak imzalanmak istenen verileri onayladığında kullanılabileceğini belirtir. Kullanıcı onayı alma hakkında daha fazla bilgi için Android Korumalı Onay başlıklı makaleyi inceleyin.

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

unlockedDeviceRequired

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

509 kimlikli bir etiket kullanan Tag::UNLOCKED_DEVICE_REQUIRED izin etiketine karşılık gelir.

allApplications

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

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

applicationId
601 kimlikli etiket kullanan Tag::APPLICATION_ID yetkilendirme etiketine karşılık gelir.
creationDateTime
701 kimlikli bir etiket kullanan Tag::CREATION_DATETIME yetkilendirme etiketine karşılık gelir.
origin

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

rollbackResistant

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

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

rootOfTrust

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

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

osVersion

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

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

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

osPatchLevel

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

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

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

attestationApplicationId

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

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

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

attestationIdBrand

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

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

attestationIdDevice

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

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

attestationIdProduct

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

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

attestationIdSerial

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

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

attestationIdImei

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

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

attestationIdMeid

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

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

attestationIdManufacturer

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

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

attestationIdModel

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

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

vendorPatchLevel

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

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

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

bootPatchLevel

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

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

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

deviceUniqueAttestation

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

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

attestationIdSecondImei

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

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

RootOfTrust alanları

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

VerifiedBootState değerleri

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

AttestationApplicationId

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

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

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

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

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

Benzersiz kimlik

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

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

Nerede:

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

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

Attestation anahtarları ve sertifikaları

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

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

Birden fazla IMEI

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

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

Provizyon bilgileri uzantısı

Temel hazırlama bilgileri uzantısının OID'si 1.3.6.1.4.1.11129.2.1.30. Uzantı, cihaz sağlama sunucusu tarafından cihaz hakkında bilinen bilgileri sağlar.

Şema

Uzantı, aşağıdaki CDDL şemasını izler:

  {
        1 : int,   ; certificates issued
  }

Haritanın sürümü kaldırılır ve yeni isteğe bağlı alanlar eklenebilir.

certs_issued

Son 30 gün içinde cihaza verilen yaklaşık sertifika sayısı. Bu değer, ortalamadan birkaç kat daha büyükse olası kötüye kullanım sinyali olarak kullanılabilir.

Kimlik doğrulaması

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

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

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

Depolama alanı özellikleri

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

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

İnşaat

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

S = D || HMAC(HBK, D)

where:

  • D = HMAC(HBK, ID1) || HMAC(HBK, ID2) || ... || HMAC(HBK, IDn)
  • HMAC, uygun bir güvenli karmaya sahip HMAC yapısıdır (SHA-256 önerilir)
  • HBK, başka bir amaç için kullanılmayan donanıma bağlı bir anahtardı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, tek tek kimlik karmalarını veya D'nin HMAC'sini bulmak için başlık veya başka bir yapı gerekmez. Doğrulama yapmak için sağlanan değerleri kontrol etmenin yanı sıra, uygulamaların D'yi S'den çıkararak, HMAC'yi(HBK, D) hesaplayarak ve hiçbir kimliğin değiştirilmediğinden/bozulmadığından emin olmak için S'deki değerle karşılaştırarak S'yi doğrulaması gerekir. Ayrıca, tüm kimlik öğeleri ve S'nin doğrulanması için uygulamalarda sabit süreli karşılaştırmalar kullanılmalıdır. Karşılaştırma süresi, sağlanan kimlik sayısından ve testin herhangi bir bölümünün doğru eşleşmesinden bağımsız olarak sabit olmalıdır.

Donanım tanımlayıcıları

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

  1. Android'de Build.BRAND tarafından döndürülen 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 işletim sistemini kullanan tüm cihazlarda ilk altı özellik bulunur ve bu özelliklerin bu özelliğin çalışması için gereklidir. Cihazda entegre hücresel radyolar varsa cihaz, radyoların IMEI'leri ve/veya MEID'leri için de doğrulamayı desteklemelidir.

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

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

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

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

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

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

Java API

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