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 karma ağacının yapısını tam olarak takip eder (örneğin, tuzu sıfırla doldurmak ve son bloğu sıfırla doldurmak). Android 11, imzayı <apk name>.apk.idsig
ayrı bir dosyada saklar. 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ülü dolgu veya hizalama eklenmez.
Aşağıda tanımları basitleştirmek için yardımcı bir 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
karma ağacı oluşturmak için kullanılan parametreler + kök karma değeridir:
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 mevcut değilse v2 bloğundan alınır (bkz. apk_digest )
Bir signature
kodu oluşturmak ve doğrulamak için aşağıdaki verileri ikili bloğa serileştirmeniz ve bunu imzalanmış veri olarak imzalama/doğrulama algoritmasına aktarmanız gerekir:
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ığı şekilde hesaplanan APK'nın Merkle ağacının tamamı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şturuyor. 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 dosyasının yanında bulunmasını bekler
Ayrıca varsayılan olarak Artımlı yüklemeyi denemek için .idsig dosyasını kullanacak ve eksik veya geçersiz olması durumunda normal yüklemeye geri dönecektir.
Bir yükleme oturumu oluşturulduğunda, PackageInstaller
yeni akış yükleme API'si, oturuma dosya eklerken çıkarılmış v4 imzasını ayrı bir bağımsız değişken olarak kabul eder. Bu noktada, signing_info
bir bütün olarak incfs'e aktarılır. Incfs, blob'dan kök karmasını çıkarır.
Kurulum oturumu yürütülürken PackageManagerService, incfs'densigning_info blobunu almak için bir ioctl işlemi yapar, onu ayrıştırır ve imzayı doğrular.
Artımlı Veri Yükleyici bileşeninin imzanın Merkle ağacı kısmını veri yükleyici yerel API'si aracılığıyla yayınlaması beklenir.
package
service kabuk komutu install-incremental
eklenen her dosya için bir parametre olarak base64 olarak kodlanmış soyulmuş v4 imza dosyasını kabul eder. İlgili Merkle ağacının komutun stdin
gönderilmesi gerekir.
apk_digest
apk_digest
sırasıyla mevcut ilk içerik özetidir:
- V3, 1 MB blok, SHA2-512 (CONTENT_DIGEST_CHUNKED_SHA512),
- V3, 4KB blok, SHA2-256 (CONTENT_DIGEST_VERITY_CHUNKED_SHA256),
- V3, 1 MB blok, SHA2-256 (CONTENT_DIGEST_CHUNKED_SHA256),
- V2, SHA2-512,
- V2, SHA2-256.
APK Signature Scheme v3'te uzunluk önekli imzaların uzunluk önekli sırasına bakı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 formatını test etmek için bir geliştirme ortamı kurun ve aşağıdaki manuel testleri çalıştırın:
$ atest PackageManagerShellCommandTest
PackageManagerShellCommandIncrementalTest
İmza Formatını Android SDK ile Test Etme (ADB ve apksigner)
İmza formatını Android SDK ile test etmek için bir geliştirme ortamı kurun ve IncFS uygulamasını tamamladığınızdan emin olun. Daha sonra yapıyı hedef fiziksel cihaza veya emülatöre yükleyin. 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 formatıyla apk'yi imzalayın ve yükleyin.
İmza
$ ./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