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

คีย์สโตร์เป็นพื้นที่ที่ปลอดภัยกว่าในการสร้าง จัดเก็บ และใช้คีย์การเข้ารหัสในลักษณะที่มีการควบคุม เมื่อพื้นที่เก็บข้อมูลคีย์ที่รองรับฮาร์ดแวร์พร้อมใช้งานและนำมาใช้ เนื้อหาคีย์จะปลอดภัยมากขึ้นจากการดึงข้อมูลออกจากอุปกรณ์ และ Keymaster จะบังคับใช้ข้อจำกัดที่ยากต่อการละเมิด

อย่างไรก็ตาม กรณีนี้จะเกิดขึ้นก็ต่อเมื่อทราบว่าคีย์ในคีย์สโตร์อยู่ในพื้นที่เก็บข้อมูลที่ได้รับการสนับสนุนจากฮาร์ดแวร์เท่านั้น ใน Keymaster 1 แอปหรือเซิร์ฟเวอร์ระยะไกลไม่สามารถยืนยันได้อย่างน่าเชื่อถือว่าอุปกรณ์อยู่ในโหมดนี้หรือไม่ โปรแกรมเดรัม Keystore จะโหลด HAL ของ Keymaster ที่พร้อมใช้งานและเชื่อสิ่งที่ 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 method

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 จะทดสอบว่าเนื้อหาของใบรับรองตรงกับที่กําหนดไว้ทุกประการ

ลำดับใบรับรอง

ชื่อช่อง (ดูRFC 5280) ค่า
tbsCertificate TBSCertificate SEQUENCE
signatureAlgorithm AlgorithmIdentifier ของอัลกอริทึมที่ใช้ในการลงนามคีย์:
ECDSA สำหรับคีย์ EC, RSA สำหรับคีย์ RSA
signatureValue BIT STRING ซึ่งเป็นลายเซ็นที่คำนวณจาก tbsCertificate ที่เข้ารหัส DER ของ ASN.1

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" (ค่าคงที่: เหมือนกันในใบรับรองทั้งหมด)
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 รายการการให้สิทธิ์ที่บังคับใช้โดยสภาพแวดล้อมการดำเนินการที่เชื่อถือได้ (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

ชุดพารามิเตอร์ที่ใช้สร้างคู่คีย์รูปไข่ (EC) ซึ่งใช้ ECDSA สำหรับการรับรองและการยืนยันภายในคีย์สโตร์ของระบบ Android

rsaPublicExponent
สอดคล้องกับแท็กการให้สิทธิ์ Tag::RSA_PUBLIC_EXPONENT ซึ่งใช้ค่ารหัสแท็ก 200
mgfDigest

แสดงเฉพาะในเวอร์ชันการรับรองคีย์ที่ >= 100

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

ส่วนขยายข้อมูลการจัดสรร

ส่วนขยายข้อมูลการจัดสรรมี OID 1.3.6.1.4.1.11129.2.1.30 ส่วนขยายจะระบุข้อมูลที่เซิร์ฟเวอร์การจัดสรรทราบเกี่ยวกับอุปกรณ์

สคีมา

ส่วนขยายเป็นไปตามสคีมา CDDL ต่อไปนี้

  {
        1 : int,   ; certificates issued
  }

แผนที่ไม่มีเวอร์ชันและอาจเพิ่มฟิลด์ใหม่ที่ไม่บังคับ

certs_issued

จำนวนใบรับรองโดยประมาณที่ออกให้กับอุปกรณ์ในช่วง 30 วันที่ผ่านมา ค่านี้สามารถใช้เป็นสัญญาณที่บ่งบอกถึงการละเมิดที่อาจเกิดขึ้นได้หากค่าสูงกว่าค่าเฉลี่ยหลายเท่า

การรับรองผ่านบัตรประจำตัว

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)

where:

  • 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 จะเป็นตัวหนาพร้อมความคิดเห็น

Java API

ส่วนนี้เป็นเพียงการให้ข้อมูลเท่านั้น ผู้ติดตั้งใช้งาน Keymaster จะไม่ติดตั้งใช้งานหรือใช้ Java API ข้อมูลนี้จัดทำขึ้นเพื่อช่วยให้ผู้ใช้งานเข้าใจวิธีที่แอปใช้ฟีเจอร์ คอมโพเนนต์ของระบบอาจใช้คำนี้แตกต่างกันไป จึงไม่ควรถือว่าส่วนนี้เป็นมาตรฐาน