نسخه اتصال

همه کلیدهای KeyMint باید به ریشه اعتماد دستگاه متصل باشند. ریشه اعتماد یک رشته بیتی است که از کلید عمومی استفاده‌شده برای تأیید امضای تصویر راه‌اندازی به‌همراه وضعیت قفل راه‌انداز سیستم مشتق شده است.

کلیدهای KeyMint باید به نسخه سیستم‌عامل و سطح وصله دستگاه نیز محدود شوند. برای پشتیبانی از ساختار مدولار Treble، این اتصال نسخه شامل سطوح وصله جداگانه برای هر پارتیشن است (boot، system، و vendor). این امر اجازه می‌دهد هر پارتیشن به‌طور مستقل به‌روز شود، درحالی‌که همچنان محافظت دربرابر بازگشت به نسخه قبلی را ارائه می‌دهد.

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

  • دستگاه‌های دارای «راه‌اندازی درستی‌سنجی‌شده Android»‏ (AVB):
    • سطوح وصله و نسخه سیستم‌عامل می‌توانند در vbmeta.img گنجانده شوند تا راه‌انداز سیستم بتواند آن‌ها را به KeyMint ارائه دهد.
    • برای پارتیشن‌های زنجیره‌ای، اطلاعات نسخه پارتیشن در VBMeta زنجیره‌ای است.
    • به‌طور کلی، اطلاعات نسخه باید در VBMeta struct که حاوی داده‌های درستی‌سنجی (درهم‌سازی یا درخت درهم‌سازی) برای پارتیشن موردنظر است قرار داشته باشد.
  • دستگاه‌های بدون AVB:
    • پیاده‌سازی‌های «راه‌اندازی درستی‌سنجی‌شده» باید درهم‌سازی فراداده نسخه را به bootloader ارائه دهند تا bootloader بتواند درهم‌سازی را به KeyMint ارائه دهد.
    • boot.img می‌تواند به ذخیره کردن سطوح وصله در سرصفحه ادامه دهد.
    • system.img می‌تواند به ذخیره کردن سطوح وصله و نسخه سیستم‌عامل در ویژگی‌های فقط خواندنی ادامه دهد.
    • ‫vendor.img سطح وصله را در ویژگی فقط خواندنی ro.vendor.build.version.security_patch ذخیره می‌کند.
    • راه‌انداز سیستم می‌تواند درهم‌سازی همه داده‌های معتبرشده توسط «راه‌اندازی درستی‌سنجی‌شده» را به KeyMint ارائه دهد.

برچسب‌های زیر اطلاعات نسخه را برای پارتیشن‌های مربوطه شرح می‌دهند:

پیاده‌سازی‌های KeyMint باید با همه سطوح وصله به‌طور مستقل رفتار کنند. اگر همه اطلاعات نسخه با مقادیر مرتبط با کلید مطابقت داشته باشد، کلیدها قابل‌استفاده هستند. اگر نسخه فعلی دستگاه جدیدتر از هر مقدار مرتبط با کلید باشد، KeyMint در هر تلاشی برای استفاده از کلید، خطای KEY_REQUIRES_UPGRADE را برمی‌گرداند. سپس Keystore IKeyMintDevice::upgradeKey را اجرا می‌کند تا keyblob جدیدی تولید کند که به سطوح وصله فعلی محدود است (و Keystore متعاقباً keyblob قبلی را با فراخوانی IKeyMintDevice::deleteKey حذف می‌کند).