tokio-aead 0.0.0

An AEAD encryption/decryption stream for tokio
Documentation
extern crate tokio_aead;
extern crate futures;
extern crate bytes;
extern crate stderrlog;

use std::cmp::min;

use futures::stream::Stream;
use futures::stream;
use futures::future;
use bytes::{Bytes, BytesMut};

use tokio_aead::AEAD;

mod common;

fn producer(blocksize: usize, length: usize) -> Box<Stream<Item=Bytes, Error=()>> {
    let stream = stream::unfold((blocksize, length), |(blocksize, length)| {
        if length == 0 {
            return None
        }

        let to_write = min(blocksize, length);

        let mut buf = BytesMut::with_capacity(to_write);
        buf.resize(to_write, 0);

        Some(future::ok((buf.freeze(), (blocksize, length - to_write))))
    });

    Box::new(stream)
}

static KEY: [u8; 32] = [
    0x0, 0x1, 0x2, 0x3, 0x4, 0x5, 0x6, 0x7,
    0x8, 0x9, 0xa, 0xb, 0xc, 0xd, 0xe, 0xf,
    0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17,
    0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f
];

#[test]
fn test_encryption() {
    common::setup();

    let input = producer(8192, 10*8192 + 3);
    let aead = AEAD::new(&KEY, 4096);

    let mut output = aead.decrypt(aead.encrypt(input)).wait();

    for _ in 0..20 {
        let mut left = BytesMut::with_capacity(4096);
        left.resize(4096, 0);
        let left = left.freeze();
        assert_eq!(Some(Ok(left)), output.next());
    }

    let mut left = BytesMut::with_capacity(3);
    left.resize(3, 0);
    let left = left.freeze();

    assert_eq!(Some(Ok(left)), output.next());
    assert_eq!(None, output.next());
}