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

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 คือโครงสร้างอุปกรณ์ Keymaster
  • keyToAttest คือ 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
1Keymaster เวอร์ชัน 2.0
2Keymaster เวอร์ชัน 3.0
3Keymaster เวอร์ชัน 4.0
4Keymaster เวอร์ชัน 4.1
100KeyMint เวอร์ชัน 1.0
200KeyMint เวอร์ชัน 2.0
300KeyMint เวอร์ชัน 3.0
400KeyMint เวอร์ชัน 4.0
attestationSecurityLevel

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

keymasterVersion / keyMintVersion
เวอร์ชันของการติดตั้งใช้งาน KeyMint หรือ Keymaster HAL
ค่านิยมเวอร์ชัน KeyMint หรือ Keymaster
2Keymaster เวอร์ชัน 2.0
3Keymaster เวอร์ชัน 3.0
4Keymaster เวอร์ชัน 4.0
41Keymaster เวอร์ชัน 4.1
100KeyMint เวอร์ชัน 1.0
200KeyMint เวอร์ชัน 2.0
300KeyMint เวอร์ชัน 3.0
400KeyMint เวอร์ชัน 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

การรับรองที่สร้างโดย KeyMint 4 จะมีฟิลด์ต่อไปนี้
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 เวลาเปรียบเทียบต้องคงที่ ไม่ว่าจะมีรหัสกี่รหัสและไม่ว่าส่วนใดของการทดสอบจะตรงกันหรือไม่ก็ตาม

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

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

  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

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