دوال KeyMint

تقدِّم هذه الصفحة تفاصيل وإرشادات إضافية لمساعدة مُنفِّذِي طبقة HAL (للتضمين التجريبي للأجهزة) في KeyMint. المستندات الأساسية لملف برمجة التطبيقات HAL هي مواصفات واجهة IDELLMeg.

إساءة استخدام واجهة برمجة التطبيقات

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

تقع على عاتق التطبيقات والإطار الأساسي و"متجر مفاتيح Android" مهمة ضمان أن تكون طلبات وحدات KeyMint منطقية ومفيدة.

نقطة دخول addRngEntropy

تُضيف نقطة الدخول addRngEntropy معلومات عشوائية يقدّمها المُتصل إلى المجموعة التي يستخدمها تنفيذ KeyMint لإنشاء أرقام عشوائية للمفاتيح وأرقام البدء.

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

السمات الرئيسية

تُعرِض كل آلية من آليات إنشاء مفاتيح KeyMint‏ (generateKey وimportKey وimportWrappedKey) خصائص المفتاح الذي تم إنشاؤه حديثًا، مقسّمة بشكل مناسب إلى مستويات الأمان التي تفرض كل خاصيّة. تشمل الخصائص المعروضة جميع المَعلمات المحدّدة لإنشاء المفاتيح، باستثناء Tag::APPLICATION_ID وTag::APPLICATION_DATA. في حال تضمين هذه العلامات في مَعلمات المفاتيح، تتم إزالتها من السمات المعروضة لكي لا يكون من الممكن العثور على قيمها من خلال examining the returned keyblob. ومع ذلك، تكون هذه القيم مرتبطة بشكل تشفير بملف keyblob، بحيث لا يتم استخدام المفتاح إذا لم يتم تقديم القيم الصحيحة عند استخدامه. وبالمثل، يتم ربط Tag::ROOT_OF_TRUST بالمفتاح من خلال التشفير، ولكن لا يمكن تحديده أثناء إنشاء المفتاح أو استيراده ولا يتم إرجاعه مطلقًا.

بالإضافة إلى العلامات المقدَّمة، يؤدي تنفيذ KeyMint أيضًا إلى إضافة Tag::ORIGIN، ما يشير إلى طريقة إنشاء المفتاح (KeyOrigin::GENERATED أو KeyOrigin::IMPORTED أو KeyOrigin::SECURELY_IMPORTED).

الحماية من العودة إلى الحالة السابقة

يُشار إلى ميزة مقاومة إعادة الرجوع بالرمز Tag::ROLLBACK_RESISTANCE، ويعني ذلك أنّه بعد حذف مفتاح باستخدام deleteKey أو deleteAllKeys، تضمن الأجهزة الآمنة عدم إمكانية استخدامه مرة أخرى.

تُعيد عمليات تنفيذ KeyMint مادة المفتاح التي تم إنشاؤها أو استيرادها إلى المُدخِل كمجموعة مفاتيح، وهي نموذج مشفَّر وموثَّق. عندما يحذف Keystore مجموعة مفاتيح التشفير، يتم فقدان المفتاح، ولكن يمكن لمهاجم سبق له retrieving استرداد مادة المفتاح استعادتها على الجهاز.

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

الإطلاق

تبدأ نقطة دخول begin() عملية تشفير باستخدام المفتاح المحدّد، وذلك لغرض محدّد، مع المَعلمات المحدّدة (حسب مقتضى الحال). ويعرض الإجراء IKeyMintOperation عنصر Binder جديدًا يُستخدَم لإكمال العملية. بالإضافة إلى ذلك، يتم عرض قيمة تحدٍّ تُستخدَم كجزء من رمز المصادقة في العمليات المصادق عليها.

يتيح تنفيذ KeyMint إجراء 16 عملية متزامنة على الأقل. يستخدم Keystore ما يصل إلى 15 مفتاحًا، ويترك مفتاحًا واحدًا vold لاستخدامه في تشفير كلمة المرور. عندما يكون لدى Keystore 15 عملية جارية (تم استدعاء begin()، ولكن لم يتم استدعاء finish أو abort) ويتلقّى طلبًا لبدء العملية رقم 16، يستدعي 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 المفتاح
  • للتحقّق من أنّ الرمز المميّز يحتوي على قيمة طلب التحقّق للعملية الحالية في حقل challenge.

في حال عدم استيفاء هذه الشروط، يعرض KeyMintErrorCode::KEY_USER_NOT_AUTHENTICATED.

يقدّم المتصل الرمز المميّز للمصادقة في كل مكالمة إلى update() و finish(). يمكن لعملية التنفيذ التحقّق من الرمز المميّز مرة واحدة فقط.