Skip to content

Commit

Permalink
fix(s2n-quic-dc): derive crypto before opening TCP stream
Browse files Browse the repository at this point in the history
  • Loading branch information
camshaft committed Jan 22, 2025
1 parent df48d3c commit c9879ba
Show file tree
Hide file tree
Showing 2 changed files with 28 additions and 17 deletions.
30 changes: 23 additions & 7 deletions dc/s2n-quic-dc/src/stream/client/tokio.rs
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@ use crate::{
endpoint,
environment::tokio::{self as env, Environment},
socket::Protocol,
TransportFeatures,
},
};
use std::{io, net::SocketAddr};
Expand All @@ -29,12 +30,15 @@ where
// ensure we have a secret for the peer
let peer = handshake.await?;

let (crypto, parameters) = peer.pair(&TransportFeatures::UDP);

let stream = endpoint::open_stream(
env,
peer,
peer.map(),
crypto,
parameters,
env::UdpUnbound(acceptor_addr.into()),
subscriber,
None,
)?;

// build the stream inside the application context
Expand All @@ -60,7 +64,14 @@ where
Sub: event::Subscriber,
{
// Race TCP handshake with the TLS handshake
let (socket, peer) = tokio::try_join!(TcpStream::connect(acceptor_addr), handshake,)?;
let handshake = async {
let peer = handshake.await?;
let (crypto, parameters) = peer.pair(&TransportFeatures::TCP);
Ok((peer, crypto, parameters))
};
// poll the crypto first so the server can read the first packet on accept in the happy path
let ((peer, crypto, parameters), socket) =
tokio::try_join!(handshake, TcpStream::connect(acceptor_addr))?;

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

let stream = endpoint::open_stream(
env,
peer,
peer.map(),
crypto,
parameters,
env::TcpRegistered {
socket,
peer_addr,
local_port,
},
subscriber,
None,
)?;

// build the stream inside the application context
Expand Down Expand Up @@ -114,16 +126,20 @@ where
{
let local_port = socket.local_addr()?.port();
let peer_addr = socket.peer_addr()?.into();

let (crypto, parameters) = peer.pair(&TransportFeatures::TCP);

let stream = endpoint::open_stream(
env,
peer,
peer.map(),
crypto,
parameters,
env::TcpRegistered {
socket,
peer_addr,
local_port,
},
subscriber,
None,
)?;

// build the stream inside the application context
Expand Down
15 changes: 5 additions & 10 deletions dc/s2n-quic-dc/src/stream/endpoint.rs
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@
use crate::{
event::{self, api::Subscriber as _, IntoEvent as _},
msg, packet,
path::secret::{self, map, Map},
path::secret::{self, Map},
random::Random,
stream::{
application,
Expand Down Expand Up @@ -35,21 +35,16 @@ pub struct AcceptError<Peer> {
#[inline]
pub fn open_stream<Env, P>(
env: &Env,
entry: map::Peer,
map: &Map,
crypto: secret::map::Bidirectional,
parameters: dc::ApplicationParams,
peer: P,
subscriber: Env::Subscriber,
parameter_override: Option<&dyn Fn(dc::ApplicationParams) -> dc::ApplicationParams>,
) -> Result<application::Builder<Env::Subscriber>>
where
Env: Environment,
P: Peer<Env>,
{
let (crypto, mut parameters) = entry.pair(&peer.features());

if let Some(o) = parameter_override {
parameters = o(parameters);
}

let key_id = crypto.credentials.key_id;
let stream_id = packet::stream::Id {
key_id,
Expand All @@ -74,7 +69,7 @@ where
stream_id,
None,
crypto,
entry.map(),
map,
parameters,
None,
None,
Expand Down

0 comments on commit c9879ba

Please sign in to comment.