Path: blob/main/crates/wasi-tls-openssl/src/lib.rs
3069 views
//! The `openssl` provider.12use openssl::ssl::{SslConnector, SslMethod};3use std::{4io,5pin::{Pin, pin},6};7use wasmtime_wasi_tls::{TlsProvider, TlsStream, TlsTransport};89type BoxFuture<T> = std::pin::Pin<Box<dyn Future<Output = T> + Send>>;1011/// The `openssl` provider.12pub struct OpenSslProvider {13_priv: (),14}1516impl TlsProvider for OpenSslProvider {17fn connect(18&self,19server_name: String,20transport: Box<dyn TlsTransport>,21) -> BoxFuture<io::Result<Box<dyn TlsStream>>> {22async fn connect_impl(23server_name: String,24transport: Box<dyn TlsTransport>,25) -> Result<OpenSslStream, openssl::ssl::Error> {26// Per the `openssl` crate's recommendation, we're using the27// `SslConnector` to set up a Ssl object with secure defaults:28//29// https://docs.rs/openssl/latest/openssl/ssl/struct.SslConnector.html30// > OpenSSL's default configuration is highly insecure. This31// > connector manages the OpenSSL structures, configuring cipher32// > suites, session options, hostname verification, and more.33let config = SslConnector::builder(SslMethod::tls_client())?34.build()35.configure()?;36let ssl = config.into_ssl(&server_name)?;37let mut stream = tokio_openssl::SslStream::new(ssl, transport)?;38Pin::new(&mut stream).connect().await?;39Ok(OpenSslStream(stream))40}4142Box::pin(async move {43let stream = connect_impl(server_name, transport)44.await45.map_err(|e| io::Error::other(e))?;46Ok(Box::new(stream) as Box<dyn TlsStream>)47})48}49}5051impl Default for OpenSslProvider {52fn default() -> Self {53Self { _priv: () }54}55}5657struct OpenSslStream(tokio_openssl::SslStream<Box<dyn TlsTransport>>);5859impl TlsStream for OpenSslStream {}6061impl tokio::io::AsyncRead for OpenSslStream {62fn poll_read(63mut self: std::pin::Pin<&mut Self>,64cx: &mut std::task::Context<'_>,65buf: &mut tokio::io::ReadBuf<'_>,66) -> std::task::Poll<io::Result<()>> {67pin!(&mut self.as_mut().0).poll_read(cx, buf)68}69}7071impl tokio::io::AsyncWrite for OpenSslStream {72fn poll_write(73mut self: std::pin::Pin<&mut Self>,74cx: &mut std::task::Context<'_>,75buf: &[u8],76) -> std::task::Poll<io::Result<usize>> {77pin!(&mut self.as_mut().0).poll_write(cx, buf)78}7980fn poll_flush(81mut self: std::pin::Pin<&mut Self>,82cx: &mut std::task::Context<'_>,83) -> std::task::Poll<Result<(), io::Error>> {84pin!(&mut self.as_mut().0).poll_flush(cx)85}8687fn poll_shutdown(88mut self: std::pin::Pin<&mut Self>,89cx: &mut std::task::Context<'_>,90) -> std::task::Poll<Result<(), io::Error>> {91pin!(&mut self.as_mut().0).poll_shutdown(cx)92}93}949596