APK İmza Şeması v4

Android 11, APK Signature Scheme v4 ile akış uyumlu bir imzalama şemasını destekler. V4 imzası, APK'nin tüm baytları üzerinden hesaplanan Merkle hash ağacına dayanır. Fs-verity hash ağacının yapısını tam olarak izler (örneğin, tuzu sıfıra ve son bloğa sıfır doldurma). Android 11, imzayı <apk name>.apk.idsig adlı ayrı bir dosyada <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 içindedir. Tüm alanlar, sizeof() tam olarak bayt sayısını kaplar, örtük 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ğaç oluşturma + kök karması 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 signing_info :

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_digest 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 blob olarak seri hale getirmeli ve imzalama / doğrulama algoritmasına imzalı veri olarak 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;
};
  1. merkle_tree , fs-verity belgelerinde açıklandığı gibi hesaplanan, APK'nin Merkle ağacının merkle_tree .

Ü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ı adb install --incremental
Ayrıca varsayılan olarak Artımlı yüklemeyi denemek için .idsig dosyasını kullanacak ve eksik veya geçersiz olması durumunda normal bir kuruluma geri dönecektir.

Bir yükleme oturumu oluşturulduğunda, yeni akış yükleme API PackageInstaller kabul soyulmuş oturuma bir dosya eklerken ayrı argüman olarak v4 imzası. Bu noktada, signing_info bir blob olarak incfs'ye aktarılır. Incfs blob'dan kök karmasını çıkarır.

Kurulum oturumu tamamlanırken, PackageManagerService imzalama_bilgisini incfs'den 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 aracılığıyla akışa alması beklenir.
package service shell command install-incremental , eklenen her dosya için bir parametre olarak base64 olarak kodlanmış soyulmuş v4 imza dosyasını kabul eder. Karşılık gelen Merkle ağacı komutun stdin gönderilmelidir.

apk_digest

apk_digest , sırayla mevcut ilk içerik apk_digest :

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

APK İmza Şeması v3'te uzunluk önekli imza dizisine bakın.

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

Doğrulama ve test etme

Özellik Birim Testlerini ve CTS'yi kullanarak uygulamayı doğrulayın.

  • CtsIncrementalInstallHostTestCases
    • / android / cts / hostsidetests / incrementalinstall

İmza formatını 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

İmza Biçimini Android SDK ile 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, bir hedef fiziksel cihaz veya emülatördeki yapıyı flashlayı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 apk'yi v4 imza formatıyla imzalayın ve yükleyin.

İşaret

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

Yüklemek

$ ./adb install game.apk

Bu testler nerede bulunabilir?

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