Las compilaciones reproducibles proporcionan un vínculo verificable entre el código fuente publicado y el binario de una versión. Nuestra cobertura actual de compilaciones reproducibles se aplica a la versión de F-Droid para Android. Tenemos previsto ampliar esta cobertura a otros canales de distribución de Android e iOS.

Android

F-Droid

Gem Wallet utiliza la infraestructura de compilación independiente de F-Droid para recompilar el APK de F-Droid y verificarlo antes de su publicación.

Modelo de verificación

Gem Wallet publica un APK de F-Droid firmado para cada versión. Por separado, los servidores de compilación de F-Droid ejecutan la receta pública de compilación desde un entorno limpio:

  1. Los metadatos de F-Droid seleccionan un commit de Git exacto y una versión exacta del NDK de Android.
  2. F-Droid obtiene ese commit del repositorio público de Gem Wallet.
  3. Los scripts públicos de compilación reproducible instalan la cadena de herramientas nativa fijada y ejecutan :app:assembleFdroidRelease.
  4. La compilación produce un APK sin firmar. F-Droid descarga el APK correspondiente firmado por el desarrollador y confirma que está firmado por el certificado cuya huella digital está declarada en AllowedAPKSigningKeys.
  5. F-Droid copia la firma del APK al artefacto recompilado y lo verifica. Las firmas del APK Signature Scheme v2/v3 de Android cubren el APK completo fuera del bloque de firma, por lo que una verificación exitosa requiere que el contenido del APK recompilado coincida byte por byte con la versión publicada de Gem Wallet.
  6. F-Droid publica el APK firmado por el desarrollador solo cuando la verificación es exitosa. Una versión que no se reproduce no se publica.

Controles de compilación determinista

Gem Wallet incluye bibliotecas nativas de Rust, lo que hace que el resultado sea sensible a diferencias de compilador, enlazador, NDK, plataforma host y optimizador. La compilación de F-Droid controla estas entradas de la siguiente manera:

  • fijando las versiones de la cadena de herramientas de Rust y de cargo-ndk en android/reproducible/versions.sh;
  • instalando cargo-ndk con --locked, mientras que las dependencias de Rust de la aplicación se resuelven mediante el Cargo.lock versionado en el repositorio;
  • fijando la revisión exacta del NDK de Android tanto en el proyecto de Android como en los metadatos de F-Droid;
  • compilando en un host Linux x86_64 con rutas explícitas del enlazador y el archivador del NDK;
  • restringiendo los destinos nativos del APK a armeabi-v7a y arm64-v8a, independientemente del host de compilación x86_64;
  • usando el canal de producto dedicado fdroid, sin los módulos de notificaciones push y de reseñas de Google;
  • desactivando la optimización de R8 con -dontoptimize para evitar una salida DEX no determinista e identificadores de mapeo no deterministas;
  • ejecutando Gradle sin el daemon ni la caché de configuración y limpiando las cachés de transformación antes de la compilación de lanzamiento.

El commit exacto del código fuente, los comandos de compilación, la ruta de salida, la revisión del NDK, la URL del APK upstream y el certificado de firma permitido son públicos en los metadatos de F-Droid. Los scripts que configuran Rust, Cargo, la cadena de herramientas del NDK y Gradle se mantienen junto con el código fuente de la aplicación en android/reproducible.

Propiedades de seguridad y limitaciones

Una verificación exitosa de F-Droid demuestra que el APK firmado publicado por Gem Wallet puede reproducirse a partir del commit de código fuente y la receta de compilación declarados. La recompilación se realiza fuera de la infraestructura de Gem Wallet, lo que reduce la dependencia de nuestro pipeline de lanzamiento como punto único de confianza.

La reproducibilidad no demuestra que el código fuente esté libre de vulnerabilidades, que cada dependencia sea confiable o que la cadena de herramientas de compilación seleccionada no esté comprometida. Esos riesgos requieren revisión del código fuente, controles de dependencias y seguridad de la cadena de herramientas, además de las compilaciones reproducibles.

El estado de las compilaciones y las versiones verificadas están disponibles en la página de Gem Wallet en F-Droid.

Universal APK y Google Play

El APK universal de Gem Wallet y la versión de Google Play actualmente no están cubiertos por la verificación de F-Droid descrita anteriormente. El soporte para compilaciones reproducibles en estos canales de distribución de Android está previsto como trabajo futuro.

iOS

La versión de la App Store actualmente no es reproducible. El soporte para compilaciones reproducibles en iOS y la verificación independiente del binario de la App Store están previstos como trabajo futuro.

Frequently Asked Questions

Las compilaciones reproducibles permiten que cualquier persona compile Gem Wallet a partir del código fuente público y verifique que la aplicación resultante coincide con la versión oficial. Esto aporta transparencia adicional y ayuda a confirmar que la aplicación publicada se compiló a partir del mismo código fuente disponible en GitHub.
Código abierto significa que el código fuente de Gem Wallet está disponible públicamente y puede ser revisado por cualquier persona. Las compilaciones reproducibles van un paso más allá al permitir que desarrolladores independientes y servicios como F-Droid compilen la aplicación a partir del código fuente declarado y verifiquen que el APK de Android resultante coincide byte por byte con la versión oficial de Gem Wallet.
Sí. Puede compilar tanto la aplicación de Android como la de iOS a partir del código fuente público de Gem Wallet. La aplicación de Android admite compilaciones reproducibles mediante los scripts públicos de compilación y la cadena de herramientas fijada. También puede compilar y ejecutar la aplicación de iOS de forma local.
Los scripts de compilación reproducible y la configuración de la cadena de herramientas fijada son públicos. Los metadatos de F-Droid declaran el commit exacto del código fuente, la revisión del NDK de Android, los comandos de compilación y el APK esperado para cada versión. F-Droid recompila la aplicación de Android de forma independiente y la publica solo cuando el contenido del APK coincide byte por byte con la versión de Gem Wallet.
Si tiene una pregunta, se encuentra con un problema de compilación o detecta una discrepancia, abra un issue en el repositorio de GitHub de Gem Wallet. Incluya información sobre su entorno, los pasos de compilación y cualquier mensaje de error relevante para ayudarnos a investigar el problema.