Android 11, APK Signature Scheme v4 ile akış uyumlu bir imzalama şemasını destekler. v4 imzası, APK'nın tüm baytları üzerinden hesaplanan Merkle karma ağacını temel alır. fs-verity hash ağacının yapısını tam olarak takip eder (örneğin, tuzun sıfırlanması ve son bloğun sıfırlanması). Android 11, imzayı ayrı bir dosyada saklar, <apk name>.apk.idsig
Bir v4 imzası, tamamlayıcı bir v2 veya v3 imzası gerektirir.
Dosya formatı
Tüm sayısal alanlar küçük endian cinsindendir. Tüm alanlar, sizeof()
olarak tam olarak bayt sayısını kaplar, örtük doldurma veya hizalama eklenmez.
Aşağıda, tanımları basitleştirmek için bir yardımcı yapı bulunmaktadır.
template <class SizeT> struct sized_bytes { SizeT size; byte bytes[size]; };
Ana dosya içeriği:
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
, hash ağacı üretimi + kök hash için kullanılan parametrelerdir:
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
aşağıdaki yapıdır:
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
, APK'nın v3 imzalama bloğundan veya yoksa v2 bloğundan alınır (bkz. apk_digest )
Bir signature
kodu oluşturmak ve doğrulamak için aşağıdaki verileri ikili bloba serileştirmeli ve imzalı veri olarak imzalama/doğrulama algoritmasına iletmelidir:
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
, fs-verity belgelerinde açıklandığı gibi hesaplanan APK'nın tüm Merkle ağacıdır .
Üreticiler ve tüketiciler
apksigner
Android SDK aracı, varsayılan parametrelerle çalıştırırsanız artık v4 imza dosyasını oluşturur. v4 imzalama, diğer imzalama şemalarıyla aynı şekilde devre dışı bırakılabilir. Ayrıca v4 imzasının geçerli olup olmadığını da doğrulayabilir.
adb
, adb install --incremental
komutunu çalıştırırken .apk.idsig dosyasının .apk'nin yanında bulunmasını bekler
Ayrıca varsayılan olarak Artımlı yüklemeyi denemek için .idsig dosyasını kullanır ve eksik veya geçersizse normal yüklemeye geri döner.
Bir yükleme oturumu oluşturulduğunda, PackageInstaller
yeni akış yükleme API'si, oturuma bir dosya eklerken, soyulmuş v4 imzasını ayrı bir bağımsız değişken olarak kabul eder. Bu noktada, signing_info
bir bütün blob olarak incfs'ye geçirilir. Incfs, blobdan kök karmasını çıkarır.
Kurulum oturumu gerçekleştirilirken, PackageManagerService incfs'den sign_info blobunu almak için bir ioctl yapar, onu ayrıştırır ve imzayı doğrular.
Artımlı Veri Yükleyici bileşeninin, veri yükleyici yerel API'si aracılığıyla imzanın Merkle ağacı bölümünü yayınlaması beklenir.
package
service shell komutu install-incremental
, eklenen her dosya için bir parametre olarak base64 olarak kodlanmış, çıkarılmış v4 imza dosyasını kabul eder. Karşılık gelen Merkle ağacı, komutun stdin
gönderilmelidir.
apk_digest
apk_digest
, sırayla kullanılabilen ilk içerik özetidir:
- V3, 1MB blok, SHA2-512 (CONTENT_DIGEST_CHUNKED_SHA512),
- V3, 4KB blok, SHA2-256 (CONTENT_DIGEST_VERITY_CHUNKED_SHA256),
- V3, 1MB blok, SHA2-256 (CONTENT_DIGEST_CHUNKED_SHA256),
- V2, SHA2-512,
- V2, SHA2-256.
APK Signature Scheme v3'te uzunluk ön ekli imza dizisini görün.

Doğrulama ve test
Özellik Birimi Testlerini ve CTS'yi kullanarak uygulamayı doğrulayın.
-
CtsIncrementalInstallHostTestCases
- /android/cts/hostsidetests/incrementalinstall
İmza biçimini test etme
İmza biçimini test etmek için bir geliştirme ortamı kurun ve aşağıdaki manuel testleri çalıştırın:
$ atest PackageManagerShellCommandTest
PackageManagerShellCommandIncrementalTest
Android SDK ile İmza Formatını Test Etme (ADB ve apksigner)
İmza biçimini Android SDK ile test etmek için bir geliştirme ortamı kurun ve IncFS uygulamasını tamamladığınızdan emin olun. Ardından yapıyı hedef bir fiziksel cihazda veya öykünücüde flaşlayın. Mevcut bir APK oluşturmanız veya edinmeniz ve ardından bir hata ayıklama imzalama anahtarı oluşturmanız gerekir. Son olarak, build-tools klasöründen v4 imza formatlı apk'yı imzalayın ve yükleyin.
İşaret
$ ./apksigner sign --ks debug.keystore game.apk
Düzenlemek
$ ./adb install game.apk
Bu testler nerede bulunabilir?
/android/cts/tests/tests/content/src/android/content/pm/cts/PackageManagerShellCommandIncrementalTest.java