@@ -771,6 +771,26 @@ bool QUICPlugin::quic_decrypt_header()
771771 first_byte ^= mask[0 ] & 0x0f ;
772772 uint8_t pkn_len = (first_byte & 0x03 ) + 1 ;
773773
774+ // after de-obfuscating pkn, we know exactly pkn length so we can correctly adjust start of payload
775+ DEBUG_MSG (" PPKN LEN %d\n " ,pkn_len);
776+ payload = payload + pkn_len;
777+ payload_len = payload_len - pkn_len;
778+ DEBUG_MSG (" PAYLOAD LEN %d\n " ,payload_len);
779+
780+
781+ // SET HEADER LENGTH, if header length is set incorrectly AEAD will calculate wrong tag, so decryption will fail
782+ header_len = payload - header;
783+
784+ if (header_len > MAX_HEADER_LEN)
785+ {
786+ DEBUG_MSG (" Header length too long\n " );
787+ return false ;
788+ }
789+
790+ memcpy (tmp_header_mem,header, header_len);
791+ header = tmp_header_mem;
792+
793+
774794 // set deobfuscated first byte
775795 header[0 ] = first_byte;
776796
@@ -784,17 +804,6 @@ bool QUICPlugin::quic_decrypt_header()
784804 packet_number |= (full_pkn[i] ^ mask[1 + i]) << (8 * (pkn_len - 1 - i));
785805 }
786806
787-
788- // after de-obfuscating pkn, we know exactly pkn length so we can correctly adjust start of payload
789- DEBUG_MSG (" PPKN LEN %d\n " ,pkn_len);
790- payload = payload + pkn_len;
791- payload_len = payload_len - pkn_len;
792-
793- DEBUG_MSG (" PAYLOAD LEN %d\n " ,payload_len);
794-
795- // SET HEADER LENGTH, if header length is set incorrectly AEAD will calculate wrong tag, so decryption will fail
796- header_len = payload - header;
797-
798807 // set decrypted packet number
799808 for (unsigned i = 0 ; i < pkn_len; i++) {
800809 header[header_len - 1 - i] = (uint8_t ) (packet_number >> (8 * i));
@@ -1114,17 +1123,16 @@ bool QUICPlugin::quic_parse_data(const Packet &pkt,RecordExtQUIC * rec)
11141123 return false ;
11151124 }
11161125
1117-
1118- memcpy (tmp_packet_mem,pkt.payload ,sizeof (uint8_t ) * pkt.payload_len );
1119- uint8_t *tmp_pointer = tmp_packet_mem;
1126+
1127+ uint8_t *tmp_pointer = pkt.payload ;
11201128
11211129 uint64_t offset = 0 ;
1122- const uint8_t *payload_end = (uint8_t *) tmp_packet_mem + pkt.payload_len ;
1130+ const uint8_t *payload_end = (uint8_t *) pkt. payload + pkt.payload_len ;
11231131
11241132
11251133
11261134 // set header pointer to the start of header
1127- header = tmp_packet_mem ;
1135+ header = pkt. payload ;
11281136
11291137
11301138
@@ -1189,7 +1197,7 @@ bool QUICPlugin::quic_parse_data(const Packet &pkt,RecordExtQUIC * rec)
11891197 return false ;
11901198 }
11911199
1192- // after this offset should point after the token
1200+ // after this, offset should point after the token
11931201 offset += token_length;
11941202
11951203 if ((tmp_pointer + offset) > payload_end) {
@@ -1269,7 +1277,7 @@ bool QUICPlugin::process_quic(RecordExtQUIC *quic_data, const Packet &pkt)
12691277 // buffer for reassembled payload
12701278 memset (assembled_payload,0 ,CURRENT_BUFFER_SIZE);
12711279 // buffer for raw data (quic content copied here)
1272- memset (tmp_packet_mem ,0 ,CURRENT_BUFFER_SIZE );
1280+ memset (tmp_header_mem ,0 ,MAX_HEADER_LEN );
12731281
12741282 // check if packet contains LONG HEADER and is of type INITIAL
12751283 if (pkt.ip_proto != 17 || !quic_check_initial (pkt.payload [0 ])) {
0 commit comments