Android 11 รองรับรูปแบบการลงนามที่เข้ากันได้กับสตรีมมิงกับ APK
Signature Scheme v4 ลายเซ็น v4 จะอิงตามแฮชทรีของ Merkle
จากไบต์ทั้งหมดของ APK ซึ่งเป็นไปตามโครงสร้างของแผนผังแฮช fs-verity ทุกประการ (เช่น ระยะห่างจากขอบเป็น 0
เกลือและระยะห่างจากขอบเป็น 0 ในบล็อกสุดท้าย) Android 11 จะจัดเก็บลายเซ็น
ในไฟล์แยกต่างหาก <apk name>.apk.idsig
ลายเซ็น v4
ต้องใช้ลายเซ็น v2 หรือ v3 เสริม
รูปแบบไฟล์
ฟิลด์ตัวเลขทั้งหมดอยู่ในรูปแบบ Endian ขนาดเล็ก ทุกฟิลด์จะมีค่าเท่ากับจำนวนทั้งหมด
เป็น sizeof()
โดยไม่มี Padding โดยนัยหรือ
เพิ่มการจัดข้อความแล้ว
ด้านล่างนี้คือโครงสร้างตัวช่วยเพื่อให้คำจำกัดความต่างๆ ง่ายขึ้น
template <class SizeT> struct sized_bytes { SizeT size; byte bytes[size]; };
เนื้อหาไฟล์หลัก:
struct V4Signature { int32 version; // only version 2 is supported as of now sized_bytes<int32> hashing_info; sized_bytes<int32> signing_info; sized_bytes<int32> merkle_tree; // optional };
hashing_info
คือพารามิเตอร์ที่ใช้สำหรับแฮชทรี
รุ่น + แฮชรูท
struct hashing_info.bytes { int32 hash_algorithm; // only 1 == SHA256 supported int8 log2_blocksize; // only 12 (block size 4096) supported now sized_bytes<int32> salt; // used exactly as in fs-verity, 32 bytes max sized_bytes<int32> raw_root_hash; // salted digest of the first Merkle tree page };
signing_info
มีโครงสร้างต่อไปนี้
struct signing_info.bytes { sized_bytes<int32> apk_digest; // used to match with the corresponding APK sized_bytes<int32> x509_certificate; // ASN.1 DER form sized_bytes<int32> additional_data; // a free-form binary data blob sized_bytes<int32> public_key; // ASN.1 DER, must match the x509_certificate int32 signature_algorithm_id; // see the APK v2 doc for the list sized_bytes<int32> signature; };
apk_digest
ได้มาจากบล็อกการลงชื่อ v3 ของ APK หรือหากไม่ใช่ ที่มีอยู่ จากบล็อก v2 (ดู apk_digest)
หากต้องการสร้างและยืนยันโค้ด signature
จะต้องเรียงลำดับ
ข้อมูลต่อไปนี้ลงในไบนารี BLOB และส่งไปยัง
อัลกอริทึม / การเซ็นชื่อเป็น ข้อมูลที่ลงนาม:
struct V4DataForSigning { int32 size; int64 file_size; // the size of the file that's been hashed. hashing_info.hash_algorithm; hashing_info.log2_blocksize; hashing_info.salt; hashing_info.raw_root_hash; signing_info.apk_digest; signing_info.x509_certificate; signing_info.additional_data; };
merkle_tree
คือต้น Merkle ทั้งต้นของ APK ซึ่งมีการคำนวณตามที่อธิบายไว้ในเอกสารประกอบ fs-verity
ผู้ผลิตและผู้บริโภค
ตอนนี้เครื่องมือ Android SDK ของ apksigner
สร้างไฟล์ลายเซ็น v4 แล้ว
หากเรียกใช้ด้วยพารามิเตอร์เริ่มต้น การลงชื่อ v4 สามารถปิดใช้ได้ในลักษณะเดียวกัน
กับแผนการลงนามอื่นๆ และยังตรวจสอบได้ว่าลายเซ็น v4 เป็น
ใช้ได้
adb
ต้องการไฟล์ .apk.idsig ไว้ข้าง .apk เมื่อ
กำลังเรียกใช้คำสั่ง adb install --incremental
นอกจากนี้ เครื่องมือจะใช้ไฟล์ .idsig เพื่อลองการติดตั้งส่วนเพิ่มโดย
และจะกลับไปใช้การติดตั้งตามปกติหากหายไปหรือ
ไม่ถูกต้อง
เมื่อมีการสร้างเซสชันการติดตั้ง API การติดตั้งสตรีมมิงใหม่
ใน PackageInstaller
ยอมรับอุปกรณ์ที่ถูกตัด
ลายเซ็น v4 เป็นอาร์กิวเมนต์แยกต่างหากเมื่อเพิ่มไฟล์ในเซสชัน
ณ จุดนี้ มีการส่ง signing_info
ไปยัง incfs ในฐานะ
ทั้ง BLOB Incfs จะแยกแฮชรูทจาก BLOB
เมื่อมีการคอมมิตเซสชันการติดตั้ง PackageManagerService จะดำเนินการดังกล่าว ioctl เพื่อเรียก BLOB Signing_info จาก incfs แยกวิเคราะห์และยืนยัน ลายเซ็น
คาดว่าคอมโพเนนต์เครื่องมือโหลดข้อมูลส่วนเพิ่มจะสตรีมส่วนของแผนผัง Merkle
ของลายเซ็นผ่านทาง API แบบดั้งเดิมของตัวโหลดข้อมูล
package
คำสั่ง Service Shell install-incremental
ยอมรับไฟล์ลายเซ็น v4 ที่ถูกตัดซึ่งเข้ารหัสเป็น base64 เป็นพารามิเตอร์สําหรับแต่ละไฟล์
เพิ่มไฟล์แล้ว ต้องส่งต้นไม้ Merkle ที่เกี่ยวข้องไปในคำสั่ง
stdin
apk_digest
apk_digest
เป็นสรุปเนื้อหาแรกตามลำดับ:
- V3, บล็อก 1 MB, SHA2-512 (CONTENT_DIGEST_CHUNKED_SHA512)
- V3, บล็อก 4KB, SHA2-256 (CONTENT_DIGEST_VERITY_CHUNKED_SHA256)
- V3, บล็อก 1 MB, SHA2-256 (CONTENT_DIGEST_CHUNKED_SHA256)
- V2, SHA2-512
- V2, SHA2-256
ดูมีคำนำหน้าความยาว ลำดับของลายเซ็นที่มีคำนำหน้าความยาวใน APK Signature Scheme v3
การตรวจสอบและการทดสอบ
ตรวจสอบการติดตั้งใช้งานโดยใช้การทดสอบหน่วยฟีเจอร์และ CTS
CtsIncrementalInstallHostTestCases
- /android/cts/hostsidetests/incrementalinstall
การทดสอบรูปแบบลายเซ็น
หากต้องการทดสอบรูปแบบลายเซ็น ตั้งค่า สภาพแวดล้อมในการพัฒนาซอฟต์แวร์ และทำการทดสอบด้วยตนเองต่อไปนี้
$ atest PackageManagerShellCommandTest
PackageManagerShellCommandIncrementalTest
การทดสอบรูปแบบลายเซ็นด้วย Android SDK (ADB และ apksigner)
หากต้องการทดสอบรูปแบบลายเซ็นด้วย Android SDK ให้ตั้งค่าสภาพแวดล้อมในการพัฒนาซอฟต์แวร์ และตรวจสอบว่าคุณได้ติดตั้งใช้งาน IncFS จากนั้นแฟลชบิลด์ในอุปกรณ์จริงหรือโปรแกรมจำลองเป้าหมาย คุณต้องมี เพื่อสร้างหรือรับ APK ที่มีอยู่ จากนั้นสร้างคีย์การลงชื่อสำหรับแก้ไขข้อบกพร่อง สุดท้ายให้ลงนามและติดตั้ง apk ด้วยรูปแบบลายเซ็น v4 จากโฟลเดอร์บิลด์เครื่องมือ
สัญลักษณ์
$ ./apksigner sign --ks debug.keystore game.apk
ติดตั้งเลย
$ ./adb install game.apk
พบการทดสอบเหล่านี้ได้ที่ใด
/android/cts/tests/tests/content/src/android/content/pm/cts/PackageManagerShellCommandIncrementalTest.java