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

คีย์ KeyMint ทั้งหมดต้องเชื่อมโยงกับรูทของความน่าเชื่อถือสำหรับอุปกรณ์ รูทของความน่าเชื่อถือคือสตริงบิตที่ได้มาจากคีย์สาธารณะที่ใช้ในการยืนยันลายเซ็นของอิมเมจบูต พร้อมกับสถานะการล็อกของ Bootloader

นอกจากนี้ คีย์ KeyMint ต้องเชื่อมโยงกับเวอร์ชันระบบปฏิบัติการและระดับแพตช์ของอุปกรณ์ด้วย การเชื่อมโยงเวอร์ชันนี้มีระดับแพตช์แยกต่างหากสำหรับแต่ละพาร์ติชัน (boot, system และ vendor) เพื่อรองรับโครงสร้างแบบโมดูลาร์ของ Treble ซึ่งช่วยให้แต่ละพาร์ติชันอัปเดตได้อย่างอิสระ แต่ยังคงให้การป้องกันการย้อนกลับ

ในการใช้การเชื่อมโยงเวอร์ชันนี้ แอปที่เชื่อถือได้ (TA) ของ KeyMint ต้องมีวิธีรับเวอร์ชันระบบปฏิบัติการและระดับแพตช์ปัจจุบันอย่างปลอดภัย และตรวจสอบว่าข้อมูลที่ได้รับตรงกับข้อมูลทั้งหมดเกี่ยวกับระบบที่ทำงานอยู่

  • อุปกรณ์ที่มีการเปิดเครื่องที่ได้รับการยืนยันของ Android (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 สามารถระบุแฮชของข้อมูลทั้งหมดที่ตรวจสอบโดยการเปิดเครื่องที่ได้รับการยืนยันไปยัง KeyMint

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

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