يوفّر "متجر المفاتيح" مكانًا أكثر أمانًا لإنشاء مفاتيح التشفير وتخزينها واستخدامها بطريقة خاضعة للرقابة. عندما يكون تخزين المفاتيح المستند إلى الأجهزة متاحًا ويُستخدم، تكون مادة المفتاح أكثر أمانًا ضد الاستخراج من الجهاز، ويفرض 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. يجب أن يكون وقت المقارنة ثابتًا بغض النظر عن عدد أرقام التعريف المقدَّمة والمطابقة الصحيحة لأي جزء من الاختبار.
معرّفات الأجهزة
تتيح شهادة إثبات الهوية معرّفات الأجهزة التالية:
- اسم العلامة التجارية، كما يعرضه
Build.BRAND
في Android - اسم الجهاز، كما تعرضه
Build.DEVICE
في Android - اسم المنتج، كما يعرضه
Build.PRODUCT
في Android - اسم الشركة المصنّعة، كما يعرضه
Build.MANUFACTURER
في Android - اسم الطراز، كما يعرضه
Build.MODEL
في Android - الرقم التسلسلي
- أرقام IMEI لجميع أجهزة الراديو
- أرقام 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 ولا ينفّذونها. يتم توفير هذه المعلومات لمساعدة مطوّري التطبيقات على فهم كيفية استخدامها. قد تستخدم مكونات النظام هذه القيمة بشكل مختلف، لذلك من المهم عدم التعامل مع هذا القسم على أنّه عادي.