Skip to content

Commit 71e56fe

Browse files
authored
fix(s2n-quic-dc): derive crypto before opening TCP stream (#2451)
1 parent df48d3c commit 71e56fe

File tree

2 files changed

+28
-17
lines changed

2 files changed

+28
-17
lines changed

dc/s2n-quic-dc/src/stream/client/tokio.rs

+23-7
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@ use crate::{
99
endpoint,
1010
environment::tokio::{self as env, Environment},
1111
socket::Protocol,
12+
TransportFeatures,
1213
},
1314
};
1415
use std::{io, net::SocketAddr};
@@ -29,12 +30,15 @@ where
2930
// ensure we have a secret for the peer
3031
let peer = handshake.await?;
3132

33+
let (crypto, parameters) = peer.pair(&TransportFeatures::UDP);
34+
3235
let stream = endpoint::open_stream(
3336
env,
34-
peer,
37+
peer.map(),
38+
crypto,
39+
parameters,
3540
env::UdpUnbound(acceptor_addr.into()),
3641
subscriber,
37-
None,
3842
)?;
3943

4044
// build the stream inside the application context
@@ -60,7 +64,14 @@ where
6064
Sub: event::Subscriber,
6165
{
6266
// Race TCP handshake with the TLS handshake
63-
let (socket, peer) = tokio::try_join!(TcpStream::connect(acceptor_addr), handshake,)?;
67+
let handshake = async {
68+
let peer = handshake.await?;
69+
let (crypto, parameters) = peer.pair(&TransportFeatures::TCP);
70+
Ok((peer, crypto, parameters))
71+
};
72+
// poll the crypto first so the server can read the first packet on accept in the happy path
73+
let ((peer, crypto, parameters), socket) =
74+
tokio::try_join!(handshake, TcpStream::connect(acceptor_addr))?;
6475

6576
// Make sure TCP_NODELAY is set
6677
let _ = socket.set_nodelay(true);
@@ -77,14 +88,15 @@ where
7788

7889
let stream = endpoint::open_stream(
7990
env,
80-
peer,
91+
peer.map(),
92+
crypto,
93+
parameters,
8194
env::TcpRegistered {
8295
socket,
8396
peer_addr,
8497
local_port,
8598
},
8699
subscriber,
87-
None,
88100
)?;
89101

90102
// build the stream inside the application context
@@ -114,16 +126,20 @@ where
114126
{
115127
let local_port = socket.local_addr()?.port();
116128
let peer_addr = socket.peer_addr()?.into();
129+
130+
let (crypto, parameters) = peer.pair(&TransportFeatures::TCP);
131+
117132
let stream = endpoint::open_stream(
118133
env,
119-
peer,
134+
peer.map(),
135+
crypto,
136+
parameters,
120137
env::TcpRegistered {
121138
socket,
122139
peer_addr,
123140
local_port,
124141
},
125142
subscriber,
126-
None,
127143
)?;
128144

129145
// build the stream inside the application context

dc/s2n-quic-dc/src/stream/endpoint.rs

+5-10
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44
use crate::{
55
event::{self, api::Subscriber as _, IntoEvent as _},
66
msg, packet,
7-
path::secret::{self, map, Map},
7+
path::secret::{self, Map},
88
random::Random,
99
stream::{
1010
application,
@@ -35,21 +35,16 @@ pub struct AcceptError<Peer> {
3535
#[inline]
3636
pub fn open_stream<Env, P>(
3737
env: &Env,
38-
entry: map::Peer,
38+
map: &Map,
39+
crypto: secret::map::Bidirectional,
40+
parameters: dc::ApplicationParams,
3941
peer: P,
4042
subscriber: Env::Subscriber,
41-
parameter_override: Option<&dyn Fn(dc::ApplicationParams) -> dc::ApplicationParams>,
4243
) -> Result<application::Builder<Env::Subscriber>>
4344
where
4445
Env: Environment,
4546
P: Peer<Env>,
4647
{
47-
let (crypto, mut parameters) = entry.pair(&peer.features());
48-
49-
if let Some(o) = parameter_override {
50-
parameters = o(parameters);
51-
}
52-
5348
let key_id = crypto.credentials.key_id;
5449
let stream_id = packet::stream::Id {
5550
key_id,
@@ -74,7 +69,7 @@ where
7469
stream_id,
7570
None,
7671
crypto,
77-
entry.map(),
72+
map,
7873
parameters,
7974
None,
8075
None,

0 commit comments

Comments
 (0)