APK İmza Şeması v4

Android 11, APK ile akışla uyumlu imzalama şemasını destekler İmza Şeması v4. v4 imzası, Merkle karma ağacını temel alır APK'nın tüm baytları üzerinden hesaplanır. fs-verity karma ağacının yapısına tam olarak uyar (ör. sıfır dolgulu) son bloka takviye değer ve sıfır dolgu). Android 11 imzayı saklar ayrı bir dosyada, <apk name>.apk.idsigbir v4 imzası için tamamlayıcı v2 veya v3 imzası gerekir.

Dosya biçimi

Tüm sayısal alanlar küçük endian cinsindendir. Tüm alanlar tam olarak doğru sayıyı dolduruyor sizeof() olarak bayt olduğu için, örtülü dolgu olmadan hizalaması eklendi.

Aşağıda, tanımları basitleştirmek için bir yardımcı yapı verilmiştir.

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ı için kullanılan parametrelerdir oluşturma + kök karma:

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, şu 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 alınmış veya değilse mevcut, v2 blokundan mevcut (apk_digest öğesine bakın)

signature kodu oluşturmak ve doğrulamak için serileştirilmesi gerekir aşağıdaki verileri ikili blob'a aktarıp imzalanmış veri olarak imzalama / doğrulama algoritması:

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 tam Merkle ağacıdır.
ziyaret edin.

Üreticiler ve tüketiciler

apksigner Android SDK aracı artık v4 imza dosyasını oluşturuyor. varsayılan parametrelerle çalıştırmanız gerekir. v4 imzalaması da aynı şekilde devre dışı bırakılabilir diğer e-postalarda bulabilirsiniz. Ayrıca v4 imzasının geçerlidir.

adb, olduğunda .apk.idsig dosyasının yanında .apk.idsig dosyasının bulunmasını bekler adb install --incremental komutunu çalıştırma
Ayrıca, artımlı yüklemeyi denemek için .idsig dosyasını ve eksik ya da eksikse normal bir yüklemeye geri döner. geçersiz.

Bir yükleme oturumu oluşturulduğunda yeni akış yükleme API'si PackageInstaller etiketi çıkarılmış öğeleri kabul eder v4 imzasını ayrı bir bağımsız değişken olarak oturuma eklerken. Bu noktada signing_info, tüm blob'u oluşturur. Incfs, blob'dan kök karmasını ayıklar.

Kurulum oturumu yapılırken PackageManagerService sign_info blob'unu incfs'ten almak için bir ioctl'e ekler, bunu ayrıştırır ve doğrular. imzası var.

Artımlı Veri Yükleyici bileşeninin Merkle ağacı bölümünü akışla aktarması bekleniyor veri yükleyici yerel API'si aracılığıyla imzasının
. package hizmet kabuk komutu install-incremental her parametre için parametre olarak, base64 olarak kodlanan sadeleştirilmiş v4 imza dosyasını kabul eder dosya eklendi. İlgili Merkle ağacı, komutun komut dosyasına stdin

apk_digest

apk_digest, sırasıyla kullanılabilir 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.

Bkz. uzunluk önekli uzunluk önekli imzalar sırası APK İmza Şeması v3'te kullanıma sunulmuştur.

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

Doğrulama ve test etme

Özellik Birimi Testleri 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şturma ve aşağıdaki manuel testleri çalıştırma:

$ atest PackageManagerShellCommandTest
PackageManagerShellCommandIncrementalTest

İmza Biçimini Android SDK (ADB ve apksigner) ile test etme

İmza biçimini Android SDK ile test etmek için bir geliştirme ortamı oluşturun ve kalite standartlarının IncFS. Ardından derlemeyi bir hedef fiziksel cihaza veya emülatöre yükleyin. İhtiyacınız olanlar kullanarak mevcut bir APK'yı oluşturun veya edinin ve ardından hata ayıklama imzalama anahtarı oluşturun. Son olarak, apk'yi v4 imza biçimiyle imzalayıp yükleyin derleme araçları klasöründe bulabilirsiniz.

İmzalayın

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

Yükle

$ ./adb install game.apk

Bu testler nerede bulunabilir?

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