
Signal Protocol तथा अन्य क्रिप्टोग्राफ़िक प्रिमिटिव्स का घर, जो Signal को संभव बनाते हैं।
libsignal में आधिकारिक Signal क्लाइंट और सर्वर द्वारा उपयोग किए जाने वाले प्लेटफ़ॉर्म-अज्ञेय APIs शामिल हैं, जो Java, Swift, या TypeScript लाइब्रेरी के रूप में उपलब्ध हैं। अंतर्निहित कार्यान्वयन Rust में लिखे गए हैं:
यह रिपॉज़िटरी Signal क्लाइंट ऐप्स (Android, iOS, और Desktop) के साथ-साथ सर्वर-साइड द्वारा भी उपयोग की जाती है। Signal के बाहर उपयोग असमर्थित है। विशेष रूप से, इस रिपॉज़िटरी के उत्पाद Java, Swift, और TypeScript लाइब्रेरी हैं जो अंतर्निहित Rust कार्यान्वयन को रैप करती हैं। सभी APIs और कार्यान्वयन बिना सूचना के परिवर्तन के अधीन हैं, जैसे कि JNI, C, और Node add-on "bridge" लेयर। हालाँकि, Java, Swift, TypeScript, और non-bridge Rust APIs में पश्चगामी-असंगत परिवर्तन सर्वोत्तम-प्रयास के आधार पर संस्करण संख्या में प्रतिबिंबित होंगे, जिसमें न्यूनतम समर्थित टूल संस्करणों में वृद्धि भी शामिल है।
इस रिपॉज़िटरी में कुछ भी बिल्ड करने के लिए आपके पास Rust इंस्टॉल होना चाहिए, साथ ही Clang, libclang, CMake, Make, protoc, Python (3.9+), और git के नवीन संस्करण होने चाहिए।
Debian-जैसे सिस्टम पर, आप इन अतिरिक्त निर्भरताओं को apt के माध्यम से प्राप्त कर सकते हैं:
$ apt-get install clang libclang-dev cmake make protobuf-compiler libprotobuf-dev python3 git
macOS पर, हमारे पास Rust टूलचेन सेट करने के लिए एक सर्वोत्तम-प्रयास अनुरक्षित स्क्रिप्ट है जिसे आप इस प्रकार चला सकते हैं:
$ bin/mac_setup.sh
बिल्ड वर्तमान में Rust स्थिर कंपाइलर के एक विशिष्ट संस्करण का उपयोग करता है, जिसे cargo द्वारा स्वचालित रूप से डाउनलोड किया जाएगा। बुनियादी प्रोटोकॉल लाइब्रेरी को बिल्ड और टेस्ट करने के लिए:
$ cargo build
...
$ cargo test
...
ऊपर दिए गए बुनियादी टूल्स आपको अधिकांश libsignal Rust विकास के लिए तैयार कर देंगे।
समय के साथ, आप पा सकते हैं कि आपको कुछ अतिरिक्त Rust टूल्स की आवश्यकता है जैसे कोड फ़ॉर्मेटिंग के लिए taplo।
आपको हमेशा अपने सिस्टम पैकेज मैनेजर (जैसे apt या brew) के बजाय cargo से कोई भी Rust टूल इंस्टॉल करना चाहिए जो बिल्ड को प्रभावित कर सकता है। पैकेज मैनेजर में कभी-कभी इन टूल्स के पुराने संस्करण होते हैं जो असंगतता समस्याओं (विशेष रूप से cbindgen) के साथ बिल्ड को तोड़ सकते हैं।
हमारे द्वारा उपयोग किए जाने वाले संस्करणों से मेल खाने वाली मुख्य Rust अतिरिक्त निर्भरताओं को इंस्टॉल करने के लिए, आप निम्नलिखित कमांड चला सकते हैं:
$ cargo +stable install --version "$(cat acknowledgments/cargo-about-version)" --locked cargo-about
$ cargo +stable install --version "$(cat .taplo-cli-version)" --locked taplo-cli
$ cargo +stable install cargo-fuzz
Android के लिए बिल्ड करने के लिए आपको कई अतिरिक्त पैकेज इंस्टॉल करने होंगे जिनमें JDK, Android NDK/SDK शामिल हैं, और Rust कंपाइलर में Android टार्गेट जोड़ने होंगे, इसका उपयोग करके
rustup target add armv7-linux-androideabi aarch64-linux-android i686-linux-android x86_64-linux-android
Android बिल्ड के लिए हमारा आधिकारिक रूप से समर्थित JDK संस्करण JDK 21 है, इसलिए सुनिश्चित करें कि आप OpenJDK 21 इंस्टॉल करें, और फिर JAVA_HOME को उस पर इंगित करें।
आप macOS पर इसे आसानी से इस प्रकार कर सकते हैं:
export JAVA_HOME=$(/usr/libexec/java_home -v 21)
Linux पर, यह करने का तरीका वितरण के अनुसार भिन्न होता है। Ubuntu जैसे Debian आधारित वितरणों के लिए, आप उपयोग कर सकते हैं:
sudo update-alternatives --config java
हम रनटाइम संस्करण प्रबंधकों के उपयोग के लिए एक .tools_version फ़ाइल भी चेक-इन करते हैं।
Java/Android jar और aar को बिल्ड करने, और टेस्ट चलाने के लिए:
$ cd java
$ ./gradlew test
$ ./gradlew build # if you need AAR outputs
आप Gradle को -P debugLevelLogs पास कर सकते हैं ताकि Rust से debug- और verbose-स्तर के
लॉग फ़िल्टर किए बिना बिल्ड हो, और Rust JNI ब्रिजिंग कोड में अतिरिक्त जाँच सक्षम करने के लिए -P jniTypeTagging।
वैकल्पिक रूप से, Docker का उपयोग करने वाला एक बिल्ड सिस्टम उपलब्ध है:
$ cd java
$ make
Java को नए APIs उजागर करते समय, आपको पुनर्निर्माण के अतिरिक्त rust/bridge/jni/bin/gen_java_decl.py चलाना होगा। इसके लिए cbindgen Rust टूल इंस्टॉल करना आवश्यक है, जैसा कि ऊपर विस्तार से बताया गया है।
Signal अपने स्वयं के उपयोग के लिए Java पैकेज प्रकाशित करता है, org.signal:libsignal-server,
org.signal:libsignal-client, और org.signal:libsignal-android नामों के अंतर्गत। libsignal-client और libsignal-server
में Debian-शैली के x86_64 Linux के साथ-साथ Windows (x86_64) और macOS
(x86_64 और arm64) के लिए नेटिव लाइब्रेरी शामिल हैं। libsignal-android में armeabi-v7a, arm64-v8a, x86, और
x86_64 Android के लिए नेटिव लाइब्रेरी शामिल हैं। ये
https://build-artifacts.signal.org/libraries/maven/ पर एक Maven रिपॉज़िटरी में स्थित हैं; Gradle से उपयोग के लिए, अपने
repositories ब्लॉक में निम्नलिखित जोड़ें:
maven {
name = "SignalBuildArtifacts"
// The "uri()" part is only necessary for Kotlin Gradle; Groovy Gradle accepts a bare string here.
url = uri("https://build-artifacts.signal.org/libraries/maven/")
}
पुराने बिल्ड इसके बजाय Maven Central पर प्रकाशित किए गए थे।
Android के लिए बिल्ड करते समय आपको libsignal-android और libsignal-client दोनों की आवश्यकता होती है, लेकिन libsignal-client में Windows
और macOS लाइब्रेरी आपके अंतिम ऐप से स्वचालित रूप से बाहर नहीं रखी जाएँगी। आप
packaging का उपयोग करके उन्हें स्पष्ट रूप से बाहर कर सकते हैं:
android {
// ...
packaging {
resources {
excludes += setOf("libsignal_jni*.dylib", "signal_jni*.dll")
}
}
// ...
}
यदि आप क्लाइंट परीक्षण के लिए इच्छित कोई भी API उपयोग करने की योजना नहीं बनाते हैं तो आप libsignal_jni_testing.so को भी बाहर कर सकते हैं।
Signal-Android की gradle.properties फ़ाइल में libsignal को बिल्ड का हिस्सा बनाने के लिए एक कमेंट-आउट लाइन है। उसे अनकमेंट करें और पथ समायोजित करें; वैकल्पिक रूप से, आप libsignal की gradle.properties में androidArchs=aarch64 जोड़कर उन आर्किटेक्चर को प्रतिबंधित कर सकते हैं जिनके लिए आप बिल्ड करना चाहते हैं। (मान्यता प्राप्त आर्किटेक्चर का सेट java/build_jni.sh में है।) यदि आप IDE का उपयोग कर रहे हैं, तो आपको इस बिंदु पर Gradle संरचना को फिर से आयात करना होगा। जब आपका काम पूरा हो जाए, तो Android ऐप की gradle.properties में परिवर्तनों को वापस लौटाएँ और एक बार फिर से आयात करें।
ध्यान दें कि यह प्रोजेक्ट के Rust भागों को IDE में आयात नहीं करता है। IDEA जैसे बहु-भाषा IDE में ऐसा करना संभव है, लेकिन पेचीदा है; 2025 तक इसे करने का सबसे विश्वसनीय तरीका यह है कि पहले Android प्रोजेक्ट खोलें, फिर libsignal रेपो रूट डायरेक्टरी को Rust प्रोजेक्ट के रूप में जोड़ें (केवल शीर्ष-स्तरीय डायरेक्टरी सहित), और उसके बाद ही gradle.properties में परिवर्तन करें।
Swift बिल्ड प्रक्रिया के बारे में जानने के लिए swift/README.md देखें
बिल्ड करने के लिए आपके पास Node इंस्टॉल होना चाहिए। यदि आपके पास nvm है, तो आप स्वचालित रूप से उपयुक्त संस्करण चुनने के लिए nvm use चला सकते हैं।
हम अपने पैकेज मैनेजर के रूप में npm का उपयोग करते हैं, और Rust लाइब्रेरी को बिल्ड करने को नियंत्रित करने के लिए एक Python स्क्रिप्ट का उपयोग करते हैं, जो npm run build के रूप में सुलभ है।
$ cd node
$ nvm use
$ npm install
$ npm run build
$ npm run tsc
$ npm run test
स्थानीय रूप से परिवर्तनों का परीक्षण करते समय, आप Rust लाइब्रेरी का इंक्रीमेंटल पुनर्निर्माण करने के लिए npm run build का उपयोग कर सकते हैं। वैकल्पिक रूप से, npm run build-with-debug-level-logs debug- और verbose-स्तर के लॉग फ़िल्टर किए बिना पुनर्निर्माण करेगा।
Node को नए APIs उजागर करते समय, आपको पुनर्निर्माण के अतिरिक्त just generate-node चलाना होगा।
Signal अपने स्वयं के उपयोग के लिए NPM पैकेज @signalapp/libsignal-client प्रकाशित करता है, जिसमें Windows, macOS, और Debian-शैली के Linux के लिए नेटिव
लाइब्रेरी शामिल हैं। तीनों प्लेटफ़ॉर्मों के लिए x64 और arm64 दोनों बिल्ड शामिल हैं, लेकिन Windows और Linux के लिए arm64 बिल्ड प्रायोगिक माने जाते हैं, क्योंकि उन आर्किटेक्चर के लिए Signal के कोई आधिकारिक बिल्ड नहीं हैं।
ऊपर दिए गए सभी बिल्ड कमांड चलाने के बाद, Desktop ऐप की package.json में @signalapp/libsignal-client निर्भरता को "link:path/to/libsignal/node" में समायोजित करें और pnpm install चलाएँ। जब आपका काम पूरा हो जाए, तो package.json में परिवर्तनों को वापस लौटाएँ और फिर से pnpm install चलाएँ।
Signal इस प्रोजेक्ट में बाहरी योगदान स्वीकार करता है। हालाँकि जब तक परिवर्तन सरल और आसानी से समझने योग्य न हो, उदाहरण के लिए कोई बग या पोर्टेबिलिटी समस्या ठीक करना, एक नया टेस्ट जोड़ना, या प्रदर्शन में सुधार करना, पहले अपने इच्छित परिवर्तन पर चर्चा करने के लिए एक इश्यू खोलें क्योंकि सभी परिवर्तन स्वीकार नहीं किए जा सकते।
जो योगदान Signal के किसी आधिकारिक क्लाइंट ऐप द्वारा सीधे उपयोग नहीं किए जाएँगे, उन पर अभी भी विचार किया जा सकता है, लेकिन केवल तभी जब वे अनुचित रखरखाव बोझ न डालें या प्रोजेक्ट के लक्ष्यों से टकराव न करें।
सभी योगदानों के लिए CLA (Contributor License Agreement) पर हस्ताक्षर करना आवश्यक है।
आप इस कमांड को चलाकर पूरे प्रोजेक्ट पर स्टाइलर चला सकते हैं:
just format-all
आप इस कमांड को चलाकर अधिक व्यापक टेस्ट के साथ-साथ linters और clippy भी चला सकते हैं:
just check-pre-commit
जब आप निर्भरताओं को समायोजित करने वाला PR बनाते हैं, तो आपको हमारी आभार फ़ाइलों को पुनर्जनित करना होगा। acknowledgments/README.md देखें।
इस वितरण में क्रिप्टोग्राफ़िक सॉफ़्टवेयर शामिल है। जिस देश में आप वर्तमान में निवास करते हैं, वहाँ एन्क्रिप्शन सॉफ़्टवेयर के आयात, कब्जे, उपयोग, और/या किसी अन्य देश में पुनः-निर्यात पर प्रतिबंध हो सकते हैं। किसी भी एन्क्रिप्शन सॉफ़्टवेयर का उपयोग करने से पहले, कृपया एन्क्रिप्शन सॉफ़्टवेयर के आयात, कब्जे, या उपयोग, और पुनः-निर्यात से संबंधित अपने देश के कानूनों, नियमों और नीतियों की जाँच करें, यह देखने के लिए कि क्या यह अनुमत है। अधिक जानकारी के लिए http://www.wassenaar.org/ देखें।
अमेरिकी सरकार के वाणिज्य विभाग, उद्योग और सुरक्षा ब्यूरो (BIS) ने इस सॉफ़्टवेयर को Export Commodity Control Number (ECCN) 5D002.C.1 के रूप में वर्गीकृत किया है, जिसमें असममित एल्गोरिदम के साथ क्रिप्टोग्राफ़िक कार्यों का उपयोग या निष्पादन करने वाला सूचना सुरक्षा सॉफ़्टवेयर शामिल है। इस वितरण का रूप और तरीका इसे ऑब्जेक्ट कोड और सोर्स कोड दोनों के लिए License Exception ENC Technology Software Unrestricted (TSU) अपवाद (BIS Export Administration Regulations, Section 740.13 देखें) के अंतर्गत निर्यात के लिए पात्र बनाता है।
Copyright 2020-2026 Signal Messenger, LLC
GNU AGPLv3 के अंतर्गत लाइसेंस प्राप्त: https://www.gnu.org/licenses/agpl-3.0.html