
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. Die 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 umhüllen. Alle APIs und Implementierungen können ohne Vorankündigung geändert werden, ebenso wie die JNI-, C- und Node-Add-on- "Bridge"-Schichten. Rückwärtsinkompatible Änderungen an den Java-, Swift-, TypeScript- und Nicht-Bridge-Rust-APIs werden jedoch nach bestem Bemühen in der Versionsnummer widergespiegelt, einschließlich Erhöhungen der minimal unterstützten Tool-Versionen.
Um irgendetwas in diesem Repository zu erstellen, müssen Sie Rust installiert haben, sowie aktuelle Versionen von Clang, libclang, CMake, Make, protoc, Python (3.9+) und git.
Auf einem Debian-ähnlichen System können Sie diese zusätzlichen Abhängigkeiten über apt erhalten:
$ apt-get install clang libclang-dev cmake make protobuf-compiler libprotobuf-dev python3 git
Auf macOS haben wir ein nach bestem Bemühen gepflegtes Skript zur Einrichtung der Rust-Toolchain, das Sie ausführen können mit:
$ bin/mac_setup.sh
Der Build verwendet derzeit eine bestimmte Version des stabilen Rust-Compilers, die automatisch von cargo heruntergeladen wird. Um die grundlegenden Protokoll- Bibliotheken zu erstellen und zu testen:
$ cargo build
...
$ cargo test
...
Die grundlegenden Tools oben sollten Sie für die meisten libsignal-Rust-Entwicklungen einrichten.
Mit der Zeit werden Sie möglicherweise feststellen, dass Sie einige zusätzliche Rust-Tools wie taplo für die Codeformatierung benötigen.
Sie sollten alle Rust-Tools, die Sie benötigen und die den Build beeinflussen könnten, immer von cargo und nicht von Ihrem System-
Paketmanager (z. B. apt oder brew) installieren. Paketmanager enthalten manchmal veraltete Versionen dieser Tools, die den
Build mit Inkompatibilitätsproblemen brechen können (insbesondere cbindgen).
Um die wichtigsten zusätzlichen Rust-Abhängigkeiten passend zu 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 zum Rust-Compiler hinzufügen, mit
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 also sicher, dass Sie z. B. OpenJDK 21 installieren und dann JAVA_HOME darauf verweisen.
Auf macOS können Sie dies einfach tun über:
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 verwenden:
sudo update-alternatives --config java
Wir checken außerdem eine .tools_version-Datei zur Verwendung mit Laufzeit-Versionsmanagern ein.
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 Herausfiltern von Debug- und Verbose-Level-
Logs aus Rust zu erstellen, und -P jniTypeTagging, um zusätzliche Prüfungen im Rust-JNI-Bridging-Code zu aktivieren.
Alternativ steht ein Build-System mit Docker zur Verfügung:
$ 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. Dies erfordert die Installation des cbindgen-Rust-Tools, 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/; für die Verwendung von Gradle aus fügen Sie Folgendes zu Ihrem
repositories-Block 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 auf 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 endgültigen App ausgeschlossen. Sie können
sie explizit mit packaging 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 nicht vorhaben, eine der APIs zu verwenden,
die für Client-Tests vorgesehen sind.
Die Signal-Android gradle.properties-Datei enthält eine auskommentierte Zeile, um libsignal als Teil des Builds einzubinden. Kommentieren Sie diese aus und passen Sie den Pfad an; optional können Sie die Architekturen, für die Sie erstellen möchten, einschränken, indem Sie androidArchs=aarch64 zu libsignals gradle.properties hinzufügen. (Die Menge der erkannten Architekturen befindet sich in java/build_jni.sh.) Wenn Sie eine IDE verwenden, müssen Sie die Gradle-Struktur an dieser Stelle 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 dies nicht die Rust-Teile des Projekts in die IDE importiert. Dies in einer mehrsprachigen IDE wie IDEA zu tun, ist möglich, aber heikel; Stand 2025 ist der zuverlässigste Weg, dies zu tun, zuerst das Android-Projekt zu öffnen, das libsignal-Repo-Stammverzeichnis als zweites als Rust-Projekt hinzuzufügen (nur das oberste Verzeichnis einschließend) und erst dann die Änderungen an gradle.properties vorzunehmen.
Um mehr über den Swift-Build-Prozess zu erfahren, siehe swift/README.md
Sie benötigen Node zum Erstellen. Wenn Sie nvm haben, können Sie nvm use ausführen, um automatisch eine
geeignete Version auszuwählen.
Wir verwenden npm als unseren Paketmanager und ein Python-Skript zur Steuerung des Builds der Rust-Bibliothek, zugänglich als npm run build.
$ cd node
$ nvm use
$ npm install
$ npm run build
$ npm run tsc
$ npm run test
Beim lokalen Testen von Änderungen können Sie npm run build verwenden, um einen inkrementellen Neubuild der Rust-Bibliothek durchzuführen. Alternativ wird npm run build-with-debug-level-logs ohne Herausfiltern von Debug- und Verbose-Level-Logs neu erstellen.
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. Sowohl x64- als auch arm64-Builds sind für
alle drei Plattformen enthalten, aber die arm64-Builds für Windows und Linux gelten als experimentell, da
es keine offiziellen Builds von Signal für diese Architekturen gibt.
Nachdem Sie alle oben genannten Build-Befehle ausgeführt haben, passen Sie die @signalapp/libsignal-client-Abhängigkeit in der package.json der Desktop-App auf "link:path/to/libsignal/node" an 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 erneut pnpm install aus.
Signal akzeptiert externe Beiträge zu diesem Projekt. Sofern die Änderung jedoch nicht einfach und leicht verständlich ist, beispielsweise das Beheben eines Fehlers oder Portabilitätsproblems, das Hinzufügen eines neuen Tests oder die Verbesserung der Leistung, eröffnen Sie zunächst 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 Client-Apps von Signal verwendet werden, können dennoch in Betracht gezogen werden, aber nur, wenn sie keinen unangemessenen Wartungsaufwand darstellen oder mit den Zielen des Projekts in Konflikt stehen.
Das Unterzeichnen eines CLA (Contributor License Agreement) ist für alle Beiträge erforderlich.
Sie können den Styler für das gesamte Projekt ausführen mit:
just format-all
Sie können umfangreichere Tests sowie Linters und clippy ausführen mit:
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, Besitz, die Verwendung und/oder die Re-Exportierung von Verschlüsselungssoftware in ein anderes Land haben. BEVOR Sie Verschlüsselungssoftware verwenden, prüfen Sie bitte die Gesetze, Vorschriften und Richtlinien Ihres Landes bezüglich des Imports, Besitzes oder der Verwendung und des Re-Exports von Verschlüsselungssoftware, um festzustellen, ob dies zulässig ist. Siehe http://www.wassenaar.org/ für weitere Informationen.
Das U.S. Government Department of Commerce, Bureau of Industry and Security (BIS), hat diese Software als Export Commodity Control Number (ECCN) 5D002.C.1 eingestuft, was Informationssicherheitssoftware einschließt, die kryptografische Funktionen mit asymmetrischen Algorithmen verwendet oder ausführt. Die Form und Art dieser Distribution macht sie exportberechtigt unter der License Exception ENC Technology Software Unrestricted (TSU)-Ausnahme (siehe die BIS Export Administration Regulations, Section 740.13) sowohl für Objektcode als auch für Quellcode.
Copyright 2020-2026 Signal Messenger, LLC
Lizenziert unter der GNU AGPLv3: https://www.gnu.org/licenses/agpl-3.0.html