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

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

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

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

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

تتيح خدمة "إثبات صحة المعرّف" للجهاز تقديم دليل على معرّفات الأجهزة، مثل الرقم التسلسلي أو رقم 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 من أنّ محتوى الشهادة مطابق تمامًا لما هو محدّد.

Certificate SEQUENCE

اسم الحقل (راجِع RFC 5280) القيمة
tbsCertificate TBSCertificate SEQUENCE
signatureAlgorithm ‫AlgorithmIdentifier للخوارزمية المستخدَمة لتوقيع المفتاح:
‫ECDSA لمفاتيح EC، وRSA لمفاتيح RSA
signatureValue BIT STRING، التوقيع المحسوب على tbsCertificate بترميز ASN.1 DER

TBSCertificate SEQUENCE

اسم الحقل (راجِع RFC 5280) القيمة
version INTEGER 2 (تعني شهادة الإصدار 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" (قيمة ثابتة: هي نفسها في جميع الشهادات)
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" على معرّف كائن (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 بتوقيت غرينتش
BOOL NULL يشير توفّر العلامة إلى القيمة "صحيح"، وعدم توفّرها إلى القيمة "خطأ".
BIGNUM لا تتضمّن أي علامات هذا النوع، لذا لم يتم تحديد أي عملية ربط.
BYTES OCTET_STRING

المخطط

يتم وصف محتوى إضافة شهادة التصديق من خلال مخطط ASN.1 التالي:

الإصدار 400

KeyDescription ::= SEQUENCE {
    attestationVersion  400,
    attestationSecurityLevel  SecurityLevel,
    keyMintVersion  INTEGER,
    keyMintSecurityLevel  SecurityLevel,
    attestationChallenge  OCTET_STRING,
    uniqueId  OCTET_STRING,
    softwareEnforced  AuthorizationList,
    hardwareEnforced  AuthorizationList,
}

SecurityLevel ::= ENUMERATED {
    Software  (0),
    TrustedEnvironment  (1),
    StrongBox  (2),
}

AuthorizationList ::= SEQUENCE {
    purpose  [1] EXPLICIT SET OF INTEGER OPTIONAL,
    algorithm  [2] EXPLICIT INTEGER OPTIONAL,
    keySize  [3] EXPLICIT INTEGER OPTIONAL,
    digest  [5] EXPLICIT SET OF INTEGER OPTIONAL,
    padding  [6] EXPLICIT SET OF INTEGER OPTIONAL,
    ecCurve  [10] EXPLICIT INTEGER OPTIONAL,
    rsaPublicExponent  [200] EXPLICIT INTEGER OPTIONAL,
    mgfDigest  [203] EXPLICIT SET OF INTEGER OPTIONAL,
    rollbackResistance  [303] EXPLICIT NULL OPTIONAL,
    earlyBootOnly  [305] EXPLICIT NULL OPTIONAL,
    activeDateTime  [400] EXPLICIT INTEGER OPTIONAL,
    originationExpireDateTime  [401] EXPLICIT INTEGER OPTIONAL,
    usageExpireDateTime  [402] EXPLICIT INTEGER OPTIONAL,
    usageCountLimit  [405] EXPLICIT INTEGER OPTIONAL,
    noAuthRequired  [503] EXPLICIT NULL OPTIONAL,
    userAuthType  [504] EXPLICIT INTEGER OPTIONAL,
    authTimeout  [505] EXPLICIT INTEGER OPTIONAL,
    allowWhileOnBody  [506] EXPLICIT NULL OPTIONAL,
    trustedUserPresenceRequired  [507] EXPLICIT NULL OPTIONAL,
    trustedConfirmationRequired  [508] EXPLICIT NULL OPTIONAL,
    unlockedDeviceRequired  [509] EXPLICIT NULL OPTIONAL,
    creationDateTime  [701] EXPLICIT INTEGER OPTIONAL,
    origin  [702] EXPLICIT INTEGER OPTIONAL,
    rootOfTrust  [704] EXPLICIT RootOfTrust OPTIONAL,
    osVersion  [705] EXPLICIT INTEGER OPTIONAL,
    osPatchLevel  [706] EXPLICIT INTEGER OPTIONAL,
    attestationApplicationId  [709] EXPLICIT OCTET_STRING OPTIONAL,
    attestationIdBrand  [710] EXPLICIT OCTET_STRING OPTIONAL,
    attestationIdDevice  [711] EXPLICIT OCTET_STRING OPTIONAL,
    attestationIdProduct  [712] EXPLICIT OCTET_STRING OPTIONAL,
    attestationIdSerial  [713] EXPLICIT OCTET_STRING OPTIONAL,
    attestationIdImei  [714] EXPLICIT OCTET_STRING OPTIONAL,
    attestationIdMeid  [715] EXPLICIT OCTET_STRING OPTIONAL,
    attestationIdManufacturer  [716] EXPLICIT OCTET_STRING OPTIONAL,
    attestationIdModel  [717] EXPLICIT OCTET_STRING OPTIONAL,
    vendorPatchLevel  [718] EXPLICIT INTEGER OPTIONAL,
    bootPatchLevel  [719] EXPLICIT INTEGER OPTIONAL,
    deviceUniqueAttestation  [720] EXPLICIT NULL OPTIONAL,
    attestationIdSecondImei  [723] EXPLICIT OCTET_STRING OPTIONAL,
    moduleHash  [724] EXPLICIT OCTET_STRING OPTIONAL,
}

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

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

الإصدار 300

KeyDescription ::= SEQUENCE {
    attestationVersion  300,
    attestationSecurityLevel  SecurityLevel,
    keyMintVersion  INTEGER,
    keyMintSecurityLevel  SecurityLevel,
    attestationChallenge  OCTET_STRING,
    uniqueId  OCTET_STRING,
    softwareEnforced  AuthorizationList,
    hardwareEnforced  AuthorizationList,
}

SecurityLevel ::= ENUMERATED {
    Software  (0),
    TrustedEnvironment  (1),
    StrongBox  (2),
}

AuthorizationList ::= SEQUENCE {
    purpose  [1] EXPLICIT SET OF INTEGER OPTIONAL,
    algorithm  [2] EXPLICIT INTEGER OPTIONAL,
    keySize  [3] EXPLICIT INTEGER OPTIONAL,
    digest  [5] EXPLICIT SET OF INTEGER OPTIONAL,
    padding  [6] EXPLICIT SET OF INTEGER OPTIONAL,
    ecCurve  [10] EXPLICIT INTEGER OPTIONAL,
    rsaPublicExponent  [200] EXPLICIT INTEGER OPTIONAL,
    mgfDigest  [203] EXPLICIT SET OF INTEGER OPTIONAL,
    rollbackResistance  [303] EXPLICIT NULL OPTIONAL,
    earlyBootOnly  [305] EXPLICIT NULL OPTIONAL,
    activeDateTime  [400] EXPLICIT INTEGER OPTIONAL,
    originationExpireDateTime  [401] EXPLICIT INTEGER OPTIONAL,
    usageExpireDateTime  [402] EXPLICIT INTEGER OPTIONAL,
    usageCountLimit  [405] EXPLICIT INTEGER OPTIONAL,
    noAuthRequired  [503] EXPLICIT NULL OPTIONAL,
    userAuthType  [504] EXPLICIT INTEGER OPTIONAL,
    authTimeout  [505] EXPLICIT INTEGER OPTIONAL,
    allowWhileOnBody  [506] EXPLICIT NULL OPTIONAL,
    trustedUserPresenceRequired  [507] EXPLICIT NULL OPTIONAL,
    trustedConfirmationRequired  [508] EXPLICIT NULL OPTIONAL,
    unlockedDeviceRequired  [509] EXPLICIT NULL OPTIONAL,
    creationDateTime  [701] EXPLICIT INTEGER OPTIONAL,
    origin  [702] EXPLICIT INTEGER OPTIONAL,
    rootOfTrust  [704] EXPLICIT RootOfTrust OPTIONAL,
    osVersion  [705] EXPLICIT INTEGER OPTIONAL,
    osPatchLevel  [706] EXPLICIT INTEGER OPTIONAL,
    attestationApplicationId  [709] EXPLICIT OCTET_STRING OPTIONAL,
    attestationIdBrand  [710] EXPLICIT OCTET_STRING OPTIONAL,
    attestationIdDevice  [711] EXPLICIT OCTET_STRING OPTIONAL,
    attestationIdProduct  [712] EXPLICIT OCTET_STRING OPTIONAL,
    attestationIdSerial  [713] EXPLICIT OCTET_STRING OPTIONAL,
    attestationIdImei  [714] EXPLICIT OCTET_STRING OPTIONAL,
    attestationIdMeid  [715] EXPLICIT OCTET_STRING OPTIONAL,
    attestationIdManufacturer  [716] EXPLICIT OCTET_STRING OPTIONAL,
    attestationIdModel  [717] EXPLICIT OCTET_STRING OPTIONAL,
    vendorPatchLevel  [718] EXPLICIT INTEGER OPTIONAL,
    bootPatchLevel  [719] EXPLICIT INTEGER OPTIONAL,
    deviceUniqueAttestation  [720] EXPLICIT NULL OPTIONAL,
    attestationIdSecondImei  [723] EXPLICIT OCTET_STRING OPTIONAL,
}

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

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

الإصدار 200

KeyDescription ::= SEQUENCE {
    attestationVersion  200,
    attestationSecurityLevel  SecurityLevel,
    keyMintVersion  INTEGER,
    keyMintSecurityLevel  SecurityLevel,
    attestationChallenge  OCTET_STRING,
    uniqueId  OCTET_STRING,
    softwareEnforced  AuthorizationList,
    hardwareEnforced  AuthorizationList,
}

SecurityLevel ::= ENUMERATED {
    Software  (0),
    TrustedEnvironment  (1),
    StrongBox  (2),
}

AuthorizationList ::= SEQUENCE {
    purpose  [1] EXPLICIT SET OF INTEGER OPTIONAL,
    algorithm  [2] EXPLICIT INTEGER OPTIONAL,
    keySize  [3] EXPLICIT INTEGER OPTIONAL,
    digest  [5] EXPLICIT SET OF INTEGER OPTIONAL,
    padding  [6] EXPLICIT SET OF INTEGER OPTIONAL,
    ecCurve  [10] EXPLICIT INTEGER OPTIONAL,
    rsaPublicExponent  [200] EXPLICIT INTEGER OPTIONAL,
    mgfDigest  [203] EXPLICIT SET OF INTEGER OPTIONAL,
    rollbackResistance  [303] EXPLICIT NULL OPTIONAL,
    earlyBootOnly  [305] EXPLICIT NULL OPTIONAL,
    activeDateTime  [400] EXPLICIT INTEGER OPTIONAL,
    originationExpireDateTime  [401] EXPLICIT INTEGER OPTIONAL,
    usageExpireDateTime  [402] EXPLICIT INTEGER OPTIONAL,
    usageCountLimit  [405] EXPLICIT INTEGER OPTIONAL,
    noAuthRequired  [503] EXPLICIT NULL OPTIONAL,
    userAuthType  [504] EXPLICIT INTEGER OPTIONAL,
    authTimeout  [505] EXPLICIT INTEGER OPTIONAL,
    allowWhileOnBody  [506] EXPLICIT NULL OPTIONAL,
    trustedUserPresenceRequired  [507] EXPLICIT NULL OPTIONAL,
    trustedConfirmationRequired  [508] EXPLICIT NULL OPTIONAL,
    unlockedDeviceRequired  [509] EXPLICIT NULL OPTIONAL,
    creationDateTime  [701] EXPLICIT INTEGER OPTIONAL,
    origin  [702] EXPLICIT INTEGER OPTIONAL,
    rootOfTrust  [704] EXPLICIT RootOfTrust OPTIONAL,
    osVersion  [705] EXPLICIT INTEGER OPTIONAL,
    osPatchLevel  [706] EXPLICIT INTEGER OPTIONAL,
    attestationApplicationId  [709] EXPLICIT OCTET_STRING OPTIONAL,
    attestationIdBrand  [710] EXPLICIT OCTET_STRING OPTIONAL,
    attestationIdDevice  [711] EXPLICIT OCTET_STRING OPTIONAL,
    attestationIdProduct  [712] EXPLICIT OCTET_STRING OPTIONAL,
    attestationIdSerial  [713] EXPLICIT OCTET_STRING OPTIONAL,
    attestationIdImei  [714] EXPLICIT OCTET_STRING OPTIONAL,
    attestationIdMeid  [715] EXPLICIT OCTET_STRING OPTIONAL,
    attestationIdManufacturer  [716] EXPLICIT OCTET_STRING OPTIONAL,
    attestationIdModel  [717] EXPLICIT OCTET_STRING OPTIONAL,
    vendorPatchLevel  [718] EXPLICIT INTEGER OPTIONAL,
    bootPatchLevel  [719] EXPLICIT INTEGER OPTIONAL,
    deviceUniqueAttestation  [720] EXPLICIT NULL OPTIONAL,
}

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

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

الإصدار 100

KeyDescription ::= SEQUENCE {
    attestationVersion  100,
    attestationSecurityLevel  SecurityLevel,
    keyMintVersion  INTEGER,
    keyMintSecurityLevel  SecurityLevel,
    attestationChallenge  OCTET_STRING,
    uniqueId  OCTET_STRING,
    softwareEnforced  AuthorizationList,
    hardwareEnforced  AuthorizationList,
}

SecurityLevel ::= ENUMERATED {
    Software  (0),
    TrustedEnvironment  (1),
    StrongBox  (2),
}

AuthorizationList ::= SEQUENCE {
    purpose  [1] EXPLICIT SET OF INTEGER OPTIONAL,
    algorithm  [2] EXPLICIT INTEGER OPTIONAL,
    keySize  [3] EXPLICIT INTEGER OPTIONAL,
    digest  [5] EXPLICIT SET OF INTEGER OPTIONAL,
    padding  [6] EXPLICIT SET OF INTEGER OPTIONAL,
    ecCurve  [10] EXPLICIT INTEGER OPTIONAL,
    rsaPublicExponent  [200] EXPLICIT INTEGER OPTIONAL,
    mgfDigest  [203] EXPLICIT SET OF INTEGER OPTIONAL,
    rollbackResistance  [303] EXPLICIT NULL OPTIONAL,
    earlyBootOnly  [305] EXPLICIT NULL OPTIONAL,
    activeDateTime  [400] EXPLICIT INTEGER OPTIONAL,
    originationExpireDateTime  [401] EXPLICIT INTEGER OPTIONAL,
    usageExpireDateTime  [402] EXPLICIT INTEGER OPTIONAL,
    usageCountLimit  [405] EXPLICIT INTEGER OPTIONAL,
    noAuthRequired  [503] EXPLICIT NULL OPTIONAL,
    userAuthType  [504] EXPLICIT INTEGER OPTIONAL,
    authTimeout  [505] EXPLICIT INTEGER OPTIONAL,
    allowWhileOnBody  [506] EXPLICIT NULL OPTIONAL,
    trustedUserPresenceRequired  [507] EXPLICIT NULL OPTIONAL,
    trustedConfirmationRequired  [508] EXPLICIT NULL OPTIONAL,
    unlockedDeviceRequired  [509] EXPLICIT NULL OPTIONAL,
    creationDateTime  [701] EXPLICIT INTEGER OPTIONAL,
    origin  [702] EXPLICIT INTEGER OPTIONAL,
    rootOfTrust  [704] EXPLICIT RootOfTrust OPTIONAL,
    osVersion  [705] EXPLICIT INTEGER OPTIONAL,
    osPatchLevel  [706] EXPLICIT INTEGER OPTIONAL,
    attestationApplicationId  [709] EXPLICIT OCTET_STRING OPTIONAL,
    attestationIdBrand  [710] EXPLICIT OCTET_STRING OPTIONAL,
    attestationIdDevice  [711] EXPLICIT OCTET_STRING OPTIONAL,
    attestationIdProduct  [712] EXPLICIT OCTET_STRING OPTIONAL,
    attestationIdSerial  [713] EXPLICIT OCTET_STRING OPTIONAL,
    attestationIdImei  [714] EXPLICIT OCTET_STRING OPTIONAL,
    attestationIdMeid  [715] EXPLICIT OCTET_STRING OPTIONAL,
    attestationIdManufacturer  [716] EXPLICIT OCTET_STRING OPTIONAL,
    attestationIdModel  [717] EXPLICIT OCTET_STRING OPTIONAL,
    vendorPatchLevel  [718] EXPLICIT INTEGER OPTIONAL,
    bootPatchLevel  [719] EXPLICIT INTEGER OPTIONAL,
    deviceUniqueAttestation  [720] EXPLICIT NULL OPTIONAL,
}

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

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

الإصدار 4

KeyDescription ::= SEQUENCE {
    attestationVersion  4,
    attestationSecurityLevel  SecurityLevel,
    keymasterVersion  INTEGER,
    keymasterSecurityLevel  SecurityLevel,
    attestationChallenge  OCTET_STRING,
    uniqueId  OCTET_STRING,
    softwareEnforced  AuthorizationList,
    hardwareEnforced  AuthorizationList,
}

SecurityLevel ::= ENUMERATED {
    Software  (0),
    TrustedEnvironment  (1),
    StrongBox  (2),
}

AuthorizationList ::= SEQUENCE {
    purpose  [1] EXPLICIT SET OF INTEGER OPTIONAL,
    algorithm  [2] EXPLICIT INTEGER OPTIONAL,
    keySize  [3] EXPLICIT INTEGER OPTIONAL,
    digest  [5] EXPLICIT SET OF INTEGER OPTIONAL,
    padding  [6] EXPLICIT SET OF INTEGER OPTIONAL,
    ecCurve  [10] EXPLICIT INTEGER OPTIONAL,
    rsaPublicExponent  [200] EXPLICIT INTEGER OPTIONAL,
    rollbackResistance  [303] EXPLICIT NULL OPTIONAL,
    earlyBootOnly  [305] EXPLICIT NULL OPTIONAL,
    activeDateTime  [400] EXPLICIT INTEGER OPTIONAL,
    originationExpireDateTime  [401] EXPLICIT INTEGER OPTIONAL,
    usageExpireDateTime  [402] EXPLICIT INTEGER OPTIONAL,
    noAuthRequired  [503] EXPLICIT NULL OPTIONAL,
    userAuthType  [504] EXPLICIT INTEGER OPTIONAL,
    authTimeout  [505] EXPLICIT INTEGER OPTIONAL,
    allowWhileOnBody  [506] EXPLICIT NULL OPTIONAL,
    trustedUserPresenceRequired  [507] EXPLICIT NULL OPTIONAL,
    trustedConfirmationRequired  [508] EXPLICIT NULL OPTIONAL,
    unlockedDeviceRequired  [509] EXPLICIT NULL OPTIONAL,
    allApplications  [600] EXPLICIT NULL OPTIONAL,
    creationDateTime  [701] EXPLICIT INTEGER OPTIONAL,
    origin  [702] EXPLICIT INTEGER OPTIONAL,
    rootOfTrust  [704] EXPLICIT RootOfTrust OPTIONAL,
    osVersion  [705] EXPLICIT INTEGER OPTIONAL,
    osPatchLevel  [706] EXPLICIT INTEGER OPTIONAL,
    attestationApplicationId  [709] EXPLICIT OCTET_STRING OPTIONAL,
    attestationIdBrand  [710] EXPLICIT OCTET_STRING OPTIONAL,
    attestationIdDevice  [711] EXPLICIT OCTET_STRING OPTIONAL,
    attestationIdProduct  [712] EXPLICIT OCTET_STRING OPTIONAL,
    attestationIdSerial  [713] EXPLICIT OCTET_STRING OPTIONAL,
    attestationIdImei  [714] EXPLICIT OCTET_STRING OPTIONAL,
    attestationIdMeid  [715] EXPLICIT OCTET_STRING OPTIONAL,
    attestationIdManufacturer  [716] EXPLICIT OCTET_STRING OPTIONAL,
    attestationIdModel  [717] EXPLICIT OCTET_STRING OPTIONAL,
    vendorPatchLevel  [718] EXPLICIT INTEGER OPTIONAL,
    bootPatchLevel  [719] EXPLICIT INTEGER OPTIONAL,
    deviceUniqueAttestation  [720] EXPLICIT NULL OPTIONAL,
}

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

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

الإصدار 3

KeyDescription ::= SEQUENCE {
    attestationVersion  3,
    attestationSecurityLevel  SecurityLevel,
    keymasterVersion  INTEGER,
    keymasterSecurityLevel  SecurityLevel,
    attestationChallenge  OCTET_STRING,
    uniqueId  OCTET_STRING,
    softwareEnforced  AuthorizationList,
    hardwareEnforced  AuthorizationList,
}

SecurityLevel ::= ENUMERATED {
    Software  (0),
    TrustedEnvironment  (1),
    StrongBox  (2),
}

AuthorizationList ::= SEQUENCE {
    purpose  [1] EXPLICIT SET OF INTEGER OPTIONAL,
    algorithm  [2] EXPLICIT INTEGER OPTIONAL,
    keySize  [3] EXPLICIT INTEGER OPTIONAL,
    digest  [5] EXPLICIT SET OF INTEGER OPTIONAL,
    padding  [6] EXPLICIT SET OF INTEGER OPTIONAL,
    ecCurve  [10] EXPLICIT INTEGER OPTIONAL,
    rsaPublicExponent  [200] EXPLICIT INTEGER OPTIONAL,
    rollbackResistance  [303] EXPLICIT NULL OPTIONAL,
    activeDateTime  [400] EXPLICIT INTEGER OPTIONAL,
    originationExpireDateTime  [401] EXPLICIT INTEGER OPTIONAL,
    usageExpireDateTime  [402] EXPLICIT INTEGER OPTIONAL,
    noAuthRequired  [503] EXPLICIT NULL OPTIONAL,
    userAuthType  [504] EXPLICIT INTEGER OPTIONAL,
    authTimeout  [505] EXPLICIT INTEGER OPTIONAL,
    allowWhileOnBody  [506] EXPLICIT NULL OPTIONAL,
    trustedUserPresenceRequired  [507] EXPLICIT NULL OPTIONAL,
    trustedConfirmationRequired  [508] EXPLICIT NULL OPTIONAL,
    unlockedDeviceRequired  [509] EXPLICIT NULL OPTIONAL,
    allApplications  [600] EXPLICIT NULL OPTIONAL,
    creationDateTime  [701] EXPLICIT INTEGER OPTIONAL,
    origin  [702] EXPLICIT INTEGER OPTIONAL,
    rootOfTrust  [704] EXPLICIT RootOfTrust OPTIONAL,
    osVersion  [705] EXPLICIT INTEGER OPTIONAL,
    osPatchLevel  [706] EXPLICIT INTEGER OPTIONAL,
    attestationApplicationId  [709] EXPLICIT OCTET_STRING OPTIONAL,
    attestationIdBrand  [710] EXPLICIT OCTET_STRING OPTIONAL,
    attestationIdDevice  [711] EXPLICIT OCTET_STRING OPTIONAL,
    attestationIdProduct  [712] EXPLICIT OCTET_STRING OPTIONAL,
    attestationIdSerial  [713] EXPLICIT OCTET_STRING OPTIONAL,
    attestationIdImei  [714] EXPLICIT OCTET_STRING OPTIONAL,
    attestationIdMeid  [715] EXPLICIT OCTET_STRING OPTIONAL,
    attestationIdManufacturer  [716] EXPLICIT OCTET_STRING OPTIONAL,
    attestationIdModel  [717] EXPLICIT OCTET_STRING OPTIONAL,
    vendorPatchLevel  [718] EXPLICIT INTEGER OPTIONAL,
    bootPatchLevel  [719] EXPLICIT INTEGER OPTIONAL,
}

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

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

الإصدار 2

KeyDescription ::= SEQUENCE {
    attestationVersion  2,
    attestationSecurityLevel  SecurityLevel,
    keymasterVersion  INTEGER,
    keymasterSecurityLevel  SecurityLevel,
    attestationChallenge  OCTET_STRING,
    uniqueId  OCTET_STRING,
    softwareEnforced  AuthorizationList,
    hardwareEnforced  AuthorizationList,
}

SecurityLevel ::= ENUMERATED {
    Software  (0),
    TrustedEnvironment  (1),
}

AuthorizationList ::= SEQUENCE {
    purpose  [1] EXPLICIT SET OF INTEGER OPTIONAL,
    algorithm  [2] EXPLICIT INTEGER OPTIONAL,
    keySize  [3] EXPLICIT INTEGER OPTIONAL,
    digest  [5] EXPLICIT SET OF INTEGER OPTIONAL,
    padding  [6] EXPLICIT SET OF INTEGER OPTIONAL,
    ecCurve  [10] EXPLICIT INTEGER OPTIONAL,
    rsaPublicExponent  [200] EXPLICIT INTEGER OPTIONAL,
    activeDateTime  [400] EXPLICIT INTEGER OPTIONAL,
    originationExpireDateTime  [401] EXPLICIT INTEGER OPTIONAL,
    usageExpireDateTime  [402] EXPLICIT INTEGER OPTIONAL,
    noAuthRequired  [503] EXPLICIT NULL OPTIONAL,
    userAuthType  [504] EXPLICIT INTEGER OPTIONAL,
    authTimeout  [505] EXPLICIT INTEGER OPTIONAL,
    allowWhileOnBody  [506] EXPLICIT NULL OPTIONAL,
    allApplications  [600] EXPLICIT NULL OPTIONAL,
    creationDateTime  [701] EXPLICIT INTEGER OPTIONAL,
    origin  [702] EXPLICIT INTEGER OPTIONAL,
    rollbackResistant  [703] EXPLICIT NULL OPTIONAL,
    rootOfTrust  [704] EXPLICIT RootOfTrust OPTIONAL,
    osVersion  [705] EXPLICIT INTEGER OPTIONAL,
    osPatchLevel  [706] EXPLICIT INTEGER OPTIONAL,
    attestationApplicationId  [709] EXPLICIT OCTET_STRING OPTIONAL,
    attestationIdBrand  [710] EXPLICIT OCTET_STRING OPTIONAL,
    attestationIdDevice  [711] EXPLICIT OCTET_STRING OPTIONAL,
    attestationIdProduct  [712] EXPLICIT OCTET_STRING OPTIONAL,
    attestationIdSerial  [713] EXPLICIT OCTET_STRING OPTIONAL,
    attestationIdImei  [714] EXPLICIT OCTET_STRING OPTIONAL,
    attestationIdMeid  [715] EXPLICIT OCTET_STRING OPTIONAL,
    attestationIdManufacturer  [716] EXPLICIT OCTET_STRING OPTIONAL,
    attestationIdModel  [717] EXPLICIT OCTET_STRING OPTIONAL,
}

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

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

الإصدار 1

KeyDescription ::= SEQUENCE {
    attestationVersion  1,
    attestationSecurityLevel  SecurityLevel,
    keymasterVersion  INTEGER,
    keymasterSecurityLevel  SecurityLevel,
    attestationChallenge  OCTET_STRING,
    uniqueId  OCTET_STRING,
    softwareEnforced  AuthorizationList,
    hardwareEnforced  AuthorizationList,
}

SecurityLevel ::= ENUMERATED {
    Software  (0),
    TrustedEnvironment  (1),
}

AuthorizationList ::= SEQUENCE {
    purpose  [1] EXPLICIT SET OF INTEGER OPTIONAL,
    algorithm  [2] EXPLICIT INTEGER OPTIONAL,
    keySize  [3] EXPLICIT INTEGER OPTIONAL,
    digest  [5] EXPLICIT SET OF INTEGER OPTIONAL,
    padding  [6] EXPLICIT SET OF INTEGER OPTIONAL,
    ecCurve  [10] EXPLICIT INTEGER OPTIONAL,
    rsaPublicExponent  [200] EXPLICIT INTEGER OPTIONAL,
    activeDateTime  [400] EXPLICIT INTEGER OPTIONAL,
    originationExpireDateTime  [401] EXPLICIT INTEGER OPTIONAL,
    usageExpireDateTime  [402] EXPLICIT INTEGER OPTIONAL,
    noAuthRequired  [503] EXPLICIT NULL OPTIONAL,
    userAuthType  [504] EXPLICIT INTEGER OPTIONAL,
    authTimeout  [505] EXPLICIT INTEGER OPTIONAL,
    allowWhileOnBody  [506] EXPLICIT NULL OPTIONAL,
    allApplications  [600] EXPLICIT NULL OPTIONAL,
    creationDateTime  [701] EXPLICIT INTEGER OPTIONAL,
    origin  [702] EXPLICIT INTEGER OPTIONAL,
    rollbackResistant  [703] EXPLICIT NULL OPTIONAL,
    rootOfTrust  [704] EXPLICIT RootOfTrust OPTIONAL,
    osVersion  [705] EXPLICIT INTEGER OPTIONAL,
    osPatchLevel  [706] EXPLICIT INTEGER OPTIONAL,
}

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

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

حقول KeyDescription

attestationVersion
إصدار مخطط ASN.1.
القيمةإصدار KeyMint أو Keymaster
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
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
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] من مستند تعريف معايير التوافق لنظام 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 4:
purpose
يتوافق مع علامة التفويض Tag::PURPOSE التي تستخدم قيمة رقم تعريف العلامة 1.
algorithm

يتوافق مع علامة التفويض Tag::ALGORITHM التي تستخدم قيمة المعرّف 2.

في كائن شهادة AuthorizationList، تكون قيمة الخوارزمية دائمًا RSA أو EC.

keySize
يتوافق مع علامة التفويض Tag::KEY_SIZE التي تستخدم قيمة معرّف العلامة 3.
blockMode
يتوافق مع علامة التفويض Tag::BLOCK_MODE، التي تستخدِم قيمة رقم تعريف العلامة 4.
digest
تتوافق مع علامة التفويض Tag::DIGEST التي تستخدِم قيمة المعرّف 5.
padding
يتوافق مع علامة التفويض Tag::PADDING التي تستخدم قيمة المعرّف 6.
callerNonce
يتوافق مع علامة التفويض Tag::CALLER_NONCE التي تستخدم قيمة المعرّف 7.
minMacLength
تتوافق مع علامة التفويض Tag::MIN_MAC_LENGTH التي تستخدِم قيمة المعرّف 8.
ecCurve

يتوافق مع علامة التفويض Tag::EC_CURVE التي تستخدم قيمة رقم تعريف العلامة 10.

مجموعة المَعلمات المستخدَمة لإنشاء زوج مفاتيح منحنى قطع ناقص (EC)، والتي تستخدم خوارزمية ECDSA للتوقيع والتحقّق، وذلك ضمن مخزن مفاتيح نظام Android.

rsaPublicExponent
يتوافق مع علامة الإذن Tag::RSA_PUBLIC_EXPONENT، التي تستخدم قيمة المعرّف 200.
mgfDigest

يظهر هذا الحقل فقط في إصدار شهادة صحة المفتاح الأكبر من أو يساوي 100.

يتوافق مع علامة التفويض Tag::RSA_OAEP_MGF_DIGEST KeyMint التي تستخدم قيمة المعرّف 203.
rollbackResistance

يتم عرضها فقط في إصدار شهادة صحة المفتاح الأكبر من أو يساوي 3.

يتوافق مع علامة Tag::ROLLBACK_RESISTANCE التفويض التي تستخدم قيمة معرّف العلامة 303.

earlyBootOnly

يجب أن يكون إصدار خدمة "التصديق على المفتاح" 4 أو أعلى.

تتوافق هذه السمة مع علامة التفويض Tag::EARLY_BOOT_ONLY التي تستخدم قيمة رقم تعريف العلامة 305.

activeDateTime
تتوافق مع علامة التفويض Tag::ACTIVE_DATETIME، التي تستخدم قيمة معرّف العلامة 400.
originationExpireDateTime
يتوافق مع علامة Tag::ORIGINATION_EXPIRE_DATETIME التفويض التي تستخدم قيمة المعرّف 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::PATCHLEVEL التي تستخدم قيمة المعرّف 706.

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

لا يتضمّن الإصدار 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.

تحدّد هذه السمة مستوى رمز تصحيح الأمان لصورة المورّد الذي يجب تثبيته على الجهاز لاستخدام هذا المفتاح. تظهر القيمة بالتنسيق YYYYMMDD، ما يمثّل تاريخ حزمة أمان المورّد. على سبيل المثال، إذا تم إنشاء مفتاح على جهاز Android مثبَّت عليه حزمة تصحيح الأمان الصادرة عن المورّد بتاريخ 1 آب (أغسطس) 2018، ستكون هذه القيمة 20180801.

bootPatchLevel

تتوفّر فقط في إصدارات شهادة صحة المفتاح 3 أو أحدث.

يتوافق مع علامة التفويض Tag::BOOT_PATCHLEVEL التي تستخدم قيمة المعرّف 719.

تحدّد هذه السمة مستوى رمز تصحيح الأمان لصورة النواة الذي يجب تثبيته على الجهاز لاستخدام هذا المفتاح. تظهر القيمة بالتنسيق YYYYMMDD، وتمثّل تاريخ حزمة أمان النظام. على سبيل المثال، إذا تم إنشاء مفتاح على جهاز Android مثبّت عليه حزمة تصحيح الأمان الصادرة في 5 آب (أغسطس) 2018، ستكون هذه القيمة 20180805.

deviceUniqueAttestation

يتم عرضها فقط في إصدارات شهادة صحة المفتاح الأكبر من أو يساوي 4.

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

attestationIdSecondImei

يجب أن يكون الإصدار 300 أو إصدار أحدث من شهادة صحة المفتاح متوفّرًا.

يتوافق مع علامة التفويض Tag::ATTESTATION_ID_SECOND_IMEI التي تستخدم قيمة معرّف العلامة 723.

moduleHash

يظهر هذا الحقل فقط في إصدارات "إثبات صحة المفتاح" التي تساوي أو تزيد عن 400.

يتوافق مع علامة الإذن Tag::MODULE_HASH التي تستخدم قيمة معرّف العلامة 724.

حقول RootOfTrust

verifiedBootKey
هي تجزئة آمنة للمفتاح العام المستخدَم للتحقّق من صحة جميع الرموز التي يتم تنفيذها أثناء تشغيل الجهاز ومن صحة مصدرها، وذلك كجزء من عملية التشغيل المُتحقَّق منه. ننصح باستخدام SHA-256.
deviceLocked
تُستخدَم لتحديد ما إذا كان برنامج إقلاع الجهاز مقفلاً. يشير 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]), ...}
    

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

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

المخطط

تتّبع الإضافة مخطط CDDL التالي:

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

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

certs_issued

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

validated_attested_entity

الكيان الذي تم إثبات صحته هو سلسلة تصف نوع الجهاز الذي أكّد خادم التزويد أنّه تم إثبات صحته. على سبيل المثال، STRONG_BOX أو TEE.

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

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

يتيح نظام التشغيل Android 12 ميزة "توفير المفاتيح عن بُعد"، ويتطلّب نظام التشغيل Android 13 أن تنفّذ الأجهزة هذه الميزة. توفّر خدمة &quot;توفير المفاتيح عن بُعد&quot; للأجهزة الميدانية شهادات إثبات صحة 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 متعددة في سجل &quot;إثبات صحة مفتاح Android&quot;. يمكن لمصنّعي المعدات الأصلية تنفيذ هذه الميزة من خلال إضافة علامة KeyMint لرمز IMEI ثانٍ. أصبح من الشائع بشكل متزايد أن تحتوي الأجهزة على أجهزة راديو خلوية متعددة، ويمكن لمصنّعي المعدات الأصلية الآن توفير أجهزة برقمَي IMEI.

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

إثبات الهوية

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

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

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

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

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

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

واجهة برمجة تطبيقات جافا

هذا القسم مخصّص لتقديم المعلومات فقط. لا ينفّذ مطوّرو Keymaster واجهة برمجة التطبيقات Java API ولا يستخدمونها. يتم توفير ذلك لمساعدة المطوّرين على فهم كيفية استخدام التطبيقات لهذه الميزة. قد تستخدم مكونات النظام هذه المعلومات بشكل مختلف، ولهذا السبب من المهم عدم التعامل مع هذا القسم على أنّه إلزامي.