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:
- Los metadatos de F-Droid seleccionan un commit de Git exacto y una versión exacta del NDK de Android.
- F-Droid obtiene ese commit del repositorio público de Gem Wallet.
- Los scripts públicos de compilación reproducible instalan la cadena de herramientas nativa fijada y ejecutan
:app:assembleFdroidRelease. - 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. - 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.
- 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-ndkenandroid/reproducible/versions.sh; - instalando
cargo-ndkcon--locked, mientras que las dependencias de Rust de la aplicación se resuelven mediante elCargo.lockversionado 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_64con rutas explícitas del enlazador y el archivador del NDK; - restringiendo los destinos nativos del APK a
armeabi-v7ayarm64-v8a, independientemente del host de compilaciónx86_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
-dontoptimizepara 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.