Memverifikasi pasangan kunci yang didukung hardware dengan Pengesahan Kunci

Pengesahan Kunci memberi Anda keyakinan lebih bahwa kunci yang Anda gunakan dalam aplikasi disimpan dalam keystore yang didukung hardware perangkat. Bagian berikut menjelaskan cara memverifikasi properti kunci yang didukung hardware dan cara menafsirkan skema dari data ekstensi sertifikat pengesahan.

Catatan: Sebelum Anda memverifikasi properti kunci yang didukung hardware di perangkat dalam lingkungan level produksi, Anda harus memastikan bahwa perangkat mendukung pengesahan kunci level hardware. Untuk melakukannya, Anda harus memastikan bahwa rantai sertifikat pengesahan berisi root certificate yang ditandatangani oleh kunci utama pengesahan Google dan bahwa elemen attestationSecurityLevel dalam struktur data deskripsi kunci disetel ke level keamanan TrustedEnvironment.

Selain itu, penting untuk memverifikasi tanda tangan dalam rantai sertifikat dan memeriksa bahwa tidak ada kunci dalam rantai yang dicabut dengan memeriksa endpoint Daftar Pencabutan Sertifikat yang tercantum dalam setiap sertifikat. Jika semuanya valid dan root adalah kunci utama Google yang disebutkan di atas, Anda tidak harus sepenuhnya memercayai pengesahan tersebut. Namun, perlu diketahui bahwa perangkat yang berisi sertifikat yang dicabut setidaknya masih dapat dipercaya seperti perangkat yang hanya mendukung pengesahan software. Adanya pengesahan yang sepenuhnya valid menjadi indikator positif yang kuat. Tidak adanya pengesahan merupakan indikator netral, bukan negatif.

Mengambil dan memverifikasi pasangan kunci yang didukung hardware

Pada saat pengesahan kunci, Anda akan menentukan nama alias pasangan kunci. Sebagai gantinya, fitur pengesahan menyediakan rantai sertifikat, yang dapat Anda gunakan untuk memverifikasi properti pasangan kunci tersebut.

Jika perangkat mendukung pengesahan kunci level hardware, root certificate dalam rantai ditandatangani menggunakan kunci utama pengesahan, yang dimasukkan produsen perangkat ke dalam keystore yang didukung hardware pada perangkat di pabrik pembuatan.

Catatan: Pada perangkat yang dikirimkan dengan pengesahan kunci level hardware, Android 7.0 (API level 24) atau lebih tinggi, dan layanan Google Play, root certificate ditandatangani dengan kunci utama pengesahan Google. Anda harus memastikan bahwa root certificate tersebut adalah yang tercantum di bawah ini.

Untuk mengimplementasikan pengesahan kunci, lakukan langkah-langkah berikut:

  1. Gunakan metode getCertificateChain() objek KeyStore untuk mendapatkan referensi ke rantai sertifikat X.509 yang terkait dengan keystore yang didukung hardware.
  2. Periksa validitas setiap sertifikat menggunakan metode checkValidity() objek X509Certificate. Selain itu, pastikan bahwa root certificate dapat dipercaya.

    Perhatian: Memeriksa daftar pencabutan sertifikat pada server terpisah yang Anda percayai akan lebih aman, meskipun Anda dapat menyelesaikan proses ini di dalam aplikasi secara langsung.

  3. Pada server terpisah yang Anda percayai, dapatkan referensi ke koleksi parser ASN.1 yang paling sesuai untuk toolset Anda. Gunakan parser ini untuk mengekstraksi data ekstensi sertifikat pengesahan, yang muncul dalam elemen pertama rantai sertifikat.

    Sampel Pengesahan Kunci menggunakan parser ASN.1 dari Bouncy Castle untuk mengekstraksi data ekstensi sertifikat pengesahan. Anda dapat menggunakan sampel ini sebagai referensi untuk membuat parser Anda sendiri.

    Untuk detail selengkapnya tentang skema data ekstensi, lihat Skema Data Ekstensi Sertifikat.

  4. Bandingkan data ekstensi yang telah Anda ambil dari parser ASN.1 dengan serangkaian nilai yang Anda perkirakan berisi kunci yang didukung hardware.

    Perhatian: Memeriksa data ekstensi sertifikat pada server terpisah yang Anda percayai akan lebih aman, meskipun Anda dapat menyelesaikan proses ini di dalam aplikasi secara langsung.

Root certificate

Validitas pengesahan tergantung pada root certificate rantai. Perangkat Android yang telah lulus pengujian harus memiliki rangkaian aplikasi Google, termasuk Google Play, dan yang diluncurkan dengan Android 7.0 (API level 24) atau lebih tinggi harus menggunakan kunci pengesahan yang ditandatangani oleh sertifikat Root Pengesahan Hardware Google. Sertifikat tersebut adalah:

      -----BEGIN CERTIFICATE-----
      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
      -----END CERTIFICATE-----
    

Jika root certificate dalam rantai pengesahan yang Anda terima adalah sertifikat di atas dan tidak ada sertifikat dalam rantai yang dicabut, dapat dipastikan bahwa:

  1. Kunci Anda berada di hardware yang Google yakini aman; dan
  2. Kunci memiliki properti yang dijelaskan dalam sertifikat pengesahan.

Jika rantai pengesahan memiliki root certificate lain, Google tidak membuat klaim apa pun tentang keamanan hardware. Bukan berarti bahwa kunci Anda disusupi, hanya saja pengesahan tidak membuktikan bahwa kunci tersebut berada di hardware yang aman. Dengan demikian, Anda harus menyesuaikan asumsi keamanan Anda.

Jika root certificate bukanlah yang tercantum di atas, ada dua kemungkinan alasan:

  • Kemungkinan besar, perangkat diluncurkan dengan versi Android di bawah versi 7.0 dan tidak mendukung pengesahan hardware. Dalam hal ini, Android memiliki implementasi software pengesahan yang menghasilkan sertifikat pengesahan yang sama, tetapi ditandatangani dengan kunci hardcode dalam kode sumber Android.. Karena kunci penandatanganan ini tidak bersifat rahasia, pengesahan bisa saja dibuat oleh penyerang yang berpura-pura menyediakan hardware yang aman.
  • Kemungkinan alasan lainnya adalah bahwa perangkat tersebut bukanlah perangkat Google Play. Dalam hal ini, pembuat perangkat bebas untuk membuat root mereka sendiri dan membuat klaim apa pun yang mereka inginkan tentang arti pengesahan tersebut. Lihat dokumentasi pembuat perangkat. Perhatikan bahwa sejak tulisan ini, Google tidak mengetahui adanya pembuat perangkat yang telah melakukan hal ini.

Skema data ekstensi sertifikat

Pengesahan kunci akan memverifikasi data ekstensi yang muncul di sertifikat pertama dalam rantai di keystore yang didukung hardware perangkat. Sertifikat menyimpan informasi sesuai dengan skema ASN.1. Untuk melihat skema yang sesuai dengan versi pengesahan yang Anda gunakan, pilih tab yang sesuai di daftar skema berikut:

Versi 3

    KeyDescription ::= SEQUENCE {
        attestationVersion  3,
        attestationSecurityLevel  SecurityLevel,
        keymasterVersion  INTEGER,
        keymasterSecurityLevel  SecurityLevel,
        attestationChallenge  OCTET_STRING,
        uniqueId  OCTET_STRING,
        softwareEnforced  AuthorizationList,
        teeEnforced  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,
        applicationId  [601] EXPLICIT OCTET_STRING 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,
        teeEnforced  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,
        applicationId  [601] EXPLICIT OCTET_STRING 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,
        teeEnforced  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,
        applicationId  [601] EXPLICIT OCTET_STRING 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),
    }
    

Daftar berikut menampilkan deskripsi dari setiap elemen dalam skema:

KeyDescription

Urutan nilai ini menampilkan informasi umum tentang pasangan kunci yang diverifikasi melalui pengesahan kunci dan menyediakan akses mudah ke detail tambahan.

attestationVersion
Versi fitur pengesahan kunci.
attestationSecurityLevel

Level keamanan pengesahan.

Peringatan: Meskipun ada kemungkinan untuk mengesahkan kunci yang disimpan dalam sistem Android, yaitu, jika nilai attestationSecurityLevel diatur ke Software, Anda tidak dapat memercayai pengesahan ini jika sistem Android disusupi.

keymasterVersion
Versi Keymaster hardware abstraction layer (HAL). Gunakan 0 untuk menyatakan versi 0.2 atau 0.3, 1 untuk menyatakan versi 1.0, dan 2 untuk menyatakan versi 2.0.
keymasterSecurityLevel
Level keamanan implementasi Keymaster.
uniqueId
Nilai tersebut mengidentifikasi perangkat, tetapi hanya selama jangka waktu terbatas. Nilai dihitung dan hanya digunakan oleh aplikasi sistem. Di semua aplikasi lain, uniqueId kosong.
softwareEnforced
Opsional. Daftar otorisasi Keymaster yang diberlakukan oleh sistem Android, bukan oleh TEE perangkat.
teeEnforced
Opsional. Daftar otorisasi Keymaster yang diberlakukan oleh TEE perangkat.

SecurityLevel

Struktur data ini menunjukkan sejauh mana fitur software, seperti pasangan kunci, dilindungi berdasarkan lokasi dalam perangkat.

Karena struktur data berupa enumerasi, struktur tersebut secara tepat menggunakan salah satu nilai berikut:

Software
Logika untuk membuat dan mengelola fitur ini diimplementasikan dalam sistem Android. Untuk keperluan pembuatan dan penyimpanan pasangan kunci, lokasi ini kurang aman dibandingkan TEE, tetapi lebih aman dibandingkan ruang proses aplikasi Anda.
TrustedEnvironment
Logika untuk membuat dan mengelola fitur ini diimplementasikan dalam hardware yang aman, seperti TEE. Untuk keperluan pembuatan dan penyimpanan pasangan kunci, lokasi ini lebih aman karena hardware yang aman sangat tahan terhadap penyusupan jarak jauh.
StrongBox
Logika untuk membuat dan mengelola fitur ini diimplementasikan dalam modul keamanan hardware khusus. Untuk keperluan pembuatan dan penyimpanan pasangan kunci, lokasi ini lebih aman karena sangat tahan terhadap penyusupan jarak jauh dan serangan hardware terhadap modul.

AuthorizationList

Struktur data ini berisi properti pasangan kunci itu sendiri, seperti yang dijelaskan dalam Keymaster hardware abstraction layer (HAL). Anda membandingkan nilai ini dengan status perangkat saat ini atau dengan kumpulan nilai yang diharapkan guna memverifikasi bahwa pasangan kunci masih valid untuk digunakan dalam aplikasi Anda.

Setiap nama bidang terkait dengan tag otorisasi Keymaster yang serupa. Misalnya, bidang keySize dalam daftar otorisasi terkait dengan tag otorisasi Keymaster Tag::KEY_SIZE.

Setiap bidang dalam daftar berikut bersifat opsional:

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

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

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

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

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

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

rsaPublicExponent
Berkaitan dengan tag otorisasi Keymaster Tag::RSA_PUBLIC_EXPONENT, yang menggunakan nilai ID tag 200.
rollbackResistance

Hanya ada di pengesahan kunci versi 3.

Berkaitan dengan tag otorisasi Keymaster Tag::ROLLBACK_RESISTANT, yang menggunakan nilai ID tag 303.

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

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

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

Berkaitan dengan tag otorisasi Keymaster 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.

Berkaitan dengan tag otorisasi Keymaster 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 default untuk 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.

Berkaitan dengan tag otorisasi Keymaster 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 lebih lanjut 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.

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

allApplications

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

Menunjukkan apakah semua aplikasi pada perangkat bisa mengakses pasangan kunci.

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

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

rollbackResistant

Hanya ada di pengesahan kunci versi 1 dan 2.

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

rootOfTrust

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

Untuk detail lebih lanjut, lihat bagian yang menjelaskan struktur data RootOfTrust.

osVersion

Berkaitan dengan tag otorisasi Keymaster 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.0.1 ditampilkan sebagai 080100.

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

osPatchLevel

Berkaitan dengan tag otorisasi Keymaster 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 dan 3.

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

Untuk detail lebih lanjut, lihat bagian yang menjelaskan struktur data AttestationApplicationId.

attestationIdBrand

Hanya ada di pengesahan kunci versi 2 dan 3.

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

attestationIdDevice

Hanya ada di pengesahan kunci versi 2 dan 3.

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

attestationIdProduct

Hanya ada di pengesahan kunci versi 2 dan 3.

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

attestationIdSerial

Hanya ada di pengesahan kunci versi 2 dan 3.

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

attestationIdImei

Hanya ada di pengesahan kunci versi 2 dan 3.

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

attestationIdMeid

Hanya ada di pengesahan kunci versi 2 dan 3.

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

attestationIdManufacturer

Hanya ada di pengesahan kunci versi 2 dan 3.

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

attestationIdModel

Hanya ada di pengesahan kunci versi 2 dan 3.

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

vendorPatchLevel

Hanya ada di pengesahan kunci versi 3.

Berkaitan dengan tag otorisasi Keymaster 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 merepresentasikan tanggal patch keamanan vendor. Misalnya, jika kunci dibuat pada perangkat Android dengan patch keamanan vendor 1 Agustus 2018 yang terinstal, nilainya adalah 20180801.

bootPatchLevel

Hanya ada di pengesahan kunci versi 3.

Berkaitan dengan tag otorisasi Keymaster 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 merepresentasikan tanggal patch keamanan sistem. Misalnya, jika kunci dibuat pada perangkat Android dengan patch keamanan sistem 5 Agustus 2018 yang terinstal, nilainya adalah 20180805.

RootOfTrust

Kumpulan nilai ini menjelaskan informasi penting tentang status perangkat.

Setiap bidang dalam daftar berikut bersifat wajib:

verifiedBootKey

Hash aman dari kunci yang memverifikasi gambar sistem. Disarankan agar Anda menggunakan algoritme SHA-256 untuk hash ini.

deviceLocked
Bernilai True jika bootloader perangkat terkunci, yang memungkinkan Booting Terverifikasi memeriksa dan mencegah agar image perangkat yang tidak terdaftar tidak di-flash ke perangkat. Untuk informasi selengkapnya tentang fitur ini, lihat dokumentasi Booting Terverifikasi.
verifiedBootState
Status booting perangkat, sesuai dengan fitur Booting Terverifikasi.
verifiedBootHash

Hanya ada di pengesahan kunci versi 3.

Ringkasan semua data yang dilindungi oleh Booting Terverifikasi. Untuk perangkat yang menggunakan implementasi Booting Terverifikasi, nilai ini berisi ringkasan VBMeta struct, atau struktur metadata Booting Terverifikasi.

Untuk mempelajari lebih lanjut cara menghitung nilai ini, lihat The VBMeta Digest.

osVersion
Versi sistem operasi Android saat ini pada perangkat, ditetapkan sebagai bilangan bulat enam digit. Misalnya, versi 8.0.1 ditampilkan sebagai 080100.
patchMonthYear
Bulan dan tahun yang terkait dengan patch keamanan yang saat ini diinstal pada perangkat, ditetapkan sebagai bilangan bulat enam digit. Misalnya, patch Agustus 2018 ditampilkan sebagai 201808.

VerifiedBootState

Struktur data ini memberikan status booting perangkat saat ini, yang merepresentasikan level perlindungan yang diberikan ke pengguna dan aplikasi setelah perangkat menyelesaikan booting. Untuk informasi selengkapnya tentang fitur ini, lihat bagian Status Booting dalam dokumentasi Booting Terverifikasi.

Struktur data ini berupa enumerasi, jadi struktur ini secara tepat menggunakan salah satu nilai berikut:

Terverifikasi

Menunjukkan rantai kepercayaan penuh, yang meliputi bootloader, partisi booting, dan semua partisi terverifikasi.

Ketika perangkat dalam keadaan booting, verifiedBootKey adalah hash dari sertifikat yang disematkan perangkat, yang ditambahkan oleh produsen perangkat ke ROM perangkat di pabrik.

SelfSigned

Menunjukkan bahwa sertifikat yang disematkan perangkat telah memverifikasi partisi booting perangkat dan bahwa tanda tangan tersebut valid.

Ketika perangkat dalam keadaan booting, verifiedBootKey adalah hash dari sertifikat yang diinstal pengguna, yang menandatangani partisi booting yang ditambahkan pengguna ke perangkat sebagai pengganti partisi booting asli, yang disediakan oleh pabrik.

Belum diverifikasi
Menunjukkan bahwa pengguna dapat leluasa memodifikasi perangkat. Oleh karena itu, pengguna bertanggung jawab untuk memverifikasi integritas perangkat.
Gagal
Menunjukkan bahwa perangkat gagal diverifikasi. Sertifikat pengesahan tidak boleh menggunakan nilai ini untuk VerifiedBootState.

AttestationApplicationId

Struktur data ini mencerminkan keyakinan platform Android terhadap aplikasi mana yang diizinkan untuk menggunakan materi kunci rahasia dalam pengesahan. ID dapat terdiri dari beberapa paket jika dan hanya jika beberapa paket memiliki UID yang sama. String octet itu sendiri 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 blob tanda tangan aplikasi, seperti yang ada dalam bidang signatures PackageInfo yang ditampilkan setelah panggilan ke getPackageInfo(). Cuplikan kode berikut menunjukkan kumpulan contoh:

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