مصادقة المفتاح والمعرّف

يوفر Keystore مكانًا أكثر أمانًا لإنشاء مفاتيح التشفير وتخزينها واستخدامها بطريقة منظَّمة. عندما تكون ميزة تخزين المفاتيح الاحتياطية متاحة ويتم استخدامها، تكون بيانات المفاتيح أكثر أمانًا من حيث استخراجها من الجهاز، وتفرض خدمة KeyMint (المعروفة سابقًا باسم Keymaster) قيودًا يصعب التحايل عليها.

ومع ذلك، لا ينطبق ذلك إلا إذا كانت مفاتيح Keystore معروفة بأنّها مخزّنة في مساحة تخزين محمية بواسطة الأجهزة. في Keymaster 1، لم يكن بإمكان التطبيقات أو الخوادم البعيدة التحقّق بشكل موثوق من ذلك. حمّل برنامج keystore الخفي طبقة تجريد الأجهزة (HAL) المتوفّرة في Keymaster، وصدّق على كل ما قالته طبقة تجريد الأجهزة (HAL) بشأن مفاتيح التشفير المُدمَجة بشكل آمن في الأجهزة.

ولحلّ هذه المشكلة، تم طرح ميزة إثبات صحة المفتاح في الإصدار 7.0 من نظام التشغيل Android (Keymaster 2)، كما تم طرح ميزة إثبات صحة المعرّف في الإصدار 8.0 من نظام التشغيل Android (Keymaster 3).

تهدف مصادقة المفتاح إلى توفير طريقة لتحديد ما إذا كان زوج المفاتيح غير المتماثل مدعومًا بالأجهزة، وما هي خصائص المفتاح، وما هي القيود المفروضة على استخدامه.

تتيح عملية إثبات صحة المعرّف للجهاز تقديم دليل على معرّفات الأجهزة، مثل الرقم التسلسلي أو رقم IMEI.

مصادقة المفتاح

لإتاحة إثبات صحة المفتاح، قدّمت الإصدار 7.0 من نظام التشغيل Android مجموعة من العلامات والأنواع والطرق إلى طبقة 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 هو كائن ثنائي كبير الحجم للمفتاح تم عرضه من generateKey والذي تم إنشاء شهادة التصديق له.
  • attestParams هي قائمة بأي مَعلمات ضرورية لعملية التصديق. ويشمل ذلك Tag::ATTESTATION_CHALLENGE وربما Tag::RESET_SINCE_ID_ROTATION، بالإضافة إلى Tag::APPLICATION_ID وTag::APPLICATION_DATA. ويجب توفير آخر عنصرَين لتشفير مجموعة مفاتيح إذا تم تحديدهما أثناء إنشاء المفتاح.
  • 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 (تعني شهادة الإصدار 3)
serialNumber INTEGER 1 (قيمة ثابتة: هي نفسها في جميع الشهادات)
signature ‫AlgorithmIdentifier للخوارزمية المستخدَمة لتوقيع المفتاح: ECDSA لمفاتيح EC، وRSA لمفاتيح RSA
issuer يكون هذا المعرّف هو نفسه حقل الموضوع لمفتاح المصادقة المجمّعة.
validity تسلسل من تاريخَين، يحتوي على قيمتَي 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" رقم تعريف العنصر هو 1.3.6.1.4.1.11129.2.1.17، ويتم تحديد المحتوى في قسم إضافة الشهادة أدناه. كما هو الحال مع جميع إضافات شهادات X.509، يتم تمثيل المحتوى كسلسلة OCTET_STRING تحتوي على ترميز DER لـ SEQUENCE الخاص بشهادة التصديق.

إضافة المصادقة

تحتوي الإضافة attestation على معرّف عنصر 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 بتوقيت غرينتش
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
1الإصدار 2.0 من Keymaster
2الإصدار 3.0 من Keymaster
3الإصدار 4.0 من Keymaster
4الإصدار 4.1 من Keymaster
100الإصدار 1.0 من KeyMint
200الإصدار 2.0 من KeyMint
300الإصدار 3.0 من KeyMint
400الإصدار 4.0 من KeyMint
500الإصدار 5.0 من KeyMint
attestationSecurityLevel

مستوى الأمان للموقع الجغرافي الذي يتم فيه تخزين المفتاح الذي تم إثبات صحته

keymasterVersion / keyMintVersion
تمثّل هذه السمة إصدار KeyMint أو Keymaster HAL.
القيمةإصدار KeyMint أو Keymaster
2الإصدار 2.0 من Keymaster
3الإصدار 3.0 من Keymaster
4الإصدار 4.0 من Keymaster
41الإصدار 4.1 من Keymaster
100الإصدار 1.0 من KeyMint
200الإصدار 2.0 من KeyMint
300الإصدار 3.0 من KeyMint
400الإصدار 4.0 من KeyMint
500الإصدار 5.0 من KeyMint
keymasterSecurityLevel / keyMintSecurityLevel
تمثّل هذه السمة مستوى الأمان لعملية تنفيذ KeyMint أو Keymaster.
attestationChallenge
تمثّل هذه السمة التحدّي الذي تم تقديمه عند إنشاء المفتاح.
uniqueId
معرّف جهاز يراعي الخصوصية ويمكن أن تطلبه تطبيقات النظام عند إنشاء المفتاح. إذا لم يُطلب رقم التعريف الفريد، يكون هذا الحقل فارغًا. لمعرفة التفاصيل، يُرجى الاطّلاع على قسم المعرّف الفريد.
softwareEnforced
قائمة الأذونات في KeyMint أو Keymaster التي يفرضها نظام Android يتم جمع هذه المعلومات أو إنشاؤها بواسطة رمز في المنصة. ويمكن الوثوق به طالما أنّ الجهاز يعمل بنظام تشغيل يتوافق مع نموذج أمان منصة Android (أي أنّ برنامج إقلاع الجهاز مقفل وأنّ verifiedBootState هو Verified).
hardwareEnforced
قائمة الأذونات الخاصة بـ KeyMint أو Keymaster، والتي تفرضها بيئة التنفيذ الموثوقة (TEE) أو StrongBox على الجهاز. يتم جمع هذه المعلومات أو إنشاؤها بواسطة رمز في الجهاز الآمن، ولا تتحكّم المنصة فيها. على سبيل المثال، يمكن أن تأتي المعلومات من برنامج الإقلاع أو من خلال قناة اتصال آمنة لا تتطلّب الوثوق بالنظام الأساسي.

قيم SecurityLevel

تشير قيمة SecurityLevel إلى مدى مقاومة عنصر ذي صلة بـ Keystore (مثل زوج المفاتيح وشهادة التصديق) للهجوم.

القيمة المعنى
Software آمنة طالما أنّ نظام Android على الجهاز يتوافق مع نموذج أمان منصة Android (أي أنّ برنامج إقلاع الجهاز مقفل وأنّ verifiedBootState هو Verified).
TrustedEnvironment آمنة طالما أنّ بيئة التنفيذ الموثوقة لم يتم اختراقها. يتم تحديد متطلبات العزل لبيئات التنفيذ الموثوقة (TEE) في الفقرات من 9.11 [C-1-1] إلى [C-1-4] من &quot;مستند تعريف معايير التوافق&quot; لنظام Android. تتسم بيئات التنفيذ الموثوقة بمقاومة عالية للاختراق عن بُعد ومقاومة معتدلة للاختراق من خلال الهجمات المباشرة على الأجهزة.
StrongBox آمنة ما دام StrongBox لم يتعرّض للاختراق يتم تنفيذ StrongBox في عنصر آمن مشابه لوحدة أمان الأجهزة. تم تحديد متطلبات التنفيذ الخاصة بـ StrongBox في الفقرة 9.11.2 من مستند تعريف معايير التوافق مع Android. تتسم StrongBox بمقاومة عالية ضد الاختراق عن بُعد والاختراق من خلال الهجوم المباشر على الأجهزة (مثل التلاعب المادي وهجمات القنوات الجانبية).

حقول AuthorizationList

يتوافق كل حقل مع علامة تفويض Keymaster/KeyMint من مواصفات واجهة AIDL. المواصفات هي المصدر الموثوق لعلامات التفويض، بما في ذلك معناها وتنسيق محتواها وما إذا كان من المتوقّع أن تظهر في الحقلَين softwareEnforced أو hardwareEnforced ضمن الكائن KeyDescription وما إذا كانت تستبعد بعضها البعض مع علامات أخرى وما إلى ذلك. جميع الحقول AuthorizationList اختيارية.

يحتوي كل حقل على علامة EXPLICIT خاصة بالسياق تساوي رقم علامة KeyMint أو Keymaster، ما يتيح عرض البيانات بشكل أكثر اختصارًا في AuthorizationList. لذلك، يجب أن يعرف محلّل 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 التفويض التي تستخدم قيمة معرّف العلامة 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، ويتم تحديدها كعدد صحيح مكوّن من ستة أرقام. على سبيل المثال، يتم تمثيل الإصدار 8.1.0 بالرقم 080100.

يتضمّن الإصدار 1.0 من Keymaster أو الإصدارات الأحدث هذه القيمة في قائمة التفويض.

osPatchLevel

تتطابق مع علامة التفويض Tag::OS_PATCHLEVEL التي تستخدم قيمة المعرّف 706.

الشهر والسنة المرتبطان بحزمة الأمان المستخدَمة في KeyMint (المعروفة سابقًا باسم Keymaster)، ويتم تحديدهما كعدد صحيح مكوّن من ستة أرقام. على سبيل المثال، يتم تمثيل حزمة الأمان لشهر آب (أغسطس) 2018 بالرقم 201808.

يُفضّل استخدام هذا الحقل بدلاً من vendorPatchLevel أو bootPatchLevel للتحقّق مما إذا كان الجهاز قد تم تصحيحه مؤخرًا.

يتضمّن الإصدار 1.0 من Keymaster أو الإصدارات الأحدث هذه القيمة في قائمة التفويض.

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
تُستخدَم لتحديد ما إذا كان برنامج إقلاع الجهاز مقفلاً. يشير true إلى أنّ الجهاز شغّل صورة موقَّعة تم التحقّق منها بنجاح باستخدام التشغيل المتحقَّق منه.
verifiedBootState
حالة "التشغيل المتحقّق منه" للجهاز.
verifiedBootHash
ملخّص لجميع البيانات المحمية بموجب عملية التحقّق من صحة التمهيد بالنسبة إلى الأجهزة التي تستخدم التنفيذ المرجعي لبرنامج Android Verified Boot، يحتوي هذا الحقل على ملخّص VBMeta.

قيم VerifiedBootState

القيمة حالة التشغيل المقابلة المعنى
Verified GREEN تمتد سلسلة الثقة الكاملة من جذر الثقة المحمي بواسطة الأجهزة إلى برنامج التشغيل وجميع الأقسام التي تم التحقّق منها باستخدام التشغيل المتحقّق منه. في هذه الحالة، يحتوي الحقل verifiedBootKey على قيمة التجزئة لجذر الثقة المضمّن، وهو الشهادة المضمّنة في ذاكرة القراءة فقط (ROM) للجهاز من قِبل الشركة المصنّعة للجهاز في المصنع.
SelfSigned YELLOW هي نفسها Verified، باستثناء أنّ عملية التحقّق تمت باستخدام مصدر ثقة تم إعداده من قِبل المستخدم بدلاً من مصدر الثقة المضمّن من قِبل الشركة المصنّعة في المصنع. في هذه الحالة، يحتوي الحقل verifiedBootKey على قيمة التجزئة للمفتاح العام الذي أعدّه المستخدم.
Unverified ORANGE برنامج الإقلاع في الجهاز غير مقفَل، وبالتالي لا يمكن إنشاء سلسلة ثقة. يمكن تعديل الجهاز بحرية، لذا يجب أن يتحقّق المستخدم من سلامة الجهاز خارج نطاق التطبيق. في هذه الحالة، يحتوي الحقل verifiedBootKey على 32 بايت من الأصفار.
Failed RED تعذّر التحقّق من الجهاز. في هذه الحالة، لا تتوفّر أي ضمانات بشأن محتوى الحقول الأخرى RootOfTrust.

AttestationApplicationId

يعكس هذا الحقل اعتقاد نظام التشغيل Android الأساسي بشأن التطبيقات المسموح لها باستخدام مواد المفتاح السري أثناء عملية التصديق. ويمكن أن يحتوي على حِزم متعدّدة إذا وفقط إذا كانت الحِزم المتعدّدة تتشارك معرّف UID نفسه. يكون الحقل AttestationApplicationId في AuthorizationList من النوع OCTET_STRING ويتم تنسيقه وفقًا لمخطط ASN.1 التالي:

AttestationApplicationId ::= SEQUENCE {
    package_infos  SET OF AttestationPackageInfo,
    signature_digests  SET OF OCTET_STRING,
}

AttestationPackageInfo ::= SEQUENCE {
    package_name  OCTET_STRING,
    version  INTEGER,
}
package_infos
مجموعة من عناصر AttestationPackageInfo، يقدّم كل منها اسم الحزمة ورقم إصدارها.
signature_digests

مجموعة من خلاصات SHA-256 لشهادات توقيع التطبيق يمكن أن يتضمّن التطبيق سلاسل شهادات متعددة لمفتاح التوقيع. يتم استخلاص شهادة "العقدة الطرفية" ووضعها في الحقل signature_digests لكل شهادة. اسم الحقل مضلِّل، لأنّ البيانات المجزّأة هي شهادات توقيع التطبيق، وليست تواقيع التطبيق، لأنّ الاسم مأخوذ من الفئة Signature التي يتم عرضها عند استدعاء getPackageInfo(). يعرض مقتطف الرمز التالي مجموعة أمثلة:

{SHA256(PackageInfo.signature[0]), SHA256(PackageInfo.signature[1]), ...}
    

إضافة معلومات توفير المتطلبات اللازمة

يحتوي امتداد معلومات توفير المتطلبات اللازمة على معرّف عنصر (OID) 1.3.6.1.4.1.11129.2.1.30. تقدّم الإضافة معلومات يعرفها خادم توفير المتطلبات اللازمة عن الجهاز.

مخطط

تتألف قيمة الامتداد من بيانات تمثيل مختصر للكائنات الثنائية (CBOR) تتوافق مع مخطط لغة تعريف البيانات المختصرة (CDDL) هذا:

  {
        1 : int,       ; certificates issued
        4 : string,    ; validated attested entity (STRONG_BOX/TEE)
  }

الخريطة غير مُصنَّفة حسب الإصدار، ويمكن إضافة حقول اختيارية جديدة.

certs_issued

عدد تقريبي للشهادات التي تم إصدارها للجهاز خلال آخر 30 يومًا يمكن استخدام هذه القيمة كمؤشر على إساءة الاستخدام المحتملة إذا كانت القيمة أكبر من المتوسط بعدة مراتب.

validated_attested_entity

سلسلة تشير إلى المصدر المعتمد للمفتاح الذي تم إثبات صحته، والذي تم التحقّق منه مباشرةً من قِبل الشركة المصنّعة لشرائح المعالجة. على سبيل المثال، STRONG_BOX أو TEE.

مفاتيح التصديق

يتم توفير مفتاحَين، أحدهما RSA والآخر ECDSA، وسلاسل الشهادات المقابلة لهما بشكل آمن على الجهاز.

يتضمّن نظام التشغيل Android 12 ميزة توفير المفاتيح عن بُعد، ويشترط نظام التشغيل Android 15 أن تتضمّن جميع الأجهزة هذه الميزة. توفّر خدمة Remote Key Provisioning للأجهزة الميدانية شهادات إثبات صحة 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 هو سرّ فريد مرتبط بالأجهزة ولا يمكن لبيئة التنفيذ الموثوقة الكشف عنه أبدًا. يحتوي السر على 128 بت على الأقل من البيانات العشوائية وهو فريد لكل جهاز (يمكن قبول الفرادة الاحتمالية بالنظر إلى 128 بت من البيانات العشوائية). يجب أن يتم اشتقاق HBK من مواد المفاتيح المدمجة عبر HMAC أو AES_CMAC.

يجب اقتطاع ناتج HMAC_SHA256 إلى 128 بت.

أرقام IMEI متعددة

يضيف نظام التشغيل Android 14 إمكانية استخدام أرقام IMEI متعددة في سجل "شهادة صحة مفتاح Android". يمكن لمصنّعي المعدات الأصلية تنفيذ هذه الميزة من خلال إضافة علامة KeyMint لرمز IMEI ثانٍ. أصبح من الشائع بشكل متزايد أن تحتوي الأجهزة على العديد من أجهزة الراديو الخلوية، ويمكن لمصنّعي المعدات الأصلية الآن توفير أجهزة برقمَي IMEI.

على مصنّعي المعدات الأصلية توفير رقم IMEI ثانوي، إذا كان متوفّرًا على أجهزتهم، ليتم توفيره لعمليات تنفيذ KeyMint، كي تتمكّن عمليات التنفيذ هذه من إثبات صحة رقم IMEI الثانوي بالطريقة نفسها التي تثبت بها صحة رقم IMEI الأول.

الإقرار باستخدام مستند تعريف الهوية

يتضمّن الإصدار 8.0 من نظام التشغيل Android إمكانية إثبات صحة معرّف الأجهزة التي تتضمّن Keymaster 3. تتيح خدمة "إثبات صحة المعرّف" للجهاز تقديم دليل على معرّفات الأجهزة، مثل الرقم التسلسلي أو رقم IMEI. على الرغم من أنّها ميزة اختيارية، ننصح بشدة بأن تتوافق جميع عمليات تنفيذ Keymaster 3 معها، لأنّ إمكانية إثبات هوية الجهاز تتيح حالات استخدام، مثل الإعداد عن بُعد بدون أي تدخل وبشكل أكثر أمانًا (لأنّ الجهة البعيدة يمكنها التأكّد من أنّها تتواصل مع الجهاز الصحيح، وليس جهازًا ينتحل هوية جهاز آخر).

تعمل ميزة &quot;إثبات صحة المعرّف&quot; من خلال إنشاء نُسخ من معرّفات الأجهزة التي لا يمكن لأي شخص الوصول إليها سوى بيئة التنفيذ الموثوقة (TEE) قبل مغادرة الجهاز للمصنع. يمكن للمستخدم فتح برنامج تحميل التشغيل على الجهاز وتغيير برنامج النظام والمعرّفات التي تعرضها إطارات عمل Android. لا يمكن التلاعب بنسخ المعرّفات التي تحتفظ بها بيئة التنفيذ الموثوقة بهذه الطريقة، ما يضمن أنّ مصادقة رقم تعريف الجهاز لا تصادق إلا على معرّفات الجهاز الأصلية، وبالتالي إحباط محاولات الانتحال.

تستند مساحة واجهة برمجة التطبيقات الرئيسية الخاصة بإثبات صحة المعرّف إلى آلية إثبات صحة المفتاح الحالية التي تم طرحها مع Keymaster 2. عند طلب شهادة إثبات صحة لمفتاح يحتفظ به Keymaster، يمكن للجهة الطالبة أن تطلب تضمين معرّفات الجهاز في بيانات شهادة إثبات الصحة الوصفية. إذا كان المفتاح مخزّنًا في بيئة التنفيذ الموثوقة (TEE)، سيتم ربط سلاسل الشهادات بجذر موثوق معروف. يمكن لمستلِم هذه الشهادة التأكّد من أنّ TEE هو من كتب الشهادة ومحتواها، بما في ذلك معرّفات الأجهزة. عندما يُطلب تضمين معرّفات الأجهزة في شهادة التصديق، لا يصدّق بيئة التنفيذ الموثوقة إلا على المعرّفات المخزّنة فيها، كما تم إدخالها في المصنع.

خصائص مساحة التخزين

يجب أن تتضمّن مساحة التخزين التي تحتوي على معرّفات الجهاز الخصائص التالية:

  • يتم نسخ القيم المستمدّة من المعرّفات الأصلية للجهاز إلى مساحة التخزين قبل مغادرة الجهاز المصنع.
  • يمكن أن تؤدي طريقة destroyAttestationIds() إلى إتلاف هذه النسخة من البيانات المستندة إلى المعرّف نهائيًا. يعني التلف الدائم إزالة البيانات بالكامل، وبالتالي لا يمكن استعادتها من خلال إعادة الضبط على الإعدادات الأصلية أو أي إجراء آخر يتم تنفيذه على الجهاز. ويكون ذلك مهمًا بشكل خاص للأجهزة التي فتح فيها المستخدم برنامج الإقلاع وغير برنامج النظام وعدّل المعرّفات التي تعرضها إطارات عمل Android.
  • يجب أن تتوفّر في مرافق RMA إمكانية إنشاء نُسخ جديدة من البيانات المستندة إلى معرّف الجهاز. بهذه الطريقة، يمكن لجهاز تم إرساله إلى مركز RMA إجراء عملية إثبات صحة المعرّف مرة أخرى. يجب حماية الآلية التي تستخدمها مرافق إعادة التصنيع (RMA) حتى لا يتمكّن المستخدمون من تشغيلها بأنفسهم، لأنّ ذلك سيسمح لهم بالحصول على شهادات مصادقة لأرقام تعريف مزيّفة.
  • لا يمكن لأي رمز برمجي آخر غير تطبيق Keymaster الموثوق في بيئة التنفيذ الموثوقة (TEE) قراءة البيانات المستندة إلى المعرّف والمخزّنة.
  • يجب أن يكون التخزين مقاومًا للتلاعب: إذا تم تعديل محتوى التخزين، سيتعامل معه TEE كما لو تم إتلاف نُسخ المحتوى، وسيرفض جميع محاولات إثبات صحة المستندات. يتم تنفيذ ذلك من خلال توقيع أو إنشاء رمز مصادقة الرسائل (MAC) للتخزين كما هو موضّح أدناه.
  • لا تتضمّن وحدة التخزين المعرّفات الأصلية. بما أنّ عملية إثبات صحة المستندات تتضمّن اختبارًا، يقدّم المتّصل دائمًا المعرّفات التي سيتم إثبات صحتها. كل ما على بيئة التنفيذ الموثوقة هو التأكّد من أنّ هذه القيم تتطابق مع القيم التي كانت لديها في الأصل. يتم إتاحة عملية التحقّق هذه من خلال تخزين رموز التجزئة الآمنة للقيم الأصلية بدلاً من القيم نفسها.

أشغال

لإنشاء عملية تنفيذ تتضمّن السمات المذكورة أعلاه، خزِّن القيم المشتقة من المعرّف في بنية S التالية. لا تخزِّن نُسخًا أخرى من قيم المعرّف، باستثناء المواضع العادية في النظام التي يمكن لمالك الجهاز تعديلها من خلال إجراء عملية الروت:

S = D || HMAC(HBK, D)

where:

  • D = HMAC(HBK, ID1) || HMAC(HBK, ID2) || ... || HMAC(HBK, IDn)
  • HMAC هي بنية HMAC مع تجزئة آمنة مناسبة (يُنصح باستخدام SHA-256)
  • HBK هو مفتاح مرتبط بالجهاز ولا يُستخدم لأي غرض آخر
  • ID1...IDn هي قيم المعرّفات الأصلية، ويرتبط كل معرّف بفهرس معيّن حسب طريقة التنفيذ، لأنّ عدد المعرّفات يختلف من جهاز إلى آخر.
  • يمثّل || التسلسل

بما أنّ نواتج HMAC تكون بحجم ثابت، لا يلزم توفير عناوين أو بنية أخرى للعثور على تجزئات أرقام التعريف الفردية أو HMAC الخاص بـ D. بالإضافة إلى التحقّق من القيم المقدَّمة لإجراء عملية التصديق، يجب أن تتحقّق عمليات التنفيذ من صحة S من خلال استخراج D من S، واحتساب HMAC(HBK, D) ومقارنته بالقيمة في S للتأكّد من عدم تعديل أو إتلاف أي أرقام تعريف فردية. بالإضافة إلى ذلك، يجب أن تستخدم عمليات التنفيذ مقارنات بوقت ثابت لجميع عناصر المعرّف الفردية والتحقّق من صحة S. يجب أن يكون وقت المقارنة ثابتًا بغض النظر عن عدد أرقام التعريف المقدَّمة والمطابقة الصحيحة لأي جزء من الاختبار.

معرّفات الأجهزة

تتيح خدمة "إثبات صحة المستند التعريفي" استخدام معرّفات الأجهزة التالية:

  1. اسم العلامة التجارية، كما يعرضه Build.BRAND على Android
  2. اسم الجهاز، كما تعرضه Build.DEVICE في Android
  3. اسم المنتج، كما يتم عرضه من خلال Build.PRODUCT في Android
  4. اسم الشركة المصنّعة، كما يتم عرضه بواسطة Build.MANUFACTURER في Android
  5. اسم الطراز، كما تعرضه Build.MODEL في Android
  6. الرقم التسلسلي
  7. أرقام IMEI لجميع الاتصالات اللاسلكية
  8. أرقام تعريف المعدات المتنقلة (MEID) لجميع أجهزة الراديو

لإتاحة إثبات صحة رقم تعريف الجهاز، يثبت الجهاز صحة هذه المعرّفات. تتوفّر الوحدات الست الأولى على جميع أجهزة Android، وهي ضرورية لكي تعمل هذه الميزة. إذا كان الجهاز يتضمّن أي أجهزة راديو خلوية مدمجة، يجب أن يتيح الجهاز أيضًا إثبات صحة أرقام IMEI و/أو MEID الخاصة بأجهزة الراديو.

يتم طلب إثبات صحة المستند التعريفي من خلال إجراء عملية إثبات صحة المفتاح وتضمين معرّفات الجهاز المطلوب إثبات صحتها في الطلب. يتم وضع علامة على المعرّفات على النحو التالي:

  • ATTESTATION_ID_BRAND
  • ATTESTATION_ID_DEVICE
  • ATTESTATION_ID_PRODUCT
  • ATTESTATION_ID_MANUFACTURER
  • ATTESTATION_ID_MODEL
  • ATTESTATION_ID_SERIAL
  • ATTESTATION_ID_IMEI
  • ATTESTATION_ID_MEID

المعرّف المطلوب إثبات صحته هو سلسلة بايت بترميز UTF-8. ينطبق هذا التنسيق أيضًا على المعرّفات الرقمية. يتم التعبير عن كل معرّف يجب إثبات صحته كسلسلة مرمّزة بتنسيق UTF-8.

إذا كان الجهاز لا يتيح إثبات صحة المعرّف (أو إذا تم استدعاء destroyAttestationIds() سابقًا ولم يعُد بإمكان الجهاز إثبات صحة معرّفاته)، سيتعذّر تنفيذ أي طلب لإثبات صحة المفتاح يتضمّن واحدًا أو أكثر من هذه العلامات مع ظهور الخطأ ErrorCode::CANNOT_ATTEST_IDS.

إذا كان الجهاز يتيح إثبات صحة المعرّف وتم تضمين علامة واحدة أو أكثر من العلامات المذكورة أعلاه في طلب إثبات صحة المفتاح، يتحقّق بيئة التنفيذ الموثوقة (TEE) من أنّ المعرّف المقدَّم مع كل علامة يطابق نسخته من معرّفات الأجهزة. إذا لم يتطابق معرّف واحد أو أكثر، ستتعذّر عملية إثبات صحة الجهاز بالكامل وسيظهر الرمز 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 ولا يستخدمونها. يتم توفير ذلك لمساعدة المطوّرين على فهم كيفية استخدام التطبيقات لهذه الميزة. قد تستخدم مكونات النظام هذه السمة بشكل مختلف، ولهذا السبب من المهم عدم التعامل مع هذا القسم على أنّه معياري.