Skip to content

Commit b2b7a7c

Browse files
lukacanPavel Siska
authored andcommitted
QUIC: parse_header variables changed to const, decrypt_header copies from original pkt payload
1 parent 98dd16d commit b2b7a7c

File tree

2 files changed

+55
-64
lines changed

2 files changed

+55
-64
lines changed

process/quic_parser.cpp

Lines changed: 48 additions & 57 deletions
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,6 @@ QUICParser::QUICParser()
3333
{
3434
quic_h1 = nullptr;
3535
quic_h2 = nullptr;
36-
header = nullptr;
3736
payload = nullptr;
3837

3938
header_len = 0;
@@ -66,15 +65,15 @@ void QUICParser::quic_get_user_agent(char *in)
6665
return;
6766
}
6867

69-
bool QUICParser::quic_check_pointer_pos(uint8_t *current, uint8_t *end)
68+
bool QUICParser::quic_check_pointer_pos(const uint8_t *current, const uint8_t *end)
7069
{
7170
if (current < end)
7271
return true;
7372

7473
return false;
7574
}
7675

77-
uint64_t QUICParser::quic_get_variable_length(uint8_t *start, uint64_t &offset)
76+
uint64_t QUICParser::quic_get_variable_length(const uint8_t *start, uint64_t &offset)
7877
{
7978
// find out length of parameter field (and load parameter, then move offset) , defined in:
8079
// https://www.rfc-editor.org/rfc/rfc9000.html#name-summary-of-integer-encoding
@@ -84,28 +83,24 @@ uint64_t QUICParser::quic_get_variable_length(uint8_t *start, uint64_t &offset)
8483
uint8_t two_bits = *(start + offset) & 0xC0;
8584

8685
switch (two_bits) {
87-
case 0:
88-
tmp = *(start + offset) & 0x3F;
89-
offset += sizeof(uint8_t);
90-
return tmp;
91-
92-
case 64:
93-
tmp = be16toh(*(uint16_t *) (start + offset)) & 0x3FFF;
94-
offset += sizeof(uint16_t);
95-
return tmp;
96-
97-
case 128:
98-
tmp = be32toh(*(uint32_t *) (start + offset)) & 0x3FFFFFFF;
99-
offset += sizeof(uint32_t);
100-
return tmp;
101-
102-
case 192:
103-
tmp = be64toh(*(uint64_t *) (start + offset)) & 0x3FFFFFFFFFFFFFFF;
104-
offset += sizeof(uint64_t);
105-
return tmp;
106-
107-
default:
108-
return 0;
86+
case 0:
87+
tmp = *(start + offset) & 0x3F;
88+
offset += sizeof(uint8_t);
89+
return tmp;
90+
case 64:
91+
tmp = be16toh(*(uint16_t *) (start + offset)) & 0x3FFF;
92+
offset += sizeof(uint16_t);
93+
return tmp;
94+
case 128:
95+
tmp = be32toh(*(uint32_t *) (start + offset)) & 0x3FFFFFFF;
96+
offset += sizeof(uint32_t);
97+
return tmp;
98+
case 192:
99+
tmp = be64toh(*(uint64_t *) (start + offset)) & 0x3FFFFFFFFFFFFFFF;
100+
offset += sizeof(uint64_t);
101+
return tmp;
102+
default:
103+
return 0;
109104
}
110105
} // QUICParser::quic_get_variable_length
111106

@@ -124,10 +119,10 @@ bool QUICParser::quic_obtain_tls_data(TLSData &payload)
124119

125120
if (type == TLS_EXT_SERVER_NAME && length != 0) {
126121
tls_parser.tls_get_server_name(payload, sni, BUFF_SIZE);
127-
} else if ((type == TLS_EXT_QUIC_TRANSPORT_PARAMETERS_V1 ||
128-
type == TLS_EXT_QUIC_TRANSPORT_PARAMETERS ||
129-
type == TLS_EXT_QUIC_TRANSPORT_PARAMETERS_V2) &&
130-
length != 0) {
122+
} else if ((type == TLS_EXT_QUIC_TRANSPORT_PARAMETERS_V1
123+
|| type == TLS_EXT_QUIC_TRANSPORT_PARAMETERS
124+
|| type == TLS_EXT_QUIC_TRANSPORT_PARAMETERS_V2)
125+
&& length != 0) {
131126
tls_parser.tls_get_quic_user_agent(payload, user_agent, BUFF_SIZE);
132127
}
133128
payload.start += length;
@@ -174,26 +169,24 @@ uint8_t QUICParser::quic_draft_version(uint32_t version)
174169
return (uint8_t) version;
175170
}
176171
switch (version) {
177-
// older mvfst version, but still used, based on draft 22, but salt 21 used
178-
case (faceebook1):
179-
return 22;
180-
181-
// more used atm, salt 23 used
182-
case faceebook2:
183-
case facebook_experimental:
184-
return 27;
185-
186-
case (force_ver_neg_pattern & 0x0F0F0F0F):
187-
return 29;
188-
189-
// version 2 draft 00
190-
case q_version2_draft00:
191-
// newest
192-
case q_version2_newest:
193-
return 100;
194-
195-
default:
196-
return 255;
172+
// older mvfst version, but still used, based on draft 22, but salt 21 used
173+
case (faceebook1):
174+
return 22;
175+
// more used atm, salt 23 used
176+
case faceebook2:
177+
case facebook_experimental:
178+
return 27;
179+
case (force_ver_neg_pattern & 0x0F0F0F0F):
180+
return 29;
181+
182+
// version 2 draft 00
183+
case q_version2_draft00:
184+
// newest
185+
case q_version2_newest:
186+
return 100;
187+
188+
default:
189+
return 255;
197190
}
198191
}
199192

@@ -526,7 +519,7 @@ bool QUICParser::quic_encrypt_sample(uint8_t *plaintext)
526519
return true;
527520
}
528521

529-
bool QUICParser::quic_decrypt_header()
522+
bool QUICParser::quic_decrypt_header(const Packet & pkt)
530523
{
531524
uint8_t plaintext[SAMPLE_LENGTH];
532525
uint8_t mask[5] = { 0 };
@@ -562,13 +555,13 @@ bool QUICParser::quic_decrypt_header()
562555
// after de-obfuscating pkn, we know exactly pkn length so we can correctly adjust start of payload
563556
payload = payload + pkn_len;
564557
payload_len = payload_len - pkn_len;
565-
header_len = payload - header;
558+
header_len = payload - pkt.payload;
566559
if (header_len > MAX_HEADER_LEN) {
567560
DEBUG_MSG("Header length too long\n");
568561
return false;
569562
}
570563

571-
memcpy(tmp_header_mem, header, header_len);
564+
memcpy(tmp_header_mem, pkt.payload, header_len);
572565
header = tmp_header_mem;
573566

574567
header[0] = first_byte;
@@ -809,12 +802,10 @@ bool QUICParser::quic_initial_checks(const Packet&pkt)
809802

810803
bool QUICParser::quic_parse_header(const Packet & pkt)
811804
{
812-
uint8_t *payload_pointer = (uint8_t *) pkt.payload;
805+
const uint8_t *payload_pointer = pkt.payload;
813806
uint64_t offset = 0;
814807

815-
uint8_t *payload_end = payload_pointer + pkt.payload_len;
816-
817-
header = payload_pointer;
808+
const uint8_t *payload_end = payload_pointer + pkt.payload_len;
818809

819810
quic_h1 = (quic_first_ver_dcidlen *) (payload_pointer + offset);
820811

@@ -907,7 +898,7 @@ bool QUICParser::quic_start(const Packet& pkt)
907898
DEBUG_MSG("Error, creation of initial secrets failed (client side)\n");
908899
return false;
909900
}
910-
if (!quic_decrypt_header()) {
901+
if (!quic_decrypt_header(pkt)) {
911902
DEBUG_MSG("Error, header decryption failed (client side)\n");
912903
return false;
913904
}

process/quic_parser.hpp

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -100,7 +100,7 @@ class QUICParser
100100
bool quic_check_initial(uint8_t);
101101
bool quic_parse_header(const Packet&);
102102
bool quic_create_initial_secrets();
103-
bool quic_decrypt_header();
103+
bool quic_decrypt_header(const Packet & );
104104
bool quic_decrypt_payload();
105105
bool quic_reassemble_frames();
106106
bool quic_parse_tls();
@@ -114,9 +114,9 @@ class QUICParser
114114
void quic_copy_crypto(uint8_t *, uint64_t&);
115115
bool quic_encrypt_sample(uint8_t *);
116116
uint8_t quic_draft_version(uint32_t);
117-
uint64_t quic_get_variable_length(uint8_t *, uint64_t&);
117+
uint64_t quic_get_variable_length(const uint8_t *, uint64_t&);
118118
bool quic_check_version(uint32_t, uint8_t);
119-
bool quic_check_pointer_pos(uint8_t *, uint8_t *);
119+
bool quic_check_pointer_pos(const uint8_t *, const uint8_t *);
120120
bool quic_obtain_tls_data(TLSData &);
121121

122122
Initial_Secrets initial_secrets;
@@ -127,14 +127,14 @@ class QUICParser
127127
const uint8_t *salt;
128128

129129
uint8_t *header;
130-
uint8_t *payload;
130+
const uint8_t *payload;
131131

132132
uint16_t header_len;
133133
uint64_t payload_len;
134134

135-
uint8_t *dcid;
136-
uint8_t *pkn;
137-
uint8_t *sample;
135+
const uint8_t *dcid;
136+
const uint8_t *pkn;
137+
const uint8_t *sample;
138138
uint32_t version;
139139

140140
uint8_t decrypted_payload[CURRENT_BUFFER_SIZE];

0 commit comments

Comments
 (0)