diff --git a/scapy/layers/eap.py b/scapy/layers/eap.py index 172b2a67b3914cedd7da2e9a649e1ffd206e253b..5609f61700d3d986d994ea13718e800eea5e2379 100644 --- a/scapy/layers/eap.py +++ b/scapy/layers/eap.py @@ -268,6 +268,16 @@ class EAP(Packet): return 1 return 0 + def mysummary(self): + summary_str = "EAP %{eap_class}.code% %{eap_class}.type%".format( + eap_class = self.__class__.__name__ + ) + if self.type == 1 and self.code == EAP.RESPONSE: + summary_str += " %{eap_class}.identity%".format( + eap_class = self.__class__.__name__ + ) + return self.sprintf(summary_str) + def post_build(self, p, pay): if self.len is None: l = len(p) + len(pay) @@ -310,11 +320,33 @@ class EAP_TLS(EAP): BitField('S', 0, 1), BitField('reserved', 0, 5), ConditionalField(IntField('tls_message_len', 0), lambda pkt: pkt.L == 1), - #PacketField("tls_data", None, TLS) XStrLenField('tls_data', '', length_from=lambda pkt: 0 if pkt.len is None else pkt.len - (6 + 4 * pkt.L)) ] +class EAP_TTLS(EAP): + """ + RFC 5281 - "Extensible Authentication Protocol Tunneled Transport Layer + Security Authenticated Protocol Version 0 (EAP-TTLSv0)" + """ + + name = "EAP-TTLS" + fields_desc = [ + ByteEnumField("code", 1, eap_codes), + ByteField("id", 0), + FieldLenField("len", None, fmt="H", length_of="data", + adjust=lambda p, x: x + 10 if p.L == 1 else x + 6), + ByteEnumField("type", 21, eap_types), + BitField("L", 0, 1), + BitField("M", 0, 1), + BitField("S", 0, 1), + BitField("reserved", 0, 2), + BitField("version", 0, 3), + ConditionalField(IntField("message_len", 0), lambda pkt: pkt.L == 1), + XStrLenField("data", "", length_from=lambda pkt: 0 if pkt.len is None else pkt.len - (6 + 4 * pkt.L)) + ] + + class EAP_FAST(EAP): """ RFC 4851 - "The Flexible Authentication via Secure Tunneling diff --git a/test/regression.uts b/test/regression.uts index d4357c7feedf826396fbb6a4d6748063e53191ed..618eb5bf05b0142bdcfb878df7e9ab34458e1dff 100644 --- a/test/regression.uts +++ b/test/regression.uts @@ -6241,12 +6241,28 @@ assert(eap.type == 3) assert(hasattr(eap, 'desired_auth_type')) assert(eap.desired_auth_type == 43) += EAP - Dissection (8) +s = b"\x02\x03\x01\x15\x15\x00\x16\x03\x01\x01\n\x01\x00\x01\x06\x03\x03\xd5\xd9\xd5rT\x9e\xb8\xbe,>\xcf!\xcf\xc7\x02\x8c\xb1\x1e^F\xf7\xc84\x8c\x01t4\x91[\x02\xc8/\x00\x00\x8c\xc00\xc0,\xc0(\xc0$\xc0\x14\xc0\n\x00\xa5\x00\xa3\x00\xa1\x00\x9f\x00k\x00j\x00i\x00h\x009\x008\x007\x006\x00\x88\x00\x87\x00\x86\x00\x85\xc02\xc0.\xc0*\xc0&\xc0\x0f\xc0\x05\x00\x9d\x00=\x005\x00\x84\xc0/\xc0+\xc0'\xc0#\xc0\x13\xc0\t\x00\xa4\x00\xa2\x00\xa0\x00\x9e\x00g\x00@\x00?\x00>\x003\x002\x001\x000\x00\x9a\x00\x99\x00\x98\x00\x97\x00E\x00D\x00C\x00B\xc01\xc0-\xc0)\xc0%\xc0\x0e\xc0\x04\x00\x9c\x00<\x00/\x00\x96\x00A\x00\xff\x01\x00\x00Q\x00\x0b\x00\x04\x03\x00\x01\x02\x00\n\x00\x1c\x00\x1a\x00\x17\x00\x19\x00\x1c\x00\x1b\x00\x18\x00\x1a\x00\x16\x00\x0e\x00\r\x00\x0b\x00\x0c\x00\t\x00\n\x00\r\x00 \x00\x1e\x06\x01\x06\x02\x06\x03\x05\x01\x05\x02\x05\x03\x04\x01\x04\x02\x04\x03\x03\x01\x03\x02\x03\x03\x02\x01\x02\x02\x02\x03\x00\x0f\x00\x01\x01" +eap = EAP(s) +assert(eap.code == 2) +assert(eap.id == 3) +assert(eap.len == 277) +assert(eap.type == 21) +assert(eap.haslayer(EAP_TTLS)) +assert(eap[EAP_TTLS].L == 0) +assert(eap[EAP_TTLS].M == 0) +assert(eap[EAP_TTLS].S == 0) +assert(eap[EAP_TTLS].version == 0) + = EAP - EAP_TLS - Basic Instantiation str(EAP_TLS()) == b'\x01\x00\x00\x06\r\x00' = EAP - EAP_FAST - Basic Instantiation str(EAP_FAST()) == b'\x01\x00\x00\x06+\x00' += EAP - EAP_TTLS - Basic Instantiation +str(EAP_TTLS()) == b'\x01\x00\x00\x06\x15\x00' + = EAP - EAP_MD5 - Basic Instantiation str(EAP_MD5()) == b'\x01\x00\x00\x06\x04\x00' @@ -6322,6 +6338,13 @@ assert(not EAP_MD5 in eap) assert(not EAP_TLS in eap) assert(not LEAP in eap) assert(EAP in eap) +eap = EAP_TTLS() +assert(EAP_TTLS in eap) +assert(not EAP_MD5 in eap) +assert(not EAP_TLS in eap) +assert(not EAP_FAST in eap) +assert(not LEAP in eap) +assert(EAP in eap) eap = LEAP() assert(not EAP_MD5 in eap) assert(not EAP_TLS in eap) @@ -6336,6 +6359,8 @@ eap = EAP_TLS() assert(type(eap[EAP]) == EAP_TLS) eap = EAP_FAST() assert(type(eap[EAP]) == EAP_FAST) +eap = EAP_TTLS() +assert(type(eap[EAP]) == EAP_TTLS) eap = LEAP() assert(type(eap[EAP]) == LEAP)