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

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

لا ينطبق ذلك إلا إذا كان معروفًا أنّ مفاتيح ملف تخزين المفاتيح موجودة في مساحة تخزين مستندة إلى الأجهزة. في الإصدار 1 من Keymaster، لم تكن هناك طريقة للتطبيقات أو الخوادم البعيدة للتحقّق بشكل موثوق من حدوث ذلك. حمّل الخادم الدائم لمستودع المفاتيح واجهة HAL المتاحة الخاصة بـ Keymaster وصدّق كل ما قالته واجهة HAL بشأن الاحتفاظ بنسخة احتياطية من المفاتيح في الأجهزة.

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

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

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

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

لتقديم شهادة اعتماد المفتاح، أضاف نظام التشغيل Android 7.0 مجموعة من العلامات والأنواع والطُرق إلى HAL.

العلامات

  • Tag::ATTESTATION_CHALLENGE
  • Tag::INCLUDE_UNIQUE_ID
  • Tag::RESET_SINCE_ID_ROTATION

النوع

Keymaster 2 والإصدارات الأقدم

typedef struct {
    keymaster_blob_t* entries;
    size_t entry_count;
} keymaster_cert_chain_t;

طريقة AttestKey

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 عادية، مع إضافة opcional إثبات الهوية التي تحتوي على وصف للمفتاح الذي تم إثبات صحته. يتم توقيع الشهادة باستخدام مفتاح مصادقة معتمَد. قد يستخدم مفتاح الإثبات خوارزمية مختلفة عن المفتاح الذي يتم إثبات صحته.

تحتوي شهادة الشهادة على الحقول الواردة في الجدول أدناه ولا يمكن أن تحتوي على أي حقول إضافية. تحدِّد بعض الحقول قيمة حقل ثابتة. تُجري اختبارات CTS التحقّق من أنّ محتوى الشهادة مطابق تمامًا لما هو محدّد.

تسلسل الشهادة

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

TBSCertificate SEQUENCE

اسم الحقل (راجِع RFC 5280) القيمة
version عدد صحيح 2 (يعني شهادة الإصدار 3)
serialNumber عدد صحيح 1 (قيمة ثابتة: متطابقة في جميع الشهادات)
signature AlgorithmIdentifier: معرّف الخوارزمية المستخدَمة لتوقيع المفتاح: ECDSA لمفاتيح التشفير المعتمد على منحنيات إقليدية، و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" رقم تعريف OID هو ‎1.3.6.1.4.1.11129.2.1.17، ويتم تحديد المحتوى في القسم إضافة شهادة الاعتماد أدناه. كما هو الحال مع جميع إضافات شهادة X.509، يتم تمثيل المحتوى على هيئة OCTET_STRING يحتوي على ترميز DER لسلسلة الإثبات.

إضافة شهادة الاعتماد

تحتوي إضافة attestation على معرّف OID 1.3.6.1.4.1.11129.2.1.17. يحتوي على معلومات عن مفتاحَي التشفير الجاري إثبات ملكيتهما وحالة الجهاز في وقت إنشاء المفتاحَين.

يتم تحويل أنواع علامة Keymaster/KeyMint المحدّدة في مواصفات واجهة AIDL إلى أنواع ASN.1 على النحو التالي:

نوع Keymaster/KeyMint نوع ASN.1 ملاحظات
ENUM INTEGER
ENUM_REP SET of INTEGER
UINT INTEGER
UINT_REP SET of INTEGER
ULONG INTEGER
ULONG_REP SET of INTEGER
DATE INTEGER المللي ثانية منذ 1 كانون الثاني (يناير) 1970 00:00:00 بتوقيت غرينيتش
BOOL NULL تشير حالة توفّر العلامة إلى "صحيح"، وتشير حالة عدم توفّرها إلى "خطأ".
BIGNUM لا تتضمّن أي علامات هذا النوع، لذا لم يتم تحديد أيّ تعيين.
BYTES OCTET_STRING

المخطّط

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

الإصدار 300

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

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

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

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

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

الإصدار 200

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

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

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

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

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

الإصدار 100

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

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

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

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

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

الإصدار 4

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

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

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

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

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

الإصدار 3

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

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

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

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

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

الإصدار 2

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

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

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

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

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

الإصدار 1

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

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

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

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

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

حقول KeyDescription

attestationVersion
إصدار مخطّط ASN.1
القيمةإصدار Keymaster/KeyMint
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
attestationSecurityLevel

مستوى الأمان للموقع الجغرافي الذي يتم تخزين المفتاح المُعتمَد فيه

keymasterVersion / keyMintVersion
إصدار تنفيذ طبقة تجريد الأجهزة (HAL) لـ Keymaster/KeyMint
القيمةإصدار Keymaster/KeyMint
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
keymasterSecurityLevel / keyMintSecurityLevel
مستوى الأمان لتطبيق Keymaster/KeyMint
attestationChallenge
التحدي المقدَّم في وقت إنشاء المفتاح
uniqueId
معرّف جهاز حسّاس للخصوصية يمكن لتطبيقات النظام طلبه عند إنشاء المفتاح إذا لم يتم طلب المعرّف الفريد، يكون هذا الحقل فارغًا. لمعرفة التفاصيل، يُرجى الاطّلاع على قسم رقم التعريف الفريد.
softwareEnforced
قائمة الأذونات التي يفرضها نظام Android في Keymaster/KeyMint يتم جمع هذه المعلومات أو إنشاؤها بواسطة رمز في منصّة التطبيق ويتم تخزينها في قسم النظام على الجهاز. يمكن اعتباره موثوقًا طالما أنّ الجهاز يعمل بنظام تشغيل يمتثل لنموذج أمان نظام Android الأساسي (أي أنّ برنامج إقلاع الجهاز مقفل وverifiedBootState Verified).
hardwareEnforced
قائمة الأذونات التي يفرضها Keymaster/KeyMint من خلال بيئة التنفيذ الموثوقة (TEE) في الجهاز أو StrongBox يتم جمع هذه المعلومات أو إنشاؤها من خلال رمز برمجي في الجهاز الآمن ولا تتحكّم المنصة فيها. على سبيل المثال، يمكن أن تأتي المعلومات من برنامج الإقلاع أو من خلال قناة تواصل آمنة لا تتطلب الثقة في النظام الأساسي.

قيم SecurityLevel

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

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

حقول AuthorizationList

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

يحتوي كل حقل على علامة EXPLICIT خاصة بالسياق تساوي رقم علامة Keymaster/KeyMint، ما يتيح تمثيلًا أكثر كثافة للبيانات في AuthorizationList. لذلك، يجب أن يعرف منظِّم ASN.1 نوع البيانات المتوقّع لكل علامة خاصة بالسياق. على سبيل المثال، Tag::USER_AUTH_TYPE يتم تعريفه على أنّه ENUM | 504. في مخطّط إضافة شهادة الاعتماد، يتم تحديد الحقل purpose في AuthorizationList على أنّه userAuthType [504] EXPLICIT INTEGER OPTIONAL. بالتالي، سيحتوي ترميز ASN.1 على العلامة الخاصة بالسياق 504 بدلاً من علامة فئة UNIVERSAL لنوع ASN.1 INTEGER، وهو 10.

purpose
يتوافق مع علامة التفويض Tag::PURPOSE التي تستخدِم قيمة علامة ID‏ 1.
algorithm

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

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

keySize
يتطابق مع علامة التفويض Tag::KEY_SIZE التي تستخدِم قيمة علامة ID‏ 3.
digest
يتوافق مع علامة التفويض Tag::DIGEST التي تستخدِم قيمة علامة ID‏ 5.
padding
يتوافق مع علامة التفويض Tag::PADDING التي تستخدِم قيمة علامة ID‏ 6.
ecCurve

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

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

rsaPublicExponent
يتوافق مع علامة التفويض Tag::RSA_PUBLIC_EXPONENT التي تستخدِم قيمة معرّف العلامة 200.
mgfDigest

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

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

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

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

earlyBootOnly

لا يظهر إلا في إصدار شهادة إثبات ملكية المفتاح ‎4 أو الإصدارات الأحدث.

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

activeDateTime
يتوافق مع علامة التفويض Tag::ACTIVE_DATETIME التي تستخدم قيمة معرّف العلامة 400.
originationExpireDateTime
يتوافق مع Tag::ORIGINATION_EXPIRE_DATETIME علامة تفويض Keymaster ، التي تستخدم قيمة معرّف العلامة 401.
usageExpireDateTime
تتوافق مع علامة التفويض Tag::USAGE_EXPIRE_DATETIME، التي تستخدِم قيمة معرّف العلامة 402.
usageCountLimit
يتوافق مع علامة التفويض Tag::USAGE_COUNT_LIMIT، التي تستخدِم قيمة معرّف العلامة 405.
noAuthRequired

تتوافق مع علامة التفويض Tag::NO_AUTH_REQUIRED التي تستخدِم قيمة رقم تعريف العلامة 503.

userAuthType
تتوافق مع علامة التفويض Tag::USER_AUTH_TYPE التي تستخدِم قيمة رقم تعريف العلامة 504.
authTimeout
تتطابق مع علامة التفويض Tag::AUTH_TIMEOUT التي تستخدِم قيمة رقم تعريف العلامة 505.
allowWhileOnBody

تتوافق مع علامة التفويض Tag::ALLOW_WHILE_ON_BODY، التي تستخدِم قيمة معرّف العلامة 506.

السماح باستخدام المفتاح بعد انتهاء مهلة المصادقة إذا كان المستخدم لا يزال يرتدي الجهاز يُرجى العِلم أنّه يتم استخدام كاميرا آمنة على الجسم لتحديد ما إذا كان الجهاز مثبّتًا على جسم المستخدم.

trustedUserPresenceRequired

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

تتوافق مع علامة التفويض Tag::TRUSTED_USER_PRESENCE_REQUIRED ، التي تستخدِم قيمة معرّف العلامة 507.

يحدّد هذا الخيار أنّ هذا المفتاح لا يمكن استخدامه إلا إذا قدّم المستخدم دليلاً على وجوده الفعلي. تشمل العديد من الأمثلة ما يلي:

  • بالنسبة إلى مفتاح StrongBox، يكون الزرّ عبارة عن زرّ جهاز متصل بجهاز StrongBox.
  • بالنسبة إلى مفتاح TEE، توفّر مصادقة بصمة الإصبع دليلاً على الحضور ما دامت بيئة TEE تتحكّم بشكل حصري في الماسح الضوئي وتُجري عملية مطابقة بصمة الإصبع.
trustedConfirmationRequired

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

تتوافق مع علامة التفويض Tag::TRUSTED_CONFIRMATION_REQUIRED ، التي تستخدِم قيمة معرّف العلامة 508.

يحدِّد هذا الخيار أنّ المفتاح لا يمكن استخدامه إلا إذا قدّم المستخدم تأكيدًا على البيانات التي سيتم توقيعها باستخدام رمز موافقة. لمزيد من المعلومات حول كيفية الحصول على تأكيد المستخدم، يُرجى الاطّلاع على Android Protected Confirmation (تأكيد محمي).

ملاحظة: لا تنطبق هذه العلامة إلا على المفاتيح التي تستخدم الغرض SIGN.

unlockedDeviceRequired

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

تتوافق مع علامة التفويض Tag::UNLOCKED_DEVICE_REQUIRED ، التي تستخدِم قيمة معرّف العلامة 509.

allApplications

تتوافق مع علامة التفويض Tag::ALL_APPLICATIONS التي تستخدِم قيمة معرّف العلامة 600.

يشير إلى ما إذا كان بإمكان جميع التطبيقات على الجهاز الوصول إلى مفتاحَي التشفير.

applicationId
يتوافق مع علامة التفويض Tag::APPLICATION_ID التي تستخدِم قيمة معرّف العلامة 601.
creationDateTime
تتوافق مع علامة التفويض Tag::CREATION_DATETIME التي تستخدم قيمة معرّف العلامة 701.
origin

تتوافق مع علامة التفويض Tag::ORIGIN التي تستخدِم قيمة ID‏ 702.

rollbackResistant

لا تظهر إلا في الإصدارَين 1 و2 من مصادقة المفاتيح.

تتوافق مع علامة التفويض Tag::ROLLBACK_RESISTANT التي تستخدِم قيمة رقم تعريف العلامة 703.

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 Keymaster للسماح التي تستخدِم قيمة رقم تعريف العلامة 709.

لمزيد من التفاصيل، اطّلِع على القسم الذي يصف بنية بيانات AttestationApplicationId.

attestationIdBrand

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

تتوافق مع علامة Tag::ATTESTATION_ID_BRAND Keymaster التي تستخدِم قيمة رقم تعريف العلامة‏ 710.

attestationIdDevice

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

تتوافق مع علامة Tag::ATTESTATION_ID_DEVICE Keymaster التي تستخدِم قيمة رقم تعريف 711.

attestationIdProduct

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

تتوافق مع علامة Tag::ATTESTATION_ID_PRODUCT Keymaster التي تستخدِم قيمة علامة ID‏ 712.

attestationIdSerial

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

تتوافق مع علامة Tag::ATTESTATION_ID_SERIAL Keymaster التي تستخدِم قيمة رقم تعريف العلامة‏ 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.

حقول RootOfTrust

verifiedBootKey
تشير إلى تجزئة آمنة للمفتاح العام المستخدَم للتحقّق من سلامة وأصالة جميع الرموز البرمجية التي يتم تنفيذها أثناء تشغيل الجهاز كجزء من التشغيل المُتحقَّق منه. ننصح باستخدام SHA-256.
deviceLocked
ما إذا كان برنامج إقلاع الجهاز مُقفَلاً يشير الرمز true إلى أنّه تم تشغيل صورة موقَّعة على الجهاز وتم التحقّق منها بنجاح باستخدام وضع التشغيل المتحقَّق منه.
verifiedBootState
حالة "التشغيل المتحقّق منه" للجهاز
verifiedBootHash
ملخّص لجميع البيانات المحمية باستخدام Verified Boot بالنسبة إلى الأجهزة التي تستخدم مرجع تنفيذ التشغيل المتحقَّق منه في Android، يحتوي هذا الحقل على ملخّص VBMeta.

قيم VerifiedBootState

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

AttestationApplicationId

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

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

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

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

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

المعرّف الفريد

رقم التعريف الفريد هو قيمة 128 بت تحدد الجهاز، ولكن لفترة محدودة فقط. يتم احتساب القيمة باستخدام:

HMAC_SHA256(T || C || R, HBK)

المكان:

  • T هي "قيمة المُحتسِب الزمني"، ويتم احتسابها من خلال قسمة قيمة Tag::CREATION_DATETIME على 2592000000، مع تجاهل أي بقية. تتغيّر قيمة T كل 30 يومًا (2592000000 = 30 * 24 * 60 * 60 * 1000).
  • C هي قيمة Tag::APPLICATION_ID
  • تكون القيمة R هي 1 إذا كانت Tag::RESET_SINCE_ID_ROTATION متوفرة في مَعلمة attest_params لطلب attest_key، أو 0 إذا لم تكن علامة متوفّرة.
  • HBK هو سر فريد مرتبط بالأجهزة يعرفه "نظام التشغيل Trusted Execution Environment" ولا يكشف عنه أبدًا. يحتوي المفتاح السري على 128 بت على الأقل من التشويش وهو فريد للجهاز الفردي (يُقبل التفرد القائم على الاحتمالية بالنظر إلى التشويش الذي يبلغ 128 بت). يجب أن يكون مفتاح HBK مشتقًا من مادة المفتاح المدمَجة من خلال HMAC أو AES_CMAC.

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

مفاتيح الشهادة والشهادات

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

يقدّم نظام التشغيل Android 12 ميزة "توفير المفاتيح عن بُعد"، ويتطلّب نظام التشغيل Android 13 من الأجهزة تنفيذها. توفّر ميزة "توفير المفاتيح عن بُعد" للأجهزة في الميدان شهادات إثبات الهوية ECDSA P256 الخاصة بكل تطبيق. تنتهي صلاحية هذه الشهادات أسرع من الشهادات التي تم إعدادها من المصنع.

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

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

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

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

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

المخطّط

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

  {
        1 : int,   ; certificates issued
  }

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

certs_issued

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

إثبات صحة مستند التعريف

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

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

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

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

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

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

البناء

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

S = D || HMAC(HBK, D)

حيث:

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

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

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

تتيح شهادة إثبات الهوية معرّفات الأجهزة التالية:

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

لدعم عملية إثبات ملكية رقم تعريف الجهاز، يُثبت الجهاز ملكية هذه المعرّفات. تتوفّر الإصدارات الستة الأولى من الميزة على جميع الأجهزة التي تعمل بنظام التشغيل Android، وهي ضرورية لكي تعمل هذه الميزة. إذا كان الجهاز يحتوي على أي أجهزة راديو خلوي مدمجة، يجب أن يسمح الجهاز أيضًا بشهادة اعتماد أرقام 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) لشهادة المصادقة الصادرة، باستخدام المخطّط أعلاه. تم تمييز التغييرات من مخطّط attestation في Keymaster 2 بخط عريض مع التعليقات.

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

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