Google berkomitmen untuk memajukan ekuitas ras untuk komunitas kulit hitam. Lihat bagaimana.
Halaman ini diterjemahkan oleh Cloud Translation API.
Switch to English

Tag Otorisasi Keymaster

Halaman ini menyediakan detail untuk membantu pelaksana Keymaster HAL. Ini mencakup setiap tag di HAL, versi Keymaster yang mana tag tersedia, dan apakah tag dapat diulang. Kecuali seperti yang disebutkan dalam deskripsi tag, semua tag di bawah ini digunakan selama pembuatan kunci untuk menentukan karakteristik kunci.

Untuk Keymaster 4, tag didefinisikan dalam platform/hardware/interfaces/keymaster/ keymaster-version /types.hal , seperti 3.0 / types.hal untuk Keymaster 3 dan 4.0 / types.hal untuk Keymaster 4. Untuk Keymaster 4 dan di bawah, tag didefinisikan di platform/hardware/libhardware/include/hardware/keymaster_defs.h .

Untuk fungsi, lihat halaman Fungsi Keymaster .

Beri tag :: ACTIVE_DATETIME

Versi : 1, 2, 3, 4

Berulang ? Tidak

Menentukan tanggal dan waktu di mana kunci menjadi aktif. Sebelum saat ini, segala upaya untuk menggunakan kunci gagal dengan ErrorCode::KEY_NOT_YET_VALID .

Nilainya adalah integer 64-bit yang mewakili milidetik sejak 1 Januari 1970.

Tag :: ALGORITMA

Versi : 1, 2, 3, 4

Berulang ? Tidak

Menentukan algoritma kriptografi yang digunakan kunci.

Nilai yang mungkin ditentukan oleh enumerasi berikut:

Keymaster 3
enum class Algorithm : uint32_t {
    RSA = 1,
    EC = 3,
    AES = 32,
    HMAC = 128,
};
Keymaster 2 dan sebelumnya
typedef enum {
    KM_ALGORITHM_RSA = 1,
    KM_ALGORITHM_EC = 3,
    KM_ALGORITHM_AES = 32,
    KM_ALGORITHM_HMAC = 128,
} keymaster_algorithm_t;

Tandai :: ALL_APPLICATIONS

Versi : 1, 2, 3, 4

Berulang ? Tidak

Dicadangkan untuk penggunaan di masa mendatang.

Beri tag :: ALLOW_WHILE_ON_BODY

Versi : 2, 3, 4

Berulang ? Tidak

Tag ini hanya berlaku untuk perangkat Android Wear dengan sensor dalam tubuh. Pada titik ini, TEE tidak diharapkan dapat memberikan akses yang aman ke sensor di-tubuh, atau bahwa sensor di-tubuh sangat aman, jadi ini diharapkan menjadi fitur murni yang didukung oleh perangkat lunak.

Tandai :: ALL_USERS

Versi : 3, 4

Berulang ? Tidak

Dicadangkan untuk penggunaan di masa mendatang.

Tag :: APPLICATION_DATA

Versi : 1, 2, 3, 4

Berulang ? Tidak

Ketika disediakan untuk menghasilkanKey atau importKey , tag ini menentukan data yang diperlukan selama semua penggunaan kunci. Secara khusus, panggilan ke exportKey dan getKeyCharacteristics perlu memberikan nilai yang sama ke parameter clientId , dan panggilan untuk mulai perlu memberikan tag ini dan data terkait yang sama sebagai bagian dari set inParams . Jika data yang benar tidak disediakan, fungsi mengembalikan ErrorCode::INVALID_KEY_BLOB .

Konten tag ini terikat pada kunci secara kriptografis , artinya tidak mungkin bagi musuh yang memiliki akses ke semua rahasia dunia yang aman tetapi tidak memiliki akses ke konten tag untuk mendekripsi kunci tanpa memaksa paksa tag. konten, yang dapat dicegah aplikasi dengan menentukan konten dengan entropi cukup tinggi.

Nilainya adalah gumpalan, array byte yang panjangnya sewenang-wenang.

Tag :: APPLICATION_ID

Versi : 1, 2, 3, 4

Berulang ? Tidak

Ketika disediakan untuk menghasilkanKey atau importKey , tag ini menentukan data yang diperlukan selama semua penggunaan kunci. Secara khusus, panggilan ke exportKey dan getKeyCharacteristics perlu memberikan nilai yang sama di parameter clientId , dan panggilan untuk mulai perlu memberikan tag ini dan data terkait yang sama sebagai bagian dari set inParams . Jika data yang benar tidak disediakan, fungsi mengembalikan ErrorCode::INVALID_KEY_BLOB .

Konten dari tag ini terikat pada kunci secara kriptografis , yang berarti ia adalah musuh yang dapat mengakses semua rahasia dunia yang aman — tetapi tidak memiliki akses ke konten tag — tidak dapat mendekripsi kunci (tanpa memaksa konten tag secara kasar) ).

Nilainya adalah gumpalan, array byte yang panjangnya sewenang-wenang.

Tag :: ASSOCIATED_DATA

Versi : 1, 2, 3, 4

Berulang ? Tidak

Menyediakan "data terkait" untuk enkripsi atau dekripsi AES-GCM. Tag ini disediakan untuk memperbarui dan menentukan data yang tidak dienkripsi / didekripsi, tetapi digunakan dalam menghitung tag GCM.

Nilainya adalah gumpalan, array byte yang panjangnya sewenang-wenang.

Tag :: ATTESTATION_APPLICATION_ID

Versi : 3, 4

Berulang ? Tidak

Digunakan untuk mengidentifikasi sekumpulan aplikasi yang memungkinkan yang telah memulai pengesahan utama.

Nilainya adalah gumpalan, array byte yang panjangnya sewenang-wenang.

Tag :: ATTESTATION_CHALLENGE

Versi : 3, 4

Berulang ? Tidak

Digunakan untuk memberikan tantangan dalam pengesahan.

Nilainya adalah gumpalan, array byte yang panjangnya sewenang-wenang.

Tag :: ATTESTATION_ID_BRAND

Versi : 3, 4

Berulang ? Tidak

Memberikan nama merek perangkat, seperti yang dikembalikan oleh Build.BRAND di Android. Bidang ini hanya disetel saat meminta pengesahan pengenal perangkat.

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

Nilainya adalah gumpalan, array byte yang panjangnya sewenang-wenang.

Tag :: ATTESTATION_ID_DEVICE

Versi : 3, 4

Berulang ? Tidak

Memberikan nama perangkat perangkat, seperti yang dikembalikan oleh Build.DEVICE di Android. Bidang ini hanya disetel saat meminta pengesahan pengenal perangkat.

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

Nilainya adalah gumpalan, array byte yang panjangnya sewenang-wenang.

Tag :: ATTESTATION_ID_IMEI

Versi : 3, 4

Berulang ? Iya

Menyediakan IMEI untuk semua radio di perangkat. Bidang ini hanya disetel saat meminta pengesahan pengenal perangkat.

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

Nilainya adalah gumpalan, array byte yang panjangnya sewenang-wenang.

Tag :: ATTESTATION_ID_MANUFACTURER

Versi : 3, 4

Berulang ? Tidak

Memberikan nama pabrikan perangkat, seperti yang dikembalikan oleh Build.MANUFACTURER di Android. Bidang ini hanya disetel saat meminta pengesahan pengenal perangkat.

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

Nilainya adalah gumpalan, array byte yang panjangnya sewenang-wenang.

Tag :: ATTESTATION_ID_MEID

Versi : 3, 4

Berulang ? Iya

Menyediakan MEID untuk semua radio di perangkat. Bidang ini hanya akan ditetapkan ketika meminta pengesahan pengidentifikasi perangkat.

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

Nilainya adalah gumpalan, array byte yang panjangnya sewenang-wenang.

Tag :: ATTESTATION_ID_MODEL

Versi : 3, 4

Berulang ? Tidak

Memberikan nama model perangkat, seperti yang dikembalikan oleh Build.MODEL di Android. Bidang ini hanya disetel saat meminta pengesahan pengenal perangkat.

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

Nilainya adalah gumpalan, array byte yang panjangnya sewenang-wenang.

Tag :: ATTESTATION_ID_PRODUCT

Versi : 3, 4

Berulang ? Tidak

Memberikan nama produk perangkat, seperti yang dikembalikan oleh Build.PRODUCT di Android. Bidang ini hanya disetel saat meminta pengesahan pengenal perangkat.

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

Nilainya adalah gumpalan, array byte yang panjangnya sewenang-wenang.

Tag :: ATTESTATION_ID_SERIAL

Versi : 3, 4

Berulang ? Tidak

Memberikan nomor seri perangkat. Bidang ini hanya disetel saat meminta pengesahan pengenal perangkat.

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

Nilainya adalah gumpalan, array byte yang panjangnya sewenang-wenang.

Tandai :: AUTH_TIMEOUT

Versi : 1, 2, 3, 4

Berulang ? Tidak

Menentukan waktu dalam detik yang berwenang untuk menggunakan kunci, setelah otentikasi. Jika Tag :: USER_SECURE_ID ada dan tag ini tidak, maka kunci tersebut memerlukan otentikasi untuk setiap penggunaan (lihat mulai untuk detail aliran otentikasi-per-operasi).

Nilainya adalah bilangan bulat 32-bit yang menentukan waktu dalam detik setelah otentikasi yang berhasil dari pengguna yang ditentukan oleh Tag :: USER_SECURE_ID dengan metode otentikasi yang ditentukan oleh Tag :: USER_AUTH_TYPE bahwa kunci tersebut dapat digunakan.

Tag :: AUTH_TOKEN

Versi : 1, 2, 3, 4

Berulang ? Tidak

Menyediakan token otentikasi untuk memulai , memperbarui , atau menyelesaikan , untuk membuktikan otentikasi pengguna untuk operasi utama yang memerlukannya (kunci memiliki Tag :: USER_SECURE_ID ).

Nilainya adalah gumpalan yang berisi struktur hw_auth_token_t .

Beri tag :: BLOB_USAGE_REQUIREMENTS

Versi : 1, 2, 3, 4

Berulang ? Tidak

Menentukan kondisi lingkungan sistem yang diperlukan untuk kunci yang dihasilkan untuk digunakan.

Nilai yang mungkin ditentukan oleh enumerasi berikut:

Keymaster 3
enum class KeyBlobUsageRequirements : uint32_t {
    STANDALONE = 0,
    REQUIRES_FILE_SYSTEM = 1,
};
Keymaster 2 dan sebelumnya
typedef enum {
    KM_BLOB_STANDALONE = 0,
    KM_BLOB_REQUIRES_FILE_SYSTEM = 1,
} keymaster_key_blob_usage_requirements_t;

Tag ini dapat ditentukan selama pembuatan kunci untuk mengharuskan kunci tersebut dapat digunakan dalam kondisi yang ditentukan. Itu perlu dikembalikan dengan karakteristik kunci dari generateKey dan getKeyCharacteristics . Jika pemanggil menentukan Tag::BLOB_USAGE_REQUIREMENTS dengan nilai KeyBlobUsageRequirements::STANDALONE trustlet mengembalikan gumpalan kunci yang dapat digunakan tanpa dukungan sistem file. Ini sangat penting untuk perangkat dengan disk terenkripsi, di mana sistem file mungkin tidak tersedia sampai setelah kunci Keymaster digunakan untuk mendekripsi disk.

Tag :: BLOCK_MODE

Versi : 1, 2, 3, 4

Berulang ? Iya

Menentukan mode blok cipher yang digunakan kunci tersebut. Tag ini hanya relevan dengan kunci AES.

Nilai yang mungkin ditentukan oleh enumerasi berikut:

Keymaster 3
enum class BlockMode : uint32_t {
    ECB = 1,
    CBC = 2,
    CTR = 3,
    GCM = 32,
};
Keymaster 2 dan sebelumnya
typedef enum {
    KM_MODE_ECB = 1,
    KM_MODE_CBC = 2,
    KM_MODE_CTR = 3,
    KM_MODE_GCM = 32,
} keymaster_block_mode_t;

Tag ini dapat diulangi, dan untuk operasi kunci AES menentukan mode dalam argumen additionalParams untuk memulai . Jika metode yang ditentukan tidak dalam mode yang terkait dengan kunci, operasi gagal dengan ErrorCode::INCOMPATIBLE_BLOCK_MODE .

Tag :: BOOT_PATCHLEVEL

Versi : 4

Tag :: BOOT_PATCHLEVEL menentukan level patch keamanan boot image (kernel) yang dengannya kunci dapat digunakan. Tag ini tidak pernah dikirim ke TA keymaster, tetapi ditambahkan ke daftar otorisasi yang didukung perangkat keras oleh TA. Upaya apa pun untuk menggunakan kunci dengan nilai Tag::BOOT_PATCHLEVEL berbeda dari penyebab patchlevel sistem yang sedang berjalan begin() , getKeyCharacteristics() atau exportKey() untuk mengembalikan ErrorCode::KEY_REQUIRES_UPGRADE . Lihat upgradeKey() untuk detailnya.

Nilai tag adalah bilangan bulat dari formulir YYYYMMDD, di mana YYYY adalah tahun empat digit dari pembaruan terakhir, MM adalah bulan dua digit dan DD adalah hari dua digit dari pembaruan terakhir. Misalnya, untuk kunci yang dibuat pada perangkat Android yang terakhir diperbarui pada 5 Juni 2018, nilainya akan menjadi 20180605. Jika hari itu tidak diketahui, 00 dapat diganti.

Selama setiap boot, bootloader harus memberikan tingkat patch dari gambar boot ke lingkungan yang aman (mekanisme ditentukan oleh implementasi).

Harus ditegakkan dengan perangkat keras.

Tag :: BOOTLOADER_ONLY

Versi : 1, 2, 3, 4

Berulang ? Tidak

Hanya menentukan bootloader yang dapat menggunakan kunci.

Tag ini adalah boolean, jadi nilai yang mungkin benar (jika tag ada) dan salah (jika tag tidak ada).

Upaya apa pun untuk menggunakan kunci dengan Tag::BOOTLOADER_ONLY dari sistem Android gagal dengan ErrorCode::INVALID_KEY_BLOB .

Tag :: CALLER_NONCE

Versi : 1, 2, 3, 4

Berulang ? Tidak

Menentukan bahwa penelepon dapat memberikan ketidaksesuaian untuk operasi yang tidak memerlukan persyaratan.

Tag ini adalah boolean, jadi nilai yang mungkin benar (jika tag ada) dan salah (jika tag tidak ada).

Tag ini hanya digunakan untuk kunci AES, dan hanya relevan untuk mode blok CBC, CTR dan GCM. Jika tag tidak ada, implementasi harus menolak operasi apa pun yang menyediakan Tag :: NONCE untuk memulai dengan ErrorCode::CALLER_NONCE_PROHIBITED .

Tag :: CREATION_DATETIME

Versi : 1, 2, 3, 4

Berulang ? Tidak

Menentukan tanggal dan waktu kunci dibuat, dalam milidetik sejak 1 Januari 1970. Tag ini opsional dan hanya informasi.

Tag :: DIGEST

Versi : 1, 2, 3, 4

Berulang ? Iya

Menentukan algoritma digest yang dapat digunakan dengan kunci untuk melakukan operasi penandatanganan dan verifikasi. Tag ini relevan dengan kunci RSA, ECDSA, dan HMAC.

Nilai yang mungkin ditentukan oleh enumerasi berikut:

Keymaster 3
enum class Digest : uint32_t {
    NONE = 0,
    MD5 = 1,
    SHA1 = 2,
    SHA_2_224 = 3,
    SHA_2_256 = 4,
    SHA_2_384 = 5,
    SHA_2_512 = 6,
};
Keymaster 2 dan sebelumnya
typedef enum {
    KM_DIGEST_NONE = 0,
    KM_DIGEST_MD5 = 1,
    KM_DIGEST_SHA1 = 2,
    KM_DIGEST_SHA_2_224 = 3,
    KM_DIGEST_SHA_2_256 = 4,
    KM_DIGEST_SHA_2_384 = 5,
    KM_DIGEST_SHA_2_512 = 6,
}
keymaster_digest_t;

Tag ini dapat diulang. Untuk operasi penandatanganan dan verifikasi, tentukan intisari dalam argumen additionalParams untuk memulai . Jika intisari yang ditentukan tidak ada dalam intisari yang terkait dengan kunci, operasi gagal dengan ErrorCode::INCOMPATIBLE_DIGEST .

Tag :: EC_CURVE

Versi : 2, 3, 4

Berulang ? Tidak

Di Keymaster 1, kurva yang digunakan untuk kunci EC diperkirakan dari ukuran kunci yang ditentukan. Untuk meningkatkan fleksibilitas bergerak maju, Keymaster 2 memperkenalkan cara eksplisit untuk menentukan kurva. Permintaan pembuatan kunci EC mungkin memiliki Tag::EC_CURVE , Tag::KEY_SIZE , atau keduanya.

Nilai yang mungkin ditentukan oleh enumerasi berikut:

Keymaster 3
enum class EcCurve : uint32_t {
    P_224 = 0,
    P_256 = 1,
    P_384 = 2,
    P_521 = 3,
};
Keymaster 2 dan sebelumnya
enum class EcCurve : uint32_t {
    P_224 = 0,
    P_256 = 1,
    P_384 = 2,
P_521 = 3,
};

Jika permintaan pembuatan hanya berisi Tag::KEY_SIZE , kembali ke logika Keymaster 1, pilih kurva NIST yang sesuai.

Jika permintaan hanya berisi Tag::EC_CURVE , gunakan kurva yang ditentukan. Untuk Keymaster 3 dan yang lebih baru, kurva didefinisikan dalam EcCurve . Untuk Keymaster 2 dan sebelumnya, kurva didefinisikan dalam keymaster_ec_curve_t .

Jika permintaan berisi keduanya, gunakan kurva yang ditentukan oleh Tag::EC_CURVE , dan validasikan bahwa ukuran kunci yang ditentukan sesuai untuk kurva itu. Jika tidak, kembalikan ErrorCode::INVALID_ARGUMENT .

Tag :: INCLUDE_UNIQUE_ID

Versi : 2, 3, 4

Berulang ? Tidak

Tag ini ditentukan selama pembuatan kunci untuk menunjukkan bahwa sertifikat pengesahan untuk kunci yang dihasilkan harus berisi ID unik perangkat yang dibatasi ruang dan terikat waktu, seperti yang ditentukan oleh Tag :: UNIQUE_ID .

Tag ini adalah boolean, jadi nilai yang mungkin benar (jika tag ada) dan salah (jika tag tidak ada).

Tandai :: KEY_SIZE

Versi : 1, 2, 3, 4

Berulang ? Tidak

Menentukan ukuran, dalam bit, kunci, mengukur dengan cara normal untuk algoritma kunci. Misalnya, untuk kunci RSA, Tag::KEY_SIZE menentukan ukuran modulus publik. Untuk kunci AES itu menentukan panjang bahan kunci rahasia.

Tag :: MAC_LENGTH

Versi : 1, 2, 3, 4

Berulang ? Tidak

Memberikan panjang yang diminta dari tag otentikasi MAC atau GCM, dalam bit.

Nilainya adalah panjang MAC dalam bit. Ini adalah kelipatan dari 8 dan setidaknya sebesar nilai Tag :: MIN_MAC_LENGTH yang terkait dengan kunci.

Beri tag :: MAX_USES_PER_BOOT

Versi : 1, 2, 3, 4

Berulang ? Tidak

Menentukan berapa kali maksimum suatu kunci dapat digunakan di antara reboot sistem. Ini adalah mekanisme lain untuk menilai batas penggunaan kunci.

Nilainya adalah integer 32-bit yang mewakili penggunaan per boot.

Ketika kunci dengan tag ini digunakan dalam operasi, penghitung terkait kunci harus ditambahkan selama panggilan mulai . Setelah penghitung kunci melebihi nilai ini, semua upaya berikutnya untuk menggunakan kunci gagal dengan ErrorCode::MAX_OPS_EXCEEDED , hingga perangkat dihidupkan ulang. Ini menyiratkan bahwa trustlet menyimpan tabel penggunaan penghitung untuk kunci dengan tag ini. Karena memori Keymaster sering terbatas, tabel ini dapat memiliki ukuran maksimum tetap dan Keymaster dapat gagal operasi yang mencoba menggunakan kunci dengan tag ini ketika tabel penuh. Tabel perlu mengakomodasi setidaknya 16 kunci. Jika operasi gagal karena tabel penuh, Keymaster mengembalikan ErrorCode::TOO_MANY_OPERATIONS .

Tag :: MIN_MAC_LENGTH

Versi : 1, 2, 3, 4

Berulang ? Tidak

Tag ini menentukan panjang minimum MAC yang dapat diminta atau diverifikasi dengan kunci ini untuk kunci HMAC dan kunci AES yang mendukung mode GCM.

Nilai ini adalah panjang MAC minimum, dalam bit. Ini adalah kelipatan 8. Untuk kunci HMAC, nilainya setidaknya 64. Untuk kunci GCM, nilainya setidaknya 96 dan tidak lebih dari 128.

Tag :: MIN_SECONDS_BETWEEN_OPS

Versi : 1, 2, 3, 4

Berulang ? Tidak

Menentukan jumlah waktu minimum yang berlalu antara operasi yang diizinkan menggunakan kunci. Ini dapat digunakan untuk menilai batas penggunaan kunci dalam konteks di mana penggunaan tanpa batas memungkinkan serangan brute force.

Nilainya adalah bilangan bulat 32-bit yang mewakili detik antara operasi yang diizinkan.

Ketika kunci dengan tag ini digunakan dalam operasi, mulai timer selama panggilan selesai atau batalkan . Setiap panggilan untuk memulai yang diterima sebelum timer menunjukkan bahwa interval yang ditentukan oleh Tag::MIN_SECONDS_BETWEEN_OPS telah gagal gagal dengan ErrorCode::KEY_RATE_LIMIT_EXCEEDED . Ini menyiratkan bahwa trustlet menyimpan tabel penggunaan penghitung untuk kunci dengan tag ini. Karena memori Keymaster sering terbatas, tabel ini dapat memiliki ukuran maksimum tetap dan Keymaster dapat gagal operasi yang mencoba menggunakan kunci dengan tag ini ketika tabel penuh. Tabel perlu mengakomodasi setidaknya 32 kunci yang sedang digunakan dan secara agresif menggunakan kembali slot meja ketika interval penggunaan minimum kunci berakhir. Jika operasi gagal karena tabel penuh, Keymaster mengembalikan ErrorCode::TOO_MANY_OPERATIONS .

Tag :: NO_AUTH_REQUIRED

Versi : 1, 2, 3, 4

Berulang ? Tidak

Menentukan bahwa tidak diperlukan otentikasi untuk menggunakan kunci ini. Tag ini saling eksklusif dengan Tag :: USER_SECURE_ID .

Tag ini adalah boolean, jadi nilai yang mungkin benar (jika tag ada) dan salah (jika tag tidak ada).

Tag :: NONCE

Versi : 1, 2, 3, 4

Berulang ? Tidak

Menyediakan atau mengembalikan Nonce atau Initialization Vector (IV) untuk AES GCM, CBC, atau enkripsi atau dekripsi RKPT. Tag ini disediakan untuk memulai selama operasi enkripsi dan dekripsi. Ini hanya disediakan untuk memulai jika kunci memiliki Tag :: CALLER_NONCE . Jika tidak disediakan, nonce atau IV yang sesuai akan dihasilkan secara acak oleh Keymaster dan dikembalikan dari awal.

Nilainya adalah gumpalan, array byte yang panjangnya sewenang-wenang. Panjang yang diizinkan tergantung pada mode: Non GCM panjangnya 12 byte; Panjang CBC dan CTR IV adalah 16 byte.

Tandai :: ASLI

Versi : 1, 2, 3, 4

Berulang ? Tidak

Menentukan tempat kunci dibuat, jika diketahui. Tag ini mungkin tidak ditentukan selama pembuatan kunci atau impor, dan harus ditambahkan ke karakteristik utama oleh trustlet.

Keymaster 3

Nilai yang mungkin ditentukan dalam android::hardware::keymaster::v3_0::KeyOrigin :

enum class KeyOrigin : uint32_t {
    GENERATED = 0,
    DERIVED = 1,
    IMPORTED = 2,
    UNKNOWN = 3,
};
Keymaster 2 dan sebelumnya

Nilai yang mungkin ditentukan dalam keymaster_origin_t :

typedef enum {
    KM_ORIGIN_GENERATED = 0,
    KM_ORIGIN_IMPORTED = 2,
    KM_ORIGIN_UNKNOWN = 3,
} keymaster_key_origin_t

Arti penuh nilai tidak hanya tergantung pada nilai tetapi pada apakah itu ditemukan dalam daftar karakteristik perangkat keras atau perangkat lunak.

GENERATED menunjukkan bahwa Keymaster menghasilkan kunci. Jika dalam daftar yang didukung perangkat keras, kunci dihasilkan dalam perangkat keras yang aman dan perangkat keras terikat secara permanen. Jika dalam daftar yang didukung perangkat lunak, kunci dibuat dalam SoftKeymaster dan tidak terikat perangkat keras.

DERIVED menunjukkan bahwa kunci tersebut diturunkan di dalam Keymaster. Kemungkinan ada off-perangkat.

IMPORTED menunjukkan bahwa kunci dibuat di luar Keymaster dan diimpor ke Keymaster. Jika dalam daftar yang didukung perangkat keras, itu terikat perangkat keras secara permanen, meskipun salinan di luar perangkat keras yang aman mungkin ada. Jika dalam daftar perangkat lunak diberlakukan, kunci diimpor ke SoftKeymaster dan tidak terikat perangkat keras.

UNKNOWN seharusnya hanya muncul dalam daftar yang didukung perangkat keras. Ini menunjukkan bahwa kuncinya terikat pada perangkat keras, tetapi tidak diketahui apakah kunci tersebut awalnya dibuat di perangkat keras yang aman atau diimpor. Ini hanya terjadi ketika perangkat keras keymaster0 digunakan untuk meniru layanan keymaster1.

Tandai :: ORIGINATION_EXPIRE_DATETIME

Versi : 1, 2, 3, 4

Berulang ? Tidak

Menentukan tanggal dan waktu saat kunci kedaluwarsa untuk tujuan penandatanganan dan enkripsi. Setelah waktu ini, segala upaya untuk menggunakan kunci dengan KeyPurpose :: SIGN atau KeyPurpose :: ENCRYPT disediakan untuk memulai gagal dengan ErrorCode::KEY_EXPIRED .

Nilainya adalah integer 64-bit yang mewakili milidetik sejak 1 Januari 1970.

Tag :: OS_PATCHLEVEL

Versi : 2, 3, 4

Berulang ? Tidak

Tag ini tidak pernah dikirim ke TA keymaster, tetapi ditambahkan ke daftar otorisasi yang didukung perangkat keras oleh TA.

Nilai tag adalah bilangan bulat dari formulir YYYYMM, di mana YYYY adalah tahun empat digit dari pembaruan terakhir dan MM adalah bulan dua digit dari pembaruan terakhir. Misalnya, untuk kunci yang dihasilkan pada perangkat Android yang terakhir diperbarui pada Desember 2015, nilainya adalah 201512.

Kunci yang memiliki tingkat tambalan berbeda dari tingkat tambalan saat ini tidak dapat digunakan. Upaya menggunakan penyebab utama seperti itu dimulai , getKeyCharacteristics , atau exportKey untuk mengembalikan ErrorCode::KEY_REQUIRES_UPGRADE . Lihat Binding Versi untuk lebih jelasnya.

Tag :: OS_VERSION

Versi : 2, 3, 4

Berulang ? Tidak

Tag ini tidak pernah dikirim ke TA keymaster, tetapi ditambahkan ke daftar otorisasi yang didukung perangkat keras oleh TA.

Nilai tag adalah bilangan bulat dari bentuk MMmmss, di mana MM adalah nomor versi utama, mm adalah nomor versi minor, dan ss adalah nomor versi sub-minor. Misalnya, untuk kunci yang dibuat pada Android versi 4.0.3, nilainya akan menjadi 040003.

Tag :: PADDING

Versi : 1, 2, 3, 4

Berulang ? Iya

Menentukan mode padding yang dapat digunakan dengan tombol. Tag ini relevan dengan kunci RSA dan AES.

Nilai yang mungkin ditentukan oleh enumerasi berikut:

Keymaster 3
enum class PaddingMode : uint32_t {
    NONE = 1,
    RSA_OAEP = 2,
    RSA_PSS = 3,
    RSA_PKCS1_1_5_ENCRYPT = 4,
    RSA_PKCS1_1_5_SIGN = 5,
    PKCS7 = 64,
};
Keymaster 2 dan sebelumnya
typedef enum {
    KM_PAD_NONE = 1,
    KM_PAD_RSA_OAEP = 2,
    KM_PAD_RSA_PSS = 3,
    KM_PAD_RSA_PKCS1_1_5_ENCRYPT = 4,
    KM_PAD_RSA_PKCS1_1_5_SIGN = 5,
    KM_PAD_PKCS7 = 64,
} keymaster_padding_t;

PaddingMode::RSA_OAEP dan PaddingMode::RSA_PKCS1_1_5_ENCRYPT hanya digunakan untuk kunci enkripsi / dekripsi RSA dan menentukan RSA PKCS # 1v2 padding OAEP dan RSA PKCS # 1 v1.5 secara acak. PaddingMode::RSA_PSS dan PaddingMode::RSA_PKCS1_1_5_SIGN hanya digunakan untuk kunci penandatanganan / verifikasi RSA dan menentukan RSA PKCS # 1v2 padding PSS dan RSA PKCS # 1 v1.5 pad deterministik padding.

PaddingMode::NONE dapat digunakan dengan kunci RSA atau AES. Untuk kunci AES, jika PaddingMode::NONE digunakan dengan mode blok ECB atau CBC dan data yang akan dienkripsi atau didekripsi bukan kelipatan dari ukuran blok AES, panggilan untuk menyelesaikan gagal dengan ErrorCode::INVALID_INPUT_LENGTH .

PaddingMode::PKCS7 hanya dapat digunakan dengan kunci AES, dan hanya dengan mode ECB dan CBC.

Tag ini dapat diulang. Mode padding harus ditentukan dalam panggilan untuk memulai . Jika mode yang ditentukan tidak diotorisasi untuk kunci, operasi gagal dengan ErrorCode::INCOMPATIBLE_BLOCK_MODE .

Tag :: TUJUAN

Versi : 1, 2, 3, 4

Berulang ? Iya

Menentukan sekumpulan tujuan untuk mana kunci dapat digunakan.

Nilai yang mungkin ditentukan oleh enumerasi berikut:

Keymaster 3
enum class KeyPurpose : uint32_t {
    ENCRYPT = 0,
    DECRYPT = 1,
    SIGN = 2,
    VERIFY = 3,
    DERIVE_KEY = 4,  // since 3.0
    WRAP_KEY = 5,    // since 3.0
};
Keymaster 2 dan sebelumnya
typedef enum {
    KM_PURPOSE_ENCRYPT = 0,
    KM_PURPOSE_DECRYPT = 1,
    KM_PURPOSE_SIGN = 2,
    KM_PURPOSE_VERIFY = 3,
} keymaster_purpose_t;

Tag ini dapat diulang; kunci dapat dihasilkan dengan beberapa nilai, meskipun operasi memiliki satu tujuan. Ketika fungsi mulai dipanggil untuk memulai operasi, tujuan operasi ditentukan. Jika tujuan yang ditentukan untuk operasi tidak diotorisasi oleh kunci, operasi gagal dengan ErrorCode::INCOMPATIBLE_PURPOSE .

Tandai :: RESET_SINCE_ID_ROTATION

Versi : 3, 4

Berulang ? Tidak

Menentukan apakah perangkat telah diatur ulang pabrik sejak rotasi ID unik terakhir. Digunakan untuk pengesahan kunci.

Tag ini adalah boolean, jadi nilai yang mungkin benar (jika tag ada) dan salah (jika tag tidak ada).

Tag :: ROLLBACK_RESISTANT

Versi : 1, 2, 3, 4

Berulang ? Tidak

Menunjukkan bahwa kunci tersebut tahan rollback, artinya ketika dihapus oleh deleteKey atau deleteAllKeys , kunci dijamin akan dihapus secara permanen dan tidak dapat digunakan. Mungkin saja kunci tanpa tag ini dapat dihapus dan kemudian dikembalikan dari cadangan.

Tag ini adalah boolean, jadi nilai yang mungkin benar (jika tag ada) dan salah (jika tag tidak ada).

Tag :: ROOT_OF_TRUST

Versi : 1, 2, 3, 4

Berulang ? Tidak

Menentukan akar kepercayaan , kunci yang digunakan oleh boot yang terverifikasi untuk memvalidasi sistem operasi yang di-boot (jika ada). Tag ini tidak pernah diberikan atau dikembalikan dari Keymaster dalam karakteristik utama.

Tag :: RSA_PUBLIC_EXPONENT

Versi : 1, 2, 3, 4

Berulang ? Tidak

Menentukan nilai eksponen publik untuk pasangan kunci RSA. Tag ini hanya relevan untuk kunci RSA, dan diperlukan untuk semua kunci RSA.

Nilainya adalah integer unsigned 64-bit yang memenuhi persyaratan eksponen publik RSA. Nilai ini harus berupa bilangan prima. Trustlets mendukung nilai 2 ^ 16 + 1 dan dapat mendukung nilai wajar lainnya, khususnya nilai 3. Jika tidak ada eksponen yang ditentukan atau jika eksponen yang ditentukan tidak didukung, pembuatan kunci gagal dengan ErrorCode::INVALID_ARGUMENT .

Tag :: UNIQUE_ID

Versi : 3, 4

Berulang ? Tidak

Digunakan untuk memberikan ID unik dalam pengesahan.

Nilainya adalah gumpalan, array byte yang panjangnya sewenang-wenang.

Tag :: USAGE_EXPIRE_DATETIME

Versi : 1, 2, 3, 4

Berulang ? Tidak

Menentukan tanggal dan waktu saat kunci kedaluwarsa untuk keperluan verifikasi dan dekripsi. Setelah waktu ini, segala upaya untuk menggunakan kunci dengan KeyPurpose :: VERIFY atau KeyPurpose :: DECRYPT diberikan untuk memulai gagal dengan ErrorCode::KEY_EXPIRED .

Nilainya adalah integer 64-bit yang mewakili milidetik sejak 1 Januari 1970.

Tag :: USER_AUTH_TYPE

Versi : 1, 2, 3, 4

Berulang ? Tidak

Menentukan jenis autentikator pengguna yang dapat digunakan untuk mengesahkan kunci ini. Ketika Keymaster diminta untuk melakukan operasi dengan kunci dengan tag ini, ia menerima token otentikasi, dan bidang token's authenticator_type harus cocok dengan nilai dalam tag. Misalnya, (ntoh(token.authenticator_type) & auth_type_tag_value) != 0 , di mana ntoh adalah fungsi yang mengubah integer yang dipesan jaringan ke integer yang dipesan jaringan dan auth_type_tag_value adalah nilai dari tag ini.

Nilainya adalah bitmask integer nilai 32-bit dari enumerasi:

Keymaster 3
enum class HardwareAuthenticatorType : uint32_t {
    NONE = 0u, // 0
    PASSWORD = 1 << 0,
    FINGERPRINT = 1 << 1,
    ANY = UINT32_MAX,
};
Keymaster 2 dan sebelumnya
typedef enum {
    HW_AUTH_NONE = 0,
    HW_AUTH_PASSWORD = 1 << 0,
    HW_AUTH_FINGERPRINT = 1 << 1,
    // Additional entries should be powers of 2.
    HW_AUTH_ANY = UINT32_MAX,
} hw_authenticator_type_t;

Tag :: USER_SECURE_ID

Versi : 1, 2, 3, 4

Berulang ? Tidak

Menentukan bahwa kunci hanya dapat digunakan dalam keadaan otentikasi pengguna aman tertentu. Tag ini saling eksklusif dengan Tag :: NO_AUTH_REQUIRED .

Nilainya adalah bilangan bulat 64-bit yang menentukan nilai status kebijakan otentikasi yang harus ada dalam token otentikasi (disediakan untuk memulai dengan Tag :: AUTH_TOKEN ) untuk mengesahkan penggunaan kunci. Setiap panggilan untuk memulai dengan kunci dengan tag ini yang tidak memberikan token otentikasi, atau menyediakan token otentikasi tanpa nilai status kebijakan yang cocok, gagal.

Tag ini dapat diulang. Jika salah satu dari nilai yang diberikan cocok dengan nilai status kebijakan apa pun dalam token otentikasi, kunci tersebut diotorisasi untuk digunakan. Kalau tidak, operasi gagal dengan ErrorCode::KEY_USER_NOT_AUTHENTICATED .

Tag :: VENDOR_PATCHLEVEL

Versi : 4

Tag ini menentukan tingkat patch keamanan gambar vendor yang dengannya kunci dapat digunakan. Tag ini tidak pernah dikirim ke TA keymaster, tetapi ditambahkan ke daftar otorisasi yang didukung perangkat keras oleh TA. Upaya apa pun untuk menggunakan kunci dengan nilai Tag::VENDOR_PATCHLEVEL berbeda dari patchlevel sistem yang sedang berjalan harus menyebabkan begin() , getKeyCharacteristics() atau exportKey() untuk mengembalikan ErrorCode::KEY_REQUIRES_UPGRADE . Lihat upgradeKey() untuk detailnya.

Nilai tag adalah bilangan bulat dari formulir YYYYMMDD, di mana YYYY adalah tahun empat digit dari pembaruan terakhir, MM adalah bulan dua digit dan DD adalah hari dua digit dari pembaruan terakhir. Misalnya, untuk kunci yang dibuat pada perangkat Android yang terakhir diperbarui pada 5 Juni 2018, nilainya akan menjadi 20180605.

HAL IKeymasterDevice harus membaca patchlevel vendor saat ini dari properti sistem ro.vendor.build.security_patch dan mengirimkannya ke lingkungan yang aman ketika HAL pertama kali dimuat (mekanisme ditentukan implementasi). Lingkungan yang aman tidak boleh menerima patchlevel lain sampai setelah boot berikutnya.

Harus ditegakkan dengan perangkat keras.