Skip to content
Closed
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
11 changes: 10 additions & 1 deletion rust/src/quic/quic.rs
Original file line number Diff line number Diff line change
Expand Up @@ -120,6 +120,7 @@ pub struct QuicState {
crypto_fraglen_ts: u32,
hello_tc: bool,
hello_ts: bool,
has_retried: bool,
transactions: VecDeque<QuicTransaction>,
}

Expand All @@ -135,6 +136,7 @@ impl Default for QuicState {
crypto_fraglen_ts: 0,
hello_tc: false,
hello_ts: false,
has_retried: false,
transactions: VecDeque::new(),
}
}
Expand Down Expand Up @@ -339,10 +341,17 @@ impl QuicState {
// unprotect/decrypt packet
if self.keys.is_none() && header.ty == QuicType::Initial {
self.keys = quic_keys_initial(u32::from(header.version), &header.dcid);
} else if !to_server && self.keys.is_some() && header.ty == QuicType::Retry {
} else if !to_server
&& self.keys.is_some()
&& header.ty == QuicType::Retry
&& !self.has_retried
{
// a retry packet discards the current keys, client will resend an initial packet with new keys
self.hello_ts = false;
self.keys = None;
// RFC 9000 17.2.5.2 After the client has received and processed an Initial or Retry packet
// from the server, it MUST discard any subsequent Retry packets that it receives.
self.has_retried = true;
}
// header.length was checked against rest.len() during parsing
let (mut framebuf, next_buf) = rest.split_at(header.length.into());
Expand Down
Loading