tls-api 0.9.0

TLS API without implementation
Documentation

One TLS API to rule them all

Support both:

  • tokio
  • async-std

and four TLS implementations:

  • tls-api-openssl, wraps openssl crate
  • tls-api-rustls, wraps rustls crate
  • tls-api-native-tls, wraps native-tls crate
  • tls-api-security-framework, wraps security-framework crate

The idea is that code can be written without the knowledge of the TLS implementation used, like this:

# { #![cfg(feature = "runtime-tokio")]
use tls_api::{TlsConnector, TlsConnectorBuilder};
// or async_std::net::TcpStream;
use tokio::net::TcpStream;
# use tls_api::runtime::AsyncWriteExt;
# use tls_api::runtime::AsyncReadExt;

async fn download_rust_lang_org<C: TlsConnector>() -> anyhow::Result<Vec<u8>> {
let stream = TcpStream::connect(("rust-lang.org", 443)).await?;
let mut  stream = C::builder()?.build()?.connect("rust-lang.org", stream).await?;
stream.write_all(b"GET / HTTP/1.1\r\nHost: rust-lang.org\r\n\r\n").await?;
let mut buf = Vec::new();
stream.read_to_end(&mut buf).await?;
Ok(buf)
}
# }

or the same code with dynamic connector:

# { #![cfg(feature = "runtime-tokio")]
use tls_api::TlsConnectorType;
// or async_std::net::TcpStream;
use tokio::net::TcpStream;
# use tls_api::runtime::AsyncWriteExt;
# use tls_api::runtime::AsyncReadExt;

async fn download_rust_lang_org(connector_type: &dyn TlsConnectorType) -> anyhow::Result<Vec<u8>> {
let stream = TcpStream::connect(("rust-lang.org", 443)).await?;
let mut  stream = connector_type.builder()?.build()?.connect("rust-lang.org", stream).await?;
stream.write_all(b"GET / HTTP/1.1\r\nHost: rust-lang.org\r\n\r\n").await?;
let mut buf = Vec::new();
stream.read_to_end(&mut buf).await?;
Ok(buf)
}
# }

Have a look at working example invoking all implementation on GitHub.

There are also two fake implementations:

  • tls-api-stub crate which returns an error on any operations, useful to check code compiles
  • tls-api-no-tls fake implementation which returns plain sockets without TLS

The API is provided to be compatible with both tokio and async-std. Crate features:

  • runtime-tokio enables the implementation over tokio
  • runtime-async-std enables the implementation over async-std

Currently the features are mutually exclusive.