Skip to content

Commit dfb1d88

Browse files
committed
Port tokio-rustls to rustls 0.24
1 parent da533d2 commit dfb1d88

13 files changed

Lines changed: 162 additions & 83 deletions

File tree

Cargo.lock

Lines changed: 33 additions & 13 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

Cargo.toml

Lines changed: 8 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -13,19 +13,21 @@ rust-version = "1.71"
1313
exclude = ["/.github", "/examples", "/scripts", "/tests/"]
1414

1515
[dependencies]
16-
rustls = { version = "0.23.27", default-features = false, features = ["std"] }
16+
rustls = { git = "https://github.com/iadev09/rustls.git", branch = "quic-acceptor-tls13-ccs", package = "rustls", version = "0.24.0-dev.0", default-features = false, features = ["webpki"] }
17+
rustls-aws-lc-rs = { git = "https://github.com/iadev09/rustls.git", branch = "quic-acceptor-tls13-ccs", package = "rustls-aws-lc-rs", version = "0.1.0-dev.0", default-features = false, features = ["aws-lc-sys", "std"], optional = true }
18+
rustls-ring = { git = "https://github.com/iadev09/rustls.git", branch = "quic-acceptor-tls13-ccs", package = "rustls-ring", version = "0.1.0-dev.0", default-features = false, features = ["std"], optional = true }
1719
tokio = "1.0"
1820

1921
[features]
2022
default = ["logging", "tls12", "aws_lc_rs"]
21-
aws_lc_rs = ["rustls/aws_lc_rs"]
23+
aws_lc_rs = ["dep:rustls-aws-lc-rs"]
2224
aws-lc-rs = ["aws_lc_rs"] # Alias because Cargo features commonly use `-`
2325
brotli = ["rustls/brotli"]
2426
early-data = []
25-
fips = ["rustls/fips"]
26-
logging = ["rustls/logging"]
27-
ring = ["rustls/ring"]
28-
tls12 = ["rustls/tls12"]
27+
fips = ["aws_lc_rs", "rustls-aws-lc-rs/fips"]
28+
logging = ["rustls/log"]
29+
ring = ["dep:rustls-ring"]
30+
tls12 = []
2931
zlib = ["rustls/zlib"]
3032

3133
[dev-dependencies]

examples/client.rs

Lines changed: 14 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -51,9 +51,9 @@ async fn main() -> Result<(), Box<dyn StdError + Send + Sync + 'static>> {
5151
root_cert_store.extend(webpki_roots::TLS_SERVER_ROOTS.iter().cloned());
5252
}
5353

54-
let config = rustls::ClientConfig::builder()
54+
let config = rustls::ClientConfig::builder(provider())
5555
.with_root_certificates(root_cert_store)
56-
.with_no_client_auth(); // i guess this was previously the default?
56+
.with_no_client_auth()?; // i guess this was previously the default?
5757
let connector = TlsConnector::from(Arc::new(config));
5858

5959
let stream = TcpStream::connect(&addr).await?;
@@ -78,3 +78,15 @@ async fn main() -> Result<(), Box<dyn StdError + Send + Sync + 'static>> {
7878

7979
Ok(())
8080
}
81+
82+
fn provider() -> Arc<rustls::crypto::CryptoProvider> {
83+
#[cfg(feature = "aws_lc_rs")]
84+
{
85+
return Arc::new(rustls_aws_lc_rs::DEFAULT_PROVIDER.clone());
86+
}
87+
88+
#[cfg(all(not(feature = "aws_lc_rs"), feature = "ring"))]
89+
{
90+
return Arc::new(rustls_ring::DEFAULT_PROVIDER.clone());
91+
}
92+
}

examples/server.rs

Lines changed: 16 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ use std::error::Error as StdError;
66
use std::sync::Arc;
77

88
use argh::FromArgs;
9+
use rustls::crypto::Identity;
910
use rustls::pki_types::pem::PemObject;
1011
use rustls::pki_types::{CertificateDer, PrivateKeyDer};
1112
use tokio::io::{copy, sink, split, AsyncWriteExt};
@@ -45,9 +46,10 @@ async fn main() -> Result<(), Box<dyn StdError + Send + Sync + 'static>> {
4546
let key = PrivateKeyDer::from_pem_file(&options.key)?;
4647
let flag_echo = options.echo_mode;
4748

48-
let config = rustls::ServerConfig::builder()
49+
let identity = Arc::new(Identity::from_cert_chain(certs)?);
50+
let config = rustls::ServerConfig::builder(provider())
4951
.with_no_client_auth()
50-
.with_single_cert(certs, key)?;
52+
.with_single_cert(identity, key)?;
5153
let acceptor = TlsAcceptor::from(Arc::new(config));
5254

5355
let listener = TcpListener::bind(&addr).await?;
@@ -90,3 +92,15 @@ async fn main() -> Result<(), Box<dyn StdError + Send + Sync + 'static>> {
9092
});
9193
}
9294
}
95+
96+
fn provider() -> Arc<rustls::crypto::CryptoProvider> {
97+
#[cfg(feature = "aws_lc_rs")]
98+
{
99+
return Arc::new(rustls_aws_lc_rs::DEFAULT_PROVIDER.clone());
100+
}
101+
102+
#[cfg(all(not(feature = "aws_lc_rs"), feature = "ring"))]
103+
{
104+
return Arc::new(rustls_ring::DEFAULT_PROVIDER.clone());
105+
}
106+
}

src/client.rs

Lines changed: 16 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,10 @@ use std::{
1212
sync::Arc,
1313
};
1414

15-
use rustls::{pki_types::ServerName, ClientConfig, ClientConnection};
15+
use rustls::{
16+
enums::ApplicationProtocol, pki_types::ServerName, ClientConfig, ClientConnection,
17+
Connection as _,
18+
};
1619
use tokio::io::{AsyncBufRead, AsyncRead, AsyncWrite, ReadBuf};
1720

1821
use crate::common::{IoSession, MidHandshake, Stream, TlsState};
@@ -64,8 +67,18 @@ impl TlsConnector {
6467
IO: AsyncRead + AsyncWrite + Unpin,
6568
F: FnOnce(&mut ClientConnection),
6669
{
67-
let alpn = alpn_protocols.unwrap_or_else(|| self.inner.alpn_protocols.clone());
68-
let mut session = match ClientConnection::new_with_alpn(self.inner.clone(), domain, alpn) {
70+
let builder = self.inner.connect(domain);
71+
let builder = if let Some(alpn_protocols) = alpn_protocols {
72+
builder.with_alpn(
73+
alpn_protocols
74+
.into_iter()
75+
.map(ApplicationProtocol::from)
76+
.collect(),
77+
)
78+
} else {
79+
builder
80+
};
81+
let mut session = match builder.build() {
6982
Ok(session) => session,
7083
Err(error) => {
7184
return Connect(MidHandshake::Error {

src/common/handshake.rs

Lines changed: 3 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,10 @@
11
use std::future::Future;
2-
use std::ops::{Deref, DerefMut};
32
use std::pin::Pin;
43
use std::task::{Context, Poll};
54
use std::{io, mem};
65

76
use rustls::server::AcceptedAlert;
8-
use rustls::{ConnectionCommon, SideData};
7+
use rustls::Connection as RustlsConnection;
98
use tokio::io::{AsyncRead, AsyncWrite};
109

1110
use crate::common::{Stream, SyncWriteAdapter, TlsState};
@@ -33,12 +32,11 @@ pub(crate) enum MidHandshake<IS: IoSession> {
3332
},
3433
}
3534

36-
impl<IS, SD> Future for MidHandshake<IS>
35+
impl<IS> Future for MidHandshake<IS>
3736
where
3837
IS: IoSession + Unpin,
3938
IS::Io: AsyncRead + AsyncWrite + Unpin,
40-
IS::Session: DerefMut + Deref<Target = ConnectionCommon<SD>> + Unpin,
41-
SD: SideData,
39+
IS::Session: RustlsConnection + Unpin,
4240
{
4341
type Output = Result<IS, (io::Error, IS::Io)>;
4442

src/common/mod.rs

Lines changed: 10 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,8 @@
11
use std::io::{self, BufRead as _, IoSlice, Read, Write};
2-
use std::ops::{Deref, DerefMut};
32
use std::pin::Pin;
43
use std::task::{Context, Poll};
54

6-
use rustls::{ConnectionCommon, SideData};
5+
use rustls::Connection as RustlsConnection;
76
use tokio::io::{AsyncBufRead, AsyncRead, AsyncWrite, ReadBuf};
87

98
mod handshake;
@@ -66,10 +65,9 @@ pub(crate) struct Stream<'a, IO, C> {
6665
pub(crate) need_flush: bool,
6766
}
6867

69-
impl<'a, IO: AsyncRead + AsyncWrite + Unpin, C, SD> Stream<'a, IO, C>
68+
impl<'a, IO: AsyncRead + AsyncWrite + Unpin, C> Stream<'a, IO, C>
7069
where
71-
C: DerefMut + Deref<Target = ConnectionCommon<SD>>,
72-
SD: SideData,
70+
C: RustlsConnection,
7371
{
7472
pub(crate) fn new(io: &'a mut IO, session: &'a mut C) -> Self {
7573
Stream {
@@ -188,10 +186,7 @@ where
188186
}
189187
}
190188

191-
pub(crate) fn poll_fill_buf(mut self, cx: &mut Context<'_>) -> Poll<io::Result<&'a [u8]>>
192-
where
193-
SD: 'a,
194-
{
189+
pub(crate) fn poll_fill_buf(mut self, cx: &mut Context<'_>) -> Poll<io::Result<&'a [u8]>> {
195190
let mut io_pending = false;
196191

197192
// read a packet
@@ -231,10 +226,9 @@ where
231226
}
232227
}
233228

234-
impl<'a, IO: AsyncRead + AsyncWrite + Unpin, C, SD> AsyncRead for Stream<'a, IO, C>
229+
impl<'a, IO: AsyncRead + AsyncWrite + Unpin, C> AsyncRead for Stream<'a, IO, C>
235230
where
236-
C: DerefMut + Deref<Target = ConnectionCommon<SD>>,
237-
SD: SideData + 'a,
231+
C: RustlsConnection + 'a,
238232
{
239233
fn poll_read(
240234
mut self: Pin<&mut Self>,
@@ -249,10 +243,9 @@ where
249243
}
250244
}
251245

252-
impl<'a, IO: AsyncRead + AsyncWrite + Unpin, C, SD> AsyncBufRead for Stream<'a, IO, C>
246+
impl<'a, IO: AsyncRead + AsyncWrite + Unpin, C> AsyncBufRead for Stream<'a, IO, C>
253247
where
254-
C: DerefMut + Deref<Target = ConnectionCommon<SD>>,
255-
SD: SideData + 'a,
248+
C: RustlsConnection + 'a,
256249
{
257250
fn poll_fill_buf(self: Pin<&mut Self>, cx: &mut Context<'_>) -> Poll<io::Result<&[u8]>> {
258251
let this = self.get_mut();
@@ -270,10 +263,9 @@ where
270263
}
271264
}
272265

273-
impl<IO: AsyncRead + AsyncWrite + Unpin, C, SD> AsyncWrite for Stream<'_, IO, C>
266+
impl<IO: AsyncRead + AsyncWrite + Unpin, C> AsyncWrite for Stream<'_, IO, C>
274267
where
275-
C: DerefMut + Deref<Target = ConnectionCommon<SD>>,
276-
SD: SideData,
268+
C: RustlsConnection,
277269
{
278270
fn poll_write(
279271
mut self: Pin<&mut Self>,

0 commit comments

Comments
 (0)