يوفر Keystore مكانًا أكثر أمانًا لإنشاء مفاتيح التشفير وتخزينها واستخدامها بطريقة منظَّمة. عندما تكون ميزة تخزين المفاتيح الاحتياطية على الأجهزة متاحة ويتم استخدامها، تكون بيانات المفاتيح أكثر أمانًا من حيث استخراجها من الجهاز، وتفرض خدمة KeyMint (المعروفة سابقًا باسم Keymaster) قيودًا يصعب التحايل عليها.
ومع ذلك، لا ينطبق ذلك إلا إذا كانت مفاتيح Keystore معروفة بأنّها مخزَّنة في وحدة تخزين محمية بالأجهزة. في Keymaster 1، لم يكن بإمكان التطبيقات أو الخوادم البعيدة التحقّق بشكل موثوق من ذلك. حمّل برنامج keystore الخفي طبقة تجريد الأجهزة (HAL) المتوفّرة في Keymaster، وصدّق على كل ما قالته طبقة HAL بشأن مفاتيح التشفير المُدمَجة بشكل آمن في الأجهزة.
لحلّ هذه المشكلة، تم طرح إثبات صحة المفتاح في نظام التشغيل Android 7.0 (الإصدار 2 من Keymaster)، وتم طرح إثبات صحة المعرّف في نظام التشغيل Android 8.0 (الإصدار 3 من Keymaster).
تهدف مصادقة المفتاح إلى توفير طريقة لتحديد ما إذا كان زوج المفاتيح غير المتماثل مدعومًا بالأجهزة، وما هي خصائص المفتاح، وما هي القيود المفروضة على استخدامه.
تتيح خدمة "إثبات صحة المعرّف" للجهاز تقديم دليل على معرّفات الأجهزة، مثل الرقم التسلسلي أو رقم IMEI.
مصادقة المفتاح
ولإتاحة إثبات صحة المفتاح، قدّم الإصدار 7.0 من نظام التشغيل Android مجموعة من العلامات والأنواع والطرق إلى طبقة HAL.
العلامات
Tag::ATTESTATION_CHALLENGE
Tag::INCLUDE_UNIQUE_ID
Tag::RESET_SINCE_ID_ROTATION
النوع
Keymaster 2 والإصدارات الأقدم
typedef struct { keymaster_blob_t* entries; size_t entry_count; } keymaster_cert_chain_t;
طريقة AttestKey
Keymaster 3
attestKey(vec<uint8_t> keyToAttest, vec<KeyParameter> attestParams) generates(ErrorCode error, vec<vec<uint8_t>> certChain);
Keymaster 2 والإصدارات الأقدم
keymaster_error_t (*attest_key)(const struct keymaster2_device* dev, const keymaster_key_blob_t* key_to_attest, const keymaster_key_param_set_t* attest_params, keymaster_cert_chain_t* cert_chain);
-
dev
هو بنية جهاز Keymaster. keyToAttest
هو كائن ثنائي كبير الحجم للمفتاح تم عرضه منgenerateKey
والذي تم إنشاء شهادة التصديق له.attestParams
هي قائمة بأي مَعلمات ضرورية للتصديق. ويشمل ذلكTag::ATTESTATION_CHALLENGE
وربماTag::RESET_SINCE_ID_ROTATION
، بالإضافة إلىTag::APPLICATION_ID
وTag::APPLICATION_DATA
. ويجب توفير آخر عنصرَين لتشفير مجموعة بيانات المفتاح إذا تم تحديدهما أثناء إنشاء المفتاح.-
certChain
هي مَعلمة الإخراج التي تعرض صفيفًا من الشهادات. الإدخال 0 هو شهادة التصديق، ما يعني أنّها تصادق على المفتاح منkeyToAttest
وتحتوي على إضافة التصديق.
تُعدّ طريقة attestKey
عملية مفتاح عام على المفتاح الذي تم إثبات صحته، لأنّه يمكن استدعاؤها في أي وقت ولا تحتاج إلى استيفاء قيود التفويض. على سبيل المثال، إذا كان المفتاح الذي تم إثبات صحته يتطلّب مصادقة المستخدم لاستخدامه، يمكن إنشاء شهادة إثبات صحة بدون مصادقة المستخدم.
شهادة التصديق
شهادة التصديق هي شهادة X.509 عادية، مع إضافة اختيارية للتصديق تحتوي على وصف للمفتاح الذي تم التصديق عليه. يتم توقيع الشهادة باستخدام مفتاح مصادقة معتمَد. قد يستخدم مفتاح التصديق خوارزمية مختلفة عن الخوارزمية التي يتم التصديق عليها.
تحتوي شهادة التصديق على الحقول الواردة في الجدول أدناه، ولا يمكن أن تحتوي على أي حقول إضافية. تحدّد بعض الحقول قيمة ثابتة. تتحقّق اختبارات CTS من أنّ محتوى الشهادة مطابق تمامًا لما هو محدّد.
Certificate SEQUENCE
اسم الحقل (راجِع RFC 5280) | القيمة |
---|---|
tbsCertificate | TBSCertificate SEQUENCE |
signatureAlgorithm | AlgorithmIdentifier للخوارزمية المستخدَمة لتوقيع المفتاح: ECDSA لمفاتيح EC، وRSA لمفاتيح RSA |
signatureValue | BIT STRING، التوقيع المحسوب على tbsCertificate بترميز ASN.1 DER |
TBSCertificate SEQUENCE
اسم الحقل (راجِع RFC 5280) | القيمة |
---|---|
version |
INTEGER 2 (تعني شهادة الإصدار 3) |
serialNumber |
INTEGER 1 (قيمة ثابتة: هي نفسها في جميع الشهادات) |
signature |
AlgorithmIdentifier للخوارزمية المستخدَمة لتوقيع المفتاح: ECDSA لمفاتيح EC، وRSA لمفاتيح RSA |
issuer |
يكون هذا المعرّف هو نفسه حقل الموضوع في مفتاح المصادقة المجمّعة. |
validity |
تسلسل من تاريخَين، يحتوي على قيمتَي
Tag::ACTIVE_DATETIME وTag::USAGE_EXPIRE_DATETIME
وتكون هذه القيم بالمللي ثانية منذ 1 يناير 1970.
يمكنك الاطّلاع على RFC 5280 لمعرفة طرق عرض التاريخ الصحيحة في الشهادات.في حال عدم توفّر Tag::ACTIVE_DATETIME ، استخدِم قيمة
Tag::CREATION_DATETIME . في حال عدم توفّر Tag::USAGE_EXPIRE_DATETIME ، استخدِم تاريخ انتهاء صلاحية شهادة مفتاح بيان صحة الدُفعات. |
subject |
CN = "مفتاح Android Keystore" (قيمة ثابتة: هي نفسها في جميع الشهادات) |
subjectPublicKeyInfo |
SubjectPublicKeyInfo الذي يحتوي على المفتاح العام الذي تم إثبات صحته |
extensions/Key Usage |
digitalSignature: يتم ضبطها إذا كان المفتاح يتضمّن الغرض KeyPurpose::SIGN أو KeyPurpose::VERIFY . يجب أن تكون جميع البتات الأخرى غير مضبوطة. |
extensions/CRL Distribution Points |
يتم تحديد القيمة لاحقًا |
extensions/"attestation" |
رقم تعريف العنصر هو 1.3.6.1.4.1.11129.2.1.17، ويتم تحديد المحتوى في قسم إضافة الشهادة أدناه. كما هو الحال مع جميع إضافات شهادات X.509، يتم تمثيل المحتوى كسلسلة OCTET_STRING تحتوي على ترميز DER لـ SEQUENCE الخاص بشهادة التصديق. |
إضافة المصادقة
تحتوي الإضافة "attestation
" على معرّف كائن (OID) بقيمة
1.3.6.1.4.1.11129.2.1.17
. ويحتوي على معلومات حول مفتاحَي التشفير اللذين يتم إثبات صحتهما وحالة الجهاز عند إنشاء المفتاح.
يتم تحويل أنواع علامات Keymaster/KeyMint المحدّدة في مواصفات واجهة AIDL إلى أنواع ASN.1 على النحو التالي:
نوع KeyMint أو Keymaster | نوع ASN.1 | الملاحظات |
---|---|---|
ENUM |
INTEGER |
|
ENUM_REP |
SET of INTEGER |
|
UINT |
INTEGER |
|
UINT_REP |
SET of INTEGER |
|
ULONG |
INTEGER |
|
ULONG_REP |
SET of INTEGER |
|
DATE |
INTEGER |
مللي ثانية منذ 1 كانون الثاني (يناير) 1970 الساعة 00:00:00 بتوقيت غرينتش |
BOOL |
NULL |
يشير توفّر العلامة إلى القيمة "صحيح"، وعدم توفّرها إلى القيمة "خطأ". |
BIGNUM |
لا تتضمّن أي علامات هذا النوع، لذا لم يتم تحديد أي عملية ربط. | |
BYTES |
OCTET_STRING |
المخطط
يتم وصف محتوى إضافة شهادة التصديق من خلال مخطط ASN.1 التالي:
الإصدار 400
KeyDescription ::= SEQUENCE { attestationVersion 400, attestationSecurityLevel SecurityLevel, keyMintVersion INTEGER, keyMintSecurityLevel SecurityLevel, attestationChallenge OCTET_STRING, uniqueId OCTET_STRING, softwareEnforced AuthorizationList, hardwareEnforced AuthorizationList, } SecurityLevel ::= ENUMERATED { Software (0), TrustedEnvironment (1), StrongBox (2), } AuthorizationList ::= SEQUENCE { purpose [1] EXPLICIT SET OF INTEGER OPTIONAL, algorithm [2] EXPLICIT INTEGER OPTIONAL, keySize [3] EXPLICIT INTEGER OPTIONAL, digest [5] EXPLICIT SET OF INTEGER OPTIONAL, padding [6] EXPLICIT SET OF INTEGER OPTIONAL, ecCurve [10] EXPLICIT INTEGER OPTIONAL, rsaPublicExponent [200] EXPLICIT INTEGER OPTIONAL, mgfDigest [203] EXPLICIT SET OF INTEGER OPTIONAL, rollbackResistance [303] EXPLICIT NULL OPTIONAL, earlyBootOnly [305] EXPLICIT NULL OPTIONAL, activeDateTime [400] EXPLICIT INTEGER OPTIONAL, originationExpireDateTime [401] EXPLICIT INTEGER OPTIONAL, usageExpireDateTime [402] EXPLICIT INTEGER OPTIONAL, usageCountLimit [405] EXPLICIT INTEGER OPTIONAL, noAuthRequired [503] EXPLICIT NULL OPTIONAL, userAuthType [504] EXPLICIT INTEGER OPTIONAL, authTimeout [505] EXPLICIT INTEGER OPTIONAL, allowWhileOnBody [506] EXPLICIT NULL OPTIONAL, trustedUserPresenceRequired [507] EXPLICIT NULL OPTIONAL, trustedConfirmationRequired [508] EXPLICIT NULL OPTIONAL, unlockedDeviceRequired [509] EXPLICIT NULL OPTIONAL, creationDateTime [701] EXPLICIT INTEGER OPTIONAL, origin [702] EXPLICIT INTEGER OPTIONAL, rootOfTrust [704] EXPLICIT RootOfTrust OPTIONAL, osVersion [705] EXPLICIT INTEGER OPTIONAL, osPatchLevel [706] EXPLICIT INTEGER OPTIONAL, attestationApplicationId [709] EXPLICIT OCTET_STRING OPTIONAL, attestationIdBrand [710] EXPLICIT OCTET_STRING OPTIONAL, attestationIdDevice [711] EXPLICIT OCTET_STRING OPTIONAL, attestationIdProduct [712] EXPLICIT OCTET_STRING OPTIONAL, attestationIdSerial [713] EXPLICIT OCTET_STRING OPTIONAL, attestationIdImei [714] EXPLICIT OCTET_STRING OPTIONAL, attestationIdMeid [715] EXPLICIT OCTET_STRING OPTIONAL, attestationIdManufacturer [716] EXPLICIT OCTET_STRING OPTIONAL, attestationIdModel [717] EXPLICIT OCTET_STRING OPTIONAL, vendorPatchLevel [718] EXPLICIT INTEGER OPTIONAL, bootPatchLevel [719] EXPLICIT INTEGER OPTIONAL, deviceUniqueAttestation [720] EXPLICIT NULL OPTIONAL, attestationIdSecondImei [723] EXPLICIT OCTET_STRING OPTIONAL, moduleHash [724] EXPLICIT OCTET_STRING OPTIONAL, } RootOfTrust ::= SEQUENCE { verifiedBootKey OCTET_STRING, deviceLocked BOOLEAN, verifiedBootState VerifiedBootState, verifiedBootHash OCTET_STRING, } VerifiedBootState ::= ENUMERATED { Verified (0), SelfSigned (1), Unverified (2), Failed (3), }
الإصدار 300
KeyDescription ::= SEQUENCE { attestationVersion 300, attestationSecurityLevel SecurityLevel, keyMintVersion INTEGER, keyMintSecurityLevel SecurityLevel, attestationChallenge OCTET_STRING, uniqueId OCTET_STRING, softwareEnforced AuthorizationList, hardwareEnforced AuthorizationList, } SecurityLevel ::= ENUMERATED { Software (0), TrustedEnvironment (1), StrongBox (2), } AuthorizationList ::= SEQUENCE { purpose [1] EXPLICIT SET OF INTEGER OPTIONAL, algorithm [2] EXPLICIT INTEGER OPTIONAL, keySize [3] EXPLICIT INTEGER OPTIONAL, digest [5] EXPLICIT SET OF INTEGER OPTIONAL, padding [6] EXPLICIT SET OF INTEGER OPTIONAL, ecCurve [10] EXPLICIT INTEGER OPTIONAL, rsaPublicExponent [200] EXPLICIT INTEGER OPTIONAL, mgfDigest [203] EXPLICIT SET OF INTEGER OPTIONAL, rollbackResistance [303] EXPLICIT NULL OPTIONAL, earlyBootOnly [305] EXPLICIT NULL OPTIONAL, activeDateTime [400] EXPLICIT INTEGER OPTIONAL, originationExpireDateTime [401] EXPLICIT INTEGER OPTIONAL, usageExpireDateTime [402] EXPLICIT INTEGER OPTIONAL, usageCountLimit [405] EXPLICIT INTEGER OPTIONAL, noAuthRequired [503] EXPLICIT NULL OPTIONAL, userAuthType [504] EXPLICIT INTEGER OPTIONAL, authTimeout [505] EXPLICIT INTEGER OPTIONAL, allowWhileOnBody [506] EXPLICIT NULL OPTIONAL, trustedUserPresenceRequired [507] EXPLICIT NULL OPTIONAL, trustedConfirmationRequired [508] EXPLICIT NULL OPTIONAL, unlockedDeviceRequired [509] EXPLICIT NULL OPTIONAL, creationDateTime [701] EXPLICIT INTEGER OPTIONAL, origin [702] EXPLICIT INTEGER OPTIONAL, rootOfTrust [704] EXPLICIT RootOfTrust OPTIONAL, osVersion [705] EXPLICIT INTEGER OPTIONAL, osPatchLevel [706] EXPLICIT INTEGER OPTIONAL, attestationApplicationId [709] EXPLICIT OCTET_STRING OPTIONAL, attestationIdBrand [710] EXPLICIT OCTET_STRING OPTIONAL, attestationIdDevice [711] EXPLICIT OCTET_STRING OPTIONAL, attestationIdProduct [712] EXPLICIT OCTET_STRING OPTIONAL, attestationIdSerial [713] EXPLICIT OCTET_STRING OPTIONAL, attestationIdImei [714] EXPLICIT OCTET_STRING OPTIONAL, attestationIdMeid [715] EXPLICIT OCTET_STRING OPTIONAL, attestationIdManufacturer [716] EXPLICIT OCTET_STRING OPTIONAL, attestationIdModel [717] EXPLICIT OCTET_STRING OPTIONAL, vendorPatchLevel [718] EXPLICIT INTEGER OPTIONAL, bootPatchLevel [719] EXPLICIT INTEGER OPTIONAL, deviceUniqueAttestation [720] EXPLICIT NULL OPTIONAL, attestationIdSecondImei [723] EXPLICIT OCTET_STRING OPTIONAL, } RootOfTrust ::= SEQUENCE { verifiedBootKey OCTET_STRING, deviceLocked BOOLEAN, verifiedBootState VerifiedBootState, verifiedBootHash OCTET_STRING, } VerifiedBootState ::= ENUMERATED { Verified (0), SelfSigned (1), Unverified (2), Failed (3), }
الإصدار 200
KeyDescription ::= SEQUENCE { attestationVersion 200, attestationSecurityLevel SecurityLevel, keyMintVersion INTEGER, keyMintSecurityLevel SecurityLevel, attestationChallenge OCTET_STRING, uniqueId OCTET_STRING, softwareEnforced AuthorizationList, hardwareEnforced AuthorizationList, } SecurityLevel ::= ENUMERATED { Software (0), TrustedEnvironment (1), StrongBox (2), } AuthorizationList ::= SEQUENCE { purpose [1] EXPLICIT SET OF INTEGER OPTIONAL, algorithm [2] EXPLICIT INTEGER OPTIONAL, keySize [3] EXPLICIT INTEGER OPTIONAL, digest [5] EXPLICIT SET OF INTEGER OPTIONAL, padding [6] EXPLICIT SET OF INTEGER OPTIONAL, ecCurve [10] EXPLICIT INTEGER OPTIONAL, rsaPublicExponent [200] EXPLICIT INTEGER OPTIONAL, mgfDigest [203] EXPLICIT SET OF INTEGER OPTIONAL, rollbackResistance [303] EXPLICIT NULL OPTIONAL, earlyBootOnly [305] EXPLICIT NULL OPTIONAL, activeDateTime [400] EXPLICIT INTEGER OPTIONAL, originationExpireDateTime [401] EXPLICIT INTEGER OPTIONAL, usageExpireDateTime [402] EXPLICIT INTEGER OPTIONAL, usageCountLimit [405] EXPLICIT INTEGER OPTIONAL, noAuthRequired [503] EXPLICIT NULL OPTIONAL, userAuthType [504] EXPLICIT INTEGER OPTIONAL, authTimeout [505] EXPLICIT INTEGER OPTIONAL, allowWhileOnBody [506] EXPLICIT NULL OPTIONAL, trustedUserPresenceRequired [507] EXPLICIT NULL OPTIONAL, trustedConfirmationRequired [508] EXPLICIT NULL OPTIONAL, unlockedDeviceRequired [509] EXPLICIT NULL OPTIONAL, creationDateTime [701] EXPLICIT INTEGER OPTIONAL, origin [702] EXPLICIT INTEGER OPTIONAL, rootOfTrust [704] EXPLICIT RootOfTrust OPTIONAL, osVersion [705] EXPLICIT INTEGER OPTIONAL, osPatchLevel [706] EXPLICIT INTEGER OPTIONAL, attestationApplicationId [709] EXPLICIT OCTET_STRING OPTIONAL, attestationIdBrand [710] EXPLICIT OCTET_STRING OPTIONAL, attestationIdDevice [711] EXPLICIT OCTET_STRING OPTIONAL, attestationIdProduct [712] EXPLICIT OCTET_STRING OPTIONAL, attestationIdSerial [713] EXPLICIT OCTET_STRING OPTIONAL, attestationIdImei [714] EXPLICIT OCTET_STRING OPTIONAL, attestationIdMeid [715] EXPLICIT OCTET_STRING OPTIONAL, attestationIdManufacturer [716] EXPLICIT OCTET_STRING OPTIONAL, attestationIdModel [717] EXPLICIT OCTET_STRING OPTIONAL, vendorPatchLevel [718] EXPLICIT INTEGER OPTIONAL, bootPatchLevel [719] EXPLICIT INTEGER OPTIONAL, deviceUniqueAttestation [720] EXPLICIT NULL OPTIONAL, } RootOfTrust ::= SEQUENCE { verifiedBootKey OCTET_STRING, deviceLocked BOOLEAN, verifiedBootState VerifiedBootState, verifiedBootHash OCTET_STRING, } VerifiedBootState ::= ENUMERATED { Verified (0), SelfSigned (1), Unverified (2), Failed (3), }
الإصدار 100
KeyDescription ::= SEQUENCE { attestationVersion 100, attestationSecurityLevel SecurityLevel, keyMintVersion INTEGER, keyMintSecurityLevel SecurityLevel, attestationChallenge OCTET_STRING, uniqueId OCTET_STRING, softwareEnforced AuthorizationList, hardwareEnforced AuthorizationList, } SecurityLevel ::= ENUMERATED { Software (0), TrustedEnvironment (1), StrongBox (2), } AuthorizationList ::= SEQUENCE { purpose [1] EXPLICIT SET OF INTEGER OPTIONAL, algorithm [2] EXPLICIT INTEGER OPTIONAL, keySize [3] EXPLICIT INTEGER OPTIONAL, digest [5] EXPLICIT SET OF INTEGER OPTIONAL, padding [6] EXPLICIT SET OF INTEGER OPTIONAL, ecCurve [10] EXPLICIT INTEGER OPTIONAL, rsaPublicExponent [200] EXPLICIT INTEGER OPTIONAL, mgfDigest [203] EXPLICIT SET OF INTEGER OPTIONAL, rollbackResistance [303] EXPLICIT NULL OPTIONAL, earlyBootOnly [305] EXPLICIT NULL OPTIONAL, activeDateTime [400] EXPLICIT INTEGER OPTIONAL, originationExpireDateTime [401] EXPLICIT INTEGER OPTIONAL, usageExpireDateTime [402] EXPLICIT INTEGER OPTIONAL, usageCountLimit [405] EXPLICIT INTEGER OPTIONAL, noAuthRequired [503] EXPLICIT NULL OPTIONAL, userAuthType [504] EXPLICIT INTEGER OPTIONAL, authTimeout [505] EXPLICIT INTEGER OPTIONAL, allowWhileOnBody [506] EXPLICIT NULL OPTIONAL, trustedUserPresenceRequired [507] EXPLICIT NULL OPTIONAL, trustedConfirmationRequired [508] EXPLICIT NULL OPTIONAL, unlockedDeviceRequired [509] EXPLICIT NULL OPTIONAL, creationDateTime [701] EXPLICIT INTEGER OPTIONAL, origin [702] EXPLICIT INTEGER OPTIONAL, rootOfTrust [704] EXPLICIT RootOfTrust OPTIONAL, osVersion [705] EXPLICIT INTEGER OPTIONAL, osPatchLevel [706] EXPLICIT INTEGER OPTIONAL, attestationApplicationId [709] EXPLICIT OCTET_STRING OPTIONAL, attestationIdBrand [710] EXPLICIT OCTET_STRING OPTIONAL, attestationIdDevice [711] EXPLICIT OCTET_STRING OPTIONAL, attestationIdProduct [712] EXPLICIT OCTET_STRING OPTIONAL, attestationIdSerial [713] EXPLICIT OCTET_STRING OPTIONAL, attestationIdImei [714] EXPLICIT OCTET_STRING OPTIONAL, attestationIdMeid [715] EXPLICIT OCTET_STRING OPTIONAL, attestationIdManufacturer [716] EXPLICIT OCTET_STRING OPTIONAL, attestationIdModel [717] EXPLICIT OCTET_STRING OPTIONAL, vendorPatchLevel [718] EXPLICIT INTEGER OPTIONAL, bootPatchLevel [719] EXPLICIT INTEGER OPTIONAL, deviceUniqueAttestation [720] EXPLICIT NULL OPTIONAL, } RootOfTrust ::= SEQUENCE { verifiedBootKey OCTET_STRING, deviceLocked BOOLEAN, verifiedBootState VerifiedBootState, verifiedBootHash OCTET_STRING, } VerifiedBootState ::= ENUMERATED { Verified (0), SelfSigned (1), Unverified (2), Failed (3), }
الإصدار 4
KeyDescription ::= SEQUENCE { attestationVersion 4, attestationSecurityLevel SecurityLevel, keymasterVersion INTEGER, keymasterSecurityLevel SecurityLevel, attestationChallenge OCTET_STRING, uniqueId OCTET_STRING, softwareEnforced AuthorizationList, hardwareEnforced AuthorizationList, } SecurityLevel ::= ENUMERATED { Software (0), TrustedEnvironment (1), StrongBox (2), } AuthorizationList ::= SEQUENCE { purpose [1] EXPLICIT SET OF INTEGER OPTIONAL, algorithm [2] EXPLICIT INTEGER OPTIONAL, keySize [3] EXPLICIT INTEGER OPTIONAL, digest [5] EXPLICIT SET OF INTEGER OPTIONAL, padding [6] EXPLICIT SET OF INTEGER OPTIONAL, ecCurve [10] EXPLICIT INTEGER OPTIONAL, rsaPublicExponent [200] EXPLICIT INTEGER OPTIONAL, rollbackResistance [303] EXPLICIT NULL OPTIONAL, earlyBootOnly [305] EXPLICIT NULL OPTIONAL, activeDateTime [400] EXPLICIT INTEGER OPTIONAL, originationExpireDateTime [401] EXPLICIT INTEGER OPTIONAL, usageExpireDateTime [402] EXPLICIT INTEGER OPTIONAL, noAuthRequired [503] EXPLICIT NULL OPTIONAL, userAuthType [504] EXPLICIT INTEGER OPTIONAL, authTimeout [505] EXPLICIT INTEGER OPTIONAL, allowWhileOnBody [506] EXPLICIT NULL OPTIONAL, trustedUserPresenceRequired [507] EXPLICIT NULL OPTIONAL, trustedConfirmationRequired [508] EXPLICIT NULL OPTIONAL, unlockedDeviceRequired [509] EXPLICIT NULL OPTIONAL, allApplications [600] EXPLICIT NULL OPTIONAL, creationDateTime [701] EXPLICIT INTEGER OPTIONAL, origin [702] EXPLICIT INTEGER OPTIONAL, rootOfTrust [704] EXPLICIT RootOfTrust OPTIONAL, osVersion [705] EXPLICIT INTEGER OPTIONAL, osPatchLevel [706] EXPLICIT INTEGER OPTIONAL, attestationApplicationId [709] EXPLICIT OCTET_STRING OPTIONAL, attestationIdBrand [710] EXPLICIT OCTET_STRING OPTIONAL, attestationIdDevice [711] EXPLICIT OCTET_STRING OPTIONAL, attestationIdProduct [712] EXPLICIT OCTET_STRING OPTIONAL, attestationIdSerial [713] EXPLICIT OCTET_STRING OPTIONAL, attestationIdImei [714] EXPLICIT OCTET_STRING OPTIONAL, attestationIdMeid [715] EXPLICIT OCTET_STRING OPTIONAL, attestationIdManufacturer [716] EXPLICIT OCTET_STRING OPTIONAL, attestationIdModel [717] EXPLICIT OCTET_STRING OPTIONAL, vendorPatchLevel [718] EXPLICIT INTEGER OPTIONAL, bootPatchLevel [719] EXPLICIT INTEGER OPTIONAL, deviceUniqueAttestation [720] EXPLICIT NULL OPTIONAL, } RootOfTrust ::= SEQUENCE { verifiedBootKey OCTET_STRING, deviceLocked BOOLEAN, verifiedBootState VerifiedBootState, verifiedBootHash OCTET_STRING, } VerifiedBootState ::= ENUMERATED { Verified (0), SelfSigned (1), Unverified (2), Failed (3), }
الإصدار 3
KeyDescription ::= SEQUENCE { attestationVersion 3, attestationSecurityLevel SecurityLevel, keymasterVersion INTEGER, keymasterSecurityLevel SecurityLevel, attestationChallenge OCTET_STRING, uniqueId OCTET_STRING, softwareEnforced AuthorizationList, hardwareEnforced AuthorizationList, } SecurityLevel ::= ENUMERATED { Software (0), TrustedEnvironment (1), StrongBox (2), } AuthorizationList ::= SEQUENCE { purpose [1] EXPLICIT SET OF INTEGER OPTIONAL, algorithm [2] EXPLICIT INTEGER OPTIONAL, keySize [3] EXPLICIT INTEGER OPTIONAL, digest [5] EXPLICIT SET OF INTEGER OPTIONAL, padding [6] EXPLICIT SET OF INTEGER OPTIONAL, ecCurve [10] EXPLICIT INTEGER OPTIONAL, rsaPublicExponent [200] EXPLICIT INTEGER OPTIONAL, rollbackResistance [303] EXPLICIT NULL OPTIONAL, activeDateTime [400] EXPLICIT INTEGER OPTIONAL, originationExpireDateTime [401] EXPLICIT INTEGER OPTIONAL, usageExpireDateTime [402] EXPLICIT INTEGER OPTIONAL, noAuthRequired [503] EXPLICIT NULL OPTIONAL, userAuthType [504] EXPLICIT INTEGER OPTIONAL, authTimeout [505] EXPLICIT INTEGER OPTIONAL, allowWhileOnBody [506] EXPLICIT NULL OPTIONAL, trustedUserPresenceRequired [507] EXPLICIT NULL OPTIONAL, trustedConfirmationRequired [508] EXPLICIT NULL OPTIONAL, unlockedDeviceRequired [509] EXPLICIT NULL OPTIONAL, allApplications [600] EXPLICIT NULL OPTIONAL, creationDateTime [701] EXPLICIT INTEGER OPTIONAL, origin [702] EXPLICIT INTEGER OPTIONAL, rootOfTrust [704] EXPLICIT RootOfTrust OPTIONAL, osVersion [705] EXPLICIT INTEGER OPTIONAL, osPatchLevel [706] EXPLICIT INTEGER OPTIONAL, attestationApplicationId [709] EXPLICIT OCTET_STRING OPTIONAL, attestationIdBrand [710] EXPLICIT OCTET_STRING OPTIONAL, attestationIdDevice [711] EXPLICIT OCTET_STRING OPTIONAL, attestationIdProduct [712] EXPLICIT OCTET_STRING OPTIONAL, attestationIdSerial [713] EXPLICIT OCTET_STRING OPTIONAL, attestationIdImei [714] EXPLICIT OCTET_STRING OPTIONAL, attestationIdMeid [715] EXPLICIT OCTET_STRING OPTIONAL, attestationIdManufacturer [716] EXPLICIT OCTET_STRING OPTIONAL, attestationIdModel [717] EXPLICIT OCTET_STRING OPTIONAL, vendorPatchLevel [718] EXPLICIT INTEGER OPTIONAL, bootPatchLevel [719] EXPLICIT INTEGER OPTIONAL, } RootOfTrust ::= SEQUENCE { verifiedBootKey OCTET_STRING, deviceLocked BOOLEAN, verifiedBootState VerifiedBootState, verifiedBootHash OCTET_STRING, } VerifiedBootState ::= ENUMERATED { Verified (0), SelfSigned (1), Unverified (2), Failed (3), }
الإصدار 2
KeyDescription ::= SEQUENCE { attestationVersion 2, attestationSecurityLevel SecurityLevel, keymasterVersion INTEGER, keymasterSecurityLevel SecurityLevel, attestationChallenge OCTET_STRING, uniqueId OCTET_STRING, softwareEnforced AuthorizationList, hardwareEnforced AuthorizationList, } SecurityLevel ::= ENUMERATED { Software (0), TrustedEnvironment (1), } AuthorizationList ::= SEQUENCE { purpose [1] EXPLICIT SET OF INTEGER OPTIONAL, algorithm [2] EXPLICIT INTEGER OPTIONAL, keySize [3] EXPLICIT INTEGER OPTIONAL, digest [5] EXPLICIT SET OF INTEGER OPTIONAL, padding [6] EXPLICIT SET OF INTEGER OPTIONAL, ecCurve [10] EXPLICIT INTEGER OPTIONAL, rsaPublicExponent [200] EXPLICIT INTEGER OPTIONAL, activeDateTime [400] EXPLICIT INTEGER OPTIONAL, originationExpireDateTime [401] EXPLICIT INTEGER OPTIONAL, usageExpireDateTime [402] EXPLICIT INTEGER OPTIONAL, noAuthRequired [503] EXPLICIT NULL OPTIONAL, userAuthType [504] EXPLICIT INTEGER OPTIONAL, authTimeout [505] EXPLICIT INTEGER OPTIONAL, allowWhileOnBody [506] EXPLICIT NULL OPTIONAL, allApplications [600] EXPLICIT NULL OPTIONAL, creationDateTime [701] EXPLICIT INTEGER OPTIONAL, origin [702] EXPLICIT INTEGER OPTIONAL, rollbackResistant [703] EXPLICIT NULL OPTIONAL, rootOfTrust [704] EXPLICIT RootOfTrust OPTIONAL, osVersion [705] EXPLICIT INTEGER OPTIONAL, osPatchLevel [706] EXPLICIT INTEGER OPTIONAL, attestationApplicationId [709] EXPLICIT OCTET_STRING OPTIONAL, attestationIdBrand [710] EXPLICIT OCTET_STRING OPTIONAL, attestationIdDevice [711] EXPLICIT OCTET_STRING OPTIONAL, attestationIdProduct [712] EXPLICIT OCTET_STRING OPTIONAL, attestationIdSerial [713] EXPLICIT OCTET_STRING OPTIONAL, attestationIdImei [714] EXPLICIT OCTET_STRING OPTIONAL, attestationIdMeid [715] EXPLICIT OCTET_STRING OPTIONAL, attestationIdManufacturer [716] EXPLICIT OCTET_STRING OPTIONAL, attestationIdModel [717] EXPLICIT OCTET_STRING OPTIONAL, } RootOfTrust ::= SEQUENCE { verifiedBootKey OCTET_STRING, deviceLocked BOOLEAN, verifiedBootState VerifiedBootState, } VerifiedBootState ::= ENUMERATED { Verified (0), SelfSigned (1), Unverified (2), Failed (3), }
الإصدار 1
KeyDescription ::= SEQUENCE { attestationVersion 1, attestationSecurityLevel SecurityLevel, keymasterVersion INTEGER, keymasterSecurityLevel SecurityLevel, attestationChallenge OCTET_STRING, uniqueId OCTET_STRING, softwareEnforced AuthorizationList, hardwareEnforced AuthorizationList, } SecurityLevel ::= ENUMERATED { Software (0), TrustedEnvironment (1), } AuthorizationList ::= SEQUENCE { purpose [1] EXPLICIT SET OF INTEGER OPTIONAL, algorithm [2] EXPLICIT INTEGER OPTIONAL, keySize [3] EXPLICIT INTEGER OPTIONAL, digest [5] EXPLICIT SET OF INTEGER OPTIONAL, padding [6] EXPLICIT SET OF INTEGER OPTIONAL, ecCurve [10] EXPLICIT INTEGER OPTIONAL, rsaPublicExponent [200] EXPLICIT INTEGER OPTIONAL, activeDateTime [400] EXPLICIT INTEGER OPTIONAL, originationExpireDateTime [401] EXPLICIT INTEGER OPTIONAL, usageExpireDateTime [402] EXPLICIT INTEGER OPTIONAL, noAuthRequired [503] EXPLICIT NULL OPTIONAL, userAuthType [504] EXPLICIT INTEGER OPTIONAL, authTimeout [505] EXPLICIT INTEGER OPTIONAL, allowWhileOnBody [506] EXPLICIT NULL OPTIONAL, allApplications [600] EXPLICIT NULL OPTIONAL, creationDateTime [701] EXPLICIT INTEGER OPTIONAL, origin [702] EXPLICIT INTEGER OPTIONAL, rollbackResistant [703] EXPLICIT NULL OPTIONAL, rootOfTrust [704] EXPLICIT RootOfTrust OPTIONAL, osVersion [705] EXPLICIT INTEGER OPTIONAL, osPatchLevel [706] EXPLICIT INTEGER OPTIONAL, } RootOfTrust ::= SEQUENCE { verifiedBootKey OCTET_STRING, deviceLocked BOOLEAN, verifiedBootState VerifiedBootState, } VerifiedBootState ::= ENUMERATED { Verified (0), SelfSigned (1), Unverified (2), Failed (3), }
حقول KeyDescription
-
attestationVersion
-
إصدار مخطط ASN.1.
القيمة إصدار KeyMint أو Keymaster 1 الإصدار 2.0 من Keymaster 2 الإصدار 3.0 من Keymaster 3 الإصدار 4.0 من Keymaster 4 الإصدار 4.1 من Keymaster 100 الإصدار 1.0 من KeyMint 200 الإصدار 2.0 من KeyMint 300 الإصدار 3.0 من KeyMint 400 الإصدار 4.0 من KeyMint -
attestationSecurityLevel
-
مستوى الأمان للموقع الجغرافي الذي يتم فيه تخزين المفتاح الذي تم إثبات صحته
-
keymasterVersion
من أصلkeyMintVersion
-
تمثّل هذه السمة إصدار KeyMint أو Keymaster HAL.
القيمة إصدار KeyMint أو Keymaster 2 الإصدار 2.0 من Keymaster 3 الإصدار 3.0 من Keymaster 4 الإصدار 4.0 من Keymaster 41 الإصدار 4.1 من Keymaster 100 الإصدار 1.0 من KeyMint 200 الإصدار 2.0 من KeyMint 300 الإصدار 3.0 من KeyMint 400 الإصدار 4.0 من KeyMint -
keymasterSecurityLevel
من أصلkeyMintSecurityLevel
- مستوى الأمان لتنفيذ KeyMint أو Keymaster.
-
attestationChallenge
- تمثّل هذه السمة التحدّي الذي تم تقديمه عند إنشاء المفتاح.
-
uniqueId
- معرّف جهاز يراعي الخصوصية ويمكن لتطبيقات النظام طلبه عند إنشاء المفتاح. إذا لم يُطلب رقم التعريف الفريد، يكون هذا الحقل فارغًا. لمعرفة التفاصيل، يُرجى الاطّلاع على قسم المعرّف الفريد.
-
softwareEnforced
-
قائمة الأذونات في KeyMint أو Keymaster التي يفرضها نظام Android يتم جمع هذه المعلومات أو إنشاؤها بواسطة رمز في المنصة. ويمكن الوثوق به طالما أنّ الجهاز يعمل بنظام تشغيل يتوافق مع نموذج أمان منصة Android (أي أنّ برنامج إقلاع الجهاز مقفل وأنّ
verifiedBootState
هوVerified
). -
hardwareEnforced
- قائمة الأذونات الخاصة بـ KeyMint أو Keymaster، والتي تفرضها بيئة التنفيذ الموثوقة (TEE) أو StrongBox في الجهاز يتم جمع هذه المعلومات أو إنشاؤها بواسطة رمز في الجهاز الآمن، ولا تتحكّم المنصة في هذه المعلومات. على سبيل المثال، يمكن أن تأتي المعلومات من برنامج الإقلاع أو من خلال قناة اتصال آمنة لا تتطلّب الوثوق بالنظام الأساسي.
قيم SecurityLevel
تشير قيمة SecurityLevel
إلى مدى مقاومة عنصر ذي صلة بـ Keystore (مثل زوج المفاتيح وشهادة التصديق) للهجوم.
القيمة | المعنى |
---|---|
Software |
آمنة طالما أنّ نظام Android على الجهاز يتوافق مع
نموذج أمان منصة Android
(أي أنّ برنامج إقلاع الجهاز مقفل وأنّ
verifiedBootState هو
Verified ). |
TrustedEnvironment |
آمنة طالما أنّ بيئة التنفيذ الموثوقة لم يتم اختراقها. يتم تحديد متطلبات العزل لبيئات التنفيذ الموثوقة (TEE) في الفقرات من 9.11 [C-1-1] إلى [C-1-4] من مستند تعريف معايير التوافق لنظام Android. تتسم بيئات التنفيذ الموثوقة بمقاومة عالية للاختراق عن بُعد ومقاومة معتدلة للاختراق من خلال الهجمات المباشرة على الأجهزة. |
StrongBox |
آمنة ما دام StrongBox غير مخترَق. يتم تنفيذ StrongBox في عنصر آمن يشبه وحدة أمان الأجهزة. تم تحديد متطلبات التنفيذ الخاصة بـ StrongBox في الفقرة 9.11.2 من مستند تعريف معايير التوافق مع Android. تتسم StrongBox بمقاومة عالية ضد الاختراق عن بُعد والاختراق من خلال الهجوم المباشر على الأجهزة (مثل التلاعب المادي وهجمات القنوات الجانبية). |
حقول AuthorizationList
يتوافق كل حقل مع علامة تفويض Keymaster/KeyMint من
مواصفات واجهة AIDL.
تُعدّ المواصفات المصدر الموثوق بشأن علامات التفويض، بما في ذلك معناها وتنسيق محتواها وما إذا كان من المتوقّع ظهورها في الحقلَين softwareEnforced
أو hardwareEnforced
ضمن العنصر KeyDescription
وما إذا كانت تستبعد بعضها البعض مع علامات أخرى وما إلى ذلك. جميع الحقول AuthorizationList
اختيارية.
يحتوي كل حقل على علامة EXPLICIT
خاصة بالسياق تساوي رقم علامة KeyMint أو Keymaster، ما يتيح عرض البيانات بشكل أكثر اختصارًا في AuthorizationList
. لذلك، يجب أن يعرف محلّل ASN.1 نوع البيانات المتوقّع لكل علامة خاصة بالسياق. على سبيل المثال، يتم تعريف Tag::USER_AUTH_TYPE
على أنّه ENUM | 504
. في مخطط إضافة شهادة المصادقة، يتم تحديد الحقل purpose
في AuthorizationList
على أنّه userAuthType [504] EXPLICIT INTEGER OPTIONAL
. لذلك، سيتضمّن ترميز ASN.1 العلامة الخاصة بالسياق 504
بدلاً من علامة الفئة UNIVERSAL
لنوع ASN.1 INTEGER
، وهو 10
.
-
purpose
-
يتوافق مع علامة التفويض
Tag::PURPOSE
التي تستخدم قيمة رقم تعريف العلامة 1. -
algorithm
-
يتوافق مع علامة التفويض
Tag::ALGORITHM
التي تستخدم قيمة المعرّف 2.في كائن شهادة
AuthorizationList
، تكون قيمة الخوارزمية دائمًاRSA
أوEC
. -
keySize
-
يتوافق مع علامة التفويض
Tag::KEY_SIZE
التي تستخدم قيمة معرّف العلامة 3. -
blockMode
-
يتوافق مع علامة التفويض
Tag::BLOCK_MODE
، التي تستخدِم قيمة رقم تعريف العلامة 4. -
digest
-
تتوافق مع علامة التفويض
Tag::DIGEST
التي تستخدِم قيمة المعرّف 5. -
padding
-
يتوافق مع علامة التفويض
Tag::PADDING
التي تستخدم قيمة المعرّف 6. -
callerNonce
-
يتوافق مع علامة التفويض
Tag::CALLER_NONCE
التي تستخدم قيمة المعرّف 7. -
minMacLength
-
تتوافق مع علامة التفويض
Tag::MIN_MAC_LENGTH
التي تستخدِم قيمة المعرّف 8. -
ecCurve
-
يتوافق مع علامة التفويض
Tag::EC_CURVE
التي تستخدم قيمة رقم تعريف العلامة 10.مجموعة المَعلمات المستخدَمة لإنشاء زوج مفاتيح منحنى قطع ناقص (EC)، والتي تستخدم خوارزمية ECDSA للتوقيع والتحقّق، وذلك ضمن مخزن مفاتيح نظام Android.
-
rsaPublicExponent
-
يتوافق مع علامة الإذن
Tag::RSA_PUBLIC_EXPONENT
، التي تستخدم قيمة المعرّف 200. -
mgfDigest
-
يظهر هذا الحقل فقط في إصدار شهادة صحة المفتاح الأكبر من أو يساوي 100.
يتوافق مع علامة التفويضTag::RSA_OAEP_MGF_DIGEST
KeyMint التي تستخدم قيمة المعرّف 203. -
rollbackResistance
-
يتم عرضها فقط في إصدار شهادة صحة المفتاح الأكبر من أو يساوي 3.
يتوافق مع علامة
Tag::ROLLBACK_RESISTANCE
التفويض التي تستخدم قيمة معرّف العلامة 303. -
earlyBootOnly
-
يجب أن يكون إصدار خدمة "التصديق على المفتاح" 4 أو أعلى.
تتوافق هذه السمة مع علامة التفويض
Tag::EARLY_BOOT_ONLY
التي تستخدم قيمة رقم تعريف العلامة 305. -
activeDateTime
-
تتوافق مع علامة التفويض
Tag::ACTIVE_DATETIME
، التي تستخدم قيمة معرّف العلامة 400. -
originationExpireDateTime
-
يتوافق مع علامة
Tag::ORIGINATION_EXPIRE_DATETIME
التفويض التي تستخدم قيمة المعرّف 401. -
usageExpireDateTime
-
تتوافق مع علامة التفويض
Tag::USAGE_EXPIRE_DATETIME
، التي تستخدم قيمة رقم تعريف العلامة 402. -
usageCountLimit
-
يتوافق مع علامة التفويض
Tag::USAGE_COUNT_LIMIT
، التي تستخدم قيمة المعرّف 405. -
userSecureId
-
تتطابق مع علامة التفويض
Tag::USER_SECURE_ID
، التي تستخدم قيمة المعرّف 502. -
noAuthRequired
-
يتوافق مع علامة التفويض
Tag::NO_AUTH_REQUIRED
، التي تستخدم قيمة المعرّف 503. -
userAuthType
-
يتوافق مع علامة التفويض
Tag::USER_AUTH_TYPE
التي تستخدم قيمة المعرّف 504. -
authTimeout
-
تتوافق مع علامة التفويض
Tag::AUTH_TIMEOUT
التي تستخدم قيمة المعرّف 505. -
allowWhileOnBody
-
يتوافق مع علامة التفويض
Tag::ALLOW_WHILE_ON_BODY
، التي تستخدم قيمة معرّف العلامة 506.يسمح هذا الخيار باستخدام المفتاح بعد انتهاء مهلة المصادقة إذا كان المستخدم لا يزال يرتدي الجهاز. يُرجى العِلم أنّ مستشعرًا آمنًا على الجسم يحدّد ما إذا كان الجهاز موضوعًا على جسم المستخدم.
-
trustedUserPresenceReq
-
يتم عرضها فقط في إصدار شهادة صحة المفتاح الأكبر من أو يساوي 3.
يتوافق مع علامة التفويض
Tag::TRUSTED_USER_PRESENCE_REQUIRED
التي تستخدم قيمة المعرّف 507.يحدّد هذا الحقل أنّ هذا المفتاح لا يمكن استخدامه إلا إذا قدّم المستخدم دليلاً على تواجده الفعلي. في ما يلي بعض الأمثلة:
- بالنسبة إلى مفتاح StrongBox، يكون زر الجهاز متصلاً مباشرةً بدبوس على جهاز StrongBox.
- بالنسبة إلى مفتاح TEE، تقدّم المصادقة ببصمة الإصبع إثباتًا على الوجود طالما أنّ بيئة TEE تتحكّم حصريًا في الماسح الضوئي وتجري عملية مطابقة بصمة الإصبع.
-
trustedConfirmationReq
-
يتم عرضها فقط في إصدار شهادة صحة المفتاح الأكبر من أو يساوي 3.
تتوافق هذه السمة مع علامة التفويض
Tag::TRUSTED_CONFIRMATION_REQUIRED
التي تستخدم قيمة المعرّف 508.يشير إلى أنّه لا يمكن استخدام المفتاح إلا إذا قدّم المستخدم تأكيدًا على البيانات المطلوب توقيعها باستخدام رمز موافقة. لمزيد من المعلومات حول كيفية الحصول على تأكيد من المستخدم، يُرجى الاطّلاع على ميزة "التأكيد المحمي" في Android.
ملاحظة: لا تنطبق هذه العلامة إلا على المفاتيح التي تستخدم الغرض
SIGN
. -
unlockedDeviceReq
-
يتم عرضها فقط في إصدار شهادة صحة المفتاح الأكبر من أو يساوي 3.
يتوافق مع علامة التفويض
Tag::UNLOCKED_DEVICE_REQUIRED
التي تستخدم قيمة المعرّف 509. -
creationDateTime
-
تتوافق مع علامة التفويض
Tag::CREATION_DATETIME
التي تستخدِم قيمة المعرّف 701. -
origin
-
يتوافق هذا الحقل مع علامة التفويض
Tag::ORIGIN
التي تستخدم قيمة المعرّف 702. -
rootOfTrust
-
تتوافق هذه السمة مع علامة التفويض
Tag::ROOT_OF_TRUST
التي تستخدم قيمة المعرّف 704.لمزيد من التفاصيل، راجِع القسم الذي يصف بنية بيانات RootOfTrust.
-
osVersion
-
تتطابق هذه السمة مع علامة التفويض
Tag::OS_VERSION
التي تستخدم قيمة المعرّف 705.تمثّل هذه السمة إصدار نظام التشغيل Android المرتبط بـ Keymaster، ويتم تحديدها كعدد صحيح مكوّن من ستة أرقام. على سبيل المثال، يتم تمثيل الإصدار 8.1.0 بالرقم 080100.
لا يتضمّن الإصدار 1.0 من Keymaster أو الإصدارات الأحدث هذه القيمة في قائمة التفويض.
-
osPatchLevel
-
يتوافق مع علامة التفويض
Tag::PATCHLEVEL
التي تستخدم قيمة المعرّف 706.الشهر والسنة المرتبطان بحزمة الأمان المستخدَمة في Keymaster، ويتم تحديدهما كعدد صحيح مكوّن من ستة أرقام. على سبيل المثال، يتم تمثيل حزمة الأمان لشهر أغسطس 2018 بالرقم 201808.
لا يتضمّن الإصدار 1.0 من Keymaster أو الإصدارات الأحدث هذه القيمة في قائمة التفويض.
-
attestationApplicationId
-
يظهر هذا الحقل فقط في إصدارات صحة المفتاح التي تساوي 2 أو أكبر.
تتوافق هذه السمة مع علامة
Tag::ATTESTATION_APPLICATION_ID
التفويض التي تستخدم قيمة المعرّف 709.لمزيد من التفاصيل، راجِع القسم الذي يصف بنية بيانات AttestationApplicationId.
-
attestationIdBrand
-
يظهر هذا الحقل فقط في إصدارات صحة المفتاح التي تساوي 2 أو أكبر.
يتوافق مع علامة التفويض
Tag::ATTESTATION_ID_BRAND
التي تستخدم قيمة المعرّف 710. -
attestationIdDevice
-
يظهر هذا الحقل فقط في إصدارات صحة المفتاح التي تساوي 2 أو أكبر.
تتوافق مع علامة التفويض
Tag::ATTESTATION_ID_DEVICE
التي تستخدم قيمة المعرّف 711. -
attestationIdProduct
-
يظهر هذا الحقل فقط في إصدارات صحة المفتاح التي تساوي 2 أو أكبر.
تتوافق مع علامة التفويض
Tag::ATTESTATION_ID_PRODUCT
التي تستخدم قيمة المعرّف 712. -
attestationIdSerial
-
يظهر هذا الحقل فقط في إصدارات صحة المفتاح التي تساوي 2 أو أكبر.
يتوافق مع علامة الإذن
Tag::ATTESTATION_ID_SERIAL
التي تستخدم قيمة رقم تعريف العلامة 713. -
attestationIdImei
-
يظهر هذا الحقل فقط في إصدارات صحة المفتاح التي تساوي 2 أو أكبر.
يتوافق مع علامة التفويض
Tag::ATTESTATION_ID_IMEI
، التي تستخدم قيمة رقم تعريف العلامة 714. -
attestationIdMeid
-
يظهر هذا الحقل فقط في إصدارات صحة المفتاح التي تساوي 2 أو أكبر.
يتوافق مع علامة التفويض
Tag::ATTESTATION_ID_MEID
التي تستخدم قيمة رقم تعريف العلامة 715. -
attestationIdManufacturer
-
يظهر هذا الحقل فقط في إصدارات صحة المفتاح التي تساوي 2 أو أكبر.
تتوافق مع علامة
Tag::ATTESTATION_ID_MANUFACTURER
التفويض التي تستخدم قيمة المعرّف 716. -
attestationIdModel
-
يظهر هذا الحقل فقط في إصدارات صحة المفتاح التي تساوي 2 أو أكبر.
يتوافق مع علامة التفويض
Tag::ATTESTATION_ID_MODEL
التي تستخدم قيمة معرّف العلامة 717. -
vendorPatchLevel
-
تتوفّر فقط في إصدارات شهادة صحة المفتاح 3 أو أحدث.
يتوافق مع علامة الإذن
Tag::VENDOR_PATCHLEVEL
التي تستخدم قيمة المعرّف 718.تحدّد هذه السمة مستوى رمز تصحيح الأمان لصورة المورّد الذي يجب تثبيته على الجهاز لاستخدام هذا المفتاح. تظهر القيمة بالتنسيق YYYYMMDD، ما يمثّل تاريخ حزمة أمان المورّد. على سبيل المثال، إذا تم إنشاء مفتاح على جهاز Android مثبَّت عليه حزمة تصحيح الأمان الصادرة عن المورّد بتاريخ 1 آب (أغسطس) 2018، ستكون هذه القيمة 20180801.
-
bootPatchLevel
-
تتوفّر فقط في إصدارات شهادة صحة المفتاح 3 أو أحدث.
يتوافق مع علامة التفويض
Tag::BOOT_PATCHLEVEL
التي تستخدم قيمة المعرّف 719.تحدّد هذه السمة مستوى رمز تصحيح الأمان لصورة النواة الذي يجب تثبيته على الجهاز لاستخدام هذا المفتاح. تظهر القيمة بالتنسيق YYYYMMDD، وتمثّل تاريخ حزمة أمان النظام. على سبيل المثال، إذا تم إنشاء مفتاح على جهاز Android مثبّت عليه حزمة تصحيح الأمان الصادرة في 5 آب (أغسطس) 2018، ستكون هذه القيمة 20180805.
-
deviceUniqueAttestation
-
يتم عرضها فقط في إصدارات شهادة صحة المفتاح الأكبر من أو يساوي 4.
تتطابق مع علامة التفويض
Tag::DEVICE_UNIQUE_ATTESTATION
التي تستخدم قيمة المعرّف 720. -
attestationIdSecondImei
-
يجب أن يكون الإصدار 300 أو إصدار أحدث من شهادة صحة المفتاح متوفّرًا.
يتوافق مع علامة التفويض
Tag::ATTESTATION_ID_SECOND_IMEI
التي تستخدم قيمة معرّف العلامة 723. -
moduleHash
-
يظهر هذا الحقل فقط في إصدارات "إثبات صحة المفتاح" التي تساوي أو تزيد عن 400.
يتوافق مع علامة الإذن
Tag::MODULE_HASH
التي تستخدم قيمة معرّف العلامة 724.
حقول RootOfTrust
-
verifiedBootKey
- هي تجزئة آمنة للمفتاح العام المستخدَم للتحقّق من صحة جميع الرموز التي يتم تنفيذها أثناء تشغيل الجهاز ومن صحة مصدرها، وذلك كجزء من عملية التشغيل المُتحقَّق منه. ننصح باستخدام SHA-256.
-
deviceLocked
-
تُستخدَم لتحديد ما إذا كان برنامج إقلاع الجهاز مقفلاً. يشير
true
إلى أنّ الجهاز شغّل صورة موقَّعة تم التحقّق منها بنجاح باستخدام التشغيل المتحقَّق منه. -
verifiedBootState
- حالة "التشغيل المتحقّق منه" للجهاز.
-
verifiedBootHash
- ملخّص لجميع البيانات المحمية بموجب التحقّق من صحة التمهيد بالنسبة إلى الأجهزة التي تستخدم التنفيذ المرجعي لبرنامج Android Verified Boot، يحتوي هذا الحقل على ملخّص VBMeta.
قيم VerifiedBootState
القيمة | حالة التشغيل المقابلة | المعنى |
---|---|---|
Verified |
GREEN |
تمتد سلسلة الثقة الكاملة من جذر الثقة المحمي بواسطة الأجهزة إلى برنامج التشغيل وجميع الأقسام التي تم التحقّق منها باستخدام التشغيل المتحقَّق منه.
في هذه الحالة، يحتوي الحقل verifiedBootKey على قيمة التجزئة لجذر الثقة المضمّن، وهي الشهادة المضمّنة في ذاكرة القراءة فقط (ROM) للجهاز من قِبل الشركة المصنّعة للجهاز في المصنع. |
SelfSigned |
YELLOW |
هي نفسها Verified ، باستثناء أنّ عملية التحقّق تمت باستخدام مصدر ثقة أعدّه المستخدم بدلاً من مصدر الثقة المضمّن من قِبل الشركة المصنّعة في المصنع.
في هذه الحالة، يحتوي الحقل verifiedBootKey على قيمة التجزئة للمفتاح العام الذي أعدّه المستخدم. |
Unverified |
ORANGE |
برنامج الإقلاع في الجهاز غير مقفل، وبالتالي لا يمكن إنشاء سلسلة ثقة. يمكن تعديل الجهاز بحرية، لذا يجب أن يتحقّق المستخدم من سلامة الجهاز خارج النطاق. في هذه الحالة، يحتوي الحقل verifiedBootKey على 32 بايت من الأصفار. |
Failed |
RED |
تعذّر التحقّق من الجهاز. في هذه الحالة، لا تتوفّر أي ضمانات بشأن محتوى الحقول الأخرى RootOfTrust . |
AttestationApplicationId
يعكس هذا الحقل اعتقاد نظام Android الأساسي بشأن التطبيقات المسموح لها باستخدام مواد المفتاح السري أثناء عملية المصادقة. ويمكن أن يحتوي على حِزم متعدّدة فقط إذا كانت الحِزم المتعدّدة تتشارك معرّف UID نفسه. الحقل AttestationApplicationId
في AuthorizationList
هو من النوع OCTET_STRING
ويتم تنسيقه وفقًا لمخطط ASN.1 التالي:
AttestationApplicationId ::= SEQUENCE { package_infos SET OF AttestationPackageInfo, signature_digests SET OF OCTET_STRING, } AttestationPackageInfo ::= SEQUENCE { package_name OCTET_STRING, version INTEGER, }
package_infos
-
مجموعة من عناصر
AttestationPackageInfo
، يقدّم كل منها اسم الحزمة ورقم إصدارها. signature_digests
-
مجموعة من ملخّصات SHA-256 لشهادات توقيع التطبيق يمكن أن يتضمّن التطبيق سلاسل شهادات متعددة لمفتاح التوقيع. يتم استخلاص الشهادة "الفرعية" لكل منها ووضعها في الحقل
signature_digests
. اسم الحقل مضلِّل، لأنّ البيانات المجزّأة هي شهادات توقيع التطبيق، وليست تواقيع التطبيق، وذلك لأنّ الاسم مأخوذ من الفئةSignature
التي يتم عرضها عند إجراء طلب إلىgetPackageInfo()
. يعرض مقتطف الرمز التالي مجموعة أمثلة:{SHA256(PackageInfo.signature[0]), SHA256(PackageInfo.signature[1]), ...}
إضافة معلومات توفير المتطلبات اللازمة
يحتوي امتداد معلومات توفير المتطلبات اللازمة على معرّف الكائن 1.3.6.1.4.1.11129.2.1.30
. تقدّم الإضافة معلومات
يعرفها خادم توفير المتطلبات عن الجهاز.
المخطط
تتّبع الإضافة مخطط CDDL التالي:
{ 1 : int, ; certificates issued 4 : string, ; validated attested entity (STRONG_BOX/TEE) }
الخريطة غير محدّدة الإصدار، ويمكن إضافة حقول اختيارية جديدة إليها.
-
certs_issued
-
عدد تقريبي للشهادات التي تم إصدارها للجهاز خلال آخر 30 يومًا. يمكن استخدام هذه القيمة كمؤشر على إساءة الاستخدام المحتملة إذا كانت القيمة أكبر من المتوسط بعدة مراتب.
-
validated_attested_entity
-
الكيان الذي تم إثبات صحته هو سلسلة تصف نوع الجهاز الذي أكّد خادم التزويد أنّه تم إثبات صحته. على سبيل المثال،
STRONG_BOX
أوTEE
.
مفاتيح المصادقة
يتم توفير مفتاحَين، أحدهما RSA والآخر ECDSA، وسلاسل الشهادات المقابلة لهما بشكل آمن على الجهاز.
يتيح نظام التشغيل Android 12 ميزة "توفير المفاتيح عن بُعد"، ويتطلّب نظام التشغيل Android 13 أن تنفّذ الأجهزة هذه الميزة. توفّر خدمة "توفير المفاتيح عن بُعد" للأجهزة الميدانية شهادات إثبات صحة ECDSA P256 لكل تطبيق. وتكون مدة صلاحية هذه الشهادات أقصر من مدة صلاحية الشهادات التي تم توفيرها في المصنع.
المعرّف الفريد
المعرّف الفريد هو قيمة 128 بت تحدّد الجهاز، ولكن لفترة زمنية محدودة فقط. يتم احتساب القيمة باستخدام:
HMAC_SHA256(T || C || R, HBK)
المكان:
T
هي "قيمة العداد الزمني"، ويتم احتسابها عن طريق قسمة قيمةTag::CREATION_DATETIME
على 2592000000، مع تجاهل أي باقي. يتغيّرT
كل 30 يومًا (2592000000 = 30 * 24 * 60 * 60 * 1000).C
هي قيمةTag::APPLICATION_ID
- تكون قيمة
R
هي 1 إذا كانTag::RESET_SINCE_ID_ROTATION
متوفّرًا في المَعلمة attest_params عند طلب attest_key، أو 0 إذا لم تكن العلامة متوفّرة. -
HBK
هو سرّ فريد مرتبط بالأجهزة ولا يمكن لبيئة التنفيذ الموثوقة الكشف عنه أبدًا. يحتوي السر على 128 بت على الأقل من البيانات العشوائية وهو فريد لكل جهاز (يمكن قبول الفرادة الاحتمالية بالنظر إلى 128 بت من البيانات العشوائية). يجب أن يتم اشتقاق HBK من مواد المفاتيح المدمجة عبر HMAC أو AES_CMAC.
يجب اقتطاع ناتج HMAC_SHA256 إلى 128 بت.
أرقام IMEI المتعددة
يضيف نظام Android 14 إمكانية استخدام أرقام IMEI متعددة في سجل "إثبات صحة مفتاح Android". يمكن لمصنّعي المعدات الأصلية تنفيذ هذه الميزة من خلال إضافة علامة KeyMint لرمز IMEI ثانٍ. أصبح من الشائع بشكل متزايد أن تحتوي الأجهزة على أجهزة راديو خلوية متعددة، ويمكن لمصنّعي المعدات الأصلية الآن توفير أجهزة برقمَي IMEI.
على مصنّعي المعدات الأصلية توفير رقم IMEI ثانوي، إذا كان متوفّرًا على أجهزتهم، ليتم توفيره لعمليات تنفيذ KeyMint، حتى تتمكّن عمليات التنفيذ هذه من إثبات صحة الرقم بالطريقة نفسها التي يتم بها إثبات صحة رقم IMEI الأول.
إثبات الهوية
يتضمّن الإصدار 8.0 من نظام التشغيل Android إمكانية تفعيل ميزة "إثبات صحة المعرّف" للأجهزة التي تعمل بالإصدار 3 من Keymaster. تتيح خدمة إثبات صحة المعرّف للجهاز تقديم دليل على معرّفات الأجهزة، مثل الرقم التسلسلي أو رقم IMEI. على الرغم من أنّها ميزة اختيارية، ننصح بشدة بأن تتوافق جميع عمليات تنفيذ Keymaster 3 معها، لأنّ إمكانية إثبات هوية الجهاز تتيح حالات استخدام، مثل الإعداد عن بُعد بدون أي تدخل وبشكل أكثر أمانًا (لأنّ الجهة البعيدة يمكنها التأكّد من أنّها تتواصل مع الجهاز الصحيح، وليس جهازًا ينتحل هوية جهاز آخر).
تعمل ميزة "إثبات صحة المعرّف" من خلال إنشاء نُسخ من معرّفات أجهزة الجهاز لا يمكن الوصول إليها إلا من خلال بيئة التنفيذ الموثوقة (TEE) قبل مغادرة الجهاز المصنع. يمكن للمستخدم فتح برنامج تحميل التشغيل على الجهاز وتغيير برنامج النظام والمعرّفات التي تعرضها إطارات عمل Android. لا يمكن التلاعب بنسخ المعرّفات التي يحتفظ بها بيئة التنفيذ الموثوقة بهذه الطريقة، ما يضمن أنّ مصادقة رقم تعريف الجهاز لا تصادق إلا على معرّفات الجهاز الأصلية، وبالتالي إحباط محاولات الانتحال.
تستند مساحة واجهة برمجة التطبيقات الرئيسية الخاصة بإثبات صحة المعرّف إلى آلية إثبات صحة المفتاح الحالية التي تم تقديمها مع Keymaster 2. عند طلب شهادة إثبات صحة لمفتاح يحتفظ به Keymaster، يمكن للجهة الطالبة أن تطلب تضمين معرّفات الجهاز في بيانات شهادة إثبات الصحة الوصفية. إذا كان المفتاح مخزّنًا في بيئة التنفيذ الموثوقة (TEE)، يتم ربط سلاسل الشهادات بجذر موثوق معروف. يمكن لمستلم هذه الشهادة التحقّق من أنّ الشهادة ومحتواها، بما في ذلك معرّفات الأجهزة، قد تمت كتابتها بواسطة بيئة التنفيذ الموثوقة (TEE). عندما يُطلب تضمين معرّفات الأجهزة في شهادة التصديق، لا يصدّق بيئة التنفيذ الموثوقة إلا على المعرّفات المخزّنة فيها، كما تمّت تعبئتها في المصنع.
خصائص مساحة التخزين
يجب أن تتضمّن مساحة التخزين التي تحتوي على معرّفات الجهاز الخصائص التالية:
- يتم نسخ القيم المستمدّة من المعرّفات الأصلية للجهاز إلى مساحة التخزين قبل مغادرة الجهاز للمصنع.
- يمكن أن تؤدي طريقة
destroyAttestationIds()
إلى إتلاف هذه النسخة من البيانات المستندة إلى المعرّف نهائيًا. يعني التلف الدائم إزالة البيانات بالكامل، وبالتالي لا يمكن استعادتها من خلال إعادة الضبط على الإعدادات الأصلية أو أي إجراء آخر يتم تنفيذه على الجهاز. ويكون ذلك مهمًا بشكل خاص للأجهزة التي فتح فيها المستخدم برنامج تحميل التشغيل وغير برنامج النظام وعدّل المعرّفات التي تعرضها إطارات عمل Android. - يجب أن تتوفّر في مرافق RMA إمكانية إنشاء نُسخ جديدة من البيانات المستندة إلى معرّف الجهاز. بهذه الطريقة، يمكن لجهاز تم إرساله إلى مركز RMA إجراء عملية إثبات صحة المعرّف مرة أخرى. يجب حماية الآلية التي تستخدمها مرافق إعادة السلع، وذلك لكي لا يتمكّن المستخدمون من تشغيلها بأنفسهم، لأنّ ذلك سيسمح لهم بالحصول على شهادات مصادقة لأرقام تعريف مزيّفة.
- لا يمكن لأي رمز برمجي آخر غير تطبيق Keymaster الموثوق في بيئة التنفيذ الموثوقة (TEE) قراءة البيانات المستندة إلى المعرّف والمخزّنة.
- التخزين مقاوم للتلاعب: إذا تم تعديل محتوى التخزين، سيتعامل معه TEE كما لو تم إتلاف نُسخ المحتوى، وسيرفض جميع محاولات إثبات صحة المستندات التعريفية. ويتم ذلك من خلال توقيع أو إنشاء رمز مصادقة الرسائل (MAC) للتخزين كما هو موضّح أدناه.
- لا تحتوي وحدة التخزين على المعرّفات الأصلية. بما أنّ عملية إثبات صحة المعرّف تتضمّن اختبارًا، يقدّم المتّصل دائمًا المعرّفات المطلوب إثبات صحتها. كل ما على بيئة التنفيذ الموثوقة هو التحقّق من تطابق هذه القيم مع القيم التي كانت متوفّرة في الأصل. ويتم إتاحة عملية التحقّق هذه من خلال تخزين قيم تجزئة آمنة للقيم الأصلية بدلاً من القيم.
أشغال
لإنشاء عملية تنفيذ تتضمّن السمات المذكورة أعلاه، خزِّن القيم المشتقة من المعرّف في بنية S التالية. لا تخزِّن نُسخًا أخرى من قيم المعرّف، باستثناء المواضع العادية في النظام التي يمكن لمالك الجهاز تعديلها من خلال الوصول إلى الجذر:
S = D || HMAC(HBK, D)
where:
D = HMAC(HBK, ID1) || HMAC(HBK, ID2) || ... || HMAC(HBK, IDn)
HMAC
هي بنية HMAC مع تجزئة آمنة مناسبة (يُنصح باستخدام SHA-256)-
HBK
هو مفتاح مرتبط بالجهاز ولا يُستخدم لأي غرض آخر -
ID1...IDn
هي قيم المعرّفات الأصلية؛ ويعتمد ربط قيمة معيّنة بمؤشر معيّن على التنفيذ، إذ إنّ عدد المعرّفات يختلف من جهاز إلى آخر - يمثّل
||
التسلسل
بما أنّ نواتج HMAC ذات حجم ثابت، لا يلزم توفير عناوين أو بنية أخرى للعثور على تجزئات المعرّفات الفردية أو HMAC الخاص بـ D. بالإضافة إلى التحقّق من القيم المقدَّمة لإجراء عملية التصديق، يجب أن تتحقّق عمليات التنفيذ من صحة S من خلال استخراج D من S، واحتساب HMAC(HBK, D) ومقارنته بالقيمة في S للتأكّد من عدم تعديل أو إتلاف أي أرقام تعريف فردية. بالإضافة إلى ذلك، يجب أن تستخدم عمليات التنفيذ مقارنات بوقت ثابت لجميع عناصر المعرّف الفردية والتحقّق من صحة S. يجب أن يكون وقت المقارنة ثابتًا بغض النظر عن عدد أرقام التعريف المقدَّمة والمطابقة الصحيحة لأي جزء من الاختبار.
معرّفات الأجهزة
تتيح خدمة "إثبات صحة المستند التعريفي" استخدام معرّفات الأجهزة التالية:
- اسم العلامة التجارية، كما يتم عرضه من خلال
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) لشهادة المصادقة الصادرة، باستخدام المخطط أعلاه. تم تمييز التغييرات عن مخطط شهادة Keymaster 2 بالخط العريض، مع إضافة تعليقات.
واجهة برمجة تطبيقات جافا
هذا القسم مخصّص لتقديم المعلومات فقط. لا ينفّذ مطوّرو Keymaster واجهة برمجة التطبيقات Java API ولا يستخدمونها. يتم توفير ذلك لمساعدة المطوّرين على فهم كيفية استخدام التطبيقات لهذه الميزة. قد تستخدم مكونات النظام هذه المعلومات بشكل مختلف، ولهذا السبب من المهم عدم التعامل مع هذا القسم على أنّه إلزامي.