2018-07-27 20:18:51 +00:00
|
|
|
# x25519-dalek [](https://crates.io/crates/x25519-dalek) [](https://docs.rs/x25519-dalek) [](https://travis-ci.org/dalek-cryptography/x25519-dalek)
|
2017-09-14 00:25:34 +00:00
|
|
|
|
|
|
|
|
A pure-Rust implementation of x25519 elliptic curve Diffie-Hellman key exchange,
|
2019-02-17 01:46:11 +00:00
|
|
|
with curve operations provided by
|
2018-05-15 23:00:06 +00:00
|
|
|
[curve25519-dalek](https://github.com/dalek-cryptography/curve25519-dalek).
|
2017-09-14 00:25:34 +00:00
|
|
|
|
2019-01-10 18:30:30 +00:00
|
|
|
This crate provides two levels of API: a bare byte-oriented `x25519`
|
|
|
|
|
function which matches the function specified in [RFC7748][rfc7748], as
|
2019-02-16 18:11:27 +00:00
|
|
|
well as a higher-level Rust API for static and ephemeral Diffie-Hellman.
|
2017-09-14 00:25:34 +00:00
|
|
|
|
2019-01-10 18:30:30 +00:00
|
|
|
## Examples
|
2017-09-14 00:25:34 +00:00
|
|
|
|
2019-01-10 18:30:30 +00:00
|
|
|
<a href="https://shop.bubblesort.io">
|
2019-02-17 01:46:11 +00:00
|
|
|
<img
|
2019-01-10 18:30:30 +00:00
|
|
|
style="float: right; width: auto; height: 300px;"
|
|
|
|
|
src="https://raw.githubusercontent.com/dalek-cryptography/x25519-dalek/master/res/bubblesort-zines-secret-messages-cover.jpeg"/>
|
|
|
|
|
</a>
|
2017-09-14 00:25:34 +00:00
|
|
|
|
|
|
|
|
Alice and Bob are two adorable kittens who have lost their mittens, and they
|
|
|
|
|
wish to be able to send secret messages to each other to coordinate finding
|
|
|
|
|
them, otherwise—if their caretaker cat finds out—they will surely be called
|
|
|
|
|
naughty kittens and be given no pie!
|
|
|
|
|
|
|
|
|
|
But the two kittens are quite clever. Even though their paws are still too big
|
|
|
|
|
and the rest of them is 90% fuzziness, these clever kittens have been studying
|
|
|
|
|
up on modern public key cryptography and have learned a nifty trick called
|
|
|
|
|
*elliptic curve Diffie-Hellman key exchange*. With the right incantations, the
|
|
|
|
|
kittens will be able to secretly organise to find their mittens, and then spend
|
|
|
|
|
the rest of the afternoon nomming some yummy pie!
|
|
|
|
|
|
2019-01-10 18:30:30 +00:00
|
|
|
First, Alice uses `EphemeralSecret::new()` and then
|
2019-02-16 18:11:27 +00:00
|
|
|
`PublicKey::from()` to produce her secret and public keys:
|
2017-09-14 00:25:34 +00:00
|
|
|
|
2019-02-27 22:01:43 +00:00
|
|
|
```rust,ignore
|
2019-01-05 13:17:05 +00:00
|
|
|
extern crate rand_os;
|
2019-02-27 20:45:55 +00:00
|
|
|
extern crate x25519_dalek;
|
|
|
|
|
|
2019-02-16 18:11:27 +00:00
|
|
|
use rand_os::OsRng;
|
2017-09-14 00:25:34 +00:00
|
|
|
|
2018-12-02 19:31:41 +00:00
|
|
|
use x25519_dalek::EphemeralSecret;
|
2019-02-16 18:11:27 +00:00
|
|
|
use x25519_dalek::PublicKey;
|
2017-09-14 00:25:34 +00:00
|
|
|
|
|
|
|
|
let mut alice_csprng = OsRng::new().unwrap();
|
2018-12-02 19:23:09 +00:00
|
|
|
let alice_secret = EphemeralSecret::new(&mut alice_csprng);
|
2019-02-16 18:11:27 +00:00
|
|
|
let alice_public = PublicKey::from(&alice_secret);
|
2017-09-14 00:25:34 +00:00
|
|
|
```
|
|
|
|
|
|
|
|
|
|
Bob does the same:
|
|
|
|
|
|
2019-02-27 22:01:43 +00:00
|
|
|
```rust,ignore
|
2017-09-14 00:25:34 +00:00
|
|
|
let mut bob_csprng = OsRng::new().unwrap();
|
2018-12-02 19:23:09 +00:00
|
|
|
let bob_secret = EphemeralSecret::new(&mut bob_csprng);
|
2019-02-16 18:11:27 +00:00
|
|
|
let bob_public = PublicKey::from(&bob_secret);
|
2017-09-14 00:25:34 +00:00
|
|
|
```
|
|
|
|
|
|
|
|
|
|
Alice meows across the room, telling `alice_public` to Bob, and Bob
|
|
|
|
|
loudly meows `bob_public` back to Alice. Alice now computes her
|
|
|
|
|
shared secret with Bob by doing:
|
|
|
|
|
|
2019-02-27 22:01:43 +00:00
|
|
|
```rust,ignore
|
2019-02-16 18:11:27 +00:00
|
|
|
let alice_shared_secret = alice_secret.diffie_hellman(&bob_public);
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
Similarly, Bob computes a shared secret by doing:
|
2017-09-14 00:25:34 +00:00
|
|
|
|
2019-02-27 22:01:43 +00:00
|
|
|
```rust,ignore
|
2019-02-16 18:11:27 +00:00
|
|
|
let bob_shared_secret = bob_secret.diffie_hellman(&alice_public);
|
2017-09-14 00:25:34 +00:00
|
|
|
```
|
|
|
|
|
|
2019-02-16 18:11:27 +00:00
|
|
|
These secrets are the same:
|
2017-09-14 00:25:34 +00:00
|
|
|
|
2019-02-27 22:01:43 +00:00
|
|
|
```rust,ignore
|
2019-02-16 18:11:27 +00:00
|
|
|
assert_eq!(alice_shared_secret.as_bytes(), bob_shared_secret.as_bytes());
|
2017-09-14 00:25:34 +00:00
|
|
|
```
|
|
|
|
|
|
|
|
|
|
Voilá! Alice and Bob can now use their shared secret to encrypt their
|
|
|
|
|
meows, for example, by using it to generate a key and nonce for an
|
|
|
|
|
authenticated-encryption cipher.
|
|
|
|
|
|
2019-02-16 18:11:27 +00:00
|
|
|
This example used the ephemeral DH API, which ensures that secret keys
|
|
|
|
|
cannot be reused; Alice and Bob could instead use the static DH API
|
|
|
|
|
and load a long-term secret key.
|
|
|
|
|
|
2017-09-14 00:25:34 +00:00
|
|
|
# Installation
|
|
|
|
|
|
|
|
|
|
To install, add the following to your project's `Cargo.toml`:
|
|
|
|
|
|
2018-05-15 23:00:27 +00:00
|
|
|
```toml
|
|
|
|
|
[dependencies.x25519-dalek]
|
2019-02-17 01:46:11 +00:00
|
|
|
version = "^0.5"
|
2018-05-15 23:00:27 +00:00
|
|
|
```
|
2017-09-14 00:25:34 +00:00
|
|
|
|
2019-01-10 18:30:30 +00:00
|
|
|
# Documentation
|
2017-09-14 00:25:34 +00:00
|
|
|
|
2019-01-10 18:30:30 +00:00
|
|
|
Documentation is available [here](https://docs.rs/x25519-dalek).
|
|
|
|
|
|
|
|
|
|
# Note
|
|
|
|
|
|
|
|
|
|
This code matches the [RFC7748][rfc7748] test vectors.
|
|
|
|
|
The elliptic curve
|
|
|
|
|
operations are provided by `curve25519-dalek`, which makes a best-effort
|
|
|
|
|
attempt to prevent software side-channels.
|
|
|
|
|
|
|
|
|
|
"Secret Messages" cover image and [zine](https://shop.bubblesort.io/products/secret-messages-zine)
|
|
|
|
|
copyright © Amy Wibowo ([@sailorhg](https://twitter.com/sailorhg))
|
|
|
|
|
|
|
|
|
|
[rfc7748]: https://tools.ietf.org/html/rfc7748
|