diff --git a/scapy/asn1fields.py b/scapy/asn1fields.py index 0d92161153e..a88ae515b70 100644 --- a/scapy/asn1fields.py +++ b/scapy/asn1fields.py @@ -1085,4 +1085,6 @@ def __init__(self, def m2i(self, pkt, s): # type: ignore # type: (ASN1_Packet, bytes) -> Tuple[ASN1_Packet, bytes] val = super(ASN1F_STRING_ENCAPS, self).m2i(pkt, s) + if not val[0].val: + return val[0], val[1] # type: ignore return self.cls(val[0].val, _underlayer=pkt), val[1] diff --git a/scapy/layers/spnego.py b/scapy/layers/spnego.py index 53122beaeef..1102c152c37 100644 --- a/scapy/layers/spnego.py +++ b/scapy/layers/spnego.py @@ -143,6 +143,8 @@ def i2m(self, pkt, x): def m2i(self, pkt, s): dat, r = super(_SPNEGO_Token_Field, self).m2i(pkt, s) + if not dat.val: + return dat, r types = None if isinstance(pkt.underlayer, SPNEGO_negTokenInit): types = pkt.underlayer.mechTypes diff --git a/test/scapy/layers/spnego.uts b/test/scapy/layers/spnego.uts index e1550590400..3901575409d 100644 --- a/test/scapy/layers/spnego.uts +++ b/test/scapy/layers/spnego.uts @@ -437,3 +437,16 @@ try: assert False, "Should have failed !" except ValueError: pass + ++ SPNEGO packets + += SPNEGO_Token - build and dissect empty payloads + +pkt = SPNEGO_Token() +assert raw(pkt) == b"\x04\x00" +assert raw(SPNEGO_Token(raw(pkt))) == raw(pkt) +assert not SPNEGO_Token(raw(pkt)).value + +pkt = SPNEGO_MechListMIC() +assert raw(pkt) == b"\x04\x00" +assert raw(SPNEGO_MechListMIC(raw(pkt))) == raw(pkt)