Reprodukovatelná sestavení poskytují ověřitelnou vazbu mezi zveřejněným zdrojovým kódem a binárním souborem vydání. Naše současné pokrytí reprodukovatelnými sestaveními se vztahuje na vydání pro Android v katalogu F-Droid. Toto pokrytí hodláme rozšířit na další distribuční kanály pro Android a iOS.

Android

F-Droid

Gem Wallet využívá nezávislou sestavovací infrastrukturu F-Droid k opětovnému sestavení APK pro F-Droid a jeho ověření před zveřejněním.

Model ověřování

Gem Wallet zveřejňuje pro každé vydání podepsané APK pro F-Droid. Nezávisle na tom provádějí sestavovací servery F-Droid veřejný recept pro sestavení v čistém prostředí:

  1. Metadata F-Droid určují přesný commit Git a verzi Android NDK.
  2. F-Droid provede checkout tohoto commitu z veřejného repozitáře Gem Wallet.
  3. Veřejné skripty pro reprodukovatelné sestavení nainstalují zafixovaný nativní toolchain a spustí :app:assembleFdroidRelease.
  4. Sestavení vytvoří nepodepsané APK. F-Droid stáhne odpovídající APK podepsané vývojářem a potvrdí, že je podepsáno certifikátem, jehož otisk je deklarován v AllowedAPKSigningKeys.
  5. F-Droid zkopíruje podpis APK do znovu sestaveného artefaktu a ověří jej. Podpisy Android APK Signature Scheme v2/v3 pokrývají celé APK mimo podpisový blok, takže úspěšné ověření vyžaduje, aby se obsah znovu sestaveného APK bajt po bajtu shodoval s vydáním Gem Wallet.
  6. F-Droid zveřejní APK podepsané vývojářem pouze tehdy, když ověření uspěje. Vydání, které se nepodaří reprodukovat, není zveřejněno.

Opatření pro deterministické sestavení

Gem Wallet obsahuje nativní knihovny v jazyce Rust, což činí výstup citlivým na rozdíly v kompilátoru, linkeru, NDK, hostitelské platformě a optimalizátoru. Sestavení pro F-Droid tyto vstupy kontroluje takto:

  • fixuje verze toolchainu Rust a cargo-ndk v android/reproducible/versions.sh;
  • instaluje cargo-ndk s parametrem --locked, zatímco závislosti aplikace v jazyce Rust se řeší podle Cargo.lock z repozitáře;
  • fixuje přesnou revizi Android NDK jak v projektu pro Android, tak v metadatech F-Droid;
  • sestavuje na hostiteli Linux x86_64 s explicitně zadanými cestami k linkeru a archivátoru NDK;
  • omezuje nativní cílové architektury APK na armeabi-v7a a arm64-v8a, nezávisle na sestavovacím hostiteli x86_64;
  • používá vyhrazený produktový kanál fdroid, bez modulů Google pro push notifikace a recenze;
  • vypíná optimalizaci R8 pomocí -dontoptimize, aby se předešlo nedeterminismu ve výstupu DEX a identifikátorech mapování;
  • spouští Gradle bez démona a konfigurační cache a před sestavením vydání maže cache transformací.

Přesný zdrojový commit, příkazy sestavení, výstupní cesta, revize NDK, adresa URL původního APK a povolený podpisový certifikát jsou veřejně dostupné v metadatech F-Droid. Skripty, které konfigurují Rust, Cargo, toolchain NDK a Gradle, jsou udržovány spolu se zdrojovým kódem aplikace v adresáři android/reproducible.

Bezpečnostní vlastnosti a omezení

Úspěšné ověření F-Droid prokazuje, že podepsané APK, které Gem Wallet zveřejňuje, lze reprodukovat z deklarovaného zdrojového commitu a receptu pro sestavení. Opětovné sestavení probíhá mimo infrastrukturu Gem Wallet, čímž se snižuje závislost na naší release pipeline jako na jediném bodu důvěry.

Reprodukovatelnost neprokazuje, že zdrojový kód neobsahuje zranitelnosti, že každá závislost je důvěryhodná, ani že zvolený toolchain kompilátoru není kompromitován. Tato rizika vyžadují kromě reprodukovatelných sestavení také revizi zdrojového kódu, kontrolu závislostí a zabezpečení toolchainu.

Stav sestavení a ověřená vydání jsou k dispozici na stránce Gem Wallet v katalogu F-Droid.

Universal APK a Google Play

Universal APK od Gem Wallet a vydání pro Google Play nejsou v současnosti pokryty výše popsaným ověřováním F-Droid. Podpora reprodukovatelných sestavení pro tyto distribuční kanály systému Android je plánována do budoucna.

iOS

Vydání pro App Store není v současnosti reprodukovatelné. Podpora reprodukovatelných sestavení pro iOS a nezávislé ověřování binárního souboru z App Store jsou plánovány do budoucna.

Frequently Asked Questions

Reprodukovatelná sestavení umožňují komukoli sestavit Gem Wallet z veřejného zdrojového kódu a ověřit, že výsledná aplikace odpovídá oficiálnímu vydání. To poskytuje dodatečnou transparentnost a pomáhá potvrdit, že zveřejněná aplikace byla sestavena ze stejného zdrojového kódu, který je k dispozici na GitHubu.
Open source znamená, že zdrojový kód Gem Wallet je veřejně dostupný a kdokoli jej může prozkoumat. Reprodukovatelná sestavení jdou o krok dál: umožňují nezávislým vývojářům a službám, jako je F-Droid, sestavit aplikaci z deklarovaného zdrojového kódu a ověřit, že výsledné APK pro Android se bajt po bajtu shoduje s oficiálním vydáním Gem Wallet.
Ano. Aplikace pro Android i iOS můžete sestavit z veřejného zdrojového kódu Gem Wallet. Aplikace pro Android podporuje reprodukovatelná sestavení pomocí veřejných sestavovacích skriptů a zafixovaného toolchainu. Aplikaci pro iOS můžete také sestavit a spustit lokálně.
Skripty pro reprodukovatelné sestavení a nastavení zafixovaného toolchainu jsou veřejné. Metadata F-Droid deklarují přesný zdrojový commit, revizi Android NDK, příkazy sestavení a očekávané výstupní APK pro každé vydání. F-Droid nezávisle znovu sestaví aplikaci pro Android a zveřejní ji pouze tehdy, když se obsah APK bajt po bajtu shoduje s vydáním Gem Wallet.
Pokud máte dotaz, narazíte na problém se sestavením nebo objevíte nesrovnalost, založte prosím issue v repozitáři Gem Wallet na GitHubu. Uveďte informace o svém prostředí, krocích sestavení a všech relevantních chybových hlášeních, abyste nám pomohli problém prošetřit.