Les builds reproductibles établissent un lien vérifiable entre le code source publié et le binaire d’une version. Notre couverture actuelle en matière de builds reproductibles s’applique à la version F-Droid pour Android. Nous prévoyons d’étendre cette couverture à d’autres canaux de distribution Android et iOS.

Android

F-Droid

Gem Wallet utilise l’infrastructure de build indépendante de F-Droid pour recompiler l’APK F-Droid et le vérifier avant publication.

Modèle de vérification

Gem Wallet publie un APK F-Droid signé pour chaque version. De leur côté, les serveurs de build F-Droid exécutent la recette de build publique dans un environnement propre :

  1. Les métadonnées F-Droid sélectionnent un commit Git exact et une version exacte du NDK Android.
  2. F-Droid récupère ce commit depuis le dépôt public de Gem Wallet.
  3. Les scripts publics de build reproductible installent la chaîne d’outils native épinglée et exécutent :app:assembleFdroidRelease.
  4. Le build produit un APK non signé. F-Droid télécharge l’APK correspondant signé par le développeur et confirme qu’il est signé avec l’empreinte de certificat déclarée dans AllowedAPKSigningKeys.
  5. F-Droid copie la signature de l’APK sur l’artefact recompilé et la vérifie. Les signatures Android APK Signature Scheme v2/v3 couvrent l’intégralité de l’APK en dehors du bloc de signature, de sorte qu’une vérification réussie exige que le contenu de l’APK recompilé corresponde octet par octet à la version publiée par Gem Wallet.
  6. F-Droid ne publie l’APK signé par le développeur que lorsque la vérification réussit. Une version qui ne se reproduit pas n’est pas publiée.

Contrôles pour des builds déterministes

Gem Wallet intègre des bibliothèques natives Rust, ce qui rend le résultat sensible aux différences de compilateur, d’éditeur de liens, de NDK, de plateforme hôte et d’optimiseur. Le build F-Droid contrôle ces entrées de la manière suivante :

  • épinglage des versions de la chaîne d’outils Rust et de cargo-ndk dans android/reproducible/versions.sh ;
  • installation de cargo-ndk avec --locked, tandis que les dépendances Rust de l’application sont résolues via le fichier Cargo.lock versionné ;
  • épinglage de la révision exacte du NDK Android à la fois dans le projet Android et dans les métadonnées F-Droid ;
  • compilation sur un hôte Linux x86_64 avec des chemins explicites vers l’éditeur de liens et l’archiveur du NDK ;
  • restriction des cibles natives de l’APK à armeabi-v7a et arm64-v8a, indépendamment de l’hôte de build x86_64 ;
  • utilisation du canal produit dédié fdroid, sans les modules Google de push et de review ;
  • désactivation de l’optimisation R8 avec -dontoptimize afin d’éviter une sortie DEX et des identifiants de mapping non déterministes ;
  • exécution de Gradle sans daemon ni cache de configuration, et purge des caches de transformation avant le build de release.

Le commit source exact, les commandes de build, le chemin de sortie, la révision du NDK, l’URL de l’APK upstream et le certificat de signature autorisé sont publics dans les métadonnées F-Droid. Les scripts qui configurent Rust, Cargo, la chaîne d’outils NDK et Gradle sont maintenus avec le code source de l’application dans android/reproducible.

Propriétés de sécurité et limites

Une vérification F-Droid réussie démontre que l’APK signé publié par Gem Wallet peut être reproduit à partir du commit source et de la recette de build déclarés. La recompilation est effectuée en dehors de l’infrastructure de Gem Wallet, ce qui réduit la dépendance à notre pipeline de publication comme unique point de confiance.

La reproductibilité ne prouve pas que le code source est exempt de vulnérabilités, que chaque dépendance est digne de confiance, ni que la chaîne d’outils de compilation retenue est exempte de toute compromission. Ces risques exigent une revue du code source, des contrôles des dépendances et la sécurisation de la chaîne d’outils, en complément des builds reproductibles.

L’état des builds et les versions vérifiées sont disponibles sur la page F-Droid de Gem Wallet.

Universal APK et Google Play

L’APK universel de Gem Wallet et la version Google Play ne sont actuellement pas couverts par la vérification F-Droid décrite ci-dessus. La prise en charge des builds reproductibles pour ces canaux de distribution Android est prévue dans le cadre de travaux futurs.

iOS

La version App Store n’est actuellement pas reproductible. La prise en charge des builds reproductibles pour iOS et la vérification indépendante du binaire de l’App Store sont prévues dans le cadre de travaux futurs.

Frequently Asked Questions

Les builds reproductibles permettent à quiconque de compiler Gem Wallet à partir du code source public et de vérifier que l’application obtenue correspond à la version officielle. Cela apporte une transparence supplémentaire et aide à confirmer que l’application publiée a été compilée à partir du même code source que celui disponible sur GitHub.
Open source signifie que le code source de Gem Wallet est disponible publiquement et peut être examiné par quiconque. Les builds reproductibles vont un cran plus loin en permettant à des développeurs indépendants et à des services comme F-Droid de compiler l’application à partir du code source déclaré et de vérifier que l’APK Android obtenu correspond octet par octet à la version officielle de Gem Wallet.
Oui. Vous pouvez compiler les applications Android et iOS à partir du code source public de Gem Wallet. L’application Android prend en charge les builds reproductibles à l’aide des scripts de build publics et de la chaîne d’outils épinglée. Vous pouvez également compiler et exécuter l’application iOS en local.
Les scripts de build reproductible et la configuration de la chaîne d’outils épinglée sont publics. Les métadonnées F-Droid déclarent le commit source exact, la révision du NDK Android, les commandes de build et l’APK attendu pour chaque version. F-Droid recompile l’application Android de manière indépendante et ne la publie que lorsque le contenu de l’APK correspond octet par octet à la version de Gem Wallet.
Si vous avez une question, rencontrez un problème de build ou constatez une divergence, veuillez ouvrir une issue dans le dépôt GitHub de Gem Wallet. Incluez des informations sur votre environnement, vos étapes de build et tout message d’erreur pertinent pour nous aider à examiner le problème.