Update README tests and ensure they're run in Travis.

This commit is contained in:
Henry de Valence 2019-02-16 10:11:27 -08:00
parent 6797c0969f
commit e25c72b476
2 changed files with 79 additions and 17 deletions

View file

@ -5,6 +5,7 @@ rust:
env: env:
- TEST_COMMAND=test EXTRA_FLAGS='' FEATURES='default' - TEST_COMMAND=test EXTRA_FLAGS='' FEATURES='default'
- TEST_COMMAND=test EXTRA_FLAGS='' FEATURES='nightly'
- TEST_COMMAND=bench EXTRA_FLAGS='' FEATURES='default' - TEST_COMMAND=bench EXTRA_FLAGS='' FEATURES='default'
- TEST_COMMAND=build EXTRA_FLAGS='--no-default-features' FEATURES='u32_backend nightly' - TEST_COMMAND=build EXTRA_FLAGS='--no-default-features' FEATURES='u32_backend nightly'
- TEST_COMMAND=build EXTRA_FLAGS='--no-default-features' FEATURES='u64_backend nightly' - TEST_COMMAND=build EXTRA_FLAGS='--no-default-features' FEATURES='u64_backend nightly'

View file

@ -6,7 +6,7 @@ with curve operations provided by
This crate provides two levels of API: a bare byte-oriented `x25519` This crate provides two levels of API: a bare byte-oriented `x25519`
function which matches the function specified in [RFC7748][rfc7748], as function which matches the function specified in [RFC7748][rfc7748], as
well as a higher-level Rust API for ephemeral Diffie-Hellman. well as a higher-level Rust API for static and ephemeral Diffie-Hellman.
## Examples ## Examples
@ -29,50 +29,111 @@ kittens will be able to secretly organise to find their mittens, and then spend
the rest of the afternoon nomming some yummy pie! the rest of the afternoon nomming some yummy pie!
First, Alice uses `EphemeralSecret::new()` and then First, Alice uses `EphemeralSecret::new()` and then
`EphemeralPublic::from()` to produce her secret and public keys: `PublicKey::from()` to produce her secret and public keys:
```rust ```rust
extern crate x25519_dalek;
extern crate rand_os; extern crate rand_os;
use x25519_dalek::EphemeralPublic;
use x25519_dalek::EphemeralSecret;
use rand_os::OsRng; use rand_os::OsRng;
extern crate x25519_dalek;
use x25519_dalek::EphemeralSecret;
use x25519_dalek::PublicKey;
# fn main() {
let mut alice_csprng = OsRng::new().unwrap(); let mut alice_csprng = OsRng::new().unwrap();
let alice_secret = EphemeralSecret::new(&mut alice_csprng); let alice_secret = EphemeralSecret::new(&mut alice_csprng);
let alice_public = EphemeralPublic::from(&alice_secret); let alice_public = PublicKey::from(&alice_secret);
# }
``` ```
Bob does the same: Bob does the same:
```rust,ignore ```rust
# extern crate rand_os;
# use rand_os::OsRng;
#
# extern crate x25519_dalek;
# use x25519_dalek::EphemeralSecret;
# use x25519_dalek::PublicKey;
# fn main() {
let mut bob_csprng = OsRng::new().unwrap(); let mut bob_csprng = OsRng::new().unwrap();
let bob_secret = EphemeralSecret::new(&mut bob_csprng); let bob_secret = EphemeralSecret::new(&mut bob_csprng);
let bob_public = EphemeralPublic::from(&bob_secret); let bob_public = PublicKey::from(&bob_secret);
# }
``` ```
Alice meows across the room, telling `alice_public` to Bob, and Bob Alice meows across the room, telling `alice_public` to Bob, and Bob
loudly meows `bob_public` back to Alice. Alice now computes her loudly meows `bob_public` back to Alice. Alice now computes her
shared secret with Bob by doing: shared secret with Bob by doing:
```rust,ignore ```rust
use x25519_dalek::EphemeralPublic; # extern crate rand_os;
use x25519_dalek::EphemeralSecret; # use rand_os::OsRng;
#
let shared_secret = EphemeralSecret::diffie_hellman(alice_secret, &bob_public); # extern crate x25519_dalek;
# use x25519_dalek::EphemeralSecret;
# use x25519_dalek::PublicKey;
#
# fn main() {
# let mut csprng = OsRng::new().unwrap();
# let alice_secret = EphemeralSecret::new(&mut csprng);
# let alice_public = PublicKey::from(&alice_secret);
# let bob_secret = EphemeralSecret::new(&mut csprng);
# let bob_public = PublicKey::from(&bob_secret);
let alice_shared_secret = alice_secret.diffie_hellman(&bob_public);
# }
``` ```
Similarly, Bob computes the same shared secret by doing: Similarly, Bob computes a shared secret by doing:
```rust,ignore ```rust
let shared_secret = EphemeralSecret::diffie_hellman(bob_secret, &alice_public); # extern crate rand_os;
# use rand_os::OsRng;
#
# extern crate x25519_dalek;
# use x25519_dalek::EphemeralSecret;
# use x25519_dalek::PublicKey;
#
# fn main() {
# let mut csprng = OsRng::new().unwrap();
# let alice_secret = EphemeralSecret::new(&mut csprng);
# let alice_public = PublicKey::from(&alice_secret);
# let bob_secret = EphemeralSecret::new(&mut csprng);
# let bob_public = PublicKey::from(&bob_secret);
let bob_shared_secret = bob_secret.diffie_hellman(&alice_public);
# }
```
These secrets are the same:
```rust
# extern crate rand_os;
# use rand_os::OsRng;
#
# extern crate x25519_dalek;
# use x25519_dalek::EphemeralSecret;
# use x25519_dalek::PublicKey;
#
# fn main() {
# let mut csprng = OsRng::new().unwrap();
# let alice_secret = EphemeralSecret::new(&mut csprng);
# let alice_public = PublicKey::from(&alice_secret);
# let bob_secret = EphemeralSecret::new(&mut csprng);
# let bob_public = PublicKey::from(&bob_secret);
# let alice_shared_secret = alice_secret.diffie_hellman(&bob_public);
# let bob_shared_secret = bob_secret.diffie_hellman(&alice_public);
assert_eq!(alice_shared_secret.as_bytes(), bob_shared_secret.as_bytes());
# }
``` ```
Voilá! Alice and Bob can now use their shared secret to encrypt their 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 meows, for example, by using it to generate a key and nonce for an
authenticated-encryption cipher. authenticated-encryption cipher.
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.
# Installation # Installation
To install, add the following to your project's `Cargo.toml`: To install, add the following to your project's `Cargo.toml`: