Pengesahan kunci dan ID

Keystore menyediakan tempat yang lebih aman untuk membuat, menyimpan, dan menggunakan kunci kriptografi dengan cara yang terkontrol. Jika penyimpanan kunci yang didukung hardware tersedia dan digunakan, materi kunci akan lebih aman terhadap ekstraksi dari perangkat, dan Keymaster akan menerapkan batasan yang sulit dirusak.

Namun, hal ini hanya berlaku jika kunci keystore diketahui berada di penyimpanan yang didukung hardware. Di Keymaster 1, tidak ada cara bagi aplikasi atau server jarak jauh untuk memverifikasi dengan andal apakah hal ini terjadi. Daemon keystore memuat HAL keymaster yang tersedia dan mempercayai apa pun yang dikatakan HAL terkait dukungan hardware kunci.

Untuk mengatasi hal ini, Keymaster memperkenalkan pengesahan kunci di Android 7.0 (Keymaster 2) dan pengesahan ID di Android 8.0 (Keymaster 3).

Pengesahan kunci bertujuan untuk memberikan cara guna menentukan dengan kuat apakah pasangan kunci asimetris didukung hardware, apa properti kunci tersebut, dan batasan apa yang diterapkan pada penggunaannya.

Pengesahan ID memungkinkan perangkat memberikan bukti ID hardware-nya, seperti nomor seri atau IMEI.

Pengesahan kunci

Untuk mendukung pengesahan kunci, Android 7.0 memperkenalkan serangkaian tag, jenis, dan metode ke HAL.

Tag

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

Jenis

Keymaster 2 dan yang lebih lama

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

Metode AttestKey

Keymaster 3

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

Keymaster 2 dan yang lebih lama

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 adalah struktur perangkat keymaster.
  • keyToAttest adalah blob kunci yang ditampilkan dari generateKey yang pembuatan pengesahannya.
  • attestParams adalah daftar parameter apa pun yang diperlukan untuk pengesahan. Hal ini mencakup Tag::ATTESTATION_CHALLENGE dan mungkin Tag::RESET_SINCE_ID_ROTATION, serta Tag::APPLICATION_ID dan Tag::APPLICATION_DATA. Dua tindakan terakhir diperlukan untuk mendekripsi blob kunci jika ditentukan selama pembuatan kunci.
  • certChain adalah parameter output, yang menampilkan array sertifikat. Entri 0 adalah sertifikat pengesahan, yang berarti mengesahkan kunci dari keyToAttest dan berisi ekstensi pengesahan.

Metode attestKey dianggap sebagai operasi kunci publik pada kunci yang diautentikasi, karena dapat dipanggil kapan saja dan tidak perlu memenuhi batasan otorisasi. Misalnya, jika kunci yang diautentikasi memerlukan autentikasi pengguna untuk digunakan, pengesahan dapat dibuat tanpa autentikasi pengguna.

Sertifikat pengesahan

Sertifikat pengesahan adalah sertifikat X.509 standar, dengan ekstensi pengesahan opsional yang berisi deskripsi kunci yang diautentikasi. Sertifikat ditandatangani dengan kunci pengesahan bersertifikasi. Kunci pengesahan mungkin menggunakan algoritma yang berbeda dengan kunci yang diautentikasi.

Sertifikat pengesahan berisi kolom dalam tabel di bawah dan tidak boleh berisi kolom tambahan apa pun. Beberapa kolom menentukan nilai kolom tetap. Pengujian CTS memvalidasi bahwa konten sertifikat sama persis dengan yang ditentukan.

SEQUENCE Sertifikat

Nama kolom (lihat RFC 5280) Nilai
tbsCertificate URUTAN TBSCertificate
Algoritma tanda tangan AlgorithmIdentifier algoritma yang digunakan untuk menandatangani kunci:
ECDSA untuk kunci EC, RSA untuk kunci RSA.
signatureValue BIT STRING, tanda tangan yang dihitung pada tbsCertificate yang dienkode DER ASN.1.

SEQUENCE TBSCertificate

Nama kolom (lihat RFC 5280) Nilai
version INTEGER 2 (berarti sertifikat v3)
serialNumber INTEGER 1 (nilai tetap: sama di semua sertifikat)
signature AlgorithmIdentifier algoritma yang digunakan untuk menandatangani kunci: ECDSA untuk kunci EC, RSA untuk kunci RSA.
issuer Sama dengan kolom subjek kunci pengesahan batch.
validity URUTAN dua tanggal, yang berisi nilai Tag::ACTIVE_DATETIME dan Tag::USAGE_EXPIRE_DATETIME. Nilai tersebut dalam milidetik sejak 1 Januari 1970. Lihat RFC 5280 untuk representasi tanggal yang benar dalam sertifikat.
Jika Tag::ACTIVE_DATETIME tidak ada, gunakan nilai Tag::CREATION_DATETIME. Jika Tag::USAGE_EXPIRE_DATETIME tidak ada, gunakan tanggal habis masa berlaku sertifikat kunci pengesahan batch.
subject CN = "Android Keystore Key" (nilai tetap: sama di semua sertifikat)
subjectPublicKeyInfo SubjectPublicKeyInfo yang berisi kunci publik yang dibuktikan.
extensions/Key Usage digitalSignature: ditetapkan jika kunci memiliki tujuan KeyPurpose::SIGN atau KeyPurpose::VERIFY. Semua bit lainnya tidak disetel.
extensions/CRL Distribution Points Nilai Ditentukan Nanti
extensions/"attestation" OID-nya adalah 1.3.6.1.4.1.11129.2.1.17; kontennya ditentukan di bagian Ekstensi pengesahan di bawah. Seperti semua ekstensi sertifikat X.509, konten direpresentasikan sebagai OCTET_STRING yang berisi encoding DER dari SEQUENCE pengesahan.

Ekstensi pengesahan

Ekstensi attestation memiliki OID 1.3.6.1.4.1.11129.2.1.17. File ini berisi informasi tentang pasangan kunci yang diautentikasi dan status perangkat pada waktu pembuatan kunci.

Jenis tag Keymaster/KeyMint yang ditentukan dalam spesifikasi antarmuka AIDL diterjemahkan ke jenis ASN.1 sebagai berikut:

Jenis Keymaster/KeyMint Jenis ASN.1 Catatan
ENUM INTEGER
ENUM_REP SET of INTEGER
UINT INTEGER
UINT_REP SET of INTEGER
ULONG INTEGER
ULONG_REP SET of INTEGER
DATE INTEGER Milidetik sejak 1 Januari 1970 00.00.00 GMT.
BOOL NULL Kehadiran tag berarti benar, ketidakhadiran berarti salah.
BIGNUM Tidak ada tag yang memiliki jenis ini, sehingga tidak ada pemetaan yang ditentukan.
BYTES OCTET_STRING

Skema

Konten ekstensi pengesahan dijelaskan oleh skema ASN.1 berikut:

Versi 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),
}

Versi 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),
}

Versi 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),
}

Versi 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),
}

Versi 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),
}

Versi 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),
}

Versi 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),
}

Kolom KeyDescription

attestationVersion
Versi skema ASN.1.
NilaiVersi Keymaster/KeyMint
1Keymaster versi 2.0
2Keymaster versi 3.0
3Keymaster versi 4.0
4Keymaster versi 4.1
100KeyMint versi 1.0
200KeyMint versi 2.0
300KeyMint versi 3.0
attestationSecurityLevel

Level keamanan lokasi tempat kunci yang diautentikasi disimpan.

keymasterVersion/keyMintVersion
Versi implementasi Keymaster/KeyMint hardware abstraction layer (HAL).
NilaiVersi Keymaster/KeyMint
2Keymaster versi 2.0
3Keymaster versi 3.0
4Keymaster versi 4.0
41Keymaster versi 4.1
100KeyMint versi 1.0
200KeyMint versi 2.0
300KeyMint versi 3.0
keymasterSecurityLevel/keyMintSecurityLevel
Level keamanan penerapan Keymaster/KeyMint.
attestationChallenge
Tantangan yang diberikan pada saat pembuatan kunci.
uniqueId
ID perangkat yang sensitif terhadap privasi yang dapat diminta aplikasi sistem pada waktu pembuatan kunci. Jika ID unik tidak diminta, kolom ini akan kosong. Untuk mengetahui detailnya, lihat bagian ID Unik.
softwareEnforced
Daftar otorisasi Keymaster/KeyMint yang diberlakukan oleh sistem Android. Informasi ini dikumpulkan atau dihasilkan oleh kode di platform dan disimpan di partisi sistem perangkat. Perangkat ini dapat dipercaya selama perangkat menjalankan sistem operasi yang mematuhi Model Keamanan Platform Android (yaitu, bootloader perangkat terkunci dan verifiedBootState adalah Verified).
hardwareEnforced
Daftar otorisasi Keymaster/KeyMint yang diberlakukan oleh Trusted Execution Environment (TEE) atau StrongBox perangkat. Informasi ini dikumpulkan atau dihasilkan oleh kode di hardware yang aman dan tidak dikontrol oleh platform. Misalnya, informasi dapat berasal dari bootloader atau melalui saluran komunikasi aman yang tidak melibatkan kepercayaan pada platform.

Nilai SecurityLevel

Nilai SecurityLevel menunjukkan sejauh mana elemen terkait Keystore (misalnya, pasangan kunci dan pengesahan) tahan terhadap serangan.

Nilai Arti
Software Aman selama sistem Android perangkat mematuhi Model Keamanan Platform Android (yaitu, bootloader perangkat terkunci dan verifiedBootState adalah Verified).
TrustedEnvironment Aman selama Trusted Execution Environment (TEE) tidak disusupi. Persyaratan isolasi untuk TEE ditentukan dalam bagian 9.11 [C-1-1] hingga [C-1-4] dari Android Compatibility Definition Document. TEE sangat tahan terhadap penyusupan jarak jauh dan cukup tahan terhadap penyusupan oleh serangan hardware langsung.
StrongBox Aman selama StrongBox tidak disusupi. StrongBox diimplementasikan dalam elemen pengaman yang mirip dengan modul keamanan hardware. Persyaratan penerapan untuk StrongBox ditentukan dalam bagian 9.11.2 dari Android Compatibility Definition Document. StrongBox sangat tahan terhadap penyusupan jarak jauh dan penyusupan oleh serangan hardware langsung (misalnya, modifikasi fisik dan serangan side-channel).

Kolom AuthorizationList

Setiap kolom sesuai dengan tag otorisasi Keymaster/KeyMint dari spesifikasi antarmuka AIDL. Spesifikasi ini adalah sumber tepercaya tentang tag otorisasi: maknanya, format kontennya, apakah tag tersebut diharapkan muncul di kolom softwareEnforced atau hardwareEnforced dalam objek KeyDescription, apakah tag tersebut saling eksklusif dengan tag lain, dll. Semua kolom AuthorizationList bersifat opsional.

Setiap kolom memiliki tag khusus konteks EXPLICIT yang sama dengan nomor tag Keymaster/KeyMint, yang memungkinkan representasi data yang lebih ringkas di AuthorizationList. Oleh karena itu, parser ASN.1 harus mengetahui jenis data yang diharapkan untuk setiap tag khusus konteks. Misalnya, Tag::USER_AUTH_TYPE ditentukan sebagai ENUM | 504. Dalam skema ekstensi pengesahan, kolom purpose di AuthorizationList ditentukan sebagai userAuthType [504] EXPLICIT INTEGER OPTIONAL. Oleh karena itu, encoding ASN.1-nya akan berisi tag khusus konteks 504, bukan tag class UNIVERSAL untuk INTEGER jenis ASN.1, yaitu 10.

purpose
Sesuai dengan tag otorisasi Tag::PURPOSE, yang menggunakan nilai ID tag 1.
algorithm

Sesuai dengan tag otorisasi Tag::ALGORITHM, yang menggunakan nilai ID tag 2.

Dalam objek AuthorizationList pengesahan, nilai algoritme selalu RSA atau EC.

keySize
Sesuai dengan tag otorisasi Tag::KEY_SIZE, yang menggunakan nilai ID tag 3.
digest
Sesuai dengan tag otorisasi Tag::DIGEST, yang menggunakan nilai ID tag 5.
padding
Sesuai dengan tag otorisasi Tag::PADDING, yang menggunakan nilai ID tag 6.
ecCurve

Sesuai dengan tag otorisasi Tag::EC_CURVE, yang menggunakan nilai ID tag 10.

Kumpulan parameter yang digunakan untuk menghasilkan pasangan kunci elliptic curve (EC), yang menggunakan ECDSA untuk menandatangani dan memverifikasi, dalam keystore sistem Android.

rsaPublicExponent
Sesuai dengan tag otorisasi Tag::RSA_PUBLIC_EXPONENT, yang menggunakan nilai ID tag 200.
mgfDigest

Hanya ada di pengesahan kunci versi >= 100.

Sesuai dengan tag otorisasi KeyMint Tag::RSA_OAEP_MGF_DIGEST, yang menggunakan nilai ID tag 203.
rollbackResistance

Hanya ada di pengesahan kunci versi >= 3.

Sesuai dengan tag otorisasi Tag::ROLLBACK_RESISTANCE, yang menggunakan nilai ID tag 303.

earlyBootOnly

Hanya ada di pengesahan kunci versi >= 4.

Sesuai dengan tag otorisasi Tag::EARLY_BOOT_ONLY, yang menggunakan nilai ID tag 305.

activeDateTime
Sesuai dengan tag otorisasi Tag::ACTIVE_DATETIME, yang menggunakan nilai ID tag 400.
originationExpireDateTime
Sesuai dengan tag otorisasi Keymaster Tag::ORIGINATION_EXPIRE_DATETIME, yang menggunakan nilai ID tag 401.
usageExpireDateTime
Sesuai dengan tag otorisasi Tag::USAGE_EXPIRE_DATETIME, yang menggunakan nilai ID tag 402.
usageCountLimit
Sesuai dengan tag otorisasi Tag::USAGE_COUNT_LIMIT, yang menggunakan nilai ID tag 405.
noAuthRequired

Sesuai dengan tag otorisasi Tag::NO_AUTH_REQUIRED, yang menggunakan nilai ID tag 503.

userAuthType
Sesuai dengan tag otorisasi Tag::USER_AUTH_TYPE, yang menggunakan nilai ID tag 504.
authTimeout
Sesuai dengan tag otorisasi Tag::AUTH_TIMEOUT, yang menggunakan nilai ID tag 505.
allowWhileOnBody

Sesuai dengan tag otorisasi Tag::ALLOW_WHILE_ON_BODY, yang menggunakan nilai ID tag 506.

Memungkinkan kunci untuk digunakan setelah periode waktu tunggu autentikasi jika pengguna masih mengenakan perangkat di tubuh mereka. Perhatikan bahwa sensor pada tubuh yang aman menentukan apakah perangkat sedang dikenakan pada tubuh pengguna.

trustedUserPresenceRequired

Hanya ada di pengesahan kunci versi >= 3.

Sesuai dengan tag otorisasi Tag::TRUSTED_USER_PRESENCE_REQUIRED, yang menggunakan nilai ID tag 507.

Menentukan bahwa kunci ini hanya dapat digunakan jika pengguna telah memberikan bukti kehadiran fisik. Beberapa contohnya meliputi:

  • Untuk kunci StrongBox, tombol hardware terpasang dengan pin pada perangkat StrongBox.
  • Untuk kunci TEE, autentikasi sidik jari memberikan bukti kehadiran fisik selama TEE memiliki kontrol eksklusif terhadap pemindai dan melakukan proses pencocokan sidik jari.
trustedConfirmationRequired

Hanya ada di pengesahan kunci versi >= 3.

Sesuai dengan tag otorisasi Tag::TRUSTED_CONFIRMATION_REQUIRED, yang menggunakan nilai ID tag 508.

Menentukan bahwa kunci hanya dapat digunakan jika pengguna memberikan konfirmasi data yang akan ditandatangani menggunakan token persetujuan. Untuk mengetahui informasi selengkapnya tentang cara mendapatkan konfirmasi pengguna, lihat Konfirmasi Dilindungi oleh Android.

Catatan: Tag ini hanya berlaku untuk kunci yang menggunakan tujuan SIGN.

unlockedDeviceRequired

Hanya ada di pengesahan kunci versi >= 3.

Sesuai dengan tag otorisasi Tag::UNLOCKED_DEVICE_REQUIRED, yang menggunakan nilai ID tag 509.

allApplications

Sesuai dengan tag otorisasi Tag::ALL_APPLICATIONS, yang menggunakan nilai ID tag 600.

Menunjukkan apakah semua aplikasi pada perangkat bisa mengakses pasangan kunci.

applicationId
Sesuai dengan tag otorisasi Tag::APPLICATION_ID, yang menggunakan nilai ID tag 601.
creationDateTime
Sesuai dengan tag otorisasi Tag::CREATION_DATETIME, yang menggunakan nilai ID tag 701.
origin

Sesuai dengan tag otorisasi Tag::ORIGIN, yang menggunakan nilai ID tag 702.

rollbackResistant

Hanya ada di pengesahan kunci versi 1 dan 2.

Sesuai dengan tag otorisasi Tag::ROLLBACK_RESISTANT, yang menggunakan nilai ID tag 703.

rootOfTrust

Sesuai dengan tag otorisasi Tag::ROOT_OF_TRUST, yang menggunakan nilai ID tag 704.

Untuk mengetahui detail selengkapnya, lihat bagian yang menjelaskan struktur data RootOfTrust.

osVersion

Sesuai dengan tag otorisasi Tag::OS_VERSION, yang menggunakan nilai ID tag 705.

Versi sistem operasi Android yang berhubungan dengan Keymaster, ditetapkan sebagai bilangan bulat enam digit. Misalnya, versi 8.1.0 ditampilkan sebagai 080100.

Hanya Keymaster versi 1.0 atau lebih tinggi yang memasukkan nilai ini dalam daftar otorisasi.

osPatchLevel

Sesuai dengan tag otorisasi Tag::PATCHLEVEL, yang menggunakan nilai ID tag 706.

Bulan dan tahun yang terkait dengan patch keamanan yang digunakan dalam Keymaster, ditetapkan sebagai bilangan bulat enam digit. Misalnya, patch Agustus 2018 ditampilkan sebagai 201808.

Hanya Keymaster versi 1.0 atau lebih tinggi yang memasukkan nilai ini dalam daftar otorisasi.

attestationApplicationId

Hanya ada di pengesahan kunci versi >= 2.

Sesuai dengan tag otorisasi Keymaster Tag::ATTESTATION_APPLICATION_ID, yang menggunakan nilai ID tag 709.

Untuk mengetahui detail selengkapnya, lihat bagian yang menjelaskan struktur data AttestationApplicationId.

attestationIdBrand

Hanya ada di pengesahan kunci versi >= 2.

Sesuai dengan tag Keymaster Tag::ATTESTATION_ID_BRAND, yang menggunakan nilai ID tag 710.

attestationIdDevice

Hanya ada di pengesahan kunci versi >= 2.

Sesuai dengan tag Keymaster Tag::ATTESTATION_ID_DEVICE, yang menggunakan nilai ID tag 711.

attestationIdProduct

Hanya ada di pengesahan kunci versi >= 2.

Sesuai dengan tag Keymaster Tag::ATTESTATION_ID_PRODUCT, yang menggunakan nilai ID tag 712.

attestationIdSerial

Hanya ada di pengesahan kunci versi >= 2.

Sesuai dengan tag Keymaster Tag::ATTESTATION_ID_SERIAL, yang menggunakan nilai ID tag 713.

attestationIdImei

Hanya ada di pengesahan kunci versi >= 2.

Sesuai dengan tag otorisasi Tag::ATTESTATION_ID_IMEI, yang menggunakan nilai ID tag 714.

attestationIdMeid

Hanya ada di pengesahan kunci versi >= 2.

Sesuai dengan tag otorisasi Tag::ATTESTATION_ID_MEID, yang menggunakan nilai ID tag 715.

attestationIdManufacturer

Hanya ada di pengesahan kunci versi >= 2.

Sesuai dengan tag otorisasi Tag::ATTESTATION_ID_MANUFACTURER, yang menggunakan nilai ID tag 716.

attestationIdModel

Hanya ada di pengesahan kunci versi >= 2.

Sesuai dengan tag otorisasi Tag::ATTESTATION_ID_MODEL, yang menggunakan nilai ID tag 717.

vendorPatchLevel

Hanya ada di pengesahan kunci versi >= 3.

Sesuai dengan tag otorisasi Tag::VENDOR_PATCHLEVEL, yang menggunakan nilai ID tag 718.

Menentukan level patch keamanan image vendor yang harus diinstal pada perangkat agar kunci ini dapat digunakan. Nilai muncul dalam format YYYYMMDD, yang menampilkan tanggal patch keamanan vendor. Misalnya, jika kunci dibuat pada perangkat Android dengan patch keamanan vendor 1 Agustus 2018 terinstal, nilainya adalah 20180801.

bootPatchLevel

Hanya ada di pengesahan kunci versi >= 3.

Sesuai dengan tag otorisasi Tag::BOOT_PATCHLEVEL, yang menggunakan nilai ID tag 719.

Menentukan level patch keamanan image kernel yang harus diinstal pada perangkat agar kunci ini dapat digunakan. Nilai muncul dalam format YYYYMMDD, yang menampilkan tanggal patch keamanan sistem. Misalnya, jika kunci dibuat pada perangkat Android dengan patch keamanan sistem 5 Agustus 2018 terinstal, nilainya adalah 20180805.

deviceUniqueAttestation

Hanya ada di pengesahan kunci versi >= 4.

Sesuai dengan tag otorisasi Tag::DEVICE_UNIQUE_ATTESTATION, yang menggunakan nilai ID tag 720.

attestationIdSecondImei

Hanya ada di pengesahan kunci versi >= 300.

Sesuai dengan tag otorisasi Tag::ATTESTATION_ID_SECOND_IMEI, yang menggunakan nilai ID tag 723.

Kolom RootOfTrust

verifiedBootKey
Hash aman dari kunci publik yang digunakan untuk memverifikasi integritas dan autentikasi semua kode yang dieksekusi selama perangkat melakukan booting sebagai bagian dari Booting Terverifikasi. SHA-256 direkomendasikan.
deviceLocked
Apakah bootloader perangkat terkunci. true berarti bahwa perangkat mem-booting image bertanda tangan yang berhasil diverifikasi oleh Booting Terverifikasi.
verifiedBootState
Status Booting Terverifikasi perangkat.
verifiedBootHash
Ringkasan semua data yang dilindungi oleh Booting Terverifikasi. Untuk perangkat yang menggunakan implementasi acuan Android Verified Boot, kolom ini berisi ringkasan VBMeta.

Nilai VerifiedBootState

Nilai Status booting yang sesuai Arti
Verified GREEN Rantai kepercayaan lengkap diperluas dari root of trust yang dilindungi hardware ke bootloader dan semua partisi yang diverifikasi oleh Booting Terverifikasi. Dalam status ini, kolom verifiedBootKey berisi hash root of trust tersemat, yang merupakan sertifikat yang disematkan di ROM perangkat oleh produsen perangkat di pabrik.
SelfSigned YELLOW Sama seperti Verified, kecuali verifikasi dilakukan menggunakan root kepercayaan yang dikonfigurasi oleh pengguna, bukan root kepercayaan yang disematkan oleh produsen di factory. Dalam status ini, kolom verifiedBootKey berisi hash kunci publik yang dikonfigurasi oleh pengguna.
Unverified ORANGE Bootloader perangkat tidak terkunci, sehingga rantai kepercayaan tidak dapat dibuat. Perangkat dapat dimodifikasi secara bebas sehingga integritas perangkat harus diverifikasi oleh pengguna di luar band. Dalam status ini, kolom verifiedBootKey berisi 32 byte angka nol.
Failed RED Perangkat gagal diverifikasi. Dalam status ini, tidak ada jaminan tentang konten kolom RootOfTrust lainnya.

AttestationApplicationId

Kolom ini mencerminkan keyakinan platform Android terhadap aplikasi mana yang diizinkan untuk menggunakan materi kunci rahasia dalam pengesahan. ID ini dapat berisi beberapa paket jika dan hanya jika beberapa paket memiliki UID yang sama. Kolom AttestationApplicationId di AuthorizationList berjenis OCTET_STRING dan diformat sesuai dengan skema ASN.1 berikut:

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

AttestationPackageInfo ::= SEQUENCE {
    package_name  OCTET_STRING,
    version  INTEGER,
}
package_infos
Serangkaian objek AttestationPackageInfo, yang masing-masing memberikan nama paket dan nomor versi.
signature_digests

Serangkaian ringkasan SHA-256 dari sertifikat penandatanganan aplikasi. Satu aplikasi dapat memiliki beberapa rantai sertifikat kunci penandatanganan. Untuk setiap rantai, sertifikat entitas akhir diringkas dan ditempatkan di kolom signature_digests. Nama kolom ini menyesatkan karena data yang diringkas adalah sertifikat penandatanganan aplikasi, bukan tanda tangan aplikasi, karena diberi nama untuk Signature class yang ditampilkan lewat panggilan ke getPackageInfo(). Cuplikan kode berikut menunjukkan kumpulan contoh:

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

ID unik

ID Unik adalah nilai 128-bit yang mengidentifikasi perangkat, tetapi hanya selama jangka waktu terbatas. Nilai dihitung dengan:

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

Dalam hal ini:

  • T adalah "nilai penghitung temporal", yang dihitung dengan membagi nilai Tag::CREATION_DATETIME dengan 2592000000, dengan menghapus sisanya. T berubah setiap 30 hari (2592000000 = 30 * 24 * 60 * 60 * 1000).
  • C adalah nilai Tag::APPLICATION_ID
  • R adalah 1 jika Tag::RESET_SINCE_ID_ROTATION ada dalam parameter attest_params ke panggilan attest_key, atau 0 jika tag tidak ada.
  • HBK adalah secret unik yang terikat hardware yang diketahui oleh Trusted Execution Environment dan tidak pernah diungkapkan olehnya. Secret berisi setidaknya 128 bit entropi dan unik untuk setiap perangkat (keunikan probabilistik dapat diterima mengingat 128 bit entropi). HBK harus berasal dari materi kunci gabungan melalui HMAC atau AES_CMAC.

Memotong output HMAC_SHA256 menjadi 128 bit.

Kunci dan sertifikat pengesahan

Dua kunci, satu RSA dan satu ECDSA, serta rantai sertifikat terkait, disediakan dengan aman ke dalam perangkat.

Android 12 memperkenalkan Penyediaan Kunci Jarak Jauh, dan Android 13 mewajibkan perangkat menerapkan fitur ini. Penyediaan Kunci Jarak Jauh menyediakan sertifikat pengesahan ECDSA P256 per aplikasi untuk perangkat di lapangan. Sertifikat ini berumur lebih pendek daripada sertifikat yang disediakan pabrik.

Beberapa IMEI

Android 14 menambahkan dukungan untuk beberapa IMEI dalam data Pengesahan Kunci Android. OEM dapat menerapkan fitur ini dengan menambahkan tag KeyMint untuk IMEI kedua. Perangkat yang memiliki beberapa radio seluler kini semakin umum, dan OEM kini dapat mendukung perangkat dengan dua IMEI.

OEM diwajibkan untuk memiliki IMEI sekunder, jika ada di perangkat mereka, untuk disediakan ke implementasi KeyMint sehingga implementasi tersebut dapat menandatanganinya dengan cara yang sama seperti menandatangani IMEI pertama

Pengesahan ID

Android 8.0 menyertakan dukungan opsional untuk pengesahan ID bagi perangkat dengan Keymaster 3. Pengesahan ID memungkinkan perangkat memberikan bukti ID hardware-nya, seperti nomor seri atau IMEI. Meskipun merupakan fitur opsional, sebaiknya semua implementasi Keymaster 3 memberikan dukungan untuknya karena dapat membuktikan identitas perangkat memungkinkan kasus penggunaan seperti konfigurasi jarak jauh zero-touch yang sebenarnya menjadi lebih aman (karena sisi jarak jauh dapat yakin bahwa perangkat tersebut terhubung ke perangkat yang tepat, bukan perangkat yang melakukan spoofing identitas).

Pengesahan ID berfungsi dengan membuat salinan ID hardware perangkat yang hanya dapat diakses oleh Trusted Execution Environment (TEE) sebelum perangkat keluar dari pabrik. Pengguna dapat membuka kunci bootloader perangkat dan mengubah software sistem dan ID yang dilaporkan oleh framework Android. Salinan ID yang disimpan oleh TEE tidak dapat dimanipulasi dengan cara ini, sehingga memastikan bahwa pengesahan ID perangkat hanya mengesahkan ID hardware asli perangkat, sehingga menggagalkan upaya spoofing.

Platform API utama untuk pengesahan ID dibuat di atas mekanisme pengesahan kunci yang ada dan diperkenalkan dengan Keymaster 2. Saat meminta sertifikat pengesahan untuk kunci yang dipegang oleh keymaster, pemanggil dapat meminta agar ID hardware perangkat disertakan dalam metadata sertifikat pengesahan. Jika kunci disimpan di TEE, sertifikat akan dirantai kembali ke root kepercayaan yang diketahui. Penerima sertifikat tersebut dapat memverifikasi bahwa sertifikat dan kontennya, termasuk ID hardware, ditulis oleh TEE. Saat diminta untuk menyertakan ID hardware dalam sertifikat pengesahan, TEE hanya membuktikan ID yang disimpan di penyimpanannya, seperti yang diisi di lantai pabrik.

Properti penyimpanan

Penyimpanan yang menyimpan ID perangkat harus memiliki properti berikut:

  • Nilai yang berasal dari ID asli perangkat disalin ke penyimpanan sebelum perangkat keluar dari pabrik.
  • Metode destroyAttestationIds() dapat menghancurkan salinan data turunan ID ini secara permanen. Penghancuran permanen berarti data dihapus sepenuhnya sehingga reset pabrik atau prosedur lain yang dilakukan pada perangkat tidak dapat memulihkannya. Hal ini sangat penting untuk perangkat yang penggunanya telah membuka kunci bootloader dan mengubah software sistem serta memodifikasi ID yang ditampilkan oleh framework Android.
  • Fasilitas RMA harus memiliki kemampuan untuk menghasilkan salinan baru dari data yang berasal dari ID hardware. Dengan cara ini, perangkat yang melewati RMA dapat melakukan pengesahan ID lagi. Mekanisme yang digunakan oleh fasilitas RMA harus dilindungi agar pengguna tidak dapat memanggilnya sendiri, karena hal itu akan memungkinkan mereka mendapatkan pengesahan ID yang di-spoof.
  • Tidak ada kode selain aplikasi tepercaya Keymaster di TEE yang dapat membaca data turunan ID yang disimpan di penyimpanan.
  • Penyimpanan tidak dapat dirusak: Jika konten penyimpanan telah diubah, TEE akan memperlakukannya sama seperti salinan konten telah dihancurkan dan menolak semua upaya pengesahan ID. Hal ini diterapkan dengan menandatangani atau melakukan MACing pada penyimpanan seperti yang dijelaskan di bawah.
  • Penyimpanan tidak menyimpan ID asli. Karena pengesahan ID melibatkan tantangan, pemanggil selalu memberikan ID yang akan diverifikasi. TEE hanya perlu memverifikasi bahwa nilai tersebut cocok dengan nilai yang awalnya dimiliki. Menyimpan hash yang aman dari nilai asli, bukan nilainya, akan memungkinkan verifikasi ini.

Konstruksi

Untuk membuat implementasi yang memiliki properti yang tercantum di atas, simpan nilai turunan ID dalam konstruksi S berikut. Jangan simpan salinan lain nilai ID, kecuali tempat normal dalam sistem, yang dapat diubah oleh pemilik perangkat dengan melakukan root:

S = D || HMAC(HBK, D)

dalam hal ini:

  • D = HMAC(HBK, ID1) || HMAC(HBK, ID2) || ... || HMAC(HBK, IDn)
  • HMAC adalah konstruksi HMAC dengan hash aman yang sesuai (SHA-256 direkomendasikan)
  • HBK adalah kunci yang terikat dengan hardware dan tidak digunakan untuk tujuan lain
  • ID1...IDn adalah nilai ID asli; pengaitan nilai tertentu ke indeks tertentu bergantung pada implementasi, karena perangkat yang berbeda memiliki jumlah ID yang berbeda
  • || mewakili penyambungan

Karena output HMAC memiliki ukuran tetap, tidak ada header atau struktur lain yang diperlukan untuk dapat menemukan hash ID individual, atau HMAC D. Selain memeriksa nilai yang diberikan untuk melakukan pengesahan, implementasi perlu memvalidasi S dengan mengekstrak D dari S, mengomputasi HMAC(HBK, D) dan membandingkannya dengan nilai di S untuk memverifikasi bahwa tidak ada ID individu yang dimodifikasi/rusak. Selain itu, implementasi harus menggunakan perbandingan waktu konstan untuk semua elemen ID individual dan validasi S. Waktu perbandingan harus konstan, terlepas dari jumlah ID yang diberikan dan pencocokan yang benar dari bagian pengujian mana pun.

Pengidentifikasi hardware

Pengesahan ID mendukung ID hardware berikut:

  1. Nama merek, seperti yang ditampilkan oleh Build.BRAND di Android
  2. Nama perangkat, seperti yang ditampilkan oleh Build.DEVICE di Android
  3. Nama produk, seperti yang ditampilkan oleh Build.PRODUCT di Android
  4. Nama produsen, seperti yang ditampilkan oleh Build.MANUFACTURER di Android
  5. Nama model, seperti yang ditampilkan oleh Build.MODEL di Android
  6. Nomor seri
  7. IMEI semua radio
  8. MEID semua radio

Untuk mendukung pengesahan ID perangkat, perangkat akan mengautentikasi ID ini. Semua perangkat yang menjalankan Android memiliki enam yang pertama dan diperlukan agar fitur ini berfungsi. Jika perangkat memiliki radio seluler terintegrasi, perangkat juga harus mendukung pengesahan untuk IMEI dan/atau MEID radio.

Pengesahan ID diminta dengan melakukan pengesahan kunci dan menyertakan ID perangkat untuk dibuktikan dalam permintaan. ID diberi tag sebagai:

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

ID yang akan dibuktikan adalah string byte berenkode UTF-8. Format ini juga berlaku untuk ID numerik. Setiap ID yang akan dibuktikan dinyatakan sebagai string yang dienkode UTF-8.

Jika perangkat tidak mendukung pengesahan ID (atau destroyAttestationIds() sebelumnya dipanggil dan perangkat tidak dapat lagi membuktikan ID-nya), setiap permintaan pengesahan kunci yang menyertakan satu atau beberapa tag ini akan gagal dengan ErrorCode::CANNOT_ATTEST_IDS.

Jika perangkat mendukung pengesahan ID dan satu atau beberapa tag di atas telah disertakan dalam permintaan pengesahan kunci, TEE akan memverifikasi ID yang disertakan dengan setiap tag yang cocok dengan salinan ID hardware-nya. Jika satu atau beberapa ID tidak cocok, seluruh pengesahan akan gagal dengan ErrorCode::CANNOT_ATTEST_IDS. Tag yang sama dapat disediakan beberapa kali. Hal ini dapat berguna, misalnya, saat membuktikan IMEI: Perangkat dapat memiliki beberapa radio dengan beberapa IMEI. Permintaan pengesahan valid jika nilai yang diberikan dengan setiap ATTESTATION_ID_IMEI cocok dengan salah satu radio perangkat. Hal yang sama berlaku untuk semua tag lainnya.

Jika pengesahan berhasil, ID yang disahkan akan ditambahkan ke ekstensi pengesahan (OID 1.3.6.1.4.1.11129.2.1.17) dari sertifikat pengesahan yang diterbitkan, menggunakan skema dari di atas. Perubahan dari skema pengesahan Keymaster 2 dicetak tebal, dengan komentar.

Java API

Bagian ini hanya berisi informasi. Implementer Keymaster tidak menerapkan atau menggunakan Java API. Informasi ini diberikan untuk membantu pengimplementasi memahami cara fitur ini digunakan oleh aplikasi. Komponen sistem mungkin menggunakannya secara berbeda, itulah sebabnya bagian ini tidak boleh diperlakukan sebagai normatif.