تقدّم هذه الصفحة تفاصيل وإرشادات إضافية لمساعدة مطوّري طبقة تجريد الأجهزة (HAL) في KeyMint. المستندات الأساسية الخاصة بطبقة HAL هي مواصفات واجهة AIDL.
إساءة استخدام واجهة برمجة التطبيقات
يمكن للمتصلين إنشاء مفاتيح KeyMint مع تفويضات صالحة كمعلمات لواجهة برمجة التطبيقات، ولكنها تجعل المفاتيح الناتجة غير آمنة أو غير قابلة للاستخدام. ليس مطلوبًا أن تفشل عمليات تنفيذ KeyMint في مثل هذه الحالات أو أن تصدر بيانات تشخيصية. يجب ألا يتم تشخيص الحالات التالية من خلال عمليات التنفيذ: استخدام مفاتيح صغيرة جدًا، أو تحديد مَعلمات إدخال غير ذات صلة، أو إعادة استخدام متجهات التهيئة أو الأرقام العشوائية، أو إنشاء مفاتيح بدون أغراض (وبالتالي عديمة الفائدة)، وما شابه ذلك.
وتتحمّل التطبيقات وإطار العمل وAndroid Keystore مسؤولية ضمان أن تكون طلبات وحدات KeyMint منطقية ومفيدة.
نقطة الدخول addRngEntropy
تضيف نقطة الدخول addRngEntropy
العشوائية التي يوفّرها المتصل إلى مجموعة البيانات العشوائية التي تستخدمها عملية تنفيذ KeyMint لإنشاء أرقام عشوائية للمفاتيح ومتجهات التهيئة.
يجب أن تدمج عمليات تنفيذ KeyMint بشكل آمن العشوائية المقدَّمة في مجموعة العشوائية، والتي يجب أن تحتوي أيضًا على عشوائية تم إنشاؤها داخليًا من مولّد أرقام عشوائية للأجهزة. يجب التعامل مع عملية الدمج بطريقة لا تمنح المهاجم الذي يتحكّم بشكل كامل في البتات المقدَّمة من addRngEntropy
أو البتات التي تم إنشاؤها بواسطة الأجهزة (وليس كليهما) أفضلية كبيرة في توقّع البتات التي تم إنشاؤها من مجموعة الإنتروبيا.
الخصائص الرئيسية
تعرض كل آلية من الآليات (generateKey
وimportKey
وimportWrappedKey
) التي تنشئ مفاتيح KeyMint خصائص المفتاح الذي تم إنشاؤه حديثًا، ويتم تقسيمها بشكل مناسب إلى مستويات الأمان التي تفرض كل خاصية. تتضمّن الخصائص التي يتم عرضها جميع المَعلمات المحدّدة لإنشاء المفتاح، باستثناء Tag::APPLICATION_ID
وTag::APPLICATION_DATA
.
إذا تم تضمين هذه العلامات في المَعلمات الرئيسية، ستتم إزالتها من الخصائص التي يتم عرضها، وبالتالي لن يكون من الممكن العثور على قيمها من خلال فحص keyblob المعروض. ومع ذلك، يتم ربطها بشكل مشفّر بملف keyblob، وبالتالي إذا لم يتم تقديم القيم الصحيحة عند استخدام المفتاح، سيتعذّر استخدامه. وبالمثل،
Tag::ROOT_OF_TRUST
مرتبط
بالمفتاح بشكل مشفّر، ولكن لا يمكن تحديده أثناء
إنشاء المفتاح أو استيراده ولا يتم عرضه أبدًا.
بالإضافة إلى العلامات المقدَّمة، يضيف تنفيذ KeyMint أيضًا العلامة Tag::ORIGIN
، ما يشير إلى الطريقة التي تم بها إنشاء المفتاح (KeyOrigin::GENERATED
أو KeyOrigin::IMPORTED
أو KeyOrigin::SECURELY_IMPORTED
).
الحماية من العودة إلى الحالة السابقة
يتم الإشارة إلى مقاومة العودة إلى الإصدارات السابقة باستخدام Tag::ROLLBACK_RESISTANCE
،
وهي تعني أنّه بعد حذف مفتاح باستخدام deleteKey
أو deleteAllKeys
، يضمن الجهاز الآمن
عدم إمكانية استخدامه مرة أخرى.
تعرض عمليات تنفيذ KeyMint مواد المفاتيح التي تم إنشاؤها أو استيرادها إلى المتصل في شكل keyblob، وهو شكل مشفّر ومصدّق. عندما تحذف خدمة Keystore ملف keyblob، تتم إزالة المفتاح، ولكن يمكن للمهاجم الذي تمكّن سابقًا من استرداد مادة المفتاح أن يعيدها إلى الجهاز.
يكون المفتاح مقاومًا لعمليات الرجوع إذا كان الجهاز الآمن يضمن عدم إمكانية استعادة المفاتيح المحذوفة لاحقًا. ويتم ذلك عادةً من خلال تخزين بيانات وصفية إضافية للمفتاح في مكان موثوق لا يمكن للمهاجم التلاعب به. على الأجهزة الجوّالة، تكون الآلية المستخدَمة لذلك عادةً هي وحدات ذاكرة محمية من إعادة التشغيل (RPMB). بما أنّ عدد المفاتيح التي يمكن إنشاؤها غير محدود بشكل أساسي، وقد تكون مساحة التخزين الموثوقة المستخدَمة للحماية من الرجوع إلى إصدار أقدم محدودة الحجم، قد يتعذّر على عملية التنفيذ تلبية طلبات إنشاء مفاتيح محمية من الرجوع إلى إصدار أقدم عندما تكون مساحة التخزين ممتلئة.
الإطلاق
تبدأ نقطة الدخول begin()
عملية تشفير باستخدام المفتاح المحدّد، وللغرض المحدّد، مع المَعلمات المحدّدة (حسب الاقتضاء). تعرض هذه الطريقة IKeyMintOperation
كائن Binder جديدًا
يُستخدم لإكمال العملية. بالإضافة إلى ذلك، يتم عرض قيمة تحدّي
تُستخدَم كجزء من رمز المصادقة في العمليات التي تمت المصادقة عليها.
يتيح تنفيذ KeyMint إجراء 16 عملية متزامنة على الأقل. يستخدم Keystore ما يصل إلى 15 مفتاحًا، ويترك مفتاحًا واحدًا لتستخدمه vold
في تشفير كلمات المرور. عندما يكون هناك 15 عملية قيد التقدّم في Keystore (تم استدعاء begin()
، ولكن لم يتم استدعاء finish
أو abort
)، ويتلقّى طلبًا لبدء عملية سادسة عشرة، يتم استدعاء abort()
في العملية الأقل استخدامًا لتقليل عدد العمليات النشطة إلى 14 قبل استدعاء begin()
لبدء العملية المطلوبة حديثًا.
في حال تحديد Tag::APPLICATION_ID
أو Tag::APPLICATION_DATA
أثناء إنشاء المفتاح أو استيراده، يجب أن تتضمّن طلبات begin()
هذه العلامات مع القيم المحدّدة في الأصل في
الوسيطة params
لهذه الطريقة.
معالجة الأخطاء
إذا عرضت إحدى الطرق في IKeyMintOperation
رمز خطأ غير ErrorCode::OK
، يتم إلغاء العملية ويصبح عنصر Binder الخاص بالعملية غير صالح. سيؤدي أي استخدام مستقبلي للكائن إلى عرض ErrorCode::INVALID_OPERATION_HANDLE
.
فرض التفويض
يتم تنفيذ فرض تفويض المفتاح بشكل أساسي في begin()
. الاستثناء الوحيد هو الحالة التي يحتوي فيها المفتاح على قيمة واحدة أو أكثر من قيم Tag::USER_SECURE_ID
، ولا يحتوي على قيمة Tag::AUTH_TIMEOUT
.
في هذه الحالة، يتطلّب المفتاح تفويضًا لكل عملية، وتتلقّى الطريقتان update()
أو finish()
رمزًا مميزًا للتفويض في الوسيطة authToken
. لضمان صلاحية الرمز المميّز، يجب أن يتضمّن تنفيذ KeyMint ما يلي:
- تتحقّق هذه السمة من توقيع HMAC على رمز المصادقة المميّز.
- يتحقّق من أنّ الرمز المميّز يحتوي على معرّف مستخدم آمن يطابق معرّفًا مرتبطًا بالمفتاح.
- يتحقّق من أنّ نوع المصادقة للرمز المميّز يتطابق مع
Tag::USER_AUTH_TYPE
للمفتاح. - للتحقّق من أنّ الرمز المميّز يحتوي على قيمة التحقّق من الصحة للعملية الحالية في حقل التحقّق من الصحة.
في حال عدم استيفاء هذه الشروط، تعرض KeyMint الرمز ErrorCode::KEY_USER_NOT_AUTHENTICATED
.
يقدّم المتصل رمز المصادقة المميز إلى كل مكالمة يتم إجراؤها إلى update()
وfinish()
. يمكن أن تتحقّق عملية التنفيذ من صحة الرمز المميّز مرة واحدة فقط.