
libsignal v0.102.2
Hogar del Protocolo Signal, así como de otras primitivas criptográficas que hacen posible Signal.
Descripción general
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:
- libsignal-protocol: Implementa el protocolo Signal, incluido el [algoritmo Double Ratchet][]. Un reemplazo de libsignal-protocol-java y libsignal-metadata-java.
- signal-crypto: Primitivas criptográficas como AES-GCM. Usamos las de RustCrypto cuando podemos pero a veces tenemos necesidades diferentes.
- device-transfer: Lógica de soporte para la función de transferencia de dispositivo a dispositivo de Signal.
- attest: Funcionalidad para atestación remota de [enclaves SGX][] y [HSM][] del lado del servidor.
- zkgroup: Funcionalidad para [grupos de conocimiento cero][] y características relacionadas disponibles en Signal.
- zkcredential: Una abstracción para el tipo de credenciales de conocimiento cero utilizadas por zkgroup, basada en el artículo "The Signal Private Group System" de Chase, Perrin y Zaverucha.
- poksho: Utilidades para implementar pruebas de conocimiento cero (como las utilizadas por zkgroup); significa "proof-of-knowledge, stateful-hash-object".
- account-keys: Funcionalidad para usar consistentemente PINs como contraseñas en el sistema Secure Value Recovery de Signal, así como otras operaciones de claves a nivel de cuenta.
- usernames: Funcionalidad para la generación, hashing y pruebas de nombres de usuario.
- media: Utilidades para manipular medios.
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.
Compilación
Instalación del conjunto de herramientas
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.
Linux/Debian
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
macOS
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
Rust
Primera compilación y prueba
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
...
Herramientas adicionales de Rust
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
Java/Android
Configuración / Ajuste de la cadena de herramientas
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.
Building and Testing
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.
Use as a library
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.