طريقة التحقّق

توضِّح هذه الصفحة طريقة (بأعلى درجة من الثقة) لضمان أنّه يمكنك تشغيل إصدار شرعي من صورة 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 إلى الدليل الذي يتضمّن 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

ستحتاج أيضًا إلى أداة باسم openssl للمساعدة في تنفيذ عمليات تشفير مختلفة باستخدام وحدة التحكّم في عملية إثبات الملكية. تأكَّد من تثبيته على نظامك. يمكنك التحقّق من الوحدة الطرفية من خلال إصدار الأمر التالي والتأكّد من أنّ النتيجة المعروضة ليست فارغة. على سبيل المثال:

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

إنشاء الحمولة لإثبات الهوية

للتحقّق من الصورة المتوفّرة على جهازك أو التي تم تنزيلها من الموقع الإلكتروني Pixel Factory Image، عليك أولاً إنشاء الحمولة المقابلة لهذه الصورة من بصمة الإصدار وخلاصة VBMeta. هناك خياران، هما الإجراء اليدوي أو التلقائي، كما هو موضّح أدناه.

  • الملف المرجعي للإصدار: معرّف سلسلة لصورة المصنع
    • مثال: google/oriole/oriole:12/SD1A.210817.015.A4/7697517:user/release-keys
  • خلاصة VBMeta: خلاصة تشفير SHA-256 تربط الأجزاء المختلفة من صور المصنع معًا
    • مثال: 4d5e41b7c675a821de81f7d2c744623fe808c8c2d3e19a83e894dab5d0829dbe

إنشاء الحمولة يدويًا

لإنشاء الحمولة يدويًا لإثبات الملكية، عليك إنشاءملف payload.txt نصي يحتوي على بصمة التصميم في سطر واحد ثم خلاصة VBMeta في السطر التالي، مع سطر جديد فارغ (يُرجى الرجوع إلى قسم "محتوى السجلّ" للاطّلاع على التنسيق الدقيق).

بعد اتّباع الخطوات الواردة في موقع Factory Image الإلكتروني، من المفترض أن يظهر محتوى ملف payload.txt على النحو التالي:

google/oriole/oriole:12/SD1A.210817.015.A4/7697517:user/release-keys
4d5e41b7c675a821de81f7d2c744623fe808c8c2d3e19a83e894dab5d0829dbe
استخراج خلاصة VBMeta وبصمة الإصدار من الموقع الإلكتروني لصورة 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 الآخرين اللذين يعتمد عليهم (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 Open Source Project. لتنفيذه:

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 إذا لم يكن كذلك.