
Hogar del Protocolo Signal, así como de otras primitivas criptográficas que hacen posible Signal.
libsignal contiene APIs 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 APIs e implementaciones están sujetas a cambios sin previo aviso, al igual que las capas de "puente" JNI, C y Node add-on. Sin embargo, los cambios incompatibles hacia atrás en las APIs de Java, Swift, TypeScript y Rust que no son de puente se reflejarán en el número de versión en la medida de lo posible, incluidos los aumentos a las versiones mínimas de herramientas soportadas.
Para compilar cualquier cosa en este repositorio debes tener Rust instalado, así como versiones recientes de Clang, libclang, CMake, Make, protoc, Python (3.9+) y git.
En un sistema similar a Debian, puedes 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, tenemos 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 usa una versión específica del compilador estable de Rust, que será descargada automáticamente por cargo. Para compilar y probar las bibliotecas de protocolo básicas:
$ cargo build
...
$ cargo test
...
Las herramientas básicas anteriores deberían ser suficientes para la mayoría del desarrollo de libsignal en Rust.
Eventualmente, puede que descubras que necesitas algunas herramientas adicionales de Rust como taplo para el formateo de código.
Siempre debes instalar cualquier herramienta de Rust que necesites 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 (especialmente cbindgen).
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, incluido un JDK, el NDK/SDK de Android, y agregar los targets de Android al compilador de Rust, usando
rustup target add armv7-linux-androideabi aarch64-linux-android i686-linux-android x86_64-linux-android
Nuestra versión de JDK soportada oficialmente para compilaciones de Android es JDK 21, así que asegúrate de instalar, por ejemplo, OpenJDK 21, y luego apuntar JAVA_HOME a él.
Puedes hacer esto fácilmente en macOS mediante:
export JAVA_HOME=$(/usr/libexec/java_home -v 21)
En Linux, la forma de hacer esto varía según la distribución. Para distribuciones basadas en Debian como Ubuntu, puedes usar:
sudo update-alternatives --config java
También incluimos un archivo .tools_version para usar con gestores de versiones en tiempo de ejecución.
Para compilar el jar y aar de Java/Android, y ejecutar las pruebas:
$ cd java
$ ./gradlew test
$ ./gradlew build # if you need AAR outputs
Puedes pasar -P debugLevelLogs a Gradle para compilar sin filtrar los logs de nivel debug y verbose
de Rust, y -P jniTypeTagging para habilitar comprobaciones adicionales en el código de puente JNI de Rust.
Alternativamente, hay disponible un sistema de compilación que usa Docker:
$ cd java
$ make
Al exponer nuevas APIs a Java, necesitarás ejecutar rust/bridge/jni/bin/gen_java_decl.py además
de recompilar. Esto requiere instalar la herramienta de Rust cbindgen, como se detalla arriba.
Signal publica paquetes Java para su propio uso, bajo los nombres org.signal:libsignal-server,
org.signal:libsignal-client y org.signal:libsignal-android. libsignal-client y libsignal-server
contienen bibliotecas nativas para Linux x86_64 de sabor Debian, así como Windows (x86_64) y macOS
(x86_64 y arm64). libsignal-android contiene bibliotecas nativas para armeabi-v7a, arm64-v8a, x86 y
x86_64 Android. Estas se encuentran en un repositorio Maven en
https://build-artifacts.signal.org/libraries/maven/; para usarlas desde Gradle, agrega lo siguiente a tu
bloque 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/")
}
Las compilaciones anteriores se publicaban en Maven Central en su lugar.
Al compilar para Android necesitas tanto libsignal-android como libsignal-client, pero las bibliotecas de Windows
y macOS en libsignal-client no se excluirán automáticamente de tu aplicación final. Puedes
excluirlas explícitamente usando packaging: