#async-stream #protocols #noise #encryption #minimalist #snow #tokio

snowstorm

基于 Noise 协议(snow)的极简加密协议

7 个不稳定版本 (3 个破坏性更新)

0.4.0 2022年5月20日
0.3.1 2022年1月14日
0.2.0 2022年1月3日
0.1.3 2021年12月25日

#1172 in 密码学

Download history 986/week @ 2024-03-14 1328/week @ 2024-03-21 1147/week @ 2024-03-28 803/week @ 2024-04-04 1298/week @ 2024-04-11 1537/week @ 2024-04-18 1109/week @ 2024-04-25 744/week @ 2024-05-02 680/week @ 2024-05-09 1042/week @ 2024-05-16 772/week @ 2024-05-23 630/week @ 2024-05-30 975/week @ 2024-06-06 958/week @ 2024-06-13 623/week @ 2024-06-20 535/week @ 2024-06-27

每月下载 3,179
用于 2 crates

Apache-2.0

32KB
690

雪暴

基于 Noise 协议snow 的 Rust 异步流/数据包的极简加密协议。

快速入门

雪暴允许您为任何实现了 AsyncRead + AsyncWrite + Unpin 的流提供安全性。例如,Tokio 中的 TcpStream。注意,底层连接需要是可靠的。

创建密钥对

// Noise protocol params, see: http://www.noiseprotocol.org/noise.html#protocol-names-and-modifiers
// Use `KK` to enable bidirectional identity verification
static PATTERN: &str = "Noise_KK_25519_ChaChaPoly_BLAKE2s"; 

// Generate a private / public key pair
let key_pair = snowstorm::Builder::new(PATTERN.parse()?).generate_keypair().unwrap()

客户端


// Connect to the peer
let stream = TcpStream::connect("127.0.0.1:12345").await?;

// The client should build an initiator to launch the handshake process
let initiator = snowstorm::Builder::new(PATTERN.parse()?)
    .local_private_key(local_private_key)
    .remote_public_key(remote_public_key)
    .build_initiator()?;

// Start handshaking
let mut secured_stream = NoiseStream::handshake(stream, initiator).await?;

// A secured stream `NoiseStream<T>` will be return once the handshake is done
secured_stream.write_all(b"hello world").await?;

服务器


// Accept a `TcpStream` from the listener
let listener = TcpListener::bind("127.0.0.1:12345").await?;
let (stream, _) = listener.accept().await?;

// The server needs a responder to handle handshake reqeusts from clients
let responder = snowstorm::Builder::new(PATTERN.parse()?)
    .local_private_key(local_private_key)
    .remote_public_key(remote_public_key)
    .build_responder()?;

// Start handshaking
let mut secured_stream = NoiseStream::handshake(stream, responder).await?;

let mut buf = [0; 1024];
secured_stream.read(&mut buf).await?;

规范

[ length (2 字节,小端) ] [ noise message (length 字节) ]

数据包

[ nonce (8 字节) ] [ noise message ]

待办事项

  • UDP 支持
  • 文档
  • 基准测试
  • async-std 支持

依赖关系

~3.5–5.5MB
~91K SLoC