async-psec/tests/psec_test.rs

57 lines
2.0 KiB
Rust

use rand::rngs::OsRng;
use tokio::{net::{TcpListener, TcpStream}};
use async_psec::{Session, Identity, PsecReader, PsecWriter, PsecError};
#[tokio::main]
async fn tokio_main() {
let server_keypair = Identity::generate(&mut OsRng);
let server_public_key = server_keypair.public.to_bytes();
let client_keypair = Identity::generate(&mut OsRng);
let client_public_key = client_keypair.public.to_bytes();
let listener = TcpListener::bind("127.0.0.1:0").await.unwrap();
let bind_addr = listener.local_addr().unwrap();
let handle = tokio::spawn(async move {
let (stream, addr) = listener.accept().await.unwrap();
let mut session = Session::from(stream);
assert_eq!(session.peer_addr().unwrap(), addr);
session.do_handshake(&server_keypair).await.unwrap();
assert_eq!(session.peer_public_key.unwrap(), client_public_key);
session.encrypt_and_send(b"Hello I'm Bob", true).await.unwrap();
assert_eq!(session.receive_and_decrypt().await.unwrap(), b"Hello I'm Alice");
let (mut reader, mut writer) = session.into_split().unwrap();
writer.encrypt_and_send("!".repeat(997).as_bytes(), true).await.unwrap();
assert_eq!(reader.receive_and_decrypt().await, Err(PsecError::TransmissionCorrupted));
});
let stream = TcpStream::connect(format!("127.0.0.1:{}", bind_addr.port())).await.unwrap();
let mut session = Session::from(stream);
assert_eq!(session.peer_addr().unwrap(), bind_addr);
session.do_handshake(&client_keypair).await.unwrap();
assert_eq!(session.peer_public_key.unwrap(), server_public_key);
session.set_max_recv_size(996, false);
session.encrypt_and_send(b"Hello I'm Alice", true).await.unwrap();
assert_eq!(session.receive_and_decrypt().await.unwrap(), b"Hello I'm Bob");
assert_eq!(session.receive_and_decrypt().await, Err(PsecError::BufferTooLarge));
session.send(b"\x00\x00\x00\x00not encrypted data").await.unwrap();
handle.await.unwrap();
}
#[test]
fn psec_session() {
tokio_main();
}