روش تایید

این صفحه روشی (با بالاترین درجه اطمینان) را شرح می‌دهد تا اطمینان حاصل شود که می‌توانید نسخه قانونی تصویر پیکسل را روی دستگاه پیکسل خود اجرا کنید. این شامل دانلود یک تصویر کارخانه‌ای روی رایانه شما و انجام یک اثبات ورود به سیستم روی مصنوع دانلود شده قبل از فلش کردن آن روی دستگاه شما است.

چگونه تصویر کارخانه پیکسل خود را تأیید کنیم

پیش‌نیازهای تأیید

قبل از اقدام برای تأیید مطابقت محصول (میان‌افزار یا APK) با ادعا، مطمئن شوید که ابزارهای زیر در رایانه متصل به شبکه موجود هستند. بسته به هدف تأیید، ممکن است به همه آنها نیاز نداشته باشید.

گولانگ

ابزار تأیید با زبان Go نوشته شده است. برای ساخت آن، Go 1.24 یا بالاتر را از سایت Go نصب کنید.

پل اشکال‌زدایی اندروید (ADB)

ADB ابزاری است که با دستگاه اندروید ارتباط برقرار می‌کند تا تصویر را بررسی کند یا فایل‌های APK را استخراج کند، که در وب‌سایت Android SDK Platform Tools موجود است.

تأییدکننده اثبات شمول

تأییدکننده‌ی اثبات شمول، یک ماژول Go است که لاگ شفافیت را بررسی می‌کند و مشخص می‌کند که آیا یک مصنوع در لاگ گنجانده شده است یا خیر. این ماژول در مخزن گیت‌هاب android-binary-transparency به آدرس https://github.com/android/android-binary-transparency/tree/main منتشر شده است.

برای کلون کردن مخزن AOSP avb :

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

برای کلون کردن مخزن گیت‌هاب android-binary-transparency :

computer:~$ git clone https://github.com/android/android-binary-transparency

AAPT2

AAPT2 (ابزار بسته‌بندی دارایی‌های اندروید) یک ابزار ساخت است که برای کامپایل و بسته‌بندی منابع یک برنامه اندروید استفاده می‌شود. این ابزار را می‌توان به عنوان یک ابزار مستقل در ابزارهای ساخت SDK اندروید نسخه 26.0.2 و بالاتر یافت.

ابزار بسته

bundletool ابزاری است که برای ساخت یک بسته نرم‌افزاری اندروید (AAB) استفاده می‌شود. همچنین می‌توان از آن برای تأیید امضاهای کد APK استفاده کرد. می‌توان آن را از GitHub دانلود کرد.

wget یا curl

wget و curl ابزارهایی هستند که می‌توانند برای بازیابی یا دانلود فایل‌ها از اینترنت استفاده شوند. مطمئن شوید که هر یک از این ابزارها را نصب کرده‌اید، زیرا اسکریپت‌های تأیید ممکن است به آنها متکی باشند.

آوبتول

avbtool برای محاسبه خلاصه VBMeta از تصاویر کارخانه و تأیید فایل‌های باینری استفاده می‌شود. پس از کلون کردن مخزن avb (همانطور که در بخش تأییدکننده اثبات شمول نشان داده شده است)، avbtool.py می‌توان در دایرکتوری avb کلون شده یافت. شما باید این دایرکتوری را به متغیر محیطی $PATH خود اضافه کنید.

computer:~$ PATH=$PATH:DIRECTORY_CONTAINING_AVBTOOL

ابزار بسته‌بندی فیسبوک

fbpacktool یک اسکریپت پایتون است که برای باز کردن اجزای جداگانه در bootloader.img پیکسل استفاده می‌شود. اگر در حال تأیید APKها هستید، به این ابزار نیاز ندارید. این ابزار مهم است زیرا به avbtool.py اجازه می‌دهد تصاویر مورد نیاز برای تأیید را کشف کند.

برای استفاده از این ابزار، باید سه اسکریپت پایتون زیر را در دایرکتوری که avbtool.py شما قرار دارد دانلود کنید، fbpacktool.py را قابل اجرا کنید و برای راحتی کار، یک لینک نمادین به نام fbpacktool به fbpacktool.py ایجاد کنید.

اگر wget دارید:

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 دارید:

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 به انجام عملیات رمزنگاری مختلف با استفاده از ترمینال در گردش کار تأیید کمک می‌کند. مطمئن شوید که روی سیستم شما نصب شده است. می‌توانید با اجرای دستور زیر و اطمینان از خالی نبودن نتیجه‌ی برگشتی، در ترمینال خود بررسی کنید:

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

ساخت Payload برای تأیید

برای تأیید تصویری که روی دستگاه خود دارید یا تصویری که از وب‌سایت Pixel Factory Image دانلود کرده‌اید، ابتدا باید payload مربوط به آن تصویر را از Build Fingerprint و VBMeta Digest بسازید. دو گزینه وجود دارد، دستی یا خودکار، همانطور که در زیر توضیح داده شده است.

  • اثر انگشت ساخت: یک شناسه رشته‌ای از تصویر کارخانه
    • مثال: google/oriole/oriole:12/SD1A.210817.015.A4/7697517:user/release-keys
  • VBMeta Digest: یک خلاصه رمزنگاری SHA-256 که بخش‌های مختلف ایمیج‌های کارخانه را به هم مرتبط می‌کند.
    • مثال: 4d5e41b7c675a821de81f7d2c744623fe808c8c2d3e19a83e894dab5d0829dbe

ساخت بار دستی

برای تولید دستی payload جهت تأیید، باید یک فایل متنی به payload.txt ایجاد کنید که شامل اثر انگشت ساخت در یک خط و سپس خلاصه VBMeta در خط بعدی، با یک خط جدید خالی باشد (لطفاً برای قالب دقیق به بخش محتوای گزارش مراجعه کنید).

پس از دنبال کردن مراحل وب‌سایت Factory Image ، محتوای فایل payload.txt باید به شکل زیر باشد:

google/oriole/oriole:12/SD1A.210817.015.A4/7697517:user/release-keys
4d5e41b7c675a821de81f7d2c744623fe808c8c2d3e19a83e894dab5d0829dbe
استخراج VBMeta Digest و ساخت اثر انگشت از وب‌سایت Pixel Factory Image

وقتی یک فایل ایمیج فکتوری را از وب‌سایت Pixel Factory Image دانلود می‌کنید، باید فایل دانلود شده را از حالت فشرده خارج کنید که این کار باعث ایجاد یک پوشه دیگر در محل می‌شود. به پوشه تازه ایجاد شده بروید و فایل 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
تأیید دستی فایل Factory Image دانلود شده

برای تأیید صحیح فایل factory image دانلود شده، باید fbpacktool.py و دو فایل پایتون دیگر ( fbpack.py و packedstruct.py ) را دانلود کنید تا اجزای موجود در bootloader.img را از حالت فشرده خارج کنید، همانطور که به صورت جداگانه در VBMeta struct توضیح داده شده‌اند. پس از دریافت فایل unpacker، می‌توانید از fbpacktool.py برای خارج کردن فایل bootloader image استفاده کنید. به عنوان مثال:

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 تصویر دانلود شده اکنون با موفقیت تأیید شده است.

ساخت بار خودکار

برای راحتی شما، ما یک اسکریپت پایتون نیز ارائه داده‌ایم که می‌توانید از آن استفاده کنید. با این ابزار، به جای دریافت و استخراج دستی فایل‌ها، فقط باید 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 در پروژه متن‌باز اندروید منتشر شده است. برای اجرای آن:

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

تأییدکننده از نقطه بازرسی و محتویات لاگ (که در دایرکتوری tile یافت می‌شود) استفاده می‌کند تا بررسی کند که آیا محتوای تصویر شما در لاگ شفافیت وجود دارد یا خیر، یعنی اینکه توسط گوگل منتشر شده است.

خروجی دستور در stdout نوشته می‌شود:

  • OK. inclusion check success! اگر تصویر در لاگ وجود داشته باشد،
  • اگر اینطور نباشد، FAILURE .