نسخه صحافی

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

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

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

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

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

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