
Heimat des Signal-Protokolls sowie anderer kryptografischer Grundbausteine, die Signal ermöglichen.
libsignal enthält plattformunabhängige APIs, die von den offiziellen Signal-Clients und -Servern verwendet werden und als Java-, Swift- oder TypeScript-Bibliothek bereitgestellt werden. Die zugrunde liegenden Implementierungen sind in Rust geschrieben:
Dieses Repository wird von den Signal-Client-Apps (Android, iOS und Desktop) sowie serverseitig verwendet. Eine Verwendung außerhalb von Signal wird nicht unterstützt. Insbesondere sind die Produkte dieses Repositorys die Java-, Swift- und TypeScript-Bibliotheken, die die zugrunde liegenden Rust-Implementierungen kapseln. Alle APIs und Implementierungen können ohne Vorankündigung geändert werden, ebenso wie die JNI-, C- und Node-Add-on-„Bridge“-Ebenen. Nicht abwärtskompatible Änderungen an den Java-, Swift-, TypeScript- und Nicht-Bridge-Rust-APIs werden jedoch nach bestem Bemühen in der Versionsnummer berücksichtigt, einschließlich Erhöhungen der Mindestversionen der unterstützten Tools.
Um etwas in diesem Repository zu erstellen, müssen Sie Rust sowie aktuelle Versionen von Clang, libclang, CMake, Make, protoc, Python (3.9+) und git installiert haben.
Auf einem Debian-ähnlichen System können Sie diese zusätzlichen Abhängigkeiten über apt installieren:
$ apt-get install clang libclang-dev cmake make protobuf-compiler libprotobuf-dev python3 git
Für macOS stellen wir ein nach bestem Bemühen gepflegtes Skript zur Einrichtung der Rust-Toolchain bereit, das Sie wie folgt ausführen können:
$ bin/mac_setup.sh
Der Build verwendet derzeit eine bestimmte Version des Rust-Nightly-Compilers, die von cargo automatisch heruntergeladen wird. Um die grundlegenden Protokollbibliotheken zu erstellen und zu testen:
$ cargo build
...
$ cargo test
...
Die oben genannten grundlegenden Tools sollten für die meiste Rust-Entwicklung von libsignal ausreichen.
Möglicherweise benötigen Sie irgendwann zusätzliche Rust-Tools wie taplo für die Codeformatierung.
Sie sollten alle Rust-Tools, die den Build beeinflussen können, immer über cargo installieren und nicht über Ihren Systempaketmanager (z. B. apt oder brew). Paketmanager enthalten manchmal veraltete Versionen dieser Tools, die den Build aufgrund von Inkompatibilitäten brechen können (insbesondere cbindgen).
Um die wichtigsten zusätzlichen Rust-Abhängigkeiten in den von uns verwendeten Versionen zu installieren, können Sie die folgenden Befehle ausführen:
$ 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
Um für Android zu erstellen, müssen Sie mehrere zusätzliche Pakete installieren, darunter ein JDK, das Android-NDK/SDK, und die Android-Ziele mit folgendem Befehl zum Rust-Compiler hinzufügen:
rustup target add armv7-linux-androideabi aarch64-linux-android i686-linux-android x86_64-linux-android
Unsere offiziell unterstützte JDK-Version für Android-Builds ist JDK 21. Stellen Sie daher sicher, dass Sie z. B. OpenJDK 21 installieren, und setzen Sie dann JAVA_HOME darauf.
Auf macOS können Sie dies einfach über Folgendes tun:
export JAVA_HOME=$(/usr/libexec/java_home -v 21)
Unter Linux variiert die Vorgehensweise je nach Distribution. Für Debian-basierte Distributionen wie Ubuntu können Sie Folgendes verwenden:
sudo update-alternatives --config java
Wir committen außerdem eine .tools_version-Datei zur Verwendung mit Laufzeit-Versionsmanagern.
Um das Java/Android-jar und aar zu erstellen und die Tests auszuführen:
$ cd java
$ ./gradlew test
$ ./gradlew build # if you need AAR outputs
Sie können -P debugLevelLogs an Gradle übergeben, um ohne das Herausfiltern von Debug- und Verbose-Level-Logs aus Rust zu erstellen, sowie -P jniTypeTagging, um zusätzliche Prüfungen im Rust-JNI-Brückencode zu aktivieren.
Alternativ ist ein Build-System mit Docker verfügbar:
$ cd java
$ make
Wenn Sie neue APIs für Java bereitstellen, müssen Sie zusätzlich zum Neuerstellen rust/bridge/jni/bin/gen_java_decl.py ausführen. Dazu muss das Rust-Tool cbindgen installiert sein, wie oben beschrieben.
Signal veröffentlicht Java-Pakete für den eigenen Gebrauch unter den Namen org.signal:libsignal-server, org.signal:libsignal-client und org.signal:libsignal-android. libsignal-client und libsignal-server enthalten native Bibliotheken für Debian-basiertes x86_64-Linux sowie Windows (x86_64) und macOS (x86_64 und arm64). libsignal-android enthält native Bibliotheken für armeabi-v7a, arm64-v8a, x86 und x86_64-Android. Diese befinden sich in einem Maven-Repository unter https://build-artifacts.signal.org/libraries/maven/; zur Verwendung mit Gradle fügen Sie Ihrem repositories-Block Folgendes hinzu:
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/")
}
Ältere Builds wurden stattdessen in Maven Central veröffentlicht.
Beim Erstellen für Android benötigen Sie sowohl libsignal-android als auch libsignal-client, aber die Windows- und macOS-Bibliotheken in libsignal-client werden nicht automatisch aus Ihrer finalen App ausgeschlossen. Sie können sie mit packaging explizit ausschließen:
android {
// ...
packaging {
resources {
excludes += setOf("libsignal_jni*.dylib", "signal_jni*.dll")
}
}
// ...
}
Sie können zusätzlich libsignal_jni_testing.so ausschließen, wenn Sie keine der für Client-Tests vorgesehenen APIs verwenden möchten.
Die Datei gradle.properties von Signal-Android enthält eine auskommentierte Zeile, um libsignal als Teil des Builds einzubinden. Kommentieren Sie diese Zeile aus und passen Sie den Pfad an; optional können Sie die Architekturen, für die Sie bauen möchten, einschränken, indem Sie androidArchs=aarch64 zur gradle.properties von libsignal hinzufügen. (Die Menge der erkannten Architekturen befindet sich in java/build_jni.sh.) Wenn Sie eine IDE verwenden, müssen Sie an dieser Stelle die Gradle-Struktur neu importieren. Wenn Sie fertig sind, machen Sie die Änderungen an der gradle.properties der Android-App rückgängig und importieren Sie erneut.
Beachten Sie, dass dadurch die Rust-Teile des Projekts nicht in die IDE importiert werden. In einer Mehrsprachen-IDE wie IDEA ist das zwar möglich, aber heikel; Stand 2025 ist der zuverlässigste Weg, zuerst das Android-Projekt zu öffnen, dann das Wurzelverzeichnis des libsignal-Repositorys als Rust-Projekt hinzuzufügen (nur das oberste Verzeichnis), und erst danach die Änderungen an gradle.properties vorzunehmen.
Informationen zum Swift-Build-Prozess finden Sie in swift/README.md.
Sie benötigen eine installierte Node-Version, um zu bauen. Wenn Sie nvm haben, können Sie nvm use ausführen, um automatisch eine passende Version auszuwählen.
Wir verwenden npm als Paketmanager und ein Python-Skript zur Steuerung des Builds der Rust-Bibliothek, das über npm run build verfügbar ist.
$ cd node
$ nvm use
$ npm install
$ npm run build
$ npm run tsc
$ npm run test
Wenn Sie Änderungen lokal testen, können Sie npm run build verwenden, um einen inkrementellen Neuaufbau der Rust-Bibliothek durchzuführen. Alternativ führt npm run build-with-debug-level-logs einen Neuaufbau durch, ohne Debug- und Verbose-Level-Logs herauszufiltern.
Wenn Sie neue APIs für Node bereitstellen, müssen Sie zusätzlich zum Neuerstellen just generate-node ausführen.
Signal veröffentlicht das NPM-Paket @signalapp/libsignal-client für den eigenen Gebrauch, einschließlich nativer Bibliotheken für Windows, macOS und Debian-basiertes Linux. Für alle drei Plattformen sind sowohl x64- als auch arm64-Builds enthalten, aber die arm64-Builds für Windows und Linux gelten als experimentell, da es für diese Architekturen keine offiziellen Signal-Builds gibt.
Nachdem Sie alle oben genannten Build-Befehle ausgeführt haben, ändern Sie die Abhängigkeit @signalapp/libsignal-client in der package.json der Desktop-App auf "link:path/to/libsignal/node" und führen Sie pnpm install aus. Wenn Sie fertig sind, machen Sie die Änderungen an package.json rückgängig und führen Sie pnpm install erneut aus.
Signal akzeptiert externe Beiträge zu diesem Projekt. Wenn die Änderung jedoch nicht einfach und leicht verständlich ist, z. B. die Behebung eines Fehlers oder eines Portabilitätsproblems, das Hinzufügen eines neuen Tests oder die Verbesserung der Leistung, öffnen Sie bitte zuerst ein Issue, um Ihre beabsichtigte Änderung zu besprechen, da nicht alle Änderungen akzeptiert werden können.
Beiträge, die nicht direkt von einer der offiziellen Signal-Client-Apps verwendet werden, können trotzdem in Betracht gezogen werden, allerdings nur, wenn sie keine unzumutbare Wartungslast darstellen oder den Zielen des Projekts zuwiderlaufen.
Für alle Beiträge ist die Unterzeichnung einer CLA (Contributor License Agreement) erforderlich.
Sie können den Styler für das gesamte Projekt mit folgendem Befehl ausführen:
just format-all
Sie können umfangreichere Tests sowie Linter und Clippy mit folgendem Befehl ausführen:
just check-pre-commit
Wenn Sie einen PR erstellen, der Abhängigkeiten anpasst, müssen Sie unsere Danksagungsdateien neu generieren. Siehe acknowledgments/README.md.
Diese Distribution enthält kryptografische Software. Das Land, in dem Sie sich derzeit aufhalten, kann Beschränkungen für den Import, den Besitz, die Verwendung und/oder die Wiederausfuhr von Verschlüsselungssoftware in ein anderes Land vorsehen. Bevor Sie Verschlüsselungssoftware verwenden, prüfen Sie bitte die Gesetze, Vorschriften und Richtlinien Ihres Landes bezüglich des Imports, des Besitzes oder der Verwendung und der Wiederausfuhr von Verschlüsselungssoftware, um festzustellen, ob dies erlaubt ist. Weitere Informationen finden Sie unter http://www.wassenaar.org/.
Das Bureau of Industry and Security (BIS) des US-Handelsministeriums hat diese Software als Export Commodity Control Number (ECCN) 5D002.C.1 eingestuft, was Informationssicherheitssoftware umfasst, die kryptografische Funktionen mit asymmetrischen Algorithmen verwendet oder ausführt. Die Form und Art dieser Distribution macht sie sowohl für den Objektcode als auch für den Quellcode unter der Lizenzausnahme ENC Technology Software Unrestricted (TSU) exportfähig (siehe BIS Export Administration Regulations, Abschnitt 740.13).
Copyright 2020-2026 Signal Messenger, LLC
Lizenziert unter der GNU AGPLv3: https://www.gnu.org/licenses/agpl-3.0.html