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ı kullanıldığında anahtar materyali, cihazdan ayıklanmaya karşı daha güvenli olur ve KeyMint (eski adıyla Keymaster), atlatılması zor kısıtlamalar uygular.

Ancak bu durum yalnızca Keystore anahtarlarının donanım destekli depolamada olduğu biliniyorsa geçerlidir. Keymaster 1'de uygulamaların veya uzak sunucuların bu durumu güvenilir bir şekilde doğrulaması mümkün değildi. Anahtar deposu arka plan programı, mevcut Keymaster donanım soyutlama katmanını (HAL) yükledi ve HAL'ın anahtarların donanım desteğiyle ilgili söylediklerine inandı.

Bu sorunu gidermek için Android 7.0'da (Keymaster 2) anahtar onayı, Android 8.0'da (Keymaster 3) ise kimlik onayı kullanıma sunuldu.

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

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

Anahtar onayı

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

Etiketler

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

Tür

Keymaster 2 ve önceki sürümler

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

AttestKey yöntemi

Keymaster 3

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

Keymaster 2 ve önceki sürümler

keymaster_error_t (*attest_key)(const struct keymaster2_device* dev,
        const keymaster_key_blob_t* key_to_attest,
        const keymaster_key_param_set_t* attest_params,
        keymaster_cert_chain_t* cert_chain);
  • dev, Keymaster cihaz yapısıdır.
  • keyToAttest, generateKey için oluşturulan onaylama işleminden döndürülen anahtar blob'udur.
  • attestParams, onay için gerekli tüm parametrelerin listesidir. Bu kapsamda Tag::ATTESTATION_CHALLENGE ve muhtemelen Tag::RESET_SINCE_ID_ROTATION ile Tag::APPLICATION_ID ve Tag::APPLICATION_DATA yer alır. Anahtar oluşturma sırasında belirtilmişlerse anahtar blob'unun şifresini çözmek için son iki anahtar gereklidir.
  • certChain, sertifika dizisi döndüren çıktı parametresidir. 0. giriş, onay sertifikasıdır. Bu sertifika, keyToAttest'daki anahtarı onaylar ve onay uzantısını içerir.

attestKey yöntemi, herhangi bir zamanda çağrılabildiği ve yetkilendirme kısıtlamalarını karşılaması gerekmediği için onaylanmış anahtarda genel anahtar işlemi olarak kabul edilir. Örneğin, onaylı anahtarın kullanılabilmesi için kullanıcı kimlik doğrulaması gerekiyorsa kullanıcı kimlik doğrulaması olmadan onay oluşturulabilir.

Onay sertifikası

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

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

Certificate SEQUENCE

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

TBSCertificate SEQUENCE

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

Onay uzantısı

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

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

KeyMint veya Keymaster türü ASN.1 türü Notlar
ENUM INTEGER
ENUM_REP SET of INTEGER
UINT INTEGER
UINT_REP SET of INTEGER
ULONG INTEGER
ULONG_REP SET of INTEGER
DATE INTEGER 1 Ocak 1970 00:00:00 GMT'den itibaren milisaniye.
BOOL NULL Etiketin bulunması doğru, bulunmaması yanlış anlamına gelir.
BIGNUM Bu türde etiket olmadığı için eşleme tanımlanmamıştır.
BYTES OCTET_STRING

Şema

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

Sürüm 400

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

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

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

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

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

Sürüm 300

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

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

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

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

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

Sürüm 200

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

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

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

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

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

Sürüm 100

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

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

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

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

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

Sürüm 4

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

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

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

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

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

Sürüm 3

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

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

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

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

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

Sürüm 2

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

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

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

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

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

Sürüm 1

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

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

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

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

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

KeyDescription alanları

attestationVersion
ASN.1 şema sürümü.
DeğerKeyMint veya Keymaster 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 sürüm 1.0
200KeyMint sürüm 2.0
300KeyMint sürüm 3.0
400KeyMint sürüm 4.0
attestationSecurityLevel

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

keymasterVersion/keyMintVersion
KeyMint veya Keymaster HAL uygulamasının sürümü.
DeğerKeyMint veya Keymaster sürümü
2Keymaster sürümü 2.0
3Keymaster sürümü 3.0
4Keymaster sürümü 4.0
41Keymaster sürümü 4.1
100KeyMint sürüm 1.0
200KeyMint sürüm 2.0
300KeyMint sürüm 3.0
400KeyMint sürüm 4.0
keymasterSecurityLevel/keyMintSecurityLevel
KeyMint veya Keymaster uygulamasının güvenlik seviyesi.
attestationChallenge
Anahtar oluşturma sırasında sağlanan zorluk.
uniqueId
Sistem uygulamalarının anahtar oluşturma sırasında isteyebileceği, gizliliğe duyarlı bir cihaz tanımlayıcısı. Benzersiz kimlik istenmiyorsa bu alan boştur. Ayrıntılı bilgi için Benzersiz kimlik bölümünü inceleyin.
softwareEnforced
Android sistemi tarafından zorunlu kılınan KeyMint veya Keymaster yetkilendirme listesi. Bu bilgiler, platformdaki kod tarafından toplanır veya oluşturulur. Cihaz, Android Platform Güvenlik Modeli'ne (yani cihazın bootloader'ı kilitli ve verifiedBootState Verified) uygun bir işletim sistemi çalıştırdığı sürece güvenilir olabilir.
hardwareEnforced
Cihazın güvenilir yürütme ortamı (TEE) veya StrongBox tarafından zorunlu kılınan KeyMint veya Keymaster yetkilendirme listesi. Bu bilgiler, güvenli donanımdaki kod tarafından toplanır veya oluşturulur ve platform tarafından kontrol edilmez. Örneğin, bilgiler bootloader'dan veya platforma güvenmeyi gerektirmeyen güvenli bir iletişim kanalı üzerinden gelebilir.

SecurityLevel değerleri

SecurityLevel değeri, bir Keystore ile ilgili öğenin (ör. anahtar çifti ve onay) saldırılara karşı ne kadar dayanıklı olduğunu gösterir.

Değer Anlamı
Software Cihazın Android sistemi Android Platform Güvenlik Modeli'ne uyduğu sürece güvenlidir (yani cihazın bootloader'ı kilitlidir ve verifiedBootState, Verified'dır).
TrustedEnvironment TEE'nin güvenliği ihlal edilmediği sürece güvenlidir. TEE'ler için izolasyon koşulları, Android Uyumluluk Tanımlama Belgesi'nin 9.11 [C-1-1] ila [C-1-4]bölümlerinde tanımlanmıştır. TEE'ler, uzaktan saldırılarla ele geçirilmeye karşı oldukça dirençli, doğrudan donanım saldırılarıyla ele geçirilmeye karşı ise orta düzeyde dirençlidir.
StrongBox StrongBox'ın güvenliği ihlal edilmediği sürece güvenlidir. StrongBox, donanım güvenlik modülüne benzer bir güvenli öğede uygulanır. StrongBox'ın uygulama koşulları, Android Uyumluluk Tanımlama Belgesi'nin 9.11.2 bölümünde tanımlanmıştır. StrongBox, uzaktan saldırı ve doğrudan donanım saldırısı (ör. fiziksel kurcalama ve yan kanal saldırıları) yoluyla güvenlik ihlaline karşı son derece dirençlidir.

AuthorizationList alanları

Her alan, AIDL arayüz spesifikasyonundaki bir Keymaster/KeyMint yetkilendirme etiketine karşılık gelir. Spesifikasyon, yetkilendirme etiketleriyle ilgili doğru bilgilerin kaynağıdır: anlamları, içeriklerinin biçimi, KeyDescription nesnesindeki softwareEnforced veya hardwareEnforced alanlarında görünmelerinin beklenip beklenmediği, diğer etiketlerle karşılıklı olarak hariç tutulup tutulmadıkları vb. Tüm AuthorizationList alanları isteğe bağlıdır.

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

KeyMint 4 tarafından oluşturulan onaylarda aşağıdaki alanlar bulunur:
purpose
1 etiket kimliği değerini kullanan Tag::PURPOSE yetkilendirme etiketine karşılık gelir.
algorithm

2 etiket kimliği değerini kullanan Tag::ALGORITHM yetkilendirme etiketiyle eşleşir.

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

keySize
3 etiket kimliği değerini kullanan Tag::KEY_SIZE yetkilendirme etiketiyle eşleşir.
blockMode
4 etiket kimliği değerini kullanan Tag::BLOCK_MODE yetkilendirme etiketiyle eşleşir.
digest
5 etiket kimliği değerini kullanan Tag::DIGEST yetkilendirme etiketiyle eşleşir.
padding
6 etiket kimliği değerini kullanan Tag::PADDING yetkilendirme etiketiyle eşleşir.
callerNonce
7 etiket kimliği değerini kullanan Tag::CALLER_NONCE yetkilendirme etiketiyle eşleşir.
minMacLength
8 etiket kimliği değerini kullanan Tag::MIN_MAC_LENGTH yetkilendirme etiketiyle eşleşir.
ecCurve

10 etiket kimliği değerini kullanan Tag::EC_CURVE yetkilendirme etiketiyle eşleşir.

Android sistem anahtar deposunda imzalama ve doğrulama için ECDSA'yı kullanan bir eliptik eğri (EC) anahtar çifti oluşturmak üzere kullanılan parametreler kümesi.

rsaPublicExponent
200 etiket kimliği değerini kullanan Tag::RSA_PUBLIC_EXPONENT yetkilendirme etiketine karşılık gelir.
mgfDigest

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

203 etiket kimliği değerini kullanan Tag::RSA_OAEP_MGF_DIGEST KeyMint yetkilendirme etiketiyle eşleşir.
rollbackResistance

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

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

earlyBootOnly

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

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

activeDateTime
400 etiket kimliği değerini kullanan Tag::ACTIVE_DATETIME yetkilendirme etiketiyle eşleşir.
originationExpireDateTime
401 etiket kimliği değerini kullanan Tag::ORIGINATION_EXPIRE_DATETIME yetkilendirme etiketine karşılık gelir.
usageExpireDateTime
402 etiket kimliği değerini kullanan Tag::USAGE_EXPIRE_DATETIME yetkilendirme etiketiyle eşleşir.
usageCountLimit
405 etiket kimliği değerini kullanan Tag::USAGE_COUNT_LIMIT yetkilendirme etiketiyle eşleşir.
userSecureId
502 etiket kimliği değerini kullanan Tag::USER_SECURE_ID yetkilendirme etiketiyle eşleşir.
noAuthRequired

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

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

506 etiket kimliği değerini kullanan Tag::ALLOW_WHILE_ON_BODY yetkilendirme etiketiyle eşleşir.

Kullanıcı cihazı vücudunda takmaya devam ediyorsa kimlik doğrulama zaman aşımı süresi dolduktan sonra anahtarın kullanılmasına izin verir. Cihazın kullanıcının vücudunda takılı olup olmadığını güvenli bir vücuda temas sensörünün belirlediğini unutmayın.

trustedUserPresenceReq

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

507 etiket kimliği değerini kullanan Tag::TRUSTED_USER_PRESENCE_REQUIRED yetkilendirme etiketiyle eşleşir.

Bu anahtarın yalnızca kullanıcının fiziksel varlığını kanıtlaması durumunda kullanılabileceğini belirtir. Aşağıda birkaç örnek verilmiştir:

  • StrongBox anahtarı için StrongBox cihazındaki bir pine kablolu olarak bağlanmış bir donanım düğmesi.
  • TEE anahtarı için parmak izi kimlik doğrulaması, TEE'nin tarayıcı üzerinde özel kontrolü olduğu ve parmak izi eşleştirme işlemini gerçekleştirdiği sürece varlık kanıtı sağlar.
trustedConfirmationReq

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

508 etiket kimliği değerini kullanan Tag::TRUSTED_CONFIRMATION_REQUIRED yetkilendirme etiketiyle eşleşir.

Anahtarın yalnızca kullanıcı, onay jetonu kullanarak imzalanacak verilerin onayını sağlarsa kullanılabileceğini belirtir. Kullanıcı onayı alma hakkında daha fazla bilgi için Android Protected Confirmation başlıklı makaleyi inceleyin.

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

unlockedDeviceReq

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

509 etiket kimliği değerini kullanan Tag::UNLOCKED_DEVICE_REQUIRED yetkilendirme etiketiyle eşleşir.

creationDateTime
701 etiket kimliği değerini kullanan Tag::CREATION_DATETIME yetkilendirme etiketiyle eşleşir.
origin

702 etiket kimliği değerini kullanan Tag::ORIGIN yetkilendirme etiketiyle eşleşir.

rootOfTrust

704 etiket kimliği değerini kullanan Tag::ROOT_OF_TRUST yetkilendirme etiketiyle eşleşir.

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

osVersion

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

Keymaster ile ilişkili Android işletim sistemi sürümü, altı haneli bir tam sayı olarak belirtilir. Örneğin, 8.1.0 sürümü 080100 olarak gösterilir.

Bu değer yalnızca Keymaster 1.0 veya sonraki sürümlerin yetkilendirme listesinde yer alır.

osPatchLevel

706 etiket kimliği değerini kullanan Tag::PATCHLEVEL yetkilendirme etiketiyle eşleşir.

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

Bu değer yalnızca Keymaster 1.0 veya sonraki sürümlerin yetkilendirme listesinde yer alır.

attestationApplicationId

Yalnızca anahtar onayı sürümlerinde >= 2 bulunur.

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

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

attestationIdBrand

Yalnızca anahtar onayı sürümlerinde >= 2 bulunur.

710 etiket kimliği değerini kullanan Tag::ATTESTATION_ID_BRAND yetkilendirme etiketiyle eşleşir.

attestationIdDevice

Yalnızca anahtar onayı sürümlerinde >= 2 bulunur.

711 etiket kimliği değerini kullanan Tag::ATTESTATION_ID_DEVICE yetkilendirme etiketiyle eşleşir.

attestationIdProduct

Yalnızca anahtar onayı sürümlerinde >= 2 bulunur.

712 etiket kimliği değerini kullanan Tag::ATTESTATION_ID_PRODUCT yetkilendirme etiketiyle eşleşir.

attestationIdSerial

Yalnızca anahtar onayı sürümlerinde >= 2 bulunur.

713 etiket kimliği değerini kullanan Tag::ATTESTATION_ID_SERIAL yetkilendirme etiketiyle eşleşir.

attestationIdImei

Yalnızca anahtar onayı sürümlerinde >= 2 bulunur.

714 etiket kimliği değerini kullanan Tag::ATTESTATION_ID_IMEI yetkilendirme etiketiyle eşleşir.

attestationIdMeid

Yalnızca anahtar onayı sürümlerinde >= 2 bulunur.

715 etiket kimliği değerini kullanan Tag::ATTESTATION_ID_MEID yetkilendirme etiketiyle eşleşir.

attestationIdManufacturer

Yalnızca anahtar onayı sürümlerinde >= 2 bulunur.

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

attestationIdModel

Yalnızca anahtar onayı sürümlerinde >= 2 bulunur.

717 etiket kimliği değerini kullanan Tag::ATTESTATION_ID_MODEL yetkilendirme etiketiyle eşleşir.

vendorPatchLevel

Yalnızca anahtar onayı sürümü >= 3 olan cihazlarda bulunur.

718 etiket kimliği değerini kullanan Tag::VENDOR_PATCHLEVEL yetkilendirme etiketiyle eşleşir.

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

bootPatchLevel

Yalnızca anahtar onayı sürümü >= 3 olan cihazlarda bulunur.

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

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

deviceUniqueAttestation

Yalnızca anahtar onayı sürümü >= 4 olan cihazlarda bulunur.

720 etiket kimliği değerini kullanan Tag::DEVICE_UNIQUE_ATTESTATION yetkilendirme etiketiyle eşleşir.

attestationIdSecondImei

Yalnızca anahtar onayı sürümlerinde >= 300 bulunur.

723 etiket kimliği değerini kullanan Tag::ATTESTATION_ID_SECOND_IMEI yetkilendirme etiketiyle eşleşir.

moduleHash

Yalnızca anahtar onayı sürümlerinde >= 400 bulunur.

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

RootOfTrust alanları

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

VerifiedBootState değerleri

Değer İlgili başlatma durumu Anlamı
Verified GREEN Tam bir güven zinciri, donanımla korunan bir güven kökünden Doğrulanmış Başlatma tarafından doğrulanan bootloader'a ve tüm bölümlere kadar uzanır. Bu durumda, verifiedBootKey alanı, cihaz üreticisi tarafından fabrikada cihazın ROM'una yerleştirilen sertifika olan yerleşik güven kökünün karmasını içerir.
SelfSigned YELLOW Üretici tarafından fabrikada yerleştirilen güven kökü yerine Verified ile aynıdır. Ancak doğrulama, kullanıcı tarafından yapılandırılan bir güven kökü kullanılarak yapılmıştır. Bu durumda, verifiedBootKey alanı, kullanıcı tarafından yapılandırılan ortak anahtarın karma değerini içerir.
Unverified ORANGE Cihazın bootloader'ının kilidi açık olduğundan güven zinciri oluşturulamaz. Cihaz serbestçe değiştirilebildiği için cihazın bütünlüğü, kullanıcı tarafından bant dışı olarak doğrulanmalıdır. Bu durumda verifiedBootKey alanı 32 baytlık sıfır içerir.
Failed RED Cihaz doğrulanamadı. Bu durumda, diğer RootOfTrust alanlarının içeriğiyle ilgili herhangi bir garanti verilmez.

AttestationApplicationId

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

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

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

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

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

Temel hazırlık bilgileri uzantısı

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

Şema

Uzantı, aşağıdaki CDDL şemasını kullanır:

  {
        1 : int,       ; certificates issued
        4 : string,    ; validated attested entity (STRONG_BOX/TEE)
  }

Harita sürüm içermez ve yeni isteğe bağlı alanlar eklenebilir.

certs_issued

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

validated_attested_entity

Doğrulanmış onaylı öğe, hazırlama sunucusu tarafından onaylı olduğu onaylanan cihaz türünü açıklayan bir dizedir. Örneğin, STRONG_BOX veya TEE.

Onay anahtarları

Biri RSA, diğeri ECDSA olmak üzere iki anahtar ve ilgili sertifika zincirleri cihaza güvenli bir şekilde sağlanır.

Android 12'de Uzaktan Anahtar Sağlama özelliği kullanıma sunulmuştu. Android 13'te ise cihazların bu özelliği uygulaması zorunlu tutuluyor. Uzaktan anahtar sağlama, sahadaki cihazlara uygulama başına ECDSA P256 onay sertifikaları sağlar. Bu sertifikaların kullanım süresi, fabrikada sağlanan sertifikalardan daha kısadır.

Benzersiz kimlik

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

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

Nerede:

  • T, Tag::CREATION_DATETIME değerinin 2592000000'a bölünmesiyle hesaplanan ve kalan kısmın atıldığı "zamansal sayaç değeri"dir. T, 30 günde bir değişir (2592000000 = 30 * 24 * 60 * 60 * 1000).
  • C, Tag::APPLICATION_ID değeridir.
  • R, attest_key çağrısına yönelik attest_params parametresinde Tag::RESET_SINCE_ID_ROTATION varsa 1, etiket yoksa 0'dır.
  • HBK, Güvenilir Yürütme Ortamı tarafından bilinen ve hiçbir zaman açıklanmayan, donanıma bağlı benzersiz bir sırdır. Gizli anahtar en az 128 bit entropi içerir ve cihaza özeldir (128 bit entropi göz önüne alındığında olasılıksal benzersizlik kabul edilebilir). HBK, HMAC veya AES_CMAC aracılığıyla birleştirilmiş anahtar materyalinden türetilmelidir.

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

Birden fazla IMEI

Android 14, Android Anahtar Onaylama kaydında birden fazla IMEI'nin desteklenmesini sağlar. OEM'ler, ikinci bir IMEI için KeyMint etiketi ekleyerek bu özelliği uygulayabilir. Cihazlarda birden fazla hücresel radyo bulunması giderek yaygınlaşıyor ve OEM'ler artık iki IMEI'li cihazları destekleyebiliyor.

OEM'lerin, cihazlarında varsa ikincil bir IMEI'yi KeyMint uygulamalarına sağlaması gerekir. Böylece bu uygulamalar, ilk IMEI'yi onayladıkları şekilde ikincil IMEI'yi de onaylayabilir.

Kimlik onayı

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

Kimlik doğrulama, cihaz fabrikadan çıkmadan önce yalnızca TEE'nin erişebileceği cihazın donanım tanımlayıcılarının kopyalarını oluşturarak çalışır. Kullanıcılar, cihazın önyükleyicisinin kilidini açabilir ve sistem yazılımı ile Android çerçeveleri tarafından bildirilen tanımlayıcıları değiştirebilir. TEE tarafından tutulan tanımlayıcıların kopyaları bu şekilde değiştirilemez. Bu sayede, cihaz kimliği onayı yalnızca cihazın orijinal donanım tanımlayıcılarını onaylar ve sahtecilik girişimleri engellenir.

Kimlik onayı için ana API yüzeyi, Keymaster 2 ile kullanıma sunulan mevcut anahtar onayı mekanizmasının üzerine kurulmuştur. Keymaster tarafından tutulan bir anahtar için onay sertifikası istenirken arayan, cihazın donanım tanımlayıcılarının onay sertifikasının meta verilerine dahil edilmesini isteyebilir. Anahtar TEE'de tutuluyorsa sertifika, bilinen bir güven köküne geri döner. Bu tür bir sertifikanın alıcısı, sertifikanın ve donanım tanımlayıcıları da dahil olmak üzere içeriğinin TEE tarafından yazıldığını doğrulayabilir. Donanım tanımlayıcılarının onay sertifikasına dahil edilmesi istendiğinde TEE, yalnızca fabrikada doldurulduğu şekilde depolamasında tutulan tanımlayıcıları onaylar.

Depolama alanı özellikleri

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

  • Cihazın orijinal tanımlayıcılarından elde edilen değerler, cihaz fabrikadan çıkmadan önce depolama alanına kopyalanır.
  • destroyAttestationIds() yöntemi, tanımlayıcıdan türetilen verilerin bu kopyasını kalıcı olarak yok edebilir. Kalıcı imha, verilerin tamamen kaldırılması anlamına gelir. Bu durumda, ne fabrika ayarlarına sıfırlama ne de cihazda gerçekleştirilen başka bir işlem verileri geri yükleyebilir. Bu durum, özellikle kullanıcının önyükleyici kilidini açtığı, sistem yazılımını değiştirdiği ve Android çerçeveleri tarafından döndürülen tanımlayıcıları değiştirdiği cihazlar için önemlidir.
  • RMA tesisleri, donanım tanımlayıcısından türetilen verilerin yeni kopyalarını oluşturabilmelidir. Bu sayede, RMA'dan geçen bir cihaz tekrar kimlik doğrulama işlemi yapabilir. RMA tesisleri tarafından kullanılan mekanizma, kullanıcıların kendilerinin sahte kimliklerin onaylarını almasına olanak tanıyacağından korunmalıdır.
  • TEE'de Keymaster güvenilir uygulaması dışında hiçbir kod, depolama alanında tutulan tanımlayıcıdan türetilmiş verileri okuyamaz.
  • Depolama alanı kurcalamaya karşı korumalıdır: Depolama alanının içeriği değiştirildiyse TEE, bu durumu içeriğin kopyaları yok edilmiş gibi ele alır ve tüm kimlik doğrulama girişimlerini reddeder. Bu işlem, depolama alanının aşağıda açıklandığı şekilde imzalanması veya MAC'lenmesiyle uygulanır.
  • Depolama alanında orijinal tanımlayıcılar bulunmuyor. Kimlik onayı bir sorgulama içerdiğinden, arayan her zaman onaylanacak tanımlayıcıları sağlar. TEE'nin yalnızca bu değerlerin başlangıçtaki değerlerle eşleştiğini doğrulaması gerekir. Bu doğrulama, değerler yerine orijinal değerlerin güvenli karma değerleri depolanarak sağlanır.

Yol çalışması

Yukarıda listelenen özelliklere sahip bir uygulama oluşturmak için kimlikten türetilmiş değerleri aşağıdaki yapıda saklayın. Sistemdeki normal yerler dışında, cihaz sahibinin rootlayarak değiştirebileceği kimlik değerlerinin başka kopyalarını saklamayın:

S = D || HMAC(HBK, D)

burada:

  • D = HMAC(HBK, ID1) || HMAC(HBK, ID2) || ... || HMAC(HBK, IDn)
  • HMAC, uygun bir güvenli karma ile (SHA-256 önerilir) HMAC yapısıdır.
  • HBK, başka bir amaçla kullanılmayan, donanıma bağlı bir anahtardır.
  • ID1...IDn orijinal kimlik değerleridir; belirli bir değerin belirli bir dizinle ilişkilendirilmesi uygulamaya bağlıdır. Bunun nedeni, farklı cihazlarda farklı sayıda tanımlayıcı bulunmasıdır.
  • || birleştirme işlemini gösterir

HMAC çıkışları sabit boyutlu olduğundan, tek tek kimlik karmalarını veya D'nin HMAC'sini bulmak için başlık ya da başka bir yapı gerekmez. Onaylama işlemini gerçekleştirmek için sağlanan değerleri kontrol etmenin yanı sıra, uygulamaların S'den D'yi çıkararak, HMAC(HBK, D) değerini hesaplayarak ve bunu S'deki değerle karşılaştırarak hiçbir bireysel kimliğin değiştirilmediğini/bozulmadığını doğrulamak için S'yi doğrulaması gerekir. Ayrıca, uygulamalarda tüm bağımsız kimlik öğeleri ve S'nin doğrulanması için sabit süreli karşılaştırmalar kullanılmalıdır. Karşılaştırma süresi, sağlanan kimliklerin sayısından ve testin herhangi bir bölümünün doğru eşleşmesinden bağımsız olarak sabit olmalıdır.

Donanım tanımlayıcıları

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

  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 onayını desteklemek için cihaz, bu tanımlayıcıları onaylar. Android'in çalıştığı tüm cihazlarda ilk altı bulunur ve bu özelliğin çalışması için gereklidir. Cihazda entegre hücresel radyolar varsa cihaz, radyoların IMEI ve/veya MEID'leri için de onaylamayı desteklemelidir.

Kimlik doğrulama, anahtar doğrulama işlemi yapılarak ve istekte doğrulanacak cihaz tanımlayıcıları eklenerek istenir. Tanımlayıcılar şu şekilde etiketlenir:

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

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

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

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

Onay başarılı olursa onaylanan kimlikler, yukarıdaki şemayı kullanarak verilen onay sertifikasının onay uzantısına (OID 1.3.6.1.4.1.11129.2.1.17) eklenir. Keymaster 2 onay şemasındaki değişiklikler yorumlarla birlikte kalın olarak gösterilir.

Java API

Bu bölüm yalnızca bilgilendirme amaçlıdır. Keymaster uygulayıcıları Java API'yi ne uygular ne de kullanır. Bu, uygulayıcıların özelliği uygulamaların nasıl kullandığını anlamasına yardımcı olmak için sağlanır. Sistem bileşenleri bunu farklı şekilde kullanabilir. Bu nedenle, bu bölümün normatif olarak ele alınmaması önemlidir.