Android 11 mendukung skema penandatanganan yang kompatibel dengan streaming dengan APK Signature Scheme v4. Tanda tangan v4 didasarkan pada pohon hash Merkle yang dihitung untuk semua byte APK. Ini mengikuti struktur pohon hash fs-verity persis (misalnya, zero-padding garam dan zero-padding blok terakhir). Android 11 menyimpan tanda tangan dalam file terpisah, <apk name>.apk.idsig
Tanda tangan v4 memerlukan tanda tangan pelengkap v2 atau v3 .
Format berkas
Semua bidang numerik ada di little endian. Semua bidang menempati jumlah byte yang persis sama dengan sizeof()
, tidak ada padding atau perataan implisit yang ditambahkan.
Di bawah ini adalah struct pembantu untuk menyederhanakan definisi.
template <class SizeT> struct sized_bytes { SizeT size; byte bytes[size]; };
Konten file utama:
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
adalah parameter yang digunakan untuk pembuatan pohon hash + hash root:
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
adalah struct berikut:
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
diambil dari blok penandatanganan v3 APK, atau, jika tidak ada, dari blok v2 (lihat apk_digest )
Untuk membuat dan memverifikasi kode signature
harus membuat serial data berikut ke dalam gumpalan biner dan meneruskannya ke dalam algoritma penandatanganan / verifikasi sebagai data yang ditandatangani :
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
adalah keseluruhan pohon Merkle dari APK, dihitung seperti yang dijelaskan dalam dokumentasi fs-verity .
Produsen dan konsumen
apksigner
Android SDK sekarang menghasilkan file tanda tangan v4 jika Anda menjalankannya dengan parameter default. Penandatanganan v4 dapat dinonaktifkan dengan cara yang sama seperti skema penandatanganan lainnya. Itu juga dapat memverifikasi apakah tanda tangan v4 valid.
adb
mengharapkan file .apk.idsig ada di sebelah .apk saat menjalankan perintah adb install --incremental
Ini juga akan menggunakan file .idsig untuk mencoba instalasi Incremental secara default, dan akan kembali ke instalasi biasa jika tidak ada atau tidak valid.
Saat sesi penginstalan dibuat, API penginstalan streaming baru di PackageInstaller
menerima tanda tangan v4 yang dilucuti sebagai argumen terpisah saat menambahkan file ke sesi. Pada titik ini, penandatanganan_info diteruskan ke signing_info
secara keseluruhan. Infs mengekstrak hash root dari gumpalan.
Ketika sesi instalasi sedang dilakukan, PackageManagerService melakukan ioctl untuk mengambil gumpalan penandatanganan_info dari incfs, mem-parsingnya dan memverifikasi tanda tangan.
Komponen Pemuat Data Inkremental diharapkan mengalirkan bagian pohon Merkle dari tanda tangan melalui API asli pemuat data.
package
layanan shell perintah install-incremental
menerima file tanda tangan v4 yang dilucuti yang dikodekan sebagai base64 sebagai parameter untuk setiap file yang ditambahkan. Pohon Merkle yang sesuai harus dikirim ke stdin
perintah.
apk_digest
apk_digest
adalah intisari konten pertama yang tersedia secara berurutan:
- V3, blok 1MB, SHA2-512 (CONTENT_DIGEST_CHUNKED_SHA512),
- V3, blok 4KB, SHA2-256 (CONTENT_DIGEST_VERITY_CHUNKED_SHA256),
- V3, blok 1MB, SHA2-256 (CONTENT_DIGEST_CHUNKED_SHA256),
- V2, SHA2-512,
- V2, SHA2-256.
Lihat urutan awalan panjang dari tanda tangan dengan awalan panjang di APK Signature Scheme v3.
Validasi dan pengujian
Validasi implementasi menggunakan Feature Unit Tests dan CTS.
-
CtsIncrementalInstallHostTestCases
- /android/cts/hostsidetests/incrementalinstall
Menguji format tanda tangan
Untuk menguji format tanda tangan, siapkan lingkungan pengembangan dan jalankan pengujian manual berikut ini:
$ atest PackageManagerShellCommandTest
PackageManagerShellCommandIncrementalTest
Menguji Format Tanda Tangan dengan Android SDK (ADB dan apksigner)
Untuk menguji format tanda tangan dengan Android SDK, siapkan lingkungan pengembangan dan pastikan Anda telah menyelesaikan implementasi IncFS . Kemudian flash build pada perangkat fisik atau emulator target. Anda perlu membuat atau mendapatkan APK yang ada, lalu membuat kunci penandatanganan debug . Terakhir, tanda tangani dan instal apk dengan format tanda tangan v4 dari folder build-tools.
Tanda
$ ./apksigner sign --ks debug.keystore game.apk
Install
$ ./adb install game.apk
Di mana tes ini dapat ditemukan?
/android/cts/tests/tests/content/src/android/content/pm/cts/PackageManagerShellCommandIncrementalTest.java