#noise #protocol #crypto

snow

A pure-rust implementation of the Noise Protocol Framework

35 releases

0.4.0-alpha2 Aug 24, 2018
0.3.1 Jul 24, 2018
0.1.8-preview Oct 5, 2017
0.1.7-preview Jun 15, 2017
0.0.1-preview.10 Mar 21, 2017

#33 in Cryptography

Download history 341/week @ 2018-08-20 458/week @ 2018-08-27 217/week @ 2018-09-03 316/week @ 2018-09-10 268/week @ 2018-09-17 251/week @ 2018-09-24 300/week @ 2018-10-01 252/week @ 2018-10-08 138/week @ 2018-10-15 314/week @ 2018-10-22 209/week @ 2018-10-29 288/week @ 2018-11-05 298/week @ 2018-11-12

2,419 downloads per month
Used in 9 crates (3 directly)

Unlicense

313KB
3K SLoC

Snow

Crates.io Docs.rs Build Status dependency status

totally official snow logo

An implementation of Trevor Perrin's Noise Protocol that is designed to be Hard To Fuck Up™.

🔥 Warning 🔥 This library has not received any formal audit, and its API is subject to change whenever it's prudent to or if the winds blow at the right heading.

What's it look like?

See examples/simple.rs for a more complete TCP client/server example.

let mut noise = snow::Builder::new("Noise_NN_25519_ChaChaPoly_BLAKE2s".parse()?)
                    .build_initiator()?;
 
let mut buf = [0u8; 65535];
 
// write first handshake message
noise.write_message(&[], &mut buf)?;
 
// receive response message
let incoming = receive_message_from_the_mysterious_ether();
noise.read_message(&incoming, &mut buf)?;
 
// complete handshake, and transition the state machine into transport mode
let mut noise = noise.into_transport_mode()?;

See the full documentation at https://docs.rs/snow.

Implemented

Snow is currently tracking against Noise spec revision 34.

However, a few features have yet to be implemented (pull requests welcome):

Crypto

Cryptographic providers are swappable through Builder::with_resolver(), but by default it chooses select, artisanal pure-Rust implementations (see Cargo.toml for a quick overview).

Providers

ring

ring is a crypto library based off of BoringSSL and is significantly faster than most of the pure-Rust implementations.

If you enable the ring-resolver feature, Snow will include a ring_wrapper module as well as a RingAcceleratedResolver available to be used with Builder::with_resolver().

If you enable the ring-accelerated feature, Snow will default to choosing ring's crypto implementations when available.

HACL*

HACL* is a formally verified cryptographic library, accessed via the rust-hacl-star wrapper crate.

If you enable the hacl-resolver feature, Snow will include a hacl_wrapper module as well as a HaclStarResolver available to be used with Builder::with_resolver().

Similar to ring, if you enable the hacl-accelerated feature, Snow will default to choosing HACL* implementations when available.

Resolver primitives supported

default ring hacl*
CSPRNG ✔
25519 ✔ ✔ ✔
448
AESGCM ✔ ✔
ChaChaPoly ✔ ✔ ✔
SHA256 ✔ ✔ ✔
SHA512 ✔ ✔ ✔
BLAKE2s ✔
BLAKE2b ✔

Dependencies

~4MB
~95K SLoC