วิธีการยืนยัน

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

วิธียืนยันภาพ Pixel ที่เป็นค่าเริ่มต้น

ข้อกำหนดเบื้องต้นในการยืนยัน

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

Golang

เครื่องมือยืนยันเขียนด้วยภาษา Go หากต้องการสร้าง ให้ติดตั้ง Go 1.17 ขึ้นไปจากเว็บไซต์ Go

wget หรือ curl

wget และ curl เป็นเครื่องมือที่ใช้เรียกข้อมูลหรือดาวน์โหลดไฟล์จากอินเทอร์เน็ตได้ โปรดตรวจสอบว่าคุณได้ติดตั้งเครื่องมืออย่างใดอย่างหนึ่งเหล่านี้ในระบบแล้ว เนื่องจากส่วนที่เหลือของคู่มือนี้และสคริปต์ที่เราให้ไว้ต้องใช้เครื่องมืออย่างใดอย่างหนึ่ง

Avbtool

avbtool ใช้สำหรับคำนวณข้อมูลสรุป VBMeta ของภาพรวมและยืนยันไบนารี

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

computer:~$ git clone https://android.googlesource.com/platform/external/avb

หลังจากโคลนที่เก็บนั้นแล้ว คุณจะเห็น avbtool.py ในไดเรกทอรีที่เก็บ avb ที่โคลน นอกจากนี้ คุณควรเพิ่มไดเรกทอรีนี้ลงในตัวแปรสภาพแวดล้อม$PATH

computer:~$ PATH=$PATH:DIRECTORY_CONTAINING_AVBTOOL

เครื่องมือยืนยันหลักฐานการรวม

โปรแกรมตรวจสอบหลักฐานการรวมเป็นโมดูล Go ที่ใช้ค้นหาบันทึกความโปร่งใสของรูปภาพใน Pixel Factory และแสดงผลว่ารูปภาพรวมอยู่ในบันทึกหรือไม่

หลังจากโคลนที่เก็บ AVB ด้านบนแล้ว คุณจะเห็นซอร์สโค้ดของผู้ตรวจสอบใน tools/transparency/verify/

Fbpacktool

fbpacktool เป็นสคริปต์ Python ที่ใช้เพื่อแตกไฟล์แต่ละคอมโพเนนต์ใน bootloader.img ของ Pixel เครื่องมือนี้สำคัญในการช่วยให้ avbtool.py ค้นพบรูปภาพที่จําเป็นสําหรับการยืนยัน

หากต้องการใช้เครื่องมือนี้ คุณควรดาวน์โหลดสคริปต์ Python 3 รายการต่อไปนี้ลงในไดเรกทอรีที่มี avbtool.py อยู่ จากนั้นทำให้ fbpacktool.py เป็นแบบเรียกใช้ได้ และสร้างลิงก์สัญลักษณ์ชื่อ fbpacktool ไปยัง fbpacktool.py เพื่อความสะดวก

หากมี wget ให้ใช้คำสั่งต่อไปนี้เพื่อดาวน์โหลดสคริปต์ 3 รายการ

computer:dir_to_avbtool$ wget https://source.android.com/devices/bootloader/tools/pixel/fw_unpack/fbpacktool.py \
https://source.android.com/devices/bootloader/tools/pixel/fw_unpack/fbpack.py \
https://source.android.com/devices/bootloader/tools/pixel/fw_unpack/packedstruct.py
computer:dir_to_avbtool$ chmod +x fbpacktool.py
computer:dir_to_avbtool$ ln -s fbpacktool.py fbpacktool

หากมี curl ให้ใช้คำสั่งต่อไปนี้เพื่อดาวน์โหลดสคริปต์ 3 รายการ

computer:dir_to_avbtool$ curl -O https://source.android.com/devices/bootloader/tools/pixel/fw_unpack/fbpacktool.py
computer:dir_to_avbtool$ curl -O https://source.android.com/devices/bootloader/tools/pixel/fw_unpack/fbpack.py
computer:dir_to_avbtool$ curl -O https://source.android.com/devices/bootloader/tools/pixel/fw_unpack/packedstruct.py
computer:dir_to_avbtool$ chmod +x fbpacktool.py
computer:dir_to_avbtool$ ln -s fbpacktool.py fbpacktool

OpenSSL

นอกจากนี้ คุณต้องมีเครื่องมือชื่อ openssl เพื่อช่วยดำเนินการต่างๆ เกี่ยวกับวิทยาการเข้ารหัสโดยใช้เทอร์มินัลในเวิร์กโฟลว์การยืนยัน ตรวจสอบว่าได้ติดตั้งโปรแกรมดังกล่าวในระบบแล้ว คุณสามารถตรวจสอบในเทอร์มินัลได้โดยป้อนคําสั่งต่อไปนี้ และตรวจสอบว่าผลลัพธ์ที่แสดงไม่ว่างเปล่า เช่น

computer:~$ which openssl
/usr/bin/openssl

สร้างเพย์โหลดสำหรับการยืนยัน

หากต้องการยืนยันรูปภาพที่มีในอุปกรณ์หรือที่ดาวน์โหลดจากเว็บไซต์ Pixel Factory Image คุณต้องสร้างเพย์โหลดที่สอดคล้องกับรูปภาพนั้นจากลายนิ้วมือของบิลด์และ VBMeta Digest ก่อน โดยตัวเลือกมี 2 แบบ ได้แก่ ดำเนินการด้วยตนเองหรือดำเนินการโดยอัตโนมัติ ตามที่อธิบายไว้ด้านล่าง

  • รหัสเฉพาะของบิลด์: ตัวระบุสตริงของภาพรวมโรงงาน
    • ตัวอย่าง: google/oriole/oriole:12/SD1A.210817.015.A4/7697517:user/release-keys
  • ไดเจสต์ VBMeta: ไดเจสต์การเข้ารหัส SHA-256 ที่เชื่อมโยงชิ้นส่วนต่างๆ ของภาพรวมโรงงานเข้าด้วยกัน
    • ตัวอย่าง: 4d5e41b7c675a821de81f7d2c744623fe808c8c2d3e19a83e894dab5d0829dbe

การสร้างเพย์โหลดด้วยตนเอง

หากต้องการสร้างเพย์โหลดสำหรับการยืนยันด้วยตนเอง คุณต้องสร้างไฟล์ข้อความ payload.txt ที่มีลายนิ้วมือของบิลด์ในบรรทัดหนึ่ง ตามด้วยข้อมูลสรุป VBMeta ในบรรทัดถัดไป โดยมีบรรทัดใหม่ว่างเปล่า (โปรดดูรูปแบบที่แน่นอนในส่วนเนื้อหาบันทึก)

หลังจากทำตามขั้นตอนจากเว็บไซต์ภาพรวมของโรงงานแล้ว เนื้อหาของไฟล์ payload.txt ควรมีลักษณะดังนี้

google/oriole/oriole:12/SD1A.210817.015.A4/7697517:user/release-keys
4d5e41b7c675a821de81f7d2c744623fe808c8c2d3e19a83e894dab5d0829dbe
ดึงข้อมูล VBMeta Digest และลายนิ้วมือของบิลด์จากเว็บไซต์ Pixel Factory Image

เมื่อดาวน์โหลดภาพจากโรงงานจากเว็บไซต์ภาพจากโรงงานของ Pixel คุณจะต้องแตกไฟล์ที่ดาวน์โหลดมา ซึ่งจะสร้างโฟลเดอร์อื่นขึ้นมา ไปที่โฟลเดอร์ที่สร้างขึ้นใหม่ แล้วแตกไฟล์ image-*.zip ที่เชื่อมโยงเพื่อรับไฟล์ *.img แต่ละไฟล์ ไฟล์เหล่านี้คือรูปภาพพาร์ติชัน ตรวจสอบว่ามีไฟล์ vbmeta.img อยู่ในไฟล์ img คุณควรเห็นข้อมูลในลักษณะนี้

computer:oriole-sd1a.210817.015.a4$ unzip image-oriole-sd1a.210817.015.a4.zip
Archive:  image-oriole-sd1a.210817.015.a4.zip
  inflating: android-info.txt
  inflating: boot.img
  inflating: vendor_boot.img
  inflating: system.img
  inflating: vendor.img
  inflating: product.img
  inflating: system_ext.img
  inflating: system_other.img
  inflating: dtbo.img
  inflating: vbmeta_system.img
  inflating: vbmeta.img
  inflating: super_empty.img

คุณสามารถดึงข้อมูลลายนิ้วมือของบิลด์และคำนวณข้อมูลสรุป VBMeta จากไฟล์ที่ดาวน์โหลดทั้งหมดได้

หลังจาก avbtool.py พร้อมใช้งานใน $PATH แล้ว คุณสามารถออกคำสั่งต่อไปนี้จากเทอร์มินัลเพื่อดึงข้อมูลลายนิ้วมือของบิลด์และคำนวณข้อมูลสรุป VBMeta ของอิมเมจโรงงานที่เพิ่งดาวน์โหลด

computer:dir_containing_unzipped_factory_image~$ grep -a 'ro\..*build\.fingerprint=google/.*/release-keys' system.img | cut -f2 -d'='
google/oriole/oriole:12/SD1A.210817.015.A4/7697517:user/release-keys
computer:dir_containing_unzipped_factory_image$ avbtool.py calculate_vbmeta_digest --image vbmeta.img
4d5e41b7c675a821de81f7d2c744623fe808c8c2d3e19a83e894dab5d0829dbe
การยืนยันด้วยตนเองของภาพจากโรงงานที่ดาวน์โหลด

หากต้องการยืนยันรูปภาพต้นฉบับที่ดาวน์โหลดมาอย่างถูกต้อง คุณจะต้องดาวน์โหลด fbpacktool.py และไฟล์ Python อีก 2 ไฟล์ที่ใช้ร่วมกัน (fbpack.py และ packedstruct.py) เพื่อแตกไฟล์คอมโพเนนต์ใน bootloader.img เนื่องจากมีการอธิบายแต่ละรายการในโครงสร้าง VBMeta เมื่อคุณมีโปรแกรมแตกไฟล์แล้ว คุณจะใช้ fbpacktool.py เพื่อแตกไฟล์ภาพบูตได้ เช่น

computer:dir_containing_unzipped_images$ python3 fbpacktool.py unpack bootloader-oriole-slider-1.0-7683913.img

คุณควรเห็นไฟล์ .img เพิ่มเติมปรากฏขึ้นในไดเรกทอรีนั้น ตอนนี้คุณสามารถใช้ avbtool.py เพื่อตรวจสอบด้วยตนเองว่าลายเซ็นของพาร์ติชันต่างๆ ตรงกัน

computer:dir_containing_unzipped_images$ avbtool.py verify_image --image vbmeta.img --follow_chain_partitions
Verifying image vbmeta.img using embedded public key
vbmeta: Successfully verified SHA256_RSA4096 vbmeta struct in vbmeta.img
vbmeta_system: Chained but ROLLBACK_SLOT (which is 1) and KEY (which has sha1 df529646b7225015196a714006346f0768b87fcf) not specified
--
Verifying image vbmeta_system.img using embedded public key
vbmeta: Successfully verified SHA256_RSA4096 vbmeta struct in vbmeta_system.img
product: Successfully verified sha256 hashtree of product.img for image of 2700468224 bytes
system: Successfully verified sha256 hashtree of system.img for image of 878493696 bytes
system_ext: Successfully verified sha256 hashtree of system_ext.img for image of 251334656 bytes
vbmeta_vendor: Chained but ROLLBACK_SLOT (which is 3) and KEY (which has sha1 85322346680a860c091fa14a64cef1fe4a3ffe31) not specified
--
Verifying image vbmeta_vendor.img using embedded public key
vbmeta: Successfully verified SHA256_RSA4096 vbmeta struct in vbmeta_vendor.img
vendor: Successfully verified sha256 hashtree of vendor.img for image of 472940544 bytes
boot: Chained but ROLLBACK_SLOT (which is 2) and KEY (which has sha1 85322346680a860c091fa14a64cef1fe4a3ffe31) not specified
--
Verifying image boot.img using embedded public key
vbmeta: Successfully verified footer and SHA256_RSA4096 vbmeta struct in boot.img
boot: Successfully verified sha256 hash of boot.img for image of 24481792 bytes
abl: Successfully verified sha256 hash of abl.img for image of 1744896 bytes
bl1: Successfully verified sha256 hash of bl1.img for image of 12288 bytes
bl2: Successfully verified sha256 hash of bl2.img for image of 544768 bytes
bl31: Successfully verified sha256 hash of bl31.img for image of 86016 bytes
dtbo: Successfully verified sha256 hash of dtbo.img for image of 2152234 bytes
gsa: Successfully verified sha256 hash of gsa.img for image of 262144 bytes
ldfw: Successfully verified sha256 hash of ldfw.img for image of 4096000 bytes
pbl: Successfully verified sha256 hash of pbl.img for image of 49152 bytes
tzsw: Successfully verified sha256 hash of tzsw.img for image of 4304896 bytes
vendor_boot: Successfully verified sha256 hash of vendor_boot.img for image of 25718784 bytes
vendor_dlkm: Successfully verified sha256 hashtree of vendor_dlkm.img for image of 54505472 bytes

หากไม่เห็นข้อความแสดงข้อผิดพลาดหรือข้อความแจ้งความล้มเหลว แสดงว่า VBMeta ของรูปภาพที่ดาวน์โหลดได้รับการยืนยันเรียบร้อยแล้ว

การสร้างเพย์โหลดอัตโนมัติ

เพื่อความสะดวกของคุณ เราได้จัดเตรียมสคริปต์ Python ไว้ให้ใช้งานด้วย เมื่อใช้เครื่องมือนี้ คุณเพียงแค่ต้องระบุ URL ของภาพรวมเริ่มต้นแทนการดึงข้อมูลและการแตกไฟล์ด้วยตนเอง

computer:dir_to_avb_repo/tools/transparency$ python3 ./pixel_factory_image_verify.py https://dl.google.com/dl/android/aosp/oriole-sd1a.210817.015.a4-factory-074b7f51.zip
Fetching file from: https://dl.google.com/dl/android/aosp/oriole-sd1a.210817.015.a4-factory-074b7f51.zip
Successfully downloaded file.
Successfully unpacked factory image.
Successfully unpacked factory image partitions.
Successfully unpacked bootloader image.
Successfully verified VBmeta.
Successfully extracted build fingerprint.
Successfully calculated VBMeta Digest.
The build fingerprint for factory image is: google/oriole/oriole:12/SD1A.210817.015.A4/7697517:user/release-keys
The VBMeta Digest for factory image is: 4d5e41b7c675a821de81f7d2c744623fe808c8c2d3e19a83e894dab5d0829dbe

A corresponding "payload.txt" file has been created.

การดำเนินการตามคำสั่งข้างต้นจะเป็นการดาวน์โหลดกลุ่มรูปภาพต้นฉบับ แตกไฟล์กลุ่ม และยืนยันลายเซ็นของพาร์ติชันที่ลงชื่อ เมื่อยืนยันเรียบร้อยแล้ว ระบบจะสร้างไฟล์ใหม่ชื่อ payload.txt และเนื้อหาของไฟล์ควรมีลักษณะคล้ายกับด้านล่าง

google/oriole/oriole:12/SD1A.210817.015.A4/7697517:user/release-keys
4d5e41b7c675a821de81f7d2c744623fe808c8c2d3e19a83e894dab5d0829dbe

หลังจากสร้างไฟล์ payload.txt สำเร็จแล้ว คุณสามารถเริ่มขั้นตอนการยืนยันการรวมรูปภาพ

การยืนยันการรวมรูปภาพ (หลักฐานการรวม)

เมื่อสร้างเพย์โหลดแล้ว ให้ตั้งค่าตัวแปรเชลล์ (เช่น $PAYLOAD_PATH) เพื่อชี้ไปยังเส้นทางไปยังเพย์โหลด

เครื่องมือพิสูจน์การรวมได้รับการเผยแพร่ในavbที่เก็บข้อมูลภายในโปรเจ็กต์โอเพนซอร์ส Android วิธีเรียกใช้

computer:external/avb/tools/transparency/verify$ PAYLOAD_PATH=../payload.txt
computer:external/avb/tools/transparency/verify$ go build cmd/verifier/verifier.go
computer:external/avb/tools/transparency/verify$ ./verifier --payload_path=${PAYLOAD_PATH} --log_type=pixel

ผู้ตรวจสอบใช้จุดตรวจสอบและเนื้อหาบันทึก (ดูได้ที่ไดเรกทอรีไทล์) เพื่อตรวจสอบว่าเพย์โหลดรูปภาพของคุณอยู่ในบันทึกความโปร่งใส ซึ่งหมายความว่า Google เป็นผู้เผยแพร่

ระบบจะเขียนเอาต์พุตของคำสั่งไปยัง stdout

  • OK. inclusion check success! หากรูปภาพรวมอยู่ในบันทึก
  • FAILURE หากไม่ใช่