หน้านี้ให้รายละเอียดเพื่อช่วยผู้ติดตั้งใช้งาน HAL ของ Keymaster ซึ่งครอบคลุมแท็กแต่ละรายการใน HAL, เวอร์ชัน Keymaster ที่แท็กนั้นพร้อมใช้งาน และแท็กนั้นใช้ซ้ำได้หรือไม่ ยกเว้นตามที่ระบุไว้ในคำอธิบายแท็ก ระบบจะใช้แท็กทั้งหมดด้านล่างนี้ในระหว่างการสร้างคีย์เพื่อระบุลักษณะของคีย์
สำหรับ Keymaster 4 แท็กจะกำหนดไว้ใน
platform/hardware/interfaces/keymaster/keymaster-version/types.hal
,
เช่น
3.0/types.hal สำหรับ Keymaster 3 และ
4.0/types.hal สำหรับ Keymaster 4 สำหรับ Keymaster 2 และต่ำกว่า ระบบจะกำหนดแท็กใน
platform/hardware/libhardware/include/hardware/keymaster_defs.h
สำหรับฟังก์ชัน โปรดดู ฟังก์ชัน Keymaster
แท็ก::ACTIVE_DATETIME
เวอร์ชัน: 1, 2, 3, 4
ทำซ้ำได้ ไม่
ระบุวันที่และเวลาที่คีย์จะใช้งานได้ ก่อนหน้านี้
ความพยายามใดๆ ในการใช้คีย์ล้มเหลว
ErrorCode::KEY_NOT_YET_VALID
ค่านี้เป็นจํานวนเต็ม 64 บิตที่แสดงมิลลิวินาทีนับตั้งแต่วันที่ 1 มกราคม 1970
Tag::ALGORITHM
เวอร์ชัน: 1, 2, 3, 4
ใช้ซ้ำได้ ไม่
ระบุอัลกอริทึมการเข้ารหัสที่ใช้คีย์
ค่าที่เป็นไปได้จะกำหนดโดยการแจงนับต่อไปนี้
คีย์มาสเตอร์ 3enum class Algorithm : uint32_t { RSA = 1, EC = 3, AES = 32, HMAC = 128, };
typedef enum { KM_ALGORITHM_RSA = 1, KM_ALGORITHM_EC = 3, KM_ALGORITHM_AES = 32, KM_ALGORITHM_HMAC = 128, } keymaster_algorithm_t;
แท็ก::ALL_APPLICATIONS
เวอร์ชัน: 1, 2, 3, 4
ทำซ้ำได้ ไม่
สงวนไว้สำหรับการใช้งานในอนาคต
แท็ก::ALLOW_WHILE_ON_BODY
เวอร์ชัน: 2, 3, 4
ใช้ซ้ำได้ ไม่
แท็กนี้ใช้ได้กับอุปกรณ์ Android Wear ที่มีเซ็นเซอร์บนร่างกายเท่านั้น ที่ ถึงจุดนี้ ไม่คิดว่า TEE ใดที่ให้การเข้าถึงที่ปลอดภัย เซ็นเซอร์บนร่างกาย หรือเซ็นเซอร์บนร่างกาย มีความปลอดภัยมาก เป็นฟีเจอร์ที่บังคับใช้โดยซอฟต์แวร์เท่านั้น
Tag::ALL_USERS
เวอร์ชัน: 3, 4
ใช้ซ้ำได้ ไม่
สงวนไว้สำหรับการใช้งานในอนาคต
แท็ก::APPLICATION_DATA
เวอร์ชัน: 1, 2, 3, 4
ทำซ้ำได้ ไม่
เมื่อระบุให้กับ generateKey หรือ importKey แท็กนี้จะระบุข้อมูลที่จําเป็นในระหว่างการใช้คีย์ทั้งหมด โดยเฉพาะอย่างยิ่ง การเรียกใช้ exportKey และ getKeyCharacteristics ต้องระบุค่าเดียวกันกับพารามิเตอร์ clientId
และการเรียกใช้ begin ต้องระบุแท็กนี้และข้อมูลที่เชื่อมโยงเดียวกันเป็นส่วนหนึ่งของชุด inParams
หากไม่ได้ระบุข้อมูลที่ถูกต้อง ฟังก์ชันจะแสดงผล ErrorCode::INVALID_KEY_BLOB
เนื้อหาของแท็กนี้เชื่อมโยงกับคีย์การเข้ารหัส ซึ่งหมายความว่าผู้ไม่ประสงค์ดีที่มีสิทธิ์เข้าถึงข้อมูลลับทั้งหมดในโลกที่ปลอดภัย แต่ไม่มีสิทธิ์เข้าถึงเนื้อหาแท็กจะไม่สามารถถอดรหัสคีย์ได้โดยไม่ต้องใช้การถอดรหัสด้วยวิธี Brute Force กับเนื้อหาแท็ก ซึ่งแอปสามารถป้องกันได้โดยระบุเนื้อหาที่มีความผันผวนสูงมากพอ
ค่าคือ Blob ซึ่งเป็นอาร์เรย์ไบต์ที่มีความยาวตามต้องการ
Tag::APPLICATION_ID
เวอร์ชัน: 1, 2, 3, 4
ใช้ซ้ำได้ ไม่
เมื่อระบุให้กับ generateKey หรือ importKey แท็กนี้จะระบุข้อมูลที่จําเป็นในระหว่างการใช้คีย์ทั้งหมด ใน
โดยเฉพาะการเรียกไปยัง
exportKey และ
getKeyCharacteristics
ต้องระบุค่าเดียวกันในพารามิเตอร์ clientId
และ
การโทรไปยัง เริ่มต้น จำเป็นต้อง
ให้แท็กนี้และข้อมูลที่เกี่ยวข้องเดียวกันเป็นส่วนหนึ่งของ
ตั้งค่า inParams
แล้ว หากไม่ได้ระบุข้อมูลที่ถูกต้อง ฟังก์ชันจะแสดงผลลัพธ์เป็น ErrorCode::INVALID_KEY_BLOB
เนื้อหาของแท็กนี้เชื่อมโยงกับคีย์การเข้ารหัส ซึ่งหมายความว่าผู้โจมตีที่สามารถเข้าถึงข้อมูลลับทั้งหมดในโลกที่ปลอดภัย แต่ไม่มีสิทธิ์เข้าถึงเนื้อหาแท็ก จะถอดรหัสคีย์ไม่ได้ (โดยไม่ต้องใช้วิธีถอดรหัสด้วยกำลัง brute-force กับเนื้อหาแท็ก)
ค่านี้คือ BLOB ซึ่งเป็นอาร์เรย์ของไบต์ที่มีความยาวเท่าใดก็ได้
Tag::ASSOCIATED_DATA
เวอร์ชัน: 1, 2, 3, 4
ทำซ้ำได้ ไม่
มี "ข้อมูลที่เกี่ยวข้อง" สำหรับการเข้ารหัสหรือถอดรหัส AES-GCM แท็กนี้ ระบุเพื่ออัปเดต และ ระบุข้อมูลที่ไม่ได้เข้ารหัส/ถอดรหัส แต่ใช้ในการประมวลผล แท็ก GCM
ค่าคือ Blob ซึ่งเป็นอาร์เรย์ไบต์ที่มีความยาวตามต้องการ
Tag::ATTESTATION_APPLICATION_ID
เวอร์ชัน: 3, 4
ทำซ้ำได้ ไม่
ใช้เพื่อระบุชุดของแอปที่เป็นไปได้ ได้เริ่มเอกสารรับรองคีย์แล้ว
ค่านี้คือ BLOB ซึ่งเป็นอาร์เรย์ของไบต์ที่มีความยาวเท่าใดก็ได้
Tag::ATTESTATION_CHALLENGE
เวอร์ชัน: 3, 4
ใช้ซ้ำได้ ไม่
ใช้เพื่อระบุการคัดค้านในเอกสารรับรอง
ค่านี้คือ BLOB ซึ่งเป็นอาร์เรย์ของไบต์ที่มีความยาวเท่าใดก็ได้
Tag::ATTESTATION_ID_BRAND
เวอร์ชัน: 3, 4
ใช้ซ้ำได้ ไม่
ระบุชื่อแบรนด์ของอุปกรณ์ตามที่ Build.BRAND
แสดงใน Android ระบบจะตั้งค่าช่องนี้เฉพาะเมื่อขอการรับรองตัวระบุของอุปกรณ์เท่านั้น
หากอุปกรณ์ไม่รองรับการรับรองรหัส (หรือมีการเรียกใช้ destroyAttestationIds()
ก่อนหน้านี้และอุปกรณ์ไม่สามารถรับรองรหัสได้อีกต่อไป) คำขอการรับรองคีย์ที่มีแท็กนี้จะดำเนินการไม่สำเร็จพร้อมแสดงผล ErrorCode::CANNOT_ATTEST_IDS
ค่าคือ Blob ซึ่งเป็นอาร์เรย์ไบต์ที่มีความยาวตามต้องการ
แท็ก::ATTESTATION_ID_DEVICE
เวอร์ชัน: 3, 4
ทำซ้ำได้ ไม่
ระบุชื่ออุปกรณ์ของอุปกรณ์ตามที่ Build.DEVICE
แสดงใน Android จะมีการตั้งค่าช่องนี้เมื่อขอเอกสารรับรองของ
ตัวระบุของอุปกรณ์
หากอุปกรณ์ไม่รองรับการรับรองรหัส (หรือมีการเรียกใช้ destroyAttestationIds()
ก่อนหน้านี้และอุปกรณ์ไม่สามารถรับรองรหัสได้อีกต่อไป) คำขอการรับรองคีย์ที่มีแท็กนี้จะดำเนินการไม่สำเร็จพร้อมแสดงผล ErrorCode::CANNOT_ATTEST_IDS
ค่าคือ Blob ซึ่งเป็นอาร์เรย์ไบต์ที่มีความยาวตามต้องการ
Tag::ATTESTATION_ID_IMEI
เวอร์ชัน: 3, 4
ทำซ้ำได้ ใช่
ระบุ IMEI ของวิทยุทุกสัญญาณในอุปกรณ์ ระบบจะตั้งค่าช่องนี้เฉพาะเมื่อขอการรับรองตัวระบุของอุปกรณ์เท่านั้น
หากอุปกรณ์ไม่รองรับเอกสารรับรองรหัส (หรือ
ก่อนหน้านี้มีการโทร destroyAttestationIds()
และอุปกรณ์
ไม่ได้รับรองรหัสอีกต่อไป) คำขอเอกสารรับรองคีย์ใดๆ ที่มี
แท็กนี้ทำงานไม่สำเร็จด้วย ErrorCode::CANNOT_ATTEST_IDS
ค่าคือ Blob ซึ่งเป็นอาร์เรย์ไบต์ที่มีความยาวตามต้องการ
แท็ก::ATTESTATION_ID_MANUFACTURER
เวอร์ชัน: 3, 4
ใช้ซ้ำได้ ไม่
ระบุชื่อผู้ผลิตอุปกรณ์ ตามที่แสดงโดย
Build.MANUFACTURER
ใน Android ฟิลด์นี้จะตั้งค่าเมื่อ
ที่ขอเอกสารรับรองของตัวระบุของอุปกรณ์
หากอุปกรณ์ไม่รองรับการรับรองรหัส (หรือมีการเรียกใช้ destroyAttestationIds()
ก่อนหน้านี้และอุปกรณ์ไม่สามารถรับรองรหัสได้อีกต่อไป) คำขอการรับรองคีย์ที่มีแท็กนี้จะดำเนินการไม่สำเร็จพร้อมแสดงผล ErrorCode::CANNOT_ATTEST_IDS
ค่าคือ Blob ซึ่งเป็นอาร์เรย์ไบต์ที่มีความยาวตามต้องการ
Tag::ATTESTATION_ID_MEID
เวอร์ชัน: 3, 4
ทำซ้ำได้ ใช่
ระบุ MEID สำหรับสัญญาณวิทยุทั้งหมดในอุปกรณ์ ระบบจะตั้งค่าช่องนี้เฉพาะเมื่อขอการรับรองตัวระบุของอุปกรณ์เท่านั้น
หากอุปกรณ์ไม่รองรับเอกสารรับรองรหัส (หรือ
ก่อนหน้านี้มีการโทร destroyAttestationIds()
และอุปกรณ์
ไม่ได้รับรองรหัสอีกต่อไป) คำขอเอกสารรับรองคีย์ใดๆ ที่มี
แท็กนี้ทำงานไม่สำเร็จด้วย ErrorCode::CANNOT_ATTEST_IDS
ค่านี้คือ BLOB ซึ่งเป็นอาร์เรย์ของไบต์ที่มีความยาวเท่าใดก็ได้
Tag::ATTESTATION_ID_MODEL
เวอร์ชัน: 3, 4
ใช้ซ้ำได้ ไม่
ระบุชื่อรุ่นของอุปกรณ์ตามที่ Build.MODEL
ใน Android แสดง ช่องนี้จะตั้งค่าเฉพาะเมื่อขอการรับรองตัวระบุของอุปกรณ์เท่านั้น
หากอุปกรณ์ไม่รองรับการรับรองรหัส (หรือมีการเรียกใช้ destroyAttestationIds()
ก่อนหน้านี้และอุปกรณ์ไม่สามารถรับรองรหัสได้อีกต่อไป) คำขอการรับรองคีย์ที่มีแท็กนี้จะดำเนินการไม่สำเร็จพร้อมแสดงผล ErrorCode::CANNOT_ATTEST_IDS
ค่านี้คือ BLOB ซึ่งเป็นอาร์เรย์ของไบต์ที่มีความยาวเท่าใดก็ได้
Tag::ATTESTATION_ID_PRODUCT
เวอร์ชัน: 3, 4
ทำซ้ำได้ ไม่
ระบุชื่อผลิตภัณฑ์ของอุปกรณ์ตามที่
Build.PRODUCT
ใน Android แสดง ฟิลด์นี้จะตั้งค่าเมื่อ
ที่ขอเอกสารรับรองของตัวระบุของอุปกรณ์
หากอุปกรณ์ไม่รองรับการรับรองรหัส (หรือมีการเรียกใช้ destroyAttestationIds()
ก่อนหน้านี้และอุปกรณ์ไม่สามารถรับรองรหัสได้อีกต่อไป) คำขอการรับรองคีย์ที่มีแท็กนี้จะดำเนินการไม่สำเร็จพร้อมแสดงผล ErrorCode::CANNOT_ATTEST_IDS
ค่าคือ Blob ซึ่งเป็นอาร์เรย์ไบต์ที่มีความยาวตามต้องการ
แท็ก::ATTESTATION_ID_SERIAL
เวอร์ชัน: 3, 4
ใช้ซ้ำได้ ไม่
ระบุหมายเลขซีเรียลของอุปกรณ์ ช่องนี้จะตั้งค่าเฉพาะเมื่อขอการรับรองตัวระบุของอุปกรณ์เท่านั้น
หากอุปกรณ์ไม่รองรับการรับรองรหัส (หรือมีการเรียกใช้ destroyAttestationIds()
ก่อนหน้านี้และอุปกรณ์ไม่สามารถรับรองรหัสได้อีกต่อไป) คำขอการรับรองคีย์ที่มีแท็กนี้จะดำเนินการไม่สำเร็จพร้อมแสดงผล ErrorCode::CANNOT_ATTEST_IDS
ค่านี้คือ BLOB ซึ่งเป็นอาร์เรย์ของไบต์ที่มีความยาวเท่าใดก็ได้
แท็ก::AUTH_TIMEOUT
เวอร์ชัน: 1, 2, 3, 4
ใช้ซ้ำได้ ไม่
ระบุเวลาเป็นวินาทีที่ได้รับอนุญาตให้ใช้คีย์ หลังจาก การตรวจสอบสิทธิ์ หากเป็น Tag::USER_SECURE_ID อยู่ และแท็กนี้ไม่มีอยู่ คีย์ต้องมีการตรวจสอบสิทธิ์สำหรับทุก (โปรดดูเริ่มต้นสำหรับ รายละเอียดของขั้นตอนการตรวจสอบสิทธิ์ต่อการดำเนินการ)
ค่านี้ต้องเป็นจำนวนเต็ม 32 บิตที่ระบุเวลาเป็นวินาทีหลังจาก การตรวจสอบสิทธิ์ที่สำเร็จของผู้ใช้ที่ระบุโดย Tag::USER_SECURE_ID ด้วยวิธีการตรวจสอบสิทธิ์ ระบุโดย Tag::USER_AUTH_TYPE ว่าสามารถใช้คีย์ดังกล่าวได้
Tag::AUTH_TOKEN
เวอร์ชัน: 1, 2, 3, 4
ทำซ้ำได้ ไม่
มี การตรวจสอบสิทธิ์ โทเค็นเป็น begin update หรือ เสร็จสิ้น เพื่อพิสูจน์การตรวจสอบสิทธิ์ผู้ใช้สำหรับการดำเนินการคีย์ที่จำเป็นต้องใช้ (คีย์มี แท็ก::USER_SECURE_ID)
ค่านี้คือ BLOB ที่มีโครงสร้าง hw_auth_token_t
Tag::BLOB_USAGE_REQUIREMENTS
เวอร์ชัน: 1, 2, 3, 4
ใช้ซ้ำได้ ไม่
ระบุเงื่อนไขสภาพแวดล้อมของระบบที่จำเป็นสำหรับไฟล์สร้าง ที่จะนำไปใช้
ค่าที่เป็นไปได้จะกำหนดโดยรายการต่อไปนี้
คีย์มาสเตอร์ 3enum class KeyBlobUsageRequirements : uint32_t { STANDALONE = 0, REQUIRES_FILE_SYSTEM = 1, };
typedef enum { KM_BLOB_STANDALONE = 0, KM_BLOB_REQUIRES_FILE_SYSTEM = 1, } keymaster_key_blob_usage_requirements_t;
คุณสามารถระบุแท็กนี้ระหว่างการสร้างคีย์เพื่อให้คีย์ใช้งานได้ในเงื่อนไขที่ระบุ โดยต้องส่งคืนพร้อมกับลักษณะของคีย์จาก generateKey และ getKeyCharacteristics
หากผู้โทรระบุ Tag::BLOB_USAGE_REQUIREMENTS
ด้วย
ค่า KeyBlobUsageRequirements::STANDALONE
ความน่าเชื่อถือแสดงผล BLOB คีย์
ที่สามารถใช้ได้โดยไม่มีการรองรับระบบไฟล์ ซึ่งสำคัญอย่างยิ่งสำหรับอุปกรณ์ที่มีดิสก์ที่เข้ารหัส ซึ่งระบบไฟล์อาจไม่พร้อมใช้งานจนกว่าจะได้ใช้คีย์ Keymaster เพื่อถอดรหัสดิสก์
แท็ก::BLOCK_MODE
เวอร์ชัน: 1, 2, 3, 4
ใช้ซ้ำได้ ใช่
ระบุโหมดการเข้ารหัสแบบบล็อกที่ใช้ร่วมกับคีย์ได้ แท็กนี้เกี่ยวข้องกับคีย์ AES เท่านั้น
ค่าที่เป็นไปได้จะกำหนดโดยการแจงนับต่อไปนี้
คีย์มาสเตอร์ 3enum class BlockMode : uint32_t { ECB = 1, CBC = 2, CTR = 3, GCM = 32, };
typedef enum { KM_MODE_ECB = 1, KM_MODE_CBC = 2, KM_MODE_CTR = 3, KM_MODE_GCM = 32, } keymaster_block_mode_t;
แท็กนี้ใช้ซ้ำได้ และสำหรับการดำเนินการคีย์ AES ให้ระบุโหมดใน
อาร์กิวเมนต์ additionalParams
ของ
begin
หากโหมดที่ระบุไม่ได้อยู่ในโหมดที่เชื่อมโยงกับคีย์ การดำเนินการจะล้มเหลวพร้อม ErrorCode::INCOMPATIBLE_BLOCK_MODE
Tag::BOOT_PATCHLEVEL
เวอร์ชัน: 4
Tag::BOOT_PATCHLEVEL จะระบุระดับแพตช์ความปลอดภัยของภาพการบูต (เคอร์เนล) ที่สามารถใช้คีย์ได้ แท็กนี้ไม่เคยส่งไปยัง TA ของ keymaster แต่
จะเพิ่มลงในรายการการให้สิทธิ์ที่ใช้ฮาร์ดแวร์โดย TA การพยายามใช้คีย์ที่มีค่า Tag::BOOT_PATCHLEVEL
แตกต่างจากระดับแพตช์ของระบบที่ใช้งานอยู่ในปัจจุบันจะทำให้ begin()
, getKeyCharacteristics()
หรือ exportKey()
แสดงผลเป็น ErrorCode::KEY_REQUIRES_UPGRADE
โปรดดู upgradeKey()
เพื่อดูรายละเอียด
ค่าของแท็กคือจำนวนเต็มของรูปแบบ YYYYMMDD โดยที่ YYYY คือค่า ปีของการอัปเดตครั้งล่าสุดเป็นเลข 4 หลัก MM คือเดือนที่มีเลข 2 หลัก และ DD คือตัวเลข วันแบบ 2 หลักของการอัปเดตครั้งล่าสุด ตัวอย่างเช่น สำหรับคีย์ที่สร้างใน อุปกรณ์ Android อัปเดตครั้งล่าสุดเมื่อวันที่ 5 มิถุนายน 2018 ค่าจะเป็น 20180605 หากไม่ทราบวัน ให้แทนที่ 00 ได้
ในระหว่างการเปิดเครื่องแต่ละครั้ง Bootloader จะต้องระบุระดับแพตช์ของอิมเมจการเปิดเครื่อง กับสภาพแวดล้อมที่ปลอดภัย (กำหนดกลไกการทำงานแล้ว)
ต้องบังคับใช้ด้วยฮาร์ดแวร์
Tag::BOOTLOADER_ONLY
เวอร์ชัน: 1, 2, 3, 4
ใช้ซ้ำได้ ไม่
ระบุว่ามีเพียงโปรแกรมโหลดบูตเท่านั้นที่จะใช้คีย์ได้
แท็กนี้เป็นบูลีน ค่าที่เป็นไปได้จึงได้แก่ จริง (หากมีแท็ก) และเท็จ (หากไม่มีแท็ก)
การพยายามใช้คีย์กับ Tag::BOOTLOADER_ONLY
จาก
ระบบ Android ทำงานไม่สำเร็จด้วยErrorCode::INVALID_KEY_BLOB
แท็ก::CALLER_NONCE
เวอร์ชัน: 1, 2, 3, 4
ใช้ซ้ำได้ ไม่
ระบุว่าผู้เรียกใช้สามารถให้ค่า Nonce สำหรับการดำเนินการที่กำหนดค่า Nonce
แท็กนี้เป็นบูลีน ค่าที่เป็นไปได้จึงเป็นจริง (หากมีแท็ก) และ false (หากไม่มีแท็ก)
แท็กนี้ใช้สำหรับคีย์ AES เท่านั้น และเกี่ยวข้องกับ CBC, CTR และ GCM เท่านั้น
โหมดบล็อก หากไม่มีแท็ก การติดตั้งใช้งานควรปฏิเสธ
การดำเนินการที่ให้ Tag::NONCE เป็น
เริ่ม
กับ ErrorCode::CALLER_NONCE_PROHIBITED
แท็ก::CREATION_DATETIME
เวอร์ชัน: 1, 2, 3, 4
ทำซ้ำได้ ไม่
ระบุวันที่และเวลาที่สร้างคีย์ หน่วยเป็นมิลลิวินาทีตั้งแต่ 1 มกราคม 1970 แท็กนี้จะใช้หรือไม่ใช้ก็ได้และเป็นเพียงการให้ข้อมูลเท่านั้น
แท็ก::DIGEST
เวอร์ชัน: 1, 2, 3, 4
ทำซ้ำได้ ใช่
ระบุอัลกอริทึมข้อมูลสรุปที่ใช้กับคีย์เพื่อดำเนินการเซ็นชื่อและยืนยัน แท็กนี้เกี่ยวข้องกับคีย์ RSA, ECDSA และ HMAC
ค่าที่เป็นไปได้จะกำหนดโดยรายการต่อไปนี้
คีย์มาสเตอร์ 3enum 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, };
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;
แท็กนี้ใช้ซ้ำได้ สำหรับการดำเนินการลงชื่อและยืนยัน ให้ระบุ
ไดเจสต์ในอาร์กิวเมนต์ additionalParams
ของ
begin
หากไดเจสต์ที่ระบุไม่อยู่ในไดเจสต์ที่เชื่อมโยงกับคีย์
การดำเนินการล้มเหลวด้วย ErrorCode::INCOMPATIBLE_DIGEST
แท็ก::EC_CURVE
เวอร์ชัน: 2, 3, 4
ทำซ้ำได้ ไม่
ใน Keymaster 1 มีการคาดเดาเส้นโค้งที่ใช้สำหรับคีย์ EC จากคีย์ที่ระบุ
ขนาด 100 x 240 นับจากนี้ไป Keymaster 2 จึงเพิ่มความยืดหยุ่น จึงได้เปิดตัว
ในการระบุเส้นโค้ง คำขอสร้างคีย์ EC อาจมี Tag::EC_CURVE
, Tag::KEY_SIZE
หรือทั้ง 2 อย่าง
ค่าที่เป็นไปได้จะกำหนดโดยการแจงนับต่อไปนี้
Keymaster 3enum class EcCurve : uint32_t { P_224 = 0, P_256 = 1, P_384 = 2, P_521 = 3, };
enum class EcCurve : uint32_t { P_224 = 0, P_256 = 1, P_384 = 2, P_521 = 3, };
หากคำขอสร้างมีเฉพาะ Tag::KEY_SIZE
กลับไปใช้ตรรกะ Keymaster 1 โดยเลือกเส้นโค้ง NIST ที่เหมาะสม
หากคำขอมีเฉพาะ Tag::EC_CURVE
ให้ใช้
เส้นโค้งที่ระบุ สำหรับ Keymaster 3 ขึ้นไป เส้นโค้งจะกำหนดไว้ใน
EcCurve
สำหรับ Keymaster 2 และเวอร์ชันก่อนหน้า ระบบจะกำหนดเส้นโค้ง
ใน keymaster_ec_curve_t
หากคำขอมีทั้ง 2 รายการ ให้ใช้เวิร์กเกอร์ที่ระบุโดย Tag::EC_CURVE
และตรวจสอบว่าขนาดคีย์ที่ระบุเหมาะสมกับเวิร์กเกอร์นั้น หากไม่ ให้ส่งคืน
ErrorCode::INVALID_ARGUMENT
Tag::INCLUDE_UNIQUE_ID
เวอร์ชัน: 2, 3, 4
ใช้ซ้ำได้ ไม่
มีการระบุแท็กนี้ระหว่างการสร้างคีย์เพื่อระบุว่าเอกสารรับรอง ใบรับรองของคีย์ที่สร้างควรมีขอบเขตระดับแอปและ รหัสที่ไม่ซ้ำกันของอุปกรณ์ที่มีกำหนดเวลา ตามที่ระบุไว้โดย แท็ก::UNIQUE_ID
แท็กนี้เป็นบูลีน ค่าที่เป็นไปได้จึงได้แก่ จริง (หากมีแท็ก) และเท็จ (หากไม่มีแท็ก)
แท็ก::KEY_SIZE
เวอร์ชัน: 1, 2, 3, 4
ทำซ้ำได้ ไม่
ระบุขนาดของคีย์เป็นหน่วยบิต ซึ่งวัดด้วยวิธีปกติสำหรับฟังก์ชัน
ของคีย์ ตัวอย่างเช่น Tag::KEY_SIZE
จะระบุสำหรับคีย์ RSA
ขนาดของโมดูลัสสาธารณะ สำหรับคีย์ AES จะระบุความยาว
ของเนื้อหาคีย์ลับ
แท็ก::MAC_LENGTH
เวอร์ชัน: 1, 2, 3, 4
ทำซ้ำได้ ไม่
ระบุความยาวที่ขอของแท็กการตรวจสอบสิทธิ์ MAC หรือ GCM เป็นบิต
ค่าคือความยาว MAC ในหน่วยบิต โดยต้องเป็นจำนวนที่หารด้วย 8 ได้และมีค่าอย่างน้อยเท่ากับค่าของ Tag::MIN_MAC_LENGTH ที่เชื่อมโยงกับคีย์
แท็ก::MAX_USES_PER_BOOT
เวอร์ชัน: 1, 2, 3, 4
ใช้ซ้ำได้ ไม่
ระบุจำนวนครั้งสูงสุดที่สามารถใช้คีย์ได้ระหว่างระบบ การรีบูต ซึ่งเป็นกลไกอีกอย่างหนึ่งในการจำกัดอัตราการใช้คีย์
ค่านี้จะเป็นจำนวนเต็ม 32 บิตที่แสดงถึงการใช้งานต่อการเปิดเครื่อง
เมื่อมีการใช้คีย์ที่มีแท็กนี้ในการดำเนินงาน ตัวนับที่เชื่อมโยงกับคีย์
ควรเพิ่มขึ้นในระหว่าง
เริ่มต้นการโทร หลังคีย์
ตัวนับเกินค่านี้ ความพยายามใช้คีย์ครั้งต่อๆ มาทั้งหมดไม่สำเร็จ
กับ ErrorCode::MAX_OPS_EXCEEDED
จนกว่าอุปกรณ์จะรีสตาร์ท
ซึ่งหมายความว่า Trustlet จะเก็บตารางตัวนับการใช้งานสำหรับคีย์ที่มีแท็กนี้ เนื่องจากหน่วยความจำของ Keymaster มักจะจํากัด ตารางนี้จึงมีขนาดใหญ่สูงสุดแบบคงที่ และ Keymaster อาจดําเนินการที่ใช้คีย์ที่มีแท็กนี้ไม่สําเร็จเมื่อตารางเต็ม ตารางต้องมีคีย์อย่างน้อย 16 คีย์
หากการดำเนินการล้มเหลวเนื่องจากตารางเต็ม Keymaster จะแสดงผลเป็น ErrorCode::TOO_MANY_OPERATIONS
แท็ก::MIN_MAC_LENGTH
เวอร์ชัน: 1, 2, 3, 4
ทำซ้ำได้ ไม่
แท็กนี้ระบุความยาวขั้นต่ำของ MAC ที่สามารถขอหรือ ยืนยันด้วยคีย์นี้สำหรับคีย์ HMAC และคีย์ AES ที่รองรับโหมด GCM
ค่านี้จะเป็นความยาวขั้นต่ำของ MAC ในหน่วยบิต ได้ผลคูณของ 8 สำหรับคีย์ HMAC ค่าต้องไม่ต่ำกว่า 64 สำหรับคีย์ GCM ค่าคือ 96 เป็นอย่างน้อย และไม่เกิน 128 บัญชี
แท็ก::MIN_SECONDS_BETWEEN_OPS
เวอร์ชัน: 1, 2, 3, 4
ใช้ซ้ำได้ ไม่
ระบุระยะเวลาขั้นต่ำที่ผ่านไประหว่างที่ได้รับอนุญาต โดยใช้คีย์ ใช้เพื่อให้คะแนนจำกัดการใช้คีย์ในบริบทต่างๆ ที่การใช้งานแบบไม่จำกัดอาจทำให้เกิดการโจมตีแบบบรูตฟอร์ซ
ค่านี้ต้องเป็นจำนวนเต็ม 32 บิตซึ่งแสดงวินาทีระหว่างที่อนุญาต การดำเนินงาน
เมื่อใช้คีย์ที่มีแท็กนี้ในการทำงาน ให้เริ่มตัวจับเวลา
ในระหว่างเสร็จสิ้น หรือ
ล้มเลิกการโทร การเรียกbegin ใดๆ ที่ได้รับก่อนที่ตัวจับเวลาจะระบุว่าช่วงเวลาที่ระบุโดย Tag::MIN_SECONDS_BETWEEN_OPS
ผ่านไปแล้วจะดำเนินการไม่สำเร็จพร้อมแสดงค่า ErrorCode::KEY_RATE_LIMIT_EXCEEDED
ช่วงเวลานี้
กล่าวเป็นนัยว่า Trustlet เก็บตารางตัวนับการใช้งานสำหรับคีย์ที่มีแท็กนี้
เนื่องจากหน่วยความจำของ Keymaster มักมีจำกัด ตารางนี้จึงอาจมีขนาดสูงสุดแบบคงที่ และ Keymaster อาจดำเนินการที่พยายามใช้คีย์ที่มีแท็กนี้ไม่สำเร็จเมื่อตารางเต็ม ตารางต้องรองรับผู้ใช้อย่างน้อย 32 คน
คีย์และใช้ช่องตารางซ้ำเชิงรุกเมื่อช่วงเวลาการใช้งานขั้นต่ำของคีย์หมดอายุ
หากการดำเนินการล้มเหลวเนื่องจากตารางเต็ม Keymaster จะแสดงผล
ErrorCode::TOO_MANY_OPERATIONS
Tag::NO_AUTH_REQUIRED
เวอร์ชัน: 1, 2, 3, 4
ทำซ้ำได้ ไม่
ระบุว่าไม่ต้องมีการตรวจสอบสิทธิ์เพื่อใช้คีย์นี้ แท็กนี้ แยกต่างหากจาก Tag::USER_SECURE_ID
แท็กนี้เป็นบูลีน ค่าที่เป็นไปได้จึงได้แก่ จริง (หากมีแท็ก) และเท็จ (หากไม่มีแท็ก)
แท็ก::NONCE
เวอร์ชัน: 1, 2, 3, 4
ทำซ้ำได้ ไม่
ให้หรือแสดงผล Nonce หรือเวกเตอร์การเริ่มต้น (IV) สําหรับการเข้ารหัสหรือถอดรหัส AES GCM, CBC หรือ CTR แท็กนี้มอบให้แก่ เริ่ม ในระหว่างการดำเนินการเข้ารหัสและถอดรหัส ข้อมูลนี้จะมีให้ก็ต่อเมื่อเริ่มต้นหากคีย์มี Tag::CALLER_NONCE หากไม่ได้ระบุ Nonce หรือ IV ที่เหมาะสมจะสร้างขึ้นแบบสุ่มโดย Keymaster และแสดงผลจากจุดเริ่มต้น
ค่านี้คือ BLOB ซึ่งเป็นอาร์เรย์ของไบต์ที่มีความยาวเท่าใดก็ได้ ความยาวที่อนุญาต ขึ้นอยู่กับโหมด: nonces ใน GCM มีความยาว 12 ไบต์ CBC และ CTR IV เท่ากับ 16 ความยาวไบต์
แท็ก::ORIGIN
เวอร์ชัน: 1, 2, 3, 4
ทำซ้ำได้ ไม่
ระบุตำแหน่งที่สร้างคีย์ หากทราบ คุณจะระบุแท็กนี้ไม่ได้ในระหว่างการสร้างหรือนําเข้าคีย์ และต้องเพิ่มลงในลักษณะของคีย์โดย Trustlet
คีย์มาสเตอร์ 3โปรดดูค่าที่เป็นไปได้ใน
android::hardware::keymaster::v3_0::KeyOrigin
:
enum class KeyOrigin : uint32_t { GENERATED = 0, DERIVED = 1, IMPORTED = 2, UNKNOWN = 3, };
ค่าที่เป็นไปได้จะกำหนดไว้ใน keymaster_origin_t
ดังนี้
typedef enum { KM_ORIGIN_GENERATED = 0, KM_ORIGIN_IMPORTED = 2, KM_ORIGIN_UNKNOWN = 3, } keymaster_key_origin_t
ความหมายที่สมบูรณ์ของค่าไม่เพียงขึ้นอยู่กับค่านั้นๆ เท่านั้น แต่ยังขึ้นอยู่กับว่าค่านั้นอยู่ในรายการลักษณะที่บังคับใช้โดยฮาร์ดแวร์หรือซอฟต์แวร์หรือไม่
GENERATED
บ่งชี้ว่า Keymaster สร้างคีย์
หากอยู่ในรายการที่บังคับใช้ฮาร์ดแวร์
คีย์ถูกสร้างขึ้นในฮาร์ดแวร์ที่ปลอดภัยและเชื่อมโยงกับฮาร์ดแวร์อย่างถาวร หากอยู่ในรายการที่บังคับใช้ซอฟต์แวร์ แสดงว่าคีย์สร้างขึ้นใน SoftKeymaster และไม่ได้เชื่อมโยงกับฮาร์ดแวร์
DERIVED
บ่งชี้ว่าคีย์มาจาก Keymaster
น่าจะไม่ได้อยู่ในอุปกรณ์
IMPORTED
บ่งบอกว่าคีย์สร้างขึ้นภายนอก
ของ Keymaster และนำเข้าไปยัง
Keymaster หากอยู่ในรายการที่บังคับใช้ฮาร์ดแวร์ รายการดังกล่าวจะเชื่อมโยงกับฮาร์ดแวร์อย่างถาวร แม้ว่าอาจมีสำเนาอยู่นอกฮาร์ดแวร์ที่มีการรักษาความปลอดภัย หากอยู่ในรายการ "ซอฟต์แวร์บังคับใช้" แสดงว่าระบบได้นำเข้าคีย์ไปยัง SoftKeymaster และไม่ผูกอยู่กับฮาร์ดแวร์
UNKNOWN
ควรปรากฏในรายการที่ใช้ฮาร์ดแวร์เท่านั้น
สถานะนี้บ่งบอกว่าคีย์เชื่อมโยงกับฮาร์ดแวร์ แต่ไม่ทราบว่าคีย์สร้างขึ้นในฮาร์ดแวร์ที่มีความปลอดภัยตั้งแต่แรกหรือนำเข้า กรณีนี้จะเกิดขึ้นเมื่อฮาร์ดแวร์ keymaster0 เท่านั้น
ซึ่งใช้เพื่อจำลองบริการ keymaster1
Tag::ORIGINATION_EXPIRE_DATETIME
เวอร์ชัน: 1, 2, 3, 4
ใช้ซ้ำได้ ไม่
ระบุวันที่และเวลาที่คีย์หมดอายุสำหรับการลงชื่อและ
เพื่อการเข้ารหัส หลังจากเวลาดังกล่าว ความพยายามในการใช้คีย์กับ
KeyPurpose::SIGN หรือ
มีการระบุ KeyPurpose::ENCRYPT
to begin ล้มเหลว
กับ ErrorCode::KEY_EXPIRED
ค่าคือจํานวนเต็ม 64 บิตที่แสดงเป็นมิลลิวินาทีนับจากวันที่ 1 มกราคม 1970
แท็ก::OS_PATCHLEVEL
เวอร์ชัน: 2, 3, 4
ทำซ้ำได้ ไม่
ระบบจะไม่ส่งแท็กนี้ไปยัง TA ของ Keymaster แต่ TA จะเพิ่มแท็กนี้ลงในรายการการให้สิทธิ์ที่บังคับใช้ฮาร์ดแวร์
ค่าของแท็กคือจำนวนเต็มในรูปแบบ YYYYMM โดย YYYY คือปี 4 หลักของการอัปเดตครั้งล่าสุด และ MM คือเดือน 2 หลักของการอัปเดตครั้งล่าสุด ตัวอย่างเช่น สำหรับคีย์ที่สร้างขึ้นในอุปกรณ์ Android อัปเดตครั้งล่าสุดใน ค่าในเดือนธันวาคม 2015 จะเป็น 201512
คีย์ที่มีระดับแพตช์แตกต่างจากระดับแพตช์ปัจจุบันจะใช้ไม่ได้ การพยายามใช้สาเหตุหลักดังกล่าว
begin
getKeyCharacteristics
หรือ exportKey
เพื่อส่งคืน ErrorCode::KEY_REQUIRES_UPGRADE
โปรดดู
การเชื่อมโยงเวอร์ชันเพิ่มเติม
รายละเอียด
Tag::OS_VERSION
เวอร์ชัน: 2, 3, 4
ทำซ้ำได้ ไม่
ระบบจะไม่ส่งแท็กนี้ไปยัง TA ของ Keymaster แต่ TA จะเพิ่มแท็กนี้ลงในรายการการให้สิทธิ์ที่บังคับใช้ฮาร์ดแวร์
ค่าของแท็กคือจํานวนเต็มในรูปแบบ MMmmss โดยที่ MM เป็นค่าหลัก หมายเลขเวอร์ชัน mm คือหมายเลขเวอร์ชันย่อย และ ss คือเวอร์ชันย่อย หมายเลข เช่น สำหรับคีย์ที่สร้างใน Android เวอร์ชัน 4.0.3 ค่าจะเป็น 040003
Tag::PADDING
เวอร์ชัน: 1, 2, 3, 4
ทำซ้ำได้ ใช่
ระบุโหมดการเติมที่ใช้กับคีย์ได้ แท็กนี้เกี่ยวข้องกับคีย์ RSA และ AES
ค่าที่เป็นไปได้จะกำหนดโดยการแจงนับต่อไปนี้
Keymaster 3enum 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, };
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
และ
ใช้PaddingMode::RSA_PKCS1_1_5_ENCRYPT
สำหรับคีย์การเข้ารหัส/ถอดรหัส RSA เท่านั้น และระบุ RSA PKCS#1v2 OAEP
ระยะห่างจากขอบและระยะห่างจากขอบของ RSA PKCS#1 v1.5 แบบสุ่มตามลำดับ
PaddingMode::RSA_PSS
และ
PaddingMode::RSA_PKCS1_1_5_SIGN
ใช้สำหรับคีย์การรับรอง/การยืนยัน RSA เท่านั้น และระบุการเติมค่า RSA PKCS#1v2 PSS และการเติมค่าแบบกำหนดได้ของ RSA PKCS#1 v1.5 ตามลำดับ
PaddingMode::NONE
ใช้ได้กับทั้ง RSA หรือ
AES สําหรับคีย์ AES หากใช้ PaddingMode::NONE
กับโหมดบล็อก ECB หรือ CBC และข้อมูลที่จะเข้ารหัสหรือถอดรหัสมีความยาวไม่ตรงกับจํานวนหลายเท่าของขนาดบล็อก AES การเรียกใช้เพื่อสิ้นสุดจะดำเนินการไม่สําเร็จด้วย ErrorCode::INVALID_INPUT_LENGTH
PaddingMode::PKCS7
ใช้ได้กับคีย์ AES เท่านั้น และใช้ได้กับโหมด ECB และ CBC เท่านั้น
แท็กนี้ใช้ซ้ำได้ ต้องระบุโหมดระยะห่างจากขอบในการเรียก
begin
หากโหมดที่ระบุไม่ได้รับอนุญาตให้ใช้คีย์ การดำเนินการจะล้มเหลวพร้อม ErrorCode::INCOMPATIBLE_BLOCK_MODE
Tag::PURPOSE
เวอร์ชัน: 1, 2, 3, 4
ใช้ซ้ำได้ ใช่
ระบุชุดวัตถุประสงค์ที่สามารถใช้คีย์ได้
ค่าที่เป็นไปได้จะกำหนดโดยรายการต่อไปนี้
คีย์มาสเตอร์ 3enum class KeyPurpose : uint32_t { ENCRYPT = 0, DECRYPT = 1, SIGN = 2, VERIFY = 3, DERIVE_KEY = 4, // since 3.0 WRAP_KEY = 5, // since 3.0 };
typedef enum { KM_PURPOSE_ENCRYPT = 0, KM_PURPOSE_DECRYPT = 1, KM_PURPOSE_SIGN = 2, KM_PURPOSE_VERIFY = 3, } keymaster_purpose_t;
แท็กนี้ใช้ซ้ำได้ โดยระบบจะสร้างคีย์ที่มีค่าหลายค่าได้ แม้ว่าการดำเนินการจะมีวัตถุประสงค์เดียวก็ตาม เมื่อเรียกใช้ฟังก์ชัน begin เพื่อเริ่มการดำเนินการ ระบบจะระบุวัตถุประสงค์ของการดำเนินการ
หากวัตถุประสงค์ที่ระบุในการดําเนินการไม่ได้รับอนุญาตจาก
การดำเนินการล้มเหลวด้วย ErrorCode::INCOMPATIBLE_PURPOSE
แท็ก::RESET_SINCE_ID_ROTATION
เวอร์ชัน: 3, 4
ทำซ้ำได้ ไม่
ระบุว่าอุปกรณ์ได้รับการรีเซ็ตเป็นค่าเริ่มต้นหรือไม่ตั้งแต่การเปลี่ยนรหัสที่ไม่ซ้ำกันครั้งล่าสุด ใช้สำหรับการรับรองคีย์
แท็กนี้เป็นบูลีน ค่าที่เป็นไปได้จึงได้แก่ จริง (หากมีแท็ก) และเท็จ (หากไม่มีแท็ก)
แท็ก::ROLLBACK_RESISTANT
เวอร์ชัน: 1, 2, 3, 4
ทำซ้ำได้ ไม่
บ่งบอกว่าคีย์ป้องกันการย้อนกลับ ซึ่งหมายความว่าเมื่อลบแล้ว โดย deleteKey หรือ deleteAllKeys เรารับประกันว่าคีย์จะถูกลบอย่างถาวรและใช้งานไม่ได้ เป็นไปได้ คีย์ที่ไม่มีแท็กนี้จะถูกลบออกและกู้คืนจากข้อมูลสำรองได้
แท็กนี้เป็นบูลีน ค่าที่เป็นไปได้จึงเป็นจริง (หากมีแท็ก) และ false (หากไม่มีแท็ก)
แท็ก::ROOT_OF_TRUST
เวอร์ชัน: 1, 2, 3, 4
ทำซ้ำได้ ไม่
ระบุรูทของความน่าเชื่อถือ ซึ่งเป็นคีย์ที่ใช้ในการเปิดเครื่องที่ได้รับการยืนยันเพื่อ ตรวจสอบว่าระบบปฏิบัติการที่บูต (หากมี) ไม่ได้ระบุแท็กนี้ ไปยังหรือส่งคืนจาก Keymaster ในลักษณะเฉพาะที่สำคัญ
Tag::RSA_PUBLIC_EXPONENT
เวอร์ชัน: 1, 2, 3, 4
ใช้ซ้ำได้ ไม่
ระบุค่าของเลขชี้กำลังสาธารณะสำหรับคู่คีย์ RSA แท็กนี้ เกี่ยวข้องกับคีย์ RSA เท่านั้น และจําเป็นสําหรับคีย์ RSA ทั้งหมด
ค่านี้จะเป็นจำนวนเต็มที่ไม่มีเครื่องหมาย 64 บิตซึ่งเป็นไปตามข้อกำหนดของแอตทริบิวต์
เลขยกกำลังสาธารณะของ RSA ค่านี้ต้องเป็นจำนวนเฉพาะ Trustlet รองรับค่า 2^16+1 และรองรับค่าอื่นๆ ที่สมเหตุสมผล โดยเฉพาะค่า 3
หากไม่ได้ระบุเลขชี้กำลังหรือระบบไม่รองรับเลขชี้กำลังที่ระบุ
สร้างคีย์ไม่สำเร็จด้วย ErrorCode::INVALID_ARGUMENT
แท็ก::UNIQUE_ID
เวอร์ชัน: 3, 4
ใช้ซ้ำได้ ไม่
ใช้เพื่อระบุรหัสที่ไม่ซ้ำกันในการรับรอง
ค่านี้คือ BLOB ซึ่งเป็นอาร์เรย์ของไบต์ที่มีความยาวเท่าใดก็ได้
แท็ก::USAGE_EXPIRE_DATETIME
เวอร์ชัน: 1, 2, 3, 4
ทำซ้ำได้ ไม่
ระบุวันที่และเวลาที่คีย์จะหมดอายุเพื่อวัตถุประสงค์ในการยืนยันและการถอดรหัส หลังจากเวลาดังกล่าว ความพยายามในการใช้คีย์กับ
KeyPurpose::VERIFY หรือ
KeyPurpose::DECRYPT มีไว้สำหรับ
begin ล้มเหลว
กับ ErrorCode::KEY_EXPIRED
ค่าคือจํานวนเต็ม 64 บิตที่แสดงเป็นมิลลิวินาทีนับจากวันที่ 1 มกราคม 1970
แท็ก::USER_AUTH_TYPE
เวอร์ชัน: 1, 2, 3, 4
ใช้ซ้ำได้ ไม่
ระบุประเภทโปรแกรมตรวจสอบสิทธิ์ของผู้ใช้ที่ใช้เพื่อให้สิทธิ์คีย์นี้ได้ เมื่อระบบขอให้ Keymaster ดำเนินการกับคีย์ที่มีแท็กนี้ Keymaster จะได้รับโทเค็นการตรวจสอบสิทธิ์ และช่อง authenticator_type
ของโทเค็นต้องตรงกับค่าในแท็ก
เช่น (ntoh(token.authenticator_type) &
auth_type_tag_value) != 0
โดยที่ ntoh
คือฟังก์ชันที่แปลงจำนวนเต็มตามลําดับเครือข่ายเป็นจํานวนเต็มตามลําดับโฮสต์ และ auth_type_tag_value
คือค่าของแท็กนี้
ค่าจะเป็นบิตมาสก์จำนวนเต็ม 32 บิตของค่าจากการแจงนับ ดังนี้
คีย์มาสเตอร์ 3enum class HardwareAuthenticatorType : uint32_t { NONE = 0u, // 0 PASSWORD = 1 << 0, FINGERPRINT = 1 << 1, ANY = UINT32_MAX, };
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
เวอร์ชัน: 1, 2, 3, 4
ใช้ซ้ำได้ ใช่
ระบุว่าสามารถใช้คีย์ภายใต้ผู้ใช้ที่ปลอดภัยรายหนึ่งๆ เท่านั้น สถานะการตรวจสอบสิทธิ์ แท็กนี้ใช้ร่วมกันไม่ได้กับ Tag::NO_AUTH_REQUIRED
ค่านี้เป็นจำนวนเต็ม 64 บิตที่ระบุค่าสถานะนโยบายการตรวจสอบสิทธิ์ ซึ่งต้องมีอยู่ในโทเค็นการตรวจสอบสิทธิ์ (ระบุไว้เพื่อเริ่มต้นด้วย Tag::AUTH_TOKEN) เพื่ออนุญาตให้ใช้คีย์ ช่วง การโทรหาเริ่มต้น ด้วยคีย์ที่มีแท็กนี้ซึ่งไม่ได้ระบุค่า โทเค็นการตรวจสอบสิทธิ์ หรือระบุ โทเค็นการตรวจสอบสิทธิ์ไม่มีค่าสถานะนโยบายที่ตรงกัน จะล้มเหลว
แท็กนี้ใช้ซ้ำได้ หากค่าใดค่าหนึ่งที่ระบุตรงกับนโยบายใดๆ
ในโทเค็นการตรวจสอบสิทธิ์ คีย์ดังกล่าวได้รับสิทธิ์ให้ใช้งานแล้ว
มิฉะนั้น การดำเนินการจะล้มเหลวด้วย ErrorCode::KEY_USER_NOT_AUTHENTICATED
แท็ก::VENDOR_PATCHLEVEL
เวอร์ชัน: 4
แท็กนี้ระบุระดับแพตช์ความปลอดภัยของอิมเมจของผู้ให้บริการที่คีย์
ด้วย แท็กนี้ไม่เคยส่งไปยัง TA ของ keymaster แต่จะเพิ่มลงใน
รายการการให้สิทธิ์ที่ใช้ฮาร์ดแวร์โดย TA การพยายามใช้คีย์ที่มีค่า Tag::VENDOR_PATCHLEVEL
แตกต่างจากระดับแพตช์ของระบบที่ใช้งานอยู่ในปัจจุบันจะต้องทําให้ begin()
, getKeyCharacteristics()
หรือ exportKey()
แสดงผลเป็น ErrorCode::KEY_REQUIRES_UPGRADE
ดูรายละเอียดได้ที่ upgradeKey()
ค่าของแท็กคือจำนวนเต็มของรูปแบบ YYYYMMDD โดยที่ YYYY คือค่า ปีของการอัปเดตครั้งล่าสุดเป็นเลข 4 หลัก MM คือเดือนที่มีเลข 2 หลัก และ DD คือตัวเลข วันแบบ 2 หลักของการอัปเดตครั้งล่าสุด ตัวอย่างเช่น สำหรับคีย์ที่สร้างใน อุปกรณ์ Android อัปเดตครั้งล่าสุดเมื่อวันที่ 5 มิถุนายน 2018 ค่าจะเป็น 20180605
HAL ของ IKeymasterDevice ต้องอ่านระดับแพตช์ปัจจุบันของผู้ให้บริการจากพร็อพเพอร์ตี้ของระบบ ro.vendor.build.security_patch
และส่งไปยังสภาพแวดล้อมที่ปลอดภัยเมื่อโหลด HAL เป็นครั้งแรก (กลไกจะกำหนดตามการใช้งาน) สภาพแวดล้อมที่ปลอดภัยต้องไม่ยอมรับการอัปเดตระดับแพตช์อื่นจนกว่าจะทำการบูตครั้งถัดไป
ต้องใช้ฮาร์ดแวร์