Noise - Encrypted Transport

Noise Protocol encryption for Zcash Stratum V2.

Overview

Implements the Noise NK handshake pattern as used by SV2:

  • Server has static keypair (public key shared with clients)
  • Client uses ephemeral keys per connection
  • ChaCha20-Poly1305 encryption with BLAKE2s

Usage

Server Side

use bedrock_noise::{Keypair, NoiseResponder};

let keypair = Keypair::generate();
println!("Public key: {}", keypair.public);

let responder = NoiseResponder::new(&keypair);
let encrypted_stream = responder.accept(tcp_stream).await?;

Client Side

use bedrock_noise::{NoiseInitiator, PublicKey};

let server_key = PublicKey::from_hex("...")?;
let initiator = NoiseInitiator::new(server_key);
let encrypted_stream = initiator.connect(tcp_stream).await?;

Key Management

  • Generate: Keypair::generate()
  • Export: keypair.private_hex() / keypair.public.to_hex()
  • Import: Keypair::from_private_hex() / PublicKey::from_hex()

Protocol Details

The implementation uses the Noise_NK_25519_ChaChaPoly_BLAKE2s pattern:

  • NK: Known server key, ephemeral client key
  • 25519: Curve25519 for Diffie-Hellman
  • ChaChaPoly: ChaCha20-Poly1305 for authenticated encryption
  • BLAKE2s: BLAKE2s for hashing

License

MIT OR Apache-2.0