diff --git a/quinn-proto/src/connection/mod.rs b/quinn-proto/src/connection/mod.rs index 70c1b6c4a..dcce22abf 100644 --- a/quinn-proto/src/connection/mod.rs +++ b/quinn-proto/src/connection/mod.rs @@ -1831,7 +1831,7 @@ where self.reject_0rtt(); } else { self.accepted_0rtt = true; - params.validate_0rtt(&self.peer_params)?; + params.validate_resumption_from(&self.peer_params)?; } } if let Some(token) = params.stateless_reset_token { diff --git a/quinn-proto/src/transport_parameters.rs b/quinn-proto/src/transport_parameters.rs index 65cb84561..95935c055 100644 --- a/quinn-proto/src/transport_parameters.rs +++ b/quinn-proto/src/transport_parameters.rs @@ -153,15 +153,18 @@ impl TransportParameters { /// Check that these parameters are legal when resuming from /// certain cached parameters - pub(crate) fn validate_0rtt(&self, cached: &TransportParameters) -> Result<(), TransportError> { - if cached.active_connection_id_limit < self.active_connection_id_limit - || cached.initial_max_data < self.initial_max_data - || cached.initial_max_stream_data_bidi_local < self.initial_max_stream_data_bidi_local - || cached.initial_max_stream_data_bidi_remote < self.initial_max_stream_data_bidi_remote - || cached.initial_max_stream_data_uni < self.initial_max_stream_data_uni - || cached.initial_max_streams_bidi < self.initial_max_streams_bidi - || cached.initial_max_streams_uni < self.initial_max_streams_uni - || cached.max_datagram_frame_size < self.max_datagram_frame_size + pub(crate) fn validate_resumption_from( + &self, + cached: &TransportParameters, + ) -> Result<(), TransportError> { + if cached.active_connection_id_limit > self.active_connection_id_limit + || cached.initial_max_data > self.initial_max_data + || cached.initial_max_stream_data_bidi_local > self.initial_max_stream_data_bidi_local + || cached.initial_max_stream_data_bidi_remote > self.initial_max_stream_data_bidi_remote + || cached.initial_max_stream_data_uni > self.initial_max_stream_data_uni + || cached.initial_max_streams_bidi > self.initial_max_streams_bidi + || cached.initial_max_streams_uni > self.initial_max_streams_uni + || cached.max_datagram_frame_size > self.max_datagram_frame_size { return Err(TransportError::PROTOCOL_VIOLATION( "0-RTT accepted with incompatible transport parameters", @@ -468,4 +471,18 @@ mod test { params ); } + + #[test] + fn resumption_params_validation() { + let high_limit = TransportParameters { + initial_max_streams_uni: 32, + ..Default::default() + }; + let low_limit = TransportParameters { + initial_max_streams_uni: 16, + ..Default::default() + }; + high_limit.validate_resumption_from(&low_limit).unwrap(); + low_limit.validate_resumption_from(&high_limit).unwrap_err(); + } }