रिप्रोड्यूसिबल बिल्ड्स प्रकाशित सोर्स कोड और रिलीज़ बाइनरी के बीच एक सत्यापन-योग्य कड़ी प्रदान करते हैं। हमारा वर्तमान रिप्रोड्यूसिबल-बिल्ड कवरेज Android F-Droid रिलीज़ पर लागू होता है। हम इस कवरेज को अतिरिक्त Android और iOS डिस्ट्रीब्यूशन चैनलों तक विस्तारित करने का इरादा रखते हैं।
Android
F-Droid
Gem Wallet प्रकाशन से पहले F-Droid APK को फिर से बिल्ड करने और सत्यापित करने के लिए स्वतंत्र F-Droid बिल्ड इन्फ्रास्ट्रक्चर का उपयोग करता है।
सत्यापन मॉडल
Gem Wallet प्रत्येक रिलीज़ के लिए एक हस्ताक्षरित F-Droid APK प्रकाशित करता है। इससे अलग, F-Droid बिल्ड सर्वर एक क्लीन एनवायरनमेंट से सार्वजनिक बिल्ड रेसिपी निष्पादित करते हैं:
- F-Droid मेटाडेटा एक सटीक Git कमिट और Android NDK संस्करण चुनता है।
- F-Droid उस कमिट को सार्वजनिक Gem Wallet रिपॉज़िटरी से चेकआउट करता है।
- सार्वजनिक रिप्रोड्यूसिबल बिल्ड स्क्रिप्ट्स पिन किया गया नेटिव टूलचेन इंस्टॉल करती हैं और
:app:assembleFdroidReleaseचलाती हैं। - बिल्ड एक अहस्ताक्षरित APK बनाता है। F-Droid संबंधित डेवलपर-हस्ताक्षरित APK डाउनलोड करता है और पुष्टि करता है कि वह
AllowedAPKSigningKeysमें घोषित सर्टिफिकेट फिंगरप्रिंट द्वारा हस्ताक्षरित है। - F-Droid APK हस्ताक्षर को फिर से बिल्ड किए गए आर्टिफैक्ट पर कॉपी करता है और उसे सत्यापित करता है। Android APK Signature Scheme v2/v3 हस्ताक्षर साइनिंग ब्लॉक के बाहर पूरे APK को कवर करते हैं, इसलिए सफल सत्यापन के लिए आवश्यक है कि फिर से बिल्ड किया गया APK पेलोड Gem Wallet रिलीज़ से बाइट-दर-बाइट मेल खाए।
- F-Droid डेवलपर-हस्ताक्षरित APK केवल तभी प्रकाशित करता है जब सत्यापन सफल होता है। जो रिलीज़ रिप्रोड्यूस नहीं होती, वह प्रकाशित नहीं की जाती।
डिटर्मिनिस्टिक बिल्ड नियंत्रण
Gem Wallet में Rust नेटिव लाइब्रेरीज़ शामिल हैं, जिससे आउटपुट कंपाइलर, लिंकर, NDK, होस्ट-प्लेटफ़ॉर्म और ऑप्टिमाइज़र के अंतरों के प्रति संवेदनशील हो जाता है। F-Droid बिल्ड इन इनपुट्स को इस प्रकार नियंत्रित करता है:
android/reproducible/versions.shमें Rust टूलचेन औरcargo-ndkसंस्करणों को पिन करके;cargo-ndkको--lockedके साथ इंस्टॉल करके, जबकि एप्लिकेशन की Rust डिपेंडेंसीज़ कमिट की गईCargo.lockसे रिज़ॉल्व होती हैं;- Android प्रोजेक्ट और F-Droid मेटाडेटा दोनों में सटीक Android NDK रिविज़न को पिन करके;
- स्पष्ट NDK लिंकर और आर्काइवर पाथ के साथ Linux
x86_64होस्ट पर बिल्ड करके; - नेटिव APK टार्गेट्स को
armeabi-v7aऔरarm64-v8aतक सीमित करके,x86_64बिल्ड होस्ट से स्वतंत्र रूप से; - Google पुश और रिव्यू मॉड्यूल के बिना, समर्पित
fdroidप्रोडक्ट चैनल का उपयोग करके; - नॉन-डिटर्मिनिस्टिक DEX आउटपुट और मैपिंग आइडेंटिफ़ायर को रोकने के लिए
-dontoptimizeके साथ R8 ऑप्टिमाइज़ेशन को अक्षम करके; - Gradle को डेमन या कॉन्फ़िगरेशन कैश के बिना चलाकर और रिलीज़ बिल्ड से पहले ट्रांसफ़ॉर्मेशन कैश साफ़ करके।
सटीक सोर्स कमिट, बिल्ड कमांड, आउटपुट पाथ, NDK रिविज़न, अपस्ट्रीम APK URL और अनुमत साइनिंग सर्टिफिकेट F-Droid मेटाडेटा में सार्वजनिक हैं। Rust, Cargo, NDK टूलचेन और Gradle को कॉन्फ़िगर करने वाली स्क्रिप्ट्स एप्लिकेशन सोर्स के साथ android/reproducible के अंतर्गत मेंटेन की जाती हैं।
सुरक्षा गुण और सीमाएँ
एक सफल F-Droid सत्यापन यह दर्शाता है कि Gem Wallet द्वारा प्रकाशित हस्ताक्षरित APK को घोषित सोर्स कमिट और बिल्ड रेसिपी से रिप्रोड्यूस किया जा सकता है। यह री-बिल्ड Gem Wallet इन्फ्रास्ट्रक्चर के बाहर किया जाता है, जिससे विश्वास के एकल बिंदु के रूप में हमारी रिलीज़ पाइपलाइन पर निर्भरता कम हो जाती है।
रिप्रोड्यूसिबिलिटी यह सिद्ध नहीं करती कि सोर्स कोड कमज़ोरियों से मुक्त है, कि हर डिपेंडेंसी भरोसेमंद है, या कि चुना गया कंपाइलर टूलचेन किसी समझौते से मुक्त है। इन जोखिमों के लिए रिप्रोड्यूसिबल बिल्ड्स के अतिरिक्त सोर्स समीक्षा, डिपेंडेंसी नियंत्रण और टूलचेन सुरक्षा आवश्यक हैं।
बिल्ड स्थिति और सत्यापित रिलीज़ Gem Wallet F-Droid पेज पर उपलब्ध हैं।
Universal APK और Google Play
Gem Wallet का यूनिवर्सल APK और Google Play रिलीज़ वर्तमान में ऊपर वर्णित F-Droid सत्यापन के अंतर्गत नहीं आते। इन Android डिस्ट्रीब्यूशन चैनलों के लिए रिप्रोड्यूसिबल-बिल्ड समर्थन भविष्य के कार्य के रूप में नियोजित है।
iOS
App Store रिलीज़ वर्तमान में रिप्रोड्यूसिबल नहीं है। iOS के लिए रिप्रोड्यूसिबल-बिल्ड समर्थन और App Store बाइनरी का स्वतंत्र सत्यापन भविष्य के कार्य के रूप में नियोजित है।