|
|
|
@ -346,22 +346,6 @@ impl QuicState {
|
|
|
|
|
}
|
|
|
|
|
// header.length was checked against rest.len() during parsing
|
|
|
|
|
let (mut framebuf, next_buf) = rest.split_at(header.length.into());
|
|
|
|
|
let hlen = buf.len() - rest.len();
|
|
|
|
|
let mut output;
|
|
|
|
|
if self.keys.is_some() && !framebuf.is_empty() {
|
|
|
|
|
output = Vec::with_capacity(framebuf.len() + 4);
|
|
|
|
|
if let Ok(dlen) =
|
|
|
|
|
self.decrypt(to_server, &header, framebuf, buf, hlen, &mut output)
|
|
|
|
|
{
|
|
|
|
|
output.resize(dlen, 0);
|
|
|
|
|
} else {
|
|
|
|
|
self.set_event_notx(QuicEvent::FailedDecrypt, header, to_server);
|
|
|
|
|
return false;
|
|
|
|
|
}
|
|
|
|
|
framebuf = &output;
|
|
|
|
|
}
|
|
|
|
|
buf = next_buf;
|
|
|
|
|
|
|
|
|
|
if header.ty != QuicType::Initial {
|
|
|
|
|
// only version is interesting, no frames
|
|
|
|
|
self.new_tx(
|
|
|
|
@ -375,8 +359,24 @@ impl QuicState {
|
|
|
|
|
to_server,
|
|
|
|
|
false,
|
|
|
|
|
);
|
|
|
|
|
buf = next_buf;
|
|
|
|
|
continue;
|
|
|
|
|
}
|
|
|
|
|
let hlen = buf.len() - rest.len();
|
|
|
|
|
let mut output;
|
|
|
|
|
if self.keys.is_some() && !framebuf.is_empty() {
|
|
|
|
|
output = Vec::with_capacity(framebuf.len() + 4);
|
|
|
|
|
if let Ok(dlen) =
|
|
|
|
|
self.decrypt(to_server, &header, framebuf, buf, hlen, &mut output)
|
|
|
|
|
{
|
|
|
|
|
output.resize(dlen, 0);
|
|
|
|
|
} else {
|
|
|
|
|
self.set_event_notx(QuicEvent::FailedDecrypt, header, to_server);
|
|
|
|
|
return false;
|
|
|
|
|
}
|
|
|
|
|
framebuf = &output;
|
|
|
|
|
}
|
|
|
|
|
buf = next_buf;
|
|
|
|
|
|
|
|
|
|
let mut frag = Vec::new();
|
|
|
|
|
// take the current fragment and reset it in the state
|
|
|
|
|