
Hogar del Protocolo Signal, así como de otras primitivas criptográficas que hacen posible Signal.
libsignal contiene API agnósticas de la plataforma utilizadas por los clientes y servidores oficiales de Signal, expuestas como una biblioteca Java, Swift o TypeScript. Las implementaciones subyacentes están escritas en Rust:
Este repositorio es utilizado por las aplicaciones cliente de Signal (Android, iOS y Desktop) así como del lado del servidor. El uso fuera de Signal no está soportado. En particular, los productos de este repositorio son las bibliotecas Java, Swift y TypeScript que envuelven las implementaciones subyacentes en Rust. Todas las API e implementaciones están sujetas a cambios sin previo aviso, al igual que las capas de "puente" JNI, C y complemento de Node. Sin embargo, los cambios incompatibles hacia atrás en las API de Java, Swift, TypeScript y Rust que no son de puente se reflejarán en el número de versión según nuestro mejor esfuerzo, incluidos los aumentos a las versiones mínimas de herramientas soportadas.
Para compilar cualquier cosa en este repositorio debe tener Rust instalado, así como versiones recientes de Clang, libclang, CMake, Make, protoc, Python (3.9+) y git.
En un sistema similar a Debian, puede obtener estas dependencias adicionales a través de apt:
$ apt-get install clang libclang-dev cmake make protobuf-compiler libprotobuf-dev python3 git
En macOS, disponemos de un script mantenido con el mejor esfuerzo posible para configurar el toolchain de Rust que puedes ejecutar con:
$ bin/mac_setup.sh
La compilación actualmente utiliza una versión específica del compilador estable de Rust, que será descargada automáticamente por cargo. Para compilar y probar las bibliotecas básicas del protocolo:
$ cargo build
...
$ cargo test
...
Las herramientas básicas anteriores deberían ser suficientes para la mayoría del desarrollo de libsignal en Rust.
Con el tiempo, es posible que necesites algunas herramientas adicionales de Rust como taplo para el formateo de código.
Siempre debes instalar cualquier herramienta de Rust que necesites y que pueda afectar la compilación desde cargo en lugar de desde tu gestor
de paquetes del sistema (por ejemplo, apt o brew). Los gestores de paquetes a veces contienen versiones desactualizadas de estas herramientas que pueden romper
la compilación con problemas de incompatibilidad.
Para instalar las principales dependencias adicionales de Rust que coincidan con las versiones que usamos, puedes ejecutar los siguientes comandos:
$ 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
Para compilar para Android debes instalar varios paquetes adicionales, incluyendo un JDK, el NDK/SDK de Android, y añadir los objetivos de Android al compilador de Rust, usando
rustup target add armv7-linux-androideabi aarch64-linux-android i686-linux-android x86_64-linux-android
Our officially supported JDK version for Android builds is JDK 21, so be sure to install e.g. OpenJDK 21, and then point JAVA_HOME to it.
You can easily do this on macOS via:
export JAVA_HOME=$(/usr/libexec/java_home -v 21)
On Linux, the way you do this varies by distribution. For Debian based distributions like Ubuntu, you can use:
sudo update-alternatives --config java
We also check-in a .tools_version file for use with runtime version managers.
To build the Java/Android jar and aar, and run the tests:
$ cd java
$ ./gradlew test
$ ./gradlew build # si necesitas salidas AAR
You can pass -P debugLevelLogs to Gradle to build without filtering out debug- and verbose-level
logs from Rust, and -P jniTypeTagging to enable additional checks in the Rust JNI bridging code.
Alternately, a build system using Docker is available:
$ cd java
$ make
When exposing new APIs to Java, you will need to run cargo run -p libsignal-jni-native_kt (or
just generate-jni) in addition to rebuilding.
Signal publishes Java packages for its own use, under the names org.signal:libsignal-server,
org.signal:libsignal-client, and org.signal:libsignal-android. libsignal-client and libsignal-server
contain native libraries for Debian-flavored x86_64 Linux as well as Windows (x86_64) and macOS
(x86_64 and arm64). libsignal-android contains native libraries for armeabi-v7a, arm64-v8a, x86, and
x86_64 Android. These are located in a Maven repository at
https://build-artifacts.signal.org/libraries/maven/; for use from Gradle, add the following to your
repositories block:
maven {
name = "SignalBuildArtifacts"
// La parte "uri()" solo es necesaria para Kotlin Gradle; Groovy Gradle acepta una cadena simple aquí.
url = uri("https://build-artifacts.signal.org/libraries/maven/")
}
Older builds were published to Maven Central instead.
When building for Android you need both libsignal-android and libsignal-client, but the Windows
and macOS libraries in libsignal-client won't automatically be excluded from your final app. You can
explicitly exclude them using packaging:
android {
// ...
packaging {
resources {
excludes += setOf("libsignal_jni*.dylib", "signal_jni*.dll")
}
}
// ...
}
You can additionally exclude libsignal_jni_testing.so if you do not plan to use any of the APIs
intended for client testing.