เอกสารรับรองคีย์และบัตรประจำตัว

คีย์สโตร์เป็นพื้นที่ที่ปลอดภัยกว่าในการสร้าง จัดเก็บ และใช้คีย์การเข้ารหัสในลักษณะที่มีการควบคุม เมื่อพื้นที่เก็บข้อมูลคีย์ที่รองรับฮาร์ดแวร์พร้อมใช้งานและนำมาใช้ เนื้อหาคีย์จะปลอดภัยมากขึ้นจากการดึงข้อมูลออกจากอุปกรณ์ และ 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 คือโครงสร้างอุปกรณ์ Keymaster
  • keyToAttest คือ 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
1Keymaster เวอร์ชัน 2.0
2Keymaster เวอร์ชัน 3.0
3Keymaster เวอร์ชัน 4.0
4Keymaster เวอร์ชัน 4.1
100KeyMint เวอร์ชัน 1.0
200KeyMint เวอร์ชัน 2.0
300KeyMint เวอร์ชัน 3.0
attestationSecurityLevel

ระดับความปลอดภัยของตำแหน่งที่จัดเก็บคีย์ที่ผ่านการรับรอง

keymasterVersion / keyMintVersion
เวอร์ชันของการใช้งานระดับชั้นการจัดการฮาร์ดแวร์โดยตรง (HAL) ของ Keymaster/KeyMint
ค่าเวอร์ชัน Keymaster/KeyMint
2Keymaster เวอร์ชัน 2.0
3Keymaster เวอร์ชัน 3.0
4Keymaster เวอร์ชัน 4.0
41Keymaster เวอร์ชัน 4.1
100KeyMint เวอร์ชัน 1.0
200KeyMint เวอร์ชัน 2.0
300KeyMint เวอร์ชัน 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

สอดคล้องกับแท็กการให้สิทธิ์ KeyMint Tag::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 เวลาเปรียบเทียบต้องคงที่ ไม่ว่าจะระบุรหัสจำนวนเท่าใดและมีการจับคู่ที่ถูกต้องของส่วนใดส่วนหนึ่งของการทดสอบ

ตัวระบุฮาร์ดแวร์

การรับรองผ่านบัตรประจำตัวรองรับตัวระบุฮาร์ดแวร์ต่อไปนี้

  1. ชื่อแบรนด์ตามที่ Build.BRAND แสดงผลใน Android
  2. ชื่ออุปกรณ์ที่ Build.DEVICE แสดงผลใน Android
  3. ชื่อผลิตภัณฑ์ตามที่ Build.PRODUCT ใน Android แสดง
  4. ชื่อผู้ผลิตตามที่ Build.MANUFACTURER ใน Android แสดง
  5. ชื่อรุ่นตามที่ Build.MODEL ใน Android แสดง
  6. หมายเลขซีเรียล
  7. IMEI ของวิทยุทั้งหมด
  8. 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 ข้อมูลนี้จัดทำขึ้นเพื่อช่วยให้ผู้ใช้งานเข้าใจวิธีที่แอปใช้ฟีเจอร์ คอมโพเนนต์ต่างๆ ของระบบอาจใช้องค์ประกอบนี้แตกต่างกัน จึงไม่ถือว่าเนื้อหาส่วนนี้เป็นแบบบรรทัดฐาน