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

  1. V3, 1MB blok, SHA2-512 (CONTENT_DIGEST_CHUNKED_SHA512),
  2. V3, 4KB blok, 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 Signature Scheme v3'te uzunluk ön ekli imza dizisini görü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 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