توابع KeyMint

این صفحه جزئیات و دستورالعمل‌های بیشتری را برای کمک به پیاده‌سازی‌کنندگان لایه انتزاعی سخت‌افزار KeyMint (HAL) ارائه می‌دهد. مستندات اصلی HAL، مشخصات رابط AIDL است.

سوءاستفاده از API

تماس‌گیرندگان می‌توانند کلیدهای KeyMint را با مجوزهایی ایجاد کنند که به عنوان پارامترهای API معتبر هستند، اما کلیدهای حاصل را ناامن یا غیرقابل استفاده می‌کنند. پیاده‌سازی‌های KeyMint در چنین مواردی نیازی به شکست یا صدور تشخیص ندارند. استفاده از کلیدهای خیلی کوچک، تعیین پارامترهای ورودی نامربوط، استفاده مجدد از IVها یا nonces، تولید کلیدهای بدون هدف (بنابراین بی‌فایده) و موارد مشابه نباید توسط پیاده‌سازی‌ها تشخیص داده شوند.

این مسئولیت برنامه‌ها، چارچوب و Android Keystore است که اطمینان حاصل کنند فراخوانی‌های ماژول‌های KeyMint معقول و مفید هستند.

نقطه ورود addRngEntropy

نقطه ورودی addRngEntropy ، آنتروپی ارائه شده توسط فراخواننده را به مخزنی که توسط پیاده‌سازی KeyMint برای تولید اعداد تصادفی، برای کلیدها و IVها استفاده می‌شود، اضافه می‌کند.

پیاده‌سازی‌های 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 کلیدblob را حذف می‌کند، کلید از بین می‌رود، اما مهاجمی که قبلاً موفق به بازیابی کلید شده است، می‌تواند آن را به دستگاه بازگرداند.

یک کلید در صورتی مقاوم به بازگشت به عقب است که سخت‌افزار امن تضمین کند کلیدهای حذف‌شده بعداً قابل بازیابی نیستند. این کار عموماً با ذخیره فراداده‌های کلید اضافی در یک مکان قابل اعتماد که توسط مهاجم قابل دستکاری نباشد، انجام می‌شود. در دستگاه‌های تلفن همراه، مکانیسم مورد استفاده برای این کار معمولاً بلوک‌های حافظه محافظت‌شده با بازپخش (RPMB) است. از آنجا که تعداد کلیدهایی که می‌توانند ایجاد شوند اساساً نامحدود است و فضای ذخیره‌سازی قابل اعتماد مورد استفاده برای مقاومت به بازگشت به عقب ممکن است از نظر اندازه محدود باشد، پیاده‌سازی می‌تواند درخواست‌های ایجاد کلیدهای مقاوم به بازگشت به عقب را در صورت پر شدن فضای ذخیره‌سازی، با شکست مواجه کند.

شروع

نقطه ورودی begin() یک عملیات رمزنگاری را با استفاده از کلید مشخص شده، برای هدف مشخص شده، با پارامترهای مشخص شده (به صورت مناسب) آغاز می‌کند. این تابع یک شیء IKeyMintOperation Binder جدید را برمی‌گرداند که برای تکمیل عملیات استفاده می‌شود. علاوه بر این، یک مقدار چالش (challenge value) برگردانده می‌شود که به عنوان بخشی از توکن احراز هویت در عملیات احراز هویت شده استفاده می‌شود.

یک پیاده‌سازی KeyMint حداقل از ۱۶ عملیات همزمان پشتیبانی می‌کند. Keystore تا ۱۵ عملیات را استفاده می‌کند و یکی را برای vold باقی می‌گذارد تا برای رمزگذاری رمز عبور استفاده شود. وقتی Keystore ۱۵ عملیات در حال انجام دارد ( begin() فراخوانی شده است، اما finish یا abort فراخوانی نشده‌اند) و درخواستی برای شروع عملیات شانزدهم دریافت می‌کند، abort() را روی عملیاتی که اخیراً کمتر استفاده شده است فراخوانی می‌کند تا تعداد عملیات فعال را به ۱۴ کاهش دهد و سپس begin() را برای شروع عملیات درخواستی جدید فراخوانی می‌کند.

اگر Tag::APPLICATION_ID یا Tag::APPLICATION_DATA در طول تولید یا وارد کردن کلید مشخص شده باشند، فراخوانی‌های begin() باید آن تگ‌ها را با مقادیر مشخص‌شده‌ی اولیه در آرگومان params این متد لحاظ کنند.

مدیریت خطا

اگر متدی در IKeyMintOperation کد خطایی غیر از ErrorCode::OK برگرداند، عملیات لغو شده و شیء operation Binder نامعتبر می‌شود. هرگونه استفاده بعدی از این شیء ErrorCode::INVALID_OPERATION_HANDLE را برمی‌گرداند.

اجرای مجوز

اجرای مجوز کلید عمدتاً در begin() انجام می‌شود. تنها استثنا موردی است که کلید دارای یک یا چند مقدار Tag::USER_SECURE_ID باشد و مقدار Tag::AUTH_TIMEOUT نداشته باشد.

در این حالت، کلید برای هر عملیات نیاز به مجوز دارد و متدهای update() یا finish() یک توکن auth در آرگومان authToken دریافت می‌کنند. برای اطمینان از معتبر بودن توکن، پیاده‌سازی KeyMint به صورت زیر است:

  • امضای HMAC روی توکن احراز هویت را تأیید می‌کند.
  • بررسی می‌کند که توکن حاوی یک شناسه کاربری امن است که با شناسه مرتبط با کلید مطابقت دارد.
  • بررسی می‌کند که نوع احراز هویت توکن با Tag::USER_AUTH_TYPE کلید مطابقت داشته باشد.
  • بررسی می‌کند که توکن حاوی مقدار چالش برای عملیات فعلی در فیلد چالش باشد.

اگر این شرایط برقرار نباشند، KeyMint ErrorCode::KEY_USER_NOT_AUTHENTICATED را برمی‌گرداند.

فراخواننده، توکن احراز هویت را برای هر فراخوانی update() و finish() ارائه می‌دهد. پیاده‌سازی می‌تواند توکن را فقط یک بار اعتبارسنجی کند.