#chacha20 #tokio #stream #aead #async-io

async-encrypted-stream

Async Read and Write wrappers around the chacha20 encryption primitives

3 releases

0.1.2 Sep 18, 2023
0.1.1 Aug 3, 2023
0.1.0 Jul 3, 2023

#1933 in Cryptography

MIT license

25KB
464 lines

Async Encrypted Stream

Async Read and Write wrappers around the chacha20 encryption primitives.

This crate exposes a pair of [ReadHalf] and [WriteHalf] structs that works with any tokio::io::AsyncRead and tokio::io::AsyncWrite respectively.

To use this crate, it is necessary to add chacha20poly1305 as a dependency as well.

async-encrypted-stream = "0.1"
chacha20poly1305 = { version = "0.10", features = ["stream", "std"] }

Once the necessary dependencies are added, creating the stream is fairly trivial

use chacha20poly1305::aead::stream::{DecryptorLE31, EncryptorLE31};
use chacha20poly1305::XChaCha20Poly1305;

use async_encrypted_stream::{ReadHalf, WriteHalf, encrypted_stream};

// The key and nonce used must be the same on both ends of the stream
// NOTE: the size of the key and nonce values are defined by the type of Encryption used
let key = [0u8; 32];
let nonce = [0u8; 20];

let (rx, tx) = tokio::io::duplex(4096);
let (mut reader, mut writer): (
    ReadHalf<_, DecryptorLE31<XChaCha20Poly1305>>,
    WriteHalf<_, EncryptorLE31<XChaCha20Poly1305>>,
) = encrypted_stream(rx, tx, key.as_ref().into(), nonce.as_ref().into());

Dependencies

~2.9–8.5MB
~64K SLoC