A Rust implementation of the Signal Protocol. Quite rough around the edges, and no security guarantees given. Just for curiosity.
- Overview
- Quick Start
- Components
- Road Map
- More Information
The Signal Protocol is at the heart of all mainstream end-to-end encrypted messaging these days: in addition to Signal, both Whats App and Facebook Messenger use it (along with a lot of other messaging apps). It is composed of two main parts: the X3DH key exchange protocol, and the Double Ratchet algorithm.
Run cargo test --all. Among others, this runs the test in
crates/signal/src/lib.rs, which is a mockup of a complete end-to-end
conversation including both key exchange and several iterations of
the ratchet, however, it is entirely in-process.
Then try make server, followed by (in another tab) make. This
runs the multi-process example. The first command starts the server,
which provides key & message relay. The second command starts the
two client processes, which communicate with one another via the
server.
The two key crates are x3dh, which implements the key exchange
algorithm, and double-ratchet, which implements the session key
ratcheting algorithm.
The main entity is the Participant, which manages generating and
storing the various keys in play. In addition, you can create a
local Keyserver to simulate the key relay functions in-process.
The main entity is the Session, which can be created with a
SessionBuilder. Initialize it with the shared session key,
begin a connection, and then use the Session to encrypt and
decrypt messages.
- Clean up
x3dhanddouble-ratchetpublic APIs & docs. - Get rid of any unwrap or panic!
- Use the
logcrate for logging. - Use a more curated set of crypto implementations.
- Implement the encrypted headers extension.
- Complete
clientandserverexample implementations. - Make a little interactive chat client example.
- Make
Keyservertrait asyncable so we can use it with a remote server? - Make a
Relayservertrait fordouble-ratchetthat corresponds to theKeyservertrait forx3dh?
- The Signal Protocol Specifications, specifically:
- X3DH, and
- Double Ratchet.
- Curve25519 math by Dalek Cryptography
- Some primitives from RustCrypto:
aesandsha2. - HMAC and HKDF implementations from
orion.