APK İmza Şeması v4

Android 11, APK imza şeması v4 ile akış uyumlu bir imzalama şemasını destekler. V4 imzası, APK'nın tüm baytları için hesaplanan Merkle karma ağacını temel alır. fs-verity karma ağacının yapısını tam olarak izler (örneğin, tuz ve son blok için sıfır dolgu). Android 11, imzayı ayrı bir dosyada saklar. <apk name>.apk.idsigv4 imzaları, tamamlayıcı bir v2 veya v3 imzası gerektirir.

Dosya biçimi

Tüm sayısal alanlar küçük endian olarak ayarlanır. Tüm alanlar tam olarak sizeof() kadar bayt kaplar. Implicit dolgu veya hizalama eklenmez.

Aşağıda, tanımları basitleştirmeye yardımcı olacak 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, karma ağacı oluşturmak için kullanılan parametreler ve kök karmasıdır:

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 imza bloğundan veya mevcut değilse v2 bloğundan alınır (apk_digest bölümüne bakın)

signature kodu oluşturmak ve doğrulamak için aşağıdaki verilerin ikili blob olarak serileştirilmesi ve imzalama / doğrulama algoritmasına imzalı veri olarak aktarılması 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 dokümanlarında açıklandığı şekilde hesaplanan APK'nın tüm Merkle ağacıdır.

Üreticiler ve tüketiciler

apksigner Android SDK aracı artık varsayılan parametrelerle çalıştırılırsa 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 komutu çalıştırıldığında .apk.idsig dosyasının .apk dosyasının yanında olmasını bekler
Ayrıca varsayılan olarak artımlı yüklemeyi denemek için .idsig dosyasını kullanır ve dosya eksikse veya geçersizse normal yüklemeye geçer.

Bir yükleme oturumu oluşturulduğunda, PackageInstaller içindeki yeni akış yükleme API'si, oturuma dosya eklerken ayıklanmış v4 imzasını ayrı bir bağımsız değişken olarak kabul eder. Bu noktada signing_info, incfs'ye bütün bir blob olarak iletilir. Incfs, blob'dan kök karmasını çıkarır.

Yükleme oturumu sabitlenirken PackageManagerService, incfs'den signing_info blob'unu almak için bir ioctl yapar, onu ayrıştırır ve imzayı doğrular.

Artımlı Veri Yükleyici bileşeninin, imzanın Merkle ağacı bölümünü veri yükleyici yerel API'si üzerinden aktarması beklenir.
package hizmet kabuğu komutu install-incremental, eklenen her dosya için parametre olarak base64 olarak kodlanmış, sarmalanmış v4 imza dosyasını kabul eder. İlgili Merkle ağacının komutun stdin alanına gönderilmesi gerekir.

apk_digest

apk_digest, aşağıdaki sırayla kullanılabilen ilk içerik özetidir:

  1. V3, 1 MB blok, SHA2-512 (CONTENT_DIGEST_CHUNKED_SHA512),
  2. V3, 4 KB 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 İmza Şeması v3'te uzunluk ön ekiyle başlayan uzunluk ön ekiyle başlayan imza dizisi bölümüne bakın.

apk validation process 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 biçimini test etmek için bir geliştirme ortamı oluşturun ve aşağıdaki manuel testleri çalıştırın:

$ atest PackageManagerShellCommandTest
PackageManagerShellCommandIncrementalTest

İmza biçimini Android SDK'sı (ADB ve apksigner) ile test etme

İmza biçimini Android SDK ile test etmek için bir geliştirme ortamı oluşturun ve IncFS uygulamasını tamamladığınızdan emin olun. Ardından derlemeyi hedef fiziksel bir 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 APK'yı v4 imza biçimiyle imzalayın ve yükleyin.

İmza

$ ./apksigner sign --ks debug.keystore game.apk

Yükle

$ ./adb install game.apk

Bu testleri nerede bulabilirim?

/android/cts/tests/tests/content/src/android/content/pm/cts/PackageManagerShellCommandIncrementalTest.java