]> git.ipfire.org Git - thirdparty/suricata.git/commitdiff
quic: decrypt only initial packets 12631/head
authorPhilippe Antoine <pantoine@oisf.net>
Wed, 19 Feb 2025 09:08:58 +0000 (10:08 +0100)
committerVictor Julien <victor@inliniac.net>
Wed, 19 Feb 2025 15:34:12 +0000 (16:34 +0100)
Ticket: 7556

Avoids failed_decrypt events when the first packet seen is not
a Quic Initial packet

rust/src/quic/quic.rs

index c636e8d1bb18ef8feb62dec92d6a8c30504c3095..165fc44dc6798984d2032f0ab39c1561beb5e012 100644 (file)
@@ -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