คีย์ทั้งหมดใน KeyMint ต้องผูกอยู่กับรูทของความน่าเชื่อถือสำหรับอุปกรณ์ รูทของความน่าเชื่อถือคือสตริงบิตที่มาจากคีย์สาธารณะที่ใช้เพื่อยืนยันลายเซ็นของภาพการบูต พร้อมกับสถานะการล็อกของบูตโหลดเดอร์
นอกจากนี้ คีย์ KeyMint ยังต้องเชื่อมโยงกับเวอร์ชันระบบปฏิบัติการและระดับแพตช์ของอุปกรณ์ด้วย การเชื่อมโยงเวอร์ชันนี้รองรับโครงสร้างโมดูลของ Treble โดยจะมีระดับแพตช์แยกต่างหากสำหรับแต่ละพาร์ติชัน (boot
, system
และ vendor
) ซึ่งช่วยให้อัปเดตแต่ละพาร์ติชันได้อย่างอิสระ ทั้งยังให้การปกป้องการย้อนกลับด้วย
หากต้องการใช้การเชื่อมโยงเวอร์ชันนี้ แอปที่เชื่อถือได้ของ KeyMint (TA) ต้องมีวิธีรับเวอร์ชันปัจจุบันของระบบปฏิบัติการและระดับแพตช์อย่างปลอดภัย รวมถึงตรวจสอบว่าข้อมูลที่รับนั้นตรงกับข้อมูลทั้งหมดเกี่ยวกับระบบที่ใช้งานอยู่
- อุปกรณ์ที่มี Android Verified Boot (AVB)
- ระดับแพตช์และเวอร์ชันของระบบปฏิบัติการสามารถรวมไว้ใน
vbmeta.img
เพื่อให้ Bootloader ส่งข้อมูลดังกล่าวไปยัง KeyMint ได้ - สำหรับพาร์ติชันที่ลิงก์ ข้อมูลเวอร์ชันของพาร์ติชันจะอยู่ใน VBMeta ที่ลิงก์
- โดยทั่วไป ข้อมูลเวอร์ชันควรอยู่ใน
VBMeta struct
ที่มีข้อมูลการยืนยัน (แฮชหรือแฮชทรี) สําหรับพาร์ติชันหนึ่งๆ
- ระดับแพตช์และเวอร์ชันของระบบปฏิบัติการสามารถรวมไว้ใน
- อุปกรณ์ที่ไม่มี AVB
- การติดตั้งใช้งานการบูตที่ยืนยันแล้วต้องระบุแฮชของข้อมูลเมตาเวอร์ชันให้กับ Bootloader เพื่อให้ Bootloader ระบุแฮชให้กับ KeyMint ได้
boot.img
จะจัดเก็บระดับแพตช์ในส่วนหัวต่อไปได้system.img
จะจัดเก็บระดับแพตช์และเวอร์ชันระบบปฏิบัติการในพร็อพเพอร์ตี้แบบอ่านอย่างเดียวต่อไปได้vendor.img
จัดเก็บระดับแพตช์ในพร็อพเพอร์ตี้ที่อ่านอย่างเดียวro.vendor.build.version.security_patch
- Bootloader สามารถส่งแฮชของข้อมูลทั้งหมดที่ผ่านการรับรองโดย 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()
)