คีย์สโตร์เป็นพื้นที่ที่ปลอดภัยกว่าในการสร้าง จัดเก็บ และใช้คีย์การเข้ารหัสในลักษณะที่มีการควบคุม เมื่อพื้นที่เก็บข้อมูลคีย์ที่รองรับฮาร์ดแวร์พร้อมใช้งานและนำมาใช้ เนื้อหาคีย์จะปลอดภัยมากขึ้นจากการดึงข้อมูลออกจากอุปกรณ์ และ Keymaster จะบังคับใช้ข้อจำกัดที่ยากต่อการละเมิด
อย่างไรก็ตาม กรณีนี้จะเกิดขึ้นก็ต่อเมื่อทราบว่าคีย์ในคีย์สโตร์อยู่ในพื้นที่เก็บข้อมูลที่ได้รับการสนับสนุนจากฮาร์ดแวร์เท่านั้น ใน Keymaster 1 แอปหรือเซิร์ฟเวอร์ระยะไกลไม่สามารถยืนยันได้อย่างน่าเชื่อถือว่าอุปกรณ์อยู่ในโหมดนี้หรือไม่ Daemon ของคีย์สโตร์ได้โหลด HAL คีย์มาสเตอร์ที่พร้อมใช้งาน และเชื่อว่าไม่ว่า HAL จะพูดอะไรก็ตามที่เกี่ยวข้องกับการสำรองข้อมูลคีย์เป็นฮาร์ดแวร์
เพื่อแก้ไขปัญหานี้ Keymaster จึงได้เปิดตัวการรับรองคีย์ใน Android 7.0 (Keymaster 2) และการรับรองรหัสผ่านใน Android 8.0 (Keymaster 3)
เอกสารรับรองคีย์มีจุดประสงค์เพื่อให้วิธีระบุอย่างแน่ชัดว่าคู่คีย์แบบไม่สมมาตรใช้ฮาร์ดแวร์หรือไม่ คุณสมบัติของคีย์คืออะไร และมีข้อจำกัดใดบ้างในการใช้งาน
การรับรองผ่านการตรวจสอบสิทธิ์ช่วยให้อุปกรณ์แสดงหลักฐานตัวระบุฮาร์ดแวร์ได้ เช่น หมายเลขซีเรียลหรือ IMEI
เอกสารรับรองคีย์
Android 7.0 ได้เปิดตัวชุดแท็ก ประเภท และวิธีการใน HAL เพื่อรองรับการรับรองคีย์
แท็ก
Tag::ATTESTATION_CHALLENGE
Tag::INCLUDE_UNIQUE_ID
Tag::RESET_SINCE_ID_ROTATION
ประเภท
Keymaster 2 และต่ำกว่า
typedef struct { keymaster_blob_t* entries; size_t entry_count; } keymaster_cert_chain_t;
AttestKey
วิธี
Keymaster 3
attestKey(vec<uint8_t> keyToAttest, vec<KeyParameter> attestParams) generates(ErrorCode error, vec<vec<uint8_t>> certChain);
Keymaster 2 และเวอร์ชันที่ต่ำกว่า
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
คือโครงสร้างอุปกรณ์ KeymasterkeyToAttest
คือ Blob ของคีย์ที่ส่งคืนจากgenerateKey
ที่สร้างการรับรองattestParams
คือรายการพารามิเตอร์ที่จำเป็นสำหรับการรับรอง ซึ่งรวมถึงTag::ATTESTATION_CHALLENGE
และTag::RESET_SINCE_ID_ROTATION
(อาจเป็นไปได้) รวมถึงTag::APPLICATION_ID
และTag::APPLICATION_DATA
โดย 2 รายการหลังจำเป็นต่อการถอดรหัสบล็อกคีย์หากมีการระบุไว้ในระหว่างการสร้างคีย์certChain
คือพารามิเตอร์เอาต์พุตซึ่งแสดงผลอาร์เรย์ของใบรับรอง รายการที่ 0 คือใบรับรองการรับรอง ซึ่งหมายความว่าจะรับรองคีย์จากkeyToAttest
และมีส่วนขยายการรับรอง
วิธีการ attestKey
จะถือว่าเป็นการดำเนินการกับคีย์สาธารณะในคีย์ที่ได้รับการรับรอง เนื่องจากสามารถเรียกใช้ได้ทุกเมื่อและไม่จำเป็นต้องเป็นไปตามข้อจำกัดการให้สิทธิ์ เช่น หากคีย์ที่รับรองต้องได้รับการตรวจสอบสิทธิ์ของผู้ใช้จึงจะใช้ได้ ระบบจะสร้างการรับรองได้โดยไม่ต้องมีการตรวจสอบสิทธิ์ของผู้ใช้
ใบรับรองการรับรอง
ใบรับรองของเอกสารรับรองคือใบรับรอง X.509 มาตรฐานที่มีส่วนขยายเอกสารรับรอง (ไม่บังคับ) ซึ่งมีคำอธิบายของคีย์ที่รับรอง ใบรับรองได้รับการรับรองด้วยคีย์การรับรอง คีย์การรับรองอาจใช้อัลกอริทึมอื่นที่ไม่ใช่คีย์ที่รับรอง
ใบรับรองการรับรองประกอบด้วยช่องในตารางด้านล่างและไม่มีช่องเพิ่มเติม ฟิลด์บางฟิลด์ระบุค่าฟิลด์แบบคงที่ CTS จะทดสอบว่าเนื้อหาของใบรับรองตรงกับที่กําหนดไว้ทุกประการ
ใบรับรอง SEQUENCE
ชื่อฟิลด์ (ดูRFC 5280) | ค่า |
---|---|
tbsCertificate | TBSCertificate SEQUENCE |
signatureAlgorithm | AlgorithmIdentifier ของอัลกอริทึมที่ใช้ในการลงนามคีย์: ECDSA สำหรับคีย์ EC และ RSA สำหรับคีย์ RSA |
signatureValue | BIT STRING ลายเซ็นจะคำนวณบน tbsCertificate ที่เข้ารหัสแบบ ASN.1 DER |
TBSCertificate SEQUENCE
ชื่อช่อง (ดู RFC 5280) | ค่า |
---|---|
version |
INTEGER 2 (หมายถึงใบรับรอง v3) |
serialNumber |
INTEGER 1 (ค่าคงที่: เหมือนกันในใบรับรองทั้งหมด) |
signature |
AlgorithmIdentifier ของอัลกอริทึมที่ใช้ในการลงนามคีย์: ECDSA สำหรับคีย์ EC และ RSA สำหรับคีย์ RSA |
issuer |
เหมือนกับช่องเรื่องในคีย์การรับรองกลุ่ม |
validity |
ลําดับวันที่ 2 วันที่ซึ่งมีค่าของ Tag::ACTIVE_DATETIME และ Tag::USAGE_EXPIRE_DATETIME
ค่าเหล่านั้นเป็นมิลลิวินาทีนับจากวันที่ 1 มกราคม 1970
ดูการนำเสนอวันที่ที่ถูกต้องในใบรับรองได้ที่ RFC 5280 หากไม่มี Tag::ACTIVE_DATETIME ให้ใช้ค่าของ Tag::CREATION_DATETIME หากไม่มี Tag::USAGE_EXPIRE_DATETIME ให้ใช้วันที่หมดอายุของใบรับรองคีย์การรับรองเป็นกลุ่ม |
subject |
CN = "คีย์ Android Keystore" (ค่าคงที่: เหมือนกันในใบรับรอง all) |
subjectPublicKeyInfo |
SubjectPublicKeyInfo ที่มีคีย์สาธารณะที่ผ่านการรับรอง |
extensions/Key Usage |
digitalSignature: ตั้งค่าหากคีย์มีวัตถุประสงค์ KeyPurpose::SIGN หรือ
KeyPurpose::VERIFY ไม่ได้ตั้งค่าบิตอื่นๆ ทั้งหมด |
extensions/CRL Distribution Points |
ค่า (กำหนดภายหลัง) |
extensions/"attestation" |
OID คือ 1.3.6.1.4.1.11129.2.1.17 โดยเนื้อหาจะระบุไว้ในส่วนส่วนขยายการรับรองด้านล่าง เนื้อหาจะแสดงเป็น OCTET_STRING ที่มีการเข้ารหัส DER ของ SEQUENCE การรับรอง เช่นเดียวกับส่วนขยายใบรับรอง X.509 ทั้งหมด |
ส่วนขยายการรับรอง
ส่วนขยาย attestation
มี OID
1.3.6.1.4.1.11129.2.1.17
โดยจะมีข้อมูลเกี่ยวกับคู่คีย์ที่ได้รับการรับรองและสถานะของอุปกรณ์ ณ เวลาสร้างคีย์
ประเภทแท็ก Keymaster/KeyMint ที่กําหนดไว้ในข้อกําหนดอินเทอร์เฟซ AIDL จะแปลเป็นประเภท ASN.1 ดังนี้
ประเภท Keymaster/KeyMint | ประเภท ASN.1 | หมายเหตุ |
---|---|---|
ENUM |
INTEGER |
|
ENUM_REP |
SET of INTEGER |
|
UINT |
INTEGER |
|
UINT_REP |
SET of INTEGER |
|
ULONG |
INTEGER |
|
ULONG_REP |
SET of INTEGER |
|
DATE |
INTEGER |
มิลลิวินาทีนับจากวันที่ 1 มกราคม 1970 00:00:00 GMT |
BOOL |
NULL |
การมีแท็กหมายความว่าเป็น "จริง" ส่วนไม่มีแท็กหมายความว่าเป็น "เท็จ" |
BIGNUM |
ไม่มีแท็กประเภทนี้ จึงไม่มีการกําหนดการแมป | |
BYTES |
OCTET_STRING |
สคีมา
เนื้อหาส่วนขยายการรับรองจะอธิบายโดยสคีมา ASN.1 ต่อไปนี้
เวอร์ชัน 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), }
เวอร์ชัน 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), }
เวอร์ชัน 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), }
เวอร์ชัน 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), }
เวอร์ชัน 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), }
เวอร์ชัน 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), }
เวอร์ชัน 1
KeyDescription ::= SEQUENCE { attestationVersion 1, attestationSecurityLevel SecurityLevel, keymasterVersion INTEGER, keymasterSecurityLevel SecurityLevel, attestationChallenge OCTET_STRING, uniqueId OCTET_STRING, softwareEnforced AuthorizationList, hardwareEnforced AuthorizationList, } SecurityLevel ::= ENUMERATED { Software (0), TrustedEnvironment (1), } AuthorizationList ::= SEQUENCE { purpose [1] EXPLICIT SET OF INTEGER OPTIONAL, algorithm [2] EXPLICIT INTEGER OPTIONAL, keySize [3] EXPLICIT INTEGER OPTIONAL, digest [5] EXPLICIT SET OF INTEGER OPTIONAL, padding [6] EXPLICIT SET OF INTEGER OPTIONAL, ecCurve [10] EXPLICIT INTEGER OPTIONAL, rsaPublicExponent [200] EXPLICIT INTEGER OPTIONAL, activeDateTime [400] EXPLICIT INTEGER OPTIONAL, originationExpireDateTime [401] EXPLICIT INTEGER OPTIONAL, usageExpireDateTime [402] EXPLICIT INTEGER OPTIONAL, noAuthRequired [503] EXPLICIT NULL OPTIONAL, userAuthType [504] EXPLICIT INTEGER OPTIONAL, authTimeout [505] EXPLICIT INTEGER OPTIONAL, allowWhileOnBody [506] EXPLICIT NULL OPTIONAL, allApplications [600] EXPLICIT NULL OPTIONAL, creationDateTime [701] EXPLICIT INTEGER OPTIONAL, origin [702] EXPLICIT INTEGER OPTIONAL, rollbackResistant [703] EXPLICIT NULL OPTIONAL, rootOfTrust [704] EXPLICIT RootOfTrust OPTIONAL, osVersion [705] EXPLICIT INTEGER OPTIONAL, osPatchLevel [706] EXPLICIT INTEGER OPTIONAL, } RootOfTrust ::= SEQUENCE { verifiedBootKey OCTET_STRING, deviceLocked BOOLEAN, verifiedBootState VerifiedBootState, } VerifiedBootState ::= ENUMERATED { Verified (0), SelfSigned (1), Unverified (2), Failed (3), }
ฟิลด์ KeyDescription
-
attestationVersion
-
เวอร์ชันสคีมา ASN.1
ค่า เวอร์ชัน Keymaster/KeyMint 1 Keymaster เวอร์ชัน 2.0 2 Keymaster เวอร์ชัน 3.0 3 Keymaster เวอร์ชัน 4.0 4 Keymaster เวอร์ชัน 4.1 100 KeyMint เวอร์ชัน 1.0 200 KeyMint เวอร์ชัน 2.0 300 KeyMint เวอร์ชัน 3.0 -
attestationSecurityLevel
-
ระดับความปลอดภัยของตำแหน่งที่จัดเก็บคีย์ที่ผ่านการรับรอง
-
keymasterVersion
/keyMintVersion
-
เวอร์ชันของการใช้งานระดับชั้นการจัดการฮาร์ดแวร์โดยตรง (HAL) ของ Keymaster/KeyMint
ค่า เวอร์ชัน Keymaster/KeyMint 2 Keymaster เวอร์ชัน 2.0 3 Keymaster เวอร์ชัน 3.0 4 Keymaster เวอร์ชัน 4.0 41 Keymaster เวอร์ชัน 4.1 100 KeyMint เวอร์ชัน 1.0 200 KeyMint เวอร์ชัน 2.0 300 KeyMint เวอร์ชัน 3.0 -
keymasterSecurityLevel
/keyMintSecurityLevel
- ระดับการรักษาความปลอดภัยของการติดตั้งใช้งาน Keymaster/KeyMint
-
attestationChallenge
- ปัญหาที่ให้ไว้ ณ เวลาที่สร้างคีย์
-
uniqueId
- ตัวระบุอุปกรณ์ที่ละเอียดอ่อนด้านความเป็นส่วนตัวที่แอประบบขอได้เมื่อสร้างคีย์ หากไม่มีการขอรหัสที่ไม่ซ้ำกัน ฟิลด์นี้จะว่างเปล่า ดูรายละเอียดได้ที่ส่วนรหัสที่ไม่ซ้ำกัน
-
softwareEnforced
-
รายการการให้สิทธิ์ของ Keymaster/KeyMint ที่ระบบ Android บังคับใช้ ข้อมูลนี้เก็บรวบรวมหรือสร้างโดยโค้ดในแพลตฟอร์มและจัดเก็บไว้ในพาร์ติชันระบบของอุปกรณ์ อุปกรณ์จะเชื่อถือได้ตราบใดที่อุปกรณ์ใช้ระบบปฏิบัติการที่เป็นไปตามรูปแบบความปลอดภัยของแพลตฟอร์ม Android (กล่าวคือ Bootloader ของอุปกรณ์ล็อกอยู่และ
verifiedBootState
เป็นVerified
) -
hardwareEnforced
- รายการการให้สิทธิ์ Keymaster/KeyMint ที่บังคับใช้โดย Trusted Execution Environment (TEE) หรือ StrongBox ข้อมูลนี้จะรวบรวมหรือสร้างโดยโค้ดในฮาร์ดแวร์ที่ปลอดภัยและไม่ได้ควบคุมโดยแพลตฟอร์ม เช่น ข้อมูลอาจมาจาก Bootloader หรือผ่านช่องทางการสื่อสารที่ปลอดภัยซึ่งไม่เกี่ยวข้องกับการเชื่อถือแพลตฟอร์ม
ค่า SecurityLevel
ค่า SecurityLevel
จะระบุขอบเขตที่องค์ประกอบที่เกี่ยวข้องกับคีย์สโตร์ (เช่น คู่คีย์และเอกสารรับรอง) มีความยืดหยุ่นในการโจมตี
ค่า | ความหมาย |
---|---|
Software |
รักษาความปลอดภัยตราบใดที่ระบบ Android ของอุปกรณ์เป็นไปตาม
โมเดลความปลอดภัยของแพลตฟอร์ม Android
(กล่าวคือ Bootloader ของอุปกรณ์ล็อกอยู่และ verifiedBootState คือ
Verified ) |
TrustedEnvironment |
ปลอดภัยตราบใดที่สภาพแวดล้อมการดำเนินการที่เชื่อถือได้ (TEE) ไม่ถูกบุกรุก ข้อกำหนดการแยกสำหรับ TEE ระบุไว้ในส่วนที่ 9.11 [C-1-1] ถึง [C-1-4] ของเอกสารนิยามความเข้ากันได้ของ Android TEE มีความทนทานสูงต่อการบุกรุกจากระยะไกลและต้านการบุกรุกระดับปานกลางจากการโจมตีด้วยฮาร์ดแวร์โดยตรง |
StrongBox |
ปลอดภัยตราบใดที่ StrongBox ไม่ถูกบุกรุก StrongBox ติดตั้งใช้งานในองค์ประกอบที่ปลอดภัยซึ่งคล้ายกับโมดูลความปลอดภัยฮาร์ดแวร์ ข้อกำหนดในการใช้งาน StrongBox ระบุไว้ในส่วนที่ 9.11.2 ของเอกสารนิยามความเข้ากันได้ของ Android StrongBox ทนต่อการประนีประนอมจากระยะไกลและการประนีประนอมจากการโจมตีฮาร์ดแวร์โดยตรงได้ในระดับสูง (เช่น การงัดแงะทางกายภาพและการโจมตีช่องทางข้างเคียง) |
ช่อง AuthorizationList
แต่ละช่องจะสอดคล้องกับแท็กการให้สิทธิ์ Keymaster/KeyMint จากข้อกำหนดอินเทอร์เฟซ AIDL
ข้อกําหนดคือแหล่งข้อมูลเกี่ยวกับแท็กการให้สิทธิ์ ซึ่งได้แก่ ความหมาย รูปแบบเนื้อหา ว่าควรปรากฏในช่อง softwareEnforced
หรือ hardwareEnforced
ของออบเจ็กต์ KeyDescription
หรือไม่ ว่าใช้ร่วมกันกับแท็กอื่นๆ ไม่ได้หรือไม่ ฯลฯ ช่อง AuthorizationList
ทั้งหมดเป็นช่องที่ไม่บังคับ
แต่ละช่องมีEXPLICIT
แท็กเฉพาะบริบทที่เท่ากับหมายเลขแท็ก Keymaster/KeyMint ซึ่งช่วยให้แสดงข้อมูลใน AuthorizationList
ได้กระชับยิ่งขึ้น ดังนั้นโปรแกรมแยกวิเคราะห์ ASN.1 จึงต้องทราบประเภทข้อมูลที่คาดไว้สําหรับแท็กเฉพาะบริบทแต่ละรายการ เช่น Tag::USER_AUTH_TYPE
หมายถึง ENUM | 504
ในสคีมาส่วนขยายการรับรอง ช่อง purpose
ใน AuthorizationList
จะระบุเป็น userAuthType [504] EXPLICIT INTEGER OPTIONAL
ดังนั้นการเข้ารหัส ASN.1 จึงจะมีแท็กเฉพาะบริบท 504
แทนแท็กคลาส UNIVERSAL
สำหรับ ASN.1 ประเภท INTEGER
ซึ่งก็คือ 10
-
purpose
-
สอดคล้องกับแท็กการให้สิทธิ์
Tag::PURPOSE
ซึ่งใช้ค่ารหัสแท็ก 1 -
algorithm
-
สอดคล้องกับแท็กการให้สิทธิ์
Tag::ALGORITHM
ซึ่งใช้ค่ารหัสแท็ก 2ในออบเจ็กต์
AuthorizationList
ของการรับรอง ค่าอัลกอริทึมจะเป็นRSA
หรือEC
เสมอ -
keySize
-
สอดคล้องกับแท็กการให้สิทธิ์
Tag::KEY_SIZE
ซึ่งใช้ค่ารหัสแท็ก 3 -
digest
-
สอดคล้องกับแท็กการให้สิทธิ์
Tag::DIGEST
ซึ่งใช้ค่ารหัสแท็ก 5 -
padding
-
สอดคล้องกับแท็กการให้สิทธิ์
Tag::PADDING
ซึ่งใช้ค่ารหัสแท็ก 6 -
ecCurve
-
สอดคล้องกับแท็กการให้สิทธิ์
Tag::EC_CURVE
ซึ่งใช้ค่ารหัสแท็ก 10ชุดพารามิเตอร์ที่ใช้สร้างคู่คีย์แบบ Elliptic Curve (EC) ซึ่งใช้ ECDSA สำหรับการลงชื่อและยืนยันภายในคีย์สโตร์ของระบบ Android
-
rsaPublicExponent
-
สอดคล้องกับแท็กการให้สิทธิ์
Tag::RSA_PUBLIC_EXPONENT
ซึ่งใช้ค่ารหัสแท็ก 200 -
mgfDigest
-
แสดงเฉพาะในเวอร์ชันการรับรองคีย์ที่ >= 100
สอดคล้องกับแท็กการให้สิทธิ์ KeyMintTag::RSA_OAEP_MGF_DIGEST
ซึ่งใช้ค่ารหัสแท็ก 203 -
rollbackResistance
-
นำเสนอเฉพาะในเอกสารรับรองคีย์เวอร์ชัน >= 3
สอดคล้องกับแท็กการให้สิทธิ์
Tag::ROLLBACK_RESISTANCE
ซึ่งใช้ค่ารหัสแท็ก 303 -
earlyBootOnly
-
มีเฉพาะในเวอร์ชันการรับรองคีย์ที่ >= 4
สอดคล้องกับแท็กการให้สิทธิ์
Tag::EARLY_BOOT_ONLY
ซึ่งใช้ค่ารหัสแท็ก 305 -
activeDateTime
-
สอดคล้องกับแท็กการให้สิทธิ์
Tag::ACTIVE_DATETIME
ซึ่ง ใช้ค่ารหัสแท็ก 400 -
originationExpireDateTime
-
สอดคล้องกับแท็กการให้สิทธิ์ของ
Tag::ORIGINATION_EXPIRE_DATETIME
Keymaster ซึ่งใช้ค่ารหัสแท็ก 401 -
usageExpireDateTime
-
สอดคล้องกับแท็กการให้สิทธิ์
Tag::USAGE_EXPIRE_DATETIME
ซึ่งใช้ค่ารหัสแท็ก 402 -
usageCountLimit
-
สอดคล้องกับแท็กการให้สิทธิ์
Tag::USAGE_COUNT_LIMIT
ที่ใช้ค่ารหัสแท็ก 405 -
noAuthRequired
-
สอดคล้องกับแท็กการให้สิทธิ์
Tag::NO_AUTH_REQUIRED
ซึ่งใช้ค่ารหัสแท็ก 503 -
userAuthType
-
สอดคล้องกับแท็กการให้สิทธิ์
Tag::USER_AUTH_TYPE
ซึ่งใช้ค่ารหัสแท็ก 504 -
authTimeout
-
สอดคล้องกับแท็กการให้สิทธิ์
Tag::AUTH_TIMEOUT
ซึ่งใช้ค่ารหัสแท็ก 505 -
allowWhileOnBody
-
สอดคล้องกับแท็กการให้สิทธิ์
Tag::ALLOW_WHILE_ON_BODY
ซึ่งใช้ค่ารหัสแท็ก 506อนุญาตให้ใช้กุญแจหลังจากพ้นระยะเวลาหมดเวลาการตรวจสอบสิทธิ์หากผู้ใช้ยังสวมใส่อุปกรณ์อยู่ โปรดทราบว่าเซ็นเซอร์บนร่างกายที่ปลอดภัยเป็นตัวกำหนดว่าอุปกรณ์สวมอยู่บนร่างกายของผู้ใช้หรือไม่
-
trustedUserPresenceRequired
-
มีเฉพาะในเวอร์ชันการรับรองคีย์ที่ >= 3
สอดคล้องกับแท็กการให้สิทธิ์
Tag::TRUSTED_USER_PRESENCE_REQUIRED
ซึ่งใช้ค่ารหัสแท็ก 507ระบุว่าจะใช้คีย์นี้ได้ก็ต่อเมื่อผู้ใช้แสดงหลักฐานยืนยันตัวตน ตัวอย่างบางส่วนมีดังนี้
- สำหรับคีย์ StrongBox ให้ใช้ปุ่มฮาร์ดแวร์ที่ต่อสายกับหมุดบนอุปกรณ์ StrongBox
- สำหรับคีย์ TEE การตรวจสอบสิทธิ์ด้วยลายนิ้วมือจะให้หลักฐานยืนยันตัวตน ตราบใดที่ TEE มีการควบคุมเครื่องสแกนอย่างมีเอกสิทธิ์และดำเนินการตามกระบวนการจับคู่ลายนิ้วมือ
-
trustedConfirmationRequired
-
มีเฉพาะในเวอร์ชันการรับรองคีย์ที่ >= 3
สอดคล้องกับ
Tag::TRUSTED_CONFIRMATION_REQUIRED
แท็กการให้สิทธิ์ ซึ่งใช้ค่ารหัสแท็ก 508ระบุว่าคีย์จะใช้ได้ต่อเมื่อผู้ใช้ให้การยืนยันข้อมูลที่จะลงนามโดยใช้โทเค็นการอนุมัติเท่านั้น ดูข้อมูลเพิ่มเติมเกี่ยวกับวิธีรับการยืนยันจากผู้ใช้ได้ที่การยืนยันที่ปลอดภัยของ Android
หมายเหตุ: แท็กนี้ใช้ได้กับคีย์ที่ใช้วัตถุประสงค์
SIGN
เท่านั้น -
unlockedDeviceRequired
-
มีเฉพาะในเวอร์ชันการรับรองคีย์ที่ >= 3
สอดคล้องกับแท็กการให้สิทธิ์
Tag::UNLOCKED_DEVICE_REQUIRED
ซึ่งใช้ค่ารหัสแท็ก 509 -
allApplications
-
สอดคล้องกับแท็กการให้สิทธิ์
Tag::ALL_APPLICATIONS
ซึ่งใช้ค่ารหัสแท็ก 600ระบุว่าแอปทั้งหมดในอุปกรณ์เข้าถึงคู่คีย์ได้หรือไม่
-
applicationId
-
สอดคล้องกับแท็กการให้สิทธิ์
Tag::APPLICATION_ID
ซึ่งใช้ ค่ารหัสแท็กเป็น 601 -
creationDateTime
-
สอดคล้องกับแท็กการให้สิทธิ์
Tag::CREATION_DATETIME
ซึ่งใช้ค่ารหัสแท็ก 701 -
origin
-
สอดคล้องกับแท็กการให้สิทธิ์
Tag::ORIGIN
ซึ่งใช้ค่ารหัสแท็ก 702 -
rollbackResistant
-
แสดงเฉพาะในเอกสารรับรองคีย์เวอร์ชัน 1 และ 2
สอดคล้องกับแท็กการให้สิทธิ์
Tag::ROLLBACK_RESISTANT
ซึ่งใช้ค่ารหัสแท็ก 703 -
rootOfTrust
-
สอดคล้องกับแท็กการให้สิทธิ์
Tag::ROOT_OF_TRUST
ซึ่งใช้ค่ารหัสแท็ก 704ดูรายละเอียดเพิ่มเติมได้ที่ส่วนที่อธิบายโครงสร้างข้อมูล RootOfTrust
-
osVersion
-
สอดคล้องกับแท็กการให้สิทธิ์
Tag::OS_VERSION
ซึ่งใช้ค่ารหัสแท็ก 705เวอร์ชันของระบบปฏิบัติการ Android ที่เชื่อมโยงกับ Keymaster ซึ่งระบุเป็นจำนวนเต็ม 6 หลัก เช่น เวอร์ชัน 8.1.0 จะแสดงเป็น 080100
เฉพาะ Keymaster เวอร์ชัน 1.0 ขึ้นไปเท่านั้นที่มีค่านี้ในรายการการให้สิทธิ์
-
osPatchLevel
-
สอดคล้องกับแท็กการให้สิทธิ์
Tag::PATCHLEVEL
ซึ่งใช้ค่ารหัสแท็ก 706เดือนและปีที่เชื่อมโยงกับแพตช์ความปลอดภัยที่ใช้อยู่ภายใน Keymaster ซึ่งระบุเป็นจำนวนเต็ม 6 หลัก เช่น แพตช์เดือนสิงหาคม 2018 จะแสดงเป็น 201808
เฉพาะ Keymaster เวอร์ชัน 1.0 ขึ้นไปเท่านั้นที่จะรวมค่านี้ไว้ในรายการการให้สิทธิ์
-
attestationApplicationId
-
มีเฉพาะในเวอร์ชันการรับรองคีย์ที่ >= 2
สอดคล้องกับแท็กการให้สิทธิ์ Keymaster
Tag::ATTESTATION_APPLICATION_ID
ซึ่งใช้ค่ารหัสแท็ก 709ดูรายละเอียดเพิ่มเติมได้ที่ส่วนอธิบายโครงสร้างข้อมูล AttestationApplicationId
-
attestationIdBrand
-
มีเฉพาะในเวอร์ชันการรับรองคีย์ที่ >= 2
สอดคล้องกับแท็ก Keymaster
Tag::ATTESTATION_ID_BRAND
ซึ่งใช้ค่ารหัสแท็ก 710 -
attestationIdDevice
-
มีเฉพาะในเวอร์ชันการรับรองคีย์ที่ >= 2
สอดคล้องกับแท็ก Keymaster ของ
Tag::ATTESTATION_ID_DEVICE
ซึ่งใช้ค่ารหัสแท็ก 711 -
attestationIdProduct
-
มีเฉพาะในเวอร์ชันการรับรองคีย์ที่ >= 2
สอดคล้องกับแท็ก Keymaster
Tag::ATTESTATION_ID_PRODUCT
ซึ่งใช้ค่ารหัสแท็กเป็น 712 -
attestationIdSerial
-
มีเฉพาะในเวอร์ชันการรับรองคีย์ที่ >= 2
สอดคล้องกับแท็ก Keymaster ของ
Tag::ATTESTATION_ID_SERIAL
ซึ่งใช้ค่ารหัสแท็ก 713 -
attestationIdImei
-
มีเฉพาะในเวอร์ชันการรับรองคีย์ที่ >= 2
สอดคล้องกับแท็กการให้สิทธิ์
Tag::ATTESTATION_ID_IMEI
ซึ่งใช้ค่ารหัสแท็ก 714 -
attestationIdMeid
-
มีเฉพาะในเวอร์ชันการรับรองคีย์ที่ >= 2
สอดคล้องกับแท็กการให้สิทธิ์
Tag::ATTESTATION_ID_MEID
ที่ใช้ค่ารหัสแท็ก 715 -
attestationIdManufacturer
-
มีเฉพาะในเวอร์ชันการรับรองคีย์ที่ >= 2
สอดคล้องกับแท็กการให้สิทธิ์
Tag::ATTESTATION_ID_MANUFACTURER
ซึ่งใช้ค่ารหัสแท็ก 716 -
attestationIdModel
-
นำเสนอในเวอร์ชันเอกสารรับรองคีย์ >= 2 เท่านั้น
สอดคล้องกับแท็กการให้สิทธิ์
Tag::ATTESTATION_ID_MODEL
ซึ่งใช้ค่ารหัสแท็ก 717 -
vendorPatchLevel
-
นำเสนอในเวอร์ชันเอกสารรับรองคีย์ >= 3 เท่านั้น
สอดคล้องกับ
Tag::VENDOR_PATCHLEVEL
แท็กการให้สิทธิ์ซึ่งใช้ค่ารหัสแท็ก 718ระบุระดับแพตช์ความปลอดภัยอิมเมจของผู้ให้บริการที่ต้องติดตั้งในอุปกรณ์เพื่อให้คีย์นี้ใช้งานได้ ค่าจะปรากฏในรูปแบบ ปปปปดดวว ซึ่งแสดงวันที่ของแพตช์ความปลอดภัยของผู้ให้บริการ ตัวอย่างเช่น หากสร้างคีย์ในอุปกรณ์ Android ที่มีการติดตั้งแพตช์ความปลอดภัยของผู้ให้บริการในวันที่ 1 สิงหาคม 2018 ค่านี้จะเท่ากับ 20180801
-
bootPatchLevel
-
มีเฉพาะในเวอร์ชันการรับรองคีย์ที่ >= 3
สอดคล้องกับแท็กการให้สิทธิ์
Tag::BOOT_PATCHLEVEL
ซึ่งใช้ค่ารหัสแท็ก 719ระบุระดับแพตช์ความปลอดภัยของอิมเมจเคอร์เนลที่ต้องติดตั้งในอุปกรณ์เพื่อให้ใช้คีย์นี้ได้ ค่าจะปรากฏในรูปแบบ ปปปปดดวว ซึ่งแสดงวันที่ของแพตช์ความปลอดภัยของระบบ ตัวอย่างเช่น หากสร้างคีย์ในอุปกรณ์ Android ที่มีการติดตั้งแพตช์ความปลอดภัยของวันที่ 5 สิงหาคม 2018 ของอุปกรณ์ ค่านี้จะเท่ากับ 20180805
-
deviceUniqueAttestation
-
มีเฉพาะในเวอร์ชันการรับรองคีย์ที่ >= 4
สอดคล้องกับแท็กการให้สิทธิ์
Tag::DEVICE_UNIQUE_ATTESTATION
ซึ่งใช้ค่ารหัสแท็ก 720 -
attestationIdSecondImei
-
แสดงเฉพาะในเวอร์ชันการรับรองคีย์ที่ >= 300
สอดคล้องกับ
Tag::ATTESTATION_ID_SECOND_IMEI
แท็กการให้สิทธิ์ซึ่งใช้ค่ารหัสแท็ก 723
ช่อง RootOfTrust
-
verifiedBootKey
- แฮชที่ปลอดภัยของคีย์สาธารณะที่ใช้เพื่อยืนยันความสมบูรณ์และรหัสที่ถูกต้องทั้งหมดที่ดำเนินการระหว่างการบูตอุปกรณ์ ซึ่งเป็นส่วนหนึ่งของการเปิดเครื่องที่ยืนยันแล้ว เราขอแนะนำให้ใช้ SHA-256
-
deviceLocked
-
ระบุว่า Bootloader ของอุปกรณ์ล็อกอยู่หรือไม่
true
หมายความว่าอุปกรณ์เปิดเครื่องอิมเมจที่มีการรับรองและได้รับการยืนยันด้วยการเปิดเครื่องที่ได้รับการยืนยันเรียบร้อยแล้ว -
verifiedBootState
- สถานะการเปิดเครื่องที่ได้รับการยืนยันของอุปกรณ์
-
verifiedBootHash
- สรุปข้อมูลทั้งหมดที่มีการป้องกันด้วยการเปิดเครื่องที่ได้รับการยืนยัน สําหรับอุปกรณ์ที่ใช้การใช้งานตามข้อมูลอ้างอิงการบูตที่ได้รับการยืนยันของ Android ช่องนี้จะมีข้อมูลสรุป VBMeta
ค่า VerifiedBootState
ค่า | สถานะการบูตที่เกี่ยวข้อง | ความหมาย |
---|---|---|
Verified |
GREEN |
เชนความน่าเชื่อถือที่สมบูรณ์จะเริ่มต้นจากรูทความน่าเชื่อถือที่ได้รับการปกป้องด้วยฮาร์ดแวร์ไปจนถึงบูตโหลดเดอร์และพาร์ติชันทั้งหมดที่ได้รับการยืนยันโดยการบูตที่ยืนยันแล้ว
ในสถานะนี้ ช่อง verifiedBootKey จะมีแฮชของรูทความน่าเชื่อถือที่ฝังไว้ ซึ่งเป็นใบรับรองที่ฝังไว้ใน ROM ของอุปกรณ์โดยผู้ผลิตอุปกรณ์ที่โรงงาน |
SelfSigned |
YELLOW |
เหมือนกับ Verified ยกเว้นการยืนยันที่ดำเนินการโดยใช้รูทของความน่าเชื่อถือที่ผู้ใช้กำหนดค่าไว้แทนรูทของความน่าเชื่อถือที่ผู้ผลิตฝังไว้ในโรงงาน
ในกรณีนี้ ช่อง verifiedBootKey จะมีแฮชของคีย์สาธารณะที่ผู้ใช้กําหนดค่าไว้ |
Unverified |
ORANGE |
Bootloader ของอุปกรณ์ปลดล็อกอยู่ จึงสร้างเชนความน่าเชื่อถือไม่ได้ อุปกรณ์ปรับเปลี่ยนได้อย่างอิสระ ดังนั้นความสมบูรณ์ของอุปกรณ์ต้องได้รับการยืนยันโดยผู้ใช้นอกขอบเขต ในสถานะนี้ verifiedBootKey จะมีค่าเป็น 0 32 ไบต์ |
Failed |
RED |
อุปกรณ์ไม่ผ่านการยืนยัน ในสถานะนี้ จะไม่มีการรับประกันเกี่ยวกับเนื้อหาของช่อง RootOfTrust อื่นๆ |
AttestationApplicationId
ฟิลด์นี้แสดงถึงความเชื่อของแพลตฟอร์ม Android ว่าแอปใดได้รับอนุญาตให้ใช้เนื้อหาคีย์ลับภายใต้การรับรอง ซึ่งจะมีหลายแพ็กเกจได้ต่อเมื่อหลายแพ็กเกจมี UID เดียวกัน ช่อง AttestationApplicationId
ใน AuthorizationList
เป็นประเภท OCTET_STRING
และอยู่ในรูปแบบตามสคีมา ASN.1 ต่อไปนี้
AttestationApplicationId ::= SEQUENCE { package_infos SET OF AttestationPackageInfo, signature_digests SET OF OCTET_STRING, } AttestationPackageInfo ::= SEQUENCE { package_name OCTET_STRING, version INTEGER, }
package_infos
-
ชุดออบเจ็กต์
AttestationPackageInfo
แต่ละรายการจะมีชื่อและหมายเลขเวอร์ชันของแพ็กเกจ signature_digests
-
ชุดข้อมูลสรุป SHA-256 ของใบรับรองการรับรองของแอป แอปหนึ่งมีเชนใบรับรองคีย์ Signing ได้หลายรายการ ระบบจะแยกวิเคราะห์ใบรับรอง "ใบไม้" แต่ละใบและวางไว้ในช่อง
signature_digests
ชื่อช่องทำให้เข้าใจผิด เนื่องจากข้อมูลที่ผ่านการย่อยคือใบรับรองการรับรองของแอป ไม่ใช่ลายเซ็นของแอป เนื่องจากตั้งชื่อตามคลาสSignature
ที่แสดงผลจากการเรียกใช้getPackageInfo()
ข้อมูลโค้ดต่อไปนี้จะแสดงชุดตัวอย่าง{SHA256(PackageInfo.signature[0]), SHA256(PackageInfo.signature[1]), ...}
รหัสที่ไม่ซ้ำกัน
รหัสที่ไม่ซ้ำกันคือค่า 128 บิตที่ระบุอุปกรณ์ แต่จะใช้ในระยะเวลาที่จำกัดเท่านั้น ระบบจะคํานวณค่าด้วยข้อมูลต่อไปนี้
HMAC_SHA256(T || C || R, HBK)
สถานที่:
T
คือ "ค่าตัวนับตามเวลา" ซึ่งคํานวณโดยการหารค่าของTag::CREATION_DATETIME
ด้วย 2592000000 โดยปัดเศษออกT
จะเปลี่ยนแปลงทุก 30 วัน (2592000000 = 30 * 24 * 60 * 60 * 1000)C
คือค่าของTag::APPLICATION_ID
R
คือ 1 หากTag::RESET_SINCE_ID_ROTATION
อยู่ในพารามิเตอร์ attest_params ของการเรียก attest_key หรือ 0 หากไม่มีแท็กHBK
เป็นข้อมูลลับที่เชื่อมโยงกับฮาร์ดแวร์ที่ไม่ซ้ำกันซึ่งสภาพแวดล้อมการดำเนินการที่เชื่อถือได้ทราบและจะไม่เปิดเผย ข้อมูลลับจะมีเอนโทรปีอย่างน้อย 128 บิตและไม่ซ้ำกันสำหรับแต่ละอุปกรณ์ (ความไม่ซ้ำกันอาจเป็นค่าที่ยอมรับได้เนื่องจากเอนโทรปี 128 บิต) HBK ควรได้มาจากวัสดุคีย์ Fused Key ผ่าน HMAC หรือ AES_CMAC
ตัดเอาต์พุต HMAC_SHA256 ให้เป็น 128 บิต
คีย์และการรับรองการรับรอง
ระบบจะจัดสรรคีย์ 2 รายการ ได้แก่ RSA 1 รายการและ ECDSA 1 รายการ รวมถึงเชนใบรับรองที่เกี่ยวข้องลงในอุปกรณ์อย่างปลอดภัย
Android 12 เปิดตัวการจัดสรรคีย์จากระยะไกล และ Android 13 กําหนดให้อุปกรณ์ใช้การจัดสรรดังกล่าว การจัดสรรคีย์ระยะไกลจะให้อุปกรณ์ที่ทำงานภาคสนามด้วย ใบรับรองเอกสารรับรอง ECDSA P256 ใบรับรองเหล่านี้มีอายุการใช้งานสั้นกว่าใบรับรองที่จัดสรรจากโรงงาน
IMEI หลายรายการ
Android 14 เพิ่มการรองรับ IMEI หลายรายการในระเบียนการรับรองคีย์ของ Android OEM ใช้ฟีเจอร์นี้ได้โดยการเพิ่มแท็ก KeyMint สำหรับ IMEI ที่ 2 ปัจจุบันอุปกรณ์มีวิทยุเครือข่ายมือถือหลายสัญญาณและ OEM รองรับอุปกรณ์ที่มี IMEI 2 หมายเลขมากขึ้นเรื่อยๆ มากขึ้นเรื่อยๆ
OEM ต้องมี IMEI สำรอง(หากมีในอุปกรณ์) เพื่อจัดสรรให้กับการติดตั้งใช้งาน KeyMint เพื่อให้การติดตั้งใช้งานเหล่านั้นสามารถรับรอง IMEI สำรองได้เช่นเดียวกับที่รับรอง IMEI แรก
การรับรองผ่านบัตรประจำตัว
Android 8.0 รองรับการรับรองผ่านบัตรประจำตัว (ไม่บังคับ) สำหรับอุปกรณ์ที่มี Keymaster 3 การรับรองผ่านบัตรประจำตัวช่วยให้อุปกรณ์แสดงหลักฐานตัวระบุฮาร์ดแวร์ เช่น หมายเลขซีเรียลหรือ IMEI ได้ แม้ว่าจะเป็นฟีเจอร์ที่ไม่บังคับ แต่เราขอแนะนำให้การติดตั้งใช้งาน Keymaster 3 ทั้งหมดรองรับฟีเจอร์นี้ เนื่องจากความสามารถในการพิสูจน์ตัวตนของอุปกรณ์จะช่วยให้กรณีการใช้งานต่างๆ เช่น การกําหนดค่าจากระยะไกลแบบ Zero Touch แท้มีความปลอดภัยมากขึ้น (เนื่องจากฝั่งที่ดำเนินการจากระยะไกลจะมั่นใจได้ว่ากำลังสื่อสารกับอุปกรณ์ที่ถูกต้อง ไม่ใช่อุปกรณ์ที่แอบอ้างเป็นอุปกรณ์นั้น)
การรับรองข้อมูลประจำตัวจะทำงานโดยสร้างสำเนาของตัวระบุฮาร์ดแวร์ของอุปกรณ์ที่เฉพาะ Trusted Execution Environment (TEE) เท่านั้นที่เข้าถึงได้ก่อนที่อุปกรณ์จะออกจากโรงงาน ผู้ใช้สามารถปลดล็อกโปรแกรมโหลดบูตของอุปกรณ์และเปลี่ยนซอฟต์แวร์ระบบ รวมถึงตัวระบุที่เฟรมเวิร์ก Android รายงานได้ สำเนาของตัวระบุที่ TEE เก็บไว้ไม่สามารถดัดแปลงด้วยวิธีนี้ได้ ซึ่งช่วยให้มั่นใจว่าการรับรองรหัสอุปกรณ์จะรับรองเฉพาะตัวระบุฮาร์ดแวร์เดิมของอุปกรณ์เท่านั้น จึงขัดขวางการพยายามปลอมแปลง
อินเทอร์เฟซ API หลักสำหรับการรับรองผ่านบัตรประจำตัวจะสร้างขึ้นจากกลไกการรับรองคีย์ที่มีอยู่ซึ่งเปิดตัวพร้อมกับ Keymaster 2 เมื่อขอใบรับรองการรับรองสําหรับคีย์ที่เก็บโดย Keymaster ผู้โทรสามารถขอให้รวมตัวระบุฮาร์ดแวร์ของอุปกรณ์ไว้ในข้อมูลเมตาของใบรับรองการรับรอง หากเก็บคีย์ไว้ใน TEE ใบรับรองจะเชื่อมโยงกลับไปที่รูทของความน่าเชื่อถือที่รู้จัก ผู้รับใบรับรองดังกล่าวสามารถยืนยันได้ว่าใบรับรองและเนื้อหา รวมถึงตัวระบุฮาร์ดแวร์นั้นเขียนโดย TEE เมื่อระบบขอให้ระบุตัวระบุฮาร์ดแวร์ในใบรับรองการรับรอง TEE จะรับรองเฉพาะตัวระบุที่จัดเก็บไว้ในพื้นที่เก็บข้อมูลตามที่ป้อนไว้ในโรงงาน
พร็อพเพอร์ตี้พื้นที่เก็บข้อมูล
พื้นที่เก็บข้อมูลที่มีตัวระบุของอุปกรณ์ต้องมีพร็อพเพอร์ตี้ต่อไปนี้
- ระบบจะคัดลอกค่าที่ได้จากตัวระบุดั้งเดิมของอุปกรณ์ไปยังพื้นที่เก็บข้อมูลก่อนที่อุปกรณ์ออกจากโรงงาน
- วิธีการ
destroyAttestationIds()
สามารถทำลายสำเนาข้อมูลนี้ซึ่งมาจากตัวระบุอย่างถาวร การทำลายอย่างถาวรหมายความว่าระบบจะนำข้อมูลออกอย่างสมบูรณ์ รีเซ็ตเป็นค่าเริ่มต้นหรือดำเนินการอื่นๆ ในอุปกรณ์อย่างไรก็ไม่สามารถกู้คืนข้อมูลได้ ซึ่งสำคัญอย่างยิ่งสำหรับอุปกรณ์ที่ผู้ใช้ปลดล็อกโปรแกรมบูตและเปลี่ยนซอฟต์แวร์ระบบ รวมถึงแก้ไขตัวระบุที่เฟรมเวิร์ก Android แสดง - สถานที่ให้บริการ RMA ควรสามารถสร้างสำเนาใหม่ของข้อมูลที่ได้จากตัวระบุฮาร์ดแวร์ วิธีนี้จะช่วยให้อุปกรณ์ที่ผ่าน RMA ทำการรับรองข้อมูลประจำตัวอีกครั้งได้ กลไกที่ศูนย์ RMA ใช้ต้องได้รับการปกป้องเพื่อไม่ให้ผู้ใช้เรียกใช้ด้วยตนเอง เนื่องจากจะทำให้ผู้ใช้ได้รับการรับรองสำหรับรหัสที่ปลอมแปลงได้
- ไม่มีโค้ดใดอีกนอกจากแอป Keymaster ที่เชื่อถือได้ใน TEE ที่อ่าน ข้อมูลที่ได้รับจากตัวระบุที่เก็บไว้ในพื้นที่เก็บข้อมูลได้
- พื้นที่เก็บข้อมูลมีการปลอมแปลงอย่างชัดเจน หากเนื้อหาของพื้นที่เก็บข้อมูลมีการแก้ไข TEE จะถือว่าสำเนาเนื้อหาถูกทำลายและปฏิเสธความพยายามในการรับรองรหัสทั้งหมด ซึ่งทำได้ด้วยการเซ็นชื่อหรือ MAC พื้นที่เก็บข้อมูลตามที่อธิบายไว้ด้านล่าง
- ที่เก็บข้อมูลจะไม่เก็บตัวระบุเดิมไว้ เนื่องจากการตรวจสอบสิทธิ์ผ่านบัตรประจำตัวเกี่ยวข้องกับคำถาม ผู้โทรจึงต้องระบุตัวระบุที่จะได้รับการรับรองเสมอ TEE เพียงต้องยืนยันว่าค่าเหล่านี้ตรงกับค่าเดิมเท่านั้น การจัดเก็บแฮชที่ปลอดภัยของค่าเดิมแทนค่าที่แท้จริงจะเปิดใช้การยืนยันนี้
การก่อสร้าง
หากต้องการสร้างการใช้งานที่มีพร็อพเพอร์ตี้ที่ระบุไว้ข้างต้น ให้จัดเก็บค่าที่มาจากรหัสใน S การสร้างต่อไปนี้ อย่าจัดเก็บสำเนาอื่นๆ ของค่ารหัส ยกเว้นตำแหน่งปกติในระบบที่เจ้าของอุปกรณ์สามารถแก้ไขได้โดยการรูท
S = D || HMAC(HBK, D)
โดยมี
D = HMAC(HBK, ID1) || HMAC(HBK, ID2) || ... || HMAC(HBK, IDn)
HMAC
คือโครงสร้าง HMAC ที่มีแฮชที่ปลอดภัยที่เหมาะสม (แนะนำให้ใช้ SHA-256)HBK
เป็นคีย์ที่เชื่อมโยงกับฮาร์ดแวร์ซึ่งไม่ได้ใช้เพื่อวัตถุประสงค์อื่นID1...IDn
คือค่ารหัสเดิม การเชื่อมโยงค่าหนึ่งๆ กับดัชนีหนึ่งๆ ขึ้นอยู่กับการใช้งาน เนื่องจากอุปกรณ์แต่ละเครื่องมีตัวระบุจํานวนต่างกัน||
แสดงถึงการต่อ
เนื่องจากเอาต์พุต HMAC มีขนาดคงที่ จึงไม่จำเป็นต้องมีส่วนหัวหรือโครงสร้างอื่นๆ เพื่อให้ค้นหาแฮชรหัสแต่ละรายการได้ หรือ HMAC ของ D นอกเหนือจากการตรวจสอบค่าที่ระบุเพื่อดำเนินการรับรองแล้ว การติดตั้งใช้งานยังต้องตรวจสอบ S โดยการดึง D จาก S, ประมวลผล HMAC(HBK, D) และเปรียบเทียบกับค่าใน S เพื่อยืนยันว่าไม่มีรหัสใดๆ ที่ถูกแก้ไข/เสียหาย นอกจากนี้ การใช้งานต้องใช้การเปรียบเทียบแบบคงที่สำหรับองค์ประกอบรหัสแต่ละรายการและการตรวจสอบ S เวลาเปรียบเทียบต้องคงที่ ไม่ว่าจะระบุรหัสจำนวนเท่าใดและมีการจับคู่ที่ถูกต้องของส่วนใดส่วนหนึ่งของการทดสอบ
ตัวระบุฮาร์ดแวร์
การรับรองผ่านบัตรประจำตัวรองรับตัวระบุฮาร์ดแวร์ต่อไปนี้
- ชื่อแบรนด์ตามที่
Build.BRAND
แสดงผลใน Android - ชื่ออุปกรณ์ที่
Build.DEVICE
แสดงผลใน Android - ชื่อผลิตภัณฑ์ตามที่
Build.PRODUCT
ใน Android แสดง - ชื่อผู้ผลิตตามที่
Build.MANUFACTURER
ใน Android แสดง - ชื่อรุ่นตามที่
Build.MODEL
ใน Android แสดง - หมายเลขซีเรียล
- IMEI ของวิทยุทั้งหมด
- MEID ของวิทยุทั้งหมด
อุปกรณ์จะรับรองตัวระบุเหล่านี้เพื่อรองรับเอกสารรับรองรหัสอุปกรณ์ อุปกรณ์ทั้งหมดที่ใช้ Android จะมี 6 รายการแรกและจำเป็นต้องใช้เพื่อให้ฟีเจอร์นี้ทำงานได้ หากอุปกรณ์มีวิทยุเคลื่อนที่แบบรวม อุปกรณ์จะต้องรองรับการรับรอง IMEI และ/หรือ MEID ของวิทยุด้วย
ระบบจะส่งคำขอการรับรองผ่านการตรวจสอบสิทธิ์โดยทำการตรวจสอบสิทธิ์คีย์และระบุตัวระบุอุปกรณ์ที่จะรับรองในคำขอ ตัวระบุจะติดแท็กดังนี้
ATTESTATION_ID_BRAND
ATTESTATION_ID_DEVICE
ATTESTATION_ID_PRODUCT
ATTESTATION_ID_MANUFACTURER
ATTESTATION_ID_MODEL
ATTESTATION_ID_SERIAL
ATTESTATION_ID_IMEI
ATTESTATION_ID_MEID
ตัวระบุที่จะรับรองคือสตริงไบต์ที่เข้ารหัส UTF-8 รูปแบบนี้ใช้กับตัวระบุที่เป็นตัวเลขได้ด้วย ตัวระบุแต่ละรายการที่จะรับรองจะแสดงเป็นสตริงที่เข้ารหัส UTF-8
หากอุปกรณ์ไม่รองรับเอกสารรับรองรหัส (หรือมีการเรียก destroyAttestationIds()
ก่อนหน้านี้และอุปกรณ์จะรับรองรหัสไม่ได้อีกต่อไป) คำขอเอกสารรับรองคีย์ที่มีแท็กเหล่านี้อย่างน้อย 1 รายการจะไม่สําเร็จด้วย ErrorCode::CANNOT_ATTEST_IDS
หากอุปกรณ์รองรับการรับรองข้อมูลประจำตัวและมีแท็กข้างต้นอย่างน้อย 1 รายการรวมอยู่ในคำขอการรับรองคีย์ TEE จะตรวจสอบว่าตัวระบุที่ระบุพร้อมกับแท็กแต่ละรายการตรงกับสำเนาตัวระบุฮาร์ดแวร์ หากตัวระบุอย่างน้อย 1 รายการไม่ตรงกัน เอกสารรับรองทั้งหมดจะดำเนินการด้วย ErrorCode::CANNOT_ATTEST_IDS
ไม่สำเร็จ คุณสามารถระบุแท็กเดียวกันหลายครั้งได้ ซึ่งอาจมีประโยชน์ เช่น เมื่อยืนยัน IMEI โดยอุปกรณ์หนึ่งๆ อาจมีวิทยุหลายตัวที่มี IMEI หลายรายการ คำขอรับรองจะถูกต้องหากค่าที่ระบุพร้อมกับ ATTESTATION_ID_IMEI
แต่ละรายการตรงกับวิทยุของอุปกรณ์ เช่นเดียวกับแท็กอื่นๆ ทั้งหมด
หากการรับรองสําเร็จ ระบบจะเพิ่มรหัสที่รับรองแล้วลงในส่วนขยายการรับรอง (OID 1.3.6.1.4.1.11129.2.1.17) ของใบรับรองการรับรองที่ออกโดยใช้สคีมาจากด้านบน การเปลี่ยนแปลงจากสคีมาการรับรองของ Keymaster 2 จะเป็นตัวหนาพร้อมความคิดเห็น
API ของ Java
ส่วนนี้เป็นเพียงการให้ข้อมูลเท่านั้น ผู้ติดตั้งใช้งาน Keymaster จะไม่ติดตั้งใช้งานหรือใช้ Java API ข้อมูลนี้จัดทำขึ้นเพื่อช่วยให้ผู้ใช้งานเข้าใจวิธีที่แอปใช้ฟีเจอร์ คอมโพเนนต์ต่างๆ ของระบบอาจใช้องค์ประกอบนี้แตกต่างกัน จึงไม่ถือว่าเนื้อหาส่วนนี้เป็นแบบบรรทัดฐาน