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.idsig
bir 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; };
merkle_tree
, fs-verity dokümanlarında açıklandığı şekilde hesaplanan, APK'nın tam Merkle ağacıdır.
Ü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:
- V3, 1 MB blok, SHA2-512 (CONTENT_DIGEST_CHUNKED_SHA512),
- V3, 4 KB blok, SHA2-256 (CONTENT_DIGEST_VERITY_CHUNKED_SHA256),
- V3, 1 MB blok, SHA2-256 (CONTENT_DIGEST_CHUNKED_SHA256),
- V2, SHA2-512
- V2, SHA2-256.
Bkz. uzunluk önekli uzunluk önekli imzalar sırası APK İmza Şeması v3'te kullanıma sunulmuştur.
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