@@ -135,31 +135,40 @@ class QUIC_Initial(QUIC_Long):
135135 )
136136
137137 def pre_dissect (self , s ):
138- _ , protected_header = BitField ("" , 0 , 8 ).getfield (self , s )
139- _ , quic_version = IntEnumField ("" , 1 , _quic_versions ).getfield (self , s )
140- _ , dst_conn_id_len = FieldLenField ("" , None , fmt = "B" ).getfield (self , s )
141- _ , dst_connd_id = StrLenField ("" , None , length_from = lambda pkt : dst_conn_id_len ).getfield (self , s )
142- _ , src_conn_id_len = FieldLenField ("" , None , length_of = "SrcConnID" , fmt = "B" ).getfield (self , s )
143- _ , _ = StrLenField ("" , None , length_from = lambda pkt : src_conn_id_len ).getfield (self , s )
144- token_len = QuicVarLenField ("" ).getfield (self , s )
145- _token = StrLenField ("" , "" , length_from = lambda pkt : token_len ).getfield (self , s )
146- _length = QuicVarIntField ("" , None ).getfield (self , s )
147- protected_packet_number = IntField ("" , None ).getfield (self , s )
148- sample = BitField ("" , 0 , 8 * 16 ).getfield (self , s )
149-
150- self .crypto = QUICCrypto (dst_connd_id , quic_version )
138+ unencrypted_packet = bytearray (s )
139+ s , protected_header = BitField ("" , 0 , 8 ).getfield (self , s )
140+ s , quic_version = IntEnumField ("" , 1 , _quic_versions ).getfield (self , s )
141+ s , dst_conn_id_len = FieldLenField ("" , None , fmt = "B" ).getfield (self , s )
142+ s , dst_conn_id = StrLenField ("" , None , length_from = lambda pkt : dst_conn_id_len ).getfield (self , s )
143+ s , src_conn_id_len = FieldLenField ("" , None , length_of = "SrcConnID" , fmt = "B" ).getfield (self , s )
144+ s , _ = StrLenField ("" , None , length_from = lambda pkt : src_conn_id_len ).getfield (self , s )
145+ s , token_len = QuicVarLenField ("" , None ).getfield (self , s )
146+ s , _ = StrLenField ("" , "" , length_from = lambda pkt : token_len ).getfield (self , s )
147+ s , length = QuicVarIntField ("" , None ).getfield (self , s )
148+ packet_number_offset = len (unencrypted_packet ) - len (s )
149+ s , protected_packet_number = IntField ("" , None ).getfield (self , s )
150+ _ , sample = BitField ("" , 0 , 8 * 16 ).getfield (self , s )
151+ sample = sample .to_bytes (16 , 'big' )
152+ protected_packet_number = protected_packet_number .to_bytes (4 , 'big' )
153+ self .crypto = QUICCrypto (dst_conn_id , quic_version )
151154 unprotected_header , raw_packet_number = self .crypto .header_protect (sample , protected_header , protected_packet_number )
152- return s
153-
154- def post_dissect (self , s ):
155- """
156- Post-dissection hook to handle the payload.
157- """
158- self .crypto = QUICCrypto (self .DstConnID , self .Version )
159- sample = s [4 :4 + 16 ]
160- unprotected_header , raw_packet_number = self .crypto .header_protect (sample , self .ProtectedHeader , s [0 :4 ])
161- self .fields_desc .append ()
162- return s
155+ unencrypted_packet [0 ] = unprotected_header [0 ]
156+ unprotected_header , _ = BitField ("" , None , 1 ).getfield (self , unprotected_header )
157+ unprotected_header , _ = BitField ("" , None , 1 ).getfield (self , unprotected_header )
158+ unprotected_header , _ = BitField ("" , None , 2 ).getfield (self , unprotected_header )
159+ unprotected_header , _ = BitField ("" , None , 2 ).getfield (self , unprotected_header )
160+ unprotected_header , packet_number_len = QuicPacketNumberBitFieldLenField ("" , None , 2 ).getfield (self , unprotected_header )
161+ packet_number_len += 1
162+ packet_number = raw_packet_number [:packet_number_len ]
163+ unencrypted_packet [packet_number_offset :packet_number_offset + packet_number_len ] = packet_number
164+ plaintext = self .crypto .decrypt_packet (
165+ is_client = True ,
166+ pn = int .from_bytes (packet_number , 'big' ),
167+ recdata = bytes (unencrypted_packet [:packet_number_offset + packet_number_len ]),
168+ ciphertext = bytes (unencrypted_packet [packet_number_offset + packet_number_len :packet_number_offset + length ])
169+ )
170+ unencrypted_packet [packet_number_offset + packet_number_len :packet_number_offset + length ] = plaintext
171+ return bytes (unencrypted_packet )
163172
164173
165174# RFC9000 sect 17.2.3
0 commit comments