Skip to content

Commit f198822

Browse files
committed
Use objects from the typing module and update testcases for a better coverage
1 parent 0f3622d commit f198822

File tree

2 files changed

+54
-30
lines changed

2 files changed

+54
-30
lines changed

scapy/layers/tls/quic.py

Lines changed: 4 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -16,11 +16,11 @@
1616
StrFixedLenField,
1717
)
1818
from scapy.packet import Packet
19-
19+
from typing import Tuple
2020
# from scapy.layers.tls.session import _GenericTLSSessionInheritance
2121

2222

23-
def _quic_m2varint(m: bytes) -> tuple[int, int]:
23+
def _quic_m2varint(m: bytes) -> Tuple[int, int]:
2424
"""Decode QUIC variable-length integers"""
2525
length = 1 << ((m[0] & 0xC0) >> 6)
2626
if len(m) < length:
@@ -32,7 +32,7 @@ def _quic_m2varint(m: bytes) -> tuple[int, int]:
3232
return int.from_bytes(m[:length], "big") & mask, length
3333

3434

35-
def _quic_i2mask_len(i: int) -> tuple[int, int]:
35+
def _quic_i2mask_len(i: int) -> Tuple[int, int]:
3636
length = i.bit_length()
3737
if length <= 6:
3838
return 0, 1
@@ -298,10 +298,7 @@ def m2i(self, pkt, m):
298298

299299
def getfield(self, pkt, s):
300300
tmp_len = self.length_from(pkt) or 0
301-
if tmp_len <= 0:
302-
return s, []
303-
else:
304-
return s[tmp_len:], self.m2i(pkt, s[:tmp_len])
301+
return s[tmp_len:], self.m2i(pkt, s[:tmp_len])
305302

306303
def i2m(self, pkt, i):
307304
if i is None:

test/scapy/layers/tls/tls13.uts

Lines changed: 50 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -1231,34 +1231,33 @@ from binascii import unhexlify
12311231
from scapy.layers.tls.quic import *
12321232
from scapy.layers.tls.all import TLS13ClientHello, TLS_Ext_QuicTransportParameters
12331233

1234-
ch_data = unhexlify("010000f40303e4de73a1d4479044cf059e910eaefaa983f4f8bf19c1655e13e375c2022ea986000006130113021303010000c500000013001100000e717569632e6e67696e782e6f7267000a00080006001d00170018001000050003026833000d00140012040308040401050308050501080606010201003300260024001d00208d29460c9281267d97af86a7bcc70031c482f64ef2bde21ceb89e5702e89ba71002d00020101002b00030203040039004601025388030245460404809896800504800f42400604800f42400704800f424008024064090240640a01030b01190c000f142173071905d778f98e367b8ad8eeb526484e8f5d")
1234+
ch_data = unhexlify("010001e403034f417babafc5dc240c744225bb09b0c5067618b7501ef4bf7ea73c64249e5d0c000006130213011303010001b50033010c010a00170041048497f2dd89fb1d341b02894edd154ebd5ee5e55594d7935d99d2c05733991cccc9af02200e53bcc80208fa1498c5c88ccf643d598cb05c5fde37a1e468cd593200180061045bff37b0fde67fcfc50b7ab6eb139f51998bdb859632138b30caf96882ef871b27aaf534cce0dcfa157be21343fd6b0db5cc306564f19c46d3c9e175e3dbbb594fe7c393e35de695fc84f64ec4a59ee3cea26a0599a61d6dfc18568fb5c0cb85001d00205af975b0ec59288a578c94890d3264f9ac025ab86f7cd718112da6b923b2e54d001e0038f989efd52e4e8ab64491bfd8b8d30481d854b9394f517148dc8d5a50a43ebbdcca6e4b27229acd2f20b6633632d32e9be6999a40d30561e2002b0003020304000d00140012040308040401050308050501020108070808000a000a000800170018001d001e002d000201010000000e000c00000968332d7365727665720010000500030268330039005301048000ea600404801000000508c0000001000000000608c0000001000000000708c00000010000000008024080090240800a01030b01190e01080f087f317d3033e6423e110c00000001000000016b3343cf")
12351235

12361236
ch = TLS13ClientHello(ch_data)
12371237
tp = ch.ext[-1]
12381238
assert isinstance(tp, TLS_Ext_QuicTransportParameters)
12391239
assert isinstance(tp.params[0], Quic_Tp_MaxIdleTimeout)
1240-
assert tp.params[0].value == 5000
1241-
assert isinstance(tp.params[1], Quic_Tp_MaxUdpPayloadSize)
1242-
assert tp.params[1].value == 1350
1243-
assert isinstance(tp.params[2], Quic_Tp_InitialMaxData)
1244-
assert tp.params[2].value == 10000000
1245-
assert isinstance(tp.params[3], Quic_Tp_InitialMaxStreamDataBidiLocal)
1246-
assert tp.params[3].value == 1000000
1247-
assert isinstance(tp.params[4], Quic_Tp_InitialMaxStreamDataBidiRemote)
1248-
assert tp.params[4].value == 1000000
1249-
assert isinstance(tp.params[5], Quic_Tp_InitialMaxStreamDataUni)
1250-
assert tp.params[5].value == 1000000
1251-
assert isinstance(tp.params[6], Quic_Tp_InitialMaxStreamsBidi)
1252-
assert tp.params[6].value == 100
1253-
assert isinstance(tp.params[7], Quic_Tp_InitialMaxStreamsUni)
1254-
assert tp.params[7].value == 100
1255-
assert isinstance(tp.params[8], Quic_Tp_AckDelayExponent)
1256-
assert tp.params[8].value == 3
1257-
assert isinstance(tp.params[9], Quic_Tp_MaxAckDelay)
1258-
assert tp.params[9].value == 25
1259-
assert isinstance(tp.params[10], Quic_Tp_DisableActiveMigration)
1260-
assert isinstance(tp.params[11], Quic_Tp_InitialSourceConnectionId)
1261-
assert tp.params[11].value == unhexlify("2173071905d778f98e367b8ad8eeb526484e8f5d")
1240+
assert tp.params[0].value == 60000
1241+
assert isinstance(tp.params[1], Quic_Tp_InitialMaxData)
1242+
assert tp.params[1].value == 1048576
1243+
assert isinstance(tp.params[2], Quic_Tp_InitialMaxStreamDataBidiLocal)
1244+
assert tp.params[2].value == 4294967296
1245+
assert isinstance(tp.params[3], Quic_Tp_InitialMaxStreamDataBidiRemote)
1246+
assert tp.params[3].value == 4294967296
1247+
assert isinstance(tp.params[4], Quic_Tp_InitialMaxStreamDataUni)
1248+
assert tp.params[4].value == 4294967296
1249+
assert isinstance(tp.params[5], Quic_Tp_InitialMaxStreamsBidi)
1250+
assert tp.params[5].value == 128
1251+
assert isinstance(tp.params[6], Quic_Tp_InitialMaxStreamsUni)
1252+
assert tp.params[6].value == 128
1253+
assert isinstance(tp.params[7], Quic_Tp_AckDelayExponent)
1254+
assert tp.params[7].value == 3
1255+
assert isinstance(tp.params[8], Quic_Tp_MaxAckDelay)
1256+
assert tp.params[8].value == 25
1257+
assert isinstance(tp.params[9], Quic_Tp_ActiveConnectionIdLimit)
1258+
assert tp.params[9].value == 8
1259+
assert isinstance(tp.params[10], Quic_Tp_InitialSourceConnectionId)
1260+
assert tp.params[10].value == unhexlify("7f317d3033e6423e")
12621261

12631262
= QUIC Transport Parameters - Build packet
12641263
~ quic
@@ -1287,3 +1286,31 @@ actual = tp.build()
12871286
expect = unhexlify("0039004601025388030245460404809896800504800f42400604800f42400704800f424008024064090240640a01030b01190c000f142173071905d778f98e367b8ad8eeb526484e8f5d")
12881287

12891288
assert actual == expect
1289+
1290+
= QUIC Transport Parameters - Build empty packet
1291+
~ quic
1292+
1293+
from scapy.layers.tls.all import TLS_Ext_QuicTransportParameters
1294+
1295+
p = TLS_Ext_QuicTransportParameters(params=[None])
1296+
actual = p.build()
1297+
1298+
assert actual == b'\x009\x00\x00'
1299+
1300+
p = TLS_Ext_QuicTransportParameters(params=[])
1301+
actual = p.build()
1302+
1303+
assert actual == b'\x009\x00\x00'
1304+
1305+
= QUIC Transport Parameters - Throw error if value is a big integer
1306+
~ quic
1307+
1308+
from scapy.layers.tls.quic import Quic_Tp_InitialMaxData
1309+
1310+
# A 62-bit left shift results in an integer of 63 bits
1311+
p = Quic_Tp_InitialMaxData(value=1<<62)
1312+
try:
1313+
p.build()
1314+
assert False, "QUIC cannot decode integers with more than 62 bits"
1315+
except ValueError:
1316+
pass

0 commit comments

Comments
 (0)