signalapp/libsignal

GitHub: signalapp/libsignal

Stars: 5533 | Forks: 685

# 概述 libsignal 包含了官方 Signal 客户端和服务器使用的平台无关 API,以 Java、Swift 或 TypeScript 库的形式公开。底层实现是用 Rust 编写的: - libsignal-protocol:实现了 Signal 协议,包括 [Double Ratchet algorithm][]。用于替代 [libsignal-protocol-java][] 和 [libsignal-metadata-java][]。 - signal-crypto:加密原语,例如 AES-GCM。我们在可以使用 [RustCrypto][] 的地方尽量使用,但有时会有不同的需求。 - device-transfer:Signal 设备间传输功能的支持逻辑。 - attest:[SGX enclaves][] 和服务器端 [HSMs][] 的远程证明功能。 - zkgroup:[zero-knowledge groups][] 及 Signal 中相关功能的功能实现。 - zkcredential:zkgroup 使用的零知识凭证类型的抽象,基于 Chase、Perrin 和 Zaverucha 的论文“[The Signal Private Group System][]”。 - poksho:用于实现零知识证明(例如 zkgroup 使用的证明)的工具;代表“proof-of-knowledge, stateful-hash-object”。 - account-keys:在 Signal 的 Secure Value Recovery 系统中一致地使用 [PINs][] 作为密码的功能,以及其他账户级密钥操作。 - usernames:用户名生成、哈希和证明功能。 - media:媒体操作工具。 本仓库被 Signal 客户端应用程序([Android][]、[iOS][] 和 [Desktop][])以及服务器端使用。不支持在 Signal 之外使用。具体来说,本仓库的产物是封装底层 Rust 实现的 Java、Swift 和 TypeScript 库。所有 API 和实现如有变更恕不另行通知,JNI、C 和 Node 插件“bridge”层也是如此。但是,Java、Swift、TypeScript 和非 bridge Rust API 的向后不兼容更改将在版本号中反映出来(尽最大努力),包括增加最低支持工具版本。 # 构建 ### 工具链安装 要构建本仓库中的任何内容,您必须安装 [Rust](https://rust-lang.org),以及最新版本的 Clang、libclang、[CMake](https://cmake.org)、Make、protoc、Python (3.9+) 和 git。 #### Linux/Debian 在类似 Debian 的系统上,您可以通过 `apt` 获取这些额外的依赖项: ``` $ apt-get install clang libclang-dev cmake make protobuf-compiler libprotobuf-dev python3 git ``` #### macOS 在 macOS 上,我们要维护一个尽力而为的脚本来设置 Rust 工具链,您可以通过以下方式运行: ``` $ bin/mac_setup.sh ``` ## Rust ### 首次构建和测试 构建目前使用特定版本的 Rust nightly 编译器,该编译器将由 cargo 自动下载。要构建和测试基本协议库: ``` $ cargo build ... $ cargo test ... ``` ### 其他 Rust 工具 上面的基本工具应该足以让您设置大多数 libsignal Rust 开发环境。 最终,您可能会发现需要一些额外的 Rust 工具,例如 `cbindgen` 来修改到客户端库的 bridge,或者 `taplo` 用于代码格式化。 您应该始终从 cargo 而不是从系统包管理器(例如 `apt` 或 `brew`)安装任何可能影响构建的 Rust 工具。包管理器有时包含这些工具的过时版本,这可能会因不兼容问题导致构建中断(尤其是 cbindgen)。 要安装与我们使用的版本相匹配的主要 Rust 额外依赖项,您可以运行以下命令: ``` $ cargo +stable install --version "$(cat .cbindgen-version)" --locked cbindgen $ 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 ### 工具链设置 / 配置 要为 Android 构建,您必须安装几个额外的包,包括 JDK、Android NDK/SDK,并使用以下命令将 Android 目标添加到 Rust 编译器: ```rustup target add armv7-linux-androideabi aarch64-linux-android i686-linux-android x86_64-linux-android``` 我们官方支持的 Android 构建 JDK 版本是 JDK 17,因此请确保安装例如 OpenJDK 17,然后将 JAVA_HOME 指向它。 您可以在 macOS 上通过以下方式轻松完成此操作: ``` export JAVA_HOME=$(/usr/libexec/java_home -v 17) ``` 在 Linux 上,执行此操作的方式因发行版而异。对于像 Ubuntu 这样的基于 Debian 的发行版,您可以使用: ``` sudo update-alternatives --config java ``` 我们还签入了一个 `.tools_version` 文件,用于运行时版本管理器。 ### 构建和测试 要构建 Java/Android ``jar`` 和 ``aar``,并运行测试: ``` $ cd java $ ./gradlew test $ ./gradlew build # if you need AAR outputs ``` 您可以将 `-P debugLevelLogs` 传递给 Gradle,以在不从 Rust 中过滤掉 debug 和 verbose 级别日志的情况下进行构建,以及传递 `-P jniTypeTagging` 以在 Rust JNI 桥接代码中启用额外的检查。 或者,可以使用基于 Docker 的构建系统: ``` $ cd java $ make ``` 当向 Java 公开新 API 时,除了重新构建外,您还需要运行 `rust/bridge/jni/bin/gen_java_decl.py`。这需要安装 `cbindgen` Rust 工具,如上所述。 ### 用作库 Signal 发布供其自己使用的 Java 包,名称为 org.signal:libsignal-server、org.signal:libsignal-client 和 org.signal:libsignal-android。libsignal-client 和 libsignal-server 包含用于 Debian 风格的 x86_64 Linux 以及 Windows (x86_64) 和 macOS(x86_64 和 arm64)的原生库。libsignal-android 包含用于 armeabi-v7a、arm64-v8a、x86 和 x86_64 Android 的原生库。这些位于 Maven 仓库中,地址为 https://build-artifacts.signal.org/libraries/maven/;要从 Gradle 使用,请将以下内容添加到您的 `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/") } ``` 较旧的构建发布在 [Maven Central](https://central.sonatype.org)。 为 Android 构建时,您*同时*需要 libsignal-android 和 libsignal-client,但 libsignal-client 中的 Windows 和 macOS 库不会自动从您的最终应用中排除。您可以使用 `packaging` 显式排除它们: ``` android { // ... packaging { resources { excludes += setOf("libsignal_jni*.dylib", "signal_jni*.dll") } } // ... } ``` 如果您不打算使用任何旨在用于客户端测试的 API,您还可以额外排除 `libsignal_jni_testing.so`。 ### 使用 Signal-Android 测试本地构建 Signal-Android gradle.properties 文件中有一行注释掉的代码,用于将 libsignal 作为构建的一部分包含进来。取消注释该行并调整路径;可选地,您可以通过向 *libsignal 的* gradle.properties 添加 `androidArchs=aarch64` 来限制您想要构建的架构。(识别的架构集位于 java/build_jni.sh 中。)如果您使用的是 IDE,此时您需要重新导入 Gradle 结构。完成后,恢复对 Android 应用程序 gradle.properties 的更改并再次重新导入。 请注意,这不会将项目的 *Rust* 部分导入到 IDE 中。在像 IDEA 这样的多语言 IDE 中这样做是可能的,但很麻烦;截至 2025 年,最可靠的方法是先打开 Android 项目,然后添加 libsignal 仓库根目录作为 Rust 项目(仅包括顶级目录),然后再对 gradle.properties 进行更改。 ## Swift 要了解 Swift 构建过程,请参阅 [``swift/README.md``](swift/) ## Node 您需要安装 Node 才能构建。如果您安装了 [nvm][],可以运行 `nvm use` 自动选择适当的版本。 我们使用 `npm` 作为包管理器,并使用 Python 脚本控制 Rust 库的构建,该脚本可通过 `npm run build` 访问。 ``` $ cd node $ nvm use $ npm install $ npm run build $ npm run tsc $ npm run test ``` 在本地测试更改时,您可以使用 `npm run build` 对 Rust 库进行增量重建。或者,`npm run build-with-debug-level-logs` 将在不过滤掉 debug 和 verbose 级别日志的情况下进行重建。 当向 Node 公开新 API 时,除了重新构建外,您还需要运行 `rust/bridge/node/bin/gen_ts_decl.py`。 ### NPM Signal 发布 NPM 包 `@signalapp/libsignal-client` 供其自己使用,包括用于 Windows、macOS 和 Debian 风格 Linux 的原生库。所有三个平台都包含 x64 和 arm64 构建,但 Windows 和 Linux 的 arm64 构建被认为是实验性的,因为没有针对这些架构的 Signal 官方构建。 ### 使用 Signal-Desktop 测试本地构建 运行上述所有构建命令后,将 Desktop 应用程序 package.json 中的 `@signalapp/libsignal-client` 依赖项调整为 "link:path/to/libsignal/node" 并运行 `pnpm install`。完成后,恢复对 package.json 的更改并再次运行 `pnpm install`。 # 贡献 Signal 确实接受对本项目的外部贡献。但是,除非更改简单且易于理解,例如修复错误或可移植性问题、添加新测试或提高性能,否则请先打开一个 issue 讨论您的预期更改,因为并非所有更改都能被接受。 Signal 官方客户端应用程序之一不会直接使用的贡献可能仍会被考虑,但前提是它们不会造成过度的维护负担或与项目目标冲突。 所有贡献都需要签署 [CLA (Contributor License Agreement)](https://signal.org/cla/)。 ## 代码格式化和致谢 您可以通过运行以下命令在整个项目上运行样式工具: ``` just format-all ``` 您可以通过运行以下命令运行更广泛的测试以及 linter 和 clippy: ``` just check-pre-commit ``` 当提交调整依赖项的 PR 时,您需要重新生成我们的致谢文件。请参阅 [``acknowledgments/README.md``](acknowledgments/)。 # 法律事项 ## 加密通知 此分发包含加密软件。您当前居住的国家/地区可能对加密软件的进口、持有、使用和/或再出口到另一个国家/地区有限制。在使用任何加密软件之前,请检查您所在国家/地区关于加密软件的进口、持有或使用以及再出口的法律、法规和政策,以查看是否允许这样做。有关更多信息,请参阅 。 美国政府商务部工业与安全局 (BIS) 已将此软件归类为出口商品控制编号 (ECCN) 5D002.C.1,其中包括使用或执行具有非对称算法的加密功能的信息安全软件。这种分发的方式和形式使其有资格根据许可例外 ENC 技术软件无限制 (TSU) 例外(参见 BIS 出口管理条例,第 740.13 节)出口目标代码和源代码。 ## 许可证 版权所有 2020-2026 Signal Messenger, LLC 根据 GNU AGPLv3 许可:https://www.gnu.org/licenses/agpl-3.0.html
标签:AES-GCM, Bash脚本, CVE防护, Docker‑Compose, FFI, GUI应用, HSM, iOS, JS文件枚举, MITM代理, NoSQL注入, pip安装, Rust, Rust语言, SGX远程认证, Signal协议, Swift, TypeScript, Web界面, ZKGroup, 二进制文件分析, 加密原语, 即时通讯, 双棘轮算法, 可视化界面, 可视化调试, 安全备份, 安全插件, 安全通信, 安卓, 客户端库, 密码学, 带宽管理, 手动系统调用, 桌面应用, 流量可视化, 用户界面自定义, 目录枚举, 移动安全, 端到端加密, 网络安全, 网络流量审计, 跨平台UI框架, 通知系统, 通知系统, 隐私保护, 隐私计算, 零知识证明, 项目发现工具