所有 KeyMint 金鑰都必須繫結至裝置的信任根。信任根是由公開金鑰衍生的位元字串,用於驗證開機映像檔的簽章,以及開機載入程式鎖定狀態。
KeyMint 金鑰也必須繫結至裝置的作業系統版本和修補程式等級。為支援 Treble 的模組化結構,這個版本繫結包含每個分區 (boot、system 和 vendor) 的個別修補程式等級。這樣一來,每個分區都能獨立更新,同時仍提供復原保護。
如要實作這個版本繫結,KeyMint 可信任應用程式 (TA) 必須能安全地接收目前的 OS 版本和修補程式等級,並確保收到的資訊與執行中系統的所有資訊相符。
- 支援 Android 驗證開機程序 (AVB) 的裝置:
- 修補程式等級和 OS 版本可包含在
vbmeta.img中,因此系統啟動載入程式可將這些資訊提供給 KeyMint。 - 如果是鏈結分區,分區的版本資訊會位於鏈結的 VBMeta 中。
- 一般來說,版本資訊應位於
VBMeta struct中,其中包含特定分區的驗證資料 (雜湊或雜湊樹)。
- 修補程式等級和 OS 版本可包含在
- 不支援 AVB 的裝置:
- 驗證開機程序實作項目必須向系統啟動載入程式提供版本中繼資料的雜湊,系統啟動載入程式才能將雜湊提供給 KeyMint。
boot.img可繼續在標頭中儲存修補程式等級。system.img可以繼續將修補程式等級和 OS 版本儲存在唯讀屬性中。vendor.img會將修補程式層級儲存在唯讀屬性ro.vendor.build.version.security_patch中。- 系統啟動載入程式可將驗證開機程序驗證的所有資料雜湊提供給 KeyMint。
下列標記說明相關分區的版本資訊:
Tag::VENDOR_PATCHLEVEL:vendor分區Tag::BOOT_PATCHLEVEL:boot分區Tag::OS_PATCHLEVEL和Tag::OS_VERSION:system分區;Tag::OS_VERSION已從boot.img標頭中移除
KeyMint 實作項目應獨立處理所有修補程式等級。如果所有版本資訊都與金鑰相關聯的值相符,則金鑰可供使用。如果目前的裝置版本比與金鑰相關聯的任何值還要新,則 KeyMint 會在嘗試使用金鑰時傳回 KEY_REQUIRES_UPGRADE 錯誤。接著,Keystore 會執行 IKeyMintDevice::upgradeKey,產生繫結至目前修補程式等級的新金鑰 blob (Keystore 隨後會呼叫 IKeyMintDevice::deleteKey 刪除先前的金鑰 blob)。