1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95
//! The `snow` crate is a straightforward, Hard To Fuck Up™ Noise Protocol implementation. //! //! Read the [Noise Protocol Framework Spec](http://noiseprotocol.org/noise.html) for more //! information. //! //! The typical usage flow is to use [`Builder`] to construct a [`HandshakeState`], where you //! will complete the handshake phase and convert into either a [`TransportState`] or //! [`StatelessTransportState`]. //! //! # Examples //! See `examples/simple.rs` for a more complete TCP client/server example with static keys. //! //! ``` //! # use snow::Error; //! # //! # #[cfg(any(feature = "default-resolver", feature = "ring-accelerated"))] //! # fn try_main() -> Result<(), Error> { //! static PATTERN: &'static str = "Noise_NN_25519_ChaChaPoly_BLAKE2s"; //! //! let mut initiator = snow::Builder::new(PATTERN.parse()?) //! .build_initiator()?; //! let mut responder = snow::Builder::new(PATTERN.parse()?) //! .build_responder()?; //! //! let (mut read_buf, mut first_msg, mut second_msg) = //! ([0u8; 1024], [0u8; 1024], [0u8; 1024]); //! //! // -> e //! let len = initiator.write_message(&[], &mut first_msg)?; //! //! // responder processes the first message... //! responder.read_message(&first_msg[..len], &mut read_buf)?; //! //! // <- e, ee //! let len = responder.write_message(&[], &mut second_msg)?; //! //! // initiator processes the response... //! initiator.read_message(&second_msg[..len], &mut read_buf)?; //! //! // NN handshake complete, transition into transport mode. //! let initiator = initiator.into_transport_mode(); //! let responder = responder.into_transport_mode(); //! # Ok(()) //! # } //! # //! # #[cfg(not(any(feature = "default-resolver", feature = "ring-accelerated")))] //! # fn try_main() -> Result<(), ()> { Ok(()) } //! # //! # fn main() { //! # try_main().unwrap(); //! # } //! ``` #![warn(missing_docs)] macro_rules! copy_slices { ($inslice:expr, $outslice:expr) => { $outslice[..$inslice.len()].copy_from_slice(&$inslice[..]) }; } macro_rules! static_slice { ($_type:ty: $($item:expr),*) => ({ static STATIC_SLICE: &'static [$_type] = &[$($item),*]; STATIC_SLICE }); } macro_rules! bail { ($e:expr) => { return Err(($e).into()); }; } mod builder; mod cipherstate; mod constants; pub mod error; mod handshakestate; mod stateless_transportstate; mod symmetricstate; mod transportstate; mod utils; pub mod params; pub mod resolvers; pub mod types; pub use crate::{ builder::{Builder, Keypair}, error::Error, handshakestate::HandshakeState, stateless_transportstate::StatelessTransportState, transportstate::TransportState, };