همه کلیدهای 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 ارائه دهد.
تگ های زیر اطلاعات نسخه پارتیشن های مربوطه را توضیح می دهند:
-
Tag::VENDOR_PATCHLEVEL
: پارتیشنvendor
-
Tag::BOOT_PATCHLEVEL
: پارتیشنboot
-
Tag::OS_PATCHLEVEL
وOS_VERSION
: پارتیشنsystem
. (OS_VERSION
از هدرboot.img
حذف شده است.)
پیادهسازیهای KeyMint باید تمام سطوح پچ را بهطور مستقل بررسی کنند. اگر تمام اطلاعات نسخه با مقادیر مرتبط با یک کلید مطابقت داشته باشد، کلیدها قابل استفاده هستند. اگر نسخه فعلی دستگاه جدیدتر از هر مقدار مرتبط با یک کلید باشد، KeyMint در هر تلاشی برای استفاده از کلید، خطای KEY_REQUIRES_UPGRADE
را برمیگرداند. سپس Keystore IKeyMintDevice::upgradeKey()
را برای تولید یک صفحه کلید جدید که به سطوح وصله فعلی محدود شده است را انجام می دهد (و Keystore متعاقباً با فراخوانی به IKeyMintDevice::deleteKey()
) صفحه کلید قبلی را حذف می کند.