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

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 ตัวระบุอัลกอริทึมของอัลกอริทึมที่ใช้ในการลงนามคีย์:
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 ต่อไปนี้ นอกจากนี้ยังใช้สคีมา ASN.1 สำหรับAuthorizationListเพื่อนำเข้าคีย์ที่เข้ารหัสด้วย ช่องที่จะไม่ปรากฏในส่วนขยายการรับรองจะมีการระบุไว้

เวอร์ชัน 500

KeyDescription ::= SEQUENCE {
    attestationVersion           INTEGER, # Value 500
    attestationSecurityLevel     SecurityLevel,
    keyMintVersion               INTEGER, # Value 500
    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,
    blockMode                    [4] EXPLICIT SET OF INTEGER OPTIONAL,
    digest                       [5] EXPLICIT SET OF INTEGER OPTIONAL,
    padding                      [6] EXPLICIT SET OF INTEGER OPTIONAL,
    callerNonce                  [7] EXPLICIT NULL OPTIONAL, # Non-attestation
    minMacLength                 [8] EXPLICIT INTEGER OPTIONAL, # Non-attestation
    ecCurve                     [10] EXPLICIT INTEGER OPTIONAL,
    mlDsaVariant                [11] 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,
    userSecureId               [502] EXPLICIT INTEGER OPTIONAL, # Non-attestation
    noAuthRequired             [503] EXPLICIT NULL OPTIONAL,
    userAuthType               [504] EXPLICIT INTEGER OPTIONAL,
    authTimeout                [505] EXPLICIT INTEGER OPTIONAL,
    allowWhileOnBody           [506] EXPLICIT NULL OPTIONAL,
    trustedUserPresenceReq     [507] EXPLICIT NULL OPTIONAL,
    trustedConfirmationReq     [508] EXPLICIT NULL OPTIONAL,
    unlockedDeviceReq          [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,
}

Modules ::= SET OF Module
Module ::= SEQUENCE {
    packageName                OCTET_STRING,
    version                    INTEGER,
}

RootOfTrust ::= SEQUENCE {
    verifiedBootKey            OCTET_STRING,
    deviceLocked               BOOLEAN,
    verifiedBootState          VerifiedBootState,
    verifiedBootHash           OCTET_STRING,
}

VerifiedBootState ::= ENUMERATED {
    Verified                   (0),
    SelfSigned                 (1),
    Unverified                 (2),
    Failed                     (3),
}

เวอร์ชัน 400

KeyDescription ::= SEQUENCE {
    attestationVersion           INTEGER, # Value 400
    attestationSecurityLevel     SecurityLevel,
    keyMintVersion               INTEGER, # Value 400
    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,
    blockMode                    [4] EXPLICIT SET OF INTEGER OPTIONAL,
    digest                       [5] EXPLICIT SET OF INTEGER OPTIONAL,
    padding                      [6] EXPLICIT SET OF INTEGER OPTIONAL,
    callerNonce                  [7] EXPLICIT NULL OPTIONAL, # Non-attestation
    minMacLength                 [8] EXPLICIT INTEGER OPTIONAL, # Non-attestation
    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,
    userSecureId               [502] EXPLICIT INTEGER OPTIONAL, # Non-attestation
    noAuthRequired             [503] EXPLICIT NULL OPTIONAL,
    userAuthType               [504] EXPLICIT INTEGER OPTIONAL,
    authTimeout                [505] EXPLICIT INTEGER OPTIONAL,
    allowWhileOnBody           [506] EXPLICIT NULL OPTIONAL,
    trustedUserPresenceReq     [507] EXPLICIT NULL OPTIONAL,
    trustedConfirmationReq     [508] EXPLICIT NULL OPTIONAL,
    unlockedDeviceReq          [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,
}

Modules ::= SET OF Module
Module ::= SEQUENCE {
    packageName                OCTET_STRING,
    version                    INTEGER,
}

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           INTEGER, # Value 300
    attestationSecurityLevel     SecurityLevel,
    keyMintVersion               INTEGER, # Value 300
    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,
    blockMode                    [4] EXPLICIT SET OF INTEGER OPTIONAL,
    digest                       [5] EXPLICIT SET OF INTEGER OPTIONAL,
    padding                      [6] EXPLICIT SET OF INTEGER OPTIONAL,
    callerNonce                  [7] EXPLICIT NULL OPTIONAL, # Non-attestation
    minMacLength                 [8] EXPLICIT INTEGER OPTIONAL, # Non-attestation
    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,
    userSecureId               [502] EXPLICIT INTEGER OPTIONAL, # Non-attestation
    noAuthRequired             [503] EXPLICIT NULL OPTIONAL,
    userAuthType               [504] EXPLICIT INTEGER OPTIONAL,
    authTimeout                [505] EXPLICIT INTEGER OPTIONAL,
    allowWhileOnBody           [506] EXPLICIT NULL OPTIONAL,
    trustedUserPresenceReq     [507] EXPLICIT NULL OPTIONAL,
    trustedConfirmationReq     [508] EXPLICIT NULL OPTIONAL,
    unlockedDeviceReq          [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           INTEGER, # Value 200
    attestationSecurityLevel     SecurityLevel,
    keyMintVersion               INTEGER, # Value 200
    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,
    blockMode                    [4] EXPLICIT SET OF INTEGER OPTIONAL,
    digest                       [5] EXPLICIT SET OF INTEGER OPTIONAL,
    padding                      [6] EXPLICIT SET OF INTEGER OPTIONAL,
    callerNonce                  [7] EXPLICIT NULL OPTIONAL, # Non-attestation
    minMacLength                 [8] EXPLICIT INTEGER OPTIONAL, # Non-attestation
    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,
    userSecureId               [502] EXPLICIT INTEGER OPTIONAL, # Non-attestation
    noAuthRequired             [503] EXPLICIT NULL OPTIONAL,
    userAuthType               [504] EXPLICIT INTEGER OPTIONAL,
    authTimeout                [505] EXPLICIT INTEGER OPTIONAL,
    allowWhileOnBody           [506] EXPLICIT NULL OPTIONAL,
    trustedUserPresenceReq     [507] EXPLICIT NULL OPTIONAL,
    trustedConfirmationReq     [508] EXPLICIT NULL OPTIONAL,
    unlockedDeviceReq          [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           INTEGER, # Value 100
    attestationSecurityLevel     SecurityLevel,
    keyMintVersion               INTEGER, # Value 100
    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,
    callerNonce                  [7] EXPLICIT NULL OPTIONAL, # Non-attestation
    minMacLength                 [8] EXPLICIT INTEGER OPTIONAL, # Non-attestation
    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,
    userSecureId               [502] EXPLICIT INTEGER OPTIONAL, # Non-attestation
    noAuthRequired             [503] EXPLICIT NULL OPTIONAL,
    userAuthType               [504] EXPLICIT INTEGER OPTIONAL,
    authTimeout                [505] EXPLICIT INTEGER OPTIONAL,
    allowWhileOnBody           [506] EXPLICIT NULL OPTIONAL,
    trustedUserPresenceReq     [507] EXPLICIT NULL OPTIONAL,
    trustedConfirmationReq     [508] EXPLICIT NULL OPTIONAL,
    unlockedDeviceReq          [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           INTEGER, # Value 4
    attestationSecurityLevel     SecurityLevel,
    keymasterVersion             INTEGER, # Value 41
    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,
    blockMode                    [4] EXPLICIT SET OF INTEGER OPTIONAL,
    digest                       [5] EXPLICIT SET OF INTEGER OPTIONAL,
    padding                      [6] EXPLICIT SET OF INTEGER OPTIONAL,
    callerNonce                  [7] EXPLICIT NULL OPTIONAL, # Non-attestation
    minMacLength                 [8] EXPLICIT INTEGER OPTIONAL, # Non-attestation
    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,
    userSecureId               [502] EXPLICIT INTEGER OPTIONAL, # Non-attestation
    noAuthRequired             [503] EXPLICIT NULL OPTIONAL,
    userAuthType               [504] EXPLICIT INTEGER OPTIONAL,
    authTimeout                [505] EXPLICIT INTEGER OPTIONAL,
    allowWhileOnBody           [506] EXPLICIT NULL OPTIONAL,
    trustedUserPresenceReq     [507] EXPLICIT NULL OPTIONAL,
    trustedConfirmationReq     [508] EXPLICIT NULL OPTIONAL,
    unlockedDeviceReq          [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),
}

เวอร์ชัน 3

KeyDescription ::= SEQUENCE {
    attestationVersion           INTEGER, # Value 3
    attestationSecurityLevel     SecurityLevel,
    keymasterVersion             INTEGER, # Value 4
    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,
    blockMode                    [4] EXPLICIT SET OF INTEGER OPTIONAL,
    digest                       [5] EXPLICIT SET OF INTEGER OPTIONAL,
    padding                      [6] EXPLICIT SET OF INTEGER OPTIONAL,
    callerNonce                  [7] EXPLICIT NULL OPTIONAL, # Non-attestation
    minMacLength                 [8] EXPLICIT INTEGER OPTIONAL, # Non-attestation
    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,
    userSecureId               [502] EXPLICIT INTEGER OPTIONAL, # Non-attestation
    noAuthRequired             [503] EXPLICIT NULL OPTIONAL,
    userAuthType               [504] EXPLICIT INTEGER OPTIONAL,
    authTimeout                [505] EXPLICIT INTEGER OPTIONAL,
    allowWhileOnBody           [506] EXPLICIT NULL OPTIONAL,
    trustedUserPresenceReq     [507] EXPLICIT NULL OPTIONAL,
    trustedConfirmationReq     [508] EXPLICIT NULL OPTIONAL,
    unlockedDeviceReq          [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,
}

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           INTEGER, # Value 2
    attestationSecurityLevel     SecurityLevel,
    keymasterVersion             INTEGER, # Value 3
    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           INTEGER, # Value 1
    attestationSecurityLevel     SecurityLevel,
    keymasterVersion             INTEGER, # Value 2
    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
500KeyMint เวอร์ชัน 5.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
500KeyMint เวอร์ชัน 5.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 5 จะมีฟิลด์ต่อไปนี้
purpose
สอดคล้องกับTag::PURPOSEแท็กการให้สิทธิ์ ซึ่ง ใช้ค่ารหัสแท็กเป็น 1
algorithm

สอดคล้องกับTag::ALGORITHMแท็กการให้สิทธิ์ ซึ่งใช้ค่ารหัสแท็กเป็น 2

ในออบเจ็กต์การรับรอง AuthorizationList ค่าอัลกอริทึม จะเป็น RSA, EC หรือ ML_DSA เสมอ

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

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

mlDsaVariant

มีเฉพาะในเวอร์ชันการรับรองคีย์ >= 500

สอดคล้องกับTag::ML_DSA_VARIANTแท็กการให้สิทธิ์ ซึ่งใช้ค่ารหัสแท็กเป็น 11

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 Protected Confirmation

หมายเหตุ: แท็กนี้ใช้ได้กับคีย์ที่ใช้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::OS_PATCHLEVELแท็กการให้สิทธิ์ซึ่งใช้ค่ารหัสแท็ก 706

เดือนและปีที่เชื่อมโยงกับแพตช์ความปลอดภัยที่ใช้ ภายใน KeyMint (เดิมคือ Keymaster) ซึ่งระบุเป็นจำนวนเต็ม 6 หลัก เช่น แพตช์เดือนสิงหาคม 2018 จะแสดงเป็น 201808

ควรใช้ฟิลด์นี้แทน vendorPatchLevel หรือ bootPatchLevel เพื่อตรวจสอบว่าอุปกรณ์ได้รับการ แก้ไขล่าสุดหรือไม่

เฉพาะ Keymaster เวอร์ชัน 1.0 ขึ้นไปเท่านั้นที่จะมีค่านี้ใน รายการการให้สิทธิ์

attestationApplicationId

มีเฉพาะในเวอร์ชันการรับรองคีย์ >= 2

สอดคล้องกับแท็กTag::ATTESTATION_APPLICATION_IDการให้สิทธิ์ ซึ่งใช้ค่ารหัสแท็กเป็น 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การให้สิทธิ์ ซึ่งใช้ค่ารหัสแท็ก 716

attestationIdModel

มีเฉพาะในเวอร์ชันการรับรองคีย์ >= 2

สอดคล้องกับTag::ATTESTATION_ID_MODELแท็กการให้สิทธิ์ ซึ่งใช้ค่ารหัสแท็กเป็น 717

vendorPatchLevel

มีเฉพาะในเวอร์ชันการรับรองคีย์ >= 3

สอดคล้องกับTag::VENDOR_PATCHLEVEL แท็กการให้สิทธิ์ ซึ่งใช้ค่ารหัสแท็กเป็น 718

ระบุระดับแพตช์ด้านความปลอดภัยของรูปภาพของผู้ให้บริการที่ต้อง ติดตั้งในอุปกรณ์เพื่อให้ใช้คีย์นี้ได้ ค่าคือจำนวนเต็ม ที่ได้จากการนำระดับแพตช์ความปลอดภัยและนำขีดกลางออก ตัวอย่างเช่น หากสร้างคีย์ในอุปกรณ์ Android ที่ติดตั้งแพตช์ความปลอดภัยวันที่ 05-08-2018 ของผู้จำหน่าย ค่านี้จะเป็น 20180805

bootPatchLevel

มีเฉพาะในเวอร์ชันการรับรองคีย์ >= 3

สอดคล้องกับTag::BOOT_PATCHLEVEL แท็กการให้สิทธิ์ ซึ่งใช้ค่ารหัสแท็กเป็น 719

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

สคีมา

ค่าส่วนขยายประกอบด้วยข้อมูล Concise Binary Object Representation (CBOR) ที่เป็นไปตามสคีมา Concise Data Definition Language (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 15 กำหนดให้อุปกรณ์ทั้งหมดต้องใช้ฟีเจอร์นี้ การจัดสรรคีย์จากระยะไกล จะจัดหาใบรับรองการรับรอง 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 ต่อไปนี้ ห้ามจัดเก็บสำเนาอื่นๆ ของค่ารหัส ยกเว้นตำแหน่งปกติในระบบ ซึ่งเจ้าของอุปกรณ์ สามารถแก้ไขได้โดยการรูท

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