diff --git a/scapy/layers/sctp.py b/scapy/layers/sctp.py index d19614477074379df01baab0e0dcea27e59dcc1e..f20c4b8984649b63e124e5689d359736a60ce63d 100644 --- a/scapy/layers/sctp.py +++ b/scapy/layers/sctp.py @@ -321,7 +321,7 @@ class SCTPChunkParamRandom(_SCTPChunkParam, Packet): adjust = lambda pkt,x:x+4), PadField(StrLenField("random", os.urandom(32), length_from=lambda pkt: pkt.len-4), - 4, padwith="\x00"),] + 4, padwith=b"\x00"),] class SCTPChunkParamChunkList(_SCTPChunkParam, Packet): fields_desc = [ ShortEnumField("type", 0x8003, sctpchunkparamtypes), @@ -330,7 +330,7 @@ class SCTPChunkParamChunkList(_SCTPChunkParam, Packet): PadField(FieldListField("chunk_list", None, ByteEnumField("chunk", None, sctpchunktypes), length_from=lambda pkt: pkt.len-4), - 4, padwith="\x00"),] + 4, padwith=b"\x00"),] class SCTPChunkParamRequestedHMACFunctions(_SCTPChunkParam, Packet): fields_desc = [ ShortEnumField("type", 0x8004, sctpchunkparamtypes), @@ -339,7 +339,7 @@ class SCTPChunkParamRequestedHMACFunctions(_SCTPChunkParam, Packet): PadField(FieldListField("HMAC_functions_list", [ "SHA-1" ], ShortEnumField("HMAC_function", 1, hmactypes), length_from=lambda pkt: pkt.len-4), - 4, padwith="\x00"),] + 4, padwith=b"\x00"),] class SCTPChunkParamSupportedExtensions(_SCTPChunkParam, Packet): fields_desc = [ ShortEnumField("type", 0x8008, sctpchunkparamtypes), @@ -352,7 +352,7 @@ class SCTPChunkParamSupportedExtensions(_SCTPChunkParam, Packet): ByteEnumField("supported_extensions", None, sctpchunktypes), length_from=lambda pkt: pkt.len-4), - 4, padwith="\x00"),] + 4, padwith=b"\x00"),] class SCTPChunkParamFwdTSN(_SCTPChunkParam, Packet): fields_desc = [ ShortEnumField("type", 0xc000, sctpchunkparamtypes), @@ -395,7 +395,7 @@ class SCTPChunkParamErrorIndication(_SCTPChunkParam, Packet): XIntField("correlation_id", None), PadField(StrLenField("error_causes", "", length_from=lambda pkt: pkt.len-4), - 4, padwith="\x00"),] + 4, padwith=b"\x00"),] class SCTPChunkParamSetPrimaryAddr(_SCTPChunkParam, Packet): fields_desc = [ ShortEnumField("type", 0xc004, sctpchunkparamtypes), @@ -557,7 +557,7 @@ class SCTPChunkCookieAck(_SCTPChunkGuessPayload, Packet): ] class SCTPChunkShutdownComplete(_SCTPChunkGuessPayload, Packet): - fields_desc = [ ByteEnumField("type", 12, sctpchunktypes), + fields_desc = [ ByteEnumField("type", 14, sctpchunktypes), BitField("reserved", None, 7), BitField("TCB", 0, 1), ShortField("len", 4), @@ -571,7 +571,7 @@ class SCTPChunkAuthentication(_SCTPChunkGuessPayload, Packet): ShortField("shared_key_id", None), ShortField("HMAC_function", None), PadField(StrLenField("HMAC", "", length_from=lambda pkt: pkt.len-8), - 4, padwith="\x00"), + 4, padwith=b"\x00"), ] class SCTPChunkAddressConf(_SCTPChunkGuessPayload, Packet): diff --git a/test/regression.uts b/test/regression.uts index 107948886e870784d993c5e098bd92f8b464d1da..2dc5fe5d8178bc74fc388e5194f76a30846366c6 100644 --- a/test/regression.uts +++ b/test/regression.uts @@ -7664,6 +7664,233 @@ SCTPChunkSACK in p and p[SCTP].chksum == 0x3b01d404 and p[SCTPChunkSACK].gap_ack = SCTP - answers (IP()/SCTP()).answers(IP()/SCTP()) == True += SCTP basic header - Dissection +~ sctp +blob = b"\x1A\x85\x26\x94\x00\x00\x00\x0D\x00\x00\x04\xD2" +p = SCTP(blob) +assert(p.dport == 9876) +assert(p.sport == 6789) +assert(p.tag == 13) +assert(p.chksum == 1234) + += basic SCTPChunkData - Dissection +~ sctp +blob = b"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x14\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x64\x61\x74\x61" +p = SCTP(blob).lastlayer() +assert(isinstance(p, SCTPChunkData)) +assert(p.reserved == 0) +assert(p.delay_sack == 0) +assert(p.unordered == 0) +assert(p.beginning == 0) +assert(p.ending == 0) +assert(p.tsn == 0) +assert(p.stream_id == 0) +assert(p.stream_seq == 0) +assert(p.len == (len("data") + 16)) +assert(p.data == "data") + += basic SCTPChunkInit - Dissection +~ sctp +blob = b"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x14\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" +p = SCTP(blob).lastlayer() +assert(isinstance(p, SCTPChunkInit)) +assert(p.flags == 0) +assert(p.len == 20) +assert(p.init_tag == 0) +assert(p.a_rwnd == 0) +assert(p.n_out_streams == 0) +assert(p.n_in_streams == 0) +assert(p.init_tsn == 0) +assert(p.params == []) + += SCTPChunkInit multiple valid parameters - Dissection +~ sctp +blob = b"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x5C\x00\x00\x00\x65\x00\x00\x00\x66\x00\x67\x00\x68\x00\x00\x00\x69\x00\x0C\x00\x06\x00\x05\x00\x00\x80\x00\x00\x04\xC0\x00\x00\x04\x80\x08\x00\x07\x0F\xC1\x80\x00\x80\x03\x00\x04\x80\x02\x00\x24\x87\x77\x21\x29\x3F\xDA\x62\x0C\x06\x6F\x10\xA5\x39\x58\x60\x98\x4C\xD4\x59\xD8\x8A\x00\x85\xFB\x9E\x2E\x66\xBA\x3A\x23\x54\xEF\x80\x04\x00\x06\x00\x01\x00\x00" +p = SCTP(blob).lastlayer() +assert(isinstance(p, SCTPChunkInit)) +assert(p.flags == 0) +assert(p.len == 92) +assert(p.init_tag == 101) +assert(p.a_rwnd == 102) +assert(p.n_out_streams == 103) +assert(p.n_in_streams == 104) +assert(p.init_tsn == 105) +assert(len(p.params) == 7) +params = {type(param): param for param in p.params} +assert(set(params.keys()) == {SCTPChunkParamECNCapable, SCTPChunkParamFwdTSN, + SCTPChunkParamSupportedExtensions, SCTPChunkParamChunkList, + SCTPChunkParamRandom, SCTPChunkParamRequestedHMACFunctions, + SCTPChunkParamSupportedAddrTypes}) +assert(params[SCTPChunkParamECNCapable] == SCTPChunkParamECNCapable()) +assert(params[SCTPChunkParamFwdTSN] == SCTPChunkParamFwdTSN()) +assert(params[SCTPChunkParamSupportedExtensions] == SCTPChunkParamSupportedExtensions(len=7)) +assert(params[SCTPChunkParamChunkList] == SCTPChunkParamChunkList(len=4)) +assert(params[SCTPChunkParamRandom].len == 4+32) +assert(len(params[SCTPChunkParamRandom].random) == 32) +assert(params[SCTPChunkParamRequestedHMACFunctions] == SCTPChunkParamRequestedHMACFunctions(len=6)) +assert(params[SCTPChunkParamSupportedAddrTypes] == SCTPChunkParamSupportedAddrTypes(len=6)) + += basic SCTPChunkInitAck - Dissection +~ sctp +blob = b"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02\x00\x00\x14\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" +p = SCTP(blob).lastlayer() +assert(isinstance(p, SCTPChunkInitAck)) +assert(p.flags == 0) +assert(p.len == 20) +assert(p.init_tag == 0) +assert(p.a_rwnd == 0) +assert(p.n_out_streams == 0) +assert(p.n_in_streams == 0) +assert(p.init_tsn == 0) +assert(p.params == []) + += SCTPChunkInitAck with state cookie - Dissection +~ sctp +blob = b"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02\x00\x00\x4C\x00\x00\x00\x65\x00\x00\x00\x66\x00\x67\x00\x68\x00\x00\x00\x69\x80\x00\x00\x04\x00\x0B\x00\x0D\x6C\x6F\x63\x61\x6C\x68\x6F\x73\x74\x00\x00\x00\xC0\x00\x00\x04\x80\x08\x00\x07\x0F\xC1\x80\x00\x00\x07\x00\x14\x00\x10\x9E\xB2\x86\xCE\xE1\x7D\x0F\x6A\xAD\xFD\xB3\x5D\xBC\x00" +p = SCTP(blob).lastlayer() +assert(isinstance(p, SCTPChunkInitAck)) +assert(p.flags == 0) +assert(p.len == 76) +assert(p.init_tag == 101) +assert(p.a_rwnd == 102) +assert(p.n_out_streams == 103) +assert(p.n_in_streams == 104) +assert(p.init_tsn == 105) +assert(len(p.params) == 5) +params = {type(param): param for param in p.params} +assert(set(params.keys()) == {SCTPChunkParamECNCapable, SCTPChunkParamHostname, + SCTPChunkParamFwdTSN, SCTPChunkParamSupportedExtensions, + SCTPChunkParamStateCookie}) +assert(params[SCTPChunkParamECNCapable] == SCTPChunkParamECNCapable()) +assert(params[SCTPChunkParamHostname] == SCTPChunkParamHostname(len=13, hostname="localhost")) +assert(params[SCTPChunkParamFwdTSN] == SCTPChunkParamFwdTSN()) +assert(params[SCTPChunkParamSupportedExtensions] == SCTPChunkParamSupportedExtensions(len=7)) +assert(params[SCTPChunkParamStateCookie].len == 4+16) +assert(len(params[SCTPChunkParamStateCookie].cookie) == 16) + += basic SCTPChunkSACK - Dissection +~ sctp +blob = b"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x03\x00\x00\x10\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" +p = SCTP(blob).lastlayer() +assert(isinstance(p, SCTPChunkSACK)) +assert(p.flags == 0) +assert(p.len == 16) +assert(p.cumul_tsn_ack == 0) +assert(p.a_rwnd == 0) +assert(p.n_gap_ack == 0) +assert(p.n_dup_tsn == 0) +assert(p.gap_ack_list == []) +assert(p.dup_tsn_list == []) + += basic SCTPChunkHeartbeatReq - Dissection +~ sctp +blob = b"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x04\x00\x00\x04" +p = SCTP(blob).lastlayer() +assert(isinstance(p, SCTPChunkHeartbeatReq)) +assert(p.flags == 0) +assert(p.len == 4) +assert(p.params == []) + += basic SCTPChunkHeartbeatAck - Dissection +~ sctp +blob = b"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x05\x00\x00\x04" +p = SCTP(blob).lastlayer() +assert(isinstance(p, SCTPChunkHeartbeatAck)) +assert(p.flags == 0) +assert(p.len == 4) +assert(p.params == []) + += basic SCTPChunkAbort - Dissection +~ sctp +blob = b"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x06\x00\x00\x04" +p = SCTP(blob).lastlayer() +assert(isinstance(p, SCTPChunkAbort)) +assert(p.reserved == 0) +assert(p.TCB == 0) +assert(p.len == 4) +assert(p.error_causes == "") + += basic SCTPChunkShutDown - Dissection +~ sctp +blob = b"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x07\x00\x00\x08\x00\x00\x00\x00" +p = SCTP(blob).lastlayer() +assert(isinstance(p, SCTPChunkShutdown)) +assert(p.flags == 0) +assert(p.len == 8) +assert(p.cumul_tsn_ack == 0) + += basic SCTPChunkShutDownAck - Dissection +~ sctp +blob = b"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x08\x00\x00\x04" +p = SCTP(blob).lastlayer() +assert(isinstance(p, SCTPChunkShutdownAck)) +assert(p.flags == 0) +assert(p.len == 4) + += basic SCTPChunkError - Dissection +~ sctp +blob = b"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x09\x00\x00\x04" +p = SCTP(blob).lastlayer() +assert(isinstance(p, SCTPChunkError)) +assert(p.flags == 0) +assert(p.len == 4) +assert(p.error_causes == "") + += basic SCTPChunkCookieEcho - Dissection +~ sctp +blob = b"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x0A\x00\x00\x04" +p = SCTP(blob).lastlayer() +assert(isinstance(p, SCTPChunkCookieEcho)) +assert(p.flags == 0) +assert(p.len == 4) +assert(p.cookie == "") + += basic SCTPChunkCookieAck - Dissection +~ sctp +blob = b"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x0B\x00\x00\x04" +p = SCTP(blob).lastlayer() +assert(isinstance(p, SCTPChunkCookieAck)) +assert(p.flags == 0) +assert(p.len == 4) + += basic SCTPChunkShutdownComplete - Dissection +~ sctp +blob = b"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x0E\x00\x00\x04" +p = SCTP(blob).lastlayer() +assert(isinstance(p, SCTPChunkShutdownComplete)) +assert(p.reserved == 0) +assert(p.TCB == 0) +assert(p.len == 4) + += basic SCTPChunkAuthentication - Dissection +~ sctp +blob = b"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x0f\x00\x00\x08\x00\x00\x00\x00" +p = SCTP(blob).lastlayer() +assert(isinstance(p, SCTPChunkAuthentication)) +assert(p.flags == 0) +assert(p.len == 8) +assert(p.shared_key_id == 0) +assert(p.HMAC_function == 0) + += basic SCTPChunkAddressConf - Dissection +~ sctp +blob = b"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xc1\x00\x00\x08\x00\x00\x00\x00" +p = SCTP(blob).lastlayer() +assert(isinstance(p, SCTPChunkAddressConf)) +assert(p.flags == 0) +assert(p.len == 8) +assert(p.seq == 0) +assert(p.params == []) + += basic SCTPChunkAddressConfAck - Dissection +~ sctp +blob = b"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x80\x00\x00\x08\x00\x00\x00\x00" +p = SCTP(blob).lastlayer() +assert(isinstance(p, SCTPChunkAddressConfAck)) +assert(p.flags == 0) +assert(p.len == 8) +assert(p.seq == 0) +assert(p.params == []) ############ ############