APK İmza Şeması v4

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;
};
  1. 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:

  1. V3, 1 MB blok, SHA2-512 (CONTENT_DIGEST_CHUNKED_SHA512),
  2. V3, 4KB blok, SHA2-256 (CONTENT_DIGEST_VERITY_CHUNKED_SHA256),
  3. V3, 1 MB blok, SHA2-256 (CONTENT_DIGEST_CHUNKED_SHA256),
  4. V2, SHA2-512,
  5. V2, SHA2-256.

APK Signature Scheme v3'te uzunluk önekli imzaların uzunluk önekli sırasına bakın.

apk doğrulama işlemi v4
Şekil 1 : APK doğrulama süreci v4

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