Keystore เป็นที่ที่ปลอดภัยยิ่งกว่าในการสร้าง จัดเก็บ และใช้คีย์การเข้ารหัสในลักษณะที่ควบคุมได้ เมื่อมีและใช้ที่เก็บคีย์ที่ได้รับการสนับสนุนจากฮาร์ดแวร์ เนื้อหาคีย์จะปลอดภัยยิ่งขึ้นจากการดึงข้อมูลจากอุปกรณ์ และ KeyMint (เดิมคือ Keymaster) จะบังคับใช้ข้อจำกัดที่แก้ไขได้ยาก
อย่างไรก็ตาม จะเป็นเช่นนี้ก็ต่อเมื่อทราบว่าคีย์ Keystore อยู่ใน ที่เก็บข้อมูลที่ได้รับการสนับสนุนจากฮาร์ดแวร์ ใน Keymaster 1 ไม่มีวิธีใดที่แอปหรือ เซิร์ฟเวอร์ระยะไกลจะยืนยันได้อย่างน่าเชื่อถือว่ากรณีนี้เป็นเช่นนั้นจริง Daemon ของที่เก็บคีย์ โหลดเลเยอร์การจัดการฮาร์ดแวร์โดยตรง (HAL) ของ Keymaster ที่พร้อมใช้งาน และเชื่อสิ่งที่ HAL บอก เกี่ยวกับการสนับสนุนระดับฮาร์ดแวร์ของคีย์
เพื่อแก้ไขปัญหานี้ 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 รายการหลังจำเป็นต่อการถอดรหัส Blob ของคีย์หากมีการระบุ ในระหว่างการสร้างคีย์certChain
คือพารามิเตอร์เอาต์พุต ซึ่งแสดงผลอาร์เรย์ของ ใบรับรอง รายการที่ 0 คือใบรับรองการรับรอง ซึ่งหมายความว่า ใบรับรองจะรับรองคีย์จากkeyToAttest
และมีการ ขยายการรับรอง
attestKey
ถือเป็นการดำเนินการคีย์สาธารณะในคีย์ที่รับรอง เนื่องจากเรียกใช้ได้ทุกเมื่อและไม่จำเป็นต้องเป็นไปตามข้อจำกัดด้านการให้สิทธิ์
เช่น หากคีย์ที่รับรองต้องมีการตรวจสอบสิทธิ์ของผู้ใช้
เพื่อใช้งาน ก็จะสร้างการรับรองได้โดยไม่ต้องมีการตรวจสอบสิทธิ์ของผู้ใช้
ใบรับรองการรับรอง
ใบรับรองการรับรองเป็นใบรับรอง X.509 มาตรฐานที่มีส่วนขยายการรับรองที่ไม่บังคับ ซึ่งมีคำอธิบายของคีย์ที่ได้รับการรับรอง ใบรับรองเซ็นชื่อด้วยคีย์การรับรองที่ได้รับการรับรอง คีย์การรับรอง อาจใช้อัลกอริทึมที่แตกต่างจากคีย์ที่ได้รับการรับรอง
ใบรับรองการรับรองจะมีช่องในตารางด้านล่างและ ไม่มีช่องเพิ่มเติม บางช่องจะระบุค่าของช่องที่แน่นอน การทดสอบ CTS จะตรวจสอบว่าเนื้อหาของใบรับรองเป็นไปตามที่กำหนดไว้ทุกประการ
ลำดับใบรับรอง
ชื่อฟิลด์ (ดู 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 Key" (ค่าคงที่: เหมือนกันในใบรับรองทั้งหมด) |
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 และเนื้อหาจะกำหนดไว้ในส่วน ส่วนขยายการรับรองด้านล่าง เช่นเดียวกับส่วนขยายใบรับรอง X.509 ทั้งหมด เนื้อหาจะแสดงเป็น OCTET_STRING ที่มีการเข้ารหัส DER ของ SEQUENCE การรับรอง |
ส่วนขยายการรับรอง
ส่วนขยาย attestation
มี OID
1.3.6.1.4.1.11129.2.1.17
โดยมี
ข้อมูลเกี่ยวกับคู่คีย์ที่ได้รับการรับรองและสถานะของอุปกรณ์ใน
เวลาที่สร้างคีย์
ระบบจะแปลประเภทแท็ก Keymaster/KeyMint ที่กำหนดไว้ใน ข้อกำหนดอินเทอร์เฟซ AIDL เป็นประเภท ASN.1 ดังนี้
ประเภท KeyMint หรือ Keymaster | ประเภท 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 ต่อไปนี้
เวอร์ชัน 400
KeyDescription ::= SEQUENCE { attestationVersion 400, 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, moduleHash [724] 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), }
เวอร์ชัน 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
ค่านิยม เวอร์ชัน KeyMint หรือ Keymaster 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 400 KeyMint เวอร์ชัน 4.0 -
attestationSecurityLevel
-
ระดับความปลอดภัยของตำแหน่ง ที่จัดเก็บคีย์ที่รับรอง
-
keymasterVersion
/keyMintVersion
-
เวอร์ชันของการติดตั้งใช้งาน KeyMint หรือ Keymaster HAL
ค่านิยม เวอร์ชัน KeyMint หรือ Keymaster 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 400 KeyMint เวอร์ชัน 4.0 -
keymasterSecurityLevel
/keyMintSecurityLevel
- ระดับการรักษาความปลอดภัยของการ ติดตั้งใช้งาน KeyMint หรือ Keymaster
-
attestationChallenge
- แชลเลนจ์ที่ระบุไว้ในเวลาที่สร้างคีย์
-
uniqueId
- ตัวระบุอุปกรณ์ที่คำนึงถึงความเป็นส่วนตัวซึ่งแอปของระบบขอได้ในเวลาที่สร้างคีย์ หากไม่ได้ขอรหัสที่ไม่ซ้ำกัน ช่องนี้จะว่างเปล่า ดูรายละเอียดได้ที่ส่วนรหัสที่ไม่ซ้ำ
-
softwareEnforced
-
รายการการให้สิทธิ์ KeyMint หรือ Keymaster
ที่ระบบ Android บังคับใช้ ระบบจะรวบรวมหรือสร้างข้อมูลนี้โดยใช้โค้ดใน
แพลตฟอร์ม โดยจะถือว่าเชื่อถือได้ตราบใดที่อุปกรณ์ใช้
ระบบปฏิบัติการที่เป็นไปตาม
โมเดลความปลอดภัยของแพลตฟอร์ม Android
(กล่าวคือ Bootloader ของอุปกรณ์ล็อกอยู่และ
verifiedBootState
Verified
) -
hardwareEnforced
- รายการการให้สิทธิ์ KeyMint หรือ Keymaster ที่บังคับใช้ โดยสภาพแวดล้อมการดำเนินการที่เชื่อถือได้ (TEE) ของอุปกรณ์หรือ StrongBox ข้อมูลนี้รวบรวมหรือสร้างขึ้นโดยโค้ดในฮาร์ดแวร์ที่ปลอดภัย และแพลตฟอร์มไม่ได้ควบคุม เช่น ข้อมูลอาจมาจาก Bootloader หรือผ่านช่องทางการสื่อสารที่ปลอดภัยซึ่งไม่ เกี่ยวข้องกับการเชื่อถือแพลตฟอร์ม
ค่า SecurityLevel
ค่า SecurityLevel
จะระบุระดับที่องค์ประกอบที่เกี่ยวข้องกับ
Keystore (เช่น คู่คีย์และการรับรอง) มีความยืดหยุ่น
ต่อการโจมตี
ค่านิยม | ความหมาย |
---|---|
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
ทั้งหมดเป็นฟิลด์ที่ไม่บังคับ
แต่ละฟิลด์มีแท็กที่เฉพาะเจาะจงตามบริบทซึ่งเท่ากับหมายเลขแท็ก KeyMint หรือ Keymaster ซึ่งช่วยให้แสดงข้อมูลใน AuthorizationList
ได้อย่างกะทัดรัดยิ่งขึ้นEXPLICIT
ดังนั้นโปรแกรมแยกวิเคราะห์ 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 -
blockMode
-
สอดคล้องกับ
Tag::BLOCK_MODE
แท็กการให้สิทธิ์ ซึ่ง ใช้ค่ารหัสแท็กเป็น 4 -
digest
-
สอดคล้องกับแท็กการให้สิทธิ์
Tag::DIGEST
ซึ่ง ใช้ค่ารหัสแท็กเป็น 5 -
padding
-
สอดคล้องกับแท็กการให้สิทธิ์
Tag::PADDING
ซึ่ง ใช้ค่ารหัสแท็กเป็น 6 -
callerNonce
-
สอดคล้องกับแท็กการให้สิทธิ์
Tag::CALLER_NONCE
ซึ่ง ใช้ค่ารหัสแท็กเป็น 7 -
minMacLength
-
สอดคล้องกับ
Tag::MIN_MAC_LENGTH
แท็กการให้สิทธิ์ ซึ่ง ใช้ค่ารหัสแท็กเป็น 8 -
ecCurve
-
สอดคล้องกับ
Tag::EC_CURVE
แท็กการให้สิทธิ์ ซึ่งใช้ค่ารหัสแท็กเป็น 10ชุดพารามิเตอร์ที่ใช้ในการสร้างคู่คีย์ Elliptic Curve (EC) ซึ่งใช้ ECDSA สำหรับการลงนามและการยืนยันภายในที่เก็บคีย์ของระบบ Android
-
rsaPublicExponent
-
สอดคล้องกับแท็ก
Tag::RSA_PUBLIC_EXPONENT
การให้สิทธิ์ ซึ่งใช้ค่ารหัสแท็กเป็น 200 -
mgfDigest
-
มีเฉพาะในเวอร์ชันการรับรองคีย์ >= 100
สอดคล้องกับแท็กการให้สิทธิ์Tag::RSA_OAEP_MGF_DIGEST
KeyMint ซึ่งใช้ค่ารหัสแท็กเป็น 203 -
rollbackResistance
-
มีเฉพาะในเวอร์ชันการรับรองคีย์ >= 3
สอดคล้องกับแท็ก
Tag::ROLLBACK_RESISTANCE
authorization ซึ่งใช้ค่ารหัสแท็กเป็น 303 -
earlyBootOnly
-
มีเฉพาะในเวอร์ชันการรับรองคีย์ >= 4
สอดคล้องกับ
Tag::EARLY_BOOT_ONLY
แท็กการให้สิทธิ์ ซึ่ง ใช้ค่ารหัสแท็กเป็น 305 -
activeDateTime
-
สอดคล้องกับแท็กการให้สิทธิ์
Tag::ACTIVE_DATETIME
ซึ่งใช้ค่ารหัสแท็กเป็น 400 -
originationExpireDateTime
-
สอดคล้องกับแท็ก
Tag::ORIGINATION_EXPIRE_DATETIME
การให้สิทธิ์ ซึ่งใช้ค่ารหัสแท็ก 401 -
usageExpireDateTime
-
สอดคล้องกับ
Tag::USAGE_EXPIRE_DATETIME
แท็กการให้สิทธิ์ ซึ่งใช้ค่ารหัสแท็กเป็น 402 -
usageCountLimit
-
สอดคล้องกับ
Tag::USAGE_COUNT_LIMIT
แท็กการให้สิทธิ์ ซึ่งใช้ค่ารหัสแท็กเป็น 405 -
userSecureId
-
สอดคล้องกับแท็กการให้สิทธิ์
Tag::USER_SECURE_ID
ซึ่งใช้ค่ารหัสแท็กเป็น 502 -
noAuthRequired
-
สอดคล้องกับ
Tag::NO_AUTH_REQUIRED
แท็กการให้สิทธิ์ ซึ่งใช้ค่ารหัสแท็กเป็น 503 -
userAuthType
-
สอดคล้องกับแท็กการให้สิทธิ์
Tag::USER_AUTH_TYPE
ซึ่ง ใช้ค่ารหัสแท็กเป็น 504 -
authTimeout
-
สอดคล้องกับแท็กการให้สิทธิ์
Tag::AUTH_TIMEOUT
ซึ่ง ใช้ค่ารหัสแท็กเป็น 505 -
allowWhileOnBody
-
สอดคล้องกับ
Tag::ALLOW_WHILE_ON_BODY
แท็กการให้สิทธิ์ ซึ่งใช้ค่ารหัสแท็กเป็น 506อนุญาตให้ใช้คีย์หลังจากระยะหมดเวลาการตรวจสอบสิทธิ์หาก ผู้ใช้ยังคงสวมอุปกรณ์ไว้บนร่างกาย โปรดทราบว่าเซ็นเซอร์ที่ปลอดภัย บนร่างกายจะกำหนดว่าผู้ใช้สวมอุปกรณ์ไว้บนร่างกายหรือไม่
-
trustedUserPresenceReq
-
มีเฉพาะในเวอร์ชันการรับรองคีย์ >= 3
สอดคล้องกับ
Tag::TRUSTED_USER_PRESENCE_REQUIRED
แท็กการให้สิทธิ์ ซึ่งใช้ค่ารหัสแท็กเป็น 507ระบุว่าคีย์นี้จะใช้ได้ก็ต่อเมื่อผู้ใช้ได้แสดงหลักฐานการ แสดงตัวตนจริง ตัวอย่างบางส่วนมีดังนี้
- สำหรับคีย์ StrongBox จะเป็นปุ่มฮาร์ดแวร์ที่ต่อสายเข้ากับพินใน อุปกรณ์ StrongBox
- สำหรับคีย์ TEE การตรวจสอบสิทธิ์ด้วยลายนิ้วมือจะแสดงหลักฐานว่ามีตัวตน ตราบใดที่ TEE มีสิทธิ์ควบคุมเครื่องสแกนแต่เพียงผู้เดียวและดำเนินการ กระบวนการจับคู่ลายนิ้วมือ
-
trustedConfirmationReq
-
มีเฉพาะในเวอร์ชันการรับรองคีย์ >= 3
สอดคล้องกับ
Tag::TRUSTED_CONFIRMATION_REQUIRED
แท็กการให้สิทธิ์ ซึ่งใช้ค่ารหัสแท็ก 508ระบุว่าใช้คีย์ได้ก็ต่อเมื่อผู้ใช้ยืนยัน ข้อมูลที่จะลงนามโดยใช้โทเค็นการอนุมัติ ดูข้อมูลเพิ่มเติมเกี่ยวกับ วิธีขอการยืนยันจากผู้ใช้ได้ที่ การยืนยันที่ได้รับการปกป้องของ Android
หมายเหตุ: แท็กนี้ใช้ได้กับคีย์ที่ใช้
SIGN
วัตถุประสงค์เท่านั้น -
unlockedDeviceReq
-
มีเฉพาะในเวอร์ชันการรับรองคีย์ >= 3
สอดคล้องกับ
Tag::UNLOCKED_DEVICE_REQUIRED
แท็กการให้สิทธิ์ ซึ่งใช้ค่ารหัสแท็กเป็น 509 -
creationDateTime
-
สอดคล้องกับแท็กการให้สิทธิ์
Tag::CREATION_DATETIME
ซึ่ง ใช้ค่ารหัสแท็กเป็น 701 -
origin
-
สอดคล้องกับ
Tag::ORIGIN
แท็กการให้สิทธิ์ ซึ่งใช้ค่ารหัสแท็ก เป็น 702 -
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
สอดคล้องกับแท็ก
Tag::ATTESTATION_APPLICATION_ID
authorization ซึ่งใช้ค่ารหัสแท็กเป็น 709ดูรายละเอียดเพิ่มเติมได้ที่ส่วนที่อธิบายโครงสร้างข้อมูล AttestationApplicationId
-
attestationIdBrand
-
มีเฉพาะในเวอร์ชันการรับรองคีย์ >= 2
สอดคล้องกับ
Tag::ATTESTATION_ID_BRAND
แท็กการให้สิทธิ์ ซึ่งใช้ค่ารหัสแท็กเป็น 710 -
attestationIdDevice
-
มีเฉพาะในเวอร์ชันการรับรองคีย์ >= 2
สอดคล้องกับ
Tag::ATTESTATION_ID_DEVICE
แท็กการให้สิทธิ์ ซึ่งใช้ค่ารหัสแท็กเป็น 711 -
attestationIdProduct
-
มีเฉพาะในเวอร์ชันการรับรองคีย์ >= 2
สอดคล้องกับ
Tag::ATTESTATION_ID_PRODUCT
แท็กการให้สิทธิ์ ซึ่งใช้ค่ารหัสแท็กเป็น 712 -
attestationIdSerial
-
มีเฉพาะในเวอร์ชันการรับรองคีย์ >= 2
สอดคล้องกับ
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
authorization ซึ่งใช้ค่ารหัสแท็กเป็น 716 -
attestationIdModel
-
มีเฉพาะในเวอร์ชันการรับรองคีย์ >= 2
สอดคล้องกับ
Tag::ATTESTATION_ID_MODEL
แท็กการให้สิทธิ์ ซึ่งใช้ค่ารหัสแท็กเป็น 717 -
vendorPatchLevel
-
มีเฉพาะในเวอร์ชันการรับรองคีย์ที่สำคัญ >= 3
สอดคล้องกับ
Tag::VENDOR_PATCHLEVEL
แท็กการให้สิทธิ์ ซึ่งใช้ค่ารหัสแท็กเป็น 718ระบุระดับแพตช์ด้านความปลอดภัยของอิมเมจของผู้ให้บริการที่ต้อง ติดตั้งในอุปกรณ์เพื่อให้ใช้คีย์นี้ได้ ค่าจะปรากฏในรูปแบบ YYYYMMDD ซึ่งแสดงถึงวันที่ของแพตช์ความปลอดภัยของผู้ให้บริการ ตัวอย่างเช่น หากสร้างคีย์ในอุปกรณ์ Android ที่ติดตั้งแพตช์ความปลอดภัยวันที่ 1 สิงหาคม 2018 ของผู้จำหน่าย ค่านี้จะเป็น 20180801
-
bootPatchLevel
-
มีเฉพาะในเวอร์ชันการรับรองคีย์ที่สำคัญ >= 3
สอดคล้องกับ
Tag::BOOT_PATCHLEVEL
แท็กการให้สิทธิ์ ซึ่งใช้ค่ารหัสแท็กเป็น 719ระบุระดับแพตช์ด้านความปลอดภัยของอิมเมจเคอร์เนลที่ต้อง ติดตั้งในอุปกรณ์เพื่อให้ใช้คีย์นี้ได้ ค่าจะปรากฏในรูปแบบ YYYYMMDD ซึ่งแสดงถึงวันที่ของแพตช์ความปลอดภัยของระบบ ตัวอย่างเช่น หากสร้างคีย์ในอุปกรณ์ Android ที่ติดตั้งแพตช์ความปลอดภัยของระบบวันที่ 5 สิงหาคม 2018 ค่านี้จะเป็น 20180805
-
deviceUniqueAttestation
-
มีเฉพาะในเวอร์ชันการรับรองคีย์ >= 4
สอดคล้องกับ
Tag::DEVICE_UNIQUE_ATTESTATION
แท็กการให้สิทธิ์ ซึ่งใช้ค่ารหัสแท็กเป็น 720 -
attestationIdSecondImei
-
มีเฉพาะในเวอร์ชันการรับรองคีย์ที่สำคัญ >= 300
สอดคล้องกับ
Tag::ATTESTATION_ID_SECOND_IMEI
แท็กการให้สิทธิ์ ซึ่งใช้ค่ารหัสแท็กเป็น 723 -
moduleHash
-
แสดงเฉพาะในเวอร์ชันการรับรองคีย์ที่สำคัญ >= 400
สอดคล้องกับ
Tag::MODULE_HASH
แท็กการให้สิทธิ์ ซึ่งใช้ค่ารหัสแท็กเป็น 724
ฟิลด์ RootOfTrust
-
verifiedBootKey
- แฮชที่ปลอดภัยของคีย์สาธารณะที่ใช้เพื่อยืนยันความสมบูรณ์และ ความถูกต้องของโค้ดทั้งหมดที่ดำเนินการระหว่างการเปิดเครื่องอุปกรณ์ ซึ่งเป็นส่วนหนึ่งของการเปิดเครื่องที่ได้รับการยืนยัน ขอแนะนำให้ใช้ SHA-256
-
deviceLocked
-
Bootloader ของอุปกรณ์ล็อกอยู่หรือไม่
true
หมายความว่า อุปกรณ์เปิดเครื่องด้วยอิมเมจที่ลงนามแล้วซึ่งการเปิดเครื่องที่ได้รับการยืนยัน ยืนยันเรียบร้อยแล้ว -
verifiedBootState
- สถานะการเปิดเครื่องที่ได้รับการยืนยันของอุปกรณ์
-
verifiedBootHash
- ข้อมูลสรุปของข้อมูลทั้งหมดที่ได้รับการปกป้องโดย การเปิดเครื่องที่ได้รับการยืนยัน สำหรับอุปกรณ์ที่ใช้การใช้งานอ้างอิงของ Android Verified Boot ฟิลด์นี้จะมีข้อมูลสรุป 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 ของใบรับรองการลงนามของแอป แอปมี ห่วงโซ่ใบรับรองคีย์การลงนามได้หลายรายการ สำหรับแต่ละรายการ ระบบจะย่อยใบรับรอง "leaf" และวางไว้ในช่อง
signature_digests
ชื่อฟิลด์ทำให้เข้าใจผิด เนื่องจากข้อมูลที่ย่อยคือใบรับรองการลงนามของแอป ไม่ใช่ลายเซ็นของแอป เนื่องจากตั้งชื่อตามคลาสSignature
ที่เรียกใช้getPackageInfo()
ข้อมูลโค้ดต่อไปนี้แสดงตัวอย่างชุด{SHA256(PackageInfo.signature[0]), SHA256(PackageInfo.signature[1]), ...}
ส่วนขยายข้อมูลการจัดสรร
ส่วนขยายข้อมูลการจัดสรรมี OID
1.3.6.1.4.1.11129.2.1.30
ส่วนขยายจะให้ข้อมูล
ที่เซิร์ฟเวอร์การจัดสรรทราบเกี่ยวกับอุปกรณ์
สคีมา
ส่วนขยายเป็นไปตามสคีมา CDDL ต่อไปนี้
{ 1 : int, ; certificates issued 4 : string, ; validated attested entity (STRONG_BOX/TEE) }
แผนที่ไม่มีการกำหนดเวอร์ชันและอาจมีการเพิ่มฟิลด์ที่ไม่บังคับใหม่
-
certs_issued
-
จำนวนใบรับรองโดยประมาณที่ออกให้กับอุปกรณ์ในช่วง 30 วันที่ผ่านมา ค่านี้สามารถใช้เป็นสัญญาณการละเมิดที่อาจเกิดขึ้นได้หากค่าดังกล่าว สูงกว่าค่าเฉลี่ยหลายเท่า
-
validated_attested_entity
-
เอนทิตีที่รับรองที่ผ่านการตรวจสอบคือสตริงที่อธิบายประเภทของ อุปกรณ์ที่เซิร์ฟเวอร์การจัดสรรยืนยันว่าได้รับการรับรอง เช่น
STRONG_BOX
หรือTEE
คีย์การรับรอง
ระบบจะจัดสรรคีย์ 2 คีย์ ได้แก่ คีย์ RSA 1 คีย์และคีย์ ECDSA 1 คีย์ รวมถึงห่วงโซ่ใบรับรองที่เกี่ยวข้องลงในอุปกรณ์อย่างปลอดภัย
Android 12 เปิดตัวการจัดสรรคีย์จากระยะไกล และ Android 13 กำหนดให้อุปกรณ์ ต้องใช้ฟีเจอร์นี้ การจัดสรรคีย์จากระยะไกลจะจัดเตรียมใบรับรองการรับรอง ECDSA P256 ต่อแอป ให้กับอุปกรณ์ในฟิลด์ ใบรับรองเหล่านี้มีอายุสั้นกว่าใบรับรองที่จัดสรรจากโรงงาน
รหัสที่ไม่ซ้ำกัน
รหัสที่ไม่ซ้ำกันคือค่า 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
เป็นข้อมูลลับที่ไม่ซ้ำกันซึ่งเชื่อมโยงกับฮาร์ดแวร์ที่สภาพแวดล้อมการดำเนินการที่เชื่อถือได้รู้จัก และไม่เคยเปิดเผย ข้อมูลลับมี Entropy อย่างน้อย 128 บิตและไม่ซ้ำกันสำหรับอุปกรณ์แต่ละเครื่อง (ยอมรับความไม่ซ้ำกันแบบน่าจะเป็นได้เมื่อมี Entropy 128 บิต) HBK ควรได้มาจากเนื้อหาคีย์ที่ผสานผ่าน HMAC หรือ AES_CMAC
ตัดเอาต์พุต HMAC_SHA256 ให้เหลือ 128 บิต
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 ที่แท้จริงมีความปลอดภัยมากขึ้น (เนื่องจากฝั่งระยะไกลจะมั่นใจได้ว่ากำลังสื่อสารกับอุปกรณ์ที่ถูกต้อง ไม่ใช่อุปกรณ์ที่ปลอมตัวตน)
การรับรองด้วยรหัสจะทำงานโดยการสร้างสำเนาตัวระบุฮาร์ดแวร์ของอุปกรณ์ ซึ่งมีเพียง TEE เท่านั้นที่เข้าถึงได้ก่อนที่อุปกรณ์ จะออกจากโรงงาน ผู้ใช้สามารถปลดล็อก Bootloader ของอุปกรณ์และเปลี่ยน ซอฟต์แวร์ระบบและตัวระบุที่เฟรมเวิร์ก Android รายงานได้ สำเนาตัวระบุที่ TEE เก็บไว้จะจัดการด้วยวิธีนี้ไม่ได้ เพื่อให้มั่นใจว่าการรับรองรหัสอุปกรณ์จะรับรองเฉพาะ ตัวระบุฮาร์ดแวร์เดิมของอุปกรณ์เท่านั้น จึงช่วยป้องกันความพยายามในการปลอมแปลง
API หลักสำหรับการรับรอง ID สร้างขึ้นจากกลไกการรับรองคีย์ที่มีอยู่ ซึ่งเปิดตัวพร้อมกับ Keymaster 2 เมื่อขอใบรับรองการรับรองสำหรับคีย์ที่ Keymaster ถือครอง ผู้โทรสามารถขอให้รวมตัวระบุฮาร์ดแวร์ของอุปกรณ์ไว้ในข้อมูลเมตาของใบรับรองการรับรองได้ หากจัดเก็บคีย์ไว้ใน TEE ใบรับรอง จะเชื่อมโยงกลับไปยังรูทที่เชื่อถือได้ที่รู้จัก ผู้รับใบรับรองดังกล่าวจะ ยืนยันได้ว่า TEE เป็นผู้เขียนใบรับรองและเนื้อหาของใบรับรอง ซึ่งรวมถึง ตัวระบุฮาร์ดแวร์ เมื่อระบบขอให้ระบุตัวระบุฮาร์ดแวร์ในใบรับรองการรับรอง TEE จะรับรองเฉพาะตัวระบุที่จัดเก็บไว้ในพื้นที่เก็บข้อมูลของตนตามที่ระบุไว้ในโรงงาน
พร็อพเพอร์ตี้ของพื้นที่เก็บข้อมูล
ที่เก็บข้อมูลที่มีตัวระบุของอุปกรณ์ต้องมีคุณสมบัติดังนี้
- ระบบจะคัดลอกค่าที่ได้จากตัวระบุเดิมของอุปกรณ์ไปยัง ที่เก็บข้อมูลก่อนที่อุปกรณ์จะออกจากโรงงาน
- วิธี
destroyAttestationIds()
สามารถทำลายสำเนาข้อมูลที่ได้จากตัวระบุนี้อย่างถาวร การทำลายถาวรหมายความว่า ระบบจะนำข้อมูลออกโดยสมบูรณ์ ดังนั้นการรีเซ็ตเป็นค่าเริ่มต้นหรือ ขั้นตอนอื่นๆ ที่ดำเนินการในอุปกรณ์จะไม่สามารถกู้คืนข้อมูลได้ การดำเนินการนี้มีความสำคัญอย่างยิ่งสำหรับอุปกรณ์ที่ผู้ใช้ปลดล็อก Bootloader และเปลี่ยนซอฟต์แวร์ระบบ รวมถึงแก้ไขตัวระบุที่เฟรมเวิร์ก Android ส่งคืน - ศูนย์ RMA ควรมีความสามารถในการ สร้างสำเนาข้อมูลที่ได้จากตัวระบุฮาร์ดแวร์ใหม่ ด้วยวิธีนี้ อุปกรณ์ที่ผ่าน RMA จะทำการรับรองรหัสอีกครั้งได้ ต้องปกป้องกลไกที่ใช้โดยศูนย์ RMA เพื่อไม่ให้ผู้ใช้เรียกใช้กลไกดังกล่าวด้วยตนเอง เนื่องจากจะทำให้ผู้ใช้ได้รับการรับรองรหัสที่ถูกปลอมแปลง
- ไม่มีโค้ดอื่นนอกเหนือจากแอปที่เชื่อถือได้ของ Keymaster ใน TEE ที่จะอ่านข้อมูลที่ได้จากตัวระบุซึ่งเก็บไว้ในที่เก็บข้อมูลได้
- พื้นที่เก็บข้อมูลจะมีการป้องกันการดัดแปลง หากมีการแก้ไขเนื้อหาในพื้นที่เก็บข้อมูล TEE จะถือว่าเนื้อหาดังกล่าวเหมือนกับว่าสำเนาของเนื้อหาถูกทำลายไปแล้ว และจะปฏิเสธความพยายามในการรับรอง ID ทั้งหมด โดยจะดำเนินการ ด้วยการลงนามหรือ MAC ที่พื้นที่เก็บข้อมูลตามที่อธิบาย ไว้ด้านล่าง
- ที่เก็บข้อมูลไม่มีตัวระบุเดิม เนื่องจากการรับรองรหัส เกี่ยวข้องกับคำท้า ผู้โทรจึงต้องระบุตัวระบุที่จะ รับรองเสมอ TEE เพียงต้องยืนยันว่าค่าเหล่านี้ตรงกับค่าที่ TEE มีอยู่เดิม การจัดเก็บแฮชที่ปลอดภัยของค่าเดิมแทนค่า จะช่วยให้ยืนยันได้
การก่อสร้าง
หากต้องการสร้างการติดตั้งใช้งานที่มีพร็อพเพอร์ตี้ที่ระบุไว้ข้างต้น ให้จัดเก็บค่าที่ได้จากรหัสในโครงสร้างต่อไปนี้ ห้ามจัดเก็บสำเนาอื่นๆ ของค่ารหัส ยกเว้นตำแหน่งปกติในระบบ ซึ่งเจ้าของอุปกรณ์ สามารถแก้ไขได้โดยการรูท
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
หากอุปกรณ์ไม่รองรับการรับรอง ID (หรือ
destroyAttestationIds()
มีการเรียกใช้ก่อนหน้านี้และอุปกรณ์ไม่สามารถ
รับรอง ID ได้อีกต่อไป) คำขอการรับรองคีย์ที่มีแท็กเหล่านี้อย่างน้อย 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 จะทำตัวหนาพร้อมความคิดเห็น
Java API
ส่วนนี้เป็นเพียงการให้ข้อมูลเท่านั้น ผู้ใช้ Keymaster ไม่ได้ ใช้หรือใช้ Java API ข้อมูลนี้มีไว้เพื่อช่วยให้ผู้ติดตั้งใช้งานเข้าใจ วิธีที่แอปใช้ฟีเจอร์นี้ คอมโพเนนต์ของระบบอาจใช้ส่วนนี้แตกต่างกัน จึงเป็นเหตุผลว่าทำไมส่วนนี้จึงไม่ควรได้รับการพิจารณาว่าเป็นส่วนที่กำหนด