wtx 0.50.0

A collection of different transport implementations and related tools focused primarily on web technologies.
Documentation
use crate::{
  executor::StdRuntime,
  misc::SecretContext,
  rng::{ChaCha20, CryptoSeedableRng},
  stream::{StreamReader, StreamWriter},
  tests::{_PUBLIC_KEY, _ROOT_CA, _SECRET_KEY, _uri},
  tls::{TlsAcceptor, TlsConfig, TlsConnectorBuilder, TlsModeUnverified},
};
use std::net::TcpListener;

const TM: TlsModeUnverified = TlsModeUnverified::new();

#[cfg_attr(miri, ignore)]
#[wtx::test]
async fn simple_connection(runtime: &StdRuntime) {
  let uri = _uri();
  let mut client_rng = ChaCha20::from_std_random().unwrap();
  let mut server_rng = ChaCha20::from_crypto_rng(&mut client_rng).unwrap();

  let listener = TcpListener::bind(uri.hostname_with_implied_port()).unwrap();

  let _client_jh = runtime
    .spawn(async move {
      let mut tls_stream = TlsConnectorBuilder::std(uri)
        .build(TlsConfig::from_trust_anchors_pem(TM, [_ROOT_CA]).unwrap(), &mut client_rng)
        .await
        .unwrap()
        .connect()
        .await
        .unwrap()
        .tls_stream;
      tls_stream.write_all(b"hello").await.unwrap();
      tls_stream.send_close_notify().await.unwrap();
    })
    .unwrap();

  let stream = listener.accept().unwrap().0;
  let secret = (SecretContext::new(&mut server_rng).unwrap(), &mut _SECRET_KEY.clone()[..]);
  let mut tls_stream = TlsAcceptor::new(
    TlsConfig::from_keys_pem(TM, _PUBLIC_KEY, &mut server_rng, secret).unwrap(),
    &mut server_rng,
    stream,
  )
  .accept()
  .await
  .unwrap()
  .tls_stream;
  let mut buffer = [0; 128];
  loop {
    let Some(read) = tls_stream.read(buffer.as_mut_slice().into()).await.unwrap() else {
      break;
    };
    let slice = buffer.get(..read.get()).unwrap();
    assert_eq!(slice, b"hello");
  }
}