3535 MultipleTypeField ,
3636 ShortField ,
3737 StrLenField ,
38+ ThreeBytesField ,
3839)
3940
4041# Typing imports
@@ -80,9 +81,9 @@ def addfield(self, pkt: Packet, s: bytes, val: Optional[int]):
8081 elif val < 0x4000 :
8182 return s + struct .pack ("!H" , val | 0x4000 )
8283 elif val < 0x40000000 :
83- return s + struct .pack ("!I" , val | 0x40000000 )
84+ return s + struct .pack ("!I" , val | 0x80000000 )
8485 else :
85- return s + struct .pack ("!Q" , val | 0x4000000000000000 )
86+ return s + struct .pack ("!Q" , val | 0xC000000000000000 )
8687
8788 def getfield (self , pkt : Packet , s : bytes ) -> Tuple [bytes , int ]:
8889 length = (s [0 ] & 0xC0 ) >> 6
@@ -185,7 +186,7 @@ class QUIC_Version(QUIC):
185186 IntField ("Version" , 0 ),
186187 FieldLenField ("DstConnIDLen" , None , length_of = "DstConnID" , fmt = "B" ),
187188 StrLenField ("DstConnID" , "" , length_from = lambda pkt : pkt .DstConnIDLen ),
188- FieldLenField ("SrcConnIDLen" , None , length_of = "DstConnID " , fmt = "B" ),
189+ FieldLenField ("SrcConnIDLen" , None , length_of = "SrcConnID " , fmt = "B" ),
189190 StrLenField ("SrcConnID" , "" , length_from = lambda pkt : pkt .SrcConnIDLen ),
190191 FieldListField ("SupportedVersions" , [], IntField ("" , 0 )),
191192 ]
@@ -195,9 +196,34 @@ class QUIC_Version(QUIC):
195196
196197QuicPacketNumberField = lambda name , default : MultipleTypeField (
197198 [
198- (ByteField (name , default ), lambda pkt : pkt .PacketNumberLen == 0 ),
199- (ShortField (name , default ), lambda pkt : pkt .PacketNumberLen == 1 ),
200- (IntField (name , default ), lambda pkt : pkt .PacketNumberLen == 2 ),
199+ (
200+ ByteField (name , default ),
201+ (
202+ lambda pkt : pkt .PacketNumberLen == 0 ,
203+ lambda _ , val : val < 0x100 ,
204+ ),
205+ ),
206+ (
207+ ShortField (name , default ),
208+ (
209+ lambda pkt : pkt .PacketNumberLen == 1 ,
210+ lambda _ , val : val < 0x10000 ,
211+ ),
212+ ),
213+ (
214+ ThreeBytesField (name , default ),
215+ (
216+ lambda pkt : pkt .PacketNumberLen == 2 ,
217+ lambda _ , val : val < 0x1000000 ,
218+ ),
219+ ),
220+ (
221+ IntField (name , default ),
222+ (
223+ lambda pkt : pkt .PacketNumberLen == 3 ,
224+ lambda _ , val : val < 0x100000000 ,
225+ ),
226+ ),
201227 ],
202228 ByteField (name , default ),
203229)
@@ -213,7 +239,7 @@ def i2m(self, pkt, x):
213239 return 0
214240 elif PacketNumber < 0x10000 :
215241 return 1
216- elif PacketNumber < 0x100000000 :
242+ elif PacketNumber < 0x1000000 :
217243 return 2
218244 else :
219245 return 3
0 commit comments