Skip to content

Commit 65f4b5b

Browse files
lukacanPavel Siska
authored andcommitted
QUIC: changed copy whole packet payload to copy only header
1 parent 718f62e commit 65f4b5b

File tree

2 files changed

+34
-19
lines changed

2 files changed

+34
-19
lines changed

process/quic.cpp

Lines changed: 26 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -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])) {

process/quic.hpp

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -98,6 +98,11 @@ UR_FIELDS(
9898

9999

100100
#define CURRENT_BUFFER_SIZE 1500
101+
// first byte (1) + version (4) + dcid length (1) + dcid (20) + scid length (1) + scid (20) +
102+
// token length (variable so max is 8) + token (idk) + length (max 8) + pkt number (4)
103+
// cant figure out if token length has any boundaries, teoretically 8 byte version of token length
104+
// means 2^64 as max length
105+
#define MAX_HEADER_LEN 1 + 4 + 1 + 20 + 1 + 20 + 8 + 100 + 8 + 4
101106

102107

103108
// Frame types which can occure in Initial packets
@@ -303,7 +308,9 @@ class QUICPlugin : public ProcessPlugin
303308
uint8_t assembled_payload[CURRENT_BUFFER_SIZE];
304309

305310

306-
uint8_t tmp_packet_mem[CURRENT_BUFFER_SIZE];
311+
312+
uint8_t tmp_header_mem[MAX_HEADER_LEN];
313+
307314
uint8_t *final_payload;
308315

309316

0 commit comments

Comments
 (0)