
libsignal v0.102.2
Signal Protocol をはじめ、Signal を可能にするその他の暗号プリミティブの本拠地です。
概要
libsignal には、公式の Signal クライアントおよびサーバーで使用されるプラットフォーム非依存の API が含まれており、Java、Swift、または TypeScript ライブラリとして公開されています。基盤となる実装は Rust で書かれています:
- libsignal-protocol: Double Ratchet アルゴリズムを含む Signal プロトコルを実装しています。libsignal-protocol-java および libsignal-metadata-java の代替です。
- signal-crypto: AES-GCM などの暗号プリミティブ。可能な限り RustCrypto のものを使用していますが、異なる要件を持つこともあります。
- device-transfer: Signal のデバイス間転送機能のサポートロジック。
- attest: SGX エンクレーブおよびサーバー側 HSM のリモート認証のための機能。
- zkgroup: 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 システムで PIN をパスワードとして一貫して使用するための機能、およびその他のアカウント全体の鍵操作。
- usernames: ユーザー名の生成、ハッシュ化、および証明のための機能。
- media: メディアを操作するためのユーティリティ。
このリポジトリは、Signal クライアントアプリ(Android、iOS、Desktop)およびサーバー側で使用されています。Signal 以外での使用はサポートされていません。特に、このリポジトリの成果物は、基盤となる Rust 実装をラップする Java、Swift、および TypeScript ライブラリです。すべての API および実装は、JNI、C、および Node アドオンの「ブリッジ」レイヤーと同様に、予告なく変更される可能性があります。ただし、Java、Swift、TypeScript、および非ブリッジ Rust API への後方互換性のない変更は、サポートされる最小ツールバージョンの引き上げを含め、可能な限りバージョン番号に反映されます。
ビルド
ツールチェーンのインストール
このリポジトリで何かをビルドするには、Rust がインストールされている必要があり、さらに Clang、libclang、CMake、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 安定版コンパイラを使用しており、cargo によって自動的にダウンロードされます。基本的なプロトコルライブラリをビルドおよびテストするには:
$ cargo build
...
$ cargo test
...
追加の Rust ツール
上記の基本ツールで、ほとんどの libsignal Rust 開発の準備が整うはずです。
最終的には、コードフォーマット用の taplo など、いくつかの追加 Rust ツールが必要になるかもしれません。
ビルドに影響を与える可能性のある Rust ツールは、システムのパッケージマネージャー(例: apt や brew)からではなく、常に cargo からインストールする必要があります。パッケージマネージャーには、これらのツールの古いバージョンが含まれていることがあり、非互換性の問題(特に cbindgen)でビルドが壊れる可能性があります。
使用しているバージョンに一致する主要な Rust 追加依存関係をインストールするには、次のコマンドを実行できます:
$ 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 など、いくつかの追加パッケージをインストールし、Rust コンパイラに Android ターゲットを追加する必要があります:
rustup target add armv7-linux-androideabi aarch64-linux-android i686-linux-android x86_64-linux-android
Android ビルドで公式にサポートされている JDK バージョンは JDK 21 ですので、必ず OpenJDK 21 などをインストールし、JAVA_HOME をそれに向けてください。
macOS では、次のように簡単に行えます:
export JAVA_HOME=$(/usr/libexec/java_home -v 21)
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
Gradle に -P debugLevelLogs を渡すと、Rust からのデバッグレベルおよび詳細レベルのログをフィルタリングせずにビルドでき、-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 向けのネイティブライブラリが含まれています。これらは https://build-artifacts.signal.org/libraries/maven/ の 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 に公開されていました。
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 を参照してください。
Node
ビルドするには Node がインストールされている必要があります。nvm がある場合は、nvm use を実行して適切なバージョンを自動的に選択できます。
パッケージマネージャーとして npm を使用し、Rust ライブラリのビルドを制御する Python スクリプトを 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 は、デバッグレベルおよび詳細レベルのログをフィルタリングせずに再ビルドします。
Node に新しい API を公開する場合、再ビルドに加えて just generate-node を実行する必要があります。
NPM
Signal は自社使用のために NPM パッケージ @signalapp/libsignal-client を公開しており、Windows、macOS、および Debian 系 Linux 向けのネイティブライブラリを含んでいます。3 つのプラットフォームすべてで 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(コントリビューターライセンス契約) への署名が必要です。
コードフォーマットと謝辞
プロジェクト全体でスタイラーを実行するには、次を実行します:
just format-all
より広範なテスト、およびリンターと clippy を実行するには、次を実行します:
just check-pre-commit
依存関係を調整する PR を作成する場合、謝辞ファイルを再生成する必要があります。acknowledgments/README.md を参照してください。
法的な事項
暗号に関する通知
このディストリビューションには暗号ソフトウェアが含まれています。お住まいの国では、暗号ソフトウェアの輸入、所持、使用、および/または他国への再輸出に制限がある場合があります。暗号ソフトウェアを使用する前に、暗号ソフトウェアの輸入、所持、または使用、および再輸出に関するお住まいの国の法律、規制、およびポリシーを確認し、これが許可されているかどうかを確認してください。詳細については http://www.wassenaar.org/ を参照してください。
米国政府商務省産業安全保障局(BIS)は、このソフトウェアを輸出管理分類番号(ECCN)5D002.C.1 に分類しており、これには非対称アルゴリズムを使用した暗号機能を使用または実行する情報セキュリティソフトウェアが含まれます。このディストリビューションの形式と方法により、オブジェクトコードとソースコードの両方について、License Exception ENC Technology Software Unrestricted(TSU)例外(BIS 輸出管理規則第 740.13 条を参照)に基づく輸出が可能です。
ライセンス
Copyright 2020-2026 Signal Messenger, LLC
GNU AGPLv3 の下でライセンスされています: https://www.gnu.org/licenses/agpl-3.0.html