Android 11 mendukung skema penandatanganan yang kompatibel untuk streaming dengan skema tanda tangan APK v4. Tanda tangan v4 didasarkan pada hierarki hash Merkle yang dihitung di semua byte APK. Skema ini mengikuti struktur pohon hash fs-verity
dengan tepat (misalnya, pengisian nol
untuk salt dan pengisian nol untuk blok terakhir). Android 11 menyimpan tanda tangan
dalam file terpisah, <apk name>.apk.idsig. Tanda tangan v4
memerlukan tanda tangan v2 atau v3 pelengkap.
Format file
Semua kolom numerik dalam little endian. Semua kolom menempati persis jumlah byte seperti sizeof()-nya, tanpa padding atau perataan implisit yang ditambahkan.
Struktur helper berikut menyederhanakan definisi:
template <class SizeT> struct sized_bytes { SizeT size; byte bytes[size]; };
Isi 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
plus 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 struktur 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. Jika blok tersebut tidak ada, blok tersebut diambil dari blok v2 (lihat apk_digest).
Untuk membuat dan memverifikasi, kode signature harus melakukan serialisasi
data berikut ke dalam blob biner dan meneruskannya ke
algoritma penandatanganan dan 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 seluruh pohon Merkle APK, yang dihitung seperti yang dijelaskan dalam dokumentasi fs-verity.
Produsen dan konsumen
Alat Android SDK apksigner membuat file tanda tangan v4
jika Anda menjalankannya dengan parameter default. Anda dapat menonaktifkan penandatanganan v4 dengan cara yang sama
seperti skema penandatanganan lainnya. Alat ini juga dapat memverifikasi apakah tanda tangan v4 valid.
adb mengharapkan file .apk.idsig ada di samping APK saat
menjalankan perintah adb install --incremental. adb juga menggunakan file IDSIG
untuk mencoba penginstalan inkremental secara default, dan melakukan penggantian ke penginstalan reguler jika file tersebut tidak ada atau tidak valid.
Saat sesi penginstalan dibuat, API penginstalan streaming baru
di PackageInstaller menerima tanda tangan v4
yang dihapus sebagai argumen terpisah saat menambahkan file ke sesi.
Pada tahap ini, signing_info diteruskan ke IncFS sebagai
blob utuh. IncFS mengekstrak hash root dari blob.
Saat sesi penginstalan sedang dilakukan, PackageManagerService melakukan
panggilan ioctl untuk mengambil blob signing_info dari IncFS, menguraikannya,
dan memverifikasi tanda tangan.
Komponen Incremental Data Loader melakukan streaming bagian pohon Merkle dari tanda tangan melalui API native pemuat data. Perintah shell layanan
package install-incremental
menerima file tanda tangan v4 yang dihapus dan dienkode sebagai Base64 sebagai parameter untuk setiap
file yang ditambahkan. Pohon Merkle yang sesuai harus dikirim ke
stdin perintah.
apk_digest
apk_digest adalah ringkasan konten pertama yang tersedia dalam urutan:
- V3, blok 1 MB, SHA2-512 (
CONTENT_DIGEST_CHUNKED_SHA512) - V3, blok 4 KB, SHA2-256 (
CONTENT_DIGEST_VERITY_CHUNKED_SHA256) - V3, blok 1 MB, SHA2-256 (
CONTENT_DIGEST_CHUNKED_SHA256) - V2, SHA2-512
- V2, SHA2-256
Lihat urutan penanda tangan berawalan panjang berawalan panjang dalam APK signature scheme v3.
Validasi dan pengujian
Proses validasi APK v4 diilustrasikan dalam gambar berikut:

Gambar 1. Proses validasi APK v4.
Validasi penerapan menggunakan pengujian unit fitur dan CTS:
CtsIncrementalInstallHostTestCases/android/cts/hostsidetests/incrementalinstall
Menguji format tanda tangan
Untuk menguji format tanda tangan, siapkan lingkungan build dan jalankan pengujian manual berikut:
$ atest PackageManagerShellCommandTest
PackageManagerShellCommandIncrementalTest
Menguji format tanda tangan dengan Android SDK (ADB dan apksigner)
Gunakan proses ini untuk menguji format tanda tangan dengan Android SDK:
- Siapkan lingkungan build dan pastikan Anda telah menyelesaikan penerapan IncFS.
- Flash build di perangkat fisik atau emulator target.
- Buat atau dapatkan APK yang ada, lalu buat kunci penandatanganan debug.
- Tandatangani dan instal APK dengan format tanda tangan v4
dari folder build-tools.
Tanda tangan
$ ./apksigner sign --ks debug.keystore game.apk
Instal
$ ./adb install game.apk
Tempat pengujian ini dapat ditemukan
/android/cts/tests/tests/content/src/android/content/pm/cts/PackageManagerShellCommandIncrementalTest.java