การเชื่อมโยงเวอร์ชัน

คีย์ทั้งหมดใน 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

แท็กต่อไปนี้จะอธิบายข้อมูลเวอร์ชันของพาร์ติชันที่เกี่ยวข้อง

การติดตั้งใช้งาน KeyMint ควรจัดการระดับแพตช์ทั้งหมดแยกกัน คีย์จะใช้งานได้หากข้อมูลเวอร์ชันทั้งหมดตรงกับค่าที่เชื่อมโยงกับคีย์ หากเวอร์ชันอุปกรณ์ปัจจุบันใหม่กว่าค่าที่เชื่อมโยงกับคีย์ KeyMint จะแสดงข้อผิดพลาด KEY_REQUIRES_UPGRADE เมื่อพยายามใช้คีย์ จากนั้น Keystore จะดำเนินการ IKeyMintDevice::upgradeKey() เพื่อสร้างคีย์บล็อกใหม่ซึ่งเชื่อมโยงกับระดับการแก้ไขปัจจุบัน (และ Keystore จะลบคีย์บล็อกก่อนหน้าด้วยการเรียกใช้ IKeyMintDevice::deleteKey())