diff options
author | 2016-03-21 16:03:47 +0200 | |
---|---|---|
committer | 2016-03-21 16:03:47 +0200 | |
commit | b89efa188810bf95a9d245e69e2961b5721c3b0f (patch) | |
tree | 454273ac6c4ae972ebb8a2c86b893296970b4fa9 /scripts/external_libs/scapy-2.3.1/scapy | |
parent | f72c6df9d2e9998ae1f3529d729ab7930b35785a (diff) |
scapy python 2/3
Diffstat (limited to 'scripts/external_libs/scapy-2.3.1/scapy')
111 files changed, 0 insertions, 48688 deletions
diff --git a/scripts/external_libs/scapy-2.3.1/scapy/__init__.py b/scripts/external_libs/scapy-2.3.1/scapy/__init__.py deleted file mode 100644 index 443b3675..00000000 --- a/scripts/external_libs/scapy-2.3.1/scapy/__init__.py +++ /dev/null @@ -1,15 +0,0 @@ -## This file is part of Scapy -## See http://www.secdev.org/projects/scapy for more informations -## Copyright (C) Philippe Biondi <phil@secdev.org> -## This program is published under a GPLv2 license - -""" -Scapy: create, send, sniff, dissect and manipulate network packets. - -Usable either from an interactive console or as a Python library. -http://www.secdev.org/projects/scapy -""" - -if __name__ == "__main__": - from scapy.main import interact - interact() diff --git a/scripts/external_libs/scapy-2.3.1/scapy/all.py b/scripts/external_libs/scapy-2.3.1/scapy/all.py deleted file mode 100644 index 5b160df4..00000000 --- a/scripts/external_libs/scapy-2.3.1/scapy/all.py +++ /dev/null @@ -1,49 +0,0 @@ -## This file is part of Scapy -## See http://www.secdev.org/projects/scapy for more informations -## Copyright (C) Philippe Biondi <phil@secdev.org> -## This program is published under a GPLv2 license - -""" -Aggregate top level objects from all Scapy modules. -""" - -from base_classes import * -from config import * -from dadict import * -from data import * -from error import * -#from themes import * -from arch import * - -from plist import * -from fields import * -from packet import * -#from asn1fields import * -#from asn1packet import * - -from utils import * -#from route import * -#if conf.ipv6_enabled: -# from utils6 import * -# from route6 import * -#from sendrecv import * -#from supersocket import * -#from volatile import * -#from as_resolvers import * - -#from ansmachine import * -#from automaton import * -#from autorun import * - -from main import * - -from layers.all import * - -#from asn1.asn1 import * -#from asn1.ber import * -#from asn1.mib import * - -#from crypto import * - -#from pipetool import * -#from scapypipes import * diff --git a/scripts/external_libs/scapy-2.3.1/scapy/ansmachine.py b/scripts/external_libs/scapy-2.3.1/scapy/ansmachine.py deleted file mode 100644 index 2a90adcc..00000000 --- a/scripts/external_libs/scapy-2.3.1/scapy/ansmachine.py +++ /dev/null @@ -1,130 +0,0 @@ -## This file is part of Scapy -## See http://www.secdev.org/projects/scapy for more informations -## Copyright (C) Philippe Biondi <phil@secdev.org> -## This program is published under a GPLv2 license - -""" -Answering machines. -""" - -######################## -## Answering machines ## -######################## - -from sendrecv import send,sendp,sniff -from config import conf -from error import log_interactive - -class ReferenceAM(type): - def __new__(cls, name, bases, dct): - o = super(ReferenceAM, cls).__new__(cls, name, bases, dct) - if o.function_name: - globals()[o.function_name] = lambda o=o,*args,**kargs: o(*args,**kargs)() - return o - - -class AnsweringMachine(object): - __metaclass__ = ReferenceAM - function_name = "" - filter = None - sniff_options = { "store":0 } - sniff_options_list = [ "store", "iface", "count", "promisc", "filter", "type", "prn", "stop_filter" ] - send_options = { "verbose":0 } - send_options_list = ["iface", "inter", "loop", "verbose"] - send_function = staticmethod(send) - - - def __init__(self, **kargs): - self.mode = 0 - if self.filter: - kargs.setdefault("filter",self.filter) - kargs.setdefault("prn", self.reply) - self.optam1 = {} - self.optam2 = {} - self.optam0 = {} - doptsend,doptsniff = self.parse_all_options(1, kargs) - self.defoptsend = self.send_options.copy() - self.defoptsend.update(doptsend) - self.defoptsniff = self.sniff_options.copy() - self.defoptsniff.update(doptsniff) - self.optsend,self.optsniff = [{},{}] - - def __getattr__(self, attr): - for d in [self.optam2, self.optam1]: - if attr in d: - return d[attr] - raise AttributeError,attr - - def __setattr__(self, attr, val): - mode = self.__dict__.get("mode",0) - if mode == 0: - self.__dict__[attr] = val - else: - [self.optam1, self.optam2][mode-1][attr] = val - - def parse_options(self): - pass - - def parse_all_options(self, mode, kargs): - sniffopt = {} - sendopt = {} - for k in kargs.keys(): - if k in self.sniff_options_list: - sniffopt[k] = kargs[k] - if k in self.send_options_list: - sendopt[k] = kargs[k] - if k in self.sniff_options_list+self.send_options_list: - del(kargs[k]) - if mode != 2 or kargs: - if mode == 1: - self.optam0 = kargs - elif mode == 2 and kargs: - k = self.optam0.copy() - k.update(kargs) - self.parse_options(**k) - kargs = k - omode = self.__dict__.get("mode",0) - self.__dict__["mode"] = mode - self.parse_options(**kargs) - self.__dict__["mode"] = omode - return sendopt,sniffopt - - def is_request(self, req): - return 1 - - def make_reply(self, req): - return req - - def send_reply(self, reply): - self.send_function(reply, **self.optsend) - - def print_reply(self, req, reply): - print "%s ==> %s" % (req.summary(),reply.summary()) - - def reply(self, pkt): - if not self.is_request(pkt): - return - reply = self.make_reply(pkt) - self.send_reply(reply) - if conf.verb >= 0: - self.print_reply(pkt, reply) - - def run(self, *args, **kargs): - log_interactive.warning("run() method deprecated. The intance is now callable") - self(*args,**kargs) - - def __call__(self, *args, **kargs): - optsend,optsniff = self.parse_all_options(2,kargs) - self.optsend=self.defoptsend.copy() - self.optsend.update(optsend) - self.optsniff=self.defoptsniff.copy() - self.optsniff.update(optsniff) - - try: - self.sniff() - except KeyboardInterrupt: - print "Interrupted by user" - - def sniff(self): - sniff(**self.optsniff) - diff --git a/scripts/external_libs/scapy-2.3.1/scapy/arch/__init__.py b/scripts/external_libs/scapy-2.3.1/scapy/arch/__init__.py deleted file mode 100644 index 95f95ecf..00000000 --- a/scripts/external_libs/scapy-2.3.1/scapy/arch/__init__.py +++ /dev/null @@ -1,96 +0,0 @@ -## This file is part of Scapy -## See http://www.secdev.org/projects/scapy for more informations -## Copyright (C) Philippe Biondi <phil@secdev.org> -## This program is published under a GPLv2 license - -""" -Operating system specific functionality. -""" - - -import sys,os,socket -from scapy.error import * -import scapy.config - -try: - import Gnuplot - GNUPLOT=1 -except ImportError: - log_loading.info("Can't import python gnuplot wrapper . Won't be able to plot.") - GNUPLOT=0 - -try: - import pyx - PYX=1 -except ImportError: - log_loading.info("Can't import PyX. Won't be able to use psdump() or pdfdump().") - PYX=0 - - -def str2mac(s): - return ("%02x:"*6)[:-1] % tuple(map(ord, s)) - - - -def get_if_addr(iff): - return socket.inet_ntoa(get_if_raw_addr(iff)) - -def get_if_hwaddr(iff): - addrfamily, mac = get_if_raw_hwaddr(iff) - if addrfamily in [ARPHDR_ETHER,ARPHDR_LOOPBACK]: - return str2mac(mac) - else: - raise Scapy_Exception("Unsupported address family (%i) for interface [%s]" % (addrfamily,iff)) - - -LINUX=sys.platform.startswith("linux") -OPENBSD=sys.platform.startswith("openbsd") -FREEBSD=sys.platform.startswith("freebsd") -NETBSD = sys.platform.startswith("netbsd") -DARWIN=sys.platform.startswith("darwin") -SOLARIS=sys.platform.startswith("sunos") -WINDOWS=sys.platform.startswith("win32") - -X86_64 = not WINDOWS and (os.uname()[4] == 'x86_64') - - -# Next step is to import following architecture specific functions: -# def get_if_raw_hwaddr(iff) -# def get_if_raw_addr(iff): -# def get_if_list(): -# def get_working_if(): -# def attach_filter(s, filter): -# def set_promisc(s,iff,val=1): -# def read_routes(): -# def get_if(iff,cmd): -# def get_if_index(iff): - - - -if LINUX: - from linux import * - if scapy.config.conf.use_pcap or scapy.config.conf.use_dnet: - from pcapdnet import * -elif OPENBSD or FREEBSD or NETBSD or DARWIN: - from bsd import * -elif SOLARIS: - from solaris import * -elif WINDOWS: - from windows import * - -if scapy.config.conf.iface is None: - scapy.config.conf.iface = LOOPBACK_NAME - - -def get_if_raw_addr6(iff): - """ - Returns the main global unicast address associated with provided - interface, in network format. If no global address is found, None - is returned. - """ - r = filter(lambda x: x[2] == iff and x[1] == IPV6_ADDR_GLOBAL, in6_getifaddr()) - if len(r) == 0: - return None - else: - r = r[0][0] - return inet_pton(socket.AF_INET6, r) diff --git a/scripts/external_libs/scapy-2.3.1/scapy/arch/bsd.py b/scripts/external_libs/scapy-2.3.1/scapy/arch/bsd.py deleted file mode 100644 index 1be7bd73..00000000 --- a/scripts/external_libs/scapy-2.3.1/scapy/arch/bsd.py +++ /dev/null @@ -1,12 +0,0 @@ -## This file is part of Scapy -## See http://www.secdev.org/projects/scapy for more informations -## Copyright (C) Philippe Biondi <phil@secdev.org> -## This program is published under a GPLv2 license - -""" -Support for BSD-like operating systems such as FreeBSD, OpenBSD and Mac OS X. -""" - -LOOPBACK_NAME="lo0" - -from unix import * diff --git a/scripts/external_libs/scapy-2.3.1/scapy/arch/linux.py b/scripts/external_libs/scapy-2.3.1/scapy/arch/linux.py deleted file mode 100644 index 32f0a2d1..00000000 --- a/scripts/external_libs/scapy-2.3.1/scapy/arch/linux.py +++ /dev/null @@ -1,521 +0,0 @@ -## This file is part of Scapy -## See http://www.secdev.org/projects/scapy for more informations -## Copyright (C) Philippe Biondi <phil@secdev.org> -## This program is published under a GPLv2 license - -""" -Linux specific functions. -""" - -from __future__ import with_statement -import sys,os,struct,socket,time -from select import select -from fcntl import ioctl -import scapy.utils -import scapy.utils6 -from scapy.config import conf -from scapy.data import * -from scapy.supersocket import SuperSocket -import scapy.arch -from scapy.error import warning, Scapy_Exception - - - -# From bits/ioctls.h -SIOCGIFHWADDR = 0x8927 # Get hardware address -SIOCGIFADDR = 0x8915 # get PA address -SIOCGIFNETMASK = 0x891b # get network PA mask -SIOCGIFNAME = 0x8910 # get iface name -SIOCSIFLINK = 0x8911 # set iface channel -SIOCGIFCONF = 0x8912 # get iface list -SIOCGIFFLAGS = 0x8913 # get flags -SIOCSIFFLAGS = 0x8914 # set flags -SIOCGIFINDEX = 0x8933 # name -> if_index mapping -SIOCGIFCOUNT = 0x8938 # get number of devices -SIOCGSTAMP = 0x8906 # get packet timestamp (as a timeval) - -# From if.h -IFF_UP = 0x1 # Interface is up. -IFF_BROADCAST = 0x2 # Broadcast address valid. -IFF_DEBUG = 0x4 # Turn on debugging. -IFF_LOOPBACK = 0x8 # Is a loopback net. -IFF_POINTOPOINT = 0x10 # Interface is point-to-point link. -IFF_NOTRAILERS = 0x20 # Avoid use of trailers. -IFF_RUNNING = 0x40 # Resources allocated. -IFF_NOARP = 0x80 # No address resolution protocol. -IFF_PROMISC = 0x100 # Receive all packets. - -# From netpacket/packet.h -PACKET_ADD_MEMBERSHIP = 1 -PACKET_DROP_MEMBERSHIP = 2 -PACKET_RECV_OUTPUT = 3 -PACKET_RX_RING = 5 -PACKET_STATISTICS = 6 -PACKET_MR_MULTICAST = 0 -PACKET_MR_PROMISC = 1 -PACKET_MR_ALLMULTI = 2 - -# From bits/socket.h -SOL_PACKET = 263 -# From asm/socket.h -SO_ATTACH_FILTER = 26 -SOL_SOCKET = 1 - -# From net/route.h -RTF_UP = 0x0001 # Route usable -RTF_REJECT = 0x0200 - - - -LOOPBACK_NAME="lo" - -with os.popen("tcpdump -V 2> /dev/null") as _f: - if _f.close() >> 8 == 0x7f: - log_loading.warning("Failed to execute tcpdump. Check it is installed and in the PATH") - TCPDUMP=0 - else: - TCPDUMP=1 -del(_f) - - -def get_if_raw_hwaddr(iff): - return struct.unpack("16xh6s8x",get_if(iff,SIOCGIFHWADDR)) - -def get_if_raw_addr(iff): - try: - return get_if(iff, SIOCGIFADDR)[20:24] - except IOError: - return "\0\0\0\0" - - -def get_if_list(): - try: - f=open("/proc/net/dev","r") - except IOError: - warning("Can't open /proc/net/dev !") - return [] - lst = [] - f.readline() - f.readline() - for l in f: - lst.append(l.split(":")[0].strip()) - return lst -def get_working_if(): - for i in get_if_list(): - if i == LOOPBACK_NAME: - continue - ifflags = struct.unpack("16xH14x",get_if(i,SIOCGIFFLAGS))[0] - if ifflags & IFF_UP: - return i - return LOOPBACK_NAME -def attach_filter(s, filter): - # XXX We generate the filter on the interface conf.iface - # because tcpdump open the "any" interface and ppp interfaces - # in cooked mode. As we use them in raw mode, the filter will not - # work... one solution could be to use "any" interface and translate - # the filter from cooked mode to raw mode - # mode - if not TCPDUMP: - return - try: - f = os.popen("%s -i %s -ddd -s 1600 '%s'" % (conf.prog.tcpdump,conf.iface,filter)) - except OSError,msg: - log_interactive.warning("Failed to execute tcpdump: (%s)") - return - lines = f.readlines() - if f.close(): - raise Scapy_Exception("Filter parse error") - nb = int(lines[0]) - bpf = "" - for l in lines[1:]: - bpf += struct.pack("HBBI",*map(long,l.split())) - - # XXX. Argl! We need to give the kernel a pointer on the BPF, - # python object header seems to be 20 bytes. 36 bytes for x86 64bits arch. - if scapy.arch.X86_64: - bpfh = struct.pack("HL", nb, id(bpf)+36) - else: - bpfh = struct.pack("HI", nb, id(bpf)+20) - s.setsockopt(SOL_SOCKET, SO_ATTACH_FILTER, bpfh) - -def set_promisc(s,iff,val=1): - mreq = struct.pack("IHH8s", get_if_index(iff), PACKET_MR_PROMISC, 0, "") - if val: - cmd = PACKET_ADD_MEMBERSHIP - else: - cmd = PACKET_DROP_MEMBERSHIP - s.setsockopt(SOL_PACKET, cmd, mreq) - - - -def read_routes(): - try: - f=open("/proc/net/route","r") - except IOError: - warning("Can't open /proc/net/route !") - return [] - routes = [] - s=socket.socket(socket.AF_INET, socket.SOCK_DGRAM) - ifreq = ioctl(s, SIOCGIFADDR,struct.pack("16s16x",LOOPBACK_NAME)) - addrfamily = struct.unpack("h",ifreq[16:18])[0] - if addrfamily == socket.AF_INET: - ifreq2 = ioctl(s, SIOCGIFNETMASK,struct.pack("16s16x",LOOPBACK_NAME)) - msk = socket.ntohl(struct.unpack("I",ifreq2[20:24])[0]) - dst = socket.ntohl(struct.unpack("I",ifreq[20:24])[0]) & msk - ifaddr = scapy.utils.inet_ntoa(ifreq[20:24]) - routes.append((dst, msk, "0.0.0.0", LOOPBACK_NAME, ifaddr)) - else: - warning("Interface lo: unkown address family (%i)"% addrfamily) - - for l in f.readlines()[1:]: - iff,dst,gw,flags,x,x,x,msk,x,x,x = l.split() - flags = int(flags,16) - if flags & RTF_UP == 0: - continue - if flags & RTF_REJECT: - continue - try: - ifreq = ioctl(s, SIOCGIFADDR,struct.pack("16s16x",iff)) - except IOError: # interface is present in routing tables but does not have any assigned IP - ifaddr="0.0.0.0" - else: - addrfamily = struct.unpack("h",ifreq[16:18])[0] - if addrfamily == socket.AF_INET: - ifaddr = scapy.utils.inet_ntoa(ifreq[20:24]) - else: - warning("Interface %s: unkown address family (%i)"%(iff, addrfamily)) - continue - routes.append((socket.htonl(long(dst,16))&0xffffffffL, - socket.htonl(long(msk,16))&0xffffffffL, - scapy.utils.inet_ntoa(struct.pack("I",long(gw,16))), - iff, ifaddr)) - - f.close() - return routes - -############ -### IPv6 ### -############ - -def in6_getifaddr(): - """ - Returns a list of 3-tuples of the form (addr, scope, iface) where - 'addr' is the address of scope 'scope' associated to the interface - 'ifcace'. - - This is the list of all addresses of all interfaces available on - the system. - """ - ret = [] - try: - f = open("/proc/net/if_inet6","r") - except IOError, err: - return ret - l = f.readlines() - for i in l: - # addr, index, plen, scope, flags, ifname - tmp = i.split() - addr = struct.unpack('4s4s4s4s4s4s4s4s', tmp[0]) - addr = scapy.utils6.in6_ptop(':'.join(addr)) - ret.append((addr, int(tmp[3], 16), tmp[5])) # (addr, scope, iface) - return ret - -def read_routes6(): - try: - f = open("/proc/net/ipv6_route","r") - except IOError, err: - return [] - # 1. destination network - # 2. destination prefix length - # 3. source network displayed - # 4. source prefix length - # 5. next hop - # 6. metric - # 7. reference counter (?!?) - # 8. use counter (?!?) - # 9. flags - # 10. device name - routes = [] - def proc2r(p): - ret = struct.unpack('4s4s4s4s4s4s4s4s', p) - ret = ':'.join(ret) - return scapy.utils6.in6_ptop(ret) - - lifaddr = in6_getifaddr() - for l in f.readlines(): - d,dp,s,sp,nh,m,rc,us,fl,dev = l.split() - fl = int(fl, 16) - - if fl & RTF_UP == 0: - continue - if fl & RTF_REJECT: - continue - - d = proc2r(d) ; dp = int(dp, 16) - s = proc2r(s) ; sp = int(sp, 16) - nh = proc2r(nh) - - cset = [] # candidate set (possible source addresses) - if dev == LOOPBACK_NAME: - if d == '::': - continue - cset = ['::1'] - else: - devaddrs = filter(lambda x: x[2] == dev, lifaddr) - cset = scapy.utils6.construct_source_candidate_set(d, dp, devaddrs, LOOPBACK_NAME) - - if len(cset) != 0: - routes.append((d, dp, nh, dev, cset)) - f.close() - return routes - - - - -def get_if(iff,cmd): - s=socket.socket() - ifreq = ioctl(s, cmd, struct.pack("16s16x",iff)) - s.close() - return ifreq - - -def get_if_index(iff): - return int(struct.unpack("I",get_if(iff, SIOCGIFINDEX)[16:20])[0]) - -if os.uname()[4] == 'x86_64': - def get_last_packet_timestamp(sock): - ts = ioctl(sock, SIOCGSTAMP, "1234567890123456") - s,us = struct.unpack("QQ",ts) - return s+us/1000000.0 -else: - def get_last_packet_timestamp(sock): - ts = ioctl(sock, SIOCGSTAMP, "12345678") - s,us = struct.unpack("II",ts) - return s+us/1000000.0 - - -def _flush_fd(fd): - if type(fd) is not int: - fd = fd.fileno() - while 1: - r,w,e = select([fd],[],[],0) - if r: - os.read(fd,MTU) - else: - break - - - - - -class L3PacketSocket(SuperSocket): - desc = "read/write packets at layer 3 using Linux PF_PACKET sockets" - def __init__(self, type = ETH_P_ALL, filter=None, promisc=None, iface=None, nofilter=0): - self.type = type - self.ins = socket.socket(socket.AF_PACKET, socket.SOCK_RAW, socket.htons(type)) - self.ins.setsockopt(socket.SOL_SOCKET, socket.SO_RCVBUF, 0) - _flush_fd(self.ins) - if iface: - self.ins.bind((iface, type)) - if not nofilter: - if conf.except_filter: - if filter: - filter = "(%s) and not (%s)" % (filter, conf.except_filter) - else: - filter = "not (%s)" % conf.except_filter - if filter is not None: - attach_filter(self.ins, filter) - self.ins.setsockopt(socket.SOL_SOCKET, socket.SO_RCVBUF, 2**30) - self.outs = socket.socket(socket.AF_PACKET, socket.SOCK_RAW, socket.htons(type)) - self.outs.setsockopt(socket.SOL_SOCKET, socket.SO_SNDBUF, 2**30) - if promisc is None: - promisc = conf.promisc - self.promisc = promisc - if self.promisc: - if iface is None: - self.iff = get_if_list() - else: - if iface.__class__ is list: - self.iff = iface - else: - self.iff = [iface] - for i in self.iff: - set_promisc(self.ins, i) - def close(self): - if self.closed: - return - self.closed=1 - if self.promisc: - for i in self.iff: - set_promisc(self.ins, i, 0) - SuperSocket.close(self) - def recv(self, x=MTU): - pkt, sa_ll = self.ins.recvfrom(x) - if sa_ll[2] == socket.PACKET_OUTGOING: - return None - if sa_ll[3] in conf.l2types: - cls = conf.l2types[sa_ll[3]] - lvl = 2 - elif sa_ll[1] in conf.l3types: - cls = conf.l3types[sa_ll[1]] - lvl = 3 - else: - cls = conf.default_l2 - warning("Unable to guess type (interface=%s protocol=%#x family=%i). Using %s" % (sa_ll[0],sa_ll[1],sa_ll[3],cls.name)) - lvl = 2 - - try: - pkt = cls(pkt) - except KeyboardInterrupt: - raise - except: - if conf.debug_dissector: - raise - pkt = conf.raw_layer(pkt) - if lvl == 2: - pkt = pkt.payload - - if pkt is not None: - pkt.time = get_last_packet_timestamp(self.ins) - return pkt - - def send(self, x): - iff,a,gw = x.route() - if iff is None: - iff = conf.iface - sdto = (iff, self.type) - self.outs.bind(sdto) - sn = self.outs.getsockname() - ll = lambda x:x - if type(x) in conf.l3types: - sdto = (iff, conf.l3types[type(x)]) - if sn[3] in conf.l2types: - ll = lambda x:conf.l2types[sn[3]]()/x - try: - sx = str(ll(x)) - x.sent_time = time.time() - self.outs.sendto(sx, sdto) - except socket.error,msg: - x.sent_time = time.time() # bad approximation - if conf.auto_fragment and msg[0] == 90: - for p in x.fragment(): - self.outs.sendto(str(ll(p)), sdto) - else: - raise - - - - -class L2Socket(SuperSocket): - desc = "read/write packets at layer 2 using Linux PF_PACKET sockets" - def __init__(self, iface = None, type = ETH_P_ALL, filter=None, nofilter=0): - if iface is None: - iface = conf.iface - self.ins = socket.socket(socket.AF_PACKET, socket.SOCK_RAW, socket.htons(type)) - self.ins.setsockopt(socket.SOL_SOCKET, socket.SO_RCVBUF, 0) - _flush_fd(self.ins) - if not nofilter: - if conf.except_filter: - if filter: - filter = "(%s) and not (%s)" % (filter, conf.except_filter) - else: - filter = "not (%s)" % conf.except_filter - if filter is not None: - attach_filter(self.ins, filter) - self.ins.bind((iface, type)) - self.ins.setsockopt(socket.SOL_SOCKET, socket.SO_RCVBUF, 2**30) - self.outs = self.ins - self.outs.setsockopt(socket.SOL_SOCKET, socket.SO_SNDBUF, 2**30) - sa_ll = self.outs.getsockname() - if sa_ll[3] in conf.l2types: - self.LL = conf.l2types[sa_ll[3]] - elif sa_ll[1] in conf.l3types: - self.LL = conf.l3types[sa_ll[1]] - else: - self.LL = conf.default_l2 - warning("Unable to guess type (interface=%s protocol=%#x family=%i). Using %s" % (sa_ll[0],sa_ll[1],sa_ll[3],self.LL.name)) - - def recv(self, x=MTU): - pkt, sa_ll = self.ins.recvfrom(x) - if sa_ll[2] == socket.PACKET_OUTGOING: - return None - try: - q = self.LL(pkt) - except KeyboardInterrupt: - raise - except: - if conf.debug_dissector: - raise - q = conf.raw_layer(pkt) - q.time = get_last_packet_timestamp(self.ins) - return q - - -class L2ListenSocket(SuperSocket): - desc = "read packets at layer 2 using Linux PF_PACKET sockets" - def __init__(self, iface = None, type = ETH_P_ALL, promisc=None, filter=None, nofilter=0): - self.type = type - self.outs = None - self.ins = socket.socket(socket.AF_PACKET, socket.SOCK_RAW, socket.htons(type)) - self.ins.setsockopt(socket.SOL_SOCKET, socket.SO_RCVBUF, 0) - _flush_fd(self.ins) - if iface is not None: - self.ins.bind((iface, type)) - if not nofilter: - if conf.except_filter: - if filter: - filter = "(%s) and not (%s)" % (filter, conf.except_filter) - else: - filter = "not (%s)" % conf.except_filter - if filter is not None: - attach_filter(self.ins, filter) - if promisc is None: - promisc = conf.sniff_promisc - self.promisc = promisc - if iface is None: - self.iff = get_if_list() - else: - if iface.__class__ is list: - self.iff = iface - else: - self.iff = [iface] - if self.promisc: - for i in self.iff: - set_promisc(self.ins, i) - self.ins.setsockopt(socket.SOL_SOCKET, socket.SO_RCVBUF, 2**30) - def close(self): - if self.promisc: - for i in self.iff: - set_promisc(self.ins, i, 0) - SuperSocket.close(self) - - def recv(self, x=MTU): - pkt, sa_ll = self.ins.recvfrom(x) - if sa_ll[3] in conf.l2types : - cls = conf.l2types[sa_ll[3]] - elif sa_ll[1] in conf.l3types: - cls = conf.l3types[sa_ll[1]] - else: - cls = conf.default_l2 - warning("Unable to guess type (interface=%s protocol=%#x family=%i). Using %s" % (sa_ll[0],sa_ll[1],sa_ll[3],cls.name)) - - try: - pkt = cls(pkt) - except KeyboardInterrupt: - raise - except: - if conf.debug_dissector: - raise - pkt = conf.raw_layer(pkt) - pkt.time = get_last_packet_timestamp(self.ins) - return pkt - - def send(self, x): - raise Scapy_Exception("Can't send anything with L2ListenSocket") - - -conf.L3socket = L3PacketSocket -conf.L2socket = L2Socket -conf.L2listen = L2ListenSocket - -conf.iface = get_working_if() diff --git a/scripts/external_libs/scapy-2.3.1/scapy/arch/pcapdnet.py b/scripts/external_libs/scapy-2.3.1/scapy/arch/pcapdnet.py deleted file mode 100644 index 94673d7d..00000000 --- a/scripts/external_libs/scapy-2.3.1/scapy/arch/pcapdnet.py +++ /dev/null @@ -1,368 +0,0 @@ -## This file is part of Scapy -## See http://www.secdev.org/projects/scapy for more informations -## Copyright (C) Philippe Biondi <phil@secdev.org> -## This program is published under a GPLv2 license - -""" -Packet sending and receiving with libdnet and libpcap/WinPcap. -""" - -import time,struct,sys -if not sys.platform.startswith("win"): - from fcntl import ioctl -from scapy.data import * -from scapy.config import conf -from scapy.utils import warning -from scapy.supersocket import SuperSocket -from scapy.error import Scapy_Exception -import scapy.arch - - - -if conf.use_pcap: - - - - try: - import pcap - except ImportError,e: - try: - import pcapy as pcap - except ImportError,e2: - if conf.interactive: - log_loading.error("Unable to import pcap module: %s/%s" % (e,e2)) - conf.use_pcap = False - else: - raise - if conf.use_pcap: - - # From BSD net/bpf.h - #BIOCIMMEDIATE=0x80044270 - BIOCIMMEDIATE=-2147204496 - - if hasattr(pcap,"pcap"): # python-pypcap - class _PcapWrapper_pypcap: - def __init__(self, device, snaplen, promisc, to_ms): - try: - self.pcap = pcap.pcap(device, snaplen, promisc, immediate=1, timeout_ms=to_ms) - except TypeError: - # Older pypcap versions do not support the timeout_ms argument - self.pcap = pcap.pcap(device, snaplen, promisc, immediate=1) - def __getattr__(self, attr): - return getattr(self.pcap, attr) - def __del__(self): - warning("__del__: don't know how to close the file descriptor. Bugs ahead ! Please report this bug.") - def next(self): - c = self.pcap.next() - if c is None: - return - ts, pkt = c - return ts, str(pkt) - open_pcap = lambda *args,**kargs: _PcapWrapper_pypcap(*args,**kargs) - elif hasattr(pcap,"pcapObject"): # python-libpcap - class _PcapWrapper_libpcap: - def __init__(self, *args, **kargs): - self.pcap = pcap.pcapObject() - self.pcap.open_live(*args, **kargs) - def setfilter(self, filter): - self.pcap.setfilter(filter, 0, 0) - def next(self): - c = self.pcap.next() - if c is None: - return - l,pkt,ts = c - return ts,pkt - def __getattr__(self, attr): - return getattr(self.pcap, attr) - def __del__(self): - fd = self.pcap.fileno() - os.close(fd) - open_pcap = lambda *args,**kargs: _PcapWrapper_libpcap(*args,**kargs) - elif hasattr(pcap,"open_live"): # python-pcapy - class _PcapWrapper_pcapy: - def __init__(self, *args, **kargs): - self.pcap = pcap.open_live(*args, **kargs) - def next(self): - try: - c = self.pcap.next() - except pcap.PcapError: - return None - else: - h,p = c - s,us = h.getts() - return (s+0.000001*us), p - def fileno(self): - warning("fileno: pcapy API does not permit to get capure file descriptor. Bugs ahead! Press Enter to trigger packet reading") - return 0 - def __getattr__(self, attr): - return getattr(self.pcap, attr) - def __del__(self): - warning("__del__: don't know how to close the file descriptor. Bugs ahead ! Please report this bug.") - open_pcap = lambda *args,**kargs: _PcapWrapper_pcapy(*args,**kargs) - - - class PcapTimeoutElapsed(Scapy_Exception): - pass - - class L2pcapListenSocket(SuperSocket): - desc = "read packets at layer 2 using libpcap" - def __init__(self, iface = None, type = ETH_P_ALL, promisc=None, filter=None): - self.type = type - self.outs = None - self.iface = iface - if iface is None: - iface = conf.iface - if promisc is None: - promisc = conf.sniff_promisc - self.promisc = promisc - self.ins = open_pcap(iface, 1600, self.promisc, 100) - try: - ioctl(self.ins.fileno(),BIOCIMMEDIATE,struct.pack("I",1)) - except: - pass - if type == ETH_P_ALL: # Do not apply any filter if Ethernet type is given - if conf.except_filter: - if filter: - filter = "(%s) and not (%s)" % (filter, conf.except_filter) - else: - filter = "not (%s)" % conf.except_filter - if filter: - self.ins.setfilter(filter) - - def close(self): - del(self.ins) - - def recv(self, x=MTU): - ll = self.ins.datalink() - if ll in conf.l2types: - cls = conf.l2types[ll] - else: - cls = conf.default_l2 - warning("Unable to guess datalink type (interface=%s linktype=%i). Using %s" % (self.iface, ll, cls.name)) - - pkt = None - while pkt is None: - pkt = self.ins.next() - if pkt is not None: - ts,pkt = pkt - if scapy.arch.WINDOWS and pkt is None: - raise PcapTimeoutElapsed - - try: - pkt = cls(pkt) - except KeyboardInterrupt: - raise - except: - if conf.debug_dissector: - raise - pkt = conf.raw_layer(pkt) - pkt.time = ts - return pkt - - def send(self, x): - raise Scapy_Exception("Can't send anything with L2pcapListenSocket") - - - conf.L2listen = L2pcapListenSocket - - - - -if conf.use_dnet: - try: - import dnet - except ImportError,e: - if conf.interactive: - log_loading.error("Unable to import dnet module: %s" % e) - conf.use_dnet = False - def get_if_raw_hwaddr(iff): - "dummy" - return (0,"\0\0\0\0\0\0") - def get_if_raw_addr(iff): - "dummy" - return "\0\0\0\0" - def get_if_list(): - "dummy" - return [] - else: - raise - else: - def get_if_raw_hwaddr(iff): - if iff == scapy.arch.LOOPBACK_NAME: - return (772, '\x00'*6) - try: - l = dnet.intf().get(iff) - l = l["link_addr"] - except: - raise Scapy_Exception("Error in attempting to get hw address for interface [%s]" % iff) - return l.type,l.data - def get_if_raw_addr(ifname): - i = dnet.intf() - return i.get(ifname)["addr"].data - def get_if_list(): - return [i.get("name", None) for i in dnet.intf()] - - -if conf.use_pcap and conf.use_dnet: - class L3dnetSocket(SuperSocket): - desc = "read/write packets at layer 3 using libdnet and libpcap" - def __init__(self, type = ETH_P_ALL, filter=None, promisc=None, iface=None, nofilter=0): - self.iflist = {} - self.intf = dnet.intf() - if iface is None: - iface = conf.iface - self.iface = iface - self.ins = open_pcap(iface, 1600, 0, 100) - try: - ioctl(self.ins.fileno(),BIOCIMMEDIATE,struct.pack("I",1)) - except: - pass - if nofilter: - if type != ETH_P_ALL: # PF_PACKET stuff. Need to emulate this for pcap - filter = "ether proto %i" % type - else: - filter = None - else: - if conf.except_filter: - if filter: - filter = "(%s) and not (%s)" % (filter, conf.except_filter) - else: - filter = "not (%s)" % conf.except_filter - if type != ETH_P_ALL: # PF_PACKET stuff. Need to emulate this for pcap - if filter: - filter = "(ether proto %i) and (%s)" % (type,filter) - else: - filter = "ether proto %i" % type - if filter: - self.ins.setfilter(filter) - def send(self, x): - iff,a,gw = x.route() - if iff is None: - iff = conf.iface - ifs,cls = self.iflist.get(iff,(None,None)) - if ifs is None: - iftype = self.intf.get(iff)["type"] - if iftype == dnet.INTF_TYPE_ETH: - try: - cls = conf.l2types[1] - except KeyError: - warning("Unable to find Ethernet class. Using nothing") - ifs = dnet.eth(iff) - else: - ifs = dnet.ip() - self.iflist[iff] = ifs,cls - if cls is None: - sx = str(x) - else: - sx = str(cls()/x) - x.sent_time = time.time() - ifs.send(sx) - def recv(self,x=MTU): - ll = self.ins.datalink() - if ll in conf.l2types: - cls = conf.l2types[ll] - else: - cls = conf.default_l2 - warning("Unable to guess datalink type (interface=%s linktype=%i). Using %s" % (self.iface, ll, cls.name)) - - pkt = self.ins.next() - if pkt is not None: - ts,pkt = pkt - if pkt is None: - return - - try: - pkt = cls(pkt) - except KeyboardInterrupt: - raise - except: - if conf.debug_dissector: - raise - pkt = conf.raw_layer(pkt) - pkt.time = ts - return pkt.payload - - def nonblock_recv(self): - self.ins.setnonblock(1) - p = self.recv() - self.ins.setnonblock(0) - return p - - def close(self): - if hasattr(self, "ins"): - del(self.ins) - if hasattr(self, "outs"): - del(self.outs) - - class L2dnetSocket(SuperSocket): - desc = "read/write packets at layer 2 using libdnet and libpcap" - def __init__(self, iface = None, type = ETH_P_ALL, filter=None, nofilter=0): - if iface is None: - iface = conf.iface - self.iface = iface - self.ins = open_pcap(iface, 1600, 0, 100) - try: - ioctl(self.ins.fileno(),BIOCIMMEDIATE,struct.pack("I",1)) - except: - pass - if nofilter: - if type != ETH_P_ALL: # PF_PACKET stuff. Need to emulate this for pcap - filter = "ether proto %i" % type - else: - filter = None - else: - if conf.except_filter: - if filter: - filter = "(%s) and not (%s)" % (filter, conf.except_filter) - else: - filter = "not (%s)" % conf.except_filter - if type != ETH_P_ALL: # PF_PACKET stuff. Need to emulate this for pcap - if filter: - filter = "(ether proto %i) and (%s)" % (type,filter) - else: - filter = "ether proto %i" % type - if filter: - self.ins.setfilter(filter) - self.outs = dnet.eth(iface) - def recv(self,x=MTU): - ll = self.ins.datalink() - if ll in conf.l2types: - cls = conf.l2types[ll] - else: - cls = conf.default_l2 - warning("Unable to guess datalink type (interface=%s linktype=%i). Using %s" % (self.iface, ll, cls.name)) - - pkt = self.ins.next() - if pkt is not None: - ts,pkt = pkt - if pkt is None: - return - - try: - pkt = cls(pkt) - except KeyboardInterrupt: - raise - except: - if conf.debug_dissector: - raise - pkt = conf.raw_layer(pkt) - pkt.time = ts - return pkt - - def nonblock_recv(self): - self.ins.setnonblock(1) - p = self.recv(MTU) - self.ins.setnonblock(0) - return p - - def close(self): - if hasattr(self, "ins"): - del(self.ins) - if hasattr(self, "outs"): - del(self.outs) - - conf.L3socket=L3dnetSocket - conf.L2socket=L2dnetSocket - - - diff --git a/scripts/external_libs/scapy-2.3.1/scapy/arch/solaris.py b/scripts/external_libs/scapy-2.3.1/scapy/arch/solaris.py deleted file mode 100644 index 3117076a..00000000 --- a/scripts/external_libs/scapy-2.3.1/scapy/arch/solaris.py +++ /dev/null @@ -1,16 +0,0 @@ -## This file is part of Scapy -## See http://www.secdev.org/projects/scapy for more informations -## Copyright (C) Philippe Biondi <phil@secdev.org> -## This program is published under a GPLv2 license - -""" -Customization for the Solaris operation system. -""" - -# IPPROTO_GRE is missing on Solaris -import socket -socket.IPPROTO_GRE = 47 - -LOOPBACK_NAME="lo0" - -from unix import * diff --git a/scripts/external_libs/scapy-2.3.1/scapy/arch/unix.py b/scripts/external_libs/scapy-2.3.1/scapy/arch/unix.py deleted file mode 100644 index 151a08f5..00000000 --- a/scripts/external_libs/scapy-2.3.1/scapy/arch/unix.py +++ /dev/null @@ -1,205 +0,0 @@ -## This file is part of Scapy -## See http://www.secdev.org/projects/scapy for more informations -## Copyright (C) Philippe Biondi <phil@secdev.org> -## This program is published under a GPLv2 license - -""" -Common customizations for all Unix-like operating systems other than Linux -""" - -import sys,os,struct,socket,time -from fcntl import ioctl -from scapy.error import warning -import scapy.config -import scapy.utils -import scapy.utils6 -import scapy.arch - -scapy.config.conf.use_pcap = 1 -scapy.config.conf.use_dnet = 1 -from pcapdnet import * - - - - - -################## -## Routes stuff ## -################## - - -def read_routes(): - if scapy.arch.SOLARIS: - f=os.popen("netstat -rvn") # -f inet - elif scapy.arch.FREEBSD: - f=os.popen("netstat -rnW") # -W to handle long interface names - else: - f=os.popen("netstat -rn") # -f inet - ok = 0 - mtu_present = False - prio_present = False - routes = [] - pending_if = [] - for l in f.readlines(): - if not l: - break - l = l.strip() - if l.find("----") >= 0: # a separation line - continue - if not ok: - if l.find("Destination") >= 0: - ok = 1 - mtu_present = l.find("Mtu") >= 0 - prio_present = l.find("Prio") >= 0 - continue - if not l: - break - if scapy.arch.SOLARIS: - lspl = l.split() - if len(lspl) == 10: - dest,mask,gw,netif,mxfrg,rtt,ref,flg = lspl[:8] - else: # missing interface - dest,mask,gw,mxfrg,rtt,ref,flg = lspl[:7] - netif=None - else: - rt = l.split() - dest,gw,flg = rt[:3] - netif = rt[5+mtu_present+prio_present] - if flg.find("Lc") >= 0: - continue - if dest == "default": - dest = 0L - netmask = 0L - else: - if scapy.arch.SOLARIS: - netmask = scapy.utils.atol(mask) - elif "/" in dest: - dest,netmask = dest.split("/") - netmask = scapy.utils.itom(int(netmask)) - else: - netmask = scapy.utils.itom((dest.count(".") + 1) * 8) - dest += ".0"*(3-dest.count(".")) - dest = scapy.utils.atol(dest) - if not "G" in flg: - gw = '0.0.0.0' - if netif is not None: - ifaddr = scapy.arch.get_if_addr(netif) - routes.append((dest,netmask,gw,netif,ifaddr)) - else: - pending_if.append((dest,netmask,gw)) - f.close() - - # On Solaris, netstat does not provide output interfaces for some routes - # We need to parse completely the routing table to route their gw and - # know their output interface - for dest,netmask,gw in pending_if: - gw_l = scapy.utils.atol(gw) - max_rtmask,gw_if,gw_if_addr, = 0,None,None - for rtdst,rtmask,_,rtif,rtaddr in routes[:]: - if gw_l & rtmask == rtdst: - if rtmask >= max_rtmask: - max_rtmask = rtmask - gw_if = rtif - gw_if_addr = rtaddr - if gw_if: - routes.append((dest,netmask,gw,gw_if,gw_if_addr)) - else: - warning("Did not find output interface to reach gateway %s" % gw) - - return routes - -############ -### IPv6 ### -############ - -def in6_getifaddr(): - """ - Returns a list of 3-tuples of the form (addr, scope, iface) where - 'addr' is the address of scope 'scope' associated to the interface - 'ifcace'. - - This is the list of all addresses of all interfaces available on - the system. - """ - - ret = [] - i = dnet.intf() - for int in i: - ifname = int['name'] - v6 = [] - if int.has_key('alias_addrs'): - v6 = int['alias_addrs'] - for a in v6: - if a.type != dnet.ADDR_TYPE_IP6: - continue - - xx = str(a).split('/')[0] - addr = scapy.utils6.in6_ptop(xx) - - scope = scapy.utils6.in6_getscope(addr) - - ret.append((xx, scope, ifname)) - return ret - -def read_routes6(): - f = os.popen("netstat -rn -f inet6") - ok = False - mtu_present = False - prio_present = False - routes = [] - lifaddr = in6_getifaddr() - for l in f.readlines(): - if not l: - break - l = l.strip() - if not ok: - if l.find("Destination") >= 0: - ok = 1 - mtu_present = l.find("Mtu") >= 0 - prio_present = l.find("Prio") >= 0 - continue - # gv 12/12/06: under debugging - if scapy.arch.NETBSD or scapy.arch.OPENBSD: - lspl = l.split() - d,nh,fl = lspl[:3] - dev = lspl[5+mtu_present+prio_present] - else: # FREEBSD or DARWIN - d,nh,fl,dev = l.split()[:4] - if filter(lambda x: x[2] == dev, lifaddr) == []: - continue - if 'L' in fl: # drop MAC addresses - continue - - if 'link' in nh: - nh = '::' - - cset = [] # candidate set (possible source addresses) - dp = 128 - if d == 'default': - d = '::' - dp = 0 - if '/' in d: - d,dp = d.split("/") - dp = int(dp) - if '%' in d: - d,dev = d.split('%') - if '%' in nh: - nh,dev = nh.split('%') - if scapy.arch.LOOPBACK_NAME in dev: - cset = ['::1'] - nh = '::' - else: - devaddrs = filter(lambda x: x[2] == dev, lifaddr) - cset = scapy.utils6.construct_source_candidate_set(d, dp, devaddrs, scapy.arch.LOOPBACK_NAME) - - if len(cset) != 0: - routes.append((d, dp, nh, dev, cset)) - - f.close() - return routes - - - - - - diff --git a/scripts/external_libs/scapy-2.3.1/scapy/arch/windows/__init__.py b/scripts/external_libs/scapy-2.3.1/scapy/arch/windows/__init__.py deleted file mode 100644 index e604266b..00000000 --- a/scripts/external_libs/scapy-2.3.1/scapy/arch/windows/__init__.py +++ /dev/null @@ -1,545 +0,0 @@ -## This file is part of Scapy -## See http://www.secdev.org/projects/scapy for more informations -## Copyright (C) Philippe Biondi <phil@secdev.org> -## This program is published under a GPLv2 license - -""" -Customizations needed to support Microsoft Windows. -""" - -import os,re,sys,socket,time -from glob import glob -from scapy.config import conf,ConfClass -from scapy.error import Scapy_Exception,log_loading,log_runtime -from scapy.utils import atol, inet_aton, inet_ntoa, PcapReader -from scapy.base_classes import Gen, Net, SetGen -import scapy.plist as plist -from scapy.sendrecv import debug, srp1 -from scapy.layers.l2 import Ether, ARP -from scapy.data import MTU, ETHER_BROADCAST, ETH_P_ARP - -conf.use_pcap = 1 -conf.use_dnet = 1 -#from scapy.arch import pcapdnet -#from scapy.arch.pcapdnet import * - -LOOPBACK_NAME="lo0" -WINDOWS = True -IPPROTO_IPIP = 4 - - -def _where(filename, dirs=[], env="PATH"): - """Find file in current dir or system path""" - if not isinstance(dirs, list): - dirs = [dirs] - if glob(filename): - return filename - paths = [os.curdir] + os.environ[env].split(os.path.pathsep) + dirs - for path in paths: - for match in glob(os.path.join(path, filename)): - if match: - return os.path.normpath(match) - raise IOError("File not found: %s" % filename) - -def win_find_exe(filename, installsubdir=None, env="ProgramFiles"): - """Find executable in current dir, system path or given ProgramFiles subdir""" - for fn in [filename, filename+".exe"]: - try: - if installsubdir is None: - path = _where(fn) - else: - path = _where(fn, dirs=[os.path.join(os.environ[env], installsubdir)]) - except IOError: - path = filename - else: - break - return path - - -class WinProgPath(ConfClass): - _default = "<System default>" - # We try some magic to find the appropriate executables - pdfreader = win_find_exe("AcroRd32") - psreader = win_find_exe("gsview32.exe", "Ghostgum/gsview") - dot = win_find_exe("dot", "ATT/Graphviz/bin") - tcpdump = win_find_exe("windump") - tcpreplay = win_find_exe("tcpreplay") - display = _default - hexedit = win_find_exe("hexer") - wireshark = win_find_exe("wireshark", "wireshark") - -conf.prog = WinProgPath() - - - -import _winreg - - - -class PcapNameNotFoundError(Scapy_Exception): - pass - -class NetworkInterface(object): - """A network interface of your local host""" - - def __init__(self, dnetdict=None): - self.name = None - self.ip = None - self.mac = None - self.pcap_name = None - self.win_name = None - self.uuid = None - self.dnetdict = dnetdict - if dnetdict is not None: - self.update(dnetdict) - - def update(self, dnetdict): - """Update info about network interface according to given dnet dictionary""" - self.name = dnetdict["name"] - # Other attributes are optional - try: - self.ip = socket.inet_ntoa(dnetdict["addr"].ip) - except (KeyError, AttributeError, NameError): - pass - try: - self.mac = dnetdict["link_addr"] - except KeyError: - pass - self._update_pcapdata() - - def _update_pcapdata(self): - """Supplement more info from pypcap and the Windows registry""" - - # XXX: We try eth0 - eth29 by bruteforce and match by IP address, - # because only the IP is available in both pypcap and dnet. - # This may not work with unorthodox network configurations and is - # slow because we have to walk through the Windows registry. - for n in range(30): - guess = "eth%s" % n - win_name = pcapdnet.pcap.ex_name(guess) - if win_name.endswith("}"): - try: - uuid = win_name[win_name.index("{"):win_name.index("}")+1] - keyname = r"SYSTEM\CurrentControlSet\Services\Tcpip\Parameters\Interfaces\%s" % uuid - try: - key = _winreg.OpenKey(_winreg.HKEY_LOCAL_MACHINE, keyname) - except WindowsError: - log_loading.debug("Couldn't open 'HKEY_LOCAL_MACHINE\\%s' (for guessed pcap iface name '%s')." % (keyname, guess)) - continue - try: - fixed_ip = _winreg.QueryValueEx(key, "IPAddress")[0][0].encode("utf-8") - except (WindowsError, UnicodeDecodeError, IndexError): - fixed_ip = None - try: - dhcp_ip = _winreg.QueryValueEx(key, "DhcpIPAddress")[0].encode("utf-8") - except (WindowsError, UnicodeDecodeError, IndexError): - dhcp_ip = None - # "0.0.0.0" or None means the value is not set (at least not correctly). - # If both fixed_ip and dhcp_ip are set, fixed_ip takes precedence - if fixed_ip is not None and fixed_ip != "0.0.0.0": - ip = fixed_ip - elif dhcp_ip is not None and dhcp_ip != "0.0.0.0": - ip = dhcp_ip - else: - continue - except IOError: - continue - else: - if ip == self.ip: - self.pcap_name = guess - self.win_name = win_name - self.uuid = uuid - break - else: - raise PcapNameNotFoundError - - def __repr__(self): - return "<%s: %s %s %s pcap_name=%s win_name=%s>" % (self.__class__.__name__, - self.name, self.ip, self.mac, self.pcap_name, self.win_name) - -from UserDict import IterableUserDict - -class NetworkInterfaceDict(IterableUserDict): - """Store information about network interfaces and convert between names""" - - def load_from_dnet(self): - """Populate interface table via dnet""" - #for i in pcapdnet.dnet.intf(): - # try: - # XXX: Only Ethernet for the moment: localhost is not supported by dnet and pcap - # We only take interfaces that have an IP address, because the IP - # is used for the mapping between dnet and pcap interface names - # and this significantly improves Scapy's startup performance - # if i["name"].startswith("eth") and "addr" in i: - # self.data[i["name"]] = NetworkInterface(i) - # except (KeyError, PcapNameNotFoundError): - # pass - #if len(self.data) == 0: - # log_loading.warning("No match between your pcap and dnet network interfaces found. " - # "You probably won't be able to send packets. " - # "Deactivating unneeded interfaces and restarting Scapy might help.") - - def pcap_name(self, devname): - """Return pypcap device name for given libdnet/Scapy device name - - This mapping is necessary because pypcap numbers the devices differently.""" - - try: - pcap_name = self.data[devname].pcap_name - except KeyError: - raise ValueError("Unknown network interface %r" % devname) - else: - return pcap_name - - def devname(self, pcap_name): - """Return libdnet/Scapy device name for given pypcap device name - - This mapping is necessary because pypcap numbers the devices differently.""" - - for devname, iface in self.items(): - if iface.pcap_name == pcap_name: - return iface.name - raise ValueError("Unknown pypcap network interface %r" % pcap_name) - - def show(self, resolve_mac=True): - """Print list of available network interfaces in human readable form""" - print "%s %s %s" % ("IFACE".ljust(5), "IP".ljust(15), "MAC") - for iface_name in sorted(self.data.keys()): - dev = self.data[iface_name] - mac = str(dev.mac) - if resolve_mac: - mac = conf.manufdb._resolve_MAC(mac) - print "%s %s %s" % (str(dev.name).ljust(5), str(dev.ip).ljust(15), mac) - -ifaces = NetworkInterfaceDict() -#ifaces.load_from_dnet() - -def pcap_name(devname): - """Return pypcap device name for given libdnet/Scapy device name""" - try: - pcap_name = ifaces.pcap_name(devname) - except ValueError: - # pcap.pcap() will choose a sensible default for sniffing if iface=None - pcap_name = None - return pcap_name - -def devname(pcap_name): - """Return libdnet/Scapy device name for given pypcap device name""" - return ifaces.devname(pcap_name) - -def show_interfaces(resolve_mac=True): - """Print list of available network interfaces""" - return ifaces.show(resolve_mac) - -#orig_open_pcap = pcapdnet.open_pcap -#pcapdnet.open_pcap = lambda iface,*args,**kargs: _orig_open_pcap(pcap_name(iface),*args,**kargs) - -def read_routes(): - ok = 0 - routes = [] - ip = '(\d+\.\d+\.\d+\.\d+)' - # On Vista and Windows 7 the gateway can be IP or 'On-link'. - # But the exact 'On-link' string depends on the locale, so we allow any text. - gw_pattern = '(.+)' - metric_pattern = "(\d+)" - delim = "\s+" # The columns are separated by whitespace - netstat_line = delim.join([ip, ip, gw_pattern, ip, metric_pattern]) - pattern = re.compile(netstat_line) - f=os.popen("netstat -rn") - for l in f.readlines(): - match = re.search(pattern,l) - if match: - dest = match.group(1) - mask = match.group(2) - gw = match.group(3) - netif = match.group(4) - metric = match.group(5) - try: - #intf = pcapdnet.dnet.intf().get_dst(pcapdnet.dnet.addr(type=2, addrtxt=dest)) - intf={}; - except OSError: - log_loading.warning("Building Scapy's routing table: Couldn't get outgoing interface for destination %s" % dest) - continue - if not intf.has_key("addr"): - break - addr = str(intf["addr"]) - addr = addr.split("/")[0] - - dest = atol(dest) - mask = atol(mask) - # If the gateway is no IP we assume it's on-link - gw_ipmatch = re.search('\d+\.\d+\.\d+\.\d+', gw) - if gw_ipmatch: - gw = gw_ipmatch.group(0) - else: - gw = netif - routes.append((dest,mask,gw, str(intf["name"]), addr)) - f.close() - return routes - -def read_routes6(): - return [] - -def getmacbyip(ip, chainCC=0): - """Return MAC address corresponding to a given IP address""" - if isinstance(ip,Net): - ip = iter(ip).next() - tmp = map(ord, inet_aton(ip)) - if (tmp[0] & 0xf0) == 0xe0: # mcast @ - return "01:00:5e:%.2x:%.2x:%.2x" % (tmp[1]&0x7f,tmp[2],tmp[3]) - iff,a,gw = conf.route.route(ip) - if ( (iff == LOOPBACK_NAME) or (ip == conf.route.get_if_bcast(iff)) ): - return "ff:ff:ff:ff:ff:ff" - # Windows uses local IP instead of 0.0.0.0 to represent locally reachable addresses - ifip = str(pcapdnet.dnet.intf().get(iff)['addr']) - if gw != ifip.split('/')[0]: - ip = gw - - mac = conf.netcache.arp_cache.get(ip) - if mac: - return mac - - res = srp1(Ether(dst=ETHER_BROADCAST)/ARP(op="who-has", pdst=ip), - type=ETH_P_ARP, - iface = iff, - timeout=2, - verbose=0, - chainCC=chainCC, - nofilter=1) - if res is not None: - mac = res.payload.hwsrc - conf.netcache.arp_cache[ip] = mac - return mac - return None - -import scapy.layers.l2 -scapy.layers.l2.getmacbyip = getmacbyip - -try: - import readline - console = readline.GetOutputFile() -except (ImportError, AttributeError): - log_loading.info("Could not get readline console. Will not interpret ANSI color codes.") -else: - conf.readfunc = readline.rl.readline - orig_stdout = sys.stdout - sys.stdout = console - - - - - -def sndrcv(pks, pkt, timeout = 2, inter = 0, verbose=None, chainCC=0, retry=0, multi=0): - if not isinstance(pkt, Gen): - pkt = SetGen(pkt) - - if verbose is None: - verbose = conf.verb - debug.recv = plist.PacketList([],"Unanswered") - debug.sent = plist.PacketList([],"Sent") - debug.match = plist.SndRcvList([]) - nbrecv=0 - ans = [] - # do it here to fix random fields, so that parent and child have the same - all_stimuli = tobesent = [p for p in pkt] - notans = len(tobesent) - - hsent={} - for i in tobesent: - h = i.hashret() - if h in hsent: - hsent[h].append(i) - else: - hsent[h] = [i] - if retry < 0: - retry = -retry - autostop=retry - else: - autostop=0 - - - while retry >= 0: - found=0 - - if timeout < 0: - timeout = None - - pid=1 - try: - if WINDOWS or pid == 0: - try: - try: - i = 0 - if verbose: - print "Begin emission:" - for p in tobesent: - pks.send(p) - i += 1 - time.sleep(inter) - if verbose: - print "Finished to send %i packets." % i - except SystemExit: - pass - except KeyboardInterrupt: - pass - except: - log_runtime.exception("--- Error sending packets") - log_runtime.info("--- Error sending packets") - finally: - try: - sent_times = [p.sent_time for p in all_stimuli if p.sent_time] - except: - pass - if WINDOWS or pid > 0: - # Timeout starts after last packet is sent (as in Unix version) - if timeout: - stoptime = time.time()+timeout - else: - stoptime = 0 - remaintime = None - inmask = [pks.ins.fd] - try: - try: - while 1: - if stoptime: - remaintime = stoptime-time.time() - if remaintime <= 0: - break - r = pks.recv(MTU) - if r is None: - continue - ok = 0 - h = r.hashret() - if h in hsent: - hlst = hsent[h] - for i in range(len(hlst)): - if r.answers(hlst[i]): - ans.append((hlst[i],r)) - if verbose > 1: - os.write(1, "*") - ok = 1 - if not multi: - del(hlst[i]) - notans -= 1; - else: - if not hasattr(hlst[i], '_answered'): - notans -= 1; - hlst[i]._answered = 1; - break - if notans == 0 and not multi: - break - if not ok: - if verbose > 1: - os.write(1, ".") - nbrecv += 1 - if conf.debug_match: - debug.recv.append(r) - except KeyboardInterrupt: - if chainCC: - raise - finally: - if WINDOWS: - for p,t in zip(all_stimuli, sent_times): - p.sent_time = t - finally: - pass - - remain = reduce(list.__add__, hsent.values(), []) - if multi: - remain = filter(lambda p: not hasattr(p, '_answered'), remain); - - if autostop and len(remain) > 0 and len(remain) != len(tobesent): - retry = autostop - - tobesent = remain - if len(tobesent) == 0: - break - retry -= 1 - - if conf.debug_match: - debug.sent=plist.PacketList(remain[:],"Sent") - debug.match=plist.SndRcvList(ans[:]) - - #clean the ans list to delete the field _answered - if (multi): - for s,r in ans: - if hasattr(s, '_answered'): - del(s._answered) - - if verbose: - print "\nReceived %i packets, got %i answers, remaining %i packets" % (nbrecv+len(ans), len(ans), notans) - return plist.SndRcvList(ans),plist.PacketList(remain,"Unanswered") - - -import scapy.sendrecv -scapy.sendrecv.sndrcv = sndrcv - -def sniff(count=0, store=1, offline=None, prn = None, lfilter=None, L2socket=None, timeout=None, *arg, **karg): - """Sniff packets -sniff([count=0,] [prn=None,] [store=1,] [offline=None,] [lfilter=None,] + L2ListenSocket args) -> list of packets - - count: number of packets to capture. 0 means infinity - store: wether to store sniffed packets or discard them - prn: function to apply to each packet. If something is returned, - it is displayed. Ex: - ex: prn = lambda x: x.summary() -lfilter: python function applied to each packet to determine - if further action may be done - ex: lfilter = lambda x: x.haslayer(Padding) -offline: pcap file to read packets from, instead of sniffing them -timeout: stop sniffing after a given time (default: None) -L2socket: use the provided L2socket - """ - c = 0 - - if offline is None: - if L2socket is None: - L2socket = conf.L2listen - s = L2socket(type=ETH_P_ALL, *arg, **karg) - else: - s = PcapReader(offline) - - lst = [] - if timeout is not None: - stoptime = time.time()+timeout - remain = None - while 1: - try: - if timeout is not None: - remain = stoptime-time.time() - if remain <= 0: - break - - try: - p = s.recv(MTU) - except PcapTimeoutElapsed: - continue - if p is None: - break - if lfilter and not lfilter(p): - continue - if store: - lst.append(p) - c += 1 - if prn: - r = prn(p) - if r is not None: - print r - if count > 0 and c >= count: - break - except KeyboardInterrupt: - break - s.close() - return plist.PacketList(lst,"Sniffed") - -import scapy.sendrecv -scapy.sendrecv.sniff = sniff - -def get_if_list(): - return sorted(ifaces.keys()) - -def get_working_if(): - try: - return devname(pcap.lookupdev()) - except Exception: - return 'lo0' diff --git a/scripts/external_libs/scapy-2.3.1/scapy/as_resolvers.py b/scripts/external_libs/scapy-2.3.1/scapy/as_resolvers.py deleted file mode 100644 index 24573c20..00000000 --- a/scripts/external_libs/scapy-2.3.1/scapy/as_resolvers.py +++ /dev/null @@ -1,114 +0,0 @@ -## This file is part of Scapy -## See http://www.secdev.org/projects/scapy for more informations -## Copyright (C) Philippe Biondi <phil@secdev.org> -## This program is published under a GPLv2 license - -""" -Resolve Autonomous Systems (AS). -""" - - -import socket -from config import conf - -class AS_resolver: - server = None - options = "-k" - def __init__(self, server=None, port=43, options=None): - if server is not None: - self.server = server - self.port = port - if options is not None: - self.options = options - - def _start(self): - self.s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) - self.s.connect((self.server,self.port)) - if self.options: - self.s.send(self.options+"\n") - self.s.recv(8192) - def _stop(self): - self.s.close() - - def _parse_whois(self, txt): - asn,desc = None,"" - for l in txt.splitlines(): - if not asn and l.startswith("origin:"): - asn = l[7:].strip() - if l.startswith("descr:"): - if desc: - desc += r"\n" - desc += l[6:].strip() - if asn is not None and desc: - break - return asn,desc.strip() - - def _resolve_one(self, ip): - self.s.send("%s\n" % ip) - x = "" - while not ("%" in x or "source" in x): - x += self.s.recv(8192) - asn, desc = self._parse_whois(x) - return ip,asn,desc - def resolve(self, *ips): - self._start() - ret = [] - for ip in ips: - ip,asn,desc = self._resolve_one(ip) - if asn is not None: - ret.append((ip,asn,desc)) - self._stop() - return ret - -class AS_resolver_riswhois(AS_resolver): - server = "riswhois.ripe.net" - options = "-k -M -1" - - -class AS_resolver_radb(AS_resolver): - server = "whois.ra.net" - options = "-k -M" - - -class AS_resolver_cymru(AS_resolver): - server = "whois.cymru.com" - options = None - def resolve(self, *ips): - ASNlist = [] - s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) - s.connect((self.server,self.port)) - s.send("begin\r\n"+"\r\n".join(ips)+"\r\nend\r\n") - r = "" - while 1: - l = s.recv(8192) - if l == "": - break - r += l - s.close() - for l in r.splitlines()[1:]: - if "|" not in l: - continue - asn,ip,desc = map(str.strip, l.split("|")) - if asn == "NA": - continue - asn = int(asn) - ASNlist.append((ip,asn,desc)) - return ASNlist - -class AS_resolver_multi(AS_resolver): - resolvers_list = ( AS_resolver_cymru(),AS_resolver_riswhois(),AS_resolver_radb() ) - def __init__(self, *reslist): - if reslist: - self.resolvers_list = reslist - def resolve(self, *ips): - todo = ips - ret = [] - for ASres in self.resolvers_list: - res = ASres.resolve(*todo) - resolved = [ ip for ip,asn,desc in res ] - todo = [ ip for ip in todo if ip not in resolved ] - ret += res - return ret - - -conf.AS_resolver = AS_resolver_multi() diff --git a/scripts/external_libs/scapy-2.3.1/scapy/asn1/__init__.py b/scripts/external_libs/scapy-2.3.1/scapy/asn1/__init__.py deleted file mode 100644 index 4827a588..00000000 --- a/scripts/external_libs/scapy-2.3.1/scapy/asn1/__init__.py +++ /dev/null @@ -1,12 +0,0 @@ -## This file is part of Scapy -## See http://www.secdev.org/projects/scapy for more informations -## Copyright (C) Philippe Biondi <phil@secdev.org> -## This program is published under a GPLv2 license - -""" -Package holding ASN.1 related modules. -""" - -# We do not import mib.py because it is more bound to scapy and -# less prone to be used in a standalone fashion -__all__ = ["asn1","ber"] diff --git a/scripts/external_libs/scapy-2.3.1/scapy/asn1/asn1.py b/scripts/external_libs/scapy-2.3.1/scapy/asn1/asn1.py deleted file mode 100644 index bad7b2cf..00000000 --- a/scripts/external_libs/scapy-2.3.1/scapy/asn1/asn1.py +++ /dev/null @@ -1,305 +0,0 @@ -## This file is part of Scapy -## See http://www.secdev.org/projects/scapy for more informations -## Copyright (C) Philippe Biondi <phil@secdev.org> -## This program is published under a GPLv2 license - -""" -ASN.1 (Abstract Syntax Notation One) -""" - -import random -from scapy.config import conf -from scapy.error import Scapy_Exception,warning -from scapy.volatile import RandField -from scapy.utils import Enum_metaclass, EnumElement - -class RandASN1Object(RandField): - def __init__(self, objlist=None): - if objlist is None: - objlist = map(lambda x:x._asn1_obj, - filter(lambda x:hasattr(x,"_asn1_obj"), ASN1_Class_UNIVERSAL.__rdict__.values())) - self.objlist = objlist - self.chars = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789" - def _fix(self, n=0): - o = random.choice(self.objlist) - if issubclass(o, ASN1_INTEGER): - return o(int(random.gauss(0,1000))) - elif issubclass(o, ASN1_IPADDRESS): - z = RandIP()._fix() - return o(z) - elif issubclass(o, ASN1_STRING): - z = int(random.expovariate(0.05)+1) - return o("".join([random.choice(self.chars) for i in range(z)])) - elif issubclass(o, ASN1_SEQUENCE) and (n < 10): - z = int(random.expovariate(0.08)+1) - return o(map(lambda x:x._fix(n+1), [self.__class__(objlist=self.objlist)]*z)) - return ASN1_INTEGER(int(random.gauss(0,1000))) - - -############## -#### ASN1 #### -############## - -class ASN1_Error(Scapy_Exception): - pass - -class ASN1_Encoding_Error(ASN1_Error): - pass - -class ASN1_Decoding_Error(ASN1_Error): - pass - -class ASN1_BadTag_Decoding_Error(ASN1_Decoding_Error): - pass - - - -class ASN1Codec(EnumElement): - def register_stem(cls, stem): - cls._stem = stem - def dec(cls, s, context=None): - return cls._stem.dec(s, context=context) - def safedec(cls, s, context=None): - return cls._stem.safedec(s, context=context) - def get_stem(cls): - return cls.stem - - -class ASN1_Codecs_metaclass(Enum_metaclass): - element_class = ASN1Codec - -class ASN1_Codecs: - __metaclass__ = ASN1_Codecs_metaclass - BER = 1 - DER = 2 - PER = 3 - CER = 4 - LWER = 5 - BACnet = 6 - OER = 7 - SER = 8 - XER = 9 - -class ASN1Tag(EnumElement): - def __init__(self, key, value, context=None, codec=None): - EnumElement.__init__(self, key, value) - self._context = context - if codec == None: - codec = {} - self._codec = codec - def clone(self): # /!\ not a real deep copy. self.codec is shared - return self.__class__(self._key, self._value, self._context, self._codec) - def register_asn1_object(self, asn1obj): - self._asn1_obj = asn1obj - def asn1_object(self, val): - if hasattr(self,"_asn1_obj"): - return self._asn1_obj(val) - raise ASN1_Error("%r does not have any assigned ASN1 object" % self) - def register(self, codecnum, codec): - self._codec[codecnum] = codec - def get_codec(self, codec): - try: - c = self._codec[codec] - except KeyError,msg: - raise ASN1_Error("Codec %r not found for tag %r" % (codec, self)) - return c - -class ASN1_Class_metaclass(Enum_metaclass): - element_class = ASN1Tag - def __new__(cls, name, bases, dct): # XXX factorise a bit with Enum_metaclass.__new__() - for b in bases: - for k,v in b.__dict__.iteritems(): - if k not in dct and isinstance(v,ASN1Tag): - dct[k] = v.clone() - - rdict = {} - for k,v in dct.iteritems(): - if type(v) is int: - v = ASN1Tag(k,v) - dct[k] = v - rdict[v] = v - elif isinstance(v, ASN1Tag): - rdict[v] = v - dct["__rdict__"] = rdict - - cls = type.__new__(cls, name, bases, dct) - for v in cls.__dict__.values(): - if isinstance(v, ASN1Tag): - v.context = cls # overwrite ASN1Tag contexts, even cloned ones - return cls - - -class ASN1_Class: - __metaclass__ = ASN1_Class_metaclass - -class ASN1_Class_UNIVERSAL(ASN1_Class): - name = "UNIVERSAL" - ERROR = -3 - RAW = -2 - NONE = -1 - ANY = 0 - BOOLEAN = 1 - INTEGER = 2 - BIT_STRING = 3 - STRING = 4 - NULL = 5 - OID = 6 - OBJECT_DESCRIPTOR = 7 - EXTERNAL = 8 - REAL = 9 - ENUMERATED = 10 - EMBEDDED_PDF = 11 - UTF8_STRING = 12 - RELATIVE_OID = 13 - SEQUENCE = 0x30#XXX 16 ?? - SET = 0x31 #XXX 17 ?? - NUMERIC_STRING = 18 - PRINTABLE_STRING = 19 - T61_STRING = 20 - VIDEOTEX_STRING = 21 - IA5_STRING = 22 - UTC_TIME = 23 - GENERALIZED_TIME = 24 - GRAPHIC_STRING = 25 - ISO646_STRING = 26 - GENERAL_STRING = 27 - UNIVERSAL_STRING = 28 - CHAR_STRING = 29 - BMP_STRING = 30 - IPADDRESS = 0x40 - COUNTER32 = 0x41 - GAUGE32 = 0x42 - TIME_TICKS = 0x43 - SEP = 0x80 - -class ASN1_Object_metaclass(type): - def __new__(cls, name, bases, dct): - c = super(ASN1_Object_metaclass, cls).__new__(cls, name, bases, dct) - try: - c.tag.register_asn1_object(c) - except: - warning("Error registering %r for %r" % (c.tag, c.codec)) - return c - - -class ASN1_Object: - __metaclass__ = ASN1_Object_metaclass - tag = ASN1_Class_UNIVERSAL.ANY - def __init__(self, val): - self.val = val - def enc(self, codec): - return self.tag.get_codec(codec).enc(self.val) - def __repr__(self): - return "<%s[%r]>" % (self.__dict__.get("name", self.__class__.__name__), self.val) - def __str__(self): - return self.enc(conf.ASN1_default_codec) - def strshow(self, lvl=0): - return (" "*lvl)+repr(self)+"\n" - def show(self, lvl=0): - print self.strshow(lvl) - def __eq__(self, other): - return self.val == other - def __cmp__(self, other): - return cmp(self.val, other) - -class ASN1_DECODING_ERROR(ASN1_Object): - tag = ASN1_Class_UNIVERSAL.ERROR - def __init__(self, val, exc=None): - ASN1_Object.__init__(self, val) - self.exc = exc - def __repr__(self): - return "<%s[%r]{{%s}}>" % (self.__dict__.get("name", self.__class__.__name__), - self.val, self.exc.args[0]) - def enc(self, codec): - if isinstance(self.val, ASN1_Object): - return self.val.enc(codec) - return self.val - -class ASN1_force(ASN1_Object): - tag = ASN1_Class_UNIVERSAL.RAW - def enc(self, codec): - if isinstance(self.val, ASN1_Object): - return self.val.enc(codec) - return self.val - -class ASN1_BADTAG(ASN1_force): - pass - -class ASN1_INTEGER(ASN1_Object): - tag = ASN1_Class_UNIVERSAL.INTEGER - -class ASN1_STRING(ASN1_Object): - tag = ASN1_Class_UNIVERSAL.STRING - -class ASN1_BIT_STRING(ASN1_STRING): - tag = ASN1_Class_UNIVERSAL.BIT_STRING - -class ASN1_PRINTABLE_STRING(ASN1_STRING): - tag = ASN1_Class_UNIVERSAL.PRINTABLE_STRING - -class ASN1_T61_STRING(ASN1_STRING): - tag = ASN1_Class_UNIVERSAL.T61_STRING - -class ASN1_IA5_STRING(ASN1_STRING): - tag = ASN1_Class_UNIVERSAL.IA5_STRING - -class ASN1_NUMERIC_STRING(ASN1_STRING): - tag = ASN1_Class_UNIVERSAL.NUMERIC_STRING - -class ASN1_VIDEOTEX_STRING(ASN1_STRING): - tag = ASN1_Class_UNIVERSAL.VIDEOTEX_STRING - -class ASN1_IPADDRESS(ASN1_STRING): - tag = ASN1_Class_UNIVERSAL.IPADDRESS - -class ASN1_UTC_TIME(ASN1_STRING): - tag = ASN1_Class_UNIVERSAL.UTC_TIME - -class ASN1_GENERALIZED_TIME(ASN1_STRING): - tag = ASN1_Class_UNIVERSAL.GENERALIZED_TIME - -class ASN1_TIME_TICKS(ASN1_INTEGER): - tag = ASN1_Class_UNIVERSAL.TIME_TICKS - -class ASN1_BOOLEAN(ASN1_INTEGER): - tag = ASN1_Class_UNIVERSAL.BOOLEAN - -class ASN1_ENUMERATED(ASN1_INTEGER): - tag = ASN1_Class_UNIVERSAL.ENUMERATED - -class ASN1_NULL(ASN1_INTEGER): - tag = ASN1_Class_UNIVERSAL.NULL - -class ASN1_SEP(ASN1_NULL): - tag = ASN1_Class_UNIVERSAL.SEP - -class ASN1_GAUGE32(ASN1_INTEGER): - tag = ASN1_Class_UNIVERSAL.GAUGE32 - -class ASN1_COUNTER32(ASN1_INTEGER): - tag = ASN1_Class_UNIVERSAL.COUNTER32 - -class ASN1_SEQUENCE(ASN1_Object): - tag = ASN1_Class_UNIVERSAL.SEQUENCE - def strshow(self, lvl=0): - s = (" "*lvl)+("# %s:" % self.__class__.__name__)+"\n" - for o in self.val: - s += o.strshow(lvl=lvl+1) - return s - -class ASN1_SET(ASN1_SEQUENCE): - tag = ASN1_Class_UNIVERSAL.SET - -class ASN1_OID(ASN1_Object): - tag = ASN1_Class_UNIVERSAL.OID - def __init__(self, val): - val = conf.mib._oid(val) - ASN1_Object.__init__(self, val) - def __repr__(self): - return "<%s[%r]>" % (self.__dict__.get("name", self.__class__.__name__), conf.mib._oidname(self.val)) - def __oidname__(self): - return '%s'%conf.mib._oidname(self.val) - - - -conf.ASN1_default_codec = ASN1_Codecs.BER diff --git a/scripts/external_libs/scapy-2.3.1/scapy/asn1/ber.py b/scripts/external_libs/scapy-2.3.1/scapy/asn1/ber.py deleted file mode 100644 index 2312e025..00000000 --- a/scripts/external_libs/scapy-2.3.1/scapy/asn1/ber.py +++ /dev/null @@ -1,363 +0,0 @@ -## This file is part of Scapy -## See http://www.secdev.org/projects/scapy for more informations -## Copyright (C) Philippe Biondi <phil@secdev.org> -## This program is published under a GPLv2 license - -""" -Basic Encoding Rules (BER) for ASN.1 -""" - -from scapy.error import warning -from scapy.utils import inet_aton,inet_ntoa -from asn1 import ASN1_Decoding_Error,ASN1_Encoding_Error,ASN1_BadTag_Decoding_Error,ASN1_Codecs,ASN1_Class_UNIVERSAL,ASN1_Error,ASN1_DECODING_ERROR,ASN1_BADTAG - -################## -## BER encoding ## -################## - - - -#####[ BER tools ]##### - - -class BER_Exception(Exception): - pass - -class BER_Encoding_Error(ASN1_Encoding_Error): - def __init__(self, msg, encoded=None, remaining=None): - Exception.__init__(self, msg) - self.remaining = remaining - self.encoded = encoded - def __str__(self): - s = Exception.__str__(self) - if isinstance(self.encoded, BERcodec_Object): - s+="\n### Already encoded ###\n%s" % self.encoded.strshow() - else: - s+="\n### Already encoded ###\n%r" % self.encoded - s+="\n### Remaining ###\n%r" % self.remaining - return s - -class BER_Decoding_Error(ASN1_Decoding_Error): - def __init__(self, msg, decoded=None, remaining=None): - Exception.__init__(self, msg) - self.remaining = remaining - self.decoded = decoded - def __str__(self): - s = Exception.__str__(self) - if isinstance(self.decoded, BERcodec_Object): - s+="\n### Already decoded ###\n%s" % self.decoded.strshow() - else: - s+="\n### Already decoded ###\n%r" % self.decoded - s+="\n### Remaining ###\n%r" % self.remaining - return s - -class BER_BadTag_Decoding_Error(BER_Decoding_Error, ASN1_BadTag_Decoding_Error): - pass - -def BER_len_enc(l, size=0): - if l <= 127 and size==0: - return chr(l) - s = "" - while l or size>0: - s = chr(l&0xff)+s - l >>= 8L - size -= 1 - if len(s) > 127: - raise BER_Exception("BER_len_enc: Length too long (%i) to be encoded [%r]" % (len(s),s)) - return chr(len(s)|0x80)+s -def BER_len_dec(s): - l = ord(s[0]) - if not l & 0x80: - return l,s[1:] - l &= 0x7f - if len(s) <= l: - raise BER_Decoding_Error("BER_len_dec: Got %i bytes while expecting %i" % (len(s)-1, l),remaining=s) - ll = 0L - for c in s[1:l+1]: - ll <<= 8L - ll |= ord(c) - return ll,s[l+1:] - -def BER_num_enc(l, size=1): - x=[] - while l or size>0: - x.insert(0, l & 0x7f) - if len(x) > 1: - x[0] |= 0x80 - l >>= 7 - size -= 1 - return "".join([chr(k) for k in x]) -def BER_num_dec(s): - x = 0 - for i in range(len(s)): - c = ord(s[i]) - x <<= 7 - x |= c&0x7f - if not c&0x80: - break - if c&0x80: - raise BER_Decoding_Error("BER_num_dec: unfinished number description", remaining=s) - return x, s[i+1:] - -#####[ BER classes ]##### - -class BERcodec_metaclass(type): - def __new__(cls, name, bases, dct): - c = super(BERcodec_metaclass, cls).__new__(cls, name, bases, dct) - try: - c.tag.register(c.codec, c) - except: - warning("Error registering %r for %r" % (c.tag, c.codec)) - return c - - -class BERcodec_Object: - __metaclass__ = BERcodec_metaclass - codec = ASN1_Codecs.BER - tag = ASN1_Class_UNIVERSAL.ANY - - @classmethod - def asn1_object(cls, val): - return cls.tag.asn1_object(val) - - @classmethod - def check_string(cls, s): - if not s: - raise BER_Decoding_Error("%s: Got empty object while expecting tag %r" % - (cls.__name__,cls.tag), remaining=s) - @classmethod - def check_type(cls, s): - cls.check_string(s) - if cls.tag != ord(s[0]): - raise BER_BadTag_Decoding_Error("%s: Got tag [%i/%#x] while expecting %r" % - (cls.__name__, ord(s[0]), ord(s[0]),cls.tag), remaining=s) - return s[1:] - @classmethod - def check_type_get_len(cls, s): - s2 = cls.check_type(s) - if not s2: - raise BER_Decoding_Error("%s: No bytes while expecting a length" % - cls.__name__, remaining=s) - return BER_len_dec(s2) - @classmethod - def check_type_check_len(cls, s): - l,s3 = cls.check_type_get_len(s) - if len(s3) < l: - raise BER_Decoding_Error("%s: Got %i bytes while expecting %i" % - (cls.__name__, len(s3), l), remaining=s) - return l,s3[:l],s3[l:] - - @classmethod - def do_dec(cls, s, context=None, safe=False): - if context is None: - context = cls.tag.context - cls.check_string(s) - p = ord(s[0]) - if p not in context: - t = s - if len(t) > 18: - t = t[:15]+"..." - raise BER_Decoding_Error("Unknown prefix [%02x] for [%r]" % (p,t), remaining=s) - codec = context[p].get_codec(ASN1_Codecs.BER) - return codec.dec(s,context,safe) - - @classmethod - def dec(cls, s, context=None, safe=False): - if not safe: - return cls.do_dec(s, context, safe) - try: - return cls.do_dec(s, context, safe) - except BER_BadTag_Decoding_Error,e: - o,remain = BERcodec_Object.dec(e.remaining, context, safe) - return ASN1_BADTAG(o),remain - except BER_Decoding_Error, e: - return ASN1_DECODING_ERROR(s, exc=e),"" - except ASN1_Error, e: - return ASN1_DECODING_ERROR(s, exc=e),"" - - @classmethod - def safedec(cls, s, context=None): - return cls.dec(s, context, safe=True) - - - @classmethod - def enc(cls, s): - if type(s) is str: - return BERcodec_STRING.enc(s) - else: - return BERcodec_INTEGER.enc(int(s)) - - - -ASN1_Codecs.BER.register_stem(BERcodec_Object) - - -class BERcodec_INTEGER(BERcodec_Object): - tag = ASN1_Class_UNIVERSAL.INTEGER - @classmethod - def enc(cls, i): - s = [] - while 1: - s.append(i&0xff) - if -127 <= i < 0: - break - if 128 <= i <= 255: - s.append(0) - i >>= 8 - if not i: - break - s = map(chr, s) - s.append(BER_len_enc(len(s))) - s.append(chr(cls.tag)) - s.reverse() - return "".join(s) - @classmethod - def do_dec(cls, s, context=None, safe=False): - l,s,t = cls.check_type_check_len(s) - x = 0L - if s: - if ord(s[0])&0x80: # negative int - x = -1L - for c in s: - x <<= 8 - x |= ord(c) - return cls.asn1_object(x),t - - -class BERcodec_BOOLEAN(BERcodec_INTEGER): - tag = ASN1_Class_UNIVERSAL.BOOLEAN - -class BERcodec_ENUMERATED(BERcodec_INTEGER): - tag = ASN1_Class_UNIVERSAL.ENUMERATED - -class BERcodec_NULL(BERcodec_INTEGER): - tag = ASN1_Class_UNIVERSAL.NULL - @classmethod - def enc(cls, i): - if i == 0: - return chr(cls.tag)+"\0" - else: - return BERcodec_INTEGER.enc(i) - -class BERcodec_SEP(BERcodec_NULL): - tag = ASN1_Class_UNIVERSAL.SEP - -class BERcodec_STRING(BERcodec_Object): - tag = ASN1_Class_UNIVERSAL.STRING - @classmethod - def enc(cls,s): - return chr(cls.tag)+BER_len_enc(len(s))+s - @classmethod - def do_dec(cls, s, context=None, safe=False): - l,s,t = cls.check_type_check_len(s) - return cls.tag.asn1_object(s),t - -class BERcodec_BIT_STRING(BERcodec_STRING): - tag = ASN1_Class_UNIVERSAL.BIT_STRING - -class BERcodec_PRINTABLE_STRING(BERcodec_STRING): - tag = ASN1_Class_UNIVERSAL.PRINTABLE_STRING - -class BERcodec_T61_STRING (BERcodec_STRING): - tag = ASN1_Class_UNIVERSAL.T61_STRING - -class BERcodec_IA5_STRING(BERcodec_STRING): - tag = ASN1_Class_UNIVERSAL.IA5_STRING - -class BERcodec_NUMERIC_STRING(BERcodec_STRING): - tag = ASN1_Class_UNIVERSAL.NUMERIC_STRING - -class BERcodec_VIDEOTEX_STRING(BERcodec_STRING): - tag = ASN1_Class_UNIVERSAL.VIDEOTEX_STRING - -class BERcodec_IPADDRESS(BERcodec_STRING): - tag = ASN1_Class_UNIVERSAL.IPADDRESS - - @classmethod - def enc(cls, ipaddr_ascii): - try: - s = inet_aton(ipaddr_ascii) - except Exception: - raise BER_Encoding_Error("IPv4 address could not be encoded") - return chr(cls.tag)+BER_len_enc(len(s))+s - - @classmethod - def do_dec(cls, s, context=None, safe=False): - l,s,t = cls.check_type_check_len(s) - try: - ipaddr_ascii = inet_ntoa(s) - except Exception: - raise BER_Decoding_Error("IP address could not be decoded", decoded=obj) - return cls.asn1_object(ipaddr_ascii), t - -class BERcodec_UTC_TIME(BERcodec_STRING): - tag = ASN1_Class_UNIVERSAL.UTC_TIME - -class BERcodec_GENERALIZED_TIME(BERcodec_STRING): - tag = ASN1_Class_UNIVERSAL.GENERALIZED_TIME - -class BERcodec_TIME_TICKS(BERcodec_INTEGER): - tag = ASN1_Class_UNIVERSAL.TIME_TICKS - -class BERcodec_GAUGE32(BERcodec_INTEGER): - tag = ASN1_Class_UNIVERSAL.GAUGE32 - -class BERcodec_COUNTER32(BERcodec_INTEGER): - tag = ASN1_Class_UNIVERSAL.COUNTER32 - -class BERcodec_SEQUENCE(BERcodec_Object): - tag = ASN1_Class_UNIVERSAL.SEQUENCE - @classmethod - def enc(cls, l): - if type(l) is not str: - l = "".join(map(lambda x: x.enc(cls.codec), l)) - return chr(cls.tag)+BER_len_enc(len(l))+l - @classmethod - def do_dec(cls, s, context=None, safe=False): - if context is None: - context = cls.tag.context - l,st = cls.check_type_get_len(s) # we may have len(s) < l - s,t = st[:l],st[l:] - obj = [] - while s: - try: - o,s = BERcodec_Object.dec(s, context, safe) - except BER_Decoding_Error, err: - err.remaining += t - if err.decoded is not None: - obj.append(err.decoded) - err.decoded = obj - raise - obj.append(o) - if len(st) < l: - raise BER_Decoding_Error("Not enough bytes to decode sequence", decoded=obj) - return cls.asn1_object(obj),t - -class BERcodec_SET(BERcodec_SEQUENCE): - tag = ASN1_Class_UNIVERSAL.SET - - -class BERcodec_OID(BERcodec_Object): - tag = ASN1_Class_UNIVERSAL.OID - - @classmethod - def enc(cls, oid): - lst = [int(x) for x in oid.strip(".").split(".")] - if len(lst) >= 2: - lst[1] += 40*lst[0] - del(lst[0]) - s = "".join([BER_num_enc(k) for k in lst]) - return chr(cls.tag)+BER_len_enc(len(s))+s - @classmethod - def do_dec(cls, s, context=None, safe=False): - l,s,t = cls.check_type_check_len(s) - lst = [] - while s: - l,s = BER_num_dec(s) - lst.append(l) - if (len(lst) > 0): - lst.insert(0,lst[0]/40) - lst[1] %= 40 - return cls.asn1_object(".".join([str(k) for k in lst])), t - - diff --git a/scripts/external_libs/scapy-2.3.1/scapy/asn1/mib.py b/scripts/external_libs/scapy-2.3.1/scapy/asn1/mib.py deleted file mode 100644 index 8531fcf2..00000000 --- a/scripts/external_libs/scapy-2.3.1/scapy/asn1/mib.py +++ /dev/null @@ -1,147 +0,0 @@ -## This file is part of Scapy -## See http://www.secdev.org/projects/scapy for more informations -## Copyright (C) Philippe Biondi <phil@secdev.org> -## This program is published under a GPLv2 license - -""" -Management Information Base (MIB) parsing -""" - -import re -from glob import glob -from scapy.dadict import DADict,fixname -from scapy.config import conf -from scapy.utils import do_graph - -################# -## MIB parsing ## -################# - -_mib_re_integer = re.compile("^[0-9]+$") -_mib_re_both = re.compile("^([a-zA-Z_][a-zA-Z0-9_-]*)\(([0-9]+)\)$") -_mib_re_oiddecl = re.compile("$\s*([a-zA-Z0-9_-]+)\s+OBJECT([^:\{\}]|\{[^:]+\})+::=\s*\{([^\}]+)\}",re.M) -_mib_re_strings = re.compile('"[^"]*"') -_mib_re_comments = re.compile('--.*(\r|\n)') - -class MIBDict(DADict): - def _findroot(self, x): - if x.startswith("."): - x = x[1:] - if not x.endswith("."): - x += "." - max=0 - root="." - for k in self.keys(): - if x.startswith(self[k]+"."): - if max < len(self[k]): - max = len(self[k]) - root = k - return root, x[max:-1] - def _oidname(self, x): - root,remainder = self._findroot(x) - return root+remainder - def _oid(self, x): - xl = x.strip(".").split(".") - p = len(xl)-1 - while p >= 0 and _mib_re_integer.match(xl[p]): - p -= 1 - if p != 0 or xl[p] not in self: - return x - xl[p] = self[xl[p]] - return ".".join(xl[p:]) - def _make_graph(self, other_keys=[], **kargs): - nodes = [(k,self[k]) for k in self.keys()] - oids = [self[k] for k in self.keys()] - for k in other_keys: - if k not in oids: - nodes.append(self.oidname(k),k) - s = 'digraph "mib" {\n\trankdir=LR;\n\n' - for k,o in nodes: - s += '\t"%s" [ label="%s" ];\n' % (o,k) - s += "\n" - for k,o in nodes: - parent,remainder = self._findroot(o[:-1]) - remainder = remainder[1:]+o[-1] - if parent != ".": - parent = self[parent] - s += '\t"%s" -> "%s" [label="%s"];\n' % (parent, o,remainder) - s += "}\n" - do_graph(s, **kargs) - def __len__(self): - return len(self.keys()) - - -def mib_register(ident, value, the_mib, unresolved): - if ident in the_mib or ident in unresolved: - return ident in the_mib - resval = [] - not_resolved = 0 - for v in value: - if _mib_re_integer.match(v): - resval.append(v) - else: - v = fixname(v) - if v not in the_mib: - not_resolved = 1 - if v in the_mib: - v = the_mib[v] - elif v in unresolved: - v = unresolved[v] - if type(v) is list: - resval += v - else: - resval.append(v) - if not_resolved: - unresolved[ident] = resval - return False - else: - the_mib[ident] = resval - keys = unresolved.keys() - i = 0 - while i < len(keys): - k = keys[i] - if mib_register(k,unresolved[k], the_mib, {}): - del(unresolved[k]) - del(keys[i]) - i = 0 - else: - i += 1 - - return True - - -def load_mib(filenames): - the_mib = {'iso': ['1']} - unresolved = {} - for k in conf.mib.keys(): - mib_register(k, conf.mib[k].split("."), the_mib, unresolved) - - if type(filenames) is str: - filenames = [filenames] - for fnames in filenames: - for fname in glob(fnames): - f = open(fname) - text = f.read() - cleantext = " ".join(_mib_re_strings.split(" ".join(_mib_re_comments.split(text)))) - for m in _mib_re_oiddecl.finditer(cleantext): - gr = m.groups() - ident,oid = gr[0],gr[-1] - ident=fixname(ident) - oid = oid.split() - for i in range(len(oid)): - m = _mib_re_both.match(oid[i]) - if m: - oid[i] = m.groups()[1] - mib_register(ident, oid, the_mib, unresolved) - - newmib = MIBDict(_name="MIB") - for k,o in the_mib.iteritems(): - newmib[k]=".".join(o) - for k,o in unresolved.iteritems(): - newmib[k]=".".join(o) - - conf.mib=newmib - - - -conf.mib = MIBDict(_name="MIB") diff --git a/scripts/external_libs/scapy-2.3.1/scapy/asn1fields.py b/scripts/external_libs/scapy-2.3.1/scapy/asn1fields.py deleted file mode 100644 index 1a59bd50..00000000 --- a/scripts/external_libs/scapy-2.3.1/scapy/asn1fields.py +++ /dev/null @@ -1,330 +0,0 @@ -## This file is part of Scapy -## See http://www.secdev.org/projects/scapy for more informations -## Copyright (C) Philippe Biondi <phil@secdev.org> -## This program is published under a GPLv2 license - -""" -Classes that implement ASN.1 data structures. -""" - -from asn1.asn1 import * -from asn1.ber import * -from volatile import * -from base_classes import BasePacket - - -##################### -#### ASN1 Fields #### -##################### - -class ASN1F_badsequence(Exception): - pass - -class ASN1F_element: - pass - -class ASN1F_optionnal(ASN1F_element): - def __init__(self, field): - self._field=field - def __getattr__(self, attr): - return getattr(self._field,attr) - def dissect(self,pkt,s): - try: - return self._field.dissect(pkt,s) - except ASN1F_badsequence: - self._field.set_val(pkt,None) - return s - except BER_Decoding_Error: - self._field.set_val(pkt,None) - return s - def build(self, pkt): - if self._field.is_empty(pkt): - return "" - return self._field.build(pkt) - -class ASN1F_field(ASN1F_element): - holds_packets=0 - islist=0 - - ASN1_tag = ASN1_Class_UNIVERSAL.ANY - context=ASN1_Class_UNIVERSAL - - def __init__(self, name, default, context=None): - if context is not None: - self.context = context - self.name = name - self.default = default - - def i2repr(self, pkt, x): - return repr(x) - def i2h(self, pkt, x): - return x - def any2i(self, pkt, x): - return x - def m2i(self, pkt, x): - return self.ASN1_tag.get_codec(pkt.ASN1_codec).safedec(x, context=self.context) - def i2m(self, pkt, x): - if x is None: - x = 0 - if isinstance(x, ASN1_Object): - if ( self.ASN1_tag == ASN1_Class_UNIVERSAL.ANY - or x.tag == ASN1_Class_UNIVERSAL.RAW - or x.tag == ASN1_Class_UNIVERSAL.ERROR - or self.ASN1_tag == x.tag ): - return x.enc(pkt.ASN1_codec) - else: - raise ASN1_Error("Encoding Error: got %r instead of an %r for field [%s]" % (x, self.ASN1_tag, self.name)) - return self.ASN1_tag.get_codec(pkt.ASN1_codec).enc(x) - - def do_copy(self, x): - if hasattr(x, "copy"): - return x.copy() - if type(x) is list: - x = x[:] - for i in xrange(len(x)): - if isinstance(x[i], BasePacket): - x[i] = x[i].copy() - return x - - def build(self, pkt): - return self.i2m(pkt, getattr(pkt, self.name)) - - def set_val(self, pkt, val): - setattr(pkt, self.name, val) - def is_empty(self, pkt): - return getattr(pkt,self.name) is None - - def dissect(self, pkt, s): - v,s = self.m2i(pkt, s) - self.set_val(pkt, v) - return s - - def get_fields_list(self): - return [self] - - def __hash__(self): - return hash(self.name) - def __str__(self): - return self.name - def __eq__(self, other): - return self.name == other - def __repr__(self): - return self.name - def randval(self): - return RandInt() - - -class ASN1F_INTEGER(ASN1F_field): - ASN1_tag= ASN1_Class_UNIVERSAL.INTEGER - def randval(self): - return RandNum(-2**64, 2**64-1) - -class ASN1F_BOOLEAN(ASN1F_field): - ASN1_tag= ASN1_Class_UNIVERSAL.BOOLEAN - def randval(self): - return RandChoice(True,False) - -class ASN1F_NULL(ASN1F_INTEGER): - ASN1_tag= ASN1_Class_UNIVERSAL.NULL - -class ASN1F_SEP(ASN1F_NULL): - ASN1_tag= ASN1_Class_UNIVERSAL.SEP - -class ASN1F_enum_INTEGER(ASN1F_INTEGER): - def __init__(self, name, default, enum): - ASN1F_INTEGER.__init__(self, name, default) - i2s = self.i2s = {} - s2i = self.s2i = {} - if type(enum) is list: - keys = xrange(len(enum)) - else: - keys = enum.keys() - if filter(lambda x: type(x) is str, keys): - i2s,s2i = s2i,i2s - for k in keys: - i2s[k] = enum[k] - s2i[enum[k]] = k - def any2i_one(self, pkt, x): - if type(x) is str: - x = self.s2i[x] - return x - def i2repr_one(self, pkt, x): - return self.i2s.get(x, repr(x)) - - def any2i(self, pkt, x): - if type(x) is list: - return map(lambda z,pkt=pkt:self.any2i_one(pkt,z), x) - else: - return self.any2i_one(pkt,x) - def i2repr(self, pkt, x): - if type(x) is list: - return map(lambda z,pkt=pkt:self.i2repr_one(pkt,z), x) - else: - return self.i2repr_one(pkt,x) - -class ASN1F_ENUMERATED(ASN1F_enum_INTEGER): - ASN1_tag = ASN1_Class_UNIVERSAL.ENUMERATED - -class ASN1F_STRING(ASN1F_field): - ASN1_tag = ASN1_Class_UNIVERSAL.STRING - def randval(self): - return RandString(RandNum(0, 1000)) - -class ASN1F_PRINTABLE_STRING(ASN1F_STRING): - ASN1_tag = ASN1_Class_UNIVERSAL.PRINTABLE_STRING - -class ASN1F_BIT_STRING(ASN1F_STRING): - ASN1_tag = ASN1_Class_UNIVERSAL.BIT_STRING - -class ASN1F_IPADDRESS(ASN1F_STRING): - ASN1_tag = ASN1_Class_UNIVERSAL.IPADDRESS - -class ASN1F_TIME_TICKS(ASN1F_INTEGER): - ASN1_tag = ASN1_Class_UNIVERSAL.TIME_TICKS - -class ASN1F_UTC_TIME(ASN1F_STRING): - ASN1_tag = ASN1_Class_UNIVERSAL.UTC_TIME - -class ASN1F_GENERALIZED_TIME(ASN1F_STRING): - ASN1_tag = ASN1_Class_UNIVERSAL.GENERALIZED_TIME - -class ASN1F_OID(ASN1F_field): - ASN1_tag = ASN1_Class_UNIVERSAL.OID - def randval(self): - return RandOID() - -class ASN1F_SEQUENCE(ASN1F_field): - ASN1_tag = ASN1_Class_UNIVERSAL.SEQUENCE - def __init__(self, *seq, **kargs): - if "ASN1_tag" in kargs: - self.ASN1_tag = kargs["ASN1_tag"] - self.seq = seq - def __repr__(self): - return "<%s%r>" % (self.__class__.__name__,self.seq,) - def set_val(self, pkt, val): - for f in self.seq: - f.set_val(pkt,val) - def is_empty(self, pkt): - for f in self.seq: - if not f.is_empty(pkt): - return False - return True - def get_fields_list(self): - return reduce(lambda x,y: x+y.get_fields_list(), self.seq, []) - def build(self, pkt): - s = reduce(lambda x,y: x+y.build(pkt), self.seq, "") - return self.i2m(pkt, s) - def dissect(self, pkt, s): - codec = self.ASN1_tag.get_codec(pkt.ASN1_codec) - try: - i,s,remain = codec.check_type_check_len(s) - for obj in self.seq: - s = obj.dissect(pkt,s) - if s: - warning("Too many bytes to decode sequence: [%r]" % s) # XXX not reversible! - return remain - except ASN1_Error,e: - raise ASN1F_badsequence(e) - -class ASN1F_SET(ASN1F_SEQUENCE): - ASN1_tag = ASN1_Class_UNIVERSAL.SET - -class ASN1F_SEQUENCE_OF(ASN1F_SEQUENCE): - holds_packets = 1 - islist = 1 - def __init__(self, name, default, asn1pkt, ASN1_tag=0x30): - self.asn1pkt = asn1pkt - self.tag = chr(ASN1_tag) - self.name = name - self.default = default - def i2repr(self, pkt, i): - if i is None: - return [] - return i - def get_fields_list(self): - return [self] - def set_val(self, pkt, val): - ASN1F_field.set_val(self, pkt, val) - def is_empty(self, pkt): - return ASN1F_field.is_empty(self, pkt) - def build(self, pkt): - val = getattr(pkt, self.name) - if isinstance(val, ASN1_Object) and val.tag == ASN1_Class_UNIVERSAL.RAW: - s = val - elif val is None: - s = "" - else: - s = "".join(map(str, val )) - return self.i2m(pkt, s) - def dissect(self, pkt, s): - codec = self.ASN1_tag.get_codec(pkt.ASN1_codec) - i,s1,remain = codec.check_type_check_len(s) - lst = [] - while s1: - try: - p = self.asn1pkt(s1) - except ASN1F_badsequence,e: - lst.append(conf.raw_layer(s1)) - break - lst.append(p) - if conf.raw_layer in p: - s1 = p[conf.raw_layer].load - del(p[conf.raw_layer].underlayer.payload) - else: - break - self.set_val(pkt, lst) - return remain - def randval(self): - return fuzz(self.asn1pkt()) - def __repr__(self): - return "<%s %s>" % (self.__class__.__name__,self.name) - -class ASN1F_PACKET(ASN1F_field): - holds_packets = 1 - def __init__(self, name, default, cls): - ASN1F_field.__init__(self, name, default) - self.cls = cls - def i2m(self, pkt, x): - if x is None: - x = "" - return str(x) - def extract_packet(self, cls, x): - try: - c = cls(x) - except ASN1F_badsequence: - c = conf.raw_layer(x) - cpad = c.getlayer(conf.padding_layer) - x = "" - if cpad is not None: - x = cpad.load - del(cpad.underlayer.payload) - return c,x - def m2i(self, pkt, x): - return self.extract_packet(self.cls, x) - - -class ASN1F_CHOICE(ASN1F_PACKET): - ASN1_tag = ASN1_Class_UNIVERSAL.NONE - def __init__(self, name, default, *args): - self.name=name - self.choice = {} - for p in args: - self.choice[p.ASN1_root.ASN1_tag] = p -# self.context=context - self.default=default - def m2i(self, pkt, x): - if len(x) == 0: - return conf.raw_layer(),"" - raise ASN1_Error("ASN1F_CHOICE: got empty string") - if ord(x[0]) not in self.choice: - return conf.raw_layer(x),"" # XXX return RawASN1 packet ? Raise error - raise ASN1_Error("Decoding Error: choice [%i] not found in %r" % (ord(x[0]), self.choice.keys())) - - z = ASN1F_PACKET.extract_packet(self, self.choice[ord(x[0])], x) - return z - def randval(self): - return RandChoice(*map(lambda x:fuzz(x()), self.choice.values())) - - -# This import must come in last to avoid problems with cyclic dependencies -import packet diff --git a/scripts/external_libs/scapy-2.3.1/scapy/asn1packet.py b/scripts/external_libs/scapy-2.3.1/scapy/asn1packet.py deleted file mode 100644 index 4c476d2a..00000000 --- a/scripts/external_libs/scapy-2.3.1/scapy/asn1packet.py +++ /dev/null @@ -1,26 +0,0 @@ -## This file is part of Scapy -## See http://www.secdev.org/projects/scapy for more informations -## Copyright (C) Philippe Biondi <phil@secdev.org> -## This program is published under a GPLv2 license - -""" -Packet holding data in Abstract Syntax Notation (ASN.1). -""" - -from packet import * - -class ASN1_Packet(Packet): - ASN1_root = None - ASN1_codec = None - def init_fields(self): - flist = self.ASN1_root.get_fields_list() - self.do_init_fields(flist) - self.fields_desc = flist - def self_build(self): - if self.raw_packet_cache is not None: - return self.raw_packet_cache - return self.ASN1_root.build(self) - def do_dissect(self, x): - return self.ASN1_root.dissect(self, x) - - diff --git a/scripts/external_libs/scapy-2.3.1/scapy/automaton.py b/scripts/external_libs/scapy-2.3.1/scapy/automaton.py deleted file mode 100644 index 7502ac51..00000000 --- a/scripts/external_libs/scapy-2.3.1/scapy/automaton.py +++ /dev/null @@ -1,732 +0,0 @@ -## This file is part of Scapy -## See http://www.secdev.org/projects/scapy for more informations -## Copyright (C) Philippe Biondi <phil@secdev.org> -## This program is published under a GPLv2 license - -""" -Automata with states, transitions and actions. -""" - -from __future__ import with_statement -import types,itertools,time,os,sys,socket -from select import select -from collections import deque -import thread -from config import conf -from utils import do_graph -from error import log_interactive -from plist import PacketList -from data import MTU -from supersocket import SuperSocket - -class ObjectPipe: - def __init__(self): - self.rd,self.wr = os.pipe() - self.queue = deque() - def fileno(self): - return self.rd - def send(self, obj): - self.queue.append(obj) - os.write(self.wr,"X") - def recv(self, n=0): - os.read(self.rd,1) - return self.queue.popleft() - - -class Message: - def __init__(self, **args): - self.__dict__.update(args) - def __repr__(self): - return "<Message %s>" % " ".join("%s=%r"%(k,v) - for (k,v) in self.__dict__.iteritems() - if not k.startswith("_")) - -class _instance_state: - def __init__(self, instance): - self.im_self = instance.im_self - self.im_func = instance.im_func - self.im_class = instance.im_class - def __getattr__(self, attr): - return getattr(self.im_func, attr) - - def __call__(self, *args, **kargs): - return self.im_func(self.im_self, *args, **kargs) - def breaks(self): - return self.im_self.add_breakpoints(self.im_func) - def intercepts(self): - return self.im_self.add_interception_points(self.im_func) - def unbreaks(self): - return self.im_self.remove_breakpoints(self.im_func) - def unintercepts(self): - return self.im_self.remove_interception_points(self.im_func) - - -############## -## Automata ## -############## - -class ATMT: - STATE = "State" - ACTION = "Action" - CONDITION = "Condition" - RECV = "Receive condition" - TIMEOUT = "Timeout condition" - IOEVENT = "I/O event" - - class NewStateRequested(Exception): - def __init__(self, state_func, automaton, *args, **kargs): - self.func = state_func - self.state = state_func.atmt_state - self.initial = state_func.atmt_initial - self.error = state_func.atmt_error - self.final = state_func.atmt_final - Exception.__init__(self, "Request state [%s]" % self.state) - self.automaton = automaton - self.args = args - self.kargs = kargs - self.action_parameters() # init action parameters - def action_parameters(self, *args, **kargs): - self.action_args = args - self.action_kargs = kargs - return self - def run(self): - return self.func(self.automaton, *self.args, **self.kargs) - def __repr__(self): - return "NewStateRequested(%s)" % self.state - - @staticmethod - def state(initial=0,final=0,error=0): - def deco(f,initial=initial, final=final): - f.atmt_type = ATMT.STATE - f.atmt_state = f.func_name - f.atmt_initial = initial - f.atmt_final = final - f.atmt_error = error - def state_wrapper(self, *args, **kargs): - return ATMT.NewStateRequested(f, self, *args, **kargs) - - state_wrapper.func_name = "%s_wrapper" % f.func_name - state_wrapper.atmt_type = ATMT.STATE - state_wrapper.atmt_state = f.func_name - state_wrapper.atmt_initial = initial - state_wrapper.atmt_final = final - state_wrapper.atmt_error = error - state_wrapper.atmt_origfunc = f - return state_wrapper - return deco - @staticmethod - def action(cond, prio=0): - def deco(f,cond=cond): - if not hasattr(f,"atmt_type"): - f.atmt_cond = {} - f.atmt_type = ATMT.ACTION - f.atmt_cond[cond.atmt_condname] = prio - return f - return deco - @staticmethod - def condition(state, prio=0): - def deco(f, state=state): - f.atmt_type = ATMT.CONDITION - f.atmt_state = state.atmt_state - f.atmt_condname = f.func_name - f.atmt_prio = prio - return f - return deco - @staticmethod - def receive_condition(state, prio=0): - def deco(f, state=state): - f.atmt_type = ATMT.RECV - f.atmt_state = state.atmt_state - f.atmt_condname = f.func_name - f.atmt_prio = prio - return f - return deco - @staticmethod - def ioevent(state, name, prio=0, as_supersocket=None): - def deco(f, state=state): - f.atmt_type = ATMT.IOEVENT - f.atmt_state = state.atmt_state - f.atmt_condname = f.func_name - f.atmt_ioname = name - f.atmt_prio = prio - f.atmt_as_supersocket = as_supersocket - return f - return deco - @staticmethod - def timeout(state, timeout): - def deco(f, state=state, timeout=timeout): - f.atmt_type = ATMT.TIMEOUT - f.atmt_state = state.atmt_state - f.atmt_timeout = timeout - f.atmt_condname = f.func_name - return f - return deco - -class _ATMT_Command: - RUN = "RUN" - NEXT = "NEXT" - FREEZE = "FREEZE" - STOP = "STOP" - END = "END" - EXCEPTION = "EXCEPTION" - SINGLESTEP = "SINGLESTEP" - BREAKPOINT = "BREAKPOINT" - INTERCEPT = "INTERCEPT" - ACCEPT = "ACCEPT" - REPLACE = "REPLACE" - REJECT = "REJECT" - -class _ATMT_supersocket(SuperSocket): - def __init__(self, name, ioevent, automaton, proto, args, kargs): - self.name = name - self.ioevent = ioevent - self.proto = proto - self.spa,self.spb = socket.socketpair(socket.AF_UNIX, socket.SOCK_DGRAM) - kargs["external_fd"] = {ioevent:self.spb} - self.atmt = automaton(*args, **kargs) - self.atmt.runbg() - def fileno(self): - return self.spa.fileno() - def send(self, s): - if type(s) is not str: - s = str(s) - return self.spa.send(s) - def recv(self, n=MTU): - r = self.spa.recv(n) - if self.proto is not None: - r = self.proto(r) - return r - def close(self): - pass - -class _ATMT_to_supersocket: - def __init__(self, name, ioevent, automaton): - self.name = name - self.ioevent = ioevent - self.automaton = automaton - def __call__(self, proto, *args, **kargs): - return _ATMT_supersocket(self.name, self.ioevent, self.automaton, proto, args, kargs) - -class Automaton_metaclass(type): - def __new__(cls, name, bases, dct): - cls = super(Automaton_metaclass, cls).__new__(cls, name, bases, dct) - cls.states={} - cls.state = None - cls.recv_conditions={} - cls.conditions={} - cls.ioevents={} - cls.timeout={} - cls.actions={} - cls.initial_states=[] - cls.ionames = [] - cls.iosupersockets = [] - - members = {} - classes = [cls] - while classes: - c = classes.pop(0) # order is important to avoid breaking method overloading - classes += list(c.__bases__) - for k,v in c.__dict__.iteritems(): - if k not in members: - members[k] = v - - decorated = [v for v in members.itervalues() - if type(v) is types.FunctionType and hasattr(v, "atmt_type")] - - for m in decorated: - if m.atmt_type == ATMT.STATE: - s = m.atmt_state - cls.states[s] = m - cls.recv_conditions[s]=[] - cls.ioevents[s]=[] - cls.conditions[s]=[] - cls.timeout[s]=[] - if m.atmt_initial: - cls.initial_states.append(m) - elif m.atmt_type in [ATMT.CONDITION, ATMT.RECV, ATMT.TIMEOUT, ATMT.IOEVENT]: - cls.actions[m.atmt_condname] = [] - - for m in decorated: - if m.atmt_type == ATMT.CONDITION: - cls.conditions[m.atmt_state].append(m) - elif m.atmt_type == ATMT.RECV: - cls.recv_conditions[m.atmt_state].append(m) - elif m.atmt_type == ATMT.IOEVENT: - cls.ioevents[m.atmt_state].append(m) - cls.ionames.append(m.atmt_ioname) - if m.atmt_as_supersocket is not None: - cls.iosupersockets.append(m) - elif m.atmt_type == ATMT.TIMEOUT: - cls.timeout[m.atmt_state].append((m.atmt_timeout, m)) - elif m.atmt_type == ATMT.ACTION: - for c in m.atmt_cond: - cls.actions[c].append(m) - - - for v in cls.timeout.itervalues(): - v.sort(lambda (t1,f1),(t2,f2): cmp(t1,t2)) - v.append((None, None)) - for v in itertools.chain(cls.conditions.itervalues(), - cls.recv_conditions.itervalues(), - cls.ioevents.itervalues()): - v.sort(lambda c1,c2: cmp(c1.atmt_prio,c2.atmt_prio)) - for condname,actlst in cls.actions.iteritems(): - actlst.sort(lambda c1,c2: cmp(c1.atmt_cond[condname], c2.atmt_cond[condname])) - - for ioev in cls.iosupersockets: - setattr(cls, ioev.atmt_as_supersocket, _ATMT_to_supersocket(ioev.atmt_as_supersocket, ioev.atmt_ioname, cls)) - - return cls - - def graph(self, **kargs): - s = 'digraph "%s" {\n' % self.__class__.__name__ - - se = "" # Keep initial nodes at the begining for better rendering - for st in self.states.itervalues(): - if st.atmt_initial: - se = ('\t"%s" [ style=filled, fillcolor=blue, shape=box, root=true];\n' % st.atmt_state)+se - elif st.atmt_final: - se += '\t"%s" [ style=filled, fillcolor=green, shape=octagon ];\n' % st.atmt_state - elif st.atmt_error: - se += '\t"%s" [ style=filled, fillcolor=red, shape=octagon ];\n' % st.atmt_state - s += se - - for st in self.states.values(): - for n in st.atmt_origfunc.func_code.co_names+st.atmt_origfunc.func_code.co_consts: - if n in self.states: - s += '\t"%s" -> "%s" [ color=green ];\n' % (st.atmt_state,n) - - - for c,k,v in ([("purple",k,v) for k,v in self.conditions.items()]+ - [("red",k,v) for k,v in self.recv_conditions.items()]+ - [("orange",k,v) for k,v in self.ioevents.items()]): - for f in v: - for n in f.func_code.co_names+f.func_code.co_consts: - if n in self.states: - l = f.atmt_condname - for x in self.actions[f.atmt_condname]: - l += "\\l>[%s]" % x.func_name - s += '\t"%s" -> "%s" [label="%s", color=%s];\n' % (k,n,l,c) - for k,v in self.timeout.iteritems(): - for t,f in v: - if f is None: - continue - for n in f.func_code.co_names+f.func_code.co_consts: - if n in self.states: - l = "%s/%.1fs" % (f.atmt_condname,t) - for x in self.actions[f.atmt_condname]: - l += "\\l>[%s]" % x.func_name - s += '\t"%s" -> "%s" [label="%s",color=blue];\n' % (k,n,l) - s += "}\n" - return do_graph(s, **kargs) - - - -class Automaton: - __metaclass__ = Automaton_metaclass - - ## Methods to overload - def parse_args(self, debug=0, store=1, **kargs): - self.debug_level=debug - self.socket_kargs = kargs - self.store_packets = store - - def master_filter(self, pkt): - return True - - def my_send(self, pkt): - self.send_sock.send(pkt) - - - ## Utility classes and exceptions - class _IO_fdwrapper: - def __init__(self,rd,wr): - if rd is not None and type(rd) is not int: - rd = rd.fileno() - if wr is not None and type(wr) is not int: - wr = wr.fileno() - self.rd = rd - self.wr = wr - def fileno(self): - return self.rd - def read(self, n=65535): - return os.read(self.rd, n) - def write(self, msg): - return os.write(self.wr,msg) - def recv(self, n=65535): - return self.read(n) - def send(self, msg): - return self.write(msg) - - class _IO_mixer: - def __init__(self,rd,wr): - self.rd = rd - self.wr = wr - def fileno(self): - if type(self.rd) is int: - return self.rd - return self.rd.fileno() - def recv(self, n=None): - return self.rd.recv(n) - def read(self, n=None): - return self.rd.recv(n) - def send(self, msg): - return self.wr.send(msg) - def write(self, msg): - return self.wr.send(msg) - - - class AutomatonException(Exception): - def __init__(self, msg, state=None, result=None): - Exception.__init__(self, msg) - self.state = state - self.result = result - - class AutomatonError(AutomatonException): - pass - class ErrorState(AutomatonException): - pass - class Stuck(AutomatonException): - pass - class AutomatonStopped(AutomatonException): - pass - - class Breakpoint(AutomatonStopped): - pass - class Singlestep(AutomatonStopped): - pass - class InterceptionPoint(AutomatonStopped): - def __init__(self, msg, state=None, result=None, packet=None): - Automaton.AutomatonStopped.__init__(self, msg, state=state, result=result) - self.packet = packet - - class CommandMessage(AutomatonException): - pass - - - ## Services - def debug(self, lvl, msg): - if self.debug_level >= lvl: - log_interactive.debug(msg) - - def send(self, pkt): - if self.state.state in self.interception_points: - self.debug(3,"INTERCEPT: packet intercepted: %s" % pkt.summary()) - self.intercepted_packet = pkt - cmd = Message(type = _ATMT_Command.INTERCEPT, state=self.state, pkt=pkt) - self.cmdout.send(cmd) - cmd = self.cmdin.recv() - self.intercepted_packet = None - if cmd.type == _ATMT_Command.REJECT: - self.debug(3,"INTERCEPT: packet rejected") - return - elif cmd.type == _ATMT_Command.REPLACE: - pkt = cmd.pkt - self.debug(3,"INTERCEPT: packet replaced by: %s" % pkt.summary()) - elif cmd.type == _ATMT_Command.ACCEPT: - self.debug(3,"INTERCEPT: packet accepted") - else: - raise self.AutomatonError("INTERCEPT: unkown verdict: %r" % cmd.type) - self.my_send(pkt) - self.debug(3,"SENT : %s" % pkt.summary()) - self.packets.append(pkt.copy()) - - - ## Internals - def __init__(self, *args, **kargs): - external_fd = kargs.pop("external_fd",{}) - self.send_sock_class = kargs.pop("ll", conf.L3socket) - self.started = thread.allocate_lock() - self.threadid = None - self.breakpointed = None - self.breakpoints = set() - self.interception_points = set() - self.intercepted_packet = None - self.debug_level=0 - self.init_args=args - self.init_kargs=kargs - self.io = type.__new__(type, "IOnamespace",(),{}) - self.oi = type.__new__(type, "IOnamespace",(),{}) - self.cmdin = ObjectPipe() - self.cmdout = ObjectPipe() - self.ioin = {} - self.ioout = {} - for n in self.ionames: - extfd = external_fd.get(n) - if type(extfd) is not tuple: - extfd = (extfd,extfd) - ioin,ioout = extfd - if ioin is None: - ioin = ObjectPipe() - elif type(ioin) is not types.InstanceType: - ioin = self._IO_fdwrapper(ioin,None) - if ioout is None: - ioout = ObjectPipe() - elif type(ioout) is not types.InstanceType: - ioout = self._IO_fdwrapper(None,ioout) - - self.ioin[n] = ioin - self.ioout[n] = ioout - ioin.ioname = n - ioout.ioname = n - setattr(self.io, n, self._IO_mixer(ioout,ioin)) - setattr(self.oi, n, self._IO_mixer(ioin,ioout)) - - for stname in self.states: - setattr(self, stname, - _instance_state(getattr(self, stname))) - - self.parse_args(*args, **kargs) - - self.start() - - def __iter__(self): - return self - - def __del__(self): - self.stop() - - def _run_condition(self, cond, *args, **kargs): - try: - self.debug(5, "Trying %s [%s]" % (cond.atmt_type, cond.atmt_condname)) - cond(self,*args, **kargs) - except ATMT.NewStateRequested, state_req: - self.debug(2, "%s [%s] taken to state [%s]" % (cond.atmt_type, cond.atmt_condname, state_req.state)) - if cond.atmt_type == ATMT.RECV: - self.packets.append(args[0]) - for action in self.actions[cond.atmt_condname]: - self.debug(2, " + Running action [%s]" % action.func_name) - action(self, *state_req.action_args, **state_req.action_kargs) - raise - except Exception,e: - self.debug(2, "%s [%s] raised exception [%s]" % (cond.atmt_type, cond.atmt_condname, e)) - raise - else: - self.debug(2, "%s [%s] not taken" % (cond.atmt_type, cond.atmt_condname)) - - def _do_start(self, *args, **kargs): - - thread.start_new_thread(self._do_control, args, kargs) - - - def _do_control(self, *args, **kargs): - with self.started: - self.threadid = thread.get_ident() - - # Update default parameters - a = args+self.init_args[len(args):] - k = self.init_kargs.copy() - k.update(kargs) - self.parse_args(*a,**k) - - # Start the automaton - self.state=self.initial_states[0](self) - self.send_sock = self.send_sock_class() - self.listen_sock = conf.L2listen(**self.socket_kargs) - self.packets = PacketList(name="session[%s]"%self.__class__.__name__) - - singlestep = True - iterator = self._do_iter() - self.debug(3, "Starting control thread [tid=%i]" % self.threadid) - try: - while True: - c = self.cmdin.recv() - self.debug(5, "Received command %s" % c.type) - if c.type == _ATMT_Command.RUN: - singlestep = False - elif c.type == _ATMT_Command.NEXT: - singlestep = True - elif c.type == _ATMT_Command.FREEZE: - continue - elif c.type == _ATMT_Command.STOP: - break - while True: - state = iterator.next() - if isinstance(state, self.CommandMessage): - break - elif isinstance(state, self.Breakpoint): - c = Message(type=_ATMT_Command.BREAKPOINT,state=state) - self.cmdout.send(c) - break - if singlestep: - c = Message(type=_ATMT_Command.SINGLESTEP,state=state) - self.cmdout.send(c) - break - except StopIteration,e: - c = Message(type=_ATMT_Command.END, result=e.args[0]) - self.cmdout.send(c) - except Exception,e: - self.debug(3, "Transfering exception [%s] from tid=%i"% (e,self.threadid)) - m = Message(type = _ATMT_Command.EXCEPTION, exception=e, exc_info=sys.exc_info()) - self.cmdout.send(m) - self.debug(3, "Stopping control thread (tid=%i)"%self.threadid) - self.threadid = None - - def _do_iter(self): - while True: - try: - self.debug(1, "## state=[%s]" % self.state.state) - - # Entering a new state. First, call new state function - if self.state.state in self.breakpoints and self.state.state != self.breakpointed: - self.breakpointed = self.state.state - yield self.Breakpoint("breakpoint triggered on state %s" % self.state.state, - state = self.state.state) - self.breakpointed = None - state_output = self.state.run() - if self.state.error: - raise self.ErrorState("Reached %s: [%r]" % (self.state.state, state_output), - result=state_output, state=self.state.state) - if self.state.final: - raise StopIteration(state_output) - - if state_output is None: - state_output = () - elif type(state_output) is not list: - state_output = state_output, - - # Then check immediate conditions - for cond in self.conditions[self.state.state]: - self._run_condition(cond, *state_output) - - # If still there and no conditions left, we are stuck! - if ( len(self.recv_conditions[self.state.state]) == 0 and - len(self.ioevents[self.state.state]) == 0 and - len(self.timeout[self.state.state]) == 1 ): - raise self.Stuck("stuck in [%s]" % self.state.state, - state=self.state.state, result=state_output) - - # Finally listen and pay attention to timeouts - expirations = iter(self.timeout[self.state.state]) - next_timeout,timeout_func = expirations.next() - t0 = time.time() - - fds = [self.cmdin] - if len(self.recv_conditions[self.state.state]) > 0: - fds.append(self.listen_sock) - for ioev in self.ioevents[self.state.state]: - fds.append(self.ioin[ioev.atmt_ioname]) - while 1: - t = time.time()-t0 - if next_timeout is not None: - if next_timeout <= t: - self._run_condition(timeout_func, *state_output) - next_timeout,timeout_func = expirations.next() - if next_timeout is None: - remain = None - else: - remain = next_timeout-t - - self.debug(5, "Select on %r" % fds) - r,_,_ = select(fds,[],[],remain) - self.debug(5, "Selected %r" % r) - for fd in r: - self.debug(5, "Looking at %r" % fd) - if fd == self.cmdin: - yield self.CommandMessage("Received command message") - elif fd == self.listen_sock: - pkt = self.listen_sock.recv(MTU) - if pkt is not None: - if self.master_filter(pkt): - self.debug(3, "RECVD: %s" % pkt.summary()) - for rcvcond in self.recv_conditions[self.state.state]: - self._run_condition(rcvcond, pkt, *state_output) - else: - self.debug(4, "FILTR: %s" % pkt.summary()) - else: - self.debug(3, "IOEVENT on %s" % fd.ioname) - for ioevt in self.ioevents[self.state.state]: - if ioevt.atmt_ioname == fd.ioname: - self._run_condition(ioevt, fd, *state_output) - - except ATMT.NewStateRequested,state_req: - self.debug(2, "switching from [%s] to [%s]" % (self.state.state,state_req.state)) - self.state = state_req - yield state_req - - ## Public API - def add_interception_points(self, *ipts): - for ipt in ipts: - if hasattr(ipt,"atmt_state"): - ipt = ipt.atmt_state - self.interception_points.add(ipt) - - def remove_interception_points(self, *ipts): - for ipt in ipts: - if hasattr(ipt,"atmt_state"): - ipt = ipt.atmt_state - self.interception_points.discard(ipt) - - def add_breakpoints(self, *bps): - for bp in bps: - if hasattr(bp,"atmt_state"): - bp = bp.atmt_state - self.breakpoints.add(bp) - - def remove_breakpoints(self, *bps): - for bp in bps: - if hasattr(bp,"atmt_state"): - bp = bp.atmt_state - self.breakpoints.discard(bp) - - def start(self, *args, **kargs): - if not self.started.locked(): - self._do_start(*args, **kargs) - - def run(self, resume=None, wait=True): - if resume is None: - resume = Message(type = _ATMT_Command.RUN) - self.cmdin.send(resume) - if wait: - try: - c = self.cmdout.recv() - except KeyboardInterrupt: - self.cmdin.send(Message(type = _ATMT_Command.FREEZE)) - return - if c.type == _ATMT_Command.END: - return c.result - elif c.type == _ATMT_Command.INTERCEPT: - raise self.InterceptionPoint("packet intercepted", state=c.state.state, packet=c.pkt) - elif c.type == _ATMT_Command.SINGLESTEP: - raise self.Singlestep("singlestep state=[%s]"%c.state.state, state=c.state.state) - elif c.type == _ATMT_Command.BREAKPOINT: - raise self.Breakpoint("breakpoint triggered on state [%s]"%c.state.state, state=c.state.state) - elif c.type == _ATMT_Command.EXCEPTION: - raise c.exc_info[0],c.exc_info[1],c.exc_info[2] - - def runbg(self, resume=None, wait=False): - self.run(resume, wait) - - def next(self): - return self.run(resume = Message(type=_ATMT_Command.NEXT)) - - def stop(self): - self.cmdin.send(Message(type=_ATMT_Command.STOP)) - with self.started: - # Flush command pipes - while True: - r,_,_ = select([self.cmdin, self.cmdout],[],[],0) - if not r: - break - for fd in r: - fd.recv() - - def restart(self, *args, **kargs): - self.stop() - self.start(*args, **kargs) - - def accept_packet(self, pkt=None, wait=False): - rsm = Message() - if pkt is None: - rsm.type = _ATMT_Command.ACCEPT - else: - rsm.type = _ATMT_Command.REPLACE - rsm.pkt = pkt - return self.run(resume=rsm, wait=wait) - - def reject_packet(self, wait=False): - rsm = Message(type = _ATMT_Command.REJECT) - return self.run(resume=rsm, wait=wait) - - - diff --git a/scripts/external_libs/scapy-2.3.1/scapy/autorun.py b/scripts/external_libs/scapy-2.3.1/scapy/autorun.py deleted file mode 100644 index a4534949..00000000 --- a/scripts/external_libs/scapy-2.3.1/scapy/autorun.py +++ /dev/null @@ -1,142 +0,0 @@ -## This file is part of Scapy -## See http://www.secdev.org/projects/scapy for more informations -## Copyright (C) Philippe Biondi <phil@secdev.org> -## This program is published under a GPLv2 license - -""" -Run commands when the Scapy interpreter starts. -""" - -import code,sys -from config import conf -from themes import * -from error import Scapy_Exception -from utils import tex_escape - - -######################### -##### Autorun stuff ##### -######################### - -class StopAutorun(Scapy_Exception): - code_run = "" - -class ScapyAutorunInterpreter(code.InteractiveInterpreter): - def __init__(self, *args, **kargs): - code.InteractiveInterpreter.__init__(self, *args, **kargs) - self.error = 0 - def showsyntaxerror(self, *args, **kargs): - self.error = 1 - return code.InteractiveInterpreter.showsyntaxerror(self, *args, **kargs) - def showtraceback(self, *args, **kargs): - self.error = 1 - exc_type, exc_value, exc_tb = sys.exc_info() - if isinstance(exc_value, StopAutorun): - raise exc_value - return code.InteractiveInterpreter.showtraceback(self, *args, **kargs) - - -def autorun_commands(cmds,my_globals=None,verb=0): - sv = conf.verb - import __builtin__ - try: - try: - if my_globals is None: - my_globals = __import__("scapy.all").all.__dict__ - conf.verb = verb - interp = ScapyAutorunInterpreter(my_globals) - cmd = "" - cmds = cmds.splitlines() - cmds.append("") # ensure we finish multiline commands - cmds.reverse() - __builtin__.__dict__["_"] = None - while 1: - if cmd: - sys.stderr.write(sys.__dict__.get("ps2","... ")) - else: - sys.stderr.write(str(sys.__dict__.get("ps1",ColorPrompt()))) - - l = cmds.pop() - print l - cmd += "\n"+l - if interp.runsource(cmd): - continue - if interp.error: - return 0 - cmd = "" - if len(cmds) <= 1: - break - except SystemExit: - pass - finally: - conf.verb = sv - return _ - -def autorun_get_interactive_session(cmds, **kargs): - class StringWriter: - def __init__(self): - self.s = "" - def write(self, x): - self.s += x - - sw = StringWriter() - sstdout,sstderr = sys.stdout,sys.stderr - try: - try: - sys.stdout = sys.stderr = sw - res = autorun_commands(cmds, **kargs) - except StopAutorun,e: - e.code_run = sw.s - raise - finally: - sys.stdout,sys.stderr = sstdout,sstderr - return sw.s,res - -def autorun_get_text_interactive_session(cmds, **kargs): - ct = conf.color_theme - try: - conf.color_theme = NoTheme() - s,res = autorun_get_interactive_session(cmds, **kargs) - finally: - conf.color_theme = ct - return s,res - -def autorun_get_ansi_interactive_session(cmds, **kargs): - ct = conf.color_theme - try: - conf.color_theme = DefaultTheme() - s,res = autorun_get_interactive_session(cmds, **kargs) - finally: - conf.color_theme = ct - return s,res - -def autorun_get_html_interactive_session(cmds, **kargs): - ct = conf.color_theme - to_html = lambda s: s.replace("<","<").replace(">",">").replace("#[#","<").replace("#]#",">") - try: - try: - conf.color_theme = HTMLTheme2() - s,res = autorun_get_interactive_session(cmds, **kargs) - except StopAutorun,e: - e.code_run = to_html(e.code_run) - raise - finally: - conf.color_theme = ct - - return to_html(s),res - -def autorun_get_latex_interactive_session(cmds, **kargs): - ct = conf.color_theme - to_latex = lambda s: tex_escape(s).replace("@[@","{").replace("@]@","}").replace("@`@","\\") - try: - try: - conf.color_theme = LatexTheme2() - s,res = autorun_get_interactive_session(cmds, **kargs) - except StopAutorun,e: - e.code_run = to_latex(e.code_run) - raise - finally: - conf.color_theme = ct - return to_latex(s),res - - diff --git a/scripts/external_libs/scapy-2.3.1/scapy/base_classes.py b/scripts/external_libs/scapy-2.3.1/scapy/base_classes.py deleted file mode 100644 index e54428a2..00000000 --- a/scripts/external_libs/scapy-2.3.1/scapy/base_classes.py +++ /dev/null @@ -1,236 +0,0 @@ -## This file is part of Scapy -## See http://www.secdev.org/projects/scapy for more informations -## Copyright (C) Philippe Biondi <phil@secdev.org> -## This program is published under a GPLv2 license - -""" -Generators and packet meta classes. -""" - -############### -## Generators ## -################ - -import re,random,socket -import config -import error - -class Gen(object): - def __iter__(self): - return iter([]) - -class SetGen(Gen): - def __init__(self, set, _iterpacket=1): - self._iterpacket=_iterpacket - if type(set) is list: - self.set = set - elif isinstance(set, BasePacketList): - self.set = list(set) - else: - self.set = [set] - def transf(self, element): - return element - def __iter__(self): - for i in self.set: - if (type(i) is tuple) and (len(i) == 2) and type(i[0]) is int and type(i[1]) is int: - if (i[0] <= i[1]): - j=i[0] - while j <= i[1]: - yield j - j += 1 - elif isinstance(i, Gen) and (self._iterpacket or not isinstance(i,BasePacket)): - for j in i: - yield j - else: - yield i - def __repr__(self): - return "<SetGen %s>" % self.set.__repr__() - -class Net(Gen): - """Generate a list of IPs from a network address or a name""" - name = "ip" - ipaddress = re.compile(r"^(\*|[0-2]?[0-9]?[0-9](-[0-2]?[0-9]?[0-9])?)\.(\*|[0-2]?[0-9]?[0-9](-[0-2]?[0-9]?[0-9])?)\.(\*|[0-2]?[0-9]?[0-9](-[0-2]?[0-9]?[0-9])?)\.(\*|[0-2]?[0-9]?[0-9](-[0-2]?[0-9]?[0-9])?)(/[0-3]?[0-9])?$") - - @staticmethod - def _parse_digit(a,netmask): - netmask = min(8,max(netmask,0)) - if a == "*": - a = (0,256) - elif a.find("-") >= 0: - x,y = map(int,a.split("-")) - if x > y: - y = x - a = (x & (0xffL<<netmask) , max(y, (x | (0xffL>>(8-netmask))))+1) - else: - a = (int(a) & (0xffL<<netmask),(int(a) | (0xffL>>(8-netmask)))+1) - return a - - @classmethod - def _parse_net(cls, net): - tmp=net.split('/')+["32"] - if not cls.ipaddress.match(net): - tmp[0]=socket.gethostbyname(tmp[0]) - netmask = int(tmp[1]) - return map(lambda x,y: cls._parse_digit(x,y), tmp[0].split("."), map(lambda x,nm=netmask: x-nm, (8,16,24,32))),netmask - - def __init__(self, net): - self.repr=net - self.parsed,self.netmask = self._parse_net(net) - - - - def __iter__(self): - for d in xrange(*self.parsed[3]): - for c in xrange(*self.parsed[2]): - for b in xrange(*self.parsed[1]): - for a in xrange(*self.parsed[0]): - yield "%i.%i.%i.%i" % (a,b,c,d) - def choice(self): - ip = [] - for v in self.parsed: - ip.append(str(random.randint(v[0],v[1]-1))) - return ".".join(ip) - - def __repr__(self): - return "Net(%r)" % self.repr - def __eq__(self, other): - if hasattr(other, "parsed"): - p2 = other.parsed - else: - p2,nm2 = self._parse_net(other) - return self.parsed == p2 - def __contains__(self, other): - if hasattr(other, "parsed"): - p2 = other.parsed - else: - p2,nm2 = self._parse_net(other) - for (a1,b1),(a2,b2) in zip(self.parsed,p2): - if a1 > a2 or b1 < b2: - return False - return True - def __rcontains__(self, other): - return self in self.__class__(other) - - -class OID(Gen): - name = "OID" - def __init__(self, oid): - self.oid = oid - self.cmpt = [] - fmt = [] - for i in oid.split("."): - if "-" in i: - fmt.append("%i") - self.cmpt.append(tuple(map(int, i.split("-")))) - else: - fmt.append(i) - self.fmt = ".".join(fmt) - def __repr__(self): - return "OID(%r)" % self.oid - def __iter__(self): - ii = [k[0] for k in self.cmpt] - while 1: - yield self.fmt % tuple(ii) - i = 0 - while 1: - if i >= len(ii): - raise StopIteration - if ii[i] < self.cmpt[i][1]: - ii[i]+=1 - break - else: - ii[i] = self.cmpt[i][0] - i += 1 - - - -###################################### -## Packet abstract and base classes ## -###################################### - -class Packet_metaclass(type): - def __new__(cls, name, bases, dct): - if "fields_desc" in dct: # perform resolution of references to other packets - current_fld = dct["fields_desc"] - resolved_fld = [] - for f in current_fld: - if isinstance(f, Packet_metaclass): # reference to another fields_desc - for f2 in f.fields_desc: - resolved_fld.append(f2) - else: - resolved_fld.append(f) - else: # look for a field_desc in parent classes - resolved_fld = None - for b in bases: - if hasattr(b,"fields_desc"): - resolved_fld = b.fields_desc - break - - if resolved_fld: # perform default value replacements - final_fld = [] - for f in resolved_fld: - if f.name in dct: - f = f.copy() - f.default = dct[f.name] - del(dct[f.name]) - final_fld.append(f) - - dct["fields_desc"] = final_fld - - newcls = super(Packet_metaclass, cls).__new__(cls, name, bases, dct) - if hasattr(newcls,"register_variant"): - newcls.register_variant() - for f in newcls.fields_desc: - f.register_owner(newcls) - config.conf.layers.register(newcls) - return newcls - - def __getattr__(self, attr): - for k in self.fields_desc: - if k.name == attr: - return k - raise AttributeError(attr) - - def __call__(cls, *args, **kargs): - if "dispatch_hook" in cls.__dict__: - cls = cls.dispatch_hook(*args, **kargs) - i = cls.__new__(cls, cls.__name__, cls.__bases__, cls.__dict__) - i.__init__(*args, **kargs) - return i - - -class NewDefaultValues(Packet_metaclass): - """NewDefaultValues is deprecated (not needed anymore) - - remove this: - __metaclass__ = NewDefaultValues - and it should still work. - """ - def __new__(cls, name, bases, dct): - from error import log_loading - import traceback - try: - for tb in traceback.extract_stack()+[("??",-1,None,"")]: - f,l,_,line = tb - if line.startswith("class"): - break - except: - f,l="??",-1 - raise - log_loading.warning("Deprecated (no more needed) use of NewDefaultValues (%s l. %i)." % (f,l)) - - return super(NewDefaultValues, cls).__new__(cls, name, bases, dct) - -class BasePacket(Gen): - pass - - -############################# -## Packet list base classe ## -############################# - -class BasePacketList: - pass - - - diff --git a/scripts/external_libs/scapy-2.3.1/scapy/config.py b/scripts/external_libs/scapy-2.3.1/scapy/config.py deleted file mode 100644 index 816e8a18..00000000 --- a/scripts/external_libs/scapy-2.3.1/scapy/config.py +++ /dev/null @@ -1,388 +0,0 @@ -## This file is part of Scapy -## See http://www.secdev.org/projects/scapy for more informations -## Copyright (C) Philippe Biondi <phil@secdev.org> -## This program is published under a GPLv2 license - -""" -Implementation for of the configuration object. -""" - -import os,time,socket,sys -from data import * -import base_classes -import themes -from error import log_scapy - -############ -## Config ## -############ - -class ConfClass(object): - def configure(self, cnf): - self.__dict__ = cnf.__dict__.copy() - def __repr__(self): - return str(self) - def __str__(self): - s="" - keys = self.__class__.__dict__.copy() - keys.update(self.__dict__) - keys = keys.keys() - keys.sort() - for i in keys: - if i[0] != "_": - r = repr(getattr(self, i)) - r = " ".join(r.split()) - wlen = 76-max(len(i),10) - if len(r) > wlen: - r = r[:wlen-3]+"..." - s += "%-10s = %s\n" % (i, r) - return s[:-1] - -class Interceptor(object): - def __init__(self, name, default, hook, args=None, kargs=None): - self.name = name - self.intname = "_intercepted_%s" % name - self.default=default - self.hook = hook - self.args = args if args is not None else [] - self.kargs = kargs if kargs is not None else {} - def __get__(self, obj, typ=None): - if not hasattr(obj, self.intname): - setattr(obj, self.intname, self.default) - return getattr(obj, self.intname) - def __set__(self, obj, val): - setattr(obj, self.intname, val) - self.hook(self.name, val, *self.args, **self.kargs) - - -class ProgPath(ConfClass): - pdfreader = "acroread" - psreader = "gv" - dot = "dot" - display = "display" - tcpdump = "tcpdump" - tcpreplay = "tcpreplay" - hexedit = "hexer" - wireshark = "wireshark" - - -class ConfigFieldList: - def __init__(self): - self.fields = set() - self.layers = set() - @staticmethod - def _is_field(f): - return hasattr(f, "owners") - def _recalc_layer_list(self): - self.layers = set([owner for f in self.fields for owner in f.owners]) - def add(self, *flds): - self.fields |= set([f for f in flds if self._is_field(f)]) - self._recalc_layer_list() - def remove(self, *flds): - self.fields -= set(flds) - self._recalc_layer_list() - def __contains__(self, elt): - if isinstance(elt, base_classes.Packet_metaclass): - return elt in self.layers - return elt in self.fields - def __repr__(self): - return "<%s [%s]>" % (self.__class__.__name__," ".join(str(x) for x in self.fields)) - -class Emphasize(ConfigFieldList): - pass - -class Resolve(ConfigFieldList): - pass - - -class Num2Layer: - def __init__(self): - self.num2layer = {} - self.layer2num = {} - - def register(self, num, layer): - self.register_num2layer(num, layer) - self.register_layer2num(num, layer) - - def register_num2layer(self, num, layer): - self.num2layer[num] = layer - def register_layer2num(self, num, layer): - self.layer2num[layer] = num - - def __getitem__(self, item): - if isinstance(item, base_classes.Packet_metaclass): - return self.layer2num[item] - return self.num2layer[item] - def __contains__(self, item): - if isinstance(item, base_classes.Packet_metaclass): - return item in self.layer2num - return item in self.num2layer - def get(self, item, default=None): - if item in self: - return self[item] - return default - - def __repr__(self): - lst = [] - for num,layer in self.num2layer.iteritems(): - if layer in self.layer2num and self.layer2num[layer] == num: - dir = "<->" - else: - dir = " ->" - lst.append((num,"%#6x %s %-20s (%s)" % (num,dir,layer.__name__,layer.name))) - for layer,num in self.layer2num.iteritems(): - if num not in self.num2layer or self.num2layer[num] != layer: - lst.append((num,"%#6x <- %-20s (%s)" % (num,layer.__name__,layer.name))) - lst.sort() - return "\n".join(y for x,y in lst) - - -class LayersList(list): - def __repr__(self): - s=[] - for l in self: - s.append("%-20s: %s" % (l.__name__,l.name)) - return "\n".join(s) - def register(self, layer): - self.append(layer) - -class CommandsList(list): - def __repr__(self): - s=[] - for l in sorted(self,key=lambda x:x.__name__): - if l.__doc__: - doc = l.__doc__.split("\n")[0] - else: - doc = "--" - s.append("%-20s: %s" % (l.__name__,doc)) - return "\n".join(s) - def register(self, cmd): - self.append(cmd) - return cmd # return cmd so that method can be used as a decorator - -def lsc(): - print repr(conf.commands) - -class CacheInstance(dict): - def __init__(self, name="noname", timeout=None): - self.timeout = timeout - self.name = name - self._timetable = {} - def __getitem__(self, item): - val = dict.__getitem__(self,item) - if self.timeout is not None: - t = self._timetable[item] - if time.time()-t > self.timeout: - raise KeyError(item) - return val - def get(self, item, default=None): - # overloading this method is needed to force the dict to go through - # the timetable check - try: - return self[item] - except KeyError: - return default - def __setitem__(self, item, v): - self._timetable[item] = time.time() - dict.__setitem__(self, item,v) - def update(self, other): - dict.update(self, other) - self._timetable.update(other._timetable) - def iteritems(self): - if self.timeout is None: - return dict.iteritems(self) - t0=time.time() - return ((k,v) for (k,v) in dict.iteritems(self) if t0-self._timetable[k] < self.timeout) - def iterkeys(self): - if self.timeout is None: - return dict.iterkeys(self) - t0=time.time() - return (k for k in dict.iterkeys(self) if t0-self._timetable[k] < self.timeout) - def __iter__(self): - return self.iterkeys() - def itervalues(self): - if self.timeout is None: - return dict.itervalues(self) - t0=time.time() - return (v for (k,v) in dict.iteritems(self) if t0-self._timetable[k] < self.timeout) - def items(self): - if self.timeout is None: - return dict.items(self) - t0=time.time() - return [(k,v) for (k,v) in dict.iteritems(self) if t0-self._timetable[k] < self.timeout] - def keys(self): - if self.timeout is None: - return dict.keys(self) - t0=time.time() - return [k for k in dict.iterkeys(self) if t0-self._timetable[k] < self.timeout] - def values(self): - if self.timeout is None: - return dict.values(self) - t0=time.time() - return [v for (k,v) in dict.iteritems(self) if t0-self._timetable[k] < self.timeout] - def __len__(self): - if self.timeout is None: - return dict.__len__(self) - return len(self.keys()) - def summary(self): - return "%s: %i valid items. Timeout=%rs" % (self.name, len(self), self.timeout) - def __repr__(self): - s = [] - if self: - mk = max(len(k) for k in self.iterkeys()) - fmt = "%%-%is %%s" % (mk+1) - for item in self.iteritems(): - s.append(fmt % item) - return "\n".join(s) - - - - -class NetCache: - def __init__(self): - self._caches_list = [] - - - def add_cache(self, cache): - self._caches_list.append(cache) - setattr(self,cache.name,cache) - def new_cache(self, name, timeout=None): - c = CacheInstance(name=name, timeout=timeout) - self.add_cache(c) - def __delattr__(self, attr): - raise AttributeError("Cannot delete attributes") - def update(self, other): - for co in other._caches_list: - if hasattr(self, co.name): - getattr(self,co.name).update(co) - else: - self.add_cache(co.copy()) - def flush(self): - for c in self._caches_list: - c.flush() - def __repr__(self): - return "\n".join(c.summary() for c in self._caches_list) - - -class LogLevel(object): - def __get__(self, obj, otype): - return obj._logLevel - def __set__(self,obj,val): - log_scapy.setLevel(val) - obj._logLevel = val - - - -def _prompt_changer(attr,val): - prompt = conf.prompt - try: - ct = val - if isinstance(ct, AnsiColorTheme) and ct.prompt(""): - ## ^A and ^B delimit invisible caracters for readline to count right. - ## And we need ct.prompt() to do change something or else ^A and ^B will be - ## displayed - prompt = "\001%s\002" % ct.prompt("\002"+prompt+"\001") - else: - prompt = ct.prompt(prompt) - except: - pass - sys.ps1 = prompt - -class Conf(ConfClass): - """This object contains the configuration of scapy. -session : filename where the session will be saved -interactive_shell : If set to "ipython", use IPython as shell. Default: Python -stealth : if 1, prevents any unwanted packet to go out (ARP, DNS, ...) -checkIPID: if 0, doesn't check that IPID matches between IP sent and ICMP IP citation received - if 1, checks that they either are equal or byte swapped equals (bug in some IP stacks) - if 2, strictly checks that they are equals -checkIPsrc: if 1, checks IP src in IP and ICMP IP citation match (bug in some NAT stacks) -check_TCPerror_seqack: if 1, also check that TCP seq and ack match the ones in ICMP citation -iff : selects the default output interface for srp() and sendp(). default:"eth0") -verb : level of verbosity, from 0 (almost mute) to 3 (verbose) -promisc : default mode for listening socket (to get answers if you spoof on a lan) -sniff_promisc : default mode for sniff() -filter : bpf filter added to every sniffing socket to exclude traffic from analysis -histfile : history file -padding : includes padding in desassembled packets -except_filter : BPF filter for packets to ignore -debug_match : when 1, store received packet that are not matched into debug.recv -route : holds the Scapy routing table and provides methods to manipulate it -warning_threshold : how much time between warnings from the same place -ASN1_default_codec: Codec used by default for ASN1 objects -mib : holds MIB direct access dictionnary -resolve : holds list of fields for which resolution should be done -noenum : holds list of enum fields for which conversion to string should NOT be done -AS_resolver: choose the AS resolver class to use -extensions_paths: path or list of paths where extensions are to be looked for -""" - version = "2.3.1" - session = "" - interactive = False - interactive_shell = "" - stealth = "not implemented" - iface = None - readfunc = None - layers = LayersList() - commands = CommandsList() - logLevel = LogLevel() - checkIPID = 0 - checkIPsrc = 1 - checkIPaddr = 1 - check_TCPerror_seqack = 0 - verb = 2 - prompt = ">>> " - promisc = 1 - sniff_promisc = 1 - raw_layer = None - raw_summary = False - default_l2 = None - l2types = Num2Layer() - l3types = Num2Layer() - L3socket = None - L2socket = None - L2listen = None - histfile = os.path.join(os.path.expanduser("~"), ".scapy_history") - padding = 1 - except_filter = "" - debug_match = 0 - wepkey = "" - route = None # Filed by route.py - route6 = None # Filed by route6.py - auto_fragment = 1 - debug_dissector = 0 - color_theme = Interceptor("color_theme", themes.NoTheme(), _prompt_changer) - warning_threshold = 5 - prog = ProgPath() - resolve = Resolve() - noenum = Resolve() - emph = Emphasize() - use_pcap = False - use_dnet = False - ipv6_enabled = socket.has_ipv6 - ethertypes = ETHER_TYPES - protocols = IP_PROTOS - services_tcp = TCP_SERVICES - services_udp = UDP_SERVICES - extensions_paths = "." - manufdb = MANUFDB - stats_classic_protocols = [] - stats_dot11_protocols = [] - temp_files = [] - netcache = NetCache() - load_layers = ["l2", "inet", "dhcp", "dns", "dot11", "gprs", "hsrp", "inet6", "ir", "isakmp", "l2tp", - "mgcp", "mobileip", "netbios", "netflow", "ntp", "ppp", "radius", "rip", "rtp", - "sebek", "skinny", "smb", "snmp", "tftp", "x509", "bluetooth", "dhcp6", "llmnr", "sctp", "vrrp", - "ipsec" ] - - -if not Conf.ipv6_enabled: - log_scapy.warning("IPv6 support disabled in Python. Cannot load scapy IPv6 layers.") - for m in ["inet6","dhcp6"]: - if m in Conf.load_layers: - Conf.load_layers.remove(m) - - -conf=Conf() -conf.logLevel=30 # 30=Warning - diff --git a/scripts/external_libs/scapy-2.3.1/scapy/contrib/__init__.py b/scripts/external_libs/scapy-2.3.1/scapy/contrib/__init__.py deleted file mode 100644 index 99654377..00000000 --- a/scripts/external_libs/scapy-2.3.1/scapy/contrib/__init__.py +++ /dev/null @@ -1,8 +0,0 @@ -## This file is part of Scapy -## See http://www.secdev.org/projects/scapy for more informations -## Copyright (C) Philippe Biondi <phil@secdev.org> -## This program is published under a GPLv2 license - -""" -Package of contrib modules that have to be loaded explicitly. -""" diff --git a/scripts/external_libs/scapy-2.3.1/scapy/contrib/avs.py b/scripts/external_libs/scapy-2.3.1/scapy/contrib/avs.py deleted file mode 100644 index 461b94b8..00000000 --- a/scripts/external_libs/scapy-2.3.1/scapy/contrib/avs.py +++ /dev/null @@ -1,57 +0,0 @@ -#! /usr/bin/env python - -# http://trac.secdev.org/scapy/ticket/82 - -# scapy.contrib.description = AVS WLAN Monitor Header -# scapy.contrib.status = loads - -from scapy.packet import * -from scapy.fields import * -from scapy.layers.dot11 import * - -AVSWLANPhyType = { 0 : "Unknown", - 1 : "FHSS 802.11 '97", - 2 : "DSSS 802.11 '97", - 3 : "IR Baseband", - 4 : "DSSS 802.11b", - 5 : "PBCC 802.11b", - 6 : "OFDM 802.11g", - 7 : "PBCC 802.11g", - 8 : "OFDM 802.11a" } - -AVSWLANEncodingType = { 0 : "Unknown", - 1 : "CCK", - 2 : "PBCC", - 3 : "OFDM"} - -AVSWLANSSIType = { 0 : "None", - 1 : "Normalized RSSI", - 2 : "dBm", - 3 : "Raw RSSI"} - -AVSWLANPreambleType = { 0 : "Unknown", - 1 : "Short", - 2 : "Long" } - - -class AVSWLANHeader(Packet): - """ iwpriv eth1 set_prismhdr 1 """ - name = "AVS WLAN Monitor Header" - fields_desc = [ IntField("version",1), - IntField("len",64), - LongField("mactime",0), - LongField("hosttime",0), - IntEnumField("phytype",0, AVSWLANPhyType), - IntField("channel",0), - IntField("datarate",0), - IntField("antenna",0), - IntField("priority",0), - IntEnumField("ssi_type",0, AVSWLANSSIType), - SignedIntField("ssi_signal",0), - SignedIntField("ssi_noise",0), - IntEnumField("preamble",0, AVSWLANPreambleType), - IntEnumField("encoding",0, AVSWLANEncodingType), - ] - -bind_layers(AVSWLANHeader, Dot11) - diff --git a/scripts/external_libs/scapy-2.3.1/scapy/contrib/bgp.py b/scripts/external_libs/scapy-2.3.1/scapy/contrib/bgp.py deleted file mode 100644 index 525dac5f..00000000 --- a/scripts/external_libs/scapy-2.3.1/scapy/contrib/bgp.py +++ /dev/null @@ -1,168 +0,0 @@ -#! /usr/bin/env python - -# http://trac.secdev.org/scapy/ticket/162 - -# scapy.contrib.description = BGP -# scapy.contrib.status = loads - -from scapy.packet import * -from scapy.fields import * -from scapy.layers.inet import TCP - - -class BGPIPField(Field): - """Represents how bgp dose an ip prefix in (length, prefix)""" - def mask2iplen(self,mask): - """turn the mask into the length in bytes of the ip field""" - return (mask + 7) // 8 - def h2i(self, pkt, h): - """human x.x.x.x/y to internal""" - ip,mask = re.split( '/', h) - return int(mask), ip - def i2h( self, pkt, i): - mask, ip = i - return ip + '/' + str( mask ) - def i2repr( self, pkt, i): - """make it look nice""" - return self.i2h(pkt,i) - def i2len(self, pkt, i): - """rely on integer division""" - mask, ip = i - return self.mask2iplen(mask) + 1 - def i2m(self, pkt, i): - """internal (ip as bytes, mask as int) to machine""" - mask, ip = i - ip = inet_aton( ip ) - return struct.pack(">B",mask) + ip[:self.mask2iplen(mask)] - def addfield(self, pkt, s, val): - return s+self.i2m(pkt, val) - def getfield(self, pkt, s): - l = self.mask2iplen( struct.unpack(">B",s[0])[0] ) + 1 - return s[l:], self.m2i(pkt,s[:l]) - def m2i(self,pkt,m): - mask = struct.unpack(">B",m[0])[0] - ip = "".join( [ m[i + 1] if i < self.mask2iplen(mask) else '\x00' for i in range(4)] ) - return (mask,inet_ntoa(ip)) - -class BGPHeader(Packet): - """The first part of any BGP packet""" - name = "BGP header" - fields_desc = [ - XBitField("marker",0xffffffffffffffffffffffffffffffff, 0x80 ), - ShortField("len", None), - ByteEnumField("type", 4, {0:"none", 1:"open",2:"update",3:"notification",4:"keep_alive"}), - ] - def post_build(self, p, pay): - if self.len is None and pay: - l = len(p) + len(pay) - p = p[:16]+struct.pack("!H", l)+p[18:] - return p+pay - -class BGPOptionalParameter(Packet): - """Format of optional Parameter for BGP Open""" - name = "BGP Optional Parameters" - fields_desc = [ - ByteField("type", 2), - ByteField("len", None), - StrLenField("value", "", length_from = lambda x: x.len), - ] - def post_build(self,p,pay): - if self.len is None: - l = len(p) - 2 # 2 is length without value - p = p[:1]+struct.pack("!B", l)+p[2:] - return p+pay - def extract_padding(self, p): - """any thing after this packet is extracted is padding""" - return "",p - -class BGPOpen(Packet): - """ Opens a new BGP session""" - name = "BGP Open Header" - fields_desc = [ - ByteField("version", 4), - ShortField("AS", 0), - ShortField("hold_time", 0), - IPField("bgp_id","0.0.0.0"), - ByteField("opt_parm_len", None), - PacketListField("opt_parm",[], BGPOptionalParameter, length_from=lambda p:p.opt_parm_len), - ] - def post_build(self, p, pay): - if self.opt_parm_len is None: - l = len(p) - 10 # 10 is regular length with no additional options - p = p[:9] + struct.pack("!B",l) +p[10:] - return p+pay - -class BGPAuthenticationData(Packet): - name = "BGP Authentication Data" - fields_desc = [ - ByteField("AuthenticationCode", 0), - ByteField("FormMeaning", 0), - FieldLenField("Algorithm", 0), - ] - -class BGPPathAttribute(Packet): - "the attribute of total path" - name = "BGP Attribute fields" - fields_desc = [ - FlagsField("flags", 0x40, 8, ["NA0","NA1","NA2","NA3","Extended-Length","Partial","Transitive","Optional"]), #Extened leght may not work - ByteEnumField("type", 1, {1:"ORIGIN", 2:"AS_PATH", 3:"NEXT_HOP", 4:"MULTI_EXIT_DISC", 5:"LOCAL_PREF", 6:"ATOMIC_AGGREGATE", 7:"AGGREGATOR"}), - ByteField("attr_len", None), - StrLenField("value", "", length_from = lambda p: p.attr_len), - ] - def post_build(self, p, pay): - if self.attr_len is None: - l = len(p) - 3 # 3 is regular length with no additional options - p = p[:2] + struct.pack("!B",l) +p[3:] - return p+pay - def extract_padding(self, p): - """any thing after this packet is extracted is padding""" - return "",p - -class BGPUpdate(Packet): - """Update the routes WithdrawnRoutes = UnfeasiableRoutes""" - name = "BGP Update fields" - fields_desc = [ - ShortField("withdrawn_len", None), - FieldListField("withdrawn",[], BGPIPField("","0.0.0.0/0"), length_from=lambda p:p.withdrawn_len), - ShortField("tp_len", None), - PacketListField("total_path", [], BGPPathAttribute, length_from = lambda p: p.tp_len), - FieldListField("nlri",[], BGPIPField("","0.0.0.0/0"), length_from=lambda p:p.underlayer.len - 23 - p.tp_len - p.withdrawn_len), # len should be BGPHeader.len - ] - def post_build(self,p,pay): - wl = self.withdrawn_len - subpacklen = lambda p: len ( str( p )) - subfieldlen = lambda p: BGPIPField("", "0.0.0.0/0").i2len(self, p ) - if wl is None: - wl = sum ( map ( subfieldlen , self.withdrawn)) - p = p[:0]+struct.pack("!H", wl)+p[2:] - if self.tp_len is None: - l = sum ( map ( subpacklen , self.total_path)) - p = p[:2+wl]+struct.pack("!H", l)+p[4+wl:] - return p+pay - -class BGPNotification(Packet): - name = "BGP Notification fields" - fields_desc = [ - ByteEnumField("ErrorCode",0,{1:"Message Header Error",2:"OPEN Message Error",3:"UPDATE Messsage Error",4:"Hold Timer Expired",5:"Finite State Machine",6:"Cease"}), - ByteEnumField("ErrorSubCode",0,{1:"MessageHeader",2:"OPENMessage",3:"UPDATEMessage"}), - LongField("Data", 0), - ] - -class BGPErrorSubcodes(Packet): - name = "BGP Error Subcodes" - Fields_desc = [ - ByteEnumField("MessageHeader",0,{1:"Connection Not Synchronized",2:"Bad Message Length",3:"Bad Messsage Type"}), - ByteEnumField("OPENMessage",0,{1:"Unsupported Version Number",2:"Bad Peer AS",3:"Bad BGP Identifier",4:"Unsupported Optional Parameter",5:"Authentication Failure",6:"Unacceptable Hold Time"}), - ByteEnumField("UPDATEMessage",0,{1:"Malformed Attribute List",2:"Unrecognized Well-Known Attribute",3:"Missing Well-Known Attribute",4:"Attribute Flags Error",5:"Attribute Length Error",6:"Invalid ORIGIN Attribute",7:"AS Routing Loop",8:"Invalid NEXT_HOP Attribute",9:"Optional Attribute Error",10:"Invalid Network Field",11:"Malformed AS_PATH"}), - ] - -bind_layers( TCP, BGPHeader, dport=179) -bind_layers( TCP, BGPHeader, sport=179) -bind_layers( BGPHeader, BGPOpen, type=1) -bind_layers( BGPHeader, BGPUpdate, type=2) -bind_layers( BGPHeader, BGPHeader, type=4) - - -if __name__ == "__main__": - interact(mydict=globals(), mybanner="BGP addon .05") - diff --git a/scripts/external_libs/scapy-2.3.1/scapy/contrib/carp.py b/scripts/external_libs/scapy-2.3.1/scapy/contrib/carp.py deleted file mode 100644 index e785adef..00000000 --- a/scripts/external_libs/scapy-2.3.1/scapy/contrib/carp.py +++ /dev/null @@ -1,65 +0,0 @@ - -# scapy.contrib.description = CARP -# scapy.contrib.status = loads - -from scapy.packet import * -from scapy.layers.inet import IP -from scapy.fields import BitField, ByteField, XShortField, IntField, XIntField -from scapy.utils import checksum -import struct, hmac, hashlib - -class CARP(Packet): - name = "CARP" - fields_desc = [ BitField("version", 4, 4), - BitField("type", 4, 4), - ByteField("vhid", 1), - ByteField("advskew", 0), - ByteField("authlen", 0), - ByteField("demotion", 0), - ByteField("advbase", 0), - XShortField("chksum", 0), - XIntField("counter1", 0), - XIntField("counter2", 0), - XIntField("hmac1", 0), - XIntField("hmac2", 0), - XIntField("hmac3", 0), - XIntField("hmac4", 0), - XIntField("hmac5", 0) - ] - - def post_build(self, pkt, pay): - if self.chksum == None: - pkt = pkt[:6] + struct.pack("!H", checksum(pkt)) + pkt[8:] - - return pkt - -def build_hmac_sha1(pkt, pw = '\0' * 20, ip4l = [], ip6l = []): - if not pkt.haslayer(CARP): - return None - - p = pkt[CARP] - h = hmac.new(pw, digestmod = hashlib.sha1) - # XXX: this is a dirty hack. it needs to pack version and type into a single 8bit field - h.update('\x21') - # XXX: mac addy if different from special link layer. comes before vhid - h.update(struct.pack('!B', p.vhid)) - - sl = [] - for i in ip4l: - # sort ips from smallest to largest - sl.append(inet_aton(i)) - sl.sort() - - for i in sl: - h.update(i) - - # XXX: do ip6l sorting - - return h.digest() - -""" -XXX: Usually CARP is multicast to 224.0.0.18 but because of virtual setup, it'll -be unicast between nodes. Uncomment the following line for normal use -bind_layers(IP, CARP, proto=112, dst='224.0.0.18') -""" -bind_layers(IP, CARP, proto=112) diff --git a/scripts/external_libs/scapy-2.3.1/scapy/contrib/cdp.py b/scripts/external_libs/scapy-2.3.1/scapy/contrib/cdp.py deleted file mode 100644 index 12794c7b..00000000 --- a/scripts/external_libs/scapy-2.3.1/scapy/contrib/cdp.py +++ /dev/null @@ -1,306 +0,0 @@ -#! /usr/bin/env python - -# scapy.contrib.description = Cisco Discovery Protocol -# scapy.contrib.status = loads - -############################################################################# -## ## -## cdp.py --- Cisco Discovery Protocol (CDP) extension for Scapy ## -## ## -## Copyright (C) 2006 Nicolas Bareil <nicolas.bareil AT eads DOT net> ## -## Arnaud Ebalard <arnaud.ebalard AT eads DOT net> ## -## EADS/CRC security team ## -## ## -## This program is free software; you can redistribute it and/or modify it ## -## under the terms of the GNU General Public License version 2 as ## -## published by the Free Software Foundation; version 2. ## -## ## -## This program is distributed in the hope that it will be useful, but ## -## WITHOUT ANY WARRANTY; without even the implied warranty of ## -## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU ## -## General Public License for more details. ## -## ## -############################################################################# - -from scapy.packet import * -from scapy.fields import * -from scapy.layers.inet6 import * - - -##################################################################### -# Helpers and constants -##################################################################### - -# CDP TLV classes keyed by type -_cdp_tlv_cls = { 0x0001: "CDPMsgDeviceID", - 0x0002: "CDPMsgAddr", - 0x0003: "CDPMsgPortID", - 0x0004: "CDPMsgCapabilities", - 0x0005: "CDPMsgSoftwareVersion", - 0x0006: "CDPMsgPlatform", - 0x0007: "CDPMsgIPPrefix", - 0x0008: "CDPMsgProtoHello", - 0x0009: "CDPMsgVTPMgmtDomain", # CDPv2 - 0x000a: "CDPMsgNativeVLAN", # CDPv2 - 0x000b: "CDPMsgDuplex", # -# 0x000c: "CDPMsgGeneric", -# 0x000d: "CDPMsgGeneric", - 0x000e: "CDPMsgVoIPVLANReply", - 0x000f: "CDPMsgVoIPVLANQuery", - 0x0010: "CDPMsgPower", - 0x0011: "CDPMsgMTU", -# 0x0012: "CDPMsgTrustBitmap", -# 0x0013: "CDPMsgUntrustedPortCoS", -# 0x0014: "CDPMsgSystemName", -# 0x0015: "CDPMsgSystemOID", - 0x0016: "CDPMsgMgmtAddr", -# 0x0017: "CDPMsgLocation", - 0x0019: "CDPMsgUnknown19", -# 0x001a: "CDPPowerAvailable" - } - -_cdp_tlv_types = { 0x0001: "Device ID", - 0x0002: "Addresses", - 0x0003: "Port ID", - 0x0004: "Capabilities", - 0x0005: "Software Version", - 0x0006: "Platform", - 0x0007: "IP Prefix", - 0x0008: "Protocol Hello", - 0x0009: "VTP Mangement Domain", # CDPv2 - 0x000a: "Native VLAN", # CDPv2 - 0x000b: "Duplex", # - 0x000c: "CDP Unknown command (send us a pcap file)", - 0x000d: "CDP Unknown command (send us a pcap file)", - 0x000e: "VoIP VLAN Reply", - 0x000f: "VoIP VLAN Query", - 0x0010: "Power", - 0x0011: "MTU", - 0x0012: "Trust Bitmap", - 0x0013: "Untrusted Port CoS", - 0x0014: "System Name", - 0x0015: "System OID", - 0x0016: "Management Address", - 0x0017: "Location", - 0x0018: "CDP Unknown command (send us a pcap file)", - 0x0019: "CDP Unknown command (send us a pcap file)", - 0x001a: "Power Available"} - -def _CDPGuessPayloadClass(p, **kargs): - cls = conf.raw_layer - if len(p) >= 2: - t = struct.unpack("!H", p[:2])[0] - clsname = _cdp_tlv_cls.get(t, "CDPMsgGeneric") - cls = globals()[clsname] - - return cls(p, **kargs) - -class CDPMsgGeneric(Packet): - name = "CDP Generic Message" - fields_desc = [ XShortEnumField("type", None, _cdp_tlv_types), - FieldLenField("len", None, "val", "!H"), - StrLenField("val", "", length_from=lambda x:x.len - 4) ] - - - def guess_payload_class(self, p): - return conf.padding_layer # _CDPGuessPayloadClass - -class CDPMsgDeviceID(CDPMsgGeneric): - name = "Device ID" - type = 0x0001 - -_cdp_addr_record_ptype = {0x01: "NLPID", 0x02: "802.2"} -_cdp_addrrecord_proto_ip = "\xcc" -_cdp_addrrecord_proto_ipv6 = "\xaa\xaa\x03\x00\x00\x00\x86\xdd" - -class CDPAddrRecord(Packet): - name = "CDP Address" - fields_desc = [ ByteEnumField("ptype", 0x01, _cdp_addr_record_ptype), - FieldLenField("plen", None, "proto", "B"), - StrLenField("proto", None, length_from=lambda x:x.plen), - FieldLenField("addrlen", None, length_of=lambda x:x.addr), - StrLenField("addr", None, length_from=lambda x:x.addrlen)] - - def guess_payload_class(self, p): - return conf.padding_layer - -class CDPAddrRecordIPv4(CDPAddrRecord): - name = "CDP Address IPv4" - fields_desc = [ ByteEnumField("ptype", 0x01, _cdp_addr_record_ptype), - FieldLenField("plen", 1, "proto", "B"), - StrLenField("proto", _cdp_addrrecord_proto_ip, length_from=lambda x:x.plen), - ShortField("addrlen", 4), - IPField("addr", "0.0.0.0")] - -class CDPAddrRecordIPv6(CDPAddrRecord): - name = "CDP Address IPv6" - fields_desc = [ ByteEnumField("ptype", 0x02, _cdp_addr_record_ptype), - FieldLenField("plen", 8, "proto", "B"), - StrLenField("proto", _cdp_addrrecord_proto_ipv6, length_from=lambda x:x.plen), - ShortField("addrlen", 16), - IP6Field("addr", "::1")] - -def _CDPGuessAddrRecord(p, **kargs): - cls = conf.raw_layer - if len(p) >= 2: - plen = struct.unpack("B", p[1])[0] - proto = ''.join(struct.unpack("s" * plen, p[2:plen + 2])[0:plen]) - - if proto == _cdp_addrrecord_proto_ip: - clsname = "CDPAddrRecordIPv4" - elif proto == _cdp_addrrecord_proto_ipv6: - clsname = "CDPAddrRecordIPv6" - else: - clsname = "CDPAddrRecord" - - cls = globals()[clsname] - - return cls(p, **kargs) - -class CDPMsgAddr(CDPMsgGeneric): - name = "Addresses" - fields_desc = [ XShortEnumField("type", 0x0002, _cdp_tlv_types), - ShortField("len", None), - FieldLenField("naddr", None, "addr", "!I"), - PacketListField("addr", [], _CDPGuessAddrRecord, count_from=lambda x:x.naddr) ] - - def post_build(self, pkt, pay): - if self.len is None: - l = 8 + len(self.addr) * 9 - pkt = pkt[:2] + struct.pack("!H", l) + pkt[4:] - p = pkt + pay - return p - -class CDPMsgPortID(CDPMsgGeneric): - name = "Port ID" - fields_desc = [ XShortEnumField("type", 0x0003, _cdp_tlv_types), - FieldLenField("len", None, "iface", "!H"), - StrLenField("iface", "Port 1", length_from=lambda x:x.len - 4) ] - - -_cdp_capabilities = [ "Router", - "TransparentBridge", - "SourceRouteBridge", - "Switch", - "Host", - "IGMPCapable", - "Repeater"] + map(lambda x: "Bit%d" % x, range(25,0,-1)) - - -class CDPMsgCapabilities(CDPMsgGeneric): - name = "Capabilities" - fields_desc = [ XShortEnumField("type", 0x0004, _cdp_tlv_types), - ShortField("len", 8), - FlagsField("cap", 0, 32, _cdp_capabilities) ] - - -class CDPMsgSoftwareVersion(CDPMsgGeneric): - name = "Software Version" - type = 0x0005 - - -class CDPMsgPlatform(CDPMsgGeneric): - name = "Platform" - type = 0x0006 - -_cdp_duplex = { 0x00: "Half", 0x01: "Full" } - -# ODR Routing -class CDPMsgIPPrefix(CDPMsgGeneric): - name = "IP Prefix" - type = 0x0007 - fields_desc = [ XShortEnumField("type", 0x0007, _cdp_tlv_types), - ShortField("len", 8), - IPField("defaultgw", "192.168.0.1") ] - -# TODO : Do me !!!!!! 0x0008 -class CDPMsgProtoHello(CDPMsgGeneric): - name = "Protocol Hello" - type = 0x0008 - -class CDPMsgVTPMgmtDomain(CDPMsgGeneric): - name = "VTP Management Domain" - type = 0x0009 - -class CDPMsgNativeVLAN(CDPMsgGeneric): - name = "Native VLAN" - fields_desc = [ XShortEnumField("type", 0x000a, _cdp_tlv_types), - ShortField("len", 6), - ShortField("vlan", 1) ] - -class CDPMsgDuplex(CDPMsgGeneric): - name = "Duplex" - fields_desc = [ XShortEnumField("type", 0x000b, _cdp_tlv_types), - ShortField("len", 5), - ByteEnumField("duplex", 0x00, _cdp_duplex) ] - -class CDPMsgVoIPVLANReply(CDPMsgGeneric): - name = "VoIP VLAN Reply" - fields_desc = [ XShortEnumField("type", 0x000e, _cdp_tlv_types), - ShortField("len", 7), - ByteField("status?", 1), - ShortField("vlan", 1)] - - -# TODO : Do me !!! 0x000F -class CDPMsgVoIPVLANQuery(CDPMsgGeneric): - name = "VoIP VLAN Query" - type = 0x000f - -# fields_desc = [XShortEnumField("type", 0x000f, _cdp_tlv_types), -# FieldLenField("len", None, "val", "!H") ] - - -class _CDPPowerField(ShortField): - def i2repr(self, pkt, x): - if x is None: - x = 0 - return "%d mW" % x - - -class CDPMsgPower(CDPMsgGeneric): - name = "Power" - # Check if field length is fixed (2 bytes) - fields_desc = [ XShortEnumField("type", 0x0010, _cdp_tlv_types), - ShortField("len", 6), - _CDPPowerField("power", 1337)] - - -class CDPMsgMTU(CDPMsgGeneric): - name = "MTU" - # Check if field length is fixed (2 bytes) - fields_desc = [ XShortEnumField("type", 0x0011, _cdp_tlv_types), - ShortField("len", 6), - ShortField("mtu", 1500)] - -class CDPMsgMgmtAddr(CDPMsgAddr): - name = "Management Address" - type = 0x0016 - -class CDPMsgUnknown19(CDPMsgGeneric): - name = "Unknown CDP Message" - type = 0x0019 - -class CDPMsg(CDPMsgGeneric): - name = "CDP " - fields_desc = [ XShortEnumField("type", None, _cdp_tlv_types), - FieldLenField("len", None, "val", "!H"), - StrLenField("val", "", length_from=lambda x:x.len - 4) ] - -class _CDPChecksum: - def post_build(self, pkt, pay): - p = pkt + pay - if self.cksum is None: - cksum = checksum(p) - p = p[:2] + struct.pack("!H", cksum) + p[4:] - return p - -class CDPv2_HDR(_CDPChecksum, CDPMsgGeneric): - name = "Cisco Discovery Protocol version 2" - fields_desc = [ ByteField("vers", 2), - ByteField("ttl", 180), - XShortField("cksum", None), - PacketListField("msg", [], _CDPGuessPayloadClass) ] - -bind_layers(SNAP, CDPv2_HDR, {"code": 0x2000, "OUI": 0xC}) - diff --git a/scripts/external_libs/scapy-2.3.1/scapy/contrib/chdlc.py b/scripts/external_libs/scapy-2.3.1/scapy/contrib/chdlc.py deleted file mode 100644 index 6e483762..00000000 --- a/scripts/external_libs/scapy-2.3.1/scapy/contrib/chdlc.py +++ /dev/null @@ -1,42 +0,0 @@ -# http://trac.secdev.org/scapy/ticket/88 - -# scapy.contrib.description = Cisco HDLC and SLARP -# scapy.contrib.status = loads - -# This layer is based on information from http://www.nethelp.no/net/cisco-hdlc.txt - -from scapy.packet import * -from scapy.fields import * -from scapy.layers.l2 import * -from scapy.layers.inet import * -from scapy.layers.inet6 import * - -class CHDLC(Packet): - name = "Cisco HDLC" - fields_desc = [ ByteEnumField("address", 0x0f, {0x0f : "unicast", 0x8f :"multicast"}), - ByteField("control", 0), - XShortField("proto", 0x0800)] - -class SLARP(Packet): - name = "SLARP" - fields_desc = [ IntEnumField("type", 2, {0 : "request", 1 : "reply", 2 :"line keepalive"}), - ConditionalField(IPField("address", "192.168.0.1"), - lambda pkt : pkt.type == 0 or pkt.type == 1), - ConditionalField(IPField("mask", "255.255.255.0"), - lambda pkt : pkt.type == 0 or pkt.type == 1), - ConditionalField(XShortField("unused", 0), - lambda pkt : pkt.type == 0 or pkt.type == 1), - ConditionalField(IntField("mysequence", 0), - lambda pkt : pkt.type == 2), - ConditionalField(IntField("yoursequence", 0), - lambda pkt : pkt.type == 2), - ConditionalField(XShortField("reliability", 0xffff), - lambda pkt : pkt.type == 2)] - -bind_layers( CHDLC, Dot3, proto=0x6558) -bind_layers( CHDLC, IP, proto=0x800) -bind_layers( CHDLC, IPv6, proto=0x86dd) -bind_layers( CHDLC, SLARP, proto=0x8035) -bind_layers( CHDLC, STP, proto=0x4242) - -conf.l2types.register(104, CHDLC) diff --git a/scripts/external_libs/scapy-2.3.1/scapy/contrib/dtp.py b/scripts/external_libs/scapy-2.3.1/scapy/contrib/dtp.py deleted file mode 100644 index 294350bc..00000000 --- a/scripts/external_libs/scapy-2.3.1/scapy/contrib/dtp.py +++ /dev/null @@ -1,115 +0,0 @@ -#!/usr/bin/env python - -# scapy.contrib.description = DTP -# scapy.contrib.status = loads - -""" - DTP Scapy Extension - ~~~~~~~~~~~~~~~~~~~ - - :version: 2008-12-22 - :author: Jochen Bartl <lobo@c3a.de> - - :Thanks: - - - TLV code derived from the CDP implementation of scapy. (Thanks to Nicolas Bareil and Arnaud Ebalard) - http://trac.secdev.org/scapy/ticket/18 -""" - -from scapy.packet import * -from scapy.fields import * -from scapy.layers.l2 import SNAP,Dot3,LLC -from scapy.sendrecv import sendp - -class DtpGenericTlv(Packet): - name = "DTP Generic TLV" - fields_desc = [ XShortField("type", 0x0001), - FieldLenField("length", None, length_of=lambda pkt:pkt.value + 4), - StrLenField("value", "", length_from=lambda pkt:pkt.length - 4) - ] - - def guess_payload_class(self, p): - return conf.padding_layer - -class RepeatedTlvListField(PacketListField): - def __init__(self, name, default, cls): - PacketField.__init__(self, name, default, cls) - - def getfield(self, pkt, s): - lst = [] - remain = s - while len(remain) > 0: - p = self.m2i(pkt,remain) - if conf.padding_layer in p: - pad = p[conf.padding_layer] - remain = pad.load - del(pad.underlayer.payload) - else: - remain = "" - lst.append(p) - return remain,lst - - def addfield(self, pkt, s, val): - return s+reduce(str.__add__, map(str, val),"") - -_DTP_TLV_CLS = { - 0x0001 : "DTPDomain", - 0x0002 : "DTPStatus", - 0x0003 : "DTPType", - 0x0004 : "DTPNeighbor" - } - -class DTPDomain(DtpGenericTlv): - name = "DTP Domain" - fields_desc = [ ShortField("type", 1), - FieldLenField("length", None, "domain", adjust=lambda pkt,x:x + 4), - StrLenField("domain", "\x00", length_from=lambda pkt:pkt.length - 4) - ] - -class DTPStatus(DtpGenericTlv): - name = "DTP Status" - fields_desc = [ ShortField("type", 2), - FieldLenField("length", None, "status", adjust=lambda pkt,x:x + 4), - StrLenField("status", "\x03", length_from=lambda pkt:pkt.length - 4) - ] - -class DTPType(DtpGenericTlv): - name = "DTP Type" - fields_desc = [ ShortField("type", 3), - FieldLenField("length", None, "dtptype", adjust=lambda pkt,x:x + 4), - StrLenField("dtptype", "\xa5", length_from=lambda pkt:pkt.length - 4) - ] - -class DTPNeighbor(DtpGenericTlv): - name = "DTP Neighbor" - fields_desc = [ ShortField("type", 4), - #FieldLenField("length", None, "neighbor", adjust=lambda pkt,x:x + 4), - ShortField("len", 10), - MACField("neighbor", None) - ] - -def _DTPGuessPayloadClass(p, **kargs): - cls = conf.raw_layer - if len(p) >= 2: - t = struct.unpack("!H", p[:2])[0] - clsname = _DTP_TLV_CLS.get(t, "DtpGenericTlv") - cls = globals()[clsname] - return cls(p, **kargs) - -class DTP(Packet): - name = "DTP" - fields_desc = [ ByteField("ver", 1), - RepeatedTlvListField("tlvlist", [], _DTPGuessPayloadClass) - ] - -bind_layers(SNAP, DTP, code=0x2004, OUI=0xc) - - -def negotiate_trunk(iface=conf.iface, mymac=str(RandMAC())): - print "Trying to negotiate a trunk on interface %s" % iface - p = Dot3(src=mymac, dst="01:00:0c:cc:cc:cc")/LLC()/SNAP()/DTP(tlvlist=[DTPDomain(),DTPStatus(),DTPType(),DTPNeighbor(neighbor=mymac)]) - sendp(p) - -if __name__ == "__main__": - from scapy.main import interact - interact(mydict=globals(), mybanner="DTP") diff --git a/scripts/external_libs/scapy-2.3.1/scapy/contrib/eigrp.py b/scripts/external_libs/scapy-2.3.1/scapy/contrib/eigrp.py deleted file mode 100644 index 73b4ce02..00000000 --- a/scripts/external_libs/scapy-2.3.1/scapy/contrib/eigrp.py +++ /dev/null @@ -1,488 +0,0 @@ -#!/usr/bin/env python - -# scapy.contrib.description = EIGRP -# scapy.contrib.status = loads - -""" - EIGRP Scapy Extension - ~~~~~~~~~~~~~~~~~~~~~ - - :version: 2009-08-13 - :copyright: 2009 by Jochen Bartl - :e-mail: lobo@c3a.de / jochen.bartl@gmail.com - :license: GPL v2 - - This program is free software; you can redistribute it and/or - modify it under the terms of the GNU General Public License - as published by the Free Software Foundation; either version 2 - of the License, or (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - :TODO - - - Replace TLV code with a more generic solution - * http://trac.secdev.org/scapy/ticket/90 - - Write function for calculating authentication data - - :Known bugs: - - - - - :Thanks: - - - TLV code derived from the CDP implementation of scapy. (Thanks to Nicolas Bareil and Arnaud Ebalard) - http://trac.secdev.org/scapy/ticket/18 - - IOS / EIGRP Version Representation FIX by Dirk Loss -""" - -from scapy.packet import * -from scapy.fields import * -from scapy.layers.inet import IP -from scapy.layers.inet6 import * - -class EigrpIPField(StrField, IPField): - """ - This is a special field type for handling ip addresses of destination networks in internal and - external route updates. - - EIGRP removes zeros from the host portion of the ip address if the netmask is 8, 16 or 24 bits. - """ - - def __init__(self, name, default, length=None, length_from=None): - StrField.__init__(self, name, default) - self.length_from = length_from - if length is not None: - self.length_from = lambda pkt,length=length: length - - def h2i(self, pkt, x): - return IPField.h2i(self, pkt, x) - - def i2m(self, pkt, x): - x = inet_aton(x) - l = self.length_from(pkt) - - if l <= 8: - return x[:1] - elif l <= 16: - return x[:2] - elif l <= 24: - return x[:3] - else: - return x - - def m2i(self, pkt, x): - l = self.length_from(pkt) - - if l <= 8: - x += "\x00\x00\x00" - elif l <= 16: - x += "\x00\x00" - elif l <= 24: - x += "\x00" - - return inet_ntoa(x) - - def prefixlen_to_bytelen(self, l): - if l <= 8: - l = 1 - elif l <= 16: - l = 2 - elif l <= 24: - l = 3 - else: - l = 4 - - return l - - def i2len(self, pkt, x): - l = self.length_from(pkt) - l = self.prefixlen_to_bytelen(l) - - return l - - def getfield(self, pkt, s): - l = self.length_from(pkt) - l = self.prefixlen_to_bytelen(l) - - return s[l:], self.m2i(pkt, s[:l]) - - def randval(self): - return IPField.randval(self) - -class EigrpIP6Field(StrField, IP6Field, EigrpIPField): - """ - This is a special field type for handling ip addresses of destination networks in internal and - external route updates. - - """ - - def __init__(self, name, default, length=None, length_from=None): - StrField.__init__(self, name, default) - self.length_from = length_from - if length is not None: - self.length_from = lambda pkt,length=length: length - - def any2i(self, pkt, x): - return IP6Field.any2i(self, pkt, x) - - def i2repr(self, pkt, x): - return IP6Field.i2repr(self, pkt, x) - - def h2i(self, pkt, x): - return IP6Field.h2i(self, pkt, x) - - def i2m(self, pkt, x): - x = inet_pton(socket.AF_INET6, x) - l = self.length_from(pkt) - l = self.prefixlen_to_bytelen(l) - - return x[:l] - - def m2i(self, pkt, x): - l = self.length_from(pkt) - - prefixlen = self.prefixlen_to_bytelen(l) - if l > 128: - warning("EigrpIP6Field: Prefix length is > 128. Dissection of this packet will fail") - else: - pad = "\x00" * (16 - prefixlen) - x += pad - - return inet_ntop(socket.AF_INET6, x) - - def prefixlen_to_bytelen(self, l): - l = l / 8 - - if l < 16: - l += 1 - - return l - - def i2len(self, pkt, x): - return EigrpIPField.i2len(self, pkt, x) - - def getfield(self, pkt, s): - return EigrpIPField.getfield(self, pkt, s) - -class ThreeBytesField(X3BytesField, ByteField): - def i2repr(self, pkt, x): - return ByteField.i2repr(self, pkt, x) - - -class EIGRPGeneric(Packet): - name = "EIGRP Generic TLV" - fields_desc = [ XShortField("type", 0x0000), - FieldLenField("len", None, "value", "!H", adjust=lambda pkt,x: x + 4), - StrLenField("value", "\x00", length_from=lambda pkt: pkt.len - 4)] - - def guess_payload_class(self, p): - return conf.padding_layer - -class EIGRPParam(EIGRPGeneric): - name = "EIGRP Parameters" - fields_desc = [ XShortField("type", 0x0001), - ShortField("len", 12), - # Bandwidth - ByteField("k1", 1), - # Load - ByteField("k2", 0), - # Delay - ByteField("k3", 1), - # Reliability - ByteField("k4", 0), - # MTU - ByteField("k5", 0), - ByteField("reserved", 0), - ShortField("holdtime", 15) - ] - -class EIGRPAuthData(EIGRPGeneric): - name = "EIGRP Authentication Data" - fields_desc = [ XShortField("type", 0x0002), - FieldLenField("len", None, "authdata", "!H", adjust=lambda pkt,x: x + 24), - ShortEnumField("authtype", 2, {2 : "MD5"}), - ShortField("keysize", None), - IntField("keyid", 1), - StrFixedLenField("nullpad", "\x00" * 12, 12), - StrLenField("authdata", RandString(16), length_from=lambda pkt: pkt.keysize) - ] - - def post_build(self, p, pay): - p += pay - - if self.keysize is None: - keysize = len(self.authdata) - p = p[:6] + chr((keysize >> 8) & 0xff) + chr(keysize & 0xff) + p[8:] - - return p - -class EIGRPSeq(EIGRPGeneric): - name = "EIGRP Sequence" - fields_desc = [ XShortField("type", 0x0003), - ShortField("len", None), - ByteField("addrlen", 4), - ConditionalField(IPField("ipaddr", "192.168.0.1"), - lambda pkt:pkt.addrlen == 4), - ConditionalField(IP6Field("ip6addr", "2001::"), - lambda pkt:pkt.addrlen == 16) - ] - - def post_build(self, p, pay): - p += pay - - if self.len is None: - l = len(p) - p = p[:2] + chr((l >> 8) & 0xff) + chr(l & 0xff) + p[4:] - - return p - -class ShortVersionField(ShortField): - def i2repr(self, pkt, x): - try: - minor = x & 0xff - major = (x >> 8) & 0xff - except TypeError: - return "unknown" - else: - # We print a leading 'v' so that these values don't look like floats - return "v%s.%s" % (major, minor) - - def h2i(self, pkt, x): - """The field accepts string values like v12.1, v1.1 or integer values. - String values have to start with a "v" folled by a floating point number. - Valid numbers are between 0 and 255. - """ - - if type(x) is str and x.startswith("v") and len(x) <= 8: - major = int(x.split(".")[0][1:]) - minor = int(x.split(".")[1]) - - return (major << 8) | minor - - elif type(x) is int and x >= 0 and x <= 65535: - return x - else: - if self.default != None: - warning("set value to default. Format of %r is invalid" % x) - return self.default - else: - raise Scapy_Exception("Format of value is invalid") - - def randval(self): - return RandShort() - -class EIGRPSwVer(EIGRPGeneric): - name = "EIGRP Software Version" - fields_desc = [ XShortField("type", 0x0004), - ShortField("len", 8), - ShortVersionField("ios", "v12.0"), - ShortVersionField("eigrp", "v1.2") - ] - -class EIGRPNms(EIGRPGeneric): - name = "EIGRP Next Multicast Sequence" - fields_desc = [ XShortField("type", 0x0005), - ShortField("len", 8), - IntField("nms", 2) - ] - -# Don't get confused by the term "receive-only". This flag is always set, when you configure -# one of the stub options. It's also the only flag set, when you configure "eigrp stub receive-only". -_EIGRP_STUB_FLAGS = ["connected", "static", "summary", "receive-only", "redistributed", "leak-map"] - -class EIGRPStub(EIGRPGeneric): - name = "EIGRP Stub Router" - fields_desc = [ XShortField("type", 0x0006), - ShortField("len", 6), - FlagsField("flags", 0x000d, 16, _EIGRP_STUB_FLAGS)] - -# Delay 0xffffffff == Destination Unreachable -class EIGRPIntRoute(EIGRPGeneric): - name = "EIGRP Internal Route" - fields_desc = [ XShortField("type", 0x0102), - FieldLenField("len", None, "dst", "!H", adjust=lambda pkt,x: x + 25), - IPField("nexthop", "192.168.0.0"), - IntField("delay", 128000), - IntField("bandwidth", 256), - ThreeBytesField("mtu", 1500), - ByteField("hopcount", 0), - ByteField("reliability", 255), - ByteField("load", 0), - XShortField("reserved", 0), - ByteField("prefixlen", 24), - EigrpIPField("dst", "192.168.1.0", length_from=lambda pkt: pkt.prefixlen), - ] - -_EIGRP_EXTERNAL_PROTOCOL_ID = { - 0x01 : "IGRP", - 0x02 : "EIGRP", - 0x03 : "Static Route", - 0x04 : "RIP", - 0x05 : "Hello", - 0x06 : "OSPF", - 0x07 : "IS-IS", - 0x08 : "EGP", - 0x09 : "BGP", - 0x0A : "IDRP", - 0x0B : "Connected Link" - } - -_EIGRP_EXTROUTE_FLAGS = ["external", "candidate-default"] - -class EIGRPExtRoute(EIGRPGeneric): - name = "EIGRP External Route" - fields_desc = [ XShortField("type", 0x0103), - FieldLenField("len", None, "dst", "!H", adjust=lambda pkt,x: x + 45), - IPField("nexthop", "192.168.0.0"), - IPField("originrouter", "192.168.0.1"), - IntField("originasn", 0), - IntField("tag", 0), - IntField("externalmetric", 0), - ShortField("reserved", 0), - ByteEnumField("extprotocolid", 3, _EIGRP_EXTERNAL_PROTOCOL_ID), - FlagsField("flags", 0, 8, _EIGRP_EXTROUTE_FLAGS), - IntField("delay", 0), - IntField("bandwidth", 256), - ThreeBytesField("mtu", 1500), - ByteField("hopcount", 0), - ByteField("reliability", 255), - ByteField("load", 0), - XShortField("reserved2", 0), - ByteField("prefixlen", 24), - EigrpIPField("dst", "192.168.1.0", length_from=lambda pkt: pkt.prefixlen) - ] - -class EIGRPv6IntRoute(EIGRPGeneric): - name = "EIGRP for IPv6 Internal Route" - fields_desc = [ XShortField("type", 0x0402), - FieldLenField("len", None, "dst", "!H", adjust=lambda pkt,x: x + 37), - IP6Field("nexthop", "::"), - IntField("delay", 128000), - IntField("bandwidth", 256000), - ThreeBytesField("mtu", 1500), - ByteField("hopcount", 1), - ByteField("reliability", 255), - ByteField("load", 0), - XShortField("reserved", 0), - ByteField("prefixlen", 16), - EigrpIP6Field("dst", "2001::", length_from=lambda pkt: pkt.prefixlen) - ] - -class EIGRPv6ExtRoute(EIGRPGeneric): - name = "EIGRP for IPv6 External Route" - fields_desc = [ XShortField("type", 0x0403), - FieldLenField("len", None, "dst", "!H", adjust=lambda pkt,x: x + 57), - IP6Field("nexthop", "::"), - IPField("originrouter", "192.168.0.1"), - IntField("originasn", 0), - IntField("tag", 0), - IntField("externalmetric", 0), - ShortField("reserved", 0), - ByteEnumField("extprotocolid", 3, _EIGRP_EXTERNAL_PROTOCOL_ID), - FlagsField("flags", 0, 8, _EIGRP_EXTROUTE_FLAGS), - IntField("delay", 0), - IntField("bandwidth", 256000), - ThreeBytesField("mtu", 1500), - ByteField("hopcount", 1), - ByteField("reliability", 0), - ByteField("load", 1), - XShortField("reserved2", 0), - ByteField("prefixlen", 8), - EigrpIP6Field("dst", "::", length_from=lambda pkt: pkt.prefixlen) - ] - -_eigrp_tlv_cls = { - 0x0001: "EIGRPParam", - 0x0002: "EIGRPAuthData", - 0x0003: "EIGRPSeq", - 0x0004: "EIGRPSwVer", - 0x0005: "EIGRPNms", - 0x0006: "EIGRPStub", - 0x0102: "EIGRPIntRoute", - 0x0103: "EIGRPExtRoute", - 0x0402: "EIGRPv6IntRoute", - 0x0403: "EIGRPv6ExtRoute" - } - -class RepeatedTlvListField(PacketListField): - def __init__(self, name, default, cls): - PacketField.__init__(self, name, default, cls) - - def getfield(self, pkt, s): - lst = [] - remain = s - while len(remain) > 0: - p = self.m2i(pkt, remain) - if conf.padding_layer in p: - pad = p[conf.padding_layer] - remain = pad.load - del(pad.underlayer.payload) - else: - remain = "" - lst.append(p) - return remain,lst - - def addfield(self, pkt, s, val): - return s + reduce(str.__add__, map(str, val), "") - -def _EIGRPGuessPayloadClass(p, **kargs): - cls = conf.raw_layer - if len(p) >= 2: - t = struct.unpack("!H", p[:2])[0] - clsname = _eigrp_tlv_cls.get(t, "EIGRPGeneric") - cls = globals()[clsname] - return cls(p, **kargs) - -_EIGRP_OPCODES = { 1 : "Update", - 2 : "Request", - 3 : "Query", - 4 : "Replay", - 5 : "Hello", - 6 : "IPX SAP", - 10 : "SIA Query", - 11 : "SIA Reply" } - -# The Conditional Receive bit is used for reliable multicast communication. -# Update-Flag: Not sure if Cisco calls it that way, but it's set when neighbors -# are exchanging routing information -_EIGRP_FLAGS = ["init", "cond-recv", "unknown", "update"] - -class EIGRP(Packet): - name = "EIGRP" - fields_desc = [ ByteField("ver", 2), - ByteEnumField("opcode", 5, _EIGRP_OPCODES), - XShortField("chksum", None), - FlagsField("flags", 0, 32, _EIGRP_FLAGS), - IntField("seq", 0), - IntField("ack", 0), - IntField("asn", 100), - RepeatedTlvListField("tlvlist", [], _EIGRPGuessPayloadClass) - ] - - def post_build(self, p, pay): - p += pay - if self.chksum is None: - c = checksum(p) - p = p[:2] + chr((c >> 8) & 0xff) + chr(c & 0xff) + p[4:] - return p - - def mysummary(self): - summarystr = "EIGRP (AS=%EIGRP.asn% Opcode=%EIGRP.opcode%" - if self.opcode == 5 and self.ack != 0: - summarystr += " (ACK)" - if self.flags != 0: - summarystr += " Flags=%EIGRP.flags%" - - return self.sprintf(summarystr + ")") - -bind_layers(IP, EIGRP, proto=88) -bind_layers(IPv6, EIGRP, nh=88) - -if __name__ == "__main__": - from scapy.main import interact - interact(mydict=globals(), mybanner="EIGRP") - diff --git a/scripts/external_libs/scapy-2.3.1/scapy/contrib/etherip.py b/scripts/external_libs/scapy-2.3.1/scapy/contrib/etherip.py deleted file mode 100644 index e331c146..00000000 --- a/scripts/external_libs/scapy-2.3.1/scapy/contrib/etherip.py +++ /dev/null @@ -1,19 +0,0 @@ - -# http://trac.secdev.org/scapy/ticket/297 - -# scapy.contrib.description = EtherIP -# scapy.contrib.status = loads - -from scapy.fields import BitField -from scapy.packet import Packet, bind_layers -from scapy.layers.inet import IP -from scapy.layers.l2 import Ether - -class EtherIP(Packet): - name = "EtherIP / RFC 3378" - fields_desc = [ BitField("version", 3, 4), - BitField("reserved", 0, 12)] - -bind_layers( IP, EtherIP, frag=0, proto=0x61) -bind_layers( EtherIP, Ether) - diff --git a/scripts/external_libs/scapy-2.3.1/scapy/contrib/gsm_um.py b/scripts/external_libs/scapy-2.3.1/scapy/contrib/gsm_um.py deleted file mode 100644 index cd6b9b05..00000000 --- a/scripts/external_libs/scapy-2.3.1/scapy/contrib/gsm_um.py +++ /dev/null @@ -1,13119 +0,0 @@ -#!/usr/bin/env python - -# scapy.contrib.description = PPI -# scapy.contrib.status = loads - -""" - This program is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see <http://www.gnu.org/licenses/>. -""" - - #################################################################### - # This file holds the GSM UM interface implementation for Scapy # - # author: Laurent Weber <k@0xbadcab1e.lu> # - # # - # Some examples on how to use this script: # - # http://0xbadcab1e.lu/scapy_gsm_um-howto.txt # - # # - # tested on: scapy-version: 2.2.0 (dev) # - #################################################################### - -import logging -from types import IntType -from types import NoneType -from types import StringType -#from time import sleep -import socket -logging.getLogger("scapy").setLevel(1) -from scapy.all import * - -# This method is intended to send gsm air packets. It uses a unix domain -# socket. It opens a socket, sends the parameter to the socket and -# closes the socket. -# typeSock determines the type of the socket, can be: -# 0 for UDP Socket -# 1 for Unix Domain Socket -# 2 for TCP - - -def sendum(x, typeSock=0): - try: - if type(x) is not str: - x = str(x) - if typeSock is 0: - s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) - host = '127.0.0.1' - port = 28670 # default for openBTS - s.connect((host, port)) - elif typeSock is 1: - s = socket.socket(socket.AF_UNIX, socket.SOCK_STREAM) - s.connect("/tmp/osmoL") - elif typeSock is 2: - s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) - host = '127.0.0.1' - port = 43797 - s.connect((host, port)) - s.send(x) - s.close() - except: - print "[Error]: There was a problem when trying to transmit data.\ - Please make sure you started the socket server." - -# Known Bugs/Problems: -# If a message uses multiple times the same IE you cannot set the values -# of this IE's if you use the preconfigured packets. You need to build -# the IE's by hand and than assemble them as entire messages. - -# The ErrorLength class is a custom exception that gets raised when a -# packet doesn't have the correct size. - - -class ErrorLength(Exception): - def __str__(self): - error = "ERROR: Please make sure you build entire, 8 bit fields." - return repr(error) -### -# This method computes the length of the actual IE. -# It computes how many "None" fields have to be removed (if any). -# The method returns an integer containing the number of bytes that have to be -# cut off the packet. -# parameter length contains the max length of the IE can be found in -# 0408 -# The parameter fields contains the value of the fields (not the default but -# the real, actual value. -# The parameter fields2 contains fields_desc. -# Location contains the location of the length field in the IE. Everything -# after the the length field has to be counted (04.07 11.2.1.1.2) - - -def adapt(min_length, max_length, fields, fields2, location=2): - # find out how much bytes there are between min_length and the location of - # the length field - location = min_length - location - i = len(fields) - 1 - rm = mysum = 0 - while i >= 0: - if fields[i] is None: - rm += 1 - try: - mysum += fields2[i].size - except AttributeError: # ByteFields don't have .size - mysum += 8 - else: - break - i -= 1 - if mysum % 8 is 0: - length = mysum / 8 # Number of bytes we have to delete - dyn_length = (max_length - min_length - length) - if dyn_length < 0: - dyn_length = 0 - if length is max_length: # Fix for packets that have all values set - length -= min_length # to None - return [length, dyn_length + location] - else: - raise ErrorLength() - - -def examples(example=None): - if example == None: - print """This command presents some example to introduce scapy -gsm-um to new users. -The following parameters can be used: - examples("imsiDetach") - examples("call") - examples("dissect")""" - elif example == "imsiDetach": - print """ ->>> a=imsiDetachIndication() -... a.typeOfId=1; a.odd=1; a.idDigit1=0xF; -... a.idDigit2_1=2; a.idDigit2=7; a.idDigit3_1=0; -... a.idDigit3=7; a.idDigit4_1=7; a.idDigit4=2; -... a.idDigit5_1=0; a.idDigit5=0; a.idDigit6_1=0; -... a.idDigit6=1; a.idDigit7_1=2; a.idDigit7=7; -... a.idDigit8_1=7; a.idDigit8=5; a.idDigit9_1=1; a.idDigit9=4; ->>> hexdump(a) -0000 05 01 00 08 F0 27 07 72 00 01 27 75 14 .....'.r..'u. ->>> sendum(a) -""" - elif example == "call": - print """ -If you use an USRP and the testcall function this sets up a phonecall: ->>> sendum(setupMobileOriginated()) ->>> sendum(connectAcknowledge()) -""" - - -# Section 10.2/3 -class TpPd(Packet): - """Skip indicator and transaction identifier and Protocol Discriminator""" - name = "Skip Indicator And Transaction Identifier and Protocol \ -Discriminator" - fields_desc = [ - BitField("ti", 0x0, 4), - BitField("pd", 0x3, 4) - ] - - -class MessageType(Packet): - """Message Type Section 10.4""" - name = "Message Type" - fields_desc = [ - XByteField("mesType", 0x3C) - ] - - -## -# Message for Radio Resources management (RR) Section 9.1 -### - -# Network to MS -def additionalAssignment(MobileAllocation_presence=0, - StartingTime_presence=0): - """ADDITIONAL ASSIGNMENT Section 9.1.1""" - # Mandatory - a = TpPd(pd=0x6) - b = MessageType(mesType=0x3B) # 00111011 - c = ChannelDescription() - packet = a / b / c - # Not Mandatory - if MobileAllocation_presence is 1: - d = MobileAllocationHdr(ieiMA=0x72, eightBitMA=0x0) - packet = packet / d - if StartingTime_presence is 1: - e = StartingTimeHdr(ieiST=0x7C, eightBitST=0x0) - packet = packet / e - return packet - - -# Network to MS -def assignmentCommand(FrequencyList_presence=0, - CellChannelDescription_presence=0, - CellChannelDescription_presence1=0, - MultislotAllocation_presence=0, - ChannelMode_presence=0, ChannelMode_presence1=0, - ChannelMode_presence2=0, ChannelMode_presence3=0, - ChannelMode_presence4=0, ChannelMode_presence5=0, - ChannelMode_presence6=0, ChannelMode_presence7=0, - ChannelDescription=0, ChannelMode2_presence=0, - MobileAllocation_presence=0, StartingTime_presence=0, - FrequencyList_presence1=0, - ChannelDescription2_presence=0, - ChannelDescription_presence=0, - FrequencyChannelSequence_presence=0, - MobileAllocation_presence1=0, - CipherModeSetting_presence=0, - VgcsTargetModeIdentication_presence=0, - MultiRateConfiguration_presence=0): - """ASSIGNMENT COMMAND Section 9.1.2""" - a = TpPd(pd=0x6) - b = MessageType(mesType=0x2e) # 101110 - c = ChannelDescription2() - d = PowerCommand() - packet = a / b / c / d - if FrequencyList_presence is 1: - e = FrequencyListHdr(ieiFL=0x05, eightBitFL=0x0) - packet = packet / e - if CellChannelDescription_presence is 1: - f = CellChannelDescriptionHdr(ieiCCD=0x62, eightBitCCD=0x0) - packet = packet / f - if MultislotAllocation_presence is 1: - g = MultislotAllocationHdr(ieiMSA=0x10, eightBitMSA=0x0) - packet = packet / g - if ChannelMode_presence is 1: - h = ChannelModeHdr(ieiCM=0x63, eightBitCM=0x0) - packet = packet / h - if ChannelMode_presence1 is 1: - i = ChannelModeHdr(ieiCM=0x11, eightBitCM=0x0) - packet = packet / i - if ChannelMode_presence2 is 1: - j = ChannelModeHdr(ieiCM=0x13, eightBitCM=0x0) - packet = packet / j - if ChannelMode_presence3 is 1: - k = ChannelModeHdr(ieiCM=0x14, eightBitCM=0x0) - packet = packet / k - if ChannelMode_presence4 is 1: - l = ChannelModeHdr(ieiCM=0x15, eightBitCM=0x0) - packet = packet / l - if ChannelMode_presence5 is 1: - m = ChannelModeHdr(ieiCM=0x16, eightBitCM=0x0) - packet = packet / m - if ChannelMode_presence6 is 1: - n = ChannelModeHdr(ieiCM=0x17, eightBitCM=0x0) - packet = packet / n - if ChannelMode_presence7 is 1: - o = ChannelModeHdr(ieiCM=0x18, eightBitCM=0x0) - packet = packet / o - if ChannelDescription_presence is 1: - p = ChannelDescriptionHdr(ieiCD=0x64, eightBitCD=0x0) - packet = packet / p - if ChannelMode2_presence is 1: - q = ChannelMode2Hdr(ieiCM2=0x66, eightBitCM2=0x0) - packet = packet / q - if MobileAllocation_presence is 1: - r = MobileAllocationHdr(ieiMA=0x72, eightBitMA=0x0) - packet = packet / r - if StartingTime_presence is 1: - s = StartingTimeHdr(ieiST=0x7C, eightBitST=0x0) - packet = packet / s - if FrequencyList_presence1 is 1: - t = FrequencyListHdr(ieiFL=0x19, eightBitFL=0x0) - packet = packet / t - if ChannelDescription2_presence is 1: - u = ChannelDescription2Hdr(ieiCD2=0x1C, eightBitCD2=0x0) - packet = packet / u - if ChannelDescription_presence is 1: - v = ChannelDescriptionHdr(ieiCD=0x1D, eightBitCD=0x0) - packet = packet / v - if FrequencyChannelSequence_presence is 1: - w = FrequencyChannelSequenceHdr(ieiFCS=0x1E, eightBitFCS=0x0) - packet = packet / w - if MobileAllocation_presence1 is 1: - x = MobileAllocationHdr(ieiMA=0x21, eightBitMA=0x0) - packet = packet / x - if CipherModeSetting_presence is 1: - y = CipherModeSettingHdr(ieiCMS=0x9, eightBitCMS=0x0) - packet = packet / y - if VgcsTargetModeIdentication_presence is 1: - z = VgcsTargetModeIdenticationHdr(ieiVTMI=0x01, eightBitVTMI=0x0) - packet = packet / z - if MultiRateConfiguration_presence is 1: - aa = MultiRateConfigurationHdr(ieiMRC=0x03, eightBitMRC=0x0) - packet = packet / aa - return packet - - -# MS to Network -def assignmentComplete(): - """ASSIGNMENT COMPLETE Section 9.1.3""" - a = TpPd(pd=0x6) - b = MessageType(mesType=0x29) # 00101001 - c = RrCause() - packet = a / b / c - return packet - - -# MS to Network -def assignmentFailure(): - """ASSIGNMENT FAILURE Section 9.1.4""" - a = TpPd(pd=0x6) - b = MessageType(mesType=0x2F) # 00101111 - c = RrCause() - packet = a / b / c - return packet - - -# Network to MS -def channelModeModify(VgcsTargetModeIdentication_presence=0, - MultiRateConfiguration_presence=0): - """CHANNEL MODE MODIFY Section 9.1.5""" - a = TpPd(pd=0x6) - b = MessageType(mesType=0x8) # 0001000 - c = ChannelDescription2() - d = ChannelMode() - packet = a / b / c / d - if VgcsTargetModeIdentication is 1: - e = VgcsTargetModeIdenticationHdr(ieiVTMI=0x01, eightBitVTMI=0x0) - packet = packet / e - if MultiRateConfiguration is 1: - f = MultiRateConfigurationHdr(ieiMRC=0x03, eightBitMRC=0x0) - packet = packet / f - return packet - - -def channelModeModifyAcknowledge(): - """CHANNEL MODE MODIFY ACKNOWLEDGE Section 9.1.6""" - a = TpPd(pd=0x6) - b = MessageType(mesType=0x17) # 00010111 - c = ChannelDescription2() - d = ChannelMode() - packet = a / b / c / d - return packet - - -# Network to MS -def channelRelease(BaRange_presence=0, GroupChannelDescription_presence=0, - GroupCipherKeyNumber_presence=0, GprsResumption_presence=0, - BaListPref_presence=0): - """CHANNEL RELEASE Section 9.1.7""" - a = TpPd(pd=0x6) - b = MessageType(mesType=0xD) # 00001101 - c = RrCause() - packet = a / b / c - if BaRange_presence is 1: - d = BaRangeHdr(ieiBR=0x73, eightBitBR=0x0) - packet = packet / d - if GroupChannelDescription_presence is 1: - e = GroupChannelDescriptionHdr(ieiGCD=0x74, eightBitGCD=0x0) - packet = packet / e - if GroupCipherKeyNumber_presence is 1: - f = GroupCipherKeyNumber(ieiGCKN=0x8) - packet = packet / f - if GprsResumption_presence is 1: - g = GprsResumptionHdr(ieiGR=0xC, eightBitGR=0x0) - packet = packet / g - if BaListPref_presence is 1: - h = BaListPrefHdr(ieiBLP=0x75, eightBitBLP=0x0) - packet = packet / h - return packet - - -class ChannelRequest(Packet): - """Channel request Section 9.1.8""" - name = "Channel Request" - fields_desc = [ - ByteField("estCause", 0x0) - ] - - -def channelRequest(): - return ChannelRequest() - - -# Network to MS -def cipheringModeCommand(): - """CIPHERING MODE COMMAND Section 9.1.9""" - a = TpPd(pd=0x6) - b = MessageType(mesType=0x35) # 00110101 - c = RrCause() - #d=cipherModeSetting() - #e=cipherResponse() - # FIX - d = CipherModeSettingAndcipherResponse() - packet = a / b / c / d - return packet - - -def cipheringModeComplete(MobileId_presence=0): - """CIPHERING MODE COMPLETE Section 9.1.10""" - a = TpPd(pd=0x6) - b = MessageType(mesType=0x32) # 00110010 - packet = a / b - if MobileId_presence is 1: - c = MobileIdHdr(ieiMI=0x17, eightBitMI=0x0) - packet = packet / c - return packet - - -# Network to MS -def classmarkChange(MobileStationClassmark3_presence=0): - """CLASSMARK CHANGE Section 9.1.11""" - a = TpPd(pd=0x6) - b = MessageType(mesType=0x16) # 00010110 - c = MobileStationClassmark2() - packet = a / b / c - if MobileStationClassmark3_presence is 1: - e = MobileStationClassmark3(ieiMSC3=0x20) - packet = packet / e - return packet - - -# Network to MS -def classmarkEnquiry(): - """CLASSMARK ENQUIRY Section 9.1.12""" - a = TpPd(pd=0x6) - b = MessageType(mesType=0x13) # 00010011 - packet = a / b - return packet -# 9.1.12a Spare - - -# Network to MS -def configurationChangeCommand(ChannelMode_presence=0, - ChannelMode_presence1=0, - ChannelMode_presence2=0, - ChannelMode_presence3=0, - ChannelMode_presence4=0, - ChannelMode_presence5=0, - ChannelMode_presence6=0, - ChannelMode_presence7=0): - """CONFIGURATION CHANGE COMMAND Section 9.1.12b""" - a = TpPd(pd=0x6) - b = MessageType(mesType=0x30) # 00110000 - c = MultislotAllocation() - packet = a / b / c - if ChannelMode_presence is 1: - d = ChannelModeHdr(ieiCM=0x63, eightBitCM=0x0) - packet = packet / d - if ChannelMode_presence1 is 1: - e = ChannelModeHdr(ieiCM=0x11, eightBitCM=0x0) - packet = packet / e - if ChannelMode_presence2 is 1: - f = ChannelModeHdr(ieiCM=0x13, eightBitCM=0x0) - packet = packet / f - if ChannelMode_presence3 is 1: - g = ChannelModeHdr(ieiCM=0x14, eightBitCM=0x0) - packet = packet / g - if ChannelMode_presence4 is 1: - h = ChannelModeHdr(ieiCM=0x15, eightBitCM=0x0) - packet = packet / h - if ChannelMode_presence5 is 1: - i = ChannelModeHdr(ieiCM=0x16, eightBitCM=0x0) - packet = packet / i - if ChannelMode_presence6 is 1: - j = ChannelModeHdr(ieiCM=0x17, eightBitCM=0x0) - packet = packet / j - if ChannelMode_presence7 is 1: - k = ChannelModeHdr(ieiCM=0x18, eightBitCM=0x0) - packet = packet / k - return packet - - -def configurationChangeAcknowledge(): - """CONFIGURATION CHANGE ACKNOWLEDGE Section 9.1.12c""" - a = TpPd(pd=0x6) - b = MessageType(mesType=0x31) # 00110001 - c = MobileId() - packet = a / b / c - return packet - - -def configurationChangeReject(): - """CONFIGURATION CHANGE REJECT Section 9.1.12d""" - a = TpPd(pd=0x6) - b = MessageType(mesType=0x33) # 00110011 - c = RrCause() - packet = a / b / c - return packet - - -# Network to MS -def frequencyRedefinition(CellChannelDescription_presence=0): - """Frequency redefinition Section 9.1.13""" - a = TpPd(pd=0x6) - b = MessageType(mesType=0x14) # 00010100 - c = ChannelDescription() - d = MobileAllocation() - e = StartingTime() - packet = a / b / c / d / e - if CellChannelDescription_presence is 1: - f = CellChannelDescriptionHdr(ieiCCD=0x62, eightBitCCD=0x0) - packet = packet / f - return packet - - -# Network to MS -def pdchAssignmentCommand(ChannelDescription_presence=0, - CellChannelDescription_presence=0, - MobileAllocation_presence=0, - StartingTime_presence=0, FrequencyList_presence=0, - ChannelDescription_presence1=0, - FrequencyChannelSequence_presence=0, - MobileAllocation_presence1=0, - PacketChannelDescription_presence=0, - DedicatedModeOrTBF_presence=0): - """PDCH ASSIGNMENT COMMAND Section 9.1.13a""" - a = TpPd(pd=0x6) - b = MessageType(mesType=0x23) # 00100011 - c = ChannelDescription() - packet = a / b / c - if ChannelDescription_presence is 1: - d = ChannelDescriptionHdr(ieiCD=0x62, eightBitCD=0x0) - packet = packet / d - if CellChannelDescription_presence is 1: - e = CellChannelDescriptionHdr(ieiCCD=0x05, eightBitCCD=0x0) - packet = packet / e - if MobileAllocation_presence is 1: - f = MobileAllocationHdr(ieiMA=0x72, eightBitMA=0x0) - packet = packet / f - if StartingTime_presence is 1: - g = StartingTimeHdr(ieiST=0x7C, eightBitST=0x0) - packet = packet / g - if FrequencyList_presence is 1: - h = FrequencyListHdr(ieiFL=0x19, eightBitFL=0x0) - packet = packet / h - if ChannelDescription_presence1 is 1: - i = ChannelDescriptionHdr(ieiCD=0x1C, eightBitCD=0x0) - packet = packet / i - if FrequencyChannelSequence_presence is 1: - j = FrequencyChannelSequenceHdr(ieiFCS=0x1E, eightBitFCS=0x0) - packet = packet / j - if MobileAllocation_presence1 is 1: - k = MobileAllocationHdr(ieiMA=0x21, eightBitMA=0x0) - packet = packet / k - if PacketChannelDescription_presence is 1: - l = PacketChannelDescription(ieiPCD=0x22) - packet = packet / l - if DedicatedModeOrTBF_presence is 1: - m = DedicatedModeOrTBFHdr(ieiDMOT=0x23, eightBitDMOT=0x0) - packet = packet / m - return packet - - -def gprsSuspensionRequest(): - """GPRS SUSPENSION REQUEST Section 9.1.13b""" - a = TpPd(pd=0x6) - b = MessageType() - c = Tlli() - d = RoutingAreaIdentification() - e = SuspensionCause() - packet = a / b / c / d / e - return packet - - -class HandoverAccess(Packet): - name = "Handover Access" # Section 9.1.14" - fields_desc = [ - ByteField("handover", None), - ] - - -# Network to MS -def handoverCommand(SynchronizationIndication_presence=0, - FrequencyShortList_presence=0, FrequencyList_presence=0, - CellChannelDescription_presence=0, - MultislotAllocation_presence=0, - ChannelMode_presence=0, ChannelMode_presence1=0, - ChannelMode_presence2=0, - ChannelMode_presence3=0, ChannelMode_presence4=0, - ChannelMode_presence5=0, - ChannelMode_presence6=0, ChannelMode_presence7=0, - ChannelDescription_presence1=0, ChannelMode2_presence=0, - FrequencyChannelSequence_presence=0, - MobileAllocation_presence=0, - StartingTime_presence=0, TimeDifference_presence=0, - TimingAdvance_presence=0, - FrequencyShortList_presence1=0, - FrequencyList_presence1=0, - ChannelDescription2_presence=0, - ChannelDescription_presence2=0, - FrequencyChannelSequence_presence1=0, - MobileAllocation_presence1=0, - CipherModeSetting_presence=0, - VgcsTargetModeIdentication_presence=0, - MultiRateConfiguration_presence=0): - """HANDOVER COMMAND Section 9.1.15""" - name = "Handover Command" - a = TpPd(pd=0x6) - b = MessageType(mesType=0x2b) # 00101011 - c = CellDescription() - d = ChannelDescription2() - e = HandoverReference() - f = PowerCommandAndAccessType() - packet = a / b / c / d / e / f - if SynchronizationIndication_presence is 1: - g = SynchronizationIndicationHdr(ieiSI=0xD, eightBitSI=0x0) - packet = packet / g - if FrequencyShortList_presence is 1: - h = FrequencyShortListHdr(ieiFSL=0x02) - packet = packet / h - if FrequencyList_presence is 1: - i = FrequencyListHdr(ieiFL=0x05, eightBitFL=0x0) - packet = packet / i - if CellChannelDescription_presence is 1: - j = CellChannelDescriptionHdr(ieiCCD=0x62, eightBitCCD=0x0) - packet = packet / j - if MultislotAllocation_presence is 1: - k = MultislotAllocationHdr(ieiMSA=0x10, eightBitMSA=0x0) - packet = packet / k - if ChannelMode_presence is 1: - l = ChannelModeHdr(ieiCM=0x63, eightBitCM=0x0) - packet = packet / l - if ChannelMode_presence1 is 1: - m = ChannelModeHdr(ieiCM=0x11, eightBitCM=0x0) - packet = packet / m - if ChannelMode_presence2 is 1: - n = ChannelModeHdr(ieiCM=0x13, eightBitCM=0x0) - packet = packet / n - if ChannelMode_presence3 is 1: - o = ChannelModeHdr(ieiCM=0x14, eightBitCM=0x0) - packet = packet / o - if ChannelMode_presence4 is 1: - p = ChannelModeHdr(ieiCM=0x15, eightBitCM=0x0) - packet = packet / p - if ChannelMode_presence5 is 1: - q = ChannelModeHdr(ieiCM=0x16, eightBitCM=0x0) - packet = packet / q - if ChannelMode_presence6 is 1: - r = ChannelModeHdr(ieiCM=0x17, eightBitCM=0x0) - packet = packet / r - if ChannelMode_presence7 is 1: - s = ChannelModeHdr(ieiCM=0x18, eightBitCM=0x0) - packet = packet / s - if ChannelDescription_presence1 is 1: - s1 = ChannelDescriptionHdr(ieiCD=0x64, eightBitCD=0x0) - packet = packet / s1 - if ChannelMode2_presence is 1: - t = ChannelMode2Hdr(ieiCM2=0x66, eightBitCM2=0x0) - packet = packet / t - if FrequencyChannelSequence_presence is 1: - u = FrequencyChannelSequenceHdr(ieiFCS=0x69, eightBitFCS=0x0) - packet = packet / u - if MobileAllocation_presence is 1: - v = MobileAllocationHdr(ieiMA=0x72, eightBitMA=0x0) - packet = packet / v - if StartingTime_presence is 1: - w = StartingTimeHdr(ieiST=0x7C, eightBitST=0x0) - packet = packet / w - if TimeDifference_presence is 1: - x = TimeDifferenceHdr(ieiTD=0x7B, eightBitTD=0x0) - packet = packet / x - if TimingAdvance_presence is 1: - y = TimingAdvanceHdr(ieiTA=0x7D, eightBitTA=0x0) - packet = packet / y - if FrequencyShortList_presence1 is 1: - z = FrequencyShortListHdr(ieiFSL=0x12) - packet = packet / z - if FrequencyList_presence1 is 1: - aa = FrequencyListHdr(ieiFL=0x19, eightBitFL=0x0) - packet = packet / aa - if ChannelDescription2_presence is 1: - ab = ChannelDescription2Hdr(ieiCD2=0x1C, eightBitCD2=0x0) - packet = packet / ab - if ChannelDescription_presence2 is 1: - ac = ChannelDescriptionHdr(ieiCD=0x1D, eightBitCD=0x0) - packet = packet / ac - if FrequencyChannelSequence_presence1 is 1: - ad = FrequencyChannelSequenceHdr(ieiFCS=0x1E, eightBitFCS=0x0) - packet = packet / ad - if MobileAllocation_presence1 is 1: - ae = MobileAllocationHdr(ieiMA=0x21, eightBitMA=0x0) - packet = packet / ae - if CipherModeSetting_presence is 1: - af = CipherModeSettingHdr(ieiCMS=0x9, eightBitCMS=0x0) - packet = packet / af - if VgcsTargetModeIdentication_presence is 1: - ag = VgcsTargetModeIdenticationHdr(ieiVTMI=0x01, eightBitVTMI=0x0) - packet = packet / ag - if MultiRateConfiguration_presence is 1: - ah = MultiRateConfigurationHdr(ieiMRC=0x03, eightBitMRC=0x0) - packet = packet / ah - return packet - - -def handoverComplete(MobileTimeDifference_presence=0): - """HANDOVER COMPLETE Section 9.1.16""" - a = TpPd(pd=0x6) - b = MessageType(mesType=0x2c) # 00101100 - c = RrCause() - packet = a / b / c - if MobileTimeDifference_presence is 1: - d = MobileTimeDifferenceHdr(ieiMTD=0x77, eightBitMTD=0x0) - packet = packet / d - return packet - - -def handoverFailure(): - """HANDOVER FAILURE Section 9.1.17""" - a = TpPd(pd=0x6) - b = MessageType(mesType=0x28) # 00101000 - c = RrCause() - packet = a / b / c - return packet - - -#The L2 pseudo length of this message is the sum of lengths of all -#information elements present in the message except -#the IA Rest Octets and L2 Pseudo Length information elements. -# Network to MS -def immediateAssignment(ChannelDescription_presence=0, - PacketChannelDescription_presence=0, - StartingTime_presence=0): - """IMMEDIATE ASSIGNMENT Section 9.1.18""" - a = L2PseudoLength() - b = TpPd(pd=0x6) - c = MessageType(mesType=0x3F) # 00111111 - d = PageModeAndDedicatedModeOrTBF() - packet = a / b / c / d - if ChannelDescription_presence is 1: - f = ChannelDescription() - packet = packet / f - if PacketChannelDescription_presence is 1: - g = PacketChannelDescription() - packet = packet / g - h = RequestReference() - i = TimingAdvance() - j = MobileAllocation() - packet = packet / h / i / j - if StartingTime_presence is 1: - k = StartingTimeHdr(ieiST=0x7C, eightBitST=0x0) - packet = packet / k - l = IaRestOctets() - packet = packet / l - return packet - - -#The L2 pseudo length of this message is the sum of lengths of all -#information elements present in the message except -#the IAX Rest Octets and L2 Pseudo Length information elements. - -# Network to MS -def immediateAssignmentExtended(StartingTime_presence=0): - """IMMEDIATE ASSIGNMENT EXTENDED Section 9.1.19""" - a = L2PseudoLength() - b = TpPd(pd=0x6) - c = MessageType(mesType=0x39) # 00111001 - d = PageModeAndSpareHalfOctets() - f = ChannelDescription() - g = RequestReference() - h = TimingAdvance() - i = MobileAllocation() - packet = a / b / c / d / f / g / h / i - if StartingTime_presence is 1: - j = StartingTimeHdr(ieiST=0x7C, eightBitST=0x0) - packet = packet / j - k = IaxRestOctets() - packet = packet / k - return packet - - -# This message has L2 pseudo length 19 -# Network to MS -def immediateAssignmentReject(): - """IMMEDIATE ASSIGNMENT REJECT Section 9.1.20""" - a = L2PseudoLength(l2pLength=0x13) - b = TpPd(pd=0x6) - c = MessageType(mesType=0x3a) # 00111010 - d = PageModeAndSpareHalfOctets() - f = RequestReference() - g = WaitIndication() - h = RequestReference() - i = WaitIndication() - j = RequestReference() - k = WaitIndication() - l = RequestReference() - m = WaitIndication() - n = IraRestOctets() - packet = a / b / c / d / f / g / h / i / j / k / l / m / n - return packet - - -def measurementReport(): - """MEASUREMENT REPORT Section 9.1.21""" - a = TpPd(pd=0x6) - b = MessageType(mesType=0x15) # 00010101 - c = MeasurementResults() - packet = a / b / c - return packet - - -# len max 20 -class NotificationFacch(): - """NOTIFICATION/FACCH Section 9.1.21a""" - name = "Notification/facch" - fields_desc = [ - BitField("rr", 0x0, 1), - BitField("msgTyoe", 0x0, 5), - BitField("layer2Header", 0x0, 2), - BitField("frChanDes", 0x0, 24) - ] - - -# The L2 pseudo length of this message has a value one -# Network to MS -def notificationNch(): - """NOTIFICATION/NCH Section 9.1.21b""" - a = L2PseudoLength(l2pLength=0x01) - b = TpPd(pd=0x6) - c = MessageType(mesType=0x20) # 00100000 - d = NtNRestOctets() - packet = a / b / c / d - return packet - - -def notificationResponse(): - """NOTIFICATION RESPONSE Section 9.1.21d""" - a = TpPd(pd=0x6) - b = MessageType(mesType=0x26) # 00100110 - c = MobileStationClassmark2() - d = MobileId() - e = DescriptiveGroupOrBroadcastCallReference() - packet = a / b / c / d / e - return packet - - -# Network to MS -def rrCellChangeOrder(): - """RR-CELL CHANGE ORDER Section 9.1.21e""" - a = TpPd(pd=0x6) - b = MessageType(mesType=0x8) # 00001000 - c = CellDescription() - d = NcModeAndSpareHalfOctets() - packet = a / b / c / d - return packet - - -# Network to MS -def pagingRequestType1(MobileId_presence=0): - """PAGING REQUEST TYPE 1 Section 9.1.22""" - #The L2 pseudo length of this message is the sum of lengths of all - #information elements present in the message except - #the P1 Rest Octets and L2 Pseudo Length information elements. - a = L2PseudoLength() - b = TpPd(pd=0x6) - c = MessageType(mesType=0x21) # 00100001 - d = PageModeAndChannelNeeded() - f = MobileId() - packet = a / b / c / d / f - if MobileId_presence is 1: - g = MobileIdHdr(ieiMI=0x17, eightBitMI=0x0) - packet = packet / g - h = P1RestOctets() - packet = packet / h - return packet - - -# The L2 pseudo length of this message is the sum of lengths of all -# information elements present in the message except -# Network to MS -def pagingRequestType2(MobileId_presence=0): - """PAGING REQUEST TYPE 2 Section 9.1.23""" - a = L2PseudoLength() - b = TpPd(pd=0x6) - c = MessageType(mesType=0x22) # 00100010 - d = PageModeAndChannelNeeded() - f = MobileId() - g = MobileId() - packet = a / b / c / d / f / g - if MobileId_presence is 1: - h = MobileIdHdr(ieiMI=0x17, eightBitMI=0x0) - packet = packet / h - i = P2RestOctets() - packet = packet / i - return packet - - -# Network to MS -def pagingRequestType3(): - """PAGING REQUEST TYPE 3 Section 9.1.24""" -# This message has a L2 Pseudo Length of 19 - a = L2PseudoLength(l2pLength=0x13) - b = TpPd(pd=0x6) - c = MessageType(mesType=0x24) # 00100100 - d = PageModeAndChannelNeeded() - e = TmsiPTmsi() - f = TmsiPTmsi() - g = TmsiPTmsi() - h = TmsiPTmsi() - i = P3RestOctets() - packet = a / b / c / d / e / f / g / h / i - return packet - - -def pagingResponse(): - """PAGING RESPONSE Section 9.1.25""" - a = TpPd(pd=0x6) - b = MessageType(mesType=0x27) # 00100111 - c = CiphKeySeqNrAndSpareHalfOctets() - d = MobileStationClassmark2() - e = MobileId() - packet = a / b / c / d / e - return packet - - -# Network to MS -def partialRelease(): - """PARTIAL RELEASE Section 9.1.26""" - a = TpPd(pd=0x6) - b = MessageType(mesType=0xa) # 00001010 - c = ChannelDescription() - packet = a / b / c - return packet - - -def partialReleaseComplete(): - """PARTIAL RELEASE COMPLETE Section 9.1.27""" - a = TpPd(pd=0x6) - b = MessageType(mesType=0xf) # 00001111 - packet = a / b - return packet - - -# Network to MS -def physicalInformation(): - """PHYSICAL INFORMATION Section 9.1.28""" - a = TpPd(pd=0x6) - b = MessageType(mesType=0x2d) # 00101101 - c = TimingAdvance() - packet = a / b / c - return packet - - -def rrInitialisationRequest(): - """RR Initialisation Request Section 9.1.28.a""" - a = TpPd(pd=0x6) - b = MessageType(mesType=0x3c) # 00111100 - c = CiphKeySeqNrAndMacModeAndChannelCodingRequest() - e = MobileStationClassmark2() - f = Tlli() - g = ChannelRequestDescription() - h = GprsMeasurementResults() - packet = a / b / c / e / f / g / h - return packet - - -def rrStatus(): - """RR STATUS Section 9.1.29""" - a = TpPd(pd=0x6) - b = MessageType(mesType=0x12) # 00010010 - c = RrCause() - packet = a / b / c - return packet - - -# It does not -# follow the basic format. Its length is _25_ bits. The -# order of bit transmission is defined in GSM 04.04. -# Network to MS -class SynchronizationChannelInformation(): - """SYNCHRONIZATION CHANNEL INFORMATION Section 9.1.30""" - name = "Synchronization Channel Information" - fields_desc = [ - BitField("bsic", 0x0, 5), - BitField("t1Hi", 0x0, 3), - ByteField("t1Mi", 0x0), - BitField("t1Lo", 0x0, 1), - BitField("t2", 0x0, 5), - BitField("t3Hi", 0x0, 2), - BitField("t3Lo", 0x0, 1) - ] - - -# This message has a L2 Pseudo Length of 21. -# Network to MS -def systemInformationType1(): - """SYSTEM INFORMATION TYPE 1 Section 9.1.31""" - a = L2PseudoLength(l2pLength=0x15) - b = TpPd(pd=0x6) - c = MessageType(mesType=0x19) # 00011001 - d = CellChannelDescription() - e = RachControlParameters() - f = Si1RestOctets() - packet = a / b / c / d / e / f - return packet - - -# This message has a L2 Pseudo Length of 22. -# Network to MS -def systemInformationType2(): - """SYSTEM INFORMATION TYPE 2 Section 9.1.32""" - a = L2PseudoLength(l2pLength=0x16) - b = TpPd(pd=0x6) - c = MessageType(mesType=0x1a) # 00011010 - d = NeighbourCellsDescription() - e = NccPermitted() - f = RachControlParameters() - packet = a / b / c / d / e / f - return packet - - -# This message has a L2 pseudo length of 21 -# Network to MS -def systemInformationType2bis(): - """SYSTEM INFORMATION TYPE 2bis Section 9.1.33""" - a = L2PseudoLength(l2pLength=0x15) - b = TpPd(pd=0x6) - c = MessageType(mesType=0x2) # 00000010 - d = NeighbourCellsDescription() - e = RachControlParameters() - f = Si2bisRestOctets() - packet = a / b / c / d / e / f - return packet - - -# This message has a L2 pseudo length of 18 -# Network to MS -def systemInformationType2ter(): - """SYSTEM INFORMATION TYPE 2ter Section 9.1.34""" - a = L2PseudoLength(l2pLength=0x12) - b = TpPd(pd=0x6) - c = MessageType(mesType=0x3) # 00000011 - d = NeighbourCellsDescription2() - e = Si2terRestOctets() - packet = a / b / c / d / e - return packet - - -# This message has a L2 Pseudo Length of 18 -# Network to MS -def systemInformationType3(): - """SYSTEM INFORMATION TYPE 3 Section 9.1.35""" - a = L2PseudoLength(l2pLength=0x12) - b = TpPd(pd=0x6) - c = MessageType(mesType=0x1b) # 00011011 - d = CellIdentity() - e = LocalAreaId() - f = ControlChannelDescription() - g = CellOptionsBCCH() - h = CellSelectionParameters() - i = RachControlParameters() - j = Si3RestOctets() - packet = a / b / c / d / e / f / g / h / i / j - return packet - - -#The L2 pseudo length of this message is the -#sum of lengths of all information elements present in the message except -#the SI 4 Rest Octets and L2 Pseudo Length -# Network to MS -def systemInformationType4(ChannelDescription_presence=0, - MobileAllocation_presence=0): - """SYSTEM INFORMATION TYPE 4 Section 9.1.36""" - a = L2PseudoLength() - b = TpPd(pd=0x6) - c = MessageType(mesType=0x1C) # 000111100 - d = LocalAreaId() - e = CellSelectionParameters() - f = RachControlParameters() - packet = a / b / c / d / e / f - if ChannelDescription_presence is 1: - g = ChannelDescriptionHdr(ieiCD=0x64, eightBitCD=0x0) - packet = packet / g - if MobileAllocation_presence is 1: - h = MobileAllocationHdr(ieiMA=0x72, eightBitMA=0x0) - packet = packet / h - i = Si4RestOctets() - packet = packet / i - return packet - - -#This message has a L2 Pseudo Length of 18 -# Network to MS -def systemInformationType5(): - """SYSTEM INFORMATION TYPE 5 Section 9.1.37""" - a = L2PseudoLength(l2pLength=0x12) - b = TpPd(pd=0x6) - c = MessageType(mesType=0x35) # 000110101 - d = NeighbourCellsDescription() - packet = a / b / c / d - return packet - - -#This message has a L2 Pseudo Length of 18 -# Network to MS -def systemInformationType5bis(): - """SYSTEM INFORMATION TYPE 5bis Section 9.1.38""" - a = L2PseudoLength(l2pLength=0x12) - b = TpPd(pd=0x6) - c = MessageType(mesType=0x5) # 00000101 - d = NeighbourCellsDescription() - packet = a / b / c / d - return packet - - -# This message has a L2 Pseudo Length of 18 -# Network to MS -def systemInformationType5ter(): - """SYSTEM INFORMATION TYPE 5ter Section 9.1.39""" - a = L2PseudoLength(l2pLength=0x12) - b = TpPd(pd=0x6) - c = MessageType(mesType=0x6) # 00000110 - d = NeighbourCellsDescription2() - packet = a / b / c / d - return packet - - -#This message has a L2 Pseudo Length of 11 -# Network to MS -def systemInformationType6(): - """SYSTEM INFORMATION TYPE 6 Section 9.1.40""" - a = L2PseudoLength(l2pLength=0x0b) - b = TpPd(pd=0x6) - c = MessageType(mesType=0x1e) # 00011011 - d = CellIdentity() - e = LocalAreaId() - f = CellOptionsBCCH() - g = NccPermitted() - h = Si6RestOctets() - packet = a / b / c / d / e / f / g - return packet - - -# The L2 pseudo length of this message has the value 1 -# Network to MS -def systemInformationType7(): - """SYSTEM INFORMATION TYPE 7 Section 9.1.41""" - a = L2PseudoLength(l2pLength=0x01) - b = TpPd(pd=0x6) - c = MessageType(mesType=0x37) # 000110111 - d = Si7RestOctets() - packet = a / b / c / d - return packet - - -# The L2 pseudo length of this message has the value 1 -# Network to MS -def systemInformationType8(): - """SYSTEM INFORMATION TYPE 8 Section 9.1.42""" - a = L2PseudoLength(l2pLength=0x01) - b = TpPd(pd=0x6) - c = MessageType(mesType=0x18) # 00011000 - d = Si8RestOctets() - packet = a / b / c / d - return packet - - -# The L2 pseudo length of this message has the value 1 -# Network to MS -def systemInformationType9(): - """SYSTEM INFORMATION TYPE 9 Section 9.1.43""" - a = L2PseudoLength(l2pLength=0x01) - b = TpPd(pd=0x6) - c = MessageType(mesType=0x4) # 00000100 - d = Si9RestOctets() - packet = a / b / c / d - return packet - - -# The L2 pseudo length of this message has the value 0 -# Network to MS -def systemInformationType13(): - """SYSTEM INFORMATION TYPE 13 Section 9.1.43a""" - a = L2PseudoLength(l2pLength=0x00) - b = TpPd(pd=0x6) - c = MessageType(mesType=0x0) # 00000000 - d = Si13RestOctets() - packet = a / b / c / d - return packet -# -# 9.1.43b / c spare -# - - -# The L2 pseudo length of this message has the value 1 -# Network to MS -def systemInformationType16(): - """SYSTEM INFORMATION TYPE 16 Section 9.1.43d""" - a = L2PseudoLength(l2pLength=0x01) - b = TpPd(pd=0x6) - c = MessageType(mesType=0x3d) # 00111101 - d = Si16RestOctets() - packet = a / b / c / d - return packet - - -# The L2 pseudo length of this message has the value 1 -# Network to MS -def systemInformationType17(): - """SYSTEM INFORMATION TYPE 17 Section 9.1.43e""" - a = L2PseudoLength(l2pLength=0x01) - b = TpPd(pd=0x6) - c = MessageType(mesType=0x3e) # 00111110 - d = Si17RestOctets() - packet = a / b / c / d - return packet - - -def talkerIndication(): - """TALKER INDICATION Section 9.1.44""" - a = TpPd(pd=0x6) - b = MessageType(mesType=0x11) # 00010001 - c = MobileStationClassmark2() - d = MobileId() - packet = a / b / c / d - return packet - - -class UplinkAccess(): - """UPLINK ACCESS Section 9.1.45""" - name = "Uplink Access" - fields_desc = [ - ByteField("establishment", 0x0) - ] - - -# Network to MS -def uplinkBusy(): - """UPLINK BUSY Section 9.1.46""" - name = "Uplink Busy" - a = TpPd(pd=0x6) - b = MessageType(mesType=0x2a) # 00101010 - packet = a / b - return packet - - -# Network to MS -class UplinkFree(): - """UPLINK FREE Section 9.1.47""" - name = "Uplink Free" - fields_desc = [ - BitField("pd", 0x0, 1), - BitField("msgType", 0x0, 5), - BitField("layer2Header", 0x0, 2), - BitField("uplinkAccess", 0x0, 1), - BitField("lOrH", 0x0, 1), # 0 for L, 1 for H - BitField("upIdCode", 0x0, 6), - ] - - -def uplinkRelease(): - """UPLINK RELEASE Section 9.1.48""" - a = TpPd(pd=0x6) - b = MessageType(mesType=0xe) # 00001110 - c = RrCause() - packet = a / b / c - return packet - - -# Network to MS -def vgcsUplinkGrant(): - """VGCS UPLINK GRANT Section 9.1.49""" - a = TpPd(pd=0x6) - b = MessageType(mesType=0x9) # 00001001 - c = RrCause() - d = RequestReference() - e = TimingAdvance() - packet = a / b / c / d / e - return packet - - -# Network to MS -def systemInformationType10(): - """SYSTEM INFORMATION TYPE 10 Section 9.1.50""" - name = "SyStem Information Type 10" - fields_desc = [ - BitField("pd", 0x0, 1), - BitField("msgType", 0x0, 5), - BitField("layer2Header", 0x0, 2), - BitField("si10", 0x0, 160) - ] - - -# Network to MS -# The L2 pseudo length of this message has the value 18 -def extendedMeasurementOrder(): - """EXTENDED MEASUREMENT ORDER Section 9.1.51""" - a = L2PseudoLength(l2pLength=0x12) - b = TpPd(pd=0x6) - c = MessageType(mesType=0x37) # 00110111 - d = ExtendedMeasurementFrequencyList() - packet = a / b / c / d - return packet - - -def extendedMeasurementReport(): - """EXTENDED MEASUREMENT REPORT Section 9.1.52""" - a = TpPd(pd=0x6) - b = MessageType(mesType=0x36) # 00110110 - c = ExtendedMeasurementResults() - packet = a / b / c - return packet - - -def applicationInformation(): - """APPLICATION INFORMATION Section 9.1.53""" - a = TpPd(pd=0x6) - b = MessageType(mesType=0x38) # 00111000 - c = ApduIDAndApduFlags() - e = ApduData() - packet = a / b / c / e - return packet -# -# 9.2 Messages for mobility management -# - - -# Network to MS -def authenticationReject(): - """AUTHENTICATION REJECT Section 9.2.1""" - a = TpPd(pd=0x5) - b = MessageType(mesType=0x11) # 00010001 - packet = a / b - return packet - - -# Network to MS -def authenticationRequest(): - """AUTHENTICATION REQUEST Section 9.2.2""" - a = TpPd(pd=0x5) - b = MessageType(mesType=0x12) # 00010010 - c = CiphKeySeqNrAndSpareHalfOctets() - d = AuthenticationParameterRAND() - packet = a / b / c / d - return packet - - -def authenticationResponse(): - """AUTHENTICATION RESPONSE Section 9.2.3""" - a = TpPd(pd=0x5) - b = MessageType(mesType=0x14) # 00010100 - c = AuthenticationParameterSRES() - packet = a / b / c - return packet - - -def cmReestablishmentRequest(LocalAreaId_presence=0): - """CM RE-ESTABLISHMENT REQUEST Section 9.2.4""" - a = TpPd(pd=0x5) - b = MessageType(mesType=0x28) # 00101000 - c = CiphKeySeqNrAndSpareHalfOctets() - e = MobileStationClassmark2() - f = MobileId() - if LocalAreaId_presence is 1: - g = LocalAreaId(iei=0x13, eightbit=0x0) - packet = packet / g - packet = a / b / c / e / f - return packet - - -# Network to MS -def cmServiceAccept(): - """CM SERVICE ACCEPT Section 9.2.5""" - a = TpPd(pd=0x5) - b = MessageType(mesType=0x21) # 00100001 - packet = a / b - return packet - - -# Network to MS -def cmServicePrompt(): - """CM SERVICE PROMPT Section 9.2.5a""" - a = TpPd(pd=0x5) - b = MessageType(mesType=0x25) # 00100101 - c = PdAndSapi() - packet = a / b / c - return packet - - -# Network to MS -def cmServiceReject(): - """CM SERVICE REJECT Section 9.2.6""" - a = TpPd(pd=0x5) - b = MessageType(mesType=0x22) # 00100010 - c = RejectCause() - packet = a / b / c - return packet - - -def cmServiceAbort(): - """CM SERVICE ABORT Section 9.2.7""" - a = TpPd(pd=0x5) - b = MessageType(mesType=0x23) # 00100011 - packet = a / b - return packet - - -# Network to MS -def abort(): - """ABORT Section 9.2.8""" - a = TpPd(pd=0x5) - b = MessageType(mesType=0x29) # 00101001 - c = RejectCause() - packet = a / b / c - return packet - - -def cmServiceRequest(PriorityLevel_presence=0): - """CM SERVICE REQUEST Section 9.2.9""" - a = TpPd(pd=0x5) - b = MessageType(mesType=0x24) # 00100100 - c = CmServiceTypeAndCiphKeySeqNr() - e = MobileStationClassmark2() - f = MobileId() - packet = a / b / c / e / f - if PriorityLevel_presence is 1: - g = PriorityLevelHdr(ieiPL=0x8, eightBitPL=0x0) - packet = packet / g - return packet - - -# Network to MS -def identityRequest(): - """IDENTITY REQUEST Section 9.2.10""" - a = TpPd(pd=0x5) - b = MessageType(mesType=0x8) # 00001000 - c = IdentityTypeAndSpareHalfOctets() - packet = a / b / c - return packet - - -def identityResponse(): - """IDENTITY RESPONSE Section 9.2.11""" - a = TpPd(pd=0x5) - b = MessageType(mesType=0x9) # 00001001 - c = MobileId() - packet = a / b / c - return packet - - -def imsiDetachIndication(): - """IMSI DETACH INDICATION Section 9.2.12""" - a = TpPd(pd=0x5) - b = MessageType(mesType=0x1) # 00000001 - c = MobileStationClassmark1() - d = MobileId() - packet = a / b / c / d - return packet - - -# Network to MS -def locationUpdatingAccept(MobileId_presence=0, - FollowOnProceed_presence=0, - CtsPermission_presence=0): - """LOCATION UPDATING ACCEPT Section 9.2.13""" - a = TpPd(pd=0x5) - b = MessageType(mesType=0x02) # 00000010 - c = LocalAreaId() - packet = a / b / c - if MobileId_presence is 1: - d = MobileIdHdr(ieiMI=0x17, eightBitMI=0x0) - packet = packet / d - if FollowOnProceed_presence is 1: - e = FollowOnProceed(ieiFOP=0xA1) - packet = packet / e - if CtsPermission_presence is 1: - f = CtsPermissionHdr(ieiCP=0xA2, eightBitCP=0x0) - packet = packet / f - return packet - - -# Network to MS -def locationUpdatingReject(): - """LOCATION UPDATING REJECT Section 9.2.14""" - a = TpPd(pd=0x5) - b = MessageType(mesType=0x4) # 0x00000100 - c = RejectCause() - packet = a / b / c - return packet - - -def locationUpdatingRequest(): - """LOCATION UPDATING REQUEST Section 9.2.15""" - a = TpPd(pd=0x5) - b = MessageType(mesType=0x8) # 00001000 - c = LocationUpdatingTypeAndCiphKeySeqNr() - e = LocalAreaId() - f = MobileStationClassmark1() - g = MobileId() - packet = a / b / c / e / f / g - return packet - - -# Network to MS -def mmInformation(NetworkName_presence=0, NetworkName_presence1=0, - TimeZone_presence=0, TimeZoneAndTime_presence=0, - LsaIdentifier_presence=0): - """MM INFORMATION Section 9.2.15a""" - a = TpPd(pd=0x5) - b = MessageType(mesType=0x32) # 00110010 - packet = a / b - if NetworkName_presence is 1: - c = NetworkNameHdr(ieiNN=0x43, eightBitNN=0x0) - packet = packet / c - if NetworkName_presence1 is 1: - d = NetworkNameHdr(ieiNN=0x45, eightBitNN=0x0) - packet = packet / d - if TimeZone_presence is 1: - e = TimeZoneHdr(ieiTZ=0x46, eightBitTZ=0x0) - packet = packet / e - if TimeZoneAndTime_presence is 1: - f = TimeZoneAndTimeHdr(ieiTZAT=0x47, eightBitTZAT=0x0) - packet = packet / f - if LsaIdentifier_presence is 1: - g = LsaIdentifierHdr(ieiLI=0x48, eightBitLI=0x0) - packet = packet / g - return packet - - -def mmStatus(): - """MM STATUS Section 9.2.16""" - a = TpPd(pd=0x5) - b = MessageType(mesType=0x31) # 00110001 - c = RejectCause() - packet = a / b / c - return packet - - -# Network to MS -def tmsiReallocationCommand(): - """TMSI REALLOCATION COMMAND Section 9.2.17""" - a = TpPd(pd=0x5) - b = MessageType(mesType=0x1a) # 00011010 - c = LocalAreaId() - d = MobileId() - packet = a / b / c / d - return packet - - -def tmsiReallocationComplete(): - """TMSI REALLOCATION COMPLETE Section 9.2.18""" - a = TpPd(pd=0x5) - b = MessageType(mesType=0x1b) # 00011011 - packet = a / b - return packet - - -def mmNull(): - """MM NULL Section 9.2.19""" - a = TpPd(pd=0x5) - b = MessageType(mesType=0x30) # 00110000 - packet = a / b - return packet - -# -# 9.3 Messages for circuit-switched call control -# - - -# Network to MS -def alertingNetToMs(Facility_presence=0, ProgressIndicator_presence=0, - UserUser_presence=0): - """ALERTING Section 9.3.1.1""" - a = TpPd(pd=0x3) - b = MessageType(mesType=0x1) # 00000001 - packet = a / b - if Facility_presence is 1: - c = FacilityHdr(ieiF=0x1C) - packet = packet / c - if ProgressIndicator_presence is 1: - d = ProgressIndicatorHdr(ieiPI=0x1E) - packet = packet / d - if UserUser_presence is 1: - e = UserUserHdr(ieiUU=0x7E) - packet = packet / e - return packet - - -def alertingMsToNet(Facility_presence=0, UserUser_presence=0, - SsVersionIndicator_presence=0): - """ALERTING Section 9.3.1.2""" - a = TpPd(pd=0x3) - b = MessageType(mesType=0x1) # 00000001 - packet = a / b - if Facility_presence is 1: - c = FacilityHdr(ieiF=0x1C, eightBitF=0x0) - packet = packet / c - if UserUser_presence is 1: - d = UserUserHdr(ieiUU=0x7E, eightBitUU=0x0) - packet = packet / d - if SsVersionIndicator_presence is 1: - e = SsVersionIndicatorHdr(ieiSVI=0x7F, eightBitSVI=0x0) - packet = packet / e - return packet - - -def callConfirmed(RepeatIndicator_presence=0, - BearerCapability_presence=0, BearerCapability_presence1=0, - Cause_presence=0, CallControlCapabilities_presence=0): - """CALL CONFIRMED Section 9.3.2""" - a = TpPd(pd=0x3) - b = MessageType(mesType=0x8) # 00001000 - packet = a / b - if RepeatIndicator_presence is 1: - c = RepeatIndicatorHdr(ieiRI=0xD, eightBitRI=0x0) - packet = packet / c - if BearerCapability_presence is 1: - d = BearerCapabilityHdr(ieiBC=0x04, eightBitBC=0x0) - packet = packet / d - if BearerCapability_presence1 is 1: - e = BearerCapabilityHdr(ieiBC=0x04, eightBitBC=0x0) - packet = packet / e - if Cause_presence is 1: - f = CauseHdr(ieiC=0x08, eightBitC=0x0) - packet = packet / f - if CallControlCapabilities_presence is 1: - g = CallControlCapabilitiesHdr(ieiCCC=0x15, eightBitCCC=0x0) - packet = packet / g - return packet - - -# Network to MS -def callProceeding(RepeatIndicator_presence=0, - BearerCapability_presence=0, - BearerCapability_presence1=0, - Facility_presence=0, ProgressIndicator_presence=0, - PriorityLevel_presence=0): - """CALL PROCEEDING Section 9.3.3""" - a = TpPd(pd=0x3) - b = MessageType(mesType=0x2) # 00000010 - packet = a / b - if RepeatIndicator_presence is 1: - c = RepeatIndicatorHdr(ieiRI=0xD, eightBitRI=0x0) - packet = packet / c - if BearerCapability_presence is 1: - d = BearerCapabilityHdr(ieiBC=0x04, eightBitBC=0x0) - packet = packet / d - if BearerCapability_presence1 is 1: - e = BearerCapabilityHdr(ieiBC=0x04, eightBitBC=0x0) - packet = packet / e - if Facility_presence is 1: - f = FacilityHdr(ieiF=0x1C, eightBitF=0x0) - packet = packet / f - if ProgressIndicator_presence is 1: - g = ProgressIndicatorHdr(ieiPI=0x1E, eightBitPI=0x0) - packet = packet / g - if PriorityLevel_presence is 1: - h = PriorityLevelHdr(ieiPL=0x80, eightBitPL=0x0) - packet = packet / h - return packet - - -# Network to MS -def congestionControl(Cause_presence=0): - """CONGESTION CONTROL Section 9.3.4""" - a = TpPd(pd=0x3) - b = MessageType(mesType=0x39) # 00111001 - c = CongestionLevelAndSpareHalfOctets() - packet = a / b / c - if Cause_presence is 1: - e = CauseHdr(ieiC=0x08, eightBitC=0x0) - packet = packet / e - return packet - - -# Network to MS -def connectNetToMs(Facility_presence=0, ProgressIndicator_presence=0, - ConnectedNumber_presence=0, ConnectedSubaddress_presence=0, - UserUser_presence=0): - """CONNECT Section 9.3.5.1""" - a = TpPd(pd=0x3) - b = MessageType(mesType=0x7) # 00000111 - packet = a / b - if Facility_presence is 1: - c = FacilityHdr(ieiF=0x1C, eightBitF=0x0) - packet = packet / c - if ProgressIndicator_presence is 1: - d = ProgressIndicatorHdr(ieiPI=0x1E, eightBitPI=0x0) - packet = packet / d - if ConnectedNumber_presence is 1: - e = ConnectedNumberHdr(ieiCN=0x4C, eightBitCN=0x0) - packet = packet / e - if ConnectedSubaddress_presence is 1: - f = ConnectedSubaddressHdr(ieiCS=0x4D, eightBitCS=0x0) - packet = packet / f - if UserUser_presence is 1: - g = UserUserHdr(ieiUU=0x7F, eightBitUU=0x0) - packet = packet / g - return packet - - -def connectMsToNet(Facility_presence=0, ConnectedSubaddress_presence=0, - UserUser_presence=0, SsVersionIndicator_presence=0): - """CONNECT Section 9.3.5.2""" - a = TpPd(pd=0x3) - b = MessageType(mesType=0x7) # 00000111 - packet = a / b - if Facility_presence is 1: - c = FacilityHdr(ieiF=0x1C, eightBitF=0x0) - packet = packet / c - if ConnectedSubaddress_presence is 1: - d = ConnectedSubaddressHdr(ieiCS=0x4D, eightBitCS=0x0) - packet = packet / d - if UserUser_presence is 1: - e = UserUserHdr(ieiUU=0x7F, eightBitUU=0x0) - packet = packet / e - if SsVersionIndicator_presence is 1: - f = SsVersionIndicatorHdr(ieiSVI=0x7F, eightBitSVI=0x0) - packet = packet / f - return packet - - -def connectAcknowledge(): - """CONNECT ACKNOWLEDGE Section 9.3.6""" - a = TpPd(pd=0x3) - b = MessageType(mesType=0xf) # 00001111 - packet = a / b - return packet - - -# Network to MS -def disconnectNetToMs(Facility_presence=0, ProgressIndicator_presence=0, - UserUser_presence=0, AllowedActions_presence=0): - """DISCONNECT Section 9.3.7.1""" - a = TpPd(pd=0x3) - b = MessageType(mesType=0x25) # 00100101 - c = Cause() - packet = a / b / c - if Facility_presence is 1: - d = FacilityHdr(ieiF=0x1C, eightBitF=0x0) - packet = packet / d - if ProgressIndicator_presence is 1: - e = ProgressIndicatorHdr(ieiPI=0x1E, eightBitPI=0x0) - packet = packet / e - if UserUser_presence is 1: - f = UserUserHdr(ieiUU=0x7E, eightBitUU=0x0) - packet = packet / f - if AllowedActions_presence is 1: - g = AllowedActionsHdr(ieiAA=0x7B, eightBitAA=0x0) - packet = packet / g - return packet - - -def disconnectMsToNet(Facility_presence=0, UserUser_presence=0, - SsVersionIndicator_presence=0): - """Disconnect Section 9.3.7.2""" - a = TpPd(pd=0x3) - b = MessageType(mesType=0x25) # 00100101 - c = Cause() - packet = a / b / c - if Facility_presence is 1: - d = FacilityHdr(ieiF=0x1C, eightBitF=0x0) - packet = packet / d - if UserUser_presence is 1: - e = UserUserHdr(ieiUU=0x7E, eightBitUU=0x0) - packet = packet / e - if SsVersionIndicator_presence is 1: - f = SsVersionIndicatorHdr(ieiSVI=0x7F, eightBitSVI=0x0) - packet = packet / f - return packet - - -def emergencySetup(BearerCapability_presence=0): - """EMERGENCY SETUP Section 9.3.8""" - a = TpPd(pd=0x3) - b = MessageType(mesType=0xe) # 00001110 - packet = a / b - if BearerCapability_presence is 1: - c = BearerCapabilityHdr(ieiBC=0x04, eightBitBC=0x0) - packet = packet / c - return packet - - -# Network to MS -def facilityNetToMs(): - """FACILITY Section 9.3.9.1""" - a = TpPd(pd=0x3) - b = MessageType(mesType=0x3a) # 00111010 - c = Facility() - packet = a / b / c - return packet - - -def facilityMsToNet(SsVersionIndicator_presence=0): - """FACILITY Section 9.3.9.2""" - a = TpPd(pd=0x3) - b = MessageType(mesType=0x3a) # 00111010 - c = Facility() - packet = a / b / c - if SsVersionIndicator_presence is 1: - d = SsVersionIndicatorHdr(ieiSVI=0x7F, eightBitSVI=0x0) - packet = packet / d - return packet - - -def hold(): - """HOLD Section 9.3.10""" - a = TpPd(pd=0x3) - b = MessageType(mesType=0x18) # 00011000 - packet = a / b - return packet - - -# Network to MS -def holdAcknowledge(): - """HOLD ACKNOWLEDGE Section 9.3.11""" - a = TpPd(pd=0x3) - b = MessageType(mesType=0x19) # 00011001 - packet = a / b - return packet - - -# Network to MS -def holdReject(): - """HOLD REJECT Section 9.3.12""" - a = TpPd(pd=0x3) - b = MessageType(mesType=0x1a) # 00011010 - c = Cause() - packet = a / b / c - return packet - - -def modify(LowLayerCompatibility_presence=0, - HighLayerCompatibility_presence=0, - ReverseCallSetupDirection_presence=0): - """MODIFY Section 9.3.13""" - a = TpPd(pd=0x3) - b = MessageType(mesType=0x17) # 00010111 - c = BearerCapability() - packet = a / b / c - if LowLayerCompatibility_presence is 1: - d = LowLayerCompatibilityHdr(ieiLLC=0x7C, eightBitLLC=0x0) - packet = packet / d - if HighLayerCompatibility_presence is 1: - e = HighLayerCompatibilityHdr(ieiHLC=0x7D, eightBitHLC=0x0) - packet = packet / e - if ReverseCallSetupDirection_presence is 1: - f = ReverseCallSetupDirectionHdr(ieiRCSD=0xA3) - packet = packet / f - return packet - - -def modifyComplete(LowLayerCompatibility_presence=0, - HighLayerCompatibility_presence=0, - ReverseCallSetupDirection_presence=0): - """MODIFY COMPLETE Section 9.3.14""" - a = TpPd(pd=0x3) - b = MessageType(mesType=0x1f) # 00011111 - c = BearerCapability() - packet = a / b / c - if LowLayerCompatibility_presence is 1: - d = LowLayerCompatibilityHdr(ieiLLC=0x7C, eightBitLLC=0x0) - packet = packet / d - if HighLayerCompatibility_presence is 1: - e = HighLayerCompatibilityHdr(ieiHLC=0x7D, eightBitHLC=0x0) - packet = packet / e - if ReverseCallSetupDirection_presence is 1: - f = ReverseCallSetupDirection(ieiRCSD=0xA3) - packet = packet / f - return packet - - -def modifyReject(LowLayerCompatibility_presence=0, - HighLayerCompatibility_presence=0): - """MODIFY REJECT Section 9.3.15""" - a = TpPd(pd=0x3) - b = MessageType(mesType=0x13) # 00010011 - c = BearerCapability() - d = Cause() - packet = a / b / c / d - if LowLayerCompatibility_presence is 1: - e = LowLayerCompatibilityHdr(ieiLLC=0x7C, eightBitLLC=0x0) - packet = packet / e - if HighLayerCompatibility_presence is 1: - f = HighLayerCompatibilityHdr(ieiHLC=0x7D, eightBitHLC=0x0) - packet = packet / f - return packet - - -def notify(): - """NOTIFY Section 9.3.16""" - a = TpPd(pd=0x3) - b = MessageType(mesType=0x3e) # 00111110 - c = NotificationIndicator() - packet = a / b / c - return packet - - -# Network to MS -def progress(UserUser_presence=0): - """PROGRESS Section 9.3.17""" - a = TpPd(pd=0x3) - b = MessageType(mesType=0x3) # 00000011 - c = ProgressIndicator() - packet = a / b / c - if UserUser_presence is 1: - d = UserUserHdr() - packet = packet / d - return packet - - -# Network to MS -def ccEstablishment(): - """CC-ESTABLISHMENT Section 9.3.17a""" - a = TpPd(pd=0x3) - b = MessageType(mesType=0x4) # 00000100 - c = SetupContainer() - packet = a / b / c - return packet - - -def ccEstablishmentConfirmed(RepeatIndicator_presence=0, - BearerCapability_presence=0, - BearerCapability_presence1=0, - Cause_presence=0): - """CC-ESTABLISHMENT CONFIRMED Section 9.3.17b""" - a = TpPd(pd=0x3) - b = MessageType(mesType=0x6) # 00000110 - packet = a / b - if RepeatIndicator_presence is 1: - c = RepeatIndicatorHdr(ieiRI=0xD, eightBitRI=0x0) - packet = packet / c - if BearerCapability_presence is 1: - d = BearerCapabilityHdr(ieiBC=0x04, eightBitBC=0x0) - packet = packet / d - if BearerCapability_presence1 is 1: - e = BearerCapabilityHdr(ieiBC=0x04, eightBitBC=0x0) - packet = packet / e - if Cause_presence is 1: - f = CauseHdr(ieiC=0x08, eightBitC=0x0) - packet = packet / f - return packet - - -# Network to MS -def releaseNetToMs(): - """RELEASE Section 9.3.18.1""" - a = TpPd(pd=0x3) - b = MessageType(mesType=0x2d) # 00101101 - c = CauseHdr(ieiC=0x08, eightBitC=0x0) - d = CauseHdr(ieiC=0x08, eightBitC=0x0) - e = FacilityHdr(ieiF=0x1C, eightBitF=0x0) - f = UserUserHdr(ieiUU=0x7E, eightBitUU=0x0) - packet = a / b / c / d / e / f - return packet - - -def releaseMsToNet(Cause_presence=0, Cause_presence1=0, - Facility_presence=0, UserUser_presence=0, - SsVersionIndicator_presence=0): - """RELEASE Section 9.3.18.2""" - a = TpPd(pd=0x3) - b = MessageType(mesType=0x2d) # 00101101 - packet = a / b - if Cause_presence is 1: - c = CauseHdr(ieiC=0x08, eightBitC=0x0) - packet = packet / c - if Cause_presence1 is 1: - d = CauseHdr(ieiC=0x08, eightBitC=0x0) - packet = packet / d - if Facility_presence is 1: - e = FacilityHdr(ieiF=0x1C, eightBitF=0x0) - packet = packet / e - if UserUser_presence is 1: - f = UserUserHdr(ieiUU=0x7E, eightBitUU=0x0) - packet = packet / f - if SsVersionIndicator_presence is 1: - g = SsVersionIndicatorHdr(ieiSVI=0x7F, eightBitSVI=0x0) - packet = packet / g - return packet - - -# Network to MS -def recall(): - """RECALL Section 9.3.18a""" - a = TpPd(pd=0x3) - b = MessageType(mesType=0xb) # 00001011 - c = RecallType() - d = Facility() - packet = a / b / c / d - return packet - - -# Network to MS -def releaseCompleteNetToMs(Cause_presence=0, Facility_presence=0, - UserUser_presence=0): - """RELEASE COMPLETE Section 9.3.19.1""" - a = TpPd(pd=0x3) - b = MessageType(mesType=0x2a) # 00101010 - packet = a / b - if Cause_presence is 1: - c = CauseHdr(ieiC=0x08, eightBitC=0x0) - packet = packet / c - if Facility_presence is 1: - d = FacilityHdr(ieiF=0x1C, eightBitF=0x0) - packet = packet / d - if UserUser_presence is 1: - e = UserUserHdr(ieiUU=0x7E, eightBitUU=0x0) - packet = packet / e - return packet - - -def releaseCompleteMsToNet(Cause_presence=0, Facility_presence=0, - UserUser_presence=0, SsVersionIndicator_presence=0): - """RELEASE COMPLETE Section 9.3.19.2""" - a = TpPd(pd=0x3) - b = MessageType(mesType=0x2a) # 00101010 - packet = a / b - if Cause_presence is 1: - c = CauseHdr(ieiC=0x08, eightBitC=0x0) - packet = packet / c - if Facility_presence is 1: - d = FacilityHdr(ieiF=0x1C, eightBitF=0x0) - packet = packet / d - if UserUser_presence is 1: - e = UserUserHdr(ieiUU=0x7E, eightBitUU=0x0) - packet = packet / e - if SsVersionIndicator_presence is 1: - f = SsVersionIndicatorHdr(ieiSVI=0x7F, eightBitSVI=0x0) - packet = packet / f - return packet - - -def retrieve(): - """RETRIEVE Section 9.3.20""" - a = TpPd(pd=0x3) - b = MessageType(mesType=0x1c) # 00011100 - packet = a / b - return packet - - -# Network to MS -def retrieveAcknowledge(): - """RETRIEVE ACKNOWLEDGE Section 9.3.21""" - a = TpPd(pd=0x3) - b = MessageType(mesType=0x1d) # 00011101 - packet = a / b - return packet - - -# Network to MS -def retrieveReject(): - """RETRIEVE REJECT Section 9.3.22""" - a = TpPd(pd=0x3) - b = MessageType(mesType=0x1e) # 00011110 - c = Cause() - packet = a / b / c - return packet - - -# Network to MS -def setupMobileTerminated(RepeatIndicator_presence=0, - BearerCapability_presence=0, - BearerCapability_presence1=0, - Facility_presence=0, ProgressIndicator_presence=0, - Signal_presence=0, - CallingPartyBcdNumber_presence=0, - CallingPartySubaddress_presence=0, - CalledPartyBcdNumber_presence=0, - CalledPartySubaddress_presence=0, -# RecallType_presence=0, - RedirectingPartyBcdNumber_presence=0, - RedirectingPartySubaddress_presence=0, - RepeatIndicator_presence1=0, - LowLayerCompatibility_presence=0, - LowLayerCompatibility_presence1=0, - RepeatIndicator_presence2=0, - HighLayerCompatibility_presence=0, - HighLayerCompatibility_presence1=0, - UserUser_presence=0, PriorityLevel_presence=0, - AlertingPattern_presence=0): - """SETUP Section 9.3.23.1""" - a = TpPd(pd=0x3) - b = MessageType(mesType=0x5) # 00000101 - packet = a / b - if RepeatIndicator_presence is 1: - c = RepeatIndicatorHdr(ieiRI=0xD, eightBitRI=0x0) - packet = packet / c - if BearerCapability_presence is 1: - d = BearerCapabilityHdr(ieiBC=0x04, eightBitBC=0x0) - packet = packet / d - if BearerCapability_presence1 is 1: - e = BearerCapabilityHdr(ieiBC=0x04, eightBitBC=0x0) - packet = packet / e - if Facility_presence is 1: - f = FacilityHdr(ieiF=0x1C, eightBitF=0x0) - packet = packet / f - if ProgressIndicator_presence is 1: - g = ProgressIndicatorHdr(ieiPI=0x1E, eightBitPI=0x0) - packet = packet / g - if Signal_presence is 1: - h = SignalHdr(ieiS=0x34, eightBitS=0x0) - packet = packet / h - if CallingPartyBcdNumber_presence is 1: - i = CallingPartyBcdNumberHdr(ieiCPBN=0x5C, eightBitCPBN=0x0) - packet = packet / i - if CallingPartySubaddress_presence is 1: - j = CallingPartySubaddressHdr(ieiCPS=0x5D, eightBitCPS=0x0) - packet = packet / j - if CalledPartyBcdNumber_presence is 1: - k = CalledPartyBcdNumberHdr(ieiCPBN=0x5E, eightBitCPBN=0x0) - packet = packet / k - if CalledPartySubaddress_presence is 1: - l = CalledPartySubaddressHdr(ieiCPS=0x6D, eightBitCPS=0x0) - packet = packet / l - if RedirectingPartyBcdNumber_presence is 1: - n = RedirectingPartyBcdNumberHdr(ieiRPBN=0x74, eightBitRPBN=0x0) - packet = packet / n - if RedirectingPartySubaddress_presence is 1: - m = RedirectingPartySubaddress_presence(ieiRPBN=0x75, eightBitRPBN=0x0) - packet = packet / m - if RepeatIndicator_presence1 is 1: - o = RepeatIndicatorHdr(ieiRI=0xD0, eightBitRI=0x0) - packet = packet / o - if LowLayerCompatibility_presence is 1: - p = LowLayerCompatibilityHdr(ieiLLC=0x7C, eightBitLLC=0x0) - packet = packet / p - if LowLayerCompatibility_presence1 is 1: - q = LowLayerCompatibilityHdr(ieiLLC=0x7C, eightBitLLC=0x0) - packet = packet / q - if RepeatIndicator_presence2 is 1: - r = RepeatIndicatorHdr(ieiRI=0xD, eightBitRI=0x0) - packet = packet / r - if HighLayerCompatibility_presence is 1: - s = HighLayerCompatibilityHdr(ieiHLC=0x7D, eightBitHLC=0x0) - packet = packet / s - if HighLayerCompatibility_presence1 is 1: - t = HighLayerCompatibilityHdr(ieiHLC=0x7D, eightBitHLC=0x0) - packet = packet / t - if UserUser_presence is 1: - u = UserUserHdr(ieiUU=0x7E, eightBitUU=0x0) - packet = packet / u - if PriorityLevel_presence is 1: - v = PriorityLevelHdr(ieiPL=0x8, eightBitPL=0x0) - packet = packet / v - if AlertingPattern_presence is 1: - w = AlertingPatternHdr(ieiAP=0x19, eightBitAP=0x0) - packet = packet / w - return packet - - -def setupMobileOriginated(RepeatIndicator_presence=0, - BearerCapability_presence=0, - BearerCapability_presence1=0, - Facility_presence=0, - CallingPartySubaddress_presence=0, - CalledPartyBcdNumber_presence=0, - CalledPartySubaddress_presence=0, - RepeatIndicator_presence1=0, - LowLayerCompatibility_presence=0, - LowLayerCompatibility_presence1=0, - RepeatIndicator_presence2=0, - HighLayerCompatibility_presence=0, - HighLayerCompatibility_presence1=0, - UserUser_presence=0, SsVersionIndicator_presence=0, - ClirSuppression_presence=0, - ClirInvocation_presence=0, - CallControlCapabilities_presence=0, - Facility_presence1=0, - Facility_presence2=0): - """SETUP Section 9.3.23.2""" - a = TpPd(pd=0x3) - b = MessageType(mesType=0x5) # 00000101 - packet = a / b - if RepeatIndicator_presence is 1: - c = RepeatIndicatorHdr(ieiRI=0xD, eightBitRI=0x0) - packet = packet / c - if BearerCapability_presence is 1: - d = BearerCapabilityHdr(ieiBC=0x04, eightBitBC=0x0) - packet = packet / d - if BearerCapability_presence1 is 1: - e = BearerCapabilityHdr(ieiBC=0x04, eightBitBC=0x0) - packet = packet / e - if Facility_presence is 1: - f = FacilityHdr(ieiF=0x1C, eightBitF=0x0) - packet = packet / f - if CallingPartySubaddress_presence is 1: - g = CallingPartySubaddressHdr(ieiCPS=0x5D, eightBitCPS=0x0) - packet = packet / g - if CalledPartyBcdNumber_presence is 1: - h = CalledPartyBcdNumberHdr(ieiCPBN=0x5E, eightBitCPBN=0x0) - packet = packet / h - if CalledPartySubaddress_presence is 1: - i = CalledPartySubaddressHdr(ieiCPS=0x6D, eightBitCPS=0x0) - packet = packet / i - if RepeatIndicator_presence1 is 1: - j = RepeatIndicatorHdr(ieiRI=0xD0, eightBitRI=0x0) - packet = packet / j - if LowLayerCompatibility_presence is 1: - k = LowLayerCompatibilityHdr(ieiLLC=0x7C, eightBitLLC=0x0) - packet = packet / k - if LowLayerCompatibility_presence1 is 1: - l = LowLayerCompatibilityHdr(ieiLLC=0x7C, eightBitLLC=0x0) - packet = packet / l - if RepeatIndicator_presence2 is 1: - m = RepeatIndicatorHdr(ieiRI=0xD, eightBitRI=0x0) - packet = packet / m - if HighLayerCompatibility_presence is 1: - n = HighLayerCompatibilityHdr(ieiHLC=0x7D, eightBitHLC=0x0) - packet = packet / n - if HighLayerCompatibility_presence1 is 1: - o = HighLayerCompatibilityHdr(ieiHLC=0x7D, eightBitHLC=0x0) - packet = packet / o - if UserUser_presence is 1: - p = UserUserHdr(ieiUU=0x7E, eightBitUU=0x0) - packet = packet / p - if SsVersionIndicator_presence is 1: - q = SsVersionIndicatorHdr(ieiSVI=0x7F, eightBitSVI=0x0) - packet = packet / q - if ClirSuppression_presence is 1: - r = ClirSuppressionHdr(ieiCS=0xA1, eightBitCS=0x0) - packet = packet / r - if ClirInvocation_presence is 1: - s = ClirInvocationHdr(ieiCI=0xA2, eightBitCI=0x0) - packet = packet / s - if CallControlCapabilities_presence is 1: - t = CallControlCapabilitiesHdr(ieiCCC=0x15, eightBitCCC=0x0) - packet = packet / t - if Facility_presence1 is 1: - u = FacilityHdr(ieiF=0x1D, eightBitF=0x0) - packet = packet / u - if Facility_presence2 is 1: - v = FacilityHdr(ieiF=0x1B, eightBitF=0x0) - packet = packet / v - return packet - - -def startCc(CallControlCapabilities_presence=0): - """START CC Section 9.3.23a""" - a = TpPd(pd=0x3) - b = MessageType(mesType=0x9) # 00001001 - packet = a / b - if CallControlCapabilities_presence is 1: - c = CallControlCapabilitiesHdr(ieiCCC=0x15, eightBitCCC=0x0) - packet = paclet / c - return packet - - -def startDtmf(): - """START DTMF Section 9.3.24""" - a = TpPd(pd=0x3) - b = MessageType(mesType=0x35) # 00110101 - c = KeypadFacilityHdr(ieiKF=0x2C, eightBitKF=0x0) - packet = a / b / c - return packet - - -# Network to MS -def startDtmfAcknowledge(): - """START DTMF ACKNOWLEDGE Section 9.3.25""" - a = TpPd(pd=0x3) - b = MessageType(mesType=0x32) # 00110010 - c = KeypadFacilityHdr(ieiKF=0x2C, eightBitKF=0x0) - packet = a / b / c - return packet - - -# Network to MS -def startDtmfReject(): - """ START DTMF REJECT Section 9.3.26""" - a = TpPd(pd=0x3) - b = MessageType(mesType=0x37) # 00110111 - c = Cause() - packet = a / b / c - return packet - - -def status(AuxiliaryStates_presence=0): - """STATUS Section 9.3.27""" - a = TpPd(pd=0x3) - b = MessageType(mesType=0x3d) # 00111101 - c = Cause() - d = CallState() - packet = a / b / c / d - if AuxiliaryStates_presence is 1: - e = AuxiliaryStatesHdr(ieiAS=0x24, eightBitAS=0x0) - packet = packet / e - return packet - - -def statusEnquiry(): - """STATUS ENQUIRY Section 9.3.28""" - a = TpPd(pd=0x3) - b = MessageType(mesType=0x34) # 00110100 - packet = a / b - return packet - - -def stopDtmf(): - """STOP DTMF Section 9.3.29""" - a = TpPd(pd=0x3) - b = MessageType(mesType=0x31) # 00110001 - packet = a / b - return packet - - -# Network to MS -def stopDtmfAcknowledge(): - """STOP DTMF ACKNOWLEDGE Section 9.3.30""" - a = TpPd(pd=0x3) - b = MessageType(mesType=0x32) # 00110010 - packet = a / b - return packet - - -def userInformation(MoreData_presence=0): - """USER INFORMATION Section 9.3.31""" - a = TpPd(pd=0x3) - b = MessageType(mesType=0x20) # 000100000 - c = UserUser() - packet = a / b / c - if MoreData_presence is 1: - d = MoreDataHdr(ieiMD=0xA0, eightBitMD=0x0) - packet = packet / d - return packet - -# -# 9.4 GPRS Mobility Management Messages -# - - -def attachRequest(PTmsiSignature_presence=0, GprsTimer_presence=0, - TmsiStatus_presence=0): - """ATTACH REQUEST Section 9.4.1""" - a = TpPd(pd=0x3) - b = MessageType(mesType=0x1) # 0000001 - c = MsNetworkCapability() - d = AttachTypeAndCiphKeySeqNr() - f = DrxParameter() - g = MobileId() - h = RoutingAreaIdentification() - i = MsRadioAccessCapability() - packet = a / b / c / d / f / g / h / i - if PTmsiSignature_presence is 1: - j = PTmsiSignature(ieiPTS=0x19) - packet = packet / j - if GprsTimer_presence is 1: - k = GprsTimer(ieiGT=0x17) - packet = packet / k - if TmsiStatus_presence is 1: - l = TmsiStatus(ieiTS=0x9) - packet = packet / l - return packet - - -def attachAccept(PTmsiSignature_presence=0, GprsTimer_presence=0, - MobileId_presence=0, MobileId_presence1=0, - GmmCause_presence=0): - """ATTACH ACCEPT Section 9.4.2""" - a = TpPd(pd=0x3) - b = MessageType(mesType=0x2) # 00000010 - c = AttachResult() - d = ForceToStandby() - e = GprsTimer() - f = RadioPriorityAndSpareHalfOctets() - h = RoutingAreaIdentification() - packet = a / b / c / d / e / f / h - if PTmsiSignature_presence is 1: - i = PTmsiSignature(ieiPTS=0x19) - packet = packet / i - if GprsTimer_presence is 1: - j = GprsTimer(ieiGT=0x17) - packet = packet / j - if MobileId_presence is 1: - k = MobileIdHdr(ieiMI=0x18, eightBitMI=0x0) - packet = packet / k - if MobileId_presence1 is 1: - l = MobileIdHdr(ieiMI=0x23, eightBitMI=0x0) - packet = packet / l - if GmmCause_presence is 1: - m = GmmCause(ieiGC=0x25) - packet = packet / m - return packet - - -def attachComplete(): - """ATTACH COMPLETE Section 9.4.3""" - a = TpPd(pd=0x3) - b = MessageType(mesType=0x3) # 00000011 - packet = a / b - return packet - - -def attachReject(): - """ATTACH REJECT Section 9.4.4""" - a = TpPd(pd=0x3) - b = MessageType(mesType=0x1) # 00000001 - c = GmmCause() - packet = a / b / c - return packet - - -def detachRequest(GmmCause_presence=0): - """DETACH REQUEST Section 9.4.5""" - a = TpPd(pd=0x3) - b = MessageType(mesType=0x5) # 00000101 - c = DetachTypeAndForceToStandby() - packet = a / b / c - if GmmCause_presence is 1: - e = GmmCause(ieiGC=0x25) - packet = packet / e - return packet - - -def detachRequestMsOriginating(): - """DETACH REQUEST Section 9.4.5.2""" - a = TpPd(pd=0x3) - b = MessageType(mesType=0x5) # 00000101 - c = DetachTypeAndSpareHalfOctets() - packet = a / b / c - return packet - - -def detachAcceptMsTerminated(): - """DETACH ACCEPT Section 9.4.6.1""" - a = TpPd(pd=0x3) - b = MessageType(mesType=0x6) # 00000110 - packet = a / b - return packet - - -def detachAcceptMsOriginating(): - """DETACH ACCEPT Section 9.4.6.2""" - a = TpPd(pd=0x3) - b = MessageType(mesType=0x6) # 00000110 - c = ForceToStandbyAndSpareHalfOctets() - packet = a / b / c - return packet - - -def ptmsiReallocationCommand(PTmsiSignature_presence=0): - """P-TMSI REALLOCATION COMMAND Section 9.4.7""" - a = TpPd(pd=0x3) - b = MessageType(mesType=0x10) # 00010000 - c = MobileId() - d = RoutingAreaIdentification() - e = ForceToStandbyAndSpareHalfOctets() - packet = a / b / c / d / e - if PTmsiSignature_presence is 1: - g = PTmsiSignature(ieiPTS=0x19) - packet = packet / g - return packet - - -def ptmsiReallocationComplete(): - """P-TMSI REALLOCATION COMPLETE Section 9.4.8""" - a = TpPd(pd=0x3) - b = MessageType(mesType=0x11) # 00010001 - packet = a / b - return packet - - -def authenticationAndCipheringRequest( - AuthenticationParameterRAND_presence=0, - CiphKeySeqNr_presence=0): - """AUTHENTICATION AND CIPHERING REQUEST Section 9.4.9""" - a = TpPd(pd=0x3) - b = MessageType(mesType=0x12) # 00010010 - d = CipheringAlgorithmAndImeisvRequest() - e = ForceToStandbyAndAcReferenceNumber() - packet = a / b / d / e - if AuthenticationParameterRAND_presence is 1: - g = AuthenticationParameterRAND(ieiAPR=0x21) - packet = packet / g - if CiphKeySeqNr_presence is 1: - h = CiphKeySeqNrHdr(ieiCKSN=0x08, eightBitCKSN=0x0) - packet = packet / h - return packet - - -def authenticationAndCipheringResponse( - AuthenticationParameterSRES_presence=0, - MobileId_presence=0): - """AUTHENTICATION AND CIPHERING RESPONSE Section 9.4.10""" - a = TpPd(pd=0x3) - b = MessageType(mesType=0x13) # 00010011 - c = AcReferenceNumberAndSpareHalfOctets() - packet = a / b / c - if AuthenticationParameterSRES_presence is 1: - e = AuthenticationParameterSRES(ieiAPS=0x22) - packet = packet / e - if MobileId_presence is 1: - f = MobileIdHdr(ieiMI=0x23, eightBitMI=0x0) - packet = packet / f - return packet - - -def authenticationAndCipheringReject(): - """AUTHENTICATION AND CIPHERING REJECT Section 9.4.11""" - a = TpPd(pd=0x3) - b = MessageType(mesType=0x14) # 00010100 - packet = a / b - return packet - - -def identityRequest(): - """IDENTITY REQUEST Section 9.4.12""" - a = TpPd(pd=0x3) - b = MessageType(mesType=0x15) # 00010101 - c = IdentityType2AndforceToStandby() - packet = a / b / c - return packet - - -def identityResponse(): - """IDENTITY RESPONSE Section 9.4.13""" - a = TpPd(pd=0x3) - b = MessageType(mesType=0x16) # 00010110 - c = MobileId() - packet = a / b / c - return packet - - -def routingAreaUpdateRequest(PTmsiSignature_presence=0, - GprsTimer_presence=0, - DrxParameter_presence=0, - TmsiStatus_presence=0): - """ROUTING AREA UPDATE REQUEST Section 9.4.14""" - a = TpPd(pd=0x3) - b = MessageType(mesType=0x8) # 00001000 - c = UpdateTypeAndCiphKeySeqNr() - e = RoutingAreaIdentification() - f = MsNetworkCapability() - packet = a / b / c / e / f - if PTmsiSignature_presence is 1: - g = PTmsiSignature(ieiPTS=0x19) - packet = packet / g - if GprsTimer_presence is 1: - h = GprsTimer(ieiGT=0x17) - packet = packet / h - if DrxParameter_presence is 1: - i = DrxParameter(ieiDP=0x27) - packet = packet / i - if TmsiStatus_presence is 1: - j = TmsiStatus(ieiTS=0x9) - packet = packet / j - return packet - - -def routingAreaUpdateAccept(PTmsiSignature_presence=0, - MobileId_presence=0, MobileId_presence1=0, - ReceiveNpduNumbersList_presence=0, - GprsTimer_presence=0, GmmCause_presence=0): - """ROUTING AREA UPDATE ACCEPT Section 9.4.15""" - a = TpPd(pd=0x3) - b = MessageType(mesType=0x9) # 00001001 - c = ForceToStandbyAndUpdateResult() - e = GprsTimer() - f = RoutingAreaIdentification() - packet = a / b / c / e / f - if PTmsiSignature_presence is 1: - g = PTmsiSignature(ieiPTS=0x19) - packet = packet / g - if MobileId_presence is 1: - h = MobileIdHdr(ieiMI=0x18, eightBitMI=0x0) - packet = packet / h - if MobileId_presence1 is 1: - i = MobileIdHdr(ieiMI=0x23, eightBitMI=0x0) - packet = packet / i - if ReceiveNpduNumbersList_presence is 1: - j = ReceiveNpduNumbersList(ieiRNNL=0x26) - packet = packet / j - if GprsTimer_presence is 1: - k = GprsTimer(ieiGT=0x17) - packet = packet / k - if GmmCause_presence is 1: - l = GmmCause(ieiGC=0x25) - packet = packet / l - return packet - - -def routingAreaUpdateComplete(ReceiveNpduNumbersList_presence=0): - """ROUTING AREA UPDATE COMPLETE Section 9.4.16""" - a = TpPd(pd=0x3) - b = MessageType(mesType=0xa) # 00001010 - packet = a / b - if ReceiveNpduNumbersList_presence is 1: - c = ReceiveNpduNumbersList(ieiRNNL=0x26) - packet = packet / c - return packet - - -def routingAreaUpdateReject(): - """ROUTING AREA UPDATE REJECT Section 9.4.17""" - a = TpPd(pd=0x3) - b = MessageType(mesType=0xb) # 00001011 - c = GmmCause() - d = ForceToStandbyAndSpareHalfOctets() - packet = a / b / c / d - return packet - - -def gmmStatus(): - """GMM STATUS Section 9.4.18""" - a = TpPd(pd=0x3) - b = MessageType(mesType=0x20) # 00100000 - c = GmmCause() - packet = a / b / c - return packet - - -def gmmInformation(NetworkName_presence=0, NetworkName_presence1=0, - TimeZone_presence=0, TimeZoneAndTime_presence=0, - LsaIdentifier_presence=0): - """GMM INFORMATION Section 9.4.19""" - a = TpPd(pd=0x3) - b = MessageType(mesType=0x21) # 00100001 - packet = a / b - if NetworkName_presence is 1: - c = NetworkNameHdr(ieiNN=0x43, eightBitNN=0x0) - packet = packet / c - if NetworkName_presence1 is 1: - d = NetworkNameHdr(ieiNN=0x45, eightBitNN=0x0) - packet = packet / d - if TimeZone_presence is 1: - e = TimeZoneHdr(ieiTZ=0x46, eightBitTZ=0x0) - packet = packet / e - if TimeZoneAndTime_presence is 1: - f = TimeZoneAndTimeHdr(ieiTZAT=0x47, eightBitTZAT=0x0) - packet = packet / f - if LsaIdentifier_presence is 1: - g = LsaIdentifierHdr(ieiLI=0x48, eightBitLI=0x0) - packet = packet / g - return packet - -# -# 9.5 GPRS Session Management Messages -# - - -def activatePdpContextRequest(AccessPointName_presence=0, - ProtocolConfigurationOptions_presence=0): - """ACTIVATE PDP CONTEXT REQUEST Section 9.5.1""" - a = TpPd(pd=0x8) - b = MessageType(mesType=0x41) # 01000001 - c = NetworkServiceAccessPointIdentifier() - d = LlcServiceAccessPointIdentifier() - e = QualityOfService() - f = PacketDataProtocolAddress() - packet = a / b / c / d / e / f - if AccessPointName_presence is 1: - g = AccessPointName(ieiAPN=0x28) - packet = packet / g - if ProtocolConfigurationOptions_presence is 1: - h = ProtocolConfigurationOptions(ieiPCO=0x27) - packet = packet / h - return packet - - -def activatePdpContextAccept(PacketDataProtocolAddress_presence=0, - ProtocolConfigurationOptions_presence=0): - """ACTIVATE PDP CONTEXT ACCEPT Section 9.5.2""" - a = TpPd(pd=0x8) - b = MessageType(mesType=0x42) # 01000010 - c = LlcServiceAccessPointIdentifier() - d = QualityOfService() - e = RadioPriorityAndSpareHalfOctets() - packet = a / b / c / d / e - if PacketDataProtocolAddress_presence is 1: - f = PacketDataProtocolAddress(ieiPDPA=0x2B) - packet = packet / f - if ProtocolConfigurationOptions_presence is 1: - g = ProtocolConfigurationOptions(ieiPCO=0x27) - packet = packet / g - return packet - - -def activatePdpContextReject(ProtocolConfigurationOptions_presence=0): - """ACTIVATE PDP CONTEXT REJECT Section 9.5.3""" - a = TpPd(pd=0x8) - b = MessageType(mesType=0x43) # 01000011 - c = SmCause() - packet = a / b / c - if ProtocolConfigurationOptions_presence is 1: - d = ProtocolConfigurationOptions(ieiPCO=0x27) - packet = packet / d - return packet - - -def requestPdpContextActivation(AccessPointName_presence=0): - """REQUEST PDP CONTEXT ACTIVATION Section 9.5.4""" - a = TpPd(pd=0x8) - b = MessageType(mesType=0x44) # 01000100 - c = PacketDataProtocolAddress() - packet = a / b / c - if AccessPointName_presence is 1: - d = AccessPointName(ieiAPN=0x28) - packet = packet / d - return packet - - -def requestPdpContextActivationReject(): - """REQUEST PDP CONTEXT ACTIVATION REJECT Section 9.5.5""" - a = TpPd(pd=0x8) - b = MessageType(mesType=0x45) # 01000101 - c = SmCause() - packet = a / b / c - return packet - - -def modifyPdpContextRequest(): - """MODIFY PDP CONTEXT REQUEST Section 9.5.6""" - a = TpPd(pd=0x8) - b = MessageType(mesType=0x48) # 01001000 - c = RadioPriorityAndSpareHalfOctets() - d = LlcServiceAccessPointIdentifier() - e = QualityOfService() - packet = a / b / c / d / e - return packet - - -def modifyPdpContextAccept(): - """MODIFY PDP CONTEXT ACCEPT Section 9.5.7""" - a = TpPd(pd=0x8) - b = MessageType(mesType=0x45) # 01000101 - packet = a / b - return packet - - -def deactivatePdpContextRequest(): - """DEACTIVATE PDP CONTEXT REQUEST Section 9.5.8""" - a = TpPd(pd=0x8) - b = MessageType(mesType=0x46) # 01000110 - c = SmCause() - packet = a / b / c - return packet - - -def deactivatePdpContextAccept(): - """DEACTIVATE PDP CONTEXT ACCEPT Section 9.5.9""" - a = TpPd(pd=0x8) - b = MessageType(mesType=0x47) # 01000111 - packet = a / b - return packet - - -def activateAaPdpContextRequest(AccessPointName_presence=0, - ProtocolConfigurationOptions_presence=0, - GprsTimer_presence=0): - """ACTIVATE AA PDP CONTEXT REQUEST Section 9.5.10""" - a = TpPd(pd=0x8) - b = MessageType(mesType=0x50) # 01010000 - c = NetworkServiceAccessPointIdentifier() - d = LlcServiceAccessPointIdentifier() - e = QualityOfService() - f = PacketDataProtocolAddress() - packet = a / b / c / d / e / f - if AccessPointName_presence is 1: - g = AccessPointName(ieiAPN=0x28) - packet = packet / g - if ProtocolConfigurationOptions_presence is 1: - h = ProtocolConfigurationOptions(ieiPCO=0x27) - packet = packet / h - if GprsTimer_presence is 1: - i = GprsTimer(ieiGT=0x29) - packet = packet / i - return packet - - -def activateAaPdpContextAccept(ProtocolConfigurationOptions_presence=0, - GprsTimer_presence=0): - """ACTIVATE AA PDP CONTEXT ACCEPT Section 9.5.11""" - a = TpPd(pd=0x8) - b = MessageType(mesType=0x51) # 01010001 - c = LlcServiceAccessPointIdentifier() - d = QualityOfService() - e = MobileId() - f = PacketDataProtocolAddress() - g = RadioPriorityAndSpareHalfOctets() - packet = a / b / c / d / e / f / g - if ProtocolConfigurationOptions_presence is 1: - i = ProtocolConfigurationOptions(ieiPCO=0x27) - packet = packet / i - if GprsTimer_presence is 1: - j = GprsTimer(ieiGT=0x29) - packet = packet / j - return packet - - -def activateAaPdpContextReject(ProtocolConfigurationOptions_presence=0): - """ACTIVATE AA PDP CONTEXT REJECT Section 9.5.12""" - a = TpPd(pd=0x8) - b = MessageType(mesType=0x52) # 01010010 - c = SmCause() - packet = a / b / c - if ProtocolConfigurationOptions_presence is 1: - d = ProtocolConfigurationOptions(ieiPCO=0x27) - packet = packet / d - return packet - - -def deactivateAaPdpContextRequest(): - """DEACTIVATE AA PDP CONTEXT REQUEST Section 9.5.13""" - a = TpPd(pd=0x8) - b = MessageType(mesType=0x53) # 01010011 - c = AaDeactivationCauseAndSpareHalfOctets() - packet = a / b / c - return packet - - -def deactivateAaPdpContextAccept(): - """DEACTIVATE AA PDP CONTEXT ACCEPT Section 9.5.14""" - a = TpPd(pd=0x8) - b = MessageType(mesType=0x54) # 01010100 - packet = a / b - return packet - - -def smStatus(): - """SM STATUS Section 9.5.15""" - a = TpPd(pd=0x8) - b = MessageType(mesType=0x55) # 01010101 - c = SmCause() - packet = a / b / c - return packet - - -# ============================================# -# Information Elements contents (Section 10) # -# =========================================== # - -#### -# This section contains the elements we need to build the messages -#### - -# -# Common information elements: -# -class CellIdentityHdr(Packet): - """ Cell identity Section 10.5.1.1 """ - name = "Cell Identity" - fields_desc = [ - BitField("eightBitCI", None, 1), - XBitField("ieiCI", None, 7), - ByteField("ciValue1", 0x0), - ByteField("ciValue2", 0x0) - ] - - -class CiphKeySeqNrHdr(Packet): - """ Ciphering Key Sequence Number Section 10.5.1.2 """ - name = "Cipher Key Sequence Number" - fields_desc = [ - XBitField("ieiCKSN", None, 4), - BitField("spare", 0x0, 1), - BitField("keySeq", 0x0, 3) - ] - - -# Fix 1/2 len problem -class CiphKeySeqNrAndSpareHalfOctets(Packet): - name = "Cipher Key Sequence Number and Spare Half Octets" - fields_desc = [ - BitField("spare", 0x0, 1), - BitField("keySeq", 0x0, 3), - BitField("spareHalfOctets", 0x0, 4) - ] - - -# Fix 1/2 len problem -class CiphKeySeqNrAndMacModeAndChannelCodingRequest(Packet): - name = "Cipher Key Sequence Number and Mac Mode And Channel Coding Request" - fields_desc = [ - BitField("spare", 0x0, 1), - BitField("keySeq", 0x0, 3), - BitField("macMode", 0x0, 2), - BitField("cs", 0x0, 2) - ] - - -class LocalAreaIdHdr(Packet): - """ Local Area Identification Section 10.5.1.3 """ - name = "Location Area Identification" - fields_desc = [ - BitField("eightBitLAI", None, 1), - XBitField("ieiLAI", None, 7), - BitField("mccDigit2", 0x0, 4), - BitField("mccDigit1", 0x0, 4), - BitField("mncDigit3", 0x0, 4), - BitField("mccDigit3", 0x0, 4), - BitField("mncDigit2", 0x0, 4), - BitField("mncDigit1", 0x0, 4), - ByteField("lac1", 0x0), - ByteField("lac2", 0x0) - ] -# -# The Mobile Identity is a type 4 information element with a minimum -# length of 3 octet and 11 octets length maximal. -# - - -# len 3 - 11 -class MobileIdHdr(Packet): - """ Mobile Identity Section 10.5.1.4 """ - name = "Mobile Identity" - fields_desc = [ - BitField("eightBitMI", 0x0, 1), - XBitField("ieiMI", 0x0, 7), - - XByteField("lengthMI", None), - - BitField("idDigit1", 0x0, 4), - BitField("oddEven", 0x0, 1), - BitField("typeOfId", 0x0, 3), - - BitField("idDigit2_1", None, 4), # optional - BitField("idDigit2", None, 4), - - BitField("idDigit3_1", None, 4), - BitField("idDigit3", None, 4), - - BitField("idDigit4_1", None, 4), - BitField("idDigit4", None, 4), - - BitField("idDigit5_1", None, 4), - BitField("idDigit5", None, 4), - - BitField("idDigit6_1", None, 4), - BitField("idDigit6", None, 4), - BitField("idDigit7_1", None, 4), - BitField("idDigit7", None, 4), - BitField("idDigit8_1", None, 4), - BitField("idDigit8", None, 4), - BitField("idDigit9_1", None, 4), - BitField("idDigit9", None, 4), - ] - - def post_build(self, p, pay): - aList = [] - a = [] - i = 0 - for i in range(0, len(self.fields_desc)): - aList.append(self.fields_desc[i].name) - for i in aList: - a.append(getattr(self, i, None)) # this list holds the values of -# the variables, the INTERESSTING value! - res = adapt(3, 11, a, self.fields_desc) - if self.lengthMI is None: - p = p[:1] + struct.pack(">B", res[1]) + p[2:] - if res[0] is not 0: - p = p[:-res[0]] - print repr(p) - return p + pay - - -class MobileStationClassmark1Hdr(Packet): - """ Mobile Station Classmark 1 Section 10.5.1.5 """ - name = "Mobile Station Classmark 1" - fields_desc = [ - BitField("eightBitiMSC1", None, 1), - XBitField("ieiMSC1", None, 7), - BitField("spare", 0x0, 1), - BitField("revisionLvl", 0x0, 2), - BitField("esInd", 0x0, 1), - BitField("a51", 0x0, 1), - BitField("rfPowerCap", 0x0, 3) - ] - - -class MobileStationClassmark2Hdr(Packet): - """ Mobile Station Classmark 2 Section 10.5.1.6 """ - name = "Mobile Station Classmark 2" - fields_desc = [ - BitField("eightBitMSC2", None, 1), - XBitField("ieiMSC2", None, 7), - XByteField("lengthMSC2", 0x3), - BitField("spare", 0x0, 1), - BitField("revisionLvl", 0x0, 2), - BitField("esInd", 0x0, 1), - BitField("a51", 0x0, 1), - BitField("rfPowerCap", 0x0, 3), - BitField("spare1", 0x0, 1), - BitField("psCap", 0x0, 1), - BitField("ssScreenInd", 0x0, 2), - BitField("smCaPabi", 0x0, 1), - BitField("vbs", 0x0, 1), - BitField("vgcs", 0x0, 1), - BitField("fc", 0x0, 1), - BitField("cm3", 0x0, 1), - BitField("spare2", 0x0, 1), - BitField("lcsvaCap", 0x0, 1), - BitField("spare3", 0x0, 1), - BitField("soLsa", 0x0, 1), - BitField("cmsp", 0x0, 1), - BitField("a53", 0x0, 1), - BitField("a52", 0x0, 1) - ] - - -# len max 14 -class MobileStationClassmark3(Packet): - """ Mobile Station Classmark 3 Section 10.5.1.7 """ - name = "Mobile Station Classmark 3" - fields_desc = [ - # FIXME - ByteField("ieiMSC3", 0x0), - ByteField("byte2", 0x0), - ByteField("byte3", 0x0), - ByteField("byte4", 0x0), - ByteField("byte5", 0x0), - ByteField("byte6", 0x0), - ByteField("byte7", 0x0), - ByteField("byte8", 0x0), - ByteField("byte9", 0x0), - ByteField("byte10", 0x0), - ByteField("byte11", 0x0), - ByteField("byte12", 0x0), - ByteField("byte13", 0x0), - ByteField("byte14", 0x0) - ] - - -class SpareHalfOctets(Packet): - """ Spare Half Octet Section 10.5.1.8 """ - name = "Spare Half Octet" - fields_desc = [ - BitField("filler", None, 4), - BitField("spareHalfOctets", 0x0, 4) - ] - - -class DescriptiveGroupOrBroadcastCallReferenceHdr(Packet): - """ Descriptive group or broadcast call reference Section 10.5.1.9 """ - name = "Descriptive Group or Broadcast Call Reference" - fields_desc = [ - BitField("eightBitDGOBCR", None, 1), - XBitField("ieiDGOBCR", None, 7), - BitField("binCallRef", 0x0, 27), - BitField("sf", 0x0, 1), - BitField("fa", 0x0, 1), - BitField("callPrio", 0x0, 3), - BitField("cipherInfo", 0x0, 4), - BitField("spare1", 0x0, 1), - BitField("spare2", 0x0, 1), - BitField("spare3", 0x0, 1), - BitField("spare4", 0x0, 1) - ] - - -class GroupCipherKeyNumber(Packet): - """ Group Cipher Key Number reference Section 10.5.1.10 """ - name = "Group Cipher Key Number" - fields_desc = [ - XBitField("ieiGCKN", None, 4), - BitField("groupCipher", 0x0, 4) - ] - - -class PdAndSapiHdr(Packet): - """ PD and SAPI $(CCBS)$ Section 10.5.1.10a """ - name = "PD and SAPI $(CCBS)$" - fields_desc = [ - BitField("eightBitPAS", None, 1), - XBitField("ieiPAS", None, 7), - BitField("spare", 0x0, 1), - BitField("spare1", 0x0, 1), - BitField("sapi", 0x0, 2), - BitField("pd", 0x0, 4) - ] - - -class PriorityLevelHdr(Packet): - """ Priority Level Section 10.5.1.11 """ - name = "Priority Level" - fields_desc = [ - XBitField("ieiPL", None, 4), - BitField("spare", 0x0, 1), - BitField("callPrio", 0x0, 3) - ] - -# -# Radio Resource management information elements -# - - -# len 6 to max for L3 message (251) -class BaRangeHdr(Packet): - """ BA Range Section 10.5.2.1a """ - name = "BA Range" - fields_desc = [ - BitField("eightBitBR", None, 1), - XBitField("ieiBR", None, 7), - - XByteField("lengthBR", None), -#error: byte format requires -128 <= number <= 127 - ByteField("nrOfRanges", 0x0), -# # rX = range X -# # L o = Lower H i = higher -# # H p = high Part Lp = low Part - ByteField("r1LoHp", 0x0), - - BitField("r1LoLp", 0x0, 3), - BitField("r1HiHp", 0x0, 5), - - BitField("r1HiLp", 0x0, 4), - BitField("r2LoHp", 0x0, 4), - # optional - BitField("r2LoLp", None, 5), - BitField("r2HiHp", None, 3), - - ByteField("r2HiLp", None), - ByteField("r3LoHp", None), - - BitField("r3LoLp", None, 5), - BitField("r3HiHp", None, 3), - - ByteField("r3HiLp", None), - ByteField("r4LoHp", None), - - BitField("r4LoLp", None, 5), - BitField("r4HiHp", None, 3), - ByteField("r4HiLp", None), - ByteField("r5LoHp", None), - - BitField("r5LoLp", None, 5), - BitField("r5HiHp", None, 3), - ByteField("r5HiLp", None), - ByteField("r6LoHp", None), - - BitField("r6LoLp", None, 5), - BitField("r6HiHp", None, 3), - ByteField("r6HiLp", None), - ByteField("r7LoHp", None), - - BitField("r7LoLp", None, 5), - BitField("r7HiHp", None, 3), - ByteField("r7HiLp", None), - ByteField("r8LoHp", None), - - BitField("r8LoLp", None, 5), - BitField("r8HiHp", None, 3), - ByteField("r8HiLp", None), - ByteField("r9LoHp", None), - - BitField("r9LoLp", None, 5), - BitField("r9HiHp", None, 3), - ByteField("r9HiLp", None), - ByteField("r10LoHp", None), - - BitField("r10LoLp", None, 5), - BitField("r10HiHp", None, 3), - ByteField("r10HiLp", None), - ByteField("r11LoHp", None), - - BitField("r11LoLp", None, 5), - BitField("r11HiHp", None, 3), - ByteField("r11HiLp", None), - ByteField("r12LoHp", None), - - BitField("r12LoLp", None, 5), - BitField("r12HiHp", None, 3), - ByteField("r12HiLp", None), - ByteField("r13LoHp", None), - - BitField("r13LoLp", None, 5), - BitField("r13HiHp", None, 3), - ByteField("r13HiLp", None), - ByteField("r14LoHp", None), - - BitField("r14LoLp", None, 5), - BitField("r14HiHp", None, 3), - ByteField("r14HiLp", None), - ByteField("r15LoHp", None), - - BitField("r15LoLp", None, 5), - BitField("r15HiHp", None, 3), - ByteField("r15HiLp", None), - ByteField("r16LoHp", None), - - BitField("r16LoLp", None, 5), - BitField("r16HiHp", None, 3), - ByteField("r16HiLp", None), - ByteField("r17LoHp", None), - - BitField("r17LoLp", None, 5), - BitField("r17HiHp", None, 3), - ByteField("r17HiLp", None), - ByteField("r18LoHp", None), - - BitField("r18LoLp", None, 5), - BitField("r18HiHp", None, 3), - ByteField("r18HiLp", None), - ByteField("r19LoHp", None), - - BitField("r19LoLp", None, 5), - BitField("r19HiHp", None, 3), - ByteField("r19HiLp", None), - ByteField("r20LoHp", None), - - BitField("r20LoLp", None, 5), - BitField("r20HiHp", None, 3), - ByteField("r20HiLp", None), - ByteField("r21LoHp", None), - - BitField("r21LoLp", None, 5), - BitField("r21HiHp", None, 3), - ByteField("r21HiLp", None), - ByteField("r22LoHp", None), - - BitField("r22LoLp", None, 5), - BitField("r22HiHp", None, 3), - ByteField("r22HiLp", None), - ByteField("r23LoHp", None), - - BitField("r23LoLp", None, 5), - BitField("r23HiHp", None, 3), - ByteField("r23HiLp", None), - ByteField("r24LoHp", None), - - BitField("r24LoLp", None, 5), - BitField("r24HiHp", None, 3), - ByteField("r24HiLp", None), - ByteField("r25LoHp", None), - - BitField("r25LoLp", None, 5), - BitField("r25HiHp", None, 3), - ByteField("r25HiLp", None), - ByteField("r26LoHp", None), - - BitField("r26LoLp", None, 5), - BitField("r26HiHp", None, 3), - ByteField("r26HiLp", None), - ByteField("r27LoHp", None), - - BitField("r27LoLp", None, 5), - BitField("r27HiHp", None, 3), - ByteField("r27HiLp", None), - ByteField("r28LoHp", None), - - BitField("r28LoLp", None, 5), - BitField("r28HiHp", None, 3), - ByteField("r28HiLp", None), - ByteField("r29LoHp", None), - - BitField("r29LoLp", None, 5), - BitField("r29HiHp", None, 3), - ByteField("r29HiLp", None), - ByteField("r30LoHp", None), - - BitField("r30LoLp", None, 5), - BitField("r30HiHp", None, 3), - ByteField("r30HiLp", None), - ByteField("r31LoHp", None), - - BitField("r31LoLp", None, 5), - BitField("r31HiHp", None, 3), - ByteField("r31HiLp", None), - ByteField("r32LoHp", None), - - BitField("r32LoLp", None, 5), - BitField("r32HiHp", None, 3), - ByteField("r32HiLp", None), - ByteField("r33LoHp", None), - - BitField("r33LoLp", None, 5), - BitField("r33HiHp", None, 3), - ByteField("r33HiLp", None), - ByteField("r34LoHp", None), - - BitField("r34LoLp", None, 5), - BitField("r34HiHp", None, 3), - ByteField("r34HiLp", None), - ByteField("r35LoHp", None), - - BitField("r35LoLp", None, 5), - BitField("r35HiHp", None, 3), - ByteField("r35HiLp", None), - ByteField("r36LoHp", None), - - BitField("r36LoLp", None, 5), - BitField("r36HiHp", None, 3), - ByteField("r36HiLp", None), - ByteField("r37LoHp", None), - - BitField("r37LoLp", None, 5), - BitField("r37HiHp", None, 3), - ByteField("r37HiLp", None), - ByteField("r38LoHp", None), - - BitField("r38LoLp", None, 5), - BitField("r38HiHp", None, 3), - ByteField("r38HiLp", None), - ByteField("r39LoHp", None), - - BitField("r39LoLp", None, 5), - BitField("r39HiHp", None, 3), - ByteField("r39HiLp", None), - ByteField("r40LoHp", None), - - BitField("r40LoLp", None, 5), - BitField("r40HiHp", None, 3), - ByteField("r40HiLp", None), - ByteField("r41LoHp", None), - - BitField("r41LoLp", None, 5), - BitField("r41HiHp", None, 3), - ByteField("r41HiLp", None), - ByteField("r42LoHp", None), - - BitField("r42LoLp", None, 5), - BitField("r42HiHp", None, 3), - ByteField("r42HiLp", None), - ByteField("r43LoHp", None), - - BitField("r43LoLp", None, 5), - BitField("r43HiHp", None, 3), - ByteField("r43HiLp", None), - ByteField("r44LoHp", None), - - BitField("r44LoLp", None, 5), - BitField("r44HiHp", None, 3), - ByteField("r44HiLp", None), - ByteField("r45LoHp", None), - - BitField("r45LoLp", None, 5), - BitField("r45HiHp", None, 3), - ByteField("r45HiLp", None), - ByteField("r46LoHp", None), - - BitField("r46LoLp", None, 5), - BitField("r46HiHp", None, 3), - ByteField("r46HiLp", None), - ByteField("r47LoHp", None), - - BitField("r47LoLp", None, 5), - BitField("r47HiHp", None, 3), - ByteField("r47HiLp", None), - ByteField("r48LoHp", None), - - BitField("r48LoLp", None, 5), - BitField("r48HiHp", None, 3), - ByteField("r48HiLp", None), - ByteField("r49LoHp", None), - - BitField("r49LoLp", None, 5), - BitField("r49HiHp", None, 3), - ByteField("r49HiLp", None), - ByteField("r50LoHp", None), - - BitField("r50LoLp", None, 5), - BitField("r50HiHp", None, 3), - ByteField("r50HiLp", None), - ByteField("r51LoHp", None), - - BitField("r51LoLp", None, 5), - BitField("r51HiHp", None, 3), - ByteField("r51HiLp", None), - ByteField("r52LoHp", None), - - BitField("r52LoLp", None, 5), - BitField("r52HiHp", None, 3), - ByteField("r52HiLp", None), - ByteField("r53LoHp", None), - - BitField("r53LoLp", None, 5), - BitField("r53HiHp", None, 3), - ByteField("r53HiLp", None), - ByteField("r54LoHp", None), - - BitField("r54LoLp", None, 5), - BitField("r54HiHp", None, 3), - ByteField("r54HiLp", None), - ByteField("r55LoHp", None), - - BitField("r55LoLp", None, 5), - BitField("r55HiHp", None, 3), - ByteField("r55HiLp", None), - ByteField("r56LoHp", None), - - BitField("r56LoLp", None, 5), - BitField("r56HiHp", None, 3), - ByteField("r56HiLp", None), - ByteField("r57LoHp", None), - - BitField("r57LoLp", None, 5), - BitField("r57HiHp", None, 3), - ByteField("r57HiLp", None), - ByteField("r58LoHp", None), - - BitField("r58LoLp", None, 5), - BitField("r58HiHp", None, 3), - ByteField("r58HiLp", None), - ByteField("r59LoHp", None), - - BitField("r59LoLp", None, 5), - BitField("r59HiHp", None, 3), - ByteField("r59HiLp", None), - ByteField("r60LoHp", None), - - BitField("r60LoLp", None, 5), - BitField("r60HiHp", None, 3), - ByteField("r60HiLp", None), - ByteField("r61LoHp", None), - - BitField("r61LoLp", None, 5), - BitField("r61HiHp", None, 3), - ByteField("r61HiLp", None), - ByteField("r62LoHp", None), - - BitField("r62LoLp", None, 5), - BitField("r62HiHp", None, 3), - ByteField("r62HiLp", None), - ByteField("r63LoHp", None), - - BitField("r63LoLp", None, 5), - BitField("r63HiHp", None, 3), - ByteField("r63HiLp", None), - ByteField("r64LoHp", None), - - BitField("r64LoLp", None, 5), - BitField("r64HiHp", None, 3), - ByteField("r64HiLp", None), - ByteField("r65LoHp", None), - - BitField("r65LoLp", None, 5), - BitField("r65HiHp", None, 3), - ByteField("r65HiLp", None), - ByteField("r66LoHp", None), - - BitField("r66LoLp", None, 5), - BitField("r66HiHp", None, 3), - ByteField("r66HiLp", None), - ByteField("r67LoHp", None), - - BitField("r67LoLp", None, 5), - BitField("r67HiHp", None, 3), - ByteField("r67HiLp", None), - ByteField("r68LoHp", None), - - BitField("r68LoLp", None, 5), - BitField("r68HiHp", None, 3), - ByteField("r68HiLp", None), - ByteField("r69LoHp", None), - - BitField("r69LoLp", None, 5), - BitField("r69HiHp", None, 3), - ByteField("r69HiLp", None), - ByteField("r70LoHp", None), - - BitField("r70LoLp", None, 5), - BitField("r70HiHp", None, 3), - ByteField("r70HiLp", None), - ByteField("r71LoHp", None), - - BitField("r71LoLp", None, 5), - BitField("r71HiHp", None, 3), - ByteField("r71HiLp", None), - ByteField("r72LoHp", None), - - BitField("r72LoLp", None, 5), - BitField("r72HiHp", None, 3), - ByteField("r72HiLp", None), - ByteField("r73LoHp", None), - - BitField("r73LoLp", None, 5), - BitField("r73HiHp", None, 3), - ByteField("r73HiLp", None), - ByteField("r74LoHp", None), - - BitField("r74LoLp", None, 5), - BitField("r74HiHp", None, 3), - ByteField("r74HiLp", None), - ByteField("r75LoHp", None), - - BitField("r75LoLp", None, 5), - BitField("r75HiHp", None, 3), - ByteField("r75HiLp", None), - ByteField("r76LoHp", None), - - BitField("r76LoLp", None, 5), - BitField("r76HiHp", None, 3), - ByteField("r76HiLp", None), - ByteField("r77LoHp", None), - - BitField("r77LoLp", None, 5), - BitField("r77HiHp", None, 3), - ByteField("r77HiLp", None), - ByteField("r78LoHp", None), - - BitField("r78LoLp", None, 5), - BitField("r78HiHp", None, 3), - ByteField("r78HiLp", None), - ByteField("r79LoHp", None), - - BitField("r79LoLp", None, 5), - BitField("r79HiHp", None, 3), - ByteField("r79HiLp", None), - ByteField("r80LoHp", None), - - BitField("r80LoLp", None, 5), - BitField("r80HiHp", None, 3), - ByteField("r80HiLp", None), - ByteField("r81LoHp", None), - - BitField("r81LoLp", None, 5), - BitField("r81HiHp", None, 3), - ByteField("r81HiLp", None), - ByteField("r82LoHp", None), - - BitField("r82LoLp", None, 5), - BitField("r82HiHp", None, 3), - ByteField("r82HiLp", None), - ByteField("r83LoHp", None), - - BitField("r83LoLp", None, 5), - BitField("r83HiHp", None, 3), - ByteField("r83HiLp", None), - ByteField("r84LoHp", None), - - BitField("r84LoLp", None, 5), - BitField("r84HiHp", None, 3), - ByteField("r84HiLp", None) - ] - - def post_build(self, p, pay): - aList = [] - a = [] - i = 0 - for i in range(0, len(self.fields_desc)): - print "i is %s" % (i,) - aList.append(self.fields_desc[i].name) - print "aList %s" % (len(aList)) - print "self.fields_desc %s" % (len(self.fields_desc)) - for i in aList: - a.append(getattr(self, i)) - res = adapt(6, 251, a, self.fields_desc) - if self.lengthBR is None: - p = p[:1] + struct.pack(">B", res[1]) + p[2:] - if res[0] is not 0: - p = p[:-res[0]] - return p + pay - - -# len 3 to max for L3 message (251) -class BaListPrefHdr(Packet): - """ BA List Pref Section 10.5.2.1c """ - name = "BA List Pref" - fields_desc = [ - # FIXME dynamic - BitField("eightBitBLP", None, 1), - XBitField("ieiBLP", None, 7), - - XByteField("lengthBLP", None), - - BitField("fixBit", 0x0, 1), - BitField("rangeLower", 0x0, 10), - BitField("fixBit2", 0x0, 1), - BitField("rangeUpper", 0x0, 10), - BitField("baFreq", 0x0, 10), - BitField("sparePad", 0x0, 8) - ] - - -# len 17 || Have a look at the specs for the field format -# Bit map 0 format -# Range 1024 format -# Range 512 format -# Range 256 format -# Range 128 format -# Variable bit map format -class CellChannelDescriptionHdr(Packet): - """ Cell Channel Description Section 10.5.2.1b """ - name = "Cell Channel Description " - fields_desc = [ - BitField("eightBitCCD", None, 1), - XBitField("ieiCCD", None, 7), - BitField("bit128", 0x0, 1), - BitField("bit127", 0x0, 1), - BitField("spare1", 0x0, 1), - BitField("spare2", 0x0, 1), - BitField("bit124", 0x0, 1), - BitField("bit123", 0x0, 1), - BitField("bit122", 0x0, 1), - BitField("bit121", 0x0, 1), - ByteField("bit120", 0x0), - ByteField("bit112", 0x0), - ByteField("bit104", 0x0), - ByteField("bit96", 0x0), - ByteField("bit88", 0x0), - ByteField("bit80", 0x0), - ByteField("bit72", 0x0), - ByteField("bit64", 0x0), - ByteField("bit56", 0x0), - ByteField("bit48", 0x0), - ByteField("bit40", 0x0), - ByteField("bit32", 0x0), - ByteField("bit24", 0x0), - ByteField("bit16", 0x0), - ByteField("bit8", 0x0) - ] - - -class CellDescriptionHdr(Packet): - """ Cell Description Section 10.5.2.2 """ - name = "Cell Description" - fields_desc = [ - BitField("eightBitCD", None, 1), - XBitField("ieiCD", None, 7), - BitField("bcchHigh", 0x0, 2), - BitField("ncc", 0x0, 3), - BitField("bcc", 0x0, 3), - ByteField("bcchLow", 0x0) - ] - - -class CellOptionsBCCHHdr(Packet): - """ Cell Options (BCCH) Section 10.5.2.3 """ - name = "Cell Options (BCCH)" - fields_desc = [ - BitField("eightBitCOB", None, 1), - XBitField("ieiCOB", None, 7), - BitField("spare", 0x0, 1), - BitField("pwrc", 0x0, 1), - BitField("dtx", 0x0, 2), - BitField("rLinkTout", 0x0, 4) - ] - - -class CellOptionsSACCHHdr(Packet): - """ Cell Options (SACCH) Section 10.5.2.3a """ - name = "Cell Options (SACCH)" - fields_desc = [ - BitField("eightBitCOS", None, 1), - XBitField("ieiCOS", None, 7), - BitField("dtx", 0x0, 1), - BitField("pwrc", 0x0, 1), - BitField("dtx", 0x0, 1), - BitField("rLinkTout", 0x0, 4) - ] - - -class CellSelectionParametersHdr(Packet): - """ Cell Selection Parameters Section 10.5.2.4 """ - name = "Cell Selection Parameters" - fields_desc = [ - BitField("eightBitCSP", None, 1), - XBitField("ieiCSP", None, 7), - BitField("cellReselect", 0x0, 3), - BitField("msTxPwrMax", 0x0, 5), - BitField("acs", None, 1), - BitField("neci", None, 1), - BitField("rxlenAccMin", None, 6) - ] - - -class MacModeAndChannelCodingRequestHdr(Packet): - """ MAC Mode and Channel Coding Requested Section 10.5.2.4a """ - name = "MAC Mode and Channel Coding Requested" - fields_desc = [ - XBitField("ieiMMACCR", None, 4), - BitField("macMode", 0x0, 2), - BitField("cs", 0x0, 2) - ] - - -class ChannelDescriptionHdr(Packet): - """ Channel Description Section 10.5.2.5 """ - name = "Channel Description" - fields_desc = [ - BitField("eightBitCD", None, 1), - XBitField("ieiCD", None, 7), - - BitField("channelTyp", 0x0, 5), - BitField("tn", 0x0, 3), - - BitField("tsc", 0x0, 3), - BitField("h", 0x1, 1), - # if h=1 maybe we find a better solution here... - BitField("maioHi", 0x0, 4), - - BitField("maioLo", 0x0, 2), - BitField("hsn", 0x0, 6) - #BitField("spare", 0x0, 2), - #BitField("arfcnHigh", 0x0, 2), - #ByteField("arfcnLow", 0x0) - ] - - -class ChannelDescription2Hdr(Packet): - """ Channel Description 2 Section 10.5.2.5a """ - name = "Channel Description 2" - fields_desc = [ - BitField("eightBitCD2", None, 1), - XBitField("ieiCD2", None, 7), - BitField("channelTyp", 0x0, 5), - BitField("tn", 0x0, 3), - BitField("tsc", 0x0, 3), - BitField("h", 0x0, 1), - # if h=1 - # BitField("maioHi", 0x0, 4), - # BitField("maioLo", 0x0, 2), - # BitField("hsn", 0x0, 6) - BitField("spare", 0x0, 2), - BitField("arfcnHigh", 0x0, 2), - ByteField("arfcnLow", 0x0) - ] - - -class ChannelModeHdr(Packet): - """ Channel Mode Section 10.5.2.6 """ - name = "Channel Mode" - fields_desc = [ - BitField("eightBitCM", None, 1), - XBitField("ieiCM", None, 7), - ByteField("mode", 0x0) - ] - - -class ChannelMode2Hdr(Packet): - """ Channel Mode 2 Section 10.5.2.7 """ - name = "Channel Mode 2" - fields_desc = [ - BitField("eightBitCM2", None, 1), - XBitField("ieiCM2", None, 7), - ByteField("mode", 0x0) - ] - - -class ChannelNeededHdr(Packet): - """ Channel Needed Section 10.5.2.8 """ - name = "Channel Needed" - fields_desc = [ - XBitField("ieiCN", None, 4), - BitField("channel2", 0x0, 2), - BitField("channel1", 0x0, 2), - ] - - -class ChannelRequestDescriptionHdr(Packet): - """Channel Request Description Section 10.5.2.8a """ - name = "Channel Request Description" - fields_desc = [ - BitField("eightBitCRD", None, 1), - XBitField("ieiCRD", None, 7), - BitField("mt", 0x0, 1), - ConditionalField(BitField("spare", 0x0, 39), - lambda pkt: pkt.mt == 0), - ConditionalField(BitField("spare", 0x0, 3), - lambda pkt: pkt.mt == 1), - ConditionalField(BitField("priority", 0x0, 2), - lambda pkt: pkt.mt == 1), - ConditionalField(BitField("rlcMode", 0x0, 1), - lambda pkt: pkt.mt == 1), - ConditionalField(BitField("llcFrame", 0x1, 1), - lambda pkt: pkt.mt == 1), - ConditionalField(ByteField("reqBandMsb", 0x0), - lambda pkt: pkt.mt == 1), - ConditionalField(ByteField("reqBandLsb", 0x0), - lambda pkt: pkt.mt == 1), - ConditionalField(ByteField("rlcMsb", 0x0), - lambda pkt: pkt.mt == 1), - ConditionalField(ByteField("rlcLsb", 0x0), - lambda pkt: pkt.mt == 1) - ] - - -class CipherModeSettingHdr(Packet): - """Cipher Mode Setting Section 10.5.2.9 """ - name = "Cipher Mode Setting" - fields_desc = [ - XBitField("ieiCMS", None, 4), - BitField("algoId", 0x0, 3), - BitField("sc", 0x0, 1), - ] - - -class CipherResponseHdr(Packet): - """Cipher Response Section 10.5.2.10 """ - name = "Cipher Response" - fields_desc = [ - XBitField("ieiCR", None, 4), - BitField("spare", 0x0, 3), - BitField("cr", 0x0, 1), - ] - - -# This packet fixes the problem with the 1/2 Byte length. Concatenation -# of cipherModeSetting and cipherResponse -class CipherModeSettingAndcipherResponse(Packet): - name = "Cipher Mode Setting And Cipher Response" - fields_desc = [ - BitField("algoId", 0x0, 3), - BitField("sc", 0x0, 1), - BitField("spare", 0x0, 3), - BitField("cr", 0x0, 1) - ] - - -class ControlChannelDescriptionHdr(Packet): - """Control Channel Description Section 10.5.2.11 """ - name = "Control Channel Description" - fields_desc = [ - BitField("eightBitCCD", None, 1), - XBitField("ieiCCD", None, 7), - - BitField("spare", 0x0, 1), - BitField("att", 0x0, 1), - BitField("bsAgBlksRes", 0x0, 3), - BitField("ccchConf", 0x0, 3), - - BitField("spare", 0x0, 1), - BitField("spare1", 0x0, 1), - BitField("spare2", 0x0, 1), - BitField("spare3", 0x0, 1), - BitField("spare4", 0x0, 1), - BitField("bsPaMfrms", 0x0, 3), - - ByteField("t3212", 0x0) - ] - - -class FrequencyChannelSequenceHdr(Packet): - """Frequency Channel Sequence Section 10.5.2.12""" - name = "Frequency Channel Sequence" - fields_desc = [ - BitField("eightBitFCS", None, 1), - XBitField("ieiFCS", None, 7), - BitField("spare", 0x0, 1), - BitField("lowestArfcn", 0x0, 7), - BitField("skipArfcn01", 0x0, 4), - BitField("skipArfcn02", 0x0, 4), - BitField("skipArfcn03", 0x0, 4), - BitField("skipArfcn04", 0x0, 4), - BitField("skipArfcn05", 0x0, 4), - BitField("skipArfcn06", 0x0, 4), - BitField("skipArfcn07", 0x0, 4), - BitField("skipArfcn08", 0x0, 4), - BitField("skipArfcn09", 0x0, 4), - BitField("skipArfcn10", 0x0, 4), - BitField("skipArfcn11", 0x0, 4), - BitField("skipArfcn12", 0x0, 4), - BitField("skipArfcn13", 0x0, 4), - BitField("skipArfcn14", 0x0, 4), - BitField("skipArfcn15", 0x0, 4), - BitField("skipArfcn16", 0x0, 4) - ] - - -class FrequencyListHdr(Packet): - """Frequency List Section 10.5.2.13""" - name = "Frequency List" - # Problem: - # There are several formats for the Frequency List information - # element, distinguished by the "format indicator" subfield. - # Some formats are frequency bit maps, the others use a special encoding - # scheme. - fields_desc = [ - BitField("eightBitFL", None, 1), - XBitField("ieiFL", None, 7), - XByteField("lengthFL", None), - - BitField("formatID", 0x0, 2), - BitField("spare", 0x0, 2), - BitField("arfcn124", 0x0, 1), - BitField("arfcn123", 0x0, 1), - BitField("arfcn122", 0x0, 1), - BitField("arfcn121", 0x0, 1), - - ByteField("arfcn120", 0x0), - ByteField("arfcn112", 0x0), - ByteField("arfcn104", 0x0), - ByteField("arfcn96", 0x0), - ByteField("arfcn88", 0x0), - ByteField("arfcn80", 0x0), - ByteField("arfcn72", 0x0), - ByteField("arfcn64", 0x0), - ByteField("arfcn56", 0x0), - ByteField("arfcn48", 0x0), - ByteField("arfcn40", 0x0), - ByteField("arfcn32", 0x0), - ByteField("arfcn24", 0x0), - ByteField("arfcn16", 0x0), - ByteField("arfcn8", 0x0) - ] - - -class FrequencyShortListHdr(Packet): - """Frequency Short List Section 10.5.2.14""" - name = "Frequency Short List" -# len is 10 -#This element is encoded exactly as the Frequency List information element, -#except that it has a fixed length instead of a -#variable length and does not contain a length indicator and that it -#shall not be encoded in bitmap 0 format. - fields_desc = [ - ByteField("ieiFSL", 0x0), - ByteField("byte2", 0x0), - ByteField("byte3", 0x0), - ByteField("byte4", 0x0), - ByteField("byte5", 0x0), - ByteField("byte6", 0x0), - ByteField("byte7", 0x0), - ByteField("byte8", 0x0), - ByteField("byte9", 0x0), - ByteField("byte10", 0x0) - ] - - -class FrequencyShortListHdr2(Packet): - """Frequency Short List2 Section 10.5.2.14a""" - name = "Frequency Short List 2" - fields_desc = [ - ByteField("byte1", 0x0), - ByteField("byte2", 0x0), - ByteField("byte3", 0x0), - ByteField("byte4", 0x0), - ByteField("byte5", 0x0), - ByteField("byte6", 0x0), - ByteField("byte7", 0x0), - ByteField("byte8", 0x0) - ] - - -# len 4 to 13 -class GroupChannelDescriptionHdr(Packet): - """Group Channel Description Section 10.5.2.14b""" - name = "Group Channel Description" - fields_desc = [ - BitField("eightBitGCD", None, 1), - XBitField("ieiGCD", None, 7), - - XByteField("lengthGCD", None), - - BitField("channelType", 0x0, 5), - BitField("tn", 0x0, 3), - - BitField("tsc", 0x0, 3), - BitField("h", 0x0, 1), - # if h == 0 the packet looks the following way: - ConditionalField(BitField("spare", 0x0, 2), - lambda pkt: pkt. h == 0x0), - ConditionalField(BitField("arfcnHi", 0x0, 2), - lambda pkt: pkt. h == 0x0), - ConditionalField(ByteField("arfcnLo", None), - lambda pkt: pkt. h == 0x0), - # if h == 1 the packet looks the following way: - ConditionalField(BitField("maioHi", 0x0, 4), - lambda pkt: pkt. h == 0x1), - ConditionalField(BitField("maioLo", None, 2), - lambda pkt: pkt. h == 0x1), - ConditionalField(BitField("hsn", None, 6), - lambda pkt: pkt. h == 0x1), - # finished with conditional fields - ByteField("maC6", None), - ByteField("maC7", None), - ByteField("maC8", None), - ByteField("maC9", None), - ByteField("maC10", None), - ByteField("maC11", None), - ByteField("maC12", None), - ByteField("maC13", None), - ByteField("maC14", None) - ] - - def post_build(self, p, pay): - aList = [] - a = [] - i = 0 - for i in range(0, len(self.fields_desc)): - aList.append(self.fields_desc[i].name) - for i in aList: - a.append(getattr(self, i)) - res = adapt(4, 13, a, self.fields_desc) - if self.lengthGCD is None: - p = p[:1] + struct.pack(">B", res[1]) + p[2:] - if res[0] is not 0: - p = p[:-res[0]] - return p + pay - - -class GprsResumptionHdr(Packet): - """GPRS Resumption Section 10.5.2.14c""" - name = "GPRS Resumption" - fields_desc = [ - XBitField("ieiGR", None, 4), - BitField("spare", 0x0, 3), - BitField("ack", 0x0, 1) - ] - - -class HandoverReferenceHdr(Packet): - """Handover Reference Section 10.5.2.15""" - name = "Handover Reference" - fields_desc = [ - BitField("eightBitHR", None, 1), - XBitField("ieiHR", None, 7), - ByteField("handoverRef", 0x0) - ] - - -# len 1-12 -class IaRestOctets(Packet): - """IA Rest Octets Section 10.5.2.16""" - name = "IA Rest Octets" - fields_desc = [ - ByteField("ieiIRO", 0x0), - # FIXME brainfuck packet - XByteField("lengthIRO", None), - ByteField("byte2", None), - ByteField("byte3", None), - ByteField("byte4", None), - ByteField("byte5", None), - ByteField("byte6", None), - ByteField("byte7", None), - ByteField("byte8", None), - ByteField("byte9", None), - ByteField("byte10", None), - ByteField("byte11", None) - ] - - def post_build(self, p, pay): - aList = [] - a = [] - i = 0 - for i in range(0, len(self.fields_desc)): - aList.append(self.fields_desc[i].name) - for i in aList: - a.append(getattr(self, i)) - res = adapt(1, 12, a, self.fields_desc) - if self.lengthIRO is None: - if res[1] < 0: # FIXME better fix - res[1] = 0 - p = p[:1] + struct.pack(">B", res[1]) + p[2:] - if res[0] is not 0: - p = p[:-res[0]] - return p + pay - - -class IraRestOctetsHdr(Packet): - """IAR Rest Octets Section 10.5.2.17""" - name = "IAR Rest Octets" - fields_desc = [ - BitField("eightBitIRO", None, 1), - XBitField("ieiIRO", None, 7), - BitField("spare01", 0x0, 1), - BitField("spare02", 0x0, 1), - BitField("spare03", 0x1, 1), - BitField("spare04", 0x0, 1), - BitField("spare05", 0x1, 1), - BitField("spare06", 0x0, 1), - BitField("spare07", 0x1, 1), - BitField("spare08", 0x1, 1), - BitField("spare09", 0x0, 1), - BitField("spare10", 0x0, 1), - BitField("spare11", 0x1, 1), - BitField("spare12", 0x0, 1), - BitField("spare13", 0x1, 1), - BitField("spare14", 0x0, 1), - BitField("spare15", 0x1, 1), - BitField("spare16", 0x1, 1), - BitField("spare17", 0x0, 1), - BitField("spare18", 0x0, 1), - BitField("spare19", 0x1, 1), - BitField("spare20", 0x0, 1), - BitField("spare21", 0x1, 1), - BitField("spare22", 0x0, 1), - BitField("spare23", 0x1, 1), - BitField("spare24", 0x1, 1) - ] - - -# len is 1 to 5 what do we do with the variable size? no lenght -# field?! WTF -class IaxRestOctetsHdr(Packet): - """IAX Rest Octets Section 10.5.2.18""" - name = "IAX Rest Octets" - fields_desc = [ - BitField("eightBitIRO", None, 1), - XBitField("ieiIRO", None, 7), - BitField("spare01", 0x0, 1), - BitField("spare02", 0x0, 1), - BitField("spare03", 0x1, 1), - BitField("spare04", 0x0, 1), - BitField("spare05", 0x1, 1), - BitField("spare06", 0x0, 1), - BitField("spare07", 0x1, 1), - BitField("spare08", 0x1, 1), - ByteField("spareB1", None), - ByteField("spareB2", None), - ByteField("spareB3", None) - ] - - -class L2PseudoLengthHdr(Packet): - """L2 Pseudo Length Section 10.5.2.19""" - name = "L2 Pseudo Length" - fields_desc = [ - BitField("eightBitPL", None, 1), - XBitField("ieiPL", None, 7), - BitField("l2pLength", None, 6), - BitField("bit2", 0x0, 1), - BitField("bit1", 0x1, 1) - ] - - -class MeasurementResultsHdr(Packet): - """Measurement Results Section 10.5.2.20""" - name = "Measurement Results" - fields_desc = [ - BitField("eightBitMR", None, 1), - XBitField("ieiMR", None, 7), - BitField("baUsed", 0x0, 1), - BitField("dtxUsed", 0x0, 1), - BitField("rxLevFull", 0x0, 6), - BitField("spare", 0x0, 1), - BitField("measValid", 0x0, 1), - BitField("rxLevSub", 0x0, 6), - BitField("spare0", 0x0, 1), - BitField("rxqualFull", 0x0, 3), - BitField("rxqualSub", 0x0, 3), - BitField("noNcellHi", 0x0, 1), - BitField("noNcellLo", 0x0, 2), - BitField("rxlevC1", 0x0, 6), - BitField("bcchC1", 0x0, 5), - BitField("bsicC1Hi", 0x0, 3), - BitField("bsicC1Lo", 0x0, 3), - BitField("rxlevC2", 0x0, 5), - BitField("rxlevC2Lo", 0x0, 1), - BitField("bcchC2", 0x0, 5), - BitField("bsicC1Hi", 0x0, 2), - BitField("bscicC2Lo", 0x0, 4), - BitField("bscicC2Hi", 0x0, 4), - - BitField("rxlevC3Lo", 0x0, 2), - BitField("bcchC3", 0x0, 5), - BitField("rxlevC3Hi", 0x0, 1), - - BitField("bsicC3Lo", 0x0, 5), - BitField("bsicC3Hi", 0x0, 3), - - BitField("rxlevC4Lo", 0x0, 3), - BitField("bcchC4", 0x0, 5), - - BitField("bsicC4", 0x0, 6), - BitField("rxlevC5Hi", 0x0, 2), - - BitField("rxlevC5Lo", 0x0, 4), - BitField("bcchC5Hi", 0x0, 4), - - BitField("bcchC5Lo", 0x0, 1), - BitField("bsicC5", 0x0, 6), - BitField("rxlevC6", 0x0, 1), - - BitField("rxlevC6Lo", 0x0, 5), - BitField("bcchC6Hi", 0x0, 3), - - BitField("bcchC6Lo", 0x0, 3), - BitField("bsicC6", 0x0, 5) - ] - - -class GprsMeasurementResultsHdr(Packet): - """GPRS Measurement Results Section 10.5.2.20a""" - name = "GPRS Measurement Results" - fields_desc = [ - BitField("eightBitGMR", None, 1), - XBitField("ieiGMR", None, 7), - BitField("cValue", 0x0, 6), - BitField("rxqualHi", 0x0, 2), - BitField("rxqL", 0x0, 1), - BitField("spare", 0x0, 1), - BitField("signVar", 0x0, 6) - ] - - -# len 3 to 10 -class MobileAllocationHdr(Packet): - """Mobile Allocation Section 10.5.2.21""" - name = "Mobile Allocation" - fields_desc = [ - BitField("eightBitMA", None, 1), - XBitField("ieiMA", None, 7), - XByteField("lengthMA", None), - ByteField("maC64", 0x12), - ByteField("maC56", None), # optional fields start here - ByteField("maC48", None), - ByteField("maC40", None), - ByteField("maC32", None), - ByteField("maC24", None), - ByteField("maC16", None), - ByteField("maC8", None) - ] - - def post_build(self, p, pay): - aList = [] - a = [] - i = 0 - for i in range(0, len(self.fields_desc)): - aList.append(self.fields_desc[i].name) - for i in aList: - a.append(getattr(self, i)) - res = adapt(3, 10, a, self.fields_desc) - if self.lengthMA is None: - p = p[:1] + struct.pack(">B", res[1]) + p[2:] - if res[0] is not 0: - p = p[:-res[0]] - return p + pay - - -class MobileTimeDifferenceHdr(Packet): - """Mobile Time Difference Section 10.5.2.21a""" - name = "Mobile Time Difference" - fields_desc = [ - BitField("eightBitMTD", None, 1), - XBitField("ieiMTD", None, 7), - XByteField("lengthMTD", 0x5), - ByteField("valueHi", 0x0), - ByteField("valueCnt", 0x0), - BitField("valueLow", 0x0, 5), - BitField("spare", 0x0, 1), - BitField("spare1", 0x0, 1), - BitField("spare2", 0x0, 1) - ] - - -# min 4 octets max 8 -class MultiRateConfigurationHdr(Packet): - """ MultiRate configuration Section 10.5.2.21aa""" - name = "MultiRate Configuration" - fields_desc = [ - BitField("eightBitMRC", None, 1), - XBitField("ieiMRC", None, 7), - - XByteField("lengthMRC", None), - - BitField("mrVersion", 0x0, 3), - BitField("spare", 0x0, 1), - BitField("icmi", 0x0, 1), - BitField("spare", 0x0, 1), - BitField("startMode", 0x0, 2), - - ByteField("amrCodec", 0x0), - - BitField("spare", None, 2), - BitField("threshold1", None, 6), - - BitField("hysteresis1", None, 4), - BitField("threshold2", None, 4), - - BitField("threshold2cnt", None, 2), - BitField("hysteresis2", None, 4), - BitField("threshold3", None, 2), - - BitField("threshold3cnt", None, 4), - BitField("hysteresis3", None, 4) - ] - - def post_build(self, p, pay): - aList = [] - a = [] - i = 0 - for i in range(0, len(self.fields_desc)): - aList.append(self.fields_desc[i].name) - for i in aList: - a.append(getattr(self, i)) - res = adapt(4, 8, a, self.fields_desc) - if self.lengthMRC is None: - p = p[:1] + struct.pack(">B", res[1]) + p[2:] - if res[0] is not 0: - p = p[:-res[0]] - return p + pay - - -# len 3 to 12 -class MultislotAllocationHdr(Packet): - """Multislot Allocation Section 10.5.2.21b""" - name = "Multislot Allocation" - fields_desc = [ - BitField("eightBitMSA", None, 1), - XBitField("ieiMSA", None, 7), - XByteField("lengthMSA", None), - BitField("ext0", 0x1, 1), - BitField("da", 0x0, 7), - ConditionalField(BitField("ext1", 0x1, 1), # optional - lambda pkt: pkt.ext0 == 0), - ConditionalField(BitField("ua", 0x0, 7), - lambda pkt: pkt.ext0 == 0), - ByteField("chan1", None), - ByteField("chan2", None), - ByteField("chan3", None), - ByteField("chan4", None), - ByteField("chan5", None), - ByteField("chan6", None), - ByteField("chan7", None), - ByteField("chan8", None) - ] - - def post_build(self, p, pay): - aList = [] - a = [] - i = 0 - for i in range(0, len(self.fields_desc)): - aList.append(self.fields_desc[i].name) - for i in aList: - a.append(getattr(self, i)) - res = adapt(3, 12, a, self.fields_desc) - if res[0] is not 0: - p = p[:-res[0]] - if self.lengthMSA is None: - p = p[:1] + struct.pack(">B", len(p)-2) + p[2:] - return p + pay - - -class NcModeHdr(Packet): - """NC mode Section 10.5.2.21c""" - name = "NC Mode" - fields_desc = [ - XBitField("ieiNM", None, 4), - BitField("spare", 0x0, 2), - BitField("ncMode", 0x0, 2) - ] - - -# Fix for len problem -# concatenation NC Mode And Spare Half Octets -class NcModeAndSpareHalfOctets(Packet): - name = "NC Mode And Spare Half Octets" - fields_desc = [ - BitField("spare", 0x0, 2), - BitField("ncMode", 0x0, 2), - BitField("spareHalfOctets", 0x0, 4) - ] - - -class NeighbourCellsDescriptionHdr(Packet): - """Neighbour Cells Description Section 10.5.2.22""" - name = "Neighbour Cells Description" - fields_desc = [ - BitField("eightBitNCD", None, 1), - XBitField("ieiNCD", None, 7), - BitField("bit128", 0x0, 1), - BitField("bit127", 0x0, 1), - BitField("extInd", 0x0, 1), - BitField("baInd", 0x0, 1), - BitField("bit124", 0x0, 1), - BitField("bit123", 0x0, 1), - BitField("bit122", 0x0, 1), - BitField("bit121", 0x0, 1), - BitField("120bits", 0x0, 120) - ] - - -class NeighbourCellsDescription2Hdr(Packet): - """Neighbour Cells Description 2 Section 10.5.2.22a""" - name = "Neighbour Cells Description 2" - fields_desc = [ - BitField("eightBitNCD2", None, 1), - XBitField("ieiNCD2", None, 7), - BitField("bit128", 0x0, 1), - BitField("multiband", 0x0, 2), - BitField("baInd", 0x0, 1), - BitField("bit124", 0x0, 1), - BitField("bit123", 0x0, 1), - BitField("bit122", 0x0, 1), - BitField("bit121", 0x0, 1), - BitField("120bits", 0x0, 120) - ] - - -class NtNRestOctets(Packet): - """NT/N Rest Octets Section 10.5.2.22c""" - name = "NT/N Rest Octets" - fields_desc = [ - BitField("nln", 0x0, 2), - BitField("ncnInfo", 0x0, 4), - BitField("spare", 0x0, 2) - ] - - -# -# The following packet has no length info! -# -# len 1-18 -class P1RestOctets(Packet): - """P1 Rest Octets Section 10.5.2.23""" - name = "P1 Rest Octets" - fields_desc = [ - BitField("nln", 0x0, 2), - BitField("nlnStatus", 0x0, 1), - BitField("prio1", 0x0, 3), - BitField("prio2", 0x0, 3), - # optional - BitField("pageIndication1", 0x0, 1), - BitField("pageIndication2", 0x0, 1), - BitField("spare", 0x0, 5), - ByteField("spareB1", None), - ByteField("spareB2", None), - ByteField("spareB3", None), - ByteField("spareB4", None), - ByteField("spareB5", None), - ByteField("spareB6", None), - ByteField("spareB7", None), - ByteField("spareB8", None), - ByteField("spareB9", None), - ByteField("spareB10", None), - ByteField("spareB11", None), - ByteField("spareB12", None), - ByteField("spareB13", None), - ByteField("spareB14", None), - ByteField("spareB15", None), - ByteField("spareB16", None), - ] - - -# len 2-12 -class P2RestOctets(Packet): - """P2 Rest Octets Section 10.5.2.24""" - name = "P2 Rest Octets" - fields_desc = [ - BitField("cn3", 0x0, 2), - BitField("nln", 0x0, 2), - BitField("nlnStatus", 0x0, 1), - BitField("prio1", 0x0, 3), - - BitField("prio2", 0x0, 3), - BitField("prio3", 0x0, 3), - BitField("pageIndication3", 0x0, 1), - BitField("spare", 0x0, 1), - - # optinal (No length field!) - ByteField("spareB1", None), - ByteField("spareB2", None), - ByteField("spareB3", None), - ByteField("spareB4", None), - - ByteField("spareB5", None), - ByteField("spareB6", None), - ByteField("spareB7", None), - ByteField("spareB8", None), - - ByteField("spareB9", None), - ByteField("spareB10", None) - ] - - -# len 4 -class P3RestOctets(Packet): - """P3 Rest Octets Section 10.5.2.25""" - name = "P3 Rest Octets" - fields_desc = [ - BitField("cn3", 0x0, 2), - BitField("cn4", 0x0, 2), - BitField("nln", 0x0, 2), - BitField("nlnStatus", 0x0, 1), - BitField("prio1", 0x0, 3), - BitField("prio2", 0x0, 3), - BitField("prio3", 0x0, 3), - BitField("prio4", 0x0, 3), - BitField("spare", 0x0, 5) - ] - - -# len 4 -# strange packet, lots of valid formats - -# ideas for the dynamic packets: -# 1] for user interaction: Create an interactive "builder" based on a -# Q/A process (not very scapy like) -# 2] for usage in scripts, create an alternative packet for every -# possible packet layout -# - - -class PacketChannelDescription(Packet): - """Packet Channel Description Section 10.5.2.25a""" - name = "Packet Channel Description" - fields_desc = [ - ByteField("ieiPCD", None), - BitField("chanType", 0x0, 5), # This packet has multiple - # possible layouts. I moddeled the first one - BitField("tn", 0x0, 3), # maybe build an - #"interactive" builder. Like - # a Q/A then propose a - # packet? - BitField("tsc", 0x0, 3), - BitField("chooser1", 0x0, 1), - BitField("chooser2", 0x0, 1), - BitField("spare1", 0x0, 1), - BitField("arfcn", 0x0, 10), - ] - - -class DedicatedModeOrTBFHdr(Packet): - """Dedicated mode or TBF Section 10.5.2.25b""" - name = "Dedicated Mode or TBF" - fields_desc = [ - XBitField("ieiDMOT", None, 4), - BitField("spare", 0x0, 1), - BitField("tma", 0x0, 1), - BitField("downlink", 0x0, 1), - BitField("td", 0x0, 1) - ] - - -# FIXME add implementation -class RrPacketUplinkAssignment(Packet): - """RR Packet Uplink Assignment Section 10.5.2.25c""" - name = "RR Packet Uplink Assignment" - fields_desc = [ - # Fill me - ] - - -class PageModeHdr(Packet): - """Page Mode Section 10.5.2.26""" - name = "Page Mode" - fields_desc = [ - XBitField("ieiPM", None, 4), - BitField("spare", 0x0, 1), - BitField("spare1", 0x0, 1), - BitField("pm", 0x0, 2) - ] - - -# Fix for 1/2 len problem -# concatenation: pageMode and dedicatedModeOrTBF -class PageModeAndDedicatedModeOrTBF(Packet): - name = "Page Mode and Dedicated Mode Or TBF" - fields_desc = [ - BitField("spare", 0x0, 1), - BitField("spare1", 0x0, 1), - BitField("pm", 0x0, 2), - BitField("spare", 0x0, 1), - BitField("tma", 0x0, 1), - BitField("downlink", 0x0, 1), - BitField("td", 0x0, 1) - ] - - -# Fix for 1/2 len problem -# concatenation: pageMode and spareHalfOctets -class PageModeAndSpareHalfOctets(Packet): - name = "Page Mode and Spare Half Octets" - fields_desc = [ - BitField("spare", 0x0, 1), - BitField("spare1", 0x0, 1), - BitField("pm", 0x0, 2), - BitField("spareHalfOctets", 0x0, 4) - ] - - -# Fix for 1/2 len problem -# concatenation: pageMode and Channel Needed -class PageModeAndChannelNeeded(Packet): - name = "Page Mode and Channel Needed" - fields_desc = [ - BitField("spare", 0x0, 1), - BitField("spare1", 0x0, 1), - BitField("pm", 0x0, 2), - BitField("channel2", 0x0, 2), - BitField("channel1", 0x0, 2) - ] - - -class NccPermittedHdr(Packet): - """NCC Permitted Section 10.5.2.27""" - name = "NCC Permited" - fields_desc = [ - BitField("eightBitNP", None, 1), - XBitField("ieiNP", None, 7), - ByteField("nccPerm", 0x0) - ] - - -class PowerCommandHdr(Packet): - """Power Command Section 10.5.2.28""" - name = "Power Command" - fields_desc = [ - BitField("eightBitPC", None, 1), - XBitField("ieiPC", None, 7), - BitField("spare", 0x0, 1), - BitField("spare1", 0x0, 1), - BitField("spare2", 0x0, 1), - BitField("powerLvl", 0x0, 5) - ] - - -class PowerCommandAndAccessTypeHdr(Packet): - """Power Command and access type Section 10.5.2.28a""" - name = "Power Command and Access Type" - fields_desc = [ - BitField("eightBitPCAAT", None, 1), - XBitField("ieiPCAAT", None, 7), - BitField("atc", 0x0, 1), - BitField("spare", 0x0, 1), - BitField("spare1", 0x0, 1), - BitField("powerLvl", 0x0, 5) - ] - - -class RachControlParametersHdr(Packet): - """RACH Control Parameters Section 10.5.2.29""" - name = "RACH Control Parameters" - fields_desc = [ - BitField("eightBitRCP", None, 1), - XBitField("ieiRCP", None, 7), - BitField("maxRetrans", 0x0, 2), - BitField("txInteger", 0x0, 4), - BitField("cellBarrAccess", 0x0, 1), - BitField("re", 0x0, 1), - BitField("ACC15", 0x0, 1), - BitField("ACC14", 0x0, 1), - BitField("ACC13", 0x0, 1), - BitField("ACC12", 0x0, 1), - BitField("ACC11", 0x0, 1), - BitField("ACC10", 0x0, 1), - BitField("ACC09", 0x0, 1), - BitField("ACC08", 0x0, 1), - BitField("ACC07", 0x0, 1), - BitField("ACC06", 0x0, 1), - BitField("ACC05", 0x0, 1), - BitField("ACC04", 0x0, 1), - BitField("ACC03", 0x0, 1), - BitField("ACC02", 0x0, 1), - BitField("ACC01", 0x0, 1), - BitField("ACC00", 0x0, 1), - ] - - -class RequestReferenceHdr(Packet): - """Request Reference Section 10.5.2.30""" - name = "Request Reference" - fields_desc = [ - BitField("eightBitRR", None, 1), - XBitField("ieiRR", None, 7), - ByteField("ra", 0x0), - BitField("t1", 0x0, 5), - BitField("t3Hi", 0x0, 3), - BitField("t3Lo", 0x0, 3), - BitField("t2", 0x0, 5) - ] - - -class RrCauseHdr(Packet): - """RR Cause Section 10.5.2.31""" - name = "RR Cause" - fields_desc = [ - BitField("eightBitRC", None, 1), - XBitField("ieiRC", None, 7), - ByteField("rrCause", 0x0) - ] - - -class Si1RestOctets(Packet): - """SI 1 Rest Octets Section 10.5.2.32""" - name = "SI 1 Rest Octets" - fields_desc = [ - ByteField("nchPos", 0x0) - ] - - -class Si2bisRestOctets(Packet): - """SI 2bis Rest Octets Section 10.5.2.33""" - name = "SI 2bis Rest Octets" - fields_desc = [ - ByteField("spare", 0x0) - ] - - -class Si2terRestOctets(Packet): - """SI 2ter Rest Octets Section 10.5.2.33a""" - name = "SI 2ter Rest Octets" - fields_desc = [ - ByteField("spare1", 0x0), - ByteField("spare2", 0x0), - ByteField("spare3", 0x0), - ByteField("spare4", 0x0) - ] - - -# len 5 -class Si3RestOctets(Packet): - """SI 3 Rest Octets Section 10.5.2.34""" - name = "SI 3 Rest Octets" - fields_desc = [ - ByteField("byte1", 0x0), - ByteField("byte2", 0x0), - ByteField("byte3", 0x0), - ByteField("byte4", 0x0), - ByteField("byte5", 0x0) - ] - - -# len 1 to 11 -class Si4RestOctets(Packet): - """SI 4 Rest Octets Section 10.5.2.35""" - name = "SI 4 Rest Octets" - fields_desc = [ - XByteField("lengthSI4", None), - ByteField("byte2", None), - ByteField("byte3", None), - ByteField("byte4", None), - ByteField("byte5", None), - ByteField("byte6", None), - ByteField("byte7", None), - ByteField("byte8", None), - ByteField("byte9", None), - ByteField("byte10", None), - ByteField("byte11", None) - ] - - def post_build(self, p, pay): - aList = [] - a = [] - i = 0 - for i in range(0, len(self.fields_desc)): - aList.append(self.fields_desc[i].name) - for i in aList: - a.append(getattr(self, i)) - res = adapt(1, 11, a, self.fields_desc, 1) - if self.lengthSI4 is None: - p = struct.pack(">B", res[1]) + p[1:] - if res[0] is not 0: - p = p[:-res[0]] - if len(p) is 1: # length of this packet can be 0, but packet is - p = '' # but the IE is manadatory 0_o - return p + pay - - -class Si6RestOctets(Packet): - """SI 6 Rest Octets Section 10.5.2.35a""" - name = "SI 4 Rest Octets" - fields_desc = [ - # FIXME - ] - - -# len 21 -class Si7RestOctets(Packet): - """SI 7 Rest Octets Section 10.5.2.36""" - name = "SI 7 Rest Octets" - fields_desc = [ - # FIXME - XByteField("lengthSI7", 0x15), - ByteField("byte2", 0x0), - ByteField("byte3", 0x0), - ByteField("byte4", 0x0), - ByteField("byte5", 0x0), - ByteField("byte6", 0x0), - ByteField("byte7", 0x0), - ByteField("byte8", 0x0), - ByteField("byte9", 0x0), - ByteField("byte10", 0x0), - ByteField("byte11", 0x0), - ByteField("byte12", 0x0), - ByteField("byte13", 0x0), - ByteField("byte14", 0x0), - ByteField("byte15", 0x0), - ByteField("byte16", 0x0), - ByteField("byte17", 0x0), - ByteField("byte18", 0x0), - ByteField("byte19", 0x0), - ByteField("byte20", 0x0), - ByteField("byte21", 0x0) - ] - - -# len 21 -class Si8RestOctets(Packet): - """SI 8 Rest Octets Section 10.5.2.37""" - name = "SI 8 Rest Octets" - fields_desc = [ - # FIXME - XByteField("lengthSI8", 0x15), - ByteField("byte2", 0x0), - ByteField("byte3", 0x0), - ByteField("byte4", 0x0), - ByteField("byte5", 0x0), - ByteField("byte6", 0x0), - ByteField("byte7", 0x0), - ByteField("byte8", 0x0), - ByteField("byte9", 0x0), - ByteField("byte10", 0x0), - ByteField("byte11", 0x0), - ByteField("byte12", 0x0), - ByteField("byte13", 0x0), - ByteField("byte14", 0x0), - ByteField("byte15", 0x0), - ByteField("byte16", 0x0), - ByteField("byte17", 0x0), - ByteField("byte18", 0x0), - ByteField("byte19", 0x0), - ByteField("byte20", 0x0), - ByteField("byte21", 0x0) - ] - - -#len 17 -class Si9RestOctets(Packet): - """SI 9 Rest Octets Section 10.5.2.37a""" - name = "SI 9 Rest Octets" - fields_desc = [ - # FIXME - XByteField("lengthSI9", 0x11), - ByteField("byte2", 0x0), - ByteField("byte3", 0x0), - ByteField("byte4", 0x0), - ByteField("byte5", 0x0), - ByteField("byte6", 0x0), - ByteField("byte7", 0x0), - ByteField("byte8", 0x0), - ByteField("byte9", 0x0), - ByteField("byte10", 0x0), - ByteField("byte11", 0x0), - ByteField("byte12", 0x0), - ByteField("byte13", 0x0), - ByteField("byte14", 0x0), - ByteField("byte15", 0x0), - ByteField("byte16", 0x0), - ByteField("byte17", 0x0) - ] - - -# len 21 -class Si13RestOctets(Packet): - """SI 13 Rest Octets Section 10.5.2.37b""" - name = "SI 13 Rest Octets" - fields_desc = [ - # FIXME - XByteField("lengthSI3", 0x15), - ByteField("byte2", 0x0), - ByteField("byte3", 0x0), - ByteField("byte4", 0x0), - ByteField("byte5", 0x0), - ByteField("byte6", 0x0), - ByteField("byte7", 0x0), - ByteField("byte8", 0x0), - ByteField("byte9", 0x0), - ByteField("byte10", 0x0), - ByteField("byte11", 0x0), - ByteField("byte12", 0x0), - ByteField("byte13", 0x0), - ByteField("byte14", 0x0), - ByteField("byte15", 0x0), - ByteField("byte16", 0x0), - ByteField("byte17", 0x0), - ByteField("byte18", 0x0), - ByteField("byte19", 0x0), - ByteField("byte20", 0x0), - ByteField("byte21", 0x0) - ] - - -# 10.5.2.37c [spare] -# 10.5.2.37d [spare] - - -# len 21 -class Si16RestOctets(Packet): - """SI 16 Rest Octets Section 10.5.2.37e""" - name = "SI 16 Rest Octets" - fields_desc = [ - # FIXME - XByteField("lengthSI16", 0x15), - ByteField("byte2", 0x0), - ByteField("byte3", 0x0), - ByteField("byte4", 0x0), - ByteField("byte5", 0x0), - ByteField("byte6", 0x0), - ByteField("byte7", 0x0), - ByteField("byte8", 0x0), - ByteField("byte9", 0x0), - ByteField("byte10", 0x0), - ByteField("byte11", 0x0), - ByteField("byte12", 0x0), - ByteField("byte13", 0x0), - ByteField("byte14", 0x0), - ByteField("byte15", 0x0), - ByteField("byte16", 0x0), - ByteField("byte17", 0x0), - ByteField("byte18", 0x0), - ByteField("byte19", 0x0), - ByteField("byte20", 0x0), - ByteField("byte21", 0x0) - ] - - -# len 21 -class Si17RestOctets(Packet): - """SI 17 Rest Octets Section 10.5.2.37f""" - name = "SI 17 Rest Octets" - fields_desc = [ - # FIXME - XByteField("lengthSI17", 0x15), - ByteField("byte2", 0x0), - ByteField("byte3", 0x0), - ByteField("byte4", 0x0), - ByteField("byte5", 0x0), - ByteField("byte6", 0x0), - ByteField("byte7", 0x0), - ByteField("byte8", 0x0), - ByteField("byte9", 0x0), - ByteField("byte10", 0x0), - ByteField("byte11", 0x0), - ByteField("byte12", 0x0), - ByteField("byte13", 0x0), - ByteField("byte14", 0x0), - ByteField("byte15", 0x0), - ByteField("byte16", 0x0), - ByteField("byte17", 0x0), - ByteField("byte18", 0x0), - ByteField("byte19", 0x0), - ByteField("byte20", 0x0), - ByteField("byte21", 0x0) - ] - - -class StartingTimeHdr(Packet): - """Starting Time Section 10.5.2.38""" - name = "Starting Time" - fields_desc = [ - BitField("eightBitST", None, 1), - XBitField("ieiST", None, 7), - ByteField("ra", 0x0), - BitField("t1", 0x0, 5), - BitField("t3Hi", 0x0, 3), - BitField("t3Lo", 0x0, 3), - BitField("t2", 0x0, 5) - ] - - -class SynchronizationIndicationHdr(Packet): - """Synchronization Indication Section 10.5.2.39""" - name = "Synchronization Indication" - fields_desc = [ - XBitField("ieiSI", None, 4), - BitField("nci", 0x0, 1), - BitField("rot", 0x0, 1), - BitField("si", 0x0, 2) - ] - - -class TimingAdvanceHdr(Packet): - """Timing Advance Section 10.5.2.40""" - name = "Timing Advance" - fields_desc = [ - BitField("eightBitTA", None, 1), - XBitField("ieiTA", None, 7), - BitField("spare", 0x0, 1), - BitField("spare1", 0x0, 1), - BitField("timingVal", 0x0, 6) - ] - - -class TimeDifferenceHdr(Packet): - """ Time Difference Section 10.5.2.41""" - name = "Time Difference" - fields_desc = [ - BitField("eightBitTD", None, 1), - XBitField("ieiTD", None, 7), - XByteField("lengthTD", 0x3), - ByteField("timeValue", 0x0) - ] - - -class TlliHdr(Packet): - """ TLLI Section Section 10.5.2.41a""" - name = "TLLI" - fields_desc = [ - BitField("eightBitT", None, 1), - XBitField("ieiT", None, 7), - ByteField("value", 0x0), - ByteField("value1", 0x0), - ByteField("value2", 0x0), - ByteField("value3", 0x0) - ] - - -class TmsiPTmsiHdr(Packet): - """ TMSI/P-TMSI Section 10.5.2.42""" - name = "TMSI/P-TMSI" - fields_desc = [ - BitField("eightBitTPT", None, 1), - XBitField("ieiTPT", None, 7), - ByteField("value", 0x0), - ByteField("value1", 0x0), - ByteField("value2", 0x0), - ByteField("value3", 0x0) - ] - - -class VgcsTargetModeIdenticationHdr(Packet): - """ VGCS target Mode Indication 10.5.2.42a""" - name = "VGCS Target Mode Indication" - fields_desc = [ - BitField("eightBitVTMI", None, 1), - XBitField("ieiVTMI", None, 7), - XByteField("lengthVTMI", 0x2), - BitField("targerMode", 0x0, 2), - BitField("cipherKeyNb", 0x0, 4), - BitField("spare", 0x0, 1), - BitField("spare1", 0x0, 1) - ] - - -class WaitIndicationHdr(Packet): - """ Wait Indication Section 10.5.2.43""" - name = "Wait Indication" - fields_desc = [ # asciiart of specs strange - BitField("eightBitWI", None, 1), - XBitField("ieiWI", None, 7), - ByteField("timeoutVal", 0x0) - ] - - -# len 17 -class ExtendedMeasurementResultsHdr(Packet): - """EXTENDED MEASUREMENT RESULTS Section 10.5.2.45""" - name = "Extended Measurement Results" - fields_desc = [ - BitField("eightBitEMR", None, 1), - XBitField("ieiEMR", None, 7), - - BitField("scUsed", None, 1), - BitField("dtxUsed", None, 1), - BitField("rxLevC0", None, 6), - - BitField("rxLevC1", None, 6), - BitField("rxLevC2Hi", None, 2), - - BitField("rxLevC2Lo", None, 4), - BitField("rxLevC3Hi", None, 4), - - BitField("rxLevC3Lo", None, 3), - BitField("rxLevC4", None, 5), - - BitField("rxLevC5", None, 6), - BitField("rxLevC6Hi", None, 2), - - BitField("rxLevC6Lo", None, 4), - BitField("rxLevC7Hi", None, 4), - - BitField("rxLevC7Lo", None, 2), - BitField("rxLevC8", None, 6), - - BitField("rxLevC9", None, 6), - BitField("rxLevC10Hi", None, 2), - - BitField("rxLevC10Lo", None, 4), - BitField("rxLevC11Hi", None, 4), - - BitField("rxLevC13Lo", None, 2), - BitField("rxLevC12", None, 6), - - BitField("rxLevC13", None, 6), - BitField("rxLevC14Hi", None, 2), - - BitField("rxLevC14Lo", None, 4), - BitField("rxLevC15Hi", None, 4), - - BitField("rxLevC15Lo", None, 2), - BitField("rxLevC16", None, 6), - - - BitField("rxLevC17", None, 6), - BitField("rxLevC18Hi", None, 2), - - BitField("rxLevC18Lo", None, 4), - BitField("rxLevC19Hi", None, 4), - - BitField("rxLevC19Lo", None, 2), - BitField("rxLevC20", None, 6) - ] - - -# len 17 -class ExtendedMeasurementFrequencyListHdr(Packet): - """Extended Measurement Frequency List Section 10.5.2.46""" - name = "Extended Measurement Frequency List" - fields_desc = [ - BitField("eightBitEMFL", None, 1), - XBitField("ieiEMFL", None, 7), - - BitField("bit128", 0x0, 1), - BitField("bit127", 0x0, 1), - BitField("spare", 0x0, 1), - BitField("seqCode", 0x0, 1), - BitField("bit124", 0x0, 1), - BitField("bit123", 0x0, 1), - BitField("bit122", 0x0, 1), - BitField("bit121", 0x0, 1), - - BitField("bitsRest", 0x0, 128) - ] - - -class SuspensionCauseHdr(Packet): - """Suspension Cause Section 10.5.2.47""" - name = "Suspension Cause" - fields_desc = [ - BitField("eightBitSC", None, 1), - XBitField("ieiSC", None, 7), - ByteField("suspVal", 0x0) - ] - - -class ApduIDHdr(Packet): - """APDU Flags Section 10.5.2.48""" - name = "Apdu Id" - fields_desc = [ - XBitField("ieiAI", None, 4), - BitField("id", None, 4) - ] - - -class ApduFlagsHdr(Packet): - """APDU Flags Section 10.5.2.49""" - name = "Apdu Flags" - fields_desc = [ - XBitField("iei", None, 4), - BitField("spare", 0x0, 1), - BitField("cr", 0x0, 1), - BitField("firstSeg", 0x0, 1), - BitField("lastSeg", 0x0, 1) - ] - - -# Fix 1/2 len problem -class ApduIDAndApduFlags(Packet): - name = "Apu Id and Apdu Flags" - fields_desc = [ - BitField("id", None, 4), - BitField("spare", 0x0, 1), - BitField("cr", 0x0, 1), - BitField("firstSeg", 0x0, 1), - BitField("lastSeg", 0x0, 1) - ] - - -# len 2 to max L3 (251) (done) -class ApduDataHdr(Packet): - """APDU Data Section 10.5.2.50""" - name = "Apdu Data" - fields_desc = [ - BitField("eightBitAD", None, 1), - XBitField("ieiAD", None, 7), - XByteField("lengthAD", None), - #optional - ByteField("apuInfo1", None), - ByteField("apuInfo2", None), - ByteField("apuInfo3", None), - ByteField("apuInfo4", None), - ByteField("apuInfo5", None), - ByteField("apuInfo6", None), - ByteField("apuInfo7", None), - ByteField("apuInfo8", None), - ByteField("apuInfo9", None), - ByteField("apuInfo10", None), - ByteField("apuInfo11", None), - ByteField("apuInfo12", None), - ByteField("apuInfo13", None), - ByteField("apuInfo14", None), - ByteField("apuInfo15", None), - ByteField("apuInfo16", None), - ByteField("apuInfo17", None), - ByteField("apuInfo18", None), - ByteField("apuInfo19", None), - ByteField("apuInfo20", None), - ByteField("apuInfo21", None), - ByteField("apuInfo22", None), - ByteField("apuInfo23", None), - ByteField("apuInfo24", None), - ByteField("apuInfo25", None), - ByteField("apuInfo26", None), - ByteField("apuInfo27", None), - ByteField("apuInfo28", None), - ByteField("apuInfo29", None), - ByteField("apuInfo30", None), - ByteField("apuInfo31", None), - ByteField("apuInfo32", None), - ByteField("apuInfo33", None), - ByteField("apuInfo34", None), - ByteField("apuInfo35", None), - ByteField("apuInfo36", None), - ByteField("apuInfo37", None), - ByteField("apuInfo38", None), - ByteField("apuInfo39", None), - ByteField("apuInfo40", None), - ByteField("apuInfo41", None), - ByteField("apuInfo42", None), - ByteField("apuInfo43", None), - ByteField("apuInfo44", None), - ByteField("apuInfo45", None), - ByteField("apuInfo46", None), - ByteField("apuInfo47", None), - ByteField("apuInfo48", None), - ByteField("apuInfo49", None), - ByteField("apuInfo50", None), - ByteField("apuInfo51", None), - ByteField("apuInfo52", None), - ByteField("apuInfo53", None), - ByteField("apuInfo54", None), - ByteField("apuInfo55", None), - ByteField("apuInfo56", None), - ByteField("apuInfo57", None), - ByteField("apuInfo58", None), - ByteField("apuInfo59", None), - ByteField("apuInfo60", None), - ByteField("apuInfo61", None), - ByteField("apuInfo62", None), - ByteField("apuInfo63", None), - ByteField("apuInfo64", None), - ByteField("apuInfo65", None), - ByteField("apuInfo66", None), - ByteField("apuInfo67", None), - ByteField("apuInfo68", None), - ByteField("apuInfo69", None), - ByteField("apuInfo70", None), - ByteField("apuInfo71", None), - ByteField("apuInfo72", None), - ByteField("apuInfo73", None), - ByteField("apuInfo74", None), - ByteField("apuInfo75", None), - ByteField("apuInfo76", None), - ByteField("apuInfo77", None), - ByteField("apuInfo78", None), - ByteField("apuInfo79", None), - ByteField("apuInfo80", None), - ByteField("apuInfo81", None), - ByteField("apuInfo82", None), - ByteField("apuInfo83", None), - ByteField("apuInfo84", None), - ByteField("apuInfo85", None), - ByteField("apuInfo86", None), - ByteField("apuInfo87", None), - ByteField("apuInfo88", None), - ByteField("apuInfo89", None), - ByteField("apuInfo90", None), - ByteField("apuInfo91", None), - ByteField("apuInfo92", None), - ByteField("apuInfo93", None), - ByteField("apuInfo94", None), - ByteField("apuInfo95", None), - ByteField("apuInfo96", None), - ByteField("apuInfo97", None), - ByteField("apuInfo98", None), - ByteField("apuInfo99", None), - ByteField("apuInfo100", None), - ByteField("apuInfo101", None), - ByteField("apuInfo102", None), - ByteField("apuInfo103", None), - ByteField("apuInfo104", None), - ByteField("apuInfo105", None), - ByteField("apuInfo106", None), - ByteField("apuInfo107", None), - ByteField("apuInfo108", None), - ByteField("apuInfo109", None), - ByteField("apuInfo110", None), - ByteField("apuInfo111", None), - ByteField("apuInfo112", None), - ByteField("apuInfo113", None), - ByteField("apuInfo114", None), - ByteField("apuInfo115", None), - ByteField("apuInfo116", None), - ByteField("apuInfo117", None), - ByteField("apuInfo118", None), - ByteField("apuInfo119", None), - ByteField("apuInfo120", None), - ByteField("apuInfo121", None), - ByteField("apuInfo122", None), - ByteField("apuInfo123", None), - ByteField("apuInfo124", None), - ByteField("apuInfo125", None), - ByteField("apuInfo126", None), - ByteField("apuInfo127", None), - ByteField("apuInfo128", None), - ByteField("apuInfo129", None), - ByteField("apuInfo130", None), - ByteField("apuInfo131", None), - ByteField("apuInfo132", None), - ByteField("apuInfo133", None), - ByteField("apuInfo134", None), - ByteField("apuInfo135", None), - ByteField("apuInfo136", None), - ByteField("apuInfo137", None), - ByteField("apuInfo138", None), - ByteField("apuInfo139", None), - ByteField("apuInfo140", None), - ByteField("apuInfo141", None), - ByteField("apuInfo142", None), - ByteField("apuInfo143", None), - ByteField("apuInfo144", None), - ByteField("apuInfo145", None), - ByteField("apuInfo146", None), - ByteField("apuInfo147", None), - ByteField("apuInfo148", None), - ByteField("apuInfo149", None), - ByteField("apuInfo150", None), - ByteField("apuInfo151", None), - ByteField("apuInfo152", None), - ByteField("apuInfo153", None), - ByteField("apuInfo154", None), - ByteField("apuInfo155", None), - ByteField("apuInfo156", None), - ByteField("apuInfo157", None), - ByteField("apuInfo158", None), - ByteField("apuInfo159", None), - ByteField("apuInfo160", None), - ByteField("apuInfo161", None), - ByteField("apuInfo162", None), - ByteField("apuInfo163", None), - ByteField("apuInfo164", None), - ByteField("apuInfo165", None), - ByteField("apuInfo166", None), - ByteField("apuInfo167", None), - ByteField("apuInfo168", None), - ByteField("apuInfo169", None), - ByteField("apuInfo170", None), - ByteField("apuInfo171", None), - ByteField("apuInfo172", None), - ByteField("apuInfo173", None), - ByteField("apuInfo174", None), - ByteField("apuInfo175", None), - ByteField("apuInfo176", None), - ByteField("apuInfo177", None), - ByteField("apuInfo178", None), - ByteField("apuInfo179", None), - ByteField("apuInfo180", None), - ByteField("apuInfo181", None), - ByteField("apuInfo182", None), - ByteField("apuInfo183", None), - ByteField("apuInfo184", None), - ByteField("apuInfo185", None), - ByteField("apuInfo186", None), - ByteField("apuInfo187", None), - ByteField("apuInfo188", None), - ByteField("apuInfo189", None), - ByteField("apuInfo190", None), - ByteField("apuInfo191", None), - ByteField("apuInfo192", None), - ByteField("apuInfo193", None), - ByteField("apuInfo194", None), - ByteField("apuInfo195", None), - ByteField("apuInfo196", None), - ByteField("apuInfo197", None), - ByteField("apuInfo198", None), - ByteField("apuInfo199", None), - ByteField("apuInfo200", None), - ByteField("apuInfo201", None), - ByteField("apuInfo202", None), - ByteField("apuInfo203", None), - ByteField("apuInfo204", None), - ByteField("apuInfo205", None), - ByteField("apuInfo206", None), - ByteField("apuInfo207", None), - ByteField("apuInfo208", None), - ByteField("apuInfo209", None), - ByteField("apuInfo210", None), - ByteField("apuInfo211", None), - ByteField("apuInfo212", None), - ByteField("apuInfo213", None), - ByteField("apuInfo214", None), - ByteField("apuInfo215", None), - ByteField("apuInfo216", None), - ByteField("apuInfo217", None), - ByteField("apuInfo218", None), - ByteField("apuInfo219", None), - ByteField("apuInfo220", None), - ByteField("apuInfo221", None), - ByteField("apuInfo222", None), - ByteField("apuInfo223", None), - ByteField("apuInfo224", None), - ByteField("apuInfo225", None), - ByteField("apuInfo226", None), - ByteField("apuInfo227", None), - ByteField("apuInfo228", None), - ByteField("apuInfo229", None), - ByteField("apuInfo230", None), - ByteField("apuInfo231", None), - ByteField("apuInfo232", None), - ByteField("apuInfo233", None), - ByteField("apuInfo234", None), - ByteField("apuInfo235", None), - ByteField("apuInfo236", None), - ByteField("apuInfo237", None), - ByteField("apuInfo238", None), - ByteField("apuInfo239", None), - ByteField("apuInfo240", None), - ByteField("apuInfo241", None), - ByteField("apuInfo242", None), - ByteField("apuInfo243", None), - ByteField("apuInfo244", None), - ByteField("apuInfo245", None), - ByteField("apuInfo246", None), - ByteField("apuInfo247", None), - ByteField("apuInfo248", None), - ByteField("apuInfo249", None) - ] - - def post_build(self, p, pay): - aList = [] - a = [] - i = 0 - for i in range(0, len(self.fields_desc)): - aList.append(self.fields_desc[i].name) - for i in aList: - a.append(getattr(self, i)) - res = adapt(2, 251, a, self.fields_desc) - if self.lengthAD is None: - p = p[:1] + struct.pack(">B", res[1]) + p[2:] - if res[0] is not 0: - p = p[:-res[0]] - return p + pay - -# -# 10.5.3 Mobility management information elements -# - - -class AuthenticationParameterRAND(Packet): - """Authentication parameter RAND Section 10.5.3.1""" - name = "Authentication Parameter Rand" - fields_desc = [ - ByteField("ieiAPR", None), - BitField("randValue", 0x0, 128) - ] - - -class AuthenticationParameterSRES(Packet): - """Authentication parameter SRES Section 10.5.3.2""" - name = "Authentication Parameter Sres" - fields_desc = [ - ByteField("ieiAPS", None), - BitField("sresValue", 0x0, 40) - ] - - -class CmServiceType(Packet): - """CM service type Section 10.5.3.3""" - name = "CM Service Type" - fields_desc = [ - XBitField("ieiCST", 0x0, 4), - BitField("serviceType", 0x0, 4) - ] - - -class CmServiceTypeAndCiphKeySeqNr(Packet): - name = "CM Service Type and Cipher Key Sequence Number" - fields_desc = [ - BitField("keySeq", 0x0, 3), - BitField("spare", 0x0, 1), - BitField("serviceType", 0x0, 4) - ] - - -class IdentityType(Packet): - """Identity type Section 10.5.3.4""" - name = "Identity Type" - fields_desc = [ - XBitField("ieiIT", 0x0, 4), - BitField("spare", 0x0, 1), - BitField("idType", 0x1, 3) - ] - - -# Fix 1/2 len problem -class IdentityTypeAndSpareHalfOctet(Packet): - name = "Identity Type and Spare Half Octet" - fields_desc = [ - BitField("spare", 0x0, 1), - BitField("idType", 0x1, 3), - BitField("spareHalfOctets", 0x0, 4) - ] - - -class LocationUpdatingType(Packet): - """Location updating type Section 10.5.3.5""" - name = "Location Updating Type" - fields_desc = [ - XBitField("ieiLUT", 0x0, 4), - BitField("for", 0x0, 1), - BitField("spare", 0x0, 1), - BitField("lut", 0x0, 2) - ] - - -class LocationUpdatingTypeAndCiphKeySeqNr(Packet): - name = "Location Updating Type and Cipher Key Sequence Number" - fields_desc = [ - BitField("for", 0x0, 1), - BitField("spare", 0x0, 1), - BitField("lut", 0x0, 2), - BitField("spare", 0x0, 1), - BitField("keySeq", 0x0, 3) - ] - - -# len 3 to L3 max (251) (done) -class NetworkNameHdr(Packet): - """Network Name Section 10.5.3.5a""" - name = "Network Name" - fields_desc = [ - BitField("eightBitNN", None, 1), - XBitField("ieiNN", None, 7), - - XByteField("lengthNN", None), - - BitField("ext1", 0x1, 1), - BitField("codingScheme", 0x0, 3), - BitField("addCi", 0x0, 1), - BitField("nbSpare", 0x0, 3), - # optional - ByteField("txtString1", None), - ByteField("txtString2", None), - ByteField("txtString3", None), - ByteField("txtString4", None), - ByteField("txtString5", None), - ByteField("txtString6", None), - ByteField("txtString7", None), - ByteField("txtString8", None), - ByteField("txtString9", None), - ByteField("txtString10", None), - ByteField("txtString11", None), - ByteField("txtString12", None), - ByteField("txtString13", None), - ByteField("txtString14", None), - ByteField("txtString15", None), - ByteField("txtString16", None), - ByteField("txtString17", None), - ByteField("txtString18", None), - ByteField("txtString19", None), - ByteField("txtString20", None), - ByteField("txtString21", None), - ByteField("txtString22", None), - ByteField("txtString23", None), - ByteField("txtString24", None), - ByteField("txtString25", None), - ByteField("txtString26", None), - ByteField("txtString27", None), - ByteField("txtString28", None), - ByteField("txtString29", None), - ByteField("txtString30", None), - ByteField("txtString31", None), - ByteField("txtString32", None), - ByteField("txtString33", None), - ByteField("txtString34", None), - ByteField("txtString35", None), - ByteField("txtString36", None), - ByteField("txtString37", None), - ByteField("txtString38", None), - ByteField("txtString39", None), - ByteField("txtString40", None), - ByteField("txtString41", None), - ByteField("txtString42", None), - ByteField("txtString43", None), - ByteField("txtString44", None), - ByteField("txtString45", None), - ByteField("txtString46", None), - ByteField("txtString47", None), - ByteField("txtString48", None), - ByteField("txtString49", None), - ByteField("txtString50", None), - ByteField("txtString51", None), - ByteField("txtString52", None), - ByteField("txtString53", None), - ByteField("txtString54", None), - ByteField("txtString55", None), - ByteField("txtString56", None), - ByteField("txtString57", None), - ByteField("txtString58", None), - ByteField("txtString59", None), - ByteField("txtString60", None), - ByteField("txtString61", None), - ByteField("txtString62", None), - ByteField("txtString63", None), - ByteField("txtString64", None), - ByteField("txtString65", None), - ByteField("txtString66", None), - ByteField("txtString67", None), - ByteField("txtString68", None), - ByteField("txtString69", None), - ByteField("txtString70", None), - ByteField("txtString71", None), - ByteField("txtString72", None), - ByteField("txtString73", None), - ByteField("txtString74", None), - ByteField("txtString75", None), - ByteField("txtString76", None), - ByteField("txtString77", None), - ByteField("txtString78", None), - ByteField("txtString79", None), - ByteField("txtString80", None), - ByteField("txtString81", None), - ByteField("txtString82", None), - ByteField("txtString83", None), - ByteField("txtString84", None), - ByteField("txtString85", None), - ByteField("txtString86", None), - ByteField("txtString87", None), - ByteField("txtString88", None), - ByteField("txtString89", None), - ByteField("txtString90", None), - ByteField("txtString91", None), - ByteField("txtString92", None), - ByteField("txtString93", None), - ByteField("txtString94", None), - ByteField("txtString95", None), - ByteField("txtString96", None), - ByteField("txtString97", None), - ByteField("txtString98", None), - ByteField("txtString99", None), - ByteField("txtString100", None), - ByteField("txtString101", None), - ByteField("txtString102", None), - ByteField("txtString103", None), - ByteField("txtString104", None), - ByteField("txtString105", None), - ByteField("txtString106", None), - ByteField("txtString107", None), - ByteField("txtString108", None), - ByteField("txtString109", None), - ByteField("txtString110", None), - ByteField("txtString111", None), - ByteField("txtString112", None), - ByteField("txtString113", None), - ByteField("txtString114", None), - ByteField("txtString115", None), - ByteField("txtString116", None), - ByteField("txtString117", None), - ByteField("txtString118", None), - ByteField("txtString119", None), - ByteField("txtString120", None), - ByteField("txtString121", None), - ByteField("txtString122", None), - ByteField("txtString123", None), - ByteField("txtString124", None), - ByteField("txtString125", None), - ByteField("txtString126", None), - ByteField("txtString127", None), - ByteField("txtString128", None), - ByteField("txtString129", None), - ByteField("txtString130", None), - ByteField("txtString131", None), - ByteField("txtString132", None), - ByteField("txtString133", None), - ByteField("txtString134", None), - ByteField("txtString135", None), - ByteField("txtString136", None), - ByteField("txtString137", None), - ByteField("txtString138", None), - ByteField("txtString139", None), - ByteField("txtString140", None), - ByteField("txtString141", None), - ByteField("txtString142", None), - ByteField("txtString143", None), - ByteField("txtString144", None), - ByteField("txtString145", None), - ByteField("txtString146", None), - ByteField("txtString147", None), - ByteField("txtString148", None), - ByteField("txtString149", None), - ByteField("txtString150", None), - ByteField("txtString151", None), - ByteField("txtString152", None), - ByteField("txtString153", None), - ByteField("txtString154", None), - ByteField("txtString155", None), - ByteField("txtString156", None), - ByteField("txtString157", None), - ByteField("txtString158", None), - ByteField("txtString159", None), - ByteField("txtString160", None), - ByteField("txtString161", None), - ByteField("txtString162", None), - ByteField("txtString163", None), - ByteField("txtString164", None), - ByteField("txtString165", None), - ByteField("txtString166", None), - ByteField("txtString167", None), - ByteField("txtString168", None), - ByteField("txtString169", None), - ByteField("txtString170", None), - ByteField("txtString171", None), - ByteField("txtString172", None), - ByteField("txtString173", None), - ByteField("txtString174", None), - ByteField("txtString175", None), - ByteField("txtString176", None), - ByteField("txtString177", None), - ByteField("txtString178", None), - ByteField("txtString179", None), - ByteField("txtString180", None), - ByteField("txtString181", None), - ByteField("txtString182", None), - ByteField("txtString183", None), - ByteField("txtString184", None), - ByteField("txtString185", None), - ByteField("txtString186", None), - ByteField("txtString187", None), - ByteField("txtString188", None), - ByteField("txtString189", None), - ByteField("txtString190", None), - ByteField("txtString191", None), - ByteField("txtString192", None), - ByteField("txtString193", None), - ByteField("txtString194", None), - ByteField("txtString195", None), - ByteField("txtString196", None), - ByteField("txtString197", None), - ByteField("txtString198", None), - ByteField("txtString199", None), - ByteField("txtString200", None), - ByteField("txtString201", None), - ByteField("txtString202", None), - ByteField("txtString203", None), - ByteField("txtString204", None), - ByteField("txtString205", None), - ByteField("txtString206", None), - ByteField("txtString207", None), - ByteField("txtString208", None), - ByteField("txtString209", None), - ByteField("txtString210", None), - ByteField("txtString211", None), - ByteField("txtString212", None), - ByteField("txtString213", None), - ByteField("txtString214", None), - ByteField("txtString215", None), - ByteField("txtString216", None), - ByteField("txtString217", None), - ByteField("txtString218", None), - ByteField("txtString219", None), - ByteField("txtString220", None), - ByteField("txtString221", None), - ByteField("txtString222", None), - ByteField("txtString223", None), - ByteField("txtString224", None), - ByteField("txtString225", None), - ByteField("txtString226", None), - ByteField("txtString227", None), - ByteField("txtString228", None), - ByteField("txtString229", None), - ByteField("txtString230", None), - ByteField("txtString231", None), - ByteField("txtString232", None), - ByteField("txtString233", None), - ByteField("txtString234", None), - ByteField("txtString235", None), - ByteField("txtString236", None), - ByteField("txtString237", None), - ByteField("txtString238", None), - ByteField("txtString239", None), - ByteField("txtString240", None), - ByteField("txtString241", None), - ByteField("txtString242", None), - ByteField("txtString243", None), - ByteField("txtString244", None), - ByteField("txtString245", None), - ByteField("txtString246", None), - ByteField("txtString247", None), - ByteField("txtString248", None) - ] - - def post_build(self, p, pay): - aList = [] - a = [] - i = 0 - for i in range(0, len(self.fields_desc)): - aList.append(self.fields_desc[i].name) - for i in aList: - a.append(getattr(self, i)) - res = adapt(3, 251, a, self.fields_desc) - if self.lengthNN is None: - p = p[:1] + struct.pack(">B", res[1]) + p[2:] - if res[0] is not 0: - p = p[:-res[0]] - return p + pay - - -class RejectCause(Packet): - """Reject cause Section 10.5.3.6""" - name = "Reject Cause" - fields_desc = [ - ByteField("ieiRC", 0x0), - ByteField("rejCause", 0x0) - ] - - -class FollowOnProceed(Packet): - """Follow-on Proceed Section 10.5.3.7""" - name = "Follow-on Proceed" - fields_desc = [ - ByteField("ieiFOP", 0x0), - ] - - -class TimeZoneHdr(Packet): - """Time Zone Section 10.5.3.8""" - name = "Time Zone" - fields_desc = [ - BitField("eightBitTZ", None, 1), - XBitField("ieiTZ", None, 7), - ByteField("timeZone", 0x0), - ] - - -class TimeZoneAndTimeHdr(Packet): - """Time Zone and Time Section 10.5.3.9""" - name = "Time Zone and Time" - fields_desc = [ - BitField("eightBitTZAT", None, 1), - XBitField("ieiTZAT", None, 7), - ByteField("year", 0x0), - ByteField("month", 0x0), - ByteField("day", 0x0), - ByteField("hour", 0x0), - ByteField("minute", 0x0), - ByteField("second", 0x0), - ByteField("timeZone", 0x0) - ] - - -class CtsPermissionHdr(Packet): - """CTS permission Section 10.5.3.10""" - name = "Cts Permission" - fields_desc = [ - BitField("eightBitCP", None, 1), - XBitField("ieiCP", None, 7), - ] - - -class LsaIdentifierHdr(Packet): - """LSA Identifier Section 10.5.3.11""" - name = "Lsa Identifier" - fields_desc = [ - BitField("eightBitLI", None, 1), - XBitField("ieiLI", None, 7), - ByteField("lsaID", 0x0), - ByteField("lsaID1", 0x0), - ByteField("lsaID2", 0x0) - ] - - -# -# 10.5.4 Call control information elements -# - -#10.5.4.1 Extensions of codesets -# This is only text and no packet - -class LockingShiftProcedureHdr(Packet): - """Locking shift procedure Section 10.5.4.2""" - name = "Locking Shift Procedure" - fields_desc = [ - XBitField("ieiLSP", None, 4), - BitField("lockShift", 0x0, 1), - BitField("codesetId", 0x0, 3) - ] - - -class NonLockingShiftProcedureHdr(Packet): - """Non-locking shift procedure Section 10.5.4.3""" - name = "Non-locking Shift Procedure" - fields_desc = [ - XBitField("ieiNLSP", None, 4), - BitField("nonLockShift", 0x1, 1), - BitField("codesetId", 0x0, 3) - ] - - -class AuxiliaryStatesHdr(Packet): - """Auxiliary states Section 10.5.4.4""" - name = "Auxiliary States" - fields_desc = [ - BitField("eightBitAS", None, 1), - XBitField("ieiAS", None, 7), - XByteField("lengthAS", 0x3), - BitField("ext", 0x1, 1), - BitField("spare", 0x0, 3), - BitField("holdState", 0x0, 2), - BitField("mptyState", 0x0, 2) - ] - - -# len 3 to 15 -class BearerCapabilityHdr(Packet): - """Bearer capability Section 10.5.4.5""" - name = "Bearer Capability" - fields_desc = [ - BitField("eightBitBC", None, 1), - XBitField("ieiBC", None, 7), - - XByteField("lengthBC", None), - - BitField("ext0", 0x1, 1), - BitField("radioChReq", 0x1, 2), - BitField("codingStd", 0x0, 1), - BitField("transMode", 0x0, 1), - BitField("infoTransCa", 0x0, 3), - # optional - ConditionalField(BitField("ext1", 0x1, 1), - lambda pkt: pkt.ext0 == 0), - ConditionalField(BitField("coding", None, 1), - lambda pkt: pkt.ext0 == 0), - ConditionalField(BitField("spare", None, 2), - lambda pkt: pkt.ext0 == 0), - ConditionalField(BitField("speechVers", 0x0, 4), - lambda pkt: pkt.ext0 == 0), - - ConditionalField(BitField("ext2", 0x1, 1), - lambda pkt: pkt.ext1 == 0), - ConditionalField(BitField("compress", None, 1), - lambda pkt: pkt.ext1 == 0), - ConditionalField(BitField("structure", None, 2), - lambda pkt: pkt.ext1 == 0), - ConditionalField(BitField("dupMode", None, 1), - lambda pkt: pkt.ext1 == 0), - ConditionalField(BitField("config", None, 1), - lambda pkt: pkt.ext1 == 0), - ConditionalField(BitField("nirr", None, 1), - lambda pkt: pkt.ext1 == 0), - ConditionalField(BitField("establi", 0x0, 1), - lambda pkt: pkt.ext1 == 0), - - BitField("ext3", None, 1), - BitField("accessId", None, 2), - BitField("rateAda", None, 2), - BitField("signaling", None, 3), - - ConditionalField(BitField("ext4", None, 1), - lambda pkt: pkt.ext3 == 0), - ConditionalField(BitField("otherITC", None, 2), - lambda pkt: pkt.ext3 == 0), - ConditionalField(BitField("otherRate", None, 2), - lambda pkt: pkt.ext3 == 0), - ConditionalField(BitField("spare1", 0x0, 3), - lambda pkt: pkt.ext3 == 0), - - ConditionalField(BitField("ext5", 0x1, 1), - lambda pkt: pkt.ext4 == 0), - ConditionalField(BitField("hdr", None, 1), - lambda pkt: pkt.ext4 == 0), - ConditionalField(BitField("multiFr", None, 1), - lambda pkt: pkt.ext4 == 0), - ConditionalField(BitField("mode", None, 1), - lambda pkt: pkt.ext4 == 0), - ConditionalField(BitField("lli", None, 1), - lambda pkt: pkt.ext4 == 0), - ConditionalField(BitField("assig", None, 1), - lambda pkt: pkt.ext4 == 0), - ConditionalField(BitField("inbNeg", None, 1), - lambda pkt: pkt.ext4 == 0), - ConditionalField(BitField("spare2", 0x0, 1), - lambda pkt: pkt.ext4 == 0), - - BitField("ext6", None, 1), - BitField("layer1Id", None, 2), - BitField("userInf", None, 4), - BitField("sync", None, 1), - - ConditionalField(BitField("ext7", None, 1), - lambda pkt: pkt.ext6 == 0), - ConditionalField(BitField("stopBit", None, 1), - lambda pkt: pkt.ext6 == 0), - ConditionalField(BitField("negoc", None, 1), - lambda pkt: pkt.ext6 == 0), - ConditionalField(BitField("nbDataBit", None, 1), - lambda pkt: pkt.ext6 == 0), - ConditionalField(BitField("userRate", None, 4), - lambda pkt: pkt.ext6 == 0), - - ConditionalField(BitField("ext8", None, 1), - lambda pkt: pkt.ext7 == 0), - ConditionalField(BitField("interRate", None, 2), - lambda pkt: pkt.ext7 == 0), - ConditionalField(BitField("nicTX", None, 1), - lambda pkt: pkt.ext7 == 0), - ConditionalField(BitField("nicRX", None, 1), - lambda pkt: pkt.ext7 == 0), - ConditionalField(BitField("parity", None, 3), - lambda pkt: pkt.ext7 == 0), - - ConditionalField(BitField("ext9", None, 1), - lambda pkt: pkt.ext8 == 0), - ConditionalField(BitField("connEle", None, 2), - lambda pkt: pkt.ext8 == 0), - ConditionalField(BitField("modemType", None, 5), - lambda pkt: pkt.ext8 == 0), - - ConditionalField(BitField("ext10", None, 1), - lambda pkt: pkt.ext9 == 0), - ConditionalField(BitField("otherModemType", None, 2), - lambda pkt: pkt.ext9 == 0), - ConditionalField(BitField("netUserRate", None, 5), - lambda pkt: pkt.ext9 == 0), - - ConditionalField(BitField("ext11", None, 1), - lambda pkt: pkt.ext10 == 0), - ConditionalField(BitField("chanCoding", None, 4), - lambda pkt: pkt.ext10 == 0), - ConditionalField(BitField("maxTrafficChan", None, 3), - lambda pkt: pkt.ext10 == 0), - - ConditionalField(BitField("ext12", None, 1), - lambda pkt: pkt.ext11 == 0), - ConditionalField(BitField("uimi", None, 3), - lambda pkt: pkt.ext11 == 0), - ConditionalField(BitField("airInterfaceUserRate", None, 4), - lambda pkt: pkt.ext11 == 0), - - ConditionalField(BitField("ext13", 0x1, 1), - lambda pkt: pkt.ext12 == 0), - ConditionalField(BitField("layer2Ch", None, 2), - lambda pkt: pkt.ext12 == 0), - ConditionalField(BitField("userInfoL2", 0x0, 5), - lambda pkt: pkt.ext12 == 0) - ] - -# We have a bug here. packet is not working if used in message - def post_build(self, p, pay): - aList = [] - a = [] - i = 0 - for i in range(0, len(self.fields_desc)): - aList.append(self.fields_desc[i].name) - for i in aList: - a.append(getattr(self, i)) - res = adapt(3, 15, a, self.fields_desc) - if res[0] is not 0: - p = p[:-res[0]] - # avoids a bug. find better way - if len(p) is 5: - p = p[:-2] - if self.lengthBC is None: - print "len von a %s" % (len(p),) - p = p[:1] + struct.pack(">B", len(p)-3) + p[2:] - return p + pay - - -class CallControlCapabilitiesHdr(Packet): - """Call Control Capabilities Section 10.5.4.5a""" - name = "Call Control Capabilities" - fields_desc = [ - BitField("eightBitCCC", None, 1), - XBitField("ieiCCC", None, 7), - XByteField("lengthCCC", 0x3), - BitField("spare", 0x0, 6), - BitField("pcp", 0x0, 1), - BitField("dtmf", 0x0, 1) - ] - - -class CallStateHdr(Packet): - """Call State Section 10.5.4.6""" - name = "Call State" - fields_desc = [ - BitField("eightBitCS", None, 1), - XBitField("ieiCS", None, 7), - BitField("codingStd", 0x0, 2), - BitField("stateValue", 0x0, 6) - ] - - -# len 3 to 43 -class CalledPartyBcdNumberHdr(Packet): - """Called party BCD number Section 10.5.4.7""" - name = "Called Party BCD Number" - fields_desc = [ - BitField("eightBitCPBN", None, 1), - XBitField("ieiCPBN", None, 7), - XByteField("lengthCPBN", None), - BitField("ext", 0x1, 1), - BitField("typeNb", 0x0, 3), - BitField("nbPlanId", 0x0, 4), - # optional - BitField("nbDigit2", None, 4), - BitField("nbDigit1", None, 4), - BitField("nbDigit4", None, 4), - BitField("nbDigit3", None, 4), - - BitField("nbDigit6", None, 4), - BitField("nbDigit5", None, 4), - BitField("nbDigit8", None, 4), - BitField("nbDigit7", None, 4), - - BitField("nbDigit10", None, 4), - BitField("nbDigit9", None, 4), - BitField("nbDigit12", None, 4), - BitField("nbDigit11", None, 4), - - BitField("nbDigit14", None, 4), - BitField("nbDigit13", None, 4), - BitField("nbDigit16", None, 4), - BitField("nbDigit15", None, 4), - - BitField("nbDigit18", None, 4), - BitField("nbDigit17", None, 4), - BitField("nbDigit20", None, 4), - BitField("nbDigit19", None, 4), - - BitField("nbDigit22", None, 4), - BitField("nbDigit21", None, 4), - BitField("nbDigit24", None, 4), - BitField("nbDigit23", None, 4), - - BitField("nbDigit26", None, 4), - BitField("nbDigit25", None, 4), - BitField("nbDigit28", None, 4), - BitField("nbDigit27", None, 4), - - BitField("nbDigit30", None, 4), - BitField("nbDigit29", None, 4), - BitField("nbDigit32", None, 4), - BitField("nbDigit31", None, 4), - - BitField("nbDigit34", None, 4), - BitField("nbDigit33", None, 4), - BitField("nbDigit36", None, 4), - BitField("nbDigit35", None, 4), - - BitField("nbDigit38", None, 4), - BitField("nbDigit37", None, 4), - BitField("nbDigit40", None, 4), - BitField("nbDigit39", None, 4), -# ^^^^^^ 20 first optional bytes ^^^^^^^^^^^^^^^ - BitField("nbDigit42", None, 4), - BitField("nbDigit41", None, 4), - BitField("nbDigit44", None, 4), - BitField("nbDigit43", None, 4), - - BitField("nbDigit46", None, 4), - BitField("nbDigit45", None, 4), - BitField("nbDigit48", None, 4), - BitField("nbDigit47", None, 4), - - BitField("nbDigit50", None, 4), - BitField("nbDigit49", None, 4), - BitField("nbDigit52", None, 4), - BitField("nbDigit51", None, 4), - - BitField("nbDigit54", None, 4), - BitField("nbDigit53", None, 4), - BitField("nbDigit56", None, 4), - BitField("nbDigit55", None, 4), - - BitField("nbDigit58", None, 4), - BitField("nbDigit57", None, 4), - BitField("nbDigit60", None, 4), - BitField("nbDigit59", None, 4), - - BitField("nbDigit62", None, 4), - BitField("nbDigit61", None, 4), - BitField("nbDigit64", None, 4), - BitField("nbDigit63", None, 4), - - BitField("nbDigit66", None, 4), - BitField("nbDigit65", None, 4), - BitField("nbDigit68", None, 4), - BitField("nbDigit67", None, 4), - - BitField("nbDigit70", None, 4), - BitField("nbDigit69", None, 4), - BitField("nbDigit72", None, 4), - BitField("nbDigit71", None, 4), - - BitField("nbDigit74", None, 4), - BitField("nbDigit73", None, 4), - BitField("nbDigit76", None, 4), - BitField("nbDigit75", None, 4), - - BitField("nbDigit78", None, 4), - BitField("nbDigit77", None, 4), - BitField("nbDigit80", None, 4), - BitField("nbDigit79", None, 4), - ] - - def post_build(self, p, pay): - aList = [] - a = [] - i = 0 - for i in range(0, len(self.fields_desc)): - aList.append(self.fields_desc[i].name) - for i in aList: - a.append(getattr(self, i)) - res = adapt(3, 43, a, self.fields_desc, 2) - if self.lengthCPBN is None: - p = p[:1] + struct.pack(">B", res[1]) + p[2:] - if res[0] is not 0: - p = p[:-res[0]] - return p + pay - - -# len 2 to 23 -class CalledPartySubaddressHdr(Packet): - """Called party subaddress Section 10.5.4.8""" - name = "Called Party Subaddress" - fields_desc = [ - BitField("eightBitCPS", None, 1), - XBitField("ieiCPS", None, 7), - XByteField("lengthCPS", None), - # optional - BitField("ext", None, 1), - BitField("subAddr", None, 3), - BitField("oddEven", None, 1), - BitField("spare", None, 3), - - ByteField("subInfo0", None), - ByteField("subInfo1", None), - ByteField("subInfo2", None), - ByteField("subInfo3", None), - ByteField("subInfo4", None), - ByteField("subInfo5", None), - ByteField("subInfo6", None), - ByteField("subInfo7", None), - ByteField("subInfo8", None), - ByteField("subInfo9", None), - ByteField("subInfo10", None), - ByteField("subInfo11", None), - ByteField("subInfo12", None), - ByteField("subInfo13", None), - ByteField("subInfo14", None), - ByteField("subInfo15", None), - ByteField("subInfo16", None), - ByteField("subInfo17", None), - ByteField("subInfo18", None), - ByteField("subInfo19", None) - ] - - def post_build(self, p, pay): - aList = [] - a = [] - i = 0 - for i in range(0, len(self.fields_desc)): - aList.append(self.fields_desc[i].name) - for i in aList: - a.append(getattr(self, i)) - res = adapt(2, 23, a, self.fields_desc) - if self.lengthCPS is None: - p = p[:1] + struct.pack(">B", res[1]) + p[2:] - if res[0] is not 0: - p = p[:-res[0]] - return p + pay - - -# len 3 to 14 -class CallingPartyBcdNumberHdr(Packet): - """Called party subaddress Section 10.5.4.9""" - name = "Called Party Subaddress" - fields_desc = [ - BitField("eightBitCPBN", None, 1), - XBitField("ieiCPBN", None, 7), - XByteField("lengthCPBN", None), - BitField("ext", 0x1, 1), - BitField("typeNb", 0x0, 3), - BitField("nbPlanId", 0x0, 4), - # optional - ConditionalField(BitField("ext1", 0x1, 1), - lambda pkt: pkt.ext == 0), - ConditionalField(BitField("presId", None, 2), - lambda pkt: pkt.ext == 0), - ConditionalField(BitField("spare", None, 3), - lambda pkt: pkt.ext == 0), - ConditionalField(BitField("screenId", 0x0, 2), - lambda pkt: pkt.ext == 0), - - BitField("nbDigit2", None, 4), - BitField("nbDigit1", None, 4), - - BitField("nbDigit4", None, 4), - BitField("nbDigit3", None, 4), - - BitField("nbDigit6", None, 4), - BitField("nbDigit5", None, 4), - - BitField("nbDigit8", None, 4), - BitField("nbDigit7", None, 4), - - BitField("nbDigit10", None, 4), - BitField("nbDigit9", None, 4), - - BitField("nbDigit12", None, 4), - BitField("nbDigit11", None, 4), - - BitField("nbDigit14", None, 4), - BitField("nbDigit13", None, 4), - - BitField("nbDigit16", None, 4), - BitField("nbDigit15", None, 4), - - BitField("nbDigit18", None, 4), - BitField("nbDigit17", None, 4), - - BitField("nbDigit20", None, 4), - BitField("nbDigit19", None, 4), - ] - - def post_build(self, p, pay): - aList = [] - a = [] - i = 0 - for i in range(0, len(self.fields_desc)): - aList.append(self.fields_desc[i].name) - for i in aList: - a.append(getattr(self, i)) - res = adapt(4, 14, a, self.fields_desc) - if res[0] is not 0: - p = p[:-res[0]] - if self.lengthCPBN is None: - p = p[:1] + struct.pack(">B", len(p)-2) + p[2:] - return p + pay - - -# len 2 to 23 -class CallingPartySubaddressHdr(Packet): - """Calling party subaddress Section 10.5.4.10""" - name = "Calling Party Subaddress" - fields_desc = [ - BitField("eightBitCPS", None, 1), - XBitField("ieiCPS", None, 7), - XByteField("lengthCPS", None), - # optional - BitField("ext1", None, 1), - BitField("typeAddr", None, 3), - BitField("oddEven", None, 1), - BitField("spare", None, 3), - - ByteField("subInfo0", None), - ByteField("subInfo1", None), - ByteField("subInfo2", None), - ByteField("subInfo3", None), - ByteField("subInfo4", None), - ByteField("subInfo5", None), - ByteField("subInfo6", None), - ByteField("subInfo7", None), - ByteField("subInfo8", None), - ByteField("subInfo9", None), - ByteField("subInfo10", None), - ByteField("subInfo11", None), - ByteField("subInfo12", None), - ByteField("subInfo13", None), - ByteField("subInfo14", None), - ByteField("subInfo15", None), - ByteField("subInfo16", None), - ByteField("subInfo17", None), - ByteField("subInfo18", None), - ByteField("subInfo19", None) - ] - - def post_build(self, p, pay): - aList = [] - a = [] - i = 0 - for i in range(0, len(self.fields_desc)): - aList.append(self.fields_desc[i].name) - for i in aList: - a.append(getattr(self, i)) - res = adapt(2, 23, a, self.fields_desc) - if self.lengthCPS is None: - p = p[:1] + struct.pack(">B", res[1]) + p[2:] - if res[0] is not 0: - p = p[:-res[0]] - return p + pay - - -# len 4 to 32 -class CauseHdr(Packet): - """Cause Section 10.5.4.11""" - name = "Cause" - fields_desc = [ - BitField("eightBitC", None, 1), - XBitField("ieiC", None, 7), - - XByteField("lengthC", None), - - BitField("ext", 0x1, 1), - BitField("codingStd", 0x0, 2), - BitField("spare", 0x0, 1), - BitField("location", 0x0, 4), - - ConditionalField(BitField("ext1", 0x1, 1), - lambda pkt: pkt.ext == 0), - ConditionalField(BitField("recommendation", 0x0, 7), - lambda pkt: pkt.ext == 0), - # optional - BitField("ext2", None, 1), - BitField("causeValue", None, 7), - - ByteField("diagnositc0", None), - ByteField("diagnositc1", None), - ByteField("diagnositc2", None), - ByteField("diagnositc3", None), - ByteField("diagnositc4", None), - ByteField("diagnositc5", None), - ByteField("diagnositc6", None), - ByteField("diagnositc7", None), - ByteField("diagnositc8", None), - ByteField("diagnositc9", None), - ByteField("diagnositc10", None), - ByteField("diagnositc11", None), - ByteField("diagnositc12", None), - ByteField("diagnositc13", None), - ByteField("diagnositc14", None), - ByteField("diagnositc15", None), - ByteField("diagnositc16", None), - ByteField("diagnositc17", None), - ByteField("diagnositc18", None), - ByteField("diagnositc19", None), - ByteField("diagnositc20", None), - ByteField("diagnositc21", None), - ByteField("diagnositc22", None), - ByteField("diagnositc23", None), - ByteField("diagnositc24", None), - ByteField("diagnositc25", None), - ByteField("diagnositc26", None), - ] - - def post_build(self, p, pay): - aList = [] - a = [] - i = 0 - for i in range(0, len(self.fields_desc)): - aList.append(self.fields_desc[i].name) - for i in aList: - a.append(getattr(self, i)) - res = adapt(4, 32, a, self.fields_desc) - if res[0] is not 0: - p = p[:-res[0]] - if self.lengthC is None: - p = p[:1] + struct.pack(">B", len(p)-2) + p[2:] - return p + pay - - -class ClirSuppressionHdr(Packet): - """CLIR suppression Section 10.5.4.11a""" - name = "Clir Suppression" - fields_desc = [ - BitField("eightBitCS", None, 1), - XBitField("ieiCS", None, 7), - ] - - -class ClirInvocationHdr(Packet): - """CLIR invocation Section 10.5.4.11b""" - name = "Clir Invocation" - fields_desc = [ - BitField("eightBitCI", None, 1), - XBitField("ieiCI", None, 7), - ] - - -class CongestionLevelHdr(Packet): - """Congestion level Section 10.5.4.12""" - name = "Congestion Level" - fields_desc = [ - XBitField("ieiCL", None, 4), - BitField("notDef", 0x0, 4) - ] - - -# Fix 1/2 len problem -class CongestionLevelAndSpareHalfOctets(Packet): - name = "Congestion Level and Spare Half Octets" - fields_desc = [ - BitField("ieiCL", 0x0, 4), - BitField("spareHalfOctets", 0x0, 4) - ] - - -# len 3 to 14 -class ConnectedNumberHdr(Packet): - """Connected number Section 10.5.4.13""" - name = "Connected Number" - fields_desc = [ - BitField("eightBitCN", None, 1), - XBitField("ieiCN", None, 7), - - XByteField("lengthCN", None), - - BitField("ext", 0x1, 1), - BitField("typeNb", 0x0, 3), - BitField("typePlanId", 0x0, 4), - # optional - ConditionalField(BitField("ext1", 0x1, 1), - lambda pkt: pkt.ext == 0), - ConditionalField(BitField("presId", None, 2), - lambda pkt: pkt.ext == 0), - ConditionalField(BitField("spare", None, 3), - lambda pkt: pkt.ext == 0), - ConditionalField(BitField("screenId", None, 2), - lambda pkt: pkt.ext == 0), - - BitField("nbDigit2", None, 4), - BitField("nbDigit1", None, 4), - - BitField("nbDigit4", None, 4), - BitField("nbDigit3", None, 4), - - BitField("nbDigit6", None, 4), - BitField("nbDigit5", None, 4), - - BitField("nbDigit8", None, 4), - BitField("nbDigit7", None, 4), - - BitField("nbDigit10", None, 4), - BitField("nbDigit9", None, 4), - - BitField("nbDigit12", None, 4), - BitField("nbDigit11", None, 4), - - BitField("nbDigit14", None, 4), - BitField("nbDigit13", None, 4), - - BitField("nbDigit16", None, 4), - BitField("nbDigit15", None, 4), - - BitField("nbDigit18", None, 4), - BitField("nbDigit17", None, 4), - - BitField("nbDigit20", None, 4), - BitField("nbDigit19", None, 4) - ] - - def post_build(self, p, pay): - aList = [] - a = [] - i = 0 - sum1 = 0 - for i in range(0, len(self.fields_desc)): - aList.append(self.fields_desc[i].name) - for i in aList: - a.append(getattr(self, i)) - res = adapt(3, 14, a, self.fields_desc) - if res[0] is not 0: - p = p[:-res[0]] - if self.lengthCN is None: - p = p[:1] + struct.pack(">B", len(p)-2) + p[2:] - return p + pay - - -# len 2 to 23 -class ConnectedSubaddressHdr(Packet): - """Connected subaddress Section 10.5.4.14""" - name = "Connected Subaddress" - fields_desc = [ - BitField("eightBitCS", None, 1), - XBitField("ieiCS", None, 7), - - XByteField("lengthCS", None), - # optional - BitField("ext", None, 1), - BitField("typeOfSub", None, 3), - BitField("oddEven", None, 1), - BitField("spare", None, 3), - - ByteField("subInfo0", None), - ByteField("subInfo1", None), - ByteField("subInfo2", None), - ByteField("subInfo3", None), - ByteField("subInfo4", None), - ByteField("subInfo5", None), - ByteField("subInfo6", None), - ByteField("subInfo7", None), - ByteField("subInfo8", None), - ByteField("subInfo9", None), - ByteField("subInfo10", None), - ByteField("subInfo11", None), - ByteField("subInfo12", None), - ByteField("subInfo13", None), - ByteField("subInfo14", None), - ByteField("subInfo15", None), - ByteField("subInfo16", None), - ByteField("subInfo17", None), - ByteField("subInfo18", None), - ByteField("subInfo19", None) - ] - - def post_build(self, p, pay): - aList = [] - a = [] - i = 0 - for i in range(0, len(self.fields_desc)): - aList.append(self.fields_desc[i].name) - for i in aList: - a.append(getattr(self, i)) - res = adapt(2, 23, a, self.fields_desc) - if self.lengthCS is None: - p = p[:1] + struct.pack(">B", res[1]) + p[2:] - if res[0] is not 0: - p = p[:-res[0]] - return p + pay - - -# len 2 to L3 (251) (done) -class FacilityHdr(Packet): - """Facility Section 10.5.4.15""" - name = "Facility" - fields_desc = [ - BitField("eightBitF", None, 1), - XBitField("ieiF", None, 7), - XByteField("lengthF", None), - # optional - ByteField("facilityInfo1", None), - ByteField("facilityInfo2", None), - ByteField("facilityInfo3", None), - ByteField("facilityInfo4", None), - ByteField("facilityInfo5", None), - ByteField("facilityInfo6", None), - ByteField("facilityInfo7", None), - ByteField("facilityInfo8", None), - ByteField("facilityInfo9", None), - ByteField("facilityInfo10", None), - ByteField("facilityInfo11", None), - ByteField("facilityInfo12", None), - ByteField("facilityInfo13", None), - ByteField("facilityInfo14", None), - ByteField("facilityInfo15", None), - ByteField("facilityInfo16", None), - ByteField("facilityInfo17", None), - ByteField("facilityInfo18", None), - ByteField("facilityInfo19", None), - ByteField("facilityInfo20", None), - ByteField("facilityInfo21", None), - ByteField("facilityInfo22", None), - ByteField("facilityInfo23", None), - ByteField("facilityInfo24", None), - ByteField("facilityInfo25", None), - ByteField("facilityInfo26", None), - ByteField("facilityInfo27", None), - ByteField("facilityInfo28", None), - ByteField("facilityInfo29", None), - ByteField("facilityInfo30", None), - ByteField("facilityInfo31", None), - ByteField("facilityInfo32", None), - ByteField("facilityInfo33", None), - ByteField("facilityInfo34", None), - ByteField("facilityInfo35", None), - ByteField("facilityInfo36", None), - ByteField("facilityInfo37", None), - ByteField("facilityInfo38", None), - ByteField("facilityInfo39", None), - ByteField("facilityInfo40", None), - ByteField("facilityInfo41", None), - ByteField("facilityInfo42", None), - ByteField("facilityInfo43", None), - ByteField("facilityInfo44", None), - ByteField("facilityInfo45", None), - ByteField("facilityInfo46", None), - ByteField("facilityInfo47", None), - ByteField("facilityInfo48", None), - ByteField("facilityInfo49", None), - ByteField("facilityInfo50", None), - ByteField("facilityInfo51", None), - ByteField("facilityInfo52", None), - ByteField("facilityInfo53", None), - ByteField("facilityInfo54", None), - ByteField("facilityInfo55", None), - ByteField("facilityInfo56", None), - ByteField("facilityInfo57", None), - ByteField("facilityInfo58", None), - ByteField("facilityInfo59", None), - ByteField("facilityInfo60", None), - ByteField("facilityInfo61", None), - ByteField("facilityInfo62", None), - ByteField("facilityInfo63", None), - ByteField("facilityInfo64", None), - ByteField("facilityInfo65", None), - ByteField("facilityInfo66", None), - ByteField("facilityInfo67", None), - ByteField("facilityInfo68", None), - ByteField("facilityInfo69", None), - ByteField("facilityInfo70", None), - ByteField("facilityInfo71", None), - ByteField("facilityInfo72", None), - ByteField("facilityInfo73", None), - ByteField("facilityInfo74", None), - ByteField("facilityInfo75", None), - ByteField("facilityInfo76", None), - ByteField("facilityInfo77", None), - ByteField("facilityInfo78", None), - ByteField("facilityInfo79", None), - ByteField("facilityInfo80", None), - ByteField("facilityInfo81", None), - ByteField("facilityInfo82", None), - ByteField("facilityInfo83", None), - ByteField("facilityInfo84", None), - ByteField("facilityInfo85", None), - ByteField("facilityInfo86", None), - ByteField("facilityInfo87", None), - ByteField("facilityInfo88", None), - ByteField("facilityInfo89", None), - ByteField("facilityInfo90", None), - ByteField("facilityInfo91", None), - ByteField("facilityInfo92", None), - ByteField("facilityInfo93", None), - ByteField("facilityInfo94", None), - ByteField("facilityInfo95", None), - ByteField("facilityInfo96", None), - ByteField("facilityInfo97", None), - ByteField("facilityInfo98", None), - ByteField("facilityInfo99", None), - ByteField("facilityInfo100", None), - ByteField("facilityInfo101", None), - ByteField("facilityInfo102", None), - ByteField("facilityInfo103", None), - ByteField("facilityInfo104", None), - ByteField("facilityInfo105", None), - ByteField("facilityInfo106", None), - ByteField("facilityInfo107", None), - ByteField("facilityInfo108", None), - ByteField("facilityInfo109", None), - ByteField("facilityInfo110", None), - ByteField("facilityInfo111", None), - ByteField("facilityInfo112", None), - ByteField("facilityInfo113", None), - ByteField("facilityInfo114", None), - ByteField("facilityInfo115", None), - ByteField("facilityInfo116", None), - ByteField("facilityInfo117", None), - ByteField("facilityInfo118", None), - ByteField("facilityInfo119", None), - ByteField("facilityInfo120", None), - ByteField("facilityInfo121", None), - ByteField("facilityInfo122", None), - ByteField("facilityInfo123", None), - ByteField("facilityInfo124", None), - ByteField("facilityInfo125", None), - ByteField("facilityInfo126", None), - ByteField("facilityInfo127", None), - ByteField("facilityInfo128", None), - ByteField("facilityInfo129", None), - ByteField("facilityInfo130", None), - ByteField("facilityInfo131", None), - ByteField("facilityInfo132", None), - ByteField("facilityInfo133", None), - ByteField("facilityInfo134", None), - ByteField("facilityInfo135", None), - ByteField("facilityInfo136", None), - ByteField("facilityInfo137", None), - ByteField("facilityInfo138", None), - ByteField("facilityInfo139", None), - ByteField("facilityInfo140", None), - ByteField("facilityInfo141", None), - ByteField("facilityInfo142", None), - ByteField("facilityInfo143", None), - ByteField("facilityInfo144", None), - ByteField("facilityInfo145", None), - ByteField("facilityInfo146", None), - ByteField("facilityInfo147", None), - ByteField("facilityInfo148", None), - ByteField("facilityInfo149", None), - ByteField("facilityInfo150", None), - ByteField("facilityInfo151", None), - ByteField("facilityInfo152", None), - ByteField("facilityInfo153", None), - ByteField("facilityInfo154", None), - ByteField("facilityInfo155", None), - ByteField("facilityInfo156", None), - ByteField("facilityInfo157", None), - ByteField("facilityInfo158", None), - ByteField("facilityInfo159", None), - ByteField("facilityInfo160", None), - ByteField("facilityInfo161", None), - ByteField("facilityInfo162", None), - ByteField("facilityInfo163", None), - ByteField("facilityInfo164", None), - ByteField("facilityInfo165", None), - ByteField("facilityInfo166", None), - ByteField("facilityInfo167", None), - ByteField("facilityInfo168", None), - ByteField("facilityInfo169", None), - ByteField("facilityInfo170", None), - ByteField("facilityInfo171", None), - ByteField("facilityInfo172", None), - ByteField("facilityInfo173", None), - ByteField("facilityInfo174", None), - ByteField("facilityInfo175", None), - ByteField("facilityInfo176", None), - ByteField("facilityInfo177", None), - ByteField("facilityInfo178", None), - ByteField("facilityInfo179", None), - ByteField("facilityInfo180", None), - ByteField("facilityInfo181", None), - ByteField("facilityInfo182", None), - ByteField("facilityInfo183", None), - ByteField("facilityInfo184", None), - ByteField("facilityInfo185", None), - ByteField("facilityInfo186", None), - ByteField("facilityInfo187", None), - ByteField("facilityInfo188", None), - ByteField("facilityInfo189", None), - ByteField("facilityInfo190", None), - ByteField("facilityInfo191", None), - ByteField("facilityInfo192", None), - ByteField("facilityInfo193", None), - ByteField("facilityInfo194", None), - ByteField("facilityInfo195", None), - ByteField("facilityInfo196", None), - ByteField("facilityInfo197", None), - ByteField("facilityInfo198", None), - ByteField("facilityInfo199", None), - ByteField("facilityInfo200", None), - ByteField("facilityInfo201", None), - ByteField("facilityInfo202", None), - ByteField("facilityInfo203", None), - ByteField("facilityInfo204", None), - ByteField("facilityInfo205", None), - ByteField("facilityInfo206", None), - ByteField("facilityInfo207", None), - ByteField("facilityInfo208", None), - ByteField("facilityInfo209", None), - ByteField("facilityInfo210", None), - ByteField("facilityInfo211", None), - ByteField("facilityInfo212", None), - ByteField("facilityInfo213", None), - ByteField("facilityInfo214", None), - ByteField("facilityInfo215", None), - ByteField("facilityInfo216", None), - ByteField("facilityInfo217", None), - ByteField("facilityInfo218", None), - ByteField("facilityInfo219", None), - ByteField("facilityInfo220", None), - ByteField("facilityInfo221", None), - ByteField("facilityInfo222", None), - ByteField("facilityInfo223", None), - ByteField("facilityInfo224", None), - ByteField("facilityInfo225", None), - ByteField("facilityInfo226", None), - ByteField("facilityInfo227", None), - ByteField("facilityInfo228", None), - ByteField("facilityInfo229", None), - ByteField("facilityInfo230", None), - ByteField("facilityInfo231", None), - ByteField("facilityInfo232", None), - ByteField("facilityInfo233", None), - ByteField("facilityInfo234", None), - ByteField("facilityInfo235", None), - ByteField("facilityInfo236", None), - ByteField("facilityInfo237", None), - ByteField("facilityInfo238", None), - ByteField("facilityInfo239", None), - ByteField("facilityInfo240", None), - ByteField("facilityInfo241", None), - ByteField("facilityInfo242", None), - ByteField("facilityInfo243", None), - ByteField("facilityInfo244", None), - ByteField("facilityInfo245", None), - ByteField("facilityInfo246", None), - ByteField("facilityInfo247", None), - ByteField("facilityInfo248", None), - ByteField("facilityInfo249", None) - ] - - def post_build(self, p, pay): - aList = [] - a = [] - i = 0 - for i in range(0, len(self.fields_desc)): - aList.append(self.fields_desc[i].name) - for i in aList: - a.append(getattr(self, i)) - res = adapt(2, 251, a, self.fields_desc) - if self.lengthF is None: - p = p[:1] + struct.pack(">B", res[1]) + p[2:] - if res[0] is not 0: - p = p[:-res[0]] - return p + pay - - -#len 2 to 5 -class HighLayerCompatibilityHdr(Packet): - """High layer compatibility Section 10.5.4.16""" - name = "High Layer Compatibility" - fields_desc = [ - BitField("eightBitHLC", None, 1), - XBitField("ieiHLC", None, 7), - - XByteField("lengthHLC", None), - # optional - BitField("ext", None, 1), - BitField("codingStd", None, 2), - BitField("interpret", None, 3), - BitField("presMeth", None, 2), - - BitField("ext1", None, 1), - BitField("highLayerId", None, 7), - - ConditionalField(BitField("ext2", 0x1, 1), - lambda pkt: pkt.ext1 == 0), - ConditionalField(BitField("exHiLayerId", 0x0, 7), - lambda pkt: pkt.ext1 == 0) - ] - - def post_build(self, p, pay): - aList = [] - a = [] - i = 0 - for i in range(0, len(self.fields_desc)): - aList.append(self.fields_desc[i].name) - for i in aList: - a.append(getattr(self, i)) - res = adapt(2, 5, a, self.fields_desc) - if res[0] is not 0: - p = p[:-res[0]] - if self.lengthHLC is None: - p = p[:1] + struct.pack(">B", len(p)-2) + p[2:] - return p + pay -# -# 10.5.4.16.1 Static conditions for the high layer -# compatibility IE contents -# - - -class KeypadFacilityHdr(Packet): - """Keypad facility Section 10.5.4.17""" - name = "Keypad Facility" - fields_desc = [ - BitField("eightBitKF", None, 1), - XBitField("ieiKF", None, 7), - BitField("spare", 0x0, 1), - BitField("keyPadInfo", 0x0, 7) - ] - - -# len 2 to 15 -class LowLayerCompatibilityHdr(Packet): - """Low layer compatibility Section 10.5.4.18""" - name = "Low Layer Compatibility" - fields_desc = [ - BitField("eightBitLLC", None, 1), - XBitField("ieiLLC", None, 7), - - XByteField("lengthLLC", None), - # optional - ByteField("rest0", None), - ByteField("rest1", None), - ByteField("rest2", None), - ByteField("rest3", None), - ByteField("rest4", None), - ByteField("rest5", None), - ByteField("rest6", None), - ByteField("rest7", None), - ByteField("rest8", None), - ByteField("rest9", None), - ByteField("rest10", None), - ByteField("rest11", None), - ByteField("rest12", None) - ] - - def post_build(self, p, pay): - aList = [] - a = [] - i = 0 - for i in range(0, len(self.fields_desc)): - aList.append(self.fields_desc[i].name) - for i in aList: - a.append(getattr(self, i)) - res = adapt(2, 15, a, self.fields_desc) - if self.lengthLLC is None: - p = p[:1] + struct.pack(">B", res[1]) + p[2:] - if res[0] is not 0: - p = p[:-res[0]] - return p + pay - - -class MoreDataHdr(Packet): - """More data Section 10.5.4.19""" - name = "More Data" - fields_desc = [ - BitField("eightBitMD", None, 1), - XBitField("ieiMD", None, 7), - ] - - -class NotificationIndicatorHdr(Packet): - """Notification indicator Section 10.5.4.20""" - name = "Notification Indicator" - fields_desc = [ - BitField("eightBitNI", None, 1), - XBitField("ieiNI", None, 7), - BitField("ext", 0x1, 1), - BitField("notifDesc", 0x0, 7) - ] - - -class ProgressIndicatorHdr(Packet): - """Progress indicator Section 10.5.4.21""" - name = "Progress Indicator" - fields_desc = [ - BitField("eightBitPI", None, 1), - XBitField("ieiPI", None, 7), - XByteField("lengthPI", 0x2), - BitField("ext", 0x1, 1), - BitField("codingStd", 0x0, 2), - BitField("spare", 0x0, 1), - BitField("location", 0x0, 4), - BitField("ext1", 0x1, 1), - BitField("progressDesc", 0x0, 7) - ] - - -class RecallTypeHdr(Packet): - """Recall type $(CCBS)$ Section 10.5.4.21a""" - name = "Recall Type $(CCBS)$" - fields_desc = [ - BitField("eightBitRT", None, 1), - XBitField("ieiRT", None, 7), - BitField("spare", 0x0, 5), - BitField("recallType", 0x0, 3) - ] - - -# len 3 to 19 -class RedirectingPartyBcdNumberHdr(Packet): - """Redirecting party BCD number Section 10.5.4.21b""" - name = "Redirecting Party BCD Number" - fields_desc = [ - BitField("eightBitRPBN", None, 1), - XBitField("ieiRPBN", None, 7), - - XByteField("lengthRPBN", None), - - BitField("ext", 0x1, 1), - BitField("typeNb", 0x0, 3), - BitField("numberingPlan", 0x0, 4), - # optional - ConditionalField(BitField("ext1", 0x1, 1), - lambda pkt: pkt.ext == 0), - ConditionalField(BitField("presId", None, 2), - lambda pkt: pkt.ext == 0), - ConditionalField(BitField("spare", None, 3), - lambda pkt: pkt.ext == 0), - ConditionalField(BitField("screenId", None, 2), - lambda pkt: pkt.ext == 0), - - BitField("nbDigit2", None, 4), - BitField("nbDigit1", None, 4), - - BitField("nbDigit4", None, 4), - BitField("nbDigit3", None, 4), - - BitField("nbDigit6", None, 4), - BitField("nbDigit5", None, 4), - - BitField("nbDigit8", None, 4), - BitField("nbDigit7", None, 4), - - BitField("nbDigit10", None, 4), - BitField("nbDigit9", None, 4), - - BitField("nbDigit12", None, 4), - BitField("nbDigit11", None, 4), - - BitField("nbDigit14", None, 4), - BitField("nbDigit13", None, 4), - - BitField("nbDigit16", None, 4), - BitField("nbDigit15", None, 4), - - BitField("nbDigit18", None, 4), - BitField("nbDigit17", None, 4), - - BitField("nbDigit20", None, 4), - BitField("nbDigit19", None, 4), - - BitField("nbDigit22", None, 4), - BitField("nbDigit21", None, 4), - - BitField("nbDigit24", None, 4), - BitField("nbDigit23", None, 4), - - BitField("nbDigit26", None, 4), - BitField("nbDigit25", None, 4), - - BitField("nbDigit28", None, 4), - BitField("nbDigit27", None, 4), - - BitField("nbDigit30", None, 4), - BitField("nbDigit29", None, 4), - ] - - def post_build(self, p, pay): - aList = [] - a = [] - i = 0 - for i in range(0, len(self.fields_desc)): - aList.append(self.fields_desc[i].name) - for i in aList: - a.append(getattr(self, i)) - res = adapt(3, 19, a, self.fields_desc) - if res[0] is not 0: - p = p[:-res[0]] - if self.lengthRPBN is None: - p = p[:1] + struct.pack(">B", len(p)-2) + p[2:] - return p + pay - - -# length 2 to 23 -class RedirectingPartySubaddressHdr(Packet): - """Redirecting party subaddress Section 10.5.4.21c""" - name = "Redirecting Party BCD Number" - fields_desc = [ - BitField("eightBitRPS", None, 1), - XBitField("ieiRPS", None, 7), - - XByteField("lengthRPS", None), - # optional - BitField("ext", None, 1), - BitField("typeSub", None, 3), - BitField("oddEven", None, 1), - BitField("spare", None, 3), - - ByteField("subInfo0", None), - ByteField("subInfo1", None), - ByteField("subInfo2", None), - ByteField("subInfo3", None), - ByteField("subInfo4", None), - ByteField("subInfo5", None), - ByteField("subInfo6", None), - ByteField("subInfo7", None), - ByteField("subInfo8", None), - ByteField("subInfo9", None), - ByteField("subInfo10", None), - ByteField("subInfo11", None), - ByteField("subInfo12", None), - ByteField("subInfo13", None), - ByteField("subInfo14", None), - ByteField("subInfo15", None), - ByteField("subInfo16", None), - ByteField("subInfo17", None), - ByteField("subInfo18", None), - ByteField("subInfo19", None) - ] - - def post_build(self, p, pay): - aList = [] - a = [] - i = 0 - for i in range(0, len(self.fields_desc)): - aList.append(self.fields_desc[i].name) - for i in aList: - a.append(getattr(self, i)) - res = adapt(2, 23, a, self.fields_desc) - if self.lengthRPS is None: - p = p[:1] + struct.pack(">B", res[1]) + p[2:] - if res[0] is not 0: - p = p[:-res[0]] - return p + pay - - -class RepeatIndicatorHdr(Packet): - """Repeat indicator Section 10.5.4.22""" - name = "Repeat Indicator" - fields_desc = [ - XBitField("ieiRI", None, 4), - BitField("repeatIndic", 0x0, 4) - ] - - -class ReverseCallSetupDirectionHdr(Packet): - """Reverse call setup direction Section 10.5.4.22a""" - name = "Reverse Call Setup Direction" - fields_desc = [ - ByteField("ieiRCSD", 0x0) - ] - - -# no upper length min 2(max for L3) (251) -class SetupContainerHdr(Packet): - """SETUP Container $(CCBS)$ Section 10.5.4.22b""" - name = "Setup Container $(CCBS)$" - fields_desc = [ - BitField("eightBitSC", None, 1), - XBitField("ieiSC", None, 7), - XByteField("lengthSC", None), - # optional - ByteField("mess1", None), - ByteField("mess2", None), - ByteField("mess3", None), - ByteField("mess4", None), - ByteField("mess5", None), - ByteField("mess6", None), - ByteField("mess7", None), - ByteField("mess8", None), - ByteField("mess9", None), - ByteField("mess10", None), - ByteField("mess11", None), - ByteField("mess12", None), - ByteField("mess13", None), - ByteField("mess14", None), - ByteField("mess15", None), - ByteField("mess16", None), - ByteField("mess17", None), - ByteField("mess18", None), - ByteField("mess19", None), - ByteField("mess20", None), - ByteField("mess21", None), - ByteField("mess22", None), - ByteField("mess23", None), - ByteField("mess24", None), - ByteField("mess25", None), - ByteField("mess26", None), - ByteField("mess27", None), - ByteField("mess28", None), - ByteField("mess29", None), - ByteField("mess30", None), - ByteField("mess31", None), - ByteField("mess32", None), - ByteField("mess33", None), - ByteField("mess34", None), - ByteField("mess35", None), - ByteField("mess36", None), - ByteField("mess37", None), - ByteField("mess38", None), - ByteField("mess39", None), - ByteField("mess40", None), - ByteField("mess41", None), - ByteField("mess42", None), - ByteField("mess43", None), - ByteField("mess44", None), - ByteField("mess45", None), - ByteField("mess46", None), - ByteField("mess47", None), - ByteField("mess48", None), - ByteField("mess49", None), - ByteField("mess50", None), - ByteField("mess51", None), - ByteField("mess52", None), - ByteField("mess53", None), - ByteField("mess54", None), - ByteField("mess55", None), - ByteField("mess56", None), - ByteField("mess57", None), - ByteField("mess58", None), - ByteField("mess59", None), - ByteField("mess60", None), - ByteField("mess61", None), - ByteField("mess62", None), - ByteField("mess63", None), - ByteField("mess64", None), - ByteField("mess65", None), - ByteField("mess66", None), - ByteField("mess67", None), - ByteField("mess68", None), - ByteField("mess69", None), - ByteField("mess70", None), - ByteField("mess71", None), - ByteField("mess72", None), - ByteField("mess73", None), - ByteField("mess74", None), - ByteField("mess75", None), - ByteField("mess76", None), - ByteField("mess77", None), - ByteField("mess78", None), - ByteField("mess79", None), - ByteField("mess80", None), - ByteField("mess81", None), - ByteField("mess82", None), - ByteField("mess83", None), - ByteField("mess84", None), - ByteField("mess85", None), - ByteField("mess86", None), - ByteField("mess87", None), - ByteField("mess88", None), - ByteField("mess89", None), - ByteField("mess90", None), - ByteField("mess91", None), - ByteField("mess92", None), - ByteField("mess93", None), - ByteField("mess94", None), - ByteField("mess95", None), - ByteField("mess96", None), - ByteField("mess97", None), - ByteField("mess98", None), - ByteField("mess99", None), - ByteField("mess100", None), - ByteField("mess101", None), - ByteField("mess102", None), - ByteField("mess103", None), - ByteField("mess104", None), - ByteField("mess105", None), - ByteField("mess106", None), - ByteField("mess107", None), - ByteField("mess108", None), - ByteField("mess109", None), - ByteField("mess110", None), - ByteField("mess111", None), - ByteField("mess112", None), - ByteField("mess113", None), - ByteField("mess114", None), - ByteField("mess115", None), - ByteField("mess116", None), - ByteField("mess117", None), - ByteField("mess118", None), - ByteField("mess119", None), - ByteField("mess120", None), - ByteField("mess121", None), - ByteField("mess122", None), - ByteField("mess123", None), - ByteField("mess124", None), - ByteField("mess125", None), - ByteField("mess126", None), - ByteField("mess127", None), - ByteField("mess128", None), - ByteField("mess129", None), - ByteField("mess130", None), - ByteField("mess131", None), - ByteField("mess132", None), - ByteField("mess133", None), - ByteField("mess134", None), - ByteField("mess135", None), - ByteField("mess136", None), - ByteField("mess137", None), - ByteField("mess138", None), - ByteField("mess139", None), - ByteField("mess140", None), - ByteField("mess141", None), - ByteField("mess142", None), - ByteField("mess143", None), - ByteField("mess144", None), - ByteField("mess145", None), - ByteField("mess146", None), - ByteField("mess147", None), - ByteField("mess148", None), - ByteField("mess149", None), - ByteField("mess150", None), - ByteField("mess151", None), - ByteField("mess152", None), - ByteField("mess153", None), - ByteField("mess154", None), - ByteField("mess155", None), - ByteField("mess156", None), - ByteField("mess157", None), - ByteField("mess158", None), - ByteField("mess159", None), - ByteField("mess160", None), - ByteField("mess161", None), - ByteField("mess162", None), - ByteField("mess163", None), - ByteField("mess164", None), - ByteField("mess165", None), - ByteField("mess166", None), - ByteField("mess167", None), - ByteField("mess168", None), - ByteField("mess169", None), - ByteField("mess170", None), - ByteField("mess171", None), - ByteField("mess172", None), - ByteField("mess173", None), - ByteField("mess174", None), - ByteField("mess175", None), - ByteField("mess176", None), - ByteField("mess177", None), - ByteField("mess178", None), - ByteField("mess179", None), - ByteField("mess180", None), - ByteField("mess181", None), - ByteField("mess182", None), - ByteField("mess183", None), - ByteField("mess184", None), - ByteField("mess185", None), - ByteField("mess186", None), - ByteField("mess187", None), - ByteField("mess188", None), - ByteField("mess189", None), - ByteField("mess190", None), - ByteField("mess191", None), - ByteField("mess192", None), - ByteField("mess193", None), - ByteField("mess194", None), - ByteField("mess195", None), - ByteField("mess196", None), - ByteField("mess197", None), - ByteField("mess198", None), - ByteField("mess199", None), - ByteField("mess200", None), - ByteField("mess201", None), - ByteField("mess202", None), - ByteField("mess203", None), - ByteField("mess204", None), - ByteField("mess205", None), - ByteField("mess206", None), - ByteField("mess207", None), - ByteField("mess208", None), - ByteField("mess209", None), - ByteField("mess210", None), - ByteField("mess211", None), - ByteField("mess212", None), - ByteField("mess213", None), - ByteField("mess214", None), - ByteField("mess215", None), - ByteField("mess216", None), - ByteField("mess217", None), - ByteField("mess218", None), - ByteField("mess219", None), - ByteField("mess220", None), - ByteField("mess221", None), - ByteField("mess222", None), - ByteField("mess223", None), - ByteField("mess224", None), - ByteField("mess225", None), - ByteField("mess226", None), - ByteField("mess227", None), - ByteField("mess228", None), - ByteField("mess229", None), - ByteField("mess230", None), - ByteField("mess231", None), - ByteField("mess232", None), - ByteField("mess233", None), - ByteField("mess234", None), - ByteField("mess235", None), - ByteField("mess236", None), - ByteField("mess237", None), - ByteField("mess238", None), - ByteField("mess239", None), - ByteField("mess240", None), - ByteField("mess241", None), - ByteField("mess242", None), - ByteField("mess243", None), - ByteField("mess244", None), - ByteField("mess245", None), - ByteField("mess246", None), - ByteField("mess247", None), - ByteField("mess248", None), - ByteField("mess249", None), - ] - - def post_build(self, p, pay): - aList = [] - a = [] - i = 0 - for i in range(0, len(self.fields_desc)): - aList.append(self.fields_desc[i].name) - for i in aList: - a.append(getattr(self, i)) - res = adapt(2, 251, a, self.fields_desc) - if self.lengthSC is None: - p = p[:1] + struct.pack(">B", res[1]) + p[2:] - if res[0] is not 0: - p = p[:-res[0]] - return p + pay - - -class SignalHdr(Packet): - """Signal Section 10.5.4.23""" - name = "Signal" - fields_desc = [ - BitField("eightBitS", None, 1), - XBitField("ieiS", None, 7), - ByteField("sigValue", 0x0) - ] - - -# length 2 to max for L3 message (251) -class SsVersionIndicatorHdr(Packet): - """SS Version Indicator Section 10.5.4.24""" - name = "SS Version Indicator" - fields_desc = [ - BitField("eightBitSVI", None, 1), - XBitField("ieiSVI", None, 7), - XByteField("lengthSVI", None), - # optional - ByteField("info1", None), - ByteField("info2", None), - ByteField("info3", None), - ByteField("info4", None), - ByteField("info5", None), - ByteField("info6", None), - ByteField("info7", None), - ByteField("info8", None), - ByteField("info9", None), - ByteField("info10", None), - ByteField("info11", None), - ByteField("info12", None), - ByteField("info13", None), - ByteField("info14", None), - ByteField("info15", None), - ByteField("info16", None), - ByteField("info17", None), - ByteField("info18", None), - ByteField("info19", None), - ByteField("info20", None), - ByteField("info21", None), - ByteField("info22", None), - ByteField("info23", None), - ByteField("info24", None), - ByteField("info25", None), - ByteField("info26", None), - ByteField("info27", None), - ByteField("info28", None), - ByteField("info29", None), - ByteField("info30", None), - ByteField("info31", None), - ByteField("info32", None), - ByteField("info33", None), - ByteField("info34", None), - ByteField("info35", None), - ByteField("info36", None), - ByteField("info37", None), - ByteField("info38", None), - ByteField("info39", None), - ByteField("info40", None), - ByteField("info41", None), - ByteField("info42", None), - ByteField("info43", None), - ByteField("info44", None), - ByteField("info45", None), - ByteField("info46", None), - ByteField("info47", None), - ByteField("info48", None), - ByteField("info49", None), - ByteField("info50", None), - ByteField("info51", None), - ByteField("info52", None), - ByteField("info53", None), - ByteField("info54", None), - ByteField("info55", None), - ByteField("info56", None), - ByteField("info57", None), - ByteField("info58", None), - ByteField("info59", None), - ByteField("info60", None), - ByteField("info61", None), - ByteField("info62", None), - ByteField("info63", None), - ByteField("info64", None), - ByteField("info65", None), - ByteField("info66", None), - ByteField("info67", None), - ByteField("info68", None), - ByteField("info69", None), - ByteField("info70", None), - ByteField("info71", None), - ByteField("info72", None), - ByteField("info73", None), - ByteField("info74", None), - ByteField("info75", None), - ByteField("info76", None), - ByteField("info77", None), - ByteField("info78", None), - ByteField("info79", None), - ByteField("info80", None), - ByteField("info81", None), - ByteField("info82", None), - ByteField("info83", None), - ByteField("info84", None), - ByteField("info85", None), - ByteField("info86", None), - ByteField("info87", None), - ByteField("info88", None), - ByteField("info89", None), - ByteField("info90", None), - ByteField("info91", None), - ByteField("info92", None), - ByteField("info93", None), - ByteField("info94", None), - ByteField("info95", None), - ByteField("info96", None), - ByteField("info97", None), - ByteField("info98", None), - ByteField("info99", None), - ByteField("info100", None), - ByteField("info101", None), - ByteField("info102", None), - ByteField("info103", None), - ByteField("info104", None), - ByteField("info105", None), - ByteField("info106", None), - ByteField("info107", None), - ByteField("info108", None), - ByteField("info109", None), - ByteField("info110", None), - ByteField("info111", None), - ByteField("info112", None), - ByteField("info113", None), - ByteField("info114", None), - ByteField("info115", None), - ByteField("info116", None), - ByteField("info117", None), - ByteField("info118", None), - ByteField("info119", None), - ByteField("info120", None), - ByteField("info121", None), - ByteField("info122", None), - ByteField("info123", None), - ByteField("info124", None), - ByteField("info125", None), - ByteField("info126", None), - ByteField("info127", None), - ByteField("info128", None), - ByteField("info129", None), - ByteField("info130", None), - ByteField("info131", None), - ByteField("info132", None), - ByteField("info133", None), - ByteField("info134", None), - ByteField("info135", None), - ByteField("info136", None), - ByteField("info137", None), - ByteField("info138", None), - ByteField("info139", None), - ByteField("info140", None), - ByteField("info141", None), - ByteField("info142", None), - ByteField("info143", None), - ByteField("info144", None), - ByteField("info145", None), - ByteField("info146", None), - ByteField("info147", None), - ByteField("info148", None), - ByteField("info149", None), - ByteField("info150", None), - ByteField("info151", None), - ByteField("info152", None), - ByteField("info153", None), - ByteField("info154", None), - ByteField("info155", None), - ByteField("info156", None), - ByteField("info157", None), - ByteField("info158", None), - ByteField("info159", None), - ByteField("info160", None), - ByteField("info161", None), - ByteField("info162", None), - ByteField("info163", None), - ByteField("info164", None), - ByteField("info165", None), - ByteField("info166", None), - ByteField("info167", None), - ByteField("info168", None), - ByteField("info169", None), - ByteField("info170", None), - ByteField("info171", None), - ByteField("info172", None), - ByteField("info173", None), - ByteField("info174", None), - ByteField("info175", None), - ByteField("info176", None), - ByteField("info177", None), - ByteField("info178", None), - ByteField("info179", None), - ByteField("info180", None), - ByteField("info181", None), - ByteField("info182", None), - ByteField("info183", None), - ByteField("info184", None), - ByteField("info185", None), - ByteField("info186", None), - ByteField("info187", None), - ByteField("info188", None), - ByteField("info189", None), - ByteField("info190", None), - ByteField("info191", None), - ByteField("info192", None), - ByteField("info193", None), - ByteField("info194", None), - ByteField("info195", None), - ByteField("info196", None), - ByteField("info197", None), - ByteField("info198", None), - ByteField("info199", None), - ByteField("info200", None), - ByteField("info201", None), - ByteField("info202", None), - ByteField("info203", None), - ByteField("info204", None), - ByteField("info205", None), - ByteField("info206", None), - ByteField("info207", None), - ByteField("info208", None), - ByteField("info209", None), - ByteField("info210", None), - ByteField("info211", None), - ByteField("info212", None), - ByteField("info213", None), - ByteField("info214", None), - ByteField("info215", None), - ByteField("info216", None), - ByteField("info217", None), - ByteField("info218", None), - ByteField("info219", None), - ByteField("info220", None), - ByteField("info221", None), - ByteField("info222", None), - ByteField("info223", None), - ByteField("info224", None), - ByteField("info225", None), - ByteField("info226", None), - ByteField("info227", None), - ByteField("info228", None), - ByteField("info229", None), - ByteField("info230", None), - ByteField("info231", None), - ByteField("info232", None), - ByteField("info233", None), - ByteField("info234", None), - ByteField("info235", None), - ByteField("info236", None), - ByteField("info237", None), - ByteField("info238", None), - ByteField("info239", None), - ByteField("info240", None), - ByteField("info241", None), - ByteField("info242", None), - ByteField("info243", None), - ByteField("info244", None), - ByteField("info245", None), - ByteField("info246", None), - ByteField("info247", None), - ByteField("info248", None), - ByteField("info249", None), - ] - - def post_build(self, p, pay): - aList = [] - a = [] - i = 0 - for i in range(0, len(self.fields_desc)): - aList.append(self.fields_desc[i].name) - for i in aList: - a.append(getattr(self, i)) - res = adapt(2, 251, a, self.fields_desc) - if self.lengthSVI is None: - p = p[:1] + struct.pack(">B", res[1]) + p[2:] - if res[0] is not 0: - p = p[:-res[0]] - return p + pay - - -# length 3 to 35 or 131 -class UserUserHdr(Packet): - """User-user Section 10.5.4.25""" - name = "User-User" - fields_desc = [ - BitField("eightBitUU", None, 1), - XBitField("ieiUU", None, 7), - - XByteField("lengthUU", None), # dynamic length of field depending - # of the type of message - # let user decide which length he - # wants to take - # => more fuzzing options - ByteField("userUserPD", 0x0), - # optional - ByteField("userUserInfo1", None), - ByteField("userUserInfo2", None), - ByteField("userUserInfo3", None), - ByteField("userUserInfo4", None), - ByteField("userUserInfo5", None), - ByteField("userUserInfo6", None), - ByteField("userUserInfo7", None), - ByteField("userUserInfo8", None), - ByteField("userUserInfo9", None), - ByteField("userUserInfo10", None), - ByteField("userUserInfo11", None), - ByteField("userUserInfo12", None), - ByteField("userUserInfo13", None), - ByteField("userUserInfo14", None), - ByteField("userUserInfo15", None), - ByteField("userUserInfo16", None), - ByteField("userUserInfo17", None), - ByteField("userUserInfo18", None), - ByteField("userUserInfo19", None), - ByteField("userUserInfo20", None), - ByteField("userUserInfo21", None), - ByteField("userUserInfo22", None), - ByteField("userUserInfo23", None), - ByteField("userUserInfo24", None), - ByteField("userUserInfo25", None), - ByteField("userUserInfo26", None), - ByteField("userUserInfo27", None), - ByteField("userUserInfo28", None), - ByteField("userUserInfo29", None), - ByteField("userUserInfo30", None), - ByteField("userUserInfo31", None), - ByteField("userUserInfo32", None), - # long packet - ByteField("userUserInfo33", None), - ByteField("userUserInfo34", None), - ByteField("userUserInfo35", None), - ByteField("userUserInfo36", None), - ByteField("userUserInfo37", None), - ByteField("userUserInfo38", None), - ByteField("userUserInfo39", None), - ByteField("userUserInfo40", None), - ByteField("userUserInfo41", None), - ByteField("userUserInfo42", None), - ByteField("userUserInfo43", None), - ByteField("userUserInfo44", None), - ByteField("userUserInfo45", None), - ByteField("userUserInfo46", None), - ByteField("userUserInfo47", None), - ByteField("userUserInfo48", None), - ByteField("userUserInfo49", None), - ByteField("userUserInfo50", None), - ByteField("userUserInfo51", None), - ByteField("userUserInfo52", None), - ByteField("userUserInfo53", None), - ByteField("userUserInfo54", None), - ByteField("userUserInfo55", None), - ByteField("userUserInfo56", None), - ByteField("userUserInfo57", None), - ByteField("userUserInfo58", None), - ByteField("userUserInfo59", None), - ByteField("userUserInfo60", None), - ByteField("userUserInfo61", None), - ByteField("userUserInfo62", None), - ByteField("userUserInfo63", None), - ByteField("userUserInfo64", None), - ByteField("userUserInfo65", None), - ByteField("userUserInfo66", None), - ByteField("userUserInfo67", None), - ByteField("userUserInfo68", None), - ByteField("userUserInfo69", None), - ByteField("userUserInfo70", None), - ByteField("userUserInfo71", None), - ByteField("userUserInfo72", None), - ByteField("userUserInfo73", None), - ByteField("userUserInfo74", None), - ByteField("userUserInfo75", None), - ByteField("userUserInfo76", None), - ByteField("userUserInfo77", None), - ByteField("userUserInfo78", None), - ByteField("userUserInfo79", None), - ByteField("userUserInfo80", None), - ByteField("userUserInfo81", None), - ByteField("userUserInfo82", None), - ByteField("userUserInfo83", None), - ByteField("userUserInfo84", None), - ByteField("userUserInfo85", None), - ByteField("userUserInfo86", None), - ByteField("userUserInfo87", None), - ByteField("userUserInfo88", None), - ByteField("userUserInfo89", None), - ByteField("userUserInfo90", None), - ByteField("userUserInfo91", None), - ByteField("userUserInfo92", None), - ByteField("userUserInfo93", None), - ByteField("userUserInfo94", None), - ByteField("userUserInfo95", None), - ByteField("userUserInfo96", None), - ByteField("userUserInfo97", None), - ByteField("userUserInfo98", None), - ByteField("userUserInfo99", None), - ByteField("userUserInfo100", None), - ByteField("userUserInfo101", None), - ByteField("userUserInfo102", None), - ByteField("userUserInfo103", None), - ByteField("userUserInfo104", None), - ByteField("userUserInfo105", None), - ByteField("userUserInfo106", None), - ByteField("userUserInfo107", None), - ByteField("userUserInfo108", None), - ByteField("userUserInfo109", None), - ByteField("userUserInfo110", None), - ByteField("userUserInfo111", None), - ByteField("userUserInfo112", None), - ByteField("userUserInfo113", None), - ByteField("userUserInfo114", None), - ByteField("userUserInfo115", None), - ByteField("userUserInfo116", None), - ByteField("userUserInfo117", None), - ByteField("userUserInfo118", None), - ByteField("userUserInfo119", None), - ByteField("userUserInfo120", None), - ByteField("userUserInfo121", None), - ByteField("userUserInfo122", None), - ByteField("userUserInfo123", None), - ByteField("userUserInfo124", None), - ByteField("userUserInfo125", None), - ByteField("userUserInfo126", None), - ByteField("userUserInfo127", None), - ByteField("userUserInfo128", None), - ByteField("userUserInfo129", None), - ByteField("userUserInfo130", None), - ByteField("userUserInfo131", None) - ] - - def post_build(self, p, pay): - aList = [] - a = [] - i = 0 - for i in range(0, len(self.fields_desc)): - aList.append(self.fields_desc[i].name) - for i in aList: - a.append(getattr(self, i)) - res = adapt(3, 131, a, self.fields_desc) - if self.lengthUU is None: - p = p[:1] + struct.pack(">B", res[1]) + p[2:] - if res[0] is not 0: - p = p[:-res[0]] - return p + pay - - -class AlertingPatternHdr(Packet): - """Alerting Pattern 10.5.4.26""" - name = "Alerting Pattern" - fields_desc = [ - BitField("eightBitAP", None, 1), - XBitField("ieiAP", None, 7), - XByteField("lengthAP", 0x3), - BitField("spare", 0x0, 4), - BitField("alertingValue", 0x0, 4) - ] - - -class AllowedActionsHdr(Packet): - """Allowed actions $(CCBS)$ Section 10.5.4.26""" - name = "Allowed Actions $(CCBS)$" - fields_desc = [ - BitField("eightBitAA", None, 1), - XBitField("ieiAA", None, 7), - XByteField("lengthAP", 0x3), - BitField("CCBS", 0x0, 1), - BitField("spare", 0x0, 7) - ] - - -# -# 10.5.5 GPRS mobility management information elements -# - -class AttachResult(Packet): - """Attach result Section 10.5.5.1""" - name = "Attach Result" - fields_desc = [ - XBitField("ieiAR", 0x0, 4), - BitField("spare", 0x0, 1), - BitField("result", 0x1, 3) - ] - - -class AttachTypeHdr(Packet): - """Attach type Section 10.5.5.2""" - name = "Attach Type" - fields_desc = [ - XBitField("ieiAT", None, 4), - BitField("spare", 0x0, 1), - BitField("type", 0x1, 3) - ] - - -# Fix 1/2 len problem -class AttachTypeAndCiphKeySeqNr(Packet): - name = "Attach Type and Cipher Key Sequence Number" - fields_desc = [ - BitField("spare", 0x0, 1), - BitField("type", 0x1, 3), - BitField("spareHalfOctets", 0x0, 4) - ] - - -class CipheringAlgorithm(Packet): - """Ciphering algorithm Section 10.5.5.3""" - name = "Ciphering Algorithm" - fields_desc = [ - XBitField("ieiCA", 0x0, 4), - BitField("spare", 0x0, 1), - BitField("type", 0x1, 3) - ] - - -# Fix 1/2 len problem -class CipheringAlgorithmAndImeisvRequest(Packet): - name = "Ciphering Algorithm and Imeisv Request" - fields_desc = [ - BitField("spare", 0x0, 1), - BitField("type", 0x1, 3), - BitField("spare", 0x0, 1), - BitField("imeisvVal", 0x0, 3) - ] - - -# [Spare] -class TmsiStatus(Packet): - """[Spare] TMSI status Section 10.5.5.4""" - name = "[Spare] TMSI Status" - fields_desc = [ - XBitField("ieiTS", None, 4), - BitField("spare", 0x0, 3), - BitField("flag", 0x1, 1) - ] - - -class DetachType(Packet): - """Detach type Section 10.5.5.5""" - name = "Detach Type" - fields_desc = [ - XBitField("ieiDT", 0x0, 4), - BitField("poweroff", 0x0, 1), - BitField("type", 0x1, 3) - ] - - -# Fix 1/2 len problem -class DetachTypeAndForceToStandby(Packet): - name = "Detach Type and Force To Standby" - fields_desc = [ - BitField("poweroff", 0x0, 1), - BitField("type", 0x1, 3), - BitField("spare", 0x0, 1), - BitField("forceStandby", 0x0, 3) - ] - - -# Fix 1/2 len problem -class DetachTypeAndSpareHalfOctets(Packet): - name = "Detach Type and Spare Half Octets" - fields_desc = [ - BitField("poweroff", 0x0, 1), - BitField("type", 0x1, 3), - BitField("spareHalfOctets", 0x0, 4) - ] - - -class DrxParameter(Packet): - """DRX parameter Section 10.5.5.6""" - name = "DRX Parameter" - fields_desc = [ - ByteField("ieiDP", 0x0), - ByteField("splitPG", 0x0), - BitField("spare", 0x0, 4), - BitField("splitCCCH", 0x0, 1), - BitField("NonDrxTimer", 0x1, 3) - ] - - -class ForceToStandby(Packet): - """Force to standby Section 10.5.5.7""" - name = "Force To Standby" - fields_desc = [ - XBitField("ieiFTS", 0x0, 4), - BitField("spare", 0x0, 1), - BitField("forceStandby", 0x0, 3) - ] - - -# Fix 1/2 len problem -class ForceToStandbyAndAcReferenceNumber(Packet): - name = "Force To Standby And Ac Reference Number" - fields_desc = [ - BitField("spare", 0x0, 1), - BitField("forceStandby", 0x0, 3), - BitField("acRefVal", 0x0, 4) - ] - - -# Fix 1/2 len problem -class ForceToStandbyAndUpdateResult(Packet): - name = "Force To Standby And Update Result" - fields_desc = [ - BitField("spare", 0x0, 1), - BitField("forceStandby", 0x0, 3), - BitField("spare", 0x0, 1), - BitField("updateResVal", 0x0, 3) - ] - - -# Fix 1/2 len problem -class ForceToStandbyAndSpareHalfOctets(Packet): - name = "Force To Standby And Spare Half Octets" - fields_desc = [ - BitField("spare", 0x0, 1), - BitField("forceStandby", 0x0, 3), - BitField("spareHalfOctets", 0x0, 4) - ] - - -class PTmsiSignature(Packet): - """P-TMSI signature Section 10.5.5.8""" - name = "P-TMSI Signature" - fields_desc = [ - ByteField("ieiPTS", 0x0), - BitField("sgnature", 0x0, 24) - ] - - -class IdentityType2(Packet): - """Identity type 2 Section 10.5.5.9""" - name = "Identity Type 2" - fields_desc = [ - XBitField("ieiIT2", 0x0, 4), - BitField("spare", 0x0, 1), - BitField("typeOfIdentity", 0x0, 3) - ] - - -# Fix 1/2 len problem -class IdentityType2AndforceToStandby(Packet): - name = "Identity Type 2 and Force to Standby" - fields_desc = [ - BitField("spare", 0x0, 1), - BitField("typeOfIdentity", 0x0, 3), - BitField("spare", 0x0, 1), - BitField("forceStandby", 0x0, 3) - ] - - -class ImeisvRequest(Packet): - """IMEISV request Section 10.5.5.10""" - name = "IMEISV Request" - fields_desc = [ - XBitField("ieiIR", 0x0, 4), - BitField("spare", 0x0, 1), - BitField("imeisvVal", 0x0, 3) - ] - - -# Fix 1/2 len problem -class ImeisvRequestAndForceToStandby(Packet): - name = "IMEISV Request and Force To Standby" - fields_desc = [ - BitField("spare", 0x0, 1), - BitField("imeisvVal", 0x0, 3), - BitField("spareHalfOctets", 0x0, 4) - ] - - -# length 4 to 19 -class ReceiveNpduNumbersList(Packet): - """Receive N-PDU Numbers list Section 10.5.5.11""" - name = "Receive N-PDU Numbers list" - fields_desc = [ - ByteField("ieiRNNL", 0x0), - - XByteField("lengthRNNL", None), - - BitField("nbList0", 0x0, 16), - # optional - ByteField("nbList1", None), - ByteField("nbList2", None), - ByteField("nbList3", None), - ByteField("nbList4", None), - ByteField("nbList5", None), - ByteField("nbList6", None), - ByteField("nbList7", None), - ByteField("nbList8", None), - ByteField("nbList9", None), - ByteField("nbList10", None), - ByteField("nbList11", None), - ByteField("nbList12", None), - ByteField("nbList13", None), - ByteField("nbList14", None), - ByteField("nbList15", None), - ] - - def post_build(self, p, pay): - aList = [] - a = [] - i = 0 - for i in range(0, len(self.fields_desc)): - aList.append(self.fields_desc[i].name) - for i in aList: - a.append(getattr(self, i)) - res = adapt(4, 19, a, self.fields_desc) - if self.lengthRNNL is None: - p = p[:1] + struct.pack(">B", res[1]) + p[2:] - if res[0] is not 0: - p = p[:-res[0]] - return p + pay - - -class MsNetworkCapability(Packet): - """MS network capability Section 10.5.5.12""" - name = "MS Network Capability" - fields_desc = [ - ByteField("ieiMNC", 0x0), - XByteField("lengthMNC", 0x3), - ByteField("msNetValue", 0x0) - ] - - -# length 6 to 14 -class MsRadioAccessCapability(Packet): - """MS Radio Access capability Section 10.5.5.12a""" - name = "MS Radio Access Capability" - fields_desc = [ - ByteField("ieiMRAC", 0x24), - - XByteField("lengthMRAC", None), - - BitField("spare1", 0x0, 1), # ... - - BitField("accessCap", 0x0, 4), - BitField("accessTechType", 0x0, 4), - # access capability - BitField("bool", 0x0, 1), - BitField("lengthContent", 0x0, 7), - BitField("spare1", 0x0, 1), # ... - # content - BitField("pwrCap", 0x0, 3), - BitField("bool1", 0x0, 1), - BitField("a51", 0x0, 1), - BitField("a52", 0x0, 1), - BitField("a53", 0x0, 1), - BitField("a54", 0x0, 1), - - BitField("a55", 0x0, 1), - BitField("a56", 0x0, 1), - BitField("a57", 0x0, 1), - BitField("esInd", 0x0, 1), - BitField("ps", 0x0, 1), - BitField("vgcs", 0x0, 1), - BitField("vbs", 0x0, 1), - BitField("bool2", 0x0, 1), - # multislot - BitField("bool3", 0x0, 1), - BitField("hscsd", 0x0, 5), - - BitField("bool4", 0x0, 1), - BitField("gprs", 0x0, 5), - BitField("gprsExt", 0x0, 1), - BitField("bool5", 0x0, 1), - - BitField("smsVal", 0x0, 4), - BitField("smVal", 0x0, 4) - ] - - -# 10.5.5.13 Spare -# This is intentionally left spare. - -class GmmCause(Packet): - """GMM cause Section 10.5.5.14""" - name = "GMM Cause" - fields_desc = [ - ByteField("ieiGC", 0x0), - ByteField("causeValue", 0x0) - ] - - -class RoutingAreaIdentification(Packet): - """Routing area identification Section 10.5.5.15""" - name = "Routing Area Identification" - fields_desc = [ - ByteField("ieiRAI", 0x0), - BitField("mccDigit2", 0x0, 4), - BitField("mccDigit1", 0x0, 4), - BitField("mncDigit3", 0x0, 4), - BitField("mccDigit3", 0x0, 4), - BitField("mccDigit2", 0x0, 4), - BitField("mccDigit1", 0x0, 4), - ByteField("LAC", 0x0), - ByteField("LAC1", 0x0), - ByteField("LAC", 0x0) - ] -# 10.5.5.16 Spare -# This is intentionally left spare. - - -class UpdateResult(Packet): - """Update result Section 10.5.5.17""" - name = "Update Result" - fields_desc = [ - XBitField("ieiUR", 0x0, 4), - BitField("spare", 0x0, 1), - BitField("updateResVal", 0x0, 3) - ] - - -class UpdateType(Packet): - """Update type Section 10.5.5.18""" - name = "Update Type" - fields_desc = [ - XBitField("ieiUT", 0x0, 4), - BitField("spare", 0x0, 1), - BitField("updateTypeVal", 0x0, 3) - ] - - -# Fix 1/2 len problem -class UpdateTypeAndCiphKeySeqNr(Packet): - name = "Update Type and Cipher Key Sequence Number" - fields_desc = [ - BitField("spare", 0x0, 1), - BitField("updateTypeVal", 0x0, 3), - BitField("spare", 0x0, 1), - BitField("keySeq", 0x0, 3) - ] - - -class AcReferenceNumber(Packet): - """A&C reference number Section 10.5.5.19""" - name = "A&C Reference Number" - fields_desc = [ - XBitField("ieiARN", 0x0, 4), - BitField("acRefVal", 0x0, 4) - ] - - -# Fix 1/2 len problem -class AcReferenceNumberAndSpareHalfOctets(Packet): - name = "A&C Reference Number and Spare Half Octets" - fields_desc = [ - BitField("acRefVal", 0x0, 4), - BitField("spareHalfOctets", 0x0, 4) - ] -# -# 10.5.6 Session management information elements -# -# length 3 to 102 - - -class AccessPointName(Packet): - """Access Point Name Section 10.5.6.1""" - name = "Access Point Name" - fields_desc = [ - ByteField("ieiAPN", 0x0), - XByteField("lengthAPN", None), - ByteField("apName", 0x0), - # optional - ByteField("apName1", None), - ByteField("apName2", None), - ByteField("apName3", None), - ByteField("apName4", None), - ByteField("apName5", None), - ByteField("apName6", None), - ByteField("apName7", None), - ByteField("apName8", None), - ByteField("apName9", None), - ByteField("apName10", None), - ByteField("apName11", None), - ByteField("apName12", None), - ByteField("apName13", None), - ByteField("apName14", None), - ByteField("apName15", None), - ByteField("apName16", None), - ByteField("apName17", None), - ByteField("apName18", None), - ByteField("apName19", None), - ByteField("apName20", None), - ByteField("apName21", None), - ByteField("apName22", None), - ByteField("apName23", None), - ByteField("apName24", None), - ByteField("apName25", None), - ByteField("apName26", None), - ByteField("apName27", None), - ByteField("apName28", None), - ByteField("apName29", None), - ByteField("apName30", None), - ByteField("apName31", None), - ByteField("apName32", None), - ByteField("apName33", None), - ByteField("apName34", None), - ByteField("apName35", None), - ByteField("apName36", None), - ByteField("apName37", None), - ByteField("apName38", None), - ByteField("apName39", None), - ByteField("apName40", None), - ByteField("apName41", None), - ByteField("apName42", None), - ByteField("apName43", None), - ByteField("apName44", None), - ByteField("apName45", None), - ByteField("apName46", None), - ByteField("apName47", None), - ByteField("apName48", None), - ByteField("apName49", None), - ByteField("apName50", None), - ByteField("apName51", None), - ByteField("apName52", None), - ByteField("apName53", None), - ByteField("apName54", None), - ByteField("apName55", None), - ByteField("apName56", None), - ByteField("apName57", None), - ByteField("apName58", None), - ByteField("apName59", None), - ByteField("apName60", None), - ByteField("apName61", None), - ByteField("apName62", None), - ByteField("apName63", None), - ByteField("apName64", None), - ByteField("apName65", None), - ByteField("apName66", None), - ByteField("apName67", None), - ByteField("apName68", None), - ByteField("apName69", None), - ByteField("apName70", None), - ByteField("apName71", None), - ByteField("apName72", None), - ByteField("apName73", None), - ByteField("apName74", None), - ByteField("apName75", None), - ByteField("apName76", None), - ByteField("apName77", None), - ByteField("apName78", None), - ByteField("apName79", None), - ByteField("apName80", None), - ByteField("apName81", None), - ByteField("apName82", None), - ByteField("apName83", None), - ByteField("apName84", None), - ByteField("apName85", None), - ByteField("apName86", None), - ByteField("apName87", None), - ByteField("apName88", None), - ByteField("apName89", None), - ByteField("apName90", None), - ByteField("apName91", None), - ByteField("apName92", None), - ByteField("apName93", None), - ByteField("apName94", None), - ByteField("apName95", None), - ByteField("apName96", None), - ByteField("apName97", None), - ByteField("apName98", None), - ByteField("apName99", None) - ] - - def post_build(self, p, pay): - aList = [] - a = [] - i = 0 - for i in range(0, len(self.fields_desc)): - aList.append(self.fields_desc[i].name) - for i in aList: - a.append(getattr(self, i)) - res = adapt(3, 102, a, self.fields_desc) - if self.lengthAPN is None: - p = p[:1] + struct.pack(">B", res[1]) + p[2:] - if res[0] is not 0: - p = p[:-res[0]] - return p + pay - - -class NetworkServiceAccessPointIdentifier(Packet): - """Network service access point identifier Section 10.5.6.2""" - name = "Network Service Access Point Identifier" - fields_desc = [ - ByteField("ieiNSAPI", 0x0), - BitField("spare", 0x0, 4), - BitField("nsapiVal", 0x0, 4) - ] - - -# length 2 to 253 -class ProtocolConfigurationOptions(Packet): - """Protocol configuration options Section 10.5.6.3""" - name = "Protocol Configuration Options" - fields_desc = [ - ByteField("ieiPCO", 0x0), - - XByteField("lengthPCO", None), - # optional - BitField("ext", None, 1), - BitField("spare", None, 4), - BitField("configProto", None, 3), - - ByteField("protoId1", None), - ByteField("lenProto1", None), - ByteField("proto1Content", None), - - ByteField("protoId2", None), - ByteField("lenProto2", None), - ByteField("proto2Content", None), - - ByteField("protoId3", None), - ByteField("lenProto3", None), - ByteField("proto3Content", None), - - ByteField("protoId4", None), - ByteField("lenProto4", None), - ByteField("proto4Content", None), - - - ByteField("protoId5", None), - ByteField("lenProto5", None), - ByteField("proto5Content", None), - - ByteField("protoId6", None), - ByteField("lenProto6", None), - ByteField("proto6Content", None), - - ByteField("protoId7", None), - ByteField("lenProto7", None), - ByteField("proto7Content", None), - - ByteField("protoId8", None), - ByteField("lenProto8", None), - ByteField("proto8Content", None), - - ByteField("protoId9", None), - ByteField("lenProto9", None), - ByteField("proto9Content", None), - - ByteField("protoId10", None), - ByteField("lenProto10", None), - ByteField("proto10Content", None), - - ByteField("protoId11", None), - ByteField("lenProto11", None), - ByteField("proto11Content", None), - - ByteField("protoId12", None), - ByteField("lenProto12", None), - ByteField("proto12Content", None), - - ByteField("protoId13", None), - ByteField("lenProto13", None), - ByteField("proto13Content", None), - - ByteField("protoId14", None), - ByteField("lenProto14", None), - ByteField("proto14Content", None), - - ByteField("protoId15", None), - ByteField("lenProto15", None), - ByteField("proto15Content", None), - - ByteField("protoId16", None), - ByteField("lenProto16", None), - ByteField("proto16Content", None), - - ByteField("protoId17", None), - ByteField("lenProto17", None), - ByteField("proto17Content", None), - - ByteField("protoId18", None), - ByteField("lenProto18", None), - ByteField("proto18Content", None), - - ByteField("protoId19", None), - ByteField("lenProto19", None), - ByteField("proto19Content", None), - - ByteField("protoId20", None), - ByteField("lenProto20", None), - ByteField("proto20Content", None), - - ByteField("protoId21", None), - ByteField("lenProto21", None), - ByteField("proto21Content", None), - - ByteField("protoId22", None), - ByteField("lenProto22", None), - ByteField("proto22Content", None), - - ByteField("protoId23", None), - ByteField("lenProto23", None), - ByteField("proto23Content", None), - - ByteField("protoId24", None), - ByteField("lenProto24", None), - ByteField("proto24Content", None), - - ByteField("protoId25", None), - ByteField("lenProto25", None), - ByteField("proto25Content", None), - - ByteField("protoId26", None), - ByteField("lenProto26", None), - ByteField("proto26Content", None), - - ByteField("protoId27", None), - ByteField("lenProto27", None), - ByteField("proto27Content", None), - - ByteField("protoId28", None), - ByteField("lenProto28", None), - ByteField("proto28Content", None), - - ByteField("protoId29", None), - ByteField("lenProto29", None), - ByteField("proto29Content", None), - - ByteField("protoId30", None), - ByteField("lenProto30", None), - ByteField("proto30Content", None), - - ByteField("protoId31", None), - ByteField("lenProto31", None), - ByteField("proto31Content", None), - - ByteField("protoId32", None), - ByteField("lenProto32", None), - ByteField("proto32Content", None), - - ByteField("protoId33", None), - ByteField("lenProto33", None), - ByteField("proto33Content", None), - - ByteField("protoId34", None), - ByteField("lenProto34", None), - ByteField("proto34Content", None), - - ByteField("protoId35", None), - ByteField("lenProto35", None), - ByteField("proto35Content", None), - - ByteField("protoId36", None), - ByteField("lenProto36", None), - ByteField("proto36Content", None), - - ByteField("protoId37", None), - ByteField("lenProto37", None), - ByteField("proto37Content", None), - - ByteField("protoId38", None), - ByteField("lenProto38", None), - ByteField("proto38Content", None), - - ByteField("protoId39", None), - ByteField("lenProto39", None), - ByteField("proto39Content", None), - - ByteField("protoId40", None), - ByteField("lenProto40", None), - ByteField("proto40Content", None), - - ByteField("protoId41", None), - ByteField("lenProto41", None), - ByteField("proto41Content", None), - - ByteField("protoId42", None), - ByteField("lenProto42", None), - ByteField("proto42Content", None), - - ByteField("protoId43", None), - ByteField("lenProto43", None), - ByteField("proto43Content", None), - - ByteField("protoId44", None), - ByteField("lenProto44", None), - ByteField("proto44Content", None), - - ByteField("protoId45", None), - ByteField("lenProto45", None), - ByteField("proto45Content", None), - - ByteField("protoId46", None), - ByteField("lenProto46", None), - ByteField("proto46Content", None), - - ByteField("protoId47", None), - ByteField("lenProto47", None), - ByteField("proto47Content", None), - - ByteField("protoId48", None), - ByteField("lenProto48", None), - ByteField("proto48Content", None), - - ByteField("protoId49", None), - ByteField("lenProto49", None), - ByteField("proto49Content", None), - - ByteField("protoId50", None), - ByteField("lenProto50", None), - ByteField("proto50Content", None), - - ByteField("protoId51", None), - ByteField("lenProto51", None), - ByteField("proto51Content", None), - - ByteField("protoId52", None), - ByteField("lenProto52", None), - ByteField("proto52Content", None), - - ByteField("protoId53", None), - ByteField("lenProto53", None), - ByteField("proto53Content", None), - - ByteField("protoId54", None), - ByteField("lenProto54", None), - ByteField("proto54Content", None), - - ByteField("protoId55", None), - ByteField("lenProto55", None), - ByteField("proto55Content", None), - - ByteField("protoId56", None), - ByteField("lenProto56", None), - ByteField("proto56Content", None), - - ByteField("protoId57", None), - ByteField("lenProto57", None), - ByteField("proto57Content", None), - - ByteField("protoId58", None), - ByteField("lenProto58", None), - ByteField("proto58Content", None), - - ByteField("protoId59", None), - ByteField("lenProto59", None), - ByteField("proto59Content", None), - - ByteField("protoId60", None), - ByteField("lenProto60", None), - ByteField("proto60Content", None), - - ByteField("protoId61", None), - ByteField("lenProto61", None), - ByteField("proto61Content", None), - - ByteField("protoId62", None), - ByteField("lenProto62", None), - ByteField("proto62Content", None), - - ByteField("protoId63", None), - ByteField("lenProto63", None), - ByteField("proto63Content", None), - - ByteField("protoId64", None), - ByteField("lenProto64", None), - ByteField("proto64Content", None), - - ByteField("protoId65", None), - ByteField("lenProto65", None), - ByteField("proto65Content", None), - - ByteField("protoId66", None), - ByteField("lenProto66", None), - ByteField("proto66Content", None), - - ByteField("protoId67", None), - ByteField("lenProto67", None), - ByteField("proto67Content", None), - - ByteField("protoId68", None), - ByteField("lenProto68", None), - ByteField("proto68Content", None), - - ByteField("protoId69", None), - ByteField("lenProto69", None), - ByteField("proto69Content", None), - - ByteField("protoId70", None), - ByteField("lenProto70", None), - ByteField("proto70Content", None), - - ByteField("protoId71", None), - ByteField("lenProto71", None), - ByteField("proto71Content", None), - - ByteField("protoId72", None), - ByteField("lenProto72", None), - ByteField("proto72Content", None), - - ByteField("protoId73", None), - ByteField("lenProto73", None), - ByteField("proto73Content", None), - - ByteField("protoId74", None), - ByteField("lenProto74", None), - ByteField("proto74Content", None), - - ByteField("protoId75", None), - ByteField("lenProto75", None), - ByteField("proto75Content", None), - - ByteField("protoId76", None), - ByteField("lenProto76", None), - ByteField("proto76Content", None), - - ByteField("protoId77", None), - ByteField("lenProto77", None), - ByteField("proto77Content", None), - - ByteField("protoId78", None), - ByteField("lenProto78", None), - ByteField("proto78Content", None), - - ByteField("protoId79", None), - ByteField("lenProto79", None), - ByteField("proto79Content", None), - - ByteField("protoId80", None), - ByteField("lenProto80", None), - ByteField("proto80Content", None), - - ByteField("protoId81", None), - ByteField("lenProto81", None), - ByteField("proto81Content", None), - - ByteField("protoId82", None), - ByteField("lenProto82", None), - ByteField("proto82Content", None), - - ByteField("protoId83", None), - ByteField("lenProto83", None), - ByteField("proto83Content", None), - ] - - def post_build(self, p, pay): - aList = [] - a = [] - i = 0 - for i in range(0, len(self.fields_desc)): - aList.append(self.fields_desc[i].name) - for i in aList: - a.append(getattr(self, i)) - res = adapt(2, 253, a, self.fields_desc) - if self.lengthPCO is None: - p = p[:1] + struct.pack(">B", res[1]) + p[2:] - if res[0] is not 0: - p = p[:-res[0]] - return p + pay - - -# len 4 to 20 -class PacketDataProtocolAddress(Packet): - """Packet data protocol address Section 10.5.6.4""" - name = "Packet Data Protocol Address" - fields_desc = [ - ByteField("ieiPDPA", 0x0), - - XByteField("lengthPDPA", None), - - BitField("spare", 0x0, 4), - BitField("pdpTypeOrga", 0x0, 4), - - ByteField("pdpTypeNb", 0x0), - # optional - ByteField("addressInfo1", None), - ByteField("addressInfo2", None), - ByteField("addressInfo3", None), - ByteField("addressInfo4", None), - ByteField("addressInfo5", None), - ByteField("addressInfo6", None), - ByteField("addressInfo7", None), - ByteField("addressInfo8", None), - ByteField("addressInfo9", None), - ByteField("addressInfo10", None), - ByteField("addressInfo11", None), - ByteField("addressInfo12", None), - ByteField("addressInfo13", None), - ByteField("addressInfo14", None), - ByteField("addressInfo15", None), - ByteField("addressInfo16", None) - ] - - def post_build(self, p, pay): - aList = [] - a = [] - i = 0 - for i in range(0, len(self.fields_desc)): - aList.append(self.fields_desc[i].name) - for i in aList: - a.append(getattr(self, i)) - res = adapt(4, 20, a, self.fields_desc) - if self.lengthPDPA is None: - p = p[:1] + struct.pack(">B", res[1]) + p[2:] - if res[0] is not 0: - p = p[:-res[0]] - return p + pay - - -class QualityOfService(Packet): - """Quality of service Section 10.5.6.5""" - name = "Quality of Service" - fields_desc = [ - ByteField("ieiQOS", 0x0), - XByteField("lengthQOS", 0x5), - - BitField("spare", 0x0, 2), - BitField("delayClass", 0x0, 3), - BitField("reliaClass", 0x0, 3), - - BitField("peak", 0x0, 4), - BitField("spare", 0x0, 1), - BitField("precedenceCl", 0x0, 3), - - BitField("spare", 0x0, 3), - BitField("mean", 0x0, 5) - ] - - -class SmCause(Packet): - """SM cause Section 10.5.6.6""" - name = "SM Cause" - fields_desc = [ - ByteField("ieiSC", 0x0), - ByteField("causeVal", 0x0) - ] - -# 10.5.6.7 Spare -# This is intentionally left spare. - - -class AaDeactivationCause(Packet): - """AA deactivation cause Section 10.5.6.8""" - name = "AA Deactivation Cause" - fields_desc = [ - XBitField("ieiADC", 0x0, 4), - BitField("spare", 0x0, 1), - BitField("aaVal", 0x0, 3) - ] - - -# Fix 1/2 len problem -class AaDeactivationCauseAndSpareHalfOctets(Packet): - name = "AA Deactivation Cause and Spare Half Octets" - fields_desc = [ - BitField("spare", 0x0, 1), - BitField("aaVal", 0x0, 3), - BitField("spareHalfOctets", 0x0, 4) - ] - - -class LlcServiceAccessPointIdentifier(Packet): - """LLC service access point identifier Section 10.5.6.9""" - name = "LLC Service Access Point Identifier" - fields_desc = [ - ByteField("ieiLSAPI", None), - BitField("spare", 0x0, 4), - BitField("llcVal", 0x0, 4) - ] - - -# -# 10.5.7 GPRS Common information elements -# - -# 10.5.7.1 [Spare] - -class RadioPriority(Packet): - """Radio priority Section 10.5.7.2""" - name = "Radio Priority" - fields_desc = [ - XBitField("ieiRP", 0x0, 4), - BitField("spare", 0x1, 1), - BitField("rplv", 0x0, 3) - ] - - -# Fix 1/2 len problem -class RadioPriorityAndSpareHalfOctets(Packet): - name = "Radio Priority and Spare Half Octets" - fields_desc = [ - BitField("spare", 0x1, 1), - BitField("rplv", 0x0, 3), - BitField("spareHalfOctets", 0x0, 4) - ] - - -class GprsTimer(Packet): - """GPRS Timer Section 10.5.7.3""" - name = "GPRS Timer" - fields_desc = [ - ByteField("ieiGT", 0x0), - BitField("unit", 0x0, 3), - BitField("timerVal", 0x0, 5) - ] - - -class CellIdentity(Packet): - """ Cell identity Section 10.5.1.1 """ - name = "Cell Identity" - fields_desc = [ - ByteField("ciValue1", 0x0), - ByteField("ciValue2", 0x0) - ] - - -class CiphKeySeqNr(Packet): - """ Ciphering Key Sequence Number Section 10.5.1.2 """ - name = "Cipher Key Sequence Number" - fields_desc = [ - BitField("spare", 0x0, 1), - BitField("keySeq", 0x0, 3) - ] - - -class LocalAreaId(Packet): - """ Local Area Identification Section 10.5.1.3 """ - name = "Location Area Identification" - fields_desc = [ - BitField("mccDigit2", 0x0, 4), - BitField("mccDigit1", 0x0, 4), - BitField("mncDigit3", 0x0, 4), - BitField("mccDigit3", 0x0, 4), - BitField("mncDigit2", 0x0, 4), - BitField("mncDigit1", 0x0, 4), - ByteField("lac1", 0x0), - ByteField("lac2", 0x0) - ] -# -# The Mobile Identity is a type 4 information element with a minimum -# length of 3 octet and 11 octets length maximal. -# - - -# len 3 - 11 -class MobileId(Packet): - """ Mobile Identity Section 10.5.1.4 """ - name = "Mobile Identity" - fields_desc = [ - XByteField("lengthMI", None), - BitField("idDigit1", 0x0, 4), - BitField("oddEven", 0x0, 1), - BitField("typeOfId", 0x0, 3), - - BitField("idDigit2_1", None, 4), # optional - BitField("idDigit2", None, 4), - BitField("idDigit3_1", None, 4), - BitField("idDigit3", None, 4), - BitField("idDigit4_1", None, 4), - BitField("idDigit4", None, 4), - BitField("idDigit5_1", None, 4), - BitField("idDigit5", None, 4), - BitField("idDigit6_1", None, 4), - BitField("idDigit6", None, 4), - BitField("idDigit7_1", None, 4), - BitField("idDigit7", None, 4), - BitField("idDigit8_1", None, 4), - BitField("idDigit8", None, 4), - BitField("idDigit9_1", None, 4), - BitField("idDigit9", None, 4), - ] - - def post_build(self, p, pay): - aList = [] - a = [] - i = 0 - for i in range(0, len(self.fields_desc)): - aList.append(self.fields_desc[i].name) - for i in aList: - a.append(getattr(self, i)) - res = adapt(2, 10, a, self.fields_desc, 1) - if self.lengthMI is None: - p = struct.pack(">B", res[1]) + p[1:] - if res[0] is not 0: - p = p[:-res[0]] - return p + pay - - -class MobileStationClassmark1(Packet): - """ Mobile Station Classmark 1 Section 10.5.1.5 """ - name = "Mobile Station Classmark 1" - fields_desc = [ - BitField("spare", 0x0, 1), - BitField("revisionLvl", 0x0, 2), - BitField("esInd", 0x0, 1), - BitField("a51", 0x0, 1), - BitField("rfPowerCap", 0x0, 3) - ] - - -class MobileStationClassmark2(Packet): - """ Mobile Station Classmark 2 Section 10.5.1.6 """ - name = "Mobile Station Classmark 2" - fields_desc = [ - XByteField("lengthMSC2", 0x3), - BitField("spare", 0x0, 1), - BitField("revisionLvl", 0x0, 2), - BitField("esInd", 0x0, 1), - BitField("a51", 0x0, 1), - BitField("rfPowerCap", 0x0, 3), - BitField("spare1", 0x0, 1), - BitField("psCap", 0x0, 1), - BitField("ssScreenInd", 0x0, 2), - BitField("smCaPabi", 0x0, 1), - BitField("vbs", 0x0, 1), - BitField("vgcs", 0x0, 1), - BitField("fc", 0x0, 1), - BitField("cm3", 0x0, 1), - BitField("spare2", 0x0, 1), - BitField("lcsvaCap", 0x0, 1), - BitField("spare3", 0x0, 1), - BitField("soLsa", 0x0, 1), - BitField("cmsp", 0x0, 1), - BitField("a53", 0x0, 1), - BitField("a52", 0x0, 1) - ] - - -class DescriptiveGroupOrBroadcastCallReference(Packet): - """ Descriptive group or broadcast call reference Section 10.5.1.9 """ - name = "Descriptive Group or Broadcast Call Reference" - fields_desc = [ - BitField("binCallRef", 0x0, 27), - BitField("sf", 0x0, 1), - BitField("fa", 0x0, 1), - BitField("callPrio", 0x0, 3), - BitField("cipherInfo", 0x0, 4), - BitField("spare1", 0x0, 1), - BitField("spare2", 0x0, 1), - BitField("spare3", 0x0, 1), - BitField("spare4", 0x0, 1) - ] - - -class PdAndSapi(Packet): - """ PD and SAPI $(CCBS)$ Section 10.5.1.10a """ - name = "PD and SAPI $(CCBS)$" - fields_desc = [ - BitField("spare", 0x0, 1), - BitField("spare1", 0x0, 1), - BitField("sapi", 0x0, 2), - BitField("pd", 0x0, 4) - ] - - -class PriorityLevel(Packet): - """ Priority Level Section 10.5.1.11 """ - name = "Priority Level" - fields_desc = [ - BitField("spare", 0x0, 1), - BitField("callPrio", 0x0, 3) - ] - -# -# Radio Resource management information elements -# - - -# len 6 to max for L3 message (251) -class BaRange(Packet): - """ BA Range Section 10.5.2.1a """ - name = "BA Range" - fields_desc = [ - - XByteField("lengthBR", None), -#error: byte format requires -128 <= number <= 127 - ByteField("nrOfRanges", 0x0), -# # rX = range X -# # L o = Lower H i = higher -# # H p = high Part Lp = low Part - ByteField("r1LoHp", 0x0), - - BitField("r1LoLp", 0x0, 3), - BitField("r1HiHp", 0x0, 5), - - BitField("r1HiLp", 0x0, 4), - BitField("r2LoHp", 0x0, 4), - # optional - BitField("r2LoLp", None, 5), - BitField("r2HiHp", None, 3), - - ByteField("r2HiLp", None), - ByteField("r3LoHp", None), - - BitField("r3LoLp", None, 5), - BitField("r3HiHp", None, 3), - - ByteField("r3HiLp", None), - ByteField("r4LoHp", None), - - BitField("r4LoLp", None, 5), - BitField("r4HiHp", None, 3), - ByteField("r4HiLp", None), - ByteField("r5LoHp", None), - - BitField("r5LoLp", None, 5), - BitField("r5HiHp", None, 3), - ByteField("r5HiLp", None), - ByteField("r6LoHp", None), - - BitField("r6LoLp", None, 5), - BitField("r6HiHp", None, 3), - ByteField("r6HiLp", None), - ByteField("r7LoHp", None), - - BitField("r7LoLp", None, 5), - BitField("r7HiHp", None, 3), - ByteField("r7HiLp", None), - ByteField("r8LoHp", None), - - BitField("r8LoLp", None, 5), - BitField("r8HiHp", None, 3), - ByteField("r8HiLp", None), - ByteField("r9LoHp", None), - - BitField("r9LoLp", None, 5), - BitField("r9HiHp", None, 3), - ByteField("r9HiLp", None), - ByteField("r10LoHp", None), - - BitField("r10LoLp", None, 5), - BitField("r10HiHp", None, 3), - ByteField("r10HiLp", None), - ByteField("r11LoHp", None), - - BitField("r11LoLp", None, 5), - BitField("r11HiHp", None, 3), - ByteField("r11HiLp", None), - ByteField("r12LoHp", None), - - BitField("r12LoLp", None, 5), - BitField("r12HiHp", None, 3), - ByteField("r12HiLp", None), - ByteField("r13LoHp", None), - - BitField("r13LoLp", None, 5), - BitField("r13HiHp", None, 3), - ByteField("r13HiLp", None), - ByteField("r14LoHp", None), - - BitField("r14LoLp", None, 5), - BitField("r14HiHp", None, 3), - ByteField("r14HiLp", None), - ByteField("r15LoHp", None), - - BitField("r15LoLp", None, 5), - BitField("r15HiHp", None, 3), - ByteField("r15HiLp", None), - ByteField("r16LoHp", None), - - BitField("r16LoLp", None, 5), - BitField("r16HiHp", None, 3), - ByteField("r16HiLp", None), - ByteField("r17LoHp", None), - - BitField("r17LoLp", None, 5), - BitField("r17HiHp", None, 3), - ByteField("r17HiLp", None), - ByteField("r18LoHp", None), - - BitField("r18LoLp", None, 5), - BitField("r18HiHp", None, 3), - ByteField("r18HiLp", None), - ByteField("r19LoHp", None), - - BitField("r19LoLp", None, 5), - BitField("r19HiHp", None, 3), - ByteField("r19HiLp", None), - ByteField("r20LoHp", None), - - BitField("r20LoLp", None, 5), - BitField("r20HiHp", None, 3), - ByteField("r20HiLp", None), - ByteField("r21LoHp", None), - - BitField("r21LoLp", None, 5), - BitField("r21HiHp", None, 3), - ByteField("r21HiLp", None), - ByteField("r22LoHp", None), - - BitField("r22LoLp", None, 5), - BitField("r22HiHp", None, 3), - ByteField("r22HiLp", None), - ByteField("r23LoHp", None), - - BitField("r23LoLp", None, 5), - BitField("r23HiHp", None, 3), - ByteField("r23HiLp", None), - ByteField("r24LoHp", None), - - BitField("r24LoLp", None, 5), - BitField("r24HiHp", None, 3), - ByteField("r24HiLp", None), - ByteField("r25LoHp", None), - - BitField("r25LoLp", None, 5), - BitField("r25HiHp", None, 3), - ByteField("r25HiLp", None), - ByteField("r26LoHp", None), - - BitField("r26LoLp", None, 5), - BitField("r26HiHp", None, 3), - ByteField("r26HiLp", None), - ByteField("r27LoHp", None), - - BitField("r27LoLp", None, 5), - BitField("r27HiHp", None, 3), - ByteField("r27HiLp", None), - ByteField("r28LoHp", None), - - BitField("r28LoLp", None, 5), - BitField("r28HiHp", None, 3), - ByteField("r28HiLp", None), - ByteField("r29LoHp", None), - - BitField("r29LoLp", None, 5), - BitField("r29HiHp", None, 3), - ByteField("r29HiLp", None), - ByteField("r30LoHp", None), - - BitField("r30LoLp", None, 5), - BitField("r30HiHp", None, 3), - ByteField("r30HiLp", None), - ByteField("r31LoHp", None), - - BitField("r31LoLp", None, 5), - BitField("r31HiHp", None, 3), - ByteField("r31HiLp", None), - ByteField("r32LoHp", None), - - BitField("r32LoLp", None, 5), - BitField("r32HiHp", None, 3), - ByteField("r32HiLp", None), - ByteField("r33LoHp", None), - - BitField("r33LoLp", None, 5), - BitField("r33HiHp", None, 3), - ByteField("r33HiLp", None), - ByteField("r34LoHp", None), - - BitField("r34LoLp", None, 5), - BitField("r34HiHp", None, 3), - ByteField("r34HiLp", None), - ByteField("r35LoHp", None), - - BitField("r35LoLp", None, 5), - BitField("r35HiHp", None, 3), - ByteField("r35HiLp", None), - ByteField("r36LoHp", None), - - BitField("r36LoLp", None, 5), - BitField("r36HiHp", None, 3), - ByteField("r36HiLp", None), - ByteField("r37LoHp", None), - - BitField("r37LoLp", None, 5), - BitField("r37HiHp", None, 3), - ByteField("r37HiLp", None), - ByteField("r38LoHp", None), - - BitField("r38LoLp", None, 5), - BitField("r38HiHp", None, 3), - ByteField("r38HiLp", None), - ByteField("r39LoHp", None), - - BitField("r39LoLp", None, 5), - BitField("r39HiHp", None, 3), - ByteField("r39HiLp", None), - ByteField("r40LoHp", None), - - BitField("r40LoLp", None, 5), - BitField("r40HiHp", None, 3), - ByteField("r40HiLp", None), - ByteField("r41LoHp", None), - - BitField("r41LoLp", None, 5), - BitField("r41HiHp", None, 3), - ByteField("r41HiLp", None), - ByteField("r42LoHp", None), - - BitField("r42LoLp", None, 5), - BitField("r42HiHp", None, 3), - ByteField("r42HiLp", None), - ByteField("r43LoHp", None), - - BitField("r43LoLp", None, 5), - BitField("r43HiHp", None, 3), - ByteField("r43HiLp", None), - ByteField("r44LoHp", None), - - BitField("r44LoLp", None, 5), - BitField("r44HiHp", None, 3), - ByteField("r44HiLp", None), - ByteField("r45LoHp", None), - - BitField("r45LoLp", None, 5), - BitField("r45HiHp", None, 3), - ByteField("r45HiLp", None), - ByteField("r46LoHp", None), - - BitField("r46LoLp", None, 5), - BitField("r46HiHp", None, 3), - ByteField("r46HiLp", None), - ByteField("r47LoHp", None), - - BitField("r47LoLp", None, 5), - BitField("r47HiHp", None, 3), - ByteField("r47HiLp", None), - ByteField("r48LoHp", None), - - BitField("r48LoLp", None, 5), - BitField("r48HiHp", None, 3), - ByteField("r48HiLp", None), - ByteField("r49LoHp", None), - - BitField("r49LoLp", None, 5), - BitField("r49HiHp", None, 3), - ByteField("r49HiLp", None), - ByteField("r50LoHp", None), - - BitField("r50LoLp", None, 5), - BitField("r50HiHp", None, 3), - ByteField("r50HiLp", None), - ByteField("r51LoHp", None), - - BitField("r51LoLp", None, 5), - BitField("r51HiHp", None, 3), - ByteField("r51HiLp", None), - ByteField("r52LoHp", None), - - BitField("r52LoLp", None, 5), - BitField("r52HiHp", None, 3), - ByteField("r52HiLp", None), - ByteField("r53LoHp", None), - - BitField("r53LoLp", None, 5), - BitField("r53HiHp", None, 3), - ByteField("r53HiLp", None), - ByteField("r54LoHp", None), - - BitField("r54LoLp", None, 5), - BitField("r54HiHp", None, 3), - ByteField("r54HiLp", None), - ByteField("r55LoHp", None), - - BitField("r55LoLp", None, 5), - BitField("r55HiHp", None, 3), - ByteField("r55HiLp", None), - ByteField("r56LoHp", None), - - BitField("r56LoLp", None, 5), - BitField("r56HiHp", None, 3), - ByteField("r56HiLp", None), - ByteField("r57LoHp", None), - - BitField("r57LoLp", None, 5), - BitField("r57HiHp", None, 3), - ByteField("r57HiLp", None), - ByteField("r58LoHp", None), - - BitField("r58LoLp", None, 5), - BitField("r58HiHp", None, 3), - ByteField("r58HiLp", None), - ByteField("r59LoHp", None), - - BitField("r59LoLp", None, 5), - BitField("r59HiHp", None, 3), - ByteField("r59HiLp", None), - ByteField("r60LoHp", None), - - BitField("r60LoLp", None, 5), - BitField("r60HiHp", None, 3), - ByteField("r60HiLp", None), - ByteField("r61LoHp", None), - - BitField("r61LoLp", None, 5), - BitField("r61HiHp", None, 3), - ByteField("r61HiLp", None), - ByteField("r62LoHp", None), - - BitField("r62LoLp", None, 5), - BitField("r62HiHp", None, 3), - ByteField("r62HiLp", None), - ByteField("r63LoHp", None), - - BitField("r63LoLp", None, 5), - BitField("r63HiHp", None, 3), - ByteField("r63HiLp", None), - ByteField("r64LoHp", None), - - BitField("r64LoLp", None, 5), - BitField("r64HiHp", None, 3), - ByteField("r64HiLp", None), - ByteField("r65LoHp", None), - - BitField("r65LoLp", None, 5), - BitField("r65HiHp", None, 3), - ByteField("r65HiLp", None), - ByteField("r66LoHp", None), - - BitField("r66LoLp", None, 5), - BitField("r66HiHp", None, 3), - ByteField("r66HiLp", None), - ByteField("r67LoHp", None), - - BitField("r67LoLp", None, 5), - BitField("r67HiHp", None, 3), - ByteField("r67HiLp", None), - ByteField("r68LoHp", None), - - BitField("r68LoLp", None, 5), - BitField("r68HiHp", None, 3), - ByteField("r68HiLp", None), - ByteField("r69LoHp", None), - - BitField("r69LoLp", None, 5), - BitField("r69HiHp", None, 3), - ByteField("r69HiLp", None), - ByteField("r70LoHp", None), - - BitField("r70LoLp", None, 5), - BitField("r70HiHp", None, 3), - ByteField("r70HiLp", None), - ByteField("r71LoHp", None), - - BitField("r71LoLp", None, 5), - BitField("r71HiHp", None, 3), - ByteField("r71HiLp", None), - ByteField("r72LoHp", None), - - BitField("r72LoLp", None, 5), - BitField("r72HiHp", None, 3), - ByteField("r72HiLp", None), - ByteField("r73LoHp", None), - - BitField("r73LoLp", None, 5), - BitField("r73HiHp", None, 3), - ByteField("r73HiLp", None), - ByteField("r74LoHp", None), - - BitField("r74LoLp", None, 5), - BitField("r74HiHp", None, 3), - ByteField("r74HiLp", None), - ByteField("r75LoHp", None), - - BitField("r75LoLp", None, 5), - BitField("r75HiHp", None, 3), - ByteField("r75HiLp", None), - ByteField("r76LoHp", None), - - BitField("r76LoLp", None, 5), - BitField("r76HiHp", None, 3), - ByteField("r76HiLp", None), - ByteField("r77LoHp", None), - - BitField("r77LoLp", None, 5), - BitField("r77HiHp", None, 3), - ByteField("r77HiLp", None), - ByteField("r78LoHp", None), - - BitField("r78LoLp", None, 5), - BitField("r78HiHp", None, 3), - ByteField("r78HiLp", None), - ByteField("r79LoHp", None), - - BitField("r79LoLp", None, 5), - BitField("r79HiHp", None, 3), - ByteField("r79HiLp", None), - ByteField("r80LoHp", None), - - BitField("r80LoLp", None, 5), - BitField("r80HiHp", None, 3), - ByteField("r80HiLp", None), - ByteField("r81LoHp", None), - - BitField("r81LoLp", None, 5), - BitField("r81HiHp", None, 3), - ByteField("r81HiLp", None), - ByteField("r82LoHp", None), - - BitField("r82LoLp", None, 5), - BitField("r82HiHp", None, 3), - ByteField("r82HiLp", None), - ByteField("r83LoHp", None), - - BitField("r83LoLp", None, 5), - BitField("r83HiHp", None, 3), - ByteField("r83HiLp", None), - ByteField("r84LoHp", None), - - BitField("r84LoLp", None, 5), - BitField("r84HiHp", None, 3), - ByteField("r84HiLp", None) - ] - - def post_build(self, p, pay): - aList = [] - a = [] - i = 0 - for i in range(0, len(self.fields_desc)): - aList.append(self.fields_desc[i].name) - for i in aList: - a.append(getattr(self, i)) - res = adapt(5, 253, a, self.fields_desc, 1) - if self.lengthBR is None: - p = struct.pack(">B", res[1]) + p[1:] - if res[0] is not 0: - p = p[:-res[0]] - return p + pay - - -# len 3 to max for L3 message (251) -class BaListPref(Packet): - """ BA List Pref Section 10.5.2.1c """ - name = "BA List Pref" - fields_desc = [ - XByteField("lengthBLP", None), - - BitField("fixBit", 0x0, 1), - BitField("rangeLower", 0x0, 10), - BitField("fixBit2", 0x0, 1), - BitField("rangeUpper", 0x0, 10), - BitField("baFreq", 0x0, 10), - BitField("sparePad", 0x0, 8) - ] - - -# len 17 || Have a look at the specs for the field format -# Bit map 0 format -# Range 1024 format -# Range 512 format -# Range 256 format -# Range 128 format -# Variable bit map format -class CellChannelDescription(Packet): - """ Cell Channel Description Section 10.5.2.1b """ - name = "Cell Channel Description " - fields_desc = [ - BitField("bit128", 0x0, 1), - BitField("bit127", 0x0, 1), - BitField("spare1", 0x0, 1), - BitField("spare2", 0x0, 1), - BitField("bit124", 0x0, 1), - BitField("bit123", 0x0, 1), - BitField("bit122", 0x0, 1), - BitField("bit121", 0x0, 1), - ByteField("bit120", 0x0), - ByteField("bit112", 0x0), - ByteField("bit104", 0x0), - ByteField("bit96", 0x0), - ByteField("bit88", 0x0), - ByteField("bit80", 0x0), - ByteField("bit72", 0x0), - ByteField("bit64", 0x0), - ByteField("bit56", 0x0), - ByteField("bit48", 0x0), - ByteField("bit40", 0x0), - ByteField("bit32", 0x0), - ByteField("bit24", 0x0), - ByteField("bit16", 0x0), - ByteField("bit8", 0x0) - ] - - -class CellDescription(Packet): - """ Cell Description Section 10.5.2.2 """ - name = "Cell Description" - fields_desc = [ - BitField("bcchHigh", 0x0, 2), - BitField("ncc", 0x0, 3), - BitField("bcc", 0x0, 3), - ByteField("bcchLow", 0x0) - ] - - -class CellOptionsBCCH(Packet): - """ Cell Options (BCCH) Section 10.5.2.3 """ - name = "Cell Options (BCCH)" - fields_desc = [ - BitField("spare", 0x0, 1), - BitField("pwrc", 0x0, 1), - BitField("dtx", 0x0, 2), - BitField("rLinkTout", 0x0, 4) - ] - - -class CellOptionsSACCH(Packet): - """ Cell Options (SACCH) Section 10.5.2.3a """ - name = "Cell Options (SACCH)" - fields_desc = [ - BitField("dtx", 0x0, 1), - BitField("pwrc", 0x0, 1), - BitField("dtx", 0x0, 1), - BitField("rLinkTout", 0x0, 4) - ] - - -class CellSelectionParameters(Packet): - """ Cell Selection Parameters Section 10.5.2.4 """ - name = "Cell Selection Parameters" - fields_desc = [ - BitField("cellReselect", 0x0, 3), - BitField("msTxPwrMax", 0x0, 5), - BitField("acs", None, 1), - BitField("neci", None, 1), - BitField("rxlenAccMin", None, 6) - ] - - -class MacModeAndChannelCodingRequest(Packet): - """ MAC Mode and Channel Coding Requested Section 10.5.2.4a """ - name = "MAC Mode and Channel Coding Requested" - fields_desc = [ - BitField("macMode", 0x0, 2), - BitField("cs", 0x0, 2) - ] - - -class ChannelDescription(Packet): - """ Channel Description Section 10.5.2.5 """ - name = "Channel Description" - fields_desc = [ - - BitField("channelTyp", 0x0, 5), - BitField("tn", 0x0, 3), - - BitField("tsc", 0x0, 3), - BitField("h", 0x1, 1), - BitField("maioHi", 0x0, 4), - - BitField("maioLo", 0x0, 2), - BitField("hsn", 0x0, 6) - ] - - -class ChannelDescription2(Packet): - """ Channel Description 2 Section 10.5.2.5a """ - name = "Channel Description 2" - fields_desc = [ - BitField("channelTyp", 0x0, 5), - BitField("tn", 0x0, 3), - BitField("tsc", 0x0, 3), - BitField("h", 0x0, 1), - # if h=1 - # BitField("maioHi", 0x0, 4), - # BitField("maioLo", 0x0, 2), - # BitField("hsn", 0x0, 6) - BitField("spare", 0x0, 2), - BitField("arfcnHigh", 0x0, 2), - ByteField("arfcnLow", 0x0) - ] - - -class ChannelMode(Packet): - """ Channel Mode Section 10.5.2.6 """ - name = "Channel Mode" - fields_desc = [ - ByteField("mode", 0x0) - ] - - -class ChannelMode2(Packet): - """ Channel Mode 2 Section 10.5.2.7 """ - name = "Channel Mode 2" - fields_desc = [ - ByteField("mode", 0x0) - ] - - -class ChannelNeeded(Packet): - """ Channel Needed Section 10.5.2.8 """ - name = "Channel Needed" - fields_desc = [ - BitField("channel2", 0x0, 2), - BitField("channel1", 0x0, 2), - ] - - -class ChannelRequestDescription(Packet): - """Channel Request Description Section 10.5.2.8a """ - name = "Channel Request Description" - fields_desc = [ - BitField("mt", 0x0, 1), - ConditionalField(BitField("spare", 0x0, 39), - lambda pkt: pkt.mt == 0), - ConditionalField(BitField("spare", 0x0, 3), - lambda pkt: pkt.mt == 1), - ConditionalField(BitField("priority", 0x0, 2), - lambda pkt: pkt.mt == 1), - ConditionalField(BitField("rlcMode", 0x0, 1), - lambda pkt: pkt.mt == 1), - ConditionalField(BitField("llcFrame", 0x1, 1), - lambda pkt: pkt.mt == 1), - ConditionalField(ByteField("reqBandMsb", 0x0), - lambda pkt: pkt.mt == 1), - ConditionalField(ByteField("reqBandLsb", 0x0), - lambda pkt: pkt.mt == 1), - ConditionalField(ByteField("rlcMsb", 0x0), - lambda pkt: pkt.mt == 1), - ConditionalField(ByteField("rlcLsb", 0x0), - lambda pkt: pkt.mt == 1) - ] - - -class CipherModeSetting(Packet): - """Cipher Mode Setting Section 10.5.2.9 """ - name = "Cipher Mode Setting" - fields_desc = [ - BitField("algoId", 0x0, 3), - BitField("sc", 0x0, 1), - ] - - -class CipherResponse(Packet): - """Cipher Response Section 10.5.2.10 """ - name = "Cipher Response" - fields_desc = [ - BitField("spare", 0x0, 3), - BitField("cr", 0x0, 1), - ] - - -class ControlChannelDescription(Packet): - """Control Channel Description Section 10.5.2.11 """ - name = "Control Channel Description" - fields_desc = [ - - BitField("spare", 0x0, 1), - BitField("att", 0x0, 1), - BitField("bsAgBlksRes", 0x0, 3), - BitField("ccchConf", 0x0, 3), - - BitField("spare", 0x0, 1), - BitField("spare1", 0x0, 1), - BitField("spare2", 0x0, 1), - BitField("spare3", 0x0, 1), - BitField("spare4", 0x0, 1), - BitField("bsPaMfrms", 0x0, 3), - - ByteField("t3212", 0x0) - ] - - -class FrequencyChannelSequence(Packet): - """Frequency Channel Sequence Section 10.5.2.12""" - name = "Frequency Channel Sequence" - fields_desc = [ - BitField("spare", 0x0, 1), - BitField("lowestArfcn", 0x0, 7), - BitField("skipArfcn01", 0x0, 4), - BitField("skipArfcn02", 0x0, 4), - BitField("skipArfcn03", 0x0, 4), - BitField("skipArfcn04", 0x0, 4), - BitField("skipArfcn05", 0x0, 4), - BitField("skipArfcn06", 0x0, 4), - BitField("skipArfcn07", 0x0, 4), - BitField("skipArfcn08", 0x0, 4), - BitField("skipArfcn09", 0x0, 4), - BitField("skipArfcn10", 0x0, 4), - BitField("skipArfcn11", 0x0, 4), - BitField("skipArfcn12", 0x0, 4), - BitField("skipArfcn13", 0x0, 4), - BitField("skipArfcn14", 0x0, 4), - BitField("skipArfcn15", 0x0, 4), - BitField("skipArfcn16", 0x0, 4) - ] - - -class FrequencyList(Packet): - """Frequency List Section 10.5.2.13""" - name = "Frequency List" - # Problem: - # There are several formats for the Frequency List information - # element, distinguished by the "format indicator" subfield. - # Some formats are frequency bit maps, the others use a special encoding - # scheme. - fields_desc = [ - XByteField("lengthFL", None), - - BitField("formatID", 0x0, 2), - BitField("spare", 0x0, 2), - BitField("arfcn124", 0x0, 1), - BitField("arfcn123", 0x0, 1), - BitField("arfcn122", 0x0, 1), - BitField("arfcn121", 0x0, 1), - - ByteField("arfcn120", 0x0), - ByteField("arfcn112", 0x0), - ByteField("arfcn104", 0x0), - ByteField("arfcn96", 0x0), - ByteField("arfcn88", 0x0), - ByteField("arfcn80", 0x0), - ByteField("arfcn72", 0x0), - ByteField("arfcn64", 0x0), - ByteField("arfcn56", 0x0), - ByteField("arfcn48", 0x0), - ByteField("arfcn40", 0x0), - ByteField("arfcn32", 0x0), - ByteField("arfcn24", 0x0), - ByteField("arfcn16", 0x0), - ByteField("arfcn8", 0x0) - ] - - -# len 4 to 13 -class GroupChannelDescription(Packet): - """Group Channel Description Section 10.5.2.14b""" - name = "Group Channel Description" - fields_desc = [ - XByteField("lengthGCD", None), - - BitField("channelType", 0x0, 5), - BitField("tn", 0x0, 3), - - BitField("tsc", 0x0, 3), - BitField("h", 0x0, 1), - # if h == 0 the packet looks the following way: - ConditionalField(BitField("spare", 0x0, 2), - lambda pkt: pkt. h == 0x0), - ConditionalField(BitField("arfcnHi", 0x0, 2), - lambda pkt: pkt. h == 0x0), - ConditionalField(ByteField("arfcnLo", None), - lambda pkt: pkt. h == 0x0), - # if h == 1 the packet looks the following way: - ConditionalField(BitField("maioHi", 0x0, 4), - lambda pkt: pkt. h == 0x1), - ConditionalField(BitField("maioLo", None, 2), - lambda pkt: pkt. h == 0x1), - ConditionalField(BitField("hsn", None, 6), - lambda pkt: pkt. h == 0x1), - # finished with conditional fields - ByteField("maC6", None), - ByteField("maC7", None), - ByteField("maC8", None), - ByteField("maC9", None), - ByteField("maC10", None), - ByteField("maC11", None), - ByteField("maC12", None), - ByteField("maC13", None), - ByteField("maC14", None) - ] - - def post_build(self, p, pay): - aList = [] - a = [] - i = 0 - for i in range(0, len(self.fields_desc)): - aList.append(self.fields_desc[i].name) - for i in aList: - a.append(getattr(self, i)) - res = adapt(4, 13, a, self.fields_desc, 1) - if self.lengthGCD is None: - p = struct.pack(">B", res[1]) + p[1:] - if res[0] is not 0: - p = p[:-res[0]] - return p + pay - - -class GprsResumption(Packet): - """GPRS Resumption Section 10.5.2.14c""" - name = "GPRS Resumption" - fields_desc = [ - BitField("spare", 0x0, 3), - BitField("ack", 0x0, 1) - ] - - -class HandoverReference(Packet): - """Handover Reference Section 10.5.2.15""" - name = "Handover Reference" - fields_desc = [ - ByteField("handoverRef", 0x0) - ] - - -class IraRestOctets(Packet): - """IAR Rest Octets Section 10.5.2.17""" - name = "IAR Rest Octets" - fields_desc = [ - BitField("spare01", 0x0, 1), - BitField("spare02", 0x0, 1), - BitField("spare03", 0x1, 1), - BitField("spare04", 0x0, 1), - BitField("spare05", 0x1, 1), - BitField("spare06", 0x0, 1), - BitField("spare07", 0x1, 1), - BitField("spare08", 0x1, 1), - BitField("spare09", 0x0, 1), - BitField("spare10", 0x0, 1), - BitField("spare11", 0x1, 1), - BitField("spare12", 0x0, 1), - BitField("spare13", 0x1, 1), - BitField("spare14", 0x0, 1), - BitField("spare15", 0x1, 1), - BitField("spare16", 0x1, 1), - BitField("spare17", 0x0, 1), - BitField("spare18", 0x0, 1), - BitField("spare19", 0x1, 1), - BitField("spare20", 0x0, 1), - BitField("spare21", 0x1, 1), - BitField("spare22", 0x0, 1), - BitField("spare23", 0x1, 1), - BitField("spare24", 0x1, 1) - ] - - -# len is 1 to 5 what do we do with the variable size? no lenght -# field?! WTF -class IaxRestOctets(Packet): - """IAX Rest Octets Section 10.5.2.18""" - name = "IAX Rest Octets" - fields_desc = [ - BitField("spare01", 0x0, 1), - BitField("spare02", 0x0, 1), - BitField("spare03", 0x1, 1), - BitField("spare04", 0x0, 1), - BitField("spare05", 0x1, 1), - BitField("spare06", 0x0, 1), - BitField("spare07", 0x1, 1), - BitField("spare08", 0x1, 1), - ByteField("spareB1", None), - ByteField("spareB2", None), - ByteField("spareB3", None) - ] - - -class L2PseudoLength(Packet): - """L2 Pseudo Length Section 10.5.2.19""" - name = "L2 Pseudo Length" - fields_desc = [ - BitField("l2pLength", None, 6), - BitField("bit2", 0x0, 1), - BitField("bit1", 0x1, 1) - ] - - -class MeasurementResults(Packet): - """Measurement Results Section 10.5.2.20""" - name = "Measurement Results" - fields_desc = [ - BitField("baUsed", 0x0, 1), - BitField("dtxUsed", 0x0, 1), - BitField("rxLevFull", 0x0, 6), - - BitField("spare", 0x0, 1), - BitField("measValid", 0x0, 1), - BitField("rxLevSub", 0x0, 6), - - BitField("spare0", 0x0, 1), - BitField("rxqualFull", 0x0, 3), - BitField("rxqualSub", 0x0, 3), - BitField("noNcellHi", 0x0, 1), - - BitField("noNcellLo", 0x0, 2), - BitField("rxlevC1", 0x0, 6), - - BitField("bcchC1", 0x0, 5), - BitField("bsicC1Hi", 0x0, 3), - - BitField("bsicC1Lo", 0x0, 3), - BitField("rxlevC2", 0x0, 5), - - BitField("rxlevC2Lo", 0x0, 1), - BitField("bcchC2", 0x0, 5), - BitField("bsicC2Hi", 0x0, 2), - - BitField("bscicC2Lo", 0x0, 4), - BitField("bscicC2Hi", 0x0, 4), - - BitField("rxlevC3Lo", 0x0, 2), - BitField("bcchC3", 0x0, 5), - BitField("rxlevC3Hi", 0x0, 1), - - BitField("bsicC3Lo", 0x0, 5), - BitField("bsicC3Hi", 0x0, 3), - - BitField("rxlevC4Lo", 0x0, 3), - BitField("bcchC4", 0x0, 5), - - BitField("bsicC4", 0x0, 6), - BitField("rxlevC5Hi", 0x0, 2), - - BitField("rxlevC5Lo", 0x0, 4), - BitField("bcchC5Hi", 0x0, 4), - - BitField("bcchC5Lo", 0x0, 1), - BitField("bsicC5", 0x0, 6), - BitField("rxlevC6", 0x0, 1), - - BitField("rxlevC6Lo", 0x0, 5), - BitField("bcchC6Hi", 0x0, 3), - - BitField("bcchC6Lo", 0x0, 3), - BitField("bsicC6", 0x0, 5) - ] - - -class GprsMeasurementResults(Packet): - """GPRS Measurement Results Section 10.5.2.20a""" - name = "GPRS Measurement Results" - fields_desc = [ - BitField("cValue", 0x0, 6), - BitField("rxqualHi", 0x0, 2), - BitField("rxqL", 0x0, 1), - BitField("spare", 0x0, 1), - BitField("signVar", 0x0, 6) - ] - - -# len 3 to 10 -class MobileAllocation(Packet): - """Mobile Allocation Section 10.5.2.21""" - name = "Mobile Allocation" - fields_desc = [ - XByteField("lengthMA", None), - ByteField("maC64", 0x12), - ByteField("maC56", None), # optional fields start here - ByteField("maC48", None), - ByteField("maC40", None), - ByteField("maC32", None), - ByteField("maC24", None), - ByteField("maC16", None), - ByteField("maC8", None) - ] - - def post_build(self, p, pay): - aList = [] - a = [] - i = 0 - for i in range(0, len(self.fields_desc)): - aList.append(self.fields_desc[i].name) - for i in aList: - a.append(getattr(self, i)) - res = adapt(2, 9, a, self.fields_desc, 1) - if self.lengthMA is None: - p = struct.pack(">B", res[1]) + p[1:] - if res[0] is not 0: - p = p[:-res[0]] - return p + pay - - -class MobileTimeDifference(Packet): - """Mobile Time Difference Section 10.5.2.21a""" - name = "Mobile Time Difference" - fields_desc = [ - XByteField("lengthMTD", 0x5), - ByteField("valueHi", 0x0), - ByteField("valueCnt", 0x0), - BitField("valueLow", 0x0, 5), - BitField("spare", 0x0, 1), - BitField("spare1", 0x0, 1), - BitField("spare2", 0x0, 1) - ] - - -# min 4 octets max 8 -class MultiRateConfiguration(Packet): - """ MultiRate configuration Section 10.5.2.21aa""" - name = "MultiRate Configuration" - # This packet has a variable length and hence structure. This packet - # implements the longuest possible packet. If you biuild a shorter - # packet, for example having only 6 bytes, the last 4 bytes are named - # "Spare" in the specs. Here they are named "threshold2" - fields_desc = [ - XByteField("lengthMRC", None), - - BitField("mrVersion", 0x0, 3), - BitField("spare", 0x0, 1), - BitField("icmi", 0x0, 1), - BitField("spare", 0x0, 1), - BitField("startMode", 0x0, 2), - - ByteField("amrCodec", None), - - BitField("spare", None, 2), - BitField("threshold1", None, 6), - - BitField("hysteresis1", None, 4), - BitField("threshold2", None, 4), - - BitField("threshold2cnt", None, 2), - BitField("hysteresis2", None, 4), - BitField("threshold3", None, 2), - - BitField("threshold3cnt", None, 4), - BitField("hysteresis3", None, 4) - ] - - def post_build(self, p, pay): - # we set the length - aList = [] - a = [] - i = 0 - for i in range(0, len(self.fields_desc)): - aList.append(self.fields_desc[i].name) - for i in aList: - a.append(getattr(self, i)) - res = adapt(3, 7, a, self.fields_desc, 1) - if self.lengthMRC is None: - p = struct.pack(">B", res[1]) + p[1:] - if res[0] is not 0: - p = p[:-res[0]] - return p + pay - - -# len 2 to 11 -class MultislotAllocation(Packet): - """Multislot Allocation Section 10.5.2.21b""" - name = "Multislot Allocation" - fields_desc = [ - XByteField("lengthMSA", None), - BitField("ext0", 0x1, 1), - BitField("da", 0x0, 7), - ConditionalField(BitField("ext1", 0x1, 1), # optional - lambda pkt: pkt.ext0 == 0), - ConditionalField(BitField("ua", 0x0, 7), - lambda pkt: pkt.ext0 == 0), - ByteField("chan1", None), - ByteField("chan2", None), - ByteField("chan3", None), - ByteField("chan4", None), - ByteField("chan5", None), - ByteField("chan6", None), - ByteField("chan7", None), - ByteField("chan8", None) - ] - - def post_build(self, p, pay): - aList = [] - a = [] - i = 0 - for i in range(0, len(self.fields_desc)): - aList.append(self.fields_desc[i].name) - for i in aList: - a.append(getattr(self, i)) - res = adapt(1, 11, a, self.fields_desc, 1) - if res[0] is not 0: - p = p[:-res[0]] - if self.lengthMSA is None: - p = struct.pack(">B", len(p)-1) + p[1:] - return p + pay - - -class NcMode(Packet): - """NC mode Section 10.5.2.21c""" - name = "NC Mode" - fields_desc = [ - BitField("spare", 0x0, 2), - BitField("ncMode", 0x0, 2) - ] - - -class NeighbourCellsDescription(Packet): - """Neighbour Cells Description Section 10.5.2.22""" - name = "Neighbour Cells Description" - fields_desc = [ - BitField("bit128", 0x0, 1), - BitField("bit127", 0x0, 1), - BitField("extInd", 0x0, 1), - BitField("baInd", 0x0, 1), - BitField("bit124", 0x0, 1), - BitField("bit123", 0x0, 1), - BitField("bit122", 0x0, 1), - BitField("bit121", 0x0, 1), - BitField("120bits", 0x0, 120) - ] - - -class NeighbourCellsDescription2(Packet): - """Neighbour Cells Description 2 Section 10.5.2.22a""" - name = "Neighbour Cells Description 2" - fields_desc = [ - BitField("bit128", 0x0, 1), - BitField("multiband", 0x0, 2), - BitField("baInd", 0x0, 1), - BitField("bit124", 0x0, 1), - BitField("bit123", 0x0, 1), - BitField("bit122", 0x0, 1), - BitField("bit121", 0x0, 1), - BitField("120bits", 0x0, 120) - ] - - -# len 4 -# strange packet, lots of valid formats - -# ideas for the dynamic packets: -# 1] for user interaction: Create an interactive "builder" based on a -# Q/A process (not very scapy like) -# 2] for usage in scripts, create an alternative packet for every -# possible packet layout -# - -class DedicatedModeOrTBF(Packet): - """Dedicated mode or TBF Section 10.5.2.25b""" - name = "Dedicated Mode or TBF" - fields_desc = [ - BitField("spare", 0x0, 1), - BitField("tma", 0x0, 1), - BitField("downlink", 0x0, 1), - BitField("td", 0x0, 1) - ] - - -class PageMode(Packet): - """Page Mode Section 10.5.2.26""" - name = "Page Mode" - fields_desc = [ - BitField("spare", 0x0, 1), - BitField("spare1", 0x0, 1), - BitField("pm", 0x0, 2) - ] - - -class NccPermitted(Packet): - """NCC Permitted Section 10.5.2.27""" - name = "NCC Permited" - fields_desc = [ - ByteField("nccPerm", 0x0) - ] - - -class PowerCommand(Packet): - """Power Command Section 10.5.2.28""" - name = "Power Command" - fields_desc = [ - BitField("spare", 0x0, 1), - BitField("spare1", 0x0, 1), - BitField("spare2", 0x0, 1), - BitField("powerLvl", 0x0, 5) - ] - - -class PowerCommandAndAccessType(Packet): - """Power Command and access type Section 10.5.2.28a""" - name = "Power Command and Access Type" - fields_desc = [ - BitField("atc", 0x0, 1), - BitField("spare", 0x0, 1), - BitField("spare1", 0x0, 1), - BitField("powerLvl", 0x0, 5) - ] - - -class RachControlParameters(Packet): - """RACH Control Parameters Section 10.5.2.29""" - name = "RACH Control Parameters" - fields_desc = [ - BitField("maxRetrans", 0x0, 2), - BitField("txInteger", 0x0, 4), - BitField("cellBarrAccess", 0x0, 1), - BitField("re", 0x0, 1), - BitField("ACC15", 0x0, 1), - BitField("ACC14", 0x0, 1), - BitField("ACC13", 0x0, 1), - BitField("ACC12", 0x0, 1), - BitField("ACC11", 0x0, 1), - BitField("ACC10", 0x0, 1), - BitField("ACC09", 0x0, 1), - BitField("ACC08", 0x0, 1), - BitField("ACC07", 0x0, 1), - BitField("ACC06", 0x0, 1), - BitField("ACC05", 0x0, 1), - BitField("ACC04", 0x0, 1), - BitField("ACC03", 0x0, 1), - BitField("ACC02", 0x0, 1), - BitField("ACC01", 0x0, 1), - BitField("ACC00", 0x0, 1), - ] - - -class RequestReference(Packet): - """Request Reference Section 10.5.2.30""" - name = "Request Reference" - fields_desc = [ - ByteField("ra", 0x0), - BitField("t1", 0x0, 5), - BitField("t3Hi", 0x0, 3), - BitField("t3Lo", 0x0, 3), - BitField("t2", 0x0, 5) - ] - - -class RrCause(Packet): - """RR Cause Section 10.5.2.31""" - name = "RR Cause" - fields_desc = [ - ByteField("rrCause", 0x0) - ] - - -class StartingTime(Packet): - """Starting Time Section 10.5.2.38""" - name = "Starting Time" - fields_desc = [ - ByteField("ra", 0x0), - BitField("t1", 0x0, 5), - BitField("t3Hi", 0x0, 3), - BitField("t3Lo", 0x0, 3), - BitField("t2", 0x0, 5) - ] - - -class SynchronizationIndication(Packet): - """Synchronization Indication Section 10.5.2.39""" - name = "Synchronization Indication" - fields_desc = [ - BitField("nci", 0x0, 1), - BitField("rot", 0x0, 1), - BitField("si", 0x0, 2) - ] - - -class TimingAdvance(Packet): - """Timing Advance Section 10.5.2.40""" - name = "Timing Advance" - fields_desc = [ - BitField("spare", 0x0, 1), - BitField("spare1", 0x0, 1), - BitField("timingVal", 0x0, 6) - ] - - -class TimeDifference(Packet): - """ Time Difference Section 10.5.2.41""" - name = "Time Difference" - fields_desc = [ - XByteField("lengthTD", 0x3), - ByteField("timeValue", 0x0) - ] - - -class Tlli(Packet): - """ TLLI Section Section 10.5.2.41a""" - name = "TLLI" - fields_desc = [ - ByteField("value", 0x0), - ByteField("value1", 0x0), - ByteField("value2", 0x0), - ByteField("value3", 0x0) - ] - - -class TmsiPTmsi(Packet): - """ TMSI/P-TMSI Section 10.5.2.42""" - name = "TMSI/P-TMSI" - fields_desc = [ - ByteField("value", 0x0), - ByteField("value1", 0x0), - ByteField("value2", 0x0), - ByteField("value3", 0x0) - ] - - -class VgcsTargetModeIdentication(Packet): - """ VGCS target Mode Indication 10.5.2.42a""" - name = "VGCS Target Mode Indication" - fields_desc = [ - XByteField("lengthVTMI", 0x2), - BitField("targerMode", 0x0, 2), - BitField("cipherKeyNb", 0x0, 4), - BitField("spare", 0x0, 1), - BitField("spare1", 0x0, 1) - ] - - -class WaitIndication(Packet): - """ Wait Indication Section 10.5.2.43""" - name = "Wait Indication" - fields_desc = [ # asciiart of specs strange - ByteField("timeoutVal", 0x0) - ] - - -#class Si10RestOctets(Packet): -# """SI10 rest octets 10.5.2.44""" -# name = "SI10 rest octets" -# fields_desc = [ - - -# len 17 -class ExtendedMeasurementResults(Packet): - """EXTENDED MEASUREMENT RESULTS Section 10.5.2.45""" - name = "Extended Measurement Results" - fields_desc = [ - - BitField("scUsed", None, 1), - BitField("dtxUsed", None, 1), - BitField("rxLevC0", None, 6), - - BitField("rxLevC1", None, 6), - BitField("rxLevC2Hi", None, 2), - - BitField("rxLevC2Lo", None, 4), - BitField("rxLevC3Hi", None, 4), - - BitField("rxLevC3Lo", None, 3), - BitField("rxLevC4", None, 5), - - BitField("rxLevC5", None, 6), - BitField("rxLevC6Hi", None, 2), - - BitField("rxLevC6Lo", None, 4), - BitField("rxLevC7Hi", None, 4), - - BitField("rxLevC7Lo", None, 2), - BitField("rxLevC8", None, 6), - - BitField("rxLevC9", None, 6), - BitField("rxLevC10Hi", None, 2), - - BitField("rxLevC10Lo", None, 4), - BitField("rxLevC11Hi", None, 4), - - BitField("rxLevC13Lo", None, 2), - BitField("rxLevC12", None, 6), - - BitField("rxLevC13", None, 6), - BitField("rxLevC14Hi", None, 2), - - BitField("rxLevC14Lo", None, 4), - BitField("rxLevC15Hi", None, 4), - - BitField("rxLevC15Lo", None, 2), - BitField("rxLevC16", None, 6), - - - BitField("rxLevC17", None, 6), - BitField("rxLevC18Hi", None, 2), - - BitField("rxLevC18Lo", None, 4), - BitField("rxLevC19Hi", None, 4), - - BitField("rxLevC19Lo", None, 2), - BitField("rxLevC20", None, 6) - ] - - -# len 17 -class ExtendedMeasurementFrequencyList(Packet): - """Extended Measurement Frequency List Section 10.5.2.46""" - name = "Extended Measurement Frequency List" - fields_desc = [ - - BitField("bit128", 0x0, 1), - BitField("bit127", 0x0, 1), - BitField("spare", 0x0, 1), - BitField("seqCode", 0x0, 1), - BitField("bit124", 0x0, 1), - BitField("bit123", 0x0, 1), - BitField("bit122", 0x0, 1), - BitField("bit121", 0x0, 1), - - BitField("bitsRest", 0x0, 128) - ] - - -class SuspensionCause(Packet): - """Suspension Cause Section 10.5.2.47""" - name = "Suspension Cause" - fields_desc = [ - ByteField("suspVal", 0x0) - ] - - -class ApduID(Packet): - """APDU Flags Section 10.5.2.48""" - name = "Apdu Id" - fields_desc = [ - BitField("id", None, 4) - ] - - -class ApduFlags(Packet): - """APDU Flags Section 10.5.2.49""" - name = "Apdu Flags" - fields_desc = [ - BitField("spare", 0x0, 1), - BitField("cr", 0x0, 1), - BitField("firstSeg", 0x0, 1), - BitField("lastSeg", 0x0, 1) - ] - - -# len 1 to max L3 (251) (done) -class ApduData(Packet): - """APDU Data Section 10.5.2.50""" - name = "Apdu Data" - fields_desc = [ - XByteField("lengthAD", None), - #optional - ByteField("apuInfo1", None), - ByteField("apuInfo2", None), - ByteField("apuInfo3", None), - ByteField("apuInfo4", None), - ByteField("apuInfo5", None), - ByteField("apuInfo6", None), - ByteField("apuInfo7", None), - ByteField("apuInfo8", None), - ByteField("apuInfo9", None), - ByteField("apuInfo10", None), - ByteField("apuInfo11", None), - ByteField("apuInfo12", None), - ByteField("apuInfo13", None), - ByteField("apuInfo14", None), - ByteField("apuInfo15", None), - ByteField("apuInfo16", None), - ByteField("apuInfo17", None), - ByteField("apuInfo18", None), - ByteField("apuInfo19", None), - ByteField("apuInfo20", None), - ByteField("apuInfo21", None), - ByteField("apuInfo22", None), - ByteField("apuInfo23", None), - ByteField("apuInfo24", None), - ByteField("apuInfo25", None), - ByteField("apuInfo26", None), - ByteField("apuInfo27", None), - ByteField("apuInfo28", None), - ByteField("apuInfo29", None), - ByteField("apuInfo30", None), - ByteField("apuInfo31", None), - ByteField("apuInfo32", None), - ByteField("apuInfo33", None), - ByteField("apuInfo34", None), - ByteField("apuInfo35", None), - ByteField("apuInfo36", None), - ByteField("apuInfo37", None), - ByteField("apuInfo38", None), - ByteField("apuInfo39", None), - ByteField("apuInfo40", None), - ByteField("apuInfo41", None), - ByteField("apuInfo42", None), - ByteField("apuInfo43", None), - ByteField("apuInfo44", None), - ByteField("apuInfo45", None), - ByteField("apuInfo46", None), - ByteField("apuInfo47", None), - ByteField("apuInfo48", None), - ByteField("apuInfo49", None), - ByteField("apuInfo50", None), - ByteField("apuInfo51", None), - ByteField("apuInfo52", None), - ByteField("apuInfo53", None), - ByteField("apuInfo54", None), - ByteField("apuInfo55", None), - ByteField("apuInfo56", None), - ByteField("apuInfo57", None), - ByteField("apuInfo58", None), - ByteField("apuInfo59", None), - ByteField("apuInfo60", None), - ByteField("apuInfo61", None), - ByteField("apuInfo62", None), - ByteField("apuInfo63", None), - ByteField("apuInfo64", None), - ByteField("apuInfo65", None), - ByteField("apuInfo66", None), - ByteField("apuInfo67", None), - ByteField("apuInfo68", None), - ByteField("apuInfo69", None), - ByteField("apuInfo70", None), - ByteField("apuInfo71", None), - ByteField("apuInfo72", None), - ByteField("apuInfo73", None), - ByteField("apuInfo74", None), - ByteField("apuInfo75", None), - ByteField("apuInfo76", None), - ByteField("apuInfo77", None), - ByteField("apuInfo78", None), - ByteField("apuInfo79", None), - ByteField("apuInfo80", None), - ByteField("apuInfo81", None), - ByteField("apuInfo82", None), - ByteField("apuInfo83", None), - ByteField("apuInfo84", None), - ByteField("apuInfo85", None), - ByteField("apuInfo86", None), - ByteField("apuInfo87", None), - ByteField("apuInfo88", None), - ByteField("apuInfo89", None), - ByteField("apuInfo90", None), - ByteField("apuInfo91", None), - ByteField("apuInfo92", None), - ByteField("apuInfo93", None), - ByteField("apuInfo94", None), - ByteField("apuInfo95", None), - ByteField("apuInfo96", None), - ByteField("apuInfo97", None), - ByteField("apuInfo98", None), - ByteField("apuInfo99", None), - ByteField("apuInfo100", None), - ByteField("apuInfo101", None), - ByteField("apuInfo102", None), - ByteField("apuInfo103", None), - ByteField("apuInfo104", None), - ByteField("apuInfo105", None), - ByteField("apuInfo106", None), - ByteField("apuInfo107", None), - ByteField("apuInfo108", None), - ByteField("apuInfo109", None), - ByteField("apuInfo110", None), - ByteField("apuInfo111", None), - ByteField("apuInfo112", None), - ByteField("apuInfo113", None), - ByteField("apuInfo114", None), - ByteField("apuInfo115", None), - ByteField("apuInfo116", None), - ByteField("apuInfo117", None), - ByteField("apuInfo118", None), - ByteField("apuInfo119", None), - ByteField("apuInfo120", None), - ByteField("apuInfo121", None), - ByteField("apuInfo122", None), - ByteField("apuInfo123", None), - ByteField("apuInfo124", None), - ByteField("apuInfo125", None), - ByteField("apuInfo126", None), - ByteField("apuInfo127", None), - ByteField("apuInfo128", None), - ByteField("apuInfo129", None), - ByteField("apuInfo130", None), - ByteField("apuInfo131", None), - ByteField("apuInfo132", None), - ByteField("apuInfo133", None), - ByteField("apuInfo134", None), - ByteField("apuInfo135", None), - ByteField("apuInfo136", None), - ByteField("apuInfo137", None), - ByteField("apuInfo138", None), - ByteField("apuInfo139", None), - ByteField("apuInfo140", None), - ByteField("apuInfo141", None), - ByteField("apuInfo142", None), - ByteField("apuInfo143", None), - ByteField("apuInfo144", None), - ByteField("apuInfo145", None), - ByteField("apuInfo146", None), - ByteField("apuInfo147", None), - ByteField("apuInfo148", None), - ByteField("apuInfo149", None), - ByteField("apuInfo150", None), - ByteField("apuInfo151", None), - ByteField("apuInfo152", None), - ByteField("apuInfo153", None), - ByteField("apuInfo154", None), - ByteField("apuInfo155", None), - ByteField("apuInfo156", None), - ByteField("apuInfo157", None), - ByteField("apuInfo158", None), - ByteField("apuInfo159", None), - ByteField("apuInfo160", None), - ByteField("apuInfo161", None), - ByteField("apuInfo162", None), - ByteField("apuInfo163", None), - ByteField("apuInfo164", None), - ByteField("apuInfo165", None), - ByteField("apuInfo166", None), - ByteField("apuInfo167", None), - ByteField("apuInfo168", None), - ByteField("apuInfo169", None), - ByteField("apuInfo170", None), - ByteField("apuInfo171", None), - ByteField("apuInfo172", None), - ByteField("apuInfo173", None), - ByteField("apuInfo174", None), - ByteField("apuInfo175", None), - ByteField("apuInfo176", None), - ByteField("apuInfo177", None), - ByteField("apuInfo178", None), - ByteField("apuInfo179", None), - ByteField("apuInfo180", None), - ByteField("apuInfo181", None), - ByteField("apuInfo182", None), - ByteField("apuInfo183", None), - ByteField("apuInfo184", None), - ByteField("apuInfo185", None), - ByteField("apuInfo186", None), - ByteField("apuInfo187", None), - ByteField("apuInfo188", None), - ByteField("apuInfo189", None), - ByteField("apuInfo190", None), - ByteField("apuInfo191", None), - ByteField("apuInfo192", None), - ByteField("apuInfo193", None), - ByteField("apuInfo194", None), - ByteField("apuInfo195", None), - ByteField("apuInfo196", None), - ByteField("apuInfo197", None), - ByteField("apuInfo198", None), - ByteField("apuInfo199", None), - ByteField("apuInfo200", None), - ByteField("apuInfo201", None), - ByteField("apuInfo202", None), - ByteField("apuInfo203", None), - ByteField("apuInfo204", None), - ByteField("apuInfo205", None), - ByteField("apuInfo206", None), - ByteField("apuInfo207", None), - ByteField("apuInfo208", None), - ByteField("apuInfo209", None), - ByteField("apuInfo210", None), - ByteField("apuInfo211", None), - ByteField("apuInfo212", None), - ByteField("apuInfo213", None), - ByteField("apuInfo214", None), - ByteField("apuInfo215", None), - ByteField("apuInfo216", None), - ByteField("apuInfo217", None), - ByteField("apuInfo218", None), - ByteField("apuInfo219", None), - ByteField("apuInfo220", None), - ByteField("apuInfo221", None), - ByteField("apuInfo222", None), - ByteField("apuInfo223", None), - ByteField("apuInfo224", None), - ByteField("apuInfo225", None), - ByteField("apuInfo226", None), - ByteField("apuInfo227", None), - ByteField("apuInfo228", None), - ByteField("apuInfo229", None), - ByteField("apuInfo230", None), - ByteField("apuInfo231", None), - ByteField("apuInfo232", None), - ByteField("apuInfo233", None), - ByteField("apuInfo234", None), - ByteField("apuInfo235", None), - ByteField("apuInfo236", None), - ByteField("apuInfo237", None), - ByteField("apuInfo238", None), - ByteField("apuInfo239", None), - ByteField("apuInfo240", None), - ByteField("apuInfo241", None), - ByteField("apuInfo242", None), - ByteField("apuInfo243", None), - ByteField("apuInfo244", None), - ByteField("apuInfo245", None), - ByteField("apuInfo246", None), - ByteField("apuInfo247", None), - ByteField("apuInfo248", None), - ByteField("apuInfo249", None) - ] - - def post_build(self, p, pay): - aList = [] - a = [] - i = 0 - for i in range(0, len(self.fields_desc)): - aList.append(self.fields_desc[i].name) - for i in aList: - a.append(getattr(self, i)) - res = adapt(1, 250, a, self.fields_desc, 1) - if self.lengthAD is None: - p = struct.pack(">B", res[1]) + p[1:] - if res[0] is not 0: - p = p[:-res[0]] - return p + pay -# -# 10.5.3 Mobility management information elements -# - - -# len 3 to L3 max (251) (done) -class NetworkName(Packet): - """Network Name Section 10.5.3.5a""" - name = "Network Name" - fields_desc = [ - - XByteField("lengthNN", None), - - BitField("ext", 0x1, 1), - BitField("codingScheme", 0x0, 3), - BitField("addCi", 0x0, 1), - BitField("nbSpare", 0x0, 3), - # optional - ByteField("txtString1", None), - ByteField("txtString2", None), - ByteField("txtString3", None), - ByteField("txtString4", None), - ByteField("txtString5", None), - ByteField("txtString6", None), - ByteField("txtString7", None), - ByteField("txtString8", None), - ByteField("txtString9", None), - ByteField("txtString10", None), - ByteField("txtString11", None), - ByteField("txtString12", None), - ByteField("txtString13", None), - ByteField("txtString14", None), - ByteField("txtString15", None), - ByteField("txtString16", None), - ByteField("txtString17", None), - ByteField("txtString18", None), - ByteField("txtString19", None), - ByteField("txtString20", None), - ByteField("txtString21", None), - ByteField("txtString22", None), - ByteField("txtString23", None), - ByteField("txtString24", None), - ByteField("txtString25", None), - ByteField("txtString26", None), - ByteField("txtString27", None), - ByteField("txtString28", None), - ByteField("txtString29", None), - ByteField("txtString30", None), - ByteField("txtString31", None), - ByteField("txtString32", None), - ByteField("txtString33", None), - ByteField("txtString34", None), - ByteField("txtString35", None), - ByteField("txtString36", None), - ByteField("txtString37", None), - ByteField("txtString38", None), - ByteField("txtString39", None), - ByteField("txtString40", None), - ByteField("txtString41", None), - ByteField("txtString42", None), - ByteField("txtString43", None), - ByteField("txtString44", None), - ByteField("txtString45", None), - ByteField("txtString46", None), - ByteField("txtString47", None), - ByteField("txtString48", None), - ByteField("txtString49", None), - ByteField("txtString50", None), - ByteField("txtString51", None), - ByteField("txtString52", None), - ByteField("txtString53", None), - ByteField("txtString54", None), - ByteField("txtString55", None), - ByteField("txtString56", None), - ByteField("txtString57", None), - ByteField("txtString58", None), - ByteField("txtString59", None), - ByteField("txtString60", None), - ByteField("txtString61", None), - ByteField("txtString62", None), - ByteField("txtString63", None), - ByteField("txtString64", None), - ByteField("txtString65", None), - ByteField("txtString66", None), - ByteField("txtString67", None), - ByteField("txtString68", None), - ByteField("txtString69", None), - ByteField("txtString70", None), - ByteField("txtString71", None), - ByteField("txtString72", None), - ByteField("txtString73", None), - ByteField("txtString74", None), - ByteField("txtString75", None), - ByteField("txtString76", None), - ByteField("txtString77", None), - ByteField("txtString78", None), - ByteField("txtString79", None), - ByteField("txtString80", None), - ByteField("txtString81", None), - ByteField("txtString82", None), - ByteField("txtString83", None), - ByteField("txtString84", None), - ByteField("txtString85", None), - ByteField("txtString86", None), - ByteField("txtString87", None), - ByteField("txtString88", None), - ByteField("txtString89", None), - ByteField("txtString90", None), - ByteField("txtString91", None), - ByteField("txtString92", None), - ByteField("txtString93", None), - ByteField("txtString94", None), - ByteField("txtString95", None), - ByteField("txtString96", None), - ByteField("txtString97", None), - ByteField("txtString98", None), - ByteField("txtString99", None), - ByteField("txtString100", None), - ByteField("txtString101", None), - ByteField("txtString102", None), - ByteField("txtString103", None), - ByteField("txtString104", None), - ByteField("txtString105", None), - ByteField("txtString106", None), - ByteField("txtString107", None), - ByteField("txtString108", None), - ByteField("txtString109", None), - ByteField("txtString110", None), - ByteField("txtString111", None), - ByteField("txtString112", None), - ByteField("txtString113", None), - ByteField("txtString114", None), - ByteField("txtString115", None), - ByteField("txtString116", None), - ByteField("txtString117", None), - ByteField("txtString118", None), - ByteField("txtString119", None), - ByteField("txtString120", None), - ByteField("txtString121", None), - ByteField("txtString122", None), - ByteField("txtString123", None), - ByteField("txtString124", None), - ByteField("txtString125", None), - ByteField("txtString126", None), - ByteField("txtString127", None), - ByteField("txtString128", None), - ByteField("txtString129", None), - ByteField("txtString130", None), - ByteField("txtString131", None), - ByteField("txtString132", None), - ByteField("txtString133", None), - ByteField("txtString134", None), - ByteField("txtString135", None), - ByteField("txtString136", None), - ByteField("txtString137", None), - ByteField("txtString138", None), - ByteField("txtString139", None), - ByteField("txtString140", None), - ByteField("txtString141", None), - ByteField("txtString142", None), - ByteField("txtString143", None), - ByteField("txtString144", None), - ByteField("txtString145", None), - ByteField("txtString146", None), - ByteField("txtString147", None), - ByteField("txtString148", None), - ByteField("txtString149", None), - ByteField("txtString150", None), - ByteField("txtString151", None), - ByteField("txtString152", None), - ByteField("txtString153", None), - ByteField("txtString154", None), - ByteField("txtString155", None), - ByteField("txtString156", None), - ByteField("txtString157", None), - ByteField("txtString158", None), - ByteField("txtString159", None), - ByteField("txtString160", None), - ByteField("txtString161", None), - ByteField("txtString162", None), - ByteField("txtString163", None), - ByteField("txtString164", None), - ByteField("txtString165", None), - ByteField("txtString166", None), - ByteField("txtString167", None), - ByteField("txtString168", None), - ByteField("txtString169", None), - ByteField("txtString170", None), - ByteField("txtString171", None), - ByteField("txtString172", None), - ByteField("txtString173", None), - ByteField("txtString174", None), - ByteField("txtString175", None), - ByteField("txtString176", None), - ByteField("txtString177", None), - ByteField("txtString178", None), - ByteField("txtString179", None), - ByteField("txtString180", None), - ByteField("txtString181", None), - ByteField("txtString182", None), - ByteField("txtString183", None), - ByteField("txtString184", None), - ByteField("txtString185", None), - ByteField("txtString186", None), - ByteField("txtString187", None), - ByteField("txtString188", None), - ByteField("txtString189", None), - ByteField("txtString190", None), - ByteField("txtString191", None), - ByteField("txtString192", None), - ByteField("txtString193", None), - ByteField("txtString194", None), - ByteField("txtString195", None), - ByteField("txtString196", None), - ByteField("txtString197", None), - ByteField("txtString198", None), - ByteField("txtString199", None), - ByteField("txtString200", None), - ByteField("txtString201", None), - ByteField("txtString202", None), - ByteField("txtString203", None), - ByteField("txtString204", None), - ByteField("txtString205", None), - ByteField("txtString206", None), - ByteField("txtString207", None), - ByteField("txtString208", None), - ByteField("txtString209", None), - ByteField("txtString210", None), - ByteField("txtString211", None), - ByteField("txtString212", None), - ByteField("txtString213", None), - ByteField("txtString214", None), - ByteField("txtString215", None), - ByteField("txtString216", None), - ByteField("txtString217", None), - ByteField("txtString218", None), - ByteField("txtString219", None), - ByteField("txtString220", None), - ByteField("txtString221", None), - ByteField("txtString222", None), - ByteField("txtString223", None), - ByteField("txtString224", None), - ByteField("txtString225", None), - ByteField("txtString226", None), - ByteField("txtString227", None), - ByteField("txtString228", None), - ByteField("txtString229", None), - ByteField("txtString230", None), - ByteField("txtString231", None), - ByteField("txtString232", None), - ByteField("txtString233", None), - ByteField("txtString234", None), - ByteField("txtString235", None), - ByteField("txtString236", None), - ByteField("txtString237", None), - ByteField("txtString238", None), - ByteField("txtString239", None), - ByteField("txtString240", None), - ByteField("txtString241", None), - ByteField("txtString242", None), - ByteField("txtString243", None), - ByteField("txtString244", None), - ByteField("txtString245", None), - ByteField("txtString246", None), - ByteField("txtString247", None), - ByteField("txtString248", None) - ] - - def post_build(self, p, pay): - aList = [] - a = [] - i = 0 - for i in range(0, len(self.fields_desc)): - aList.append(self.fields_desc[i].name) - for i in aList: - a.append(getattr(self, i)) - res = adapt(2, 250, a, self.fields_desc, 1) - if self.lengthNN is None: - p = struct.pack(">B", res[1]) + p[1:] - if res[0] is not 0: - p = p[:-res[0]] - return p + pay - - -class TimeZone(Packet): - """Time Zone Section 10.5.3.8""" - name = "Time Zone" - fields_desc = [ - ByteField("timeZone", 0x0), - ] - - -class TimeZoneAndTime(Packet): - """Time Zone and Time Section 10.5.3.9""" - name = "Time Zone and Time" - fields_desc = [ - ByteField("year", 0x0), - ByteField("month", 0x0), - ByteField("day", 0x0), - ByteField("hour", 0x0), - ByteField("minute", 0x0), - ByteField("second", 0x0), - ByteField("timeZone", 0x0) - ] - - -class CtsPermission(Packet): - """CTS permission Section 10.5.3.10""" - name = "Cts Permission" - fields_desc = [ - ] - - -class LsaIdentifier(Packet): - """LSA Identifier Section 10.5.3.11""" - name = "Lsa Identifier" - fields_desc = [ - ByteField("lsaID", 0x0), - ByteField("lsaID1", 0x0), - ByteField("lsaID2", 0x0) - ] - - -# -# 10.5.4 Call control information elements -# - -#10.5.4.1 Extensions of codesets -# This is only text and no packet - -class LockingShiftProcedure(Packet): - """Locking shift procedure Section 10.5.4.2""" - name = "Locking Shift Procedure" - fields_desc = [ - BitField("lockShift", 0x0, 1), - BitField("codesetId", 0x0, 3) - ] - - -class NonLockingShiftProcedure(Packet): - """Non-locking shift procedure Section 10.5.4.3""" - name = "Non-locking Shift Procedure" - fields_desc = [ - BitField("nonLockShift", 0x1, 1), - BitField("codesetId", 0x0, 3) - ] - - -class AuxiliaryStates(Packet): - """Auxiliary states Section 10.5.4.4""" - name = "Auxiliary States" - fields_desc = [ - XByteField("lengthAS", 0x3), - BitField("ext", 0x1, 1), - BitField("spare", 0x0, 3), - BitField("holdState", 0x0, 2), - BitField("mptyState", 0x0, 2) - ] - - -# len 3 to 15 -class BearerCapability(Packet): - """Bearer capability Section 10.5.4.5""" - name = "Bearer Capability" - fields_desc = [ - - XByteField("lengthBC", None), - - BitField("ext0", 0x1, 1), - BitField("radioChReq", 0x1, 2), - BitField("codingStd", 0x0, 1), - BitField("transMode", 0x0, 1), - BitField("infoTransCa", 0x0, 3), - # optional - ConditionalField(BitField("ext1", 0x1, 1), - lambda pkt: pkt.ext0 == 0), - ConditionalField(BitField("coding", None, 1), - lambda pkt: pkt.ext0 == 0), - ConditionalField(BitField("spare", None, 2), - lambda pkt: pkt.ext0 == 0), - ConditionalField(BitField("speechVers", 0x0, 4), - lambda pkt: pkt.ext0 == 0), - - ConditionalField(BitField("ext2", 0x1, 1), - lambda pkt: pkt.ext1 == 0), - ConditionalField(BitField("compress", None, 1), - lambda pkt: pkt.ext1 == 0), - ConditionalField(BitField("structure", None, 2), - lambda pkt: pkt.ext1 == 0), - ConditionalField(BitField("dupMode", None, 1), - lambda pkt: pkt.ext1 == 0), - ConditionalField(BitField("config", None, 1), - lambda pkt: pkt.ext1 == 0), - ConditionalField(BitField("nirr", None, 1), - lambda pkt: pkt.ext1 == 0), - ConditionalField(BitField("establi", 0x0, 1), - lambda pkt: pkt.ext1 == 0), - - BitField("ext3", None, 1), - BitField("accessId", None, 2), - BitField("rateAda", None, 2), - BitField("signaling", None, 3), - - ConditionalField(BitField("ext4", None, 1), - lambda pkt: pkt.ext3 == 0), - ConditionalField(BitField("otherITC", None, 2), - lambda pkt: pkt.ext3 == 0), - ConditionalField(BitField("otherRate", None, 2), - lambda pkt: pkt.ext3 == 0), - ConditionalField(BitField("spare1", 0x0, 3), - lambda pkt: pkt.ext3 == 0), - - ConditionalField(BitField("ext5", 0x1, 1), - lambda pkt: pkt.ext4 == 0), - ConditionalField(BitField("hdr", None, 1), - lambda pkt: pkt.ext4 == 0), - ConditionalField(BitField("multiFr", None, 1), - lambda pkt: pkt.ext4 == 0), - ConditionalField(BitField("mode", None, 1), - lambda pkt: pkt.ext4 == 0), - ConditionalField(BitField("lli", None, 1), - lambda pkt: pkt.ext4 == 0), - ConditionalField(BitField("assig", None, 1), - lambda pkt: pkt.ext4 == 0), - ConditionalField(BitField("inbNeg", None, 1), - lambda pkt: pkt.ext4 == 0), - ConditionalField(BitField("spare2", 0x0, 1), - lambda pkt: pkt.ext4 == 0), - - BitField("ext6", None, 1), - BitField("layer1Id", None, 2), - BitField("userInf", None, 4), - BitField("sync", None, 1), - - ConditionalField(BitField("ext7", None, 1), - lambda pkt: pkt.ext6 == 0), - ConditionalField(BitField("stopBit", None, 1), - lambda pkt: pkt.ext6 == 0), - ConditionalField(BitField("negoc", None, 1), - lambda pkt: pkt.ext6 == 0), - ConditionalField(BitField("nbDataBit", None, 1), - lambda pkt: pkt.ext6 == 0), - ConditionalField(BitField("userRate", None, 4), - lambda pkt: pkt.ext6 == 0), - - ConditionalField(BitField("ext8", None, 1), - lambda pkt: pkt.ext7 == 0), - ConditionalField(BitField("interRate", None, 2), - lambda pkt: pkt.ext7 == 0), - ConditionalField(BitField("nicTX", None, 1), - lambda pkt: pkt.ext7 == 0), - ConditionalField(BitField("nicRX", None, 1), - lambda pkt: pkt.ext7 == 0), - ConditionalField(BitField("parity", None, 3), - lambda pkt: pkt.ext7 == 0), - - ConditionalField(BitField("ext9", None, 1), - lambda pkt: pkt.ext8 == 0), - ConditionalField(BitField("connEle", None, 2), - lambda pkt: pkt.ext8 == 0), - ConditionalField(BitField("modemType", None, 5), - lambda pkt: pkt.ext8 == 0), - - ConditionalField(BitField("ext10", None, 1), - lambda pkt: pkt.ext9 == 0), - ConditionalField(BitField("otherModemType", None, 2), - lambda pkt: pkt.ext9 == 0), - ConditionalField(BitField("netUserRate", None, 5), - lambda pkt: pkt.ext9 == 0), - - ConditionalField(BitField("ext11", None, 1), - lambda pkt: pkt.ext10 == 0), - ConditionalField(BitField("chanCoding", None, 4), - lambda pkt: pkt.ext10 == 0), - ConditionalField(BitField("maxTrafficChan", None, 3), - lambda pkt: pkt.ext10 == 0), - - ConditionalField(BitField("ext12", None, 1), - lambda pkt: pkt.ext11 == 0), - ConditionalField(BitField("uimi", None, 3), - lambda pkt: pkt.ext11 == 0), - ConditionalField(BitField("airInterfaceUserRate", None, 4), - lambda pkt: pkt.ext11 == 0), - - ConditionalField(BitField("ext13", 0x1, 1), - lambda pkt: pkt.ext12 == 0), - ConditionalField(BitField("layer2Ch", None, 2), - lambda pkt: pkt.ext12 == 0), - ConditionalField(BitField("userInfoL2", 0x0, 5), - lambda pkt: pkt.ext12 == 0) - ] - - def post_build(self, p, pay): - aList = [] - a = [] - i = 0 - for i in range(0, len(self.fields_desc)): - aList.append(self.fields_desc[i].name) - for i in aList: - a.append(getattr(self, i)) - res = adapt(2, 15, a, self.fields_desc, 1) - if res[0] is not 0: - p = p[:-res[0]] - if self.lengthBC is None: - p = struct.pack(">B", len(p)-1) + p[1:] - return p + pay - - -class CallControlCapabilities(Packet): - """Call Control Capabilities Section 10.5.4.5a""" - name = "Call Control Capabilities" - fields_desc = [ - XByteField("lengthCCC", 0x3), - BitField("spare", 0x0, 6), - BitField("pcp", 0x0, 1), - BitField("dtmf", 0x0, 1) - ] - - -class CallState(Packet): - """Call State Section 10.5.4.6""" - name = "Call State" - fields_desc = [ - BitField("codingStd", 0x0, 2), - BitField("stateValue", 0x0, 6) - ] - - -# len 3 to 43 -class CalledPartyBcdNumber(Packet): - """Called party BCD number Section 10.5.4.7""" - name = "Called Party BCD Number" - fields_desc = [ - XByteField("lengthCPBN", None), - BitField("ext", 0x1, 1), - BitField("typeNb", 0x0, 3), - BitField("nbPlanId", 0x0, 4), - # optional - BitField("nbDigit2", None, 4), - BitField("nbDigit1", None, 4), - BitField("nbDigit4", None, 4), - BitField("nbDigit3", None, 4), - - BitField("nbDigit6", None, 4), - BitField("nbDigit5", None, 4), - BitField("nbDigit8", None, 4), - BitField("nbDigit7", None, 4), - - BitField("nbDigit10", None, 4), - BitField("nbDigit9", None, 4), - BitField("nbDigit12", None, 4), - BitField("nbDigit11", None, 4), - - BitField("nbDigit14", None, 4), - BitField("nbDigit13", None, 4), - BitField("nbDigit16", None, 4), - BitField("nbDigit15", None, 4), - - BitField("nbDigit18", None, 4), - BitField("nbDigit17", None, 4), - BitField("nbDigit20", None, 4), - BitField("nbDigit19", None, 4), - - BitField("nbDigit22", None, 4), - BitField("nbDigit21", None, 4), - BitField("nbDigit24", None, 4), - BitField("nbDigit23", None, 4), - - BitField("nbDigit26", None, 4), - BitField("nbDigit25", None, 4), - BitField("nbDigit28", None, 4), - BitField("nbDigit27", None, 4), - - BitField("nbDigit30", None, 4), - BitField("nbDigit29", None, 4), - BitField("nbDigit32", None, 4), - BitField("nbDigit31", None, 4), - - BitField("nbDigit34", None, 4), - BitField("nbDigit33", None, 4), - BitField("nbDigit36", None, 4), - BitField("nbDigit35", None, 4), - - BitField("nbDigit38", None, 4), - BitField("nbDigit37", None, 4), - BitField("nbDigit40", None, 4), - BitField("nbDigit39", None, 4), -# ^^^^^^ 20 first optional bytes ^^^^^^^^^^^^^^^ - BitField("nbDigit42", None, 4), - BitField("nbDigit41", None, 4), - BitField("nbDigit44", None, 4), - BitField("nbDigit43", None, 4), - - BitField("nbDigit46", None, 4), - BitField("nbDigit45", None, 4), - BitField("nbDigit48", None, 4), - BitField("nbDigit47", None, 4), - - BitField("nbDigit50", None, 4), - BitField("nbDigit49", None, 4), - BitField("nbDigit52", None, 4), - BitField("nbDigit51", None, 4), - - BitField("nbDigit54", None, 4), - BitField("nbDigit53", None, 4), - BitField("nbDigit56", None, 4), - BitField("nbDigit55", None, 4), - - BitField("nbDigit58", None, 4), - BitField("nbDigit57", None, 4), - BitField("nbDigit60", None, 4), - BitField("nbDigit59", None, 4), - - BitField("nbDigit62", None, 4), - BitField("nbDigit61", None, 4), - BitField("nbDigit64", None, 4), - BitField("nbDigit63", None, 4), - - BitField("nbDigit66", None, 4), - BitField("nbDigit65", None, 4), - BitField("nbDigit68", None, 4), - BitField("nbDigit67", None, 4), - - BitField("nbDigit70", None, 4), - BitField("nbDigit69", None, 4), - BitField("nbDigit72", None, 4), - BitField("nbDigit71", None, 4), - - BitField("nbDigit74", None, 4), - BitField("nbDigit73", None, 4), - BitField("nbDigit76", None, 4), - BitField("nbDigit75", None, 4), - - BitField("nbDigit78", None, 4), - BitField("nbDigit77", None, 4), - BitField("nbDigit80", None, 4), - BitField("nbDigit79", None, 4), - ] - - def post_build(self, p, pay): - aList = [] - a = [] - i = 0 - for i in range(0, len(self.fields_desc)): - aList.append(self.fields_desc[i].name) - for i in aList: - a.append(getattr(self, i)) - res = adapt(2, 42, a, self.fields_desc, 1) - if self.lengthCPBN is None: - p = struct.pack(">B", res[1]) + p[1:] - if res[0] is not 0: - p = p[:-res[0]] - return p + pay - - -# len 2 to 23 -class CalledPartySubaddress(Packet): - """Called party subaddress Section 10.5.4.8""" - name = "Called Party Subaddress" - fields_desc = [ - XByteField("lengthCPS", None), - # optional - BitField("ext", None, 1), - BitField("subAddr", None, 3), - BitField("oddEven", None, 1), - BitField("spare", None, 3), - - ByteField("subInfo0", None), - ByteField("subInfo1", None), - ByteField("subInfo2", None), - ByteField("subInfo3", None), - ByteField("subInfo4", None), - ByteField("subInfo5", None), - ByteField("subInfo6", None), - ByteField("subInfo7", None), - ByteField("subInfo8", None), - ByteField("subInfo9", None), - ByteField("subInfo10", None), - ByteField("subInfo11", None), - ByteField("subInfo12", None), - ByteField("subInfo13", None), - ByteField("subInfo14", None), - ByteField("subInfo15", None), - ByteField("subInfo16", None), - ByteField("subInfo17", None), - ByteField("subInfo18", None), - ByteField("subInfo19", None) - ] - - def post_build(self, p, pay): - aList = [] - a = [] - i = 0 - for i in range(0, len(self.fields_desc)): - aList.append(self.fields_desc[i].name) - for i in aList: - a.append(getattr(self, i)) - res = adapt(2, 23, a, self.fields_desc, 1) - if self.lengthCPS is None: - p = struct.pack(">B", res[1]) + p[1:] - if res[0] is not 0: - p = p[:-res[0]] - return p + pay - - -# len 3 to 14 -class CallingPartyBcdNumber(Packet): - """Called party subaddress Section 10.5.4.9""" - name = "Called Party Subaddress" - fields_desc = [ - XByteField("lengthCPBN", None), - BitField("ext", 0x1, 1), - BitField("typeNb", 0x0, 3), - BitField("nbPlanId", 0x0, 4), - # optional - ConditionalField(BitField("ext1", 0x1, 1), - lambda pkt: pkt.ext == 0), - ConditionalField(BitField("presId", None, 2), - lambda pkt: pkt.ext == 0), - ConditionalField(BitField("spare", None, 3), - lambda pkt: pkt.ext == 0), - ConditionalField(BitField("screenId", 0x0, 2), - lambda pkt: pkt.ext == 0), - - BitField("nbDigit2", None, 4), - BitField("nbDigit1", None, 4), - - BitField("nbDigit4", None, 4), - BitField("nbDigit3", None, 4), - - BitField("nbDigit6", None, 4), - BitField("nbDigit5", None, 4), - - BitField("nbDigit8", None, 4), - BitField("nbDigit7", None, 4), - - BitField("nbDigit10", None, 4), - BitField("nbDigit9", None, 4), - - BitField("nbDigit12", None, 4), - BitField("nbDigit11", None, 4), - - BitField("nbDigit14", None, 4), - BitField("nbDigit13", None, 4), - - BitField("nbDigit16", None, 4), - BitField("nbDigit15", None, 4), - - BitField("nbDigit18", None, 4), - BitField("nbDigit17", None, 4), - - BitField("nbDigit20", None, 4), - BitField("nbDigit19", None, 4), - ] - - def post_build(self, p, pay): - aList = [] - a = [] - i = 0 - for i in range(0, len(self.fields_desc)): - aList.append(self.fields_desc[i].name) - for i in aList: - a.append(getattr(self, i)) - res = adapt(2, 13, a, self.fields_desc, 1) - if res[0] is not 0: - p = p[:-res[0]] - if self.lengthCPBN is None: - p = struct.pack(">B", len(p)-1) + p[1:] - return p + pay - - -# len 2 to 23 -class CallingPartySubaddress(Packet): - """Calling party subaddress Section 10.5.4.10""" - name = "Calling Party Subaddress" - fields_desc = [ - XByteField("lengthCPS", None), - # optional - BitField("ext1", None, 1), - BitField("typeAddr", None, 3), - BitField("oddEven", None, 1), - BitField("spare", None, 3), - - ByteField("subInfo0", None), - ByteField("subInfo1", None), - ByteField("subInfo2", None), - ByteField("subInfo3", None), - ByteField("subInfo4", None), - ByteField("subInfo5", None), - ByteField("subInfo6", None), - ByteField("subInfo7", None), - ByteField("subInfo8", None), - ByteField("subInfo9", None), - ByteField("subInfo10", None), - ByteField("subInfo11", None), - ByteField("subInfo12", None), - ByteField("subInfo13", None), - ByteField("subInfo14", None), - ByteField("subInfo15", None), - ByteField("subInfo16", None), - ByteField("subInfo17", None), - ByteField("subInfo18", None), - ByteField("subInfo19", None) - ] - - def post_build(self, p, pay): - aList = [] - a = [] - i = 0 - for i in range(0, len(self.fields_desc)): - aList.append(self.fields_desc[i].name) - for i in aList: - a.append(getattr(self, i)) - res = adapt(1, 22, a, self.fields_desc, 1) - if self.lengthCPS is None: - p = struct.pack(">B", res[1]) + p[1:] - if res[0] is not 0: - p = p[:-res[0]] - return p + pay - - -# len 4 to 32 -class Cause(Packet): - """Cause Section 10.5.4.11""" - name = "Cause" - fields_desc = [ - - XByteField("lengthC", None), - - BitField("ext", 0x1, 1), - BitField("codingStd", 0x0, 2), - BitField("spare", 0x0, 1), - BitField("location", 0x0, 4), - - ConditionalField(BitField("ext1", 0x1, 1), - lambda pkt: pkt.ext == 0), - ConditionalField(BitField("recommendation", 0x1, 7), - lambda pkt: pkt.ext == 0), - # optional - BitField("ext2", None, 1), - BitField("causeValue", None, 7), - - ByteField("diagnositc0", None), - ByteField("diagnositc1", None), - ByteField("diagnositc2", None), - ByteField("diagnositc3", None), - ByteField("diagnositc4", None), - ByteField("diagnositc5", None), - ByteField("diagnositc6", None), - ByteField("diagnositc7", None), - ByteField("diagnositc8", None), - ByteField("diagnositc9", None), - ByteField("diagnositc10", None), - ByteField("diagnositc11", None), - ByteField("diagnositc12", None), - ByteField("diagnositc13", None), - ByteField("diagnositc14", None), - ByteField("diagnositc15", None), - ByteField("diagnositc16", None), - ByteField("diagnositc17", None), - ByteField("diagnositc18", None), - ByteField("diagnositc19", None), - ByteField("diagnositc20", None), - ByteField("diagnositc21", None), - ByteField("diagnositc22", None), - ByteField("diagnositc23", None), - ByteField("diagnositc24", None), - ByteField("diagnositc25", None), - ByteField("diagnositc26", None), - ] - - def post_build(self, p, pay): - aList = [] - a = [] - i = 0 - for i in range(0, len(self.fields_desc)): - aList.append(self.fields_desc[i].name) - for i in aList: - a.append(getattr(self, i)) - res = adapt(3, 31, a, self.fields_desc, 1) - if res[0] is not 0: - p = p[:-res[0]] - if self.lengthC is None: - p = struct.pack(">B", len(p)-1) + p[1:] - return p + pay - - -class ClirSuppression(Packet): - """CLIR suppression Section 10.5.4.11a""" - name = "Clir Suppression" - fields_desc = [ - ] - - -class ClirInvocation(Packet): - """CLIR invocation Section 10.5.4.11b""" - name = "Clir Invocation" - fields_desc = [ - ] - - -class CongestionLevel(Packet): - """Congestion level Section 10.5.4.12""" - name = "Congestion Level" - fields_desc = [ - BitField("notDef", 0x0, 4) # not defined by the std - ] - - -# len 3 to 14 -class ConnectedNumber(Packet): - """Connected number Section 10.5.4.13""" - name = "Connected Number" - fields_desc = [ - - XByteField("lengthCN", None), - - BitField("ext", 0x1, 1), - BitField("typeNb", 0x0, 3), - BitField("typePlanId", 0x0, 4), - # optional - ConditionalField(BitField("ext1", 0x1, 1), - lambda pkt: pkt.ext == 0), - ConditionalField(BitField("presId", None, 2), - lambda pkt: pkt.ext == 0), - ConditionalField(BitField("spare", None, 3), - lambda pkt: pkt.ext == 0), - ConditionalField(BitField("screenId", None, 2), - lambda pkt: pkt.ext == 0), - - BitField("nbDigit2", None, 4), - BitField("nbDigit1", None, 4), - - BitField("nbDigit4", None, 4), - BitField("nbDigit3", None, 4), - - BitField("nbDigit6", None, 4), - BitField("nbDigit5", None, 4), - - BitField("nbDigit8", None, 4), - BitField("nbDigit7", None, 4), - - BitField("nbDigit10", None, 4), - BitField("nbDigit9", None, 4), - - BitField("nbDigit12", None, 4), - BitField("nbDigit11", None, 4), - - BitField("nbDigit14", None, 4), - BitField("nbDigit13", None, 4), - - BitField("nbDigit16", None, 4), - BitField("nbDigit15", None, 4), - - BitField("nbDigit18", None, 4), - BitField("nbDigit17", None, 4), - - BitField("nbDigit20", None, 4), - BitField("nbDigit19", None, 4) - ] - - def post_build(self, p, pay): - aList = [] - a = [] - i = 0 - for i in range(0, len(self.fields_desc)): - aList.append(self.fields_desc[i].name) - for i in aList: - a.append(getattr(self, i)) - res = adapt(2, 13, a, self.fields_desc, 1) - if res[0] is not 0: - p = p[:-res[0]] - if self.lengthCN is None: - p = struct.pack(">B", len(p)-1) + p[1:] - return p + pay - - -# len 2 to 23 -class ConnectedSubaddress(Packet): - """Connected subaddress Section 10.5.4.14""" - name = "Connected Subaddress" - fields_desc = [ - - XByteField("lengthCS", None), - # optional - BitField("ext", None, 1), - BitField("typeOfSub", None, 3), - BitField("oddEven", None, 1), - BitField("spare", None, 3), - - ByteField("subInfo0", None), - ByteField("subInfo1", None), - ByteField("subInfo2", None), - ByteField("subInfo3", None), - ByteField("subInfo4", None), - ByteField("subInfo5", None), - ByteField("subInfo6", None), - ByteField("subInfo7", None), - ByteField("subInfo8", None), - ByteField("subInfo9", None), - ByteField("subInfo10", None), - ByteField("subInfo11", None), - ByteField("subInfo12", None), - ByteField("subInfo13", None), - ByteField("subInfo14", None), - ByteField("subInfo15", None), - ByteField("subInfo16", None), - ByteField("subInfo17", None), - ByteField("subInfo18", None), - ByteField("subInfo19", None) - ] - - def post_build(self, p, pay): - aList = [] - a = [] - i = 0 - for i in range(0, len(self.fields_desc)): - aList.append(self.fields_desc[i].name) - for i in aList: - a.append(getattr(self, i)) - res = adapt(1, 22, a, self.fields_desc, 1) - if self.lengthCS is None: - p = struct.pack(">B", res[1]) + p[1:] - if res[0] is not 0: - p = p[:-res[0]] - return p + pay - - -# len 2 to L3 (251) (done) -class Facility(Packet): - """Facility Section 10.5.4.15""" - name = "Facility" - fields_desc = [ - XByteField("lengthF", None), - # optional - ByteField("facilityInfo1", None), - ByteField("facilityInfo2", None), - ByteField("facilityInfo3", None), - ByteField("facilityInfo4", None), - ByteField("facilityInfo5", None), - ByteField("facilityInfo6", None), - ByteField("facilityInfo7", None), - ByteField("facilityInfo8", None), - ByteField("facilityInfo9", None), - ByteField("facilityInfo10", None), - ByteField("facilityInfo11", None), - ByteField("facilityInfo12", None), - ByteField("facilityInfo13", None), - ByteField("facilityInfo14", None), - ByteField("facilityInfo15", None), - ByteField("facilityInfo16", None), - ByteField("facilityInfo17", None), - ByteField("facilityInfo18", None), - ByteField("facilityInfo19", None), - ByteField("facilityInfo20", None), - ByteField("facilityInfo21", None), - ByteField("facilityInfo22", None), - ByteField("facilityInfo23", None), - ByteField("facilityInfo24", None), - ByteField("facilityInfo25", None), - ByteField("facilityInfo26", None), - ByteField("facilityInfo27", None), - ByteField("facilityInfo28", None), - ByteField("facilityInfo29", None), - ByteField("facilityInfo30", None), - ByteField("facilityInfo31", None), - ByteField("facilityInfo32", None), - ByteField("facilityInfo33", None), - ByteField("facilityInfo34", None), - ByteField("facilityInfo35", None), - ByteField("facilityInfo36", None), - ByteField("facilityInfo37", None), - ByteField("facilityInfo38", None), - ByteField("facilityInfo39", None), - ByteField("facilityInfo40", None), - ByteField("facilityInfo41", None), - ByteField("facilityInfo42", None), - ByteField("facilityInfo43", None), - ByteField("facilityInfo44", None), - ByteField("facilityInfo45", None), - ByteField("facilityInfo46", None), - ByteField("facilityInfo47", None), - ByteField("facilityInfo48", None), - ByteField("facilityInfo49", None), - ByteField("facilityInfo50", None), - ByteField("facilityInfo51", None), - ByteField("facilityInfo52", None), - ByteField("facilityInfo53", None), - ByteField("facilityInfo54", None), - ByteField("facilityInfo55", None), - ByteField("facilityInfo56", None), - ByteField("facilityInfo57", None), - ByteField("facilityInfo58", None), - ByteField("facilityInfo59", None), - ByteField("facilityInfo60", None), - ByteField("facilityInfo61", None), - ByteField("facilityInfo62", None), - ByteField("facilityInfo63", None), - ByteField("facilityInfo64", None), - ByteField("facilityInfo65", None), - ByteField("facilityInfo66", None), - ByteField("facilityInfo67", None), - ByteField("facilityInfo68", None), - ByteField("facilityInfo69", None), - ByteField("facilityInfo70", None), - ByteField("facilityInfo71", None), - ByteField("facilityInfo72", None), - ByteField("facilityInfo73", None), - ByteField("facilityInfo74", None), - ByteField("facilityInfo75", None), - ByteField("facilityInfo76", None), - ByteField("facilityInfo77", None), - ByteField("facilityInfo78", None), - ByteField("facilityInfo79", None), - ByteField("facilityInfo80", None), - ByteField("facilityInfo81", None), - ByteField("facilityInfo82", None), - ByteField("facilityInfo83", None), - ByteField("facilityInfo84", None), - ByteField("facilityInfo85", None), - ByteField("facilityInfo86", None), - ByteField("facilityInfo87", None), - ByteField("facilityInfo88", None), - ByteField("facilityInfo89", None), - ByteField("facilityInfo90", None), - ByteField("facilityInfo91", None), - ByteField("facilityInfo92", None), - ByteField("facilityInfo93", None), - ByteField("facilityInfo94", None), - ByteField("facilityInfo95", None), - ByteField("facilityInfo96", None), - ByteField("facilityInfo97", None), - ByteField("facilityInfo98", None), - ByteField("facilityInfo99", None), - ByteField("facilityInfo100", None), - ByteField("facilityInfo101", None), - ByteField("facilityInfo102", None), - ByteField("facilityInfo103", None), - ByteField("facilityInfo104", None), - ByteField("facilityInfo105", None), - ByteField("facilityInfo106", None), - ByteField("facilityInfo107", None), - ByteField("facilityInfo108", None), - ByteField("facilityInfo109", None), - ByteField("facilityInfo110", None), - ByteField("facilityInfo111", None), - ByteField("facilityInfo112", None), - ByteField("facilityInfo113", None), - ByteField("facilityInfo114", None), - ByteField("facilityInfo115", None), - ByteField("facilityInfo116", None), - ByteField("facilityInfo117", None), - ByteField("facilityInfo118", None), - ByteField("facilityInfo119", None), - ByteField("facilityInfo120", None), - ByteField("facilityInfo121", None), - ByteField("facilityInfo122", None), - ByteField("facilityInfo123", None), - ByteField("facilityInfo124", None), - ByteField("facilityInfo125", None), - ByteField("facilityInfo126", None), - ByteField("facilityInfo127", None), - ByteField("facilityInfo128", None), - ByteField("facilityInfo129", None), - ByteField("facilityInfo130", None), - ByteField("facilityInfo131", None), - ByteField("facilityInfo132", None), - ByteField("facilityInfo133", None), - ByteField("facilityInfo134", None), - ByteField("facilityInfo135", None), - ByteField("facilityInfo136", None), - ByteField("facilityInfo137", None), - ByteField("facilityInfo138", None), - ByteField("facilityInfo139", None), - ByteField("facilityInfo140", None), - ByteField("facilityInfo141", None), - ByteField("facilityInfo142", None), - ByteField("facilityInfo143", None), - ByteField("facilityInfo144", None), - ByteField("facilityInfo145", None), - ByteField("facilityInfo146", None), - ByteField("facilityInfo147", None), - ByteField("facilityInfo148", None), - ByteField("facilityInfo149", None), - ByteField("facilityInfo150", None), - ByteField("facilityInfo151", None), - ByteField("facilityInfo152", None), - ByteField("facilityInfo153", None), - ByteField("facilityInfo154", None), - ByteField("facilityInfo155", None), - ByteField("facilityInfo156", None), - ByteField("facilityInfo157", None), - ByteField("facilityInfo158", None), - ByteField("facilityInfo159", None), - ByteField("facilityInfo160", None), - ByteField("facilityInfo161", None), - ByteField("facilityInfo162", None), - ByteField("facilityInfo163", None), - ByteField("facilityInfo164", None), - ByteField("facilityInfo165", None), - ByteField("facilityInfo166", None), - ByteField("facilityInfo167", None), - ByteField("facilityInfo168", None), - ByteField("facilityInfo169", None), - ByteField("facilityInfo170", None), - ByteField("facilityInfo171", None), - ByteField("facilityInfo172", None), - ByteField("facilityInfo173", None), - ByteField("facilityInfo174", None), - ByteField("facilityInfo175", None), - ByteField("facilityInfo176", None), - ByteField("facilityInfo177", None), - ByteField("facilityInfo178", None), - ByteField("facilityInfo179", None), - ByteField("facilityInfo180", None), - ByteField("facilityInfo181", None), - ByteField("facilityInfo182", None), - ByteField("facilityInfo183", None), - ByteField("facilityInfo184", None), - ByteField("facilityInfo185", None), - ByteField("facilityInfo186", None), - ByteField("facilityInfo187", None), - ByteField("facilityInfo188", None), - ByteField("facilityInfo189", None), - ByteField("facilityInfo190", None), - ByteField("facilityInfo191", None), - ByteField("facilityInfo192", None), - ByteField("facilityInfo193", None), - ByteField("facilityInfo194", None), - ByteField("facilityInfo195", None), - ByteField("facilityInfo196", None), - ByteField("facilityInfo197", None), - ByteField("facilityInfo198", None), - ByteField("facilityInfo199", None), - ByteField("facilityInfo200", None), - ByteField("facilityInfo201", None), - ByteField("facilityInfo202", None), - ByteField("facilityInfo203", None), - ByteField("facilityInfo204", None), - ByteField("facilityInfo205", None), - ByteField("facilityInfo206", None), - ByteField("facilityInfo207", None), - ByteField("facilityInfo208", None), - ByteField("facilityInfo209", None), - ByteField("facilityInfo210", None), - ByteField("facilityInfo211", None), - ByteField("facilityInfo212", None), - ByteField("facilityInfo213", None), - ByteField("facilityInfo214", None), - ByteField("facilityInfo215", None), - ByteField("facilityInfo216", None), - ByteField("facilityInfo217", None), - ByteField("facilityInfo218", None), - ByteField("facilityInfo219", None), - ByteField("facilityInfo220", None), - ByteField("facilityInfo221", None), - ByteField("facilityInfo222", None), - ByteField("facilityInfo223", None), - ByteField("facilityInfo224", None), - ByteField("facilityInfo225", None), - ByteField("facilityInfo226", None), - ByteField("facilityInfo227", None), - ByteField("facilityInfo228", None), - ByteField("facilityInfo229", None), - ByteField("facilityInfo230", None), - ByteField("facilityInfo231", None), - ByteField("facilityInfo232", None), - ByteField("facilityInfo233", None), - ByteField("facilityInfo234", None), - ByteField("facilityInfo235", None), - ByteField("facilityInfo236", None), - ByteField("facilityInfo237", None), - ByteField("facilityInfo238", None), - ByteField("facilityInfo239", None), - ByteField("facilityInfo240", None), - ByteField("facilityInfo241", None), - ByteField("facilityInfo242", None), - ByteField("facilityInfo243", None), - ByteField("facilityInfo244", None), - ByteField("facilityInfo245", None), - ByteField("facilityInfo246", None), - ByteField("facilityInfo247", None), - ByteField("facilityInfo248", None), - ByteField("facilityInfo249", None) - ] - - def post_build(self, p, pay): - aList = [] - i = 0 - for i in range(0, len(self.fields_desc)): - aList.append(self.fields_desc[i].name) - a = [] - for i in aList: - a.append(getattr(self, i)) - res = adapt(7, 250, a, self.fields_desc, 1) - if self.lengthF is None: - p = struct.pack(">B", res[1]) + p[1:] - if res[0] is not 0: - p = p[:-res[0]] - return p + pay - - -#len 2 to 5 -class HighLayerCompatibility(Packet): - """High layer compatibility Section 10.5.4.16""" - name = "High Layer Compatibility" - fields_desc = [ - - XByteField("lengthHLC", None), - # optional - BitField("ext", None, 1), - BitField("codingStd", None, 2), - BitField("interpret", None, 3), - BitField("presMeth", None, 2), - - BitField("ext1", None, 1), - BitField("highLayerId", None, 7), - - ConditionalField(BitField("ext2", 0x1, 1), - lambda pkt: pkt.ext1 == 0), - ConditionalField(BitField("exHiLayerId", 0x0, 7), - lambda pkt: pkt.ext1 == 0), - ] - - def post_build(self, p, pay): - aList = [] - i = 0 - for i in range(0, len(self.fields_desc)): - aList.append(self.fields_desc[i].name) - a = [] - for i in aList: - a.append(getattr(self, i)) - res = adapt(1, 4, a, self.fields_desc, 1) - if res[0] is not 0: - p = p[:-res[0]] - if self.lengthHLC is None: - p = struct.pack(">B", len(p)-1) + p[1:] - return p + pay -# -# 10.5.4.16.1 Static conditions for the high layer -# compatibility IE contents -# - - -class KeypadFacility(Packet): - """Keypad facility Section 10.5.4.17""" - name = "Keypad Facility" - fields_desc = [ - BitField("spare", 0x0, 1), - BitField("keyPadInfo", 0x0, 7) - ] - - -# len 2 to 15 -class LowLayerCompatibility(Packet): - """Low layer compatibility Section 10.5.4.18""" - name = "Low Layer Compatibility" - fields_desc = [ - - XByteField("lengthLLC", None), - # optional - ByteField("rest0", None), - ByteField("rest1", None), - ByteField("rest2", None), - ByteField("rest3", None), - ByteField("rest4", None), - ByteField("rest5", None), - ByteField("rest6", None), - ByteField("rest7", None), - ByteField("rest8", None), - ByteField("rest9", None), - ByteField("rest10", None), - ByteField("rest11", None), - ByteField("rest12", None) - ] - - def post_build(self, p, pay): - aList = [] - i = 0 - for i in range(0, len(self.fields_desc)): - aList.append(self.fields_desc[i].name) - a = [] - for i in aList: - a.append(getattr(self, i)) - res = adapt(1, 14, a, self.fields_desc, 1) - if self.lengthLLC is None: - p = struct.pack(">B", res[1]) + p[1:] - if res[0] is not 0: - p = p[:-res[0]] - return p + pay - - -class MoreData(Packet): - """More data Section 10.5.4.19""" - name = "More Data" - fields_desc = [ - ] - - -class NotificationIndicator(Packet): - """Notification indicator Section 10.5.4.20""" - name = "Notification Indicator" - fields_desc = [ - BitField("ext1", 0x1, 1), - BitField("notifDesc", 0x0, 7) - ] - - -class ProgressIndicator(Packet): - """Progress indicator Section 10.5.4.21""" - name = "Progress Indicator" - fields_desc = [ - XByteField("lengthPI", 0x2), - BitField("ext", 0x1, 1), - BitField("codingStd", 0x0, 2), - BitField("spare", 0x0, 1), - BitField("location", 0x0, 4), - BitField("ext1", 0x1, 1), - BitField("progressDesc", 0x0, 7) - ] - - -class RecallType(Packet): - """Recall type $(CCBS)$ Section 10.5.4.21a""" - name = "Recall Type $(CCBS)$" - fields_desc = [ - BitField("spare", 0x0, 5), - BitField("recallType", 0x0, 3) - ] - - -# len 3 to 19 -class RedirectingPartyBcdNumber(Packet): - """Redirecting party BCD number Section 10.5.4.21b""" - name = "Redirecting Party BCD Number" - fields_desc = [ - - XByteField("lengthRPBN", None), - - BitField("ext", 0x1, 1), - BitField("typeNb", 0x0, 3), - BitField("numberingPlan", 0x0, 4), - # optional - ConditionalField(BitField("ext1", 0x1, 1), - lambda pkt: pkt.ext == 0), - ConditionalField(BitField("presId", 0x0, 2), - lambda pkt: pkt.ext == 0), - ConditionalField(BitField("spare", 0x0, 3), - lambda pkt: pkt.ext == 0), - ConditionalField(BitField("screenId", 0x0, 2), - lambda pkt: pkt.ext == 0), - - BitField("nbDigit2", None, 4), - BitField("nbDigit1", None, 4), - - BitField("nbDigit4", None, 4), - BitField("nbDigit3", None, 4), - - BitField("nbDigit6", None, 4), - BitField("nbDigit5", None, 4), - - BitField("nbDigit8", None, 4), - BitField("nbDigit7", None, 4), - - BitField("nbDigit10", None, 4), - BitField("nbDigit9", None, 4), - - BitField("nbDigit12", None, 4), - BitField("nbDigit11", None, 4), - - BitField("nbDigit14", None, 4), - BitField("nbDigit13", None, 4), - - BitField("nbDigit16", None, 4), - BitField("nbDigit15", None, 4), - - BitField("nbDigit18", None, 4), - BitField("nbDigit17", None, 4), - - BitField("nbDigit20", None, 4), - BitField("nbDigit19", None, 4), - - BitField("nbDigit22", None, 4), - BitField("nbDigit21", None, 4), - - BitField("nbDigit24", None, 4), - BitField("nbDigit23", None, 4), - - BitField("nbDigit26", None, 4), - BitField("nbDigit25", None, 4), - - BitField("nbDigit28", None, 4), - BitField("nbDigit27", None, 4), - - BitField("nbDigit30", None, 4), - BitField("nbDigit29", None, 4), - ] - - def post_build(self, p, pay): - aList = [] - i = 0 - for i in range(0, len(self.fields_desc)): - aList.append(self.fields_desc[i].name) - a = [] - for i in aList: - a.append(getattr(self, i)) - res = adapt(2, 18, a, self.fields_desc, 1) - if res[0] is not 0: - p = p[:-res[0]] - if self.lengthRPBN is None: - p = struct.pack(">B", len(p)-1) + p[1:] - return p + pay - - -# length 2 to 23 -class RedirectingPartySubaddress(Packet): - """Redirecting party subaddress Section 10.5.4.21c""" - name = "Redirecting Party BCD Number" - fields_desc = [ - - XByteField("lengthRPS", None), - # optional - BitField("ext", None, 1), - BitField("typeSub", None, 3), - BitField("oddEven", None, 1), - BitField("spare", None, 3), - - ByteField("subInfo0", None), - ByteField("subInfo1", None), - ByteField("subInfo2", None), - ByteField("subInfo3", None), - ByteField("subInfo4", None), - ByteField("subInfo5", None), - ByteField("subInfo6", None), - ByteField("subInfo7", None), - ByteField("subInfo8", None), - ByteField("subInfo9", None), - ByteField("subInfo10", None), - ByteField("subInfo11", None), - ByteField("subInfo12", None), - ByteField("subInfo13", None), - ByteField("subInfo14", None), - ByteField("subInfo15", None), - ByteField("subInfo16", None), - ByteField("subInfo17", None), - ByteField("subInfo18", None), - ByteField("subInfo19", None) - ] - - def post_build(self, p, pay): - aList = [] - i = 0 - for i in range(0, len(self.fields_desc)): - aList.append(self.fields_desc[i].name) - a = [] - for i in aList: - a.append(getattr(self, i)) - res = adapt(1, 22, a, self.fields_desc, 1) - if self.lengthRPS is None: - p = struct.pack(">B", res[1]) + p[1:] - if res[0] is not 0: - p = p[:-res[0]] - return p + pay - - -class RepeatIndicator(Packet): - """Repeat indicator Section 10.5.4.22""" - name = "Repeat Indicator" - fields_desc = [ - BitField("repeatIndic", 0x0, 4) - ] - - -# no upper length min 2(max for L3) (251) -class SetupContainer(Packet): - """SETUP Container $(CCBS)$ Section 10.5.4.22b""" - name = "Setup Container $(CCBS)$" - fields_desc = [ - XByteField("lengthSC", None), - # optional - ByteField("mess1", None), - ByteField("mess2", None), - ByteField("mess3", None), - ByteField("mess4", None), - ByteField("mess5", None), - ByteField("mess6", None), - ByteField("mess7", None), - ByteField("mess8", None), - ByteField("mess9", None), - ByteField("mess10", None), - ByteField("mess11", None), - ByteField("mess12", None), - ByteField("mess13", None), - ByteField("mess14", None), - ByteField("mess15", None), - ByteField("mess16", None), - ByteField("mess17", None), - ByteField("mess18", None), - ByteField("mess19", None), - ByteField("mess20", None), - ByteField("mess21", None), - ByteField("mess22", None), - ByteField("mess23", None), - ByteField("mess24", None), - ByteField("mess25", None), - ByteField("mess26", None), - ByteField("mess27", None), - ByteField("mess28", None), - ByteField("mess29", None), - ByteField("mess30", None), - ByteField("mess31", None), - ByteField("mess32", None), - ByteField("mess33", None), - ByteField("mess34", None), - ByteField("mess35", None), - ByteField("mess36", None), - ByteField("mess37", None), - ByteField("mess38", None), - ByteField("mess39", None), - ByteField("mess40", None), - ByteField("mess41", None), - ByteField("mess42", None), - ByteField("mess43", None), - ByteField("mess44", None), - ByteField("mess45", None), - ByteField("mess46", None), - ByteField("mess47", None), - ByteField("mess48", None), - ByteField("mess49", None), - ByteField("mess50", None), - ByteField("mess51", None), - ByteField("mess52", None), - ByteField("mess53", None), - ByteField("mess54", None), - ByteField("mess55", None), - ByteField("mess56", None), - ByteField("mess57", None), - ByteField("mess58", None), - ByteField("mess59", None), - ByteField("mess60", None), - ByteField("mess61", None), - ByteField("mess62", None), - ByteField("mess63", None), - ByteField("mess64", None), - ByteField("mess65", None), - ByteField("mess66", None), - ByteField("mess67", None), - ByteField("mess68", None), - ByteField("mess69", None), - ByteField("mess70", None), - ByteField("mess71", None), - ByteField("mess72", None), - ByteField("mess73", None), - ByteField("mess74", None), - ByteField("mess75", None), - ByteField("mess76", None), - ByteField("mess77", None), - ByteField("mess78", None), - ByteField("mess79", None), - ByteField("mess80", None), - ByteField("mess81", None), - ByteField("mess82", None), - ByteField("mess83", None), - ByteField("mess84", None), - ByteField("mess85", None), - ByteField("mess86", None), - ByteField("mess87", None), - ByteField("mess88", None), - ByteField("mess89", None), - ByteField("mess90", None), - ByteField("mess91", None), - ByteField("mess92", None), - ByteField("mess93", None), - ByteField("mess94", None), - ByteField("mess95", None), - ByteField("mess96", None), - ByteField("mess97", None), - ByteField("mess98", None), - ByteField("mess99", None), - ByteField("mess100", None), - ByteField("mess101", None), - ByteField("mess102", None), - ByteField("mess103", None), - ByteField("mess104", None), - ByteField("mess105", None), - ByteField("mess106", None), - ByteField("mess107", None), - ByteField("mess108", None), - ByteField("mess109", None), - ByteField("mess110", None), - ByteField("mess111", None), - ByteField("mess112", None), - ByteField("mess113", None), - ByteField("mess114", None), - ByteField("mess115", None), - ByteField("mess116", None), - ByteField("mess117", None), - ByteField("mess118", None), - ByteField("mess119", None), - ByteField("mess120", None), - ByteField("mess121", None), - ByteField("mess122", None), - ByteField("mess123", None), - ByteField("mess124", None), - ByteField("mess125", None), - ByteField("mess126", None), - ByteField("mess127", None), - ByteField("mess128", None), - ByteField("mess129", None), - ByteField("mess130", None), - ByteField("mess131", None), - ByteField("mess132", None), - ByteField("mess133", None), - ByteField("mess134", None), - ByteField("mess135", None), - ByteField("mess136", None), - ByteField("mess137", None), - ByteField("mess138", None), - ByteField("mess139", None), - ByteField("mess140", None), - ByteField("mess141", None), - ByteField("mess142", None), - ByteField("mess143", None), - ByteField("mess144", None), - ByteField("mess145", None), - ByteField("mess146", None), - ByteField("mess147", None), - ByteField("mess148", None), - ByteField("mess149", None), - ByteField("mess150", None), - ByteField("mess151", None), - ByteField("mess152", None), - ByteField("mess153", None), - ByteField("mess154", None), - ByteField("mess155", None), - ByteField("mess156", None), - ByteField("mess157", None), - ByteField("mess158", None), - ByteField("mess159", None), - ByteField("mess160", None), - ByteField("mess161", None), - ByteField("mess162", None), - ByteField("mess163", None), - ByteField("mess164", None), - ByteField("mess165", None), - ByteField("mess166", None), - ByteField("mess167", None), - ByteField("mess168", None), - ByteField("mess169", None), - ByteField("mess170", None), - ByteField("mess171", None), - ByteField("mess172", None), - ByteField("mess173", None), - ByteField("mess174", None), - ByteField("mess175", None), - ByteField("mess176", None), - ByteField("mess177", None), - ByteField("mess178", None), - ByteField("mess179", None), - ByteField("mess180", None), - ByteField("mess181", None), - ByteField("mess182", None), - ByteField("mess183", None), - ByteField("mess184", None), - ByteField("mess185", None), - ByteField("mess186", None), - ByteField("mess187", None), - ByteField("mess188", None), - ByteField("mess189", None), - ByteField("mess190", None), - ByteField("mess191", None), - ByteField("mess192", None), - ByteField("mess193", None), - ByteField("mess194", None), - ByteField("mess195", None), - ByteField("mess196", None), - ByteField("mess197", None), - ByteField("mess198", None), - ByteField("mess199", None), - ByteField("mess200", None), - ByteField("mess201", None), - ByteField("mess202", None), - ByteField("mess203", None), - ByteField("mess204", None), - ByteField("mess205", None), - ByteField("mess206", None), - ByteField("mess207", None), - ByteField("mess208", None), - ByteField("mess209", None), - ByteField("mess210", None), - ByteField("mess211", None), - ByteField("mess212", None), - ByteField("mess213", None), - ByteField("mess214", None), - ByteField("mess215", None), - ByteField("mess216", None), - ByteField("mess217", None), - ByteField("mess218", None), - ByteField("mess219", None), - ByteField("mess220", None), - ByteField("mess221", None), - ByteField("mess222", None), - ByteField("mess223", None), - ByteField("mess224", None), - ByteField("mess225", None), - ByteField("mess226", None), - ByteField("mess227", None), - ByteField("mess228", None), - ByteField("mess229", None), - ByteField("mess230", None), - ByteField("mess231", None), - ByteField("mess232", None), - ByteField("mess233", None), - ByteField("mess234", None), - ByteField("mess235", None), - ByteField("mess236", None), - ByteField("mess237", None), - ByteField("mess238", None), - ByteField("mess239", None), - ByteField("mess240", None), - ByteField("mess241", None), - ByteField("mess242", None), - ByteField("mess243", None), - ByteField("mess244", None), - ByteField("mess245", None), - ByteField("mess246", None), - ByteField("mess247", None), - ByteField("mess248", None), - ByteField("mess249", None), - ] - - def post_build(self, p, pay): - aList = [] - i = 0 - for i in range(0, len(self.fields_desc)): - aList.append(self.fields_desc[i].name) - a = [] - for i in aList: - a.append(getattr(self, i)) - res = adapt(1, 250, a, self.fields_desc, 1) - if self.lengthSC is None: - p = struct.pack(">B", res[1]) + p[1:] - if res[0] is not 0: - p = p[:-res[0]] - return p + pay - - -class Signal(Packet): - """Signal Section 10.5.4.23""" - name = "Signal" - fields_desc = [ - ByteField("sigValue", 0x0) - ] - - -# length 2 to max for L3 message (251) -class SsVersionIndicator(Packet): - """SS Version Indicator Section 10.5.4.24""" - name = "SS Version Indicator" - fields_desc = [ - XByteField("lengthSVI", None), - # optional - ByteField("info1", None), - ByteField("info2", None), - ByteField("info3", None), - ByteField("info4", None), - ByteField("info5", None), - ByteField("info6", None), - ByteField("info7", None), - ByteField("info8", None), - ByteField("info9", None), - ByteField("info10", None), - ByteField("info11", None), - ByteField("info12", None), - ByteField("info13", None), - ByteField("info14", None), - ByteField("info15", None), - ByteField("info16", None), - ByteField("info17", None), - ByteField("info18", None), - ByteField("info19", None), - ByteField("info20", None), - ByteField("info21", None), - ByteField("info22", None), - ByteField("info23", None), - ByteField("info24", None), - ByteField("info25", None), - ByteField("info26", None), - ByteField("info27", None), - ByteField("info28", None), - ByteField("info29", None), - ByteField("info30", None), - ByteField("info31", None), - ByteField("info32", None), - ByteField("info33", None), - ByteField("info34", None), - ByteField("info35", None), - ByteField("info36", None), - ByteField("info37", None), - ByteField("info38", None), - ByteField("info39", None), - ByteField("info40", None), - ByteField("info41", None), - ByteField("info42", None), - ByteField("info43", None), - ByteField("info44", None), - ByteField("info45", None), - ByteField("info46", None), - ByteField("info47", None), - ByteField("info48", None), - ByteField("info49", None), - ByteField("info50", None), - ByteField("info51", None), - ByteField("info52", None), - ByteField("info53", None), - ByteField("info54", None), - ByteField("info55", None), - ByteField("info56", None), - ByteField("info57", None), - ByteField("info58", None), - ByteField("info59", None), - ByteField("info60", None), - ByteField("info61", None), - ByteField("info62", None), - ByteField("info63", None), - ByteField("info64", None), - ByteField("info65", None), - ByteField("info66", None), - ByteField("info67", None), - ByteField("info68", None), - ByteField("info69", None), - ByteField("info70", None), - ByteField("info71", None), - ByteField("info72", None), - ByteField("info73", None), - ByteField("info74", None), - ByteField("info75", None), - ByteField("info76", None), - ByteField("info77", None), - ByteField("info78", None), - ByteField("info79", None), - ByteField("info80", None), - ByteField("info81", None), - ByteField("info82", None), - ByteField("info83", None), - ByteField("info84", None), - ByteField("info85", None), - ByteField("info86", None), - ByteField("info87", None), - ByteField("info88", None), - ByteField("info89", None), - ByteField("info90", None), - ByteField("info91", None), - ByteField("info92", None), - ByteField("info93", None), - ByteField("info94", None), - ByteField("info95", None), - ByteField("info96", None), - ByteField("info97", None), - ByteField("info98", None), - ByteField("info99", None), - ByteField("info100", None), - ByteField("info101", None), - ByteField("info102", None), - ByteField("info103", None), - ByteField("info104", None), - ByteField("info105", None), - ByteField("info106", None), - ByteField("info107", None), - ByteField("info108", None), - ByteField("info109", None), - ByteField("info110", None), - ByteField("info111", None), - ByteField("info112", None), - ByteField("info113", None), - ByteField("info114", None), - ByteField("info115", None), - ByteField("info116", None), - ByteField("info117", None), - ByteField("info118", None), - ByteField("info119", None), - ByteField("info120", None), - ByteField("info121", None), - ByteField("info122", None), - ByteField("info123", None), - ByteField("info124", None), - ByteField("info125", None), - ByteField("info126", None), - ByteField("info127", None), - ByteField("info128", None), - ByteField("info129", None), - ByteField("info130", None), - ByteField("info131", None), - ByteField("info132", None), - ByteField("info133", None), - ByteField("info134", None), - ByteField("info135", None), - ByteField("info136", None), - ByteField("info137", None), - ByteField("info138", None), - ByteField("info139", None), - ByteField("info140", None), - ByteField("info141", None), - ByteField("info142", None), - ByteField("info143", None), - ByteField("info144", None), - ByteField("info145", None), - ByteField("info146", None), - ByteField("info147", None), - ByteField("info148", None), - ByteField("info149", None), - ByteField("info150", None), - ByteField("info151", None), - ByteField("info152", None), - ByteField("info153", None), - ByteField("info154", None), - ByteField("info155", None), - ByteField("info156", None), - ByteField("info157", None), - ByteField("info158", None), - ByteField("info159", None), - ByteField("info160", None), - ByteField("info161", None), - ByteField("info162", None), - ByteField("info163", None), - ByteField("info164", None), - ByteField("info165", None), - ByteField("info166", None), - ByteField("info167", None), - ByteField("info168", None), - ByteField("info169", None), - ByteField("info170", None), - ByteField("info171", None), - ByteField("info172", None), - ByteField("info173", None), - ByteField("info174", None), - ByteField("info175", None), - ByteField("info176", None), - ByteField("info177", None), - ByteField("info178", None), - ByteField("info179", None), - ByteField("info180", None), - ByteField("info181", None), - ByteField("info182", None), - ByteField("info183", None), - ByteField("info184", None), - ByteField("info185", None), - ByteField("info186", None), - ByteField("info187", None), - ByteField("info188", None), - ByteField("info189", None), - ByteField("info190", None), - ByteField("info191", None), - ByteField("info192", None), - ByteField("info193", None), - ByteField("info194", None), - ByteField("info195", None), - ByteField("info196", None), - ByteField("info197", None), - ByteField("info198", None), - ByteField("info199", None), - ByteField("info200", None), - ByteField("info201", None), - ByteField("info202", None), - ByteField("info203", None), - ByteField("info204", None), - ByteField("info205", None), - ByteField("info206", None), - ByteField("info207", None), - ByteField("info208", None), - ByteField("info209", None), - ByteField("info210", None), - ByteField("info211", None), - ByteField("info212", None), - ByteField("info213", None), - ByteField("info214", None), - ByteField("info215", None), - ByteField("info216", None), - ByteField("info217", None), - ByteField("info218", None), - ByteField("info219", None), - ByteField("info220", None), - ByteField("info221", None), - ByteField("info222", None), - ByteField("info223", None), - ByteField("info224", None), - ByteField("info225", None), - ByteField("info226", None), - ByteField("info227", None), - ByteField("info228", None), - ByteField("info229", None), - ByteField("info230", None), - ByteField("info231", None), - ByteField("info232", None), - ByteField("info233", None), - ByteField("info234", None), - ByteField("info235", None), - ByteField("info236", None), - ByteField("info237", None), - ByteField("info238", None), - ByteField("info239", None), - ByteField("info240", None), - ByteField("info241", None), - ByteField("info242", None), - ByteField("info243", None), - ByteField("info244", None), - ByteField("info245", None), - ByteField("info246", None), - ByteField("info247", None), - ByteField("info248", None), - ByteField("info249", None), - ] - - def post_build(self, p, pay): - aList = [] - i = 0 - for i in range(0, len(self.fields_desc)): - aList.append(self.fields_desc[i].name) - a = [] - for i in aList: - a.append(getattr(self, i)) - res = adapt(1, 250, a, self.fields_desc, 1) - if self.lengthSVI is None: - p = struct.pack(">B", res[1]) + p[1:] - if res[0] is not 0: - p = p[:-res[0]] - return p + pay - - -# length 3 to 35 or 131 -class UserUser(Packet): - """User-user Section 10.5.4.25""" - name = "User-User" - fields_desc = [ - - XByteField("lengthUU", None), # dynamic length of field depending - # of the type of message - # let user decide which length he - # wants to take - # => more fuzzing options - ByteField("userUserPD", 0x0), - # optional - ByteField("userUserInfo1", None), - ByteField("userUserInfo2", None), - ByteField("userUserInfo3", None), - ByteField("userUserInfo4", None), - ByteField("userUserInfo5", None), - ByteField("userUserInfo6", None), - ByteField("userUserInfo7", None), - ByteField("userUserInfo8", None), - ByteField("userUserInfo9", None), - ByteField("userUserInfo10", None), - ByteField("userUserInfo11", None), - ByteField("userUserInfo12", None), - ByteField("userUserInfo13", None), - ByteField("userUserInfo14", None), - ByteField("userUserInfo15", None), - ByteField("userUserInfo16", None), - ByteField("userUserInfo17", None), - ByteField("userUserInfo18", None), - ByteField("userUserInfo19", None), - ByteField("userUserInfo20", None), - ByteField("userUserInfo21", None), - ByteField("userUserInfo22", None), - ByteField("userUserInfo23", None), - ByteField("userUserInfo24", None), - ByteField("userUserInfo25", None), - ByteField("userUserInfo26", None), - ByteField("userUserInfo27", None), - ByteField("userUserInfo28", None), - ByteField("userUserInfo29", None), - ByteField("userUserInfo30", None), - ByteField("userUserInfo31", None), - ByteField("userUserInfo32", None), - # long packet - ByteField("userUserInfo33", None), - ByteField("userUserInfo34", None), - ByteField("userUserInfo35", None), - ByteField("userUserInfo36", None), - ByteField("userUserInfo37", None), - ByteField("userUserInfo38", None), - ByteField("userUserInfo39", None), - ByteField("userUserInfo40", None), - ByteField("userUserInfo41", None), - ByteField("userUserInfo42", None), - ByteField("userUserInfo43", None), - ByteField("userUserInfo44", None), - ByteField("userUserInfo45", None), - ByteField("userUserInfo46", None), - ByteField("userUserInfo47", None), - ByteField("userUserInfo48", None), - ByteField("userUserInfo49", None), - ByteField("userUserInfo50", None), - ByteField("userUserInfo51", None), - ByteField("userUserInfo52", None), - ByteField("userUserInfo53", None), - ByteField("userUserInfo54", None), - ByteField("userUserInfo55", None), - ByteField("userUserInfo56", None), - ByteField("userUserInfo57", None), - ByteField("userUserInfo58", None), - ByteField("userUserInfo59", None), - ByteField("userUserInfo60", None), - ByteField("userUserInfo61", None), - ByteField("userUserInfo62", None), - ByteField("userUserInfo63", None), - ByteField("userUserInfo64", None), - ByteField("userUserInfo65", None), - ByteField("userUserInfo66", None), - ByteField("userUserInfo67", None), - ByteField("userUserInfo68", None), - ByteField("userUserInfo69", None), - ByteField("userUserInfo70", None), - ByteField("userUserInfo71", None), - ByteField("userUserInfo72", None), - ByteField("userUserInfo73", None), - ByteField("userUserInfo74", None), - ByteField("userUserInfo75", None), - ByteField("userUserInfo76", None), - ByteField("userUserInfo77", None), - ByteField("userUserInfo78", None), - ByteField("userUserInfo79", None), - ByteField("userUserInfo80", None), - ByteField("userUserInfo81", None), - ByteField("userUserInfo82", None), - ByteField("userUserInfo83", None), - ByteField("userUserInfo84", None), - ByteField("userUserInfo85", None), - ByteField("userUserInfo86", None), - ByteField("userUserInfo87", None), - ByteField("userUserInfo88", None), - ByteField("userUserInfo89", None), - ByteField("userUserInfo90", None), - ByteField("userUserInfo91", None), - ByteField("userUserInfo92", None), - ByteField("userUserInfo93", None), - ByteField("userUserInfo94", None), - ByteField("userUserInfo95", None), - ByteField("userUserInfo96", None), - ByteField("userUserInfo97", None), - ByteField("userUserInfo98", None), - ByteField("userUserInfo99", None), - ByteField("userUserInfo100", None), - ByteField("userUserInfo101", None), - ByteField("userUserInfo102", None), - ByteField("userUserInfo103", None), - ByteField("userUserInfo104", None), - ByteField("userUserInfo105", None), - ByteField("userUserInfo106", None), - ByteField("userUserInfo107", None), - ByteField("userUserInfo108", None), - ByteField("userUserInfo109", None), - ByteField("userUserInfo110", None), - ByteField("userUserInfo111", None), - ByteField("userUserInfo112", None), - ByteField("userUserInfo113", None), - ByteField("userUserInfo114", None), - ByteField("userUserInfo115", None), - ByteField("userUserInfo116", None), - ByteField("userUserInfo117", None), - ByteField("userUserInfo118", None), - ByteField("userUserInfo119", None), - ByteField("userUserInfo120", None), - ByteField("userUserInfo121", None), - ByteField("userUserInfo122", None), - ByteField("userUserInfo123", None), - ByteField("userUserInfo124", None), - ByteField("userUserInfo125", None), - ByteField("userUserInfo126", None), - ByteField("userUserInfo127", None), - ByteField("userUserInfo128", None), - ByteField("userUserInfo129", None), - ByteField("userUserInfo130", None), - ByteField("userUserInfo131", None) - ] - - def post_build(self, p, pay): - aList = [] - i = 0 - for i in range(0, len(self.fields_desc)): - aList.append(self.fields_desc[i].name) - a = [] - for i in aList: - a.append(getattr(self, i)) - res = adapt(2, 133, a, self.fields_desc, 1) - if self.lengthUU is None: - p = struct.pack(">B", res[1]) + p[1:] - if res[0] is not 0: - p = p[:-res[0]] - return p + pay - - -class AlertingPattern(Packet): - """Alerting Pattern 10.5.4.26""" - name = "Alerting Pattern" - fields_desc = [ - XByteField("lengthAP", 0x3), - BitField("spare", 0x0, 4), - BitField("alertingValue", 0x0, 4) - ] - - -class AllowedActions(Packet): - """Allowed actions $(CCBS)$ Section 10.5.4.26""" - name = "Allowed Actions $(CCBS)$" - fields_desc = [ - XByteField("lengthAP", 0x3), - BitField("CCBS", 0x0, 1), - BitField("spare", 0x0, 7) - ] - - -# -# 10.5.5 GPRS mobility management information elements -# - - -class AttachType(Packet): - """Attach type Section 10.5.5.2""" - name = "Attach Type" - fields_desc = [ - BitField("spare", 0x0, 1), - BitField("type", 0x1, 3) - ] - - -if __name__ == "__main__": - interact(mydict=globals(), mybanner="Scapy GSM-UM (Air) Addon") diff --git a/scripts/external_libs/scapy-2.3.1/scapy/contrib/igmp.py b/scripts/external_libs/scapy-2.3.1/scapy/contrib/igmp.py deleted file mode 100644 index cc3dadc8..00000000 --- a/scripts/external_libs/scapy-2.3.1/scapy/contrib/igmp.py +++ /dev/null @@ -1,171 +0,0 @@ -#! /usr/bin/env python - -# scapy.contrib.description = IGMP/IGMPv2 -# scapy.contrib.status = loads - - -# TODO: scapy 2 has function getmacbyip, maybe it can replace igmpize -# at least from the MAC layer - -from scapy.all import * - -#-------------------------------------------------------------------------- -def isValidMCAddr(ip): - """convert dotted quad string to long and check the first octet""" - FirstOct=atol(ip)>>24 & 0xFF - return (FirstOct >= 224) and (FirstOct <= 239) - -#-------------------------------------------------------------------------- - -class IGMP(Packet): - """IGMP Message Class for v1 and v2. - -This class is derived from class Packet. You need to "igmpize" -the IP and Ethernet layers before a full packet is sent. -a=Ether(src="00:01:02:03:04:05") -b=IP(src="1.2.3.4") -c=IGMP(type=0x12, gaddr="224.2.3.4") -c.igmpize(b, a) -print "Joining IP " + c.gaddr + " MAC " + a.dst -sendp(a/b/c, iface="en0") - - Parameters: - type IGMP type field, 0x11, 0x12, 0x16 or 0x17 - mrtime Maximum Response time (zero for v1) - gaddr Multicast Group Address 224.x.x.x/4 - -See RFC2236, Section 2. Introduction for definitions of proper -IGMPv2 message format http://www.faqs.org/rfcs/rfc2236.html - - """ - name = "IGMP" - - igmptypes = { 0x11 : "Group Membership Query", - 0x12 : "Version 1 - Membership Report", - 0x16 : "Version 2 - Membership Report", - 0x17 : "Leave Group"} - - fields_desc = [ ByteEnumField("type", 0x11, igmptypes), - ByteField("mrtime",20), - XShortField("chksum", None), - IPField("gaddr", "0.0.0.0")] - -#-------------------------------------------------------------------------- - def post_build(self, p, pay): - """Called implicitly before a packet is sent to compute and place IGMP checksum. - - Parameters: - self The instantiation of an IGMP class - p The IGMP message in hex in network byte order - pay Additional payload for the IGMP message - """ - p += pay - if self.chksum is None: - ck = checksum(p) - p = p[:2]+chr(ck>>8)+chr(ck&0xff)+p[4:] - return p - -#-------------------------------------------------------------------------- - def mysummary(self): - """Display a summary of the IGMP object.""" - - if isinstance(self.underlayer, IP): - return self.underlayer.sprintf("IGMP: %IP.src% > %IP.dst% %IGMP.type% %IGMP.gaddr%") - else: - return self.sprintf("IGMP %IGMP.type% %IGMP.gaddr%") - -#-------------------------------------------------------------------------- - def igmpize(self, ip=None, ether=None): - """Called to explicitely fixup associated IP and Ethernet headers - - Parameters: - self The instantiation of an IGMP class. - ip The instantiation of the associated IP class. - ether The instantiation of the associated Ethernet. - - Returns: - True The tuple ether/ip/self passed all check and represents - a proper IGMP packet. - False One of more validation checks failed and no fields - were adjusted. - - The function will examine the IGMP message to assure proper format. - Corrections will be attempted if possible. The IP header is then properly - adjusted to ensure correct formatting and assignment. The Ethernet header - is then adjusted to the proper IGMP packet format. - """ - -# The rules are: -# 1. the Max Response time is meaningful only in Membership Queries and should be zero -# otherwise (RFC 2236, section 2.2) - - if (self.type != 0x11): #rule 1 - self.mrtime = 0 - - if (self.adjust_ip(ip) == True): - if (self.adjust_ether(ip, ether) == True): return True - return False - -#-------------------------------------------------------------------------- - def adjust_ether (self, ip=None, ether=None): - """Called to explicitely fixup an associated Ethernet header - - The function adjusts the ethernet header destination MAC address based on - the destination IP address. - """ -# The rules are: -# 1. send to the group mac address address corresponding to the IP.dst - if ip != None and ip.haslayer(IP) and ether != None and ether.haslayer(Ether): - iplong = atol(ip.dst) - ether.dst = "01:00:5e:%02x:%02x:%02x" % ( (iplong>>16)&0x7F, (iplong>>8)&0xFF, (iplong)&0xFF ) - # print "igmpize ip " + ip.dst + " as mac " + ether.dst - return True - else: - return False - -#-------------------------------------------------------------------------- - def adjust_ip (self, ip=None): - """Called to explicitely fixup an associated IP header - - The function adjusts the IP header based on conformance rules - and the group address encoded in the IGMP message. - The rules are: - 1. Send General Group Query to 224.0.0.1 (all systems) - 2. Send Leave Group to 224.0.0.2 (all routers) - 3a.Otherwise send the packet to the group address - 3b.Send reports/joins to the group address - 4. ttl = 1 (RFC 2236, section 2) - 5. send the packet with the router alert IP option (RFC 2236, section 2) - """ - if ip != None and ip.haslayer(IP): - if (self.type == 0x11): - if (self.gaddr == "0.0.0.0"): - ip.dst = "224.0.0.1" # IP rule 1 - retCode = True - elif isValidMCAddr(self.gaddr): - ip.dst = self.gaddr # IP rule 3a - retCode = True - else: - print "Warning: Using invalid Group Address" - retCode = False - elif ((self.type == 0x17) and isValidMCAddr(self.gaddr)): - ip.dst = "224.0.0.2" # IP rule 2 - retCode = True - elif ((self.type == 0x12) or (self.type == 0x16)) and (isValidMCAddr(self.gaddr)): - ip.dst = self.gaddr # IP rule 3b - retCode = True - else: - print "Warning: Using invalid IGMP Type" - retCode = False - else: - print "Warning: No IGMP Group Address set" - retCode = False - if retCode == True: - ip.ttl=1 # IP Rule 4 - ip.options=[IPOption_Router_Alert()] # IP rule 5 - return retCode - - -bind_layers( IP, IGMP, frag=0, proto=2) - - diff --git a/scripts/external_libs/scapy-2.3.1/scapy/contrib/igmpv3.py b/scripts/external_libs/scapy-2.3.1/scapy/contrib/igmpv3.py deleted file mode 100644 index 1ab1bae4..00000000 --- a/scripts/external_libs/scapy-2.3.1/scapy/contrib/igmpv3.py +++ /dev/null @@ -1,270 +0,0 @@ -#! /usr/bin/env python - -# http://trac.secdev.org/scapy/ticket/31 - -# scapy.contrib.description = IGMPv3 -# scapy.contrib.status = loads - -from scapy.packet import * - -""" Based on the following references - http://www.iana.org/assignments/igmp-type-numbers - http://www.rfc-editor.org/rfc/pdfrfc/rfc3376.txt.pdf - -""" - -# TODO: Merge IGMPv3 packet Bindlayers correct for -# membership source/Group records -# ConditionalField parameters for IGMPv3 commented out -# -# See RFC3376, Section 4. Message Formats for definitions of proper IGMPv3 message format -# http://www.faqs.org/rfcs/rfc3376.html -# -# See RFC4286, For definitions of proper messages for Multicast Router Discovery. -# http://www.faqs.org/rfcs/rfc4286.html -# - -#import sys, socket, struct, time -from scapy.all import * -print "IGMPv3 is still under development - Nov 2010" - - -class IGMPv3gr(Packet): - """IGMP Group Record for IGMPv3 Membership Report - - This class is derived from class Packet and should be concatenated to an - instantiation of class IGMPv3. Within the IGMPv3 instantiation, the numgrp - element will need to be manipulated to indicate the proper number of - group records. - """ - name = "IGMPv3gr" - igmpv3grtypes = { 1 : "Mode Is Include", - 2 : "Mode Is Exclude", - 3 : "Change To Include Mode", - 4 : "Change To Exclude Mode", - 5 : "Allow New Sources", - 6 : "Block Old Sources"} - - fields_desc = [ ByteEnumField("rtype", 1, igmpv3grtypes), - ByteField("auxdlen",0), - FieldLenField("numsrc", None, "srcaddrs"), - IPField("maddr", "0.0.0.0"), - FieldListField("srcaddrs", None, IPField("sa", "0.0.0.0"), "numsrc") ] - #show_indent=0 -#-------------------------------------------------------------------------- - def post_build(self, p, pay): - """Called implicitly before a packet is sent. - """ - p += pay - if self.auxdlen != 0: - print "NOTICE: A properly formatted and complaint V3 Group Record should have an Auxiliary Data length of zero (0)." - print " Subsequent Group Records are lost!" - return p -#-------------------------------------------------------------------------- - def mysummary(self): - """Display a summary of the IGMPv3 group record.""" - return self.sprintf("IGMPv3 Group Record %IGMPv3gr.type% %IGMPv3gr.maddr%") - - -class IGMPv3(Packet): - """IGMP Message Class for v3. - - This class is derived from class Packet. - The fields defined below are a - direct interpretation of the v3 Membership Query Message. - Fields 'type' through 'qqic' are directly assignable. - For 'numsrc', do not assign a value. - Instead add to the 'srcaddrs' list to auto-set 'numsrc'. To - assign values to 'srcaddrs', use the following methods: - c = IGMPv3() - c.srcaddrs = ['1.2.3.4', '5.6.7.8'] - c.srcaddrs += ['192.168.10.24'] - At this point, 'c.numsrc' is three (3) - - 'chksum' is automagically calculated before the packet is sent. - - 'mrcode' is also the Advertisement Interval field - - """ - name = "IGMPv3" - igmpv3types = { 0x11 : "Membership Query", - 0x22 : "Version 3 Membership Report", - 0x30 : "Multicast Router Advertisement", - 0x31 : "Multicast Router Solicitation", - 0x32 : "Multicast Router Termination"} - - fields_desc = [ ByteEnumField("type", 0x11, igmpv3types), - ByteField("mrcode",0), - XShortField("chksum", None), - IPField("gaddr", "0.0.0.0") - ] - # use float_encode() - - # if type = 0x11 (Membership Query), the next field is group address - # ConditionalField(IPField("gaddr", "0.0.0.0"), "type", lambda x:x==0x11), - # else if type = 0x22 (Membership Report), the next fields are - # reserved and number of group records - #ConditionalField(ShortField("rsvd2", 0), "type", lambda x:x==0x22), - #ConditionalField(ShortField("numgrp", 0), "type", lambda x:x==0x22), -# FieldLenField("numgrp", None, "grprecs")] - # else if type = 0x30 (Multicast Router Advertisement), the next fields are - # query interval and robustness - #ConditionalField(ShortField("qryIntvl", 0), "type", lambda x:x==0x30), - #ConditionalField(ShortField("robust", 0), "type", lambda x:x==0x30), -# The following are only present for membership queries - # ConditionalField(BitField("resv", 0, 4), "type", lambda x:x==0x11), - # ConditionalField(BitField("s", 0, 1), "type", lambda x:x==0x11), - # ConditionalField(BitField("qrv", 0, 3), "type", lambda x:x==0x11), - # ConditionalField(ByteField("qqic",0), "type", lambda x:x==0x11), - # ConditionalField(FieldLenField("numsrc", None, "srcaddrs"), "type", lambda x:x==0x11), - # ConditionalField(FieldListField("srcaddrs", None, IPField("sa", "0.0.0.0"), "numsrc"), "type", lambda x:x==0x11), - -#-------------------------------------------------------------------------- - def float_encode(self, value): - """Convert the integer value to its IGMPv3 encoded time value if needed. - - If value < 128, return the value specified. If >= 128, encode as a floating - point value. Value can be 0 - 31744. - """ - if value < 128: - code = value - elif value > 31743: - code = 255 - else: - exp=0 - value>>=3 - while(value>31): - exp+=1 - value>>=1 - exp<<=4 - code = 0x80 | exp | (value & 0x0F) - return code - -#-------------------------------------------------------------------------- - def post_build(self, p, pay): - """Called implicitly before a packet is sent to compute and place IGMPv3 checksum. - - Parameters: - self The instantiation of an IGMPv3 class - p The IGMPv3 message in hex in network byte order - pay Additional payload for the IGMPv3 message - """ - p += pay - if self.type in [0, 0x31, 0x32, 0x22]: # for these, field is reserved (0) - p = p[:1]+chr(0)+p[2:] - if self.chksum is None: - ck = checksum(p) - p = p[:2]+chr(ck>>8)+chr(ck&0xff)+p[4:] - return p - -#-------------------------------------------------------------------------- - def mysummary(self): - """Display a summary of the IGMPv3 object.""" - - if isinstance(self.underlayer, IP): - return self.underlayer.sprintf("IGMPv3: %IP.src% > %IP.dst% %IGMPv3.type% %IGMPv3.gaddr%") - else: - return self.sprintf("IGMPv3 %IGMPv3.type% %IGMPv3.gaddr%") - -#-------------------------------------------------------------------------- - def igmpize(self, ip=None, ether=None): - """Called to explicitely fixup associated IP and Ethernet headers - - Parameters: - self The instantiation of an IGMP class. - ip The instantiation of the associated IP class. - ether The instantiation of the associated Ethernet. - - Returns: - True The tuple ether/ip/self passed all check and represents - a proper IGMP packet. - False One of more validation checks failed and no fields - were adjusted. - - The function will examine the IGMP message to assure proper format. - Corrections will be attempted if possible. The IP header is then properly - adjusted to ensure correct formatting and assignment. The Ethernet header - is then adjusted to the proper IGMP packet format. - """ - -# The rules are: -# 1. ttl = 1 (RFC 2236, section 2) -# igmp_binds = [ (IP, IGMP, { "proto": 2 , "ttl": 1 }), -# 2. tos = 0xC0 (RFC 3376, section 4) -# (IP, IGMPv3, { "proto": 2 , "ttl": 1, "tos":0xc0 }), -# (IGMPv3, IGMPv3gr, { }) ] -# The rules are: -# 1. the Max Response time is meaningful only in Membership Queries and should be zero -# otherwise (RFC 2236, section 2.2) - - if (self.type != 0x11): #rule 1 - self.mrtime = 0 - - if (self.adjust_ip(ip) == True): - if (self.adjust_ether(ip, ether) == True): return True - return False - -#-------------------------------------------------------------------------- - def adjust_ether (self, ip=None, ether=None): - """Called to explicitely fixup an associated Ethernet header - - The function adjusts the ethernet header destination MAC address based on - the destination IP address. - """ -# The rules are: -# 1. send to the group mac address address corresponding to the IP.dst - if ip != None and ip.haslayer(IP) and ether != None and ether.haslayer(Ether): - iplong = atol(ip.dst) - ether.dst = "01:00:5e:%02x:%02x:%02x" % ( (iplong>>16)&0x7F, (iplong>>8)&0xFF, (iplong)&0xFF ) - # print "igmpize ip " + ip.dst + " as mac " + ether.dst - return True - else: - return False - -#-------------------------------------------------------------------------- - def adjust_ip (self, ip=None): - """Called to explicitely fixup an associated IP header - - The function adjusts the IP header based on conformance rules - and the group address encoded in the IGMP message. - The rules are: - 1. Send General Group Query to 224.0.0.1 (all systems) - 2. Send Leave Group to 224.0.0.2 (all routers) - 3a.Otherwise send the packet to the group address - 3b.Send reports/joins to the group address - 4. ttl = 1 (RFC 2236, section 2) - 5. send the packet with the router alert IP option (RFC 2236, section 2) - """ - if ip != None and ip.haslayer(IP): - if (self.type == 0x11): - if (self.gaddr == "0.0.0.0"): - ip.dst = "224.0.0.1" # IP rule 1 - retCode = True - elif isValidMCAddr(self.gaddr): - ip.dst = self.gaddr # IP rule 3a - retCode = True - else: - print "Warning: Using invalid Group Address" - retCode = False - elif ((self.type == 0x17) and isValidMCAddr(self.gaddr)): - ip.dst = "224.0.0.2" # IP rule 2 - retCode = True - elif ((self.type == 0x12) or (self.type == 0x16)) and (isValidMCAddr(self.gaddr)): - ip.dst = self.gaddr # IP rule 3b - retCode = True - else: - print "Warning: Using invalid IGMP Type" - retCode = False - else: - print "Warning: No IGMP Group Address set" - retCode = False - if retCode == True: - ip.ttl=1 # IP Rule 4 - ip.options=[IPOption_Router_Alert()] # IP rule 5 - return retCode - - -bind_layers( IP, IGMPv3, frag=0, proto=2, ttl=1, tos=0xc0) -bind_layers( IGMPv3, IGMPv3gr, frag=0, proto=2) -bind_layers( IGMPv3gr, IGMPv3gr, frag=0, proto=2) - diff --git a/scripts/external_libs/scapy-2.3.1/scapy/contrib/ikev2.py b/scripts/external_libs/scapy-2.3.1/scapy/contrib/ikev2.py deleted file mode 100644 index fd38b80c..00000000 --- a/scripts/external_libs/scapy-2.3.1/scapy/contrib/ikev2.py +++ /dev/null @@ -1,362 +0,0 @@ -#!/usr/bin/env python - -# http://trac.secdev.org/scapy/ticket/353 - -# scapy.contrib.description = IKEv2 -# scapy.contrib.status = loads - -from scapy.all import * -import logging - - -## Modified from the original ISAKMP code by Yaron Sheffer <yaronf.ietf@gmail.com>, June 2010. - -import struct -from scapy.packet import * -from scapy.fields import * -from scapy.ansmachine import * -from scapy.layers.inet import IP,UDP -from scapy.sendrecv import sr - -# see http://www.iana.org/assignments/ikev2-parameters for details -IKEv2AttributeTypes= { "Encryption": (1, { "DES-IV64" : 1, - "DES" : 2, - "3DES" : 3, - "RC5" : 4, - "IDEA" : 5, - "CAST" : 6, - "Blowfish" : 7, - "3IDEA" : 8, - "DES-IV32" : 9, - "AES-CBC" : 12, - "AES-CTR" : 13, - "AES-CCM-8" : 14, - "AES-CCM-12" : 15, - "AES-CCM-16" : 16, - "AES-GCM-8ICV" : 18, - "AES-GCM-12ICV" : 19, - "AES-GCM-16ICV" : 20, - "Camellia-CBC" : 23, - "Camellia-CTR" : 24, - "Camellia-CCM-8ICV" : 25, - "Camellia-CCM-12ICV" : 26, - "Camellia-CCM-16ICV" : 27, - }, 0), - "PRF": (2, {"PRF_HMAC_MD5":1, - "PRF_HMAC_SHA1":2, - "PRF_HMAC_TIGER":3, - "PRF_AES128_XCBC":4, - "PRF_HMAC_SHA2_256":5, - "PRF_HMAC_SHA2_384":6, - "PRF_HMAC_SHA2_512":7, - "PRF_AES128_CMAC":8, - }, 0), - "Integrity": (3, { "HMAC-MD5-96": 1, - "HMAC-SHA1-96": 2, - "DES-MAC": 3, - "KPDK-MD5": 4, - "AES-XCBC-96": 5, - "HMAC-MD5-128": 6, - "HMAC-SHA1-160": 7, - "AES-CMAC-96": 8, - "AES-128-GMAC": 9, - "AES-192-GMAC": 10, - "AES-256-GMAC": 11, - "SHA2-256-128": 12, - "SHA2-384-192": 13, - "SHA2-512-256": 14, - }, 0), - "GroupDesc": (4, { "768MODPgr" : 1, - "1024MODPgr" : 2, - "1536MODPgr" : 5, - "2048MODPgr" : 14, - "3072MODPgr" : 15, - "4096MODPgr" : 16, - "6144MODPgr" : 17, - "8192MODPgr" : 18, - "256randECPgr" : 19, - "384randECPgr" : 20, - "521randECPgr" : 21, - "1024MODP160POSgr" : 22, - "2048MODP224POSgr" : 23, - "2048MODP256POSgr" : 24, - "192randECPgr" : 25, - "224randECPgr" : 26, - }, 0), - "Extended Sequence Number": (5, {"No ESN": 0, - "ESN": 1, }, 0), - } - -# the name 'IKEv2TransformTypes' is actually a misnomer (since the table -# holds info for all IKEv2 Attribute types, not just transforms, but we'll -# keep it for backwards compatibility... for now at least -IKEv2TransformTypes = IKEv2AttributeTypes - -IKEv2TransformNum = {} -for n in IKEv2TransformTypes: - val = IKEv2TransformTypes[n] - tmp = {} - for e in val[1]: - tmp[val[1][e]] = e - IKEv2TransformNum[val[0]] = (n,tmp, val[2]) - -IKEv2Transforms = {} -for n in IKEv2TransformTypes: - IKEv2Transforms[IKEv2TransformTypes[n][0]]=n - -del(n) -del(e) -del(tmp) -del(val) - -# Note: Transform and Proposal can only be used inside the SA payload -IKEv2_payload_type = ["None", "", "Proposal", "Transform"] - -IKEv2_payload_type.extend([""] * 29) -IKEv2_payload_type.extend(["SA","KE","IDi","IDr", "CERT","CERTREQ","AUTH","Nonce","Notify","Delete", - "VendorID","TSi","TSr","Encrypted","CP","EAP"]) - -IKEv2_exchange_type = [""] * 34 -IKEv2_exchange_type.extend(["IKE_SA_INIT","IKE_AUTH","CREATE_CHILD_SA", - "INFORMATIONAL", "IKE_SESSION_RESUME"]) - - -class IKEv2_class(Packet): - def guess_payload_class(self, payload): - np = self.next_payload - logging.debug("For IKEv2_class np=%d" % np) - if np == 0: - return conf.raw_layer - elif np < len(IKEv2_payload_type): - pt = IKEv2_payload_type[np] - logging.debug(globals().get("IKEv2_payload_%s" % pt, IKEv2_payload)) - return globals().get("IKEv2_payload_%s" % pt, IKEv2_payload) - else: - return IKEv2_payload - - -class IKEv2(IKEv2_class): # rfc4306 - name = "IKEv2" - fields_desc = [ - StrFixedLenField("init_SPI","",8), - StrFixedLenField("resp_SPI","",8), - ByteEnumField("next_payload",0,IKEv2_payload_type), - XByteField("version",0x20), # IKEv2, right? - ByteEnumField("exch_type",0,IKEv2_exchange_type), - FlagsField("flags",0, 8, ["res0","res1","res2","Initiator","Version","Response","res6","res7"]), - IntField("id",0), - IntField("length",None) - ] - - def guess_payload_class(self, payload): - if self.flags & 1: - return conf.raw_layer - return IKEv2_class.guess_payload_class(self, payload) - - def answers(self, other): - if isinstance(other, IKEv2): - if other.init_SPI == self.init_SPI: - return 1 - return 0 - def post_build(self, p, pay): - p += pay - if self.length is None: - p = p[:24]+struct.pack("!I",len(p))+p[28:] - return p - - -class IKEv2_Key_Length_Attribute(IntField): - # We only support the fixed-length Key Length attribute (the only one currently defined) - name="key length" - def __init__(self, name): - IntField.__init__(self, name, "0x800E0000") - - def i2h(self, pkt, x): - return IntField.i2h(self, pkt, x & 0xFFFF) - - def h2i(self, pkt, x): - return IntField.h2i(self, pkt, struct.pack("!I", 0x800E0000 | int(x, 0))) - - -class IKEv2_Transform_ID(ShortField): - def i2h(self, pkt, x): - if pkt == None: - return None - else: - map = IKEv2TransformNum[pkt.transform_type][1] - return map[x] - - def h2i(self, pkt, x): - if pkt == None: - return None - else: - map = IKEv2TransformNum[pkt.transform_type][1] - for k in keys(map): - if map[k] == x: - return k - return None - -class IKEv2_payload_Transform(IKEv2_class): - name = "IKE Transform" - fields_desc = [ - ByteEnumField("next_payload",None,{0:"last", 3:"Transform"}), - ByteField("res",0), - ShortField("length",8), - ByteEnumField("transform_type",None,IKEv2Transforms), - ByteField("res2",0), - IKEv2_Transform_ID("transform_id", 0), - ConditionalField(IKEv2_Key_Length_Attribute("key_length"), lambda pkt: pkt.length > 8), - ] - -class IKEv2_payload_Proposal(IKEv2_class): - name = "IKEv2 Proposal" - fields_desc = [ - ByteEnumField("next_payload",None,{0:"last", 2:"Proposal"}), - ByteField("res",0), - FieldLenField("length",None,"trans","H", adjust=lambda pkt,x:x+8), - ByteField("proposal",1), - ByteEnumField("proto",1,{1:"IKEv2"}), - FieldLenField("SPIsize",None,"SPI","B"), - ByteField("trans_nb",None), - StrLenField("SPI","",length_from=lambda x:x.SPIsize), - PacketLenField("trans",conf.raw_layer(),IKEv2_payload_Transform,length_from=lambda x:x.length-8), - ] - - -class IKEv2_payload(IKEv2_class): - name = "IKEv2 Payload" - fields_desc = [ - ByteEnumField("next_payload",None,IKEv2_payload_type), - FlagsField("flags",0, 8, ["critical","res1","res2","res3","res4","res5","res6","res7"]), - FieldLenField("length",None,"load","H", adjust=lambda pkt,x:x+4), - StrLenField("load","",length_from=lambda x:x.length-4), - ] - - -class IKEv2_payload_VendorID(IKEv2_class): - name = "IKEv2 Vendor ID" - overload_fields = { IKEv2: { "next_payload":43 }} - fields_desc = [ - ByteEnumField("next_payload",None,IKEv2_payload_type), - ByteField("res",0), - FieldLenField("length",None,"vendorID","H", adjust=lambda pkt,x:x+4), - StrLenField("vendorID","",length_from=lambda x:x.length-4), - ] - -class IKEv2_payload_Delete(IKEv2_class): - name = "IKEv2 Vendor ID" - overload_fields = { IKEv2: { "next_payload":42 }} - fields_desc = [ - ByteEnumField("next_payload",None,IKEv2_payload_type), - ByteField("res",0), - FieldLenField("length",None,"vendorID","H", adjust=lambda pkt,x:x+4), - StrLenField("vendorID","",length_from=lambda x:x.length-4), - ] - -class IKEv2_payload_SA(IKEv2_class): - name = "IKEv2 SA" - overload_fields = { IKEv2: { "next_payload":33 }} - fields_desc = [ - ByteEnumField("next_payload",None,IKEv2_payload_type), - ByteField("res",0), - FieldLenField("length",None,"prop","H", adjust=lambda pkt,x:x+4), - PacketLenField("prop",conf.raw_layer(),IKEv2_payload_Proposal,length_from=lambda x:x.length-4), - ] - -class IKEv2_payload_Nonce(IKEv2_class): - name = "IKEv2 Nonce" - overload_fields = { IKEv2: { "next_payload":40 }} - fields_desc = [ - ByteEnumField("next_payload",None,IKEv2_payload_type), - ByteField("res",0), - FieldLenField("length",None,"load","H", adjust=lambda pkt,x:x+4), - StrLenField("load","",length_from=lambda x:x.length-4), - ] - -class IKEv2_payload_Notify(IKEv2_class): - name = "IKEv2 Notify" - overload_fields = { IKEv2: { "next_payload":41 }} - fields_desc = [ - ByteEnumField("next_payload",None,IKEv2_payload_type), - ByteField("res",0), - FieldLenField("length",None,"load","H", adjust=lambda pkt,x:x+4), - StrLenField("load","",length_from=lambda x:x.length-4), - ] - -class IKEv2_payload_KE(IKEv2_class): - name = "IKEv2 Key Exchange" - overload_fields = { IKEv2: { "next_payload":34 }} - fields_desc = [ - ByteEnumField("next_payload",None,IKEv2_payload_type), - ByteField("res",0), - FieldLenField("length",None,"load","H", adjust=lambda pkt,x:x+6), - ShortEnumField("group", 0, IKEv2TransformTypes['GroupDesc'][1]), - StrLenField("load","",length_from=lambda x:x.length-6), - ] - -class IKEv2_payload_IDi(IKEv2_class): - name = "IKEv2 Identification - Initiator" - overload_fields = { IKEv2: { "next_payload":35 }} - fields_desc = [ - ByteEnumField("next_payload",None,IKEv2_payload_type), - ByteField("res",0), - FieldLenField("length",None,"load","H",adjust=lambda pkt,x:x+8), - ByteEnumField("IDtype",1,{1:"IPv4_addr", 11:"Key"}), - ByteEnumField("ProtoID",0,{0:"Unused"}), - ShortEnumField("Port",0,{0:"Unused"}), -# IPField("IdentData","127.0.0.1"), - StrLenField("load","",length_from=lambda x:x.length-8), - ] - -class IKEv2_payload_IDr(IKEv2_class): - name = "IKEv2 Identification - Responder" - overload_fields = { IKEv2: { "next_payload":36 }} - fields_desc = [ - ByteEnumField("next_payload",None,IKEv2_payload_type), - ByteField("res",0), - FieldLenField("length",None,"load","H",adjust=lambda pkt,x:x+8), - ByteEnumField("IDtype",1,{1:"IPv4_addr", 11:"Key"}), - ByteEnumField("ProtoID",0,{0:"Unused"}), - ShortEnumField("Port",0,{0:"Unused"}), -# IPField("IdentData","127.0.0.1"), - StrLenField("load","",length_from=lambda x:x.length-8), - ] - - - -class IKEv2_payload_Encrypted(IKEv2_class): - name = "IKEv2 Encrypted and Authenticated" - overload_fields = { IKEv2: { "next_payload":46 }} - fields_desc = [ - ByteEnumField("next_payload",None,IKEv2_payload_type), - ByteField("res",0), - FieldLenField("length",None,"load","H",adjust=lambda pkt,x:x+4), - StrLenField("load","",length_from=lambda x:x.length-4), - ] - - - -IKEv2_payload_type_overload = {} -for i in range(len(IKEv2_payload_type)): - name = "IKEv2_payload_%s" % IKEv2_payload_type[i] - if name in globals(): - IKEv2_payload_type_overload[globals()[name]] = {"next_payload":i} - -del(i) -del(name) -IKEv2_class.overload_fields = IKEv2_payload_type_overload.copy() - -split_layers(UDP, ISAKMP, sport=500) -split_layers(UDP, ISAKMP, dport=500) - -bind_layers( UDP, IKEv2, dport=500, sport=500) # TODO: distinguish IKEv1/IKEv2 -bind_layers( UDP, IKEv2, dport=4500, sport=4500) - -def ikev2scan(ip): - return sr(IP(dst=ip)/UDP()/IKEv2(init_SPI=RandString(8), - exch_type=34)/IKEv2_payload_SA(prop=IKEv2_payload_Proposal())) - -# conf.debug_dissector = 1 - -if __name__ == "__main__": - interact(mydict=globals(), mybanner="IKEv2 alpha-level protocol implementation") diff --git a/scripts/external_libs/scapy-2.3.1/scapy/contrib/ldp.py b/scripts/external_libs/scapy-2.3.1/scapy/contrib/ldp.py deleted file mode 100644 index bc2464ab..00000000 --- a/scripts/external_libs/scapy-2.3.1/scapy/contrib/ldp.py +++ /dev/null @@ -1,475 +0,0 @@ -# scapy.contrib.description = Label Distribution Protocol (LDP) -# scapy.contrib.status = loads - -# http://git.savannah.gnu.org/cgit/ldpscapy.git/snapshot/ldpscapy-5285b81d6e628043df2a83301b292f24a95f0ba1.tar.gz - -# This program is free software: you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. - -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. - -# You should have received a copy of the GNU General Public License -# along with this program. If not, see <http://www.gnu.org/licenses/>. - -# Copyright (C) 2010 Florian Duraffourg - -import struct - -from scapy.packet import * -from scapy.fields import * -from scapy.ansmachine import * -from scapy.layers.inet import UDP -from scapy.layers.inet import TCP -from scapy.base_classes import Net - - -# Guess payload -def guess_payload(p): - LDPTypes = { - 0x0001: LDPNotification, - 0x0100: LDPHello, - 0x0200: LDPInit, - 0x0201: LDPKeepAlive, - 0x0300: LDPAddress, - 0x0301: LDPAddressWM, - 0x0400: LDPLabelMM, - 0x0401: LDPLabelReqM, - 0x0404: LDPLabelARM, - 0x0402: LDPLabelWM, - 0x0403: LDPLabelRelM, - } - type = struct.unpack("!H",p[0:2])[0] - type = type & 0x7fff - if type == 0x0001 and struct.unpack("!H",p[2:4])[0] > 20: - return LDP - if type in LDPTypes: - return LDPTypes[type] - else: - return conf.raw_layer - -## Fields ## - -# 3.4.1. FEC TLV - -class FecTLVField(StrField): - islist=1 - def m2i(self, pkt, x): - nbr = struct.unpack("!H",x[2:4])[0] - used = 0 - x=x[4:] - list=[] - while x: - #if x[0] == 1: - # list.append('Wildcard') - #else: - #mask=ord(x[8*i+3]) - #add=inet_ntoa(x[8*i+4:8*i+8]) - mask=ord(x[3]) - nbroctets = mask / 8 - if mask % 8: - nbroctets += 1 - add=inet_ntoa(x[4:4+nbroctets]+"\x00"*(4-nbroctets)) - list.append( (add, mask) ) - used += 4 + nbroctets - x=x[4+nbroctets:] - return list - def i2m(self, pkt, x): - if type(x) is str: - return x - s = "\x01\x00" - l = 0 - fec = "" - for o in x: - fec += "\x02\x00\x01" - # mask length - fec += struct.pack("!B",o[1]) - # Prefix - fec += inet_aton(o[0]) - l += 8 - s += struct.pack("!H",l) - s += fec - return s - def size(self, s): - """Get the size of this field""" - l = 4 + struct.unpack("!H",s[2:4])[0] - return l - def getfield(self, pkt, s): - l = self.size(s) - return s[l:],self.m2i(pkt, s[:l]) - - -# 3.4.2.1. Generic Label TLV - -class LabelTLVField(StrField): - def m2i(self, pkt, x): - return struct.unpack("!I",x[4:8])[0] - def i2m(self, pkt, x): - if type(x) is str: - return x - s = "\x02\x00\x00\x04" - s += struct.pack("!I",x) - return s - def size(self, s): - """Get the size of this field""" - l = 4 + struct.unpack("!H",s[2:4])[0] - return l - def getfield(self, pkt, s): - l = self.size(s) - return s[l:],self.m2i(pkt, s[:l]) - - -# 3.4.3. Address List TLV - -class AddressTLVField(StrField): - islist=1 - def m2i(self, pkt, x): - nbr = struct.unpack("!H",x[2:4])[0] - 2 - nbr /= 4 - x=x[6:] - list=[] - for i in range(0,nbr): - add = x[4*i:4*i+4] - list.append(inet_ntoa(add)) - return list - def i2m(self, pkt, x): - if type(x) is str: - return x - l=2+len(x)*4 - s = "\x01\x01"+struct.pack("!H",l)+"\x00\x01" - for o in x: - s += inet_aton(o) - return s - def size(self, s): - """Get the size of this field""" - l = 4 + struct.unpack("!H",s[2:4])[0] - return l - def getfield(self, pkt, s): - l = self.size(s) - return s[l:],self.m2i(pkt, s[:l]) - - -# 3.4.6. Status TLV - -class StatusTLVField(StrField): - islist=1 - def m2i(self, pkt, x): - l = [] - statuscode = struct.unpack("!I",x[4:8])[0] - l.append( (statuscode & 2**31) >> 31) - l.append( (statuscode & 2**30) >> 30) - l.append( statuscode & 0x3FFFFFFF ) - l.append( struct.unpack("!I", x[8:12])[0] ) - l.append( struct.unpack("!H", x[12:14])[0] ) - return l - def i2m(self, pkt, x): - if type(x) is str: - return x - s = "\x03\x00" + struct.pack("!H",10) - statuscode = 0 - if x[0] != 0: - statuscode += 2**31 - if x[1] != 0: - statuscode += 2**30 - statuscode += x[2] - s += struct.pack("!I",statuscode) - if len(x) > 3: - s += struct.pack("!I",x[3]) - else: - s += "\x00\x00\x00\x00" - if len(x) > 4: - s += struct.pack("!H",x[4]) - else: - s += "\x00\x00" - return s - def getfield(self, pkt, s): - l = 14 - return s[l:],self.m2i(pkt, s[:l]) - - -# 3.5.2 Common Hello Parameters TLV -class CommonHelloTLVField(StrField): - islist = 1 - def m2i(self, pkt, x): - list = [] - v = struct.unpack("!H",x[4:6])[0] - list.append(v) - flags = struct.unpack("B",x[6])[0] - v = ( flags & 0x80 ) >> 7 - list.append(v) - v = ( flags & 0x40 ) >> 7 - list.append(v) - return list - def i2m(self, pkt, x): - if type(x) is str: - return x - s = "\x04\x00\x00\x04" - s += struct.pack("!H",x[0]) - byte = 0 - if x[1] == 1: - byte += 0x80 - if x[2] == 1: - byte += 0x40 - s += struct.pack("!B",byte) - s += "\x00" - return s - def getfield(self, pkt, s): - l = 8 - return s[l:],self.m2i(pkt, s[:l]) - - -# 3.5.3 Common Session Parameters TLV -class CommonSessionTLVField(StrField): - islist = 1 - def m2i(self, pkt, x): - l = [] - l.append(struct.unpack("!H",x[6:8])[0]) - octet = struct.unpack("B",x[8:9])[0] - l.append( (octet & 2**7 ) >> 7 ) - l.append( (octet & 2**6 ) >> 6 ) - l.append( struct.unpack("B",x[9:10])[0] ) - l.append( struct.unpack("!H",x[10:12])[0] ) - l.append( inet_ntoa(x[12:16]) ) - l.append( struct.unpack("!H",x[16:18])[0] ) - return l - def i2m(self, pkt, x): - if type(x) is str: - return x - s = "\x05\x00\x00\x0E\x00\x01" - s += struct.pack("!H",x[0]) - octet = 0 - if x[1] != 0: - octet += 2**7 - if x[2] != 0: - octet += 2**6 - s += struct.pack("!B",octet) - s += struct.pack("!B",x[3]) - s += struct.pack("!H",x[4]) - s += inet_aton(x[5]) - s += struct.pack("!H",x[6]) - return s - def getfield(self, pkt, s): - l = 18 - return s[l:],self.m2i(pkt, s[:l]) - - - -## Messages ## - -# 3.5.1. Notification Message -class LDPNotification(Packet): - name = "LDPNotification" - fields_desc = [ BitField("u",0,1), - BitField("type", 0x0001, 15), - ShortField("len", None), - IntField("id", 0) , - StatusTLVField("status",(0,0,0,0,0)) ] - def post_build(self, p, pay): - if self.len is None: - l = len(p) - 4 - p = p[:2]+struct.pack("!H", l)+p[4:] - return p+pay - def guess_payload_class(self, p): - return guess_payload(p) - - -# 3.5.2. Hello Message -class LDPHello(Packet): - name = "LDPHello" - fields_desc = [ BitField("u",0,1), - BitField("type", 0x0100, 15), - ShortField("len", None), - IntField("id", 0) , - CommonHelloTLVField("params",[180,0,0]) ] - def post_build(self, p, pay): - if self.len is None: - l = len(p) - 4 - p = p[:2]+struct.pack("!H", l)+p[4:] - return p+pay - def guess_payload_class(self, p): - return guess_payload(p) - - -# 3.5.3. Initialization Message -class LDPInit(Packet): - name = "LDPInit" - fields_desc = [ BitField("u",0,1), - XBitField("type", 0x0200, 15), - ShortField("len", None), - IntField("id", 0), - CommonSessionTLVField("params",None)] - def post_build(self, p, pay): - if self.len is None: - l = len(p) - 4 - p = p[:2]+struct.pack("!H", l)+p[4:] - return p+pay - def guess_payload_class(self, p): - return guess_payload(p) - - -# 3.5.4. KeepAlive Message -class LDPKeepAlive(Packet): - name = "LDPKeepAlive" - fields_desc = [ BitField("u",0,1), - XBitField("type", 0x0201, 15), - ShortField("len", None), - IntField("id", 0)] - def post_build(self, p, pay): - if self.len is None: - l = len(p) - 4 - p = p[:2]+struct.pack("!H", l)+p[4:] - return p+pay - def guess_payload_class(self, p): - return guess_payload(p) - - -# 3.5.5. Address Message - -class LDPAddress(Packet): - name = "LDPAddress" - fields_desc = [ BitField("u",0,1), - XBitField("type", 0x0300, 15), - ShortField("len", None), - IntField("id", 0), - AddressTLVField("address",None) ] - def post_build(self, p, pay): - if self.len is None: - l = len(p) - 4 - p = p[:2]+struct.pack("!H", l)+p[4:] - return p+pay - def guess_payload_class(self, p): - return guess_payload(p) - - -# 3.5.6. Address Withdraw Message - -class LDPAddressWM(Packet): - name = "LDPAddressWM" - fields_desc = [ BitField("u",0,1), - XBitField("type", 0x0301, 15), - ShortField("len", None), - IntField("id", 0), - AddressTLVField("address",None) ] - def post_build(self, p, pay): - if self.len is None: - l = len(p) - 4 - p = p[:2]+struct.pack("!H", l)+p[4:] - return p+pay - def guess_payload_class(self, p): - return guess_payload(p) - - -# 3.5.7. Label Mapping Message - -class LDPLabelMM(Packet): - name = "LDPLabelMM" - fields_desc = [ BitField("u",0,1), - XBitField("type", 0x0400, 15), - ShortField("len", None), - IntField("id", 0), - FecTLVField("fec",None), - LabelTLVField("label",0)] - def post_build(self, p, pay): - if self.len is None: - l = len(p) - 4 - p = p[:2]+struct.pack("!H", l)+p[4:] - return p+pay - def guess_payload_class(self, p): - return guess_payload(p) - -# 3.5.8. Label Request Message - -class LDPLabelReqM(Packet): - name = "LDPLabelReqM" - fields_desc = [ BitField("u",0,1), - XBitField("type", 0x0401, 15), - ShortField("len", None), - IntField("id", 0), - FecTLVField("fec",None)] - def post_build(self, p, pay): - if self.len is None: - l = len(p) - 4 - p = p[:2]+struct.pack("!H", l)+p[4:] - return p+pay - def guess_payload_class(self, p): - return guess_payload(p) - - -# 3.5.9. Label Abort Request Message - -class LDPLabelARM(Packet): - name = "LDPLabelARM" - fields_desc = [ BitField("u",0,1), - XBitField("type", 0x0404, 15), - ShortField("len", None), - IntField("id", 0), - FecTLVField("fec",None), - IntField("labelRMid",0)] - def post_build(self, p, pay): - if self.len is None: - l = len(p) - 4 - p = p[:2]+struct.pack("!H", l)+p[4:] - return p+pay - def guess_payload_class(self, p): - return guess_payload(p) - - -# 3.5.10. Label Withdraw Message - -class LDPLabelWM(Packet): - name = "LDPLabelWM" - fields_desc = [ BitField("u",0,1), - XBitField("type", 0x0402, 15), - ShortField("len", None), - IntField("id", 0), - FecTLVField("fec",None), - LabelTLVField("label",0)] - def post_build(self, p, pay): - if self.len is None: - l = len(p) - 4 - p = p[:2]+struct.pack("!H", l)+p[4:] - return p+pay - def guess_payload_class(self, p): - return guess_payload(p) - - -# 3.5.11. Label Release Message - -class LDPLabelRelM(Packet): - name = "LDPLabelRelM" - fields_desc = [ BitField("u",0,1), - XBitField("type", 0x0403, 15), - ShortField("len", None), - IntField("id", 0), - FecTLVField("fec",None), - LabelTLVField("label",0)] - def post_build(self, p, pay): - if self.len is None: - l = len(p) - 4 - p = p[:2]+struct.pack("!H", l)+p[4:] - return p+pay - def guess_payload_class(self, p): - return guess_payload(p) - - -# 3.1. LDP PDUs -class LDP(Packet): - name = "LDP" - fields_desc = [ ShortField("version",1), - ShortField("len", None), - IPField("id","127.0.0.1"), - ShortField("space",0) ] - def post_build(self, p, pay): - if self.len is None: - l = len(p)+len(pay)-4 - p = p[:2]+struct.pack("!H", l)+p[4:] - return p+pay - def guess_payload_class(self, p): - return guess_payload(p) - -bind_layers( TCP, LDP, sport=646, dport=646 ) -bind_layers( UDP, LDP, sport=646, dport=646 ) diff --git a/scripts/external_libs/scapy-2.3.1/scapy/contrib/mpls.py b/scripts/external_libs/scapy-2.3.1/scapy/contrib/mpls.py deleted file mode 100644 index 037278c5..00000000 --- a/scripts/external_libs/scapy-2.3.1/scapy/contrib/mpls.py +++ /dev/null @@ -1,17 +0,0 @@ -# http://trac.secdev.org/scapy/ticket/31 - -# scapy.contrib.description = MPLS -# scapy.contrib.status = loads - -from scapy.packet import Packet,bind_layers -from scapy.fields import BitField,ByteField -from scapy.layers.l2 import Ether - -class MPLS(Packet): - name = "MPLS" - fields_desc = [ BitField("label", 3, 20), - BitField("cos", 0, 3), - BitField("s", 1, 1), - ByteField("ttl", 0) ] - -bind_layers(Ether, MPLS, type=0x8847) diff --git a/scripts/external_libs/scapy-2.3.1/scapy/contrib/ospf.py b/scripts/external_libs/scapy-2.3.1/scapy/contrib/ospf.py deleted file mode 100644 index a6422bd8..00000000 --- a/scripts/external_libs/scapy-2.3.1/scapy/contrib/ospf.py +++ /dev/null @@ -1,833 +0,0 @@ -#!/usr/bin/env python - -# scapy.contrib.description = OSPF -# scapy.contrib.status = loads - -""" -OSPF extension for Scapy <http://www.secdev.org/scapy> - -This module provides Scapy layers for the Open Shortest Path First -routing protocol as defined in RFC 2328 and RFC 5340. - -Copyright (c) 2008 Dirk Loss : mail dirk-loss de -Copyright (c) 2010 Jochen Bartl : jochen.bartl gmail com - -This program is free software; you can redistribute it and/or -modify it under the terms of the GNU General Public License -as published by the Free Software Foundation; either version 2 -of the License, or (at your option) any later version. - -This program is distributed in the hope that it will be useful, -but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -GNU General Public License for more details. -""" - - -from scapy.all import * - -EXT_VERSION = "v0.9.2" - - -class OSPFOptionsField(FlagsField): - - def __init__(self, name="options", default=0, size=8, - names=["MT", "E", "MC", "NP", "L", "DC", "O", "DN"]): - FlagsField.__init__(self, name, default, size, names) - - -_OSPF_types = {1: "Hello", - 2: "DBDesc", - 3: "LSReq", - 4: "LSUpd", - 5: "LSAck"} - - -class OSPF_Hdr(Packet): - name = "OSPF Header" - fields_desc = [ - ByteField("version", 2), - ByteEnumField("type", 1, _OSPF_types), - ShortField("len", None), - IPField("src", "1.1.1.1"), - IPField("area", "0.0.0.0"), # default: backbone - XShortField("chksum", None), - ShortEnumField("authtype", 0, {0:"Null", 1:"Simple", 2:"Crypto"}), - # Null or Simple Authentication - ConditionalField(XLongField("authdata", 0), lambda pkt:pkt.authtype != 2), - # Crypto Authentication - ConditionalField(XShortField("reserved", 0), lambda pkt:pkt.authtype == 2), - ConditionalField(ByteField("keyid", 1), lambda pkt:pkt.authtype == 2), - ConditionalField(ByteField("authdatalen", 0), lambda pkt:pkt.authtype == 2), - ConditionalField(XIntField("seq", 0), lambda pkt:pkt.authtype == 2), - # TODO: Support authdata (which is appended to the packets as if it were padding) - ] - - def post_build(self, p, pay): - # TODO: Remove LLS data from pay - # LLS data blocks may be attached to OSPF Hello and DD packets - # The length of the LLS block shall not be included into the length of OSPF packet - # See <http://tools.ietf.org/html/rfc5613> - p += pay - l = self.len - if l is None: - l = len(p) - p = p[:2] + struct.pack("!H", l) + p[4:] - if self.chksum is None: - if self.authtype == 2: - ck = 0 # Crypto, see RFC 2328, D.4.3 - else: - # Checksum is calculated without authentication data - # Algorithm is the same as in IP() - ck = checksum(p[:16] + p[24:]) - p = p[:12] + chr(ck >> 8) + chr(ck & 0xff) + p[14:] - # TODO: Handle Crypto: Add message digest (RFC 2328, D.4.3) - return p - - def hashret(self): - return struct.pack("H", self.area) + self.payload.hashret() - - def answers(self, other): - if (isinstance(other, OSPF_Hdr) and - self.area == other.area and - self.type == 5): # Only acknowledgements answer other packets - return self.payload.answers(other.payload) - return 0 - - -class OSPF_Hello(Packet): - name = "OSPF Hello" - fields_desc = [IPField("mask", "255.255.255.0"), - ShortField("hellointerval", 10), - OSPFOptionsField(), - ByteField("prio", 1), - IntField("deadinterval", 40), - IPField("router", "0.0.0.0"), - IPField("backup", "0.0.0.0"), - FieldListField("neighbors", [], IPField("", "0.0.0.0"), length_from=lambda pkt: (pkt.underlayer.len - 44))] - - def guess_payload_class(self, payload): - # check presence of LLS data block flag - if self.options & 0x10 == 0x10: - return OSPF_LLS_Hdr - else: - return Packet.guess_payload_class(self, payload) - - -class LLS_Generic_TLV(Packet): - name = "LLS Generic" - fields_desc = [ShortField("type", 1), - FieldLenField("len", None, length_of=lambda x: x.val), - StrLenField("val", "", length_from=lambda x: x.len)] - - def guess_payload_class(self, p): - return conf.padding_layer - - -class LLS_ExtendedOptionsField(FlagsField): - - def __init__(self, name="options", default=0, size=32, - names=["LR", "RS"]): - FlagsField.__init__(self, name, default, size, names) - - -class LLS_Extended_Options(LLS_Generic_TLV): - name = "LLS Extended Options and Flags" - fields_desc = [ShortField("type", 1), - ShortField("len", 4), - LLS_ExtendedOptionsField()] - - -class LLS_Crypto_Auth(LLS_Generic_TLV): - name = "LLS Cryptographic Authentication" - fields_desc = [ShortField("type", 2), - FieldLenField("len", 20, fmt="B", length_of=lambda x: x.authdata), - XIntField("sequence", "\x00\x00\x00\x00"), - StrLenField("authdata", "\x00" * 16, length_from=lambda x: x.len)] - - def post_build(self, p, pay): - p += pay - l = self.len - - if l is None: - # length = len(sequence) + len(authdata) + len(payload) - l = len(p[3:]) - p = p[:2] + struct.pack("!H", l) + p[3:] - - return p - -_OSPF_LLSclasses = {1: "LLS_Extended_Options", - 2: "LLS_Crypto_Auth"} - - -def _LLSGuessPayloadClass(p, **kargs): - """ Guess the correct LLS class for a given payload """ - - cls = conf.raw_layer - if len(p) >= 4: - typ = struct.unpack("!H", p[0:2])[0] - clsname = _OSPF_LLSclasses.get(typ, "LLS_Generic_TLV") - cls = globals()[clsname] - return cls(p, **kargs) - - -class OSPF_LLS_Hdr(Packet): - name = "OSPF Link-local signaling" - fields_desc = [XShortField("chksum", None), - # FIXME Length should be displayed in 32-bit words - ShortField("len", None), - PacketListField("llstlv", [], _LLSGuessPayloadClass)] - - def post_build(self, p, pay): - p += pay - l = self.len - if l is None: - # Length in 32-bit words - l = len(p) / 4 - p = p[:2] + struct.pack("!H", l) + p[4:] - if self.chksum is None: - c = checksum(p) - p = chr((c >> 8) & 0xff) + chr(c & 0xff) + p[2:] - return p - -_OSPF_LStypes = {1: "router", - 2: "network", - 3: "summaryIP", - 4: "summaryASBR", - 5: "external", - 7: "NSSAexternal"} - -_OSPF_LSclasses = {1: "OSPF_Router_LSA", - 2: "OSPF_Network_LSA", - 3: "OSPF_SummaryIP_LSA", - 4: "OSPF_SummaryASBR_LSA", - 5: "OSPF_External_LSA", - 7: "OSPF_NSSA_External_LSA"} - - -def ospf_lsa_checksum(lsa): - """ Fletcher checksum for OSPF LSAs, returned as a 2 byte string. - - Give the whole LSA packet as argument. - For details on the algorithm, see RFC 2328 chapter 12.1.7 and RFC 905 Annex B. - """ - # This is based on the GPLed C implementation in Zebra <http://www.zebra.org/> - - CHKSUM_OFFSET = 16 - - if len(lsa) < CHKSUM_OFFSET: - raise Exception("LSA Packet too short (%s bytes)" % len(lsa)) - - c0 = c1 = 0 - # Calculation is done with checksum set to zero - lsa = lsa[:CHKSUM_OFFSET] + "\x00\x00" + lsa[CHKSUM_OFFSET + 2:] - for char in lsa[2:]: # leave out age - c0 += ord(char) - c1 += c0 - - c0 %= 255 - c1 %= 255 - - x = ((len(lsa) - CHKSUM_OFFSET - 1) * c0 - c1) % 255 - - if (x <= 0): - x += 255 - - y = 510 - c0 - x - - if (y > 255): - y -= 255 - #checksum = (x << 8) + y - - return chr(x) + chr(y) - - -class OSPF_LSA_Hdr(Packet): - name = "OSPF LSA Header" - fields_desc = [ShortField("age", 1), - OSPFOptionsField(), - ByteEnumField("type", 1, _OSPF_LStypes), - IPField("id", "192.168.0.0"), - IPField("adrouter", "1.1.1.1"), - XIntField("seq", 0x80000001), - XShortField("chksum", 0), - ShortField("len", 36)] - - def extract_padding(self, s): - return "", s - - -_OSPF_Router_LSA_types = {1: "p2p", - 2: "transit", - 3: "stub", - 4: "virtual"} - - -class OSPF_Link(Packet): - name = "OSPF Link" - fields_desc = [IPField("id", "192.168.0.0"), - IPField("data", "255.255.255.0"), - ByteEnumField("type", 3, _OSPF_Router_LSA_types), - ByteField("toscount", 0), - ShortField("metric", 10), - # TODO: define correct conditions - ConditionalField(ByteField("tos", 0), lambda pkt: False), - ConditionalField(ByteField("reserved", 0), lambda pkt: False), - ConditionalField(ShortField("tosmetric", 0), lambda pkt: False)] - - def extract_padding(self, s): - return "", s - - -def _LSAGuessPayloadClass(p, **kargs): - """ Guess the correct LSA class for a given payload """ - # This is heavily based on scapy-cdp.py by Nicolas Bareil and Arnaud Ebalard - # XXX: This only works if all payload - cls = conf.raw_layer - if len(p) >= 4: - typ = struct.unpack("!B", p[3])[0] - clsname = _OSPF_LSclasses.get(typ, "Raw") - cls = globals()[clsname] - return cls(p, **kargs) - - -class OSPF_BaseLSA(Packet): - """ An abstract base class for Link State Advertisements """ - - def post_build(self, p, pay): - length = self.len - if length is None: - length = len(p) - p = p[:18] + struct.pack("!H", length) + p[20:] - if self.chksum is None: - chksum = ospf_lsa_checksum(p) - p = p[:16] + chksum + p[18:] - return p # p+pay? - - def extract_padding(self, s): - length = self.len - return "", s - - -class OSPF_Router_LSA(OSPF_BaseLSA): - name = "OSPF Router LSA" - fields_desc = [ShortField("age", 1), - OSPFOptionsField(), - ByteField("type", 1), - IPField("id", "1.1.1.1"), - IPField("adrouter", "1.1.1.1"), - XIntField("seq", 0x80000001), - XShortField("chksum", None), - ShortField("len", None), - FlagsField("flags", 0, 8, ["B", "E", "V", "W", "Nt"]), - ByteField("reserved", 0), - FieldLenField("linkcount", None, count_of="linklist"), - PacketListField("linklist", [], OSPF_Link, - count_from=lambda pkt: pkt.linkcount, - length_from=lambda pkt: pkt.linkcount * 12)] - - -class OSPF_Network_LSA(OSPF_BaseLSA): - name = "OSPF Network LSA" - fields_desc = [ShortField("age", 1), - OSPFOptionsField(), - ByteField("type", 2), - IPField("id", "192.168.0.0"), - IPField("adrouter", "1.1.1.1"), - XIntField("seq", 0x80000001), - XShortField("chksum", None), - ShortField("len", None), - IPField("mask", "255.255.255.0"), - FieldListField("routerlist", [], IPField("", "1.1.1.1"), - length_from=lambda pkt: pkt.len - 24)] - - -class OSPF_SummaryIP_LSA(OSPF_BaseLSA): - name = "OSPF Summary LSA (IP Network)" - fields_desc = [ShortField("age", 1), - OSPFOptionsField(), - ByteField("type", 3), - IPField("id", "192.168.0.0"), - IPField("adrouter", "1.1.1.1"), - XIntField("seq", 0x80000001), - XShortField("chksum", None), - ShortField("len", None), - IPField("mask", "255.255.255.0"), - ByteField("reserved", 0), - X3BytesField("metric", 10), - # TODO: Define correct conditions - ConditionalField(ByteField("tos", 0), lambda pkt:False), - ConditionalField(X3BytesField("tosmetric", 0), lambda pkt:False)] - - -class OSPF_SummaryASBR_LSA(OSPF_SummaryIP_LSA): - name = "OSPF Summary LSA (AS Boundary Router)" - type = 4 - id = "2.2.2.2" - mask = "0.0.0.0" - metric = 20 - - -class OSPF_External_LSA(OSPF_BaseLSA): - name = "OSPF External LSA (ASBR)" - fields_desc = [ShortField("age", 1), - OSPFOptionsField(), - ByteField("type", 5), - IPField("id", "192.168.0.0"), - IPField("adrouter", "2.2.2.2"), - XIntField("seq", 0x80000001), - XShortField("chksum", None), - ShortField("len", None), - IPField("mask", "255.255.255.0"), - FlagsField("ebit", 0, 1, ["E"]), - BitField("reserved", 0, 7), - X3BytesField("metric", 20), - IPField("fwdaddr", "0.0.0.0"), - XIntField("tag", 0), - # TODO: Define correct conditions - ConditionalField(ByteField("tos", 0), lambda pkt:False), - ConditionalField(X3BytesField("tosmetric", 0), lambda pkt:False)] - - -class OSPF_NSSA_External_LSA(OSPF_External_LSA): - name = "OSPF NSSA External LSA" - type = 7 - - -class OSPF_DBDesc(Packet): - name = "OSPF Database Description" - fields_desc = [ShortField("mtu", 1500), - OSPFOptionsField(), - FlagsField("dbdescr", 0, 8, ["MS", "M", "I", "R", "4", "3", "2", "1"]), - IntField("ddseq", 1), - PacketListField("lsaheaders", None, OSPF_LSA_Hdr, - count_from = lambda pkt: None, - length_from = lambda pkt: pkt.underlayer.len - 24 - 8)] - - def guess_payload_class(self, payload): - # check presence of LLS data block flag - if self.options & 0x10 == 0x10: - return OSPF_LLS_Hdr - else: - return Packet.guess_payload_class(self, payload) - - -class OSPF_LSReq_Item(Packet): - name = "OSPF Link State Request (item)" - fields_desc = [IntEnumField("type", 1, _OSPF_LStypes), - IPField("id", "1.1.1.1"), - IPField("adrouter", "1.1.1.1")] - - def extract_padding(self, s): - return "", s - - -class OSPF_LSReq(Packet): - name = "OSPF Link State Request (container)" - fields_desc = [PacketListField("requests", None, OSPF_LSReq_Item, - count_from = lambda pkt:None, - length_from = lambda pkt:pkt.underlayer.len - 24)] - - -class OSPF_LSUpd(Packet): - name = "OSPF Link State Update" - fields_desc = [FieldLenField("lsacount", None, fmt="!I", count_of="lsalist"), - PacketListField("lsalist", [], _LSAGuessPayloadClass, - count_from = lambda pkt: pkt.lsacount, - length_from = lambda pkt: pkt.underlayer.len - 24)] - - -class OSPF_LSAck(Packet): - name = "OSPF Link State Acknowledgement" - fields_desc = [PacketListField("lsaheaders", None, OSPF_LSA_Hdr, - count_from = lambda pkt: None, - length_from = lambda pkt: pkt.underlayer.len - 24)] - - def answers(self, other): - if isinstance(other, OSPF_LSUpd): - for reqLSA in other.lsalist: - for ackLSA in self.lsaheaders: - if (reqLSA.type == ackLSA.type and - reqLSA.seq == ackLSA.seq): - return 1 - return 0 - - -#------------------------------------------------------------------------------ -# OSPFv3 -#------------------------------------------------------------------------------ -# TODO: Add length_from / adjust functionality to IP6Field and remove this class -class OspfIP6Field(StrField, IP6Field): - """ - Special IP6Field for prefix fields in OSPFv3 LSAs - """ - - def __init__(self, name, default, length=None, length_from=None): - StrField.__init__(self, name, default) - self.length_from = length_from - if length is not None: - self.length_from = lambda pkt, length = length: length - - def any2i(self, pkt, x): - return IP6Field.any2i(self, pkt, x) - - def i2repr(self, pkt, x): - return IP6Field.i2repr(self, pkt, x) - - def h2i(self, pkt, x): - return IP6Field.h2i(self, pkt, x) - - def i2m(self, pkt, x): - x = inet_pton(socket.AF_INET6, x) - l = self.length_from(pkt) - l = self.prefixlen_to_bytelen(l) - - return x[:l] - - def m2i(self, pkt, x): - l = self.length_from(pkt) - - prefixlen = self.prefixlen_to_bytelen(l) - if l > 128: - warning("OspfIP6Field: Prefix length is > 128. Dissection of this packet will fail") - else: - pad = "\x00" * (16 - prefixlen) - x += pad - - return inet_ntop(socket.AF_INET6, x) - - def prefixlen_to_bytelen(self, l): - if l <= 32: - return 4 - elif l <= 64: - return 8 - elif l <= 96: - return 12 - else: - return 16 - - def i2len(self, pkt, x): - l = self.length_from(pkt) - l = self.prefixlen_to_bytelen(l) - - return l - - def getfield(self, pkt, s): - l = self.length_from(pkt) - l = self.prefixlen_to_bytelen(l) - - return s[l:], self.m2i(pkt, s[:l]) - - -class OSPFv3_Hdr(Packet): - name = "OSPFv3 Header" - fields_desc = [ByteField("version", 3), - ByteEnumField("type", 1, _OSPF_types), - ShortField("len", None), - IPField("src", "1.1.1.1"), - IPField("area", "0.0.0.0"), - XShortField("chksum", None), - ByteField("instance", 0), - ByteField("reserved", 0)] - - def post_build(self, p, pay): - p += pay - l = self.len - - if l is None: - l = len(p) - p = p[:2] + struct.pack("!H", l) + p[4:] - - if self.chksum is None: - chksum = in6_chksum(89, self.underlayer, p) - p = p[:12] + chr(chksum >> 8) + chr(chksum & 0xff) + p[14:] - - return p - - -class OSPFv3OptionsField(FlagsField): - - def __init__(self, name="options", default=0, size=24, - names=["V6", "E", "MC", "N", "R", "DC", "AF", "L", "I", "F"]): - FlagsField.__init__(self, name, default, size, names) - - -class OSPFv3_Hello(Packet): - name = "OSPFv3 Hello" - fields_desc = [IntField("intid", 0), - ByteField("prio", 1), - OSPFv3OptionsField(), - ShortField("hellointerval", 10), - ShortField("deadinterval", 40), - IPField("router", "0.0.0.0"), - IPField("backup", "0.0.0.0"), - FieldListField("neighbors", [], IPField("", "0.0.0.0"), - length_from=lambda pkt: (pkt.underlayer.len - 36))] - - -_OSPFv3_LStypes = {0x2001: "router", - 0x2002: "network", - 0x2003: "interAreaPrefix", - 0x2004: "interAreaRouter", - 0x4005: "asExternal", - 0x2007: "type7", - 0x0008: "link", - 0x2009: "intraAreaPrefix"} - -_OSPFv3_LSclasses = {0x2001: "OSPFv3_Router_LSA", - 0x2002: "OSPFv3_Network_LSA", - 0x2003: "OSPFv3_Inter_Area_Prefix_LSA", - 0x2004: "OSPFv3_Inter_Area_Router_LSA", - 0x4005: "OSPFv3_AS_External_LSA", - 0x2007: "OSPFv3_Type_7_LSA", - 0x0008: "OSPFv3_Link_LSA", - 0x2009: "OSPFv3_Intra_Area_Prefix_LSA"} - - -class OSPFv3_LSA_Hdr(Packet): - name = "OSPFv3 LSA Header" - fields_desc = [ShortField("age", 1), - ShortEnumField("type", 0x2001, _OSPFv3_LStypes), - IPField("id", "0.0.0.0"), - IPField("adrouter", "1.1.1.1"), - XIntField("seq", 0x80000001), - XShortField("chksum", 0), - ShortField("len", 36)] - - def extract_padding(self, s): - return "", s - - -def _OSPFv3_LSAGuessPayloadClass(p, **kargs): - """ Guess the correct OSPFv3 LSA class for a given payload """ - - cls = conf.raw_layer - - if len(p) >= 6: - typ = struct.unpack("!H", p[2:4])[0] - clsname = _OSPFv3_LSclasses.get(typ, "Raw") - cls = globals()[clsname] - - return cls(p, **kargs) - - -_OSPFv3_Router_LSA_types = {1: "p2p", - 2: "transit", - 3: "reserved", - 4: "virtual"} - - -class OSPFv3_Link(Packet): - name = "OSPFv3 Link" - fields_desc = [ByteEnumField("type", 1, _OSPFv3_Router_LSA_types), - ByteField("reserved", 0), - ShortField("metric", 10), - IntField("intid", 0), - IntField("neighintid", 0), - IPField("neighbor", "2.2.2.2")] - - def extract_padding(self, s): - return "", s - - -class OSPFv3_Router_LSA(OSPF_BaseLSA): - name = "OSPFv3 Router LSA" - fields_desc = [ShortField("age", 1), - ShortEnumField("type", 0x2001, _OSPFv3_LStypes), - IPField("id", "0.0.0.0"), - IPField("adrouter", "1.1.1.1"), - XIntField("seq", 0x80000001), - XShortField("chksum", None), - ShortField("len", None), - FlagsField("flags", 0, 8, ["B", "E", "V", "W"]), - OSPFv3OptionsField(), - PacketListField("linklist", [], OSPFv3_Link, - length_from=lambda pkt:pkt.len - 24)] - - -class OSPFv3_Network_LSA(OSPF_BaseLSA): - name = "OSPFv3 Network LSA" - fields_desc = [ShortField("age", 1), - ShortEnumField("type", 0x2002, _OSPFv3_LStypes), - IPField("id", "0.0.0.0"), - IPField("adrouter", "1.1.1.1"), - XIntField("seq", 0x80000001), - XShortField("chksum", None), - ShortField("len", None), - ByteField("reserved", 0), - OSPFv3OptionsField(), - FieldListField("routerlist", [], IPField("", "0.0.0.1"), - length_from=lambda pkt: pkt.len - 24)] - - -class OSPFv3PrefixOptionsField(FlagsField): - - def __init__(self, name="prefixoptions", default=0, size=8, - names=["NU", "LA", "MC", "P"]): - FlagsField.__init__(self, name, default, size, names) - - -class OSPFv3_Inter_Area_Prefix_LSA(OSPF_BaseLSA): - name = "OSPFv3 Inter Area Prefix LSA" - fields_desc = [ShortField("age", 1), - ShortEnumField("type", 0x2003, _OSPFv3_LStypes), - IPField("id", "0.0.0.0"), - IPField("adrouter", "1.1.1.1"), - XIntField("seq", 0x80000001), - XShortField("chksum", None), - ShortField("len", None), - ByteField("reserved", 0), - X3BytesField("metric", 10), - ByteField("prefixlen", 64), - OSPFv3PrefixOptionsField(), - ShortField("reserved2", 0), - OspfIP6Field("prefix", "2001:db8:0:42::", length_from=lambda pkt: pkt.prefixlen)] - - -class OSPFv3_Inter_Area_Router_LSA(OSPF_BaseLSA): - name = "OSPFv3 Inter Area Router LSA" - fields_desc = [ShortField("age", 1), - ShortEnumField("type", 0x2004, _OSPFv3_LStypes), - IPField("id", "0.0.0.0"), - IPField("adrouter", "1.1.1.1"), - XIntField("seq", 0x80000001), - XShortField("chksum", None), - ShortField("len", None), - ByteField("reserved", 0), - X3BytesField("metric", 1), - IPField("router", "2.2.2.2")] - - -class OSPFv3_AS_External_LSA(OSPF_BaseLSA): - name = "OSPFv3 AS External LSA" - fields_desc = [ShortField("age", 1), - ShortEnumField("type", 0x4005, _OSPFv3_LStypes), - IPField("id", "0.0.0.0"), - IPField("adrouter", "1.1.1.1"), - XIntField("seq", 0x80000001), - XShortField("chksum", None), - ShortField("len", None), - FlagsField("flags", 0, 8, ["T", "F", "E"]), - X3BytesField("metric", 20), - ByteField("prefixlen", 64), - OSPFv3PrefixOptionsField(), - ShortEnumField("reflstype", 0, _OSPFv3_LStypes), - OspfIP6Field("prefix", "2001:db8:0:42::", length_from=lambda pkt: pkt.prefixlen), - ConditionalField(IP6Field("fwaddr", "::"), lambda pkt: pkt.flags & 0x02 == 0x02), - ConditionalField(IntField("tag", 0), lambda pkt: pkt.flags & 0x01 == 0x01), - ConditionalField(IPField("reflsid", 0), lambda pkt: pkt.reflstype != 0)] - - -class OSPFv3_Type_7_LSA(OSPFv3_AS_External_LSA): - name = "OSPFv3 Type 7 LSA" - type = 0x2007 - - -class OSPFv3_Prefix_Item(Packet): - name = "OSPFv3 Link Prefix Item" - fields_desc = [ByteField("prefixlen", 64), - OSPFv3PrefixOptionsField(), - ShortField("metric", 10), - OspfIP6Field("prefix", "2001:db8:0:42::", length_from=lambda pkt: pkt.prefixlen)] - - def extract_padding(self, s): - return "", s - - -class OSPFv3_Link_LSA(OSPF_BaseLSA): - name = "OSPFv3 Link LSA" - fields_desc = [ShortField("age", 1), - ShortEnumField("type", 0x0008, _OSPFv3_LStypes), - IPField("id", "0.0.0.0"), - IPField("adrouter", "1.1.1.1"), - XIntField("seq", 0x80000001), - XShortField("chksum", None), - ShortField("len", None), - ByteField("prio", 1), - OSPFv3OptionsField(), - IP6Field("lladdr", "fe80::"), - IntField("prefixes", 0), - PacketListField("prefixlist", None, OSPFv3_Prefix_Item, - count_from = lambda pkt: pkt.prefixes)] - - -class OSPFv3_Intra_Area_Prefix_LSA(OSPF_BaseLSA): - name = "OSPFv3 Intra Area Prefix LSA" - fields_desc = [ShortField("age", 1), - ShortEnumField("type", 0x2009, _OSPFv3_LStypes), - IPField("id", "0.0.0.0"), - IPField("adrouter", "1.1.1.1"), - XIntField("seq", 0x80000001), - XShortField("chksum", None), - ShortField("len", None), - ShortField("prefixes", 0), - ShortEnumField("reflstype", 0, _OSPFv3_LStypes), - IPField("reflsid", "0.0.0.0"), - IPField("refadrouter", "0.0.0.0"), - PacketListField("prefixlist", None, OSPFv3_Prefix_Item, - count_from = lambda pkt: pkt.prefixes)] - - -class OSPFv3_DBDesc(Packet): - name = "OSPFv3 Database Description" - fields_desc = [ByteField("reserved", 0), - OSPFv3OptionsField(), - ShortField("mtu", 1500), - ByteField("reserved2", 0), - FlagsField("dbdescr", 0, 8, ["MS", "M", "I", "R"]), - IntField("ddseq", 1), - PacketListField("lsaheaders", None, OSPFv3_LSA_Hdr, - count_from = lambda pkt:None, - length_from = lambda pkt:pkt.underlayer.len - 28)] - - -class OSPFv3_LSReq_Item(Packet): - name = "OSPFv3 Link State Request (item)" - fields_desc = [ShortField("reserved", 0), - ShortEnumField("type", 0x2001, _OSPFv3_LStypes), - IPField("id", "1.1.1.1"), - IPField("adrouter", "1.1.1.1")] - - def extract_padding(self, s): - return "", s - - -class OSPFv3_LSReq(Packet): - name = "OSPFv3 Link State Request (container)" - fields_desc = [PacketListField("requests", None, OSPFv3_LSReq_Item, - count_from = lambda pkt:None, - length_from = lambda pkt:pkt.underlayer.len - 16)] - - -class OSPFv3_LSUpd(Packet): - name = "OSPFv3 Link State Update" - fields_desc = [FieldLenField("lsacount", None, fmt="!I", count_of="lsalist"), - PacketListField("lsalist", [], _OSPFv3_LSAGuessPayloadClass, - count_from = lambda pkt:pkt.lsacount, - length_from = lambda pkt:pkt.underlayer.len - 16)] - - -class OSPFv3_LSAck(Packet): - name = "OSPFv3 Link State Acknowledgement" - fields_desc = [PacketListField("lsaheaders", None, OSPFv3_LSA_Hdr, - count_from = lambda pkt:None, - length_from = lambda pkt:pkt.underlayer.len - 16)] - - -bind_layers(IP, OSPF_Hdr, proto=89) -bind_layers(OSPF_Hdr, OSPF_Hello, type=1) -bind_layers(OSPF_Hdr, OSPF_DBDesc, type=2) -bind_layers(OSPF_Hdr, OSPF_LSReq, type=3) -bind_layers(OSPF_Hdr, OSPF_LSUpd, type=4) -bind_layers(OSPF_Hdr, OSPF_LSAck, type=5) - -bind_layers(IPv6, OSPFv3_Hdr, nh=89) -bind_layers(OSPFv3_Hdr, OSPFv3_Hello, type=1) -bind_layers(OSPFv3_Hdr, OSPFv3_DBDesc, type=2) -bind_layers(OSPFv3_Hdr, OSPFv3_LSReq, type=3) -bind_layers(OSPFv3_Hdr, OSPFv3_LSUpd, type=4) -bind_layers(OSPFv3_Hdr, OSPFv3_LSAck, type=5) - - -if __name__ == "__main__": - interact(mydict=globals(), mybanner="OSPF extension %s" % EXT_VERSION) diff --git a/scripts/external_libs/scapy-2.3.1/scapy/contrib/ppi.py b/scripts/external_libs/scapy-2.3.1/scapy/contrib/ppi.py deleted file mode 100644 index f4364096..00000000 --- a/scripts/external_libs/scapy-2.3.1/scapy/contrib/ppi.py +++ /dev/null @@ -1,86 +0,0 @@ -## This file is (hopefully) part of Scapy -## See http://www.secdev.org/projects/scapy for more informations -## <jellch@harris.com> -## This program is published under a GPLv2 license - -# scapy.contrib.description = PPI -# scapy.contrib.status = loads - - -""" -PPI (Per-Packet Information). -""" -import logging,struct -from scapy.config import conf -from scapy.packet import * -from scapy.fields import * -from scapy.layers.l2 import Ether -from scapy.layers.dot11 import Dot11 - -# Dictionary to map the TLV type to the class name of a sub-packet -_ppi_types = {} -def addPPIType(id, value): - _ppi_types[id] = value -def getPPIType(id, default="default"): - return _ppi_types.get(id, _ppi_types.get(default, None)) - - -# Default PPI Field Header -class PPIGenericFldHdr(Packet): - name = "PPI Field Header" - fields_desc = [ LEShortField('pfh_type', 0), - FieldLenField('pfh_length', None, length_of="value", fmt='<H', adjust=lambda p,x:x+4), - StrLenField("value", "", length_from=lambda p:p.pfh_length) ] - - def extract_padding(self, p): - return "",p - -def _PPIGuessPayloadClass(p, **kargs): - """ This function tells the PacketListField how it should extract the - TLVs from the payload. We pass cls only the length string - pfh_len says it needs. If a payload is returned, that means - part of the sting was unused. This converts to a Raw layer, and - the remainder of p is added as Raw's payload. If there is no - payload, the remainder of p is added as out's payload. - """ - if len(p) >= 4: - t,pfh_len = struct.unpack("<HH", p[:4]) - # Find out if the value t is in the dict _ppi_types. - # If not, return the default TLV class - cls = getPPIType(t, "default") - pfh_len += 4 - out = cls(p[:pfh_len], **kargs) - if (out.payload): - out.payload = conf.raw_layer(out.payload.load) - if (len(p) > pfh_len): - out.payload.payload = conf.padding_layer(p[pfh_len:]) - elif (len(p) > pfh_len): - out.payload = conf.padding_layer(p[pfh_len:]) - - else: - out = conf.raw_layer(p, **kargs) - return out - - - - -class PPI(Packet): - name = "PPI Packet Header" - fields_desc = [ ByteField('pph_version', 0), - ByteField('pph_flags', 0), - FieldLenField('pph_len', None, length_of="PPIFieldHeaders", fmt="<H", adjust=lambda p,x:x+8 ), - LEIntField('dlt', None), - PacketListField("PPIFieldHeaders", [], _PPIGuessPayloadClass, length_from=lambda p:p.pph_len-8,) ] - def guess_payload_class(self,payload): - return conf.l2types.get(self.dlt, Packet.guess_payload_class(self, payload)) - -#Register PPI -addPPIType("default", PPIGenericFldHdr) - -conf.l2types.register(192, PPI) -conf.l2types.register_num2layer(192, PPI) - -bind_layers(PPI, Dot11, dlt=conf.l2types.get(Dot11)) -bind_layers(Dot11, PPI) -bind_layers(PPI, Ether, dlt=conf.l2types.get(Ether)) -bind_layers(Dot11, Ether) diff --git a/scripts/external_libs/scapy-2.3.1/scapy/contrib/ppi_cace.py b/scripts/external_libs/scapy-2.3.1/scapy/contrib/ppi_cace.py deleted file mode 100644 index ba2c4abf..00000000 --- a/scripts/external_libs/scapy-2.3.1/scapy/contrib/ppi_cace.py +++ /dev/null @@ -1,87 +0,0 @@ -## This file is (hopefully) part of Scapy -## See http://www.secdev.org/projects/scapy for more informations -## <jellch@harris.com> -## This program is published under a GPLv2 license - -# scapy.contrib.description = PPI CACE -# scapy.contrib.status = loads - -""" -CACE PPI types -""" -import logging,struct -from scapy.config import conf -from scapy.packet import * -from scapy.fields import * -from scapy.layers.l2 import Ether -from scapy.layers.dot11 import Dot11 -from scapy.contrib.ppi import * - -PPI_DOT11COMMON = 2 -PPI_DOT11NMAC = 3 -PPI_DOT11NMACPHY = 4 -PPI_SPECTRUMMAP = 5 -PPI_PROCESSINFO = 6 -PPI_CAPTUREINFO = 7 -PPI_AGGREGATION = 8 -PPI_DOT3 = 9 - -# PPI 802.11 Common Field Header Fields -class dBmByteField(Field): - def __init__(self, name, default): - Field.__init__(self, name, default, "b") - def i2repr(self, pkt, val): - if (val != None): - val = "%4d dBm" % val - return val - -class PPITSFTField(LELongField): - def i2h(self, pkt, val): - flags = 0 - if (pkt): - flags = pkt.getfieldval("Pkt_Flags") - if not flags: - flags = 0 - if (flags & 0x02): - scale = 1e-3 - else: - scale = 1e-6 - tout = scale * float(val) - return tout - def h2i(self, pkt, val): - scale = 1e6 - if pkt: - flags = pkt.getfieldval("Pkt_Flags") - if flags: - if (flags & 0x02): - scale = 1e3 - tout = int((scale * val) + 0.5) - return tout - -_PPIDot11CommonChFlags = ['','','','','Turbo','CCK','OFDM','2GHz','5GHz', - 'PassiveOnly','Dynamic CCK-OFDM','GSFK'] - -_PPIDot11CommonPktFlags = ['FCS','TSFT_ms','FCS_Invalid','PHY_Error'] - -# PPI 802.11 Common Field Header -class Dot11Common(Packet): - name = "PPI 802.11-Common" - fields_desc = [ LEShortField('pfh_type',PPI_DOT11COMMON), - LEShortField('pfh_length', 20), - PPITSFTField('TSF_Timer', 0), - FlagsField('Pkt_Flags',0, -16, _PPIDot11CommonPktFlags), - LEShortField('Rate',0), - LEShortField('Ch_Freq',0), - FlagsField('Ch_Flags', 0, -16, _PPIDot11CommonChFlags), - ByteField('FHSS_Hop',0), - ByteField('FHSS_Pat',0), - dBmByteField('Antsignal',-128), - dBmByteField('Antnoise',-128)] - - def extract_padding(self, p): - return "",p -#Hopefully other CACE defined types will be added here. - -#Add the dot11common layer to the PPI array -addPPIType(PPI_DOT11COMMON, Dot11Common) - diff --git a/scripts/external_libs/scapy-2.3.1/scapy/contrib/ppi_geotag.py b/scripts/external_libs/scapy-2.3.1/scapy/contrib/ppi_geotag.py deleted file mode 100644 index 19371512..00000000 --- a/scripts/external_libs/scapy-2.3.1/scapy/contrib/ppi_geotag.py +++ /dev/null @@ -1,464 +0,0 @@ -## This file is (hopefully) part of Scapy -## See http://www.secdev.org/projects/scapy for more informations -## <jellch@harris.com> -## This program is published under a GPLv2 license - -# scapy.contrib.description = PPI GEOLOCATION -# scapy.contrib.status = loads - - -""" -PPI-GEOLOCATION tags -""" -import struct -from scapy.packet import * -from scapy.fields import * -from scapy.contrib.ppi import PPIGenericFldHdr,addPPIType - -CURR_GEOTAG_VER = 2 #Major revision of specification - -PPI_GPS = 30002 -PPI_VECTOR = 30003 -PPI_SENSOR = 30004 -PPI_ANTENNA = 30005 -#The FixedX_Y Fields are used to store fixed point numbers in a variety of fields in the GEOLOCATION-TAGS specification -class Fixed3_6Field(LEIntField): - def i2h(self, pkt, x): - if x is not None: - if (x < 0): - warning("Fixed3_6: Internal value too negative: %d" % x) - x = 0 - elif (x > 999999999): - warning("Fixed3_6: Internal value too positive: %d" % x) - x = 999999999 - x = x * 1e-6 - return x - def h2i(self, pkt, x): - if x is not None: - if (x <= -0.5e-6): - warning("Fixed3_6: Input value too negative: %.7f" % x) - x = 0 - elif (x >= 999.9999995): - warning("Fixed3_6: Input value too positive: %.7f" % x) - x = 999.999999 - x = int(round(x * 1e6)) - return x - def i2m(self, pkt, x): - """Convert internal value to machine value""" - if x is None: - #Try to return zero if undefined - x = self.h2i(pkt, 0) - return x - - def i2repr(self,pkt,x): - if x is None: - y=0 - else: - y=self.i2h(pkt,x) - return "%3.6f"%(y) -class Fixed3_7Field(LEIntField): - def i2h(self, pkt, x): - if x is not None: - if (x < 0): - warning("Fixed3_7: Internal value too negative: %d" % x) - x = 0 - elif (x > 3600000000): - warning("Fixed3_7: Internal value too positive: %d" % x) - x = 3600000000 - x = (x - 1800000000) * 1e-7 - return x - def h2i(self, pkt, x): - if x is not None: - if (x <= -180.00000005): - warning("Fixed3_7: Input value too negative: %.8f" % x) - x = -180.0 - elif (x >= 180.00000005): - warning("Fixed3_7: Input value too positive: %.8f" % x) - x = 180.0 - x = int(round((x + 180.0) * 1e7)) - return x - def i2m(self, pkt, x): - """Convert internal value to machine value""" - if x is None: - #Try to return zero if undefined - x = self.h2i(pkt, 0) - return x - def i2repr(self,pkt,x): - if x is None: - y=0 - else: - y=self.i2h(pkt,x) - return "%3.7f"%(y) - -class Fixed6_4Field(LEIntField): - def i2h(self, pkt, x): - if x is not None: - if (x < 0): - warning("Fixed6_4: Internal value too negative: %d" % x) - x = 0 - elif (x > 3600000000): - warning("Fixed6_4: Internal value too positive: %d" % x) - x = 3600000000 - x = (x - 1800000000) * 1e-4 - return x - def h2i(self, pkt, x): - if x is not None: - if (x <= -180000.00005): - warning("Fixed6_4: Input value too negative: %.5f" % x) - x = -180000.0 - elif (x >= 180000.00005): - warning("Fixed6_4: Input value too positive: %.5f" % x) - x = 180000.0 - x = int(round((x + 180000.0) * 1e4)) - return x - def i2m(self, pkt, x): - """Convert internal value to machine value""" - if x is None: - #Try to return zero if undefined - x = self.h2i(pkt, 0) - return x - def i2repr(self,pkt,x): - if x is None: - y=0 - else: - y=self.i2h(pkt,x) - return "%6.4f"%(y) -#The GPS timestamps fractional time counter is stored in a 32-bit unsigned ns counter. -#The ept field is as well, -class NSCounter_Field(LEIntField): - def i2h(self, pkt, x): #converts nano-seconds to seconds for output - if x is not None: - if (x < 0): - warning("NSCounter_Field: Internal value too negative: %d" % x) - x = 0 - elif (x >= 2**32): - warning("NSCounter_Field: Internal value too positive: %d" % x) - x = 2**32-1 - x = (x / 1e9) - return x - def h2i(self, pkt, x): #converts input in seconds into nano-seconds for storage - if x is not None: - if (x < 0): - warning("NSCounter_Field: Input value too negative: %.10f" % x) - x = 0 - elif (x >= (2**32) / 1e9): - warning("NSCounter_Field: Input value too positive: %.10f" % x) - x = (2**32-1) / 1e9 - x = int(round((x * 1e9))) - return x - def i2repr(self,pkt,x): - if x is None: - y=0 - else: - y=self.i2h(pkt,x) - return "%1.9f"%(y) - -class UTCTimeField(IntField): - def __init__(self, name, default, epoch=time.gmtime(0), strf="%a, %d %b %Y %H:%M:%S +0000"): - IntField.__init__(self, name, default) - self.epoch = epoch - self.delta = time.mktime(epoch) - time.mktime(time.gmtime(0)) - self.strf = strf - def i2repr(self, pkt, x): - if x is None: - x = 0 - x = int(x) + self.delta - t = time.strftime(self.strf, time.gmtime(x)) - return "%s (%d)" % (t, x) - -class LETimeField(UTCTimeField,LEIntField): - def __init__(self, name, default, epoch=time.gmtime(0), strf="%a, %d %b %Y %H:%M:%S +0000"): - LEIntField.__init__(self, name, default) - self.epoch = epoch - self.delta = time.mktime(epoch) - time.mktime(time.gmtime(0)) - self.strf = strf - -class SignedByteField(Field): - def __init__(self, name, default): - Field.__init__(self, name, default, "b") - def randval(self): - return RandSByte() - -class XLEShortField(LEShortField,XShortField): - def i2repr(self, pkt, x): - return XShortField.i2repr(self, pkt, x) - -class XLEIntField(LEIntField,XIntField): - def i2repr(self, pkt, x): - return XIntField.i2repr(self, pkt, x) - -class GPSTime_Field(LETimeField): - def __init__(self, name, default): - return LETimeField.__init__(self, name, default, strf="%a, %d %b %Y %H:%M:%S UTC") - -class VectorFlags_Field(XLEIntField): - """Represents te VectorFlags field. Handles the RelativeTo:sub-field""" - _fwdstr = "DefinesForward" - _resmask = 0xfffffff8 - _relmask = 0x6 - _relnames = ["RelativeToForward", "RelativeToEarth", "RelativeToCurrent", "RelativeToReserved"] - _relvals = [0x00, 0x02, 0x04, 0x06] - def i2repr(self, pkt, x): - if x is None: - return str(x) - r = [] - if (x & 0x1): - r.append(self._fwdstr) - i = (x & self._relmask) >> 1 - r.append(self._relnames[i]) - i = x & self._resmask - if (i): - r.append("ReservedBits:%08X" % i) - sout = "+".join(r) - return sout - def any2i(self, pkt, x): - if type(x) is str: - r = x.split("+") - y = 0 - for value in r: - if (value == self._fwdstr): - y |= 0x1 - elif (value in self._relnames): - i = self._relnames.index(value) - y &= (~self._relmask) - y |= self._relvals[i] - else: - #logging.warning("Unknown VectorFlags Argument: %s" % value) - pass - else: - y = x - #print "any2i: %s --> %s" % (str(x), str(y)) - return y - -class HCSIFlagsField(FlagsField): - """ A FlagsField where each bit/flag turns a conditional field on or off. - If the value is None when building a packet, i2m() will check the value of - every field in self.names. If the field's value is not None, the corresponding - flag will be set. """ - def i2m(self, pkt, val): - if val is None: - val = 0 - if (pkt): - for i in range(len(self.names)): - name = self.names[i][0] - value = pkt.getfieldval(name) - if value is not None: - val |= 1 << i - return val - -class HCSINullField(StrFixedLenField): - def __init__(self, name, default): - return StrFixedLenField.__init__(self, name, default, length=0) - -class HCSIDescField(StrFixedLenField): - def __init__(self, name, default): - return StrFixedLenField.__init__(self, name, default, length=32) - -class HCSIAppField(StrFixedLenField): - def __init__(self, name, default): - return StrFixedLenField.__init__(self, name, default, length=60) - -def _FlagsList(myfields): - flags = [] - for i in range(32): - flags.append("Reserved%02d" % i) - for i in myfields.keys(): - flags[i] = myfields[i] - return flags - -# Define all geolocation-tag flags lists -_hcsi_gps_flags = _FlagsList({0:"No Fix Available", 1:"GPS", 2:"Differential GPS", - 3:"Pulse Per Second", 4:"Real Time Kinematic", - 5:"Float Real Time Kinematic", 6:"Estimated (Dead Reckoning)", - 7:"Manual Input", 8:"Simulation"}) - -#_hcsi_vector_flags = _FlagsList({0:"ForwardFrame", 1:"RotationsAbsoluteXYZ", 5:"OffsetFromGPS_XYZ"}) -#This has been replaced with the VectorFlags_Field class, in order to handle the RelativeTo:subfield - -_hcsi_vector_char_flags = _FlagsList({0:"Antenna", 1:"Direction of Travel", - 2:"Front of Vehicle", 3:"Angle of Arrival", 4:"Transmitter Position", - 8:"GPS Derived", 9:"INS Derived", 10:"Compass Derived", - 11:"Acclerometer Derived", 12:"Human Derived"}) - -_hcsi_antenna_flags = _FlagsList({ 1:"Horizontal Polarization", 2:"Vertical Polarization", - 3:"Circular Polarization Left", 4:"Circular Polarization Right", - 16:"Electronically Steerable", 17:"Mechanically Steerable"}) - -""" HCSI PPI Fields are similar to RadioTap. A mask field called "present" specifies if each field -is present. All other fields are conditional. When dissecting a packet, each field is present if -"present" has the corresponding bit set. When building a packet, if "present" is None, the mask is -set to include every field that does not have a value of None. Otherwise, if the mask field is -not None, only the fields specified by "present" will be added to the packet. - -To build each Packet type, build a list of the fields normally, excluding the present bitmask field. -The code will then construct conditional versions of each field and add the present field. -See GPS_Fields as an example. """ - -# Conditional test for all HCSI Fields -def _HCSITest(pkt, ibit, name): - if pkt.present is None: - return (pkt.getfieldval(name) is not None) - return pkt.present & ibit - -# Wrap optional fields in ConditionalField, add HCSIFlagsField -def _HCSIBuildFields(fields): - names = [f.name for f in fields] - cond_fields = [ HCSIFlagsField('present', None, -len(names), names)] - for i in range(len(names)): - ibit = 1 << i - seval = "lambda pkt:_HCSITest(pkt,%s,'%s')" % (ibit, names[i]) - test = eval(seval) - cond_fields.append(ConditionalField(fields[i], test)) - return cond_fields - -class HCSIPacket(Packet): - name = "PPI HCSI" - fields_desc = [ LEShortField('pfh_type', None), - LEShortField('pfh_length', None), - ByteField('geotag_ver', CURR_GEOTAG_VER), - ByteField('geotag_pad', 0), - LEShortField('geotag_len', None)] - def post_build(self, p, pay): - if self.pfh_length is None: - l = len(p) - 4 - sl = struct.pack('<H',l) - p = p[:2] + sl + p[4:] - if self.geotag_len is None: - l_g = len(p) - 4 - sl_g = struct.pack('<H',l_g) - p = p[:6] + sl_g + p[8:] - p += pay - return p - def extract_padding(self, p): - return "",p - -#GPS Fields -GPS_Fields = [FlagsField("GPSFlags", None, -32, _hcsi_gps_flags), - Fixed3_7Field("Latitude", None), - Fixed3_7Field("Longitude", None), Fixed6_4Field("Altitude", None), - Fixed6_4Field("Altitude_g", None), GPSTime_Field("GPSTime", None), - NSCounter_Field("FractionalTime", None), Fixed3_6Field("eph", None), - Fixed3_6Field("epv", None), NSCounter_Field("ept", None), - HCSINullField("Reserved10", None), HCSINullField("Reserved11", None), - HCSINullField("Reserved12", None), HCSINullField("Reserved13", None), - HCSINullField("Reserved14", None), HCSINullField("Reserved15", None), - HCSINullField("Reserved16", None), HCSINullField("Reserved17", None), - HCSINullField("Reserved18", None), HCSINullField("Reserved19", None), - HCSINullField("Reserved20", None), HCSINullField("Reserved21", None), - HCSINullField("Reserved22", None), HCSINullField("Reserved23", None), - HCSINullField("Reserved24", None), HCSINullField("Reserved25", None), - HCSINullField("Reserved26", None), HCSINullField("Reserved27", None), - HCSIDescField("DescString", None), XLEIntField("AppId", None), - HCSIAppField("AppData", None), HCSINullField("Extended", None)] - -class GPS(HCSIPacket): - name = "PPI GPS" - fields_desc = [ LEShortField('pfh_type', PPI_GPS), #pfh_type - LEShortField('pfh_length', None), #pfh_len - ByteField('geotag_ver', CURR_GEOTAG_VER), #base_geotag_header.ver - ByteField('geotag_pad', 0), #base_geotag_header.pad - LEShortField('geotag_len', None)] + _HCSIBuildFields(GPS_Fields) - - -#Vector Fields -VEC_Fields = [VectorFlags_Field("VectorFlags", None), - FlagsField("VectorChars", None, -32, _hcsi_vector_char_flags), - Fixed3_6Field("Pitch", None), Fixed3_6Field("Roll", None), - Fixed3_6Field("Heading", None), Fixed6_4Field("Off_X", None), - Fixed6_4Field("Off_Y", None), Fixed6_4Field("Off_Z", None), - HCSINullField("Reserved08", None), HCSINullField("Reserved09", None), - HCSINullField("Reserved10", None), HCSINullField("Reserved11", None), - HCSINullField("Reserved12", None), HCSINullField("Reserved13", None), - HCSINullField("Reserved14", None), HCSINullField("Reserved15", None), - Fixed3_6Field("Err_Rot", None), Fixed6_4Field("Err_Off", None), - HCSINullField("Reserved18", None), HCSINullField("Reserved19", None), - HCSINullField("Reserved20", None), HCSINullField("Reserved21", None), - HCSINullField("Reserved22", None), HCSINullField("Reserved23", None), - HCSINullField("Reserved24", None), HCSINullField("Reserved25", None), - HCSINullField("Reserved26", None), HCSINullField("Reserved27", None), - HCSIDescField("DescString", None), XLEIntField("AppId", None), - HCSIAppField("AppData", None), HCSINullField("Extended", None)] - -class Vector(HCSIPacket): - name = "PPI Vector" - fields_desc = [ LEShortField('pfh_type', PPI_VECTOR), #pfh_type - LEShortField('pfh_length', None), #pfh_len - ByteField('geotag_ver', CURR_GEOTAG_VER), #base_geotag_header.ver - ByteField('geotag_pad', 0), #base_geotag_header.pad - LEShortField('geotag_len', None)] + _HCSIBuildFields(VEC_Fields) - -#Sensor Fields -# http://www.iana.org/assignments/icmp-parameters -sensor_types= { 1 : "Velocity", - 2 : "Acceleration", - 3 : "Jerk", - 100 : "Rotation", - 101 : "Magnetic", - 1000: "Temperature", - 1001: "Barometer", - 1002: "Humidity", - 2000: "TDOA_Clock", - 2001: "Phase" - } -SENS_Fields = [ LEShortEnumField('SensorType', None, sensor_types), - SignedByteField('ScaleFactor', None), - Fixed6_4Field('Val_X', None), - Fixed6_4Field('Val_Y', None), - Fixed6_4Field('Val_Z', None), - Fixed6_4Field('Val_T', None), - Fixed6_4Field('Val_E', None), - HCSINullField("Reserved07", None), HCSINullField("Reserved08", None), - HCSINullField("Reserved09", None), HCSINullField("Reserved10", None), - HCSINullField("Reserved11", None), HCSINullField("Reserved12", None), - HCSINullField("Reserved13", None), HCSINullField("Reserved14", None), - HCSINullField("Reserved15", None), HCSINullField("Reserved16", None), - HCSINullField("Reserved17", None), HCSINullField("Reserved18", None), - HCSINullField("Reserved19", None), HCSINullField("Reserved20", None), - HCSINullField("Reserved21", None), HCSINullField("Reserved22", None), - HCSINullField("Reserved23", None), HCSINullField("Reserved24", None), - HCSINullField("Reserved25", None), HCSINullField("Reserved26", None), - HCSINullField("Reserved27", None), - HCSIDescField("DescString", None), XLEIntField("AppId", None), - HCSIAppField("AppData", None), HCSINullField("Extended", None)] - - - -class Sensor(HCSIPacket): - name = "PPI Sensor" - fields_desc = [ LEShortField('pfh_type', PPI_SENSOR), #pfh_type - LEShortField('pfh_length', None), #pfh_len - ByteField('geotag_ver', CURR_GEOTAG_VER ), #base_geotag_header.ver - ByteField('geotag_pad', 0), #base_geotag_header.pad - LEShortField('geotag_len', None)] + _HCSIBuildFields(SENS_Fields) - -# HCSIAntenna Fields -ANT_Fields = [FlagsField("AntennaFlags", None, -32, _hcsi_antenna_flags), - ByteField("Gain", None), - Fixed3_6Field("HorizBw", None), Fixed3_6Field("VertBw", None), - Fixed3_6Field("PrecisionGain",None), XLEShortField("BeamID", None), - HCSINullField("Reserved06", None), HCSINullField("Reserved07", None), - HCSINullField("Reserved08", None), HCSINullField("Reserved09", None), - HCSINullField("Reserved10", None), HCSINullField("Reserved11", None), - HCSINullField("Reserved12", None), HCSINullField("Reserved13", None), - HCSINullField("Reserved14", None), HCSINullField("Reserved15", None), - HCSINullField("Reserved16", None), HCSINullField("Reserved17", None), - HCSINullField("Reserved18", None), HCSINullField("Reserved19", None), - HCSINullField("Reserved20", None), HCSINullField("Reserved21", None), - HCSINullField("Reserved22", None), HCSINullField("Reserved23", None), - HCSINullField("Reserved24", None), HCSINullField("Reserved25", None), - HCSIDescField("SerialNumber", None), HCSIDescField("ModelName", None), - HCSIDescField("DescString", None), XLEIntField("AppId", None), - HCSIAppField("AppData", None), HCSINullField("Extended", None)] - -class Antenna(HCSIPacket): - name = "PPI Antenna" - fields_desc = [ LEShortField('pfh_type', PPI_ANTENNA), #pfh_type - LEShortField('pfh_length', None), #pfh_len - ByteField('geotag_ver', CURR_GEOTAG_VER), #base_geotag_header.ver - ByteField('geotag_pad', 0), #base_geotag_header.pad - LEShortField('geotag_len', None)] + _HCSIBuildFields(ANT_Fields) - -addPPIType(PPI_GPS, GPS) -addPPIType(PPI_VECTOR, Vector) -addPPIType(PPI_SENSOR, Sensor) -addPPIType(PPI_ANTENNA,Antenna) diff --git a/scripts/external_libs/scapy-2.3.1/scapy/contrib/ripng.py b/scripts/external_libs/scapy-2.3.1/scapy/contrib/ripng.py deleted file mode 100644 index 47e17bc4..00000000 --- a/scripts/external_libs/scapy-2.3.1/scapy/contrib/ripng.py +++ /dev/null @@ -1,41 +0,0 @@ -#!/usr/bin/env python - -# http://trac.secdev.org/scapy/ticket/301 - -# scapy.contrib.description = RIPng -# scapy.contrib.status = loads - -from scapy.packet import * -from scapy.fields import * -from scapy.layers.inet import UDP -from scapy.layers.inet6 import * - -class RIPng(Packet): - name = "RIPng header" - fields_desc = [ - ByteEnumField("cmd", 1, {1 : "req", 2 : "resp"}), - ByteField("ver", 1), - ShortField("null", 0), - ] - -class RIPngEntry(Packet): - name = "RIPng entry" - fields_desc = [ - ConditionalField(IP6Field("prefix", "::"), - lambda pkt: pkt.metric != 255), - ConditionalField(IP6Field("nexthop", "::"), - lambda pkt: pkt.metric == 255), - ShortField("routetag", 0), - ByteField("prefixlen", 0), - ByteEnumField("metric", 1, {16 : "Unreach", - 255 : "next-hop entry"}) - ] - -bind_layers(UDP, RIPng, sport=521, dport=521) -bind_layers(RIPng, RIPngEntry) -bind_layers(RIPngEntry, RIPngEntry) - -if __name__ == "__main__": - from scapy.main import interact - interact(mydict=globals(), mybanner="RIPng") - diff --git a/scripts/external_libs/scapy-2.3.1/scapy/contrib/rsvp.py b/scripts/external_libs/scapy-2.3.1/scapy/contrib/rsvp.py deleted file mode 100644 index c9d4ebee..00000000 --- a/scripts/external_libs/scapy-2.3.1/scapy/contrib/rsvp.py +++ /dev/null @@ -1,188 +0,0 @@ -## RSVP layer - -# http://trac.secdev.org/scapy/ticket/197 - -# scapy.contrib.description = RSVP -# scapy.contrib.status = loads - -from scapy.packet import * -from scapy.fields import * -from scapy.layers.inet import IP - -rsvpmsgtypes = { 0x01 : "Path", - 0x02 : "Reservation request", - 0x03 : "Path error", - 0x04 : "Reservation request error", - 0x05 : "Path teardown", - 0x06 : "Reservation teardown", - 0x07 : "Reservation request acknowledgment" -} - -class RSVP(Packet): - name = "RSVP" - fields_desc = [ BitField("Version",1,4), - BitField("Flags",1,4), - ByteEnumField("Class",0x01, rsvpmsgtypes), - XShortField("chksum", None), - ByteField("TTL",1), - XByteField("dataofs", 0), - ShortField("Length",None)] - def post_build(self, p, pay): - p += pay - if self.Length is None: - l = len(p) - p = p[:6]+chr((l>>8)&0xff)+chr(l&0xff)+p[8:] - if self.chksum is None: - ck = checksum(p) - p = p[:2]+chr(ck>>8)+chr(ck&0xff)+p[4:] - return p - -rsvptypes = { 0x01 : "Session", - 0x03 : "HOP", - 0x04 : "INTEGRITY", - 0x05 : "TIME_VALUES", - 0x06 : "ERROR_SPEC", - 0x07 : "SCOPE", - 0x08 : "STYLE", - 0x09 : "FLOWSPEC", - 0x0A : "FILTER_SPEC", - 0x0B : "SENDER_TEMPLATE", - 0x0C : "SENDER_TSPEC", - 0x0D : "ADSPEC", - 0x0E : "POLICY_DATA", - 0x0F : "RESV_CONFIRM", - 0x10 : "RSVP_LABEL", - 0x11 : "HOP_COUNT", - 0x12 : "STRICT_SOURCE_ROUTE", - 0x13 : "LABEL_REQUEST", - 0x14 : "EXPLICIT_ROUTE", - 0x15 : "ROUTE_RECORD", - 0x16 : "HELLO", - 0x17 : "MESSAGE_ID", - 0x18 : "MESSAGE_ID_ACK", - 0x19 : "MESSAGE_ID_LIST", - 0x1E : "DIAGNOSTIC", - 0x1F : "ROUTE", - 0x20 : "DIAG_RESPONSE", - 0x21 : "DIAG_SELECT", - 0x22 : "RECOVERY_LABEL", - 0x23 : "UPSTREAM_LABEL", - 0x24 : "LABEL_SET", - 0x25 : "PROTECTION", - 0x26 : "PRIMARY PATH ROUTE", - 0x2A : "DSBM IP ADDRESS", - 0x2B : "SBM_PRIORITY", - 0x2C : "DSBM TIMER INTERVALS", - 0x2D : "SBM_INFO", - 0x32 : "S2L_SUB_LSP", - 0x3F : "DETOUR", - 0x40 : "CHALLENGE", - 0x41 : "DIFF-SERV", - 0x42 : "CLASSTYPE", - 0x43 : "LSP_REQUIRED_ATTRIBUTES", - 0x80 : "NODE_CHAR", - 0x81 : "SUGGESTED_LABEL", - 0x82 : "ACCEPTABLE_LABEL_SET", - 0x83 : "RESTART_CA", - 0x84 : "SESSION-OF-INTEREST", - 0x85 : "LINK_CAPABILITY", - 0x86 : "Capability Object", - 0xA1 : "RSVP_HOP_L2", - 0xA2 : "LAN_NHOP_L2", - 0xA3 : "LAN_NHOP_L3", - 0xA4 : "LAN_LOOPBACK", - 0xA5 : "TCLASS", - 0xC0 : "TUNNEL", - 0xC1 : "LSP_TUNNEL_INTERFACE_ID", - 0xC2 : "USER_ERROR_SPEC", - 0xC3 : "NOTIFY_REQUEST", - 0xC4 : "ADMIN-STATUS", - 0xC5 : "LSP_ATTRIBUTES", - 0xC6 : "ALARM_SPEC", - 0xC7 : "ASSOCIATION", - 0xC8 : "SECONDARY_EXPLICIT_ROUTE", - 0xC9 : "SECONDARY_RECORD_ROUTE", - 0xCD : "FAST_REROUTE", - 0xCF : "SESSION_ATTRIBUTE", - 0xE1 : "DCLASS", - 0xE2 : "PACKETCABLE EXTENSIONS", - 0xE3 : "ATM_SERVICECLASS", - 0xE4 : "CALL_OPS (ASON)", - 0xE5 : "GENERALIZED_UNI", - 0xE6 : "CALL_ID", - 0xE7 : "3GPP2_Object", - 0xE8 : "EXCLUDE_ROUTE" -} - -class RSVP_Object(Packet): - name = "RSVP_Object" - fields_desc = [ ShortField("Length",4), - ByteEnumField("Class",0x01, rsvptypes), - ByteField("C-Type",1)] - def guess_payload_class(self, payload): - if self.Class == 0x03: - return RSVP_HOP - elif self.Class == 0x05: - return RSVP_Time - elif self.Class == 0x0c: - return RSVP_SenderTSPEC - elif self.Class == 0x13: - return RSVP_LabelReq - elif self.Class == 0xCF: - return RSVP_SessionAttrb - else: - return RSVP_Data - - - -class RSVP_Data(Packet): - name = "Data" - fields_desc = [StrLenField("Data","",length_from= lambda pkt:pkt.underlayer.Length - 4)] - def default_payload_class(self, payload): - return RSVP_Object - -class RSVP_HOP(Packet): - name = "HOP" - fields_desc = [ IPField("neighbor","0.0.0.0"), - BitField("inface",1,32)] - def default_payload_class(self, payload): - return RSVP_Object - -class RSVP_Time(Packet): - name = "Time Val" - fields_desc = [ BitField("refresh",1,32)] - def default_payload_class(self, payload): - return RSVP_Object - -class RSVP_SenderTSPEC(Packet): - name = "Sender_TSPEC" - fields_desc = [ ByteField("Msg_Format",0), - ByteField("reserve",0), - ShortField("Data_Length",4), - ByteField("Srv_hdr",1), - ByteField("reserve2",0), - ShortField("Srv_Length",4), - StrLenField("Tokens","",length_from= lambda pkt:pkt.underlayer.Length - 12) ] - def default_payload_class(self, payload): - return RSVP_Object - -class RSVP_LabelReq(Packet): - name = "Lable Req" - fields_desc = [ ShortField("reserve",1), - ShortField("L3PID",1)] - def default_payload_class(self, payload): - return RSVP_Object - -class RSVP_SessionAttrb(Packet): - name = "Session_Attribute" - fields_desc = [ ByteField("Setup_priority",1), - ByteField("Hold_priority",1), - ByteField("flags",1), - ByteField("Name_length",1), - StrLenField("Name","",length_from= lambda pkt:pkt.underlayer.Length - 8), - ] - def default_payload_class(self, payload): - return RSVP_Object - -bind_layers( IP, RSVP, { "proto" : 46} ) -bind_layers( RSVP, RSVP_Object, {}) diff --git a/scripts/external_libs/scapy-2.3.1/scapy/contrib/skinny.py b/scripts/external_libs/scapy-2.3.1/scapy/contrib/skinny.py deleted file mode 100644 index 8b686822..00000000 --- a/scripts/external_libs/scapy-2.3.1/scapy/contrib/skinny.py +++ /dev/null @@ -1,499 +0,0 @@ -#! /usr/bin/env python - -# scapy.contrib.description = Skinny Call Control Protocol (SCCP) -# scapy.contrib.status = loads - - -############################################################################# -## ## -## scapy-skinny.py --- Skinny Call Control Protocol (SCCP) extension ## -## ## -## Copyright (C) 2006 Nicolas Bareil <nicolas.bareil@ eads.net> ## -## EADS/CRC security team ## -## ## -## This program is free software; you can redistribute it and/or modify it ## -## under the terms of the GNU General Public License version 2 as ## -## published by the Free Software Foundation; version 2. ## -## ## -## This program is distributed in the hope that it will be useful, but ## -## WITHOUT ANY WARRANTY; without even the implied warranty of ## -## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU ## -## General Public License for more details. ## -## ## -############################################################################# - -from scapy.all import * -import __builtin__ - -##################################################################### -# Helpers and constants -##################################################################### - -skinny_messages_cls = { -# Station -> Callmanager - 0x0000: "SkinnyMessageKeepAlive", - 0x0001: "SkinnyMessageRegister", - 0x0002: "SkinnyMessageIpPort", - 0x0003: "SkinnyMessageKeypadButton", - 0x0004: "SkinnyMessageEnblocCall", - 0x0005: "SkinnyMessageStimulus", - 0x0006: "SkinnyMessageOffHook", - 0x0007: "SkinnyMessageOnHook", - 0x0008: "SkinnyMessageHookFlash", - 0x0009: "SkinnyMessageForwardStatReq", - 0x000A: "SkinnyMessageSpeedDialStatReq", - 0x000B: "SkinnyMessageLineStatReq", - 0x000C: "SkinnyMessageConfigStatReq", - 0x000D: "SkinnyMessageTimeDateReq", - 0x000E: "SkinnyMessageButtonTemplateReq", - 0x000F: "SkinnyMessageVersionReq", - 0x0010: "SkinnyMessageCapabilitiesRes", - 0x0011: "SkinnyMessageMediaPortList", - 0x0012: "SkinnyMessageServerReq", - 0x0020: "SkinnyMessageAlarm", - 0x0021: "SkinnyMessageMulticastMediaReceptionAck", - 0x0022: "SkinnyMessageOpenReceiveChannelAck", - 0x0023: "SkinnyMessageConnectionStatisticsRes", - 0x0024: "SkinnyMessageOffHookWithCgpn", - 0x0025: "SkinnyMessageSoftKeySetReq", - 0x0026: "SkinnyMessageSoftKeyEvent", - 0x0027: "SkinnyMessageUnregister", - 0x0028: "SkinnyMessageSoftKeyTemplateReq", - 0x0029: "SkinnyMessageRegisterTokenReq", - 0x002A: "SkinnyMessageMediaTransmissionFailure", - 0x002B: "SkinnyMessageHeadsetStatus", - 0x002C: "SkinnyMessageMediaResourceNotification", - 0x002D: "SkinnyMessageRegisterAvailableLines", - 0x002E: "SkinnyMessageDeviceToUserData", - 0x002F: "SkinnyMessageDeviceToUserDataResponse", - 0x0030: "SkinnyMessageUpdateCapabilities", - 0x0031: "SkinnyMessageOpenMultiMediaReceiveChannelAck", - 0x0032: "SkinnyMessageClearConference", - 0x0033: "SkinnyMessageServiceURLStatReq", - 0x0034: "SkinnyMessageFeatureStatReq", - 0x0035: "SkinnyMessageCreateConferenceRes", - 0x0036: "SkinnyMessageDeleteConferenceRes", - 0x0037: "SkinnyMessageModifyConferenceRes", - 0x0038: "SkinnyMessageAddParticipantRes", - 0x0039: "SkinnyMessageAuditConferenceRes", - 0x0040: "SkinnyMessageAuditParticipantRes", - 0x0041: "SkinnyMessageDeviceToUserDataVersion1", -# Callmanager -> Station */ - 0x0081: "SkinnyMessageRegisterAck", - 0x0082: "SkinnyMessageStartTone", - 0x0083: "SkinnyMessageStopTone", - 0x0085: "SkinnyMessageSetRinger", - 0x0086: "SkinnyMessageSetLamp", - 0x0087: "SkinnyMessageSetHkFDetect", - 0x0088: "SkinnyMessageSpeakerMode", - 0x0089: "SkinnyMessageSetMicroMode", - 0x008A: "SkinnyMessageStartMediaTransmission", - 0x008B: "SkinnyMessageStopMediaTransmission", - 0x008C: "SkinnyMessageStartMediaReception", - 0x008D: "SkinnyMessageStopMediaReception", - 0x008F: "SkinnyMessageCallInfo", - 0x0090: "SkinnyMessageForwardStat", - 0x0091: "SkinnyMessageSpeedDialStat", - 0x0092: "SkinnyMessageLineStat", - 0x0093: "SkinnyMessageConfigStat", - 0x0094: "SkinnyMessageTimeDate", - 0x0095: "SkinnyMessageStartSessionTransmission", - 0x0096: "SkinnyMessageStopSessionTransmission", - 0x0097: "SkinnyMessageButtonTemplate", - 0x0098: "SkinnyMessageVersion", - 0x0099: "SkinnyMessageDisplayText", - 0x009A: "SkinnyMessageClearDisplay", - 0x009B: "SkinnyMessageCapabilitiesReq", - 0x009C: "SkinnyMessageEnunciatorCommand", - 0x009D: "SkinnyMessageRegisterReject", - 0x009E: "SkinnyMessageServerRes", - 0x009F: "SkinnyMessageReset", - 0x0100: "SkinnyMessageKeepAliveAck", - 0x0101: "SkinnyMessageStartMulticastMediaReception", - 0x0102: "SkinnyMessageStartMulticastMediaTransmission", - 0x0103: "SkinnyMessageStopMulticastMediaReception", - 0x0104: "SkinnyMessageStopMulticastMediaTransmission", - 0x0105: "SkinnyMessageOpenReceiveChannel", - 0x0106: "SkinnyMessageCloseReceiveChannel", - 0x0107: "SkinnyMessageConnectionStatisticsReq", - 0x0108: "SkinnyMessageSoftKeyTemplateRes", - 0x0109: "SkinnyMessageSoftKeySetRes", - 0x0110: "SkinnyMessageSoftKeyEvent", - 0x0111: "SkinnyMessageCallState", - 0x0112: "SkinnyMessagePromptStatus", - 0x0113: "SkinnyMessageClearPromptStatus", - 0x0114: "SkinnyMessageDisplayNotify", - 0x0115: "SkinnyMessageClearNotify", - 0x0116: "SkinnyMessageCallPlane", - 0x0117: "SkinnyMessageCallPlane", - 0x0118: "SkinnyMessageUnregisterAck", - 0x0119: "SkinnyMessageBackSpaceReq", - 0x011A: "SkinnyMessageRegisterTokenAck", - 0x011B: "SkinnyMessageRegisterTokenReject", - 0x0042: "SkinnyMessageDeviceToUserDataResponseVersion1", - 0x011C: "SkinnyMessageStartMediaFailureDetection", - 0x011D: "SkinnyMessageDialedNumber", - 0x011E: "SkinnyMessageUserToDeviceData", - 0x011F: "SkinnyMessageFeatureStat", - 0x0120: "SkinnyMessageDisplayPriNotify", - 0x0121: "SkinnyMessageClearPriNotify", - 0x0122: "SkinnyMessageStartAnnouncement", - 0x0123: "SkinnyMessageStopAnnouncement", - 0x0124: "SkinnyMessageAnnouncementFinish", - 0x0127: "SkinnyMessageNotifyDtmfTone", - 0x0128: "SkinnyMessageSendDtmfTone", - 0x0129: "SkinnyMessageSubscribeDtmfPayloadReq", - 0x012A: "SkinnyMessageSubscribeDtmfPayloadRes", - 0x012B: "SkinnyMessageSubscribeDtmfPayloadErr", - 0x012C: "SkinnyMessageUnSubscribeDtmfPayloadReq", - 0x012D: "SkinnyMessageUnSubscribeDtmfPayloadRes", - 0x012E: "SkinnyMessageUnSubscribeDtmfPayloadErr", - 0x012F: "SkinnyMessageServiceURLStat", - 0x0130: "SkinnyMessageCallSelectStat", - 0x0131: "SkinnyMessageOpenMultiMediaChannel", - 0x0132: "SkinnyMessageStartMultiMediaTransmission", - 0x0133: "SkinnyMessageStopMultiMediaTransmission", - 0x0134: "SkinnyMessageMiscellaneousCommand", - 0x0135: "SkinnyMessageFlowControlCommand", - 0x0136: "SkinnyMessageCloseMultiMediaReceiveChannel", - 0x0137: "SkinnyMessageCreateConferenceReq", - 0x0138: "SkinnyMessageDeleteConferenceReq", - 0x0139: "SkinnyMessageModifyConferenceReq", - 0x013A: "SkinnyMessageAddParticipantReq", - 0x013B: "SkinnyMessageDropParticipantReq", - 0x013C: "SkinnyMessageAuditConferenceReq", - 0x013D: "SkinnyMessageAuditParticipantReq", - 0x013F: "SkinnyMessageUserToDeviceDataVersion1", - } - -skinny_callstates = { - 0x1: "Off Hook", - 0x2: "On Hook", - 0x3: "Ring out", - 0xc: "Proceeding", -} - - -skinny_ring_type = { - 0x1: "Ring off" -} - -skinny_speaker_modes = { - 0x1: "Speaker on", - 0x2: "Speaker off" -} - -skinny_lamp_mode = { - 0x1: "Off (?)", - 0x2: "On", -} - -skinny_stimulus = { - 0x9: "Line" -} - - -############ -## Fields ## -############ - -class SkinnyDateTimeField(StrFixedLenField): - def __init__(self, name, default): - StrFixedLenField.__init__(self, name, default, 32) - - def m2i(self, pkt, s): - year,month,dow,day,hour,min,sec,milisecond=struct.unpack('<8I', s) - return (year, month, day, hour, min, sec) - - def i2m(self, pkt, val): - if type(val) is str: - val = self.h2i(pkt, val) - l= val[:2] + (0,) + val[2:7] + (0,) - return struct.pack('<8I', *l) - - def i2h(self, pkt, x): - if type(x) is str: - return x - else: - return time.ctime(time.mktime(x+(0,0,0))) - - def i2repr(self, pkt, x): - return self.i2h(pkt, x) - - def h2i(self, pkt, s): - t = () - if type(s) is str: - t = time.strptime(s) - t = t[:2] + t[2:-3] - else: - if not s: - y,m,d,h,min,sec,rest,rest,rest = time.gmtime(time.time()) - t = (y,m,d,h,min,sec) - else: - t=s - return t - - -########################### -## Packet abstract class ## -########################### - -class SkinnyMessageGeneric(Packet): - name='Generic message' - -class SkinnyMessageKeepAlive(Packet): - name='keep alive' - -class SkinnyMessageKeepAliveAck(Packet): - name='keep alive ack' - -class SkinnyMessageOffHook(Packet): - name = 'Off Hook' - fields_desc = [ LEIntField("unknown1", 0), - LEIntField("unknown2", 0),] - -class SkinnyMessageOnHook(SkinnyMessageOffHook): - name = 'On Hook' - -class SkinnyMessageCallState(Packet): - name='Skinny Call state message' - fields_desc = [ LEIntEnumField("state", 1, skinny_callstates), - LEIntField("instance", 1), - LEIntField("callid", 0), - LEIntField("unknown1", 4), - LEIntField("unknown2", 0), - LEIntField("unknown3", 0) ] - -class SkinnyMessageSoftKeyEvent(Packet): - name='Soft Key Event' - fields_desc = [ LEIntField("key", 0), - LEIntField("instance", 1), - LEIntField("callid", 0)] - -class SkinnyMessageSetRinger(Packet): - name='Ring message' - fields_desc = [ LEIntEnumField("ring", 0x1, skinny_ring_type), - LEIntField("unknown1", 0), - LEIntField("unknown2", 0), - LEIntField("unknown3", 0) ] - -_skinny_tones = { - 0x21: 'Inside dial tone', - 0x22: 'xxx', - 0x23: 'xxx', - 0x24: 'Alerting tone', - 0x25: 'Reorder Tone' - } - -class SkinnyMessageStartTone(Packet): - name='Start tone' - fields_desc = [ LEIntEnumField("tone", 0x21, _skinny_tones), - LEIntField("unknown1", 0), - LEIntField("instance", 1), - LEIntField("callid", 0)] - -class SkinnyMessageStopTone(SkinnyMessageGeneric): - name='stop tone' - fields_desc = [ LEIntField("instance", 1), - LEIntField("callid", 0)] - - -class SkinnyMessageSpeakerMode(Packet): - name='Speaker mdoe' - fields_desc = [ LEIntEnumField("ring", 0x1, skinny_speaker_modes) ] - -class SkinnyMessageSetLamp(Packet): - name='Lamp message (light of the phone)' - fields_desc = [ LEIntEnumField("stimulus", 0x5, skinny_stimulus), - LEIntField("instance", 1), - LEIntEnumField("mode", 2, skinny_lamp_mode) ] - -class SkinnyMessageSoftKeyEvent(Packet): - name=' Call state message' - fields_desc = [ LEIntField("instance", 1), - LEIntField("callid", 0), - LEIntField("set", 0), - LEIntField("map", 0xffff)] - -class SkinnyMessagePromptStatus(Packet): - name='Prompt status' - fields_desc = [ LEIntField("timeout", 0), - StrFixedLenField("text", "\0"*32, 32), - LEIntField("instance", 1), - LEIntField("callid", 0)] - -class SkinnyMessageCallPlane(Packet): - name='Activate/Desactivate Call Plane Message' - fields_desc = [ LEIntField("instance", 1)] - -class SkinnyMessageTimeDate(Packet): - name='Setting date and time' - fields_desc = [ SkinnyDateTimeField("settime", None), - LEIntField("timestamp", 0) ] - -class SkinnyMessageClearPromptStatus(Packet): - name='clear prompt status' - fields_desc = [ LEIntField("instance", 1), - LEIntField("callid", 0)] - -class SkinnyMessageKeypadButton(Packet): - name='keypad button' - fields_desc = [ LEIntField("key", 0), - LEIntField("instance", 1), - LEIntField("callid", 0)] - -class SkinnyMessageDialedNumber(Packet): - name='dialed number' - fields_desc = [ StrFixedLenField("number", "1337", 24), - LEIntField("instance", 1), - LEIntField("callid", 0)] - -_skinny_message_callinfo_restrictions = ['CallerName' - , 'CallerNumber' - , 'CalledName' - , 'CalledNumber' - , 'OriginalCalledName' - , 'OriginalCalledNumber' - , 'LastRedirectName' - , 'LastRedirectNumber'] + ['Bit%d' % i for i in range(8,15)] -class SkinnyMessageCallInfo(Packet): - name='call information' - fields_desc = [ StrFixedLenField("callername", "Jean Valjean", 40), - StrFixedLenField("callernum", "1337", 24), - StrFixedLenField("calledname", "Causette", 40), - StrFixedLenField("callednum", "1034", 24), - LEIntField("lineinstance", 1), - LEIntField("callid", 0), - StrFixedLenField("originalcalledname", "Causette", 40), - StrFixedLenField("originalcallednum", "1034", 24), - StrFixedLenField("lastredirectingname", "Causette", 40), - StrFixedLenField("lastredirectingnum", "1034", 24), - LEIntField("originalredirectreason", 0), - LEIntField("lastredirectreason", 0), - StrFixedLenField('voicemailboxG', '\0'*24, 24), - StrFixedLenField('voicemailboxD', '\0'*24, 24), - StrFixedLenField('originalvoicemailboxD', '\0'*24, 24), - StrFixedLenField('lastvoicemailboxD', '\0'*24, 24), - LEIntField('security', 0), - FlagsField('restriction', 0, 16, _skinny_message_callinfo_restrictions), - LEIntField('unknown', 0)] - - -class SkinnyRateField(LEIntField): - def i2repr(self, pkt, x): - if x is None: - x=0 - return '%d ms/pkt' % x - -_skinny_codecs = { - 0x0: 'xxx', - 0x1: 'xxx', - 0x2: 'xxx', - 0x3: 'xxx', - 0x4: 'G711 ulaw 64k' - } - -_skinny_echo = { - 0x0: 'echo cancelation off', - 0x1: 'echo cancelation on' - } - -class SkinnyMessageOpenReceiveChannel(Packet): - name='open receive channel' - fields_desc = [LEIntField('conference', 0), - LEIntField('passthru', 0), - SkinnyRateField('rate', 20), - LEIntEnumField('codec', 4, _skinny_codecs), - LEIntEnumField('echo', 0, _skinny_echo), - LEIntField('unknown1', 0), - LEIntField('callid', 0)] - - def guess_payload_class(self, p): - return conf.padding_layer - -_skinny_receive_channel_status = { - 0x0: 'ok', - 0x1: 'ko' - } - -class SkinnyMessageOpenReceiveChannelAck(Packet): - name='open receive channel' - fields_desc = [LEIntEnumField('status', 0, _skinny_receive_channel_status), - IPField('remote', '0.0.0.0'), - LEIntField('port', RandShort()), - LEIntField('passthru', 0), - LEIntField('callid', 0)] - -_skinny_silence = { - 0x0: 'silence suppression off', - 0x1: 'silence suppression on', - } - -class SkinnyFramePerPacketField(LEIntField): - def i2repr(self, pkt, x): - if x is None: - x=0 - return '%d frames/pkt' % x - -class SkinnyMessageStartMediaTransmission(Packet): - name='start multimedia transmission' - fields_desc = [LEIntField('conference', 0), - LEIntField('passthru', 0), - IPField('remote', '0.0.0.0'), - LEIntField('port', RandShort()), - SkinnyRateField('rate', 20), - LEIntEnumField('codec', 4, _skinny_codecs), - LEIntField('precedence', 200), - LEIntEnumField('silence', 0, _skinny_silence), - SkinnyFramePerPacketField('maxframes', 0), - LEIntField('unknown1', 0), - LEIntField('callid', 0)] - - def guess_payload_class(self, p): - return conf.padding_layer - -class SkinnyMessageCloseReceiveChannel(Packet): - name='close receive channel' - fields_desc = [LEIntField('conference', 0), - LEIntField('passthru', 0), - IPField('remote', '0.0.0.0'), - LEIntField('port', RandShort()), - SkinnyRateField('rate', 20), - LEIntEnumField('codec', 4, _skinny_codecs), - LEIntField('precedence', 200), - LEIntEnumField('silence', 0, _skinny_silence), - LEIntField('callid', 0)] - -class SkinnyMessageStopMultiMediaTransmission(Packet): - name='stop multimedia transmission' - fields_desc = [LEIntField('conference', 0), - LEIntField('passthru', 0), - LEIntField('callid', 0)] - -class Skinny(Packet): - name="Skinny" - fields_desc = [ LEIntField("len", None), - LEIntField("res",0), - LEIntEnumField("msg",0, skinny_messages) ] - - def post_build(self, pkt, p): - if self.len is None: - l=len(p)+len(pkt)-8 # on compte pas les headers len et reserved - pkt=struct.pack('@I', l)+pkt[4:] - return pkt+p - -# An helper -def get_cls(name, fallback_cls): - return globals().get(name, fallback_cls) - #return __builtin__.__dict__.get(name, fallback_cls) - -for msgid,strcls in skinny_messages_cls.items(): - cls=get_cls(strcls, SkinnyMessageGeneric) - bind_layers(Skinny, cls, {"msg": msgid}) - -bind_layers(TCP, Skinny, { "dport": 2000 } ) -bind_layers(TCP, Skinny, { "sport": 2000 } ) - -if __name__ == "__main__": - interact(mydict=globals(),mybanner="Welcome to Skinny add-on") - diff --git a/scripts/external_libs/scapy-2.3.1/scapy/contrib/ubberlogger.py b/scripts/external_libs/scapy-2.3.1/scapy/contrib/ubberlogger.py deleted file mode 100644 index 1c01db2f..00000000 --- a/scripts/external_libs/scapy-2.3.1/scapy/contrib/ubberlogger.py +++ /dev/null @@ -1,101 +0,0 @@ -# Author: Sylvain SARMEJEANNE -# http://trac.secdev.org/scapy/ticket/1 - -# scapy.contrib.description = Ubberlogger dissectors -# scapy.contrib.status = untested - -from scapy.packet import * -from scapy.fields import * - -# Syscalls known by Uberlogger -uberlogger_sys_calls = {0:"READ_ID", - 1:"OPEN_ID", - 2:"WRITE_ID", - 3:"CHMOD_ID", - 4:"CHOWN_ID", - 5:"SETUID_ID", - 6:"CHROOT_ID", - 7:"CREATE_MODULE_ID", - 8:"INIT_MODULE_ID", - 9:"DELETE_MODULE_ID", - 10:"CAPSET_ID", - 11:"CAPGET_ID", - 12:"FORK_ID", - 13:"EXECVE_ID"} - -# First part of the header -class Uberlogger_honeypot_caract(Packet): - name = "Uberlogger honeypot_caract" - fields_desc = [ByteField("honeypot_id", 0), - ByteField("reserved", 0), - ByteField("os_type_and_version", 0)] - -# Second part of the header -class Uberlogger_uber_h(Packet): - name = "Uberlogger uber_h" - fields_desc = [ByteEnumField("syscall_type", 0, uberlogger_sys_calls), - IntField("time_sec", 0), - IntField("time_usec", 0), - IntField("pid", 0), - IntField("uid", 0), - IntField("euid", 0), - IntField("cap_effective", 0), - IntField("cap_inheritable", 0), - IntField("cap_permitted", 0), - IntField("res", 0), - IntField("length", 0)] - -# The 9 following classes are options depending on the syscall type -class Uberlogger_capget_data(Packet): - name = "Uberlogger capget_data" - fields_desc = [IntField("target_pid", 0)] - -class Uberlogger_capset_data(Packet): - name = "Uberlogger capset_data" - fields_desc = [IntField("target_pid", 0), - IntField("effective_cap", 0), - IntField("permitted_cap", 0), - IntField("inheritable_cap", 0)] - -class Uberlogger_chmod_data(Packet): - name = "Uberlogger chmod_data" - fields_desc = [ShortField("mode", 0)] - -class Uberlogger_chown_data(Packet): - name = "Uberlogger chown_data" - fields_desc = [IntField("uid", 0), - IntField("gid", 0)] - -class Uberlogger_open_data(Packet): - name = "Uberlogger open_data" - fields_desc = [IntField("flags", 0), - IntField("mode", 0)] - -class Uberlogger_read_data(Packet): - name = "Uberlogger read_data" - fields_desc = [IntField("fd", 0), - IntField("count", 0)] - -class Uberlogger_setuid_data(Packet): - name = "Uberlogger setuid_data" - fields_desc = [IntField("uid", 0)] - -class Uberlogger_create_module_data(Packet): - name = "Uberlogger create_module_data" - fields_desc = [IntField("size", 0)] - -class Uberlogger_execve_data(Packet): - name = "Uberlogger execve_data" - fields_desc = [IntField("nbarg", 0)] - -# Layer bounds for Uberlogger -bind_layers(Uberlogger_honeypot_caract,Uberlogger_uber_h) -bind_layers(Uberlogger_uber_h,Uberlogger_capget_data) -bind_layers(Uberlogger_uber_h,Uberlogger_capset_data) -bind_layers(Uberlogger_uber_h,Uberlogger_chmod_data) -bind_layers(Uberlogger_uber_h,Uberlogger_chown_data) -bind_layers(Uberlogger_uber_h,Uberlogger_open_data) -bind_layers(Uberlogger_uber_h,Uberlogger_read_data) -bind_layers(Uberlogger_uber_h,Uberlogger_setuid_data) -bind_layers(Uberlogger_uber_h,Uberlogger_create_module_data) -bind_layers(Uberlogger_uber_h,Uberlogger_execve_data) diff --git a/scripts/external_libs/scapy-2.3.1/scapy/contrib/vqp.py b/scripts/external_libs/scapy-2.3.1/scapy/contrib/vqp.py deleted file mode 100644 index 9328cea4..00000000 --- a/scripts/external_libs/scapy-2.3.1/scapy/contrib/vqp.py +++ /dev/null @@ -1,58 +0,0 @@ - -# http://trac.secdev.org/scapy/ticket/147 - -# scapy.contrib.description = VLAN Query Protocol -# scapy.contrib.status = loads - -from scapy.packet import * -from scapy.fields import * -from scapy.layers.inet import UDP - -class VQP(Packet): - name = "VQP" - fields_desc = [ - ByteField("const", 1), - ByteEnumField("type", 1, { - 1:"requestPort", 2:"responseVLAN", - 3:"requestReconfirm", 4:"responseReconfirm" - }), - ByteEnumField("errorcodeaction", 0, { - 0:"none",3:"accessDenied", - 4:"shutdownPort", 5:"wrongDomain" - }), - ByteEnumField("unknown", 2, { - 2:"inGoodResponse", 6:"inRequests" - }), - IntField("seq",0), - ] - -class VQPEntry(Packet): - name = "VQPEntry" - fields_desc = [ - IntEnumField("datatype", 0, { - 3073:"clientIPAddress", 3074:"portName", - 3075:"VLANName", 3076:"Domain", 3077:"ethernetPacket", - 3078:"ReqMACAddress", 3079:"unknown", - 3080:"ResMACAddress" - }), - FieldLenField("len", None), - ConditionalField(IPField("datatom", "0.0.0.0"), - lambda p:p.datatype==3073), - ConditionalField(MACField("data", "00:00:00:00:00:00"), - lambda p:p.datatype==3078), - ConditionalField(MACField("data", "00:00:00:00:00:00"), - lambda p:p.datatype==3080), - ConditionalField(StrLenField("data", None, - length_from=lambda p:p.len), - lambda p:p.datatype not in [3073, 3078, 3080]), - ] - def post_build(self, p, pay): - if self.len is None: - l = len(p.data) - p = p[:2]+struct.pack("!H",l)+p[4:] - return p - -bind_layers(UDP, VQP, sport=1589) -bind_layers(UDP, VQP, dport=1589) -bind_layers(VQP, VQPEntry, ) -bind_layers(VQPEntry, VQPEntry, ) diff --git a/scripts/external_libs/scapy-2.3.1/scapy/contrib/vtp.py b/scripts/external_libs/scapy-2.3.1/scapy/contrib/vtp.py deleted file mode 100644 index af5c2823..00000000 --- a/scripts/external_libs/scapy-2.3.1/scapy/contrib/vtp.py +++ /dev/null @@ -1,171 +0,0 @@ -#!/usr/bin/env python - -# scapy.contrib.description = VLAN Trunking Protocol (VTP) -# scapy.contrib.status = loads - -""" - VTP Scapy Extension - ~~~~~~~~~~~~~~~~~~~~~ - - :version: 2009-02-15 - :copyright: 2009 by Jochen Bartl - :e-mail: lobo@c3a.de / jochen.bartl@gmail.com - :license: GPL v2 - - This program is free software; you can redistribute it and/or - modify it under the terms of the GNU General Public License - as published by the Free Software Foundation; either version 2 - of the License, or (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - :TODO - - - Join messages - - RE MD5 hash calculation - - Have a closer look at 8 byte padding in summary adv. - "debug sw-vlan vtp packets" sais the TLV length is invalid, - when I change the values - '\x00\x00\x00\x01\x06\x01\x00\x02' - * \x00\x00 ? - * \x00\x01 tlvtype? - * \x06 length? - * \x00\x02 value? - - h2i function for VTPTimeStampField - - :References: - - - Understanding VLAN Trunk Protocol (VTP) - http://www.cisco.com/en/US/tech/tk389/tk689/technologies_tech_note09186a0080094c52.shtml -""" - -from scapy.all import * - -_VTP_VLAN_TYPE = { - 1 : 'Ethernet', - 2 : 'FDDI', - 3 : 'TrCRF', - 4 : 'FDDI-net', - 5 : 'TrBRF' - } - -_VTP_VLANINFO_TLV_TYPE = { - 0x01 : 'Source-Routing Ring Number', - 0x02 : 'Source-Routing Bridge Number', - 0x03 : 'Spanning-Tree Protocol Type', - 0x04 : 'Parent VLAN', - 0x05 : 'Translationally Bridged VLANs', - 0x06 : 'Pruning', - 0x07 : 'Bridge Type', - 0x08 : 'Max ARE Hop Count', - 0x09 : 'Max STE Hop Count', - 0x0A : 'Backup CRF Mode' - } - - -class VTPVlanInfoTlv(Packet): - name = "VTP VLAN Info TLV" - fields_desc = [ - ByteEnumField("type", 0, _VTP_VLANINFO_TLV_TYPE), - ByteField("length", 0), - StrLenField("value", None, length_from=lambda pkt : pkt.length + 1) - ] - - def guess_payload_class(self, p): - return conf.padding_layer - -class VTPVlanInfo(Packet): - name = "VTP VLAN Info" - fields_desc = [ - ByteField("len", None), # FIXME: compute length - ByteEnumField("status", 0, {0 : "active", 1 : "suspended"}), - ByteEnumField("type", 1, _VTP_VLAN_TYPE), - FieldLenField("vlannamelen", None, "vlanname", "B"), - ShortField("vlanid", 1), - ShortField("mtu", 1500), - XIntField("dot10index", None), - StrLenField("vlanname", "default", length_from=lambda pkt:4 * ((pkt.vlannamelen + 3) / 4)), - ConditionalField(PacketListField("tlvlist", [], VTPVlanInfoTlv, - length_from=lambda pkt:pkt.len - 12 - (4 * ((pkt.vlannamelen + 3) / 4))), - lambda pkt:pkt.type not in [1, 2]) - ] - - def post_build(self, p, pay): - vlannamelen = 4 * ((len(self.vlanname) + 3) / 4) - - if self.len == None: - l = vlannamelen + 12 - p = chr(l & 0xff) + p[1:] - - # Pad vlan name with zeros if vlannamelen > len(vlanname) - l = vlannamelen - len(self.vlanname) - if l != 0: - p += "\x00" * l - - p += pay - - return p - - def guess_payload_class(self, p): - return conf.padding_layer - -_VTP_Types = { - 1 : 'Summary Advertisement', - 2 : 'Subset Advertisements', - 3 : 'Advertisement Request', - 4 : 'Join' - } - -class VTPTimeStampField(StrFixedLenField): - def __init__(self, name, default): - StrFixedLenField.__init__(self, name, default, 12) - - def i2repr(self, pkt, x): - return "%s-%s-%s %s:%s:%s" % (x[:2], x[2:4], x[4:6], x[6:8], x[8:10], x[10:12]) - -class VTP(Packet): - name = "VTP" - fields_desc = [ - ByteField("ver", 2), - ByteEnumField("code", 1, _VTP_Types), - ConditionalField(ByteField("followers", 1), - lambda pkt:pkt.code == 1), - ConditionalField(ByteField("seq", 1), - lambda pkt:pkt.code == 2), - ConditionalField(ByteField("reserved", 0), - lambda pkt:pkt.code == 3), - ByteField("domnamelen", None), - StrFixedLenField("domname", "manbearpig", 32), - ConditionalField(SignedIntField("rev", 0), - lambda pkt:pkt.code == 1 or - pkt.code == 2), - # updater identity - ConditionalField(IPField("uid", "192.168.0.1"), - lambda pkt:pkt.code == 1), - ConditionalField(VTPTimeStampField("timestamp", '930301000000'), - lambda pkt:pkt.code == 1), - ConditionalField(StrFixedLenField("md5", "\x00" * 16, 16), - lambda pkt:pkt.code == 1), - ConditionalField( - PacketListField("vlaninfo", [], VTPVlanInfo), - lambda pkt: pkt.code == 2), - ConditionalField(ShortField("startvalue", 0), - lambda pkt:pkt.code == 3) - ] - - def post_build(self, p, pay): - if self.domnamelen == None: - domnamelen = len(self.domname.strip("\x00")) - p = p[:3] + chr(domnamelen & 0xff) + p[4:] - - p += pay - - return p - -bind_layers(SNAP, VTP, code=0x2003) - -if __name__ == '__main__': - interact(mydict=globals(), mybanner="VTP") diff --git a/scripts/external_libs/scapy-2.3.1/scapy/contrib/wpa_eapol.py b/scripts/external_libs/scapy-2.3.1/scapy/contrib/wpa_eapol.py deleted file mode 100644 index 084eedd8..00000000 --- a/scripts/external_libs/scapy-2.3.1/scapy/contrib/wpa_eapol.py +++ /dev/null @@ -1,35 +0,0 @@ - -# http://trac.secdev.org/scapy/ticket/104 - -# scapy.contrib.description = WPA EAPOL dissector -# scapy.contrib.status = loads - -from scapy.packet import * -from scapy.fields import * -from scapy.layers.l2 import * - -class WPA_key(Packet): - name = "WPA_key" - fields_desc = [ ByteField("descriptor_type", 1), - ShortField("key_info",0), - LenField("len", None, "H"), - StrFixedLenField("replay_counter", "", 8), - StrFixedLenField("nonce", "", 32), - StrFixedLenField("key_iv", "", 16), - StrFixedLenField("wpa_key_rsc", "", 8), - StrFixedLenField("wpa_key_id", "", 8), - StrFixedLenField("wpa_key_mic", "", 16), - LenField("wpa_key_length", None, "H"), - StrLenField("wpa_key", "", length_from=lambda pkt:pkt.wpa_key_length) ] - def extract_padding(self, s): - l = self.len - return s[:l],s[l:] - def hashret(self): - return chr(self.type)+self.payload.hashret() - def answers(self, other): - if isinstance(other,WPA_key): - return 1 - return 0 - - -bind_layers( EAPOL, WPA_key, type=3) diff --git a/scripts/external_libs/scapy-2.3.1/scapy/crypto/__init__.py b/scripts/external_libs/scapy-2.3.1/scapy/crypto/__init__.py deleted file mode 100644 index b441863e..00000000 --- a/scripts/external_libs/scapy-2.3.1/scapy/crypto/__init__.py +++ /dev/null @@ -1,17 +0,0 @@ -## This file is part of Scapy -## See http://www.secdev.org/projects/scapy for more informations -## Copyright (C) Arnaud Ebalard <arno@natisbad.org> -## This program is published under a GPLv2 license - -""" -Tools for handling with digital certificates. -""" - -try: - import Crypto -except ImportError: - import logging - log_loading = logging.getLogger("scapy.loading") - log_loading.info("Can't import python Crypto lib. Disabled certificate manipulation tools") -else: - from scapy.crypto.cert import * diff --git a/scripts/external_libs/scapy-2.3.1/scapy/crypto/cert.py b/scripts/external_libs/scapy-2.3.1/scapy/crypto/cert.py deleted file mode 100644 index e6c00496..00000000 --- a/scripts/external_libs/scapy-2.3.1/scapy/crypto/cert.py +++ /dev/null @@ -1,2486 +0,0 @@ -## This file is part of Scapy -## See http://www.secdev.org/projects/scapy for more informations -## Copyright (C) Arnaud Ebalard <arno@natisbad.org> -## This program is published under a GPLv2 license - -""" -Cryptographic certificates. -""" - -import os, sys, math, socket, struct, hmac, string, time, random, tempfile -from subprocess import Popen, PIPE -from scapy.utils import strxor -try: - HAS_HASHLIB=True - import hashlib -except: - HAS_HASHLIB=False - -from Crypto.PublicKey import * -from Crypto.Cipher import * -from Crypto.Hash import * -from Crypto.Util import number - -# Maximum allowed size in bytes for a certificate file, to avoid -# loading huge file when importing a cert -MAX_KEY_SIZE=50*1024 -MAX_CERT_SIZE=50*1024 -MAX_CRL_SIZE=10*1024*1024 # some are that big - -##################################################################### -# Some helpers -##################################################################### - -def popen3(cmd): - p = Popen(cmd, shell=False, stdin=PIPE, stdout=PIPE, stderr=PIPE, - close_fds=True) - return p.stdout, p.stdin, p.stderr - -def warning(m): - print "WARNING: %s" % m - -def randstring(l): - """ - Returns a random string of length l (l >= 0) - """ - tmp = map(lambda x: struct.pack("B", random.randrange(0, 256, 1)), [""]*l) - return "".join(tmp) - -def zerofree_randstring(l): - """ - Returns a random string of length l (l >= 0) without zero in it. - """ - tmp = map(lambda x: struct.pack("B", random.randrange(1, 256, 1)), [""]*l) - return "".join(tmp) - -def strand(s1, s2): - """ - Returns the binary AND of the 2 provided strings s1 and s2. s1 and s2 - must be of same length. - """ - return "".join(map(lambda x,y:chr(ord(x)&ord(y)), s1, s2)) - -# OS2IP function defined in RFC 3447 for octet string to integer conversion -def pkcs_os2ip(x): - """ - Accepts a byte string as input parameter and return the associated long - value: - - Input : x octet string to be converted - - Output: x corresponding nonnegative integer - - Reverse function is pkcs_i2osp() - """ - return number.bytes_to_long(x) - -# IP2OS function defined in RFC 3447 for octet string to integer conversion -def pkcs_i2osp(x,xLen): - """ - Converts a long (the first parameter) to the associated byte string - representation of length l (second parameter). Basically, the length - parameters allow the function to perform the associated padding. - - Input : x nonnegative integer to be converted - xLen intended length of the resulting octet string - - Output: x corresponding nonnegative integer - - Reverse function is pkcs_os2ip(). - """ - z = number.long_to_bytes(x) - padlen = max(0, xLen-len(z)) - return '\x00'*padlen + z - -# for every hash function a tuple is provided, giving access to -# - hash output length in byte -# - associated hash function that take data to be hashed as parameter -# XXX I do not provide update() at the moment. -# - DER encoding of the leading bits of digestInfo (the hash value -# will be concatenated to create the complete digestInfo). -# -# Notes: -# - MD4 asn.1 value should be verified. Also, as stated in -# PKCS#1 v2.1, MD4 should not be used. -# - hashlib is available from http://code.krypto.org/python/hashlib/ -# - 'tls' one is the concatenation of both md5 and sha1 hashes used -# by SSL/TLS when signing/verifying things -_hashFuncParams = { - "md2" : (16, - lambda x: MD2.new(x).digest(), - '\x30\x20\x30\x0c\x06\x08\x2a\x86\x48\x86\xf7\x0d\x02\x02\x05\x00\x04\x10'), - "md4" : (16, - lambda x: MD4.new(x).digest(), - '\x30\x20\x30\x0c\x06\x08\x2a\x86\x48\x86\xf7\x0d\x02\x04\x05\x00\x04\x10'), # is that right ? - "md5" : (16, - lambda x: MD5.new(x).digest(), - '\x30\x20\x30\x0c\x06\x08\x2a\x86\x48\x86\xf7\x0d\x02\x05\x05\x00\x04\x10'), - "sha1" : (20, - lambda x: SHA.new(x).digest(), - '\x30\x21\x30\x09\x06\x05\x2b\x0e\x03\x02\x1a\x05\x00\x04\x14'), - "tls" : (36, - lambda x: MD5.new(x).digest() + SHA.new(x).digest(), - '') } - -if HAS_HASHLIB: - _hashFuncParams["sha224"] = (28, - lambda x: hashlib.sha224(x).digest(), - '\x30\x2d\x30\x0d\x06\x09\x60\x86\x48\x01\x65\x03\x04\x02\x04\x05\x00\x04\x1c') - _hashFuncParams["sha256"] = (32, - lambda x: hashlib.sha256(x).digest(), - '\x30\x31\x30\x0d\x06\x09\x60\x86\x48\x01\x65\x03\x04\x02\x01\x05\x00\x04\x20') - _hashFuncParams["sha384"] = (48, - lambda x: hashlib.sha384(x).digest(), - '\x30\x41\x30\x0d\x06\x09\x60\x86\x48\x01\x65\x03\x04\x02\x02\x05\x00\x04\x30') - _hashFuncParams["sha512"] = (64, - lambda x: hashlib.sha512(x).digest(), - '\x30\x51\x30\x0d\x06\x09\x60\x86\x48\x01\x65\x03\x04\x02\x03\x05\x00\x04\x40') -else: - warning("hashlib support is not available. Consider installing it") - warning("if you need sha224, sha256, sha384 and sha512 algs.") - -def pkcs_mgf1(mgfSeed, maskLen, h): - """ - Implements generic MGF1 Mask Generation function as described in - Appendix B.2.1 of RFC 3447. The hash function is passed by name. - valid values are 'md2', 'md4', 'md5', 'sha1', 'tls, 'sha256', - 'sha384' and 'sha512'. Returns None on error. - - Input: - mgfSeed: seed from which mask is generated, an octet string - maskLen: intended length in octets of the mask, at most 2^32 * hLen - hLen (see below) - h : hash function name (in 'md2', 'md4', 'md5', 'sha1', 'tls', - 'sha256', 'sha384'). hLen denotes the length in octets of - the hash function output. - - Output: - an octet string of length maskLen - """ - - # steps are those of Appendix B.2.1 - if not _hashFuncParams.has_key(h): - warning("pkcs_mgf1: invalid hash (%s) provided") - return None - hLen = _hashFuncParams[h][0] - hFunc = _hashFuncParams[h][1] - if maskLen > 2**32 * hLen: # 1) - warning("pkcs_mgf1: maskLen > 2**32 * hLen") - return None - T = "" # 2) - maxCounter = math.ceil(float(maskLen) / float(hLen)) # 3) - counter = 0 - while counter < maxCounter: - C = pkcs_i2osp(counter, 4) - T += hFunc(mgfSeed + C) - counter += 1 - return T[:maskLen] - - -def pkcs_emsa_pss_encode(M, emBits, h, mgf, sLen): - """ - Implements EMSA-PSS-ENCODE() function described in Sect. 9.1.1 of RFC 3447 - - Input: - M : message to be encoded, an octet string - emBits: maximal bit length of the integer resulting of pkcs_os2ip(EM), - where EM is the encoded message, output of the function. - h : hash function name (in 'md2', 'md4', 'md5', 'sha1', 'tls', - 'sha256', 'sha384'). hLen denotes the length in octets of - the hash function output. - mgf : the mask generation function f : seed, maskLen -> mask - sLen : intended length in octets of the salt - - Output: - encoded message, an octet string of length emLen = ceil(emBits/8) - - On error, None is returned. - """ - - # 1) is not done - hLen = _hashFuncParams[h][0] # 2) - hFunc = _hashFuncParams[h][1] - mHash = hFunc(M) - emLen = int(math.ceil(emBits/8.)) - if emLen < hLen + sLen + 2: # 3) - warning("encoding error (emLen < hLen + sLen + 2)") - return None - salt = randstring(sLen) # 4) - MPrime = '\x00'*8 + mHash + salt # 5) - H = hFunc(MPrime) # 6) - PS = '\x00'*(emLen - sLen - hLen - 2) # 7) - DB = PS + '\x01' + salt # 8) - dbMask = mgf(H, emLen - hLen - 1) # 9) - maskedDB = strxor(DB, dbMask) # 10) - l = (8*emLen - emBits)/8 # 11) - rem = 8*emLen - emBits - 8*l # additionnal bits - andMask = l*'\x00' - if rem: - j = chr(reduce(lambda x,y: x+y, map(lambda x: 1<<x, range(8-rem)))) - andMask += j - l += 1 - maskedDB = strand(maskedDB[:l], andMask) + maskedDB[l:] - EM = maskedDB + H + '\xbc' # 12) - return EM # 13) - - -def pkcs_emsa_pss_verify(M, EM, emBits, h, mgf, sLen): - """ - Implements EMSA-PSS-VERIFY() function described in Sect. 9.1.2 of RFC 3447 - - Input: - M : message to be encoded, an octet string - EM : encoded message, an octet string of length emLen = ceil(emBits/8) - emBits: maximal bit length of the integer resulting of pkcs_os2ip(EM) - h : hash function name (in 'md2', 'md4', 'md5', 'sha1', 'tls', - 'sha256', 'sha384'). hLen denotes the length in octets of - the hash function output. - mgf : the mask generation function f : seed, maskLen -> mask - sLen : intended length in octets of the salt - - Output: - True if the verification is ok, False otherwise. - """ - - # 1) is not done - hLen = _hashFuncParams[h][0] # 2) - hFunc = _hashFuncParams[h][1] - mHash = hFunc(M) - emLen = int(math.ceil(emBits/8.)) # 3) - if emLen < hLen + sLen + 2: - return False - if EM[-1] != '\xbc': # 4) - return False - l = emLen - hLen - 1 # 5) - maskedDB = EM[:l] - H = EM[l:l+hLen] - l = (8*emLen - emBits)/8 # 6) - rem = 8*emLen - emBits - 8*l # additionnal bits - andMask = l*'\xff' - if rem: - val = reduce(lambda x,y: x+y, map(lambda x: 1<<x, range(8-rem))) - j = chr(~val & 0xff) - andMask += j - l += 1 - if strand(maskedDB[:l], andMask) != '\x00'*l: - return False - dbMask = mgf(H, emLen - hLen - 1) # 7) - DB = strxor(maskedDB, dbMask) # 8) - l = (8*emLen - emBits)/8 # 9) - rem = 8*emLen - emBits - 8*l # additionnal bits - andMask = l*'\x00' - if rem: - j = chr(reduce(lambda x,y: x+y, map(lambda x: 1<<x, range(8-rem)))) - andMask += j - l += 1 - DB = strand(DB[:l], andMask) + DB[l:] - l = emLen - hLen - sLen - 1 # 10) - if DB[:l] != '\x00'*(l-1) + '\x01': - return False - salt = DB[-sLen:] # 11) - MPrime = '\x00'*8 + mHash + salt # 12) - HPrime = hFunc(MPrime) # 13) - return H == HPrime # 14) - - -def pkcs_emsa_pkcs1_v1_5_encode(M, emLen, h): # section 9.2 of RFC 3447 - """ - Implements EMSA-PKCS1-V1_5-ENCODE() function described in Sect. - 9.2 of RFC 3447. - - Input: - M : message to be encode, an octet string - emLen: intended length in octets of the encoded message, at least - tLen + 11, where tLen is the octet length of the DER encoding - T of a certain value computed during the encoding operation. - h : hash function name (in 'md2', 'md4', 'md5', 'sha1', 'tls', - 'sha256', 'sha384'). hLen denotes the length in octets of - the hash function output. - - Output: - encoded message, an octet string of length emLen - - On error, None is returned. - """ - hLen = _hashFuncParams[h][0] # 1) - hFunc = _hashFuncParams[h][1] - H = hFunc(M) - hLeadingDigestInfo = _hashFuncParams[h][2] # 2) - T = hLeadingDigestInfo + H - tLen = len(T) - if emLen < tLen + 11: # 3) - warning("pkcs_emsa_pkcs1_v1_5_encode: intended encoded message length too short") - return None - PS = '\xff'*(emLen - tLen - 3) # 4) - EM = '\x00' + '\x01' + PS + '\x00' + T # 5) - return EM # 6) - - -# XXX should add other pgf1 instance in a better fashion. - -def create_ca_file(anchor_list, filename): - """ - Concatenate all the certificates (PEM format for the export) in - 'anchor_list' and write the result to file 'filename'. On success - 'filename' is returned, None otherwise. - - If you are used to OpenSSL tools, this function builds a CAfile - that can be used for certificate and CRL check. - - Also see create_temporary_ca_file(). - """ - try: - f = open(filename, "w") - for a in anchor_list: - s = a.output(fmt="PEM") - f.write(s) - f.close() - except: - return None - return filename - -def create_temporary_ca_file(anchor_list): - """ - Concatenate all the certificates (PEM format for the export) in - 'anchor_list' and write the result to file to a temporary file - using mkstemp() from tempfile module. On success 'filename' is - returned, None otherwise. - - If you are used to OpenSSL tools, this function builds a CAfile - that can be used for certificate and CRL check. - - Also see create_temporary_ca_file(). - """ - try: - f, fname = tempfile.mkstemp() - for a in anchor_list: - s = a.output(fmt="PEM") - l = os.write(f, s) - os.close(f) - except: - return None - return fname - -def create_temporary_ca_path(anchor_list, folder): - """ - Create a CA path folder as defined in OpenSSL terminology, by - storing all certificates in 'anchor_list' list in PEM format - under provided 'folder' and then creating the associated links - using the hash as usually done by c_rehash. - - Note that you can also include CRL in 'anchor_list'. In that - case, they will also be stored under 'folder' and associated - links will be created. - - In folder, the files are created with names of the form - 0...ZZ.pem. If you provide an empty list, folder will be created - if it does not already exist, but that's all. - - The number of certificates written to folder is returned on - success, None on error. - """ - # We should probably avoid writing duplicate anchors and also - # check if they are all certs. - try: - if not os.path.isdir(folder): - os.makedirs(folder) - except: - return None - - l = len(anchor_list) - if l == 0: - return None - fmtstr = "%%0%sd.pem" % math.ceil(math.log(l, 10)) - i = 0 - try: - for a in anchor_list: - fname = os.path.join(folder, fmtstr % i) - f = open(fname, "w") - s = a.output(fmt="PEM") - f.write(s) - f.close() - i += 1 - except: - return None - - r,w,e=popen3(["c_rehash", folder]) - r.close(); w.close(); e.close() - - return l - - -##################################################################### -# Public Key Cryptography related stuff -##################################################################### - -class OSSLHelper: - def _apply_ossl_cmd(self, osslcmd, rawdata): - r,w,e=popen3(osslcmd) - w.write(rawdata) - w.close() - res = r.read() - r.close() - e.close() - return res - -class _EncryptAndVerify: - ### Below are encryption methods - - def _rsaep(self, m): - """ - Internal method providing raw RSA encryption, i.e. simple modular - exponentiation of the given message representative 'm', a long - between 0 and n-1. - - This is the encryption primitive RSAEP described in PKCS#1 v2.1, - i.e. RFC 3447 Sect. 5.1.1. - - Input: - m: message representative, a long between 0 and n-1, where - n is the key modulus. - - Output: - ciphertext representative, a long between 0 and n-1 - - Not intended to be used directly. Please, see encrypt() method. - """ - - n = self.modulus - if type(m) is int: - m = long(m) - if type(m) is not long or m > n-1: - warning("Key._rsaep() expects a long between 0 and n-1") - return None - - return self.key.encrypt(m, "")[0] - - - def _rsaes_pkcs1_v1_5_encrypt(self, M): - """ - Implements RSAES-PKCS1-V1_5-ENCRYPT() function described in section - 7.2.1 of RFC 3447. - - Input: - M: message to be encrypted, an octet string of length mLen, where - mLen <= k - 11 (k denotes the length in octets of the key modulus) - - Output: - ciphertext, an octet string of length k - - On error, None is returned. - """ - - # 1) Length checking - mLen = len(M) - k = self.modulusLen / 8 - if mLen > k - 11: - warning("Key._rsaes_pkcs1_v1_5_encrypt(): message too " - "long (%d > %d - 11)" % (mLen, k)) - return None - - # 2) EME-PKCS1-v1_5 encoding - PS = zerofree_randstring(k - mLen - 3) # 2.a) - EM = '\x00' + '\x02' + PS + '\x00' + M # 2.b) - - # 3) RSA encryption - m = pkcs_os2ip(EM) # 3.a) - c = self._rsaep(m) # 3.b) - C = pkcs_i2osp(c, k) # 3.c) - - return C # 4) - - - def _rsaes_oaep_encrypt(self, M, h=None, mgf=None, L=None): - """ - Internal method providing RSAES-OAEP-ENCRYPT as defined in Sect. - 7.1.1 of RFC 3447. Not intended to be used directly. Please, see - encrypt() method for type "OAEP". - - - Input: - M : message to be encrypted, an octet string of length mLen - where mLen <= k - 2*hLen - 2 (k denotes the length in octets - of the RSA modulus and hLen the length in octets of the hash - function output) - h : hash function name (in 'md2', 'md4', 'md5', 'sha1', 'tls', - 'sha256', 'sha384'). hLen denotes the length in octets of - the hash function output. 'sha1' is used by default if not - provided. - mgf: the mask generation function f : seed, maskLen -> mask - L : optional label to be associated with the message; the default - value for L, if not provided is the empty string - - Output: - ciphertext, an octet string of length k - - On error, None is returned. - """ - # The steps below are the one described in Sect. 7.1.1 of RFC 3447. - # 1) Length Checking - # 1.a) is not done - mLen = len(M) - if h is None: - h = "sha1" - if not _hashFuncParams.has_key(h): - warning("Key._rsaes_oaep_encrypt(): unknown hash function %s.", h) - return None - hLen = _hashFuncParams[h][0] - hFun = _hashFuncParams[h][1] - k = self.modulusLen / 8 - if mLen > k - 2*hLen - 2: # 1.b) - warning("Key._rsaes_oaep_encrypt(): message too long.") - return None - - # 2) EME-OAEP encoding - if L is None: # 2.a) - L = "" - lHash = hFun(L) - PS = '\x00'*(k - mLen - 2*hLen - 2) # 2.b) - DB = lHash + PS + '\x01' + M # 2.c) - seed = randstring(hLen) # 2.d) - if mgf is None: # 2.e) - mgf = lambda x,y: pkcs_mgf1(x,y,h) - dbMask = mgf(seed, k - hLen - 1) - maskedDB = strxor(DB, dbMask) # 2.f) - seedMask = mgf(maskedDB, hLen) # 2.g) - maskedSeed = strxor(seed, seedMask) # 2.h) - EM = '\x00' + maskedSeed + maskedDB # 2.i) - - # 3) RSA Encryption - m = pkcs_os2ip(EM) # 3.a) - c = self._rsaep(m) # 3.b) - C = pkcs_i2osp(c, k) # 3.c) - - return C # 4) - - - def encrypt(self, m, t=None, h=None, mgf=None, L=None): - """ - Encrypt message 'm' using 't' encryption scheme where 't' can be: - - - None: the message 'm' is directly applied the RSAEP encryption - primitive, as described in PKCS#1 v2.1, i.e. RFC 3447 - Sect 5.1.1. Simply put, the message undergo a modular - exponentiation using the public key. Additionnal method - parameters are just ignored. - - - 'pkcs': the message 'm' is applied RSAES-PKCS1-V1_5-ENCRYPT encryption - scheme as described in section 7.2.1 of RFC 3447. In that - context, other parameters ('h', 'mgf', 'l') are not used. - - - 'oaep': the message 'm' is applied the RSAES-OAEP-ENCRYPT encryption - scheme, as described in PKCS#1 v2.1, i.e. RFC 3447 Sect - 7.1.1. In that context, - - o 'h' parameter provides the name of the hash method to use. - Possible values are "md2", "md4", "md5", "sha1", "tls", - "sha224", "sha256", "sha384" and "sha512". if none is provided, - sha1 is used. - - o 'mgf' is the mask generation function. By default, mgf - is derived from the provided hash function using the - generic MGF1 (see pkcs_mgf1() for details). - - o 'L' is the optional label to be associated with the - message. If not provided, the default value is used, i.e - the empty string. No check is done on the input limitation - of the hash function regarding the size of 'L' (for - instance, 2^61 - 1 for SHA-1). You have been warned. - """ - - if t is None: # Raw encryption - m = pkcs_os2ip(m) - c = self._rsaep(m) - return pkcs_i2osp(c, self.modulusLen/8) - - elif t == "pkcs": - return self._rsaes_pkcs1_v1_5_encrypt(m) - - elif t == "oaep": - return self._rsaes_oaep_encrypt(m, h, mgf, L) - - else: - warning("Key.encrypt(): Unknown encryption type (%s) provided" % t) - return None - - ### Below are verification related methods - - def _rsavp1(self, s): - """ - Internal method providing raw RSA verification, i.e. simple modular - exponentiation of the given signature representative 'c', an integer - between 0 and n-1. - - This is the signature verification primitive RSAVP1 described in - PKCS#1 v2.1, i.e. RFC 3447 Sect. 5.2.2. - - Input: - s: signature representative, an integer between 0 and n-1, - where n is the key modulus. - - Output: - message representative, an integer between 0 and n-1 - - Not intended to be used directly. Please, see verify() method. - """ - return self._rsaep(s) - - def _rsassa_pss_verify(self, M, S, h=None, mgf=None, sLen=None): - """ - Implements RSASSA-PSS-VERIFY() function described in Sect 8.1.2 - of RFC 3447 - - Input: - M: message whose signature is to be verified - S: signature to be verified, an octet string of length k, where k - is the length in octets of the RSA modulus n. - - Output: - True is the signature is valid. False otherwise. - """ - - # Set default parameters if not provided - if h is None: # By default, sha1 - h = "sha1" - if not _hashFuncParams.has_key(h): - warning("Key._rsassa_pss_verify(): unknown hash function " - "provided (%s)" % h) - return False - if mgf is None: # use mgf1 with underlying hash function - mgf = lambda x,y: pkcs_mgf1(x, y, h) - if sLen is None: # use Hash output length (A.2.3 of RFC 3447) - hLen = _hashFuncParams[h][0] - sLen = hLen - - # 1) Length checking - modBits = self.modulusLen - k = modBits / 8 - if len(S) != k: - return False - - # 2) RSA verification - s = pkcs_os2ip(S) # 2.a) - m = self._rsavp1(s) # 2.b) - emLen = math.ceil((modBits - 1) / 8.) # 2.c) - EM = pkcs_i2osp(m, emLen) - - # 3) EMSA-PSS verification - Result = pkcs_emsa_pss_verify(M, EM, modBits - 1, h, mgf, sLen) - - return Result # 4) - - - def _rsassa_pkcs1_v1_5_verify(self, M, S, h): - """ - Implements RSASSA-PKCS1-v1_5-VERIFY() function as described in - Sect. 8.2.2 of RFC 3447. - - Input: - M: message whose signature is to be verified, an octet string - S: signature to be verified, an octet string of length k, where - k is the length in octets of the RSA modulus n - h: hash function name (in 'md2', 'md4', 'md5', 'sha1', 'tls', - 'sha256', 'sha384'). - - Output: - True if the signature is valid. False otherwise. - """ - - # 1) Length checking - k = self.modulusLen / 8 - if len(S) != k: - warning("invalid signature (len(S) != k)") - return False - - # 2) RSA verification - s = pkcs_os2ip(S) # 2.a) - m = self._rsavp1(s) # 2.b) - EM = pkcs_i2osp(m, k) # 2.c) - - # 3) EMSA-PKCS1-v1_5 encoding - EMPrime = pkcs_emsa_pkcs1_v1_5_encode(M, k, h) - if EMPrime is None: - warning("Key._rsassa_pkcs1_v1_5_verify(): unable to encode.") - return False - - # 4) Comparison - return EM == EMPrime - - - def verify(self, M, S, t=None, h=None, mgf=None, sLen=None): - """ - Verify alleged signature 'S' is indeed the signature of message 'M' using - 't' signature scheme where 't' can be: - - - None: the alleged signature 'S' is directly applied the RSAVP1 signature - primitive, as described in PKCS#1 v2.1, i.e. RFC 3447 Sect - 5.2.1. Simply put, the provided signature is applied a moular - exponentiation using the public key. Then, a comparison of the - result is done against 'M'. On match, True is returned. - Additionnal method parameters are just ignored. - - - 'pkcs': the alleged signature 'S' and message 'M' are applied - RSASSA-PKCS1-v1_5-VERIFY signature verification scheme as - described in Sect. 8.2.2 of RFC 3447. In that context, - the hash function name is passed using 'h'. Possible values are - "md2", "md4", "md5", "sha1", "tls", "sha224", "sha256", "sha384" - and "sha512". If none is provided, sha1 is used. Other additionnal - parameters are ignored. - - - 'pss': the alleged signature 'S' and message 'M' are applied - RSASSA-PSS-VERIFY signature scheme as described in Sect. 8.1.2. - of RFC 3447. In that context, - - o 'h' parameter provides the name of the hash method to use. - Possible values are "md2", "md4", "md5", "sha1", "tls", "sha224", - "sha256", "sha384" and "sha512". if none is provided, sha1 - is used. - - o 'mgf' is the mask generation function. By default, mgf - is derived from the provided hash function using the - generic MGF1 (see pkcs_mgf1() for details). - - o 'sLen' is the length in octet of the salt. You can overload the - default value (the octet length of the hash value for provided - algorithm) by providing another one with that parameter. - """ - if t is None: # RSAVP1 - S = pkcs_os2ip(S) - n = self.modulus - if S > n-1: - warning("Signature to be verified is too long for key modulus") - return False - m = self._rsavp1(S) - if m is None: - return False - l = int(math.ceil(math.log(m, 2) / 8.)) # Hack - m = pkcs_i2osp(m, l) - return M == m - - elif t == "pkcs": # RSASSA-PKCS1-v1_5-VERIFY - if h is None: - h = "sha1" - return self._rsassa_pkcs1_v1_5_verify(M, S, h) - - elif t == "pss": # RSASSA-PSS-VERIFY - return self._rsassa_pss_verify(M, S, h, mgf, sLen) - - else: - warning("Key.verify(): Unknown signature type (%s) provided" % t) - return None - -class _DecryptAndSignMethods(OSSLHelper): - ### Below are decryption related methods. Encryption ones are inherited - ### from PubKey - - def _rsadp(self, c): - """ - Internal method providing raw RSA decryption, i.e. simple modular - exponentiation of the given ciphertext representative 'c', a long - between 0 and n-1. - - This is the decryption primitive RSADP described in PKCS#1 v2.1, - i.e. RFC 3447 Sect. 5.1.2. - - Input: - c: ciphertest representative, a long between 0 and n-1, where - n is the key modulus. - - Output: - ciphertext representative, a long between 0 and n-1 - - Not intended to be used directly. Please, see encrypt() method. - """ - - n = self.modulus - if type(c) is int: - c = long(c) - if type(c) is not long or c > n-1: - warning("Key._rsaep() expects a long between 0 and n-1") - return None - - return self.key.decrypt(c) - - - def _rsaes_pkcs1_v1_5_decrypt(self, C): - """ - Implements RSAES-PKCS1-V1_5-DECRYPT() function described in section - 7.2.2 of RFC 3447. - - Input: - C: ciphertext to be decrypted, an octet string of length k, where - k is the length in octets of the RSA modulus n. - - Output: - an octet string of length k at most k - 11 - - on error, None is returned. - """ - - # 1) Length checking - cLen = len(C) - k = self.modulusLen / 8 - if cLen != k or k < 11: - warning("Key._rsaes_pkcs1_v1_5_decrypt() decryption error " - "(cLen != k or k < 11)") - return None - - # 2) RSA decryption - c = pkcs_os2ip(C) # 2.a) - m = self._rsadp(c) # 2.b) - EM = pkcs_i2osp(m, k) # 2.c) - - # 3) EME-PKCS1-v1_5 decoding - - # I am aware of the note at the end of 7.2.2 regarding error - # conditions reporting but the one provided below are for _local_ - # debugging purposes. --arno - - if EM[0] != '\x00': - warning("Key._rsaes_pkcs1_v1_5_decrypt(): decryption error " - "(first byte is not 0x00)") - return None - - if EM[1] != '\x02': - warning("Key._rsaes_pkcs1_v1_5_decrypt(): decryption error " - "(second byte is not 0x02)") - return None - - tmp = EM[2:].split('\x00', 1) - if len(tmp) != 2: - warning("Key._rsaes_pkcs1_v1_5_decrypt(): decryption error " - "(no 0x00 to separate PS from M)") - return None - - PS, M = tmp - if len(PS) < 8: - warning("Key._rsaes_pkcs1_v1_5_decrypt(): decryption error " - "(PS is less than 8 byte long)") - return None - - return M # 4) - - - def _rsaes_oaep_decrypt(self, C, h=None, mgf=None, L=None): - """ - Internal method providing RSAES-OAEP-DECRYPT as defined in Sect. - 7.1.2 of RFC 3447. Not intended to be used directly. Please, see - encrypt() method for type "OAEP". - - - Input: - C : ciphertext to be decrypted, an octet string of length k, where - k = 2*hLen + 2 (k denotes the length in octets of the RSA modulus - and hLen the length in octets of the hash function output) - h : hash function name (in 'md2', 'md4', 'md5', 'sha1', 'tls', - 'sha256', 'sha384'). 'sha1' is used if none is provided. - mgf: the mask generation function f : seed, maskLen -> mask - L : optional label whose association with the message is to be - verified; the default value for L, if not provided is the empty - string. - - Output: - message, an octet string of length k mLen, where mLen <= k - 2*hLen - 2 - - On error, None is returned. - """ - # The steps below are the one described in Sect. 7.1.2 of RFC 3447. - - # 1) Length Checking - # 1.a) is not done - if h is None: - h = "sha1" - if not _hashFuncParams.has_key(h): - warning("Key._rsaes_oaep_decrypt(): unknown hash function %s.", h) - return None - hLen = _hashFuncParams[h][0] - hFun = _hashFuncParams[h][1] - k = self.modulusLen / 8 - cLen = len(C) - if cLen != k: # 1.b) - warning("Key._rsaes_oaep_decrypt(): decryption error. " - "(cLen != k)") - return None - if k < 2*hLen + 2: - warning("Key._rsaes_oaep_decrypt(): decryption error. " - "(k < 2*hLen + 2)") - return None - - # 2) RSA decryption - c = pkcs_os2ip(C) # 2.a) - m = self._rsadp(c) # 2.b) - EM = pkcs_i2osp(m, k) # 2.c) - - # 3) EME-OAEP decoding - if L is None: # 3.a) - L = "" - lHash = hFun(L) - Y = EM[:1] # 3.b) - if Y != '\x00': - warning("Key._rsaes_oaep_decrypt(): decryption error. " - "(Y is not zero)") - return None - maskedSeed = EM[1:1+hLen] - maskedDB = EM[1+hLen:] - if mgf is None: - mgf = lambda x,y: pkcs_mgf1(x, y, h) - seedMask = mgf(maskedDB, hLen) # 3.c) - seed = strxor(maskedSeed, seedMask) # 3.d) - dbMask = mgf(seed, k - hLen - 1) # 3.e) - DB = strxor(maskedDB, dbMask) # 3.f) - - # I am aware of the note at the end of 7.1.2 regarding error - # conditions reporting but the one provided below are for _local_ - # debugging purposes. --arno - - lHashPrime = DB[:hLen] # 3.g) - tmp = DB[hLen:].split('\x01', 1) - if len(tmp) != 2: - warning("Key._rsaes_oaep_decrypt(): decryption error. " - "(0x01 separator not found)") - return None - PS, M = tmp - if PS != '\x00'*len(PS): - warning("Key._rsaes_oaep_decrypt(): decryption error. " - "(invalid padding string)") - return None - if lHash != lHashPrime: - warning("Key._rsaes_oaep_decrypt(): decryption error. " - "(invalid hash)") - return None - return M # 4) - - - def decrypt(self, C, t=None, h=None, mgf=None, L=None): - """ - Decrypt ciphertext 'C' using 't' decryption scheme where 't' can be: - - - None: the ciphertext 'C' is directly applied the RSADP decryption - primitive, as described in PKCS#1 v2.1, i.e. RFC 3447 - Sect 5.1.2. Simply, put the message undergo a modular - exponentiation using the private key. Additionnal method - parameters are just ignored. - - - 'pkcs': the ciphertext 'C' is applied RSAES-PKCS1-V1_5-DECRYPT - decryption scheme as described in section 7.2.2 of RFC 3447. - In that context, other parameters ('h', 'mgf', 'l') are not - used. - - - 'oaep': the ciphertext 'C' is applied the RSAES-OAEP-DECRYPT decryption - scheme, as described in PKCS#1 v2.1, i.e. RFC 3447 Sect - 7.1.2. In that context, - - o 'h' parameter provides the name of the hash method to use. - Possible values are "md2", "md4", "md5", "sha1", "tls", - "sha224", "sha256", "sha384" and "sha512". if none is provided, - sha1 is used by default. - - o 'mgf' is the mask generation function. By default, mgf - is derived from the provided hash function using the - generic MGF1 (see pkcs_mgf1() for details). - - o 'L' is the optional label to be associated with the - message. If not provided, the default value is used, i.e - the empty string. No check is done on the input limitation - of the hash function regarding the size of 'L' (for - instance, 2^61 - 1 for SHA-1). You have been warned. - """ - if t is None: - C = pkcs_os2ip(C) - c = self._rsadp(C) - l = int(math.ceil(math.log(c, 2) / 8.)) # Hack - return pkcs_i2osp(c, l) - - elif t == "pkcs": - return self._rsaes_pkcs1_v1_5_decrypt(C) - - elif t == "oaep": - return self._rsaes_oaep_decrypt(C, h, mgf, L) - - else: - warning("Key.decrypt(): Unknown decryption type (%s) provided" % t) - return None - - ### Below are signature related methods. Verification ones are inherited from - ### PubKey - - def _rsasp1(self, m): - """ - Internal method providing raw RSA signature, i.e. simple modular - exponentiation of the given message representative 'm', an integer - between 0 and n-1. - - This is the signature primitive RSASP1 described in PKCS#1 v2.1, - i.e. RFC 3447 Sect. 5.2.1. - - Input: - m: message representative, an integer between 0 and n-1, where - n is the key modulus. - - Output: - signature representative, an integer between 0 and n-1 - - Not intended to be used directly. Please, see sign() method. - """ - return self._rsadp(m) - - - def _rsassa_pss_sign(self, M, h=None, mgf=None, sLen=None): - """ - Implements RSASSA-PSS-SIGN() function described in Sect. 8.1.1 of - RFC 3447. - - Input: - M: message to be signed, an octet string - - Output: - signature, an octet string of length k, where k is the length in - octets of the RSA modulus n. - - On error, None is returned. - """ - - # Set default parameters if not provided - if h is None: # By default, sha1 - h = "sha1" - if not _hashFuncParams.has_key(h): - warning("Key._rsassa_pss_sign(): unknown hash function " - "provided (%s)" % h) - return None - if mgf is None: # use mgf1 with underlying hash function - mgf = lambda x,y: pkcs_mgf1(x, y, h) - if sLen is None: # use Hash output length (A.2.3 of RFC 3447) - hLen = _hashFuncParams[h][0] - sLen = hLen - - # 1) EMSA-PSS encoding - modBits = self.modulusLen - k = modBits / 8 - EM = pkcs_emsa_pss_encode(M, modBits - 1, h, mgf, sLen) - if EM is None: - warning("Key._rsassa_pss_sign(): unable to encode") - return None - - # 2) RSA signature - m = pkcs_os2ip(EM) # 2.a) - s = self._rsasp1(m) # 2.b) - S = pkcs_i2osp(s, k) # 2.c) - - return S # 3) - - - def _rsassa_pkcs1_v1_5_sign(self, M, h): - """ - Implements RSASSA-PKCS1-v1_5-SIGN() function as described in - Sect. 8.2.1 of RFC 3447. - - Input: - M: message to be signed, an octet string - h: hash function name (in 'md2', 'md4', 'md5', 'sha1', 'tls' - 'sha256', 'sha384'). - - Output: - the signature, an octet string. - """ - - # 1) EMSA-PKCS1-v1_5 encoding - k = self.modulusLen / 8 - EM = pkcs_emsa_pkcs1_v1_5_encode(M, k, h) - if EM is None: - warning("Key._rsassa_pkcs1_v1_5_sign(): unable to encode") - return None - - # 2) RSA signature - m = pkcs_os2ip(EM) # 2.a) - s = self._rsasp1(m) # 2.b) - S = pkcs_i2osp(s, k) # 2.c) - - return S # 3) - - - def sign(self, M, t=None, h=None, mgf=None, sLen=None): - """ - Sign message 'M' using 't' signature scheme where 't' can be: - - - None: the message 'M' is directly applied the RSASP1 signature - primitive, as described in PKCS#1 v2.1, i.e. RFC 3447 Sect - 5.2.1. Simply put, the message undergo a modular exponentiation - using the private key. Additionnal method parameters are just - ignored. - - - 'pkcs': the message 'M' is applied RSASSA-PKCS1-v1_5-SIGN signature - scheme as described in Sect. 8.2.1 of RFC 3447. In that context, - the hash function name is passed using 'h'. Possible values are - "md2", "md4", "md5", "sha1", "tls", "sha224", "sha256", "sha384" - and "sha512". If none is provided, sha1 is used. Other additionnal - parameters are ignored. - - - 'pss' : the message 'M' is applied RSASSA-PSS-SIGN signature scheme as - described in Sect. 8.1.1. of RFC 3447. In that context, - - o 'h' parameter provides the name of the hash method to use. - Possible values are "md2", "md4", "md5", "sha1", "tls", "sha224", - "sha256", "sha384" and "sha512". if none is provided, sha1 - is used. - - o 'mgf' is the mask generation function. By default, mgf - is derived from the provided hash function using the - generic MGF1 (see pkcs_mgf1() for details). - - o 'sLen' is the length in octet of the salt. You can overload the - default value (the octet length of the hash value for provided - algorithm) by providing another one with that parameter. - """ - - if t is None: # RSASP1 - M = pkcs_os2ip(M) - n = self.modulus - if M > n-1: - warning("Message to be signed is too long for key modulus") - return None - s = self._rsasp1(M) - if s is None: - return None - return pkcs_i2osp(s, self.modulusLen/8) - - elif t == "pkcs": # RSASSA-PKCS1-v1_5-SIGN - if h is None: - h = "sha1" - return self._rsassa_pkcs1_v1_5_sign(M, h) - - elif t == "pss": # RSASSA-PSS-SIGN - return self._rsassa_pss_sign(M, h, mgf, sLen) - - else: - warning("Key.sign(): Unknown signature type (%s) provided" % t) - return None - - -def openssl_parse_RSA(fmt="PEM"): - return popen3(['openssl', 'rsa', '-text', '-pubin', '-inform', fmt, '-noout']) -def openssl_convert_RSA(infmt="PEM", outfmt="DER"): - return ['openssl', 'rsa', '-pubin', '-inform', infmt, '-outform', outfmt] - -class PubKey(OSSLHelper, _EncryptAndVerify): - # Below are the fields we recognize in the -text output of openssl - # and from which we extract information. We expect them in that - # order. Number of spaces does matter. - possible_fields = [ "Modulus (", - "Exponent:" ] - possible_fields_count = len(possible_fields) - - def __init__(self, keypath): - error_msg = "Unable to import key." - - # XXX Temporary hack to use PubKey inside Cert - if type(keypath) is tuple: - e, m, mLen = keypath - self.modulus = m - self.modulusLen = mLen - self.pubExp = e - return - - fields_dict = {} - for k in self.possible_fields: - fields_dict[k] = None - - self.keypath = None - rawkey = None - - if (not '\x00' in keypath) and os.path.isfile(keypath): # file - self.keypath = keypath - key_size = os.path.getsize(keypath) - if key_size > MAX_KEY_SIZE: - raise Exception(error_msg) - try: - f = open(keypath) - rawkey = f.read() - f.close() - except: - raise Exception(error_msg) - else: - rawkey = keypath - - if rawkey is None: - raise Exception(error_msg) - - self.rawkey = rawkey - - key_header = "-----BEGIN PUBLIC KEY-----" - key_footer = "-----END PUBLIC KEY-----" - l = rawkey.split(key_header, 1) - if len(l) == 2: # looks like PEM - tmp = l[1] - l = tmp.split(key_footer, 1) - if len(l) == 2: - tmp = l[0] - rawkey = "%s%s%s\n" % (key_header, tmp, key_footer) - else: - raise Exception(error_msg) - r,w,e = openssl_parse_RSA("PEM") - w.write(rawkey) - w.close() - textkey = r.read() - r.close() - res = e.read() - e.close() - if res == '': - self.format = "PEM" - self.pemkey = rawkey - self.textkey = textkey - cmd = openssl_convert_RSA_cmd("PEM", "DER") - self.derkey = self._apply_ossl_cmd(cmd, rawkey) - else: - raise Exception(error_msg) - else: # not PEM, try DER - r,w,e = openssl_parse_RSA("DER") - w.write(rawkey) - w.close() - textkey = r.read() - r.close() - res = e.read() - if res == '': - self.format = "DER" - self.derkey = rawkey - self.textkey = textkey - cmd = openssl_convert_RSA_cmd("DER", "PEM") - self.pemkey = self._apply_ossl_cmd(cmd, rawkey) - cmd = openssl_convert_RSA_cmd("DER", "DER") - self.derkey = self._apply_ossl_cmd(cmd, rawkey) - else: - try: # Perhaps it is a cert - c = Cert(keypath) - except: - raise Exception(error_msg) - # TODO: - # Reconstruct a key (der and pem) and provide: - # self.format - # self.derkey - # self.pemkey - # self.textkey - # self.keypath - - self.osslcmdbase = ['openssl', 'rsa', '-pubin', '-inform', self.format] - - self.keypath = keypath - - # Parse the -text output of openssl to make things available - l = self.textkey.split('\n', 1) - if len(l) != 2: - raise Exception(error_msg) - cur, tmp = l - i = 0 - k = self.possible_fields[i] # Modulus ( - cur = cur[len(k):] + '\n' - while k: - l = tmp.split('\n', 1) - if len(l) != 2: # Over - fields_dict[k] = cur - break - l, tmp = l - - newkey = 0 - # skip fields we have already seen, this is the purpose of 'i' - for j in range(i, self.possible_fields_count): - f = self.possible_fields[j] - if l.startswith(f): - fields_dict[k] = cur - cur = l[len(f):] + '\n' - k = f - newkey = 1 - i = j+1 - break - if newkey == 1: - continue - cur += l + '\n' - - # modulus and modulus length - v = fields_dict["Modulus ("] - self.modulusLen = None - if v: - v, rem = v.split(' bit):', 1) - self.modulusLen = int(v) - rem = rem.replace('\n','').replace(' ','').replace(':','') - self.modulus = long(rem, 16) - if self.modulus is None: - raise Exception(error_msg) - - # public exponent - v = fields_dict["Exponent:"] - self.pubExp = None - if v: - self.pubExp = long(v.split('(', 1)[0]) - if self.pubExp is None: - raise Exception(error_msg) - - self.key = RSA.construct((self.modulus, self.pubExp, )) - - def __str__(self): - return self.derkey - - -class Key(OSSLHelper, _DecryptAndSignMethods, _EncryptAndVerify): - # Below are the fields we recognize in the -text output of openssl - # and from which we extract information. We expect them in that - # order. Number of spaces does matter. - possible_fields = [ "Private-Key: (", - "modulus:", - "publicExponent:", - "privateExponent:", - "prime1:", - "prime2:", - "exponent1:", - "exponent2:", - "coefficient:" ] - possible_fields_count = len(possible_fields) - - def __init__(self, keypath): - error_msg = "Unable to import key." - - fields_dict = {} - for k in self.possible_fields: - fields_dict[k] = None - - self.keypath = None - rawkey = None - - if (not '\x00' in keypath) and os.path.isfile(keypath): - self.keypath = keypath - key_size = os.path.getsize(keypath) - if key_size > MAX_KEY_SIZE: - raise Exception(error_msg) - try: - f = open(keypath) - rawkey = f.read() - f.close() - except: - raise Exception(error_msg) - else: - rawkey = keypath - - if rawkey is None: - raise Exception(error_msg) - - self.rawkey = rawkey - - # Let's try to get file format : PEM or DER. - fmtstr = 'openssl rsa -text -inform %s -noout' - convertstr = 'openssl rsa -inform %s -outform %s' - key_header = "-----BEGIN RSA PRIVATE KEY-----" - key_footer = "-----END RSA PRIVATE KEY-----" - l = rawkey.split(key_header, 1) - if len(l) == 2: # looks like PEM - tmp = l[1] - l = tmp.split(key_footer, 1) - if len(l) == 2: - tmp = l[0] - rawkey = "%s%s%s\n" % (key_header, tmp, key_footer) - else: - raise Exception(error_msg) - r,w,e = popen3((fmtstr % "PEM").split(" ")) - w.write(rawkey) - w.close() - textkey = r.read() - r.close() - res = e.read() - e.close() - if res == '': - self.format = "PEM" - self.pemkey = rawkey - self.textkey = textkey - cmd = (convertstr % ("PEM", "DER")).split(" ") - self.derkey = self._apply_ossl_cmd(cmd, rawkey) - else: - raise Exception(error_msg) - else: # not PEM, try DER - r,w,e = popen3((fmtstr % "DER").split(" ")) - w.write(rawkey) - w.close() - textkey = r.read() - r.close() - res = e.read() - if res == '': - self.format = "DER" - self.derkey = rawkey - self.textkey = textkey - cmd = (convertstr % ("DER", "PEM")).split(" ") - self.pemkey = self._apply_ossl_cmd(cmd, rawkey) - cmd = (convertstr % ("DER", "DER")).split(" ") - self.derkey = self._apply_ossl_cmd(cmd, rawkey) - else: - raise Exception(error_msg) - - self.osslcmdbase = ['openssl', 'rsa', '-inform', self.format] - - r,w,e = popen3(["openssl", "asn1parse", "-inform", "DER"]) - w.write(self.derkey) - w.close() - self.asn1parsekey = r.read() - r.close() - res = e.read() - e.close() - if res != '': - raise Exception(error_msg) - - self.keypath = keypath - - # Parse the -text output of openssl to make things available - l = self.textkey.split('\n', 1) - if len(l) != 2: - raise Exception(error_msg) - cur, tmp = l - i = 0 - k = self.possible_fields[i] # Private-Key: ( - cur = cur[len(k):] + '\n' - while k: - l = tmp.split('\n', 1) - if len(l) != 2: # Over - fields_dict[k] = cur - break - l, tmp = l - - newkey = 0 - # skip fields we have already seen, this is the purpose of 'i' - for j in range(i, self.possible_fields_count): - f = self.possible_fields[j] - if l.startswith(f): - fields_dict[k] = cur - cur = l[len(f):] + '\n' - k = f - newkey = 1 - i = j+1 - break - if newkey == 1: - continue - cur += l + '\n' - - # modulus length - v = fields_dict["Private-Key: ("] - self.modulusLen = None - if v: - self.modulusLen = int(v.split(' bit', 1)[0]) - if self.modulusLen is None: - raise Exception(error_msg) - - # public exponent - v = fields_dict["publicExponent:"] - self.pubExp = None - if v: - self.pubExp = long(v.split('(', 1)[0]) - if self.pubExp is None: - raise Exception(error_msg) - - tmp = {} - for k in ["modulus:", "privateExponent:", "prime1:", "prime2:", - "exponent1:", "exponent2:", "coefficient:"]: - v = fields_dict[k] - if v: - s = v.replace('\n', '').replace(' ', '').replace(':', '') - tmp[k] = long(s, 16) - else: - raise Exception(error_msg) - - self.modulus = tmp["modulus:"] - self.privExp = tmp["privateExponent:"] - self.prime1 = tmp["prime1:"] - self.prime2 = tmp["prime2:"] - self.exponent1 = tmp["exponent1:"] - self.exponent2 = tmp["exponent2:"] - self.coefficient = tmp["coefficient:"] - - self.key = RSA.construct((self.modulus, self.pubExp, self.privExp)) - - def __str__(self): - return self.derkey - - -# We inherit from PubKey to get access to all encryption and verification -# methods. To have that working, we simply need Cert to provide -# modulusLen and key attribute. -# XXX Yes, it is a hack. -class Cert(OSSLHelper, _EncryptAndVerify): - # Below are the fields we recognize in the -text output of openssl - # and from which we extract information. We expect them in that - # order. Number of spaces does matter. - possible_fields = [ " Version:", - " Serial Number:", - " Signature Algorithm:", - " Issuer:", - " Not Before:", - " Not After :", - " Subject:", - " Public Key Algorithm:", - " Modulus (", - " Exponent:", - " X509v3 Subject Key Identifier:", - " X509v3 Authority Key Identifier:", - " keyid:", - " DirName:", - " serial:", - " X509v3 Basic Constraints:", - " X509v3 Key Usage:", - " X509v3 Extended Key Usage:", - " X509v3 CRL Distribution Points:", - " Authority Information Access:", - " Signature Algorithm:" ] - possible_fields_count = len(possible_fields) - - def __init__(self, certpath): - error_msg = "Unable to import certificate." - - fields_dict = {} - for k in self.possible_fields: - fields_dict[k] = None - - self.certpath = None - rawcert = None - - if (not '\x00' in certpath) and os.path.isfile(certpath): # file - self.certpath = certpath - cert_size = os.path.getsize(certpath) - if cert_size > MAX_CERT_SIZE: - raise Exception(error_msg) - try: - f = open(certpath) - rawcert = f.read() - f.close() - except: - raise Exception(error_msg) - else: - rawcert = certpath - - if rawcert is None: - raise Exception(error_msg) - - self.rawcert = rawcert - - # Let's try to get file format : PEM or DER. - fmtstr = 'openssl x509 -text -inform %s -noout' - convertstr = 'openssl x509 -inform %s -outform %s' - cert_header = "-----BEGIN CERTIFICATE-----" - cert_footer = "-----END CERTIFICATE-----" - l = rawcert.split(cert_header, 1) - if len(l) == 2: # looks like PEM - tmp = l[1] - l = tmp.split(cert_footer, 1) - if len(l) == 2: - tmp = l[0] - rawcert = "%s%s%s\n" % (cert_header, tmp, cert_footer) - else: - raise Exception(error_msg) - r,w,e = popen3((fmtstr % "PEM").split(" ")) - w.write(rawcert) - w.close() - textcert = r.read() - r.close() - res = e.read() - e.close() - if res == '': - self.format = "PEM" - self.pemcert = rawcert - self.textcert = textcert - cmd = (convertstr % ("PEM", "DER")).split(" ") - self.dercert = self._apply_ossl_cmd(cmd, rawcert) - else: - raise Exception(error_msg) - else: # not PEM, try DER - r,w,e = popen3((fmtstr % "DER").split(" ")) - w.write(rawcert) - w.close() - textcert = r.read() - r.close() - res = e.read() - if res == '': - self.format = "DER" - self.dercert = rawcert - self.textcert = textcert - cmd = (convertstr % ("DER", "PEM")).split(" ") - self.pemcert = self._apply_ossl_cmd(cmd, rawcert) - cmd = (convertstr % ("DER", "DER")).split(" ") - self.dercert = self._apply_ossl_cmd(cmd, rawcert) - else: - raise Exception(error_msg) - - self.osslcmdbase = ['openssl', 'x509', '-inform', self.format] - - r,w,e = popen3('openssl asn1parse -inform DER'.split(' ')) - w.write(self.dercert) - w.close() - self.asn1parsecert = r.read() - r.close() - res = e.read() - e.close() - if res != '': - raise Exception(error_msg) - - # Grab _raw_ X509v3 Authority Key Identifier, if any. - tmp = self.asn1parsecert.split(":X509v3 Authority Key Identifier", 1) - self.authorityKeyID = None - if len(tmp) == 2: - tmp = tmp[1] - tmp = tmp.split("[HEX DUMP]:", 1)[1] - self.authorityKeyID=tmp.split('\n',1)[0] - - # Grab _raw_ X509v3 Subject Key Identifier, if any. - tmp = self.asn1parsecert.split(":X509v3 Subject Key Identifier", 1) - self.subjectKeyID = None - if len(tmp) == 2: - tmp = tmp[1] - tmp = tmp.split("[HEX DUMP]:", 1)[1] - self.subjectKeyID=tmp.split('\n',1)[0] - - # Get tbsCertificate using the worst hack. output of asn1parse - # looks like that: - # - # 0:d=0 hl=4 l=1298 cons: SEQUENCE - # 4:d=1 hl=4 l=1018 cons: SEQUENCE - # ... - # - l1,l2 = self.asn1parsecert.split('\n', 2)[:2] - hl1 = int(l1.split("hl=",1)[1].split("l=",1)[0]) - rem = l2.split("hl=",1)[1] - hl2, rem = rem.split("l=",1) - hl2 = int(hl2) - l = int(rem.split("cons",1)[0]) - self.tbsCertificate = self.dercert[hl1:hl1+hl2+l] - - # Parse the -text output of openssl to make things available - tmp = self.textcert.split('\n', 2)[2] - l = tmp.split('\n', 1) - if len(l) != 2: - raise Exception(error_msg) - cur, tmp = l - i = 0 - k = self.possible_fields[i] # Version: - cur = cur[len(k):] + '\n' - while k: - l = tmp.split('\n', 1) - if len(l) != 2: # Over - fields_dict[k] = cur - break - l, tmp = l - - newkey = 0 - # skip fields we have already seen, this is the purpose of 'i' - for j in range(i, self.possible_fields_count): - f = self.possible_fields[j] - if l.startswith(f): - fields_dict[k] = cur - cur = l[len(f):] + '\n' - k = f - newkey = 1 - i = j+1 - break - if newkey == 1: - continue - cur += l + '\n' - - # version - v = fields_dict[" Version:"] - self.version = None - if v: - self.version = int(v[1:2]) - if self.version is None: - raise Exception(error_msg) - - # serial number - v = fields_dict[" Serial Number:"] - self.serial = None - if v: - v = v.replace('\n', '').strip() - if "0x" in v: - v = v.split("0x", 1)[1].split(')', 1)[0] - v = v.replace(':', '').upper() - if len(v) % 2: - v = '0' + v - self.serial = v - if self.serial is None: - raise Exception(error_msg) - - # Signature Algorithm - v = fields_dict[" Signature Algorithm:"] - self.sigAlg = None - if v: - v = v.split('\n',1)[0] - v = v.strip() - self.sigAlg = v - if self.sigAlg is None: - raise Exception(error_msg) - - # issuer - v = fields_dict[" Issuer:"] - self.issuer = None - if v: - v = v.split('\n',1)[0] - v = v.strip() - self.issuer = v - if self.issuer is None: - raise Exception(error_msg) - - # not before - v = fields_dict[" Not Before:"] - self.notBefore_str = None - if v: - v = v.split('\n',1)[0] - v = v.strip() - self.notBefore_str = v - if self.notBefore_str is None: - raise Exception(error_msg) - try: - self.notBefore = time.strptime(self.notBefore_str, - "%b %d %H:%M:%S %Y %Z") - except: - self.notBefore = time.strptime(self.notBefore_str, - "%b %d %H:%M:%S %Y") - self.notBefore_str_simple = time.strftime("%x", self.notBefore) - - # not after - v = fields_dict[" Not After :"] - self.notAfter_str = None - if v: - v = v.split('\n',1)[0] - v = v.strip() - self.notAfter_str = v - if self.notAfter_str is None: - raise Exception(error_msg) - try: - self.notAfter = time.strptime(self.notAfter_str, - "%b %d %H:%M:%S %Y %Z") - except: - self.notAfter = time.strptime(self.notAfter_str, - "%b %d %H:%M:%S %Y") - self.notAfter_str_simple = time.strftime("%x", self.notAfter) - - # subject - v = fields_dict[" Subject:"] - self.subject = None - if v: - v = v.split('\n',1)[0] - v = v.strip() - self.subject = v - if self.subject is None: - raise Exception(error_msg) - - # Public Key Algorithm - v = fields_dict[" Public Key Algorithm:"] - self.pubKeyAlg = None - if v: - v = v.split('\n',1)[0] - v = v.strip() - self.pubKeyAlg = v - if self.pubKeyAlg is None: - raise Exception(error_msg) - - # Modulus - v = fields_dict[" Modulus ("] - self.modulus = None - if v: - v,t = v.split(' bit):',1) - self.modulusLen = int(v) - t = t.replace(' ', '').replace('\n', ''). replace(':', '') - self.modulus_hexdump = t - self.modulus = long(t, 16) - if self.modulus is None: - raise Exception(error_msg) - - # Exponent - v = fields_dict[" Exponent:"] - self.exponent = None - if v: - v = v.split('(',1)[0] - self.exponent = long(v) - if self.exponent is None: - raise Exception(error_msg) - - # Public Key instance - self.key = RSA.construct((self.modulus, self.exponent, )) - - # Subject Key Identifier - - # Authority Key Identifier: keyid, dirname and serial - self.authorityKeyID_keyid = None - self.authorityKeyID_dirname = None - self.authorityKeyID_serial = None - if self.authorityKeyID: # (hex version already done using asn1parse) - v = fields_dict[" keyid:"] - if v: - v = v.split('\n',1)[0] - v = v.strip().replace(':', '') - self.authorityKeyID_keyid = v - v = fields_dict[" DirName:"] - if v: - v = v.split('\n',1)[0] - self.authorityKeyID_dirname = v - v = fields_dict[" serial:"] - if v: - v = v.split('\n',1)[0] - v = v.strip().replace(':', '') - self.authorityKeyID_serial = v - - # Basic constraints - self.basicConstraintsCritical = False - self.basicConstraints=None - v = fields_dict[" X509v3 Basic Constraints:"] - if v: - self.basicConstraints = {} - v,t = v.split('\n',2)[:2] - if "critical" in v: - self.basicConstraintsCritical = True - if "CA:" in t: - self.basicConstraints["CA"] = t.split('CA:')[1][:4] == "TRUE" - if "pathlen:" in t: - self.basicConstraints["pathlen"] = int(t.split('pathlen:')[1]) - - # X509v3 Key Usage - self.keyUsage = [] - v = fields_dict[" X509v3 Key Usage:"] - if v: - # man 5 x509v3_config - ku_mapping = {"Digital Signature": "digitalSignature", - "Non Repudiation": "nonRepudiation", - "Key Encipherment": "keyEncipherment", - "Data Encipherment": "dataEncipherment", - "Key Agreement": "keyAgreement", - "Certificate Sign": "keyCertSign", - "CRL Sign": "cRLSign", - "Encipher Only": "encipherOnly", - "Decipher Only": "decipherOnly"} - v = v.split('\n',2)[1] - l = map(lambda x: x.strip(), v.split(',')) - while l: - c = l.pop() - if ku_mapping.has_key(c): - self.keyUsage.append(ku_mapping[c]) - else: - self.keyUsage.append(c) # Add it anyway - print "Found unknown X509v3 Key Usage: '%s'" % c - print "Report it to arno (at) natisbad.org for addition" - - # X509v3 Extended Key Usage - self.extKeyUsage = [] - v = fields_dict[" X509v3 Extended Key Usage:"] - if v: - # man 5 x509v3_config: - eku_mapping = {"TLS Web Server Authentication": "serverAuth", - "TLS Web Client Authentication": "clientAuth", - "Code Signing": "codeSigning", - "E-mail Protection": "emailProtection", - "Time Stamping": "timeStamping", - "Microsoft Individual Code Signing": "msCodeInd", - "Microsoft Commercial Code Signing": "msCodeCom", - "Microsoft Trust List Signing": "msCTLSign", - "Microsoft Encrypted File System": "msEFS", - "Microsoft Server Gated Crypto": "msSGC", - "Netscape Server Gated Crypto": "nsSGC", - "IPSec End System": "iPsecEndSystem", - "IPSec Tunnel": "iPsecTunnel", - "IPSec User": "iPsecUser"} - v = v.split('\n',2)[1] - l = map(lambda x: x.strip(), v.split(',')) - while l: - c = l.pop() - if eku_mapping.has_key(c): - self.extKeyUsage.append(eku_mapping[c]) - else: - self.extKeyUsage.append(c) # Add it anyway - print "Found unknown X509v3 Extended Key Usage: '%s'" % c - print "Report it to arno (at) natisbad.org for addition" - - # CRL Distribution points - self.cRLDistributionPoints = [] - v = fields_dict[" X509v3 CRL Distribution Points:"] - if v: - v = v.split("\n\n", 1)[0] - v = v.split("URI:")[1:] - self.CRLDistributionPoints = map(lambda x: x.strip(), v) - - # Authority Information Access: list of tuples ("method", "location") - self.authorityInfoAccess = [] - v = fields_dict[" Authority Information Access:"] - if v: - v = v.split("\n\n", 1)[0] - v = v.split("\n")[1:] - for e in v: - method, location = map(lambda x: x.strip(), e.split(" - ", 1)) - self.authorityInfoAccess.append((method, location)) - - # signature field - v = fields_dict[" Signature Algorithm:" ] - self.sig = None - if v: - v = v.split('\n',1)[1] - v = v.replace(' ', '').replace('\n', '') - self.sig = "".join(map(lambda x: chr(int(x, 16)), v.split(':'))) - self.sigLen = len(self.sig) - if self.sig is None: - raise Exception(error_msg) - - def isIssuerCert(self, other): - """ - True if 'other' issued 'self', i.e.: - - self.issuer == other.subject - - self is signed by other - """ - # XXX should be done on raw values, instead of their textual repr - if self.issuer != other.subject: - return False - - # Sanity check regarding modulus length and the - # signature length - keyLen = (other.modulusLen + 7)/8 - if keyLen != self.sigLen: - return False - - unenc = other.encrypt(self.sig) # public key encryption, i.e. decrypt - - # XXX Check block type (00 or 01 and type of padding) - unenc = unenc[1:] - if not '\x00' in unenc: - return False - pos = unenc.index('\x00') - unenc = unenc[pos+1:] - - found = None - for k in _hashFuncParams.keys(): - if self.sigAlg.startswith(k): - found = k - break - if not found: - return False - hlen, hfunc, digestInfo = _hashFuncParams[k] - - if len(unenc) != (hlen+len(digestInfo)): - return False - - if not unenc.startswith(digestInfo): - return False - - h = unenc[-hlen:] - myh = hfunc(self.tbsCertificate) - - return h == myh - - def chain(self, certlist): - """ - Construct the chain of certificates leading from 'self' to the - self signed root using the certificates in 'certlist'. If the - list does not provide all the required certs to go to the root - the function returns a incomplete chain starting with the - certificate. This fact can be tested by tchecking if the last - certificate of the returned chain is self signed (if c is the - result, c[-1].isSelfSigned()) - """ - d = {} - for c in certlist: - # XXX we should check if we have duplicate - d[c.subject] = c - res = [self] - cur = self - while not cur.isSelfSigned(): - if d.has_key(cur.issuer): - possible_issuer = d[cur.issuer] - if cur.isIssuerCert(possible_issuer): - res.append(possible_issuer) - cur = possible_issuer - else: - break - return res - - def remainingDays(self, now=None): - """ - Based on the value of notBefore field, returns the number of - days the certificate will still be valid. The date used for the - comparison is the current and local date, as returned by - time.localtime(), except if 'now' argument is provided another - one. 'now' argument can be given as either a time tuple or a string - representing the date. Accepted format for the string version - are: - - - '%b %d %H:%M:%S %Y %Z' e.g. 'Jan 30 07:38:59 2008 GMT' - - '%m/%d/%y' e.g. '01/30/08' (less precise) - - If the certificate is no more valid at the date considered, then, - a negative value is returned representing the number of days - since it has expired. - - The number of days is returned as a float to deal with the unlikely - case of certificates that are still just valid. - """ - if now is None: - now = time.localtime() - elif type(now) is str: - try: - if '/' in now: - now = time.strptime(now, '%m/%d/%y') - else: - now = time.strptime(now, '%b %d %H:%M:%S %Y %Z') - except: - warning("Bad time string provided '%s'. Using current time" % now) - now = time.localtime() - - now = time.mktime(now) - nft = time.mktime(self.notAfter) - diff = (nft - now)/(24.*3600) - return diff - - - # return SHA-1 hash of cert embedded public key - # !! At the moment, the trailing 0 is in the hashed string if any - def keyHash(self): - m = self.modulus_hexdump - res = [] - i = 0 - l = len(m) - while i<l: # get a string version of modulus - res.append(struct.pack("B", int(m[i:i+2], 16))) - i += 2 - return sha.new("".join(res)).digest() - - def output(self, fmt="DER"): - if fmt == "DER": - return self.dercert - elif fmt == "PEM": - return self.pemcert - elif fmt == "TXT": - return self.textcert - - def export(self, filename, fmt="DER"): - """ - Export certificate in 'fmt' format (PEM, DER or TXT) to file 'filename' - """ - f = open(filename, "wb") - f.write(self.output(fmt)) - f.close() - - def isSelfSigned(self): - """ - Return True if the certificate is self signed: - - issuer and subject are the same - - the signature of the certificate is valid. - """ - if self.issuer == self.subject: - return self.isIssuerCert(self) - return False - - # Print main informations stored in certificate - def show(self): - print "Serial: %s" % self.serial - print "Issuer: " + self.issuer - print "Subject: " + self.subject - print "Validity: %s to %s" % (self.notBefore_str_simple, - self.notAfter_str_simple) - - def __repr__(self): - return "[X.509 Cert. Subject:%s, Issuer:%s]" % (self.subject, self.issuer) - - def __str__(self): - return self.dercert - - def verifychain(self, anchors, untrusted=None): - """ - Perform verification of certificate chains for that certificate. The - behavior of verifychain method is mapped (and also based) on openssl - verify userland tool (man 1 verify). - A list of anchors is required. untrusted parameter can be provided - a list of untrusted certificates that can be used to reconstruct the - chain. - - If you have a lot of certificates to verify against the same - list of anchor, consider constructing this list as a cafile - and use .verifychain_from_cafile() instead. - """ - cafile = create_temporary_ca_file(anchors) - if not cafile: - return False - untrusted_file = None - if untrusted: - untrusted_file = create_temporary_ca_file(untrusted) # hack - if not untrusted_file: - os.unlink(cafile) - return False - res = self.verifychain_from_cafile(cafile, - untrusted_file=untrusted_file) - os.unlink(cafile) - if untrusted_file: - os.unlink(untrusted_file) - return res - - def verifychain_from_cafile(self, cafile, untrusted_file=None): - """ - Does the same job as .verifychain() but using the list of anchors - from the cafile. This is useful (because more efficient) if - you have a lot of certificates to verify do it that way: it - avoids the creation of a cafile from anchors at each call. - - As for .verifychain(), a list of untrusted certificates can be - passed (as a file, this time) - """ - cmd = ["openssl", "verify", "-CAfile", cafile] - if untrusted_file: - cmd += ["-untrusted", untrusted_file] - try: - pemcert = self.output(fmt="PEM") - cmdres = self._apply_ossl_cmd(cmd, pemcert) - except: - return False - return cmdres.endswith("\nOK\n") or cmdres.endswith(": OK\n") - - def verifychain_from_capath(self, capath, untrusted_file=None): - """ - Does the same job as .verifychain_from_cafile() but using the list - of anchors in capath directory. The directory should contain - certificates files in PEM format with associated links as - created using c_rehash utility (man c_rehash). - - As for .verifychain_from_cafile(), a list of untrusted certificates - can be passed as a file (concatenation of the certificates in - PEM format) - """ - cmd = ["openssl", "verify", "-CApath", capath] - if untrusted_file: - cmd += ["-untrusted", untrusted_file] - try: - pemcert = self.output(fmt="PEM") - cmdres = self._apply_ossl_cmd(cmd, pemcert) - except: - return False - return cmdres.endswith("\nOK\n") or cmdres.endswith(": OK\n") - - def is_revoked(self, crl_list): - """ - Given a list of trusted CRL (their signature has already been - verified with trusted anchors), this function returns True if - the certificate is marked as revoked by one of those CRL. - - Note that if the Certificate was on hold in a previous CRL and - is now valid again in a new CRL and bot are in the list, it - will be considered revoked: this is because _all_ CRLs are - checked (not only the freshest) and revocation status is not - handled. - - Also note that the check on the issuer is performed on the - Authority Key Identifier if available in _both_ the CRL and the - Cert. Otherwise, the issuers are simply compared. - """ - for c in crl_list: - if (self.authorityKeyID is not None and - c.authorityKeyID is not None and - self.authorityKeyID == c.authorityKeyID): - return self.serial in map(lambda x: x[0], c.revoked_cert_serials) - elif (self.issuer == c.issuer): - return self.serial in map(lambda x: x[0], c.revoked_cert_serials) - return False - -def print_chain(l): - llen = len(l) - 1 - if llen < 0: - return "" - c = l[llen] - llen -= 1 - s = "_ " - if not c.isSelfSigned(): - s = "_ ... [Missing Root]\n" - else: - s += "%s [Self Signed]\n" % c.subject - i = 1 - while (llen != -1): - c = l[llen] - s += "%s\_ %s" % (" "*i, c.subject) - if llen != 0: - s += "\n" - i += 2 - llen -= 1 - print s - -# import popen2 -# a=popen3("openssl crl -text -inform DER -noout ", capturestderr=True) -# a.tochild.write(open("samples/klasa1.crl").read()) -# a.tochild.close() -# a.poll() - -class CRL(OSSLHelper): - # Below are the fields we recognize in the -text output of openssl - # and from which we extract information. We expect them in that - # order. Number of spaces does matter. - possible_fields = [ " Version", - " Signature Algorithm:", - " Issuer:", - " Last Update:", - " Next Update:", - " CRL extensions:", - " X509v3 Issuer Alternative Name:", - " X509v3 Authority Key Identifier:", - " keyid:", - " DirName:", - " serial:", - " X509v3 CRL Number:", - "Revoked Certificates:", - "No Revoked Certificates.", - " Signature Algorithm:" ] - possible_fields_count = len(possible_fields) - - def __init__(self, crlpath): - error_msg = "Unable to import CRL." - - fields_dict = {} - for k in self.possible_fields: - fields_dict[k] = None - - self.crlpath = None - rawcrl = None - - if (not '\x00' in crlpath) and os.path.isfile(crlpath): - self.crlpath = crlpath - cert_size = os.path.getsize(crlpath) - if cert_size > MAX_CRL_SIZE: - raise Exception(error_msg) - try: - f = open(crlpath) - rawcrl = f.read() - f.close() - except: - raise Exception(error_msg) - else: - rawcrl = crlpath - - if rawcrl is None: - raise Exception(error_msg) - - self.rawcrl = rawcrl - - # Let's try to get file format : PEM or DER. - fmtstr = 'openssl crl -text -inform %s -noout' - convertstr = 'openssl crl -inform %s -outform %s' - crl_header = "-----BEGIN X509 CRL-----" - crl_footer = "-----END X509 CRL-----" - l = rawcrl.split(crl_header, 1) - if len(l) == 2: # looks like PEM - tmp = l[1] - l = tmp.split(crl_footer, 1) - if len(l) == 2: - tmp = l[0] - rawcrl = "%s%s%s\n" % (crl_header, tmp, crl_footer) - else: - raise Exception(error_msg) - r,w,e = popen3((fmtstr % "PEM").split(" ")) - w.write(rawcrl) - w.close() - textcrl = r.read() - r.close() - res = e.read() - e.close() - if res == '': - self.format = "PEM" - self.pemcrl = rawcrl - self.textcrl = textcrl - cmd = (convertstr % ("PEM", "DER")).split(" ") - self.dercrl = self._apply_ossl_cmd(cmd, rawcrl) - else: - raise Exception(error_msg) - else: # not PEM, try DER - r,w,e = popen3((fmtstr % "DER").split(' ')) - w.write(rawcrl) - w.close() - textcrl = r.read() - r.close() - res = e.read() - if res == '': - self.format = "DER" - self.dercrl = rawcrl - self.textcrl = textcrl - cmd = (convertstr % ("DER", "PEM")).split(" ") - self.pemcrl = self._apply_ossl_cmd(cmd, rawcrl) - cmd = (convertstr % ("DER", "DER")).split(" ") - self.dercrl = self._apply_ossl_cmd(cmd, rawcrl) - else: - raise Exception(error_msg) - - self.osslcmdbase = ['openssl', 'crl', '-inform', self.format] - - r,w,e = popen3(('openssl asn1parse -inform DER').split(" ")) - w.write(self.dercrl) - w.close() - self.asn1parsecrl = r.read() - r.close() - res = e.read() - e.close() - if res != '': - raise Exception(error_msg) - - # Grab _raw_ X509v3 Authority Key Identifier, if any. - tmp = self.asn1parsecrl.split(":X509v3 Authority Key Identifier", 1) - self.authorityKeyID = None - if len(tmp) == 2: - tmp = tmp[1] - tmp = tmp.split("[HEX DUMP]:", 1)[1] - self.authorityKeyID=tmp.split('\n',1)[0] - - # Parse the -text output of openssl to make things available - tmp = self.textcrl.split('\n', 1)[1] - l = tmp.split('\n', 1) - if len(l) != 2: - raise Exception(error_msg) - cur, tmp = l - i = 0 - k = self.possible_fields[i] # Version - cur = cur[len(k):] + '\n' - while k: - l = tmp.split('\n', 1) - if len(l) != 2: # Over - fields_dict[k] = cur - break - l, tmp = l - - newkey = 0 - # skip fields we have already seen, this is the purpose of 'i' - for j in range(i, self.possible_fields_count): - f = self.possible_fields[j] - if l.startswith(f): - fields_dict[k] = cur - cur = l[len(f):] + '\n' - k = f - newkey = 1 - i = j+1 - break - if newkey == 1: - continue - cur += l + '\n' - - # version - v = fields_dict[" Version"] - self.version = None - if v: - self.version = int(v[1:2]) - if self.version is None: - raise Exception(error_msg) - - # signature algorithm - v = fields_dict[" Signature Algorithm:"] - self.sigAlg = None - if v: - v = v.split('\n',1)[0] - v = v.strip() - self.sigAlg = v - if self.sigAlg is None: - raise Exception(error_msg) - - # issuer - v = fields_dict[" Issuer:"] - self.issuer = None - if v: - v = v.split('\n',1)[0] - v = v.strip() - self.issuer = v - if self.issuer is None: - raise Exception(error_msg) - - # last update - v = fields_dict[" Last Update:"] - self.lastUpdate_str = None - if v: - v = v.split('\n',1)[0] - v = v.strip() - self.lastUpdate_str = v - if self.lastUpdate_str is None: - raise Exception(error_msg) - self.lastUpdate = time.strptime(self.lastUpdate_str, - "%b %d %H:%M:%S %Y %Z") - self.lastUpdate_str_simple = time.strftime("%x", self.lastUpdate) - - # next update - v = fields_dict[" Next Update:"] - self.nextUpdate_str = None - if v: - v = v.split('\n',1)[0] - v = v.strip() - self.nextUpdate_str = v - if self.nextUpdate_str is None: - raise Exception(error_msg) - self.nextUpdate = time.strptime(self.nextUpdate_str, - "%b %d %H:%M:%S %Y %Z") - self.nextUpdate_str_simple = time.strftime("%x", self.nextUpdate) - - # XXX Do something for Issuer Alternative Name - - # Authority Key Identifier: keyid, dirname and serial - self.authorityKeyID_keyid = None - self.authorityKeyID_dirname = None - self.authorityKeyID_serial = None - if self.authorityKeyID: # (hex version already done using asn1parse) - v = fields_dict[" keyid:"] - if v: - v = v.split('\n',1)[0] - v = v.strip().replace(':', '') - self.authorityKeyID_keyid = v - v = fields_dict[" DirName:"] - if v: - v = v.split('\n',1)[0] - self.authorityKeyID_dirname = v - v = fields_dict[" serial:"] - if v: - v = v.split('\n',1)[0] - v = v.strip().replace(':', '') - self.authorityKeyID_serial = v - - # number - v = fields_dict[" X509v3 CRL Number:"] - self.number = None - if v: - v = v.split('\n',2)[1] - v = v.strip() - self.number = int(v) - - # Get the list of serial numbers of revoked certificates - self.revoked_cert_serials = [] - v = fields_dict["Revoked Certificates:"] - t = fields_dict["No Revoked Certificates."] - if (t is None and v is not None): - v = v.split("Serial Number: ")[1:] - for r in v: - s,d = r.split('\n', 1) - s = s.split('\n', 1)[0] - d = d.split("Revocation Date:", 1)[1] - d = time.strptime(d.strip(), "%b %d %H:%M:%S %Y %Z") - self.revoked_cert_serials.append((s,d)) - - # signature field - v = fields_dict[" Signature Algorithm:" ] - self.sig = None - if v: - v = v.split('\n',1)[1] - v = v.replace(' ', '').replace('\n', '') - self.sig = "".join(map(lambda x: chr(int(x, 16)), v.split(':'))) - self.sigLen = len(self.sig) - if self.sig is None: - raise Exception(error_msg) - - def __str__(self): - return self.dercrl - - # Print main informations stored in CRL - def show(self): - print "Version: %d" % self.version - print "sigAlg: " + self.sigAlg - print "Issuer: " + self.issuer - print "lastUpdate: %s" % self.lastUpdate_str_simple - print "nextUpdate: %s" % self.nextUpdate_str_simple - - def verify(self, anchors): - """ - Return True if the CRL is signed by one of the provided - anchors. False on error (invalid signature, missing anchorand, ...) - """ - cafile = create_temporary_ca_file(anchors) - if cafile is None: - return False - try: - cmd = self.osslcmdbase + ["-noout", "-CAfile", cafile] - cmdres = self._apply_ossl_cmd(cmd, self.rawcrl) - except: - os.unlink(cafile) - return False - os.unlink(cafile) - return "verify OK" in cmdres - - - diff --git a/scripts/external_libs/scapy-2.3.1/scapy/dadict.py b/scripts/external_libs/scapy-2.3.1/scapy/dadict.py deleted file mode 100644 index dcfd2a77..00000000 --- a/scripts/external_libs/scapy-2.3.1/scapy/dadict.py +++ /dev/null @@ -1,87 +0,0 @@ -## This file is part of Scapy -## See http://www.secdev.org/projects/scapy for more informations -## Copyright (C) Philippe Biondi <phil@secdev.org> -## This program is published under a GPLv2 license - -""" -Direct Access dictionary. -""" - -from error import Scapy_Exception - -############################### -## Direct Access dictionnary ## -############################### - -def fixname(x): - if x and x[0] in "0123456789": - x = "n_"+x - return x.translate("________________________________________________0123456789_______ABCDEFGHIJKLMNOPQRSTUVWXYZ______abcdefghijklmnopqrstuvwxyz_____________________________________________________________________________________________________________________________________") - - -class DADict_Exception(Scapy_Exception): - pass - -class DADict: - def __init__(self, _name="DADict", **kargs): - self._name=_name - self.__dict__.update(kargs) - def fixname(self,val): - return fixname(val) - def __contains__(self, val): - return val in self.__dict__ - def __getitem__(self, attr): - return getattr(self, attr) - def __setitem__(self, attr, val): - return setattr(self, self.fixname(attr), val) - def __iter__(self): - return iter(map(lambda (x,y):y,filter(lambda (x,y):x and x[0]!="_", self.__dict__.items()))) - def _show(self): - for k in self.__dict__.keys(): - if k and k[0] != "_": - print "%10s = %r" % (k,getattr(self,k)) - def __repr__(self): - return "<%s/ %s>" % (self._name," ".join(filter(lambda x:x and x[0]!="_",self.__dict__.keys()))) - - def _branch(self, br, uniq=0): - if uniq and br._name in self: - raise DADict_Exception("DADict: [%s] already branched in [%s]" % (br._name, self._name)) - self[br._name] = br - - def _my_find(self, *args, **kargs): - if args and self._name not in args: - return False - for k in kargs: - if k not in self or self[k] != kargs[k]: - return False - return True - - def _find(self, *args, **kargs): - return self._recurs_find((), *args, **kargs) - def _recurs_find(self, path, *args, **kargs): - if self in path: - return None - if self._my_find(*args, **kargs): - return self - for o in self: - if isinstance(o, DADict): - p = o._recurs_find(path+(self,), *args, **kargs) - if p is not None: - return p - return None - def _find_all(self, *args, **kargs): - return self._recurs_find_all((), *args, **kargs) - def _recurs_find_all(self, path, *args, **kargs): - r = [] - if self in path: - return r - if self._my_find(*args, **kargs): - r.append(self) - for o in self: - if isinstance(o, DADict): - p = o._recurs_find_all(path+(self,), *args, **kargs) - r += p - return r - def keys(self): - return filter(lambda x:x and x[0]!="_", self.__dict__.keys()) - diff --git a/scripts/external_libs/scapy-2.3.1/scapy/data.py b/scripts/external_libs/scapy-2.3.1/scapy/data.py deleted file mode 100644 index de01cfc9..00000000 --- a/scripts/external_libs/scapy-2.3.1/scapy/data.py +++ /dev/null @@ -1,215 +0,0 @@ -## This file is part of Scapy -## See http://www.secdev.org/projects/scapy for more informations -## Copyright (C) Philippe Biondi <phil@secdev.org> -## This program is published under a GPLv2 license - -""" -Global variables and functions for handling external data sets. -""" - -import os,sys,re -from dadict import DADict -from error import log_loading - -############ -## Consts ## -############ - -ETHER_ANY = "\x00"*6 -ETHER_BROADCAST = "\xff"*6 - -ETH_P_ALL = 3 -ETH_P_IP = 0x800 -ETH_P_ARP = 0x806 -ETH_P_IPV6 = 0x86dd - -# From net/if_arp.h -ARPHDR_ETHER = 1 -ARPHDR_METRICOM = 23 -ARPHDR_PPP = 512 -ARPHDR_LOOPBACK = 772 -ARPHDR_TUN = 65534 - - -# From net/ipv6.h on Linux (+ Additions) -IPV6_ADDR_UNICAST = 0x01 -IPV6_ADDR_MULTICAST = 0x02 -IPV6_ADDR_CAST_MASK = 0x0F -IPV6_ADDR_LOOPBACK = 0x10 -IPV6_ADDR_GLOBAL = 0x00 -IPV6_ADDR_LINKLOCAL = 0x20 -IPV6_ADDR_SITELOCAL = 0x40 # deprecated since Sept. 2004 by RFC 3879 -IPV6_ADDR_SCOPE_MASK = 0xF0 -#IPV6_ADDR_COMPATv4 = 0x80 # deprecated; i.e. ::/96 -#IPV6_ADDR_MAPPED = 0x1000 # i.e.; ::ffff:0.0.0.0/96 -IPV6_ADDR_6TO4 = 0x0100 # Added to have more specific info (should be 0x0101 ?) -IPV6_ADDR_UNSPECIFIED = 0x10000 - - - - -MTU = 0x7fff # a.k.a give me all you have - -WINDOWS=sys.platform.startswith("win") - - -# file parsing to get some values : - -def load_protocols(filename): - spaces = re.compile("[ \t]+|\n") - dct = DADict(_name=filename) - try: - for l in open(filename): - try: - shrp = l.find("#") - if shrp >= 0: - l = l[:shrp] - l = l.strip() - if not l: - continue - lt = tuple(re.split(spaces, l)) - if len(lt) < 2 or not lt[0]: - continue - dct[lt[0]] = int(lt[1]) - except Exception,e: - log_loading.info("Couldn't parse file [%s]: line [%r] (%s)" % (filename,l,e)) - except IOError: - log_loading.info("Can't open %s file" % filename) - return dct - -def load_ethertypes(filename): - spaces = re.compile("[ \t]+|\n") - dct = DADict(_name=filename) - try: - f=open(filename) - for l in f: - try: - shrp = l.find("#") - if shrp >= 0: - l = l[:shrp] - l = l.strip() - if not l: - continue - lt = tuple(re.split(spaces, l)) - if len(lt) < 2 or not lt[0]: - continue - dct[lt[0]] = int(lt[1], 16) - except Exception,e: - log_loading.info("Couldn't parse file [%s]: line [%r] (%s)" % (filename,l,e)) - f.close() - except IOError,msg: - pass - return dct - -def load_services(filename): - spaces = re.compile("[ \t]+|\n") - tdct=DADict(_name="%s-tcp"%filename) - udct=DADict(_name="%s-udp"%filename) - try: - f=open(filename) - for l in f: - try: - shrp = l.find("#") - if shrp >= 0: - l = l[:shrp] - l = l.strip() - if not l: - continue - lt = tuple(re.split(spaces, l)) - if len(lt) < 2 or not lt[0]: - continue - if lt[1].endswith("/tcp"): - tdct[lt[0]] = int(lt[1].split('/')[0]) - elif lt[1].endswith("/udp"): - udct[lt[0]] = int(lt[1].split('/')[0]) - except Exception,e: - log_loading.warning("Couldn't file [%s]: line [%r] (%s)" % (filename,l,e)) - f.close() - except IOError: - log_loading.info("Can't open /etc/services file") - return tdct,udct - - -class ManufDA(DADict): - def fixname(self, val): - return val - def _get_manuf_couple(self, mac): - oui = ":".join(mac.split(":")[:3]).upper() - return self.__dict__.get(oui,(mac,mac)) - def _get_manuf(self, mac): - return self._get_manuf_couple(mac)[1] - def _get_short_manuf(self, mac): - return self._get_manuf_couple(mac)[0] - def _resolve_MAC(self, mac): - oui = ":".join(mac.split(":")[:3]).upper() - if oui in self: - return ":".join([self[oui][0]]+ mac.split(":")[3:]) - return mac - - - - -def load_manuf(filename): - try: - manufdb=ManufDA(_name=filename) - for l in open(filename): - try: - l = l.strip() - if not l or l.startswith("#"): - continue - oui,shrt=l.split()[:2] - i = l.find("#") - if i < 0: - lng=shrt - else: - lng = l[i+2:] - manufdb[oui] = shrt,lng - except Exception,e: - log_loading.warning("Couldn't parse one line from [%s] [%r] (%s)" % (filename, l, e)) - except IOError: - #log_loading.warning("Couldn't open [%s] file" % filename) - pass - return manufdb - - - -if WINDOWS: - ETHER_TYPES=load_ethertypes("ethertypes") - IP_PROTOS=load_protocols(os.environ["SystemRoot"]+"\system32\drivers\etc\protocol") - TCP_SERVICES,UDP_SERVICES=load_services(os.environ["SystemRoot"] + "\system32\drivers\etc\services") - MANUFDB = load_manuf(os.environ["ProgramFiles"] + "\\wireshark\\manuf") -else: - IP_PROTOS=load_protocols("/etc/protocols") - ETHER_TYPES=load_ethertypes("/etc/ethertypes") - TCP_SERVICES,UDP_SERVICES=load_services("/etc/services") - MANUFDB = load_manuf("/usr/share/wireshark/wireshark/manuf") - - - -##################### -## knowledge bases ## -##################### - -class KnowledgeBase: - def __init__(self, filename): - self.filename = filename - self.base = None - - def lazy_init(self): - self.base = "" - - def reload(self, filename = None): - if filename is not None: - self.filename = filename - oldbase = self.base - self.base = None - self.lazy_init() - if self.base is None: - self.base = oldbase - - def get_base(self): - if self.base is None: - self.lazy_init() - return self.base - - diff --git a/scripts/external_libs/scapy-2.3.1/scapy/error.py b/scripts/external_libs/scapy-2.3.1/scapy/error.py deleted file mode 100644 index 29ebc1ba..00000000 --- a/scripts/external_libs/scapy-2.3.1/scapy/error.py +++ /dev/null @@ -1,60 +0,0 @@ -## This file is part of Scapy -## See http://www.secdev.org/projects/scapy for more informations -## Copyright (C) Philippe Biondi <phil@secdev.org> -## This program is published under a GPLv2 license - -""" -Logging subsystem and basic exception class. -""" - -############################# -##### Logging subsystem ##### -############################# - -class Scapy_Exception(Exception): - pass - -import logging,traceback,time - -class ScapyFreqFilter(logging.Filter): - def __init__(self): - logging.Filter.__init__(self) - self.warning_table = {} - def filter(self, record): - from config import conf - wt = conf.warning_threshold - if wt > 0: - stk = traceback.extract_stack() - caller=None - for f,l,n,c in stk: - if n == 'warning': - break - caller = l - tm,nb = self.warning_table.get(caller, (0,0)) - ltm = time.time() - if ltm-tm > wt: - tm = ltm - nb = 0 - else: - if nb < 2: - nb += 1 - if nb == 2: - record.msg = "more "+record.msg - else: - return 0 - self.warning_table[caller] = (tm,nb) - return 1 - -log_scapy = logging.getLogger("scapy") -console_handler = logging.StreamHandler() -console_handler.setFormatter(logging.Formatter("%(levelname)s: %(message)s")) -log_scapy.addHandler(console_handler) -log_runtime = logging.getLogger("scapy.runtime") # logs at runtime -log_runtime.addFilter(ScapyFreqFilter()) -log_interactive = logging.getLogger("scapy.interactive") # logs in interactive functions -log_loading = logging.getLogger("scapy.loading") # logs when loading scapy - - -def warning(x): - log_runtime.warning(x) - diff --git a/scripts/external_libs/scapy-2.3.1/scapy/fields.py b/scripts/external_libs/scapy-2.3.1/scapy/fields.py deleted file mode 100644 index 8bb8c970..00000000 --- a/scripts/external_libs/scapy-2.3.1/scapy/fields.py +++ /dev/null @@ -1,909 +0,0 @@ -## This file is part of Scapy -## See http://www.secdev.org/projects/scapy for more informations -## Copyright (C) Philippe Biondi <phil@secdev.org> -## This program is published under a GPLv2 license - -""" -Fields: basic data structures that make up parts of packets. -""" - -import struct,copy,socket -from config import conf -from volatile import * -from data import * -from utils import * -from base_classes import BasePacket,Gen,Net - - -############ -## Fields ## -############ - -class Field: - """For more informations on how this work, please refer to - http://www.secdev.org/projects/scapy/files/scapydoc.pdf - chapter ``Adding a New Field''""" - islist=0 - holds_packets=0 - def __init__(self, name, default, fmt="H"): - self.name = name - if fmt[0] in "@=<>!": - self.fmt = fmt - else: - self.fmt = "!"+fmt - self.default = self.any2i(None,default) - self.sz = struct.calcsize(self.fmt) - self.owners = [] - self.offset =0; - - def get_size_bytes (self): - if hasattr(self, 'size'): - return 0; # bitfield - else: - return self.sz - - def register_owner(self, cls): - self.owners.append(cls) - - def i2len(self, pkt, x): - """Convert internal value to a length usable by a FieldLenField""" - return self.sz - def i2count(self, pkt, x): - """Convert internal value to a number of elements usable by a FieldLenField. - Always 1 except for list fields""" - return 1 - def h2i(self, pkt, x): - """Convert human value to internal value""" - return x - def i2h(self, pkt, x): - """Convert internal value to human value""" - return x - def m2i(self, pkt, x): - """Convert machine value to internal value""" - return x - def i2m(self, pkt, x): - """Convert internal value to machine value""" - if x is None: - x = 0 - return x - def any2i(self, pkt, x): - """Try to understand the most input values possible and make an internal value from them""" - return self.h2i(pkt, x) - def i2repr(self, pkt, x): - """Convert internal value to a nice representation""" - return repr(self.i2h(pkt,x)) - def addfield(self, pkt, s, val): - """Add an internal value to a string""" - return s+struct.pack(self.fmt, self.i2m(pkt,val)) - def getfield(self, pkt, s): - """Extract an internal value from a string""" - return s[self.sz:], self.m2i(pkt, struct.unpack(self.fmt, s[:self.sz])[0]) - def do_copy(self, x): - if hasattr(x, "copy"): - return x.copy() - if type(x) is list: - x = x[:] - for i in xrange(len(x)): - if isinstance(x[i], BasePacket): - x[i] = x[i].copy() - return x - def __repr__(self): - return "<Field (%s).%s>" % (",".join(x.__name__ for x in self.owners),self.name) - def copy(self): - return copy.deepcopy(self) - def randval(self): - """Return a volatile object whose value is both random and suitable for this field""" - fmtt = self.fmt[-1] - if fmtt in "BHIQ": - return {"B":RandByte,"H":RandShort,"I":RandInt, "Q":RandLong}[fmtt]() - elif fmtt == "s": - if self.fmt[0] in "0123456789": - l = int(self.fmt[:-1]) - else: - l = int(self.fmt[1:-1]) - return RandBin(l) - else: - warning("no random class for [%s] (fmt=%s)." % (self.name, self.fmt)) - - - - -class Emph: - fld = "" - def __init__(self, fld): - self.fld = fld - def __getattr__(self, attr): - return getattr(self.fld,attr) - def __hash__(self): - return hash(self.fld) - def __eq__(self, other): - return self.fld == other - - -class ActionField: - _fld = None - def __init__(self, fld, action_method, **kargs): - self._fld = fld - self._action_method = action_method - self._privdata = kargs - def any2i(self, pkt, val): - getattr(pkt, self._action_method)(val, self._fld, **self._privdata) - return getattr(self._fld, "any2i")(pkt, val) - def __getattr__(self, attr): - return getattr(self._fld,attr) - - -class ConditionalField: - fld = None - def __init__(self, fld, cond): - self.fld = fld - self.cond = cond - def _evalcond(self,pkt): - return self.cond(pkt) - - def getfield(self, pkt, s): - if self._evalcond(pkt): - return self.fld.getfield(pkt,s) - else: - return s,None - - def addfield(self, pkt, s, val): - if self._evalcond(pkt): - return self.fld.addfield(pkt,s,val) - else: - return s - def __getattr__(self, attr): - return getattr(self.fld,attr) - - -class PadField: - """Add bytes after the proxified field so that it ends at the specified - alignment from its begining""" - _fld = None - def __init__(self, fld, align, padwith=None): - self._fld = fld - self._align = align - self._padwith = padwith or "" - - def padlen(self, flen): - return -flen%self._align - - def getfield(self, pkt, s): - remain,val = self._fld.getfield(pkt,s) - padlen = self.padlen(len(s)-len(remain)) - return remain[padlen:], val - - def addfield(self, pkt, s, val): - sval = self._fld.addfield(pkt, "", val) - return s+sval+struct.pack("%is" % (self.padlen(len(sval))), self._padwith) - - def __getattr__(self, attr): - return getattr(self._fld,attr) - - -class MACField(Field): - def __init__(self, name, default): - Field.__init__(self, name, default, "6s") - def i2m(self, pkt, x): - if x is None: - return "\0\0\0\0\0\0" - return mac2str(x) - def m2i(self, pkt, x): - return str2mac(x) - def any2i(self, pkt, x): - if type(x) is str and len(x) is 6: - x = self.m2i(pkt, x) - return x - def i2repr(self, pkt, x): - x = self.i2h(pkt, x) - if self in conf.resolve: - x = conf.manufdb._resolve_MAC(x) - return x - def randval(self): - return RandMAC() - - -class IPField(Field): - def __init__(self, name, default): - Field.__init__(self, name, default, "4s") - def h2i(self, pkt, x): - if type(x) is str: - try: - inet_aton(x) - except socket.error: - x = Net(x) - elif type(x) is list: - x = [self.h2i(pkt, n) for n in x] - return x - def resolve(self, x): - if self in conf.resolve: - try: - ret = socket.gethostbyaddr(x)[0] - except: - pass - else: - if ret: - return ret - return x - def i2m(self, pkt, x): - return inet_aton(x) - def m2i(self, pkt, x): - return inet_ntoa(x) - def any2i(self, pkt, x): - return self.h2i(pkt,x) - def i2repr(self, pkt, x): - return self.resolve(self.i2h(pkt, x)) - def randval(self): - return RandIP() - -class SourceIPField(IPField): - def __init__(self, name, dstname): - IPField.__init__(self, name, None) - self.dstname = dstname - def i2m(self, pkt, x): - if x is None: - iff,x,gw = pkt.route() - if x is None: - x = "0.0.0.0" - return IPField.i2m(self, pkt, x) - def i2h(self, pkt, x): - if x is None: - dst=getattr(pkt,self.dstname) - if isinstance(dst,Gen): - r = map(conf.route.route, dst) - r.sort() - if r[0] != r[-1]: - warning("More than one possible route for %s"%repr(dst)) - iff,x,gw = r[0] - else: - iff,x,gw = conf.route.route(dst) - return IPField.i2h(self, pkt, x) - - - - -class ByteField(Field): - def __init__(self, name, default): - Field.__init__(self, name, default, "B") - -class XByteField(ByteField): - def i2repr(self, pkt, x): - return lhex(self.i2h(pkt, x)) - -class OByteField(ByteField): - def i2repr(self, pkt, x): - return "%03o"%self.i2h(pkt, x) - -class X3BytesField(XByteField): - def __init__(self, name, default): - Field.__init__(self, name, default, "!I") - def addfield(self, pkt, s, val): - return s+struct.pack(self.fmt, self.i2m(pkt,val))[1:4] - def getfield(self, pkt, s): - return s[3:], self.m2i(pkt, struct.unpack(self.fmt, "\x00"+s[:3])[0]) - -class ThreeBytesField(X3BytesField, ByteField): - def i2repr(self, pkt, x): - return ByteField.i2repr(self, pkt, x) - - -class ShortField(Field): - def __init__(self, name, default): - Field.__init__(self, name, default, "H") - -class LEShortField(Field): - def __init__(self, name, default): - Field.__init__(self, name, default, "<H") - -class XShortField(ShortField): - def i2repr(self, pkt, x): - return lhex(self.i2h(pkt, x)) - - -class IntField(Field): - def __init__(self, name, default): - Field.__init__(self, name, default, "I") - -class SignedIntField(Field): - def __init__(self, name, default): - Field.__init__(self, name, default, "i") - def randval(self): - return RandSInt() - -class LEIntField(Field): - def __init__(self, name, default): - Field.__init__(self, name, default, "<I") - -class LESignedIntField(Field): - def __init__(self, name, default): - Field.__init__(self, name, default, "<i") - def randval(self): - return RandSInt() - -class XIntField(IntField): - def i2repr(self, pkt, x): - return lhex(self.i2h(pkt, x)) - - -class LongField(Field): - def __init__(self, name, default): - Field.__init__(self, name, default, "Q") - -class XLongField(LongField): - def i2repr(self, pkt, x): - return lhex(self.i2h(pkt, x)) - -class IEEEFloatField(Field): - def __init__(self, name, default): - Field.__init__(self, name, default, "f") - -class IEEEDoubleField(Field): - def __init__(self, name, default): - Field.__init__(self, name, default, "d") - - -class StrField(Field): - def __init__(self, name, default, fmt="H", remain=0): - Field.__init__(self,name,default,fmt) - self.remain = remain - def i2len(self, pkt, i): - return len(i) - def i2m(self, pkt, x): - if x is None: - x = "" - elif type(x) is not str: - x=str(x) - return x - def addfield(self, pkt, s, val): - return s+self.i2m(pkt, val) - def getfield(self, pkt, s): - if self.remain == 0: - return "",self.m2i(pkt, s) - else: - return s[-self.remain:],self.m2i(pkt, s[:-self.remain]) - def randval(self): - return RandBin(RandNum(0,1200)) - -class PacketField(StrField): - holds_packets=1 - def __init__(self, name, default, cls, remain=0): - StrField.__init__(self, name, default, remain=remain) - self.cls = cls - def i2m(self, pkt, i): - return str(i) - def m2i(self, pkt, m): - return self.cls(m) - def getfield(self, pkt, s): - i = self.m2i(pkt, s) - remain = "" - if conf.padding_layer in i: - r = i[conf.padding_layer] - del(r.underlayer.payload) - remain = r.load - return remain,i - -class PacketLenField(PacketField): - holds_packets=1 - def __init__(self, name, default, cls, length_from=None): - PacketField.__init__(self, name, default, cls) - self.length_from = length_from - def getfield(self, pkt, s): - l = self.length_from(pkt) - try: - i = self.m2i(pkt, s[:l]) - except Exception: - if conf.debug_dissector: - raise - i = conf.raw_layer(load=s[:l]) - return s[l:],i - - -class PacketListField(PacketField): - islist = 1 - holds_packets=1 - def __init__(self, name, default, cls, count_from=None, length_from=None): - if default is None: - default = [] # Create a new list for each instance - PacketField.__init__(self, name, default, cls) - self.count_from = count_from - self.length_from = length_from - - - def any2i(self, pkt, x): - if type(x) is not list: - return [x] - else: - return x - def i2count(self, pkt, val): - if type(val) is list: - return len(val) - return 1 - def i2len(self, pkt, val): - return sum( len(p) for p in val ) - def do_copy(self, x): - return map(lambda p:p.copy(), x) - def getfield(self, pkt, s): - c = l = None - if self.length_from is not None: - l = self.length_from(pkt) - elif self.count_from is not None: - c = self.count_from(pkt) - - lst = [] - ret = "" - remain = s - if l is not None: - remain,ret = s[:l],s[l:] - while remain: - if c is not None: - if c <= 0: - break - c -= 1 - try: - p = self.m2i(pkt,remain) - except Exception: - if conf.debug_dissector: - raise - p = conf.raw_layer(load=remain) - remain = "" - else: - if conf.padding_layer in p: - pad = p[conf.padding_layer] - remain = pad.load - del(pad.underlayer.payload) - else: - remain = "" - lst.append(p) - return remain+ret,lst - def addfield(self, pkt, s, val): - return s+"".join(map(str, val)) - - -class StrFixedLenField(StrField): - def __init__(self, name, default, length=None, length_from=None): - StrField.__init__(self, name, default) - self.length_from = length_from - if length is not None: - self.length_from = lambda pkt,length=length: length - def i2repr(self, pkt, v): - if type(v) is str: - v = v.rstrip("\0") - return repr(v) - def getfield(self, pkt, s): - l = self.length_from(pkt) - return s[l:], self.m2i(pkt,s[:l]) - def addfield(self, pkt, s, val): - l = self.length_from(pkt) - return s+struct.pack("%is"%l,self.i2m(pkt, val)) - def randval(self): - try: - l = self.length_from(None) - except: - l = RandNum(0,200) - return RandBin(l) - -class StrFixedLenEnumField(StrFixedLenField): - def __init__(self, name, default, length=None, enum=None, length_from=None): - StrFixedLenField.__init__(self, name, default, length=length, length_from=length_from) - self.enum = enum - def i2repr(self, pkt, v): - r = v.rstrip("\0") - rr = repr(r) - if v in self.enum: - rr = "%s (%s)" % (rr, self.enum[v]) - elif r in self.enum: - rr = "%s (%s)" % (rr, self.enum[r]) - return rr - -class NetBIOSNameField(StrFixedLenField): - def __init__(self, name, default, length=31): - StrFixedLenField.__init__(self, name, default, length) - def i2m(self, pkt, x): - l = self.length_from(pkt)/2 - if x is None: - x = "" - x += " "*(l) - x = x[:l] - x = "".join(map(lambda x: chr(0x41+(ord(x)>>4))+chr(0x41+(ord(x)&0xf)), x)) - x = " "+x - return x - def m2i(self, pkt, x): - x = x.strip("\x00").strip(" ") - return "".join(map(lambda x,y: chr((((ord(x)-1)&0xf)<<4)+((ord(y)-1)&0xf)), x[::2],x[1::2])) - -class StrLenField(StrField): - def __init__(self, name, default, fld=None, length_from=None): - StrField.__init__(self, name, default) - self.length_from = length_from - def getfield(self, pkt, s): - l = self.length_from(pkt) - return s[l:], self.m2i(pkt,s[:l]) - -class FieldListField(Field): - islist=1 - def __init__(self, name, default, field, length_from=None, count_from=None): - if default is None: - default = [] # Create a new list for each instance - Field.__init__(self, name, default) - self.count_from = count_from - self.length_from = length_from - self.field = field - - def i2count(self, pkt, val): - if type(val) is list: - return len(val) - return 1 - def i2len(self, pkt, val): - return sum( self.field.i2len(pkt,v) for v in val ) - - def i2m(self, pkt, val): - if val is None: - val = [] - return val - def any2i(self, pkt, x): - if type(x) is not list: - return [x] - else: - return x - def addfield(self, pkt, s, val): - val = self.i2m(pkt, val) - for v in val: - s = self.field.addfield(pkt, s, v) - return s - def getfield(self, pkt, s): - c = l = None - if self.length_from is not None: - l = self.length_from(pkt) - elif self.count_from is not None: - c = self.count_from(pkt) - - val = [] - ret="" - if l is not None: - s,ret = s[:l],s[l:] - - while s: - if c is not None: - if c <= 0: - break - c -= 1 - s,v = self.field.getfield(pkt, s) - val.append(v) - return s+ret, val - -class FieldLenField(Field): - def __init__(self, name, default, length_of=None, fmt = "H", count_of=None, adjust=lambda pkt,x:x, fld=None): - Field.__init__(self, name, default, fmt) - self.length_of=length_of - self.count_of=count_of - self.adjust=adjust - if fld is not None: - FIELD_LENGTH_MANAGEMENT_DEPRECATION(self.__class__.__name__) - self.length_of = fld - def i2m(self, pkt, x): - if x is None: - if self.length_of is not None: - fld,fval = pkt.getfield_and_val(self.length_of) - f = fld.i2len(pkt, fval) - else: - fld,fval = pkt.getfield_and_val(self.count_of) - f = fld.i2count(pkt, fval) - x = self.adjust(pkt,f) - return x - -class StrNullField(StrField): - def addfield(self, pkt, s, val): - return s+self.i2m(pkt, val)+"\x00" - def getfield(self, pkt, s): - l = s.find("\x00") - if l < 0: - #XXX \x00 not found - return "",s - return s[l+1:],self.m2i(pkt, s[:l]) - def randval(self): - return RandTermString(RandNum(0,1200),"\x00") - -class StrStopField(StrField): - def __init__(self, name, default, stop, additionnal=0): - Field.__init__(self, name, default) - self.stop=stop - self.additionnal=additionnal - def getfield(self, pkt, s): - l = s.find(self.stop) - if l < 0: - return "",s -# raise Scapy_Exception,"StrStopField: stop value [%s] not found" %stop - l += len(self.stop)+self.additionnal - return s[l:],s[:l] - def randval(self): - return RandTermString(RandNum(0,1200),self.stop) - -class LenField(Field): - def i2m(self, pkt, x): - if x is None: - x = len(pkt.payload) - return x - -class BCDFloatField(Field): - def i2m(self, pkt, x): - return int(256*x) - def m2i(self, pkt, x): - return x/256.0 - -class BitField(Field): - def __init__(self, name, default, size): - Field.__init__(self, name, default) - self.rev = size < 0 - self.size = abs(size) - def reverse(self, val): - if self.size == 16: - val = socket.ntohs(val) - elif self.size == 32: - val = socket.ntohl(val) - return val - - def addfield(self, pkt, s, val): - val = self.i2m(pkt, val) - if type(s) is tuple: - s,bitsdone,v = s - else: - bitsdone = 0 - v = 0 - if self.rev: - val = self.reverse(val) - v <<= self.size - v |= val & ((1L<<self.size) - 1) - bitsdone += self.size - while bitsdone >= 8: - bitsdone -= 8 - s = s+struct.pack("!B", v >> bitsdone) - v &= (1L<<bitsdone)-1 - if bitsdone: - return s,bitsdone,v - else: - return s - def getfield(self, pkt, s): - if type(s) is tuple: - s,bn = s - else: - bn = 0 - # we don't want to process all the string - nb_bytes = (self.size+bn-1)/8 + 1 - w = s[:nb_bytes] - - # split the substring byte by byte - bytes = struct.unpack('!%dB' % nb_bytes , w) - - b = 0L - for c in range(nb_bytes): - b |= long(bytes[c]) << (nb_bytes-c-1)*8 - - # get rid of high order bits - b &= (1L << (nb_bytes*8-bn)) - 1 - - # remove low order bits - b = b >> (nb_bytes*8 - self.size - bn) - - if self.rev: - b = self.reverse(b) - - bn += self.size - s = s[bn/8:] - bn = bn%8 - b = self.m2i(pkt, b) - if bn: - return (s,bn),b - else: - return s,b - def randval(self): - return RandNum(0,2**self.size-1) - - -class BitFieldLenField(BitField): - def __init__(self, name, default, size, length_of=None, count_of=None, adjust=lambda pkt,x:x): - BitField.__init__(self, name, default, size) - self.length_of=length_of - self.count_of=count_of - self.adjust=adjust - def i2m(self, pkt, x): - return FieldLenField.i2m.im_func(self, pkt, x) - - -class XBitField(BitField): - def i2repr(self, pkt, x): - return lhex(self.i2h(pkt,x)) - - -class EnumField(Field): - def __init__(self, name, default, enum, fmt = "H"): - i2s = self.i2s = {} - s2i = self.s2i = {} - if type(enum) is list: - keys = xrange(len(enum)) - else: - keys = enum.keys() - if filter(lambda x: type(x) is str, keys): - i2s,s2i = s2i,i2s - for k in keys: - i2s[k] = enum[k] - s2i[enum[k]] = k - Field.__init__(self, name, default, fmt) - def any2i_one(self, pkt, x): - if type(x) is str: - x = self.s2i[x] - return x - def i2repr_one(self, pkt, x): - if self not in conf.noenum and not isinstance(x,VolatileValue) and x in self.i2s: - return self.i2s[x] - return repr(x) - - def any2i(self, pkt, x): - if type(x) is list: - return map(lambda z,pkt=pkt:self.any2i_one(pkt,z), x) - else: - return self.any2i_one(pkt,x) - def i2repr(self, pkt, x): - if type(x) is list: - return map(lambda z,pkt=pkt:self.i2repr_one(pkt,z), x) - else: - return self.i2repr_one(pkt,x) - -class CharEnumField(EnumField): - def __init__(self, name, default, enum, fmt = "1s"): - EnumField.__init__(self, name, default, enum, fmt) - k = self.i2s.keys() - if k and len(k[0]) != 1: - self.i2s,self.s2i = self.s2i,self.i2s - def any2i_one(self, pkt, x): - if len(x) != 1: - x = self.s2i[x] - return x - -class BitEnumField(BitField,EnumField): - def __init__(self, name, default, size, enum): - EnumField.__init__(self, name, default, enum) - self.rev = size < 0 - self.size = abs(size) - def any2i(self, pkt, x): - return EnumField.any2i(self, pkt, x) - def i2repr(self, pkt, x): - return EnumField.i2repr(self, pkt, x) - -class ShortEnumField(EnumField): - def __init__(self, name, default, enum): - EnumField.__init__(self, name, default, enum, "H") - -class LEShortEnumField(EnumField): - def __init__(self, name, default, enum): - EnumField.__init__(self, name, default, enum, "<H") - -class ByteEnumField(EnumField): - def __init__(self, name, default, enum): - EnumField.__init__(self, name, default, enum, "B") - -class IntEnumField(EnumField): - def __init__(self, name, default, enum): - EnumField.__init__(self, name, default, enum, "I") - -class SignedIntEnumField(EnumField): - def __init__(self, name, default, enum): - EnumField.__init__(self, name, default, enum, "i") - def randval(self): - return RandSInt() - -class LEIntEnumField(EnumField): - def __init__(self, name, default, enum): - EnumField.__init__(self, name, default, enum, "<I") - -class XShortEnumField(ShortEnumField): - def i2repr_one(self, pkt, x): - if self not in conf.noenum and not isinstance(x,VolatileValue) and x in self.i2s: - return self.i2s[x] - return lhex(x) - -class MultiEnumField(EnumField): - def __init__(self, name, default, enum, depends_on, fmt = "H"): - - self.depends_on = depends_on - self.i2s_multi = enum - self.s2i_multi = {} - self.s2i_all = {} - for m in enum: - self.s2i_multi[m] = s2i = {} - for k,v in enum[m].iteritems(): - s2i[v] = k - self.s2i_all[v] = k - Field.__init__(self, name, default, fmt) - def any2i_one(self, pkt, x): - if type (x) is str: - v = self.depends_on(pkt) - if v in self.s2i_multi: - s2i = self.s2i_multi[v] - if x in s2i: - return s2i[x] - return self.s2i_all[x] - return x - def i2repr_one(self, pkt, x): - v = self.depends_on(pkt) - if v in self.i2s_multi: - return self.i2s_multi[v].get(x,x) - return x - -class BitMultiEnumField(BitField,MultiEnumField): - def __init__(self, name, default, size, enum, depends_on): - MultiEnumField.__init__(self, name, default, enum) - self.rev = size < 0 - self.size = abs(size) - def any2i(self, pkt, x): - return MultiEnumField.any2i(self, pkt, x) - def i2repr(self, pkt, x): - return MultiEnumField.i2repr(self, pkt, x) - - -# Little endian long field -class LELongField(Field): - def __init__(self, name, default): - Field.__init__(self, name, default, "<Q") - -# Little endian fixed length field -class LEFieldLenField(FieldLenField): - def __init__(self, name, default, length_of=None, fmt = "<H", count_of=None, adjust=lambda pkt,x:x, fld=None): - FieldLenField.__init__(self, name, default, length_of=length_of, fmt=fmt, fld=fld, adjust=adjust) - - -class FlagsField(BitField): - def __init__(self, name, default, size, names): - self.multi = type(names) is list - if self.multi: - self.names = map(lambda x:[x], names) - else: - self.names = names - BitField.__init__(self, name, default, size) - def any2i(self, pkt, x): - if type(x) is str: - if self.multi: - x = map(lambda y:[y], x.split("+")) - y = 0 - for i in x: - y |= 1 << self.names.index(i) - x = y - return x - def i2repr(self, pkt, x): - if type(x) is list or type(x) is tuple: - return repr(x) - if self.multi: - r = [] - else: - r = "" - i=0 - while x: - if x & 1: - r += self.names[i] - i += 1 - x >>= 1 - if self.multi: - r = "+".join(r) - return r - - - - -class FixedPointField(BitField): - def __init__(self, name, default, size, frac_bits=16): - self.frac_bits = frac_bits - BitField.__init__(self, name, default, size) - - def any2i(self, pkt, val): - if val is None: - return val - ival = int(val) - fract = int( (val-ival) * 2**self.frac_bits ) - return (ival << self.frac_bits) | fract - - def i2h(self, pkt, val): - int_part = val >> self.frac_bits - frac_part = val & (1L << self.frac_bits) - 1 - frac_part /= 2.0**self.frac_bits - return int_part+frac_part - def i2repr(self, pkt, val): - return self.i2h(pkt, val) diff --git a/scripts/external_libs/scapy-2.3.1/scapy/layers/__init__.py b/scripts/external_libs/scapy-2.3.1/scapy/layers/__init__.py deleted file mode 100644 index a3f2afb9..00000000 --- a/scripts/external_libs/scapy-2.3.1/scapy/layers/__init__.py +++ /dev/null @@ -1,8 +0,0 @@ -## This file is part of Scapy -## See http://www.secdev.org/projects/scapy for more informations -## Copyright (C) Philippe Biondi <phil@secdev.org> -## This program is published under a GPLv2 license - -""" -Layer package. -""" diff --git a/scripts/external_libs/scapy-2.3.1/scapy/layers/all.py b/scripts/external_libs/scapy-2.3.1/scapy/layers/all.py deleted file mode 100644 index e92c22c5..00000000 --- a/scripts/external_libs/scapy-2.3.1/scapy/layers/all.py +++ /dev/null @@ -1,34 +0,0 @@ -## This file is part of Scapy -## See http://www.secdev.org/projects/scapy for more informations -## Copyright (C) Philippe Biondi <phil@secdev.org> -## This program is published under a GPLv2 license - -""" -All layers. Configurable with conf.load_layers. -""" - -from scapy.config import conf -from scapy.error import log_loading -import logging -log = logging.getLogger("scapy.loading") - -def _import_star(m): - mod = __import__(m, globals(), locals()) - for k,v in mod.__dict__.iteritems(): - globals()[k] = v - -# TBD-hhaim limit the number of layers -#conf.load_layers -#'inet6' -for _l in ['l2','inet','inet6']: - log_loading.debug("Loading layer %s" % _l) - #print "load ",_l - _import_star(_l) - #try: - # _import_star(_l) - #except Exception,e: - #log.warning("can't import layer %s: %s" % (_l,e)) - - - - diff --git a/scripts/external_libs/scapy-2.3.1/scapy/layers/bluetooth.py b/scripts/external_libs/scapy-2.3.1/scapy/layers/bluetooth.py deleted file mode 100644 index 662bad3b..00000000 --- a/scripts/external_libs/scapy-2.3.1/scapy/layers/bluetooth.py +++ /dev/null @@ -1,210 +0,0 @@ -## This file is part of Scapy -## See http://www.secdev.org/projects/scapy for more informations -## Copyright (C) Philippe Biondi <phil@secdev.org> -## This program is published under a GPLv2 license - -""" -Bluetooth layers, sockets and send/receive functions. -""" - -import socket,struct - -from scapy.config import conf -from scapy.packet import * -from scapy.fields import * -from scapy.supersocket import SuperSocket -from scapy.data import MTU - - -class HCI_Hdr(Packet): - name = "HCI header" - fields_desc = [ ByteEnumField("type",2,{1:"command",2:"ACLdata",3:"SCOdata",4:"event",5:"vendor"}),] - - def mysummary(self): - return self.sprintf("HCI %type%") - -class HCI_ACL_Hdr(Packet): - name = "HCI ACL header" - fields_desc = [ ByteField("handle",0), # Actually, handle is 12 bits and flags is 4. - ByteField("flags",0), # I wait to write a LEBitField - LEShortField("len",None), ] - def post_build(self, p, pay): - p += pay - if self.len is None: - l = len(p)-4 - p = p[:2]+chr(l&0xff)+chr((l>>8)&0xff)+p[4:] - return p - - -class L2CAP_Hdr(Packet): - name = "L2CAP header" - fields_desc = [ LEShortField("len",None), - LEShortEnumField("cid",0,{1:"control"}),] - - def post_build(self, p, pay): - p += pay - if self.len is None: - l = len(p)-4 - p = p[:2]+chr(l&0xff)+chr((l>>8)&0xff)+p[4:] - return p - - - -class L2CAP_CmdHdr(Packet): - name = "L2CAP command header" - fields_desc = [ - ByteEnumField("code",8,{1:"rej",2:"conn_req",3:"conn_resp", - 4:"conf_req",5:"conf_resp",6:"disconn_req", - 7:"disconn_resp",8:"echo_req",9:"echo_resp", - 10:"info_req",11:"info_resp"}), - ByteField("id",0), - LEShortField("len",None) ] - def post_build(self, p, pay): - p += pay - if self.len is None: - l = len(p)-4 - p = p[:2]+chr(l&0xff)+chr((l>>8)&0xff)+p[4:] - return p - def answers(self, other): - if other.id == self.id: - if self.code == 1: - return 1 - if other.code in [2,4,6,8,10] and self.code == other.code+1: - if other.code == 8: - return 1 - return self.payload.answers(other.payload) - return 0 - -class L2CAP_ConnReq(Packet): - name = "L2CAP Conn Req" - fields_desc = [ LEShortEnumField("psm",0,{1:"SDP",3:"RFCOMM",5:"telephony control"}), - LEShortField("scid",0), - ] - -class L2CAP_ConnResp(Packet): - name = "L2CAP Conn Resp" - fields_desc = [ LEShortField("dcid",0), - LEShortField("scid",0), - LEShortEnumField("result",0,["no_info","authen_pend","author_pend"]), - LEShortEnumField("status",0,["success","pend","bad_psm", - "cr_sec_block","cr_no_mem"]), - ] - def answers(self, other): - return self.scid == other.scid - -class L2CAP_CmdRej(Packet): - name = "L2CAP Command Rej" - fields_desc = [ LEShortField("reason",0), - ] - - -class L2CAP_ConfReq(Packet): - name = "L2CAP Conf Req" - fields_desc = [ LEShortField("dcid",0), - LEShortField("flags",0), - ] - -class L2CAP_ConfResp(Packet): - name = "L2CAP Conf Resp" - fields_desc = [ LEShortField("scid",0), - LEShortField("flags",0), - LEShortEnumField("result",0,["success","unaccept","reject","unknown"]), - ] - def answers(self, other): - return self.scid == other.scid - - -class L2CAP_DisconnReq(Packet): - name = "L2CAP Disconn Req" - fields_desc = [ LEShortField("dcid",0), - LEShortField("scid",0), ] - -class L2CAP_DisconnResp(Packet): - name = "L2CAP Disconn Resp" - fields_desc = [ LEShortField("dcid",0), - LEShortField("scid",0), ] - def answers(self, other): - return self.scid == other.scid - - - -class L2CAP_InfoReq(Packet): - name = "L2CAP Info Req" - fields_desc = [ LEShortEnumField("type",0,{1:"CL_MTU",2:"FEAT_MASK"}), - StrField("data","") - ] - - -class L2CAP_InfoResp(Packet): - name = "L2CAP Info Resp" - fields_desc = [ LEShortField("type",0), - LEShortEnumField("result",0,["success","not_supp"]), - StrField("data",""), ] - def answers(self, other): - return self.type == other.type - - - -bind_layers( HCI_Hdr, HCI_ACL_Hdr, type=2) -bind_layers( HCI_Hdr, conf.raw_layer, ) -bind_layers( HCI_ACL_Hdr, L2CAP_Hdr, ) -bind_layers( L2CAP_Hdr, L2CAP_CmdHdr, cid=1) -bind_layers( L2CAP_CmdHdr, L2CAP_CmdRej, code=1) -bind_layers( L2CAP_CmdHdr, L2CAP_ConnReq, code=2) -bind_layers( L2CAP_CmdHdr, L2CAP_ConnResp, code=3) -bind_layers( L2CAP_CmdHdr, L2CAP_ConfReq, code=4) -bind_layers( L2CAP_CmdHdr, L2CAP_ConfResp, code=5) -bind_layers( L2CAP_CmdHdr, L2CAP_DisconnReq, code=6) -bind_layers( L2CAP_CmdHdr, L2CAP_DisconnResp, code=7) -bind_layers( L2CAP_CmdHdr, L2CAP_InfoReq, code=10) -bind_layers( L2CAP_CmdHdr, L2CAP_InfoResp, code=11) - -class BluetoothL2CAPSocket(SuperSocket): - desc = "read/write packets on a connected L2CAP socket" - def __init__(self, peer): - s = socket.socket(socket.AF_BLUETOOTH, socket.SOCK_RAW, - socket.BTPROTO_L2CAP) - s.connect((peer,0)) - - self.ins = self.outs = s - - def recv(self, x=MTU): - return L2CAP_CmdHdr(self.ins.recv(x)) - - -class BluetoothHCISocket(SuperSocket): - desc = "read/write on a BlueTooth HCI socket" - def __init__(self, iface=0x10000, type=None): - s = socket.socket(socket.AF_BLUETOOTH, socket.SOCK_RAW, socket.BTPROTO_HCI) - s.setsockopt(socket.SOL_HCI, socket.HCI_DATA_DIR,1) - s.setsockopt(socket.SOL_HCI, socket.HCI_TIME_STAMP,1) - s.setsockopt(socket.SOL_HCI, socket.HCI_FILTER, struct.pack("IIIh2x", 0xffffffffL,0xffffffffL,0xffffffffL,0)) #type mask, event mask, event mask, opcode - s.bind((iface,)) - self.ins = self.outs = s -# s.connect((peer,0)) - - - def recv(self, x): - return HCI_Hdr(self.ins.recv(x)) - -## Bluetooth - - -@conf.commands.register -def srbt(peer, pkts, inter=0.1, *args, **kargs): - """send and receive using a bluetooth socket""" - s = conf.BTsocket(peer=peer) - a,b = sndrcv(s,pkts,inter=inter,*args,**kargs) - s.close() - return a,b - -@conf.commands.register -def srbt1(peer, pkts, *args, **kargs): - """send and receive 1 packet using a bluetooth socket""" - a,b = srbt(peer, pkts, *args, **kargs) - if len(a) > 0: - return a[0][1] - - - -conf.BTsocket = BluetoothL2CAPSocket diff --git a/scripts/external_libs/scapy-2.3.1/scapy/layers/dhcp.py b/scripts/external_libs/scapy-2.3.1/scapy/layers/dhcp.py deleted file mode 100644 index 18f83f00..00000000 --- a/scripts/external_libs/scapy-2.3.1/scapy/layers/dhcp.py +++ /dev/null @@ -1,373 +0,0 @@ -## This file is part of Scapy -## See http://www.secdev.org/projects/scapy for more informations -## Copyright (C) Philippe Biondi <phil@secdev.org> -## This program is published under a GPLv2 license - -""" -DHCP (Dynamic Host Configuration Protocol) d BOOTP -""" - -import struct - -from scapy.packet import * -from scapy.fields import * -from scapy.ansmachine import * -from scapy.layers.inet import UDP,IP -from scapy.layers.l2 import Ether -from scapy.base_classes import Net -from scapy.volatile import RandField - -from scapy.arch import get_if_raw_hwaddr -from scapy.sendrecv import srp1 - -dhcpmagic="c\x82Sc" - - -class BOOTP(Packet): - name = "BOOTP" - fields_desc = [ ByteEnumField("op",1, {1:"BOOTREQUEST", 2:"BOOTREPLY"}), - ByteField("htype",1), - ByteField("hlen",6), - ByteField("hops",0), - IntField("xid",0), - ShortField("secs",0), - FlagsField("flags", 0, 16, "???????????????B"), - IPField("ciaddr","0.0.0.0"), - IPField("yiaddr","0.0.0.0"), - IPField("siaddr","0.0.0.0"), - IPField("giaddr","0.0.0.0"), - Field("chaddr","", "16s"), - Field("sname","","64s"), - Field("file","","128s"), - StrField("options","") ] - def guess_payload_class(self, payload): - if self.options[:len(dhcpmagic)] == dhcpmagic: - return DHCP - else: - return Packet.guess_payload_class(self, payload) - def extract_padding(self,s): - if self.options[:len(dhcpmagic)] == dhcpmagic: - # set BOOTP options to DHCP magic cookie and make rest a payload of DHCP options - payload = self.options[len(dhcpmagic):] - self.options = self.options[:len(dhcpmagic)] - return payload, None - else: - return "", None - def hashret(self): - return struct.pack("L", self.xid) - def answers(self, other): - if not isinstance(other, BOOTP): - return 0 - return self.xid == other.xid - - - -#DHCP_UNKNOWN, DHCP_IP, DHCP_IPLIST, DHCP_TYPE \ -#= range(4) -# - -DHCPTypes = { - 1: "discover", - 2: "offer", - 3: "request", - 4: "decline", - 5: "ack", - 6: "nak", - 7: "release", - 8: "inform", - 9: "force_renew", - 10:"lease_query", - 11:"lease_unassigned", - 12:"lease_unknown", - 13:"lease_active", - } - -DHCPOptions = { - 0: "pad", - 1: IPField("subnet_mask", "0.0.0.0"), - 2: "time_zone", - 3: IPField("router","0.0.0.0"), - 4: IPField("time_server","0.0.0.0"), - 5: IPField("IEN_name_server","0.0.0.0"), - 6: IPField("name_server","0.0.0.0"), - 7: IPField("log_server","0.0.0.0"), - 8: IPField("cookie_server","0.0.0.0"), - 9: IPField("lpr_server","0.0.0.0"), - 12: "hostname", - 14: "dump_path", - 15: "domain", - 17: "root_disk_path", - 22: "max_dgram_reass_size", - 23: "default_ttl", - 24: "pmtu_timeout", - 28: IPField("broadcast_address","0.0.0.0"), - 35: "arp_cache_timeout", - 36: "ether_or_dot3", - 37: "tcp_ttl", - 38: "tcp_keepalive_interval", - 39: "tcp_keepalive_garbage", - 40: "NIS_domain", - 41: IPField("NIS_server","0.0.0.0"), - 42: IPField("NTP_server","0.0.0.0"), - 43: "vendor_specific", - 44: IPField("NetBIOS_server","0.0.0.0"), - 45: IPField("NetBIOS_dist_server","0.0.0.0"), - 50: IPField("requested_addr","0.0.0.0"), - 51: IntField("lease_time", 43200), - 54: IPField("server_id","0.0.0.0"), - 55: "param_req_list", - 57: ShortField("max_dhcp_size", 1500), - 58: IntField("renewal_time", 21600), - 59: IntField("rebinding_time", 37800), - 60: "vendor_class_id", - 61: "client_id", - - 64: "NISplus_domain", - 65: IPField("NISplus_server","0.0.0.0"), - 69: IPField("SMTP_server","0.0.0.0"), - 70: IPField("POP3_server","0.0.0.0"), - 71: IPField("NNTP_server","0.0.0.0"), - 72: IPField("WWW_server","0.0.0.0"), - 73: IPField("Finger_server","0.0.0.0"), - 74: IPField("IRC_server","0.0.0.0"), - 75: IPField("StreetTalk_server","0.0.0.0"), - 76: "StreetTalk_Dir_Assistance", - 82: "relay_agent_Information", - 53: ByteEnumField("message-type", 1, DHCPTypes), - # 55: DHCPRequestListField("request-list"), - 255: "end" - } - -DHCPRevOptions = {} - -for k,v in DHCPOptions.iteritems(): - if type(v) is str: - n = v - v = None - else: - n = v.name - DHCPRevOptions[n] = (k,v) -del(n) -del(v) -del(k) - - - - -class RandDHCPOptions(RandField): - def __init__(self, size=None, rndstr=None): - if size is None: - size = RandNumExpo(0.05) - self.size = size - if rndstr is None: - rndstr = RandBin(RandNum(0,255)) - self.rndstr=rndstr - self._opts = DHCPOptions.values() - self._opts.remove("pad") - self._opts.remove("end") - def _fix(self): - op = [] - for k in range(self.size): - o = random.choice(self._opts) - if type(o) is str: - op.append((o,self.rndstr*1)) - else: - op.append((o.name, o.randval()._fix())) - return op - - -class DHCPOptionsField(StrField): - islist=1 - def i2repr(self,pkt,x): - s = [] - for v in x: - if type(v) is tuple and len(v) >= 2: - if DHCPRevOptions.has_key(v[0]) and isinstance(DHCPRevOptions[v[0]][1],Field): - f = DHCPRevOptions[v[0]][1] - vv = ",".join(f.i2repr(pkt,val) for val in v[1:]) - else: - vv = ",".join(repr(val) for val in v[1:]) - r = "%s=%s" % (v[0],vv) - s.append(r) - else: - s.append(sane(v)) - return "[%s]" % (" ".join(s)) - - def getfield(self, pkt, s): - return "", self.m2i(pkt, s) - def m2i(self, pkt, x): - opt = [] - while x: - o = ord(x[0]) - if o == 255: - opt.append("end") - x = x[1:] - continue - if o == 0: - opt.append("pad") - x = x[1:] - continue - if len(x) < 2 or len(x) < ord(x[1])+2: - opt.append(x) - break - elif DHCPOptions.has_key(o): - f = DHCPOptions[o] - - if isinstance(f, str): - olen = ord(x[1]) - opt.append( (f,x[2:olen+2]) ) - x = x[olen+2:] - else: - olen = ord(x[1]) - lval = [f.name] - try: - left = x[2:olen+2] - while left: - left, val = f.getfield(pkt,left) - lval.append(val) - except: - opt.append(x) - break - else: - otuple = tuple(lval) - opt.append(otuple) - x = x[olen+2:] - else: - olen = ord(x[1]) - opt.append((o, x[2:olen+2])) - x = x[olen+2:] - return opt - def i2m(self, pkt, x): - if type(x) is str: - return x - s = "" - for o in x: - if type(o) is tuple and len(o) >= 2: - name = o[0] - lval = o[1:] - - if isinstance(name, int): - onum, oval = name, "".join(lval) - elif DHCPRevOptions.has_key(name): - onum, f = DHCPRevOptions[name] - if f is not None: - lval = [f.addfield(pkt,"",f.any2i(pkt,val)) for val in lval] - oval = "".join(lval) - else: - warning("Unknown field option %s" % name) - continue - - s += chr(onum) - s += chr(len(oval)) - s += oval - - elif (type(o) is str and DHCPRevOptions.has_key(o) and - DHCPRevOptions[o][1] == None): - s += chr(DHCPRevOptions[o][0]) - elif type(o) is int: - s += chr(o)+"\0" - elif type(o) is str: - s += o - else: - warning("Malformed option %s" % o) - return s - - -class DHCP(Packet): - name = "DHCP options" - fields_desc = [ DHCPOptionsField("options","") ] - - -bind_layers( UDP, BOOTP, dport=67, sport=68) -bind_layers( UDP, BOOTP, dport=68, sport=67) -bind_bottom_up( UDP, BOOTP, dport=67, sport=67) -bind_layers( BOOTP, DHCP, options='c\x82Sc') - -def dhcp_request(iface=None,**kargs): - if conf.checkIPaddr != 0: - warning("conf.checkIPaddr is not 0, I may not be able to match the answer") - if iface is None: - iface = conf.iface - fam,hw = get_if_raw_hwaddr(iface) - return srp1(Ether(dst="ff:ff:ff:ff:ff:ff")/IP(src="0.0.0.0",dst="255.255.255.255")/UDP(sport=68,dport=67) - /BOOTP(chaddr=hw)/DHCP(options=[("message-type","discover"),"end"]),iface=iface,**kargs) - - -class BOOTP_am(AnsweringMachine): - function_name = "bootpd" - filter = "udp and port 68 and port 67" - send_function = staticmethod(sendp) - def parse_options(self, pool=Net("192.168.1.128/25"), network="192.168.1.0/24",gw="192.168.1.1", - domain="localnet", renewal_time=60, lease_time=1800): - if type(pool) is str: - poom = Net(pool) - self.domain = domain - netw,msk = (network.split("/")+["32"])[:2] - msk = itom(int(msk)) - self.netmask = ltoa(msk) - self.network = ltoa(atol(netw)&msk) - self.broadcast = ltoa( atol(self.network) | (0xffffffff&~msk) ) - self.gw = gw - if isinstance(pool,Gen): - pool = [k for k in pool if k not in [gw, self.network, self.broadcast]] - pool.reverse() - if len(pool) == 1: - pool, = pool - self.pool = pool - self.lease_time = lease_time - self.renewal_time = renewal_time - self.leases = {} - - def is_request(self, req): - if not req.haslayer(BOOTP): - return 0 - reqb = req.getlayer(BOOTP) - if reqb.op != 1: - return 0 - return 1 - - def print_reply(self, req, reply): - print "Reply %s to %s" % (reply.getlayer(IP).dst,reply.dst) - - def make_reply(self, req): - mac = req.src - if type(self.pool) is list: - if not self.leases.has_key(mac): - self.leases[mac] = self.pool.pop() - ip = self.leases[mac] - else: - ip = self.pool - - repb = req.getlayer(BOOTP).copy() - repb.op="BOOTREPLY" - repb.yiaddr = ip - repb.siaddr = self.gw - repb.ciaddr = self.gw - repb.giaddr = self.gw - del(repb.payload) - rep=Ether(dst=mac)/IP(dst=ip)/UDP(sport=req.dport,dport=req.sport)/repb - return rep - - -class DHCP_am(BOOTP_am): - function_name="dhcpd" - def make_reply(self, req): - resp = BOOTP_am.make_reply(self, req) - if DHCP in req: - dhcp_options = [(op[0],{1:2,3:5}.get(op[1],op[1])) - for op in req[DHCP].options - if type(op) is tuple and op[0] == "message-type"] - dhcp_options += [("server_id",self.gw), - ("domain", self.domain), - ("router", self.gw), - ("name_server", self.gw), - ("broadcast_address", self.broadcast), - ("subnet_mask", self.netmask), - ("renewal_time", self.renewal_time), - ("lease_time", self.lease_time), - "end" - ] - resp /= DHCP(options=dhcp_options) - return resp - - diff --git a/scripts/external_libs/scapy-2.3.1/scapy/layers/dhcp6.py b/scripts/external_libs/scapy-2.3.1/scapy/layers/dhcp6.py deleted file mode 100644 index 2bd215d0..00000000 --- a/scripts/external_libs/scapy-2.3.1/scapy/layers/dhcp6.py +++ /dev/null @@ -1,1715 +0,0 @@ -## This file is part of Scapy -## See http://www.secdev.org/projects/scapy for more informations -## Copyright (C) Philippe Biondi <phil@secdev.org> -## This program is published under a GPLv2 license - -## Copyright (C) 2005 Guillaume Valadon <guedou@hongo.wide.ad.jp> -## Arnaud Ebalard <arnaud.ebalard@eads.net> - -""" -DHCPv6: Dynamic Host Configuration Protocol for IPv6. [RFC 3315] -""" - -import socket -from scapy.packet import * -from scapy.fields import * -from scapy.utils6 import * -from scapy.layers.inet6 import * -from scapy.ansmachine import AnsweringMachine - -############################################################################# -# Helpers ## -############################################################################# - -def get_cls(name, fallback_cls): - return globals().get(name, fallback_cls) - - -############################################################################# -############################################################################# -### DHCPv6 ### -############################################################################# -############################################################################# - -All_DHCP_Relay_Agents_and_Servers = "ff02::1:2" -All_DHCP_Servers = "ff05::1:3" # Site-Local scope : deprecated by 3879 - -dhcp6opts = { 1: "CLIENTID", - 2: "SERVERID", - 3: "IA_NA", - 4: "IA_TA", - 5: "IAADDR", - 6: "ORO", - 7: "PREFERENCE", - 8: "ELAPSED_TIME", - 9: "RELAY_MSG", - 11: "AUTH", - 12: "UNICAST", - 13: "STATUS_CODE", - 14: "RAPID_COMMIT", - 15: "USER_CLASS", - 16: "VENDOR_CLASS", - 17: "VENDOR_OPTS", - 18: "INTERFACE_ID", - 19: "RECONF_MSG", - 20: "RECONF_ACCEPT", - 21: "SIP Servers Domain Name List", #RFC3319 - 22: "SIP Servers IPv6 Address List", #RFC3319 - 23: "DNS Recursive Name Server Option", #RFC3646 - 24: "Domain Search List option", #RFC3646 - 25: "OPTION_IA_PD", #RFC3633 - 26: "OPTION_IAPREFIX", #RFC3633 - 27: "OPTION_NIS_SERVERS", #RFC3898 - 28: "OPTION_NISP_SERVERS", #RFC3898 - 29: "OPTION_NIS_DOMAIN_NAME", #RFC3898 - 30: "OPTION_NISP_DOMAIN_NAME", #RFC3898 - 31: "OPTION_SNTP_SERVERS", #RFC4075 - 32: "OPTION_INFORMATION_REFRESH_TIME", #RFC4242 - 33: "OPTION_BCMCS_SERVER_D", #RFC4280 - 34: "OPTION_BCMCS_SERVER_A", #RFC4280 - 36: "OPTION_GEOCONF_CIVIC", #RFC-ietf-geopriv-dhcp-civil-09.txt - 37: "OPTION_REMOTE_ID", #RFC4649 - 38: "OPTION_SUBSCRIBER_ID", #RFC4580 - 39: "OPTION_CLIENT_FQDN" } #RFC4704 - -dhcp6opts_by_code = { 1: "DHCP6OptClientId", - 2: "DHCP6OptServerId", - 3: "DHCP6OptIA_NA", - 4: "DHCP6OptIA_TA", - 5: "DHCP6OptIAAddress", - 6: "DHCP6OptOptReq", - 7: "DHCP6OptPref", - 8: "DHCP6OptElapsedTime", - 9: "DHCP6OptRelayMsg", - 11: "DHCP6OptAuth", - 12: "DHCP6OptServerUnicast", - 13: "DHCP6OptStatusCode", - 14: "DHCP6OptRapidCommit", - 15: "DHCP6OptUserClass", - 16: "DHCP6OptVendorClass", - 17: "DHCP6OptVendorSpecificInfo", - 18: "DHCP6OptIfaceId", - 19: "DHCP6OptReconfMsg", - 20: "DHCP6OptReconfAccept", - 21: "DHCP6OptSIPDomains", #RFC3319 - 22: "DHCP6OptSIPServers", #RFC3319 - 23: "DHCP6OptDNSServers", #RFC3646 - 24: "DHCP6OptDNSDomains", #RFC3646 - 25: "DHCP6OptIA_PD", #RFC3633 - 26: "DHCP6OptIAPrefix", #RFC3633 - 27: "DHCP6OptNISServers", #RFC3898 - 28: "DHCP6OptNISPServers", #RFC3898 - 29: "DHCP6OptNISDomain", #RFC3898 - 30: "DHCP6OptNISPDomain", #RFC3898 - 31: "DHCP6OptSNTPServers", #RFC4075 - 32: "DHCP6OptInfoRefreshTime", #RFC4242 - 33: "DHCP6OptBCMCSDomains", #RFC4280 - 34: "DHCP6OptBCMCSServers", #RFC4280 - #36: "DHCP6OptGeoConf", #RFC-ietf-geopriv-dhcp-civil-09.txt - 37: "DHCP6OptRemoteID", #RFC4649 - 38: "DHCP6OptSubscriberID", #RFC4580 - 39: "DHCP6OptClientFQDN", #RFC4704 - #40: "DHCP6OptPANAAgent", #RFC-ietf-dhc-paa-option-05.txt - #41: "DHCP6OptNewPOSIXTimeZone, #RFC4833 - #42: "DHCP6OptNewTZDBTimeZone, #RFC4833 - 43: "DHCP6OptRelayAgentERO" #RFC4994 - #44: "DHCP6OptLQQuery", #RFC5007 - #45: "DHCP6OptLQClientData", #RFC5007 - #46: "DHCP6OptLQClientTime", #RFC5007 - #47: "DHCP6OptLQRelayData", #RFC5007 - #48: "DHCP6OptLQClientLink", #RFC5007 -} - - -# sect 5.3 RFC 3315 : DHCP6 Messages types -dhcp6types = { 1:"SOLICIT", - 2:"ADVERTISE", - 3:"REQUEST", - 4:"CONFIRM", - 5:"RENEW", - 6:"REBIND", - 7:"REPLY", - 8:"RELEASE", - 9:"DECLINE", - 10:"RECONFIGURE", - 11:"INFORMATION-REQUEST", - 12:"RELAY-FORW", - 13:"RELAY-REPL" } - - -##################################################################### -### DHCPv6 DUID related stuff ### -##################################################################### - -duidtypes = { 1: "Link-layer address plus time", - 2: "Vendor-assigned unique ID based on Enterprise Number", - 3: "Link-layer Address" } - -# DUID hardware types - RFC 826 - Extracted from -# http://www.iana.org/assignments/arp-parameters on 31/10/06 -# We should add the length of every kind of address. -duidhwtypes = { 0: "NET/ROM pseudo", # Not referenced by IANA - 1: "Ethernet (10Mb)", - 2: "Experimental Ethernet (3Mb)", - 3: "Amateur Radio AX.25", - 4: "Proteon ProNET Token Ring", - 5: "Chaos", - 6: "IEEE 802 Networks", - 7: "ARCNET", - 8: "Hyperchannel", - 9: "Lanstar", - 10: "Autonet Short Address", - 11: "LocalTalk", - 12: "LocalNet (IBM PCNet or SYTEK LocalNET)", - 13: "Ultra link", - 14: "SMDS", - 15: "Frame Relay", - 16: "Asynchronous Transmission Mode (ATM)", - 17: "HDLC", - 18: "Fibre Channel", - 19: "Asynchronous Transmission Mode (ATM)", - 20: "Serial Line", - 21: "Asynchronous Transmission Mode (ATM)", - 22: "MIL-STD-188-220", - 23: "Metricom", - 24: "IEEE 1394.1995", - 25: "MAPOS", - 26: "Twinaxial", - 27: "EUI-64", - 28: "HIPARP", - 29: "IP and ARP over ISO 7816-3", - 30: "ARPSec", - 31: "IPsec tunnel", - 32: "InfiniBand (TM)", - 33: "TIA-102 Project 25 Common Air Interface (CAI)" } - -class UTCTimeField(IntField): - epoch = (2000, 1, 1, 0, 0, 0, 5, 1, 0) # required Epoch - def i2repr(self, pkt, x): - x = self.i2h(pkt, x) - from time import gmtime, strftime, mktime - delta = mktime(self.epoch) - mktime(gmtime(0)) - x = x + delta - t = strftime("%a, %d %b %Y %H:%M:%S +0000", gmtime(x)) - return "%s (%d)" % (t, x) - -class _LLAddrField(MACField): - pass - -# XXX We only support Ethernet addresses at the moment. _LLAddrField -# will be modified when needed. Ask us. --arno -class DUID_LLT(Packet): # sect 9.2 RFC 3315 - name = "DUID - Link-layer address plus time" - fields_desc = [ ShortEnumField("type", 1, duidtypes), - XShortEnumField("hwtype", 1, duidhwtypes), - UTCTimeField("timeval", 0), # i.e. 01 Jan 2000 - _LLAddrField("lladdr", ETHER_ANY) ] - -# In fact, IANA enterprise-numbers file available at -# http//www.iana.org/asignments/enterprise-numbers) -# is simply huge (more than 2Mo and 600Ko in bz2). I'll -# add only most common vendors, and encountered values. -# -- arno -iana_enterprise_num = { 9: "ciscoSystems", - 35: "Nortel Networks", - 43: "3Com", - 311: "Microsoft", - 2636: "Juniper Networks, Inc.", - 4526: "Netgear", - 5771: "Cisco Systems, Inc.", - 5842: "Cisco Systems", - 16885: "Nortel Networks" } - -class DUID_EN(Packet): # sect 9.3 RFC 3315 - name = "DUID - Assigned by Vendor Based on Enterprise Number" - fields_desc = [ ShortEnumField("type", 2, duidtypes), - IntEnumField("enterprisenum", 311, iana_enterprise_num), - StrField("id","") ] - -class DUID_LL(Packet): # sect 9.4 RFC 3315 - name = "DUID - Based on Link-layer Address" - fields_desc = [ ShortEnumField("type", 3, duidtypes), - XShortEnumField("hwtype", 1, duidhwtypes), - _LLAddrField("lladdr", ETHER_ANY) ] - -duid_cls = { 1: "DUID_LLT", - 2: "DUID_EN", - 3: "DUID_LL"} - -##################################################################### -### DHCPv6 Options classes ### -##################################################################### - -class _DHCP6OptGuessPayload(Packet): - def guess_payload_class(self, payload): - cls = conf.raw_layer - if len(payload) > 2 : - opt = struct.unpack("!H", payload[:2])[0] - cls = get_cls(dhcp6opts_by_code.get(opt, "DHCP6OptUnknown"), DHCP6OptUnknown) - return cls - -class DHCP6OptUnknown(_DHCP6OptGuessPayload): # A generic DHCPv6 Option - name = "Unknown DHCPv6 OPtion" - fields_desc = [ ShortEnumField("optcode", 0, dhcp6opts), - FieldLenField("optlen", None, length_of="data", fmt="!H"), - StrLenField("data", "", - length_from = lambda pkt: pkt.optlen)] - -class _DUIDField(PacketField): - holds_packets=1 - def __init__(self, name, default, length_from=None): - StrField.__init__(self, name, default) - self.length_from = length_from - - def i2m(self, pkt, i): - return str(i) - - def m2i(self, pkt, x): - cls = conf.raw_layer - if len(x) > 4: - o = struct.unpack("!H", x[:2])[0] - cls = get_cls(duid_cls.get(o, conf.raw_layer), conf.raw_layer) - return cls(x) - - def getfield(self, pkt, s): - l = self.length_from(pkt) - return s[l:], self.m2i(pkt,s[:l]) - - -class DHCP6OptClientId(_DHCP6OptGuessPayload): # RFC sect 22.2 - name = "DHCP6 Client Identifier Option" - fields_desc = [ ShortEnumField("optcode", 1, dhcp6opts), - FieldLenField("optlen", None, length_of="duid", fmt="!H"), - _DUIDField("duid", "", - length_from = lambda pkt: pkt.optlen) ] - - -class DHCP6OptServerId(DHCP6OptClientId): # RFC sect 22.3 - name = "DHCP6 Server Identifier Option" - optcode = 2 - -# Should be encapsulated in the option field of IA_NA or IA_TA options -# Can only appear at that location. -# TODO : last field IAaddr-options is not defined in the reference document -class DHCP6OptIAAddress(_DHCP6OptGuessPayload): # RFC sect 22.6 - name = "DHCP6 IA Address Option (IA_TA or IA_NA suboption)" - fields_desc = [ ShortEnumField("optcode", 5, dhcp6opts), - FieldLenField("optlen", None, length_of="iaaddropts", - fmt="!H", adjust = lambda pkt,x: x+24), - IP6Field("addr", "::"), - IntField("preflft", 0), - IntField("validlft", 0), - XIntField("iaid", None), - StrLenField("iaaddropts", "", - length_from = lambda pkt: pkt.optlen - 24) ] - def guess_payload_class(self, payload): - return conf.padding_layer - -class _IANAOptField(PacketListField): - def i2len(self, pkt, z): - if z is None or z == []: - return 0 - return sum(map(lambda x: len(str(x)) ,z)) - - def getfield(self, pkt, s): - l = self.length_from(pkt) - lst = [] - remain, payl = s[:l], s[l:] - while len(remain)>0: - p = self.m2i(pkt,remain) - if conf.padding_layer in p: - pad = p[conf.padding_layer] - remain = pad.load - del(pad.underlayer.payload) - else: - remain = "" - lst.append(p) - return payl,lst - -class DHCP6OptIA_NA(_DHCP6OptGuessPayload): # RFC sect 22.4 - name = "DHCP6 Identity Association for Non-temporary Addresses Option" - fields_desc = [ ShortEnumField("optcode", 3, dhcp6opts), - FieldLenField("optlen", None, length_of="ianaopts", - fmt="!H", adjust = lambda pkt,x: x+12), - XIntField("iaid", None), - IntField("T1", None), - IntField("T2", None), - _IANAOptField("ianaopts", [], DHCP6OptIAAddress, - length_from = lambda pkt: pkt.optlen-12) ] - -class _IATAOptField(_IANAOptField): - pass - -class DHCP6OptIA_TA(_DHCP6OptGuessPayload): # RFC sect 22.5 - name = "DHCP6 Identity Association for Temporary Addresses Option" - fields_desc = [ ShortEnumField("optcode", 4, dhcp6opts), - FieldLenField("optlen", None, length_of="iataopts", - fmt="!H", adjust = lambda pkt,x: x+4), - XIntField("iaid", None), - _IATAOptField("iataopts", [], DHCP6OptIAAddress, - length_from = lambda pkt: pkt.optlen-4) ] - - -#### DHCPv6 Option Request Option ################################### - -class _OptReqListField(StrLenField): - islist = 1 - def i2h(self, pkt, x): - if x is None: - return [] - return x - - def i2len(self, pkt, x): - return 2*len(x) - - def any2i(self, pkt, x): - return x - - def i2repr(self, pkt, x): - s = [] - for y in self.i2h(pkt, x): - if dhcp6opts.has_key(y): - s.append(dhcp6opts[y]) - else: - s.append("%d" % y) - return "[%s]" % ", ".join(s) - - def m2i(self, pkt, x): - r = [] - while len(x) != 0: - if len(x)<2: - warning("Odd length for requested option field. Rejecting last byte") - return r - r.append(struct.unpack("!H", x[:2])[0]) - x = x[2:] - return r - - def i2m(self, pkt, x): - return "".join(map(lambda y: struct.pack("!H", y), x)) - -# A client may include an ORO in a solicit, Request, Renew, Rebind, -# Confirm or Information-request -class DHCP6OptOptReq(_DHCP6OptGuessPayload): # RFC sect 22.7 - name = "DHCP6 Option Request Option" - fields_desc = [ ShortEnumField("optcode", 6, dhcp6opts), - FieldLenField("optlen", None, length_of="reqopts", fmt="!H"), - _OptReqListField("reqopts", [23, 24], - length_from = lambda pkt: pkt.optlen) ] - - -#### DHCPv6 Preference Option ####################################### - -# emise par un serveur pour affecter le choix fait par le client. Dans -# les messages Advertise, a priori -class DHCP6OptPref(_DHCP6OptGuessPayload): # RFC sect 22.8 - name = "DHCP6 Preference Option" - fields_desc = [ ShortEnumField("optcode", 7, dhcp6opts), - ShortField("optlen", 1 ), - ByteField("prefval",255) ] - - -#### DHCPv6 Elapsed Time Option ##################################### - -class _ElapsedTimeField(ShortField): - def i2repr(self, pkt, x): - if x == 0xffff: - return "infinity (0xffff)" - return "%.2f sec" % (self.i2h(pkt, x)/100.) - -class DHCP6OptElapsedTime(_DHCP6OptGuessPayload):# RFC sect 22.9 - name = "DHCP6 Elapsed Time Option" - fields_desc = [ ShortEnumField("optcode", 8, dhcp6opts), - ShortField("optlen", 2), - _ElapsedTimeField("elapsedtime", 0) ] - - -#### DHCPv6 Relay Message Option #################################### - -# Relayed message is seen as a payload. -class DHCP6OptRelayMsg(_DHCP6OptGuessPayload):# RFC sect 22.10 - name = "DHCP6 Relay Message Option" - fields_desc = [ ShortEnumField("optcode", 9, dhcp6opts), - ShortField("optlen", None ) ] - def post_build(self, p, pay): - if self.optlen is None: - l = len(pay) - p = p[:2]+struct.pack("!H", l) - return p + pay - - -#### DHCPv6 Authentication Option ################################### - -# The following fields are set in an Authentication option for the -# Reconfigure Key Authentication Protocol: -# -# protocol 3 -# -# algorithm 1 -# -# RDM 0 -# -# The format of the Authentication information for the Reconfigure Key -# Authentication Protocol is: -# -# 0 1 2 3 -# 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 -# +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ -# | Type | Value (128 bits) | -# +-+-+-+-+-+-+-+-+ | -# . . -# . . -# . +-+-+-+-+-+-+-+-+ -# | | -# +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ -# -# Type Type of data in Value field carried in this option: -# -# 1 Reconfigure Key value (used in Reply message). -# -# 2 HMAC-MD5 digest of the message (used in Reconfigure -# message). -# -# Value Data as defined by field. - - -# TODO : Decoding only at the moment -class DHCP6OptAuth(_DHCP6OptGuessPayload): # RFC sect 22.11 - name = "DHCP6 Option - Authentication" - fields_desc = [ ShortEnumField("optcode", 11, dhcp6opts), - FieldLenField("optlen", None, length_of="authinfo", - adjust = lambda pkt,x: x+11), - ByteField("proto", 3), # TODO : XXX - ByteField("alg", 1), # TODO : XXX - ByteField("rdm", 0), # TODO : XXX - StrFixedLenField("replay", "A"*8, 8), # TODO: XXX - StrLenField("authinfo", "", - length_from = lambda pkt: pkt.optlen - 11) ] - -#### DHCPv6 Server Unicast Option ################################### - -class _SrvAddrField(IP6Field): - def i2h(self, pkt, x): - if x is None: - return "::" - return x - - def i2m(self, pkt, x): - return inet_pton(socket.AF_INET6, self.i2h(pkt,x)) - -class DHCP6OptServerUnicast(_DHCP6OptGuessPayload):# RFC sect 22.12 - name = "DHCP6 Server Unicast Option" - fields_desc = [ ShortEnumField("optcode", 12, dhcp6opts), - ShortField("optlen", 16 ), - _SrvAddrField("srvaddr",None) ] - - -#### DHCPv6 Status Code Option ###################################### - -dhcp6statuscodes = { 0:"Success", # sect 24.4 - 1:"UnspecFail", - 2:"NoAddrsAvail", - 3:"NoBinding", - 4:"NotOnLink", - 5:"UseMulticast", - 6:"NoPrefixAvail"} # From RFC3633 - -class DHCP6OptStatusCode(_DHCP6OptGuessPayload):# RFC sect 22.13 - name = "DHCP6 Status Code Option" - fields_desc = [ ShortEnumField("optcode", 13, dhcp6opts), - FieldLenField("optlen", None, length_of="statusmsg", - fmt="!H", adjust = lambda pkt,x:x+2), - ShortEnumField("statuscode",None,dhcp6statuscodes), - StrLenField("statusmsg", "", - length_from = lambda pkt: pkt.optlen-2) ] - - -#### DHCPv6 Rapid Commit Option ##################################### - -class DHCP6OptRapidCommit(_DHCP6OptGuessPayload): # RFC sect 22.14 - name = "DHCP6 Rapid Commit Option" - fields_desc = [ ShortEnumField("optcode", 14, dhcp6opts), - ShortField("optlen", 0)] - - -#### DHCPv6 User Class Option ####################################### - -class _UserClassDataField(PacketListField): - def i2len(self, pkt, z): - if z is None or z == []: - return 0 - return sum(map(lambda x: len(str(x)) ,z)) - - def getfield(self, pkt, s): - l = self.length_from(pkt) - lst = [] - remain, payl = s[:l], s[l:] - while len(remain)>0: - p = self.m2i(pkt,remain) - if conf.padding_layer in p: - pad = p[conf.padding_layer] - remain = pad.load - del(pad.underlayer.payload) - else: - remain = "" - lst.append(p) - return payl,lst - - -class USER_CLASS_DATA(Packet): - name = "user class data" - fields_desc = [ FieldLenField("len", None, length_of="data"), - StrLenField("data", "", - length_from = lambda pkt: pkt.len) ] - def guess_payload_class(self, payload): - return conf.padding_layer - -class DHCP6OptUserClass(_DHCP6OptGuessPayload):# RFC sect 22.15 - name = "DHCP6 User Class Option" - fields_desc = [ ShortEnumField("optcode", 15, dhcp6opts), - FieldLenField("optlen", None, fmt="!H", - length_of="userclassdata"), - _UserClassDataField("userclassdata", [], USER_CLASS_DATA, - length_from = lambda pkt: pkt.optlen) ] - - -#### DHCPv6 Vendor Class Option ##################################### - -class _VendorClassDataField(_UserClassDataField): - pass - -class VENDOR_CLASS_DATA(USER_CLASS_DATA): - name = "vendor class data" - -class DHCP6OptVendorClass(_DHCP6OptGuessPayload):# RFC sect 22.16 - name = "DHCP6 Vendor Class Option" - fields_desc = [ ShortEnumField("optcode", 16, dhcp6opts), - FieldLenField("optlen", None, length_of="vcdata", fmt="!H", - adjust = lambda pkt,x: x+4), - IntEnumField("enterprisenum",None , iana_enterprise_num ), - _VendorClassDataField("vcdata", [], VENDOR_CLASS_DATA, - length_from = lambda pkt: pkt.optlen-4) ] - -#### DHCPv6 Vendor-Specific Information Option ###################### - -class VENDOR_SPECIFIC_OPTION(_DHCP6OptGuessPayload): - name = "vendor specific option data" - fields_desc = [ ShortField("optcode", None), - FieldLenField("optlen", None, length_of="optdata"), - StrLenField("optdata", "", - length_from = lambda pkt: pkt.optlen) ] - def guess_payload_class(self, payload): - return conf.padding_layer - -# The third one that will be used for nothing interesting -class DHCP6OptVendorSpecificInfo(_DHCP6OptGuessPayload):# RFC sect 22.17 - name = "DHCP6 Vendor-specific Information Option" - fields_desc = [ ShortEnumField("optcode", 17, dhcp6opts), - FieldLenField("optlen", None, length_of="vso", fmt="!H", - adjust = lambda pkt,x: x+4), - IntEnumField("enterprisenum",None , iana_enterprise_num), - _VendorClassDataField("vso", [], VENDOR_SPECIFIC_OPTION, - length_from = lambda pkt: pkt.optlen-4) ] - -#### DHCPv6 Interface-ID Option ##################################### - -# Repasser sur cette option a la fin. Elle a pas l'air d'etre des -# masses critique. -class DHCP6OptIfaceId(_DHCP6OptGuessPayload):# RFC sect 22.18 - name = "DHCP6 Interface-Id Option" - fields_desc = [ ShortEnumField("optcode", 18, dhcp6opts), - FieldLenField("optlen", None, fmt="!H", - length_of="ifaceid"), - StrLenField("ifaceid", "", - length_from = lambda pkt: pkt.optlen) ] - - -#### DHCPv6 Reconfigure Message Option ############################## - -# A server includes a Reconfigure Message option in a Reconfigure -# message to indicate to the client whether the client responds with a -# renew message or an Informatiion-request message. -class DHCP6OptReconfMsg(_DHCP6OptGuessPayload): # RFC sect 22.19 - name = "DHCP6 Reconfigure Message Option" - fields_desc = [ ShortEnumField("optcode", 19, dhcp6opts), - ShortField("optlen", 1 ), - ByteEnumField("msgtype", 11, { 5:"Renew Message", - 11:"Information Request"}) ] - - -#### DHCPv6 Reconfigure Accept Option ############################### - -# A client uses the Reconfigure Accept option to announce to the -# server whether the client is willing to accept Recoonfigure -# messages, and a server uses this option to tell the client whether -# or not to accept Reconfigure messages. The default behavior in the -# absence of this option, means unwillingness to accept reconfigure -# messages, or instruction not to accept Reconfigure messages, for the -# client and server messages, respectively. -class DHCP6OptReconfAccept(_DHCP6OptGuessPayload): # RFC sect 22.20 - name = "DHCP6 Reconfigure Accept Option" - fields_desc = [ ShortEnumField("optcode", 20, dhcp6opts), - ShortField("optlen", 0)] - -# As required in Sect 8. of RFC 3315, Domain Names must be encoded as -# described in section 3.1 of RFC 1035 -# XXX Label should be at most 63 octets in length : we do not enforce it -# Total length of domain should be 255 : we do not enforce it either -class DomainNameListField(StrLenField): - islist = 1 - - def i2len(self, pkt, x): - return len(self.i2m(pkt, x)) - - def m2i(self, pkt, x): - res = [] - while x: - cur = [] - while x and x[0] != '\x00': - l = ord(x[0]) - cur.append(x[1:l+1]) - x = x[l+1:] - res.append(".".join(cur)) - if x and x[0] == '\x00': - x = x[1:] - return res - - def i2m(self, pkt, x): - def conditionalTrailingDot(z): - if z and z[-1] == '\x00': - return z - return z+'\x00' - res = "" - tmp = map(lambda y: map((lambda z: chr(len(z))+z), y.split('.')), x) - return "".join(map(lambda x: conditionalTrailingDot("".join(x)), tmp)) - -class DHCP6OptSIPDomains(_DHCP6OptGuessPayload): #RFC3319 - name = "DHCP6 Option - SIP Servers Domain Name List" - fields_desc = [ ShortEnumField("optcode", 21, dhcp6opts), - FieldLenField("optlen", None, length_of="sipdomains"), - DomainNameListField("sipdomains", [], - length_from = lambda pkt: pkt.optlen) ] - -class DHCP6OptSIPServers(_DHCP6OptGuessPayload): #RFC3319 - name = "DHCP6 Option - SIP Servers IPv6 Address List" - fields_desc = [ ShortEnumField("optcode", 22, dhcp6opts), - FieldLenField("optlen", None, length_of="sipservers"), - IP6ListField("sipservers", [], - length_from = lambda pkt: pkt.optlen) ] - -class DHCP6OptDNSServers(_DHCP6OptGuessPayload): #RFC3646 - name = "DHCP6 Option - DNS Recursive Name Server" - fields_desc = [ ShortEnumField("optcode", 23, dhcp6opts), - FieldLenField("optlen", None, length_of="dnsservers"), - IP6ListField("dnsservers", [], - length_from = lambda pkt: pkt.optlen) ] - -class DHCP6OptDNSDomains(_DHCP6OptGuessPayload): #RFC3646 - name = "DHCP6 Option - Domain Search List option" - fields_desc = [ ShortEnumField("optcode", 24, dhcp6opts), - FieldLenField("optlen", None, length_of="dnsdomains"), - DomainNameListField("dnsdomains", [], - length_from = lambda pkt: pkt.optlen) ] - -# TODO: Implement iaprefopts correctly when provided with more -# information about it. -class DHCP6OptIAPrefix(_DHCP6OptGuessPayload): #RFC3633 - name = "DHCP6 Option - IA_PD Prefix option" - fields_desc = [ ShortEnumField("optcode", 26, dhcp6opts), - FieldLenField("optlen", None, length_of="iaprefopts", - adjust = lambda pkt,x: x+26), - IntField("preflft", 0), - IntField("validlft", 0), - ByteField("plen", 48), # TODO: Challenge that default value - IP6Field("prefix", "2001:db8::"), # At least, global and won't hurt - StrLenField("iaprefopts", "", - length_from = lambda pkt: pkt.optlen-26) ] - -class DHCP6OptIA_PD(_DHCP6OptGuessPayload): #RFC3633 - name = "DHCP6 Option - Identity Association for Prefix Delegation" - fields_desc = [ ShortEnumField("optcode", 25, dhcp6opts), - FieldLenField("optlen", None, length_of="iapdopt", - adjust = lambda pkt,x: x+12), - IntField("iaid", 0), - IntField("T1", 0), - IntField("T2", 0), - PacketListField("iapdopt", [], DHCP6OptIAPrefix, - length_from = lambda pkt: pkt.optlen-12) ] - -class DHCP6OptNISServers(_DHCP6OptGuessPayload): #RFC3898 - name = "DHCP6 Option - NIS Servers" - fields_desc = [ ShortEnumField("optcode", 27, dhcp6opts), - FieldLenField("optlen", None, length_of="nisservers"), - IP6ListField("nisservers", [], - length_from = lambda pkt: pkt.optlen) ] - -class DHCP6OptNISPServers(_DHCP6OptGuessPayload): #RFC3898 - name = "DHCP6 Option - NIS+ Servers" - fields_desc = [ ShortEnumField("optcode", 28, dhcp6opts), - FieldLenField("optlen", None, length_of="nispservers"), - IP6ListField("nispservers", [], - length_from = lambda pkt: pkt.optlen) ] - -class DomainNameField(StrLenField): - def getfield(self, pkt, s): - l = self.length_from(pkt) - return s[l:], self.m2i(pkt,s[:l]) - - def i2len(self, pkt, x): - return len(self.i2m(pkt, x)) - - def m2i(self, pkt, x): - cur = [] - while x: - l = ord(x[0]) - cur.append(x[1:1+l]) - x = x[l+1:] - ret_str = ".".join(cur) - return ret_str - - def i2m(self, pkt, x): - if not x: - return "" - tmp = "".join(map(lambda z: chr(len(z))+z, x.split('.'))) - return tmp - -class DHCP6OptNISDomain(_DHCP6OptGuessPayload): #RFC3898 - name = "DHCP6 Option - NIS Domain Name" - fields_desc = [ ShortEnumField("optcode", 29, dhcp6opts), - FieldLenField("optlen", None, length_of="nisdomain"), - DomainNameField("nisdomain", "", - length_from = lambda pkt: pkt.optlen) ] - -class DHCP6OptNISPDomain(_DHCP6OptGuessPayload): #RFC3898 - name = "DHCP6 Option - NIS+ Domain Name" - fields_desc = [ ShortEnumField("optcode", 30, dhcp6opts), - FieldLenField("optlen", None, length_of="nispdomain"), - DomainNameField("nispdomain", "", - length_from= lambda pkt: pkt.optlen) ] - -class DHCP6OptSNTPServers(_DHCP6OptGuessPayload): #RFC4075 - name = "DHCP6 option - SNTP Servers" - fields_desc = [ ShortEnumField("optcode", 31, dhcp6opts), - FieldLenField("optlen", None, length_of="sntpservers"), - IP6ListField("sntpservers", [], - length_from = lambda pkt: pkt.optlen) ] - -IRT_DEFAULT=86400 -IRT_MINIMUM=600 -class DHCP6OptInfoRefreshTime(_DHCP6OptGuessPayload): #RFC4242 - name = "DHCP6 Option - Information Refresh Time" - fields_desc = [ ShortEnumField("optcode", 32, dhcp6opts), - ShortField("optlen", 4), - IntField("reftime", IRT_DEFAULT)] # One day - -class DHCP6OptBCMCSDomains(_DHCP6OptGuessPayload): #RFC4280 - name = "DHCP6 Option - BCMCS Domain Name List" - fields_desc = [ ShortEnumField("optcode", 33, dhcp6opts), - FieldLenField("optlen", None, length_of="bcmcsdomains"), - DomainNameListField("bcmcsdomains", [], - length_from = lambda pkt: pkt.optlen) ] - -class DHCP6OptBCMCSServers(_DHCP6OptGuessPayload): #RFC4280 - name = "DHCP6 Option - BCMCS Addresses List" - fields_desc = [ ShortEnumField("optcode", 34, dhcp6opts), - FieldLenField("optlen", None, length_of="bcmcsservers"), - IP6ListField("bcmcsservers", [], - length_from= lambda pkt: pkt.optlen) ] - -# TODO : Does Nothing at the moment -class DHCP6OptGeoConf(_DHCP6OptGuessPayload): #RFC-ietf-geopriv-dhcp-civil-09.txt - name = "" - fields_desc = [ ShortEnumField("optcode", 36, dhcp6opts), - FieldLenField("optlen", None, length_of="optdata"), - StrLenField("optdata", "", - length_from = lambda pkt: pkt.optlen) ] - -# TODO: see if we encounter opaque values from vendor devices -class DHCP6OptRemoteID(_DHCP6OptGuessPayload): #RFC4649 - name = "DHCP6 Option - Relay Agent Remote-ID" - fields_desc = [ ShortEnumField("optcode", 37, dhcp6opts), - FieldLenField("optlen", None, length_of="remoteid", - adjust = lambda pkt,x: x+4), - IntEnumField("enterprisenum", None, iana_enterprise_num), - StrLenField("remoteid", "", - length_from = lambda pkt: pkt.optlen-4) ] - -# TODO : 'subscriberid' default value should be at least 1 byte long -class DHCP6OptSubscriberID(_DHCP6OptGuessPayload): #RFC4580 - name = "DHCP6 Option - Subscriber ID" - fields_desc = [ ShortEnumField("optcode", 38, dhcp6opts), - FieldLenField("optlen", None, length_of="subscriberid"), - StrLenField("subscriberid", "", - length_from = lambda pkt: pkt.optlen) ] - -# TODO : "The data in the Domain Name field MUST be encoded -# as described in Section 8 of [5]" -class DHCP6OptClientFQDN(_DHCP6OptGuessPayload): #RFC4704 - name = "DHCP6 Option - Client FQDN" - fields_desc = [ ShortEnumField("optcode", 39, dhcp6opts), - FieldLenField("optlen", None, length_of="fqdn", - adjust = lambda pkt,x: x+1), - BitField("res", 0, 5), - FlagsField("flags", 0, 3, "SON" ), - DomainNameField("fqdn", "", - length_from = lambda pkt: pkt.optlen-1) ] - -class DHCP6OptRelayAgentERO(_DHCP6OptGuessPayload): # RFC4994 - name = "DHCP6 Option - RelayRequest Option" - fields_desc = [ ShortEnumField("optcode", 43, dhcp6opts), - FieldLenField("optlen", None, length_of="reqopts", fmt="!H"), - _OptReqListField("reqopts", [23, 24], - length_from = lambda pkt: pkt.optlen) ] - -##################################################################### -### DHCPv6 messages ### -##################################################################### - -# Some state parameters of the protocols that should probably be -# useful to have in the configuration (and keep up-to-date) -DHCP6RelayAgentUnicastAddr="" -DHCP6RelayHopCount="" -DHCP6ServerUnicastAddr="" -DHCP6ClientUnicastAddr="" -DHCP6ClientIA_TA="" -DHCP6ClientIA_NA="" -DHCP6ClientIAID="" -T1="" # Voir 2462 -T2="" # Voir 2462 -DHCP6ServerDUID="" -DHCP6CurrentTransactionID="" # devrait etre utilise pour matcher une -# reponse et mis a jour en mode client par une valeur aleatoire pour -# laquelle on attend un retour de la part d'un serveur. -DHCP6PrefVal="" # la valeur de preference a utiliser dans -# les options preference - -# Emitted by : -# - server : ADVERTISE, REPLY, RECONFIGURE, RELAY-REPL (vers relay) -# - client : SOLICIT, REQUEST, CONFIRM, RENEW, REBIND, RELEASE, DECLINE, -# INFORMATION REQUEST -# - relay : RELAY-FORW (toward server) - -class _DHCP6GuessPayload(Packet): - def guess_payload_class(self, payload): - if len(payload) > 1 : - print ord(payload[0]) - return get_cls(dhcp6opts.get(ord(payload[0]),"DHCP6OptUnknown"), conf.raw_layer) - return conf.raw_layer - -##################################################################### -## DHCPv6 messages sent between Clients and Servers (types 1 to 11) -# Comme specifie en section 15.1 de la RFC 3315, les valeurs de -# transaction id sont selectionnees de maniere aleatoire par le client -# a chaque emission et doivent matcher dans les reponses faites par -# les clients -class DHCP6(_DHCP6OptGuessPayload): - name = "DHCPv6 Generic Message)" - fields_desc = [ ByteEnumField("msgtype",None,dhcp6types), - X3BytesField("trid",0x000000) ] - overload_fields = { UDP: {"sport": 546, "dport": 547} } - - def hashret(self): - return struct.pack("!I", self.trid)[1:4] - -##################################################################### -# Solicit Message : sect 17.1.1 RFC3315 -# - sent by client -# - must include a client identifier option -# - the client may include IA options for any IAs to which it wants the -# server to assign address -# - The client use IA_NA options to request the assignment of -# non-temporary addresses and uses IA_TA options to request the -# assignment of temporary addresses -# - The client should include an Option Request option to indicate the -# options the client is interested in receiving (eventually -# including hints) -# - The client includes a Reconfigure Accept option if is willing to -# accept Reconfigure messages from the server. -# Le cas du send and reply est assez particulier car suivant la -# presence d'une option rapid commit dans le solicit, l'attente -# s'arrete au premier message de reponse recu ou alors apres un -# timeout. De la meme maniere, si un message Advertise arrive avec une -# valeur de preference de 255, il arrete l'attente et envoie une -# Request. -# - The client announces its intention to use DHCP authentication by -# including an Authentication option in its solicit message. The -# server selects a key for the client based on the client's DUID. The -# client and server use that key to authenticate all DHCP messages -# exchanged during the session - -class DHCP6_Solicit(DHCP6): - name = "DHCPv6 Solicit Message" - msgtype = 1 - overload_fields = { UDP: {"sport": 546, "dport": 547} } - -##################################################################### -# Advertise Message -# - sent by server -# - Includes a server identifier option -# - Includes a client identifier option -# - the client identifier option must match the client's DUID -# - transaction ID must match - -class DHCP6_Advertise(DHCP6): - name = "DHCPv6 Advertise Message" - msgtype = 2 - overload_fields = { UDP: {"sport": 547, "dport": 546} } - - def answers(self, other): - return (isinstance(other,DHCP6_Solicit) and - other.msgtype == 1 and - self.trid == other.trid) - -##################################################################### -# Request Message -# - sent by clients -# - includes a server identifier option -# - the content of Server Identifier option must match server's DUID -# - includes a client identifier option -# - must include an ORO Option (even with hints) p40 -# - can includes a reconfigure Accept option indicating whether or -# not the client is willing to accept Reconfigure messages from -# the server (p40) -# - When the server receives a Request message via unicast from a -# client to which the server has not sent a unicast option, the server -# discards the Request message and responds with a Reply message -# containinig Status Code option with the value UseMulticast, a Server -# Identifier Option containing the server's DUID, the client -# Identifier option from the client message and no other option. - -class DHCP6_Request(DHCP6): - name = "DHCPv6 Request Message" - msgtype = 3 - -##################################################################### -# Confirm Message -# - sent by clients -# - must include a clien identifier option -# - When the server receives a Confirm Message, the server determines -# whether the addresses in the Confirm message are appropriate for the -# link to which the client is attached. cf p50 - -class DHCP6_Confirm(DHCP6): - name = "DHCPv6 Confirm Message" - msgtype = 4 - -##################################################################### -# Renew Message -# - sent by clients -# - must include a server identifier option -# - content of server identifier option must match the server's identifier -# - must include a client identifier option -# - the clients includes any IA assigned to the interface that may -# have moved to a new link, along with the addresses associated with -# those IAs in its confirm messages -# - When the server receives a Renew message that contains an IA -# option from a client, it locates the client's binding and verifies -# that the information in the IA from the client matches the -# information for that client. If the server cannot find a client -# entry for the IA the server returns the IA containing no addresses -# with a status code option est to NoBinding in the Reply message. cf -# p51 pour le reste. - -class DHCP6_Renew(DHCP6): - name = "DHCPv6 Renew Message" - msgtype = 5 - -##################################################################### -# Rebind Message -# - sent by clients -# - must include a client identifier option -# cf p52 - -class DHCP6_Rebind(DHCP6): - name = "DHCPv6 Rebind Message" - msgtype = 6 - -##################################################################### -# Reply Message -# - sent by servers -# - the message must include a server identifier option -# - transaction-id field must match the value of original message -# The server includes a Rapid Commit option in the Reply message to -# indicate that the reply is in response to a solicit message -# - if the client receives a reply message with a Status code option -# with the value UseMulticast, the client records the receipt of the -# message and sends subsequent messages to the server through the -# interface on which the message was received using multicast. The -# client resends the original message using multicast -# - When the client receives a NotOnLink status from the server in -# response to a Confirm message, the client performs DHCP server -# solicitation as described in section 17 and client-initiated -# configuration as descrribed in section 18 (RFC 3315) -# - when the client receives a NotOnLink status from the server in -# response to a Request, the client can either re-issue the Request -# without specifying any addresses or restart the DHCP server -# discovery process. -# - the server must include a server identifier option containing the -# server's DUID in the Reply message - -class DHCP6_Reply(DHCP6): - name = "DHCPv6 Reply Message" - msgtype = 7 - - overload_fields = { UDP: {"sport": 547, "dport": 546} } - - def answers(self, other): - - types = (DHCP6_InfoRequest, DHCP6_Confirm, DHCP6_Rebind, DHCP6_Decline, DHCP6_Request, DHCP6_Release, DHCP6_Renew) - - return (isinstance(other, types) and - self.trid == other.trid) - -##################################################################### -# Release Message -# - sent by clients -# - must include a server identifier option -# cf p53 - -class DHCP6_Release(DHCP6): - name = "DHCPv6 Release Message" - msgtype = 8 - -##################################################################### -# Decline Message -# - sent by clients -# - must include a client identifier option -# - Server identifier option must match server identifier -# - The addresses to be declined must be included in the IAs. Any -# addresses for the IAs the client wishes to continue to use should -# not be in added to the IAs. -# - cf p54 - -class DHCP6_Decline(DHCP6): - name = "DHCPv6 Decline Message" - msgtype = 9 - -##################################################################### -# Reconfigure Message -# - sent by servers -# - must be unicast to the client -# - must include a server identifier option -# - must include a client identifier option that contains the client DUID -# - must contain a Reconfigure Message Option and the message type -# must be a valid value -# - the server sets the transaction-id to 0 -# - The server must use DHCP Authentication in the Reconfigure -# message. Autant dire que ca va pas etre le type de message qu'on va -# voir le plus souvent. - -class DHCP6_Reconf(DHCP6): - name = "DHCPv6 Reconfigure Message" - msgtype = 10 - overload_fields = { UDP: { "sport": 547, "dport": 546 } } - - -##################################################################### -# Information-Request Message -# - sent by clients when needs configuration information but no -# addresses. -# - client should include a client identifier option to identify -# itself. If it doesn't the server is not able to return client -# specific options or the server can choose to not respond to the -# message at all. The client must include a client identifier option -# if the message will be authenticated. -# - client must include an ORO of option she's interested in receiving -# (can include hints) - -class DHCP6_InfoRequest(DHCP6): - name = "DHCPv6 Information Request Message" - msgtype = 11 - -##################################################################### -# sent between Relay Agents and Servers -# -# Normalement, doit inclure une option "Relay Message Option" -# peut en inclure d'autres. -# voir section 7.1 de la 3315 - -# Relay-Forward Message -# - sent by relay agents to servers -# If the relay agent relays messages to the All_DHCP_Servers multicast -# address or other multicast addresses, it sets the Hop Limit field to -# 32. - -class DHCP6_RelayForward(_DHCP6GuessPayload,Packet): - name = "DHCPv6 Relay Forward Message (Relay Agent/Server Message)" - fields_desc = [ ByteEnumField("msgtype", 12, dhcp6types), - ByteField("hopcount", None), - IP6Field("linkaddr", "::"), - IP6Field("peeraddr", "::") ] - def hashret(self): # we filter on peer address field - return inet_pton(socket.AF_INET6, self.peeraddr) - -##################################################################### -# sent between Relay Agents and Servers -# Normalement, doit inclure une option "Relay Message Option" -# peut en inclure d'autres. -# Les valeurs des champs hop-count, link-addr et peer-addr -# sont copiees du messsage Forward associe. POur le suivi de session. -# Pour le moment, comme decrit dans le commentaire, le hashret -# se limite au contenu du champ peer address. -# Voir section 7.2 de la 3315. - -# Relay-Reply Message -# - sent by servers to relay agents -# - if the solicit message was received in a Relay-Forward message, -# the server constructs a relay-reply message with the Advertise -# message in the payload of a relay-message. cf page 37/101. Envoie de -# ce message en unicast au relay-agent. utilisation de l'adresse ip -# presente en ip source du paquet recu - -class DHCP6_RelayReply(DHCP6_RelayForward): - name = "DHCPv6 Relay Reply Message (Relay Agent/Server Message)" - msgtype = 13 - def hashret(self): # We filter on peer address field. - return inet_pton(socket.AF_INET6, self.peeraddr) - def answers(self, other): - return (isinstance(other, DHCP6_RelayForward) and - self.hopcount == other.hopcount and - self.linkaddr == other.linkaddr and - self.peeraddr == other.peeraddr ) - - -dhcp6_cls_by_type = { 1: "DHCP6_Solicit", - 2: "DHCP6_Advertise", - 3: "DHCP6_Request", - 4: "DHCP6_Confirm", - 5: "DHCP6_Renew", - 6: "DHCP6_Rebind", - 7: "DHCP6_Reply", - 8: "DHCP6_Release", - 9: "DHCP6_Decline", - 10: "DHCP6_Reconf", - 11: "DHCP6_InfoRequest", - 12: "DHCP6_RelayForward", - 13: "DHCP6_RelayReply" } - -def _dhcp6_dispatcher(x, *args, **kargs): - cls = conf.raw_layer - if len(x) >= 2: - cls = get_cls(dhcp6_cls_by_type.get(ord(x[0]), "Raw"), conf.raw_layer) - return cls(x, *args, **kargs) - -bind_bottom_up(UDP, _dhcp6_dispatcher, { "dport": 547 } ) -bind_bottom_up(UDP, _dhcp6_dispatcher, { "dport": 546 } ) - - - -class DHCPv6_am(AnsweringMachine): - function_name = "dhcp6d" - filter = "udp and port 546 and port 547" - send_function = staticmethod(send) - def usage(self): - msg = """ -dhcp6d( dns="2001:500::1035", domain="localdomain, local", duid=None) - iface=conf.iface6, advpref=255, sntpservers=None, - sipdomains=None, sipservers=None, - nisdomain=None, nisservers=None, - nispdomain=None, nispservers=None, - bcmcsdomain=None, bcmcsservers=None) - - debug : When set, additional debugging information is printed. - - duid : some DUID class (DUID_LLT, DUID_LL or DUID_EN). If none - is provided a DUID_LLT is constructed based on the MAC - address of the sending interface and launch time of dhcp6d - answering machine. - - iface : the interface to listen/reply on if you do not want to use - conf.iface6. - - advpref : Value in [0,255] given to Advertise preference field. - By default, 255 is used. Be aware that this specific - value makes clients stops waiting for further Advertise - messages from other servers. - - dns : list of recursive DNS servers addresses (as a string or list). - By default, it is set empty and the associated DHCP6OptDNSServers - option is inactive. See RFC 3646 for details. - domain : a list of DNS search domain (as a string or list). By default, - it is empty and the associated DHCP6OptDomains option is inactive. - See RFC 3646 for details. - - sntpservers : a list of SNTP servers IPv6 addresses. By default, - it is empty and the associated DHCP6OptSNTPServers option - is inactive. - - sipdomains : a list of SIP domains. By default, it is empty and the - associated DHCP6OptSIPDomains option is inactive. See RFC 3319 - for details. - sipservers : a list of SIP servers IPv6 addresses. By default, it is - empty and the associated DHCP6OptSIPDomains option is inactive. - See RFC 3319 for details. - - nisdomain : a list of NIS domains. By default, it is empty and the - associated DHCP6OptNISDomains option is inactive. See RFC 3898 - for details. See RFC 3646 for details. - nisservers : a list of NIS servers IPv6 addresses. By default, it is - empty and the associated DHCP6OptNISServers option is inactive. - See RFC 3646 for details. - - nispdomain : a list of NIS+ domains. By default, it is empty and the - associated DHCP6OptNISPDomains option is inactive. See RFC 3898 - for details. - nispservers : a list of NIS+ servers IPv6 addresses. By default, it is - empty and the associated DHCP6OptNISServers option is inactive. - See RFC 3898 for details. - - bcmcsdomain : a list of BCMCS domains. By default, it is empty and the - associated DHCP6OptBCMCSDomains option is inactive. See RFC 4280 - for details. - bcmcsservers : a list of BCMCS servers IPv6 addresses. By default, it is - empty and the associated DHCP6OptBCMCSServers option is inactive. - See RFC 4280 for details. - - If you have a need for others, just ask ... or provide a patch.""" - print msg - - def parse_options(self, dns="2001:500::1035", domain="localdomain, local", - startip="2001:db8::1", endip="2001:db8::20", duid=None, - sntpservers=None, sipdomains=None, sipservers=None, - nisdomain=None, nisservers=None, nispdomain=None, - nispservers=None, bcmcsservers=None, bcmcsdomains=None, - iface=None, debug=0, advpref=255): - def norm_list(val, param_name): - if val is None: - return None - if type(val) is list: - return val - elif type(val) is str: - l = val.split(',') - return map(lambda x: x.strip(), l) - else: - print "Bad '%s' parameter provided." % param_name - self.usage() - return -1 - - if iface is None: - iface = conf.iface6 - - self.debug = debug - - # Dictionary of provided DHCPv6 options, keyed by option type - self.dhcpv6_options={} - - for o in [(dns, "dns", 23, lambda x: DHCP6OptDNSServers(dnsservers=x)), - (domain, "domain", 24, lambda x: DHCP6OptDNSDomains(dnsdomains=x)), - (sntpservers, "sntpservers", 31, lambda x: DHCP6OptSNTPServers(sntpservers=x)), - (sipservers, "sipservers", 22, lambda x: DHCP6OptSIPServers(sipservers=x)), - (sipdomains, "sipdomains", 21, lambda x: DHCP6OptSIPDomains(sipdomains=x)), - (nisservers, "nisservers", 27, lambda x: DHCP6OptNISServers(nisservers=x)), - (nisdomain, "nisdomain", 29, lambda x: DHCP6OptNISDomain(nisdomain=(x+[""])[0])), - (nispservers, "nispservers", 28, lambda x: DHCP6OptNISPServers(nispservers=x)), - (nispdomain, "nispdomain", 30, lambda x: DHCP6OptNISPDomain(nispdomain=(x+[""])[0])), - (bcmcsservers, "bcmcsservers", 33, lambda x: DHCP6OptBCMCSServers(bcmcsservers=x)), - (bcmcsdomains, "bcmcsdomains", 34, lambda x: DHCP6OptBCMCSDomains(bcmcsdomains=x))]: - - opt = norm_list(o[0], o[1]) - if opt == -1: # Usage() was triggered - return False - elif opt is None: # We won't return that option - pass - else: - self.dhcpv6_options[o[2]] = o[3](opt) - - if self.debug: - print "\n[+] List of active DHCPv6 options:" - opts = self.dhcpv6_options.keys() - opts.sort() - for i in opts: - print " %d: %s" % (i, repr(self.dhcpv6_options[i])) - - # Preference value used in Advertise. - self.advpref = advpref - - # IP Pool - self.startip = startip - self.endip = endip - # XXX TODO Check IPs are in same subnet - - #### - # The interface we are listening/replying on - self.iface = iface - - #### - # Generate a server DUID - if duid is not None: - self.duid = duid - else: - # Timeval - from time import gmtime, strftime, mktime - epoch = (2000, 1, 1, 0, 0, 0, 5, 1, 0) - delta = mktime(epoch) - mktime(gmtime(0)) - timeval = time.time() - delta - - # Mac Address - rawmac = get_if_raw_hwaddr(iface)[1] - mac = ":".join(map(lambda x: "%.02x" % ord(x), list(rawmac))) - - self.duid = DUID_LLT(timeval = timeval, lladdr = mac) - - if self.debug: - print "\n[+] Our server DUID:" - self.duid.show(label_lvl=" "*4) - - #### - # Find the source address we will use - l = filter(lambda x: x[2] == iface and in6_islladdr(x[0]), - in6_getifaddr()) - if not l: - warning("Unable to get a Link-Local address") - return - - self.src_addr = l[0][0] - - #### - # Our leases - self.leases = {} - - - if self.debug: - print "\n[+] Starting DHCPv6 service on %s:" % self.iface - - def is_request(self, p): - if not IPv6 in p: - return False - - src = p[IPv6].src - dst = p[IPv6].dst - - p = p[IPv6].payload - if not isinstance(p, UDP) or p.sport != 546 or p.dport != 547 : - return False - - p = p.payload - if not isinstance(p, DHCP6): - return False - - # Message we considered client messages : - # Solicit (1), Request (3), Confirm (4), Renew (5), Rebind (6) - # Decline (9), Release (8), Information-request (11), - if not (p.msgtype in [1, 3, 4, 5, 6, 8, 9, 11]): - return False - - # Message validation following section 15 of RFC 3315 - - if ((p.msgtype == 1) or # Solicit - (p.msgtype == 6) or # Rebind - (p.msgtype == 4)): # Confirm - if ((not DHCP6OptClientId in p) or - DHCP6OptServerId in p): - return False - - if (p.msgtype == 6 or # Rebind - p.msgtype == 4): # Confirm - # XXX We do not reply to Confirm or Rebind as we - # XXX do not support address assignment - return False - - elif (p.msgtype == 3 or # Request - p.msgtype == 5 or # Renew - p.msgtype == 8): # Release - - # Both options must be present - if ((not DHCP6OptServerId in p) or - (not DHCP6OptClientId in p)): - return False - # provided server DUID must match ours - duid = p[DHCP6OptServerId].duid - if (type(duid) != type(self.duid)): - return False - if str(duid) != str(self.duid): - return False - - if (p.msgtype == 5 or # Renew - p.msgtype == 8): # Release - # XXX We do not reply to Renew or Release as we - # XXX do not support address assignment - return False - - elif p.msgtype == 9: # Decline - # XXX We should check if we are tracking that client - if not self.debug: - return False - - bo = Color.bold - g = Color.green + bo - b = Color.blue + bo - n = Color.normal - r = Color.red - - vendor = in6_addrtovendor(src) - if (vendor and vendor != "UNKNOWN"): - vendor = " [" + b + vendor + n + "]" - else: - vendor = "" - src = bo + src + n - - it = p - addrs = [] - while it: - l = [] - if isinstance(it, DHCP6OptIA_NA): - l = it.ianaopts - elif isinstance(it, DHCP6OptIA_TA): - l = it.iataopts - - opsaddr = filter(lambda x: isinstance(x, DHCP6OptIAAddress),l) - a=map(lambda x: x.addr, opsaddr) - addrs += a - it = it.payload - - addrs = map(lambda x: bo + x + n, addrs) - if debug: - msg = r + "[DEBUG]" + n + " Received " + g + "Decline" + n - msg += " from " + bo + src + vendor + " for " - msg += ", ".join(addrs)+ n - print msg - - # See sect 18.1.7 - - # Sent by a client to warn us she has determined - # one or more addresses assigned to her is already - # used on the link. - # We should simply log that fact. No messaged should - # be sent in return. - - # - Message must include a Server identifier option - # - the content of the Server identifier option must - # match the server's identifier - # - the message must include a Client Identifier option - return False - - elif p.msgtype == 11: # Information-Request - if DHCP6OptServerId in p: - duid = p[DHCP6OptServerId].duid - if (type(duid) != type(self.duid)): - return False - if str(duid) != str(self.duid): - return False - if ((DHCP6OptIA_NA in p) or - (DHCP6OptIA_TA in p) or - (DHCP6OptIA_PD in p)): - return False - else: - return False - - return True - - def print_reply(self, req, reply): - def norm(s): - if s.startswith("DHCPv6 "): - s = s[7:] - if s.endswith(" Message"): - s = s[:-8] - return s - - if reply is None: - return - - bo = Color.bold - g = Color.green + bo - b = Color.blue + bo - n = Color.normal - reqtype = g + norm(req.getlayer(UDP).payload.name) + n - reqsrc = req.getlayer(IPv6).src - vendor = in6_addrtovendor(reqsrc) - if (vendor and vendor != "UNKNOWN"): - vendor = " [" + b + vendor + n + "]" - else: - vendor = "" - reqsrc = bo + reqsrc + n - reptype = g + norm(reply.getlayer(UDP).payload.name) + n - - print "Sent %s answering to %s from %s%s" % (reptype, reqtype, reqsrc, vendor) - - def make_reply(self, req): - req_mac_src = req.src - req_mac_dst = req.dst - - p = req[IPv6] - req_src = p.src - req_dst = p.dst - - p = p.payload.payload - - msgtype = p.msgtype - trid = p.trid - - if msgtype == 1: # SOLICIT (See Sect 17.1 and 17.2 of RFC 3315) - - # XXX We don't support address or prefix assignment - # XXX We also do not support relay function --arno - - client_duid = p[DHCP6OptClientId].duid - resp = IPv6(src=self.src_addr, dst=req_src) - resp /= UDP(sport=547, dport=546) - - if p.haslayer(DHCP6OptRapidCommit): - # construct a Reply packet - resp /= DHCP6_Reply(trid=trid) - resp /= DHCP6OptRapidCommit() # See 17.1.2 - resp /= DHCP6OptServerId(duid = self.duid) - resp /= DHCP6OptClientId(duid = client_duid) - - else: # No Rapid Commit in the packet. Reply with an Advertise - - if (p.haslayer(DHCP6OptIA_NA) or - p.haslayer(DHCP6OptIA_TA)): - # XXX We don't assign addresses at the moment - msg = "Scapy6 dhcp6d does not support address assignment" - resp /= DHCP6_Advertise(trid = trid) - resp /= DHCP6OptStatusCode(statuscode=2, statusmsg=msg) - resp /= DHCP6OptServerId(duid = self.duid) - resp /= DHCP6OptClientId(duid = client_duid) - - elif p.haslayer(DHCP6OptIA_PD): - # XXX We don't assign prefixes at the moment - msg = "Scapy6 dhcp6d does not support prefix assignment" - resp /= DHCP6_Advertise(trid = trid) - resp /= DHCP6OptStatusCode(statuscode=6, statusmsg=msg) - resp /= DHCP6OptServerId(duid = self.duid) - resp /= DHCP6OptClientId(duid = client_duid) - - else: # Usual case, no request for prefixes or addresse - resp /= DHCP6_Advertise(trid = trid) - resp /= DHCP6OptPref(prefval = self.advpref) - resp /= DHCP6OptServerId(duid = self.duid) - resp /= DHCP6OptClientId(duid = client_duid) - resp /= DHCP6OptReconfAccept() - - # See which options should be included - reqopts = [] - if p.haslayer(DHCP6OptOptReq): # add only asked ones - reqopts = p[DHCP6OptOptReq].reqopts - for o in self.dhcpv6_options.keys(): - if o in reqopts: - resp /= self.dhcpv6_options[o] - else: # advertise everything we have available - for o in self.dhcpv6_options.keys(): - resp /= self.dhcpv6_options[o] - - return resp - - elif msgtype == 3: #REQUEST (INFO-REQUEST is further below) - client_duid = p[DHCP6OptClientId].duid - resp = IPv6(src=self.src_addr, dst=req_src) - resp /= UDP(sport=547, dport=546) - resp /= DHCP6_Solicit(trid=trid) - resp /= DHCP6OptServerId(duid = self.duid) - resp /= DHCP6OptClientId(duid = client_duid) - - # See which options should be included - reqopts = [] - if p.haslayer(DHCP6OptOptReq): # add only asked ones - reqopts = p[DHCP6OptOptReq].reqopts - for o in self.dhcpv6_options.keys(): - if o in reqopts: - resp /= self.dhcpv6_options[o] - else: - # advertise everything we have available. - # Should not happen has clients MUST include - # and ORO in requests (sec 18.1.1) -- arno - for o in self.dhcpv6_options.keys(): - resp /= self.dhcpv6_options[o] - - return resp - - elif msgtype == 4: # CONFIRM - # see Sect 18.1.2 - - # Client want to check if addresses it was assigned - # are still appropriate - - # Server must discard any Confirm messages that - # do not include a Client Identifier option OR - # THAT DO INCLUDE a Server Identifier Option - - # XXX we must discard the SOLICIT if it is received with - # a unicast destination address - - pass - - elif msgtype == 5: # RENEW - # see Sect 18.1.3 - - # Clients want to extend lifetime of assigned addresses - # and update configuration parameters. This message is sent - # specifically to the server that provided her the info - - # - Received message must include a Server Identifier - # option. - # - the content of server identifier option must match - # the server's identifier. - # - the message must include a Client identifier option - - pass - - elif msgtype == 6: # REBIND - # see Sect 18.1.4 - - # Same purpose as the Renew message but sent to any - # available server after he received no response - # to its previous Renew message. - - - # - Message must include a Client Identifier Option - # - Message can't include a Server identifier option - - # XXX we must discard the SOLICIT if it is received with - # a unicast destination address - - pass - - elif msgtype == 8: # RELEASE - # See section 18.1.6 - - # Message is sent to the server to indicate that - # she will no longer use the addresses that was assigned - # We should parse the message and verify our dictionary - # to log that fact. - - - # - The message must include a server identifier option - # - The content of the Server Identifier option must - # match the server's identifier - # - the message must include a Client Identifier option - - pass - - elif msgtype == 9: # DECLINE - # See section 18.1.7 - pass - - elif msgtype == 11: # INFO-REQUEST - client_duid = None - if not p.haslayer(DHCP6OptClientId): - if self.debug: - warning("Received Info Request message without Client Id option") - else: - client_duid = p[DHCP6OptClientId].duid - - resp = IPv6(src=self.src_addr, dst=req_src) - resp /= UDP(sport=547, dport=546) - resp /= DHCP6_Reply(trid=trid) - resp /= DHCP6OptServerId(duid = self.duid) - - if client_duid: - resp /= DHCP6OptClientId(duid = client_duid) - - # Stack requested options if available - reqopts = [] - if p.haslayer(DHCP6OptOptReq): - reqopts = p[DHCP6OptOptReq].reqopts - for o in self.dhcpv6_options.keys(): - resp /= self.dhcpv6_options[o] - - return resp - - else: - # what else ? - pass - - # - We won't support reemission - # - We won't support relay role, nor relay forwarded messages - # at the beginning diff --git a/scripts/external_libs/scapy-2.3.1/scapy/layers/dns.py b/scripts/external_libs/scapy-2.3.1/scapy/layers/dns.py deleted file mode 100644 index 533db6c2..00000000 --- a/scripts/external_libs/scapy-2.3.1/scapy/layers/dns.py +++ /dev/null @@ -1,690 +0,0 @@ -## This file is part of Scapy -## See http://www.secdev.org/projects/scapy for more informations -## Copyright (C) Philippe Biondi <phil@secdev.org> -## This program is published under a GPLv2 license - -""" -DNS: Domain Name System. -""" - -import socket,struct - -from scapy.packet import * -from scapy.fields import * -from scapy.ansmachine import * -from scapy.layers.inet import IP, UDP - -class DNSStrField(StrField): - - def h2i(self, pkt, x): - if x == "": - return "." - return x - - def i2m(self, pkt, x): - if x == ".": - return "\x00" - - x = [k[:63] for k in x.split(".")] # Truncate chunks that cannot be encoded (more than 63 bytes..) - x = map(lambda y: chr(len(y))+y, x) - x = "".join(x) - if x[-1] != "\x00": - x += "\x00" - return x - - def getfield(self, pkt, s): - n = "" - - if ord(s[0]) == 0: - return s[1:], "." - - while 1: - l = ord(s[0]) - s = s[1:] - if not l: - break - if l & 0xc0: - raise Scapy_Exception("DNS message can't be compressed at this point!") - else: - n += s[:l]+"." - s = s[l:] - return s, n - - -class DNSRRCountField(ShortField): - holds_packets=1 - def __init__(self, name, default, rr): - ShortField.__init__(self, name, default) - self.rr = rr - def _countRR(self, pkt): - x = getattr(pkt,self.rr) - i = 0 - while isinstance(x, DNSRR) or isinstance(x, DNSQR) or isdnssecRR(x): - x = x.payload - i += 1 - return i - - def i2m(self, pkt, x): - if x is None: - x = self._countRR(pkt) - return x - def i2h(self, pkt, x): - if x is None: - x = self._countRR(pkt) - return x - - -def DNSgetstr(s,p): - name = "" - q = 0 - jpath = [p] - while 1: - if p >= len(s): - warning("DNS RR prematured end (ofs=%i, len=%i)"%(p,len(s))) - break - l = ord(s[p]) - p += 1 - if l & 0xc0: - if not q: - q = p+1 - if p >= len(s): - warning("DNS incomplete jump token at (ofs=%i)" % p) - break - p = ((l & 0x3f) << 8) + ord(s[p]) - 12 - if p in jpath: - warning("DNS decompression loop detected") - break - jpath.append(p) - continue - elif l > 0: - name += s[p:p+l]+"." - p += l - continue - break - if q: - p = q - return name,p - - -class DNSRRField(StrField): - holds_packets=1 - def __init__(self, name, countfld, passon=1): - StrField.__init__(self, name, None) - self.countfld = countfld - self.passon = passon - def i2m(self, pkt, x): - if x is None: - return "" - return str(x) - def decodeRR(self, name, s, p): - ret = s[p:p+10] - type,cls,ttl,rdlen = struct.unpack("!HHIH", ret) - p += 10 - rr = DNSRR("\x00"+ret+s[p:p+rdlen]) - if type in [2, 3, 4, 5]: - rr.rdata = DNSgetstr(s,p)[0] - del(rr.rdlen) - elif type in dnsRRdispatcher.keys(): - rr = dnsRRdispatcher[type]("\x00"+ret+s[p:p+rdlen]) - else: - del(rr.rdlen) - - p += rdlen - - rr.rrname = name - return rr,p - def getfield(self, pkt, s): - if type(s) is tuple : - s,p = s - else: - p = 0 - ret = None - c = getattr(pkt, self.countfld) - if c > len(s): - warning("wrong value: DNS.%s=%i" % (self.countfld,c)) - return s,"" - while c: - c -= 1 - name,p = DNSgetstr(s,p) - rr,p = self.decodeRR(name, s, p) - if ret is None: - ret = rr - else: - ret.add_payload(rr) - if self.passon: - return (s,p),ret - else: - return s[p:],ret - - -class DNSQRField(DNSRRField): - holds_packets=1 - def decodeRR(self, name, s, p): - ret = s[p:p+4] - p += 4 - rr = DNSQR("\x00"+ret) - rr.qname = name - return rr,p - - - -class RDataField(StrLenField): - def m2i(self, pkt, s): - family = None - if pkt.type == 1: # A - family = socket.AF_INET - elif pkt.type == 12: # PTR - s = DNSgetstr(s, 0)[0] - elif pkt.type == 16: # TXT - ret_s = "" - tmp_s = s - # RDATA contains a list of strings, each are prepended with - # a byte containing the size of the following string. - while tmp_s: - tmp_len = struct.unpack("!B", tmp_s[0])[0] + 1 - if tmp_len > len(tmp_s): - warning("DNS RR TXT prematured end of character-string (size=%i, remaining bytes=%i)" % (tmp_len, len(tmp_s))) - ret_s += tmp_s[1:tmp_len] - tmp_s = tmp_s[tmp_len:] - s = ret_s - elif pkt.type == 28: # AAAA - family = socket.AF_INET6 - if family is not None: - s = inet_ntop(family, s) - return s - def i2m(self, pkt, s): - if pkt.type == 1: # A - if s: - s = inet_aton(s) - elif pkt.type in [2,3,4,5]: # NS, MD, MF, CNAME - s = "".join(map(lambda x: chr(len(x))+x, s.split("."))) - if ord(s[-1]): - s += "\x00" - elif pkt.type == 16: # TXT - if s: - ret_s = "" - # The initial string must be splitted into a list of strings - # prepended with theirs sizes. - while len(s) >= 255: - ret_s += "\xff" + s[:255] - s = s[255:] - # The remaining string is less than 255 bytes long - if len(s): - ret_s += struct.pack("!B", len(s)) + s - s = ret_s - elif pkt.type == 28: # AAAA - if s: - s = inet_pton(socket.AF_INET6, s) - return s - -class RDLenField(Field): - def __init__(self, name): - Field.__init__(self, name, None, "H") - def i2m(self, pkt, x): - if x is None: - rdataf = pkt.get_field("rdata") - x = len(rdataf.i2m(pkt, pkt.rdata)) - return x - def i2h(self, pkt, x): - if x is None: - rdataf = pkt.get_field("rdata") - x = len(rdataf.i2m(pkt, pkt.rdata)) - return x - - -class DNS(Packet): - name = "DNS" - fields_desc = [ ShortField("id", 0), - BitField("qr", 0, 1), - BitEnumField("opcode", 0, 4, {0:"QUERY",1:"IQUERY",2:"STATUS"}), - BitField("aa", 0, 1), - BitField("tc", 0, 1), - BitField("rd", 0, 1), - BitField("ra", 0, 1), - BitField("z", 0, 1), - # AD and CD bits are defined in RFC 2535 - BitField("ad", 0, 1), # Authentic Data - BitField("cd", 0, 1), # Checking Disabled - BitEnumField("rcode", 0, 4, {0:"ok", 1:"format-error", 2:"server-failure", 3:"name-error", 4:"not-implemented", 5:"refused"}), - DNSRRCountField("qdcount", None, "qd"), - DNSRRCountField("ancount", None, "an"), - DNSRRCountField("nscount", None, "ns"), - DNSRRCountField("arcount", None, "ar"), - DNSQRField("qd", "qdcount"), - DNSRRField("an", "ancount"), - DNSRRField("ns", "nscount"), - DNSRRField("ar", "arcount",0) ] - def answers(self, other): - return (isinstance(other, DNS) - and self.id == other.id - and self.qr == 1 - and other.qr == 0) - - def mysummary(self): - type = ["Qry","Ans"][self.qr] - name = "" - if self.qr: - type = "Ans" - if self.ancount > 0 and isinstance(self.an, DNSRR): - name = ' "%s"' % self.an.rdata - else: - type = "Qry" - if self.qdcount > 0 and isinstance(self.qd, DNSQR): - name = ' "%s"' % self.qd.qname - return 'DNS %s%s ' % (type, name) - -dnstypes = { 0:"ANY", 255:"ALL", - 1:"A", 2:"NS", 3:"MD", 4:"MF", 5:"CNAME", 6:"SOA", 7: "MB", 8:"MG", - 9:"MR",10:"NULL",11:"WKS",12:"PTR",13:"HINFO",14:"MINFO",15:"MX",16:"TXT", - 17:"RP",18:"AFSDB",28:"AAAA", 33:"SRV",38:"A6",39:"DNAME", - 41:"OPT", 43:"DS", 46:"RRSIG", 47:"NSEC", 48:"DNSKEY", - 50: "NSEC3", 51: "NSEC3PARAM", 32769:"DLV" } - -dnsqtypes = {251:"IXFR",252:"AXFR",253:"MAILB",254:"MAILA",255:"ALL"} -dnsqtypes.update(dnstypes) -dnsclasses = {1: 'IN', 2: 'CS', 3: 'CH', 4: 'HS', 255: 'ANY'} - - -class DNSQR(Packet): - name = "DNS Question Record" - show_indent=0 - fields_desc = [ DNSStrField("qname",""), - ShortEnumField("qtype", 1, dnsqtypes), - ShortEnumField("qclass", 1, dnsclasses) ] - - - -# RFC 2671 - Extension Mechanisms for DNS (EDNS0) - -class EDNS0TLV(Packet): - name = "DNS EDNS0 TLV" - fields_desc = [ ShortEnumField("optcode", 0, { 0: "Reserved", 1: "LLQ", 2: "UL", 3: "NSID", 4: "Reserved", 5: "PING" }), - FieldLenField("optlen", None, "optdata", fmt="H"), - StrLenField("optdata", "", length_from=lambda pkt: pkt.optlen) ] - - def extract_padding(self, p): - return "", p - -class DNSRROPT(Packet): - name = "DNS OPT Resource Record" - fields_desc = [ DNSStrField("rrname",""), - ShortEnumField("type", 41, dnstypes), - ShortField("rclass", 4096), - ByteField("extrcode", 0), - ByteField("version", 0), - # version 0 means EDNS0 - BitEnumField("z", 32768, 16, { 32768: "D0" }), - # D0 means DNSSEC OK from RFC 3225 - FieldLenField("rdlen", None, length_of="rdata", fmt="H"), - PacketListField("rdata", [], EDNS0TLV, length_from=lambda pkt: pkt.rdlen) ] - -# RFC 4034 - Resource Records for the DNS Security Extensions - -# 09/2013 from http://www.iana.org/assignments/dns-sec-alg-numbers/dns-sec-alg-numbers.xhtml -dnssecalgotypes = { 0:"Reserved", 1:"RSA/MD5", 2:"Diffie-Hellman", 3:"DSA/SHA-1", - 4:"Reserved", 5:"RSA/SHA-1", 6:"DSA-NSEC3-SHA1", - 7:"RSASHA1-NSEC3-SHA1", 8:"RSA/SHA-256", 9:"Reserved", - 10:"RSA/SHA-512", 11:"Reserved", 12:"GOST R 34.10-2001", - 13:"ECDSA Curve P-256 with SHA-256", 14: "ECDSA Curve P-384 with SHA-384", - 252:"Reserved for Indirect Keys", 253:"Private algorithms - domain name", - 254:"Private algorithms - OID", 255:"Reserved" } - -# 09/2013 from http://www.iana.org/assignments/ds-rr-types/ds-rr-types.xhtml -dnssecdigesttypes = { 0:"Reserved", 1:"SHA-1", 2:"SHA-256", 3:"GOST R 34.11-94", 4:"SHA-384" } - - -class TimeField(IntField): - - def any2i(self, pkt, x): - if type(x) == str: - import time, calendar - t = time.strptime(x, "%Y%m%d%H%M%S") - return int(calendar.timegm(t)) - return x - - def i2repr(self, pkt, x): - import time - x = self.i2h(pkt, x) - t = time.strftime("%Y%m%d%H%M%S", time.gmtime(x)) - return "%s (%d)" % (t ,x) - - -def bitmap2RRlist(bitmap): - """ - Decode the 'Type Bit Maps' field of the NSEC Resource Record into an - integer list. - """ - # RFC 4034, 4.1.2. The Type Bit Maps Field - - RRlist = [] - - while bitmap: - - if len(bitmap) < 2: - warning("bitmap too short (%i)" % len(bitmap)) - return - - window_block = ord(bitmap[0]) # window number - offset = 256*window_block # offset of the Ressource Record - bitmap_len = ord(bitmap[1]) # length of the bitmap in bytes - - if bitmap_len <= 0 or bitmap_len > 32: - warning("bitmap length is no valid (%i)" % bitmap_len) - return - - tmp_bitmap = bitmap[2:2+bitmap_len] - - # Let's compare each bit of tmp_bitmap and compute the real RR value - for b in xrange(len(tmp_bitmap)): - v = 128 - for i in xrange(8): - if ord(tmp_bitmap[b]) & v: - # each of the RR is encoded as a bit - RRlist += [ offset + b*8 + i ] - v = v >> 1 - - # Next block if any - bitmap = bitmap[2+bitmap_len:] - - return RRlist - - -def RRlist2bitmap(lst): - """ - Encode a list of integers representing Resource Records to a bitmap field - used in the NSEC Resource Record. - """ - # RFC 4034, 4.1.2. The Type Bit Maps Field - - import math - - bitmap = "" - lst = list(set(lst)) - lst.sort() - - lst = filter(lambda x: x <= 65535, lst) - lst = map(lambda x: abs(x), lst) - - # number of window blocks - max_window_blocks = int(math.ceil(lst[-1] / 256.)) - min_window_blocks = int(math.floor(lst[0] / 256.)) - if min_window_blocks == max_window_blocks: - max_window_blocks += 1 - - for wb in xrange(min_window_blocks, max_window_blocks+1): - # First, filter out RR not encoded in the current window block - # i.e. keep everything between 256*wb <= 256*(wb+1) - rrlist = filter(lambda x: 256*wb <= x and x < 256*(wb+1), lst) - rrlist.sort() - if rrlist == []: - continue - - # Compute the number of bytes used to store the bitmap - if rrlist[-1] == 0: # only one element in the list - bytes = 1 - else: - max = rrlist[-1] - 256*wb - bytes = int(math.ceil(max / 8)) + 1 # use at least 1 byte - if bytes > 32: # Don't encode more than 256 bits / values - bytes = 32 - - bitmap += struct.pack("B", wb) - bitmap += struct.pack("B", bytes) - - # Generate the bitmap - for tmp in xrange(bytes): - v = 0 - # Remove out of range Ressource Records - tmp_rrlist = filter(lambda x: 256*wb+8*tmp <= x and x < 256*wb+8*tmp+8, rrlist) - if not tmp_rrlist == []: - # 1. rescale to fit into 8 bits - tmp_rrlist = map(lambda x: (x-256*wb)-(tmp*8), tmp_rrlist) - # 2. x gives the bit position ; compute the corresponding value - tmp_rrlist = map(lambda x: 2**(7-x) , tmp_rrlist) - # 3. sum everything - v = reduce(lambda x,y: x+y, tmp_rrlist) - bitmap += struct.pack("B", v) - - return bitmap - - -class RRlistField(StrField): - def h2i(self, pkt, x): - if type(x) == list: - return RRlist2bitmap(x) - return x - - def i2repr(self, pkt, x): - x = self.i2h(pkt, x) - rrlist = bitmap2RRlist(x) - return [ dnstypes.get(rr, rr) for rr in rrlist ] - - -class _DNSRRdummy(Packet): - name = "Dummy class that implements post_build() for Ressource Records" - def post_build(self, pkt, pay): - if not self.rdlen == None: - return pkt - - lrrname = len(self.fields_desc[0].i2m("", self.getfieldval("rrname"))) - l = len(pkt) - lrrname - 10 - pkt = pkt[:lrrname+8] + struct.pack("!H", l) + pkt[lrrname+8+2:] - - return pkt - -class DNSRRSOA(_DNSRRdummy): - name = "DNS SOA Resource Record" - fields_desc = [ DNSStrField("rrname",""), - ShortEnumField("type", 6, dnstypes), - ShortEnumField("rclass", 1, dnsclasses), - IntField("ttl", 0), - ShortField("rdlen", None), - DNSStrField("mname", ""), - DNSStrField("rname", ""), - IntField("serial", 0), - IntField("refresh", 0), - IntField("retry", 0), - IntField("expire", 0), - IntField("minimum", 0) - ] - -class DNSRRRSIG(_DNSRRdummy): - name = "DNS RRSIG Resource Record" - fields_desc = [ DNSStrField("rrname",""), - ShortEnumField("type", 46, dnstypes), - ShortEnumField("rclass", 1, dnsclasses), - IntField("ttl", 0), - ShortField("rdlen", None), - ShortEnumField("typecovered", 1, dnstypes), - ByteEnumField("algorithm", 5, dnssecalgotypes), - ByteField("labels", 0), - IntField("originalttl", 0), - TimeField("expiration", 0), - TimeField("inception", 0), - ShortField("keytag", 0), - DNSStrField("signersname", ""), - StrField("signature", "") - ] - - -class DNSRRNSEC(_DNSRRdummy): - name = "DNS NSEC Resource Record" - fields_desc = [ DNSStrField("rrname",""), - ShortEnumField("type", 47, dnstypes), - ShortEnumField("rclass", 1, dnsclasses), - IntField("ttl", 0), - ShortField("rdlen", None), - DNSStrField("nextname", ""), - RRlistField("typebitmaps", "") - ] - - -class DNSRRDNSKEY(_DNSRRdummy): - name = "DNS DNSKEY Resource Record" - fields_desc = [ DNSStrField("rrname",""), - ShortEnumField("type", 48, dnstypes), - ShortEnumField("rclass", 1, dnsclasses), - IntField("ttl", 0), - ShortField("rdlen", None), - FlagsField("flags", 256, 16, "S???????Z???????"), - # S: Secure Entry Point - # Z: Zone Key - ByteField("protocol", 3), - ByteEnumField("algorithm", 5, dnssecalgotypes), - StrField("publickey", "") - ] - - -class DNSRRDS(_DNSRRdummy): - name = "DNS DS Resource Record" - fields_desc = [ DNSStrField("rrname",""), - ShortEnumField("type", 43, dnstypes), - ShortEnumField("rclass", 1, dnsclasses), - IntField("ttl", 0), - ShortField("rdlen", None), - ShortField("keytag", 0), - ByteEnumField("algorithm", 5, dnssecalgotypes), - ByteEnumField("digesttype", 5, dnssecdigesttypes), - StrField("digest", "") - ] - - -# RFC 5074 - DNSSEC Lookaside Validation (DLV) -class DNSRRDLV(DNSRRDS): - name = "DNS DLV Resource Record" - def __init__(self, *args, **kargs): - DNSRRDS.__init__(self, *args, **kargs) - if not kargs.get('type', 0): - self.type = 32769 - -# RFC 5155 - DNS Security (DNSSEC) Hashed Authenticated Denial of Existence -class DNSRRNSEC3(_DNSRRdummy): - name = "DNS NSEC3 Resource Record" - fields_desc = [ DNSStrField("rrname",""), - ShortEnumField("type", 50, dnstypes), - ShortEnumField("rclass", 1, dnsclasses), - IntField("ttl", 0), - ShortField("rdlen", None), - ByteField("hashalg", 0), - BitEnumField("flags", 0, 8, {1:"Opt-Out"}), - ShortField("iterations", 0), - FieldLenField("saltlength", 0, fmt="!B", length_of="salt"), - StrLenField("salt", "", length_from=lambda x: x.saltlength), - FieldLenField("hashlength", 0, fmt="!B", length_of="nexthashedownername"), - StrLenField("nexthashedownername", "", length_from=lambda x: x.hashlength), - RRlistField("typebitmaps", "") - ] - - -class DNSRRNSEC3PARAM(_DNSRRdummy): - name = "DNS NSEC3PARAM Resource Record" - fields_desc = [ DNSStrField("rrname",""), - ShortEnumField("type", 51, dnstypes), - ShortEnumField("rclass", 1, dnsclasses), - IntField("ttl", 0), - ShortField("rdlen", None), - ByteField("hashalg", 0), - ByteField("flags", 0), - ShortField("iterations", 0), - FieldLenField("saltlength", 0, fmt="!B", length_of="salt"), - StrLenField("salt", "", length_from=lambda pkt: pkt.saltlength) - ] - - -dnssecclasses = [ DNSRROPT, DNSRRRSIG, DNSRRDLV, DNSRRDNSKEY, DNSRRNSEC, DNSRRDS, DNSRRNSEC3, DNSRRNSEC3PARAM ] - -def isdnssecRR(obj): - list = [ isinstance (obj, cls) for cls in dnssecclasses ] - return reduce(lambda x,y: x or y, list) - -dnsRRdispatcher = { #6: DNSRRSOA, - 41: DNSRROPT, # RFC 1671 - 43: DNSRRDS, # RFC 4034 - 46: DNSRRRSIG, # RFC 4034 - 47: DNSRRNSEC, # RFC 4034 - 48: DNSRRDNSKEY, # RFC 4034 - 50: DNSRRNSEC3, # RFC 5155 - 51: DNSRRNSEC3PARAM, # RFC 5155 - 32769: DNSRRDLV # RFC 4431 - } - -class DNSRR(Packet): - name = "DNS Resource Record" - show_indent=0 - fields_desc = [ DNSStrField("rrname",""), - ShortEnumField("type", 1, dnstypes), - ShortEnumField("rclass", 1, dnsclasses), - IntField("ttl", 0), - RDLenField("rdlen"), - RDataField("rdata", "", length_from=lambda pkt:pkt.rdlen) ] - -bind_layers( UDP, DNS, dport=53) -bind_layers( UDP, DNS, sport=53) - - -@conf.commands.register -def dyndns_add(nameserver, name, rdata, type="A", ttl=10): - """Send a DNS add message to a nameserver for "name" to have a new "rdata" -dyndns_add(nameserver, name, rdata, type="A", ttl=10) -> result code (0=ok) - -example: dyndns_add("ns1.toto.com", "dyn.toto.com", "127.0.0.1") -RFC2136 -""" - zone = name[name.find(".")+1:] - r=sr1(IP(dst=nameserver)/UDP()/DNS(opcode=5, - qd=[DNSQR(qname=zone, qtype="SOA")], - ns=[DNSRR(rrname=name, type="A", - ttl=ttl, rdata=rdata)]), - verbose=0, timeout=5) - if r and r.haslayer(DNS): - return r.getlayer(DNS).rcode - else: - return -1 - - - - -@conf.commands.register -def dyndns_del(nameserver, name, type="ALL", ttl=10): - """Send a DNS delete message to a nameserver for "name" -dyndns_del(nameserver, name, type="ANY", ttl=10) -> result code (0=ok) - -example: dyndns_del("ns1.toto.com", "dyn.toto.com") -RFC2136 -""" - zone = name[name.find(".")+1:] - r=sr1(IP(dst=nameserver)/UDP()/DNS(opcode=5, - qd=[DNSQR(qname=zone, qtype="SOA")], - ns=[DNSRR(rrname=name, type=type, - rclass="ANY", ttl=0, rdata="")]), - verbose=0, timeout=5) - if r and r.haslayer(DNS): - return r.getlayer(DNS).rcode - else: - return -1 - - -class DNS_am(AnsweringMachine): - function_name="dns_spoof" - filter = "udp port 53" - - def parse_options(self, joker="192.168.1.1", match=None): - if match is None: - self.match = {} - else: - self.match = match - self.joker=joker - - def is_request(self, req): - return req.haslayer(DNS) and req.getlayer(DNS).qr == 0 - - def make_reply(self, req): - ip = req.getlayer(IP) - dns = req.getlayer(DNS) - resp = IP(dst=ip.src, src=ip.dst)/UDP(dport=ip.sport,sport=ip.dport) - rdata = self.match.get(dns.qd.qname, self.joker) - resp /= DNS(id=dns.id, qr=1, qd=dns.qd, - an=DNSRR(rrname=dns.qd.qname, ttl=10, rdata=rdata)) - return resp - - diff --git a/scripts/external_libs/scapy-2.3.1/scapy/layers/dot11.py b/scripts/external_libs/scapy-2.3.1/scapy/layers/dot11.py deleted file mode 100644 index b340dd85..00000000 --- a/scripts/external_libs/scapy-2.3.1/scapy/layers/dot11.py +++ /dev/null @@ -1,559 +0,0 @@ -## This file is part of Scapy -## See http://www.secdev.org/projects/scapy for more informations -## Copyright (C) Philippe Biondi <phil@secdev.org> -## This program is published under a GPLv2 license - -""" -Wireless LAN according to IEEE 802.11. -""" - -import re,struct - -from scapy.packet import * -from scapy.fields import * -from scapy.plist import PacketList -from scapy.layers.l2 import * - - -try: - from Crypto.Cipher import ARC4 -except ImportError: - log_loading.info("Can't import python Crypto lib. Won't be able to decrypt WEP.") - - -### Fields - -class Dot11AddrMACField(MACField): - def is_applicable(self, pkt): - return 1 - def addfield(self, pkt, s, val): - if self.is_applicable(pkt): - return MACField.addfield(self, pkt, s, val) - else: - return s - def getfield(self, pkt, s): - if self.is_applicable(pkt): - return MACField.getfield(self, pkt, s) - else: - return s,None - -class Dot11Addr2MACField(Dot11AddrMACField): - def is_applicable(self, pkt): - if pkt.type == 1: - return pkt.subtype in [ 0xb, 0xa, 0xe, 0xf] # RTS, PS-Poll, CF-End, CF-End+CF-Ack - return 1 - -class Dot11Addr3MACField(Dot11AddrMACField): - def is_applicable(self, pkt): - if pkt.type in [0,2]: - return 1 - return 0 - -class Dot11Addr4MACField(Dot11AddrMACField): - def is_applicable(self, pkt): - if pkt.type == 2: - if pkt.FCfield & 0x3 == 0x3: # To-DS and From-DS are set - return 1 - return 0 - - -### Layers - - -class PrismHeader(Packet): - """ iwpriv wlan0 monitor 3 """ - name = "Prism header" - fields_desc = [ LEIntField("msgcode",68), - LEIntField("len",144), - StrFixedLenField("dev","",16), - LEIntField("hosttime_did",0), - LEShortField("hosttime_status",0), - LEShortField("hosttime_len",0), - LEIntField("hosttime",0), - LEIntField("mactime_did",0), - LEShortField("mactime_status",0), - LEShortField("mactime_len",0), - LEIntField("mactime",0), - LEIntField("channel_did",0), - LEShortField("channel_status",0), - LEShortField("channel_len",0), - LEIntField("channel",0), - LEIntField("rssi_did",0), - LEShortField("rssi_status",0), - LEShortField("rssi_len",0), - LEIntField("rssi",0), - LEIntField("sq_did",0), - LEShortField("sq_status",0), - LEShortField("sq_len",0), - LEIntField("sq",0), - LEIntField("signal_did",0), - LEShortField("signal_status",0), - LEShortField("signal_len",0), - LESignedIntField("signal",0), - LEIntField("noise_did",0), - LEShortField("noise_status",0), - LEShortField("noise_len",0), - LEIntField("noise",0), - LEIntField("rate_did",0), - LEShortField("rate_status",0), - LEShortField("rate_len",0), - LEIntField("rate",0), - LEIntField("istx_did",0), - LEShortField("istx_status",0), - LEShortField("istx_len",0), - LEIntField("istx",0), - LEIntField("frmlen_did",0), - LEShortField("frmlen_status",0), - LEShortField("frmlen_len",0), - LEIntField("frmlen",0), - ] - def answers(self, other): - if isinstance(other, PrismHeader): - return self.payload.answers(other.payload) - else: - return self.payload.answers(other) - -class RadioTap(Packet): - name = "RadioTap dummy" - fields_desc = [ ByteField('version', 0), - ByteField('pad', 0), - FieldLenField('len', None, 'notdecoded', '<H', adjust=lambda pkt,x:x+8), - FlagsField('present', None, -32, ['TSFT','Flags','Rate','Channel','FHSS','dBm_AntSignal', - 'dBm_AntNoise','Lock_Quality','TX_Attenuation','dB_TX_Attenuation', - 'dBm_TX_Power', 'Antenna', 'dB_AntSignal', 'dB_AntNoise', - 'b14', 'b15','b16','b17','b18','b19','b20','b21','b22','b23', - 'b24','b25','b26','b27','b28','b29','b30','Ext']), - StrLenField('notdecoded', "", length_from= lambda pkt:pkt.len-8) ] - -class PPI(Packet): - name = "Per-Packet Information header (partial)" - fields_desc = [ ByteField("version", 0), - ByteField("flags", 0), - FieldLenField("len", None, fmt="<H", length_of="fields", adjust=lambda pkt,x:x+8), - LEIntField("dlt", 0), - StrLenField("notdecoded", "", length_from = lambda pkt:pkt.len-8) - ] - - - -class Dot11SCField(LEShortField): - def is_applicable(self, pkt): - return pkt.type != 1 # control frame - def addfield(self, pkt, s, val): - if self.is_applicable(pkt): - return LEShortField.addfield(self, pkt, s, val) - else: - return s - def getfield(self, pkt, s): - if self.is_applicable(pkt): - return LEShortField.getfield(self, pkt, s) - else: - return s,None - -class Dot11(Packet): - name = "802.11" - fields_desc = [ - BitField("subtype", 0, 4), - BitEnumField("type", 0, 2, ["Management", "Control", "Data", "Reserved"]), - BitField("proto", 0, 2), - FlagsField("FCfield", 0, 8, ["to-DS", "from-DS", "MF", "retry", "pw-mgt", "MD", "wep", "order"]), - ShortField("ID",0), - MACField("addr1", ETHER_ANY), - Dot11Addr2MACField("addr2", ETHER_ANY), - Dot11Addr3MACField("addr3", ETHER_ANY), - Dot11SCField("SC", 0), - Dot11Addr4MACField("addr4", ETHER_ANY) - ] - def mysummary(self): - return self.sprintf("802.11 %Dot11.type% %Dot11.subtype% %Dot11.addr2% > %Dot11.addr1%") - def guess_payload_class(self, payload): - if self.type == 0x02 and (self.subtype >= 0x08 and self.subtype <=0xF and self.subtype != 0xD): - return Dot11QoS - elif self.FCfield & 0x40: - return Dot11WEP - else: - return Packet.guess_payload_class(self, payload) - def answers(self, other): - if isinstance(other,Dot11): - if self.type == 0: # management - if self.addr1.lower() != other.addr2.lower(): # check resp DA w/ req SA - return 0 - if (other.subtype,self.subtype) in [(0,1),(2,3),(4,5)]: - return 1 - if self.subtype == other.subtype == 11: # auth - return self.payload.answers(other.payload) - elif self.type == 1: # control - return 0 - elif self.type == 2: # data - return self.payload.answers(other.payload) - elif self.type == 3: # reserved - return 0 - return 0 - def unwep(self, key=None, warn=1): - if self.FCfield & 0x40 == 0: - if warn: - warning("No WEP to remove") - return - if isinstance(self.payload.payload, NoPayload): - if key or conf.wepkey: - self.payload.decrypt(key) - if isinstance(self.payload.payload, NoPayload): - if warn: - warning("Dot11 can't be decrypted. Check conf.wepkey.") - return - self.FCfield &= ~0x40 - self.payload=self.payload.payload - - -class Dot11QoS(Packet): - name = "802.11 QoS" - fields_desc = [ BitField("TID",None,4), - BitField("EOSP",None,1), - BitField("Ack Policy",None,2), - BitField("Reserved",None,1), - ByteField("TXOP",None) ] - def guess_payload_class(self, payload): - if isinstance(self.underlayer, Dot11): - if self.underlayer.FCfield & 0x40: - return Dot11WEP - return Packet.guess_payload_class(self, payload) - - -capability_list = [ "res8", "res9", "short-slot", "res11", - "res12", "DSSS-OFDM", "res14", "res15", - "ESS", "IBSS", "CFP", "CFP-req", - "privacy", "short-preamble", "PBCC", "agility"] - -reason_code = {0:"reserved",1:"unspec", 2:"auth-expired", - 3:"deauth-ST-leaving", - 4:"inactivity", 5:"AP-full", 6:"class2-from-nonauth", - 7:"class3-from-nonass", 8:"disas-ST-leaving", - 9:"ST-not-auth"} - -status_code = {0:"success", 1:"failure", 10:"cannot-support-all-cap", - 11:"inexist-asso", 12:"asso-denied", 13:"algo-unsupported", - 14:"bad-seq-num", 15:"challenge-failure", - 16:"timeout", 17:"AP-full",18:"rate-unsupported" } - -class Dot11Beacon(Packet): - name = "802.11 Beacon" - fields_desc = [ LELongField("timestamp", 0), - LEShortField("beacon_interval", 0x0064), - FlagsField("cap", 0, 16, capability_list) ] - - -class Dot11Elt(Packet): - name = "802.11 Information Element" - fields_desc = [ ByteEnumField("ID", 0, {0:"SSID", 1:"Rates", 2: "FHset", 3:"DSset", 4:"CFset", 5:"TIM", 6:"IBSSset", 16:"challenge", - 42:"ERPinfo", 46:"QoS Capability", 47:"ERPinfo", 48:"RSNinfo", 50:"ESRates",221:"vendor",68:"reserved"}), - FieldLenField("len", None, "info", "B"), - StrLenField("info", "", length_from=lambda x:x.len) ] - def mysummary(self): - if self.ID == 0: - return "SSID=%s"%repr(self.info),[Dot11] - else: - return "" - -class Dot11ATIM(Packet): - name = "802.11 ATIM" - -class Dot11Disas(Packet): - name = "802.11 Disassociation" - fields_desc = [ LEShortEnumField("reason", 1, reason_code) ] - -class Dot11AssoReq(Packet): - name = "802.11 Association Request" - fields_desc = [ FlagsField("cap", 0, 16, capability_list), - LEShortField("listen_interval", 0x00c8) ] - - -class Dot11AssoResp(Packet): - name = "802.11 Association Response" - fields_desc = [ FlagsField("cap", 0, 16, capability_list), - LEShortField("status", 0), - LEShortField("AID", 0) ] - -class Dot11ReassoReq(Packet): - name = "802.11 Reassociation Request" - fields_desc = [ FlagsField("cap", 0, 16, capability_list), - LEShortField("listen_interval", 0x00c8), - MACField("current_AP", ETHER_ANY) ] - - -class Dot11ReassoResp(Dot11AssoResp): - name = "802.11 Reassociation Response" - -class Dot11ProbeReq(Packet): - name = "802.11 Probe Request" - -class Dot11ProbeResp(Packet): - name = "802.11 Probe Response" - fields_desc = [ LELongField("timestamp", 0), - LEShortField("beacon_interval", 0x0064), - FlagsField("cap", 0, 16, capability_list) ] - -class Dot11Auth(Packet): - name = "802.11 Authentication" - fields_desc = [ LEShortEnumField("algo", 0, ["open", "sharedkey"]), - LEShortField("seqnum", 0), - LEShortEnumField("status", 0, status_code) ] - def answers(self, other): - if self.seqnum == other.seqnum+1: - return 1 - return 0 - -class Dot11Deauth(Packet): - name = "802.11 Deauthentication" - fields_desc = [ LEShortEnumField("reason", 1, reason_code) ] - - - -class Dot11WEP(Packet): - name = "802.11 WEP packet" - fields_desc = [ StrFixedLenField("iv", "\0\0\0", 3), - ByteField("keyid", 0), - StrField("wepdata",None,remain=4), - IntField("icv",None) ] - - def post_dissect(self, s): -# self.icv, = struct.unpack("!I",self.wepdata[-4:]) -# self.wepdata = self.wepdata[:-4] - self.decrypt() - - def build_payload(self): - if self.wepdata is None: - return Packet.build_payload(self) - return "" - - def post_build(self, p, pay): - if self.wepdata is None: - key = conf.wepkey - if key: - if self.icv is None: - pay += struct.pack("<I",crc32(pay)) - icv = "" - else: - icv = p[4:8] - c = ARC4.new(self.iv+key) - p = p[:4]+c.encrypt(pay)+icv - else: - warning("No WEP key set (conf.wepkey).. strange results expected..") - return p - - - def decrypt(self,key=None): - if key is None: - key = conf.wepkey - if key: - c = ARC4.new(self.iv+key) - self.add_payload(LLC(c.decrypt(self.wepdata))) - - -bind_layers( PrismHeader, Dot11, ) -bind_layers( RadioTap, Dot11, ) -bind_layers( PPI, Dot11, dlt=105) -bind_layers( Dot11, LLC, type=2) -bind_layers( Dot11QoS, LLC, ) -bind_layers( Dot11, Dot11AssoReq, subtype=0, type=0) -bind_layers( Dot11, Dot11AssoResp, subtype=1, type=0) -bind_layers( Dot11, Dot11ReassoReq, subtype=2, type=0) -bind_layers( Dot11, Dot11ReassoResp, subtype=3, type=0) -bind_layers( Dot11, Dot11ProbeReq, subtype=4, type=0) -bind_layers( Dot11, Dot11ProbeResp, subtype=5, type=0) -bind_layers( Dot11, Dot11Beacon, subtype=8, type=0) -bind_layers( Dot11, Dot11ATIM, subtype=9, type=0) -bind_layers( Dot11, Dot11Disas, subtype=10, type=0) -bind_layers( Dot11, Dot11Auth, subtype=11, type=0) -bind_layers( Dot11, Dot11Deauth, subtype=12, type=0) -bind_layers( Dot11Beacon, Dot11Elt, ) -bind_layers( Dot11AssoReq, Dot11Elt, ) -bind_layers( Dot11AssoResp, Dot11Elt, ) -bind_layers( Dot11ReassoReq, Dot11Elt, ) -bind_layers( Dot11ReassoResp, Dot11Elt, ) -bind_layers( Dot11ProbeReq, Dot11Elt, ) -bind_layers( Dot11ProbeResp, Dot11Elt, ) -bind_layers( Dot11Auth, Dot11Elt, ) -bind_layers( Dot11Elt, Dot11Elt, ) - - -conf.l2types.register(105, Dot11) -conf.l2types.register_num2layer(801, Dot11) -conf.l2types.register(119, PrismHeader) -conf.l2types.register_num2layer(802, PrismHeader) -conf.l2types.register(127, RadioTap) -conf.l2types.register(0xc0, PPI) -conf.l2types.register_num2layer(803, RadioTap) - - -class WiFi_am(AnsweringMachine): - """Before using this, initialize "iffrom" and "ifto" interfaces: -iwconfig iffrom mode monitor -iwpriv orig_ifto hostapd 1 -ifconfig ifto up -note: if ifto=wlan0ap then orig_ifto=wlan0 -note: ifto and iffrom must be set on the same channel -ex: -ifconfig eth1 up -iwconfig eth1 mode monitor -iwconfig eth1 channel 11 -iwpriv wlan0 hostapd 1 -ifconfig wlan0ap up -iwconfig wlan0 channel 11 -iwconfig wlan0 essid dontexist -iwconfig wlan0 mode managed -""" - function_name = "airpwn" - filter = None - - def parse_options(self, iffrom, ifto, replace, pattern="", ignorepattern=""): - self.iffrom = iffrom - self.ifto = ifto - ptrn = re.compile(pattern) - iptrn = re.compile(ignorepattern) - - def is_request(self, pkt): - if not isinstance(pkt,Dot11): - return 0 - if not pkt.FCfield & 1: - return 0 - if not pkt.haslayer(TCP): - return 0 - ip = pkt.getlayer(IP) - tcp = pkt.getlayer(TCP) - pay = str(tcp.payload) - if not self.ptrn.match(pay): - return 0 - if self.iptrn.match(pay): - return 0 - - def make_reply(self, p): - ip = p.getlayer(IP) - tcp = p.getlayer(TCP) - pay = str(tcp.payload) - del(p.payload.payload.payload) - p.FCfield="from-DS" - p.addr1,p.addr2 = p.addr2,p.addr1 - p /= IP(src=ip.dst,dst=ip.src) - p /= TCP(sport=tcp.dport, dport=tcp.sport, - seq=tcp.ack, ack=tcp.seq+len(pay), - flags="PA") - q = p.copy() - p /= self.replace - q.ID += 1 - q.getlayer(TCP).flags="RA" - q.getlayer(TCP).seq+=len(replace) - return [p,q] - - def print_reply(self): - print p.sprintf("Sent %IP.src%:%IP.sport% > %IP.dst%:%TCP.dport%") - - def send_reply(self, reply): - sendp(reply, iface=self.ifto, **self.optsend) - - def sniff(self): - sniff(iface=self.iffrom, **self.optsniff) - - - -plst=[] -def get_toDS(): - global plst - while 1: - p,=sniff(iface="eth1",count=1) - if not isinstance(p,Dot11): - continue - if p.FCfield & 1: - plst.append(p) - print "." - - -# if not ifto.endswith("ap"): -# print "iwpriv %s hostapd 1" % ifto -# os.system("iwpriv %s hostapd 1" % ifto) -# ifto += "ap" -# -# os.system("iwconfig %s mode monitor" % iffrom) -# - -def airpwn(iffrom, ifto, replace, pattern="", ignorepattern=""): - """Before using this, initialize "iffrom" and "ifto" interfaces: -iwconfig iffrom mode monitor -iwpriv orig_ifto hostapd 1 -ifconfig ifto up -note: if ifto=wlan0ap then orig_ifto=wlan0 -note: ifto and iffrom must be set on the same channel -ex: -ifconfig eth1 up -iwconfig eth1 mode monitor -iwconfig eth1 channel 11 -iwpriv wlan0 hostapd 1 -ifconfig wlan0ap up -iwconfig wlan0 channel 11 -iwconfig wlan0 essid dontexist -iwconfig wlan0 mode managed -""" - - ptrn = re.compile(pattern) - iptrn = re.compile(ignorepattern) - def do_airpwn(p, ifto=ifto, replace=replace, ptrn=ptrn, iptrn=iptrn): - if not isinstance(p,Dot11): - return - if not p.FCfield & 1: - return - if not p.haslayer(TCP): - return - ip = p.getlayer(IP) - tcp = p.getlayer(TCP) - pay = str(tcp.payload) -# print "got tcp" - if not ptrn.match(pay): - return -# print "match 1" - if iptrn.match(pay): - return -# print "match 2" - del(p.payload.payload.payload) - p.FCfield="from-DS" - p.addr1,p.addr2 = p.addr2,p.addr1 - q = p.copy() - p /= IP(src=ip.dst,dst=ip.src) - p /= TCP(sport=tcp.dport, dport=tcp.sport, - seq=tcp.ack, ack=tcp.seq+len(pay), - flags="PA") - q = p.copy() - p /= replace - q.ID += 1 - q.getlayer(TCP).flags="RA" - q.getlayer(TCP).seq+=len(replace) - - sendp([p,q], iface=ifto, verbose=0) -# print "send",repr(p) -# print "send",repr(q) - print p.sprintf("Sent %IP.src%:%IP.sport% > %IP.dst%:%TCP.dport%") - - sniff(iface=iffrom,prn=do_airpwn) - - - -conf.stats_dot11_protocols += [Dot11WEP, Dot11Beacon, ] - - - - - -class Dot11PacketList(PacketList): - def __init__(self, res=None, name="Dot11List", stats=None): - if stats is None: - stats = conf.stats_dot11_protocols - - PacketList.__init__(self, res, name, stats) - def toEthernet(self): - data = map(lambda x:x.getlayer(Dot11), filter(lambda x : x.haslayer(Dot11) and x.type == 2, self.res)) - r2 = [] - for p in data: - q = p.copy() - q.unwep() - r2.append(Ether()/q.payload.payload.payload) #Dot11/LLC/SNAP/IP - return PacketList(r2,name="Ether from %s"%self.listname) - - diff --git a/scripts/external_libs/scapy-2.3.1/scapy/layers/gprs.py b/scripts/external_libs/scapy-2.3.1/scapy/layers/gprs.py deleted file mode 100644 index 31a931fe..00000000 --- a/scripts/external_libs/scapy-2.3.1/scapy/layers/gprs.py +++ /dev/null @@ -1,21 +0,0 @@ -## This file is part of Scapy -## See http://www.secdev.org/projects/scapy for more informations -## Copyright (C) Philippe Biondi <phil@secdev.org> -## This program is published under a GPLv2 license - -""" -GPRS (General Packet Radio Service) for mobile data communication. -""" - -from scapy.fields import * -from scapy.packet import * -from scapy.layers.inet import IP - -class GPRS(Packet): - name = "GPRSdummy" - fields_desc = [ - StrStopField("dummy","","\x65\x00\x00",1) - ] - - -bind_layers( GPRS, IP, ) diff --git a/scripts/external_libs/scapy-2.3.1/scapy/layers/hsrp.py b/scripts/external_libs/scapy-2.3.1/scapy/layers/hsrp.py deleted file mode 100644 index 7193b97e..00000000 --- a/scripts/external_libs/scapy-2.3.1/scapy/layers/hsrp.py +++ /dev/null @@ -1,79 +0,0 @@ -## This file is part of Scapy -## See http://www.secdev.org/projects/scapy for more informations -## Copyright (C) Philippe Biondi <phil@secdev.org> -## This program is published under a GPLv2 license - -############################################################################# -## ## -## hsrp.py --- HSRP protocol support for Scapy ## -## ## -## Copyright (C) 2010 Mathieu RENARD mathieu.renard(at)gmail.com ## -## ## -## This program is free software; you can redistribute it and/or modify it ## -## under the terms of the GNU General Public License version 2 as ## -## published by the Free Software Foundation; version 2. ## -## ## -## This program is distributed in the hope that it will be useful, but ## -## WITHOUT ANY WARRANTY; without even the implied warranty of ## -## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU ## -## General Public License for more details. ## -## ## -############################################################################# -## HSRP Version 1 -## Ref. RFC 2281 -## HSRP Version 2 -## Ref. http://www.smartnetworks.jp/2006/02/hsrp_8_hsrp_version_2.html -## -## $Log: hsrp.py,v $ -## Revision 0.2 2011/05/01 15:23:34 mrenard -## Cleanup code - -""" -HSRP (Hot Standby Router Protocol): proprietary redundancy protocol for Cisco routers. -""" - -from scapy.fields import * -from scapy.packet import * -from scapy.layers.inet import UDP - - -class HSRP(Packet): - name = "HSRP" - fields_desc = [ - ByteField("version", 0), - ByteEnumField("opcode", 0, {0: "Hello", 1: "Coup", 2: "Resign", 3: "Advertise"}), - ByteEnumField("state", 16, {0: "Initial", 1: "Learn", 2: "Listen", 4: "Speak", 8: "Standby", 16: "Active"}), - ByteField("hellotime", 3), - ByteField("holdtime", 10), - ByteField("priority", 120), - ByteField("group", 1), - ByteField("reserved", 0), - StrFixedLenField("auth", "cisco" + "\00" * 3, 8), - IPField("virtualIP", "192.168.1.1")] - - def guess_payload_class(self, payload): - if self.underlayer.len > 28: - return HSRPmd5 - else: - return Packet.guess_payload_class(self, payload) - - -class HSRPmd5(Packet): - name = "HSRP MD5 Authentication" - fields_desc = [ - ByteEnumField("type", 4, {4: "MD5 authentication"}), - ByteField("len", None), - ByteEnumField("algo", 0, {1: "MD5"}), - ByteField("padding", 0x00), - XShortField("flags", 0x00), - IPField("sourceip", None), - XIntField("keyid", 0x00), - StrFixedLenField("authdigest", "\00" * 16, 16)] - - def post_build(self, p, pay): - if self.len is None and pay: - l = len(pay) - p = p[:1] + hex(l)[30:] + p[30:] - return p - -bind_layers(UDP, HSRP, dport=1985, sport=1985) diff --git a/scripts/external_libs/scapy-2.3.1/scapy/layers/inet.py b/scripts/external_libs/scapy-2.3.1/scapy/layers/inet.py deleted file mode 100644 index 34b5e7be..00000000 --- a/scripts/external_libs/scapy-2.3.1/scapy/layers/inet.py +++ /dev/null @@ -1,1556 +0,0 @@ -## This file is part of Scapy -## See http://www.secdev.org/projects/scapy for more informations -## Copyright (C) Philippe Biondi <phil@secdev.org> -## This program is published under a GPLv2 license - -""" -IPv4 (Internet Protocol v4). -""" - -import os,time,struct,re,socket,new -from select import select -from collections import defaultdict -from scapy.utils import checksum -from scapy.layers.l2 import * -from scapy.config import conf -from scapy.fields import * -from scapy.packet import * -from scapy.volatile import * -from scapy.sendrecv import sr,sr1,srp1 -from scapy.plist import PacketList,SndRcvList -from scapy.automaton import Automaton,ATMT - -import scapy.as_resolvers - - -#################### -## IP Tools class ## -#################### - -class IPTools: - """Add more powers to a class that have a "src" attribute.""" - def whois(self): - os.system("whois %s" % self.src) - def ottl(self): - t = [32,64,128,255]+[self.ttl] - t.sort() - return t[t.index(self.ttl)+1] - def hops(self): - return self.ottl()-self.ttl-1 - - -_ip_options_names = { 0: "end_of_list", - 1: "nop", - 2: "security", - 3: "loose_source_route", - 4: "timestamp", - 5: "extended_security", - 6: "commercial_security", - 7: "record_route", - 8: "stream_id", - 9: "strict_source_route", - 10: "experimental_measurement", - 11: "mtu_probe", - 12: "mtu_reply", - 13: "flow_control", - 14: "access_control", - 15: "encode", - 16: "imi_traffic_descriptor", - 17: "extended_IP", - 18: "traceroute", - 19: "address_extension", - 20: "router_alert", - 21: "selective_directed_broadcast_mode", - 23: "dynamic_packet_state", - 24: "upstream_multicast_packet", - 25: "quick_start", - 30: "rfc4727_experiment", - } - - -class _IPOption_HDR(Packet): - fields_desc = [ BitField("copy_flag",0, 1), - BitEnumField("optclass",0,2,{0:"control",2:"debug"}), - BitEnumField("option",0,5, _ip_options_names) ] - -class IPOption(Packet): - name = "IP Option" - fields_desc = [ _IPOption_HDR, - FieldLenField("length", None, fmt="B", # Only option 0 and 1 have no length and value - length_of="value", adjust=lambda pkt,l:l+2), - StrLenField("value", "",length_from=lambda pkt:pkt.length-2) ] - - def extract_padding(self, p): - return "",p - - registered_ip_options = {} - @classmethod - def register_variant(cls): - cls.registered_ip_options[cls.option.default] = cls - @classmethod - def dispatch_hook(cls, pkt=None, *args, **kargs): - if pkt: - opt = ord(pkt[0])&0x1f - if opt in cls.registered_ip_options: - return cls.registered_ip_options[opt] - return cls - -class IPOption_EOL(IPOption): - name = "IP Option End of Options List" - option = 0 - fields_desc = [ _IPOption_HDR ] - - -class IPOption_NOP(IPOption): - name = "IP Option No Operation" - option=1 - fields_desc = [ _IPOption_HDR ] - -class IPOption_Security(IPOption): - name = "IP Option Security" - copy_flag = 1 - option = 2 - fields_desc = [ _IPOption_HDR, - ByteField("length", 11), - ShortField("security",0), - ShortField("compartment",0), - ShortField("handling_restrictions",0), - StrFixedLenField("transmission_control_code","xxx",3), - ] - -class IPOption_LSRR(IPOption): - name = "IP Option Loose Source and Record Route" - copy_flag = 1 - option = 3 - fields_desc = [ _IPOption_HDR, - FieldLenField("length", None, fmt="B", - length_of="routers", adjust=lambda pkt,l:l+3), - ByteField("pointer",4), # 4 is first IP - FieldListField("routers",[],IPField("","0.0.0.0"), - length_from=lambda pkt:pkt.length-3) - ] - def get_current_router(self): - return self.routers[self.pointer/4-1] - -class IPOption_RR(IPOption_LSRR): - name = "IP Option Record Route" - option = 7 - -class IPOption_SSRR(IPOption_LSRR): - name = "IP Option Strict Source and Record Route" - option = 9 - -class IPOption_Stream_Id(IPOption): - name = "IP Option Stream ID" - option = 8 - fields_desc = [ _IPOption_HDR, - ByteField("length", 4), - ShortField("security",0), ] - -class IPOption_MTU_Probe(IPOption): - name = "IP Option MTU Probe" - option = 11 - fields_desc = [ _IPOption_HDR, - ByteField("length", 4), - ShortField("mtu",0), ] - -class IPOption_MTU_Reply(IPOption_MTU_Probe): - name = "IP Option MTU Reply" - option = 12 - -class IPOption_Traceroute(IPOption): - name = "IP Option Traceroute" - copy_flag = 1 - option = 18 - fields_desc = [ _IPOption_HDR, - ByteField("length", 12), - ShortField("id",0), - ShortField("outbound_hops",0), - ShortField("return_hops",0), - IPField("originator_ip","0.0.0.0") ] - -class IPOption_Address_Extension(IPOption): - name = "IP Option Address Extension" - copy_flag = 1 - option = 19 - fields_desc = [ _IPOption_HDR, - ByteField("length", 10), - IPField("src_ext","0.0.0.0"), - IPField("dst_ext","0.0.0.0") ] - -class IPOption_Router_Alert(IPOption): - name = "IP Option Router Alert" - copy_flag = 1 - option = 20 - fields_desc = [ _IPOption_HDR, - ByteField("length", 4), - ShortEnumField("alert",0, {0:"router_shall_examine_packet"}), ] - - -class IPOption_SDBM(IPOption): - name = "IP Option Selective Directed Broadcast Mode" - copy_flag = 1 - option = 21 - fields_desc = [ _IPOption_HDR, - FieldLenField("length", None, fmt="B", - length_of="addresses", adjust=lambda pkt,l:l+2), - FieldListField("addresses",[],IPField("","0.0.0.0"), - length_from=lambda pkt:pkt.length-2) - ] - - - -TCPOptions = ( - { 0 : ("EOL",None), - 1 : ("NOP",None), - 2 : ("MSS","!H"), - 3 : ("WScale","!B"), - 4 : ("SAckOK",None), - 5 : ("SAck","!"), - 8 : ("Timestamp","!II"), - 14 : ("AltChkSum","!BH"), - 15 : ("AltChkSumOpt",None), - 25 : ("Mood","!p") - }, - { "EOL":0, - "NOP":1, - "MSS":2, - "WScale":3, - "SAckOK":4, - "SAck":5, - "Timestamp":8, - "AltChkSum":14, - "AltChkSumOpt":15, - "Mood":25 - } ) - -class TCPOptionsField(StrField): - islist=1 - def getfield(self, pkt, s): - opsz = (pkt.dataofs-5)*4 - if opsz < 0: - warning("bad dataofs (%i). Assuming dataofs=5"%pkt.dataofs) - opsz = 0 - return s[opsz:],self.m2i(pkt,s[:opsz]) - def m2i(self, pkt, x): - opt = [] - while x: - onum = ord(x[0]) - if onum == 0: - opt.append(("EOL",None)) - x=x[1:] - break - if onum == 1: - opt.append(("NOP",None)) - x=x[1:] - continue - olen = ord(x[1]) - if olen < 2: - warning("Malformed TCP option (announced length is %i)" % olen) - olen = 2 - oval = x[2:olen] - if TCPOptions[0].has_key(onum): - oname, ofmt = TCPOptions[0][onum] - if onum == 5: #SAck - ofmt += "%iI" % (len(oval)/4) - if ofmt and struct.calcsize(ofmt) == len(oval): - oval = struct.unpack(ofmt, oval) - if len(oval) == 1: - oval = oval[0] - opt.append((oname, oval)) - else: - opt.append((onum, oval)) - x = x[olen:] - return opt - - def i2m(self, pkt, x): - opt = "" - for oname,oval in x: - if type(oname) is str: - if oname == "NOP": - opt += "\x01" - continue - elif oname == "EOL": - opt += "\x00" - continue - elif TCPOptions[1].has_key(oname): - onum = TCPOptions[1][oname] - ofmt = TCPOptions[0][onum][1] - if onum == 5: #SAck - ofmt += "%iI" % len(oval) - if ofmt is not None and (type(oval) is not str or "s" in ofmt): - if type(oval) is not tuple: - oval = (oval,) - oval = struct.pack(ofmt, *oval) - else: - warning("option [%s] unknown. Skipped."%oname) - continue - else: - onum = oname - if type(oval) is not str: - warning("option [%i] is not string."%onum) - continue - opt += chr(onum)+chr(2+len(oval))+oval - return opt+"\x00"*(3-((len(opt)+3)%4)) - def randval(self): - return [] # XXX - - -class ICMPTimeStampField(IntField): - re_hmsm = re.compile("([0-2]?[0-9])[Hh:](([0-5]?[0-9])([Mm:]([0-5]?[0-9])([sS:.]([0-9]{0,3}))?)?)?$") - def i2repr(self, pkt, val): - if val is None: - return "--" - else: - sec, milli = divmod(val, 1000) - min, sec = divmod(sec, 60) - hour, min = divmod(min, 60) - return "%d:%d:%d.%d" %(hour, min, sec, int(milli)) - def any2i(self, pkt, val): - if type(val) is str: - hmsms = self.re_hmsm.match(val) - if hmsms: - h,_,m,_,s,_,ms = hmsms = hmsms.groups() - ms = int(((ms or "")+"000")[:3]) - val = ((int(h)*60+int(m or 0))*60+int(s or 0))*1000+ms - else: - val = 0 - elif val is None: - val = int((time.time()%(24*60*60))*1000) - return val - - -class IP(Packet, IPTools): - name = "IP" - fields_desc = [ BitField("version" , 4 , 4), - BitField("ihl", None, 4), - XByteField("tos", 0), - ShortField("len", None), - ShortField("id", 1), - FlagsField("flags", 0, 3, ["MF","DF","evil"]), - BitField("frag", 0, 13), - ByteField("ttl", 64), - ByteEnumField("proto", 0, IP_PROTOS), - XShortField("chksum", None), - #IPField("src", "127.0.0.1"), - #Emph(SourceIPField("src","dst")), - Emph(IPField("src", "16.0.0.1")), - Emph(IPField("dst", "48.0.0.1")), - PacketListField("options", [], IPOption, length_from=lambda p:p.ihl*4-20) ] - def post_build(self, p, pay): - ihl = self.ihl - p += "\0"*((-len(p))%4) # pad IP options if needed - if ihl is None: - ihl = len(p)/4 - p = chr(((self.version&0xf)<<4) | ihl&0x0f)+p[1:] - if self.len is None: - l = len(p)+len(pay) - p = p[:2]+struct.pack("!H", l)+p[4:] - if self.chksum is None: - ck = checksum(p) - p = p[:10]+chr(ck>>8)+chr(ck&0xff)+p[12:] - return p+pay - - def extract_padding(self, s): - l = self.len - (self.ihl << 2) - return s[:l],s[l:] - - def send(self, s, slp=0): - for p in self: - try: - s.sendto(str(p), (p.dst,0)) - except socket.error, msg: - log_runtime.error(msg) - if slp: - time.sleep(slp) - def route(self): - dst = self.dst - if isinstance(dst,Gen): - dst = iter(dst).next() - return conf.route.route(dst) - def hashret(self): - if ( (self.proto == socket.IPPROTO_ICMP) - and (isinstance(self.payload, ICMP)) - and (self.payload.type in [3,4,5,11,12]) ): - return self.payload.payload.hashret() - else: - if conf.checkIPsrc and conf.checkIPaddr: - return strxor(inet_aton(self.src),inet_aton(self.dst))+struct.pack("B",self.proto)+self.payload.hashret() - else: - return struct.pack("B", self.proto)+self.payload.hashret() - def answers(self, other): - if not isinstance(other,IP): - return 0 - if conf.checkIPaddr and (self.dst != other.src): - return 0 - if ( (self.proto == socket.IPPROTO_ICMP) and - (isinstance(self.payload, ICMP)) and - (self.payload.type in [3,4,5,11,12]) ): - # ICMP error message - return self.payload.payload.answers(other) - - else: - if ( (conf.checkIPaddr and (self.src != other.dst)) or - (self.proto != other.proto) ): - return 0 - return self.payload.answers(other.payload) - def mysummary(self): - s = self.sprintf("%IP.src% > %IP.dst% %IP.proto%") - if self.frag: - s += " frag:%i" % self.frag - return s - - def fragment(self, fragsize=1480): - """Fragment IP datagrams""" - fragsize = (fragsize+7)/8*8 - lst = [] - fnb = 0 - fl = self - while fl.underlayer is not None: - fnb += 1 - fl = fl.underlayer - - for p in fl: - s = str(p[fnb].payload) - nb = (len(s)+fragsize-1)/fragsize - for i in range(nb): - q = p.copy() - del(q[fnb].payload) - del(q[fnb].chksum) - del(q[fnb].len) - if i == nb-1: - q[IP].flags &= ~1 - else: - q[IP].flags |= 1 - q[IP].frag = i*fragsize/8 - r = conf.raw_layer(load=s[i*fragsize:(i+1)*fragsize]) - r.overload_fields = p[IP].payload.overload_fields.copy() - q.add_payload(r) - lst.append(q) - return lst - - -class TCP(Packet): - name = "TCP" - fields_desc = [ ShortEnumField("sport", 20, TCP_SERVICES), - ShortEnumField("dport", 80, TCP_SERVICES), - IntField("seq", 0), - IntField("ack", 0), - BitField("dataofs", None, 4), - BitField("reserved", 0, 4), - FlagsField("flags", 0x2, 8, "FSRPAUEC"), - ShortField("window", 8192), - XShortField("chksum", None), - ShortField("urgptr", 0), - TCPOptionsField("options", {}) ] - def post_build(self, p, pay): - p += pay - dataofs = self.dataofs - if dataofs is None: - dataofs = 5+((len(self.get_field("options").i2m(self,self.options))+3)/4) - p = p[:12]+chr((dataofs << 4) | ord(p[12])&0x0f)+p[13:] - if self.chksum is None: - if isinstance(self.underlayer, IP): - if self.underlayer.len is not None: - ln = self.underlayer.len-20 - else: - ln = len(p) - psdhdr = struct.pack("!4s4sHH", - inet_aton(self.underlayer.src), - inet_aton(self.underlayer.dst), - self.underlayer.proto, - ln) - ck=checksum(psdhdr+p) - p = p[:16]+struct.pack("!H", ck)+p[18:] - elif conf.ipv6_enabled and isinstance(self.underlayer, scapy.layers.inet6.IPv6) or isinstance(self.underlayer, scapy.layers.inet6._IPv6ExtHdr): - ck = scapy.layers.inet6.in6_chksum(socket.IPPROTO_TCP, self.underlayer, p) - p = p[:16]+struct.pack("!H", ck)+p[18:] - else: - warning("No IP underlayer to compute checksum. Leaving null.") - return p - def hashret(self): - if conf.checkIPsrc: - return struct.pack("H",self.sport ^ self.dport)+self.payload.hashret() - else: - return self.payload.hashret() - def answers(self, other): - if not isinstance(other, TCP): - return 0 - if conf.checkIPsrc: - if not ((self.sport == other.dport) and - (self.dport == other.sport)): - return 0 - if (abs(other.seq-self.ack) > 2+len(other.payload)): - return 0 - return 1 - def mysummary(self): - if isinstance(self.underlayer, IP): - return self.underlayer.sprintf("TCP %IP.src%:%TCP.sport% > %IP.dst%:%TCP.dport% %TCP.flags%") - elif conf.ipv6_enabled and isinstance(self.underlayer, scapy.layers.inet6.IPv6): - return self.underlayer.sprintf("TCP %IPv6.src%:%TCP.sport% > %IPv6.dst%:%TCP.dport% %TCP.flags%") - else: - return self.sprintf("TCP %TCP.sport% > %TCP.dport% %TCP.flags%") - -class UDP(Packet): - name = "UDP" - fields_desc = [ ShortEnumField("sport", 53, UDP_SERVICES), - ShortEnumField("dport", 53, UDP_SERVICES), - ShortField("len", None), - XShortField("chksum", None), ] - def post_build(self, p, pay): - p += pay - l = self.len - if l is None: - l = len(p) - p = p[:4]+struct.pack("!H",l)+p[6:] - if self.chksum is None: - if isinstance(self.underlayer, IP): - if self.underlayer.len is not None: - ln = self.underlayer.len-20 - else: - ln = len(p) - psdhdr = struct.pack("!4s4sHH", - inet_aton(self.underlayer.src), - inet_aton(self.underlayer.dst), - self.underlayer.proto, - ln) - ck=checksum(psdhdr+p) - p = p[:6]+struct.pack("!H", ck)+p[8:] - elif isinstance(self.underlayer, scapy.layers.inet6.IPv6) or isinstance(self.underlayer, scapy.layers.inet6._IPv6ExtHdr): - ck = scapy.layers.inet6.in6_chksum(socket.IPPROTO_UDP, self.underlayer, p) - p = p[:6]+struct.pack("!H", ck)+p[8:] - else: - warning("No IP underlayer to compute checksum. Leaving null.") - return p - def extract_padding(self, s): - l = self.len - 8 - return s[:l],s[l:] - def hashret(self): - return self.payload.hashret() - def answers(self, other): - if not isinstance(other, UDP): - return 0 - if conf.checkIPsrc: - if self.dport != other.sport: - return 0 - return self.payload.answers(other.payload) - def mysummary(self): - if isinstance(self.underlayer, IP): - return self.underlayer.sprintf("UDP %IP.src%:%UDP.sport% > %IP.dst%:%UDP.dport%") - elif isinstance(self.underlayer, scapy.layers.inet6.IPv6): - return self.underlayer.sprintf("UDP %IPv6.src%:%UDP.sport% > %IPv6.dst%:%UDP.dport%") - else: - return self.sprintf("UDP %UDP.sport% > %UDP.dport%") - -icmptypes = { 0 : "echo-reply", - 3 : "dest-unreach", - 4 : "source-quench", - 5 : "redirect", - 8 : "echo-request", - 9 : "router-advertisement", - 10 : "router-solicitation", - 11 : "time-exceeded", - 12 : "parameter-problem", - 13 : "timestamp-request", - 14 : "timestamp-reply", - 15 : "information-request", - 16 : "information-response", - 17 : "address-mask-request", - 18 : "address-mask-reply" } - -icmpcodes = { 3 : { 0 : "network-unreachable", - 1 : "host-unreachable", - 2 : "protocol-unreachable", - 3 : "port-unreachable", - 4 : "fragmentation-needed", - 5 : "source-route-failed", - 6 : "network-unknown", - 7 : "host-unknown", - 9 : "network-prohibited", - 10 : "host-prohibited", - 11 : "TOS-network-unreachable", - 12 : "TOS-host-unreachable", - 13 : "communication-prohibited", - 14 : "host-precedence-violation", - 15 : "precedence-cutoff", }, - 5 : { 0 : "network-redirect", - 1 : "host-redirect", - 2 : "TOS-network-redirect", - 3 : "TOS-host-redirect", }, - 11 : { 0 : "ttl-zero-during-transit", - 1 : "ttl-zero-during-reassembly", }, - 12 : { 0 : "ip-header-bad", - 1 : "required-option-missing", }, } - - - - -class ICMP(Packet): - name = "ICMP" - fields_desc = [ ByteEnumField("type",8, icmptypes), - MultiEnumField("code",0, icmpcodes, depends_on=lambda pkt:pkt.type,fmt="B"), - XShortField("chksum", None), - ConditionalField(XShortField("id",0), lambda pkt:pkt.type in [0,8,13,14,15,16,17,18]), - ConditionalField(XShortField("seq",0), lambda pkt:pkt.type in [0,8,13,14,15,16,17,18]), - ConditionalField(ICMPTimeStampField("ts_ori", None), lambda pkt:pkt.type in [13,14]), - ConditionalField(ICMPTimeStampField("ts_rx", None), lambda pkt:pkt.type in [13,14]), - ConditionalField(ICMPTimeStampField("ts_tx", None), lambda pkt:pkt.type in [13,14]), - ConditionalField(IPField("gw","0.0.0.0"), lambda pkt:pkt.type==5), - ConditionalField(ByteField("ptr",0), lambda pkt:pkt.type==12), - ConditionalField(X3BytesField("reserved",0), lambda pkt:pkt.type==12), - ConditionalField(IPField("addr_mask","0.0.0.0"), lambda pkt:pkt.type in [17,18]), - ConditionalField(IntField("unused",0), lambda pkt:pkt.type not in [0,5,8,12,13,14,15,16,17,18]), - - ] - def post_build(self, p, pay): - p += pay - if self.chksum is None: - ck = checksum(p) - p = p[:2]+chr(ck>>8)+chr(ck&0xff)+p[4:] - return p - - def hashret(self): - if self.type in [0,8,13,14,15,16,17,18]: - return struct.pack("HH",self.id,self.seq)+self.payload.hashret() - return self.payload.hashret() - def answers(self, other): - if not isinstance(other,ICMP): - return 0 - if ( (other.type,self.type) in [(8,0),(13,14),(15,16),(17,18)] and - self.id == other.id and - self.seq == other.seq ): - return 1 - return 0 - - def guess_payload_class(self, payload): - if self.type in [3,4,5,11,12]: - return IPerror - else: - return None - def mysummary(self): - if isinstance(self.underlayer, IP): - return self.underlayer.sprintf("ICMP %IP.src% > %IP.dst% %ICMP.type% %ICMP.code%") - else: - return self.sprintf("ICMP %ICMP.type% %ICMP.code%") - - - - - -class IPerror(IP): - name = "IP in ICMP" - def answers(self, other): - if not isinstance(other, IP): - return 0 - if not ( ((conf.checkIPsrc == 0) or (self.dst == other.dst)) and - (self.src == other.src) and - ( ((conf.checkIPID == 0) - or (self.id == other.id) - or (conf.checkIPID == 1 and self.id == socket.htons(other.id)))) and - (self.proto == other.proto) ): - return 0 - return self.payload.answers(other.payload) - def mysummary(self): - return Packet.mysummary(self) - - -class TCPerror(TCP): - name = "TCP in ICMP" - def answers(self, other): - if not isinstance(other, TCP): - return 0 - if conf.checkIPsrc: - if not ((self.sport == other.sport) and - (self.dport == other.dport)): - return 0 - if conf.check_TCPerror_seqack: - if self.seq is not None: - if self.seq != other.seq: - return 0 - if self.ack is not None: - if self.ack != other.ack: - return 0 - return 1 - def mysummary(self): - return Packet.mysummary(self) - - -class UDPerror(UDP): - name = "UDP in ICMP" - def answers(self, other): - if not isinstance(other, UDP): - return 0 - if conf.checkIPsrc: - if not ((self.sport == other.sport) and - (self.dport == other.dport)): - return 0 - return 1 - def mysummary(self): - return Packet.mysummary(self) - - - -class ICMPerror(ICMP): - name = "ICMP in ICMP" - def answers(self, other): - if not isinstance(other,ICMP): - return 0 - if not ((self.type == other.type) and - (self.code == other.code)): - return 0 - if self.code in [0,8,13,14,17,18]: - if (self.id == other.id and - self.seq == other.seq): - return 1 - else: - return 0 - else: - return 1 - def mysummary(self): - return Packet.mysummary(self) - -bind_layers( Ether, IP, type=2048) -bind_layers( CookedLinux, IP, proto=2048) -bind_layers( GRE, IP, proto=2048) -bind_layers( SNAP, IP, code=2048) -bind_layers( IPerror, IPerror, frag=0, proto=4) -bind_layers( IPerror, ICMPerror, frag=0, proto=1) -bind_layers( IPerror, TCPerror, frag=0, proto=6) -bind_layers( IPerror, UDPerror, frag=0, proto=17) -bind_layers( IP, IP, frag=0, proto=4) -bind_layers( IP, ICMP, frag=0, proto=1) -bind_layers( IP, TCP, frag=0, proto=6) -bind_layers( IP, UDP, frag=0, proto=17) -bind_layers( IP, GRE, frag=0, proto=47) - -conf.l2types.register(101, IP) -conf.l2types.register_num2layer(12, IP) - -conf.l3types.register(ETH_P_IP, IP) -conf.l3types.register_num2layer(ETH_P_ALL, IP) - - -conf.neighbor.register_l3(Ether, IP, lambda l2,l3: getmacbyip(l3.dst)) -conf.neighbor.register_l3(Dot3, IP, lambda l2,l3: getmacbyip(l3.dst)) - - -################### -## Fragmentation ## -################### - -@conf.commands.register -def fragment(pkt, fragsize=1480): - """Fragment a big IP datagram""" - fragsize = (fragsize+7)/8*8 - lst = [] - for p in pkt: - s = str(p[IP].payload) - nb = (len(s)+fragsize-1)/fragsize - for i in range(nb): - q = p.copy() - del(q[IP].payload) - del(q[IP].chksum) - del(q[IP].len) - if i == nb-1: - q[IP].flags &= ~1 - else: - q[IP].flags |= 1 - q[IP].frag = i*fragsize/8 - r = conf.raw_layer(load=s[i*fragsize:(i+1)*fragsize]) - r.overload_fields = p[IP].payload.overload_fields.copy() - q.add_payload(r) - lst.append(q) - return lst - -def overlap_frag(p, overlap, fragsize=8, overlap_fragsize=None): - if overlap_fragsize is None: - overlap_fragsize = fragsize - q = p.copy() - del(q[IP].payload) - q[IP].add_payload(overlap) - - qfrag = fragment(q, overlap_fragsize) - qfrag[-1][IP].flags |= 1 - return qfrag+fragment(p, fragsize) - -@conf.commands.register -def defrag(plist): - """defrag(plist) -> ([not fragmented], [defragmented], - [ [bad fragments], [bad fragments], ... ])""" - frags = defaultdict(PacketList) - nofrag = PacketList() - for p in plist: - ip = p[IP] - if IP not in p: - nofrag.append(p) - continue - if ip.frag == 0 and ip.flags & 1 == 0: - nofrag.append(p) - continue - uniq = (ip.id,ip.src,ip.dst,ip.proto) - frags[uniq].append(p) - defrag = [] - missfrag = [] - for lst in frags.itervalues(): - lst.sort(key=lambda x: x.frag) - p = lst[0] - lastp = lst[-1] - if p.frag > 0 or lastp.flags & 1 != 0: # first or last fragment missing - missfrag.append(lst) - continue - p = p.copy() - if conf.padding_layer in p: - del(p[conf.padding_layer].underlayer.payload) - ip = p[IP] - if ip.len is None or ip.ihl is None: - clen = len(ip.payload) - else: - clen = ip.len - (ip.ihl<<2) - txt = conf.raw_layer() - for q in lst[1:]: - if clen != q.frag<<3: # Wrong fragmentation offset - if clen > q.frag<<3: - warning("Fragment overlap (%i > %i) %r || %r || %r" % (clen, q.frag<<3, p,txt,q)) - missfrag.append(lst) - break - if q[IP].len is None or q[IP].ihl is None: - clen += len(q[IP].payload) - else: - clen += q[IP].len - (q[IP].ihl<<2) - if conf.padding_layer in q: - del(q[conf.padding_layer].underlayer.payload) - txt.add_payload(q[IP].payload.copy()) - else: - ip.flags &= ~1 # !MF - del(ip.chksum) - del(ip.len) - p = p/txt - defrag.append(p) - defrag2=PacketList() - for p in defrag: - defrag2.append(p.__class__(str(p))) - return nofrag,defrag2,missfrag - -@conf.commands.register -def defragment(plist): - """defrag(plist) -> plist defragmented as much as possible """ - frags = defaultdict(lambda:[]) - final = [] - - pos = 0 - for p in plist: - p._defrag_pos = pos - pos += 1 - if IP in p: - ip = p[IP] - if ip.frag != 0 or ip.flags & 1: - ip = p[IP] - uniq = (ip.id,ip.src,ip.dst,ip.proto) - frags[uniq].append(p) - continue - final.append(p) - - defrag = [] - missfrag = [] - for lst in frags.itervalues(): - lst.sort(key=lambda x: x.frag) - p = lst[0] - lastp = lst[-1] - if p.frag > 0 or lastp.flags & 1 != 0: # first or last fragment missing - missfrag += lst - continue - p = p.copy() - if conf.padding_layer in p: - del(p[conf.padding_layer].underlayer.payload) - ip = p[IP] - if ip.len is None or ip.ihl is None: - clen = len(ip.payload) - else: - clen = ip.len - (ip.ihl<<2) - txt = conf.raw_layer() - for q in lst[1:]: - if clen != q.frag<<3: # Wrong fragmentation offset - if clen > q.frag<<3: - warning("Fragment overlap (%i > %i) %r || %r || %r" % (clen, q.frag<<3, p,txt,q)) - missfrag += lst - break - if q[IP].len is None or q[IP].ihl is None: - clen += len(q[IP].payload) - else: - clen += q[IP].len - (q[IP].ihl<<2) - if conf.padding_layer in q: - del(q[conf.padding_layer].underlayer.payload) - txt.add_payload(q[IP].payload.copy()) - else: - ip.flags &= ~1 # !MF - del(ip.chksum) - del(ip.len) - p = p/txt - p._defrag_pos = max(x._defrag_pos for x in lst) - defrag.append(p) - defrag2=[] - for p in defrag: - q = p.__class__(str(p)) - q._defrag_pos = p._defrag_pos - defrag2.append(q) - final += defrag2 - final += missfrag - final.sort(key=lambda x: x._defrag_pos) - for p in final: - del(p._defrag_pos) - - if hasattr(plist, "listname"): - name = "Defragmented %s" % plist.listname - else: - name = "Defragmented" - - return PacketList(final, name=name) - - - -### Add timeskew_graph() method to PacketList -def _packetlist_timeskew_graph(self, ip, **kargs): - """Tries to graph the timeskew between the timestamps and real time for a given ip""" - res = map(lambda x: self._elt2pkt(x), self.res) - b = filter(lambda x:x.haslayer(IP) and x.getlayer(IP).src == ip and x.haslayer(TCP), res) - c = [] - for p in b: - opts = p.getlayer(TCP).options - for o in opts: - if o[0] == "Timestamp": - c.append((p.time,o[1][0])) - if not c: - warning("No timestamps found in packet list") - return - d = map(lambda (x,y): (x%2000,((x-c[0][0])-((y-c[0][1])/1000.0))),c) - g = Gnuplot.Gnuplot() - g.plot(Gnuplot.Data(d,**kargs)) - return g - -PacketList.timeskew_graph = new.instancemethod(_packetlist_timeskew_graph, None, PacketList) - - -### Create a new packet list -class TracerouteResult(SndRcvList): - def __init__(self, res=None, name="Traceroute", stats=None): - PacketList.__init__(self, res, name, stats) - self.graphdef = None - self.graphASres = 0 - self.padding = 0 - self.hloc = None - self.nloc = None - - def show(self): - return self.make_table(lambda (s,r): (s.sprintf("%IP.dst%:{TCP:tcp%ir,TCP.dport%}{UDP:udp%ir,UDP.dport%}{ICMP:ICMP}"), - s.ttl, - r.sprintf("%-15s,IP.src% {TCP:%TCP.flags%}{ICMP:%ir,ICMP.type%}"))) - - - def get_trace(self): - trace = {} - for s,r in self.res: - if IP not in s: - continue - d = s[IP].dst - if d not in trace: - trace[d] = {} - trace[d][s[IP].ttl] = r[IP].src, ICMP not in r - for k in trace.values(): - m = filter(lambda x:k[x][1], k.keys()) - if not m: - continue - m = min(m) - for l in k.keys(): - if l > m: - del(k[l]) - return trace - - def trace3D(self): - """Give a 3D representation of the traceroute. - right button: rotate the scene - middle button: zoom - left button: move the scene - left button on a ball: toggle IP displaying - ctrl-left button on a ball: scan ports 21,22,23,25,80 and 443 and display the result""" - trace = self.get_trace() - import visual - - class IPsphere(visual.sphere): - def __init__(self, ip, **kargs): - visual.sphere.__init__(self, **kargs) - self.ip=ip - self.label=None - self.setlabel(self.ip) - def setlabel(self, txt,visible=None): - if self.label is not None: - if visible is None: - visible = self.label.visible - self.label.visible = 0 - elif visible is None: - visible=0 - self.label=visual.label(text=txt, pos=self.pos, space=self.radius, xoffset=10, yoffset=20, visible=visible) - def action(self): - self.label.visible ^= 1 - - visual.scene = visual.display() - visual.scene.exit = True - start = visual.box() - rings={} - tr3d = {} - for i in trace: - tr = trace[i] - tr3d[i] = [] - ttl = tr.keys() - for t in range(1,max(ttl)+1): - if t not in rings: - rings[t] = [] - if t in tr: - if tr[t] not in rings[t]: - rings[t].append(tr[t]) - tr3d[i].append(rings[t].index(tr[t])) - else: - rings[t].append(("unk",-1)) - tr3d[i].append(len(rings[t])-1) - for t in rings: - r = rings[t] - l = len(r) - for i in range(l): - if r[i][1] == -1: - col = (0.75,0.75,0.75) - elif r[i][1]: - col = visual.color.green - else: - col = visual.color.blue - - s = IPsphere(pos=((l-1)*visual.cos(2*i*visual.pi/l),(l-1)*visual.sin(2*i*visual.pi/l),2*t), - ip = r[i][0], - color = col) - for trlst in tr3d.values(): - if t <= len(trlst): - if trlst[t-1] == i: - trlst[t-1] = s - forecol = colgen(0.625, 0.4375, 0.25, 0.125) - for trlst in tr3d.values(): - col = forecol.next() - start = (0,0,0) - for ip in trlst: - visual.cylinder(pos=start,axis=ip.pos-start,color=col,radius=0.2) - start = ip.pos - - movcenter=None - while 1: - visual.rate(50) - if visual.scene.kb.keys: - k = visual.scene.kb.getkey() - if k == "esc" or k == "q": - break - if visual.scene.mouse.events: - ev = visual.scene.mouse.getevent() - if ev.press == "left": - o = ev.pick - if o: - if ev.ctrl: - if o.ip == "unk": - continue - savcolor = o.color - o.color = (1,0,0) - a,b=sr(IP(dst=o.ip)/TCP(dport=[21,22,23,25,80,443]),timeout=2) - o.color = savcolor - if len(a) == 0: - txt = "%s:\nno results" % o.ip - else: - txt = "%s:\n" % o.ip - for s,r in a: - txt += r.sprintf("{TCP:%IP.src%:%TCP.sport% %TCP.flags%}{TCPerror:%IPerror.dst%:%TCPerror.dport% %IP.src% %ir,ICMP.type%}\n") - o.setlabel(txt, visible=1) - else: - if hasattr(o, "action"): - o.action() - elif ev.drag == "left": - movcenter = ev.pos - elif ev.drop == "left": - movcenter = None - if movcenter: - visual.scene.center -= visual.scene.mouse.pos-movcenter - movcenter = visual.scene.mouse.pos - - - def world_trace(self): - from modules.geo import locate_ip - ips = {} - rt = {} - ports_done = {} - for s,r in self.res: - ips[r.src] = None - if s.haslayer(TCP) or s.haslayer(UDP): - trace_id = (s.src,s.dst,s.proto,s.dport) - elif s.haslayer(ICMP): - trace_id = (s.src,s.dst,s.proto,s.type) - else: - trace_id = (s.src,s.dst,s.proto,0) - trace = rt.get(trace_id,{}) - if not r.haslayer(ICMP) or r.type != 11: - if ports_done.has_key(trace_id): - continue - ports_done[trace_id] = None - trace[s.ttl] = r.src - rt[trace_id] = trace - - trt = {} - for trace_id in rt: - trace = rt[trace_id] - loctrace = [] - for i in range(max(trace.keys())): - ip = trace.get(i,None) - if ip is None: - continue - loc = locate_ip(ip) - if loc is None: - continue -# loctrace.append((ip,loc)) # no labels yet - loctrace.append(loc) - if loctrace: - trt[trace_id] = loctrace - - tr = map(lambda x: Gnuplot.Data(x,with_="lines"), trt.values()) - g = Gnuplot.Gnuplot() - world = Gnuplot.File(conf.gnuplot_world,with_="lines") - g.plot(world,*tr) - return g - - def make_graph(self,ASres=None,padding=0): - if ASres is None: - ASres = conf.AS_resolver - self.graphASres = ASres - self.graphpadding = padding - ips = {} - rt = {} - ports = {} - ports_done = {} - for s,r in self.res: - r = r.getlayer(IP) or (conf.ipv6_enabled and r[scapy.layers.inet6.IPv6]) or r - s = s.getlayer(IP) or (conf.ipv6_enabled and s[scapy.layers.inet6.IPv6]) or s - ips[r.src] = None - if TCP in s: - trace_id = (s.src,s.dst,6,s.dport) - elif UDP in s: - trace_id = (s.src,s.dst,17,s.dport) - elif ICMP in s: - trace_id = (s.src,s.dst,1,s.type) - else: - trace_id = (s.src,s.dst,s.proto,0) - trace = rt.get(trace_id,{}) - ttl = conf.ipv6_enabled and scapy.layers.inet6.IPv6 in s and s.hlim or s.ttl - if not (ICMP in r and r[ICMP].type == 11) and not (conf.ipv6_enabled and scapy.layers.inet6.IPv6 in r and scapy.layers.inet6.ICMPv6TimeExceeded in r): - if trace_id in ports_done: - continue - ports_done[trace_id] = None - p = ports.get(r.src,[]) - if TCP in r: - p.append(r.sprintf("<T%ir,TCP.sport%> %TCP.sport% %TCP.flags%")) - trace[ttl] = r.sprintf('"%r,src%":T%ir,TCP.sport%') - elif UDP in r: - p.append(r.sprintf("<U%ir,UDP.sport%> %UDP.sport%")) - trace[ttl] = r.sprintf('"%r,src%":U%ir,UDP.sport%') - elif ICMP in r: - p.append(r.sprintf("<I%ir,ICMP.type%> ICMP %ICMP.type%")) - trace[ttl] = r.sprintf('"%r,src%":I%ir,ICMP.type%') - else: - p.append(r.sprintf("{IP:<P%ir,proto%> IP %proto%}{IPv6:<P%ir,nh%> IPv6 %nh%}")) - trace[ttl] = r.sprintf('"%r,src%":{IP:P%ir,proto%}{IPv6:P%ir,nh%}') - ports[r.src] = p - else: - trace[ttl] = r.sprintf('"%r,src%"') - rt[trace_id] = trace - - # Fill holes with unk%i nodes - unknown_label = incremental_label("unk%i") - blackholes = [] - bhip = {} - for rtk in rt: - trace = rt[rtk] - k = trace.keys() - for n in range(min(k), max(k)): - if not trace.has_key(n): - trace[n] = unknown_label.next() - if not ports_done.has_key(rtk): - if rtk[2] == 1: #ICMP - bh = "%s %i/icmp" % (rtk[1],rtk[3]) - elif rtk[2] == 6: #TCP - bh = "%s %i/tcp" % (rtk[1],rtk[3]) - elif rtk[2] == 17: #UDP - bh = '%s %i/udp' % (rtk[1],rtk[3]) - else: - bh = '%s %i/proto' % (rtk[1],rtk[2]) - ips[bh] = None - bhip[rtk[1]] = bh - bh = '"%s"' % bh - trace[max(k)+1] = bh - blackholes.append(bh) - - # Find AS numbers - ASN_query_list = dict.fromkeys(map(lambda x:x.rsplit(" ",1)[0],ips)).keys() - if ASres is None: - ASNlist = [] - else: - ASNlist = ASres.resolve(*ASN_query_list) - - ASNs = {} - ASDs = {} - for ip,asn,desc, in ASNlist: - if asn is None: - continue - iplist = ASNs.get(asn,[]) - if ip in bhip: - if ip in ports: - iplist.append(ip) - iplist.append(bhip[ip]) - else: - iplist.append(ip) - ASNs[asn] = iplist - ASDs[asn] = desc - - - backcolorlist=colgen("60","86","ba","ff") - forecolorlist=colgen("a0","70","40","20") - - s = "digraph trace {\n" - - s += "\n\tnode [shape=ellipse,color=black,style=solid];\n\n" - - s += "\n#ASN clustering\n" - for asn in ASNs: - s += '\tsubgraph cluster_%s {\n' % asn - col = backcolorlist.next() - s += '\t\tcolor="#%s%s%s";' % col - s += '\t\tnode [fillcolor="#%s%s%s",style=filled];' % col - s += '\t\tfontsize = 10;' - s += '\t\tlabel = "%s\\n[%s]"\n' % (asn,ASDs[asn]) - for ip in ASNs[asn]: - - s += '\t\t"%s";\n'%ip - s += "\t}\n" - - - - - s += "#endpoints\n" - for p in ports: - s += '\t"%s" [shape=record,color=black,fillcolor=green,style=filled,label="%s|%s"];\n' % (p,p,"|".join(ports[p])) - - s += "\n#Blackholes\n" - for bh in blackholes: - s += '\t%s [shape=octagon,color=black,fillcolor=red,style=filled];\n' % bh - - if padding: - s += "\n#Padding\n" - pad={} - for snd,rcv in self.res: - if rcv.src not in ports and rcv.haslayer(conf.padding_layer): - p = rcv.getlayer(conf.padding_layer).load - if p != "\x00"*len(p): - pad[rcv.src]=None - for rcv in pad: - s += '\t"%s" [shape=triangle,color=black,fillcolor=red,style=filled];\n' % rcv - - - - s += "\n\tnode [shape=ellipse,color=black,style=solid];\n\n" - - - for rtk in rt: - s += "#---[%s\n" % `rtk` - s += '\t\tedge [color="#%s%s%s"];\n' % forecolorlist.next() - trace = rt[rtk] - k = trace.keys() - for n in range(min(k), max(k)): - s += '\t%s ->\n' % trace[n] - s += '\t%s;\n' % trace[max(k)] - - s += "}\n"; - self.graphdef = s - - def graph(self, ASres=None, padding=0, **kargs): - """x.graph(ASres=conf.AS_resolver, other args): - ASres=None : no AS resolver => no clustering - ASres=AS_resolver() : default whois AS resolver (riswhois.ripe.net) - ASres=AS_resolver_cymru(): use whois.cymru.com whois database - ASres=AS_resolver(server="whois.ra.net") - type: output type (svg, ps, gif, jpg, etc.), passed to dot's "-T" option - target: filename or redirect. Defaults pipe to Imagemagick's display program - prog: which graphviz program to use""" - if ASres is None: - ASres = conf.AS_resolver - if (self.graphdef is None or - self.graphASres != ASres or - self.graphpadding != padding): - self.make_graph(ASres,padding) - - return do_graph(self.graphdef, **kargs) - - - -@conf.commands.register -def traceroute(target, dport=80, minttl=1, maxttl=30, sport=RandShort(), l4 = None, filter=None, timeout=2, verbose=None, **kargs): - """Instant TCP traceroute -traceroute(target, [maxttl=30,] [dport=80,] [sport=80,] [verbose=conf.verb]) -> None -""" - if verbose is None: - verbose = conf.verb - if filter is None: - # we only consider ICMP error packets and TCP packets with at - # least the ACK flag set *and* either the SYN or the RST flag - # set - filter="(icmp and (icmp[0]=3 or icmp[0]=4 or icmp[0]=5 or icmp[0]=11 or icmp[0]=12)) or (tcp and (tcp[13] & 0x16 > 0x10))" - if l4 is None: - a,b = sr(IP(dst=target, id=RandShort(), ttl=(minttl,maxttl))/TCP(seq=RandInt(),sport=sport, dport=dport), - timeout=timeout, filter=filter, verbose=verbose, **kargs) - else: - # this should always work - filter="ip" - a,b = sr(IP(dst=target, id=RandShort(), ttl=(minttl,maxttl))/l4, - timeout=timeout, filter=filter, verbose=verbose, **kargs) - - a = TracerouteResult(a.res) - if verbose: - a.show() - return a,b - - - -############################# -## Simple TCP client stack ## -############################# - -class TCP_client(Automaton): - - def parse_args(self, ip, port, *args, **kargs): - self.dst = iter(Net(ip)).next() - self.dport = port - self.sport = random.randrange(0,2**16) - self.l4 = IP(dst=ip)/TCP(sport=self.sport, dport=self.dport, flags=0, - seq=random.randrange(0,2**32)) - self.src = self.l4.src - self.swin=self.l4[TCP].window - self.dwin=1 - self.rcvbuf="" - bpf = "host %s and host %s and port %i and port %i" % (self.src, - self.dst, - self.sport, - self.dport) - -# bpf=None - Automaton.parse_args(self, filter=bpf, **kargs) - - - def master_filter(self, pkt): - return (IP in pkt and - pkt[IP].src == self.dst and - pkt[IP].dst == self.src and - TCP in pkt and - pkt[TCP].sport == self.dport and - pkt[TCP].dport == self.sport and - self.l4[TCP].seq >= pkt[TCP].ack and # XXX: seq/ack 2^32 wrap up - ((self.l4[TCP].ack == 0) or (self.l4[TCP].ack <= pkt[TCP].seq <= self.l4[TCP].ack+self.swin)) ) - - - @ATMT.state(initial=1) - def START(self): - pass - - @ATMT.state() - def SYN_SENT(self): - pass - - @ATMT.state() - def ESTABLISHED(self): - pass - - @ATMT.state() - def LAST_ACK(self): - pass - - @ATMT.state(final=1) - def CLOSED(self): - pass - - - @ATMT.condition(START) - def connect(self): - raise self.SYN_SENT() - @ATMT.action(connect) - def send_syn(self): - self.l4[TCP].flags = "S" - self.send(self.l4) - self.l4[TCP].seq += 1 - - - @ATMT.receive_condition(SYN_SENT) - def synack_received(self, pkt): - if pkt[TCP].flags & 0x3f == 0x12: - raise self.ESTABLISHED().action_parameters(pkt) - @ATMT.action(synack_received) - def send_ack_of_synack(self, pkt): - self.l4[TCP].ack = pkt[TCP].seq+1 - self.l4[TCP].flags = "A" - self.send(self.l4) - - @ATMT.receive_condition(ESTABLISHED) - def incoming_data_received(self, pkt): - if not isinstance(pkt[TCP].payload, NoPayload) and not isinstance(pkt[TCP].payload, conf.padding_layer): - raise self.ESTABLISHED().action_parameters(pkt) - @ATMT.action(incoming_data_received) - def receive_data(self,pkt): - data = str(pkt[TCP].payload) - if data and self.l4[TCP].ack == pkt[TCP].seq: - self.l4[TCP].ack += len(data) - self.l4[TCP].flags = "A" - self.send(self.l4) - self.rcvbuf += data - if pkt[TCP].flags & 8 != 0: #PUSH - self.oi.tcp.send(self.rcvbuf) - self.rcvbuf = "" - - @ATMT.ioevent(ESTABLISHED,name="tcp", as_supersocket="tcplink") - def outgoing_data_received(self, fd): - raise self.ESTABLISHED().action_parameters(fd.recv()) - @ATMT.action(outgoing_data_received) - def send_data(self, d): - self.l4[TCP].flags = "PA" - self.send(self.l4/d) - self.l4[TCP].seq += len(d) - - - @ATMT.receive_condition(ESTABLISHED) - def reset_received(self, pkt): - if pkt[TCP].flags & 4 != 0: - raise self.CLOSED() - - @ATMT.receive_condition(ESTABLISHED) - def fin_received(self, pkt): - if pkt[TCP].flags & 0x1 == 1: - raise self.LAST_ACK().action_parameters(pkt) - @ATMT.action(fin_received) - def send_finack(self, pkt): - self.l4[TCP].flags = "FA" - self.l4[TCP].ack = pkt[TCP].seq+1 - self.send(self.l4) - self.l4[TCP].seq += 1 - - @ATMT.receive_condition(LAST_ACK) - def ack_of_fin_received(self, pkt): - if pkt[TCP].flags & 0x3f == 0x10: - raise self.CLOSED() - - - - -##################### -## Reporting stuff ## -##################### - -def report_ports(target, ports): - """portscan a target and output a LaTeX table -report_ports(target, ports) -> string""" - ans,unans = sr(IP(dst=target)/TCP(dport=ports),timeout=5) - rep = "\\begin{tabular}{|r|l|l|}\n\\hline\n" - for s,r in ans: - if not r.haslayer(ICMP): - if r.payload.flags == 0x12: - rep += r.sprintf("%TCP.sport% & open & SA \\\\\n") - rep += "\\hline\n" - for s,r in ans: - if r.haslayer(ICMP): - rep += r.sprintf("%TCPerror.dport% & closed & ICMP type %ICMP.type%/%ICMP.code% from %IP.src% \\\\\n") - elif r.payload.flags != 0x12: - rep += r.sprintf("%TCP.sport% & closed & TCP %TCP.flags% \\\\\n") - rep += "\\hline\n" - for i in unans: - rep += i.sprintf("%TCP.dport% & ? & unanswered \\\\\n") - rep += "\\hline\n\\end{tabular}\n" - return rep - - - -def IPID_count(lst, funcID=lambda x:x[1].id, funcpres=lambda x:x[1].summary()): - idlst = map(funcID, lst) - idlst.sort() - classes = [idlst[0]]+map(lambda x:x[1],filter(lambda (x,y): abs(x-y)>50, map(lambda x,y: (x,y),idlst[:-1], idlst[1:]))) - lst = map(lambda x:(funcID(x), funcpres(x)), lst) - lst.sort() - print "Probably %i classes:" % len(classes), classes - for id,pr in lst: - print "%5i" % id, pr - - -def fragleak(target,sport=123, dport=123, timeout=0.2, onlyasc=0): - load = "XXXXYYYYYYYYYY" -# getmacbyip(target) -# pkt = IP(dst=target, id=RandShort(), options="\x22"*40)/UDP()/load - pkt = IP(dst=target, id=RandShort(), options="\x00"*40, flags=1)/UDP(sport=sport, dport=sport)/load - s=conf.L3socket() - intr=0 - found={} - try: - while 1: - try: - if not intr: - s.send(pkt) - sin,sout,serr = select([s],[],[],timeout) - if not sin: - continue - ans=s.recv(1600) - if not isinstance(ans, IP): #TODO: IPv6 - continue - if not isinstance(ans.payload, ICMP): - continue - if not isinstance(ans.payload.payload, IPerror): - continue - if ans.payload.payload.dst != target: - continue - if ans.src != target: - print "leak from", ans.src, - - -# print repr(ans) - if not ans.haslayer(conf.padding_layer): - continue - - -# print repr(ans.payload.payload.payload.payload) - -# if not isinstance(ans.payload.payload.payload.payload, conf.raw_layer): -# continue -# leak = ans.payload.payload.payload.payload.load[len(load):] - leak = ans.getlayer(conf.padding_layer).load - if leak not in found: - found[leak]=None - linehexdump(leak, onlyasc=onlyasc) - except KeyboardInterrupt: - if intr: - raise - intr=1 - except KeyboardInterrupt: - pass - -def fragleak2(target, timeout=0.4, onlyasc=0): - found={} - try: - while 1: - p = sr1(IP(dst=target, options="\x00"*40, proto=200)/"XXXXYYYYYYYYYYYY",timeout=timeout,verbose=0) - if not p: - continue - if conf.padding_layer in p: - leak = p[conf.padding_layer].load - if leak not in found: - found[leak]=None - linehexdump(leak,onlyasc=onlyasc) - except: - pass - - -conf.stats_classic_protocols += [TCP,UDP,ICMP] -conf.stats_dot11_protocols += [TCP,UDP,ICMP] - -if conf.ipv6_enabled: - import scapy.layers.inet6 diff --git a/scripts/external_libs/scapy-2.3.1/scapy/layers/inet6.py b/scripts/external_libs/scapy-2.3.1/scapy/layers/inet6.py deleted file mode 100644 index 46cd85e5..00000000 --- a/scripts/external_libs/scapy-2.3.1/scapy/layers/inet6.py +++ /dev/null @@ -1,3011 +0,0 @@ -#! /usr/bin/env python -############################################################################# -## ## -## inet6.py --- IPv6 support for Scapy ## -## see http://natisbad.org/IPv6/ ## -## for more informations ## -## ## -## Copyright (C) 2005 Guillaume Valadon <guedou@hongo.wide.ad.jp> ## -## Arnaud Ebalard <arnaud.ebalard@eads.net> ## -## ## -## This program is free software; you can redistribute it and/or modify it ## -## under the terms of the GNU General Public License version 2 as ## -## published by the Free Software Foundation. ## -## ## -## This program is distributed in the hope that it will be useful, but ## -## WITHOUT ANY WARRANTY; without even the implied warranty of ## -## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU ## -## General Public License for more details. ## -## ## -############################################################################# - -""" -IPv6 (Internet Protocol v6). -""" - - -import socket -if not socket.has_ipv6: - raise socket.error("can't use AF_INET6, IPv6 is disabled") -if not hasattr(socket, "IPPROTO_IPV6"): - # Workaround for http://bugs.python.org/issue6926 - socket.IPPROTO_IPV6 = 41 - -if not ('IPPROTO_IPIP ' in globals()): - IPPROTO_IPIP=4 - - -from scapy.config import conf -from scapy.layers.l2 import * -from scapy.layers.inet import * -from scapy.fields import * -from scapy.packet import * -from scapy.volatile import * -from scapy.sendrecv import sr,sr1,srp1 -from scapy.as_resolvers import AS_resolver_riswhois -from scapy.supersocket import SuperSocket,L3RawSocket -from scapy.arch import * -from scapy.utils6 import * - - -############################################################################# -# Helpers ## -############################################################################# - -def get_cls(name, fallback_cls): - return globals().get(name, fallback_cls) - - -########################## -## Neighbor cache stuff ## -########################## - -conf.netcache.new_cache("in6_neighbor", 120) - -def neighsol(addr, src, iface, timeout=1, chainCC=0): - """ - Sends an ICMPv6 Neighbor Solicitation message to get the MAC address - of the neighbor with specified IPv6 address addr. 'src' address is - used as source of the message. Message is sent on iface. By default, - timeout waiting for an answer is 1 second. - - If no answer is gathered, None is returned. Else, the answer is - returned (ethernet frame). - """ - - nsma = in6_getnsma(inet_pton(socket.AF_INET6, addr)) - d = inet_ntop(socket.AF_INET6, nsma) - dm = in6_getnsmac(nsma) - p = Ether(dst=dm)/IPv6(dst=d, src=src, hlim=255) - p /= ICMPv6ND_NS(tgt=addr) - p /= ICMPv6NDOptSrcLLAddr(lladdr=get_if_hwaddr(iface)) - res = srp1(p,type=ETH_P_IPV6, iface=iface, timeout=1, verbose=0, - chainCC=chainCC) - - return res - -def getmacbyip6(ip6, chainCC=0): - """ - Returns the mac address to be used for provided 'ip6' peer. - neighborCache.get() method is used on instantiated neighbor cache. - Resolution mechanism is described in associated doc string. - - (chainCC parameter value ends up being passed to sending function - used to perform the resolution, if needed) - """ - - if in6_ismaddr(ip6): # Multicast - mac = in6_getnsmac(inet_pton(socket.AF_INET6, ip6)) - return mac - - iff,a,nh = conf.route6.route(ip6, dev=conf.iface6) - - if iff == LOOPBACK_NAME: - return "ff:ff:ff:ff:ff:ff" - - if nh != '::': - ip6 = nh # Found next hop - - mac = conf.netcache.in6_neighbor.get(ip6) - if mac: - return mac - - res = neighsol(ip6, a, iff, chainCC=chainCC) - - if res is not None: - if ICMPv6NDOptDstLLAddr in res: - mac = res[ICMPv6NDOptDstLLAddr].lladdr - else: - mac = res.src - conf.netcache.in6_neighbor[ip6] = mac - return mac - - return None - - -############################################################################# -############################################################################# -### IPv6 addresses manipulation routines ### -############################################################################# -############################################################################# - -class Net6(Gen): # syntax ex. fec0::/126 - """Generate a list of IPv6s from a network address or a name""" - name = "ipv6" - ipaddress = re.compile(r"^([a-fA-F0-9:]+)(/[1]?[0-3]?[0-9])?$") - - def __init__(self, net): - self.repr = net - - tmp = net.split('/')+["128"] - if not self.ipaddress.match(net): - tmp[0]=socket.getaddrinfo(tmp[0], None, socket.AF_INET6)[0][-1][0] - - netmask = int(tmp[1]) - self.net = inet_pton(socket.AF_INET6, tmp[0]) - self.mask = in6_cidr2mask(netmask) - self.plen = netmask - - def __iter__(self): - def m8(i): - if i % 8 == 0: - return i - tuple = filter(lambda x: m8(x), xrange(8, 129)) - - a = in6_and(self.net, self.mask) - tmp = map(lambda x: x, struct.unpack('16B', a)) - - def parse_digit(a, netmask): - netmask = min(8,max(netmask,0)) - a = (int(a) & (0xffL<<netmask),(int(a) | (0xffL>>(8-netmask)))+1) - return a - self.parsed = map(lambda x,y: parse_digit(x,y), tmp, map(lambda x,nm=self.plen: x-nm, tuple)) - - def rec(n, l): - if n and n % 2 == 0: - sep = ':' - else: - sep = '' - if n == 16: - return l - else: - ll = [] - for i in xrange(*self.parsed[n]): - for y in l: - ll += [y+sep+'%.2x'%i] - return rec(n+1, ll) - - return iter(rec(0, [''])) - - def __repr__(self): - return "<Net6 %s>" % self.repr - - - - - - -############################################################################# -############################################################################# -### IPv6 Class ### -############################################################################# -############################################################################# - -class IP6Field(Field): - def __init__(self, name, default): - Field.__init__(self, name, default, "16s") - def h2i(self, pkt, x): - if type(x) is str: - try: - x = in6_ptop(x) - except socket.error: - x = Net6(x) - elif type(x) is list: - x = map(Net6, x) - return x - def i2m(self, pkt, x): - return inet_pton(socket.AF_INET6, x) - def m2i(self, pkt, x): - return inet_ntop(socket.AF_INET6, x) - def any2i(self, pkt, x): - return self.h2i(pkt,x) - def i2repr(self, pkt, x): - if x is None: - return self.i2h(pkt,x) - elif not isinstance(x, Net6) and not type(x) is list: - if in6_isaddrTeredo(x): # print Teredo info - server, flag, maddr, mport = teredoAddrExtractInfo(x) - return "%s [Teredo srv: %s cli: %s:%s]" % (self.i2h(pkt, x), server, maddr,mport) - elif in6_isaddr6to4(x): # print encapsulated address - vaddr = in6_6to4ExtractAddr(x) - return "%s [6to4 GW: %s]" % (self.i2h(pkt, x), vaddr) - return self.i2h(pkt, x) # No specific information to return - def randval(self): - return RandIP6() - -class SourceIP6Field(IP6Field): - def __init__(self, name, dstname): - IP6Field.__init__(self, name, None) - self.dstname = dstname - def i2m(self, pkt, x): - if x is None: - dst=getattr(pkt,self.dstname) - iff,x,nh = conf.route6.route(dst) - return IP6Field.i2m(self, pkt, x) - def i2h(self, pkt, x): - if x is None: - dst=getattr(pkt,self.dstname) - if isinstance(dst,Gen): - r = map(conf.route6.route, dst) - r.sort() - if r[0] == r[-1]: - x=r[0][1] - else: - warning("More than one possible route for %s"%repr(dst)) - return None - else: - iff,x,nh = conf.route6.route(dst) - return IP6Field.i2h(self, pkt, x) - -ipv6nh = { 0:"Hop-by-Hop Option Header", - 4:"IP", - 6:"TCP", - 17:"UDP", - 41:"IPv6", - 43:"Routing Header", - 44:"Fragment Header", - 47:"GRE", - 50:"ESP Header", - 51:"AH Header", - 58:"ICMPv6", - 59:"No Next Header", - 60:"Destination Option Header", - 135:"Mobility Header"} - -ipv6nhcls = { 0: "IPv6ExtHdrHopByHop", - 4: "IP", - 6: "TCP", - 17: "UDP", - 43: "IPv6ExtHdrRouting", - 44: "IPv6ExtHdrFragment", - #50: "IPv6ExtHrESP", - #51: "IPv6ExtHdrAH", - 58: "ICMPv6Unknown", - 59: "Raw", - 60: "IPv6ExtHdrDestOpt" } - -class IP6ListField(StrField): - islist = 1 - def __init__(self, name, default, count_from=None, length_from=None): - if default is None: - default = [] - StrField.__init__(self, name, default) - self.count_from = count_from - self.length_from = length_from - - def i2len(self, pkt, i): - return 16*len(i) - - def i2count(self, pkt, i): - if type(i) is list: - return len(i) - return 0 - - def getfield(self, pkt, s): - c = l = None - if self.length_from is not None: - l = self.length_from(pkt) - elif self.count_from is not None: - c = self.count_from(pkt) - - lst = [] - ret = "" - remain = s - if l is not None: - remain,ret = s[:l],s[l:] - while remain: - if c is not None: - if c <= 0: - break - c -= 1 - addr = inet_ntop(socket.AF_INET6, remain[:16]) - lst.append(addr) - remain = remain[16:] - return remain+ret,lst - - def i2m(self, pkt, x): - s = '' - for y in x: - try: - y = inet_pton(socket.AF_INET6, y) - except: - y = socket.getaddrinfo(y, None, socket.AF_INET6)[0][-1][0] - y = inet_pton(socket.AF_INET6, y) - s += y - return s - - def i2repr(self,pkt,x): - s = [] - if x == None: - return "[]" - for y in x: - s.append('%s' % y) - return "[ %s ]" % (", ".join(s)) - -class _IPv6GuessPayload: - name = "Dummy class that implements guess_payload_class() for IPv6" - def default_payload_class(self,p): - if self.nh == 58: # ICMPv6 - t = ord(p[0]) - if len(p) > 2 and t == 139 or t == 140: # Node Info Query - return _niquery_guesser(p) - if len(p) >= icmp6typesminhdrlen.get(t, sys.maxint): # Other ICMPv6 messages - return get_cls(icmp6typescls.get(t,"Raw"), "Raw") - return Raw - elif self.nh == 135 and len(p) > 3: # Mobile IPv6 - return _mip6_mhtype2cls.get(ord(p[2]), MIP6MH_Generic) - else: - return get_cls(ipv6nhcls.get(self.nh,"Raw"), "Raw") - -class IPv6(_IPv6GuessPayload, Packet, IPTools): - name = "IPv6" - fields_desc = [ BitField("version" , 6 , 4), - BitField("tc", 0, 8), #TODO: IPv6, ByteField ? - BitField("fl", 0, 20), - ShortField("plen", None), - ByteEnumField("nh", 59, ipv6nh), - ByteField("hlim", 64), - IP6Field("src", "::2"), - #SourceIP6Field("src", "dst"), # dst is for src @ selection - IP6Field("dst", "::1") ] - - def route(self): - dst = self.dst - if isinstance(dst,Gen): - dst = iter(dst).next() - return conf.route6.route(dst) - - def mysummary(self): - return "%s > %s (%i)" % (self.src,self.dst, self.nh) - - def post_build(self, p, pay): - p += pay - if self.plen is None: - l = len(p) - 40 - p = p[:4]+struct.pack("!H", l)+p[6:] - return p - - def extract_padding(self, s): - l = self.plen - return s[:l], s[l:] - - def hashret(self): - if self.nh == 58 and isinstance(self.payload, _ICMPv6): - if self.payload.type < 128: - return self.payload.payload.hashret() - elif (self.payload.type in [133,134,135,136,144,145]): - return struct.pack("B", self.nh)+self.payload.hashret() - - nh = self.nh - sd = self.dst - ss = self.src - if self.nh == 43 and isinstance(self.payload, IPv6ExtHdrRouting): - # With routing header, the destination is the last - # address of the IPv6 list if segleft > 0 - nh = self.payload.nh - try: - sd = self.addresses[-1] - except IndexError: - sd = '::1' - # TODO: big bug with ICMPv6 error messages as the destination of IPerror6 - # could be anything from the original list ... - if 1: - sd = inet_pton(socket.AF_INET6, sd) - for a in self.addresses: - a = inet_pton(socket.AF_INET6, a) - sd = strxor(sd, a) - sd = inet_ntop(socket.AF_INET6, sd) - - if self.nh == 44 and isinstance(self.payload, IPv6ExtHdrFragment): - nh = self.payload.nh - - if self.nh == 0 and isinstance(self.payload, IPv6ExtHdrHopByHop): - nh = self.payload.nh - - if self.nh == 60 and isinstance(self.payload, IPv6ExtHdrDestOpt): - foundhao = None - for o in self.payload.options: - if isinstance(o, HAO): - foundhao = o - if foundhao: - nh = self.payload.nh # XXX what if another extension follows ? - ss = foundhao.hoa - - if conf.checkIPsrc and conf.checkIPaddr: - sd = inet_pton(socket.AF_INET6, sd) - ss = inet_pton(socket.AF_INET6, self.src) - return struct.pack("B",nh)+self.payload.hashret() - else: - return struct.pack("B", nh)+self.payload.hashret() - - def answers(self, other): - if not isinstance(other, IPv6): # self is reply, other is request - return False - if conf.checkIPaddr: - ss = inet_pton(socket.AF_INET6, self.src) - sd = inet_pton(socket.AF_INET6, self.dst) - os = inet_pton(socket.AF_INET6, other.src) - od = inet_pton(socket.AF_INET6, other.dst) - # request was sent to a multicast address (other.dst) - # Check reply destination addr matches request source addr (i.e - # sd == os) except when reply is multicasted too - # XXX test mcast scope matching ? - if in6_ismaddr(other.dst): - if in6_ismaddr(self.dst): - if ((od == sd) or - (in6_isaddrllallnodes(self.dst) and in6_isaddrllallservers(other.dst))): - return self.payload.answers(other.payload) - return False - if (os == sd): - return self.payload.answers(other.payload) - return False - elif (sd != os): # or ss != od): <- removed for ICMP errors - return False - if self.nh == 58 and isinstance(self.payload, _ICMPv6) and self.payload.type < 128: - # ICMPv6 Error message -> generated by IPv6 packet - # Note : at the moment, we jump the ICMPv6 specific class - # to call answers() method of erroneous packet (over - # initial packet). There can be cases where an ICMPv6 error - # class could implement a specific answers method that perform - # a specific task. Currently, don't see any use ... - return self.payload.payload.answers(other) - elif other.nh == 0 and isinstance(other.payload, IPv6ExtHdrHopByHop): - return self.payload.answers(other.payload.payload) - elif other.nh == 44 and isinstance(other.payload, IPv6ExtHdrFragment): - return self.payload.answers(other.payload.payload) - elif other.nh == 43 and isinstance(other.payload, IPv6ExtHdrRouting): - return self.payload.answers(other.payload.payload) # Buggy if self.payload is a IPv6ExtHdrRouting - elif other.nh == 60 and isinstance(other.payload, IPv6ExtHdrDestOpt): - return self.payload.payload.answers(other.payload.payload) - elif self.nh == 60 and isinstance(self.payload, IPv6ExtHdrDestOpt): # BU in reply to BRR, for instance - return self.payload.payload.answers(other.payload) - else: - if (self.nh != other.nh): - return False - return self.payload.answers(other.payload) - - -conf.neighbor.register_l3(Ether, IPv6, lambda l2,l3: getmacbyip6(l3.dst)) - - -class IPerror6(IPv6): - name = "IPv6 in ICMPv6" - def answers(self, other): - if not isinstance(other, IPv6): - return False - sd = inet_pton(socket.AF_INET6, self.dst) - ss = inet_pton(socket.AF_INET6, self.src) - od = inet_pton(socket.AF_INET6, other.dst) - os = inet_pton(socket.AF_INET6, other.src) - - # Make sure that the ICMPv6 error is related to the packet scapy sent - if isinstance(self.underlayer, _ICMPv6) and self.underlayer.type < 128: - - # find upper layer for self (possible citation) - selfup = self.payload - while selfup is not None and isinstance(selfup, _IPv6ExtHdr): - selfup = selfup.payload - - # find upper layer for other (initial packet). Also look for RH - otherup = other.payload - request_has_rh = False - while otherup is not None and isinstance(otherup, _IPv6ExtHdr): - if isinstance(otherup, IPv6ExtHdrRouting): - request_has_rh = True - otherup = otherup.payload - - if ((ss == os and sd == od) or # <- Basic case - (ss == os and request_has_rh)): # <- Request has a RH : - # don't check dst address - - # Let's deal with possible MSS Clamping - if (isinstance(selfup, TCP) and - isinstance(otherup, TCP) and - selfup.options != otherup.options): # seems clamped - - # Save fields modified by MSS clamping - old_otherup_opts = otherup.options - old_otherup_cksum = otherup.chksum - old_otherup_dataofs = otherup.dataofs - old_selfup_opts = selfup.options - old_selfup_cksum = selfup.chksum - old_selfup_dataofs = selfup.dataofs - - # Nullify them - otherup.options = [] - otherup.chksum = 0 - otherup.dataofs = 0 - selfup.options = [] - selfup.chksum = 0 - selfup.dataofs = 0 - - # Test it and save result - s1 = str(selfup) - s2 = str(otherup) - l = min(len(s1), len(s2)) - res = s1[:l] == s2[:l] - - # recall saved values - otherup.options = old_otherup_opts - otherup.chksum = old_otherup_cksum - otherup.dataofs = old_otherup_dataofs - selfup.options = old_selfup_opts - selfup.chksum = old_selfup_cksum - selfup.dataofs = old_selfup_dataofs - - return res - - s1 = str(selfup) - s2 = str(otherup) - l = min(len(s1), len(s2)) - return s1[:l] == s2[:l] - - return False - - def mysummary(self): - return Packet.mysummary(self) - - -############################################################################# -############################################################################# -### Upper Layer Checksum computation ### -############################################################################# -############################################################################# - -class PseudoIPv6(Packet): # IPv6 Pseudo-header for checksum computation - name = "Pseudo IPv6 Header" - fields_desc = [ IP6Field("src", "::"), - IP6Field("dst", "::"), - ShortField("uplen", None), - BitField("zero", 0, 24), - ByteField("nh", 0) ] - -def in6_chksum(nh, u, p): - """ - Performs IPv6 Upper Layer checksum computation. Provided parameters are: - - - 'nh' : value of upper layer protocol - - 'u' : upper layer instance (TCP, UDP, ICMPv6*, ). Instance must be - provided with all under layers (IPv6 and all extension headers, - for example) - - 'p' : the payload of the upper layer provided as a string - - Functions operate by filling a pseudo header class instance (PseudoIPv6) - with - - Next Header value - - the address of _final_ destination (if some Routing Header with non - segleft field is present in underlayer classes, last address is used.) - - the address of _real_ source (basically the source address of an - IPv6 class instance available in the underlayer or the source address - in HAO option if some Destination Option header found in underlayer - includes this option). - - the length is the length of provided payload string ('p') - """ - - ph6 = PseudoIPv6() - ph6.nh = nh - rthdr = 0 - hahdr = 0 - final_dest_addr_found = 0 - while u != None and not isinstance(u, IPv6): - if (isinstance(u, IPv6ExtHdrRouting) and - u.segleft != 0 and len(u.addresses) != 0 and - final_dest_addr_found == 0): - rthdr = u.addresses[-1] - final_dest_addr_found = 1 - elif (isinstance(u, IPv6ExtHdrDestOpt) and (len(u.options) == 1) and - isinstance(u.options[0], HAO)): - hahdr = u.options[0].hoa - u = u.underlayer - if u is None: - warning("No IPv6 underlayer to compute checksum. Leaving null.") - return 0 - if hahdr: - ph6.src = hahdr - else: - ph6.src = u.src - if rthdr: - ph6.dst = rthdr - else: - ph6.dst = u.dst - ph6.uplen = len(p) - ph6s = str(ph6) - return checksum(ph6s+p) - - -############################################################################# -############################################################################# -### Extension Headers ### -############################################################################# -############################################################################# - - -# Inherited by all extension header classes -class _IPv6ExtHdr(_IPv6GuessPayload, Packet): - name = 'Abstract IPV6 Option Header' - aliastypes = [IPv6, IPerror6] # TODO ... - - -#################### IPv6 options for Extension Headers ##################### - -_hbhopts = { 0x00: "Pad1", - 0x01: "PadN", - 0x04: "Tunnel Encapsulation Limit", - 0x05: "Router Alert", - 0x06: "Quick-Start", - 0xc2: "Jumbo Payload", - 0xc9: "Home Address Option" } - -class _OTypeField(ByteEnumField): - """ - Modified BytEnumField that displays information regarding the IPv6 option - based on its option type value (What should be done by nodes that process - the option if they do not understand it ...) - - It is used by Jumbo, Pad1, PadN, RouterAlert, HAO options - """ - pol = {0x00: "00: skip", - 0x40: "01: discard", - 0x80: "10: discard+ICMP", - 0xC0: "11: discard+ICMP not mcast"} - - enroutechange = {0x00: "0: Don't change en-route", - 0x20: "1: May change en-route" } - - def i2repr(self, pkt, x): - s = self.i2s.get(x, repr(x)) - polstr = self.pol[(x & 0xC0)] - enroutechangestr = self.enroutechange[(x & 0x20)] - return "%s [%s, %s]" % (s, polstr, enroutechangestr) - -class HBHOptUnknown(Packet): # IPv6 Hop-By-Hop Option - name = "Scapy6 Unknown Option" - fields_desc = [_OTypeField("otype", 0x01, _hbhopts), - FieldLenField("optlen", None, length_of="optdata", fmt="B"), - StrLenField("optdata", "", - length_from = lambda pkt: pkt.optlen) ] - def alignment_delta(self, curpos): # By default, no alignment requirement - """ - As specified in section 4.2 of RFC 2460, every options has - an alignment requirement ususally expressed xn+y, meaning - the Option Type must appear at an integer multiple of x octest - from the start of the header, plus y octet. - - That function is provided the current position from the - start of the header and returns required padding length. - """ - return 0 - -class Pad1(Packet): # IPv6 Hop-By-Hop Option - name = "Pad1" - fields_desc = [ _OTypeField("otype", 0x00, _hbhopts) ] - def alignment_delta(self, curpos): # No alignment requirement - return 0 - -class PadN(Packet): # IPv6 Hop-By-Hop Option - name = "PadN" - fields_desc = [_OTypeField("otype", 0x01, _hbhopts), - FieldLenField("optlen", None, length_of="optdata", fmt="B"), - StrLenField("optdata", "", - length_from = lambda pkt: pkt.optlen)] - def alignment_delta(self, curpos): # No alignment requirement - return 0 - -class RouterAlert(Packet): # RFC 2711 - IPv6 Hop-By-Hop Option - name = "Router Alert" - fields_desc = [_OTypeField("otype", 0x05, _hbhopts), - ByteField("optlen", 2), - ShortEnumField("value", None, - { 0: "Datagram contains a MLD message", - 1: "Datagram contains RSVP message", - 2: "Datagram contains an Active Network message" }) ] - # TODO : Check IANA has not defined new values for value field of RouterAlertOption - # TODO : now that we have that option, we should do something in MLD class that need it - def alignment_delta(self, curpos): # alignment requirement : 2n+0 - x = 2 ; y = 0 - delta = x*((curpos - y + x - 1)/x) + y - curpos - return delta - -class Jumbo(Packet): # IPv6 Hop-By-Hop Option - name = "Jumbo Payload" - fields_desc = [_OTypeField("otype", 0xC2, _hbhopts), - ByteField("optlen", 4), - IntField("jumboplen", None) ] - def alignment_delta(self, curpos): # alignment requirement : 4n+2 - x = 4 ; y = 2 - delta = x*((curpos - y + x - 1)/x) + y - curpos - return delta - -class HAO(Packet): # IPv6 Destination Options Header Option - name = "Home Address Option" - fields_desc = [_OTypeField("otype", 0xC9, _hbhopts), - ByteField("optlen", 16), - IP6Field("hoa", "::") ] - def alignment_delta(self, curpos): # alignment requirement : 8n+6 - x = 8 ; y = 6 - delta = x*((curpos - y + x - 1)/x) + y - curpos - return delta - -_hbhoptcls = { 0x00: Pad1, - 0x01: PadN, - 0x05: RouterAlert, - 0xC2: Jumbo, - 0xC9: HAO } - - -######################## Hop-by-Hop Extension Header ######################## - -class _HopByHopOptionsField(PacketListField): - islist = 1 - holds_packet = 1 - def __init__(self, name, default, cls, curpos, count_from=None, length_from=None): - self.curpos = curpos - PacketListField.__init__(self, name, default, cls, count_from=count_from, length_from=length_from) - - def i2len(self, pkt, i): - l = len(self.i2m(pkt, i)) - return l - - def i2count(self, pkt, i): - if type(i) is list: - return len(i) - return 0 - - def getfield(self, pkt, s): - c = l = None - if self.length_from is not None: - l = self.length_from(pkt) - elif self.count_from is not None: - c = self.count_from(pkt) - - opt = [] - ret = "" - x = s - if l is not None: - x,ret = s[:l],s[l:] - while x: - if c is not None: - if c <= 0: - break - c -= 1 - o = ord(x[0]) # Option type - cls = self.cls - if _hbhoptcls.has_key(o): - cls = _hbhoptcls[o] - try: - op = cls(x) - except: - op = self.cls(x) - opt.append(op) - if isinstance(op.payload, conf.raw_layer): - x = op.payload.load - del(op.payload) - else: - x = "" - return x+ret,opt - - def i2m(self, pkt, x): - autopad = None - try: - autopad = getattr(pkt, "autopad") # Hack : 'autopad' phantom field - except: - autopad = 1 - - if not autopad: - return "".join(map(str, x)) - - curpos = self.curpos - s = "" - for p in x: - d = p.alignment_delta(curpos) - curpos += d - if d == 1: - s += str(Pad1()) - elif d != 0: - s += str(PadN(optdata='\x00'*(d-2))) - pstr = str(p) - curpos += len(pstr) - s += pstr - - # Let's make the class including our option field - # a multiple of 8 octets long - d = curpos % 8 - if d == 0: - return s - d = 8 - d - if d == 1: - s += str(Pad1()) - elif d != 0: - s += str(PadN(optdata='\x00'*(d-2))) - - return s - - def addfield(self, pkt, s, val): - return s+self.i2m(pkt, val) - -class _PhantomAutoPadField(ByteField): - def addfield(self, pkt, s, val): - return s - - def getfield(self, pkt, s): - return s, 1 - - def i2repr(self, pkt, x): - if x: - return "On" - return "Off" - - -class IPv6ExtHdrHopByHop(_IPv6ExtHdr): - name = "IPv6 Extension Header - Hop-by-Hop Options Header" - fields_desc = [ ByteEnumField("nh", 59, ipv6nh), - FieldLenField("len", None, length_of="options", fmt="B", - adjust = lambda pkt,x: (x+2+7)/8 - 1), - _PhantomAutoPadField("autopad", 1), # autopad activated by default - _HopByHopOptionsField("options", [], HBHOptUnknown, 2, - length_from = lambda pkt: (8*(pkt.len+1))-2) ] - overload_fields = {IPv6: { "nh": 0 }} - - -######################## Destination Option Header ########################## - -class IPv6ExtHdrDestOpt(_IPv6ExtHdr): - name = "IPv6 Extension Header - Destination Options Header" - fields_desc = [ ByteEnumField("nh", 59, ipv6nh), - FieldLenField("len", None, length_of="options", fmt="B", - adjust = lambda pkt,x: (x+2+7)/8 - 1), - _PhantomAutoPadField("autopad", 1), # autopad activated by default - _HopByHopOptionsField("options", [], HBHOptUnknown, 2, - length_from = lambda pkt: (8*(pkt.len+1))-2) ] - overload_fields = {IPv6: { "nh": 60 }} - - -############################# Routing Header ################################ - -class IPv6ExtHdrRouting(_IPv6ExtHdr): - name = "IPv6 Option Header Routing" - fields_desc = [ ByteEnumField("nh", 59, ipv6nh), - FieldLenField("len", None, count_of="addresses", fmt="B", - adjust = lambda pkt,x:2*x), # in 8 bytes blocks - ByteField("type", 0), - ByteField("segleft", None), - BitField("reserved", 0, 32), # There is meaning in this field ... - IP6ListField("addresses", [], - length_from = lambda pkt: 8*pkt.len)] - overload_fields = {IPv6: { "nh": 43 }} - - def post_build(self, pkt, pay): - if self.segleft is None: - pkt = pkt[:3]+struct.pack("B", len(self.addresses))+pkt[4:] - return _IPv6ExtHdr.post_build(self, pkt, pay) - -########################### Fragmentation Header ############################ - -class IPv6ExtHdrFragment(_IPv6ExtHdr): - name = "IPv6 Extension Header - Fragmentation header" - fields_desc = [ ByteEnumField("nh", 59, ipv6nh), - BitField("res1", 0, 8), - BitField("offset", 0, 13), - BitField("res2", 0, 2), - BitField("m", 0, 1), - IntField("id", None) ] - overload_fields = {IPv6: { "nh": 44 }} - - -def defragment6(pktlist): - """ - Performs defragmentation of a list of IPv6 packets. Packets are reordered. - Crap is dropped. What lacks is completed by 'X' characters. - """ - - l = filter(lambda x: IPv6ExtHdrFragment in x, pktlist) # remove non fragments - if not l: - return [] - - id = l[0][IPv6ExtHdrFragment].id - - llen = len(l) - l = filter(lambda x: x[IPv6ExtHdrFragment].id == id, l) - if len(l) != llen: - warning("defragment6: some fragmented packets have been removed from list") - llen = len(l) - - # reorder fragments - i = 0 - res = [] - while l: - min_pos = 0 - min_offset = l[0][IPv6ExtHdrFragment].offset - for p in l: - cur_offset = p[IPv6ExtHdrFragment].offset - if cur_offset < min_offset: - min_pos = 0 - min_offset = cur_offset - res.append(l[min_pos]) - del(l[min_pos]) - - # regenerate the fragmentable part - fragmentable = "" - for p in res: - q=p[IPv6ExtHdrFragment] - offset = 8*q.offset - if offset != len(fragmentable): - warning("Expected an offset of %d. Found %d. Padding with XXXX" % (len(fragmentable), offset)) - fragmentable += "X"*(offset - len(fragmentable)) - fragmentable += str(q.payload) - - # Regenerate the unfragmentable part. - q = res[0] - nh = q[IPv6ExtHdrFragment].nh - q[IPv6ExtHdrFragment].underlayer.nh = nh - q[IPv6ExtHdrFragment].underlayer.payload = None - q /= conf.raw_layer(load=fragmentable) - - return IPv6(str(q)) - - -def fragment6(pkt, fragSize): - """ - Performs fragmentation of an IPv6 packet. Provided packet ('pkt') must already - contain an IPv6ExtHdrFragment() class. 'fragSize' argument is the expected - maximum size of fragments (MTU). The list of packets is returned. - - If packet does not contain an IPv6ExtHdrFragment class, it is returned in - result list. - """ - - pkt = pkt.copy() - - if not IPv6ExtHdrFragment in pkt: - # TODO : automatically add a fragment before upper Layer - # at the moment, we do nothing and return initial packet - # as single element of a list - return [pkt] - - # If the payload is bigger than 65535, a Jumbo payload must be used, as - # an IPv6 packet can't be bigger than 65535 bytes. - if len(str(pkt[IPv6ExtHdrFragment])) > 65535: - warning("An IPv6 packet can'be bigger than 65535, please use a Jumbo payload.") - return [] - - s = str(pkt) # for instantiation to get upper layer checksum right - - if len(s) <= fragSize: - return [pkt] - - # Fragmentable part : fake IPv6 for Fragmentable part length computation - fragPart = pkt[IPv6ExtHdrFragment].payload - tmp = str(IPv6(src="::1", dst="::1")/fragPart) - fragPartLen = len(tmp) - 40 # basic IPv6 header length - fragPartStr = s[-fragPartLen:] - - # Grab Next Header for use in Fragment Header - nh = IPv6(tmp[:40]).nh - - # Keep fragment header - fragHeader = pkt[IPv6ExtHdrFragment] - fragHeader.payload = None # detach payload - - # Unfragmentable Part - unfragPartLen = len(s) - fragPartLen - 8 - unfragPart = pkt - pkt[IPv6ExtHdrFragment].underlayer.payload = None # detach payload - - # Cut the fragmentable part to fit fragSize. Inner fragments have - # a length that is an integer multiple of 8 octets. last Frag MTU - # can be anything below MTU - lastFragSize = fragSize - unfragPartLen - 8 - innerFragSize = lastFragSize - (lastFragSize % 8) - - if lastFragSize <= 0 or innerFragSize == 0: - warning("Provided fragment size value is too low. " + - "Should be more than %d" % (unfragPartLen + 8)) - return [unfragPart/fragHeader/fragPart] - - remain = fragPartStr - res = [] - fragOffset = 0 # offset, incremeted during creation - fragId = random.randint(0,0xffffffff) # random id ... - if fragHeader.id is not None: # ... except id provided by user - fragId = fragHeader.id - fragHeader.m = 1 - fragHeader.id = fragId - fragHeader.nh = nh - - # Main loop : cut, fit to FRAGSIZEs, fragOffset, Id ... - while True: - if (len(remain) > lastFragSize): - tmp = remain[:innerFragSize] - remain = remain[innerFragSize:] - fragHeader.offset = fragOffset # update offset - fragOffset += (innerFragSize / 8) # compute new one - if IPv6 in unfragPart: - unfragPart[IPv6].plen = None - tempo = unfragPart/fragHeader/conf.raw_layer(load=tmp) - res.append(tempo) - else: - fragHeader.offset = fragOffset # update offSet - fragHeader.m = 0 - if IPv6 in unfragPart: - unfragPart[IPv6].plen = None - tempo = unfragPart/fragHeader/conf.raw_layer(load=remain) - res.append(tempo) - break - return res - - -############################### AH Header ################################### - -# class _AHFieldLenField(FieldLenField): -# def getfield(self, pkt, s): -# l = getattr(pkt, self.fld) -# l = (l*8)-self.shift -# i = self.m2i(pkt, s[:l]) -# return s[l:],i - -# class _AHICVStrLenField(StrLenField): -# def i2len(self, pkt, x): - - - -# class IPv6ExtHdrAH(_IPv6ExtHdr): -# name = "IPv6 Extension Header - AH" -# fields_desc = [ ByteEnumField("nh", 59, ipv6nh), -# _AHFieldLenField("len", None, "icv"), -# ShortField("res", 0), -# IntField("spi", 0), -# IntField("sn", 0), -# _AHICVStrLenField("icv", None, "len", shift=2) ] -# overload_fields = {IPv6: { "nh": 51 }} - -# def post_build(self, pkt, pay): -# if self.len is None: -# pkt = pkt[0]+struct.pack("!B", 2*len(self.addresses))+pkt[2:] -# if self.segleft is None: -# pkt = pkt[:3]+struct.pack("!B", len(self.addresses))+pkt[4:] -# return _IPv6ExtHdr.post_build(self, pkt, pay) - - -############################### ESP Header ################################## - -# class IPv6ExtHdrESP(_IPv6extHdr): -# name = "IPv6 Extension Header - ESP" -# fields_desc = [ IntField("spi", 0), -# IntField("sn", 0), -# # there is things to extract from IKE work -# ] -# overloads_fields = {IPv6: { "nh": 50 }} - - - -############################################################################# -############################################################################# -### ICMPv6* Classes ### -############################################################################# -############################################################################# - -icmp6typescls = { 1: "ICMPv6DestUnreach", - 2: "ICMPv6PacketTooBig", - 3: "ICMPv6TimeExceeded", - 4: "ICMPv6ParamProblem", - 128: "ICMPv6EchoRequest", - 129: "ICMPv6EchoReply", - 130: "ICMPv6MLQuery", - 131: "ICMPv6MLReport", - 132: "ICMPv6MLDone", - 133: "ICMPv6ND_RS", - 134: "ICMPv6ND_RA", - 135: "ICMPv6ND_NS", - 136: "ICMPv6ND_NA", - 137: "ICMPv6ND_Redirect", - #138: Do Me - RFC 2894 - Seems painful - 139: "ICMPv6NIQuery", - 140: "ICMPv6NIReply", - 141: "ICMPv6ND_INDSol", - 142: "ICMPv6ND_INDAdv", - #143: Do Me - RFC 3810 - 144: "ICMPv6HAADRequest", - 145: "ICMPv6HAADReply", - 146: "ICMPv6MPSol", - 147: "ICMPv6MPAdv", - #148: Do Me - SEND related - RFC 3971 - #149: Do Me - SEND related - RFC 3971 - 151: "ICMPv6MRD_Advertisement", - 152: "ICMPv6MRD_Solicitation", - 153: "ICMPv6MRD_Termination", - } - -icmp6typesminhdrlen = { 1: 8, - 2: 8, - 3: 8, - 4: 8, - 128: 8, - 129: 8, - 130: 24, - 131: 24, - 132: 24, - 133: 8, - 134: 16, - 135: 24, - 136: 24, - 137: 40, - #139: - #140 - 141: 8, - 142: 8, - 144: 8, - 145: 8, - 146: 8, - 147: 8, - 151: 8, - 152: 4, - 153: 4 - } - -icmp6types = { 1 : "Destination unreachable", - 2 : "Packet too big", - 3 : "Time exceeded", - 4 : "Parameter problem", - 100 : "Private Experimentation", - 101 : "Private Experimentation", - 128 : "Echo Request", - 129 : "Echo Reply", - 130 : "MLD Query", - 131 : "MLD Report", - 132 : "MLD Done", - 133 : "Router Solicitation", - 134 : "Router Advertisement", - 135 : "Neighbor Solicitation", - 136 : "Neighbor Advertisement", - 137 : "Redirect Message", - 138 : "Router Renumbering", - 139 : "ICMP Node Information Query", - 140 : "ICMP Node Information Response", - 141 : "Inverse Neighbor Discovery Solicitation Message", - 142 : "Inverse Neighbor Discovery Advertisement Message", - 143 : "Version 2 Multicast Listener Report", - 144 : "Home Agent Address Discovery Request Message", - 145 : "Home Agent Address Discovery Reply Message", - 146 : "Mobile Prefix Solicitation", - 147 : "Mobile Prefix Advertisement", - 148 : "Certification Path Solicitation", - 149 : "Certification Path Advertisement", - 151 : "Multicast Router Advertisement", - 152 : "Multicast Router Solicitation", - 153 : "Multicast Router Termination", - 200 : "Private Experimentation", - 201 : "Private Experimentation" } - - -class _ICMPv6(Packet): - name = "ICMPv6 dummy class" - overload_fields = {IPv6: {"nh": 58}} - def post_build(self, p, pay): - p += pay - if self.cksum == None: - chksum = in6_chksum(58, self.underlayer, p) - p = p[:2]+struct.pack("!H", chksum)+p[4:] - return p - - def hashret(self): - return self.payload.hashret() - - def answers(self, other): - # isinstance(self.underlayer, _IPv6ExtHdr) may introduce a bug ... - if (isinstance(self.underlayer, IPerror6) or - isinstance(self.underlayer, _IPv6ExtHdr) and - isinstance(other, _ICMPv6)): - if not ((self.type == other.type) and - (self.code == other.code)): - return 0 - return 1 - return 0 - - -class _ICMPv6Error(_ICMPv6): - name = "ICMPv6 errors dummy class" - def guess_payload_class(self,p): - return IPerror6 - -class ICMPv6Unknown(_ICMPv6): - name = "Scapy6 ICMPv6 fallback class" - fields_desc = [ ByteEnumField("type",1, icmp6types), - ByteField("code",0), - XShortField("cksum", None), - StrField("msgbody", "")] - - -################################## RFC 2460 ################################# - -class ICMPv6DestUnreach(_ICMPv6Error): - name = "ICMPv6 Destination Unreachable" - fields_desc = [ ByteEnumField("type",1, icmp6types), - ByteEnumField("code",0, { 0: "No route to destination", - 1: "Communication with destination administratively prohibited", - 2: "Beyond scope of source address", - 3: "Address unreachable", - 4: "Port unreachable" }), - XShortField("cksum", None), - XIntField("unused",0x00000000)] - -class ICMPv6PacketTooBig(_ICMPv6Error): - name = "ICMPv6 Packet Too Big" - fields_desc = [ ByteEnumField("type",2, icmp6types), - ByteField("code",0), - XShortField("cksum", None), - IntField("mtu",1280)] - -class ICMPv6TimeExceeded(_ICMPv6Error): - name = "ICMPv6 Time Exceeded" - fields_desc = [ ByteEnumField("type",3, icmp6types), - ByteEnumField("code",0, { 0: "hop limit exceeded in transit", - 1: "fragment reassembly time exceeded"}), - XShortField("cksum", None), - XIntField("unused",0x00000000)] - -# The default pointer value is set to the next header field of -# the encapsulated IPv6 packet -class ICMPv6ParamProblem(_ICMPv6Error): - name = "ICMPv6 Parameter Problem" - fields_desc = [ ByteEnumField("type",4, icmp6types), - ByteEnumField("code",0, {0: "erroneous header field encountered", - 1: "unrecognized Next Header type encountered", - 2: "unrecognized IPv6 option encountered"}), - XShortField("cksum", None), - IntField("ptr",6)] - -class ICMPv6EchoRequest(_ICMPv6): - name = "ICMPv6 Echo Request" - fields_desc = [ ByteEnumField("type", 128, icmp6types), - ByteField("code", 0), - XShortField("cksum", None), - XShortField("id",0), - XShortField("seq",0), - StrField("data", "")] - def mysummary(self): - return self.sprintf("%name% (id: %id% seq: %seq%)") - def hashret(self): - return struct.pack("HH",self.id,self.seq)+self.payload.hashret() - - -class ICMPv6EchoReply(ICMPv6EchoRequest): - name = "ICMPv6 Echo Reply" - type = 129 - def answers(self, other): - # We could match data content between request and reply. - return (isinstance(other, ICMPv6EchoRequest) and - self.id == other.id and self.seq == other.seq and - self.data == other.data) - - -############ ICMPv6 Multicast Listener Discovery (RFC3810) ################## - -# tous les messages MLD sont emis avec une adresse source lien-locale -# -> Y veiller dans le post_build si aucune n'est specifiee -# La valeur de Hop-Limit doit etre de 1 -# "and an IPv6 Router Alert option in a Hop-by-Hop Options -# header. (The router alert option is necessary to cause routers to -# examine MLD messages sent to multicast addresses in which the router -# itself has no interest" -class _ICMPv6ML(_ICMPv6): - fields_desc = [ ByteEnumField("type", 130, icmp6types), - ByteField("code", 0), - XShortField("cksum", None), - ShortField("mrd", 0), - ShortField("reserved", 0), - IP6Field("mladdr","::")] - -# general queries are sent to the link-scope all-nodes multicast -# address ff02::1, with a multicast address field of 0 and a MRD of -# [Query Response Interval] -# Default value for mladdr is set to 0 for a General Query, and -# overloaded by the user for a Multicast Address specific query -# TODO : See what we can do to automatically include a Router Alert -# Option in a Destination Option Header. -class ICMPv6MLQuery(_ICMPv6ML): # RFC 2710 - name = "MLD - Multicast Listener Query" - type = 130 - mrd = 10000 - mladdr = "::" # 10s for mrd - overload_fields = {IPv6: { "dst": "ff02::1", "hlim": 1, "nh": 58 }} - def hashret(self): - if self.mladdr != "::": - return struct.pack("HH",self.mladdr)+self.payload.hashret() - else: - return self.payload.hashret() - - -# TODO : See what we can do to automatically include a Router Alert -# Option in a Destination Option Header. -class ICMPv6MLReport(_ICMPv6ML): # RFC 2710 - name = "MLD - Multicast Listener Report" - type = 131 - overload_fields = {IPv6: {"hlim": 1, "nh": 58}} - # implementer le hashret et le answers - -# When a node ceases to listen to a multicast address on an interface, -# it SHOULD send a single Done message to the link-scope all-routers -# multicast address (FF02::2), carrying in its multicast address field -# the address to which it is ceasing to listen -# TODO : See what we can do to automatically include a Router Alert -# Option in a Destination Option Header. -class ICMPv6MLDone(_ICMPv6ML): # RFC 2710 - name = "MLD - Multicast Listener Done" - type = 132 - overload_fields = {IPv6: { "dst": "ff02::2", "hlim": 1, "nh": 58}} - - -########## ICMPv6 MRD - Multicast Router Discovery (RFC 4286) ############### - -# TODO: -# - 04/09/06 troglocan : find a way to automatically add a router alert -# option for all MRD packets. This could be done in a specific -# way when IPv6 is the under layer with some specific keyword -# like 'exthdr'. This would allow to keep compatibility with -# providing IPv6 fields to be overloaded in fields_desc. -# -# At the moment, if user inserts an IPv6 Router alert option -# none of the IPv6 default values of IPv6 layer will be set. - -class ICMPv6MRD_Advertisement(_ICMPv6): - name = "ICMPv6 Multicast Router Discovery Advertisement" - fields_desc = [ByteEnumField("type", 151, icmp6types), - ByteField("advinter", 20), - XShortField("cksum", None), - ShortField("queryint", 0), - ShortField("robustness", 0)] - overload_fields = {IPv6: { "nh": 58, "hlim": 1, "dst": "ff02::2"}} - # IPv6 Router Alert requires manual inclusion - def extract_padding(self, s): - return s[:8], s[8:] - -class ICMPv6MRD_Solicitation(_ICMPv6): - name = "ICMPv6 Multicast Router Discovery Solicitation" - fields_desc = [ByteEnumField("type", 152, icmp6types), - ByteField("res", 0), - XShortField("cksum", None) ] - overload_fields = {IPv6: { "nh": 58, "hlim": 1, "dst": "ff02::2"}} - # IPv6 Router Alert requires manual inclusion - def extract_padding(self, s): - return s[:4], s[4:] - -class ICMPv6MRD_Termination(_ICMPv6): - name = "ICMPv6 Multicast Router Discovery Termination" - fields_desc = [ByteEnumField("type", 153, icmp6types), - ByteField("res", 0), - XShortField("cksum", None) ] - overload_fields = {IPv6: { "nh": 58, "hlim": 1, "dst": "ff02::6A"}} - # IPv6 Router Alert requires manual inclusion - def extract_padding(self, s): - return s[:4], s[4:] - - -################### ICMPv6 Neighbor Discovery (RFC 2461) #################### - -icmp6ndopts = { 1: "Source Link-Layer Address", - 2: "Target Link-Layer Address", - 3: "Prefix Information", - 4: "Redirected Header", - 5: "MTU", - 6: "NBMA Shortcut Limit Option", # RFC2491 - 7: "Advertisement Interval Option", - 8: "Home Agent Information Option", - 9: "Source Address List", - 10: "Target Address List", - 11: "CGA Option", # RFC 3971 - 12: "RSA Signature Option", # RFC 3971 - 13: "Timestamp Option", # RFC 3971 - 14: "Nonce option", # RFC 3971 - 15: "Trust Anchor Option", # RFC 3971 - 16: "Certificate Option", # RFC 3971 - 17: "IP Address Option", # RFC 4068 - 18: "New Router Prefix Information Option", # RFC 4068 - 19: "Link-layer Address Option", # RFC 4068 - 20: "Neighbor Advertisement Acknowledgement Option", - 21: "CARD Request Option", # RFC 4065/4066/4067 - 22: "CARD Reply Option", # RFC 4065/4066/4067 - 23: "MAP Option", # RFC 4140 - 24: "Route Information Option", # RFC 4191 - 25: "Recusive DNS Server Option", - 26: "IPv6 Router Advertisement Flags Option" - } - -icmp6ndoptscls = { 1: "ICMPv6NDOptSrcLLAddr", - 2: "ICMPv6NDOptDstLLAddr", - 3: "ICMPv6NDOptPrefixInfo", - 4: "ICMPv6NDOptRedirectedHdr", - 5: "ICMPv6NDOptMTU", - 6: "ICMPv6NDOptShortcutLimit", - 7: "ICMPv6NDOptAdvInterval", - 8: "ICMPv6NDOptHAInfo", - 9: "ICMPv6NDOptSrcAddrList", - 10: "ICMPv6NDOptTgtAddrList", - #11: Do Me, - #12: Do Me, - #13: Do Me, - #14: Do Me, - #15: Do Me, - #16: Do Me, - 17: "ICMPv6NDOptIPAddr", - 18: "ICMPv6NDOptNewRtrPrefix", - 19: "ICMPv6NDOptLLA", - #18: Do Me, - #19: Do Me, - #20: Do Me, - #21: Do Me, - #22: Do Me, - 23: "ICMPv6NDOptMAP", - 24: "ICMPv6NDOptRouteInfo", - 25: "ICMPv6NDOptRDNSS", - 26: "ICMPv6NDOptEFA" - } - -class _ICMPv6NDGuessPayload: - name = "Dummy ND class that implements guess_payload_class()" - def guess_payload_class(self,p): - if len(p) > 1: - return get_cls(icmp6ndoptscls.get(ord(p[0]),"Raw"), "Raw") # s/Raw/ICMPv6NDOptUnknown/g ? - - -# Beginning of ICMPv6 Neighbor Discovery Options. - -class ICMPv6NDOptUnknown(_ICMPv6NDGuessPayload, Packet): - name = "ICMPv6 Neighbor Discovery Option - Scapy Unimplemented" - fields_desc = [ ByteField("type",None), - FieldLenField("len",None,length_of="data",fmt="B", - adjust = lambda pkt,x: x+2), - StrLenField("data","", - length_from = lambda pkt: pkt.len-2) ] - -# NOTE: len includes type and len field. Expressed in unit of 8 bytes -# TODO: Revoir le coup du ETHER_ANY -class ICMPv6NDOptSrcLLAddr(_ICMPv6NDGuessPayload, Packet): - name = "ICMPv6 Neighbor Discovery Option - Source Link-Layer Address" - fields_desc = [ ByteField("type", 1), - ByteField("len", 1), - MACField("lladdr", ETHER_ANY) ] - def mysummary(self): - return self.sprintf("%name% %lladdr%") - -class ICMPv6NDOptDstLLAddr(ICMPv6NDOptSrcLLAddr): - name = "ICMPv6 Neighbor Discovery Option - Destination Link-Layer Address" - type = 2 - -class ICMPv6NDOptPrefixInfo(_ICMPv6NDGuessPayload, Packet): - name = "ICMPv6 Neighbor Discovery Option - Prefix Information" - fields_desc = [ ByteField("type",3), - ByteField("len",4), - ByteField("prefixlen",None), - BitField("L",1,1), - BitField("A",1,1), - BitField("R",0,1), - BitField("res1",0,5), - XIntField("validlifetime",0xffffffffL), - XIntField("preferredlifetime",0xffffffffL), - XIntField("res2",0x00000000), - IP6Field("prefix","::") ] - def mysummary(self): - return self.sprintf("%name% %prefix%") - -# TODO: We should also limit the size of included packet to something -# like (initiallen - 40 - 2) -class TruncPktLenField(PacketLenField): - - def __init__(self, name, default, cls, cur_shift, length_from=None, shift=0): - PacketLenField.__init__(self, name, default, cls, length_from=length_from) - self.cur_shift = cur_shift - - def getfield(self, pkt, s): - l = self.length_from(pkt) - i = self.m2i(pkt, s[:l]) - return s[l:],i - - def m2i(self, pkt, m): - s = None - try: # It can happen we have sth shorter than 40 bytes - s = self.cls(m) - except: - return conf.raw_layer(m) - return s - - def i2m(self, pkt, x): - s = str(x) - l = len(s) - r = (l + self.cur_shift) % 8 - l = l - r - return s[:l] - - def i2len(self, pkt, i): - return len(self.i2m(pkt, i)) - - -# Faire un post_build pour le recalcul de la taille (en multiple de 8 octets) -class ICMPv6NDOptRedirectedHdr(_ICMPv6NDGuessPayload, Packet): - name = "ICMPv6 Neighbor Discovery Option - Redirected Header" - fields_desc = [ ByteField("type",4), - FieldLenField("len", None, length_of="pkt", fmt="B", - adjust = lambda pkt,x:(x+8)/8), - StrFixedLenField("res", "\x00"*6, 6), - TruncPktLenField("pkt", "", IPv6, 8, - length_from = lambda pkt: 8*pkt.len-8) ] - -# See which value should be used for default MTU instead of 1280 -class ICMPv6NDOptMTU(_ICMPv6NDGuessPayload, Packet): - name = "ICMPv6 Neighbor Discovery Option - MTU" - fields_desc = [ ByteField("type",5), - ByteField("len",1), - XShortField("res",0), - IntField("mtu",1280)] - -class ICMPv6NDOptShortcutLimit(_ICMPv6NDGuessPayload, Packet): # RFC 2491 - name = "ICMPv6 Neighbor Discovery Option - NBMA Shortcut Limit" - fields_desc = [ ByteField("type", 6), - ByteField("len", 1), - ByteField("shortcutlim", 40), # XXX - ByteField("res1", 0), - IntField("res2", 0) ] - -class ICMPv6NDOptAdvInterval(_ICMPv6NDGuessPayload, Packet): - name = "ICMPv6 Neighbor Discovery - Interval Advertisement" - fields_desc = [ ByteField("type",7), - ByteField("len",1), - ShortField("res", 0), - IntField("advint", 0) ] - def mysummary(self): - return self.sprintf("%name% %advint% milliseconds") - -class ICMPv6NDOptHAInfo(_ICMPv6NDGuessPayload, Packet): - name = "ICMPv6 Neighbor Discovery - Home Agent Information" - fields_desc = [ ByteField("type",8), - ByteField("len",1), - ShortField("res", 0), - ShortField("pref", 0), - ShortField("lifetime", 1)] - def mysummary(self): - return self.sprintf("%name% %pref% %lifetime% seconds") - -# type 9 : See ICMPv6NDOptSrcAddrList class below in IND (RFC 3122) support - -# type 10 : See ICMPv6NDOptTgtAddrList class below in IND (RFC 3122) support - -class ICMPv6NDOptIPAddr(_ICMPv6NDGuessPayload, Packet): # RFC 4068 - name = "ICMPv6 Neighbor Discovery - IP Address Option (FH for MIPv6)" - fields_desc = [ ByteField("type",17), - ByteField("len", 3), - ByteEnumField("optcode", 1, {1: "Old Care-Of Address", - 2: "New Care-Of Address", - 3: "NAR's IP address" }), - ByteField("plen", 64), - IntField("res", 0), - IP6Field("addr", "::") ] - -class ICMPv6NDOptNewRtrPrefix(_ICMPv6NDGuessPayload, Packet): # RFC 4068 - name = "ICMPv6 Neighbor Discovery - New Router Prefix Information Option (FH for MIPv6)" - fields_desc = [ ByteField("type",18), - ByteField("len", 3), - ByteField("optcode", 0), - ByteField("plen", 64), - IntField("res", 0), - IP6Field("prefix", "::") ] - -_rfc4068_lla_optcode = {0: "Wildcard requesting resolution for all nearby AP", - 1: "LLA for the new AP", - 2: "LLA of the MN", - 3: "LLA of the NAR", - 4: "LLA of the src of TrSolPr or PrRtAdv msg", - 5: "AP identified by LLA belongs to current iface of router", - 6: "No preifx info available for AP identified by the LLA", - 7: "No fast handovers support for AP identified by the LLA" } - -class ICMPv6NDOptLLA(_ICMPv6NDGuessPayload, Packet): # RFC 4068 - name = "ICMPv6 Neighbor Discovery - Link-Layer Address (LLA) Option (FH for MIPv6)" - fields_desc = [ ByteField("type", 19), - ByteField("len", 1), - ByteEnumField("optcode", 0, _rfc4068_lla_optcode), - MACField("lla", ETHER_ANY) ] # We only support ethernet - -class ICMPv6NDOptMAP(_ICMPv6NDGuessPayload, Packet): # RFC 4140 - name = "ICMPv6 Neighbor Discovery - MAP Option" - fields_desc = [ ByteField("type", 23), - ByteField("len", 3), - BitField("dist", 1, 4), - BitField("pref", 15, 4), # highest availability - BitField("R", 1, 1), - BitField("res", 0, 7), - IntField("validlifetime", 0xffffffff), - IP6Field("addr", "::") ] - - -class IP6PrefixField(IP6Field): - def __init__(self, name, default): - IP6Field.__init__(self, name, default) - self.length_from = lambda pkt: 8*(pkt.len - 1) - - def addfield(self, pkt, s, val): - return s + self.i2m(pkt, val) - - def getfield(self, pkt, s): - l = self.length_from(pkt) - p = s[:l] - if l < 16: - p += '\x00'*(16-l) - return s[l:], self.m2i(pkt,p) - - def i2len(self, pkt, x): - return len(self.i2m(pkt, x)) - - def i2m(self, pkt, x): - l = pkt.len - - if x is None: - x = "::" - if l is None: - l = 1 - x = inet_pton(socket.AF_INET6, x) - - if l is None: - return x - if l in [0, 1]: - return "" - if l in [2, 3]: - return x[:8*(l-1)] - - return x + '\x00'*8*(l-3) - -class ICMPv6NDOptRouteInfo(_ICMPv6NDGuessPayload, Packet): # RFC 4191 - name = "ICMPv6 Neighbor Discovery Option - Route Information Option" - fields_desc = [ ByteField("type",24), - FieldLenField("len", None, length_of="prefix", fmt="B", - adjust = lambda pkt,x: x/8 + 1), - ByteField("plen", None), - BitField("res1",0,3), - BitField("prf",0,2), - BitField("res2",0,3), - IntField("rtlifetime", 0xffffffff), - IP6PrefixField("prefix", None) ] - -class ICMPv6NDOptRDNSS(_ICMPv6NDGuessPayload, Packet): # RFC 5006 - name = "ICMPv6 Neighbor Discovery Option - Recursive DNS Server Option" - fields_desc = [ ByteField("type", 25), - FieldLenField("len", None, count_of="dns", fmt="B", - adjust = lambda pkt,x: 2*x+1), - ShortField("res", None), - IntField("lifetime", 0xffffffff), - IP6ListField("dns", [], - length_from = lambda pkt: 8*(pkt.len-1)) ] - -class ICMPv6NDOptEFA(_ICMPv6NDGuessPayload, Packet): # RFC 5175 (prev. 5075) - name = "ICMPv6 Neighbor Discovery Option - Expanded Flags Option" - fields_desc = [ ByteField("type", 26), - ByteField("len", 1), - BitField("res", 0, 48) ] - -# End of ICMPv6 Neighbor Discovery Options. - -class ICMPv6ND_RS(_ICMPv6NDGuessPayload, _ICMPv6): - name = "ICMPv6 Neighbor Discovery - Router Solicitation" - fields_desc = [ ByteEnumField("type", 133, icmp6types), - ByteField("code",0), - XShortField("cksum", None), - IntField("res",0) ] - overload_fields = {IPv6: { "nh": 58, "dst": "ff02::2", "hlim": 255 }} - -class ICMPv6ND_RA(_ICMPv6NDGuessPayload, _ICMPv6): - name = "ICMPv6 Neighbor Discovery - Router Advertisement" - fields_desc = [ ByteEnumField("type", 134, icmp6types), - ByteField("code",0), - XShortField("cksum", None), - ByteField("chlim",0), - BitField("M",0,1), - BitField("O",0,1), - BitField("H",0,1), - BitEnumField("prf",1,2, { 0: "Medium (default)", - 1: "High", - 2: "Reserved", - 3: "Low" } ), # RFC 4191 - BitField("P",0,1), - BitField("res",0,2), - ShortField("routerlifetime",1800), - IntField("reachabletime",0), - IntField("retranstimer",0) ] - overload_fields = {IPv6: { "nh": 58, "dst": "ff02::1", "hlim": 255 }} - - def answers(self, other): - return isinstance(other, ICMPv6ND_RS) - -class ICMPv6ND_NS(_ICMPv6NDGuessPayload, _ICMPv6, Packet): - name = "ICMPv6 Neighbor Discovery - Neighbor Solicitation" - fields_desc = [ ByteEnumField("type",135, icmp6types), - ByteField("code",0), - XShortField("cksum", None), - IntField("res", 0), - IP6Field("tgt","::") ] - overload_fields = {IPv6: { "nh": 58, "dst": "ff02::1", "hlim": 255 }} - - def mysummary(self): - return self.sprintf("%name% (tgt: %tgt%)") - - def hashret(self): - return self.tgt+self.payload.hashret() - -class ICMPv6ND_NA(_ICMPv6NDGuessPayload, _ICMPv6, Packet): - name = "ICMPv6 Neighbor Discovery - Neighbor Advertisement" - fields_desc = [ ByteEnumField("type",136, icmp6types), - ByteField("code",0), - XShortField("cksum", None), - BitField("R",1,1), - BitField("S",0,1), - BitField("O",1,1), - XBitField("res",0,29), - IP6Field("tgt","::") ] - overload_fields = {IPv6: { "nh": 58, "dst": "ff02::1", "hlim": 255 }} - - def mysummary(self): - return self.sprintf("%name% (tgt: %tgt%)") - - def hashret(self): - return self.tgt+self.payload.hashret() - - def answers(self, other): - return isinstance(other, ICMPv6ND_NS) and self.tgt == other.tgt - -# associated possible options : target link-layer option, Redirected header -class ICMPv6ND_Redirect(_ICMPv6NDGuessPayload, _ICMPv6, Packet): - name = "ICMPv6 Neighbor Discovery - Redirect" - fields_desc = [ ByteEnumField("type",137, icmp6types), - ByteField("code",0), - XShortField("cksum", None), - XIntField("res",0), - IP6Field("tgt","::"), - IP6Field("dst","::") ] - overload_fields = {IPv6: { "nh": 58, "dst": "ff02::1", "hlim": 255 }} - - - -################ ICMPv6 Inverse Neighbor Discovery (RFC 3122) ############### - -class ICMPv6NDOptSrcAddrList(_ICMPv6NDGuessPayload, Packet): - name = "ICMPv6 Inverse Neighbor Discovery Option - Source Address List" - fields_desc = [ ByteField("type",9), - FieldLenField("len", None, count_of="addrlist", fmt="B", - adjust = lambda pkt,x: 2*x+1), - StrFixedLenField("res", "\x00"*6, 6), - IP6ListField("addrlist", [], - length_from = lambda pkt: 8*(pkt.len-1)) ] - -class ICMPv6NDOptTgtAddrList(ICMPv6NDOptSrcAddrList): - name = "ICMPv6 Inverse Neighbor Discovery Option - Target Address List" - type = 10 - - -# RFC3122 -# Options requises : source lladdr et target lladdr -# Autres options valides : source address list, MTU -# - Comme precise dans le document, il serait bien de prendre l'adresse L2 -# demandee dans l'option requise target lladdr et l'utiliser au niveau -# de l'adresse destination ethernet si aucune adresse n'est precisee -# - ca semble pas forcement pratique si l'utilisateur doit preciser toutes -# les options. -# Ether() must use the target lladdr as destination -class ICMPv6ND_INDSol(_ICMPv6NDGuessPayload, _ICMPv6): - name = "ICMPv6 Inverse Neighbor Discovery Solicitation" - fields_desc = [ ByteEnumField("type",141, icmp6types), - ByteField("code",0), - XShortField("cksum",None), - XIntField("reserved",0) ] - overload_fields = {IPv6: { "nh": 58, "dst": "ff02::1", "hlim": 255 }} - -# Options requises : target lladdr, target address list -# Autres options valides : MTU -class ICMPv6ND_INDAdv(_ICMPv6NDGuessPayload, _ICMPv6): - name = "ICMPv6 Inverse Neighbor Discovery Advertisement" - fields_desc = [ ByteEnumField("type",142, icmp6types), - ByteField("code",0), - XShortField("cksum",None), - XIntField("reserved",0) ] - overload_fields = {IPv6: { "nh": 58, "dst": "ff02::1", "hlim": 255 }} - - -############################################################################### -# ICMPv6 Node Information Queries (RFC 4620) -############################################################################### - -# [ ] Add automatic destination address computation using computeNIGroupAddr -# in IPv6 class (Scapy6 modification when integrated) if : -# - it is not provided -# - upper layer is ICMPv6NIQueryName() with a valid value -# [ ] Try to be liberal in what we accept as internal values for _explicit_ -# DNS elements provided by users. Any string should be considered -# valid and kept like it has been provided. At the moment, i2repr() will -# crash on many inputs -# [ ] Do the documentation -# [ ] Add regression tests -# [ ] Perform test against real machines (NOOP reply is proof of implementation). -# [ ] Check if there are differences between different stacks. Among *BSD, -# with others. -# [ ] Deal with flags in a consistent way. -# [ ] Implement compression in names2dnsrepr() and decompresiion in -# dnsrepr2names(). Should be deactivable. - -icmp6_niqtypes = { 0: "NOOP", - 2: "Node Name", - 3: "IPv6 Address", - 4: "IPv4 Address" } - - -class _ICMPv6NIHashret: - def hashret(self): - return self.nonce - -class _ICMPv6NIAnswers: - def answers(self, other): - return self.nonce == other.nonce - -# Buggy; always returns the same value during a session -class NonceField(StrFixedLenField): - def __init__(self, name, default=None): - StrFixedLenField.__init__(self, name, default, 8) - if default is None: - self.default = self.randval() - -# Compute the NI group Address. Can take a FQDN as input parameter -def computeNIGroupAddr(name): - import md5 - name = name.lower().split(".")[0] - record = chr(len(name))+name - h = md5.new(record) - h = h.digest() - addr = "ff02::2:%2x%2x:%2x%2x" % struct.unpack("BBBB", h[:4]) - return addr - - -# Here is the deal. First, that protocol is a piece of shit. Then, we -# provide 4 classes for the different kinds of Requests (one for every -# valid qtype: NOOP, Node Name, IPv6@, IPv4@). They all share the same -# data field class that is made to be smart by guessing the specifc -# type of value provided : -# -# - IPv6 if acceptable for inet_pton(AF_INET6, ): code is set to 0, -# if not overriden by user -# - IPv4 if acceptable for inet_pton(AF_INET, ): code is set to 2, -# if not overriden -# - Name in the other cases: code is set to 0, if not overriden by user -# -# Internal storage, is not only the value, but the a pair providing -# the type and the value (1 is IPv6@, 1 is Name or string, 2 is IPv4@) -# -# Note : I merged getfield() and m2i(). m2i() should not be called -# directly anyway. Same remark for addfield() and i2m() -# -# -- arno - -# "The type of information present in the Data field of a query is -# declared by the ICMP Code, whereas the type of information in a -# Reply is determined by the Qtype" - -def names2dnsrepr(x): - """ - Take as input a list of DNS names or a single DNS name - and encode it in DNS format (with possible compression) - If a string that is already a DNS name in DNS format - is passed, it is returned unmodified. Result is a string. - !!! At the moment, compression is not implemented !!! - """ - - if type(x) is str: - if x and x[-1] == '\x00': # stupid heuristic - return x - x = [x] - - res = [] - for n in x: - termin = "\x00" - if n.count('.') == 0: # single-component gets one more - termin += '\x00' - n = "".join(map(lambda y: chr(len(y))+y, n.split("."))) + termin - res.append(n) - return "".join(res) - - -def dnsrepr2names(x): - """ - Take as input a DNS encoded string (possibly compressed) - and returns a list of DNS names contained in it. - If provided string is already in printable format - (does not end with a null character, a one element list - is returned). Result is a list. - """ - res = [] - cur = "" - while x: - l = ord(x[0]) - x = x[1:] - if l == 0: - if cur and cur[-1] == '.': - cur = cur[:-1] - res.append(cur) - cur = "" - if x and ord(x[0]) == 0: # single component - x = x[1:] - continue - if l & 0xc0: # XXX TODO : work on that -- arno - raise Exception("DNS message can't be compressed at this point!") - else: - cur += x[:l]+"." - x = x[l:] - return res - - -class NIQueryDataField(StrField): - def __init__(self, name, default): - StrField.__init__(self, name, default) - - def i2h(self, pkt, x): - if x is None: - return x - t,val = x - if t == 1: - val = dnsrepr2names(val)[0] - return val - - def h2i(self, pkt, x): - if x is tuple and type(x[0]) is int: - return x - - val = None - try: # Try IPv6 - inet_pton(socket.AF_INET6, x) - val = (0, x) - except: - try: # Try IPv4 - inet_pton(socket.AF_INET, x) - val = (2, x) - except: # Try DNS - if x is None: - x = "" - x = names2dnsrepr(x) - val = (1, x) - return val - - def i2repr(self, pkt, x): - t,val = x - if t == 1: # DNS Name - # we don't use dnsrepr2names() to deal with - # possible weird data extracted info - res = [] - weird = None - while val: - l = ord(val[0]) - val = val[1:] - if l == 0: - if (len(res) > 1 and val): # fqdn with data behind - weird = val - elif len(val) > 1: # single label with data behind - weird = val[1:] - break - res.append(val[:l]+".") - val = val[l:] - tmp = "".join(res) - if tmp and tmp[-1] == '.': - tmp = tmp[:-1] - return tmp - return repr(val) - - def getfield(self, pkt, s): - qtype = getattr(pkt, "qtype") - if qtype == 0: # NOOP - return s, (0, "") - else: - code = getattr(pkt, "code") - if code == 0: # IPv6 Addr - return s[16:], (0, inet_ntop(socket.AF_INET6, s[:16])) - elif code == 2: # IPv4 Addr - return s[4:], (2, inet_ntop(socket.AF_INET, s[:4])) - else: # Name or Unknown - return "", (1, s) - - def addfield(self, pkt, s, val): - if ((type(val) is tuple and val[1] is None) or - val is None): - val = (1, "") - t = val[0] - if t == 1: - return s + val[1] - elif t == 0: - return s + inet_pton(socket.AF_INET6, val[1]) - else: - return s + inet_pton(socket.AF_INET, val[1]) - -class NIQueryCodeField(ByteEnumField): - def i2m(self, pkt, x): - if x is None: - d = pkt.getfieldval("data") - if d is None: - return 1 - elif d[0] == 0: # IPv6 address - return 0 - elif d[0] == 1: # Name - return 1 - elif d[0] == 2: # IPv4 address - return 2 - else: - return 1 - return x - - -_niquery_code = {0: "IPv6 Query", 1: "Name Query", 2: "IPv4 Query"} - -#_niquery_flags = { 2: "All unicast addresses", 4: "IPv4 addresses", -# 8: "Link-local addresses", 16: "Site-local addresses", -# 32: "Global addresses" } - -# "This NI type has no defined flags and never has a Data Field". Used -# to know if the destination is up and implements NI protocol. -class ICMPv6NIQueryNOOP(_ICMPv6NIHashret, _ICMPv6): - name = "ICMPv6 Node Information Query - NOOP Query" - fields_desc = [ ByteEnumField("type", 139, icmp6types), - NIQueryCodeField("code", None, _niquery_code), - XShortField("cksum", None), - ShortEnumField("qtype", 0, icmp6_niqtypes), - BitField("unused", 0, 10), - FlagsField("flags", 0, 6, "TACLSG"), - NonceField("nonce", None), - NIQueryDataField("data", None) ] - -class ICMPv6NIQueryName(ICMPv6NIQueryNOOP): - name = "ICMPv6 Node Information Query - IPv6 Name Query" - qtype = 2 - -# We ask for the IPv6 address of the peer -class ICMPv6NIQueryIPv6(ICMPv6NIQueryNOOP): - name = "ICMPv6 Node Information Query - IPv6 Address Query" - qtype = 3 - flags = 0x3E - -class ICMPv6NIQueryIPv4(ICMPv6NIQueryNOOP): - name = "ICMPv6 Node Information Query - IPv4 Address Query" - qtype = 4 - -_nireply_code = { 0: "Successful Reply", - 1: "Response Refusal", - 3: "Unknown query type" } - -_nireply_flags = { 1: "Reply set incomplete", - 2: "All unicast addresses", - 4: "IPv4 addresses", - 8: "Link-local addresses", - 16: "Site-local addresses", - 32: "Global addresses" } - -# Internal repr is one of those : -# (0, "some string") : unknow qtype value are mapped to that one -# (3, [ (ttl, ip6), ... ]) -# (4, [ (ttl, ip4), ... ]) -# (2, [ttl, dns_names]) : dns_names is one string that contains -# all the DNS names. Internally it is kept ready to be sent -# (undissected). i2repr() decode it for user. This is to -# make build after dissection bijective. -# -# I also merged getfield() and m2i(), and addfield() and i2m(). -class NIReplyDataField(StrField): - - def i2h(self, pkt, x): - if x is None: - return x - t,val = x - if t == 2: - ttl, dnsnames = val - val = [ttl] + dnsrepr2names(dnsnames) - return val - - def h2i(self, pkt, x): - qtype = 0 # We will decode it as string if not - # overridden through 'qtype' in pkt - - # No user hint, let's use 'qtype' value for that purpose - if type(x) is not tuple: - if pkt is not None: - qtype = getattr(pkt, "qtype") - else: - qtype = x[0] - x = x[1] - - # From that point on, x is the value (second element of the tuple) - - if qtype == 2: # DNS name - if type(x) is str: # listify the string - x = [x] - if type(x) is list and x and type(x[0]) is not int: # ttl was omitted : use 0 - x = [0] + x - ttl = x[0] - names = x[1:] - return (2, [ttl, names2dnsrepr(names)]) - - elif qtype in [3, 4]: # IPv4 or IPv6 addr - if type(x) is str: - x = [x] # User directly provided an IP, instead of list - - # List elements are not tuples, user probably - # omitted ttl value : we will use 0 instead - def addttl(x): - if type(x) is str: - return (0, x) - return x - - return (qtype, map(addttl, x)) - - return (qtype, x) - - - def addfield(self, pkt, s, val): - t,tmp = val - if tmp is None: - tmp = "" - if t == 2: - ttl,dnsstr = tmp - return s+ struct.pack("!I", ttl) + dnsstr - elif t == 3: - return s + "".join(map(lambda (x,y): struct.pack("!I", x)+inet_pton(socket.AF_INET6, y), tmp)) - elif t == 4: - return s + "".join(map(lambda (x,y): struct.pack("!I", x)+inet_pton(socket.AF_INET, y), tmp)) - else: - return s + tmp - - def getfield(self, pkt, s): - code = getattr(pkt, "code") - if code != 0: - return s, (0, "") - - qtype = getattr(pkt, "qtype") - if qtype == 0: # NOOP - return s, (0, "") - - elif qtype == 2: - if len(s) < 4: - return s, (0, "") - ttl = struct.unpack("!I", s[:4])[0] - return "", (2, [ttl, s[4:]]) - - elif qtype == 3: # IPv6 addresses with TTLs - # XXX TODO : get the real length - res = [] - while len(s) >= 20: # 4 + 16 - ttl = struct.unpack("!I", s[:4])[0] - ip = inet_ntop(socket.AF_INET6, s[4:20]) - res.append((ttl, ip)) - s = s[20:] - return s, (3, res) - - elif qtype == 4: # IPv4 addresses with TTLs - # XXX TODO : get the real length - res = [] - while len(s) >= 8: # 4 + 4 - ttl = struct.unpack("!I", s[:4])[0] - ip = inet_ntop(socket.AF_INET, s[4:8]) - res.append((ttl, ip)) - s = s[8:] - return s, (4, res) - else: - # XXX TODO : implement me and deal with real length - return "", (0, s) - - def i2repr(self, pkt, x): - if x is None: - return "[]" - - if type(x) is tuple and len(x) == 2: - t, val = x - if t == 2: # DNS names - ttl,l = val - l = dnsrepr2names(l) - return "ttl:%d %s" % (ttl, ", ".join(l)) - elif t == 3 or t == 4: - return "[ %s ]" % (", ".join(map(lambda (x,y): "(%d, %s)" % (x, y), val))) - return repr(val) - return repr(x) # XXX should not happen - -# By default, sent responses have code set to 0 (successful) -class ICMPv6NIReplyNOOP(_ICMPv6NIAnswers, _ICMPv6NIHashret, _ICMPv6): - name = "ICMPv6 Node Information Reply - NOOP Reply" - fields_desc = [ ByteEnumField("type", 140, icmp6types), - ByteEnumField("code", 0, _nireply_code), - XShortField("cksum", None), - ShortEnumField("qtype", 0, icmp6_niqtypes), - BitField("unused", 0, 10), - FlagsField("flags", 0, 6, "TACLSG"), - NonceField("nonce", None), - NIReplyDataField("data", None)] - -class ICMPv6NIReplyName(ICMPv6NIReplyNOOP): - name = "ICMPv6 Node Information Reply - Node Names" - qtype = 2 - -class ICMPv6NIReplyIPv6(ICMPv6NIReplyNOOP): - name = "ICMPv6 Node Information Reply - IPv6 addresses" - qtype = 3 - -class ICMPv6NIReplyIPv4(ICMPv6NIReplyNOOP): - name = "ICMPv6 Node Information Reply - IPv4 addresses" - qtype = 4 - -class ICMPv6NIReplyRefuse(ICMPv6NIReplyNOOP): - name = "ICMPv6 Node Information Reply - Responder refuses to supply answer" - code = 1 - -class ICMPv6NIReplyUnknown(ICMPv6NIReplyNOOP): - name = "ICMPv6 Node Information Reply - Qtype unknown to the responder" - code = 2 - - -def _niquery_guesser(p): - cls = conf.raw_layer - type = ord(p[0]) - if type == 139: # Node Info Query specific stuff - if len(p) > 6: - qtype, = struct.unpack("!H", p[4:6]) - cls = { 0: ICMPv6NIQueryNOOP, - 2: ICMPv6NIQueryName, - 3: ICMPv6NIQueryIPv6, - 4: ICMPv6NIQueryIPv4 }.get(qtype, conf.raw_layer) - elif type == 140: # Node Info Reply specific stuff - code = ord(p[1]) - if code == 0: - if len(p) > 6: - qtype, = struct.unpack("!H", p[4:6]) - cls = { 2: ICMPv6NIReplyName, - 3: ICMPv6NIReplyIPv6, - 4: ICMPv6NIReplyIPv4 }.get(qtype, ICMPv6NIReplyNOOP) - elif code == 1: - cls = ICMPv6NIReplyRefuse - elif code == 2: - cls = ICMPv6NIReplyUnknown - return cls - - -############################################################################# -############################################################################# -### Mobile IPv6 (RFC 3775) and Nemo (RFC 3963) ### -############################################################################# -############################################################################# - -# Mobile IPv6 ICMPv6 related classes - -class ICMPv6HAADRequest(_ICMPv6): - name = 'ICMPv6 Home Agent Address Discovery Request' - fields_desc = [ ByteEnumField("type", 144, icmp6types), - ByteField("code", 0), - XShortField("cksum", None), - XShortField("id", None), - BitEnumField("R", 1, 1, {1: 'MR'}), - XBitField("res", 0, 15) ] - def hashret(self): - return struct.pack("!H",self.id)+self.payload.hashret() - -class ICMPv6HAADReply(_ICMPv6): - name = 'ICMPv6 Home Agent Address Discovery Reply' - fields_desc = [ ByteEnumField("type", 145, icmp6types), - ByteField("code", 0), - XShortField("cksum", None), - XShortField("id", None), - BitEnumField("R", 1, 1, {1: 'MR'}), - XBitField("res", 0, 15), - IP6ListField('addresses', None) ] - def hashret(self): - return struct.pack("!H",self.id)+self.payload.hashret() - - def answers(self, other): - if not isinstance(other, ICMPv6HAADRequest): - return 0 - return self.id == other.id - -class ICMPv6MPSol(_ICMPv6): - name = 'ICMPv6 Mobile Prefix Solicitation' - fields_desc = [ ByteEnumField("type", 146, icmp6types), - ByteField("code", 0), - XShortField("cksum", None), - XShortField("id", None), - XShortField("res", 0) ] - def _hashret(self): - return struct.pack("!H",self.id) - -class ICMPv6MPAdv(_ICMPv6NDGuessPayload, _ICMPv6): - name = 'ICMPv6 Mobile Prefix Advertisement' - fields_desc = [ ByteEnumField("type", 147, icmp6types), - ByteField("code", 0), - XShortField("cksum", None), - XShortField("id", None), - BitEnumField("flags", 2, 2, {2: 'M', 1:'O'}), - XBitField("res", 0, 14) ] - def hashret(self): - return struct.pack("!H",self.id) - - def answers(self, other): - return isinstance(other, ICMPv6MPSol) - -# Mobile IPv6 Options classes - - -_mobopttypes = { 2: "Binding Refresh Advice", - 3: "Alternate Care-of Address", - 4: "Nonce Indices", - 5: "Binding Authorization Data", - 6: "Mobile Network Prefix (RFC3963)", - 7: "Link-Layer Address (RFC4068)", - 8: "Mobile Node Identifier (RFC4283)", - 9: "Mobility Message Authentication (RFC4285)", - 10: "Replay Protection (RFC4285)", - 11: "CGA Parameters Request (RFC4866)", - 12: "CGA Parameters (RFC4866)", - 13: "Signature (RFC4866)", - 14: "Home Keygen Token (RFC4866)", - 15: "Care-of Test Init (RFC4866)", - 16: "Care-of Test (RFC4866)" } - - -class _MIP6OptAlign: - """ Mobile IPv6 options have alignment requirements of the form x*n+y. - This class is inherited by all MIPv6 options to help in computing the - required Padding for that option, i.e. the need for a Pad1 or PadN - option before it. They only need to provide x and y as class - parameters. (x=0 and y=0 are used when no alignment is required)""" - def alignment_delta(self, curpos): - x = self.x ; y = self.y - if x == 0 and y ==0: - return 0 - delta = x*((curpos - y + x - 1)/x) + y - curpos - return delta - - -class MIP6OptBRAdvice(_MIP6OptAlign, Packet): - name = 'Mobile IPv6 Option - Binding Refresh Advice' - fields_desc = [ ByteEnumField('otype', 2, _mobopttypes), - ByteField('olen', 2), - ShortField('rinter', 0) ] - x = 2 ; y = 0# alignment requirement: 2n - -class MIP6OptAltCoA(_MIP6OptAlign, Packet): - name = 'MIPv6 Option - Alternate Care-of Address' - fields_desc = [ ByteEnumField('otype', 3, _mobopttypes), - ByteField('olen', 16), - IP6Field("acoa", "::") ] - x = 8 ; y = 6 # alignment requirement: 8n+6 - -class MIP6OptNonceIndices(_MIP6OptAlign, Packet): - name = 'MIPv6 Option - Nonce Indices' - fields_desc = [ ByteEnumField('otype', 4, _mobopttypes), - ByteField('olen', 16), - ShortField('hni', 0), - ShortField('coni', 0) ] - x = 2 ; y = 0 # alignment requirement: 2n - -class MIP6OptBindingAuthData(_MIP6OptAlign, Packet): - name = 'MIPv6 Option - Binding Authorization Data' - fields_desc = [ ByteEnumField('otype', 5, _mobopttypes), - ByteField('olen', 16), - BitField('authenticator', 0, 96) ] - x = 8 ; y = 2 # alignment requirement: 8n+2 - -class MIP6OptMobNetPrefix(_MIP6OptAlign, Packet): # NEMO - RFC 3963 - name = 'NEMO Option - Mobile Network Prefix' - fields_desc = [ ByteEnumField("otype", 6, _mobopttypes), - ByteField("olen", 18), - ByteField("reserved", 0), - ByteField("plen", 64), - IP6Field("prefix", "::") ] - x = 8 ; y = 4 # alignment requirement: 8n+4 - -class MIP6OptLLAddr(_MIP6OptAlign, Packet): # Sect 6.4.4 of RFC 4068 - name = "MIPv6 Option - Link-Layer Address (MH-LLA)" - fields_desc = [ ByteEnumField("otype", 7, _mobopttypes), - ByteField("olen", 7), - ByteEnumField("ocode", 2, _rfc4068_lla_optcode), - ByteField("pad", 0), - MACField("lla", ETHER_ANY) ] # Only support ethernet - x = 0 ; y = 0 # alignment requirement: none - -class MIP6OptMNID(_MIP6OptAlign, Packet): # RFC 4283 - name = "MIPv6 Option - Mobile Node Identifier" - fields_desc = [ ByteEnumField("otype", 8, _mobopttypes), - FieldLenField("olen", None, length_of="id", fmt="B", - adjust = lambda pkt,x: x+1), - ByteEnumField("subtype", 1, {1: "NAI"}), - StrLenField("id", "", - length_from = lambda pkt: pkt.olen-1) ] - x = 0 ; y = 0 # alignment requirement: none - -# We only support decoding and basic build. Automatic HMAC computation is -# too much work for our current needs. It is left to the user (I mean ... -# you). --arno -class MIP6OptMsgAuth(_MIP6OptAlign, Packet): # RFC 4285 (Sect. 5) - name = "MIPv6 Option - Mobility Message Authentication" - fields_desc = [ ByteEnumField("otype", 9, _mobopttypes), - FieldLenField("olen", None, length_of="authdata", fmt="B", - adjust = lambda pkt,x: x+5), - ByteEnumField("subtype", 1, {1: "MN-HA authentication mobility option", - 2: "MN-AAA authentication mobility option"}), - IntField("mspi", None), - StrLenField("authdata", "A"*12, - length_from = lambda pkt: pkt.olen-5) ] - x = 4 ; y = 1 # alignment requirement: 4n+1 - -# Extracted from RFC 1305 (NTP) : -# NTP timestamps are represented as a 64-bit unsigned fixed-point number, -# in seconds relative to 0h on 1 January 1900. The integer part is in the -# first 32 bits and the fraction part in the last 32 bits. -class NTPTimestampField(LongField): - epoch = (1900, 1, 1, 0, 0, 0, 5, 1, 0) - def i2repr(self, pkt, x): - if x < ((50*31536000)<<32): - return "Some date a few decades ago (%d)" % x - - # delta from epoch (= (1900, 1, 1, 0, 0, 0, 5, 1, 0)) to - # January 1st 1970 : - delta = -2209075761 - i = int(x >> 32) - j = float(x & 0xffffffff) * 2.0**-32 - res = i + j + delta - from time import strftime - t = time.strftime("%a, %d %b %Y %H:%M:%S +0000", time.gmtime(res)) - - return "%s (%d)" % (t, x) - -class MIP6OptReplayProtection(_MIP6OptAlign, Packet): # RFC 4285 (Sect. 6) - name = "MIPv6 option - Replay Protection" - fields_desc = [ ByteEnumField("otype", 10, _mobopttypes), - ByteField("olen", 8), - NTPTimestampField("timestamp", 0) ] - x = 8 ; y = 2 # alignment requirement: 8n+2 - -class MIP6OptCGAParamsReq(_MIP6OptAlign, Packet): # RFC 4866 (Sect. 5.6) - name = "MIPv6 option - CGA Parameters Request" - fields_desc = [ ByteEnumField("otype", 11, _mobopttypes), - ByteField("olen", 0) ] - x = 0 ; y = 0 # alignment requirement: none - -# XXX TODO: deal with CGA param fragmentation and build of defragmented -# XXX version. Passing of a big CGAParam structure should be -# XXX simplified. Make it hold packets, by the way --arno -class MIP6OptCGAParams(_MIP6OptAlign, Packet): # RFC 4866 (Sect. 5.1) - name = "MIPv6 option - CGA Parameters" - fields_desc = [ ByteEnumField("otype", 12, _mobopttypes), - FieldLenField("olen", None, length_of="cgaparams", fmt="B"), - StrLenField("cgaparams", "", - length_from = lambda pkt: pkt.olen) ] - x = 0 ; y = 0 # alignment requirement: none - -class MIP6OptSignature(_MIP6OptAlign, Packet): # RFC 4866 (Sect. 5.2) - name = "MIPv6 option - Signature" - fields_desc = [ ByteEnumField("otype", 13, _mobopttypes), - FieldLenField("olen", None, length_of="sig", fmt="B"), - StrLenField("sig", "", - length_from = lambda pkt: pkt.olen) ] - x = 0 ; y = 0 # alignment requirement: none - -class MIP6OptHomeKeygenToken(_MIP6OptAlign, Packet): # RFC 4866 (Sect. 5.3) - name = "MIPv6 option - Home Keygen Token" - fields_desc = [ ByteEnumField("otype", 14, _mobopttypes), - FieldLenField("olen", None, length_of="hkt", fmt="B"), - StrLenField("hkt", "", - length_from = lambda pkt: pkt.olen) ] - x = 0 ; y = 0 # alignment requirement: none - -class MIP6OptCareOfTestInit(_MIP6OptAlign, Packet): # RFC 4866 (Sect. 5.4) - name = "MIPv6 option - Care-of Test Init" - fields_desc = [ ByteEnumField("otype", 15, _mobopttypes), - ByteField("olen", 0) ] - x = 0 ; y = 0 # alignment requirement: none - -class MIP6OptCareOfTest(_MIP6OptAlign, Packet): # RFC 4866 (Sect. 5.5) - name = "MIPv6 option - Care-of Test" - fields_desc = [ ByteEnumField("otype", 16, _mobopttypes), - FieldLenField("olen", None, length_of="cokt", fmt="B"), - StrLenField("cokt", '\x00'*8, - length_from = lambda pkt: pkt.olen) ] - x = 0 ; y = 0 # alignment requirement: none - -class MIP6OptUnknown(_MIP6OptAlign, Packet): - name = 'Scapy6 - Unknown Mobility Option' - fields_desc = [ ByteEnumField("otype", 6, _mobopttypes), - FieldLenField("olen", None, length_of="odata", fmt="B"), - StrLenField("odata", "", - length_from = lambda pkt: pkt.olen) ] - x = 0 ; y = 0 # alignment requirement: none - -moboptcls = { 0: Pad1, - 1: PadN, - 2: MIP6OptBRAdvice, - 3: MIP6OptAltCoA, - 4: MIP6OptNonceIndices, - 5: MIP6OptBindingAuthData, - 6: MIP6OptMobNetPrefix, - 7: MIP6OptLLAddr, - 8: MIP6OptMNID, - 9: MIP6OptMsgAuth, - 10: MIP6OptReplayProtection, - 11: MIP6OptCGAParamsReq, - 12: MIP6OptCGAParams, - 13: MIP6OptSignature, - 14: MIP6OptHomeKeygenToken, - 15: MIP6OptCareOfTestInit, - 16: MIP6OptCareOfTest } - - -# Main Mobile IPv6 Classes - -mhtypes = { 0: 'BRR', - 1: 'HoTI', - 2: 'CoTI', - 3: 'HoT', - 4: 'CoT', - 5: 'BU', - 6: 'BA', - 7: 'BE', - 8: 'Fast BU', - 9: 'Fast BA', - 10: 'Fast NA' } - -# From http://www.iana.org/assignments/mobility-parameters -bastatus = { 0: 'Binding Update accepted', - 1: 'Accepted but prefix discovery necessary', - 128: 'Reason unspecified', - 129: 'Administratively prohibited', - 130: 'Insufficient resources', - 131: 'Home registration not supported', - 132: 'Not home subnet', - 133: 'Not home agent for this mobile node', - 134: 'Duplicate Address Detection failed', - 135: 'Sequence number out of window', - 136: 'Expired home nonce index', - 137: 'Expired care-of nonce index', - 138: 'Expired nonces', - 139: 'Registration type change disallowed', - 140: 'Mobile Router Operation not permitted', - 141: 'Invalid Prefix', - 142: 'Not Authorized for Prefix', - 143: 'Forwarding Setup failed (prefixes missing)', - 144: 'MIPV6-ID-MISMATCH', - 145: 'MIPV6-MESG-ID-REQD', - 146: 'MIPV6-AUTH-FAIL', - 147: 'Permanent home keygen token unavailable', - 148: 'CGA and signature verification failed', - 149: 'Permanent home keygen token exists', - 150: 'Non-null home nonce index expected' } - - -class _MobilityHeader(Packet): - name = 'Dummy IPv6 Mobility Header' - overload_fields = { IPv6: { "nh": 135 }} - - def post_build(self, p, pay): - p += pay - l = self.len - if self.len is None: - l = (len(p)-8)/8 - p = p[0] + struct.pack("B", l) + p[2:] - if self.cksum is None: - cksum = in6_chksum(135, self.underlayer, p) - else: - cksum = self.cksum - p = p[:4]+struct.pack("!H", cksum)+p[6:] - return p - - -class MIP6MH_Generic(_MobilityHeader): # Mainly for decoding of unknown msg - name = "IPv6 Mobility Header - Generic Message" - fields_desc = [ ByteEnumField("nh", 59, ipv6nh), - ByteField("len", None), - ByteEnumField("mhtype", None, mhtypes), - ByteField("res", None), - XShortField("cksum", None), - StrLenField("msg", "\x00"*2, - length_from = lambda pkt: 8*pkt.len-6) ] - - - -# TODO: make a generic _OptionsField -class _MobilityOptionsField(PacketListField): - islist = 1 - holds_packet = 1 - - def __init__(self, name, default, cls, curpos, count_from=None, length_from=None): - self.curpos = curpos - PacketListField.__init__(self, name, default, cls, count_from=count_from, length_from=length_from) - - def getfield(self, pkt, s): - l = self.length_from(pkt) - return s[l:],self.m2i(pkt, s[:l]) - - def i2len(self, pkt, i): - return len(self.i2m(pkt, i)) - - def m2i(self, pkt, x): - opt = [] - while x: - o = ord(x[0]) # Option type - cls = self.cls - if moboptcls.has_key(o): - cls = moboptcls[o] - try: - op = cls(x) - except: - op = self.cls(x) - opt.append(op) - if isinstance(op.payload, conf.raw_layer): - x = op.payload.load - del(op.payload) - else: - x = "" - return opt - - def i2m(self, pkt, x): - autopad = None - try: - autopad = getattr(pkt, "autopad") # Hack : 'autopad' phantom field - except: - autopad = 1 - - if not autopad: - return "".join(map(str, x)) - - curpos = self.curpos - s = "" - for p in x: - d = p.alignment_delta(curpos) - curpos += d - if d == 1: - s += str(Pad1()) - elif d != 0: - s += str(PadN(optdata='\x00'*(d-2))) - pstr = str(p) - curpos += len(pstr) - s += pstr - - # Let's make the class including our option field - # a multiple of 8 octets long - d = curpos % 8 - if d == 0: - return s - d = 8 - d - if d == 1: - s += str(Pad1()) - elif d != 0: - s += str(PadN(optdata='\x00'*(d-2))) - - return s - - def addfield(self, pkt, s, val): - return s+self.i2m(pkt, val) - -class MIP6MH_BRR(_MobilityHeader): - name = "IPv6 Mobility Header - Binding Refresh Request" - fields_desc = [ ByteEnumField("nh", 59, ipv6nh), - ByteField("len", None), - ByteEnumField("mhtype", 0, mhtypes), - ByteField("res", None), - XShortField("cksum", None), - ShortField("res2", None), - _PhantomAutoPadField("autopad", 1), # autopad activated by default - _MobilityOptionsField("options", [], MIP6OptUnknown, 8, - length_from = lambda pkt: 8*pkt.len) ] - overload_fields = { IPv6: { "nh": 135 } } - def hashret(self): - # Hack: BRR, BU and BA have the same hashret that returns the same - # value "\x00\x08\x09" (concatenation of mhtypes). This is - # because we need match BA with BU and BU with BRR. --arno - return "\x00\x08\x09" - -class MIP6MH_HoTI(_MobilityHeader): - name = "IPv6 Mobility Header - Home Test Init" - fields_desc = [ ByteEnumField("nh", 59, ipv6nh), - ByteField("len", None), - ByteEnumField("mhtype", 1, mhtypes), - ByteField("res", None), - XShortField("cksum", None), - StrFixedLenField("reserved", "\x00"*2, 2), - StrFixedLenField("cookie", "\x00"*8, 8), - _PhantomAutoPadField("autopad", 1), # autopad activated by default - _MobilityOptionsField("options", [], MIP6OptUnknown, 16, - length_from = lambda pkt: 8*(pkt.len-1)) ] - overload_fields = { IPv6: { "nh": 135 } } - def hashret(self): - return self.cookie - -class MIP6MH_CoTI(MIP6MH_HoTI): - name = "IPv6 Mobility Header - Care-of Test Init" - mhtype = 2 - def hashret(self): - return self.cookie - -class MIP6MH_HoT(_MobilityHeader): - name = "IPv6 Mobility Header - Home Test" - fields_desc = [ ByteEnumField("nh", 59, ipv6nh), - ByteField("len", None), - ByteEnumField("mhtype", 3, mhtypes), - ByteField("res", None), - XShortField("cksum", None), - ShortField("index", None), - StrFixedLenField("cookie", "\x00"*8, 8), - StrFixedLenField("token", "\x00"*8, 8), - _PhantomAutoPadField("autopad", 1), # autopad activated by default - _MobilityOptionsField("options", [], MIP6OptUnknown, 24, - length_from = lambda pkt: 8*(pkt.len-2)) ] - overload_fields = { IPv6: { "nh": 135 } } - def hashret(self): - return self.cookie - def answers(self): - if (isinstance(other, MIP6MH_HoTI) and - self.cookie == other.cookie): - return 1 - return 0 - -class MIP6MH_CoT(MIP6MH_HoT): - name = "IPv6 Mobility Header - Care-of Test" - mhtype = 4 - def hashret(self): - return self.cookie - - def answers(self): - if (isinstance(other, MIP6MH_CoTI) and - self.cookie == other.cookie): - return 1 - return 0 - -class LifetimeField(ShortField): - def i2repr(self, pkt, x): - return "%d sec" % (4*x) - -class MIP6MH_BU(_MobilityHeader): - name = "IPv6 Mobility Header - Binding Update" - fields_desc = [ ByteEnumField("nh", 59, ipv6nh), - ByteField("len", None), # unit == 8 bytes (excluding the first 8 bytes) - ByteEnumField("mhtype", 5, mhtypes), - ByteField("res", None), - XShortField("cksum", None), - XShortField("seq", None), # TODO: ShortNonceField - FlagsField("flags", "KHA", 7, "PRMKLHA"), - XBitField("reserved", 0, 9), - LifetimeField("mhtime", 3), # unit == 4 seconds - _PhantomAutoPadField("autopad", 1), # autopad activated by default - _MobilityOptionsField("options", [], MIP6OptUnknown, 12, - length_from = lambda pkt: 8*pkt.len - 4) ] - overload_fields = { IPv6: { "nh": 135 } } - - def hashret(self): # Hack: see comment in MIP6MH_BRR.hashret() - return "\x00\x08\x09" - - def answers(self, other): - if isinstance(other, MIP6MH_BRR): - return 1 - return 0 - -class MIP6MH_BA(_MobilityHeader): - name = "IPv6 Mobility Header - Binding ACK" - fields_desc = [ ByteEnumField("nh", 59, ipv6nh), - ByteField("len", None), # unit == 8 bytes (excluding the first 8 bytes) - ByteEnumField("mhtype", 6, mhtypes), - ByteField("res", None), - XShortField("cksum", None), - ByteEnumField("status", 0, bastatus), - FlagsField("flags", "K", 3, "PRK"), - XBitField("res2", None, 5), - XShortField("seq", None), # TODO: ShortNonceField - XShortField("mhtime", 0), # unit == 4 seconds - _PhantomAutoPadField("autopad", 1), # autopad activated by default - _MobilityOptionsField("options", [], MIP6OptUnknown, 12, - length_from = lambda pkt: 8*pkt.len-4) ] - overload_fields = { IPv6: { "nh": 135 }} - - def hashret(self): # Hack: see comment in MIP6MH_BRR.hashret() - return "\x00\x08\x09" - - def answers(self, other): - if (isinstance(other, MIP6MH_BU) and - other.mhtype == 5 and - self.mhtype == 6 and - other.flags & 0x1 and # Ack request flags is set - self.seq == other.seq): - return 1 - return 0 - -_bestatus = { 1: 'Unknown binding for Home Address destination option', - 2: 'Unrecognized MH Type value' } - -# TODO: match Binding Error to its stimulus -class MIP6MH_BE(_MobilityHeader): - name = "IPv6 Mobility Header - Binding Error" - fields_desc = [ ByteEnumField("nh", 59, ipv6nh), - ByteField("len", None), # unit == 8 bytes (excluding the first 8 bytes) - ByteEnumField("mhtype", 7, mhtypes), - ByteField("res", 0), - XShortField("cksum", None), - ByteEnumField("status", 0, _bestatus), - ByteField("reserved", 0), - IP6Field("ha", "::"), - _MobilityOptionsField("options", [], MIP6OptUnknown, 24, - length_from = lambda pkt: 8*(pkt.len-2)) ] - overload_fields = { IPv6: { "nh": 135 }} - -_mip6_mhtype2cls = { 0: MIP6MH_BRR, - 1: MIP6MH_HoTI, - 2: MIP6MH_CoTI, - 3: MIP6MH_HoT, - 4: MIP6MH_CoT, - 5: MIP6MH_BU, - 6: MIP6MH_BA, - 7: MIP6MH_BE } - - -############################################################################# -############################################################################# -### Traceroute6 ### -############################################################################# -############################################################################# - -class AS_resolver6(AS_resolver_riswhois): - def _resolve_one(self, ip): - """ - overloaded version to provide a Whois resolution on the - embedded IPv4 address if the address is 6to4 or Teredo. - Otherwise, the native IPv6 address is passed. - """ - - if in6_isaddr6to4(ip): # for 6to4, use embedded @ - tmp = inet_pton(socket.AF_INET6, ip) - addr = inet_ntop(socket.AF_INET, tmp[2:6]) - elif in6_isaddrTeredo(ip): # for Teredo, use mapped address - addr = teredoAddrExtractInfo(ip)[2] - else: - addr = ip - - _, asn, desc = AS_resolver_riswhois._resolve_one(self, addr) - - return ip,asn,desc - -class TracerouteResult6(TracerouteResult): - def show(self): - return self.make_table(lambda (s,r): (s.sprintf("%-42s,IPv6.dst%:{TCP:tcp%TCP.dport%}{UDP:udp%UDP.dport%}{ICMPv6EchoRequest:IER}"), # TODO: ICMPv6 ! - s.hlim, - r.sprintf("%-42s,IPv6.src% {TCP:%TCP.flags%}"+ - "{ICMPv6DestUnreach:%ir,type%}{ICMPv6PacketTooBig:%ir,type%}"+ - "{ICMPv6TimeExceeded:%ir,type%}{ICMPv6ParamProblem:%ir,type%}"+ - "{ICMPv6EchoReply:%ir,type%}"))) - - def get_trace(self): - trace = {} - - for s,r in self.res: - if IPv6 not in s: - continue - d = s[IPv6].dst - if d not in trace: - trace[d] = {} - - t = not (ICMPv6TimeExceeded in r or - ICMPv6DestUnreach in r or - ICMPv6PacketTooBig in r or - ICMPv6ParamProblem in r) - - trace[d][s[IPv6].hlim] = r[IPv6].src, t - - for k in trace.values(): - m = filter(lambda x: k[x][1], k.keys()) - if not m: - continue - m = min(m) - for l in k.keys(): - if l > m: - del(k[l]) - - return trace - - def graph(self, ASres=AS_resolver6(), **kargs): - TracerouteResult.graph(self, ASres=ASres, **kargs) - -def traceroute6(target, dport=80, minttl=1, maxttl=30, sport=RandShort(), - l4 = None, timeout=2, verbose=None, **kargs): - """ - Instant TCP traceroute using IPv6 : - traceroute6(target, [maxttl=30], [dport=80], [sport=80]) -> None - """ - if verbose is None: - verbose = conf.verb - - if l4 is None: - a,b = sr(IPv6(dst=target, hlim=(minttl,maxttl))/TCP(seq=RandInt(),sport=sport, dport=dport), - timeout=timeout, filter="icmp6 or tcp", verbose=verbose, **kargs) - else: - a,b = sr(IPv6(dst=target, hlim=(minttl,maxttl))/l4, - timeout=timeout, verbose=verbose, **kargs) - - a = TracerouteResult6(a.res) - - if verbose: - a.display() - - return a,b - -############################################################################# -############################################################################# -### Sockets ### -############################################################################# -############################################################################# - -class L3RawSocket6(L3RawSocket): - def __init__(self, type = ETH_P_IPV6, filter=None, iface=None, promisc=None, nofilter=0): - L3RawSocket.__init__(self, type, filter, iface, promisc) - # NOTE: if fragmentation is needed, it will be done by the kernel (RFC 2292) - self.outs = socket.socket(socket.AF_INET6, socket.SOCK_RAW, socket.IPPROTO_RAW) - self.ins = socket.socket(socket.AF_PACKET, socket.SOCK_RAW, socket.htons(type)) - -def IPv6inIP(dst='203.178.135.36', src=None): - _IPv6inIP.dst = dst - _IPv6inIP.src = src - if not conf.L3socket == _IPv6inIP: - _IPv6inIP.cls = conf.L3socket - else: - del(conf.L3socket) - return _IPv6inIP - -class _IPv6inIP(SuperSocket): - dst = '127.0.0.1' - src = None - cls = None - - def __init__(self, family=socket.AF_INET6, type=socket.SOCK_STREAM, proto=0, **args): - SuperSocket.__init__(self, family, type, proto) - self.worker = self.cls(**args) - - def set(self, dst, src=None): - _IPv6inIP.src = src - _IPv6inIP.dst = dst - - def nonblock_recv(self): - p = self.worker.nonblock_recv() - return self._recv(p) - - def recv(self, x): - p = self.worker.recv(x) - return self._recv(p, x) - - def _recv(self, p, x=MTU): - if p is None: - return p - elif isinstance(p, IP): - # TODO: verify checksum - if p.src == self.dst and p.proto == socket.IPPROTO_IPV6: - if isinstance(p.payload, IPv6): - return p.payload - return p - - def send(self, x): - return self.worker.send(IP(dst=self.dst, src=self.src, proto=socket.IPPROTO_IPV6)/x) - - -############################################################################# -############################################################################# -### Layers binding ### -############################################################################# -############################################################################# - -conf.l3types.register(ETH_P_IPV6, IPv6) -conf.l2types.register(31, IPv6) - -bind_layers(Ether, IPv6, type = 0x86dd ) -bind_layers(CookedLinux, IPv6, proto = 0x86dd ) -bind_layers(IPerror6, TCPerror, nh = socket.IPPROTO_TCP ) -bind_layers(IPerror6, UDPerror, nh = socket.IPPROTO_UDP ) -bind_layers(IPv6, TCP, nh = socket.IPPROTO_TCP ) -bind_layers(IPv6, UDP, nh = socket.IPPROTO_UDP ) -bind_layers(IP, IPv6, proto = socket.IPPROTO_IPV6 ) -bind_layers(IPv6, IPv6, nh = socket.IPPROTO_IPV6 ) -bind_layers(IPv6, IP, nh = IPPROTO_IPIP ) diff --git a/scripts/external_libs/scapy-2.3.1/scapy/layers/ipsec.py b/scripts/external_libs/scapy-2.3.1/scapy/layers/ipsec.py deleted file mode 100644 index 692a6e18..00000000 --- a/scripts/external_libs/scapy-2.3.1/scapy/layers/ipsec.py +++ /dev/null @@ -1,981 +0,0 @@ -############################################################################# -## ipsec.py --- IPSec support for Scapy ## -## ## -## Copyright (C) 2014 6WIND ## -## ## -## This program is free software; you can redistribute it and/or modify it ## -## under the terms of the GNU General Public License version 2 as ## -## published by the Free Software Foundation. ## -## ## -## This program is distributed in the hope that it will be useful, but ## -## WITHOUT ANY WARRANTY; without even the implied warranty of ## -## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU ## -## General Public License for more details. ## -############################################################################# -""" -IPSec layer -=========== - -Example of use: - ->>> sa = SecurityAssociation(ESP, spi=0xdeadbeef, crypt_algo='AES-CBC', -... crypt_key='sixteenbytes key') ->>> p = IP(src='1.1.1.1', dst='2.2.2.2') ->>> p /= TCP(sport=45012, dport=80) ->>> p /= Raw('testdata') ->>> p = IP(str(p)) ->>> p -<IP version=4L ihl=5L tos=0x0 len=48 id=1 flags= frag=0L ttl=64 proto=tcp chksum=0x74c2 src=1.1.1.1 dst=2.2.2.2 options=[] |<TCP sport=45012 dport=http seq=0 ack=0 dataofs=5L reserved=0L flags=S window=8192 chksum=0x1914 urgptr=0 options=[] |<Raw load='testdata' |>>> ->>> ->>> e = sa.encrypt(p) ->>> e -<IP version=4L ihl=5L tos=0x0 len=76 id=1 flags= frag=0L ttl=64 proto=esp chksum=0x747a src=1.1.1.1 dst=2.2.2.2 |<ESP spi=0xdeadbeef seq=1 data='\xf8\xdb\x1e\x83[T\xab\\\xd2\x1b\xed\xd1\xe5\xc8Y\xc2\xa5d\x92\xc1\x05\x17\xa6\x92\x831\xe6\xc1]\x9a\xd6K}W\x8bFfd\xa5B*+\xde\xc8\x89\xbf{\xa9' |>> ->>> ->>> d = sa.decrypt(e) ->>> d -<IP version=4L ihl=5L tos=0x0 len=48 id=1 flags= frag=0L ttl=64 proto=tcp chksum=0x74c2 src=1.1.1.1 dst=2.2.2.2 |<TCP sport=45012 dport=http seq=0 ack=0 dataofs=5L reserved=0L flags=S window=8192 chksum=0x1914 urgptr=0 options=[] |<Raw load='testdata' |>>> ->>> ->>> d == p -True -""" - -import socket -import fractions - -from scapy.data import IP_PROTOS - -from scapy.fields import ByteEnumField, ByteField, StrField, XIntField, IntField, \ - ShortField, PacketField - -from scapy.packet import Packet, bind_layers, Raw - -from scapy.layers.inet import IP, UDP -from scapy.layers.inet6 import IPv6, IPv6ExtHdrHopByHop, IPv6ExtHdrDestOpt, \ - IPv6ExtHdrRouting - - -#------------------------------------------------------------------------------ -class AH(Packet): - """ - Authentication Header - - See https://tools.ietf.org/rfc/rfc4302.txt - """ - - name = 'AH' - - fields_desc = [ - ByteEnumField('nh', None, IP_PROTOS), - ByteField('payloadlen', None), - ShortField('reserved', None), - XIntField('spi', 0x0), - IntField('seq', 0), - StrField('icv', None), - StrField('padding', None), - ] - - overload_fields = { - IP: {'proto': socket.IPPROTO_AH}, - IPv6: {'nh': socket.IPPROTO_AH}, - IPv6ExtHdrHopByHop: {'nh': socket.IPPROTO_AH}, - IPv6ExtHdrDestOpt: {'nh': socket.IPPROTO_AH}, - IPv6ExtHdrRouting: {'nh': socket.IPPROTO_AH}, - } - -bind_layers(IP, AH, proto=socket.IPPROTO_AH) -bind_layers(IPv6, AH, nh=socket.IPPROTO_AH) - -#------------------------------------------------------------------------------ -class ESP(Packet): - """ - Encapsulated Security Payload - - See https://tools.ietf.org/rfc/rfc4303.txt - """ - name = 'ESP' - - fields_desc = [ - XIntField('spi', 0x0), - IntField('seq', 0), - StrField('data', None), - ] - - overload_fields = { - IP: {'proto': socket.IPPROTO_ESP}, - IPv6: {'nh': socket.IPPROTO_ESP}, - IPv6ExtHdrHopByHop: {'nh': socket.IPPROTO_ESP}, - IPv6ExtHdrDestOpt: {'nh': socket.IPPROTO_ESP}, - IPv6ExtHdrRouting: {'nh': socket.IPPROTO_ESP}, - } - -bind_layers(IP, ESP, proto=socket.IPPROTO_ESP) -bind_layers(IPv6, ESP, nh=socket.IPPROTO_ESP) -bind_layers(UDP, ESP, dport=4500) # NAT-Traversal encapsulation -bind_layers(UDP, ESP, sport=4500) # NAT-Traversal encapsulation - -#------------------------------------------------------------------------------ -class _ESPPlain(Packet): - """ - Internal class to represent unencrypted ESP packets. - """ - name = 'ESP' - - fields_desc = [ - XIntField('spi', 0x0), - IntField('seq', 0), - - StrField('iv', ''), - PacketField('data', '', Raw), - StrField('padding', ''), - - ByteField('padlen', 0), - ByteEnumField('nh', 0, IP_PROTOS), - StrField('icv', ''), - ] - - def data_for_encryption(self): - return str(self.data) + self.padding + chr(self.padlen) + chr(self.nh) - -#------------------------------------------------------------------------------ -try: - from Crypto.Cipher import AES - from Crypto.Cipher import DES - from Crypto.Cipher import DES3 - from Crypto.Cipher import CAST - from Crypto.Cipher import Blowfish - from Crypto.Util import Counter - from Crypto import Random -except ImportError: - # no error if pycrypto is not available but encryption won't be supported - AES = None - DES = None - DES3 = None - CAST = None - Blowfish = None - Random = None - -#------------------------------------------------------------------------------ -def _lcm(a, b): - """ - Least Common Multiple between 2 integers. - """ - if a == 0 or b == 0: - return 0 - else: - return abs(a * b) // fractions.gcd(a, b) - -class CryptAlgo(object): - """ - IPSec encryption algorithm - """ - - def __init__(self, name, cipher, mode, block_size=None, iv_size=None, key_size=None): - """ - @param name: the name of this encryption algorithm - @param cipher: a Cipher module - @param mode: the mode used with the cipher module - @param block_size: the length a block for this algo. Defaults to the - `block_size` of the cipher. - @param iv_size: the length of the initialization vector of this algo. - Defaults to the `block_size` of the cipher. - @param key_size: an integer or list/tuple of integers. If specified, - force the secret keys length to one of the values. - Defaults to the `key_size` of the cipher. - """ - self.name = name - self.cipher = cipher - self.mode = mode - - if block_size is not None: - self.block_size = block_size - elif cipher is not None: - self.block_size = cipher.block_size - else: - self.block_size = 1 - - if iv_size is None: - self.iv_size = self.block_size - else: - self.iv_size = iv_size - - if key_size is not None: - self.key_size = key_size - elif cipher is not None: - self.key_size = cipher.key_size - else: - self.key_size = None - - def check_key(self, key): - """ - Check that the key length is valid. - - @param key: a byte string - """ - if self.key_size and not (len(key) == self.key_size or len(key) in self.key_size): - raise TypeError('invalid key size %s, must be %s' % - (len(key), self.key_size)) - - def generate_iv(self): - """ - Generate a random initialization vector. If pycrypto is not available, - return a buffer of the correct length filled with only '\x00'. - """ - if Random: - return Random.get_random_bytes(self.iv_size) - else: - return chr(0) * self.iv_size - - def new_cipher(self, key, iv): - """ - @param key: the secret key, a byte string - @param iv: the initialization vector, a byte string - @return: an initialized cipher object for this algo - """ - if (hasattr(self.cipher, 'MODE_CTR') and self.mode == self.cipher.MODE_CTR - or hasattr(self.cipher, 'MODE_GCM') and self.mode == self.cipher.MODE_GCM): - # in counter mode, the "iv" must be incremented for each block - # it is calculated like this: - # +---------+------------------+---------+ - # | nonce | IV | counter | - # +---------+------------------+---------+ - # m bytes n bytes 4 bytes - # <--------------------------------------> - # block_size - nonce_size = self.cipher.block_size - self.iv_size - 4 - - # instead of asking for an extra parameter, we extract the last - # nonce_size bytes of the key and use them as the nonce. - # +----------------------------+---------+ - # | cipher key | nonce | - # +----------------------------+---------+ - # <---------> - # nonce_size - cipher_key, nonce = key[:-nonce_size], key[-nonce_size:] - - return self.cipher.new(cipher_key, self.mode, - counter=Counter.new(4 * 8, prefix=nonce + iv)) - else: - return self.cipher.new(key, self.mode, iv) - - def pad(self, esp): - """ - Add the correct amount of padding so that the data to encrypt is - exactly a multiple of the algorithm's block size. - - Also, make sure that the total ESP packet length is a multiple of 4 or - 8 bytes with IP or IPv6 respectively. - - @param esp: an unencrypted _ESPPlain packet - """ - # 2 extra bytes for padlen and nh - data_len = len(esp.data) + 2 - - # according to the RFC4303, section 2.4. Padding (for Encryption) - # the size of the ESP payload must be a multiple of 32 bits - align = _lcm(self.block_size, 4) - - # pad for block size - esp.padlen = -data_len % align - - # padding must be an array of bytes starting from 1 to padlen - esp.padding = '' - for b in range(1, esp.padlen + 1): - esp.padding += chr(b) - - # If the following test fails, it means that this algo does not comply - # with the RFC - payload_len = len(esp.iv) + len(esp.data) + len(esp.padding) + 2 - if payload_len % 4 != 0: - raise ValueError('The size of the ESP data is not aligned to 32 bits after padding.') - - return esp - - def encrypt(self, esp, key): - """ - Encrypt an ESP packet - - @param esp: an unencrypted _ESPPlain packet with valid padding - @param key: the secret key used for encryption - - @return: a valid ESP packet encrypted with this algorithm - """ - data = esp.data_for_encryption() - - if self.cipher: - self.check_key(key) - cipher = self.new_cipher(key, esp.iv) - data = cipher.encrypt(data) - - return ESP(spi=esp.spi, seq=esp.seq, data=esp.iv + data) - - def decrypt(self, esp, key, icv_size=0): - """ - Decrypt an ESP packet - - @param esp: an encrypted ESP packet - @param key: the secret key used for encryption - @param icv_size: the length of the icv used for integrity check - - @return: a valid ESP packet encrypted with this algorithm - """ - self.check_key(key) - - iv = esp.data[:self.iv_size] - data = esp.data[self.iv_size:len(esp.data) - icv_size] - icv = esp.data[len(esp.data) - icv_size:] - - if self.cipher: - cipher = self.new_cipher(key, iv) - data = cipher.decrypt(data) - - # extract padlen and nh - padlen = ord(data[-2]) - nh = ord(data[-1]) - - # then use padlen to determine data and padding - data = data[:len(data) - padlen - 2] - padding = data[len(data) - padlen - 2: len(data) - 2] - - return _ESPPlain(spi=esp.spi, - seq=esp.seq, - iv=iv, - data=data, - padding=padding, - padlen=padlen, - nh=nh, - icv=icv) - -#------------------------------------------------------------------------------ -# The names of the encryption algorithms are the same than in scapy.contrib.ikev2 -# see http://www.iana.org/assignments/ikev2-parameters/ikev2-parameters.xhtml - -CRYPT_ALGOS = { - 'NULL': CryptAlgo('NULL', cipher=None, mode=None, iv_size=0), -} - -if AES: - CRYPT_ALGOS['AES-CBC'] = CryptAlgo('AES-CBC', - cipher=AES, - mode=AES.MODE_CBC) - # specific case for counter mode: - # the last 4 bytes of the key are used to carry the nonce of the counter - CRYPT_ALGOS['AES-CTR'] = CryptAlgo('AES-CTR', - cipher=AES, - mode=AES.MODE_CTR, - block_size=1, - iv_size=8, - key_size=(16 + 4, 24 + 4, 32 + 4)) -if DES: - CRYPT_ALGOS['DES'] = CryptAlgo('DES', - cipher=DES, - mode=DES.MODE_CBC) -if Blowfish: - CRYPT_ALGOS['Blowfish'] = CryptAlgo('Blowfish', - cipher=Blowfish, - mode=Blowfish.MODE_CBC) -if DES3: - CRYPT_ALGOS['3DES'] = CryptAlgo('3DES', - cipher=DES3, - mode=DES3.MODE_CBC) -if CAST: - CRYPT_ALGOS['CAST'] = CryptAlgo('CAST', - cipher=CAST, - mode=CAST.MODE_CBC) - -#------------------------------------------------------------------------------ -try: - from Crypto.Hash import HMAC - from Crypto.Hash import SHA - from Crypto.Hash import MD5 - from Crypto.Hash import SHA256 - from Crypto.Hash import SHA384 - from Crypto.Hash import SHA512 -except ImportError: - # no error if pycrypto is not available but authentication won't be supported - HMAC = None - SHA = None - MD5 = None - SHA256 = None - SHA384 = None -try: - from Crypto.Hash import XCBCMAC -except ImportError: - XCBCMAC = None - -#------------------------------------------------------------------------------ -class IPSecIntegrityError(Exception): - """ - Error risen when the integrity check fails. - """ - pass - -class AuthAlgo(object): - """ - IPSec integrity algorithm - """ - - def __init__(self, name, mac, digestmod, icv_size, key_size=None): - """ - @param name: the name of this integrity algorithm - @param mac: a Message Authentication Code module - @param digestmod: a Hash or Cipher module - @param icv_size: the length of the integrity check value of this algo - @param key_size: an integer or list/tuple of integers. If specified, - force the secret keys length to one of the values. - Defaults to the `key_size` of the cipher. - """ - self.name = name - self.mac = mac - self.digestmod = digestmod - self.icv_size = icv_size - self.key_size = key_size - - def check_key(self, key): - """ - Check that the key length is valid. - - @param key: a byte string - """ - if self.key_size and len(key) not in self.key_size: - raise TypeError('invalid key size %s, must be one of %s' % - (len(key), self.key_size)) - - def new_mac(self, key): - """ - @param key: a byte string - @return: an initialized mac object for this algo - """ - if self.mac is XCBCMAC: - # specific case here, ciphermod instead of digestmod - return self.mac.new(key, ciphermod=self.digestmod) - else: - return self.mac.new(key, digestmod=self.digestmod) - - def sign(self, pkt, key): - """ - Sign an IPSec (ESP or AH) packet with this algo. - - @param pkt: a packet that contains a valid encrypted ESP or AH layer - @param key: the authentication key, a byte string - - @return: the signed packet - """ - if not self.mac: - return pkt - - self.check_key(key) - - mac = self.new_mac(key) - - if pkt.haslayer(ESP): - mac.update(str(pkt[ESP])) - pkt[ESP].data += mac.digest()[:self.icv_size] - - elif pkt.haslayer(AH): - clone = zero_mutable_fields(pkt.copy(), sending=True) - mac.update(str(clone)) - pkt[AH].icv = mac.digest()[:self.icv_size] - - return pkt - - def verify(self, pkt, key): - """ - Check that the integrity check value (icv) of a packet is valid. - - @param pkt: a packet that contains a valid encrypted ESP or AH layer - @param key: the authentication key, a byte string - - @raise IPSecIntegrityError: if the integrity check fails - """ - if not self.mac or self.icv_size == 0: - return - - self.check_key(key) - - mac = self.new_mac(key) - - pkt_icv = 'not found' - computed_icv = 'not computed' - - if isinstance(pkt, ESP): - pkt_icv = pkt.data[len(pkt.data) - self.icv_size:] - - pkt = pkt.copy() - pkt.data = pkt.data[:len(pkt.data) - self.icv_size] - mac.update(str(pkt)) - computed_icv = mac.digest()[:self.icv_size] - - elif pkt.haslayer(AH): - pkt_icv = pkt[AH].icv[:self.icv_size] - - clone = zero_mutable_fields(pkt.copy(), sending=False) - mac.update(str(clone)) - computed_icv = mac.digest()[:self.icv_size] - - if pkt_icv != computed_icv: - raise IPSecIntegrityError('pkt_icv=%r, computed_icv=%r' % - (pkt_icv, computed_icv)) - -#------------------------------------------------------------------------------ -# The names of the integrity algorithms are the same than in scapy.contrib.ikev2 -# see http://www.iana.org/assignments/ikev2-parameters/ikev2-parameters.xhtml - -AUTH_ALGOS = { - 'NULL': AuthAlgo('NULL', mac=None, digestmod=None, icv_size=0), -} - -if HMAC: - if SHA: - AUTH_ALGOS['HMAC-SHA1-96'] = AuthAlgo('HMAC-SHA1-96', - mac=HMAC, - digestmod=SHA, - icv_size=12) - if SHA256: - AUTH_ALGOS['SHA2-256-128'] = AuthAlgo('SHA2-256-128', - mac=HMAC, - digestmod=SHA256, - icv_size=16) - if SHA384: - AUTH_ALGOS['SHA2-384-192'] = AuthAlgo('SHA2-384-192', - mac=HMAC, - digestmod=SHA384, - icv_size=24) - if SHA512: - AUTH_ALGOS['SHA2-512-256'] = AuthAlgo('SHA2-512-256', - mac=HMAC, - digestmod=SHA512, - icv_size=32) - if MD5: - AUTH_ALGOS['HMAC-MD5-96'] = AuthAlgo('HMAC-MD5-96', - mac=HMAC, - digestmod=MD5, - icv_size=12) -if AES and XCBCMAC: - AUTH_ALGOS['AES-XCBC-96'] = AuthAlgo('AES-XCBC-96', - mac=XCBCMAC, - digestmod=AES, - icv_size=12, - key_size=(16,)) - -#------------------------------------------------------------------------------ - - -#------------------------------------------------------------------------------ -def split_for_transport(orig_pkt, transport_proto): - """ - Split an IP(v6) packet in the correct location to insert an ESP or AH - header. - - @param orig_pkt: the packet to split. Must be an IP or IPv6 packet - @param transport_proto: the IPSec protocol number that will be inserted - at the split position. - @return: a tuple (header, nh, payload) where nh is the protocol number of - payload. - """ - header = orig_pkt.copy() - next_hdr = header.payload - nh = None - - if header.version == 4: - nh = header.proto - header.proto = transport_proto - header.remove_payload() - del header.chksum - del header.len - - return header, nh, next_hdr - else: - found_rt_hdr = False - prev = header - - # Since the RFC 4302 is vague about where the ESP/AH headers should be - # inserted in IPv6, I chose to follow the linux implementation. - while isinstance(next_hdr, (IPv6ExtHdrHopByHop, IPv6ExtHdrRouting, IPv6ExtHdrDestOpt)): - if isinstance(next_hdr, IPv6ExtHdrHopByHop): - pass - if isinstance(next_hdr, IPv6ExtHdrRouting): - found_rt_hdr = True - elif isinstance(next_hdr, IPv6ExtHdrDestOpt) and found_rt_hdr: - break - - prev = next_hdr - next_hdr = next_hdr.payload - - nh = prev.nh - prev.nh = transport_proto - prev.remove_payload() - del header.plen - - return header, nh, next_hdr - -#------------------------------------------------------------------------------ -# see RFC 4302 - Appendix A. Mutability of IP Options/Extension Headers -IMMUTABLE_IPV4_OPTIONS = ( - 0, # End Of List - 1, # No OPeration - 2, # Security - 5, # Extended Security - 6, # Commercial Security - 20, # Router Alert - 21, # Sender Directed Multi-Destination Delivery -) -def zero_mutable_fields(pkt, sending=False): - """ - When using AH, all "mutable" fields must be "zeroed" before calculating - the ICV. See RFC 4302, Section 3.3.3.1. Handling Mutable Fields. - - @param pkt: an IP(v6) packet containing an AH layer. - NOTE: The packet will be modified - @param sending: if true, ipv6 routing headers will not be reordered - """ - - if pkt.haslayer(AH): - pkt[AH].icv = chr(0) * len(pkt[AH].icv) - else: - raise TypeError('no AH layer found') - - if pkt.version == 4: - # the tos field has been replaced by DSCP and ECN - # Routers may rewrite the DS field as needed to provide a - # desired local or end-to-end service - pkt.tos = 0 - # an intermediate router might set the DF bit, even if the source - # did not select it. - pkt.flags = 0 - # changed en route as a normal course of processing by routers - pkt.ttl = 0 - # will change if any of these other fields change - pkt.chksum = 0 - - immutable_opts = [] - for opt in pkt.options: - if opt.option in IMMUTABLE_IPV4_OPTIONS: - immutable_opts.append(opt) - else: - immutable_opts.append(Raw(chr(0) * len(opt))) - pkt.options = immutable_opts - - else: - # holds DSCP and ECN - pkt.tc = 0 - # The flow label described in AHv1 was mutable, and in RFC 2460 [DH98] - # was potentially mutable. To retain compatibility with existing AH - # implementations, the flow label is not included in the ICV in AHv2. - pkt.fl = 0 - # same as ttl - pkt.hlim = 0 - - next_hdr = pkt.payload - - while isinstance(next_hdr, (IPv6ExtHdrHopByHop, IPv6ExtHdrRouting, IPv6ExtHdrDestOpt)): - if isinstance(next_hdr, (IPv6ExtHdrHopByHop, IPv6ExtHdrDestOpt)): - for opt in next_hdr.options: - if opt.otype & 0x20: - # option data can change en-route and must be zeroed - opt.optdata = chr(0) * opt.optlen - elif isinstance(next_hdr, IPv6ExtHdrRouting) and sending: - # The sender must order the field so that it appears as it - # will at the receiver, prior to performing the ICV computation. - next_hdr.segleft = 0 - if next_hdr.addresses: - final = next_hdr.addresses.pop() - next_hdr.addresses.insert(0, pkt.dst) - pkt.dst = final - else: - break - - next_hdr = next_hdr.payload - - return pkt - -#------------------------------------------------------------------------------ -class SecurityAssociation(object): - """ - This class is responsible of "encryption" and "decryption" of IPSec packets. - """ - - SUPPORTED_PROTOS = (IP, IPv6) - - def __init__(self, proto, spi, seq_num=1, crypt_algo=None, crypt_key=None, - auth_algo=None, auth_key=None, tunnel_header=None, nat_t_header=None): - """ - @param proto: the IPSec proto to use (ESP or AH) - @param spi: the Security Parameters Index of this SA - @param seq_num: the initial value for the sequence number on encrypted - packets - @param crypt_algo: the encryption algorithm name (only used with ESP) - @param crypt_key: the encryption key (only used with ESP) - @param auth_algo: the integrity algorithm name - @param auth_key: the integrity key - @param tunnel_header: an instance of a IP(v6) header that will be used - to encapsulate the encrypted packets. - @param nat_t_header: an instance of a UDP header that will be used - for NAT-Traversal. - """ - - if proto not in (ESP, AH, ESP.name, AH.name): - raise ValueError("proto must be either ESP or AH") - if isinstance(proto, basestring): - self.proto = eval(proto) - else: - self.proto = proto - - self.spi = spi - self.seq_num = seq_num - - if crypt_algo: - if crypt_algo not in CRYPT_ALGOS: - raise TypeError('unsupported encryption algo %r, try %r' % - (crypt_algo, CRYPT_ALGOS.keys())) - self.crypt_algo = CRYPT_ALGOS[crypt_algo] - self.crypt_algo.check_key(crypt_key) - self.crypt_key = crypt_key - else: - self.crypt_algo = CRYPT_ALGOS['NULL'] - self.crypt_key = None - - if auth_algo: - if auth_algo not in AUTH_ALGOS: - raise TypeError('unsupported integrity algo %r, try %r' % - (auth_algo, AUTH_ALGOS.keys())) - self.auth_algo = AUTH_ALGOS[auth_algo] - self.auth_algo.check_key(auth_key) - self.auth_key = auth_key - else: - self.auth_algo = AUTH_ALGOS['NULL'] - self.auth_key = None - - if tunnel_header and not isinstance(tunnel_header, (IP, IPv6)): - raise TypeError('tunnel_header must be %s or %s' % (IP.name, IPv6.name)) - self.tunnel_header = tunnel_header - - if nat_t_header: - if proto is not ESP: - raise TypeError('nat_t_header is only allowed with ESP') - if not isinstance(nat_t_header, UDP): - raise TypeError('nat_t_header must be %s' % UDP.name) - self.nat_t_header = nat_t_header - - def check_spi(self, pkt): - if pkt.spi != self.spi: - raise TypeError('packet spi=0x%x does not match the SA spi=0x%x' % - (pkt.spi, self.spi)) - - def _encrypt_esp(self, pkt, seq_num=None, iv=None): - - if iv is None: - iv = self.crypt_algo.generate_iv() - else: - if len(iv) != self.crypt_algo.iv_size: - raise TypeError('iv length must be %s' % self.crypt_algo.iv_size) - - esp = _ESPPlain(spi=self.spi, seq=seq_num or self.seq_num, iv=iv) - - if self.tunnel_header: - tunnel = self.tunnel_header.copy() - - if tunnel.version == 4: - del tunnel.proto - del tunnel.len - del tunnel.chksum - else: - del tunnel.nh - del tunnel.plen - - pkt = tunnel.__class__(str(tunnel / pkt)) - - ip_header, nh, payload = split_for_transport(pkt, socket.IPPROTO_ESP) - esp.data = payload - esp.nh = nh - - esp = self.crypt_algo.pad(esp) - esp = self.crypt_algo.encrypt(esp, self.crypt_key) - - self.auth_algo.sign(esp, self.auth_key) - - if self.nat_t_header: - nat_t_header = self.nat_t_header.copy() - nat_t_header.chksum = 0 - del nat_t_header.len - if ip_header.version == 4: - del ip_header.proto - else: - del ip_header.nh - ip_header /= nat_t_header - - if ip_header.version == 4: - ip_header.len = len(ip_header) + len(esp) - del ip_header.chksum - ip_header = ip_header.__class__(str(ip_header)) - else: - ip_header.plen = len(ip_header.payload) + len(esp) - - # sequence number must always change, unless specified by the user - if seq_num is None: - self.seq_num += 1 - - return ip_header / esp - - def _encrypt_ah(self, pkt, seq_num=None): - - ah = AH(spi=self.spi, seq=seq_num or self.seq_num, - icv=chr(0) * self.auth_algo.icv_size) - - if self.tunnel_header: - tunnel = self.tunnel_header.copy() - - if tunnel.version == 4: - del tunnel.proto - del tunnel.len - del tunnel.chksum - else: - del tunnel.nh - del tunnel.plen - - pkt = tunnel.__class__(str(tunnel / pkt)) - - ip_header, nh, payload = split_for_transport(pkt, socket.IPPROTO_AH) - ah.nh = nh - - if ip_header.version == 6 and len(ah) % 8 != 0: - # For IPv6, the total length of the header must be a multiple of - # 8-octet units. - ah.padding = chr(0) * (-len(ah) % 8) - elif len(ah) % 4 != 0: - # For IPv4, the total length of the header must be a multiple of - # 4-octet units. - ah.padding = chr(0) * (-len(ah) % 4) - - # RFC 4302 - Section 2.2. Payload Length - # This 8-bit field specifies the length of AH in 32-bit words (4-byte - # units), minus "2". - ah.payloadlen = len(ah) / 4 - 2 - - if ip_header.version == 4: - ip_header.len = len(ip_header) + len(ah) + len(payload) - del ip_header.chksum - ip_header = ip_header.__class__(str(ip_header)) - else: - ip_header.plen = len(ip_header.payload) + len(ah) + len(payload) - - signed_pkt = self.auth_algo.sign(ip_header / ah / payload, self.auth_key) - - # sequence number must always change, unless specified by the user - if seq_num is None: - self.seq_num += 1 - - return signed_pkt - - def encrypt(self, pkt, seq_num=None, iv=None): - """ - Encrypt (and encapsulate) an IP(v6) packet with ESP or AH according - to this SecurityAssociation. - - @param pkt: the packet to encrypt - @param seq_num: if specified, use this sequence number instead of the - generated one - @param iv: if specified, use this initialization vector for - encryption instead of a random one. - - @return: the encrypted/encapsulated packet - """ - if not isinstance(pkt, self.SUPPORTED_PROTOS): - raise TypeError('cannot encrypt %s, supported protos are %s' - % (pkt.__class__, self.SUPPORTED_PROTOS)) - if self.proto is ESP: - return self._encrypt_esp(pkt, seq_num=seq_num, iv=iv) - else: - return self._encrypt_ah(pkt, seq_num=seq_num) - - def _decrypt_esp(self, pkt, verify=True): - - encrypted = pkt[ESP] - - if verify: - self.check_spi(pkt) - self.auth_algo.verify(encrypted, self.auth_key) - - esp = self.crypt_algo.decrypt(encrypted, self.crypt_key, - self.auth_algo.icv_size) - - if self.tunnel_header: - # drop the tunnel header and return the payload untouched - - pkt.remove_payload() - if pkt.version == 4: - pkt.proto = esp.nh - else: - pkt.nh = esp.nh - cls = pkt.guess_payload_class(esp.data) - - return cls(esp.data) - else: - ip_header = pkt - - if ip_header.version == 4: - ip_header.proto = esp.nh - del ip_header.chksum - ip_header.remove_payload() - ip_header.len = len(ip_header) + len(esp.data) - # recompute checksum - ip_header = ip_header.__class__(str(ip_header)) - else: - encrypted.underlayer.nh = esp.nh - encrypted.underlayer.remove_payload() - ip_header.plen = len(ip_header.payload) + len(esp.data) - - cls = ip_header.guess_payload_class(esp.data) - - # reassemble the ip_header with the ESP payload - return ip_header / cls(esp.data) - - def _decrypt_ah(self, pkt, verify=True): - - if verify: - self.check_spi(pkt) - self.auth_algo.verify(pkt, self.auth_key) - - ah = pkt[AH] - payload = ah.payload - payload.remove_underlayer(None) # useless argument... - - if self.tunnel_header: - return payload - else: - ip_header = pkt - - if ip_header.version == 4: - ip_header.proto = ah.nh - del ip_header.chksum - ip_header.remove_payload() - ip_header.len = len(ip_header) + len(payload) - # recompute checksum - ip_header = ip_header.__class__(str(ip_header)) - else: - ah.underlayer.nh = ah.nh - ah.underlayer.remove_payload() - ip_header.plen = len(ip_header.payload) + len(payload) - - # reassemble the ip_header with the AH payload - return ip_header / payload - - def decrypt(self, pkt, verify=True): - """ - Decrypt (and decapsulate) an IP(v6) packet containing ESP or AH. - - @param pkt: the packet to decrypt - @param verify: if False, do not perform the integrity check - - @return: the decrypted/decapsulated packet - @raise IPSecIntegrityError: if the integrity check fails - """ - if not isinstance(pkt, self.SUPPORTED_PROTOS): - raise TypeError('cannot decrypt %s, supported protos are %s' - % (pkt.__class__, self.SUPPORTED_PROTOS)) - - if self.proto is ESP and pkt.haslayer(ESP): - return self._decrypt_esp(pkt, verify=verify) - elif self.proto is AH and pkt.haslayer(AH): - return self._decrypt_ah(pkt, verify=verify) - else: - raise TypeError('%s has no %s layer' % (pkt, self.proto.name)) diff --git a/scripts/external_libs/scapy-2.3.1/scapy/layers/ir.py b/scripts/external_libs/scapy-2.3.1/scapy/layers/ir.py deleted file mode 100644 index fc738c55..00000000 --- a/scripts/external_libs/scapy-2.3.1/scapy/layers/ir.py +++ /dev/null @@ -1,44 +0,0 @@ -## This file is part of Scapy -## See http://www.secdev.org/projects/scapy for more informations -## Copyright (C) Philippe Biondi <phil@secdev.org> -## This program is published under a GPLv2 license - -""" -IrDA infrared data communication. -""" - -from scapy.packet import * -from scapy.fields import * -from scapy.layers.l2 import CookedLinux - - - -# IR - -class IrLAPHead(Packet): - name = "IrDA Link Access Protocol Header" - fields_desc = [ XBitField("Address", 0x7f, 7), - BitEnumField("Type", 1, 1, {"Response":0, - "Command":1})] - -class IrLAPCommand(Packet): - name = "IrDA Link Access Protocol Command" - fields_desc = [ XByteField("Control", 0), - XByteField("Format identifier", 0), - XIntField("Source address", 0), - XIntField("Destination address", 0xffffffffL), - XByteField("Discovery flags", 0x1), - ByteEnumField("Slot number", 255, {"final":255}), - XByteField("Version", 0)] - - -class IrLMP(Packet): - name = "IrDA Link Management Protocol" - fields_desc = [ XShortField("Service hints", 0), - XByteField("Character set", 0), - StrField("Device name", "") ] - - -bind_layers( CookedLinux, IrLAPHead, proto=23) -bind_layers( IrLAPHead, IrLAPCommand, Type=1) -bind_layers( IrLAPCommand, IrLMP, ) diff --git a/scripts/external_libs/scapy-2.3.1/scapy/layers/isakmp.py b/scripts/external_libs/scapy-2.3.1/scapy/layers/isakmp.py deleted file mode 100644 index 9c54bed4..00000000 --- a/scripts/external_libs/scapy-2.3.1/scapy/layers/isakmp.py +++ /dev/null @@ -1,348 +0,0 @@ -## This file is part of Scapy -## See http://www.secdev.org/projects/scapy for more informations -## Copyright (C) Philippe Biondi <phil@secdev.org> -## This program is published under a GPLv2 license - -""" -ISAKMP (Internet Security Association and Key Management Protocol). -""" - -import struct -from scapy.packet import * -from scapy.fields import * -from scapy.ansmachine import * -from scapy.layers.inet import IP,UDP -from scapy.sendrecv import sr - - -# see http://www.iana.org/assignments/ipsec-registry for details -ISAKMPAttributeTypes= { "Encryption": (1, { "DES-CBC" : 1, - "IDEA-CBC" : 2, - "Blowfish-CBC" : 3, - "RC5-R16-B64-CBC" : 4, - "3DES-CBC" : 5, - "CAST-CBC" : 6, - "AES-CBC" : 7, - "CAMELLIA-CBC" : 8, }, 0), - "Hash": (2, { "MD5": 1, - "SHA": 2, - "Tiger": 3, - "SHA2-256": 4, - "SHA2-384": 5, - "SHA2-512": 6,}, 0), - "Authentication":(3, { "PSK": 1, - "DSS": 2, - "RSA Sig": 3, - "RSA Encryption": 4, - "RSA Encryption Revised": 5, - "ElGamal Encryption": 6, - "ElGamal Encryption Revised": 7, - "ECDSA Sig": 8, - "HybridInitRSA": 64221, - "HybridRespRSA": 64222, - "HybridInitDSS": 64223, - "HybridRespDSS": 64224, - "XAUTHInitPreShared": 65001, - "XAUTHRespPreShared": 65002, - "XAUTHInitDSS": 65003, - "XAUTHRespDSS": 65004, - "XAUTHInitRSA": 65005, - "XAUTHRespRSA": 65006, - "XAUTHInitRSAEncryption": 65007, - "XAUTHRespRSAEncryption": 65008, - "XAUTHInitRSARevisedEncryption": 65009, - "XAUTHRespRSARevisedEncryptio": 65010, }, 0), - "GroupDesc": (4, { "768MODPgr" : 1, - "1024MODPgr" : 2, - "EC2Ngr155" : 3, - "EC2Ngr185" : 4, - "1536MODPgr" : 5, - "2048MODPgr" : 14, - "3072MODPgr" : 15, - "4096MODPgr" : 16, - "6144MODPgr" : 17, - "8192MODPgr" : 18, }, 0), - "GroupType": (5, {"MODP": 1, - "ECP": 2, - "EC2N": 3}, 0), - "GroupPrime": (6, {}, 1), - "GroupGenerator1":(7, {}, 1), - "GroupGenerator2":(8, {}, 1), - "GroupCurveA": (9, {}, 1), - "GroupCurveB": (10, {}, 1), - "LifeType": (11, {"Seconds": 1, - "Kilobytes": 2, }, 0), - "LifeDuration": (12, {}, 1), - "PRF": (13, {}, 0), - "KeyLength": (14, {}, 0), - "FieldSize": (15, {}, 0), - "GroupOrder": (16, {}, 1), - } - -# the name 'ISAKMPTransformTypes' is actually a misnomer (since the table -# holds info for all ISAKMP Attribute types, not just transforms, but we'll -# keep it for backwards compatibility... for now at least -ISAKMPTransformTypes = ISAKMPAttributeTypes - -ISAKMPTransformNum = {} -for n in ISAKMPTransformTypes: - val = ISAKMPTransformTypes[n] - tmp = {} - for e in val[1]: - tmp[val[1][e]] = e - ISAKMPTransformNum[val[0]] = (n,tmp, val[2]) -del(n) -del(e) -del(tmp) -del(val) - - -class ISAKMPTransformSetField(StrLenField): - islist=1 - def type2num(self, (typ,val)): - type_val,enc_dict,tlv = ISAKMPTransformTypes.get(typ, (typ,{},0)) - val = enc_dict.get(val, val) - s = "" - if (val & ~0xffff): - if not tlv: - warning("%r should not be TLV but is too big => using TLV encoding" % typ) - n = 0 - while val: - s = chr(val&0xff)+s - val >>= 8 - n += 1 - val = n - else: - type_val |= 0x8000 - return struct.pack("!HH",type_val, val)+s - def num2type(self, typ, enc): - val = ISAKMPTransformNum.get(typ,(typ,{})) - enc = val[1].get(enc,enc) - return (val[0],enc) - def i2m(self, pkt, i): - if i is None: - return "" - i = map(self.type2num, i) - return "".join(i) - def m2i(self, pkt, m): - # I try to ensure that we don't read off the end of our packet based - # on bad length fields we're provided in the packet. There are still - # conditions where struct.unpack() may not get enough packet data, but - # worst case that should result in broken attributes (which would - # be expected). (wam) - lst = [] - while len(m) >= 4: - trans_type, = struct.unpack("!H", m[:2]) - is_tlv = not (trans_type & 0x8000) - if is_tlv: - # We should probably check to make sure the attribute type we - # are looking at is allowed to have a TLV format and issue a - # warning if we're given an TLV on a basic attribute. - value_len, = struct.unpack("!H", m[2:4]) - if value_len+4 > len(m): - warning("Bad length for ISAKMP tranform type=%#6x" % trans_type) - value = m[4:4+value_len] - value = reduce(lambda x,y: (x<<8L)|y, struct.unpack("!%s" % ("B"*len(value),), value),0) - else: - trans_type &= 0x7fff - value_len=0 - value, = struct.unpack("!H", m[2:4]) - m=m[4+value_len:] - lst.append(self.num2type(trans_type, value)) - if len(m) > 0: - warning("Extra bytes after ISAKMP transform dissection [%r]" % m) - return lst - - -ISAKMP_payload_type = ["None","SA","Proposal","Transform","KE","ID","CERT","CR","Hash", - "SIG","Nonce","Notification","Delete","VendorID"] - -ISAKMP_exchange_type = ["None","base","identity prot.", - "auth only", "aggressive", "info"] - - -class ISAKMP_class(Packet): - def guess_payload_class(self, payload): - np = self.next_payload - if np == 0: - return conf.raw_layer - elif np < len(ISAKMP_payload_type): - pt = ISAKMP_payload_type[np] - return globals().get("ISAKMP_payload_%s" % pt, ISAKMP_payload) - else: - return ISAKMP_payload - - -class ISAKMP(ISAKMP_class): # rfc2408 - name = "ISAKMP" - fields_desc = [ - StrFixedLenField("init_cookie","",8), - StrFixedLenField("resp_cookie","",8), - ByteEnumField("next_payload",0,ISAKMP_payload_type), - XByteField("version",0x10), - ByteEnumField("exch_type",0,ISAKMP_exchange_type), - FlagsField("flags",0, 8, ["encryption","commit","auth_only","res3","res4","res5","res6","res7"]), # XXX use a Flag field - IntField("id",0), - IntField("length",None) - ] - - def guess_payload_class(self, payload): - if self.flags & 1: - return conf.raw_layer - return ISAKMP_class.guess_payload_class(self, payload) - - def answers(self, other): - if isinstance(other, ISAKMP): - if other.init_cookie == self.init_cookie: - return 1 - return 0 - def post_build(self, p, pay): - p += pay - if self.length is None: - p = p[:24]+struct.pack("!I",len(p))+p[28:] - return p - - - - -class ISAKMP_payload_Transform(ISAKMP_class): - name = "IKE Transform" - fields_desc = [ - ByteEnumField("next_payload",None,ISAKMP_payload_type), - ByteField("res",0), -# ShortField("len",None), - ShortField("length",None), - ByteField("num",None), - ByteEnumField("id",1,{1:"KEY_IKE"}), - ShortField("res2",0), - ISAKMPTransformSetField("transforms",None,length_from=lambda x:x.length-8) -# XIntField("enc",0x80010005L), -# XIntField("hash",0x80020002L), -# XIntField("auth",0x80030001L), -# XIntField("group",0x80040002L), -# XIntField("life_type",0x800b0001L), -# XIntField("durationh",0x000c0004L), -# XIntField("durationl",0x00007080L), - ] - def post_build(self, p, pay): - if self.length is None: - l = len(p) - p = p[:2]+chr((l>>8)&0xff)+chr(l&0xff)+p[4:] - p += pay - return p - - - - -class ISAKMP_payload_Proposal(ISAKMP_class): - name = "IKE proposal" -# ISAKMP_payload_type = 0 - fields_desc = [ - ByteEnumField("next_payload",None,ISAKMP_payload_type), - ByteField("res",0), - FieldLenField("length",None,"trans","H", adjust=lambda pkt,x:x+8), - ByteField("proposal",1), - ByteEnumField("proto",1,{1:"ISAKMP"}), - FieldLenField("SPIsize",None,"SPI","B"), - ByteField("trans_nb",None), - StrLenField("SPI","",length_from=lambda x:x.SPIsize), - PacketLenField("trans",conf.raw_layer(),ISAKMP_payload_Transform,length_from=lambda x:x.length-8), - ] - - -class ISAKMP_payload(ISAKMP_class): - name = "ISAKMP payload" - fields_desc = [ - ByteEnumField("next_payload",None,ISAKMP_payload_type), - ByteField("res",0), - FieldLenField("length",None,"load","H", adjust=lambda pkt,x:x+4), - StrLenField("load","",length_from=lambda x:x.length-4), - ] - - -class ISAKMP_payload_VendorID(ISAKMP_class): - name = "ISAKMP Vendor ID" - overload_fields = { ISAKMP: { "next_payload":13 }} - fields_desc = [ - ByteEnumField("next_payload",None,ISAKMP_payload_type), - ByteField("res",0), - FieldLenField("length",None,"vendorID","H", adjust=lambda pkt,x:x+4), - StrLenField("vendorID","",length_from=lambda x:x.length-4), - ] - -class ISAKMP_payload_SA(ISAKMP_class): - name = "ISAKMP SA" - overload_fields = { ISAKMP: { "next_payload":1 }} - fields_desc = [ - ByteEnumField("next_payload",None,ISAKMP_payload_type), - ByteField("res",0), - FieldLenField("length",None,"prop","H", adjust=lambda pkt,x:x+12), - IntEnumField("DOI",1,{1:"IPSEC"}), - IntEnumField("situation",1,{1:"identity"}), - PacketLenField("prop",conf.raw_layer(),ISAKMP_payload_Proposal,length_from=lambda x:x.length-12), - ] - -class ISAKMP_payload_Nonce(ISAKMP_class): - name = "ISAKMP Nonce" - overload_fields = { ISAKMP: { "next_payload":10 }} - fields_desc = [ - ByteEnumField("next_payload",None,ISAKMP_payload_type), - ByteField("res",0), - FieldLenField("length",None,"load","H", adjust=lambda pkt,x:x+4), - StrLenField("load","",length_from=lambda x:x.length-4), - ] - -class ISAKMP_payload_KE(ISAKMP_class): - name = "ISAKMP Key Exchange" - overload_fields = { ISAKMP: { "next_payload":4 }} - fields_desc = [ - ByteEnumField("next_payload",None,ISAKMP_payload_type), - ByteField("res",0), - FieldLenField("length",None,"load","H", adjust=lambda pkt,x:x+4), - StrLenField("load","",length_from=lambda x:x.length-4), - ] - -class ISAKMP_payload_ID(ISAKMP_class): - name = "ISAKMP Identification" - overload_fields = { ISAKMP: { "next_payload":5 }} - fields_desc = [ - ByteEnumField("next_payload",None,ISAKMP_payload_type), - ByteField("res",0), - FieldLenField("length",None,"load","H",adjust=lambda pkt,x:x+8), - ByteEnumField("IDtype",1,{1:"IPv4_addr", 11:"Key"}), - ByteEnumField("ProtoID",0,{0:"Unused"}), - ShortEnumField("Port",0,{0:"Unused"}), -# IPField("IdentData","127.0.0.1"), - StrLenField("load","",length_from=lambda x:x.length-8), - ] - - - -class ISAKMP_payload_Hash(ISAKMP_class): - name = "ISAKMP Hash" - overload_fields = { ISAKMP: { "next_payload":8 }} - fields_desc = [ - ByteEnumField("next_payload",None,ISAKMP_payload_type), - ByteField("res",0), - FieldLenField("length",None,"load","H",adjust=lambda pkt,x:x+4), - StrLenField("load","",length_from=lambda x:x.length-4), - ] - - - -ISAKMP_payload_type_overload = {} -for i in range(len(ISAKMP_payload_type)): - name = "ISAKMP_payload_%s" % ISAKMP_payload_type[i] - if name in globals(): - ISAKMP_payload_type_overload[globals()[name]] = {"next_payload":i} - -del(i) -del(name) -ISAKMP_class.overload_fields = ISAKMP_payload_type_overload.copy() - - -bind_layers( UDP, ISAKMP, dport=500, sport=500) -def ikescan(ip): - return sr(IP(dst=ip)/UDP()/ISAKMP(init_cookie=RandString(8), - exch_type=2)/ISAKMP_payload_SA(prop=ISAKMP_payload_Proposal())) - diff --git a/scripts/external_libs/scapy-2.3.1/scapy/layers/l2.py b/scripts/external_libs/scapy-2.3.1/scapy/layers/l2.py deleted file mode 100644 index 3f80ed7d..00000000 --- a/scripts/external_libs/scapy-2.3.1/scapy/layers/l2.py +++ /dev/null @@ -1,542 +0,0 @@ -## This file is part of Scapy -## See http://www.secdev.org/projects/scapy for more informations -## Copyright (C) Philippe Biondi <phil@secdev.org> -## This program is published under a GPLv2 license - -""" -Classes and functions for layer 2 protocols. -""" - -import os,struct,time -from scapy.base_classes import Net -from scapy.config import conf -from scapy.packet import * -from scapy.ansmachine import * -from scapy.plist import SndRcvList -from scapy.fields import * -from scapy.sendrecv import srp,srp1 -from scapy.arch import get_if_hwaddr - - - - -################# -## Tools ## -################# - - -class Neighbor: - def __init__(self): - self.resolvers = {} - - def register_l3(self, l2, l3, resolve_method): - self.resolvers[l2,l3]=resolve_method - - def resolve(self, l2inst, l3inst): - k = l2inst.__class__,l3inst.__class__ - if k in self.resolvers: - return self.resolvers[k](l2inst,l3inst) - - def __repr__(self): - return "\n".join("%-15s -> %-15s" % (l2.__name__, l3.__name__) for l2,l3 in self.resolvers) - -conf.neighbor = Neighbor() - -conf.netcache.new_cache("arp_cache", 120) # cache entries expire after 120s - - -@conf.commands.register -def getmacbyip(ip, chainCC=0): - """Return MAC address corresponding to a given IP address""" - if isinstance(ip,Net): - ip = iter(ip).next() - ip = inet_ntoa(inet_aton(ip)) - tmp = map(ord, inet_aton(ip)) - if (tmp[0] & 0xf0) == 0xe0: # mcast @ - return "01:00:5e:%.2x:%.2x:%.2x" % (tmp[1]&0x7f,tmp[2],tmp[3]) - iff,a,gw = conf.route.route(ip) - if ( (iff == "lo") or (ip == conf.route.get_if_bcast(iff)) ): - return "ff:ff:ff:ff:ff:ff" - if gw != "0.0.0.0": - ip = gw - - mac = conf.netcache.arp_cache.get(ip) - if mac: - return mac - - res = srp1(Ether(dst=ETHER_BROADCAST)/ARP(op="who-has", pdst=ip), - type=ETH_P_ARP, - iface = iff, - timeout=2, - verbose=0, - chainCC=chainCC, - nofilter=1) - if res is not None: - mac = res.payload.hwsrc - conf.netcache.arp_cache[ip] = mac - return mac - return None - - - -### Fields - -class DestMACField(MACField): - def __init__(self, name): - MACField.__init__(self, name, None) - def i2h(self, pkt, x): - if x is None: - x = conf.neighbor.resolve(pkt,pkt.payload) - if x is None: - x = "ff:ff:ff:ff:ff:ff" - warning("Mac address to reach destination not found. Using broadcast.") - return MACField.i2h(self, pkt, x) - def i2m(self, pkt, x): - return MACField.i2m(self, pkt, self.i2h(pkt, x)) - -class SourceMACField(MACField): - def __init__(self, name): - MACField.__init__(self, name, None) - def i2h(self, pkt, x): - if x is None: - iff,a,gw = pkt.payload.route() - if iff: - try: - x = get_if_hwaddr(iff) - except: - pass - if x is None: - x = "00:00:00:00:00:00" - return MACField.i2h(self, pkt, x) - def i2m(self, pkt, x): - return MACField.i2m(self, pkt, self.i2h(pkt, x)) - -class ARPSourceMACField(MACField): - def __init__(self, name): - MACField.__init__(self, name, None) - def i2h(self, pkt, x): - if x is None: - iff,a,gw = pkt.route() - if iff: - try: - x = get_if_hwaddr(iff) - except: - pass - if x is None: - x = "00:00:00:00:00:00" - return MACField.i2h(self, pkt, x) - def i2m(self, pkt, x): - return MACField.i2m(self, pkt, self.i2h(pkt, x)) - - - -### Layers - - -class Ether(Packet): - name = "Ethernet" - fields_desc = [ MACField("dst","00:00:00:01:00:00"), - MACField("src","00:00:00:02:00:00"), - XShortEnumField("type", 0x9000, ETHER_TYPES) ] - def hashret(self): - return struct.pack("H",self.type)+self.payload.hashret() - def answers(self, other): - if isinstance(other,Ether): - if self.type == other.type: - return self.payload.answers(other.payload) - return 0 - def mysummary(self): - return self.sprintf("%src% > %dst% (%type%)") - @classmethod - def dispatch_hook(cls, _pkt=None, *args, **kargs): - if _pkt and len(_pkt) >= 14: - if struct.unpack("!H", _pkt[12:14])[0] <= 1500: - return Dot3 - return cls - - -class Dot3(Packet): - name = "802.3" - fields_desc = [ DestMACField("dst"), - MACField("src", ETHER_ANY), - LenField("len", None, "H") ] - def extract_padding(self,s): - l = self.len - return s[:l],s[l:] - def answers(self, other): - if isinstance(other,Dot3): - return self.payload.answers(other.payload) - return 0 - def mysummary(self): - return "802.3 %s > %s" % (self.src, self.dst) - @classmethod - def dispatch_hook(cls, _pkt=None, *args, **kargs): - if _pkt and len(_pkt) >= 14: - if struct.unpack("!H", _pkt[12:14])[0] > 1500: - return Ether - return cls - - -class LLC(Packet): - name = "LLC" - fields_desc = [ XByteField("dsap", 0x00), - XByteField("ssap", 0x00), - ByteField("ctrl", 0) ] - -conf.neighbor.register_l3(Ether, LLC, lambda l2,l3: conf.neighbor.resolve(l2,l3.payload)) -conf.neighbor.register_l3(Dot3, LLC, lambda l2,l3: conf.neighbor.resolve(l2,l3.payload)) - - -class CookedLinux(Packet): - name = "cooked linux" - fields_desc = [ ShortEnumField("pkttype",0, {0: "unicast", - 4:"sent-by-us"}), #XXX incomplete - XShortField("lladdrtype",512), - ShortField("lladdrlen",0), - StrFixedLenField("src","",8), - XShortEnumField("proto",0x800,ETHER_TYPES) ] - - - -class SNAP(Packet): - name = "SNAP" - fields_desc = [ X3BytesField("OUI",0x000000), - XShortEnumField("code", 0x000, ETHER_TYPES) ] - -conf.neighbor.register_l3(Dot3, SNAP, lambda l2,l3: conf.neighbor.resolve(l2,l3.payload)) - - -class Dot1Q(Packet): - name = "802.1Q" - aliastypes = [ Ether ] - fields_desc = [ BitField("prio", 0, 3), - BitField("id", 0, 1), - BitField("vlan", 1, 12), - XShortEnumField("type", 0x0000, ETHER_TYPES) ] - def answers(self, other): - if isinstance(other,Dot1Q): - if ( (self.type == other.type) and - (self.vlan == other.vlan) ): - return self.payload.answers(other.payload) - else: - return self.payload.answers(other) - return 0 - def default_payload_class(self, pay): - if self.type <= 1500: - return LLC - return conf.raw_layer - def extract_padding(self,s): - if self.type <= 1500: - return s[:self.type],s[self.type:] - return s,None - def mysummary(self): - if isinstance(self.underlayer, Ether): - return self.underlayer.sprintf("802.1q %Ether.src% > %Ether.dst% (%Dot1Q.type%) vlan %Dot1Q.vlan%") - else: - return self.sprintf("802.1q (%Dot1Q.type%) vlan %Dot1Q.vlan%") - - -conf.neighbor.register_l3(Ether, Dot1Q, lambda l2,l3: conf.neighbor.resolve(l2,l3.payload)) - -class STP(Packet): - name = "Spanning Tree Protocol" - fields_desc = [ ShortField("proto", 0), - ByteField("version", 0), - ByteField("bpdutype", 0), - ByteField("bpduflags", 0), - ShortField("rootid", 0), - MACField("rootmac", ETHER_ANY), - IntField("pathcost", 0), - ShortField("bridgeid", 0), - MACField("bridgemac", ETHER_ANY), - ShortField("portid", 0), - BCDFloatField("age", 1), - BCDFloatField("maxage", 20), - BCDFloatField("hellotime", 2), - BCDFloatField("fwddelay", 15) ] - - -class EAPOL(Packet): - name = "EAPOL" - fields_desc = [ ByteField("version", 1), - ByteEnumField("type", 0, ["EAP_PACKET", "START", "LOGOFF", "KEY", "ASF"]), - LenField("len", None, "H") ] - - EAP_PACKET= 0 - START = 1 - LOGOFF = 2 - KEY = 3 - ASF = 4 - def extract_padding(self, s): - l = self.len - return s[:l],s[l:] - def hashret(self): - return chr(self.type)+self.payload.hashret() - def answers(self, other): - if isinstance(other,EAPOL): - if ( (self.type == self.EAP_PACKET) and - (other.type == self.EAP_PACKET) ): - return self.payload.answers(other.payload) - return 0 - def mysummary(self): - return self.sprintf("EAPOL %EAPOL.type%") - - -class EAP(Packet): - name = "EAP" - fields_desc = [ ByteEnumField("code", 4, {1:"REQUEST",2:"RESPONSE",3:"SUCCESS",4:"FAILURE"}), - ByteField("id", 0), - ShortField("len",None), - ConditionalField(ByteEnumField("type",0, {1:"ID",4:"MD5"}), lambda pkt:pkt.code not in [EAP.SUCCESS, EAP.FAILURE]) - - ] - - REQUEST = 1 - RESPONSE = 2 - SUCCESS = 3 - FAILURE = 4 - TYPE_ID = 1 - TYPE_MD5 = 4 - def answers(self, other): - if isinstance(other,EAP): - if self.code == self.REQUEST: - return 0 - elif self.code == self.RESPONSE: - if ( (other.code == self.REQUEST) and - (other.type == self.type) ): - return 1 - elif other.code == self.RESPONSE: - return 1 - return 0 - - def post_build(self, p, pay): - if self.len is None: - l = len(p)+len(pay) - p = p[:2]+chr((l>>8)&0xff)+chr(l&0xff)+p[4:] - return p+pay - - -class ARP(Packet): - name = "ARP" - fields_desc = [ XShortField("hwtype", 0x0001), - XShortEnumField("ptype", 0x0800, ETHER_TYPES), - ByteField("hwlen", 6), - ByteField("plen", 4), - ShortEnumField("op", 1, {"who-has":1, "is-at":2, "RARP-req":3, "RARP-rep":4, "Dyn-RARP-req":5, "Dyn-RAR-rep":6, "Dyn-RARP-err":7, "InARP-req":8, "InARP-rep":9}), - ARPSourceMACField("hwsrc"), - SourceIPField("psrc","pdst"), - MACField("hwdst", ETHER_ANY), - IPField("pdst", "0.0.0.0") ] - who_has = 1 - is_at = 2 - def answers(self, other): - if isinstance(other,ARP): - if ( (self.op == self.is_at) and - (other.op == self.who_has) and - (self.psrc == other.pdst) ): - return 1 - return 0 - def route(self): - dst = self.pdst - if isinstance(dst,Gen): - dst = iter(dst).next() - return conf.route.route(dst) - def extract_padding(self, s): - return "",s - def mysummary(self): - if self.op == self.is_at: - return self.sprintf("ARP is at %hwsrc% says %psrc%") - elif self.op == self.who_has: - return self.sprintf("ARP who has %pdst% says %psrc%") - else: - return self.sprintf("ARP %op% %psrc% > %pdst%") - -conf.neighbor.register_l3(Ether, ARP, lambda l2,l3: getmacbyip(l3.pdst)) - -class GRErouting(Packet): - name = "GRE routing informations" - fields_desc = [ ShortField("address_family",0), - ByteField("SRE_offset", 0), - FieldLenField("SRE_len", None, "routing_info", "B"), - StrLenField("routing_info", "", "SRE_len"), - ] - - -class GRE(Packet): - name = "GRE" - fields_desc = [ BitField("chksum_present",0,1), - BitField("routing_present",0,1), - BitField("key_present",0,1), - BitField("seqnum_present",0,1), - BitField("strict_route_source",0,1), - BitField("recursion_control",0,3), - BitField("flags",0,5), - BitField("version",0,3), - XShortEnumField("proto", 0x0000, ETHER_TYPES), - ConditionalField(XShortField("chksum",None), lambda pkt:pkt.chksum_present==1 or pkt.routing_present==1), - ConditionalField(XShortField("offset",None), lambda pkt:pkt.chksum_present==1 or pkt.routing_present==1), - ConditionalField(XIntField("key",None), lambda pkt:pkt.key_present==1), - ConditionalField(XIntField("seqence_number",None), lambda pkt:pkt.seqnum_present==1), - ] - def post_build(self, p, pay): - p += pay - if self.chksum_present and self.chksum is None: - c = checksum(p) - p = p[:4]+chr((c>>8)&0xff)+chr(c&0xff)+p[6:] - return p - - - - -bind_layers( Dot3, LLC, ) -bind_layers( Ether, LLC, type=122) -bind_layers( Ether, Dot1Q, type=33024) -bind_layers( Ether, Ether, type=1) -bind_layers( Ether, ARP, type=2054) -bind_layers( Ether, EAPOL, type=34958) -bind_layers( Ether, EAPOL, dst='01:80:c2:00:00:03', type=34958) -bind_layers( CookedLinux, LLC, proto=122) -bind_layers( CookedLinux, Dot1Q, proto=33024) -bind_layers( CookedLinux, Ether, proto=1) -bind_layers( CookedLinux, ARP, proto=2054) -bind_layers( CookedLinux, EAPOL, proto=34958) -bind_layers( GRE, LLC, proto=122) -bind_layers( GRE, Dot1Q, proto=33024) -bind_layers( GRE, Ether, proto=1) -bind_layers( GRE, ARP, proto=2054) -bind_layers( GRE, EAPOL, proto=34958) -bind_layers( GRE, GRErouting, { "routing_present" : 1 } ) -bind_layers( GRErouting, conf.raw_layer,{ "address_family" : 0, "SRE_len" : 0 }) -bind_layers( GRErouting, GRErouting, { } ) -bind_layers( EAPOL, EAP, type=0) -bind_layers( LLC, STP, dsap=66, ssap=66, ctrl=3) -bind_layers( LLC, SNAP, dsap=170, ssap=170, ctrl=3) -bind_layers( SNAP, Dot1Q, code=33024) -bind_layers( SNAP, Ether, code=1) -bind_layers( SNAP, ARP, code=2054) -bind_layers( SNAP, EAPOL, code=34958) -bind_layers( SNAP, STP, code=267) - -conf.l2types.register(ARPHDR_ETHER, Ether) -conf.l2types.register_num2layer(ARPHDR_METRICOM, Ether) -conf.l2types.register_num2layer(ARPHDR_LOOPBACK, Ether) -conf.l2types.register_layer2num(ARPHDR_ETHER, Dot3) -conf.l2types.register(144, CookedLinux) # called LINUX_IRDA, similar to CookedLinux -conf.l2types.register(113, CookedLinux) - -conf.l3types.register(ETH_P_ARP, ARP) - - - - -### Technics - - - -@conf.commands.register -def arpcachepoison(target, victim, interval=60): - """Poison target's cache with (your MAC,victim's IP) couple -arpcachepoison(target, victim, [interval=60]) -> None -""" - tmac = getmacbyip(target) - p = Ether(dst=tmac)/ARP(op="who-has", psrc=victim, pdst=target) - try: - while 1: - sendp(p, iface_hint=target) - if conf.verb > 1: - os.write(1,".") - time.sleep(interval) - except KeyboardInterrupt: - pass - - -class ARPingResult(SndRcvList): - def __init__(self, res=None, name="ARPing", stats=None): - SndRcvList.__init__(self, res, name, stats) - - def show(self): - for s,r in self.res: - print r.sprintf("%19s,Ether.src% %ARP.psrc%") - - - -@conf.commands.register -def arping(net, timeout=2, cache=0, verbose=None, **kargs): - """Send ARP who-has requests to determine which hosts are up -arping(net, [cache=0,] [iface=conf.iface,] [verbose=conf.verb]) -> None -Set cache=True if you want arping to modify internal ARP-Cache""" - if verbose is None: - verbose = conf.verb - ans,unans = srp(Ether(dst="ff:ff:ff:ff:ff:ff")/ARP(pdst=net), verbose=verbose, - filter="arp and arp[7] = 2", timeout=timeout, iface_hint=net, **kargs) - ans = ARPingResult(ans.res) - - if cache and ans is not None: - for pair in ans: - conf.netcache.arp_cache[pair[1].psrc] = (pair[1].hwsrc, time.time()) - if verbose: - ans.show() - return ans,unans - -@conf.commands.register -def is_promisc(ip, fake_bcast="ff:ff:00:00:00:00",**kargs): - """Try to guess if target is in Promisc mode. The target is provided by its ip.""" - - responses = srp1(Ether(dst=fake_bcast) / ARP(op="who-has", pdst=ip),type=ETH_P_ARP, iface_hint=ip, timeout=1, verbose=0,**kargs) - - return responses is not None - -@conf.commands.register -def promiscping(net, timeout=2, fake_bcast="ff:ff:ff:ff:ff:fe", **kargs): - """Send ARP who-has requests to determine which hosts are in promiscuous mode - promiscping(net, iface=conf.iface)""" - ans,unans = srp(Ether(dst=fake_bcast)/ARP(pdst=net), - filter="arp and arp[7] = 2", timeout=timeout, iface_hint=net, **kargs) - ans = ARPingResult(ans.res, name="PROMISCPing") - - ans.display() - return ans,unans - - -class ARP_am(AnsweringMachine): - function_name="farpd" - filter = "arp" - send_function = staticmethod(sendp) - - def parse_options(self, IP_addr=None, iface=None, ARP_addr=None): - self.IP_addr=IP_addr - self.iface=iface - self.ARP_addr=ARP_addr - - def is_request(self, req): - return (req.haslayer(ARP) and - req.getlayer(ARP).op == 1 and - (self.IP_addr == None or self.IP_addr == req.getlayer(ARP).pdst)) - - def make_reply(self, req): - ether = req.getlayer(Ether) - arp = req.getlayer(ARP) - iff,a,gw = conf.route.route(arp.psrc) - if self.iface != None: - iff = iface - ARP_addr = self.ARP_addr - IP_addr = arp.pdst - resp = Ether(dst=ether.src, - src=ARP_addr)/ARP(op="is-at", - hwsrc=ARP_addr, - psrc=IP_addr, - hwdst=arp.hwsrc, - pdst=arp.pdst) - return resp - - def sniff(self): - sniff(iface=self.iface, **self.optsniff) - -@conf.commands.register -def etherleak(target, **kargs): - """Exploit Etherleak flaw""" - return srpflood(Ether()/ARP(pdst=target), - prn=lambda (s,r): conf.padding_layer in r and hexstr(r[conf.padding_layer].load), - filter="arp", **kargs) - - diff --git a/scripts/external_libs/scapy-2.3.1/scapy/layers/l2tp.py b/scripts/external_libs/scapy-2.3.1/scapy/layers/l2tp.py deleted file mode 100644 index 0b56db21..00000000 --- a/scripts/external_libs/scapy-2.3.1/scapy/layers/l2tp.py +++ /dev/null @@ -1,36 +0,0 @@ -## This file is part of Scapy -## See http://www.secdev.org/projects/scapy for more informations -## Copyright (C) Philippe Biondi <phil@secdev.org> -## This program is published under a GPLv2 license - -""" -L2TP (Layer 2 Tunneling Protocol) for VPNs. - -[RFC 2661] -""" - -import struct - -from scapy.packet import * -from scapy.fields import * -from scapy.layers.inet import UDP -from scapy.layers.ppp import PPP - -class L2TP(Packet): - fields_desc = [ ShortEnumField("pkt_type",2,{2:"data"}), - ShortField("len", None), - ShortField("tunnel_id", 0), - ShortField("session_id", 0), - ShortField("ns", 0), - ShortField("nr", 0), - ShortField("offset", 0) ] - - def post_build(self, pkt, pay): - if self.len is None: - l = len(pkt)+len(pay) - pkt = pkt[:2]+struct.pack("!H", l)+pkt[4:] - return pkt+pay - - -bind_layers( UDP, L2TP, sport=1701, dport=1701) -bind_layers( L2TP, PPP, ) diff --git a/scripts/external_libs/scapy-2.3.1/scapy/layers/llmnr.py b/scripts/external_libs/scapy-2.3.1/scapy/layers/llmnr.py deleted file mode 100644 index 65ecad41..00000000 --- a/scripts/external_libs/scapy-2.3.1/scapy/layers/llmnr.py +++ /dev/null @@ -1,65 +0,0 @@ -from scapy.fields import * -from scapy.packet import * -from scapy.layers.inet import UDP -from scapy.layers.dns import DNSQRField, DNSRRField, DNSRRCountField - -""" -LLMNR (Link Local Multicast Node Resolution). - -[RFC 4795] -""" - -############################################################################# -### LLMNR (RFC4795) ### -############################################################################# -# LLMNR is based on the DNS packet format (RFC1035 Section 4) -# RFC also envisions LLMNR over TCP. Like vista, we don't support it -- arno - -_LLMNR_IPv6_mcast_Addr = "FF02:0:0:0:0:0:1:3" -_LLMNR_IPv4_mcast_addr = "224.0.0.252" - -class LLMNRQuery(Packet): - name = "Link Local Multicast Node Resolution - Query" - fields_desc = [ ShortField("id", 0), - BitField("qr", 0, 1), - BitEnumField("opcode", 0, 4, { 0:"QUERY" }), - BitField("c", 0, 1), - BitField("tc", 0, 2), - BitField("z", 0, 4), - BitEnumField("rcode", 0, 4, { 0:"ok" }), - DNSRRCountField("qdcount", None, "qd"), - DNSRRCountField("ancount", None, "an"), - DNSRRCountField("nscount", None, "ns"), - DNSRRCountField("arcount", None, "ar"), - DNSQRField("qd", "qdcount"), - DNSRRField("an", "ancount"), - DNSRRField("ns", "nscount"), - DNSRRField("ar", "arcount",0)] - overload_fields = {UDP: {"sport": 5355, "dport": 5355 }} - def hashret(self): - return struct.pack("!H", self.id) - -class LLMNRResponse(LLMNRQuery): - name = "Link Local Multicast Node Resolution - Response" - qr = 1 - def answers(self, other): - return (isinstance(other, LLMNRQuery) and - self.id == other.id and - self.qr == 1 and - other.qr == 0) - -def _llmnr_dispatcher(x, *args, **kargs): - cls = conf.raw_layer - if len(x) >= 3: - if (ord(x[4]) & 0x80): # Response - cls = LLMNRResponse - else: # Query - cls = LLMNRQuery - return cls(x, *args, **kargs) - -bind_bottom_up(UDP, _llmnr_dispatcher, { "dport": 5355 }) -bind_bottom_up(UDP, _llmnr_dispatcher, { "sport": 5355 }) - -# LLMNRQuery(id=RandShort(), qd=DNSQR(qname="vista."))) - - diff --git a/scripts/external_libs/scapy-2.3.1/scapy/layers/mgcp.py b/scripts/external_libs/scapy-2.3.1/scapy/layers/mgcp.py deleted file mode 100644 index 5d8a064e..00000000 --- a/scripts/external_libs/scapy-2.3.1/scapy/layers/mgcp.py +++ /dev/null @@ -1,45 +0,0 @@ -## This file is part of Scapy -## See http://www.secdev.org/projects/scapy for more informations -## Copyright (C) Philippe Biondi <phil@secdev.org> -## This program is published under a GPLv2 license - -""" -MGCP (Media Gateway Control Protocol) - -[RFC 2805] -""" - -from scapy.packet import * -from scapy.fields import * -from scapy.layers.inet import UDP - -class MGCP(Packet): - name = "MGCP" - longname = "Media Gateway Control Protocol" - fields_desc = [ StrStopField("verb","AUEP"," ", -1), - StrFixedLenField("sep1"," ",1), - StrStopField("transaction_id","1234567"," ", -1), - StrFixedLenField("sep2"," ",1), - StrStopField("endpoint","dummy@dummy.net"," ", -1), - StrFixedLenField("sep3"," ",1), - StrStopField("version","MGCP 1.0 NCS 1.0","\x0a", -1), - StrFixedLenField("sep4","\x0a",1), - ] - - -#class MGCP(Packet): -# name = "MGCP" -# longname = "Media Gateway Control Protocol" -# fields_desc = [ ByteEnumField("type",0, ["request","response","others"]), -# ByteField("code0",0), -# ByteField("code1",0), -# ByteField("code2",0), -# ByteField("code3",0), -# ByteField("code4",0), -# IntField("trasid",0), -# IntField("req_time",0), -# ByteField("is_duplicate",0), -# ByteField("req_available",0) ] -# -bind_layers( UDP, MGCP, dport=2727) -bind_layers( UDP, MGCP, sport=2727) diff --git a/scripts/external_libs/scapy-2.3.1/scapy/layers/mobileip.py b/scripts/external_libs/scapy-2.3.1/scapy/layers/mobileip.py deleted file mode 100644 index bbaa8ce7..00000000 --- a/scripts/external_libs/scapy-2.3.1/scapy/layers/mobileip.py +++ /dev/null @@ -1,47 +0,0 @@ -## This file is part of Scapy -## See http://www.secdev.org/projects/scapy for more informations -## Copyright (C) Philippe Biondi <phil@secdev.org> -## This program is published under a GPLv2 license - -""" -Mobile IP. -""" - -from scapy.fields import * -from scapy.packet import * -from scapy.layers.inet import IP,UDP - - -class MobileIP(Packet): - name = "Mobile IP (RFC3344)" - fields_desc = [ ByteEnumField("type", 1, {1:"RRQ", 3:"RRP"}) ] - -class MobileIPRRQ(Packet): - name = "Mobile IP Registration Request (RFC3344)" - fields_desc = [ XByteField("flags", 0), - ShortField("lifetime", 180), - IPField("homeaddr", "0.0.0.0"), - IPField("haaddr", "0.0.0.0"), - IPField("coaddr", "0.0.0.0"), - LongField("id", 0), ] - -class MobileIPRRP(Packet): - name = "Mobile IP Registration Reply (RFC3344)" - fields_desc = [ ByteField("code", 0), - ShortField("lifetime", 180), - IPField("homeaddr", "0.0.0.0"), - IPField("haaddr", "0.0.0.0"), - LongField("id", 0), ] - -class MobileIPTunnelData(Packet): - name = "Mobile IP Tunnel Data Message (RFC3519)" - fields_desc = [ ByteField("nexthdr", 4), - ShortField("res", 0) ] - - -bind_layers( UDP, MobileIP, sport=434) -bind_layers( UDP, MobileIP, dport=434) -bind_layers( MobileIP, MobileIPRRQ, type=1) -bind_layers( MobileIP, MobileIPRRP, type=3) -bind_layers( MobileIP, MobileIPTunnelData, type=4) -bind_layers( MobileIPTunnelData, IP, nexthdr=4) diff --git a/scripts/external_libs/scapy-2.3.1/scapy/layers/netbios.py b/scripts/external_libs/scapy-2.3.1/scapy/layers/netbios.py deleted file mode 100644 index 605e06f1..00000000 --- a/scripts/external_libs/scapy-2.3.1/scapy/layers/netbios.py +++ /dev/null @@ -1,222 +0,0 @@ -## This file is part of Scapy -## See http://www.secdev.org/projects/scapy for more informations -## Copyright (C) Philippe Biondi <phil@secdev.org> -## This program is published under a GPLv2 license - -""" -NetBIOS over TCP/IP - -[RFC 1001/1002] -""" - -import struct -from scapy.packet import * -from scapy.fields import * -from scapy.layers.inet import UDP,TCP -from scapy.layers.l2 import SourceMACField - -class NetBIOS_DS(Packet): - name = "NetBIOS datagram service" - fields_desc = [ - ByteEnumField("type",17, {17:"direct_group"}), - ByteField("flags",0), - XShortField("id",0), - IPField("src","127.0.0.1"), - ShortField("sport",138), - ShortField("len",None), - ShortField("ofs",0), - NetBIOSNameField("srcname",""), - NetBIOSNameField("dstname",""), - ] - def post_build(self, p, pay): - p += pay - if self.len is None: - l = len(p)-14 - p = p[:10]+struct.pack("!H", l)+p[12:] - return p - -# ShortField("length",0), -# ShortField("Delimitor",0), -# ByteField("command",0), -# ByteField("data1",0), -# ShortField("data2",0), -# ShortField("XMIt",0), -# ShortField("RSPCor",0), -# StrFixedLenField("dest","",16), -# StrFixedLenField("source","",16), -# -# ] -# - -#NetBIOS - - -# Name Query Request -# Node Status Request -class NBNSQueryRequest(Packet): - name="NBNS query request" - fields_desc = [ShortField("NAME_TRN_ID",0), - ShortField("FLAGS", 0x0110), - ShortField("QDCOUNT",1), - ShortField("ANCOUNT",0), - ShortField("NSCOUNT",0), - ShortField("ARCOUNT",0), - NetBIOSNameField("QUESTION_NAME","windows"), - ShortEnumField("SUFFIX",0x4141,{0x4141:"workstation",0x4141+0x03:"messenger service",0x4141+0x200:"file server service",0x4141+0x10b:"domain master browser",0x4141+0x10c:"domain controller", 0x4141+0x10e:"browser election service"}), - ByteField("NULL",0), - ShortEnumField("QUESTION_TYPE",0x20, {0x20:"NB",0x21:"NBSTAT"}), - ShortEnumField("QUESTION_CLASS",1,{1:"INTERNET"})] - -# Name Registration Request -# Name Refresh Request -# Name Release Request or Demand -class NBNSRequest(Packet): - name="NBNS request" - fields_desc = [ShortField("NAME_TRN_ID",0), - ShortField("FLAGS", 0x2910), - ShortField("QDCOUNT",1), - ShortField("ANCOUNT",0), - ShortField("NSCOUNT",0), - ShortField("ARCOUNT",1), - NetBIOSNameField("QUESTION_NAME","windows"), - ShortEnumField("SUFFIX",0x4141,{0x4141:"workstation",0x4141+0x03:"messenger service",0x4141+0x200:"file server service",0x4141+0x10b:"domain master browser",0x4141+0x10c:"domain controller", 0x4141+0x10e:"browser election service"}), - ByteField("NULL",0), - ShortEnumField("QUESTION_TYPE",0x20, {0x20:"NB",0x21:"NBSTAT"}), - ShortEnumField("QUESTION_CLASS",1,{1:"INTERNET"}), - ShortEnumField("RR_NAME",0xC00C,{0xC00C:"Label String Pointer to QUESTION_NAME"}), - ShortEnumField("RR_TYPE",0x20, {0x20:"NB",0x21:"NBSTAT"}), - ShortEnumField("RR_CLASS",1,{1:"INTERNET"}), - IntField("TTL", 0), - ShortField("RDLENGTH", 6), - BitEnumField("G",0,1,{0:"Unique name",1:"Group name"}), - BitEnumField("OWNER_NODE_TYPE",00,2,{00:"B node",01:"P node",02:"M node",03:"H node"}), - BitEnumField("UNUSED",0,13,{0:"Unused"}), - IPField("NB_ADDRESS", "127.0.0.1")] - -# Name Query Response -# Name Registration Response -class NBNSQueryResponse(Packet): - name="NBNS query response" - fields_desc = [ShortField("NAME_TRN_ID",0), - ShortField("FLAGS", 0x8500), - ShortField("QDCOUNT",0), - ShortField("ANCOUNT",1), - ShortField("NSCOUNT",0), - ShortField("ARCOUNT",0), - NetBIOSNameField("RR_NAME","windows"), - ShortEnumField("SUFFIX",0x4141,{0x4141:"workstation",0x4141+0x03:"messenger service",0x4141+0x200:"file server service",0x4141+0x10b:"domain master browser",0x4141+0x10c:"domain controller", 0x4141+0x10e:"browser election service"}), - ByteField("NULL",0), - ShortEnumField("QUESTION_TYPE",0x20, {0x20:"NB",0x21:"NBSTAT"}), - ShortEnumField("QUESTION_CLASS",1,{1:"INTERNET"}), - IntField("TTL", 0x493e0), - ShortField("RDLENGTH", 6), - ShortField("NB_FLAGS", 0), - IPField("NB_ADDRESS", "127.0.0.1")] - -# Name Query Response (negative) -# Name Release Response -class NBNSQueryResponseNegative(Packet): - name="NBNS query response (negative)" - fields_desc = [ShortField("NAME_TRN_ID",0), - ShortField("FLAGS", 0x8506), - ShortField("QDCOUNT",0), - ShortField("ANCOUNT",1), - ShortField("NSCOUNT",0), - ShortField("ARCOUNT",0), - NetBIOSNameField("RR_NAME","windows"), - ShortEnumField("SUFFIX",0x4141,{0x4141:"workstation",0x4141+0x03:"messenger service",0x4141+0x200:"file server service",0x4141+0x10b:"domain master browser",0x4141+0x10c:"domain controller", 0x4141+0x10e:"browser election service"}), - ByteField("NULL",0), - ShortEnumField("RR_TYPE",0x20, {0x20:"NB",0x21:"NBSTAT"}), - ShortEnumField("RR_CLASS",1,{1:"INTERNET"}), - IntField("TTL",0), - ShortField("RDLENGTH",6), - BitEnumField("G",0,1,{0:"Unique name",1:"Group name"}), - BitEnumField("OWNER_NODE_TYPE",00,2,{00:"B node",01:"P node",02:"M node",03:"H node"}), - BitEnumField("UNUSED",0,13,{0:"Unused"}), - IPField("NB_ADDRESS", "127.0.0.1")] - -# Node Status Response -class NBNSNodeStatusResponse(Packet): - name="NBNS Node Status Response" - fields_desc = [ShortField("NAME_TRN_ID",0), - ShortField("FLAGS", 0x8500), - ShortField("QDCOUNT",0), - ShortField("ANCOUNT",1), - ShortField("NSCOUNT",0), - ShortField("ARCOUNT",0), - NetBIOSNameField("RR_NAME","windows"), - ShortEnumField("SUFFIX",0x4141,{0x4141:"workstation",0x4141+0x03:"messenger service",0x4141+0x200:"file server service",0x4141+0x10b:"domain master browser",0x4141+0x10c:"domain controller", 0x4141+0x10e:"browser election service"}), - ByteField("NULL",0), - ShortEnumField("RR_TYPE",0x21, {0x20:"NB",0x21:"NBSTAT"}), - ShortEnumField("RR_CLASS",1,{1:"INTERNET"}), - IntField("TTL",0), - ShortField("RDLENGTH",83), - ByteField("NUM_NAMES",1)] - -# Service for Node Status Response -class NBNSNodeStatusResponseService(Packet): - name="NBNS Node Status Response Service" - fields_desc = [StrFixedLenField("NETBIOS_NAME","WINDOWS ",15), - ByteEnumField("SUFFIX",0,{0:"workstation",0x03:"messenger service",0x20:"file server service",0x1b:"domain master browser",0x1c:"domain controller", 0x1e:"browser election service"}), - ByteField("NAME_FLAGS",0x4), - ByteEnumField("UNUSED",0,{0:"unused"})] - -# End of Node Status Response packet -class NBNSNodeStatusResponseEnd(Packet): - name="NBNS Node Status Response" - fields_desc = [SourceMACField("MAC_ADDRESS"), - BitField("STATISTICS",0,57*8)] - -# Wait for Acknowledgement Response -class NBNSWackResponse(Packet): - name="NBNS Wait for Acknowledgement Response" - fields_desc = [ShortField("NAME_TRN_ID",0), - ShortField("FLAGS", 0xBC07), - ShortField("QDCOUNT",0), - ShortField("ANCOUNT",1), - ShortField("NSCOUNT",0), - ShortField("ARCOUNT",0), - NetBIOSNameField("RR_NAME","windows"), - ShortEnumField("SUFFIX",0x4141,{0x4141:"workstation",0x4141+0x03:"messenger service",0x4141+0x200:"file server service",0x4141+0x10b:"domain master browser",0x4141+0x10c:"domain controller", 0x4141+0x10e:"browser election service"}), - ByteField("NULL",0), - ShortEnumField("RR_TYPE",0x20, {0x20:"NB",0x21:"NBSTAT"}), - ShortEnumField("RR_CLASS",1,{1:"INTERNET"}), - IntField("TTL", 2), - ShortField("RDLENGTH",2), - BitField("RDATA",10512,16)] #10512=0010100100010000 - -class NBTDatagram(Packet): - name="NBT Datagram Packet" - fields_desc= [ByteField("Type", 0x10), - ByteField("Flags", 0x02), - ShortField("ID", 0), - IPField("SourceIP", "127.0.0.1"), - ShortField("SourcePort", 138), - ShortField("Length", 272), - ShortField("Offset", 0), - NetBIOSNameField("SourceName","windows"), - ShortEnumField("SUFFIX1",0x4141,{0x4141:"workstation",0x4141+0x03:"messenger service",0x4141+0x200:"file server service",0x4141+0x10b:"domain master browser",0x4141+0x10c:"domain controller", 0x4141+0x10e:"browser election service"}), - ByteField("NULL",0), - NetBIOSNameField("DestinationName","windows"), - ShortEnumField("SUFFIX2",0x4141,{0x4141:"workstation",0x4141+0x03:"messenger service",0x4141+0x200:"file server service",0x4141+0x10b:"domain master browser",0x4141+0x10c:"domain controller", 0x4141+0x10e:"browser election service"}), - ByteField("NULL",0)] - - -class NBTSession(Packet): - name="NBT Session Packet" - fields_desc= [ByteEnumField("TYPE",0,{0x00:"Session Message",0x81:"Session Request",0x82:"Positive Session Response",0x83:"Negative Session Response",0x84:"Retarget Session Response",0x85:"Session Keepalive"}), - BitField("RESERVED",0x00,7), - BitField("LENGTH",0,17)] - -bind_layers( UDP, NBNSQueryRequest, dport=137) -bind_layers( UDP, NBNSRequest, dport=137) -bind_layers( UDP, NBNSQueryResponse, sport=137) -bind_layers( UDP, NBNSQueryResponseNegative, sport=137) -bind_layers( UDP, NBNSNodeStatusResponse, sport=137) -bind_layers( NBNSNodeStatusResponse, NBNSNodeStatusResponseService, ) -bind_layers( NBNSNodeStatusResponse, NBNSNodeStatusResponseService, ) -bind_layers( NBNSNodeStatusResponseService, NBNSNodeStatusResponseService, ) -bind_layers( NBNSNodeStatusResponseService, NBNSNodeStatusResponseEnd, ) -bind_layers( UDP, NBNSWackResponse, sport=137) -bind_layers( UDP, NBTDatagram, dport=138) -bind_layers( TCP, NBTSession, dport=139) diff --git a/scripts/external_libs/scapy-2.3.1/scapy/layers/netflow.py b/scripts/external_libs/scapy-2.3.1/scapy/layers/netflow.py deleted file mode 100644 index 44567737..00000000 --- a/scripts/external_libs/scapy-2.3.1/scapy/layers/netflow.py +++ /dev/null @@ -1,48 +0,0 @@ -## This file is part of Scapy -## See http://www.secdev.org/projects/scapy for more informations -## Copyright (C) Philippe Biondi <phil@secdev.org> -## This program is published under a GPLv2 license - -""" -Cisco NetFlow protocol v1 -""" - - -from scapy.fields import * -from scapy.packet import * - -# Cisco Netflow Protocol version 1 -class NetflowHeader(Packet): - name = "Netflow Header" - fields_desc = [ ShortField("version", 1) ] - -class NetflowHeaderV1(Packet): - name = "Netflow Header V1" - fields_desc = [ ShortField("count", 0), - IntField("sysUptime", 0), - IntField("unixSecs", 0), - IntField("unixNanoSeconds", 0) ] - - -class NetflowRecordV1(Packet): - name = "Netflow Record" - fields_desc = [ IPField("ipsrc", "0.0.0.0"), - IPField("ipdst", "0.0.0.0"), - IPField("nexthop", "0.0.0.0"), - ShortField("inputIfIndex", 0), - ShortField("outpuIfIndex", 0), - IntField("dpkts", 0), - IntField("dbytes", 0), - IntField("starttime", 0), - IntField("endtime", 0), - ShortField("srcport", 0), - ShortField("dstport", 0), - ShortField("padding", 0), - ByteField("proto", 0), - ByteField("tos", 0), - IntField("padding1", 0), - IntField("padding2", 0) ] - - -bind_layers( NetflowHeader, NetflowHeaderV1, version=1) -bind_layers( NetflowHeaderV1, NetflowRecordV1, ) diff --git a/scripts/external_libs/scapy-2.3.1/scapy/layers/ntp.py b/scripts/external_libs/scapy-2.3.1/scapy/layers/ntp.py deleted file mode 100644 index 6d11966c..00000000 --- a/scripts/external_libs/scapy-2.3.1/scapy/layers/ntp.py +++ /dev/null @@ -1,77 +0,0 @@ -## This file is part of Scapy -## See http://www.secdev.org/projects/scapy for more informations -## Copyright (C) Philippe Biondi <phil@secdev.org> -## This program is published under a GPLv2 license - -""" -NTP (Network Time Protocol). -""" - -import time -from scapy.packet import * -from scapy.fields import * -from scapy.layers.inet import UDP - - -# seconds between 01-01-1900 and 01-01-1970 -_NTP_BASETIME = 2208988800 - -class TimeStampField(FixedPointField): - def __init__(self, name, default): - FixedPointField.__init__(self, name, default, 64, 32) - - def i2repr(self, pkt, val): - if val is None: - return "--" - val = self.i2h(pkt,val) - if val < _NTP_BASETIME: - return val - return time.strftime("%a, %d %b %Y %H:%M:%S +0000", time.gmtime(val-_NTP_BASETIME)) - - def any2i(self, pkt, val): - if type(val) is str: - return int(time.mktime(time.strptime(val))) + _NTP_BASETIME + 3600 # XXX - return FixedPointField.any2i(self,pkt,val) - - def i2m(self, pkt, val): - if val is None: - val = FixedPointField.any2i(self, pkt, time.time()+_NTP_BASETIME) - return FixedPointField.i2m(self, pkt, val) - - - -class NTP(Packet): - # RFC 1769 - name = "NTP" - fields_desc = [ - BitEnumField('leap', 0, 2, - { 0: 'nowarning', - 1: 'longminute', - 2: 'shortminute', - 3: 'notsync'}), - BitField('version', 3, 3), - BitEnumField('mode', 3, 3, - { 0: 'reserved', - 1: 'sym_active', - 2: 'sym_passive', - 3: 'client', - 4: 'server', - 5: 'broadcast', - 6: 'control', - 7: 'private'}), - BitField('stratum', 2, 8), - BitField('poll', 0xa, 8), ### XXX : it's a signed int - BitField('precision', 0, 8), ### XXX : it's a signed int - FixedPointField('delay', 0, size=32, frac_bits=16), - FixedPointField('dispersion', 0, size=32, frac_bits=16), - IPField('id', "127.0.0.1"), - TimeStampField('ref', 0), - TimeStampField('orig', None), # None means current time - TimeStampField('recv', 0), - TimeStampField('sent', None) - ] - def mysummary(self): - return self.sprintf("NTP v%ir,NTP.version%, %NTP.mode%") - - -bind_layers( UDP, NTP, dport=123, sport=123) diff --git a/scripts/external_libs/scapy-2.3.1/scapy/layers/pflog.py b/scripts/external_libs/scapy-2.3.1/scapy/layers/pflog.py deleted file mode 100644 index a8fc9fe0..00000000 --- a/scripts/external_libs/scapy-2.3.1/scapy/layers/pflog.py +++ /dev/null @@ -1,59 +0,0 @@ -## This file is part of Scapy -## See http://www.secdev.org/projects/scapy for more informations -## Copyright (C) Philippe Biondi <phil@secdev.org> -## This program is published under a GPLv2 license - -""" -PFLog: OpenBSD PF packet filter logging. -""" - -from scapy.packet import * -from scapy.fields import * -from scapy.layers.inet import IP -if conf.ipv6_enabled: - from scapy.layers.inet6 import IPv6 -from scapy.config import conf - -class PFLog(Packet): - name = "PFLog" - # from OpenBSD src/sys/net/pfvar.h and src/sys/net/if_pflog.h - fields_desc = [ ByteField("hdrlen", 0), - ByteEnumField("addrfamily", 2, {socket.AF_INET: "IPv4", - socket.AF_INET6: "IPv6"}), - ByteEnumField("action", 1, {0: "pass", 1: "drop", - 2: "scrub", 3: "no-scrub", - 4: "nat", 5: "no-nat", - 6: "binat", 7: "no-binat", - 8: "rdr", 9: "no-rdr", - 10: "syn-proxy-drop" }), - ByteEnumField("reason", 0, {0: "match", 1: "bad-offset", - 2: "fragment", 3: "short", - 4: "normalize", 5: "memory", - 6: "bad-timestamp", - 7: "congestion", - 8: "ip-options", - 9: "proto-cksum", - 10: "state-mismatch", - 11: "state-insert", - 12: "state-limit", - 13: "src-limit", - 14: "syn-proxy" }), - StrFixedLenField("iface", "", 16), - StrFixedLenField("ruleset", "", 16), - SignedIntField("rulenumber", 0), - SignedIntField("subrulenumber", 0), - SignedIntField("uid", 0), - IntField("pid", 0), - SignedIntField("ruleuid", 0), - IntField("rulepid", 0), - ByteEnumField("direction", 255, {0: "inout", 1: "in", - 2:"out", 255: "unknown"}), - StrFixedLenField("pad", "\x00\x00\x00", 3 ) ] - def mysummary(self): - return self.sprintf("%PFLog.addrfamily% %PFLog.action% on %PFLog.iface% by rule %PFLog.rulenumber%") - -bind_layers(PFLog, IP, addrfamily=socket.AF_INET) -if conf.ipv6_enabled: - bind_layers(PFLog, IPv6, addrfamily=socket.AF_INET6) - -conf.l2types.register(117, PFLog) diff --git a/scripts/external_libs/scapy-2.3.1/scapy/layers/ppp.py b/scripts/external_libs/scapy-2.3.1/scapy/layers/ppp.py deleted file mode 100644 index 50c68465..00000000 --- a/scripts/external_libs/scapy-2.3.1/scapy/layers/ppp.py +++ /dev/null @@ -1,347 +0,0 @@ -## This file is part of Scapy -## See http://www.secdev.org/projects/scapy for more informations -## Copyright (C) Philippe Biondi <phil@secdev.org> -## This program is published under a GPLv2 license - -""" -PPP (Point to Point Protocol) - -[RFC 1661] -""" - -import struct -from scapy.packet import * -from scapy.layers.l2 import * -from scapy.layers.inet import * -from scapy.fields import * - -class PPPoE(Packet): - name = "PPP over Ethernet" - fields_desc = [ BitField("version", 1, 4), - BitField("type", 1, 4), - ByteEnumField("code", 0, {0:"Session"}), - XShortField("sessionid", 0x0), - ShortField("len", None) ] - - def post_build(self, p, pay): - p += pay - if self.len is None: - l = len(p)-6 - p = p[:4]+struct.pack("!H", l)+p[6:] - return p - -class PPPoED(PPPoE): - name = "PPP over Ethernet Discovery" - fields_desc = [ BitField("version", 1, 4), - BitField("type", 1, 4), - ByteEnumField("code", 0x09, {0x09:"PADI",0x07:"PADO",0x19:"PADR",0x65:"PADS",0xa7:"PADT"}), - XShortField("sessionid", 0x0), - ShortField("len", None) ] - - -_PPP_proto = { 0x0001: "Padding Protocol", - 0x0003: "ROHC small-CID [RFC3095]", - 0x0005: "ROHC large-CID [RFC3095]", - 0x0021: "Internet Protocol version 4", - 0x0023: "OSI Network Layer", - 0x0025: "Xerox NS IDP", - 0x0027: "DECnet Phase IV", - 0x0029: "Appletalk", - 0x002b: "Novell IPX", - 0x002d: "Van Jacobson Compressed TCP/IP", - 0x002f: "Van Jacobson Uncompressed TCP/IP", - 0x0031: "Bridging PDU", - 0x0033: "Stream Protocol (ST-II)", - 0x0035: "Banyan Vines", - 0x0037: "reserved (until 1993) [Typo in RFC1172]", - 0x0039: "AppleTalk EDDP", - 0x003b: "AppleTalk SmartBuffered", - 0x003d: "Multi-Link [RFC1717]", - 0x003f: "NETBIOS Framing", - 0x0041: "Cisco Systems", - 0x0043: "Ascom Timeplex", - 0x0045: "Fujitsu Link Backup and Load Balancing (LBLB)", - 0x0047: "DCA Remote Lan", - 0x0049: "Serial Data Transport Protocol (PPP-SDTP)", - 0x004b: "SNA over 802.2", - 0x004d: "SNA", - 0x004f: "IPv6 Header Compression", - 0x0051: "KNX Bridging Data [ianp]", - 0x0053: "Encryption [Meyer]", - 0x0055: "Individual Link Encryption [Meyer]", - 0x0057: "Internet Protocol version 6 [Hinden]", - 0x0059: "PPP Muxing [RFC3153]", - 0x005b: "Vendor-Specific Network Protocol (VSNP) [RFC3772]", - 0x0061: "RTP IPHC Full Header [RFC3544]", - 0x0063: "RTP IPHC Compressed TCP [RFC3544]", - 0x0065: "RTP IPHC Compressed Non TCP [RFC3544]", - 0x0067: "RTP IPHC Compressed UDP 8 [RFC3544]", - 0x0069: "RTP IPHC Compressed RTP 8 [RFC3544]", - 0x006f: "Stampede Bridging", - 0x0071: "Reserved [Fox]", - 0x0073: "MP+ Protocol [Smith]", - 0x007d: "reserved (Control Escape) [RFC1661]", - 0x007f: "reserved (compression inefficient [RFC1662]", - 0x0081: "Reserved Until 20-Oct-2000 [IANA]", - 0x0083: "Reserved Until 20-Oct-2000 [IANA]", - 0x00c1: "NTCITS IPI [Ungar]", - 0x00cf: "reserved (PPP NLID)", - 0x00fb: "single link compression in multilink [RFC1962]", - 0x00fd: "compressed datagram [RFC1962]", - 0x00ff: "reserved (compression inefficient)", - 0x0201: "802.1d Hello Packets", - 0x0203: "IBM Source Routing BPDU", - 0x0205: "DEC LANBridge100 Spanning Tree", - 0x0207: "Cisco Discovery Protocol [Sastry]", - 0x0209: "Netcs Twin Routing [Korfmacher]", - 0x020b: "STP - Scheduled Transfer Protocol [Segal]", - 0x020d: "EDP - Extreme Discovery Protocol [Grosser]", - 0x0211: "Optical Supervisory Channel Protocol (OSCP)[Prasad]", - 0x0213: "Optical Supervisory Channel Protocol (OSCP)[Prasad]", - 0x0231: "Luxcom", - 0x0233: "Sigma Network Systems", - 0x0235: "Apple Client Server Protocol [Ridenour]", - 0x0281: "MPLS Unicast [RFC3032] ", - 0x0283: "MPLS Multicast [RFC3032]", - 0x0285: "IEEE p1284.4 standard - data packets [Batchelder]", - 0x0287: "ETSI TETRA Network Protocol Type 1 [Nieminen]", - 0x0289: "Multichannel Flow Treatment Protocol [McCann]", - 0x2063: "RTP IPHC Compressed TCP No Delta [RFC3544]", - 0x2065: "RTP IPHC Context State [RFC3544]", - 0x2067: "RTP IPHC Compressed UDP 16 [RFC3544]", - 0x2069: "RTP IPHC Compressed RTP 16 [RFC3544]", - 0x4001: "Cray Communications Control Protocol [Stage]", - 0x4003: "CDPD Mobile Network Registration Protocol [Quick]", - 0x4005: "Expand accelerator protocol [Rachmani]", - 0x4007: "ODSICP NCP [Arvind]", - 0x4009: "DOCSIS DLL [Gaedtke]", - 0x400B: "Cetacean Network Detection Protocol [Siller]", - 0x4021: "Stacker LZS [Simpson]", - 0x4023: "RefTek Protocol [Banfill]", - 0x4025: "Fibre Channel [Rajagopal]", - 0x4027: "EMIT Protocols [Eastham]", - 0x405b: "Vendor-Specific Protocol (VSP) [RFC3772]", - 0x8021: "Internet Protocol Control Protocol", - 0x8023: "OSI Network Layer Control Protocol", - 0x8025: "Xerox NS IDP Control Protocol", - 0x8027: "DECnet Phase IV Control Protocol", - 0x8029: "Appletalk Control Protocol", - 0x802b: "Novell IPX Control Protocol", - 0x802d: "reserved", - 0x802f: "reserved", - 0x8031: "Bridging NCP", - 0x8033: "Stream Protocol Control Protocol", - 0x8035: "Banyan Vines Control Protocol", - 0x8037: "reserved (until 1993)", - 0x8039: "reserved", - 0x803b: "reserved", - 0x803d: "Multi-Link Control Protocol", - 0x803f: "NETBIOS Framing Control Protocol", - 0x8041: "Cisco Systems Control Protocol", - 0x8043: "Ascom Timeplex", - 0x8045: "Fujitsu LBLB Control Protocol", - 0x8047: "DCA Remote Lan Network Control Protocol (RLNCP)", - 0x8049: "Serial Data Control Protocol (PPP-SDCP)", - 0x804b: "SNA over 802.2 Control Protocol", - 0x804d: "SNA Control Protocol", - 0x804f: "IP6 Header Compression Control Protocol", - 0x8051: "KNX Bridging Control Protocol [ianp]", - 0x8053: "Encryption Control Protocol [Meyer]", - 0x8055: "Individual Link Encryption Control Protocol [Meyer]", - 0x8057: "IPv6 Control Protovol [Hinden]", - 0x8059: "PPP Muxing Control Protocol [RFC3153]", - 0x805b: "Vendor-Specific Network Control Protocol (VSNCP) [RFC3772]", - 0x806f: "Stampede Bridging Control Protocol", - 0x8073: "MP+ Control Protocol [Smith]", - 0x8071: "Reserved [Fox]", - 0x807d: "Not Used - reserved [RFC1661]", - 0x8081: "Reserved Until 20-Oct-2000 [IANA]", - 0x8083: "Reserved Until 20-Oct-2000 [IANA]", - 0x80c1: "NTCITS IPI Control Protocol [Ungar]", - 0x80cf: "Not Used - reserved [RFC1661]", - 0x80fb: "single link compression in multilink control [RFC1962]", - 0x80fd: "Compression Control Protocol [RFC1962]", - 0x80ff: "Not Used - reserved [RFC1661]", - 0x8207: "Cisco Discovery Protocol Control [Sastry]", - 0x8209: "Netcs Twin Routing [Korfmacher]", - 0x820b: "STP - Control Protocol [Segal]", - 0x820d: "EDPCP - Extreme Discovery Protocol Ctrl Prtcl [Grosser]", - 0x8235: "Apple Client Server Protocol Control [Ridenour]", - 0x8281: "MPLSCP [RFC3032]", - 0x8285: "IEEE p1284.4 standard - Protocol Control [Batchelder]", - 0x8287: "ETSI TETRA TNP1 Control Protocol [Nieminen]", - 0x8289: "Multichannel Flow Treatment Protocol [McCann]", - 0xc021: "Link Control Protocol", - 0xc023: "Password Authentication Protocol", - 0xc025: "Link Quality Report", - 0xc027: "Shiva Password Authentication Protocol", - 0xc029: "CallBack Control Protocol (CBCP)", - 0xc02b: "BACP Bandwidth Allocation Control Protocol [RFC2125]", - 0xc02d: "BAP [RFC2125]", - 0xc05b: "Vendor-Specific Authentication Protocol (VSAP) [RFC3772]", - 0xc081: "Container Control Protocol [KEN]", - 0xc223: "Challenge Handshake Authentication Protocol", - 0xc225: "RSA Authentication Protocol [Narayana]", - 0xc227: "Extensible Authentication Protocol [RFC2284]", - 0xc229: "Mitsubishi Security Info Exch Ptcl (SIEP) [Seno]", - 0xc26f: "Stampede Bridging Authorization Protocol", - 0xc281: "Proprietary Authentication Protocol [KEN]", - 0xc283: "Proprietary Authentication Protocol [Tackabury]", - 0xc481: "Proprietary Node ID Authentication Protocol [KEN]"} - - -class HDLC(Packet): - fields_desc = [ XByteField("address",0xff), - XByteField("control",0x03) ] - -class PPP(Packet): - name = "PPP Link Layer" - fields_desc = [ ShortEnumField("proto", 0x0021, _PPP_proto) ] - @classmethod - def dispatch_hook(cls, _pkt=None, *args, **kargs): - if _pkt and _pkt[0] == '\xff': - cls = HDLC - return cls - -_PPP_conftypes = { 1:"Configure-Request", - 2:"Configure-Ack", - 3:"Configure-Nak", - 4:"Configure-Reject", - 5:"Terminate-Request", - 6:"Terminate-Ack", - 7:"Code-Reject", - 8:"Protocol-Reject", - 9:"Echo-Request", - 10:"Echo-Reply", - 11:"Discard-Request", - 14:"Reset-Request", - 15:"Reset-Ack", - } - - -### PPP IPCP stuff (RFC 1332) - -# All IPCP options are defined below (names and associated classes) -_PPP_ipcpopttypes = { 1:"IP-Addresses (Deprecated)", - 2:"IP-Compression-Protocol", - 3:"IP-Address", - 4:"Mobile-IPv4", # not implemented, present for completeness - 129:"Primary-DNS-Address", - 130:"Primary-NBNS-Address", - 131:"Secondary-DNS-Address", - 132:"Secondary-NBNS-Address"} - - -class PPP_IPCP_Option(Packet): - name = "PPP IPCP Option" - fields_desc = [ ByteEnumField("type" , None , _PPP_ipcpopttypes), - FieldLenField("len", None, length_of="data", fmt="B", adjust=lambda p,x:x+2), - StrLenField("data", "", length_from=lambda p:max(0,p.len-2)) ] - def extract_padding(self, pay): - return "",pay - - registered_options = {} - @classmethod - def register_variant(cls): - cls.registered_options[cls.type.default] = cls - @classmethod - def dispatch_hook(cls, _pkt=None, *args, **kargs): - if _pkt: - o = ord(_pkt[0]) - return cls.registered_options.get(o, cls) - return cls - - -class PPP_IPCP_Option_IPAddress(PPP_IPCP_Option): - name = "PPP IPCP Option: IP Address" - fields_desc = [ ByteEnumField("type" , 3 , _PPP_ipcpopttypes), - FieldLenField("len", None, length_of="data", fmt="B", adjust=lambda p,x:x+2), - IPField("data","0.0.0.0"), - ConditionalField(StrLenField("garbage","", length_from=lambda pkt:pkt.len-6), lambda p:p.len!=6) ] - -class PPP_IPCP_Option_DNS1(PPP_IPCP_Option): - name = "PPP IPCP Option: DNS1 Address" - fields_desc = [ ByteEnumField("type" , 129 , _PPP_ipcpopttypes), - FieldLenField("len", None, length_of="data", fmt="B", adjust=lambda p,x:x+2), - IPField("data","0.0.0.0"), - ConditionalField(StrLenField("garbage","", length_from=lambda pkt:pkt.len-6), lambda p:p.len!=6) ] - -class PPP_IPCP_Option_DNS2(PPP_IPCP_Option): - name = "PPP IPCP Option: DNS2 Address" - fields_desc = [ ByteEnumField("type" , 131 , _PPP_ipcpopttypes), - FieldLenField("len", None, length_of="data", fmt="B", adjust=lambda p,x:x+2), - IPField("data","0.0.0.0"), - ConditionalField(StrLenField("garbage","", length_from=lambda pkt:pkt.len-6), lambda p:p.len!=6) ] - -class PPP_IPCP_Option_NBNS1(PPP_IPCP_Option): - name = "PPP IPCP Option: NBNS1 Address" - fields_desc = [ ByteEnumField("type" , 130 , _PPP_ipcpopttypes), - FieldLenField("len", None, length_of="data", fmt="B", adjust=lambda p,x:x+2), - IPField("data","0.0.0.0"), - ConditionalField(StrLenField("garbage","", length_from=lambda pkt:pkt.len-6), lambda p:p.len!=6) ] - -class PPP_IPCP_Option_NBNS2(PPP_IPCP_Option): - name = "PPP IPCP Option: NBNS2 Address" - fields_desc = [ ByteEnumField("type" , 132 , _PPP_ipcpopttypes), - FieldLenField("len", None, length_of="data", fmt="B", adjust=lambda p,x:x+2), - IPField("data","0.0.0.0"), - ConditionalField(StrLenField("garbage","", length_from=lambda pkt:pkt.len-6), lambda p:p.len!=6) ] - - -class PPP_IPCP(Packet): - fields_desc = [ ByteEnumField("code" , 1, _PPP_conftypes), - XByteField("id", 0 ), - FieldLenField("len" , None, fmt="H", length_of="options", adjust=lambda p,x:x+4 ), - PacketListField("options", [], PPP_IPCP_Option, length_from=lambda p:p.len-4,) ] - - -### ECP - -_PPP_ecpopttypes = { 0:"OUI", - 1:"DESE", } - -class PPP_ECP_Option(Packet): - name = "PPP ECP Option" - fields_desc = [ ByteEnumField("type" , None , _PPP_ecpopttypes), - FieldLenField("len", None, length_of="data", fmt="B", adjust=lambda p,x:x+2), - StrLenField("data", "", length_from=lambda p:max(0,p.len-2)) ] - def extract_padding(self, pay): - return "",pay - - registered_options = {} - @classmethod - def register_variant(cls): - cls.registered_options[cls.type.default] = cls - @classmethod - def dispatch_hook(cls, _pkt=None, *args, **kargs): - if _pkt: - o = ord(_pkt[0]) - return cls.registered_options.get(o, cls) - return cls - -class PPP_ECP_Option_OUI(PPP_ECP_Option): - fields_desc = [ ByteEnumField("type" , 0 , _PPP_ecpopttypes), - FieldLenField("len", None, length_of="data", fmt="B", adjust=lambda p,x:x+6), - StrFixedLenField("oui","",3), - ByteField("subtype",0), - StrLenField("data", "", length_from=lambda p:p.len-6) ] - - - -class PPP_ECP(Packet): - fields_desc = [ ByteEnumField("code" , 1, _PPP_conftypes), - XByteField("id", 0 ), - FieldLenField("len" , None, fmt="H", length_of="options", adjust=lambda p,x:x+4 ), - PacketListField("options", [], PPP_ECP_Option, length_from=lambda p:p.len-4,) ] - -bind_layers( Ether, PPPoED, type=0x8863) -bind_layers( Ether, PPPoE, type=0x8864) -bind_layers( CookedLinux, PPPoED, proto=0x8863) -bind_layers( CookedLinux, PPPoE, proto=0x8864) -bind_layers( PPPoE, PPP, code=0) -bind_layers( HDLC, PPP, ) -bind_layers( PPP, IP, proto=33) -bind_layers( PPP, PPP_IPCP, proto=0x8021) -bind_layers( PPP, PPP_ECP, proto=0x8053) -bind_layers( Ether, PPP_IPCP, type=0x8021) -bind_layers( Ether, PPP_ECP, type=0x8053) diff --git a/scripts/external_libs/scapy-2.3.1/scapy/layers/radius.py b/scripts/external_libs/scapy-2.3.1/scapy/layers/radius.py deleted file mode 100644 index 13239603..00000000 --- a/scripts/external_libs/scapy-2.3.1/scapy/layers/radius.py +++ /dev/null @@ -1,65 +0,0 @@ -## This file is part of Scapy -## See http://www.secdev.org/projects/scapy for more informations -## Copyright (C) Philippe Biondi <phil@secdev.org> -## This program is published under a GPLv2 license - -""" -RADIUS (Remote Authentication Dial In User Service) -""" - -import struct -from scapy.packet import * -from scapy.fields import * - -class Radius(Packet): - name = "Radius" - fields_desc = [ ByteEnumField("code", 1, {1: "Access-Request", - 2: "Access-Accept", - 3: "Access-Reject", - 4: "Accounting-Request", - 5: "Accounting-Accept", - 6: "Accounting-Status", - 7: "Password-Request", - 8: "Password-Ack", - 9: "Password-Reject", - 10: "Accounting-Message", - 11: "Access-Challenge", - 12: "Status-Server", - 13: "Status-Client", - 21: "Resource-Free-Request", - 22: "Resource-Free-Response", - 23: "Resource-Query-Request", - 24: "Resource-Query-Response", - 25: "Alternate-Resource-Reclaim-Request", - 26: "NAS-Reboot-Request", - 27: "NAS-Reboot-Response", - 29: "Next-Passcode", - 30: "New-Pin", - 31: "Terminate-Session", - 32: "Password-Expired", - 33: "Event-Request", - 34: "Event-Response", - 40: "Disconnect-Request", - 41: "Disconnect-ACK", - 42: "Disconnect-NAK", - 43: "CoA-Request", - 44: "CoA-ACK", - 45: "CoA-NAK", - 50: "IP-Address-Allocate", - 51: "IP-Address-Release", - 253: "Experimental-use", - 254: "Reserved", - 255: "Reserved"} ), - ByteField("id", 0), - ShortField("len", None), - StrFixedLenField("authenticator","",16) ] - def post_build(self, p, pay): - p += pay - l = self.len - if l is None: - l = len(p) - p = p[:2]+struct.pack("!H",l)+p[4:] - return p - - - diff --git a/scripts/external_libs/scapy-2.3.1/scapy/layers/rip.py b/scripts/external_libs/scapy-2.3.1/scapy/layers/rip.py deleted file mode 100644 index 1507fe5c..00000000 --- a/scripts/external_libs/scapy-2.3.1/scapy/layers/rip.py +++ /dev/null @@ -1,74 +0,0 @@ -## This file is part of Scapy -## See http://www.secdev.org/projects/scapy for more informations -## Copyright (C) Philippe Biondi <phil@secdev.org> -## This program is published under a GPLv2 license - -""" -RIP (Routing Information Protocol). -""" - -from scapy.packet import * -from scapy.fields import * -from scapy.layers.inet import UDP - -class RIP(Packet): - name = "RIP header" - fields_desc = [ - ByteEnumField("cmd", 1, {1:"req", 2:"resp", 3:"traceOn", 4:"traceOff", - 5:"sun", 6:"trigReq", 7:"trigResp", 8:"trigAck", - 9:"updateReq", 10:"updateResp", 11:"updateAck"}), - ByteField("version", 1), - ShortField("null", 0), - ] - - def guess_payload_class(self, payload): - if payload[:2] == "\xff\xff": - return RIPAuth - else: - return Packet.guess_payload_class(self, payload) - -class RIPEntry(RIP): - name = "RIP entry" - fields_desc = [ - ShortEnumField("AF", 2, {2:"IP"}), - ShortField("RouteTag", 0), - IPField("addr", "0.0.0.0"), - IPField("mask", "0.0.0.0"), - IPField("nextHop", "0.0.0.0"), - IntEnumField("metric", 1, {16:"Unreach"}), - ] - -class RIPAuth(Packet): - name = "RIP authentication" - fields_desc = [ - ShortEnumField("AF", 0xffff, {0xffff:"Auth"}), - ShortEnumField("authtype", 2, {1:"md5authdata", 2:"simple", 3:"md5"}), - ConditionalField(StrFixedLenField("password", None, 16), - lambda pkt: pkt.authtype == 2), - ConditionalField(ShortField("digestoffset", 0), - lambda pkt: pkt.authtype == 3), - ConditionalField(ByteField("keyid", 0), - lambda pkt: pkt.authtype == 3), - ConditionalField(ByteField("authdatalen", 0), - lambda pkt: pkt.authtype == 3), - ConditionalField(IntField("seqnum", 0), - lambda pkt: pkt.authtype == 3), - ConditionalField(StrFixedLenField("zeropad", None, 8), - lambda pkt: pkt.authtype == 3), - ConditionalField(StrLenField("authdata", None, - length_from=lambda pkt: pkt.md5datalen), - lambda pkt: pkt.authtype == 1) - ] - - def pre_dissect(self, s): - if s[2:4] == "\x00\x01": - self.md5datalen = len(s) - 4 - - return s - - -bind_layers( UDP, RIP, sport=520) -bind_layers( UDP, RIP, dport=520) -bind_layers( RIP, RIPEntry, ) -bind_layers( RIPEntry, RIPEntry, ) -bind_layers( RIPAuth, RIPEntry, ) diff --git a/scripts/external_libs/scapy-2.3.1/scapy/layers/rtp.py b/scripts/external_libs/scapy-2.3.1/scapy/layers/rtp.py deleted file mode 100644 index 629dccdd..00000000 --- a/scripts/external_libs/scapy-2.3.1/scapy/layers/rtp.py +++ /dev/null @@ -1,40 +0,0 @@ -## This file is part of Scapy -## See http://www.secdev.org/projects/scapy for more informations -## Copyright (C) Philippe Biondi <phil@secdev.org> -## This program is published under a GPLv2 license - -""" -RTP (Real-time Transport Protocol). -""" - -from scapy.packet import * -from scapy.fields import * - -_rtp_payload_types = { - # http://www.iana.org/assignments/rtp-parameters - 0: 'G.711 PCMU', 3: 'GSM', - 4: 'G723', 5: 'DVI4', - 6: 'DVI4', 7: 'LPC', - 8: 'PCMA', 9: 'G722', - 10: 'L16', 11: 'L16', - 12: 'QCELP', 13: 'CN', - 14: 'MPA', 15: 'G728', - 16: 'DVI4', 17: 'DVI4', - 18: 'G729', 25: 'CelB', - 26: 'JPEG', 28: 'nv', - 31: 'H261', 32: 'MPV', - 33: 'MP2T', 34: 'H263' } - -class RTP(Packet): - name="RTP" - fields_desc = [ BitField('version', 2, 2), - BitField('padding', 0, 1), - BitField('extension', 0, 1), - BitFieldLenField('numsync', None, 4, count_of='sync'), - BitField('marker', 0, 1), - BitEnumField('payload', 0, 7, _rtp_payload_types), - ShortField('sequence', 0), - IntField('timestamp', 0), - IntField('sourcesync', 0), - FieldListField('sync', [], IntField("id",0), count_from=lambda pkt:pkt.numsync) ] - diff --git a/scripts/external_libs/scapy-2.3.1/scapy/layers/sctp.py b/scripts/external_libs/scapy-2.3.1/scapy/layers/sctp.py deleted file mode 100644 index 632becb1..00000000 --- a/scripts/external_libs/scapy-2.3.1/scapy/layers/sctp.py +++ /dev/null @@ -1,437 +0,0 @@ -## This file is part of Scapy -## See http://www.secdev.org/projects/scapy for more informations -## Copyright (C) Philippe Biondi <phil@secdev.org> -## Copyright (C) 6WIND <olivier.matz@6wind.com> -## This program is published under a GPLv2 license - -""" -SCTP (Stream Control Transmission Protocol). -""" - -import struct - -from scapy.packet import * -from scapy.fields import * -from scapy.layers.inet import IP -from scapy.layers.inet6 import IP6Field - -IPPROTO_SCTP=132 - -# crc32-c (Castagnoli) (crc32c_poly=0x1EDC6F41) -crc32c_table = [ - 0x00000000, 0xF26B8303, 0xE13B70F7, 0x1350F3F4, - 0xC79A971F, 0x35F1141C, 0x26A1E7E8, 0xD4CA64EB, - 0x8AD958CF, 0x78B2DBCC, 0x6BE22838, 0x9989AB3B, - 0x4D43CFD0, 0xBF284CD3, 0xAC78BF27, 0x5E133C24, - 0x105EC76F, 0xE235446C, 0xF165B798, 0x030E349B, - 0xD7C45070, 0x25AFD373, 0x36FF2087, 0xC494A384, - 0x9A879FA0, 0x68EC1CA3, 0x7BBCEF57, 0x89D76C54, - 0x5D1D08BF, 0xAF768BBC, 0xBC267848, 0x4E4DFB4B, - 0x20BD8EDE, 0xD2D60DDD, 0xC186FE29, 0x33ED7D2A, - 0xE72719C1, 0x154C9AC2, 0x061C6936, 0xF477EA35, - 0xAA64D611, 0x580F5512, 0x4B5FA6E6, 0xB93425E5, - 0x6DFE410E, 0x9F95C20D, 0x8CC531F9, 0x7EAEB2FA, - 0x30E349B1, 0xC288CAB2, 0xD1D83946, 0x23B3BA45, - 0xF779DEAE, 0x05125DAD, 0x1642AE59, 0xE4292D5A, - 0xBA3A117E, 0x4851927D, 0x5B016189, 0xA96AE28A, - 0x7DA08661, 0x8FCB0562, 0x9C9BF696, 0x6EF07595, - 0x417B1DBC, 0xB3109EBF, 0xA0406D4B, 0x522BEE48, - 0x86E18AA3, 0x748A09A0, 0x67DAFA54, 0x95B17957, - 0xCBA24573, 0x39C9C670, 0x2A993584, 0xD8F2B687, - 0x0C38D26C, 0xFE53516F, 0xED03A29B, 0x1F682198, - 0x5125DAD3, 0xA34E59D0, 0xB01EAA24, 0x42752927, - 0x96BF4DCC, 0x64D4CECF, 0x77843D3B, 0x85EFBE38, - 0xDBFC821C, 0x2997011F, 0x3AC7F2EB, 0xC8AC71E8, - 0x1C661503, 0xEE0D9600, 0xFD5D65F4, 0x0F36E6F7, - 0x61C69362, 0x93AD1061, 0x80FDE395, 0x72966096, - 0xA65C047D, 0x5437877E, 0x4767748A, 0xB50CF789, - 0xEB1FCBAD, 0x197448AE, 0x0A24BB5A, 0xF84F3859, - 0x2C855CB2, 0xDEEEDFB1, 0xCDBE2C45, 0x3FD5AF46, - 0x7198540D, 0x83F3D70E, 0x90A324FA, 0x62C8A7F9, - 0xB602C312, 0x44694011, 0x5739B3E5, 0xA55230E6, - 0xFB410CC2, 0x092A8FC1, 0x1A7A7C35, 0xE811FF36, - 0x3CDB9BDD, 0xCEB018DE, 0xDDE0EB2A, 0x2F8B6829, - 0x82F63B78, 0x709DB87B, 0x63CD4B8F, 0x91A6C88C, - 0x456CAC67, 0xB7072F64, 0xA457DC90, 0x563C5F93, - 0x082F63B7, 0xFA44E0B4, 0xE9141340, 0x1B7F9043, - 0xCFB5F4A8, 0x3DDE77AB, 0x2E8E845F, 0xDCE5075C, - 0x92A8FC17, 0x60C37F14, 0x73938CE0, 0x81F80FE3, - 0x55326B08, 0xA759E80B, 0xB4091BFF, 0x466298FC, - 0x1871A4D8, 0xEA1A27DB, 0xF94AD42F, 0x0B21572C, - 0xDFEB33C7, 0x2D80B0C4, 0x3ED04330, 0xCCBBC033, - 0xA24BB5A6, 0x502036A5, 0x4370C551, 0xB11B4652, - 0x65D122B9, 0x97BAA1BA, 0x84EA524E, 0x7681D14D, - 0x2892ED69, 0xDAF96E6A, 0xC9A99D9E, 0x3BC21E9D, - 0xEF087A76, 0x1D63F975, 0x0E330A81, 0xFC588982, - 0xB21572C9, 0x407EF1CA, 0x532E023E, 0xA145813D, - 0x758FE5D6, 0x87E466D5, 0x94B49521, 0x66DF1622, - 0x38CC2A06, 0xCAA7A905, 0xD9F75AF1, 0x2B9CD9F2, - 0xFF56BD19, 0x0D3D3E1A, 0x1E6DCDEE, 0xEC064EED, - 0xC38D26C4, 0x31E6A5C7, 0x22B65633, 0xD0DDD530, - 0x0417B1DB, 0xF67C32D8, 0xE52CC12C, 0x1747422F, - 0x49547E0B, 0xBB3FFD08, 0xA86F0EFC, 0x5A048DFF, - 0x8ECEE914, 0x7CA56A17, 0x6FF599E3, 0x9D9E1AE0, - 0xD3D3E1AB, 0x21B862A8, 0x32E8915C, 0xC083125F, - 0x144976B4, 0xE622F5B7, 0xF5720643, 0x07198540, - 0x590AB964, 0xAB613A67, 0xB831C993, 0x4A5A4A90, - 0x9E902E7B, 0x6CFBAD78, 0x7FAB5E8C, 0x8DC0DD8F, - 0xE330A81A, 0x115B2B19, 0x020BD8ED, 0xF0605BEE, - 0x24AA3F05, 0xD6C1BC06, 0xC5914FF2, 0x37FACCF1, - 0x69E9F0D5, 0x9B8273D6, 0x88D28022, 0x7AB90321, - 0xAE7367CA, 0x5C18E4C9, 0x4F48173D, 0xBD23943E, - 0xF36E6F75, 0x0105EC76, 0x12551F82, 0xE03E9C81, - 0x34F4F86A, 0xC69F7B69, 0xD5CF889D, 0x27A40B9E, - 0x79B737BA, 0x8BDCB4B9, 0x988C474D, 0x6AE7C44E, - 0xBE2DA0A5, 0x4C4623A6, 0x5F16D052, 0xAD7D5351, - ] - -def crc32c(buf): - crc = 0xffffffff - for c in buf: - crc = (crc>>8) ^ crc32c_table[(crc^(ord(c))) & 0xFF] - crc = (~crc) & 0xffffffff - # reverse endianness - return struct.unpack(">I",struct.pack("<I", crc))[0] - -# old checksum (RFC2960) -""" -BASE = 65521 # largest prime smaller than 65536 -def update_adler32(adler, buf): - s1 = adler & 0xffff - s2 = (adler >> 16) & 0xffff - print s1,s2 - - for c in buf: - print ord(c) - s1 = (s1 + ord(c)) % BASE - s2 = (s2 + s1) % BASE - print s1,s2 - return (s2 << 16) + s1 - -def sctp_checksum(buf): - return update_adler32(1, buf) -""" - -sctpchunktypescls = { - 0 : "SCTPChunkData", - 1 : "SCTPChunkInit", - 2 : "SCTPChunkInitAck", - 3 : "SCTPChunkSACK", - 4 : "SCTPChunkHeartbeatReq", - 5 : "SCTPChunkHeartbeatAck", - 6 : "SCTPChunkAbort", - 7 : "SCTPChunkShutdown", - 8 : "SCTPChunkShutdownAck", - 9 : "SCTPChunkError", - 10 : "SCTPChunkCookieEcho", - 11 : "SCTPChunkCookieAck", - 14 : "SCTPChunkShutdownComplete", - } - -sctpchunktypes = { - 0 : "data", - 1 : "init", - 2 : "init-ack", - 3 : "sack", - 4 : "heartbeat-req", - 5 : "heartbeat-ack", - 6 : "abort", - 7 : "shutdown", - 8 : "shutdown-ack", - 9 : "error", - 10 : "cookie-echo", - 11 : "cookie-ack", - 14 : "shutdown-complete", - } - -sctpchunkparamtypescls = { - 1 : "SCTPChunkParamHearbeatInfo", - 5 : "SCTPChunkParamIPv4Addr", - 6 : "SCTPChunkParamIPv6Addr", - 7 : "SCTPChunkParamStateCookie", - 8 : "SCTPChunkParamUnrocognizedParam", - 9 : "SCTPChunkParamCookiePreservative", - 11 : "SCTPChunkParamHostname", - 12 : "SCTPChunkParamSupportedAddrTypes", - 32768 : "SCTPChunkParamECNCapable", - 49152 : "SCTPChunkParamFwdTSN", - 49158 : "SCTPChunkParamAdaptationLayer", - } - -sctpchunkparamtypes = { - 1 : "heartbeat-info", - 5 : "IPv4", - 6 : "IPv6", - 7 : "state-cookie", - 8 : "unrecognized-param", - 9 : "cookie-preservative", - 11 : "hostname", - 12 : "addrtypes", - 32768 : "ecn-capable", - 49152 : "fwd-tsn-supported", - 49158 : "adaptation-layer", - } - -############## SCTP header - -# Dummy class to guess payload type (variable parameters) -class _SCTPChunkGuessPayload: - def default_payload_class(self,p): - if len(p) < 4: - return conf.padding_layer - else: - t = ord(p[0]) - return globals().get(sctpchunktypescls.get(t, "Raw"), conf.raw_layer) - - -class SCTP(_SCTPChunkGuessPayload, Packet): - fields_desc = [ ShortField("sport", None), - ShortField("dport", None), - XIntField("tag", None), - XIntField("chksum", None), ] - def answers(self, other): - if not isinstance(other, SCTP): - return 0 - if conf.checkIPsrc: - if not ((self.sport == other.dport) and - (self.dport == other.sport)): - return 0 - return 1 - def post_build(self, p, pay): - p += pay - if self.chksum is None: - crc = crc32c(str(p)) - p = p[:8]+struct.pack(">I", crc)+p[12:] - return p - -############## SCTP Chunk variable params - -class ChunkParamField(PacketListField): - islist = 1 - holds_packets=1 - def __init__(self, name, default, count_from=None, length_from=None): - PacketListField.__init__(self, name, default, conf.raw_layer, count_from=count_from, length_from=length_from) - def m2i(self, p, m): - cls = conf.raw_layer - if len(m) >= 4: - t = ord(m[0]) * 256 + ord(m[1]) - cls = globals().get(sctpchunkparamtypescls.get(t, "Raw"), conf.raw_layer) - return cls(m) - -# dummy class to avoid Raw() after Chunk params -class _SCTPChunkParam: - def extract_padding(self, s): - return "",s[:] - -class SCTPChunkParamHearbeatInfo(_SCTPChunkParam, Packet): - fields_desc = [ ShortEnumField("type", 1, sctpchunkparamtypes), - FieldLenField("len", None, length_of="data", - adjust = lambda pkt,x:x+4), - PadField(StrLenField("data", "", - length_from=lambda pkt: pkt.len-4), - 4, padwith="\x00"),] - -class SCTPChunkParamIPv4Addr(_SCTPChunkParam, Packet): - fields_desc = [ ShortEnumField("type", 5, sctpchunkparamtypes), - ShortField("len", 8), - IPField("addr","127.0.0.1"), ] - -class SCTPChunkParamIPv6Addr(_SCTPChunkParam, Packet): - fields_desc = [ ShortEnumField("type", 6, sctpchunkparamtypes), - ShortField("len", 20), - IP6Field("addr","::1"), ] - -class SCTPChunkParamStateCookie(_SCTPChunkParam, Packet): - fields_desc = [ ShortEnumField("type", 7, sctpchunkparamtypes), - FieldLenField("len", None, length_of="cookie", - adjust = lambda pkt,x:x+4), - PadField(StrLenField("cookie", "", - length_from=lambda pkt: pkt.len-4), - 4, padwith="\x00"),] - -class SCTPChunkParamUnrocognizedParam(_SCTPChunkParam, Packet): - fields_desc = [ ShortEnumField("type", 8, sctpchunkparamtypes), - FieldLenField("len", None, length_of="param", - adjust = lambda pkt,x:x+4), - PadField(StrLenField("param", "", - length_from=lambda pkt: pkt.len-4), - 4, padwith="\x00"),] - -class SCTPChunkParamCookiePreservative(_SCTPChunkParam, Packet): - fields_desc = [ ShortEnumField("type", 9, sctpchunkparamtypes), - ShortField("len", 8), - XIntField("sug_cookie_inc", None), ] - -class SCTPChunkParamHostname(_SCTPChunkParam, Packet): - fields_desc = [ ShortEnumField("type", 11, sctpchunkparamtypes), - FieldLenField("len", None, length_of="hostname", - adjust = lambda pkt,x:x+4), - PadField(StrLenField("hostname", "", - length_from=lambda pkt: pkt.len-4), - 4, padwith="\x00"), ] - -class SCTPChunkParamSupportedAddrTypes(_SCTPChunkParam, Packet): - fields_desc = [ ShortEnumField("type", 12, sctpchunkparamtypes), - FieldLenField("len", None, length_of="addr_type_list", - adjust = lambda pkt,x:x+4), - PadField(FieldListField("addr_type_list", [ "IPv4" ], - ShortEnumField("addr_type", 5, sctpchunkparamtypes), - length_from=lambda pkt: pkt.len-4), - 4, padwith="\x00"), ] - -class SCTPChunkParamECNCapable(_SCTPChunkParam, Packet): - fields_desc = [ ShortEnumField("type", 32768, sctpchunkparamtypes), - ShortField("len", 4), ] - -class SCTPChunkParamFwdTSN(_SCTPChunkParam, Packet): - fields_desc = [ ShortEnumField("type", 49152, sctpchunkparamtypes), - ShortField("len", 4), ] - -class SCTPChunkParamAdaptationLayer(_SCTPChunkParam, Packet): - fields_desc = [ ShortEnumField("type", 49158, sctpchunkparamtypes), - ShortField("len", 8), - XIntField("indication", None), ] - -############## SCTP Chunks - -class SCTPChunkData(_SCTPChunkGuessPayload, Packet): - fields_desc = [ ByteEnumField("type", 0, sctpchunktypes), - BitField("reserved", None, 4), - BitField("delay_sack", 0, 1), - BitField("unordered", 0, 1), - BitField("beginning", 0, 1), - BitField("ending", 0, 1), - FieldLenField("len", None, length_of="data", adjust = lambda pkt,x:x+16), - XIntField("tsn", None), - XShortField("stream_id", None), - XShortField("stream_seq", None), - XIntField("proto_id", None), - PadField(StrLenField("data", None, length_from=lambda pkt: pkt.len-16), - 4, padwith="\x00"), - ] - -class SCTPChunkInit(_SCTPChunkGuessPayload, Packet): - fields_desc = [ ByteEnumField("type", 1, sctpchunktypes), - XByteField("flags", None), - FieldLenField("len", None, length_of="params", adjust = lambda pkt,x:x+20), - XIntField("init_tag", None), - IntField("a_rwnd", None), - ShortField("n_out_streams", None), - ShortField("n_in_streams", None), - XIntField("init_tsn", None), - ChunkParamField("params", None, length_from=lambda pkt:pkt.len-20), - ] - -class SCTPChunkInitAck(_SCTPChunkGuessPayload, Packet): - fields_desc = [ ByteEnumField("type", 2, sctpchunktypes), - XByteField("flags", None), - FieldLenField("len", None, length_of="params", adjust = lambda pkt,x:x+20), - XIntField("init_tag", None), - IntField("a_rwnd", None), - ShortField("n_out_streams", None), - ShortField("n_in_streams", None), - XIntField("init_tsn", None), - ChunkParamField("params", None, length_from=lambda pkt:pkt.len-20), - ] - -class GapAckField(Field): - def __init__(self, name, default): - Field.__init__(self, name, default, "4s") - def i2m(self, pkt, x): - if x is None: - return "\0\0\0\0" - sta, end = map(int, x.split(":")) - args = tuple([">HH", sta, end]) - return struct.pack(*args) - def m2i(self, pkt, x): - return "%d:%d"%(struct.unpack(">HH", x)) - def any2i(self, pkt, x): - if type(x) is tuple and len(x) == 2: - return "%d:%d"%(x) - return x - -class SCTPChunkSACK(_SCTPChunkGuessPayload, Packet): - fields_desc = [ ByteEnumField("type", 3, sctpchunktypes), - XByteField("flags", None), - ShortField("len", None), - XIntField("cumul_tsn_ack", None), - IntField("a_rwnd", None), - FieldLenField("n_gap_ack", None, count_of="gap_ack_list"), - FieldLenField("n_dup_tsn", None, count_of="dup_tsn_list"), - FieldListField("gap_ack_list", [ ], GapAckField("gap_ack", None), count_from=lambda pkt:pkt.n_gap_ack), - FieldListField("dup_tsn_list", [ ], XIntField("dup_tsn", None), count_from=lambda pkt:pkt.n_dup_tsn), - ] - - def post_build(self, p, pay): - if self.len is None: - p = p[:2] + struct.pack(">H", len(p)) + p[4:] - return p+pay - - -class SCTPChunkHeartbeatReq(_SCTPChunkGuessPayload, Packet): - fields_desc = [ ByteEnumField("type", 4, sctpchunktypes), - XByteField("flags", None), - FieldLenField("len", None, length_of="params", adjust = lambda pkt,x:x+4), - ChunkParamField("params", None, length_from=lambda pkt:pkt.len-4), - ] - -class SCTPChunkHeartbeatAck(_SCTPChunkGuessPayload, Packet): - fields_desc = [ ByteEnumField("type", 5, sctpchunktypes), - XByteField("flags", None), - FieldLenField("len", None, length_of="params", adjust = lambda pkt,x:x+4), - ChunkParamField("params", None, length_from=lambda pkt:pkt.len-4), - ] - -class SCTPChunkAbort(_SCTPChunkGuessPayload, Packet): - fields_desc = [ ByteEnumField("type", 6, sctpchunktypes), - BitField("reserved", None, 7), - BitField("TCB", 0, 1), - FieldLenField("len", None, length_of="error_causes", adjust = lambda pkt,x:x+4), - PadField(StrLenField("error_causes", "", length_from=lambda pkt: pkt.len-4), - 4, padwith="\x00"), - ] - -class SCTPChunkShutdown(_SCTPChunkGuessPayload, Packet): - fields_desc = [ ByteEnumField("type", 7, sctpchunktypes), - XByteField("flags", None), - ShortField("len", 8), - XIntField("cumul_tsn_ack", None), - ] - -class SCTPChunkShutdownAck(_SCTPChunkGuessPayload, Packet): - fields_desc = [ ByteEnumField("type", 8, sctpchunktypes), - XByteField("flags", None), - ShortField("len", 4), - ] - -class SCTPChunkError(_SCTPChunkGuessPayload, Packet): - fields_desc = [ ByteEnumField("type", 9, sctpchunktypes), - XByteField("flags", None), - FieldLenField("len", None, length_of="error_causes", adjust = lambda pkt,x:x+4), - PadField(StrLenField("error_causes", "", length_from=lambda pkt: pkt.len-4), - 4, padwith="\x00"), - ] - -class SCTPChunkCookieEcho(_SCTPChunkGuessPayload, Packet): - fields_desc = [ ByteEnumField("type", 10, sctpchunktypes), - XByteField("flags", None), - FieldLenField("len", None, length_of="cookie", adjust = lambda pkt,x:x+4), - PadField(StrLenField("cookie", "", length_from=lambda pkt: pkt.len-4), - 4, padwith="\x00"), - ] - -class SCTPChunkCookieAck(_SCTPChunkGuessPayload, Packet): - fields_desc = [ ByteEnumField("type", 11, sctpchunktypes), - XByteField("flags", None), - ShortField("len", 4), - ] - -class SCTPChunkShutdownComplete(_SCTPChunkGuessPayload, Packet): - fields_desc = [ ByteEnumField("type", 12, sctpchunktypes), - BitField("reserved", None, 7), - BitField("TCB", 0, 1), - ShortField("len", 4), - ] - -bind_layers( IP, SCTP, proto=IPPROTO_SCTP) - diff --git a/scripts/external_libs/scapy-2.3.1/scapy/layers/sebek.py b/scripts/external_libs/scapy-2.3.1/scapy/layers/sebek.py deleted file mode 100644 index c54e6728..00000000 --- a/scripts/external_libs/scapy-2.3.1/scapy/layers/sebek.py +++ /dev/null @@ -1,109 +0,0 @@ -## This file is part of Scapy -## See http://www.secdev.org/projects/scapy for more informations -## Copyright (C) Philippe Biondi <phil@secdev.org> -## This program is published under a GPLv2 license - -""" -Sebek: Linux kernel module for data collection on honeypots. -""" - -from scapy.fields import * -from scapy.packet import * -from scapy.layers.inet import UDP - - -### SEBEK - - -class SebekHead(Packet): - name = "Sebek header" - fields_desc = [ XIntField("magic", 0xd0d0d0), - ShortField("version", 1), - ShortEnumField("type", 0, {"read":0, "write":1, - "socket":2, "open":3}), - IntField("counter", 0), - IntField("time_sec", 0), - IntField("time_usec", 0) ] - def mysummary(self): - return self.sprintf("Sebek Header v%SebekHead.version% %SebekHead.type%") - -# we need this because Sebek headers differ between v1 and v3, and -# between v3 type socket and v3 others - -class SebekV1(Packet): - name = "Sebek v1" - fields_desc = [ IntField("pid", 0), - IntField("uid", 0), - IntField("fd", 0), - StrFixedLenField("command", "", 12), - FieldLenField("data_length", None, "data",fmt="I"), - StrLenField("data", "", length_from=lambda x:x.data_length) ] - def mysummary(self): - if isinstance(self.underlayer, SebekHead): - return self.underlayer.sprintf("Sebek v1 %SebekHead.type% (%SebekV1.command%)") - else: - return self.sprintf("Sebek v1 (%SebekV1.command%)") - -class SebekV3(Packet): - name = "Sebek v3" - fields_desc = [ IntField("parent_pid", 0), - IntField("pid", 0), - IntField("uid", 0), - IntField("fd", 0), - IntField("inode", 0), - StrFixedLenField("command", "", 12), - FieldLenField("data_length", None, "data",fmt="I"), - StrLenField("data", "", length_from=lambda x:x.data_length) ] - def mysummary(self): - if isinstance(self.underlayer, SebekHead): - return self.underlayer.sprintf("Sebek v%SebekHead.version% %SebekHead.type% (%SebekV3.command%)") - else: - return self.sprintf("Sebek v3 (%SebekV3.command%)") - -class SebekV2(SebekV3): - def mysummary(self): - if isinstance(self.underlayer, SebekHead): - return self.underlayer.sprintf("Sebek v%SebekHead.version% %SebekHead.type% (%SebekV2.command%)") - else: - return self.sprintf("Sebek v2 (%SebekV2.command%)") - -class SebekV3Sock(Packet): - name = "Sebek v2 socket" - fields_desc = [ IntField("parent_pid", 0), - IntField("pid", 0), - IntField("uid", 0), - IntField("fd", 0), - IntField("inode", 0), - StrFixedLenField("command", "", 12), - IntField("data_length", 15), - IPField("dip", "127.0.0.1"), - ShortField("dport", 0), - IPField("sip", "127.0.0.1"), - ShortField("sport", 0), - ShortEnumField("call", 0, { "bind":2, - "connect":3, "listen":4, - "accept":5, "sendmsg":16, - "recvmsg":17, "sendto":11, - "recvfrom":12}), - ByteEnumField("proto", 0, IP_PROTOS) ] - def mysummary(self): - if isinstance(self.underlayer, SebekHead): - return self.underlayer.sprintf("Sebek v%SebekHead.version% %SebekHead.type% (%SebekV3Sock.command%)") - else: - return self.sprintf("Sebek v3 socket (%SebekV3Sock.command%)") - -class SebekV2Sock(SebekV3Sock): - def mysummary(self): - if isinstance(self.underlayer, SebekHead): - return self.underlayer.sprintf("Sebek v%SebekHead.version% %SebekHead.type% (%SebekV2Sock.command%)") - else: - return self.sprintf("Sebek v2 socket (%SebekV2Sock.command%)") - -bind_layers( UDP, SebekHead, sport=1101) -bind_layers( UDP, SebekHead, dport=1101) -bind_layers( UDP, SebekHead, dport=1101, sport=1101) -bind_layers( SebekHead, SebekV1, version=1) -bind_layers( SebekHead, SebekV2Sock, version=2, type=2) -bind_layers( SebekHead, SebekV2, version=2) -bind_layers( SebekHead, SebekV3Sock, version=3, type=2) -bind_layers( SebekHead, SebekV3, version=3) diff --git a/scripts/external_libs/scapy-2.3.1/scapy/layers/skinny.py b/scripts/external_libs/scapy-2.3.1/scapy/layers/skinny.py deleted file mode 100644 index 9fb6ac06..00000000 --- a/scripts/external_libs/scapy-2.3.1/scapy/layers/skinny.py +++ /dev/null @@ -1,161 +0,0 @@ -## This file is part of Scapy -## See http://www.secdev.org/projects/scapy for more informations -## Copyright (C) Philippe Biondi <phil@secdev.org> -## This program is published under a GPLv2 license - -""" -Cisco Skinny protocol. -""" - -from scapy.packet import * -from scapy.fields import * -from scapy.layers.inet import TCP - -# shamelessly ripped from Ethereal dissector -skinny_messages = { -# Station -> Callmanager - 0x0000: "KeepAliveMessage", - 0x0001: "RegisterMessage", - 0x0002: "IpPortMessage", - 0x0003: "KeypadButtonMessage", - 0x0004: "EnblocCallMessage", - 0x0005: "StimulusMessage", - 0x0006: "OffHookMessage", - 0x0007: "OnHookMessage", - 0x0008: "HookFlashMessage", - 0x0009: "ForwardStatReqMessage", - 0x000A: "SpeedDialStatReqMessage", - 0x000B: "LineStatReqMessage", - 0x000C: "ConfigStatReqMessage", - 0x000D: "TimeDateReqMessage", - 0x000E: "ButtonTemplateReqMessage", - 0x000F: "VersionReqMessage", - 0x0010: "CapabilitiesResMessage", - 0x0011: "MediaPortListMessage", - 0x0012: "ServerReqMessage", - 0x0020: "AlarmMessage", - 0x0021: "MulticastMediaReceptionAck", - 0x0022: "OpenReceiveChannelAck", - 0x0023: "ConnectionStatisticsRes", - 0x0024: "OffHookWithCgpnMessage", - 0x0025: "SoftKeySetReqMessage", - 0x0026: "SoftKeyEventMessage", - 0x0027: "UnregisterMessage", - 0x0028: "SoftKeyTemplateReqMessage", - 0x0029: "RegisterTokenReq", - 0x002A: "MediaTransmissionFailure", - 0x002B: "HeadsetStatusMessage", - 0x002C: "MediaResourceNotification", - 0x002D: "RegisterAvailableLinesMessage", - 0x002E: "DeviceToUserDataMessage", - 0x002F: "DeviceToUserDataResponseMessage", - 0x0030: "UpdateCapabilitiesMessage", - 0x0031: "OpenMultiMediaReceiveChannelAckMessage", - 0x0032: "ClearConferenceMessage", - 0x0033: "ServiceURLStatReqMessage", - 0x0034: "FeatureStatReqMessage", - 0x0035: "CreateConferenceResMessage", - 0x0036: "DeleteConferenceResMessage", - 0x0037: "ModifyConferenceResMessage", - 0x0038: "AddParticipantResMessage", - 0x0039: "AuditConferenceResMessage", - 0x0040: "AuditParticipantResMessage", - 0x0041: "DeviceToUserDataVersion1Message", -# Callmanager -> Station */ - 0x0081: "RegisterAckMessage", - 0x0082: "StartToneMessage", - 0x0083: "StopToneMessage", - 0x0085: "SetRingerMessage", - 0x0086: "SetLampMessage", - 0x0087: "SetHkFDetectMessage", - 0x0088: "SetSpeakerModeMessage", - 0x0089: "SetMicroModeMessage", - 0x008A: "StartMediaTransmission", - 0x008B: "StopMediaTransmission", - 0x008C: "StartMediaReception", - 0x008D: "StopMediaReception", - 0x008F: "CallInfoMessage", - 0x0090: "ForwardStatMessage", - 0x0091: "SpeedDialStatMessage", - 0x0092: "LineStatMessage", - 0x0093: "ConfigStatMessage", - 0x0094: "DefineTimeDate", - 0x0095: "StartSessionTransmission", - 0x0096: "StopSessionTransmission", - 0x0097: "ButtonTemplateMessage", - 0x0098: "VersionMessage", - 0x0099: "DisplayTextMessage", - 0x009A: "ClearDisplay", - 0x009B: "CapabilitiesReqMessage", - 0x009C: "EnunciatorCommandMessage", - 0x009D: "RegisterRejectMessage", - 0x009E: "ServerResMessage", - 0x009F: "Reset", - 0x0100: "KeepAliveAckMessage", - 0x0101: "StartMulticastMediaReception", - 0x0102: "StartMulticastMediaTransmission", - 0x0103: "StopMulticastMediaReception", - 0x0104: "StopMulticastMediaTransmission", - 0x0105: "OpenReceiveChannel", - 0x0106: "CloseReceiveChannel", - 0x0107: "ConnectionStatisticsReq", - 0x0108: "SoftKeyTemplateResMessage", - 0x0109: "SoftKeySetResMessage", - 0x0110: "SelectSoftKeysMessage", - 0x0111: "CallStateMessage", - 0x0112: "DisplayPromptStatusMessage", - 0x0113: "ClearPromptStatusMessage", - 0x0114: "DisplayNotifyMessage", - 0x0115: "ClearNotifyMessage", - 0x0116: "ActivateCallPlaneMessage", - 0x0117: "DeactivateCallPlaneMessage", - 0x0118: "UnregisterAckMessage", - 0x0119: "BackSpaceReqMessage", - 0x011A: "RegisterTokenAck", - 0x011B: "RegisterTokenReject", - 0x0042: "DeviceToUserDataResponseVersion1Message", - 0x011C: "StartMediaFailureDetection", - 0x011D: "DialedNumberMessage", - 0x011E: "UserToDeviceDataMessage", - 0x011F: "FeatureStatMessage", - 0x0120: "DisplayPriNotifyMessage", - 0x0121: "ClearPriNotifyMessage", - 0x0122: "StartAnnouncementMessage", - 0x0123: "StopAnnouncementMessage", - 0x0124: "AnnouncementFinishMessage", - 0x0127: "NotifyDtmfToneMessage", - 0x0128: "SendDtmfToneMessage", - 0x0129: "SubscribeDtmfPayloadReqMessage", - 0x012A: "SubscribeDtmfPayloadResMessage", - 0x012B: "SubscribeDtmfPayloadErrMessage", - 0x012C: "UnSubscribeDtmfPayloadReqMessage", - 0x012D: "UnSubscribeDtmfPayloadResMessage", - 0x012E: "UnSubscribeDtmfPayloadErrMessage", - 0x012F: "ServiceURLStatMessage", - 0x0130: "CallSelectStatMessage", - 0x0131: "OpenMultiMediaChannelMessage", - 0x0132: "StartMultiMediaTransmission", - 0x0133: "StopMultiMediaTransmission", - 0x0134: "MiscellaneousCommandMessage", - 0x0135: "FlowControlCommandMessage", - 0x0136: "CloseMultiMediaReceiveChannel", - 0x0137: "CreateConferenceReqMessage", - 0x0138: "DeleteConferenceReqMessage", - 0x0139: "ModifyConferenceReqMessage", - 0x013A: "AddParticipantReqMessage", - 0x013B: "DropParticipantReqMessage", - 0x013C: "AuditConferenceReqMessage", - 0x013D: "AuditParticipantReqMessage", - 0x013F: "UserToDeviceDataVersion1Message", - } - - - -class Skinny(Packet): - name="Skinny" - fields_desc = [ LEIntField("len",0), - LEIntField("res",0), - LEIntEnumField("msg",0,skinny_messages) ] - -bind_layers( TCP, Skinny, dport=2000) -bind_layers( TCP, Skinny, sport=2000) diff --git a/scripts/external_libs/scapy-2.3.1/scapy/layers/smb.py b/scripts/external_libs/scapy-2.3.1/scapy/layers/smb.py deleted file mode 100644 index 73ebe5b1..00000000 --- a/scripts/external_libs/scapy-2.3.1/scapy/layers/smb.py +++ /dev/null @@ -1,354 +0,0 @@ -## This file is part of Scapy -## See http://www.secdev.org/projects/scapy for more informations -## Copyright (C) Philippe Biondi <phil@secdev.org> -## This program is published under a GPLv2 license - -""" -SMB (Server Message Block), also known as CIFS. -""" - -from scapy.packet import * -from scapy.fields import * -from scapy.layers.netbios import NBTSession - - -# SMB NetLogon Response Header -class SMBNetlogon_Protocol_Response_Header(Packet): - name="SMBNetlogon Protocol Response Header" - fields_desc = [StrFixedLenField("Start","\xffSMB",4), - ByteEnumField("Command",0x25,{0x25:"Trans"}), - ByteField("Error_Class",0x02), - ByteField("Reserved",0), - LEShortField("Error_code",4), - ByteField("Flags",0), - LEShortField("Flags2",0x0000), - LEShortField("PIDHigh",0x0000), - LELongField("Signature",0x0), - LEShortField("Unused",0x0), - LEShortField("TID",0), - LEShortField("PID",0), - LEShortField("UID",0), - LEShortField("MID",0), - ByteField("WordCount",17), - LEShortField("TotalParamCount",0), - LEShortField("TotalDataCount",112), - LEShortField("MaxParamCount",0), - LEShortField("MaxDataCount",0), - ByteField("MaxSetupCount",0), - ByteField("unused2",0), - LEShortField("Flags3",0), - ByteField("TimeOut1",0xe8), - ByteField("TimeOut2",0x03), - LEShortField("unused3",0), - LEShortField("unused4",0), - LEShortField("ParamCount2",0), - LEShortField("ParamOffset",0), - LEShortField("DataCount",112), - LEShortField("DataOffset",92), - ByteField("SetupCount", 3), - ByteField("unused5", 0)] - -# SMB MailSlot Protocol -class SMBMailSlot(Packet): - name = "SMB Mail Slot Protocol" - fields_desc = [LEShortField("opcode", 1), - LEShortField("priority", 1), - LEShortField("class", 2), - LEShortField("size", 135), - StrNullField("name","\MAILSLOT\NET\GETDC660")] - -# SMB NetLogon Protocol Response Tail SAM -class SMBNetlogon_Protocol_Response_Tail_SAM(Packet): - name = "SMB Netlogon Protocol Response Tail SAM" - fields_desc = [ByteEnumField("Command", 0x17, {0x12:"SAM logon request", 0x17:"SAM Active directory Response"}), - ByteField("unused", 0), - ShortField("Data1", 0), - ShortField("Data2", 0xfd01), - ShortField("Data3", 0), - ShortField("Data4", 0xacde), - ShortField("Data5", 0x0fe5), - ShortField("Data6", 0xd10a), - ShortField("Data7", 0x374c), - ShortField("Data8", 0x83e2), - ShortField("Data9", 0x7dd9), - ShortField("Data10", 0x3a16), - ShortField("Data11", 0x73ff), - ByteField("Data12", 0x04), - StrFixedLenField("Data13", "rmff", 4), - ByteField("Data14", 0x0), - ShortField("Data16", 0xc018), - ByteField("Data18", 0x0a), - StrFixedLenField("Data20", "rmff-win2k", 10), - ByteField("Data21", 0xc0), - ShortField("Data22", 0x18c0), - ShortField("Data23", 0x180a), - StrFixedLenField("Data24", "RMFF-WIN2K", 10), - ShortField("Data25", 0), - ByteField("Data26", 0x17), - StrFixedLenField("Data27", "Default-First-Site-Name", 23), - ShortField("Data28", 0x00c0), - ShortField("Data29", 0x3c10), - ShortField("Data30", 0x00c0), - ShortField("Data31", 0x0200), - ShortField("Data32", 0x0), - ShortField("Data33", 0xac14), - ShortField("Data34", 0x0064), - ShortField("Data35", 0x0), - ShortField("Data36", 0x0), - ShortField("Data37", 0x0), - ShortField("Data38", 0x0), - ShortField("Data39", 0x0d00), - ShortField("Data40", 0x0), - ShortField("Data41", 0xffff)] - -# SMB NetLogon Protocol Response Tail LM2.0 -class SMBNetlogon_Protocol_Response_Tail_LM20(Packet): - name = "SMB Netlogon Protocol Response Tail LM20" - fields_desc = [ByteEnumField("Command",0x06,{0x06:"LM 2.0 Response to logon request"}), - ByteField("unused", 0), - StrFixedLenField("DblSlash", "\\\\", 2), - StrNullField("ServerName","WIN"), - LEShortField("LM20Token", 0xffff)] - -# SMBNegociate Protocol Request Header -class SMBNegociate_Protocol_Request_Header(Packet): - name="SMBNegociate Protocol Request Header" - fields_desc = [StrFixedLenField("Start","\xffSMB",4), - ByteEnumField("Command",0x72,{0x72:"SMB_COM_NEGOTIATE"}), - ByteField("Error_Class",0), - ByteField("Reserved",0), - LEShortField("Error_code",0), - ByteField("Flags",0x18), - LEShortField("Flags2",0x0000), - LEShortField("PIDHigh",0x0000), - LELongField("Signature",0x0), - LEShortField("Unused",0x0), - LEShortField("TID",0), - LEShortField("PID",1), - LEShortField("UID",0), - LEShortField("MID",2), - ByteField("WordCount",0), - LEShortField("ByteCount",12)] - -# SMB Negociate Protocol Request Tail -class SMBNegociate_Protocol_Request_Tail(Packet): - name="SMB Negociate Protocol Request Tail" - fields_desc=[ByteField("BufferFormat",0x02), - StrNullField("BufferData","NT LM 0.12")] - -# SMBNegociate Protocol Response Advanced Security -class SMBNegociate_Protocol_Response_Advanced_Security(Packet): - name="SMBNegociate Protocol Response Advanced Security" - fields_desc = [StrFixedLenField("Start","\xffSMB",4), - ByteEnumField("Command",0x72,{0x72:"SMB_COM_NEGOTIATE"}), - ByteField("Error_Class",0), - ByteField("Reserved",0), - LEShortField("Error_Code",0), - ByteField("Flags",0x98), - LEShortField("Flags2",0x0000), - LEShortField("PIDHigh",0x0000), - LELongField("Signature",0x0), - LEShortField("Unused",0x0), - LEShortField("TID",0), - LEShortField("PID",1), - LEShortField("UID",0), - LEShortField("MID",2), - ByteField("WordCount",17), - LEShortField("DialectIndex",7), - ByteField("SecurityMode",0x03), - LEShortField("MaxMpxCount",50), - LEShortField("MaxNumberVC",1), - LEIntField("MaxBufferSize",16144), - LEIntField("MaxRawSize",65536), - LEIntField("SessionKey",0x0000), - LEShortField("ServerCapabilities",0xf3f9), - BitField("UnixExtensions",0,1), - BitField("Reserved2",0,7), - BitField("ExtendedSecurity",1,1), - BitField("CompBulk",0,2), - BitField("Reserved3",0,5), -# There have been 127490112000000000 tenths of micro-seconds between 1st january 1601 and 1st january 2005. 127490112000000000=0x1C4EF94D6228000, so ServerTimeHigh=0xD6228000 and ServerTimeLow=0x1C4EF94. - LEIntField("ServerTimeHigh",0xD6228000L), - LEIntField("ServerTimeLow",0x1C4EF94), - LEShortField("ServerTimeZone",0x3c), - ByteField("EncryptionKeyLength",0), - LEFieldLenField("ByteCount", None, "SecurityBlob", adjust=lambda pkt,x:x-16), - BitField("GUID",0,128), - StrLenField("SecurityBlob", "", length_from=lambda x:x.ByteCount+16)] - -# SMBNegociate Protocol Response No Security -# When using no security, with EncryptionKeyLength=8, you must have an EncryptionKey before the DomainName -class SMBNegociate_Protocol_Response_No_Security(Packet): - name="SMBNegociate Protocol Response No Security" - fields_desc = [StrFixedLenField("Start","\xffSMB",4), - ByteEnumField("Command",0x72,{0x72:"SMB_COM_NEGOTIATE"}), - ByteField("Error_Class",0), - ByteField("Reserved",0), - LEShortField("Error_Code",0), - ByteField("Flags",0x98), - LEShortField("Flags2",0x0000), - LEShortField("PIDHigh",0x0000), - LELongField("Signature",0x0), - LEShortField("Unused",0x0), - LEShortField("TID",0), - LEShortField("PID",1), - LEShortField("UID",0), - LEShortField("MID",2), - ByteField("WordCount",17), - LEShortField("DialectIndex",7), - ByteField("SecurityMode",0x03), - LEShortField("MaxMpxCount",50), - LEShortField("MaxNumberVC",1), - LEIntField("MaxBufferSize",16144), - LEIntField("MaxRawSize",65536), - LEIntField("SessionKey",0x0000), - LEShortField("ServerCapabilities",0xf3f9), - BitField("UnixExtensions",0,1), - BitField("Reserved2",0,7), - BitField("ExtendedSecurity",0,1), - FlagsField("CompBulk",0,2,"CB"), - BitField("Reserved3",0,5), - # There have been 127490112000000000 tenths of micro-seconds between 1st january 1601 and 1st january 2005. 127490112000000000=0x1C4EF94D6228000, so ServerTimeHigh=0xD6228000 and ServerTimeLow=0x1C4EF94. - LEIntField("ServerTimeHigh",0xD6228000L), - LEIntField("ServerTimeLow",0x1C4EF94), - LEShortField("ServerTimeZone",0x3c), - ByteField("EncryptionKeyLength",8), - LEShortField("ByteCount",24), - BitField("EncryptionKey",0,64), - StrNullField("DomainName","WORKGROUP"), - StrNullField("ServerName","RMFF1")] - -# SMBNegociate Protocol Response No Security No Key -class SMBNegociate_Protocol_Response_No_Security_No_Key(Packet): - namez="SMBNegociate Protocol Response No Security No Key" - fields_desc = [StrFixedLenField("Start","\xffSMB",4), - ByteEnumField("Command",0x72,{0x72:"SMB_COM_NEGOTIATE"}), - ByteField("Error_Class",0), - ByteField("Reserved",0), - LEShortField("Error_Code",0), - ByteField("Flags",0x98), - LEShortField("Flags2",0x0000), - LEShortField("PIDHigh",0x0000), - LELongField("Signature",0x0), - LEShortField("Unused",0x0), - LEShortField("TID",0), - LEShortField("PID",1), - LEShortField("UID",0), - LEShortField("MID",2), - ByteField("WordCount",17), - LEShortField("DialectIndex",7), - ByteField("SecurityMode",0x03), - LEShortField("MaxMpxCount",50), - LEShortField("MaxNumberVC",1), - LEIntField("MaxBufferSize",16144), - LEIntField("MaxRawSize",65536), - LEIntField("SessionKey",0x0000), - LEShortField("ServerCapabilities",0xf3f9), - BitField("UnixExtensions",0,1), - BitField("Reserved2",0,7), - BitField("ExtendedSecurity",0,1), - FlagsField("CompBulk",0,2,"CB"), - BitField("Reserved3",0,5), - # There have been 127490112000000000 tenths of micro-seconds between 1st january 1601 and 1st january 2005. 127490112000000000=0x1C4EF94D6228000, so ServerTimeHigh=0xD6228000 and ServerTimeLow=0x1C4EF94. - LEIntField("ServerTimeHigh",0xD6228000L), - LEIntField("ServerTimeLow",0x1C4EF94), - LEShortField("ServerTimeZone",0x3c), - ByteField("EncryptionKeyLength",0), - LEShortField("ByteCount",16), - StrNullField("DomainName","WORKGROUP"), - StrNullField("ServerName","RMFF1")] - -# Session Setup AndX Request -class SMBSession_Setup_AndX_Request(Packet): - name="Session Setup AndX Request" - fields_desc=[StrFixedLenField("Start","\xffSMB",4), - ByteEnumField("Command",0x73,{0x73:"SMB_COM_SESSION_SETUP_ANDX"}), - ByteField("Error_Class",0), - ByteField("Reserved",0), - LEShortField("Error_Code",0), - ByteField("Flags",0x18), - LEShortField("Flags2",0x0001), - LEShortField("PIDHigh",0x0000), - LELongField("Signature",0x0), - LEShortField("Unused",0x0), - LEShortField("TID",0), - LEShortField("PID",1), - LEShortField("UID",0), - LEShortField("MID",2), - ByteField("WordCount",13), - ByteEnumField("AndXCommand",0x75,{0x75:"SMB_COM_TREE_CONNECT_ANDX"}), - ByteField("Reserved2",0), - LEShortField("AndXOffset",96), - LEShortField("MaxBufferS",2920), - LEShortField("MaxMPXCount",50), - LEShortField("VCNumber",0), - LEIntField("SessionKey",0), - LEFieldLenField("ANSIPasswordLength",None,"ANSIPassword"), - LEShortField("UnicodePasswordLength",0), - LEIntField("Reserved3",0), - LEShortField("ServerCapabilities",0x05), - BitField("UnixExtensions",0,1), - BitField("Reserved4",0,7), - BitField("ExtendedSecurity",0,1), - BitField("CompBulk",0,2), - BitField("Reserved5",0,5), - LEShortField("ByteCount",35), - StrLenField("ANSIPassword", "Pass",length_from=lambda x:x.ANSIPasswordLength), - StrNullField("Account","GUEST"), - StrNullField("PrimaryDomain", ""), - StrNullField("NativeOS","Windows 4.0"), - StrNullField("NativeLanManager","Windows 4.0"), - ByteField("WordCount2",4), - ByteEnumField("AndXCommand2",0xFF,{0xFF:"SMB_COM_NONE"}), - ByteField("Reserved6",0), - LEShortField("AndXOffset2",0), - LEShortField("Flags3",0x2), - LEShortField("PasswordLength",0x1), - LEShortField("ByteCount2",18), - ByteField("Password",0), - StrNullField("Path","\\\\WIN2K\\IPC$"), - StrNullField("Service","IPC")] - -# Session Setup AndX Response -class SMBSession_Setup_AndX_Response(Packet): - name="Session Setup AndX Response" - fields_desc=[StrFixedLenField("Start","\xffSMB",4), - ByteEnumField("Command",0x73,{0x73:"SMB_COM_SESSION_SETUP_ANDX"}), - ByteField("Error_Class",0), - ByteField("Reserved",0), - LEShortField("Error_Code",0), - ByteField("Flags",0x90), - LEShortField("Flags2",0x1001), - LEShortField("PIDHigh",0x0000), - LELongField("Signature",0x0), - LEShortField("Unused",0x0), - LEShortField("TID",0), - LEShortField("PID",1), - LEShortField("UID",0), - LEShortField("MID",2), - ByteField("WordCount",3), - ByteEnumField("AndXCommand",0x75,{0x75:"SMB_COM_TREE_CONNECT_ANDX"}), - ByteField("Reserved2",0), - LEShortField("AndXOffset",66), - LEShortField("Action",0), - LEShortField("ByteCount",25), - StrNullField("NativeOS","Windows 4.0"), - StrNullField("NativeLanManager","Windows 4.0"), - StrNullField("PrimaryDomain",""), - ByteField("WordCount2",3), - ByteEnumField("AndXCommand2",0xFF,{0xFF:"SMB_COM_NONE"}), - ByteField("Reserved3",0), - LEShortField("AndXOffset2",80), - LEShortField("OptionalSupport",0x01), - LEShortField("ByteCount2",5), - StrNullField("Service","IPC"), - StrNullField("NativeFileSystem","")] - -bind_layers( NBTSession, SMBNegociate_Protocol_Request_Header, ) -bind_layers( NBTSession, SMBNegociate_Protocol_Response_Advanced_Security, ExtendedSecurity=1) -bind_layers( NBTSession, SMBNegociate_Protocol_Response_No_Security, ExtendedSecurity=0, EncryptionKeyLength=8) -bind_layers( NBTSession, SMBNegociate_Protocol_Response_No_Security_No_Key, ExtendedSecurity=0, EncryptionKeyLength=0) -bind_layers( NBTSession, SMBSession_Setup_AndX_Request, ) -bind_layers( NBTSession, SMBSession_Setup_AndX_Response, ) -bind_layers( SMBNegociate_Protocol_Request_Header, SMBNegociate_Protocol_Request_Tail, ) -bind_layers( SMBNegociate_Protocol_Request_Tail, SMBNegociate_Protocol_Request_Tail, ) diff --git a/scripts/external_libs/scapy-2.3.1/scapy/layers/snmp.py b/scripts/external_libs/scapy-2.3.1/scapy/layers/snmp.py deleted file mode 100644 index 2c588250..00000000 --- a/scripts/external_libs/scapy-2.3.1/scapy/layers/snmp.py +++ /dev/null @@ -1,255 +0,0 @@ -## This file is part of Scapy -## See http://www.secdev.org/projects/scapy for more informations -## Copyright (C) Philippe Biondi <phil@secdev.org> -## This program is published under a GPLv2 license - -""" -SNMP (Simple Network Management Protocol). -""" - -from scapy.asn1packet import * -from scapy.asn1fields import * -from scapy.layers.inet import UDP - -########## -## SNMP ## -########## - -######[ ASN1 class ]###### - -class ASN1_Class_SNMP(ASN1_Class_UNIVERSAL): - name="SNMP" - PDU_GET = 0xa0 - PDU_NEXT = 0xa1 - PDU_RESPONSE = 0xa2 - PDU_SET = 0xa3 - PDU_TRAPv1 = 0xa4 - PDU_BULK = 0xa5 - PDU_INFORM = 0xa6 - PDU_TRAPv2 = 0xa7 - - -class ASN1_SNMP_PDU_GET(ASN1_SEQUENCE): - tag = ASN1_Class_SNMP.PDU_GET - -class ASN1_SNMP_PDU_NEXT(ASN1_SEQUENCE): - tag = ASN1_Class_SNMP.PDU_NEXT - -class ASN1_SNMP_PDU_RESPONSE(ASN1_SEQUENCE): - tag = ASN1_Class_SNMP.PDU_RESPONSE - -class ASN1_SNMP_PDU_SET(ASN1_SEQUENCE): - tag = ASN1_Class_SNMP.PDU_SET - -class ASN1_SNMP_PDU_TRAPv1(ASN1_SEQUENCE): - tag = ASN1_Class_SNMP.PDU_TRAPv1 - -class ASN1_SNMP_PDU_BULK(ASN1_SEQUENCE): - tag = ASN1_Class_SNMP.PDU_BULK - -class ASN1_SNMP_PDU_INFORM(ASN1_SEQUENCE): - tag = ASN1_Class_SNMP.PDU_INFORM - -class ASN1_SNMP_PDU_TRAPv2(ASN1_SEQUENCE): - tag = ASN1_Class_SNMP.PDU_TRAPv2 - - -######[ BER codecs ]####### - -class BERcodec_SNMP_PDU_GET(BERcodec_SEQUENCE): - tag = ASN1_Class_SNMP.PDU_GET - -class BERcodec_SNMP_PDU_NEXT(BERcodec_SEQUENCE): - tag = ASN1_Class_SNMP.PDU_NEXT - -class BERcodec_SNMP_PDU_RESPONSE(BERcodec_SEQUENCE): - tag = ASN1_Class_SNMP.PDU_RESPONSE - -class BERcodec_SNMP_PDU_SET(BERcodec_SEQUENCE): - tag = ASN1_Class_SNMP.PDU_SET - -class BERcodec_SNMP_PDU_TRAPv1(BERcodec_SEQUENCE): - tag = ASN1_Class_SNMP.PDU_TRAPv1 - -class BERcodec_SNMP_PDU_BULK(BERcodec_SEQUENCE): - tag = ASN1_Class_SNMP.PDU_BULK - -class BERcodec_SNMP_PDU_INFORM(BERcodec_SEQUENCE): - tag = ASN1_Class_SNMP.PDU_INFORM - -class BERcodec_SNMP_PDU_TRAPv2(BERcodec_SEQUENCE): - tag = ASN1_Class_SNMP.PDU_TRAPv2 - - - -######[ ASN1 fields ]###### - -class ASN1F_SNMP_PDU_GET(ASN1F_SEQUENCE): - ASN1_tag = ASN1_Class_SNMP.PDU_GET - -class ASN1F_SNMP_PDU_NEXT(ASN1F_SEQUENCE): - ASN1_tag = ASN1_Class_SNMP.PDU_NEXT - -class ASN1F_SNMP_PDU_RESPONSE(ASN1F_SEQUENCE): - ASN1_tag = ASN1_Class_SNMP.PDU_RESPONSE - -class ASN1F_SNMP_PDU_SET(ASN1F_SEQUENCE): - ASN1_tag = ASN1_Class_SNMP.PDU_SET - -class ASN1F_SNMP_PDU_TRAPv1(ASN1F_SEQUENCE): - ASN1_tag = ASN1_Class_SNMP.PDU_TRAPv1 - -class ASN1F_SNMP_PDU_BULK(ASN1F_SEQUENCE): - ASN1_tag = ASN1_Class_SNMP.PDU_BULK - -class ASN1F_SNMP_PDU_INFORM(ASN1F_SEQUENCE): - ASN1_tag = ASN1_Class_SNMP.PDU_INFORM - -class ASN1F_SNMP_PDU_TRAPv2(ASN1F_SEQUENCE): - ASN1_tag = ASN1_Class_SNMP.PDU_TRAPv2 - - - -######[ SNMP Packet ]###### - -SNMP_error = { 0: "no_error", - 1: "too_big", - 2: "no_such_name", - 3: "bad_value", - 4: "read_only", - 5: "generic_error", - 6: "no_access", - 7: "wrong_type", - 8: "wrong_length", - 9: "wrong_encoding", - 10: "wrong_value", - 11: "no_creation", - 12: "inconsistent_value", - 13: "ressource_unavailable", - 14: "commit_failed", - 15: "undo_failed", - 16: "authorization_error", - 17: "not_writable", - 18: "inconsistent_name", - } - -SNMP_trap_types = { 0: "cold_start", - 1: "warm_start", - 2: "link_down", - 3: "link_up", - 4: "auth_failure", - 5: "egp_neigh_loss", - 6: "enterprise_specific", - } - -class SNMPvarbind(ASN1_Packet): - ASN1_codec = ASN1_Codecs.BER - ASN1_root = ASN1F_SEQUENCE( ASN1F_OID("oid","1.3"), - ASN1F_field("value",ASN1_NULL(0)) - ) - - -class SNMPget(ASN1_Packet): - ASN1_codec = ASN1_Codecs.BER - ASN1_root = ASN1F_SNMP_PDU_GET( ASN1F_INTEGER("id",0), - ASN1F_enum_INTEGER("error",0, SNMP_error), - ASN1F_INTEGER("error_index",0), - ASN1F_SEQUENCE_OF("varbindlist", [], SNMPvarbind) - ) - -class SNMPnext(ASN1_Packet): - ASN1_codec = ASN1_Codecs.BER - ASN1_root = ASN1F_SNMP_PDU_NEXT( ASN1F_INTEGER("id",0), - ASN1F_enum_INTEGER("error",0, SNMP_error), - ASN1F_INTEGER("error_index",0), - ASN1F_SEQUENCE_OF("varbindlist", [], SNMPvarbind) - ) - -class SNMPresponse(ASN1_Packet): - ASN1_codec = ASN1_Codecs.BER - ASN1_root = ASN1F_SNMP_PDU_RESPONSE( ASN1F_INTEGER("id",0), - ASN1F_enum_INTEGER("error",0, SNMP_error), - ASN1F_INTEGER("error_index",0), - ASN1F_SEQUENCE_OF("varbindlist", [], SNMPvarbind) - ) - -class SNMPset(ASN1_Packet): - ASN1_codec = ASN1_Codecs.BER - ASN1_root = ASN1F_SNMP_PDU_SET( ASN1F_INTEGER("id",0), - ASN1F_enum_INTEGER("error",0, SNMP_error), - ASN1F_INTEGER("error_index",0), - ASN1F_SEQUENCE_OF("varbindlist", [], SNMPvarbind) - ) - -class SNMPtrapv1(ASN1_Packet): - ASN1_codec = ASN1_Codecs.BER - ASN1_root = ASN1F_SNMP_PDU_TRAPv1( ASN1F_OID("enterprise", "1.3"), - ASN1F_IPADDRESS("agent_addr","0.0.0.0"), - ASN1F_enum_INTEGER("generic_trap", 0, SNMP_trap_types), - ASN1F_INTEGER("specific_trap", 0), - ASN1F_TIME_TICKS("time_stamp", IntAutoTime()), - ASN1F_SEQUENCE_OF("varbindlist", [], SNMPvarbind) - ) - -class SNMPbulk(ASN1_Packet): - ASN1_codec = ASN1_Codecs.BER - ASN1_root = ASN1F_SNMP_PDU_BULK( ASN1F_INTEGER("id",0), - ASN1F_INTEGER("non_repeaters",0), - ASN1F_INTEGER("max_repetitions",0), - ASN1F_SEQUENCE_OF("varbindlist", [], SNMPvarbind) - ) - -class SNMPinform(ASN1_Packet): - ASN1_codec = ASN1_Codecs.BER - ASN1_root = ASN1F_SNMP_PDU_INFORM( ASN1F_INTEGER("id",0), - ASN1F_enum_INTEGER("error",0, SNMP_error), - ASN1F_INTEGER("error_index",0), - ASN1F_SEQUENCE_OF("varbindlist", [], SNMPvarbind) - ) - -class SNMPtrapv2(ASN1_Packet): - ASN1_codec = ASN1_Codecs.BER - ASN1_root = ASN1F_SNMP_PDU_TRAPv2( ASN1F_INTEGER("id",0), - ASN1F_enum_INTEGER("error",0, SNMP_error), - ASN1F_INTEGER("error_index",0), - ASN1F_SEQUENCE_OF("varbindlist", [], SNMPvarbind) - ) - - -class SNMP(ASN1_Packet): - ASN1_codec = ASN1_Codecs.BER - ASN1_root = ASN1F_SEQUENCE( - ASN1F_enum_INTEGER("version", 1, {0:"v1", 1:"v2c", 2:"v2", 3:"v3"}), - ASN1F_STRING("community","public"), - ASN1F_CHOICE("PDU", SNMPget(), - SNMPget, SNMPnext, SNMPresponse, SNMPset, - SNMPtrapv1, SNMPbulk, SNMPinform, SNMPtrapv2) - ) - def answers(self, other): - return ( isinstance(self.PDU, SNMPresponse) and - ( isinstance(other.PDU, SNMPget) or - isinstance(other.PDU, SNMPnext) or - isinstance(other.PDU, SNMPset) ) and - self.PDU.id == other.PDU.id ) - -bind_layers( UDP, SNMP, sport=161) -bind_layers( UDP, SNMP, dport=161) -bind_layers( UDP, SNMP, sport=162) -bind_layers( UDP, SNMP, dport=162) - -def snmpwalk(dst, oid="1", community="public"): - try: - while 1: - r = sr1(IP(dst=dst)/UDP(sport=RandShort())/SNMP(community=community, PDU=SNMPnext(varbindlist=[SNMPvarbind(oid=oid)])),timeout=2, chainCC=1, verbose=0, retry=2) - if ICMP in r: - print repr(r) - break - if r is None: - print "No answers" - break - print "%-40s: %r" % (r[SNMPvarbind].oid.val,r[SNMPvarbind].value) - oid = r[SNMPvarbind].oid - - except KeyboardInterrupt: - pass - diff --git a/scripts/external_libs/scapy-2.3.1/scapy/layers/tftp.py b/scripts/external_libs/scapy-2.3.1/scapy/layers/tftp.py deleted file mode 100644 index 1535e99c..00000000 --- a/scripts/external_libs/scapy-2.3.1/scapy/layers/tftp.py +++ /dev/null @@ -1,477 +0,0 @@ -## This file is part of Scapy -## See http://www.secdev.org/projects/scapy for more informations -## Copyright (C) Philippe Biondi <phil@secdev.org> -## This program is published under a GPLv2 license - -""" -TFTP (Trivial File Transfer Protocol). -""" - -import os,random -from scapy.packet import * -from scapy.fields import * -from scapy.automaton import * -from scapy.layers.inet import UDP - - - -TFTP_operations = { 1:"RRQ",2:"WRQ",3:"DATA",4:"ACK",5:"ERROR",6:"OACK" } - - -class TFTP(Packet): - name = "TFTP opcode" - fields_desc = [ ShortEnumField("op", 1, TFTP_operations), ] - - - -class TFTP_RRQ(Packet): - name = "TFTP Read Request" - fields_desc = [ StrNullField("filename", ""), - StrNullField("mode", "octet") ] - def answers(self, other): - return 0 - def mysummary(self): - return self.sprintf("RRQ %filename%"),[UDP] - - -class TFTP_WRQ(Packet): - name = "TFTP Write Request" - fields_desc = [ StrNullField("filename", ""), - StrNullField("mode", "octet") ] - def answers(self, other): - return 0 - def mysummary(self): - return self.sprintf("WRQ %filename%"),[UDP] - -class TFTP_DATA(Packet): - name = "TFTP Data" - fields_desc = [ ShortField("block", 0) ] - def answers(self, other): - return self.block == 1 and isinstance(other, TFTP_RRQ) - def mysummary(self): - return self.sprintf("DATA %block%"),[UDP] - -class TFTP_Option(Packet): - fields_desc = [ StrNullField("oname",""), - StrNullField("value","") ] - def extract_padding(self, pkt): - return "",pkt - -class TFTP_Options(Packet): - fields_desc = [ PacketListField("options", [], TFTP_Option, length_from=lambda x:None) ] - - -class TFTP_ACK(Packet): - name = "TFTP Ack" - fields_desc = [ ShortField("block", 0) ] - def answers(self, other): - if isinstance(other, TFTP_DATA): - return self.block == other.block - elif isinstance(other, TFTP_RRQ) or isinstance(other, TFTP_WRQ) or isinstance(other, TFTP_OACK): - return self.block == 0 - return 0 - def mysummary(self): - return self.sprintf("ACK %block%"),[UDP] - -TFTP_Error_Codes = { 0: "Not defined", - 1: "File not found", - 2: "Access violation", - 3: "Disk full or allocation exceeded", - 4: "Illegal TFTP operation", - 5: "Unknown transfer ID", - 6: "File already exists", - 7: "No such user", - 8: "Terminate transfer due to option negotiation", - } - -class TFTP_ERROR(Packet): - name = "TFTP Error" - fields_desc = [ ShortEnumField("errorcode", 0, TFTP_Error_Codes), - StrNullField("errormsg", "")] - def answers(self, other): - return (isinstance(other, TFTP_DATA) or - isinstance(other, TFTP_RRQ) or - isinstance(other, TFTP_WRQ) or - isinstance(other, TFTP_ACK)) - def mysummary(self): - return self.sprintf("ERROR %errorcode%: %errormsg%"),[UDP] - - -class TFTP_OACK(Packet): - name = "TFTP Option Ack" - fields_desc = [ ] - def answers(self, other): - return isinstance(other, TFTP_WRQ) or isinstance(other, TFTP_RRQ) - - -bind_layers(UDP, TFTP, dport=69) -bind_layers(TFTP, TFTP_RRQ, op=1) -bind_layers(TFTP, TFTP_WRQ, op=2) -bind_layers(TFTP, TFTP_DATA, op=3) -bind_layers(TFTP, TFTP_ACK, op=4) -bind_layers(TFTP, TFTP_ERROR, op=5) -bind_layers(TFTP, TFTP_OACK, op=6) -bind_layers(TFTP_RRQ, TFTP_Options) -bind_layers(TFTP_WRQ, TFTP_Options) -bind_layers(TFTP_OACK, TFTP_Options) - - -class TFTP_read(Automaton): - def parse_args(self, filename, server, sport = None, port=69, **kargs): - Automaton.parse_args(self, **kargs) - self.filename = filename - self.server = server - self.port = port - self.sport = sport - - - def master_filter(self, pkt): - return ( IP in pkt and pkt[IP].src == self.server and UDP in pkt - and pkt[UDP].dport == self.my_tid - and (self.server_tid is None or pkt[UDP].sport == self.server_tid) ) - - # BEGIN - @ATMT.state(initial=1) - def BEGIN(self): - self.blocksize=512 - self.my_tid = self.sport or RandShort()._fix() - bind_bottom_up(UDP, TFTP, dport=self.my_tid) - self.server_tid = None - self.res = "" - - self.l3 = IP(dst=self.server)/UDP(sport=self.my_tid, dport=self.port)/TFTP() - self.last_packet = self.l3/TFTP_RRQ(filename=self.filename, mode="octet") - self.send(self.last_packet) - self.awaiting=1 - - raise self.WAITING() - - # WAITING - @ATMT.state() - def WAITING(self): - pass - - - @ATMT.receive_condition(WAITING) - def receive_data(self, pkt): - if TFTP_DATA in pkt and pkt[TFTP_DATA].block == self.awaiting: - if self.server_tid is None: - self.server_tid = pkt[UDP].sport - self.l3[UDP].dport = self.server_tid - raise self.RECEIVING(pkt) - - @ATMT.receive_condition(WAITING, prio=1) - def receive_error(self, pkt): - if TFTP_ERROR in pkt: - raise self.ERROR(pkt) - - - @ATMT.timeout(WAITING, 3) - def timeout_waiting(self): - raise self.WAITING() - @ATMT.action(timeout_waiting) - def retransmit_last_packet(self): - self.send(self.last_packet) - - @ATMT.action(receive_data) -# @ATMT.action(receive_error) - def send_ack(self): - self.last_packet = self.l3 / TFTP_ACK(block = self.awaiting) - self.send(self.last_packet) - - - # RECEIVED - @ATMT.state() - def RECEIVING(self, pkt): - if conf.raw_layer in pkt: - recvd = pkt[conf.raw_layer].load - else: - recvd = "" - self.res += recvd - self.awaiting += 1 - if len(recvd) == self.blocksize: - raise self.WAITING() - raise self.END() - - # ERROR - @ATMT.state(error=1) - def ERROR(self,pkt): - split_bottom_up(UDP, TFTP, dport=self.my_tid) - return pkt[TFTP_ERROR].summary() - - #END - @ATMT.state(final=1) - def END(self): - split_bottom_up(UDP, TFTP, dport=self.my_tid) - return self.res - - - - -class TFTP_write(Automaton): - def parse_args(self, filename, data, server, sport=None, port=69,**kargs): - Automaton.parse_args(self, **kargs) - self.filename = filename - self.server = server - self.port = port - self.sport = sport - self.blocksize = 512 - self.origdata = data - - def master_filter(self, pkt): - return ( IP in pkt and pkt[IP].src == self.server and UDP in pkt - and pkt[UDP].dport == self.my_tid - and (self.server_tid is None or pkt[UDP].sport == self.server_tid) ) - - - # BEGIN - @ATMT.state(initial=1) - def BEGIN(self): - self.data = [ self.origdata[i*self.blocksize:(i+1)*self.blocksize] - for i in range( len(self.origdata)/self.blocksize+1) ] - self.my_tid = self.sport or RandShort()._fix() - bind_bottom_up(UDP, TFTP, dport=self.my_tid) - self.server_tid = None - - self.l3 = IP(dst=self.server)/UDP(sport=self.my_tid, dport=self.port)/TFTP() - self.last_packet = self.l3/TFTP_WRQ(filename=self.filename, mode="octet") - self.send(self.last_packet) - self.res = "" - self.awaiting=0 - - raise self.WAITING_ACK() - - # WAITING_ACK - @ATMT.state() - def WAITING_ACK(self): - pass - - @ATMT.receive_condition(WAITING_ACK) - def received_ack(self,pkt): - if TFTP_ACK in pkt and pkt[TFTP_ACK].block == self.awaiting: - if self.server_tid is None: - self.server_tid = pkt[UDP].sport - self.l3[UDP].dport = self.server_tid - raise self.SEND_DATA() - - @ATMT.receive_condition(WAITING_ACK) - def received_error(self, pkt): - if TFTP_ERROR in pkt: - raise self.ERROR(pkt) - - @ATMT.timeout(WAITING_ACK, 3) - def timeout_waiting(self): - raise self.WAITING_ACK() - @ATMT.action(timeout_waiting) - def retransmit_last_packet(self): - self.send(self.last_packet) - - # SEND_DATA - @ATMT.state() - def SEND_DATA(self): - self.awaiting += 1 - self.last_packet = self.l3/TFTP_DATA(block=self.awaiting)/self.data.pop(0) - self.send(self.last_packet) - if self.data: - raise self.WAITING_ACK() - raise self.END() - - - # ERROR - @ATMT.state(error=1) - def ERROR(self,pkt): - split_bottom_up(UDP, TFTP, dport=self.my_tid) - return pkt[TFTP_ERROR].summary() - - # END - @ATMT.state(final=1) - def END(self): - split_bottom_up(UDP, TFTP, dport=self.my_tid) - - -class TFTP_WRQ_server(Automaton): - - def parse_args(self, ip=None, sport=None, *args, **kargs): - Automaton.parse_args(self, *args, **kargs) - self.ip = ip - self.sport = sport - - def master_filter(self, pkt): - return TFTP in pkt and (not self.ip or pkt[IP].dst == self.ip) - - @ATMT.state(initial=1) - def BEGIN(self): - self.blksize=512 - self.blk=1 - self.filedata="" - self.my_tid = self.sport or random.randint(10000,65500) - bind_bottom_up(UDP, TFTP, dport=self.my_tid) - - @ATMT.receive_condition(BEGIN) - def receive_WRQ(self,pkt): - if TFTP_WRQ in pkt: - raise self.WAIT_DATA().action_parameters(pkt) - - @ATMT.action(receive_WRQ) - def ack_WRQ(self, pkt): - ip = pkt[IP] - self.ip = ip.dst - self.dst = ip.src - self.filename = pkt[TFTP_WRQ].filename - options = pkt[TFTP_Options] - self.l3 = IP(src=ip.dst, dst=ip.src)/UDP(sport=self.my_tid, dport=pkt.sport)/TFTP() - if options is None: - self.last_packet = self.l3/TFTP_ACK(block=0) - self.send(self.last_packet) - else: - opt = [x for x in options.options if x.oname.upper() == "BLKSIZE"] - if opt: - self.blksize = int(opt[0].value) - self.debug(2,"Negotiated new blksize at %i" % self.blksize) - self.last_packet = self.l3/TFTP_OACK()/TFTP_Options(options=opt) - self.send(self.last_packet) - - @ATMT.state() - def WAIT_DATA(self): - pass - - @ATMT.timeout(WAIT_DATA, 1) - def resend_ack(self): - self.send(self.last_packet) - raise self.WAIT_DATA() - - @ATMT.receive_condition(WAIT_DATA) - def receive_data(self, pkt): - if TFTP_DATA in pkt: - data = pkt[TFTP_DATA] - if data.block == self.blk: - raise self.DATA(data) - - @ATMT.action(receive_data) - def ack_data(self): - self.last_packet = self.l3/TFTP_ACK(block = self.blk) - self.send(self.last_packet) - - @ATMT.state() - def DATA(self, data): - self.filedata += data.load - if len(data.load) < self.blksize: - raise self.END() - self.blk += 1 - raise self.WAIT_DATA() - - @ATMT.state(final=1) - def END(self): - return self.filename,self.filedata - split_bottom_up(UDP, TFTP, dport=self.my_tid) - - -class TFTP_RRQ_server(Automaton): - def parse_args(self, store=None, joker=None, dir=None, ip=None, sport=None, serve_one=False, **kargs): - Automaton.parse_args(self,**kargs) - if store is None: - store = {} - if dir is not None: - self.dir = os.path.join(os.path.abspath(dir),"") - else: - self.dir = None - self.store = store - self.joker = joker - self.ip = ip - self.sport = sport - self.serve_one = serve_one - self.my_tid = self.sport or random.randint(10000,65500) - bind_bottom_up(UDP, TFTP, dport=self.my_tid) - - def master_filter(self, pkt): - return TFTP in pkt and (not self.ip or pkt[IP].dst == self.ip) - - @ATMT.state(initial=1) - def WAIT_RRQ(self): - self.blksize=512 - self.blk=0 - - @ATMT.receive_condition(WAIT_RRQ) - def receive_rrq(self, pkt): - if TFTP_RRQ in pkt: - raise self.RECEIVED_RRQ(pkt) - - - @ATMT.state() - def RECEIVED_RRQ(self, pkt): - ip = pkt[IP] - options = pkt[TFTP_Options] - self.l3 = IP(src=ip.dst, dst=ip.src)/UDP(sport=self.my_tid, dport=ip.sport)/TFTP() - self.filename = pkt[TFTP_RRQ].filename - self.blk=1 - self.data = None - if self.filename in self.store: - self.data = self.store[self.filename] - elif self.dir is not None: - fn = os.path.abspath(os.path.join(self.dir, self.filename)) - if fn.startswith(self.dir): # Check we're still in the server's directory - try: - self.data=open(fn).read() - except IOError: - pass - if self.data is None: - self.data = self.joker - - if options: - opt = [x for x in options.options if x.oname.upper() == "BLKSIZE"] - if opt: - self.blksize = int(opt[0].value) - self.debug(2,"Negotiated new blksize at %i" % self.blksize) - self.last_packet = self.l3/TFTP_OACK()/TFTP_Options(options=opt) - self.send(self.last_packet) - - - - - @ATMT.condition(RECEIVED_RRQ) - def file_in_store(self): - if self.data is not None: - self.blknb = len(self.data)/self.blksize+1 - raise self.SEND_FILE() - - @ATMT.condition(RECEIVED_RRQ) - def file_not_found(self): - if self.data is None: - raise self.WAIT_RRQ() - @ATMT.action(file_not_found) - def send_error(self): - self.send(self.l3/TFTP_ERROR(errorcode=1, errormsg=TFTP_Error_Codes[1])) - - @ATMT.state() - def SEND_FILE(self): - self.send(self.l3/TFTP_DATA(block=self.blk)/self.data[(self.blk-1)*self.blksize:self.blk*self.blksize]) - - @ATMT.timeout(SEND_FILE, 3) - def timeout_waiting_ack(self): - raise self.SEND_FILE() - - @ATMT.receive_condition(SEND_FILE) - def received_ack(self, pkt): - if TFTP_ACK in pkt and pkt[TFTP_ACK].block == self.blk: - raise self.RECEIVED_ACK() - @ATMT.state() - def RECEIVED_ACK(self): - self.blk += 1 - - @ATMT.condition(RECEIVED_ACK) - def no_more_data(self): - if self.blk > self.blknb: - if self.serve_one: - raise self.END() - raise self.WAIT_RRQ() - @ATMT.condition(RECEIVED_ACK, prio=2) - def data_remaining(self): - raise self.SEND_FILE() - - @ATMT.state(final=1) - def END(self): - split_bottom_up(UDP, TFTP, dport=self.my_tid) - - - - diff --git a/scripts/external_libs/scapy-2.3.1/scapy/layers/vrrp.py b/scripts/external_libs/scapy-2.3.1/scapy/layers/vrrp.py deleted file mode 100644 index f874b352..00000000 --- a/scripts/external_libs/scapy-2.3.1/scapy/layers/vrrp.py +++ /dev/null @@ -1,39 +0,0 @@ -## This file is part of Scapy -## See http://www.secdev.org/projects/scapy for more informations -## Copyright (C) Philippe Biondi <phil@secdev.org> -## Copyright (C) 6WIND <olivier.matz@6wind.com> -## This program is published under a GPLv2 license - -""" -VRRP (Virtual Router Redundancy Protocol). -""" - -from scapy.packet import * -from scapy.fields import * -from scapy.layers.inet import IP - -IPPROTO_VRRP=112 - -# RFC 3768 - Virtual Router Redundancy Protocol (VRRP) -class VRRP(Packet): - fields_desc = [ - BitField("version" , 2, 4), - BitField("type" , 1, 4), - ByteField("vrid", 1), - ByteField("priority", 100), - FieldLenField("ipcount", None, count_of="addrlist", fmt="B"), - ByteField("authtype", 0), - ByteField("adv", 1), - XShortField("chksum", None), - FieldListField("addrlist", [], IPField("", "0.0.0.0"), - count_from = lambda pkt: pkt.ipcount), - IntField("auth1", 0), - IntField("auth2", 0) ] - - def post_build(self, p, pay): - if self.chksum is None: - ck = checksum(p) - p = p[:6]+chr(ck>>8)+chr(ck&0xff)+p[8:] - return p - -bind_layers( IP, VRRP, proto=IPPROTO_VRRP) diff --git a/scripts/external_libs/scapy-2.3.1/scapy/layers/x509.py b/scripts/external_libs/scapy-2.3.1/scapy/layers/x509.py deleted file mode 100644 index 18aaa5e3..00000000 --- a/scripts/external_libs/scapy-2.3.1/scapy/layers/x509.py +++ /dev/null @@ -1,108 +0,0 @@ -## This file is part of Scapy -## See http://www.secdev.org/projects/scapy for more informations -## Copyright (C) Philippe Biondi <phil@secdev.org> -## This program is published under a GPLv2 license - -""" -X.509 certificates. -""" - -from scapy.asn1packet import * -from scapy.asn1fields import * - -########## -## X509 ## -########## - -######[ ASN1 class ]###### - -class ASN1_Class_X509(ASN1_Class_UNIVERSAL): - name="X509" - CONT0 = 0xa0 - CONT1 = 0xa1 - CONT2 = 0xa2 - CONT3 = 0xa3 - -class ASN1_X509_CONT0(ASN1_SEQUENCE): - tag = ASN1_Class_X509.CONT0 - -class ASN1_X509_CONT1(ASN1_SEQUENCE): - tag = ASN1_Class_X509.CONT1 - -class ASN1_X509_CONT2(ASN1_SEQUENCE): - tag = ASN1_Class_X509.CONT2 - -class ASN1_X509_CONT3(ASN1_SEQUENCE): - tag = ASN1_Class_X509.CONT3 - -######[ BER codecs ]####### - -class BERcodec_X509_CONT0(BERcodec_SEQUENCE): - tag = ASN1_Class_X509.CONT0 - -class BERcodec_X509_CONT1(BERcodec_SEQUENCE): - tag = ASN1_Class_X509.CONT1 - -class BERcodec_X509_CONT2(BERcodec_SEQUENCE): - tag = ASN1_Class_X509.CONT2 - -class BERcodec_X509_CONT3(BERcodec_SEQUENCE): - tag = ASN1_Class_X509.CONT3 - -######[ ASN1 fields ]###### - -class ASN1F_X509_CONT0(ASN1F_SEQUENCE): - ASN1_tag = ASN1_Class_X509.CONT0 - -class ASN1F_X509_CONT1(ASN1F_SEQUENCE): - ASN1_tag = ASN1_Class_X509.CONT1 - -class ASN1F_X509_CONT2(ASN1F_SEQUENCE): - ASN1_tag = ASN1_Class_X509.CONT2 - -class ASN1F_X509_CONT3(ASN1F_SEQUENCE): - ASN1_tag = ASN1_Class_X509.CONT3 - -######[ X509 packets ]###### - -class X509RDN(ASN1_Packet): - ASN1_codec = ASN1_Codecs.BER - ASN1_root = ASN1F_SET( - ASN1F_SEQUENCE( ASN1F_OID("oid","2.5.4.6"), - ASN1F_PRINTABLE_STRING("value","") - ) - ) - -class X509v3Ext(ASN1_Packet): - ASN1_codec = ASN1_Codecs.BER - ASN1_root = ASN1F_field("val",ASN1_NULL(0)) - - -class X509Cert(ASN1_Packet): - ASN1_codec = ASN1_Codecs.BER - ASN1_root = ASN1F_SEQUENCE( - ASN1F_SEQUENCE( - ASN1F_optionnal(ASN1F_X509_CONT0(ASN1F_INTEGER("version",3))), - ASN1F_INTEGER("sn",1), - ASN1F_SEQUENCE(ASN1F_OID("sign_algo","1.2.840.113549.1.1.5"), - ASN1F_field("sa_value",ASN1_NULL(0))), - ASN1F_SEQUENCE_OF("issuer",[],X509RDN), - ASN1F_SEQUENCE(ASN1F_UTC_TIME("not_before",ZuluTime(-600)), # ten minutes ago - ASN1F_UTC_TIME("not_after",ZuluTime(+86400))), # for 24h - ASN1F_SEQUENCE_OF("subject",[],X509RDN), - ASN1F_SEQUENCE( - ASN1F_SEQUENCE(ASN1F_OID("pubkey_algo","1.2.840.113549.1.1.1"), - ASN1F_field("pk_value",ASN1_NULL(0))), - ASN1F_BIT_STRING("pubkey","") - ), - ASN1F_optionnal(ASN1F_X509_CONT3(ASN1F_SEQUENCE_OF("x509v3ext",[],X509v3Ext))), - - ), - ASN1F_SEQUENCE(ASN1F_OID("sign_algo2","1.2.840.113549.1.1.5"), - ASN1F_field("sa2_value",ASN1_NULL(0))), - ASN1F_BIT_STRING("signature","") - ) - - - - diff --git a/scripts/external_libs/scapy-2.3.1/scapy/main.py b/scripts/external_libs/scapy-2.3.1/scapy/main.py deleted file mode 100644 index 0fce8c3e..00000000 --- a/scripts/external_libs/scapy-2.3.1/scapy/main.py +++ /dev/null @@ -1,371 +0,0 @@ -## This file is part of Scapy -## See http://www.secdev.org/projects/scapy for more informations -## Copyright (C) Philippe Biondi <phil@secdev.org> -## This program is published under a GPLv2 license - -""" -Main module for interactive startup. -""" - -from __future__ import generators -import os,sys -import glob -import __builtin__ -from error import * -import utils - - -def _probe_config_file(cf): - cf_path = os.path.join(os.path.expanduser("~"), cf) - try: - os.stat(cf_path) - except OSError: - return None - else: - return cf_path - -def _read_config_file(cf): - log_loading.debug("Loading config file [%s]" % cf) - try: - execfile(cf) - except IOError,e: - log_loading.warning("Cannot read config file [%s] [%s]" % (cf,e)) - except Exception,e: - log_loading.exception("Error during evaluation of config file [%s]" % cf) - - -DEFAULT_PRESTART_FILE = _probe_config_file(".scapy_prestart.py") -DEFAULT_STARTUP_FILE = _probe_config_file(".scapy_startup.py") - -def _usage(): - print """Usage: scapy.py [-s sessionfile] [-c new_startup_file] [-p new_prestart_file] [-C] [-P] - -C: do not read startup file - -P: do not read pre-startup file""" - sys.exit(0) - - -from config import conf -from themes import DefaultTheme - - -###################### -## Extension system ## -###################### - - -def _load(module): - try: - mod = __import__(module,globals(),locals(),".") - __builtin__.__dict__.update(mod.__dict__) - except Exception,e: - log_interactive.error(e) - -def load_module(name): - _load("scapy.modules."+name) - -def load_layer(name): - _load("scapy.layers."+name) - -def load_contrib(name): - _load("scapy.contrib."+name) - -def list_contrib(name=None): - if name is None: - name="*.py" - elif "*" not in name and "?" not in name and not name.endswith(".py"): - name += ".py" - name = os.path.join(os.path.dirname(__file__), "contrib", name) - for f in glob.glob(name): - mod = os.path.basename(f) - if mod.startswith("__"): - continue - if mod.endswith(".py"): - mod = mod[:-3] - desc = { "description":"-", "status":"?", "name":mod } - for l in open(f): - p = l.find("scapy.contrib.") - if p >= 0: - p += 14 - q = l.find("=", p) - key = l[p:q].strip() - value = l[q+1:].strip() - desc[key] = value - print "%(name)-20s: %(description)-40s status=%(status)s" % desc - - - - - - -############################## -## Session saving/restoring ## -############################## - - -def save_session(fname=None, session=None, pickleProto=-1): - if fname is None: - fname = conf.session - if not fname: - conf.session = fname = utils.get_temp_file(keep=True) - log_interactive.info("Use [%s] as session file" % fname) - if session is None: - session = __builtin__.__dict__["scapy_session"] - - to_be_saved = session.copy() - - if to_be_saved.has_key("__builtins__"): - del(to_be_saved["__builtins__"]) - - for k in to_be_saved.keys(): - if type(to_be_saved[k]) in [types.TypeType, types.ClassType, types.ModuleType]: - log_interactive.error("[%s] (%s) can't be saved." % (k, type(to_be_saved[k]))) - del(to_be_saved[k]) - - try: - os.rename(fname, fname+".bak") - except OSError: - pass - f=gzip.open(fname,"wb") - cPickle.dump(to_be_saved, f, pickleProto) - f.close() - -def load_session(fname=None): - if fname is None: - fname = conf.session - try: - s = cPickle.load(gzip.open(fname,"rb")) - except IOError: - s = cPickle.load(open(fname,"rb")) - scapy_session = __builtin__.__dict__["scapy_session"] - scapy_session.clear() - scapy_session.update(s) - -def update_session(fname=None): - if fname is None: - fname = conf.session - try: - s = cPickle.load(gzip.open(fname,"rb")) - except IOError: - s = cPickle.load(open(fname,"rb")) - scapy_session = __builtin__.__dict__["scapy_session"] - scapy_session.update(s) - - -################ -##### Main ##### -################ - -def scapy_delete_temp_files(): - for f in conf.temp_files: - try: - os.unlink(f) - except: - pass - -def scapy_write_history_file(readline): - if conf.histfile: - try: - readline.write_history_file(conf.histfile) - except IOError,e: - try: - warning("Could not write history to [%s]\n\t (%s)" % (conf.histfile,e)) - tmp = utils.get_temp_file(keep=True) - readline.write_history_file(tmp) - warning("Wrote history to [%s]" % tmp) - except: - warning("Cound not write history to [%s]. Discarded" % tmp) - - -def interact(mydict=None,argv=None,mybanner=None,loglevel=20): - global session - import code,sys,cPickle,os,getopt,re - from config import conf - conf.interactive = True - if loglevel is not None: - conf.logLevel=loglevel - - the_banner = "Welcome to Scapy (%s)" - if mybanner is not None: - the_banner += "\n" - the_banner += mybanner - - if argv is None: - argv = sys.argv - - import atexit - try: - import rlcompleter,readline - except ImportError: - log_loading.info("Can't load Python libreadline or completer") - READLINE=0 - else: - READLINE=1 - class ScapyCompleter(rlcompleter.Completer): - def global_matches(self, text): - matches = [] - n = len(text) - for lst in [dir(__builtin__), session.keys()]: - for word in lst: - if word[:n] == text and word != "__builtins__": - matches.append(word) - return matches - - - def attr_matches(self, text): - m = re.match(r"(\w+(\.\w+)*)\.(\w*)", text) - if not m: - return - expr, attr = m.group(1, 3) - try: - object = eval(expr) - except: - object = eval(expr, session) - if isinstance(object, Packet) or isinstance(object, Packet_metaclass): - words = filter(lambda x: x[0]!="_",dir(object)) - words += [x.name for x in object.fields_desc] - else: - words = dir(object) - if hasattr( object,"__class__" ): - words = words + rlcompleter.get_class_members(object.__class__) - matches = [] - n = len(attr) - for word in words: - if word[:n] == attr and word != "__builtins__": - matches.append("%s.%s" % (expr, word)) - return matches - - readline.set_completer(ScapyCompleter().complete) - readline.parse_and_bind("C-o: operate-and-get-next") - readline.parse_and_bind("tab: complete") - - - session=None - session_name="" - STARTUP_FILE = DEFAULT_STARTUP_FILE - PRESTART_FILE = DEFAULT_PRESTART_FILE - - - iface = None - try: - opts=getopt.getopt(argv[1:], "hs:Cc:Pp:d") - for opt, parm in opts[0]: - if opt == "-h": - _usage() - elif opt == "-s": - session_name = parm - elif opt == "-c": - STARTUP_FILE = parm - elif opt == "-C": - STARTUP_FILE = None - elif opt == "-p": - PRESTART_FILE = parm - elif opt == "-P": - PRESTART_FILE = None - elif opt == "-d": - conf.logLevel = max(1,conf.logLevel-10) - - if len(opts[1]) > 0: - raise getopt.GetoptError("Too many parameters : [%s]" % " ".join(opts[1])) - - - except getopt.GetoptError, msg: - log_loading.error(msg) - sys.exit(1) - - if PRESTART_FILE: - _read_config_file(PRESTART_FILE) - - scapy_builtins = __import__("all",globals(),locals(),".").__dict__ - __builtin__.__dict__.update(scapy_builtins) - globkeys = scapy_builtins.keys() - globkeys.append("scapy_session") - scapy_builtins=None # XXX replace with "with" statement - if mydict is not None: - __builtin__.__dict__.update(mydict) - globkeys += mydict.keys() - - - conf.color_theme = DefaultTheme() - if STARTUP_FILE: - _read_config_file(STARTUP_FILE) - - if session_name: - try: - os.stat(session_name) - except OSError: - log_loading.info("New session [%s]" % session_name) - else: - try: - try: - session = cPickle.load(gzip.open(session_name,"rb")) - except IOError: - session = cPickle.load(open(session_name,"rb")) - log_loading.info("Using session [%s]" % session_name) - except EOFError: - log_loading.error("Error opening session [%s]" % session_name) - except AttributeError: - log_loading.error("Error opening session [%s]. Attribute missing" % session_name) - - if session: - if "conf" in session: - conf.configure(session["conf"]) - session["conf"] = conf - else: - conf.session = session_name - session={"conf":conf} - - else: - session={"conf": conf} - - __builtin__.__dict__["scapy_session"] = session - - - if READLINE: - if conf.histfile: - try: - readline.read_history_file(conf.histfile) - except IOError: - pass - atexit.register(scapy_write_history_file,readline) - - atexit.register(scapy_delete_temp_files) - - IPYTHON=False - if conf.interactive_shell.lower() == "ipython": - try: - import IPython - IPYTHON=True - except ImportError, e: - log_loading.warning("IPython not available. Using standard Python shell instead.") - IPYTHON=False - - if IPYTHON: - banner = the_banner % (conf.version) + " using IPython %s" % IPython.__version__ - - # Old way to embed IPython kept for backward compatibility - try: - args = [''] # IPython command line args (will be seen as sys.argv) - ipshell = IPython.Shell.IPShellEmbed(args, banner = banner) - ipshell(local_ns=session) - except AttributeError, e: - pass - - # In the IPython cookbook, see 'Updating-code-for-use-with-IPython-0.11-and-later' - IPython.embed(user_ns=session, banner2=banner) - - else: - code.interact(banner = the_banner % (conf.version), - local=session, readfunc=conf.readfunc) - - if conf.session: - save_session(conf.session, session) - - - for k in globkeys: - try: - del(__builtin__.__dict__[k]) - except: - pass - -if __name__ == "__main__": - interact() diff --git a/scripts/external_libs/scapy-2.3.1/scapy/modules/__init__.py b/scripts/external_libs/scapy-2.3.1/scapy/modules/__init__.py deleted file mode 100644 index 6303dad0..00000000 --- a/scripts/external_libs/scapy-2.3.1/scapy/modules/__init__.py +++ /dev/null @@ -1,8 +0,0 @@ -## This file is part of Scapy -## See http://www.secdev.org/projects/scapy for more informations -## Copyright (C) Philippe Biondi <phil@secdev.org> -## This program is published under a GPLv2 license - -""" -Package of extension modules that have to be loaded explicitly. -""" diff --git a/scripts/external_libs/scapy-2.3.1/scapy/modules/geoip.py b/scripts/external_libs/scapy-2.3.1/scapy/modules/geoip.py deleted file mode 100644 index 8b308a4c..00000000 --- a/scripts/external_libs/scapy-2.3.1/scapy/modules/geoip.py +++ /dev/null @@ -1,79 +0,0 @@ -## This file is part of Scapy -## See http://www.secdev.org/projects/scapy for more informations -## Copyright (C) Philippe Biondi <phil@secdev.org> -## This program is published under a GPLv2 license - -""" -GeoIP: find out the geographical location of IP addresses -""" - -from scapy.data import KnowledgeBase -from scapy.config import conf - -conf.IPCountry_base = "GeoIPCountry4Scapy.gz" -conf.countryLoc_base = "countryLoc.csv" -conf.gnuplot_world = "world.dat" - - -########################## -## IP location database ## -########################## - -class IPCountryKnowledgeBase(KnowledgeBase): - """ -How to generate the base : -db = [] -for l in open("GeoIPCountryWhois.csv").readlines(): - s,e,c = l.split(",")[2:5] - db.append((int(s[1:-1]),int(e[1:-1]),c[1:-1])) -cPickle.dump(gzip.open("xxx","w"),db) -""" - def lazy_init(self): - self.base = load_object(self.filename) - - -class CountryLocKnowledgeBase(KnowledgeBase): - def lazy_init(self): - f=open(self.filename) - self.base = {} - while 1: - l = f.readline() - if not l: - break - l = l.strip().split(",") - if len(l) != 3: - continue - c,lat,long = l - - self.base[c] = (float(long),float(lat)) - f.close() - - - -@conf.commands.register -def locate_ip(ip): - """Get geographic coordinates from IP using geoip database""" - ip=map(int,ip.split(".")) - ip = ip[3]+(ip[2]<<8L)+(ip[1]<<16L)+(ip[0]<<24L) - - cloc = country_loc_kdb.get_base() - db = IP_country_kdb.get_base() - - d=0 - f=len(db)-1 - while (f-d) > 1: - guess = (d+f)/2 - if ip > db[guess][0]: - d = guess - else: - f = guess - s,e,c = db[guess] - if s <= ip and ip <= e: - return cloc.get(c,None) - - - - - -conf.IP_country_kdb = IPCountryKnowledgeBase(conf.IPCountry_base) -conf.country_loc_kdb = CountryLocKnowledgeBase(conf.countryLoc_base) diff --git a/scripts/external_libs/scapy-2.3.1/scapy/modules/nmap.py b/scripts/external_libs/scapy-2.3.1/scapy/modules/nmap.py deleted file mode 100644 index ef064643..00000000 --- a/scripts/external_libs/scapy-2.3.1/scapy/modules/nmap.py +++ /dev/null @@ -1,215 +0,0 @@ -## This file is part of Scapy -## See http://www.secdev.org/projects/scapy for more informations -## Copyright (C) Philippe Biondi <phil@secdev.org> -## This program is published under a GPLv2 license - -""" -Clone of Nmap's first generation OS fingerprinting. -""" - -import os - -from scapy.data import KnowledgeBase -from scapy.config import conf -from scapy.arch import WINDOWS - - -if WINDOWS: - conf.nmap_base=os.environ["ProgramFiles"] + "\\nmap\\nmap-os-fingerprints" -else: - conf.nmap_base ="/usr/share/nmap/nmap-os-fingerprints" - - -###################### -## nmap OS fp stuff ## -###################### - - -class NmapKnowledgeBase(KnowledgeBase): - def lazy_init(self): - try: - f=open(self.filename) - except IOError: - return - - self.base = [] - name = None - try: - for l in f: - l = l.strip() - if not l or l[0] == "#": - continue - if l[:12] == "Fingerprint ": - if name is not None: - self.base.append((name,sig)) - name = l[12:].strip() - sig={} - p = self.base - continue - elif l[:6] == "Class ": - continue - op = l.find("(") - cl = l.find(")") - if op < 0 or cl < 0: - warning("error reading nmap os fp base file") - continue - test = l[:op] - s = map(lambda x: x.split("="), l[op+1:cl].split("%")) - si = {} - for n,v in s: - si[n] = v - sig[test]=si - if name is not None: - self.base.append((name,sig)) - except: - self.base = None - warning("Can't read nmap database [%s](new nmap version ?)" % self.filename) - f.close() - -nmap_kdb = NmapKnowledgeBase(conf.nmap_base) - -def TCPflags2str(f): - fl="FSRPAUEC" - s="" - for i in range(len(fl)): - if f & 1: - s = fl[i]+s - f >>= 1 - return s - -def nmap_tcppacket_sig(pkt): - r = {} - if pkt is not None: -# r["Resp"] = "Y" - r["DF"] = (pkt.flags & 2) and "Y" or "N" - r["W"] = "%X" % pkt.window - r["ACK"] = pkt.ack==2 and "S++" or pkt.ack==1 and "S" or "O" - r["Flags"] = TCPflags2str(pkt.payload.flags) - r["Ops"] = "".join(map(lambda x: x[0][0],pkt.payload.options)) - else: - r["Resp"] = "N" - return r - - -def nmap_udppacket_sig(S,T): - r={} - if T is None: - r["Resp"] = "N" - else: - r["DF"] = (T.flags & 2) and "Y" or "N" - r["TOS"] = "%X" % T.tos - r["IPLEN"] = "%X" % T.len - r["RIPTL"] = "%X" % T.payload.payload.len - r["RID"] = S.id == T.payload.payload.id and "E" or "F" - r["RIPCK"] = S.chksum == T.getlayer(IPerror).chksum and "E" or T.getlayer(IPerror).chksum == 0 and "0" or "F" - r["UCK"] = S.payload.chksum == T.getlayer(UDPerror).chksum and "E" or T.getlayer(UDPerror).chksum ==0 and "0" or "F" - r["ULEN"] = "%X" % T.getlayer(UDPerror).len - r["DAT"] = T.getlayer(conf.raw_layer) is None and "E" or S.getlayer(conf.raw_layer).load == T.getlayer(conf.raw_layer).load and "E" or "F" - return r - - - -def nmap_match_one_sig(seen, ref): - c = 0 - for k in seen.keys(): - if ref.has_key(k): - if seen[k] in ref[k].split("|"): - c += 1 - if c == 0 and seen.get("Resp") == "N": - return 0.7 - else: - return 1.0*c/len(seen.keys()) - - -def nmap_sig(target, oport=80, cport=81, ucport=1): - res = {} - - tcpopt = [ ("WScale", 10), - ("NOP",None), - ("MSS", 256), - ("Timestamp",(123,0)) ] - tests = [ IP(dst=target, id=1)/TCP(seq=1, sport=5001, dport=oport, options=tcpopt, flags="CS"), - IP(dst=target, id=1)/TCP(seq=1, sport=5002, dport=oport, options=tcpopt, flags=0), - IP(dst=target, id=1)/TCP(seq=1, sport=5003, dport=oport, options=tcpopt, flags="SFUP"), - IP(dst=target, id=1)/TCP(seq=1, sport=5004, dport=oport, options=tcpopt, flags="A"), - IP(dst=target, id=1)/TCP(seq=1, sport=5005, dport=cport, options=tcpopt, flags="S"), - IP(dst=target, id=1)/TCP(seq=1, sport=5006, dport=cport, options=tcpopt, flags="A"), - IP(dst=target, id=1)/TCP(seq=1, sport=5007, dport=cport, options=tcpopt, flags="FPU"), - IP(str(IP(dst=target)/UDP(sport=5008,dport=ucport)/(300*"i"))) ] - - ans, unans = sr(tests, timeout=2) - ans += map(lambda x: (x,None), unans) - - for S,T in ans: - if S.sport == 5008: - res["PU"] = nmap_udppacket_sig(S,T) - else: - t = "T%i" % (S.sport-5000) - if T is not None and T.haslayer(ICMP): - warning("Test %s answered by an ICMP" % t) - T=None - res[t] = nmap_tcppacket_sig(T) - - return res - -def nmap_probes2sig(tests): - tests=tests.copy() - res = {} - if "PU" in tests: - res["PU"] = nmap_udppacket_sig(*tests["PU"]) - del(tests["PU"]) - for k in tests: - res[k] = nmap_tcppacket_sig(tests[k]) - return res - - -def nmap_search(sigs): - guess = 0,[] - for os,fp in nmap_kdb.get_base(): - c = 0.0 - for t in sigs.keys(): - if t in fp: - c += nmap_match_one_sig(sigs[t], fp[t]) - c /= len(sigs.keys()) - if c > guess[0]: - guess = c,[ os ] - elif c == guess[0]: - guess[1].append(os) - return guess - - -@conf.commands.register -def nmap_fp(target, oport=80, cport=81): - """nmap fingerprinting -nmap_fp(target, [oport=80,] [cport=81,]) -> list of best guesses with accuracy -""" - sigs = nmap_sig(target, oport, cport) - return nmap_search(sigs) - - -@conf.commands.register -def nmap_sig2txt(sig): - torder = ["TSeq","T1","T2","T3","T4","T5","T6","T7","PU"] - korder = ["Class", "gcd", "SI", "IPID", "TS", - "Resp", "DF", "W", "ACK", "Flags", "Ops", - "TOS", "IPLEN", "RIPTL", "RID", "RIPCK", "UCK", "ULEN", "DAT" ] - txt=[] - for i in sig.keys(): - if i not in torder: - torder.append(i) - for t in torder: - sl = sig.get(t) - if sl is None: - continue - s = [] - for k in korder: - v = sl.get(k) - if v is None: - continue - s.append("%s=%s"%(k,v)) - txt.append("%s(%s)" % (t, "%".join(s))) - return "\n".join(txt) - - - - diff --git a/scripts/external_libs/scapy-2.3.1/scapy/modules/p0f.py b/scripts/external_libs/scapy-2.3.1/scapy/modules/p0f.py deleted file mode 100644 index d051779d..00000000 --- a/scripts/external_libs/scapy-2.3.1/scapy/modules/p0f.py +++ /dev/null @@ -1,542 +0,0 @@ -## This file is part of Scapy -## See http://www.secdev.org/projects/scapy for more informations -## Copyright (C) Philippe Biondi <phil@secdev.org> -## This program is published under a GPLv2 license - -""" -Clone of p0f passive OS fingerprinting -""" - -from scapy.data import KnowledgeBase -from scapy.config import conf -from scapy.layers.inet import IP, TCP, TCPOptions -from scapy.packet import NoPayload - -conf.p0f_base ="/etc/p0f/p0f.fp" -conf.p0fa_base ="/etc/p0f/p0fa.fp" -conf.p0fr_base ="/etc/p0f/p0fr.fp" -conf.p0fo_base ="/etc/p0f/p0fo.fp" - - -############### -## p0f stuff ## -############### - -# File format (according to p0f.fp) : -# -# wwww:ttt:D:ss:OOO...:QQ:OS:Details -# -# wwww - window size -# ttt - initial TTL -# D - don't fragment bit (0=unset, 1=set) -# ss - overall SYN packet size -# OOO - option value and order specification -# QQ - quirks list -# OS - OS genre -# details - OS description - -class p0fKnowledgeBase(KnowledgeBase): - def __init__(self, filename): - KnowledgeBase.__init__(self, filename) - #self.ttl_range=[255] - def lazy_init(self): - try: - f=open(self.filename) - except IOError: - warning("Can't open base %s" % self.filename) - return - try: - self.base = [] - for l in f: - if l[0] in ["#","\n"]: - continue - l = tuple(l.split(":")) - if len(l) < 8: - continue - def a2i(x): - if x.isdigit(): - return int(x) - return x - li = map(a2i, l[1:4]) - #if li[0] not in self.ttl_range: - # self.ttl_range.append(li[0]) - # self.ttl_range.sort() - self.base.append((l[0], li[0], li[1], li[2], l[4], l[5], l[6], l[7][:-1])) - except: - warning("Can't parse p0f database (new p0f version ?)") - self.base = None - f.close() - -p0f_kdb = p0fKnowledgeBase(conf.p0f_base) -p0fa_kdb = p0fKnowledgeBase(conf.p0fa_base) -p0fr_kdb = p0fKnowledgeBase(conf.p0fr_base) -p0fo_kdb = p0fKnowledgeBase(conf.p0fo_base) - -def p0f_selectdb(flags): - # tested flags: S, R, A - if flags & 0x16 == 0x2: - # SYN - return p0f_kdb - elif flags & 0x16 == 0x12: - # SYN/ACK - return p0fa_kdb - elif flags & 0x16 in [ 0x4, 0x14 ]: - # RST RST/ACK - return p0fr_kdb - elif flags & 0x16 == 0x10: - # ACK - return p0fo_kdb - else: - return None - -def packet2p0f(pkt): - pkt = pkt.copy() - pkt = pkt.__class__(str(pkt)) - while pkt.haslayer(IP) and pkt.haslayer(TCP): - pkt = pkt.getlayer(IP) - if isinstance(pkt.payload, TCP): - break - pkt = pkt.payload - - if not isinstance(pkt, IP) or not isinstance(pkt.payload, TCP): - raise TypeError("Not a TCP/IP packet") - #if pkt.payload.flags & 0x7 != 0x02: #S,!F,!R - # raise TypeError("Not a SYN or SYN/ACK packet") - - db = p0f_selectdb(pkt.payload.flags) - - #t = p0f_kdb.ttl_range[:] - #t += [pkt.ttl] - #t.sort() - #ttl=t[t.index(pkt.ttl)+1] - ttl = pkt.ttl - - df = (pkt.flags & 2) / 2 - ss = len(pkt) - # from p0f/config.h : PACKET_BIG = 100 - if ss > 100: - if db == p0fr_kdb: - # p0fr.fp: "Packet size may be wildcarded. The meaning of - # wildcard is, however, hardcoded as 'size > - # PACKET_BIG'" - ss = '*' - else: - ss = 0 - if db == p0fo_kdb: - # p0fo.fp: "Packet size MUST be wildcarded." - ss = '*' - - ooo = "" - mss = -1 - qqT = False - qqP = False - #qqBroken = False - ilen = (pkt.payload.dataofs << 2) - 20 # from p0f.c - for option in pkt.payload.options: - ilen -= 1 - if option[0] == "MSS": - ooo += "M" + str(option[1]) + "," - mss = option[1] - # FIXME: qqBroken - ilen -= 3 - elif option[0] == "WScale": - ooo += "W" + str(option[1]) + "," - # FIXME: qqBroken - ilen -= 2 - elif option[0] == "Timestamp": - if option[1][0] == 0: - ooo += "T0," - else: - ooo += "T," - if option[1][1] != 0: - qqT = True - ilen -= 9 - elif option[0] == "SAckOK": - ooo += "S," - ilen -= 1 - elif option[0] == "NOP": - ooo += "N," - elif option[0] == "EOL": - ooo += "E," - if ilen > 0: - qqP = True - else: - if type(option[0]) is str: - ooo += "?%i," % TCPOptions[1][option[0]] - else: - ooo += "?%i," % option[0] - # FIXME: ilen - ooo = ooo[:-1] - if ooo == "": ooo = "." - - win = pkt.payload.window - if mss != -1: - if mss != 0 and win % mss == 0: - win = "S" + str(win/mss) - elif win % (mss + 40) == 0: - win = "T" + str(win/(mss+40)) - win = str(win) - - qq = "" - - if db == p0fr_kdb: - if pkt.payload.flags & 0x10 == 0x10: - # p0fr.fp: "A new quirk, 'K', is introduced to denote - # RST+ACK packets" - qq += "K" - # The two next cases should also be only for p0f*r*, but although - # it's not documented (or I have not noticed), p0f seems to - # support the '0' and 'Q' quirks on any databases (or at the least - # "classical" p0f.fp). - if pkt.payload.seq == pkt.payload.ack: - # p0fr.fp: "A new quirk, 'Q', is used to denote SEQ number - # equal to ACK number." - qq += "Q" - if pkt.payload.seq == 0: - # p0fr.fp: "A new quirk, '0', is used to denote packets - # with SEQ number set to 0." - qq += "0" - if qqP: - qq += "P" - if pkt.id == 0: - qq += "Z" - if pkt.options != []: - qq += "I" - if pkt.payload.urgptr != 0: - qq += "U" - if pkt.payload.reserved != 0: - qq += "X" - if pkt.payload.ack != 0: - qq += "A" - if qqT: - qq += "T" - if db == p0fo_kdb: - if pkt.payload.flags & 0x20 != 0: - # U - # p0fo.fp: "PUSH flag is excluded from 'F' quirk checks" - qq += "F" - else: - if pkt.payload.flags & 0x28 != 0: - # U or P - qq += "F" - if db != p0fo_kdb and not isinstance(pkt.payload.payload, NoPayload): - # p0fo.fp: "'D' quirk is not checked for." - qq += "D" - # FIXME : "!" - broken options segment: not handled yet - - if qq == "": - qq = "." - - return (db, (win, ttl, df, ss, ooo, qq)) - -def p0f_correl(x,y): - d = 0 - # wwww can be "*" or "%nn". "Tnn" and "Snn" should work fine with - # the x[0] == y[0] test. - d += (x[0] == y[0] or y[0] == "*" or (y[0][0] == "%" and x[0].isdigit() and (int(x[0]) % int(y[0][1:])) == 0)) - # ttl - d += (y[1] >= x[1] and y[1] - x[1] < 32) - for i in [2, 5]: - d += (x[i] == y[i] or y[i] == '*') - # '*' has a special meaning for ss - d += x[3] == y[3] - xopt = x[4].split(",") - yopt = y[4].split(",") - if len(xopt) == len(yopt): - same = True - for i in range(len(xopt)): - if not (xopt[i] == yopt[i] or - (len(yopt[i]) == 2 and len(xopt[i]) > 1 and - yopt[i][1] == "*" and xopt[i][0] == yopt[i][0]) or - (len(yopt[i]) > 2 and len(xopt[i]) > 1 and - yopt[i][1] == "%" and xopt[i][0] == yopt[i][0] and - int(xopt[i][1:]) % int(yopt[i][2:]) == 0)): - same = False - break - if same: - d += len(xopt) - return d - - -@conf.commands.register -def p0f(pkt): - """Passive OS fingerprinting: which OS emitted this TCP packet ? -p0f(packet) -> accuracy, [list of guesses] -""" - db, sig = packet2p0f(pkt) - if db: - pb = db.get_base() - else: - pb = [] - if not pb: - warning("p0f base empty.") - return [] - #s = len(pb[0][0]) - r = [] - max = len(sig[4].split(",")) + 5 - for b in pb: - d = p0f_correl(sig,b) - if d == max: - r.append((b[6], b[7], b[1] - pkt[IP].ttl)) - return r - -def prnp0f(pkt): - # we should print which DB we use - try: - r = p0f(pkt) - except: - return - if r == []: - r = ("UNKNOWN", "[" + ":".join(map(str, packet2p0f(pkt)[1])) + ":?:?]", None) - else: - r = r[0] - uptime = None - try: - uptime = pkt2uptime(pkt) - except: - pass - if uptime == 0: - uptime = None - res = pkt.sprintf("%IP.src%:%TCP.sport% - " + r[0] + " " + r[1]) - if uptime is not None: - res += pkt.sprintf(" (up: " + str(uptime/3600) + " hrs)\n -> %IP.dst%:%TCP.dport% (%TCP.flags%)") - else: - res += pkt.sprintf("\n -> %IP.dst%:%TCP.dport% (%TCP.flags%)") - if r[2] is not None: - res += " (distance " + str(r[2]) + ")" - print res - -@conf.commands.register -def pkt2uptime(pkt, HZ=100): - """Calculate the date the machine which emitted the packet booted using TCP timestamp -pkt2uptime(pkt, [HZ=100])""" - if not isinstance(pkt, Packet): - raise TypeError("Not a TCP packet") - if isinstance(pkt,NoPayload): - raise TypeError("Not a TCP packet") - if not isinstance(pkt, TCP): - return pkt2uptime(pkt.payload) - for opt in pkt.options: - if opt[0] == "Timestamp": - #t = pkt.time - opt[1][0] * 1.0/HZ - #return time.ctime(t) - t = opt[1][0] / HZ - return t - raise TypeError("No timestamp option") - -def p0f_impersonate(pkt, osgenre=None, osdetails=None, signature=None, - extrahops=0, mtu=1500, uptime=None): - """Modifies pkt so that p0f will think it has been sent by a -specific OS. If osdetails is None, then we randomly pick up a -personality matching osgenre. If osgenre and signature are also None, -we use a local signature (using p0f_getlocalsigs). If signature is -specified (as a tuple), we use the signature. - -For now, only TCP Syn packets are supported. -Some specifications of the p0f.fp file are not (yet) implemented.""" - pkt = pkt.copy() - #pkt = pkt.__class__(str(pkt)) - while pkt.haslayer(IP) and pkt.haslayer(TCP): - pkt = pkt.getlayer(IP) - if isinstance(pkt.payload, TCP): - break - pkt = pkt.payload - - if not isinstance(pkt, IP) or not isinstance(pkt.payload, TCP): - raise TypeError("Not a TCP/IP packet") - - if uptime is None: - uptime = random.randint(120,100*60*60*24*365) - - db = p0f_selectdb(pkt.payload.flags) - if osgenre: - pb = db.get_base() - if pb is None: - pb = [] - pb = filter(lambda x: x[6] == osgenre, pb) - if osdetails: - pb = filter(lambda x: x[7] == osdetails, pb) - elif signature: - pb = [signature] - else: - pb = p0f_getlocalsigs()[db] - if db == p0fr_kdb: - # 'K' quirk <=> RST+ACK - if pkt.payload.flags & 0x4 == 0x4: - pb = filter(lambda x: 'K' in x[5], pb) - else: - pb = filter(lambda x: 'K' not in x[5], pb) - if not pb: - raise Scapy_Exception("No match in the p0f database") - pers = pb[random.randint(0, len(pb) - 1)] - - # options (we start with options because of MSS) - ## TODO: let the options already set if they are valid - options = [] - if pers[4] != '.': - for opt in pers[4].split(','): - if opt[0] == 'M': - # MSS might have a maximum size because of window size - # specification - if pers[0][0] == 'S': - maxmss = (2L**16-1) / int(pers[0][1:]) - else: - maxmss = (2L**16-1) - # If we have to randomly pick up a value, we cannot use - # scapy RandXXX() functions, because the value has to be - # set in case we need it for the window size value. That's - # why we use random.randint() - if opt[1:] == '*': - options.append(('MSS', random.randint(1,maxmss))) - elif opt[1] == '%': - coef = int(opt[2:]) - options.append(('MSS', coef*random.randint(1,maxmss/coef))) - else: - options.append(('MSS', int(opt[1:]))) - elif opt[0] == 'W': - if opt[1:] == '*': - options.append(('WScale', RandByte())) - elif opt[1] == '%': - coef = int(opt[2:]) - options.append(('WScale', coef*RandNum(min=1, - max=(2L**8-1)/coef))) - else: - options.append(('WScale', int(opt[1:]))) - elif opt == 'T0': - options.append(('Timestamp', (0, 0))) - elif opt == 'T': - if 'T' in pers[5]: - # FIXME: RandInt() here does not work (bug (?) in - # TCPOptionsField.m2i often raises "OverflowError: - # long int too large to convert to int" in: - # oval = struct.pack(ofmt, *oval)" - # Actually, this is enough to often raise the error: - # struct.pack('I', RandInt()) - options.append(('Timestamp', (uptime, random.randint(1,2**32-1)))) - else: - options.append(('Timestamp', (uptime, 0))) - elif opt == 'S': - options.append(('SAckOK', '')) - elif opt == 'N': - options.append(('NOP', None)) - elif opt == 'E': - options.append(('EOL', None)) - elif opt[0] == '?': - if int(opt[1:]) in TCPOptions[0]: - optname = TCPOptions[0][int(opt[1:])][0] - optstruct = TCPOptions[0][int(opt[1:])][1] - options.append((optname, - struct.unpack(optstruct, - RandString(struct.calcsize(optstruct))._fix()))) - else: - options.append((int(opt[1:]), '')) - ## FIXME: qqP not handled - else: - warning("unhandled TCP option " + opt) - pkt.payload.options = options - - # window size - if pers[0] == '*': - pkt.payload.window = RandShort() - elif pers[0].isdigit(): - pkt.payload.window = int(pers[0]) - elif pers[0][0] == '%': - coef = int(pers[0][1:]) - pkt.payload.window = coef * RandNum(min=1,max=(2L**16-1)/coef) - elif pers[0][0] == 'T': - pkt.payload.window = mtu * int(pers[0][1:]) - elif pers[0][0] == 'S': - ## needs MSS set - MSS = filter(lambda x: x[0] == 'MSS', options) - if not filter(lambda x: x[0] == 'MSS', options): - raise Scapy_Exception("TCP window value requires MSS, and MSS option not set") - pkt.payload.window = filter(lambda x: x[0] == 'MSS', options)[0][1] * int(pers[0][1:]) - else: - raise Scapy_Exception('Unhandled window size specification') - - # ttl - pkt.ttl = pers[1]-extrahops - # DF flag - pkt.flags |= (2 * pers[2]) - ## FIXME: ss (packet size) not handled (how ? may be with D quirk - ## if present) - # Quirks - if pers[5] != '.': - for qq in pers[5]: - ## FIXME: not handled: P, I, X, ! - # T handled with the Timestamp option - if qq == 'Z': pkt.id = 0 - elif qq == 'U': pkt.payload.urgptr = RandShort() - elif qq == 'A': pkt.payload.ack = RandInt() - elif qq == 'F': - if db == p0fo_kdb: - pkt.payload.flags |= 0x20 # U - else: - pkt.payload.flags |= RandChoice(8, 32, 40) #P / U / PU - elif qq == 'D' and db != p0fo_kdb: - pkt /= conf.raw_layer(load=RandString(random.randint(1, 10))) # XXX p0fo.fp - elif qq == 'Q': pkt.payload.seq = pkt.payload.ack - #elif qq == '0': pkt.payload.seq = 0 - #if db == p0fr_kdb: - # '0' quirk is actually not only for p0fr.fp (see - # packet2p0f()) - if '0' in pers[5]: - pkt.payload.seq = 0 - elif pkt.payload.seq == 0: - pkt.payload.seq = RandInt() - - while pkt.underlayer: - pkt = pkt.underlayer - return pkt - -def p0f_getlocalsigs(): - """This function returns a dictionary of signatures indexed by p0f -db (e.g., p0f_kdb, p0fa_kdb, ...) for the local TCP/IP stack. - -You need to have your firewall at least accepting the TCP packets -from/to a high port (30000 <= x <= 40000) on your loopback interface. - -Please note that the generated signatures come from the loopback -interface and may (are likely to) be different than those generated on -"normal" interfaces.""" - pid = os.fork() - port = random.randint(30000, 40000) - if pid > 0: - # parent: sniff - result = {} - def addresult(res): - # TODO: wildcard window size in some cases? and maybe some - # other values? - if res[0] not in result: - result[res[0]] = [res[1]] - else: - if res[1] not in result[res[0]]: - result[res[0]].append(res[1]) - # XXX could we try with a "normal" interface using other hosts - iface = conf.route.route('127.0.0.1')[0] - # each packet is seen twice: S + RA, S + SA + A + FA + A - # XXX are the packets also seen twice on non Linux systems ? - count=14 - pl = sniff(iface=iface, filter='tcp and port ' + str(port), count = count, timeout=3) - map(addresult, map(packet2p0f, pl)) - os.waitpid(pid,0) - elif pid < 0: - log_runtime.error("fork error") - else: - # child: send - # XXX erk - time.sleep(1) - s1 = socket.socket(socket.AF_INET, type = socket.SOCK_STREAM) - # S & RA - try: - s1.connect(('127.0.0.1', port)) - except socket.error: - pass - # S, SA, A, FA, A - s1.bind(('127.0.0.1', port)) - s1.connect(('127.0.0.1', port)) - # howto: get an RST w/o ACK packet - s1.close() - os._exit(0) - return result - diff --git a/scripts/external_libs/scapy-2.3.1/scapy/modules/queso.py b/scripts/external_libs/scapy-2.3.1/scapy/modules/queso.py deleted file mode 100644 index ebc5486e..00000000 --- a/scripts/external_libs/scapy-2.3.1/scapy/modules/queso.py +++ /dev/null @@ -1,113 +0,0 @@ -## This file is part of Scapy -## See http://www.secdev.org/projects/scapy for more informations -## Copyright (C) Philippe Biondi <phil@secdev.org> -## This program is published under a GPLv2 license - -""" -Clone of queso OS fingerprinting -""" - -from scapy.data import KnowledgeBase -from scapy.config import conf -from scapy.layers.inet import IP,TCP -#from - -conf.queso_base ="/etc/queso.conf" - - -################# -## Queso stuff ## -################# - - -def quesoTCPflags(flags): - if flags == "-": - return "-" - flv = "FSRPAUXY" - v = 0 - for i in flags: - v |= 2**flv.index(i) - return "%x" % v - -class QuesoKnowledgeBase(KnowledgeBase): - def lazy_init(self): - try: - f = open(self.filename) - except IOError: - return - self.base = {} - p = None - try: - for l in f: - l = l.strip() - if not l or l[0] == ';': - continue - if l[0] == '*': - if p is not None: - p[""] = name - name = l[1:].strip() - p = self.base - continue - if l[0] not in list("0123456"): - continue - res = l[2:].split() - res[-1] = quesoTCPflags(res[-1]) - res = " ".join(res) - if not p.has_key(res): - p[res] = {} - p = p[res] - if p is not None: - p[""] = name - except: - self.base = None - warning("Can't load queso base [%s]", self.filename) - f.close() - - -queso_kdb = QuesoKnowledgeBase(conf.queso_base) - - -def queso_sig(target, dport=80, timeout=3): - p = queso_kdb.get_base() - ret = [] - for flags in ["S", "SA", "F", "FA", "SF", "P", "SEC"]: - ans, unans = sr(IP(dst=target)/TCP(dport=dport,flags=flags,seq=RandInt()), - timeout=timeout, verbose=0) - if len(ans) == 0: - rs = "- - - -" - else: - s,r = ans[0] - rs = "%i" % (r.seq != 0) - if not r.ack: - r += " 0" - elif r.ack-s.seq > 666: - rs += " R" % 0 - else: - rs += " +%i" % (r.ack-s.seq) - rs += " %X" % r.window - rs += " %x" % r.payload.flags - ret.append(rs) - return ret - -def queso_search(sig): - p = queso_kdb.get_base() - sig.reverse() - ret = [] - try: - while sig: - s = sig.pop() - p = p[s] - if p.has_key(""): - ret.append(p[""]) - except KeyError: - pass - return ret - - -@conf.commands.register -def queso(*args,**kargs): - """Queso OS fingerprinting -queso(target, dport=80, timeout=3)""" - return queso_search(queso_sig(*args, **kargs)) - - diff --git a/scripts/external_libs/scapy-2.3.1/scapy/modules/voip.py b/scripts/external_libs/scapy-2.3.1/scapy/modules/voip.py deleted file mode 100644 index 70000a54..00000000 --- a/scripts/external_libs/scapy-2.3.1/scapy/modules/voip.py +++ /dev/null @@ -1,149 +0,0 @@ -## This file is part of Scapy -## See http://www.secdev.org/projects/scapy for more informations -## Copyright (C) Philippe Biondi <phil@secdev.org> -## This program is published under a GPLv2 license - -""" -VoIP (Voice over IP) related functions -""" - -import os -################### -## Testing stuff ## -################### - -from fcntl import fcntl -from scapy.sendrecv import sniff -from scapy.layers.inet import IP,UDP -from scapy.layers.rtp import RTP -from scapy.utils import get_temp_file - - -def merge(x,y,sample_size=2): - if len(x) > len(y): - y += "\x00"*(len(x)-len(y)) - elif len(x) < len(y): - x += "\x00"*(len(y)-len(x)) - m = "" - ss=sample_size - for i in range(len(x)/ss): - m += x[ss*i:ss*(i+1)]+y[ss*i:ss*(i+1)] - return m -# return "".join(map(str.__add__, x, y)) - - -def voip_play(s1,list=None,**kargs): - FIFO=get_temp_file() - FIFO1=FIFO % 1 - FIFO2=FIFO % 2 - - os.mkfifo(FIFO1) - os.mkfifo(FIFO2) - try: - os.system("soxmix -t .ul %s -t .ul %s -t ossdsp /dev/dsp &" % (FIFO1,FIFO2)) - - c1=open(FIFO1,"w", 4096) - c2=open(FIFO2,"w", 4096) - fcntl.fcntl(c1.fileno(),fcntl.F_SETFL, os.O_NONBLOCK) - fcntl.fcntl(c2.fileno(),fcntl.F_SETFL, os.O_NONBLOCK) - - # dsp,rd = os.popen2("sox -t .ul -c 2 - -t ossdsp /dev/dsp") - def play(pkt,last=[]): - if not pkt: - return - if not pkt.haslayer(UDP): - return - ip=pkt.getlayer(IP) - if s1 in [ip.src, ip.dst]: - if not last: - last.append(pkt) - return - load=last.pop() - # x1 = load.load[12:] - c1.write(load.load[12:]) - if load.getlayer(IP).src == ip.src: - # x2 = "" - c2.write("\x00"*len(load.load[12:])) - last.append(pkt) - else: - # x2 = pkt.load[:12] - c2.write(pkt.load[12:]) - # dsp.write(merge(x1,x2)) - - if list is None: - sniff(store=0, prn=play, **kargs) - else: - for p in list: - play(p) - finally: - os.unlink(FIFO1) - os.unlink(FIFO2) - - - -def voip_play1(s1,list=None,**kargs): - - - dsp,rd = os.popen2("sox -t .ul - -t ossdsp /dev/dsp") - def play(pkt): - if not pkt: - return - if not pkt.haslayer(UDP): - return - ip=pkt.getlayer(IP) - if s1 in [ip.src, ip.dst]: - dsp.write(pkt.getlayer(conf.raw_layer).load[12:]) - try: - if list is None: - sniff(store=0, prn=play, **kargs) - else: - for p in list: - play(p) - finally: - dsp.close() - rd.close() - -def voip_play2(s1,**kargs): - dsp,rd = os.popen2("sox -t .ul -c 2 - -t ossdsp /dev/dsp") - def play(pkt,last=[]): - if not pkt: - return - if not pkt.haslayer(UDP): - return - ip=pkt.getlayer(IP) - if s1 in [ip.src, ip.dst]: - if not last: - last.append(pkt) - return - load=last.pop() - x1 = load.load[12:] -# c1.write(load.load[12:]) - if load.getlayer(IP).src == ip.src: - x2 = "" -# c2.write("\x00"*len(load.load[12:])) - last.append(pkt) - else: - x2 = pkt.load[:12] -# c2.write(pkt.load[12:]) - dsp.write(merge(x1,x2)) - - sniff(store=0, prn=play, **kargs) - -def voip_play3(lst=None,**kargs): - dsp,rd = os.popen2("sox -t .ul - -t ossdsp /dev/dsp") - try: - def play(pkt, dsp=dsp): - if pkt and pkt.haslayer(UDP) and pkt.haslayer(conf.raw_layer): - dsp.write(pkt.getlayer(RTP).load) - if lst is None: - sniff(store=0, prn=play, **kargs) - else: - for p in lst: - play(p) - finally: - try: - dsp.close() - rd.close() - except: - pass - diff --git a/scripts/external_libs/scapy-2.3.1/scapy/packet.py b/scripts/external_libs/scapy-2.3.1/scapy/packet.py deleted file mode 100644 index 711d7032..00000000 --- a/scripts/external_libs/scapy-2.3.1/scapy/packet.py +++ /dev/null @@ -1,1346 +0,0 @@ -## This file is part of Scapy -## See http://www.secdev.org/projects/scapy for more informations -## Copyright (C) Philippe Biondi <phil@secdev.org> -## This program is published under a GPLv2 license - -""" -Packet class. Binding mechanism. fuzz() method. -""" - -import time,itertools,os -import copy -from fields import StrField,ConditionalField,Emph,PacketListField -from config import conf -from base_classes import BasePacket,Gen,SetGen,Packet_metaclass,NewDefaultValues -from volatile import VolatileValue -from utils import import_hexcap,tex_escape,colgen,get_temp_file -from error import Scapy_Exception,log_runtime -import subprocess -import pprint - -class CGlobal: - ONCE =False -try: - import pyx -except ImportError: - pass - - -class RawVal: - def __init__(self, val=""): - self.val = val - def __str__(self): - return str(self.val) - def __repr__(self): - return "<RawVal [%r]>" % self.val - -class CPacketRes: - pass; - - -class Packet(BasePacket): - __metaclass__ = Packet_metaclass - name=None - - fields_desc = [] - - aliastypes = [] - overload_fields = {} - - underlayer = None - - sent_time = None - payload_guess = [] - initialized = 0 - show_indent=1 - explicit = 0 - raw_packet_cache = None - - @classmethod - def from_hexcap(cls): - return cls(import_hexcap()) - - @classmethod - def upper_bonds(self): - for fval,upper in self.payload_guess: - print "%-20s %s" % (upper.__name__, ", ".join("%-12s" % ("%s=%r"%i) for i in fval.iteritems())) - - @classmethod - def lower_bonds(self): - for lower,fval in self.overload_fields.iteritems(): - print "%-20s %s" % (lower.__name__, ", ".join("%-12s" % ("%s=%r"%i) for i in fval.iteritems())) - - def __init__(self, _pkt="", post_transform=None, _internal=0, _underlayer=None, **fields): - self.time = time.time() - self.sent_time = 0 - if self.name is None: - self.name = self.__class__.__name__ - self.aliastypes = [ self.__class__ ] + self.aliastypes - self.default_fields = {} - self.offset=0; # offset of the object - self.offset_fields = {} # ofsset of each field - self.overloaded_fields = {} - self.fields={} - self.fieldtype={} - self.packetfields=[] - self.__dict__["payload"] = NoPayload() - self.init_fields() - self.underlayer = _underlayer - self.initialized = 1 - self.original = _pkt - if _pkt: - self.dissect(_pkt) - if not _internal: - self.dissection_done(self) - for f in fields.keys(): - self.fields[f] = self.get_field(f).any2i(self,fields[f]) - if type(post_transform) is list: - self.post_transforms = post_transform - elif post_transform is None: - self.post_transforms = [] - else: - self.post_transforms = [post_transform] - - - def init_fields(self): - self.do_init_fields(self.fields_desc) - - def do_init_fields(self, flist): - for f in flist: - self.default_fields[f.name] = copy.deepcopy(f.default) - self.fieldtype[f.name] = f - if f.holds_packets: - self.packetfields.append(f) - - def dissection_done(self,pkt): - """DEV: will be called after a dissection is completed""" - self.post_dissection(pkt) - self.payload.dissection_done(pkt) - - def post_dissection(self, pkt): - """DEV: is called after the dissection of the whole packet""" - pass - - def get_field(self, fld): - """DEV: returns the field instance from the name of the field""" - return self.fieldtype[fld] - - def add_payload(self, payload): - if payload is None: - return - elif not isinstance(self.payload, NoPayload): - self.payload.add_payload(payload) - else: - if isinstance(payload, Packet): - self.__dict__["payload"] = payload - payload.add_underlayer(self) - for t in self.aliastypes: - if payload.overload_fields.has_key(t): - self.overloaded_fields = payload.overload_fields[t] - break - elif type(payload) is str: - self.__dict__["payload"] = conf.raw_layer(load=payload) - else: - raise TypeError("payload must be either 'Packet' or 'str', not [%s]" % repr(payload)) - def remove_payload(self): - self.payload.remove_underlayer(self) - self.__dict__["payload"] = NoPayload() - self.overloaded_fields = {} - def add_underlayer(self, underlayer): - self.underlayer = underlayer - def remove_underlayer(self,other): - self.underlayer = None - def copy(self): - """Returns a deep copy of the instance.""" - clone = self.__class__() - clone.fields = self.fields.copy() - for k in clone.fields: - clone.fields[k] = self.get_field(k).do_copy(clone.fields[k]) - clone.default_fields = self.default_fields.copy() - clone.overloaded_fields = self.overloaded_fields.copy() - clone.overload_fields = self.overload_fields.copy() - clone.offset=self.offset - clone.underlayer = self.underlayer - clone.explicit = self.explicit - clone.raw_packet_cache = self.raw_packet_cache - clone.post_transforms = self.post_transforms[:] - clone.__dict__["payload"] = self.payload.copy() - clone.payload.add_underlayer(clone) - return clone - - def dump_offsets (self): - print "obj-id ",id(self), - print self.name ,self.offset - if self.payload: - self.payload.dump_offsets() - - - - def getfieldval(self, attr): - if attr in self.fields: - return self.fields[attr] - if attr in self.overloaded_fields: - return self.overloaded_fields[attr] - if attr in self.default_fields: - return self.default_fields[attr] - return self.payload.getfieldval(attr) - - def getfield_and_val(self, attr): - if attr in self.fields: - return self.get_field(attr),self.fields[attr] - if attr in self.overloaded_fields: - return self.get_field(attr),self.overloaded_fields[attr] - if attr in self.default_fields: - return self.get_field(attr),self.default_fields[attr] - return self.payload.getfield_and_val(attr) - - def __getattr__(self, attr): - if self.initialized: - fld,v = self.getfield_and_val(attr) - if fld is not None: - return fld.i2h(self, v) - return v - raise AttributeError(attr) - - def setfieldval(self, attr, val): - if self.default_fields.has_key(attr): - fld = self.get_field(attr) - if fld is None: - any2i = lambda x,y: y - else: - any2i = fld.any2i - self.fields[attr] = any2i(self, val) - self.explicit = 0 - self.raw_packet_cache = None - elif attr == "payload": - self.remove_payload() - self.add_payload(val) - else: - self.payload.setfieldval(attr,val) - - def __setattr__(self, attr, val): - if self.initialized: - try: - self.setfieldval(attr,val) - except AttributeError: - pass - else: - return - self.__dict__[attr] = val - - def delfieldval(self, attr): - if self.fields.has_key(attr): - del(self.fields[attr]) - self.explicit = 0 # in case a default value must be explicited - self.raw_packet_cache = None - elif self.default_fields.has_key(attr): - pass - elif attr == "payload": - self.remove_payload() - else: - self.payload.delfieldval(attr) - - def __delattr__(self, attr): - if self.initialized: - try: - self.delfieldval(attr) - except AttributeError: - pass - else: - return - if self.__dict__.has_key(attr): - del(self.__dict__[attr]) - else: - raise AttributeError(attr) - - def __repr__(self): - s = "" - ct = conf.color_theme - for f in self.fields_desc: - if isinstance(f, ConditionalField) and not f._evalcond(self): - continue - if f.name in self.fields: - val = f.i2repr(self, self.fields[f.name]) - elif f.name in self.overloaded_fields: - val = f.i2repr(self, self.overloaded_fields[f.name]) - else: - continue - if isinstance(f, Emph) or f in conf.emph: - ncol = ct.emph_field_name - vcol = ct.emph_field_value - else: - ncol = ct.field_name - vcol = ct.field_value - - - s += " %s%s%s" % (ncol(f.name), - ct.punct("="), - vcol(val)) - return "%s%s %s %s%s%s"% (ct.punct("<"), - ct.layer_name(self.__class__.__name__), - s, - ct.punct("|"), - repr(self.payload), - ct.punct(">")) - def __str__(self): - return self.build() - def __div__(self, other): - if isinstance(other, Packet): - cloneA = self.copy() - cloneB = other.copy() - cloneA.add_payload(cloneB) - return cloneA - elif type(other) is str: - return self/conf.raw_layer(load=other) - else: - return other.__rdiv__(self) - __truediv__ = __div__ - def __rdiv__(self, other): - if type(other) is str: - return conf.raw_layer(load=other)/self - else: - raise TypeError - __rtruediv__ = __rdiv__ - def __mul__(self, other): - if type(other) is int: - return [self]*other - else: - raise TypeError - def __rmul__(self,other): - return self.__mul__(other) - - def __nonzero__(self): - return True - def __len__(self): - return len(self.__str__()) - - def dump_fields_offsets (self): - for f in self.fields_desc: - print "field %-40s %02d %02d" % (f.name, f.offset,f.get_size_bytes ()); - - - def self_build(self, field_pos_list=None): - if self.raw_packet_cache is not None: - return self.raw_packet_cache - p="" - for f in self.fields_desc: - if type(p) is tuple : - f.offset=len(p[0]) - else: - assert(type(p)==str) - f.offset=len(p) - - val = self.getfieldval(f.name) - if isinstance(val, RawVal): - sval = str(val) - p += sval - if field_pos_list is not None: - field_pos_list.append( (f.name, sval.encode("string_escape"), len(p), len(sval) ) ) - f.offset= val - else: - p = f.addfield(self, p, val) - - return p - - def do_build_payload(self): - return self.payload.do_build(None) - - def do_update_payload_offset(self,pkt): - #print "obj-id ",id(self) - #print "current offset ",self.name," ",self.offset - #print "current header size ",len(pkt) - self.payload.offset = self.offset + len(pkt) - - def dump_layers_offset (self): - p=self; - while True: - print p.name, "offset :",p.offset - p=p.payload - if p ==None or isinstance(p,NoPayload): - break; - - - - - def do_build(self,result): - if not self.explicit: - self = self.__iter__().next() - pkt = self.self_build() - for t in self.post_transforms: - pkt = t(pkt) - self.do_update_payload_offset(pkt) - pay = self.do_build_payload() - p = self.post_build(pkt,pay) - if result != None: - result.pkt = self; - return p - - def build_padding(self): - return self.payload.build_padding() - - def update_build_info (self,other): - - p=self; - o=other; - while True: - assert(p.aliastypes==o.aliastypes) - assert(type(p) == type(o) ) - - #copy - p.offset=o.offset - - #next - p=p.payload - o=o.payload - if p ==None or isinstance(p,NoPayload): - break; - - - - def build(self): - result = CPacketRes; - p = self.do_build(result) - p += self.build_padding() - p = self.build_done(p) - - self.update_build_info (result.pkt) - return p - - def post_build(self, pkt, pay): - """DEV: called right after the current layer is build.""" - return pkt+pay - - def build_done(self, p): - return self.payload.build_done(p) - - - def do_build_ps(self): - p="" - pl = [] - q="" - for f in self.fields_desc: - if isinstance(f, ConditionalField) and not f._evalcond(self): - continue - p = f.addfield(self, p, self.getfieldval(f.name) ) - if type(p) is str: - r = p[len(q):] - q = p - else: - r = "" - pl.append( (f, f.i2repr(self,self.getfieldval(f.name)), r) ) - - pkt,lst = self.payload.build_ps(internal=1) - p += pkt - lst.append( (self, pl) ) - - return p,lst - - def build_ps(self,internal=0): - p,lst = self.do_build_ps() -# if not internal: -# pkt = self -# while pkt.haslayer(conf.padding_layer): -# pkt = pkt.getlayer(conf.padding_layer) -# lst.append( (pkt, [ ("loakjkjd", pkt.load, pkt.load) ] ) ) -# p += pkt.load -# pkt = pkt.payload - return p,lst - - - def psdump(self, filename=None, **kargs): - """psdump(filename=None, layer_shift=0, rebuild=1) -Creates an EPS file describing a packet. If filename is not provided a temporary file is created and gs is called.""" - canvas = self.canvas_dump(**kargs) - if filename is None: - fname = get_temp_file(autoext=".eps") - canvas.writeEPSfile(fname) - subprocess.Popen([conf.prog.psreader, fname+".eps"]) - else: - canvas.writeEPSfile(filename) - - def pdfdump(self, filename=None, **kargs): - """pdfdump(filename=None, layer_shift=0, rebuild=1) - Creates a PDF file describing a packet. If filename is not provided a temporary file is created and xpdf is called.""" - canvas = self.canvas_dump(**kargs) - if filename is None: - fname = get_temp_file(autoext=".pdf") - canvas.writePDFfile(fname) - subprocess.Popen([conf.prog.pdfreader, fname+".pdf"]) - else: - canvas.writePDFfile(filename) - - - def canvas_dump(self, layer_shift=0, rebuild=1): - canvas = pyx.canvas.canvas() - if rebuild: - p,t = self.__class__(str(self)).build_ps() - else: - p,t = self.build_ps() - YTXT=len(t) - for n,l in t: - YTXT += len(l) - YTXT = float(YTXT) - YDUMP=YTXT - - XSTART = 1 - XDSTART = 10 - y = 0.0 - yd = 0.0 - xd = 0 - XMUL= 0.55 - YMUL = 0.4 - - backcolor=colgen(0.6, 0.8, 1.0, trans=pyx.color.rgb) - forecolor=colgen(0.2, 0.5, 0.8, trans=pyx.color.rgb) -# backcolor=makecol(0.376, 0.729, 0.525, 1.0) - - - def hexstr(x): - s = [] - for c in x: - s.append("%02x" % ord(c)) - return " ".join(s) - - - def make_dump_txt(x,y,txt): - return pyx.text.text(XDSTART+x*XMUL, (YDUMP-y)*YMUL, r"\tt{%s}"%hexstr(txt), [pyx.text.size.Large]) - - def make_box(o): - return pyx.box.rect(o.left(), o.bottom(), o.width(), o.height(), relcenter=(0.5,0.5)) - - def make_frame(lst): - if len(lst) == 1: - b = lst[0].bbox() - b.enlarge(pyx.unit.u_pt) - return b.path() - else: - fb = lst[0].bbox() - fb.enlarge(pyx.unit.u_pt) - lb = lst[-1].bbox() - lb.enlarge(pyx.unit.u_pt) - if len(lst) == 2 and fb.left() > lb.right(): - return pyx.path.path(pyx.path.moveto(fb.right(), fb.top()), - pyx.path.lineto(fb.left(), fb.top()), - pyx.path.lineto(fb.left(), fb.bottom()), - pyx.path.lineto(fb.right(), fb.bottom()), - pyx.path.moveto(lb.left(), lb.top()), - pyx.path.lineto(lb.right(), lb.top()), - pyx.path.lineto(lb.right(), lb.bottom()), - pyx.path.lineto(lb.left(), lb.bottom())) - else: - # XXX - gb = lst[1].bbox() - if gb != lb: - gb.enlarge(pyx.unit.u_pt) - kb = lst[-2].bbox() - if kb != gb and kb != lb: - kb.enlarge(pyx.unit.u_pt) - return pyx.path.path(pyx.path.moveto(fb.left(), fb.top()), - pyx.path.lineto(fb.right(), fb.top()), - pyx.path.lineto(fb.right(), kb.bottom()), - pyx.path.lineto(lb.right(), kb.bottom()), - pyx.path.lineto(lb.right(), lb.bottom()), - pyx.path.lineto(lb.left(), lb.bottom()), - pyx.path.lineto(lb.left(), gb.top()), - pyx.path.lineto(fb.left(), gb.top()), - pyx.path.closepath(),) - - - def make_dump(s, shift=0, y=0, col=None, bkcol=None, larg=16): - c = pyx.canvas.canvas() - tlist = [] - while s: - dmp,s = s[:larg-shift],s[larg-shift:] - txt = make_dump_txt(shift, y, dmp) - tlist.append(txt) - shift += len(dmp) - if shift >= 16: - shift = 0 - y += 1 - if col is None: - col = pyx.color.rgb.red - if bkcol is None: - col = pyx.color.rgb.white - c.stroke(make_frame(tlist),[col,pyx.deco.filled([bkcol]),pyx.style.linewidth.Thick]) - for txt in tlist: - c.insert(txt) - return c, tlist[-1].bbox(), shift, y - - - last_shift,last_y=0,0.0 - while t: - bkcol = backcolor.next() - proto,fields = t.pop() - y += 0.5 - pt = pyx.text.text(XSTART, (YTXT-y)*YMUL, r"\font\cmssfont=cmss10\cmssfont{%s}" % proto.name, [ pyx.text.size.Large]) - y += 1 - ptbb=pt.bbox() - ptbb.enlarge(pyx.unit.u_pt*2) - canvas.stroke(ptbb.path(),[pyx.color.rgb.black, pyx.deco.filled([bkcol])]) - canvas.insert(pt) - for fname, fval, fdump in fields: - col = forecolor.next() - ft = pyx.text.text(XSTART, (YTXT-y)*YMUL, r"\font\cmssfont=cmss10\cmssfont{%s}" % tex_escape(fname.name)) - if isinstance(fval, str): - if len(fval) > 18: - fval = fval[:18]+"[...]" - else: - fval="" - vt = pyx.text.text(XSTART+3, (YTXT-y)*YMUL, r"\font\cmssfont=cmss10\cmssfont{%s}" % tex_escape(fval)) - y += 1.0 - if fdump: - dt,target,last_shift,last_y = make_dump(fdump, last_shift, last_y, col, bkcol) - - dtb = dt.bbox() - dtb=target - vtb = vt.bbox() - bxvt = make_box(vtb) - bxdt = make_box(dtb) - dtb.enlarge(pyx.unit.u_pt) - try: - if yd < 0: - cnx = pyx.connector.curve(bxvt,bxdt,absangle1=0, absangle2=-90) - else: - cnx = pyx.connector.curve(bxvt,bxdt,absangle1=0, absangle2=90) - except: - pass - else: - canvas.stroke(cnx,[pyx.style.linewidth.thin,pyx.deco.earrow.small,col]) - - canvas.insert(dt) - - canvas.insert(ft) - canvas.insert(vt) - last_y += layer_shift - - return canvas - - - - def extract_padding(self, s): - """DEV: to be overloaded to extract current layer's padding. Return a couple of strings (actual layer, padding)""" - return s,None - - def post_dissect(self, s): - """DEV: is called right after the current layer has been dissected""" - return s - - def pre_dissect(self, s): - """DEV: is called right before the current layer is dissected""" - return s - - def do_dissect(self, s): - flist = self.fields_desc[:] - flist.reverse() - raw = s - while s and flist: - f = flist.pop() - s,fval = f.getfield(self, s) - self.fields[f.name] = fval - assert(raw.endswith(s)) - if s: - self.raw_packet_cache = raw[:-len(s)] - else: - self.raw_packet_cache = raw - self.explicit = 1 - return s - - def do_dissect_payload(self, s): - if s: - cls = self.guess_payload_class(s) - try: - p = cls(s, _internal=1, _underlayer=self) - except KeyboardInterrupt: - raise - except: - if conf.debug_dissector: - if isinstance(cls,type) and issubclass(cls,Packet): - log_runtime.error("%s dissector failed" % cls.name) - else: - log_runtime.error("%s.guess_payload_class() returned [%s]" % (self.__class__.__name__,repr(cls))) - if cls is not None: - raise - p = conf.raw_layer(s, _internal=1, _underlayer=self) - self.add_payload(p) - - def dissect(self, s): - s = self.pre_dissect(s) - - s = self.do_dissect(s) - - s = self.post_dissect(s) - - payl,pad = self.extract_padding(s) - self.do_dissect_payload(payl) - if pad and conf.padding: - self.add_payload(conf.padding_layer(pad)) - - - def guess_payload_class(self, payload): - """DEV: Guesses the next payload class from layer bonds. Can be overloaded to use a different mechanism.""" - for t in self.aliastypes: - for fval, cls in t.payload_guess: - ok = 1 - for k in fval.keys(): - if not hasattr(self, k) or fval[k] != self.getfieldval(k): - ok = 0 - break - if ok: - return cls - return self.default_payload_class(payload) - - def default_payload_class(self, payload): - """DEV: Returns the default payload class if nothing has been found by the guess_payload_class() method.""" - return conf.raw_layer - - def hide_defaults(self): - """Removes fields' values that are the same as default values.""" - for k in self.fields.keys(): - if self.default_fields.has_key(k): - if self.default_fields[k] == self.fields[k]: - del(self.fields[k]) - self.payload.hide_defaults() - - def clone_with(self, payload=None, **kargs): - pkt = self.__class__() - pkt.explicit = 1 - pkt.fields = kargs - pkt.offset=self.offset - pkt.time = self.time - pkt.underlayer = self.underlayer - pkt.overload_fields = self.overload_fields.copy() - pkt.post_transforms = self.post_transforms - if payload is not None: - pkt.add_payload(payload) - return pkt - - - def __iter__(self): - def loop(todo, done, self=self): - if todo: - eltname = todo.pop() - elt = self.getfieldval(eltname) - if not isinstance(elt, Gen): - if self.get_field(eltname).islist: - elt = SetGen([elt]) - else: - elt = SetGen(elt) - for e in elt: - done[eltname]=e - for x in loop(todo[:], done): - yield x - else: - if isinstance(self.payload,NoPayload): - payloads = [None] - else: - payloads = self.payload - for payl in payloads: - done2=done.copy() - for k in done2: - if isinstance(done2[k], VolatileValue): - done2[k] = done2[k]._fix() - pkt = self.clone_with(payload=payl, **done2) - yield pkt - - if self.explicit: - todo = [] - done = self.fields - else: - todo = [ k for (k,v) in itertools.chain(self.default_fields.iteritems(), - self.overloaded_fields.iteritems()) - if isinstance(v, VolatileValue) ] + self.fields.keys() - done = {} - return loop(todo, done) - - def __gt__(self, other): - """True if other is an answer from self (self ==> other).""" - if isinstance(other, Packet): - return other < self - elif type(other) is str: - return 1 - else: - raise TypeError((self, other)) - def __lt__(self, other): - """True if self is an answer from other (other ==> self).""" - if isinstance(other, Packet): - return self.answers(other) - elif type(other) is str: - return 1 - else: - raise TypeError((self, other)) - - def __eq__(self, other): - if not isinstance(other, self.__class__): - return False - for f in self.fields_desc: - if f not in other.fields_desc: - return False - if self.getfieldval(f.name) != other.getfieldval(f.name): - return False - return self.payload == other.payload - - def __ne__(self, other): - return not self.__eq__(other) - - def hashret(self): - """DEV: returns a string that has the same value for a request and its answer.""" - return self.payload.hashret() - def answers(self, other): - """DEV: true if self is an answer from other""" - if other.__class__ == self.__class__: - return self.payload.answers(other.payload) - return 0 - - def haslayer(self, cls): - """true if self has a layer that is an instance of cls. Superseded by "cls in self" syntax.""" - if self.__class__ == cls or self.__class__.__name__ == cls: - return 1 - for f in self.packetfields: - fvalue_gen = self.getfieldval(f.name) - if fvalue_gen is None: - continue - if not f.islist: - fvalue_gen = SetGen(fvalue_gen,_iterpacket=0) - for fvalue in fvalue_gen: - if isinstance(fvalue, Packet): - ret = fvalue.haslayer(cls) - if ret: - return ret - return self.payload.haslayer(cls) - - - def getlayer(self, cls, nb=1, _track=None): - """Return the nb^th layer that is an instance of cls.""" - if type(cls) is int: - nb = cls+1 - cls = None - if type(cls) is str and "." in cls: - ccls,fld = cls.split(".",1) - else: - ccls,fld = cls,None - if cls is None or self.__class__ == cls or self.__class__.name == ccls: - if nb == 1: - if fld is None: - return self - else: - return self.getfieldval(fld) - else: - nb -=1 - for f in self.packetfields: - fvalue_gen = self.getfieldval(f.name) - if fvalue_gen is None: - continue - if not f.islist: - fvalue_gen = SetGen(fvalue_gen,_iterpacket=0) - for fvalue in fvalue_gen: - if isinstance(fvalue, Packet): - track=[] - ret = fvalue.getlayer(cls, nb, _track=track) - if ret is not None: - return ret - nb = track[0] - return self.payload.getlayer(cls,nb,_track=_track) - - def firstlayer(self): - q = self - while q.underlayer is not None: - q = q.underlayer - return q - - def __getitem__(self, cls): - if type(cls) is slice: - lname = cls.start - if cls.stop: - ret = self.getlayer(cls.start, cls.stop) - else: - ret = self.getlayer(cls.start) - if ret is None and cls.step is not None: - ret = cls.step - else: - lname=cls - ret = self.getlayer(cls) - if ret is None: - if type(lname) is Packet_metaclass: - lname = lname.__name__ - elif type(lname) is not str: - lname = repr(lname) - raise IndexError("Layer [%s] not found" % lname) - return ret - - def __delitem__(self, cls): - del(self[cls].underlayer.payload) - - def __setitem__(self, cls, val): - self[cls].underlayer.payload = val - - def __contains__(self, cls): - """"cls in self" returns true if self has a layer which is an instance of cls.""" - return self.haslayer(cls) - - def route(self): - return (None,None,None) - - def fragment(self, *args, **kargs): - return self.payload.fragment(*args, **kargs) - - - def display(self,*args,**kargs): # Deprecated. Use show() - """Deprecated. Use show() method.""" - self.show(*args,**kargs) - def show(self, indent=3, lvl="", label_lvl=""): - """Prints a hierarchical view of the packet. "indent" gives the size of indentation for each layer.""" - ct = conf.color_theme - print "%s%s %s %s" % (label_lvl, - ct.punct("###["), - ct.layer_name(self.name), - ct.punct("]###")) - for f in self.fields_desc: - if isinstance(f, ConditionalField) and not f._evalcond(self): - continue - if isinstance(f, Emph) or f in conf.emph: - ncol = ct.emph_field_name - vcol = ct.emph_field_value - else: - ncol = ct.field_name - vcol = ct.field_value - fvalue = self.getfieldval(f.name) - if isinstance(fvalue, Packet) or (f.islist and f.holds_packets and type(fvalue) is list): - print "%s \\%-10s\\" % (label_lvl+lvl, ncol(f.name)) - fvalue_gen = SetGen(fvalue,_iterpacket=0) - for fvalue in fvalue_gen: - fvalue.show(indent=indent, label_lvl=label_lvl+lvl+" |") - else: - begn = "%s %-10s%s " % (label_lvl+lvl, - ncol(f.name), - ct.punct("="),) - reprval = f.i2repr(self,fvalue) - if type(reprval) is str: - reprval = reprval.replace("\n", "\n"+" "*(len(label_lvl) - +len(lvl) - +len(f.name) - +4)) - print "%s%s" % (begn,vcol(reprval)) - self.payload.show(indent=indent, lvl=lvl+(" "*indent*self.show_indent), label_lvl=label_lvl) - def show2(self): - """Prints a hierarchical view of an assembled version of the packet, so that automatic fields are calculated (checksums, etc.)""" - self.__class__(str(self)).show() - - def sprintf(self, fmt, relax=1): - """sprintf(format, [relax=1]) -> str -where format is a string that can include directives. A directive begins and -ends by % and has the following format %[fmt[r],][cls[:nb].]field%. - -fmt is a classic printf directive, "r" can be appended for raw substitution -(ex: IP.flags=0x18 instead of SA), nb is the number of the layer we want -(ex: for IP/IP packets, IP:2.src is the src of the upper IP layer). -Special case : "%.time%" is the creation time. -Ex : p.sprintf("%.time% %-15s,IP.src% -> %-15s,IP.dst% %IP.chksum% " - "%03xr,IP.proto% %r,TCP.flags%") - -Moreover, the format string can include conditionnal statements. A conditionnal -statement looks like : {layer:string} where layer is a layer name, and string -is the string to insert in place of the condition if it is true, i.e. if layer -is present. If layer is preceded by a "!", the result si inverted. Conditions -can be imbricated. A valid statement can be : - p.sprintf("This is a{TCP: TCP}{UDP: UDP}{ICMP:n ICMP} packet") - p.sprintf("{IP:%IP.dst% {ICMP:%ICMP.type%}{TCP:%TCP.dport%}}") - -A side effect is that, to obtain "{" and "}" characters, you must use -"%(" and "%)". -""" - - escape = { "%": "%", - "(": "{", - ")": "}" } - - - # Evaluate conditions - while "{" in fmt: - i = fmt.rindex("{") - j = fmt[i+1:].index("}") - cond = fmt[i+1:i+j+1] - k = cond.find(":") - if k < 0: - raise Scapy_Exception("Bad condition in format string: [%s] (read sprintf doc!)"%cond) - cond,format = cond[:k],cond[k+1:] - res = False - if cond[0] == "!": - res = True - cond = cond[1:] - if self.haslayer(cond): - res = not res - if not res: - format = "" - fmt = fmt[:i]+format+fmt[i+j+2:] - - # Evaluate directives - s = "" - while "%" in fmt: - i = fmt.index("%") - s += fmt[:i] - fmt = fmt[i+1:] - if fmt and fmt[0] in escape: - s += escape[fmt[0]] - fmt = fmt[1:] - continue - try: - i = fmt.index("%") - sfclsfld = fmt[:i] - fclsfld = sfclsfld.split(",") - if len(fclsfld) == 1: - f = "s" - clsfld = fclsfld[0] - elif len(fclsfld) == 2: - f,clsfld = fclsfld - else: - raise Scapy_Exception - if "." in clsfld: - cls,fld = clsfld.split(".") - else: - cls = self.__class__.__name__ - fld = clsfld - num = 1 - if ":" in cls: - cls,num = cls.split(":") - num = int(num) - fmt = fmt[i+1:] - except: - raise Scapy_Exception("Bad format string [%%%s%s]" % (fmt[:25], fmt[25:] and "...")) - else: - if fld == "time": - val = time.strftime("%H:%M:%S.%%06i", time.localtime(self.time)) % int((self.time-int(self.time))*1000000) - elif cls == self.__class__.__name__ and hasattr(self, fld): - if num > 1: - val = self.payload.sprintf("%%%s,%s:%s.%s%%" % (f,cls,num-1,fld), relax) - f = "s" - elif f[-1] == "r": # Raw field value - val = getattr(self,fld) - f = f[:-1] - if not f: - f = "s" - else: - val = getattr(self,fld) - if fld in self.fieldtype: - val = self.fieldtype[fld].i2repr(self,val) - else: - val = self.payload.sprintf("%%%s%%" % sfclsfld, relax) - f = "s" - s += ("%"+f) % val - - s += fmt - return s - - def mysummary(self): - """DEV: can be overloaded to return a string that summarizes the layer. - Only one mysummary() is used in a whole packet summary: the one of the upper layer, - except if a mysummary() also returns (as a couple) a list of layers whose - mysummary() must be called if they are present.""" - return "" - - def _do_summary(self): - found,s,needed = self.payload._do_summary() - if s: - s = " / "+s - ret = "" - if not found or self.__class__ in needed: - ret = self.mysummary() - if type(ret) is tuple: - ret,n = ret - needed += n - if ret or needed: - found = 1 - if not ret: - ret = self.__class__.__name__ - if self.__class__ in conf.emph: - impf = [] - for f in self.fields_desc: - if f in conf.emph: - impf.append("%s=%s" % (f.name, f.i2repr(self, self.getfieldval(f.name)))) - ret = "%s [%s]" % (ret," ".join(impf)) - ret = "%s%s" % (ret,s) - return found,ret,needed - - def summary(self, intern=0): - """Prints a one line summary of a packet.""" - found,s,needed = self._do_summary() - return s - - - def lastlayer(self,layer=None): - """Returns the uppest layer of the packet""" - return self.payload.lastlayer(self) - - def decode_payload_as(self,cls): - """Reassembles the payload and decode it using another packet class""" - s = str(self.payload) - self.payload = cls(s, _internal=1, _underlayer=self) - pp = self - while pp.underlayer is not None: - pp = pp.underlayer - self.payload.dissection_done(pp) - - def libnet(self): - """Not ready yet. Should give the necessary C code that interfaces with libnet to recreate the packet""" - print "libnet_build_%s(" % self.__class__.name.lower() - det = self.__class__(str(self)) - for f in self.fields_desc: - val = det.getfieldval(f.name) - if val is None: - val = 0 - elif type(val) is int: - val = str(val) - else: - val = '"%s"' % str(val) - print "\t%s, \t\t/* %s */" % (val,f.name) - print ");" - def command(self): - """Returns a string representing the command you have to type to obtain the same packet""" - f = [] - for fn,fv in self.fields.items(): - fld = self.get_field(fn) - if isinstance(fv, Packet): - fv = fv.command() - elif fld.islist and fld.holds_packets and type(fv) is list: - fv = "[%s]" % ",".join( map(Packet.command, fv)) - else: - fv = repr(fv) - f.append("%s=%s" % (fn, fv)) - c = "%s(%s)" % (self.__class__.__name__, ", ".join(f)) - pc = self.payload.command() - if pc: - c += "/"+pc - return c - -class NoPayload(Packet): - def __new__(cls, *args, **kargs): - singl = cls.__dict__.get("__singl__") - if singl is None: - cls.__singl__ = singl = Packet.__new__(cls) - Packet.__init__(singl) - return singl - def __init__(self, *args, **kargs): - pass - def dissection_done(self,pkt): - return - def add_payload(self, payload): - raise Scapy_Exception("Can't add payload to NoPayload instance") - def remove_payload(self): - pass - def add_underlayer(self,underlayer): - pass - def remove_underlayer(self,other): - pass - def copy(self): - return self - def __repr__(self): - return "" - def __str__(self): - return "" - def __nonzero__(self): - return False - def do_build(self,result): - return "" - def build(self): - return "" - def build_padding(self): - return "" - def build_done(self, p): - return p - def build_ps(self, internal=0): - return "",[] - def getfieldval(self, attr): - raise AttributeError(attr) - def getfield_and_val(self, attr): - raise AttributeError(attr) - def setfieldval(self, attr, val): - raise AttributeError(attr) - def delfieldval(self, attr): - raise AttributeError(attr) - def __getattr__(self, attr): - if attr in self.__dict__: - return self.__dict__[attr] - elif attr in self.__class__.__dict__: - return self.__class__.__dict__[attr] - else: - raise AttributeError, attr - def hide_defaults(self): - pass - def __iter__(self): - return iter([]) - def __eq__(self, other): - if isinstance(other, NoPayload): - return True - return False - def hashret(self): - return "" - def answers(self, other): - return isinstance(other, NoPayload) or isinstance(other, conf.padding_layer) - def haslayer(self, cls): - return 0 - def getlayer(self, cls, nb=1, _track=None): - if _track is not None: - _track.append(nb) - return None - def fragment(self, *args, **kargs): - raise Scapy_Exception("cannot fragment this packet") - def show(self, indent=3, lvl="", label_lvl=""): - pass - def sprintf(self, fmt, relax): - if relax: - return "??" - else: - raise Scapy_Exception("Format not found [%s]"%fmt) - def _do_summary(self): - return 0,"",[] - def lastlayer(self,layer): - return layer - def command(self): - return "" - -#################### -## packet classes ## -#################### - - -class Raw(Packet): - name = "Raw" - fields_desc = [ StrField("load", "") ] - def answers(self, other): - return 1 -# s = str(other) -# t = self.load -# l = min(len(s), len(t)) -# return s[:l] == t[:l] - def mysummary(self): - cs = conf.raw_summary - if cs: - if callable(cs): - return "Raw %s" % cs(self.load) - else: - return "Raw %r" % self.load - return Packet.mysummary(self) - -class Padding(Raw): - name = "Padding" - def self_build(self): - return "" - def build_padding(self): - return (self.load if self.raw_packet_cache is None - else self.raw_packet_cache) + self.payload.build_padding() - -conf.raw_layer = Raw -conf.padding_layer = Padding -if conf.default_l2 is None: - conf.default_l2 = Raw - -################# -## Bind layers ## -################# - - -def bind_bottom_up(lower, upper, __fval=None, **fval): - if __fval is not None: - fval.update(__fval) - lower.payload_guess = lower.payload_guess[:] - lower.payload_guess.append((fval, upper)) - - -def bind_top_down(lower, upper, __fval=None, **fval): - if __fval is not None: - fval.update(__fval) - upper.overload_fields = upper.overload_fields.copy() - upper.overload_fields[lower] = fval - -@conf.commands.register -def bind_layers(lower, upper, __fval=None, **fval): - """Bind 2 layers on some specific fields' values""" - if __fval is not None: - fval.update(__fval) - bind_top_down(lower, upper, **fval) - bind_bottom_up(lower, upper, **fval) - -def split_bottom_up(lower, upper, __fval=None, **fval): - if __fval is not None: - fval.update(__fval) - def do_filter((f,u),upper=upper,fval=fval): - if u != upper: - return True - for k in fval: - if k not in f or f[k] != fval[k]: - return True - return False - lower.payload_guess = filter(do_filter, lower.payload_guess) - -def split_top_down(lower, upper, __fval=None, **fval): - if __fval is not None: - fval.update(__fval) - if lower in upper.overload_fields: - ofval = upper.overload_fields[lower] - for k in fval: - if k not in ofval or ofval[k] != fval[k]: - return - upper.overload_fields = upper.overload_fields.copy() - del(upper.overload_fields[lower]) - -@conf.commands.register -def split_layers(lower, upper, __fval=None, **fval): - """Split 2 layers previously bound""" - if __fval is not None: - fval.update(__fval) - split_bottom_up(lower, upper, **fval) - split_top_down(lower, upper, **fval) - - -@conf.commands.register -def ls(obj=None): - """List available layers, or infos on a given layer""" - if obj is None: - - import __builtin__ - all = __builtin__.__dict__.copy() - all.update(globals()) - objlst = sorted(conf.layers, key=lambda x:x.__name__) - for o in objlst: - print "%-10s : %s" %(o.__name__,o.name) - else: - if isinstance(obj, type) and issubclass(obj, Packet): - for f in obj.fields_desc: - print "%-10s : %-20s = (%s)" % (f.name, f.__class__.__name__, repr(f.default)) - elif isinstance(obj, Packet): - for f in obj.fields_desc: - print "%-10s : %-20s = %-15s (%s)" % (f.name, f.__class__.__name__, repr(getattr(obj,f.name)), repr(f.default)) - if not isinstance(obj.payload, NoPayload): - print "--" - ls(obj.payload) - - - else: - print "Not a packet class. Type 'ls()' to list packet classes." - - - -############# -## Fuzzing ## -############# - -@conf.commands.register -def fuzz(p, _inplace=0): - """Transform a layer into a fuzzy layer by replacing some default values by random objects""" - if not _inplace: - p = p.copy() - q = p - while not isinstance(q, NoPayload): - for f in q.fields_desc: - if isinstance(f, PacketListField): - for r in getattr(q, f.name): - print "fuzzing", repr(r) - fuzz(r, _inplace=1) - elif f.default is not None: - rnd = f.randval() - if rnd is not None: - q.default_fields[f.name] = rnd - q = q.payload - return p - - - diff --git a/scripts/external_libs/scapy-2.3.1/scapy/pipetool.py b/scripts/external_libs/scapy-2.3.1/scapy/pipetool.py deleted file mode 100644 index 7b85dd78..00000000 --- a/scripts/external_libs/scapy-2.3.1/scapy/pipetool.py +++ /dev/null @@ -1,565 +0,0 @@ -#! /usr/bin/env python - -## This file is part of Scapy -## See http://www.secdev.org/projects/scapy for more informations -## Copyright (C) Philippe Biondi <phil@secdev.org> -## This program is published under a GPLv2 license - -from __future__ import with_statement - -import scapy.utils -from scapy.config import conf -import os,thread,select -import subprocess -import itertools -import collections -import time -from scapy.error import log_interactive,warning -import Queue - -class PipeEngine: - pipes = {} - @classmethod - def list_pipes(cls): - for pn,pc in sorted(cls.pipes.items()): - doc = pc.__doc__ or "" - if doc: - doc = doc.splitlines()[0] - print "%20s: %s" % (pn, doc) - @classmethod - def list_pipes_detailed(cls): - for pn,pc in sorted(cls.pipes.items()): - if pc.__doc__: - print "###### %s\n %s" % (pn ,pc.__doc__) - else: - print "###### %s" % pn - - def __init__(self, *pipes): - self.active_pipes = set() - self.active_sources = set() - self.active_drains = set() - self.active_sinks = set() - self._add_pipes(*pipes) - self.thread_lock = thread.allocate_lock() - self.command_lock = thread.allocate_lock() - self.__fdr,self.__fdw = os.pipe() - self.threadid = None - def __getattr__(self, attr): - if attr.startswith("spawn_"): - dname = attr[6:] - if dname in self.pipes: - def f(*args, **kargs): - k = self.pipes[dname] - p = k(*args, **kargs) - self.add(p) - return p - return f - raise AttributeError(attr) - - def add_one_pipe(self, pipe): - self.active_pipes.add(pipe) - if isinstance(pipe, Source): - self.active_sources.add(pipe) - if isinstance(pipe, Drain): - self.active_drains.add(pipe) - if isinstance(pipe, Sink): - self.active_sinks.add(pipe) - - def get_pipe_list(self, pipe): - def flatten(p, l): - l.add(p) - for q in p.sources|p.sinks|p.high_sources|p.high_sinks: - if q not in l: - flatten(q, l) - pl = set() - flatten(pipe, pl) - return pl - - def _add_pipes(self, *pipes): - pl = set() - for p in pipes: - pl |= self.get_pipe_list(p) - pl -= self.active_pipes - for q in pl: - self.add_one_pipe(q) - return pl - - - def run(self): - log_interactive.info("Pipe engine thread started.") - try: - for p in self.active_pipes: - p.start() - sources = self.active_sources - sources.add(self.__fdr) - exhausted = set([]) - RUN=True - STOP_IF_EXHAUSTED = False - while RUN and (not STOP_IF_EXHAUSTED or len(sources) > 1): - fds,fdo,fde=select.select(sources,[],[]) - for fd in fds: - if fd is self.__fdr: - cmd = os.read(self.__fdr,1) - if cmd == "X": - RUN=False - break - elif cmd == "B": - STOP_IF_EXHAUSTED = True - elif cmd == "A": - sources = self.active_sources-exhausted - sources.add(self.__fdr) - else: - warning("Unknown internal pipe engine command: %r. Ignoring." % cmd) - elif fd in sources: - try: - fd.deliver() - except Exception,e: - log_interactive.exception("piping from %s failed: %s" % (fd.name, e)) - else: - if fd.exhausted(): - exhausted.add(fd) - sources.remove(fd) - except KeyboardInterrupt: - pass - finally: - try: - for p in self.active_pipes: - p.stop() - finally: - self.thread_lock.release() - log_interactive.info("Pipe engine thread stopped.") - - def start(self): - if self.thread_lock.acquire(0): - self.threadid = thread.start_new_thread(self.run,()) - else: - warning("Pipe engine already running") - def wait_and_stop(self): - self.stop(_cmd="B") - def stop(self, _cmd="X"): - try: - with self.command_lock: - if self.threadid is not None: - os.write(self.__fdw, _cmd) - while not self.thread_lock.acquire(0): - time.sleep(0.01) # interruptible wait for thread to terminate - self.thread_lock.release() # (not using .join() because it needs 'threading' module) - else: - warning("Pipe engine thread not running") - except KeyboardInterrupt: - print "Interrupted by user." - - def add(self, *pipes): - pipes = self._add_pipes(*pipes) - with self.command_lock: - if self.threadid is not None: - for p in pipes: - p.start() - os.write(self.__fdw, "A") - - def graph(self,**kargs): - g=['digraph "pipe" {',"\tnode [shape=rectangle];",] - for p in self.active_pipes: - g.append('\t"%i" [label="%s"];' % (id(p), p.name)) - g.append("") - g.append("\tedge [color=blue, arrowhead=vee];") - for p in self.active_pipes: - for q in p.sinks: - g.append('\t"%i" -> "%i";' % (id(p), id(q))) - g.append("") - g.append("\tedge [color=red, arrowhead=veevee];") - for p in self.active_pipes: - for q in p.high_sinks: - g.append('\t"%i" -> "%i" [color="red"];' % (id(p), id(q))) - g.append('}') - graph = "\n".join(g) - scapy.utils.do_graph(graph, **kargs) - - -class _ConnectorLogic(object): - def __init__(self): - self.sources = set() - self.sinks = set() - self.high_sources = set() - self.high_sinks = set() - - def __lt__(self, other): - other.sinks.add(self) - self.sources.add(other) - return other - def __gt__(self, other): - self.sinks.add(other) - other.sources.add(self) - return other - def __eq__(self, other): - self > other - other > self - return other - - def __lshift__(self, other): - self.high_sources.add(other) - other.high_sinks.add(self) - return other - def __rshift__(self, other): - self.high_sinks.add(other) - other.high_sources.add(self) - return other - def __floordiv__(self, other): - self >> other - other >> self - return other - - -class Pipe(_ConnectorLogic): - class __metaclass__(type): - def __new__(cls, name, bases, dct): - c = type.__new__(cls, name, bases, dct) - PipeEngine.pipes[name] = c - return c - def __init__(self, name=None): - _ConnectorLogic.__init__(self) - if name is None: - name = "%s" % (self.__class__.__name__) - self.name = name - def _send(self, msg): - for s in self.sinks: - s.push(msg) - def _high_send(self, msg): - for s in self.high_sinks: - s.high_push(msg) - - def __repr__(self): - ct = conf.color_theme - s = "%s%s" % (ct.punct("<"), ct.layer_name(self.name)) - if self.sources or self.sinks: - s+= " %s" % ct.punct("[") - if self.sources: - s+="%s%s" % (ct.punct(",").join(ct.field_name(s.name) for s in self.sources), - ct.field_value(">")) - s += ct.layer_name("#") - if self.sinks: - s+="%s%s" % (ct.field_value(">"), - ct.punct(",").join(ct.field_name(s.name) for s in self.sinks)) - s += ct.punct("]") - - if self.high_sources or self.high_sinks: - s+= " %s" % ct.punct("[") - if self.high_sources: - s+="%s%s" % (ct.punct(",").join(ct.field_name(s.name) for s in self.high_sources), - ct.field_value(">>")) - s += ct.layer_name("#") - if self.high_sinks: - s+="%s%s" % (ct.field_value(">>"), - ct.punct(",").join(ct.field_name(s.name) for s in self.high_sinks)) - s += ct.punct("]") - - - s += ct.punct(">") - return s - -class Source(Pipe): - def __init__(self, name=None): - Pipe.__init__(self, name=name) - self.is_exhausted = False - def _read_message(self): - return Message() - def deliver(self): - msg = self._read_message - self._send(msg) - def fileno(self): - return None - def exhausted(self): - return self.is_exhausted - def start(self): - pass - def stop(self): - pass - -class Drain(Pipe): - """Repeat messages from low/high entries to (resp.) low/high exits - +-------+ - >>-|-------|->> - | | - >-|-------|-> - +-------+ -""" - def push(self, msg): - self._send(msg) - def high_push(self, msg): - self._high_send(msg) - def start(self): - pass - def stop(self): - pass - -class Sink(Pipe): - def push(self, msg): - pass - def high_push(self, msg): - pass - def start(self): - pass - def stop(self): - pass - - -class AutoSource(Source): - def __init__(self, name=None): - Source.__init__(self, name=name) - self.__fdr,self.__fdw = os.pipe() - self._queue = collections.deque() - def fileno(self): - return self.__fdr - def _gen_data(self, msg): - self._queue.append((msg,False)) - self._wake_up() - def _gen_high_data(self, msg): - self._queue.append((msg,True)) - self._wake_up() - def _wake_up(self): - os.write(self.__fdw,"x") - def deliver(self): - os.read(self.__fdr,1) - try: - msg,high = self._queue.popleft() - except IndexError: #empty queue. Exhausted source - pass - else: - if high: - self._high_send(msg) - else: - self._send(msg) - -class ThreadGenSource(AutoSource): - def __init__(self, name=None): - AutoSource.__init__(self, name=name) - self.RUN = False - def generate(self): - pass - def start(self): - self.RUN = True - thread.start_new_thread(self.generate,()) - def stop(self): - self.RUN = False - - - -class ConsoleSink(Sink): - """Print messages on low and high entries - +-------+ - >>-|--. |->> - | print | - >-|--' |-> - +-------+ -""" - def push(self, msg): - print ">%r" % msg - def high_push(self, msg): - print ">>%r" % msg - -class RawConsoleSink(Sink): - """Print messages on low and high entries - +-------+ - >>-|--. |->> - | write | - >-|--' |-> - +-------+ -""" - def __init__(self, name=None, newlines=True): - Sink.__init__(self, name=name) - self.newlines = newlines - def push(self, msg): - if self.newlines: - msg += "\n" - os.write(1, str(msg)) - def high_push(self, msg): - if self.newlines: - msg += "\n" - os.write(1, str(msg)) - -class CLIFeeder(AutoSource): - """Send messages from python command line - +--------+ - >>-| |->> - | send() | - >-| `----|-> - +--------+ -""" - def send(self, msg): - self._gen_data(msg) - def close(self): - self.is_exhausted = True - -class CLIHighFeeder(CLIFeeder): - """Send messages from python command line to high output - +--------+ - >>-| .----|->> - | send() | - >-| |-> - +--------+ -""" - def send(self, msg): - self._gen_high_data(msg) - - -class PeriodicSource(ThreadGenSource): - """Generage messages periodically on low exit - +-------+ - >>-| |->> - | msg,T | - >-| `----|-> - +-------+ -""" - def __init__(self, msg, period, period2=0, name=None): - ThreadGenSource.__init__(self,name=name) - if not hasattr(msg, "__iter__"): - msg=[msg] - self.msg = msg - self.period = period - self.period2 = period2 - def generate(self): - while self.RUN: - empty_gen = True - for m in self.msg: - empty_gen = False - self._gen_data(m) - time.sleep(self.period) - if empty_gen: - self.is_exhausted = True - self._wake_up() - time.sleep(self.period2) - -class TermSink(Sink): - """Print messages on low and high entries on a separate terminal - +-------+ - >>-|--. |->> - | print | - >-|--' |-> - +-------+ -""" - def __init__(self, name=None, keepterm=True, newlines=True, openearly=True): - Sink.__init__(self, name=name) - self.keepterm = keepterm - self.newlines = newlines - self.openearly = openearly - self.opened = False - if self.openearly: - self.start() - - def start(self): - if not self.opened: - self.opened = True - self.__r,self.__w = os.pipe() - cmd = ["xterm"] - if self.name is not None: - cmd.extend(["-title",self.name]) - if self.keepterm: - cmd.append("-hold") - cmd.extend(["-e", "cat 0<&%i" % self.__r]) - self.__p = subprocess.Popen(cmd) - os.close(self.__r) - def stop(self): - if not self.keepterm: - self.opened = False - os.close(self.__w) - self.__p.kill() - self.__p.wait() - def _print(self, s): - if self.newlines: - s+="\n" - os.write(self.__w, s) - - def push(self, msg): - self._print(str(msg)) - def high_push(self, msg): - self._print(str(msg)) - - -class QueueSink(Sink): - """Collect messages from high and low entries and queue them. Messages are unqueued with the .recv() method. - +-------+ - >>-|--. |->> - | queue | - >-|--' |-> - +-------+ -""" - def __init__(self, name=None): - Sink.__init__(self, name=name) - self.q = Queue.Queue() - def push(self, msg): - self.q.put(msg) - def high_push(self, msg): - self.q.put(msg) - def recv(self): - while True: - try: - return self.q.get(True, timeout=0.1) - except Queue.Empty: - pass - - -class TransformDrain(Drain): - """Apply a function to messages on low and high entry - +-------+ - >>-|--[f]--|->> - | | - >-|--[f]--|-> - +-------+ -""" - def __init__(self, f, name=None): - Drain.__init__(self, name=name) - self.f = f - def push(self, msg): - self._send(self.f(msg)) - def high_push(self, msg): - self._high_send(self.f(msg)) - -class UpDrain(Drain): - """Repeat messages from low entry to high exit - +-------+ - >>-| ,--|->> - | / | - >-|--' |-> - +-------+ -""" - def push(self, msg): - self._high_send(msg) - def high_push(self, msg): - pass - -class DownDrain(Drain): - """Repeat messages from high entry to low exit - +-------+ - >>-|--. |->> - | \ | - >-| `--|-> - +-------+ -""" - def push(self, msg): - pass - def high_push(self, msg): - self._send(msg) - - -def _testmain(): - s = PeriodicSource("hello", 1, name="src") - d1 = Drain(name="d1") - c = ConsoleSink(name="c") - tf = TransformDrain(lambda x:"Got %r" % x) - t = TermSink(name="t", keepterm=False) - - s > d1 > c - d1 > tf > t - - p = PipeEngine(s) - - p.graph(type="png",target="> /tmp/pipe.png") - - p.start() - print p.threadid - time.sleep(5) - p.stop() - - -if __name__ == "__main__": - _testmain() diff --git a/scripts/external_libs/scapy-2.3.1/scapy/plist.py b/scripts/external_libs/scapy-2.3.1/scapy/plist.py deleted file mode 100644 index 92d7c3eb..00000000 --- a/scripts/external_libs/scapy-2.3.1/scapy/plist.py +++ /dev/null @@ -1,492 +0,0 @@ -## This file is part of Scapy -## See http://www.secdev.org/projects/scapy for more informations -## Copyright (C) Philippe Biondi <phil@secdev.org> -## This program is published under a GPLv2 license - -""" -PacketList: holds several packets and allows to do operations on them. -""" - - -import os,subprocess -from config import conf -from base_classes import BasePacket,BasePacketList -from collections import defaultdict - -from utils import do_graph,hexdump,make_table,make_lined_table,make_tex_table,get_temp_file - -import arch -if arch.GNUPLOT: - Gnuplot=arch.Gnuplot - - - -############# -## Results ## -############# - -class PacketList(BasePacketList): - res = [] - def __init__(self, res=None, name="PacketList", stats=None): - """create a packet list from a list of packets - res: the list of packets - stats: a list of classes that will appear in the stats (defaults to [TCP,UDP,ICMP])""" - if stats is None: - stats = conf.stats_classic_protocols - self.stats = stats - if res is None: - res = [] - if isinstance(res, PacketList): - res = res.res - self.res = res - self.listname = name - def _elt2pkt(self, elt): - return elt - def _elt2sum(self, elt): - return elt.summary() - def _elt2show(self, elt): - return self._elt2sum(elt) - def __repr__(self): -# stats=dict.fromkeys(self.stats,0) ## needs python >= 2.3 :( - stats = dict(map(lambda x: (x,0), self.stats)) - other = 0 - for r in self.res: - f = 0 - for p in stats: - if self._elt2pkt(r).haslayer(p): - stats[p] += 1 - f = 1 - break - if not f: - other += 1 - s = "" - ct = conf.color_theme - for p in self.stats: - s += " %s%s%s" % (ct.packetlist_proto(p.name), - ct.punct(":"), - ct.packetlist_value(stats[p])) - s += " %s%s%s" % (ct.packetlist_proto("Other"), - ct.punct(":"), - ct.packetlist_value(other)) - return "%s%s%s%s%s" % (ct.punct("<"), - ct.packetlist_name(self.listname), - ct.punct(":"), - s, - ct.punct(">")) - def __getattr__(self, attr): - return getattr(self.res, attr) - def __getitem__(self, item): - if isinstance(item,type) and issubclass(item,BasePacket): - return self.__class__(filter(lambda x: item in self._elt2pkt(x),self.res), - name="%s from %s"%(item.__name__,self.listname)) - if type(item) is slice: - return self.__class__(self.res.__getitem__(item), - name = "mod %s" % self.listname) - return self.res.__getitem__(item) - def __getslice__(self, *args, **kargs): - return self.__class__(self.res.__getslice__(*args, **kargs), - name="mod %s"%self.listname) - def __add__(self, other): - return self.__class__(self.res+other.res, - name="%s+%s"%(self.listname,other.listname)) - def summary(self, prn=None, lfilter=None): - """prints a summary of each packet -prn: function to apply to each packet instead of lambda x:x.summary() -lfilter: truth function to apply to each packet to decide whether it will be displayed""" - for r in self.res: - if lfilter is not None: - if not lfilter(r): - continue - if prn is None: - print self._elt2sum(r) - else: - print prn(r) - def nsummary(self,prn=None, lfilter=None): - """prints a summary of each packet with the packet's number -prn: function to apply to each packet instead of lambda x:x.summary() -lfilter: truth function to apply to each packet to decide whether it will be displayed""" - for i in range(len(self.res)): - if lfilter is not None: - if not lfilter(self.res[i]): - continue - print conf.color_theme.id(i,fmt="%04i"), - if prn is None: - print self._elt2sum(self.res[i]) - else: - print prn(self.res[i]) - def display(self): # Deprecated. Use show() - """deprecated. is show()""" - self.show() - def show(self, *args, **kargs): - """Best way to display the packet list. Defaults to nsummary() method""" - return self.nsummary(*args, **kargs) - - def filter(self, func): - """Returns a packet list filtered by a truth function""" - return self.__class__(filter(func,self.res), - name="filtered %s"%self.listname) - def make_table(self, *args, **kargs): - """Prints a table using a function that returs for each packet its head column value, head row value and displayed value - ex: p.make_table(lambda x:(x[IP].dst, x[TCP].dport, x[TCP].sprintf("%flags%")) """ - return make_table(self.res, *args, **kargs) - def make_lined_table(self, *args, **kargs): - """Same as make_table, but print a table with lines""" - return make_lined_table(self.res, *args, **kargs) - def make_tex_table(self, *args, **kargs): - """Same as make_table, but print a table with LaTeX syntax""" - return make_tex_table(self.res, *args, **kargs) - - def plot(self, f, lfilter=None,**kargs): - """Applies a function to each packet to get a value that will be plotted with GnuPlot. A gnuplot object is returned - lfilter: a truth function that decides whether a packet must be ploted""" - g=Gnuplot.Gnuplot() - l = self.res - if lfilter is not None: - l = filter(lfilter, l) - l = map(f,l) - g.plot(Gnuplot.Data(l, **kargs)) - return g - - def diffplot(self, f, delay=1, lfilter=None, **kargs): - """diffplot(f, delay=1, lfilter=None) - Applies a function to couples (l[i],l[i+delay])""" - g = Gnuplot.Gnuplot() - l = self.res - if lfilter is not None: - l = filter(lfilter, l) - l = map(f,l[:-delay],l[delay:]) - g.plot(Gnuplot.Data(l, **kargs)) - return g - - def multiplot(self, f, lfilter=None, **kargs): - """Uses a function that returns a label and a value for this label, then plots all the values label by label""" - g=Gnuplot.Gnuplot() - l = self.res - if lfilter is not None: - l = filter(lfilter, l) - - d={} - for e in l: - k,v = f(e) - if k in d: - d[k].append(v) - else: - d[k] = [v] - data=[] - for k in d: - data.append(Gnuplot.Data(d[k], title=k, **kargs)) - - g.plot(*data) - return g - - - def rawhexdump(self): - """Prints an hexadecimal dump of each packet in the list""" - for p in self: - hexdump(self._elt2pkt(p)) - - def hexraw(self, lfilter=None): - """Same as nsummary(), except that if a packet has a Raw layer, it will be hexdumped - lfilter: a truth function that decides whether a packet must be displayed""" - for i in range(len(self.res)): - p = self._elt2pkt(self.res[i]) - if lfilter is not None and not lfilter(p): - continue - print "%s %s %s" % (conf.color_theme.id(i,fmt="%04i"), - p.sprintf("%.time%"), - self._elt2sum(self.res[i])) - if p.haslayer(conf.raw_layer): - hexdump(p.getlayer(conf.raw_layer).load) - - def hexdump(self, lfilter=None): - """Same as nsummary(), except that packets are also hexdumped - lfilter: a truth function that decides whether a packet must be displayed""" - for i in range(len(self.res)): - p = self._elt2pkt(self.res[i]) - if lfilter is not None and not lfilter(p): - continue - print "%s %s %s" % (conf.color_theme.id(i,fmt="%04i"), - p.sprintf("%.time%"), - self._elt2sum(self.res[i])) - hexdump(p) - - def padding(self, lfilter=None): - """Same as hexraw(), for Padding layer""" - for i in range(len(self.res)): - p = self._elt2pkt(self.res[i]) - if p.haslayer(conf.padding_layer): - if lfilter is None or lfilter(p): - print "%s %s %s" % (conf.color_theme.id(i,fmt="%04i"), - p.sprintf("%.time%"), - self._elt2sum(self.res[i])) - hexdump(p.getlayer(conf.padding_layer).load) - - def nzpadding(self, lfilter=None): - """Same as padding() but only non null padding""" - for i in range(len(self.res)): - p = self._elt2pkt(self.res[i]) - if p.haslayer(conf.padding_layer): - pad = p.getlayer(conf.padding_layer).load - if pad == pad[0]*len(pad): - continue - if lfilter is None or lfilter(p): - print "%s %s %s" % (conf.color_theme.id(i,fmt="%04i"), - p.sprintf("%.time%"), - self._elt2sum(self.res[i])) - hexdump(p.getlayer(conf.padding_layer).load) - - - def conversations(self, getsrcdst=None,**kargs): - """Graphes a conversations between sources and destinations and display it - (using graphviz and imagemagick) - getsrcdst: a function that takes an element of the list and return the source and dest - by defaults, return source and destination IP - type: output type (svg, ps, gif, jpg, etc.), passed to dot's "-T" option - target: filename or redirect. Defaults pipe to Imagemagick's display program - prog: which graphviz program to use""" - if getsrcdst is None: - getsrcdst = lambda x:(x['IP'].src, x['IP'].dst) - conv = {} - for p in self.res: - p = self._elt2pkt(p) - try: - c = getsrcdst(p) - except: - #XXX warning() - continue - conv[c] = conv.get(c,0)+1 - gr = 'digraph "conv" {\n' - for s,d in conv: - gr += '\t "%s" -> "%s"\n' % (s,d) - gr += "}\n" - return do_graph(gr, **kargs) - - def afterglow(self, src=None, event=None, dst=None, **kargs): - """Experimental clone attempt of http://sourceforge.net/projects/afterglow - each datum is reduced as src -> event -> dst and the data are graphed. - by default we have IP.src -> IP.dport -> IP.dst""" - if src is None: - src = lambda x: x['IP'].src - if event is None: - event = lambda x: x['IP'].dport - if dst is None: - dst = lambda x: x['IP'].dst - sl = {} - el = {} - dl = {} - for i in self.res: - try: - s,e,d = src(i),event(i),dst(i) - if s in sl: - n,l = sl[s] - n += 1 - if e not in l: - l.append(e) - sl[s] = (n,l) - else: - sl[s] = (1,[e]) - if e in el: - n,l = el[e] - n+=1 - if d not in l: - l.append(d) - el[e] = (n,l) - else: - el[e] = (1,[d]) - dl[d] = dl.get(d,0)+1 - except: - continue - - import math - def normalize(n): - return 2+math.log(n)/4.0 - - def minmax(x): - m,M = min(x),max(x) - if m == M: - m = 0 - if M == 0: - M = 1 - return m,M - - mins,maxs = minmax(map(lambda (x,y): x, sl.values())) - mine,maxe = minmax(map(lambda (x,y): x, el.values())) - mind,maxd = minmax(dl.values()) - - gr = 'digraph "afterglow" {\n\tedge [len=2.5];\n' - - gr += "# src nodes\n" - for s in sl: - n,l = sl[s]; n = 1+float(n-mins)/(maxs-mins) - gr += '"src.%s" [label = "%s", shape=box, fillcolor="#FF0000", style=filled, fixedsize=1, height=%.2f,width=%.2f];\n' % (`s`,`s`,n,n) - gr += "# event nodes\n" - for e in el: - n,l = el[e]; n = n = 1+float(n-mine)/(maxe-mine) - gr += '"evt.%s" [label = "%s", shape=circle, fillcolor="#00FFFF", style=filled, fixedsize=1, height=%.2f, width=%.2f];\n' % (`e`,`e`,n,n) - for d in dl: - n = dl[d]; n = n = 1+float(n-mind)/(maxd-mind) - gr += '"dst.%s" [label = "%s", shape=triangle, fillcolor="#0000ff", style=filled, fixedsize=1, height=%.2f, width=%.2f];\n' % (`d`,`d`,n,n) - - gr += "###\n" - for s in sl: - n,l = sl[s] - for e in l: - gr += ' "src.%s" -> "evt.%s";\n' % (`s`,`e`) - for e in el: - n,l = el[e] - for d in l: - gr += ' "evt.%s" -> "dst.%s";\n' % (`e`,`d`) - - gr += "}" - return do_graph(gr, **kargs) - - - def _dump_document(self, **kargs): - import pyx - d = pyx.document.document() - l = len(self.res) - for i in range(len(self.res)): - elt = self.res[i] - c = self._elt2pkt(elt).canvas_dump(**kargs) - cbb = c.bbox() - c.text(cbb.left(),cbb.top()+1,r"\font\cmssfont=cmss12\cmssfont{Frame %i/%i}" % (i,l),[pyx.text.size.LARGE]) - if conf.verb >= 2: - os.write(1,".") - d.append(pyx.document.page(c, paperformat=pyx.document.paperformat.A4, - margin=1*pyx.unit.t_cm, - fittosize=1)) - return d - - - - def psdump(self, filename = None, **kargs): - """Creates a multipage poscript file with a psdump of every packet - filename: name of the file to write to. If empty, a temporary file is used and - conf.prog.psreader is called""" - d = self._dump_document(**kargs) - if filename is None: - filename = get_temp_file(autoext=".ps") - d.writePSfile(filename) - subprocess.Popen([conf.prog.psreader, filename+".ps"]) - else: - d.writePSfile(filename) - print - - def pdfdump(self, filename = None, **kargs): - """Creates a PDF file with a psdump of every packet - filename: name of the file to write to. If empty, a temporary file is used and - conf.prog.pdfreader is called""" - d = self._dump_document(**kargs) - if filename is None: - filename = get_temp_file(autoext=".pdf") - d.writePDFfile(filename) - subprocess.Popen([conf.prog.pdfreader, filename+".pdf"]) - else: - d.writePDFfile(filename) - print - - def sr(self,multi=0): - """sr([multi=1]) -> (SndRcvList, PacketList) - Matches packets in the list and return ( (matched couples), (unmatched packets) )""" - remain = self.res[:] - sr = [] - i = 0 - while i < len(remain): - s = remain[i] - j = i - while j < len(remain)-1: - j += 1 - r = remain[j] - if r.answers(s): - sr.append((s,r)) - if multi: - remain[i]._answered=1 - remain[j]._answered=2 - continue - del(remain[j]) - del(remain[i]) - i -= 1 - break - i += 1 - if multi: - remain = filter(lambda x:not hasattr(x,"_answered"), remain) - return SndRcvList(sr),PacketList(remain) - - def sessions(self, session_extractor=None): - if session_extractor is None: - def session_extractor(p): - sess = "Other" - if 'Ether' in p: - if 'IP' in p: - if 'TCP' in p: - sess = p.sprintf("TCP %IP.src%:%r,TCP.sport% > %IP.dst%:%r,TCP.dport%") - elif 'UDP' in p: - sess = p.sprintf("UDP %IP.src%:%r,UDP.sport% > %IP.dst%:%r,UDP.dport%") - elif 'ICMP' in p: - sess = p.sprintf("ICMP %IP.src% > %IP.dst% type=%r,ICMP.type% code=%r,ICMP.code% id=%ICMP.id%") - else: - sess = p.sprintf("IP %IP.src% > %IP.dst% proto=%IP.proto%") - elif 'ARP' in p: - sess = p.sprintf("ARP %ARP.psrc% > %ARP.pdst%") - else: - sess = p.sprintf("Ethernet type=%04xr,Ether.type%") - return sess - sessions = defaultdict(self.__class__) - for p in self.res: - sess = session_extractor(self._elt2pkt(p)) - sessions[sess].append(p) - return dict(sessions) - - def replace(self, *args, **kargs): - """ - lst.replace(<field>,[<oldvalue>,]<newvalue>) - lst.replace( (fld,[ov],nv),(fld,[ov,]nv),...) - if ov is None, all values are replaced - ex: - lst.replace( IP.src, "192.168.1.1", "10.0.0.1" ) - lst.replace( IP.ttl, 64 ) - lst.replace( (IP.ttl, 64), (TCP.sport, 666, 777), ) - """ - delete_checksums = kargs.get("delete_checksums",False) - x=PacketList(name="Replaced %s" % self.listname) - if type(args[0]) is not tuple: - args = (args,) - for p in self.res: - p = self._elt2pkt(p) - copied = False - for scheme in args: - fld = scheme[0] - old = scheme[1] # not used if len(scheme) == 2 - new = scheme[-1] - for o in fld.owners: - if o in p: - if len(scheme) == 2 or p[o].getfieldval(fld.name) == old: - if not copied: - p = p.copy() - if delete_checksums: - p.delete_checksums() - copied = True - setattr(p[o], fld.name, new) - x.append(p) - return x - - - - - - - -class SndRcvList(PacketList): - def __init__(self, res=None, name="Results", stats=None): - PacketList.__init__(self, res, name, stats) - def _elt2pkt(self, elt): - return elt[1] - def _elt2sum(self, elt): - return "%s ==> %s" % (elt[0].summary(),elt[1].summary()) - - - - - - - diff --git a/scripts/external_libs/scapy-2.3.1/scapy/pton_ntop.py b/scripts/external_libs/scapy-2.3.1/scapy/pton_ntop.py deleted file mode 100644 index 1bd88920..00000000 --- a/scripts/external_libs/scapy-2.3.1/scapy/pton_ntop.py +++ /dev/null @@ -1,89 +0,0 @@ -## This file is part of Scapy -## See http://www.secdev.org/projects/scapy for more informations -## Copyright (C) Philippe Biondi <phil@secdev.org> -## This program is published under a GPLv2 license - -""" -Convert IPv6 addresses between textual representation and binary. - -These functions are missing when python is compiled -without IPv6 support, on Windows for instance. -""" - -import socket,struct - -def inet_pton(af, addr): - """Convert an IP address from text representation into binary form""" - if af == socket.AF_INET: - return inet_aton(addr) - elif af == socket.AF_INET6: - # IPv6: The use of "::" indicates one or more groups of 16 bits of zeros. - # We deal with this form of wildcard using a special marker. - JOKER = "*" - while "::" in addr: - addr = addr.replace("::", ":" + JOKER + ":") - joker_pos = None - - # The last part of an IPv6 address can be an IPv4 address - ipv4_addr = None - if "." in addr: - ipv4_addr = addr.split(":")[-1] - - result = "" - parts = addr.split(":") - for part in parts: - if part == JOKER: - # Wildcard is only allowed once - if joker_pos is None: - joker_pos = len(result) - else: - raise Exception("Illegal syntax for IP address") - elif part == ipv4_addr: # FIXME: Make sure IPv4 can only be last part - # FIXME: inet_aton allows IPv4 addresses with less than 4 octets - result += socket.inet_aton(ipv4_addr) - else: - # Each part must be 16bit. Add missing zeroes before decoding. - try: - result += part.rjust(4, "0").decode("hex") - except TypeError: - raise Exception("Illegal syntax for IP address") - - # If there's a wildcard, fill up with zeros to reach 128bit (16 bytes) - if JOKER in addr: - result = (result[:joker_pos] + "\x00" * (16 - len(result)) - + result[joker_pos:]) - - if len(result) != 16: - raise Exception("Illegal syntax for IP address") - return result - else: - raise Exception("Address family not supported") - - -def inet_ntop(af, addr): - """Convert an IP address from binary form into text represenation""" - if af == socket.AF_INET: - return inet_ntoa(addr) - elif af == socket.AF_INET6: - # IPv6 addresses have 128bits (16 bytes) - if len(addr) != 16: - raise Exception("Illegal syntax for IP address") - parts = [] - for left in [0, 2, 4, 6, 8, 10, 12, 14]: - try: - value = struct.unpack("!H", addr[left:left+2])[0] - hexstr = hex(value)[2:] - except TypeError: - raise Exception("Illegal syntax for IP address") - parts.append(hexstr.lstrip("0").lower()) - result = ":".join(parts) - while ":::" in result: - result = result.replace(":::", "::") - # Leaving out leading and trailing zeros is only allowed with :: - if result.endswith(":") and not result.endswith("::"): - result = result + "0" - if result.startswith(":") and not result.startswith("::"): - result = "0" + result - return result - else: - raise Exception("Address family not supported yet") diff --git a/scripts/external_libs/scapy-2.3.1/scapy/route.py b/scripts/external_libs/scapy-2.3.1/scapy/route.py deleted file mode 100644 index d7e7ce4b..00000000 --- a/scripts/external_libs/scapy-2.3.1/scapy/route.py +++ /dev/null @@ -1,171 +0,0 @@ -## This file is part of Scapy -## See http://www.secdev.org/projects/scapy for more informations -## Copyright (C) Philippe Biondi <phil@secdev.org> -## This program is published under a GPLv2 license - -""" -Routing and handling of network interfaces. -""" - -import socket -from arch import read_routes,get_if_addr,LOOPBACK_NAME -from utils import atol,ltoa,itom -from config import conf -from error import Scapy_Exception,warning - -############################## -## Routing/Interfaces stuff ## -############################## - -class Route: - def __init__(self): - self.resync() - self.s=socket.socket(socket.AF_INET, socket.SOCK_DGRAM) - self.cache = {} - - def invalidate_cache(sel): - self.cache = {} - - def resync(self): - self.invalidate_cache() - self.routes = read_routes() - - def __repr__(self): - rt = "Network Netmask Gateway Iface Output IP\n" - for net,msk,gw,iface,addr in self.routes: - rt += "%-15s %-15s %-15s %-15s %-15s\n" % (ltoa(net), - ltoa(msk), - gw, - iface, - addr) - return rt - - def make_route(self, host=None, net=None, gw=None, dev=None): - if host is not None: - thenet,msk = host,32 - elif net is not None: - thenet,msk = net.split("/") - msk = int(msk) - else: - raise Scapy_Exception("make_route: Incorrect parameters. You should specify a host or a net") - if gw is None: - gw="0.0.0.0" - if dev is None: - if gw: - nhop = gw - else: - nhop = thenet - dev,ifaddr,x = self.route(nhop) - else: - ifaddr = get_if_addr(dev) - return (atol(thenet), itom(msk), gw, dev, ifaddr) - - def add(self, *args, **kargs): - """Ex: - add(net="192.168.1.0/24",gw="1.2.3.4") - """ - self.invalidate_cache() - self.routes.append(self.make_route(*args,**kargs)) - - - def delt(self, *args, **kargs): - """delt(host|net, gw|dev)""" - self.invalidate_cache() - route = self.make_route(*args,**kargs) - try: - i=self.routes.index(route) - del(self.routes[i]) - except ValueError: - warning("no matching route found") - - def ifchange(self, iff, addr): - self.invalidate_cache() - the_addr,the_msk = (addr.split("/")+["32"])[:2] - the_msk = itom(int(the_msk)) - the_rawaddr = atol(the_addr) - the_net = the_rawaddr & the_msk - - - for i in range(len(self.routes)): - net,msk,gw,iface,addr = self.routes[i] - if iface != iff: - continue - if gw == '0.0.0.0': - self.routes[i] = (the_net,the_msk,gw,iface,the_addr) - else: - self.routes[i] = (net,msk,gw,iface,the_addr) - conf.netcache.flush() - - - - def ifdel(self, iff): - self.invalidate_cache() - new_routes=[] - for rt in self.routes: - if rt[3] != iff: - new_routes.append(rt) - self.routes=new_routes - - def ifadd(self, iff, addr): - self.invalidate_cache() - the_addr,the_msk = (addr.split("/")+["32"])[:2] - the_msk = itom(int(the_msk)) - the_rawaddr = atol(the_addr) - the_net = the_rawaddr & the_msk - self.routes.append((the_net,the_msk,'0.0.0.0',iff,the_addr)) - - - def route(self,dest,verbose=None): - if type(dest) is list and dest: - dest = dest[0] - if dest in self.cache: - return self.cache[dest] - if verbose is None: - verbose=conf.verb - # Transform "192.168.*.1-5" to one IP of the set - dst = dest.split("/")[0] - dst = dst.replace("*","0") - while 1: - l = dst.find("-") - if l < 0: - break - m = (dst[l:]+".").find(".") - dst = dst[:l]+dst[l+m:] - - - dst = atol(dst) - pathes=[] - for d,m,gw,i,a in self.routes: - aa = atol(a) - if aa == dst: - pathes.append((0xffffffffL,(LOOPBACK_NAME,a,"0.0.0.0"))) - if (dst & m) == (d & m): - pathes.append((m,(i,a,gw))) - if not pathes: - #if verbose: - # warning("No route found (no default route?)") - return LOOPBACK_NAME,"0.0.0.0","0.0.0.0" #XXX linux specific! - # Choose the more specific route (greatest netmask). - # XXX: we don't care about metrics - pathes.sort() - ret = pathes[-1][1] - self.cache[dest] = ret - return ret - - def get_if_bcast(self, iff): - for net, msk, gw, iface, addr in self.routes: - if (iff == iface and net != 0L): - bcast = atol(addr)|(~msk&0xffffffffL); # FIXME: check error in atol() - return ltoa(bcast); - warning("No broadcast address found for iface %s\n" % iff); - -conf.route=None; -#Route() - -#XXX use "with" -_betteriface = None - -#conf.route.route("0.0.0.0", verbose=0)[0] -if _betteriface != LOOPBACK_NAME: - conf.iface = _betteriface -del(_betteriface) diff --git a/scripts/external_libs/scapy-2.3.1/scapy/route6.py b/scripts/external_libs/scapy-2.3.1/scapy/route6.py deleted file mode 100644 index 1bc5d491..00000000 --- a/scripts/external_libs/scapy-2.3.1/scapy/route6.py +++ /dev/null @@ -1,280 +0,0 @@ -## This file is part of Scapy -## See http://www.secdev.org/projects/scapy for more informations -## Copyright (C) Philippe Biondi <phil@secdev.org> -## This program is published under a GPLv2 license - -## Copyright (C) 2005 Guillaume Valadon <guedou@hongo.wide.ad.jp> -## Arnaud Ebalard <arnaud.ebalard@eads.net> - -""" -Routing and network interface handling for IPv6. -""" - -############################################################################# -############################################################################# -### Routing/Interfaces stuff ### -############################################################################# -############################################################################# - -import socket -from config import conf -from utils6 import * -from arch import * - - -class Route6: - - def __init__(self): - self.invalidate_cache() - self.resync() - - def invalidate_cache(self): - self.cache = {} - - def flush(self): - self.invalidate_cache() - self.routes = [] - - def resync(self): - # TODO : At the moment, resync will drop existing Teredo routes - # if any. Change that ... - self.invalidate_cache() - self.routes = read_routes6() - if self.routes == []: - log_loading.info("No IPv6 support in kernel") - - def __repr__(self): - rtlst = [('Destination', 'Next Hop', "iface", "src candidates")] - - for net,msk,gw,iface,cset in self.routes: - rtlst.append(('%s/%i'% (net,msk), gw, iface, ", ".join(cset))) - - colwidth = map(lambda x: max(map(lambda y: len(y), x)), apply(zip, rtlst)) - fmt = " ".join(map(lambda x: "%%-%ds"%x, colwidth)) - rt = "\n".join(map(lambda x: fmt % x, rtlst)) - - return rt - - - # Unlike Scapy's Route.make_route() function, we do not have 'host' and 'net' - # parameters. We only have a 'dst' parameter that accepts 'prefix' and - # 'prefix/prefixlen' values. - # WARNING: Providing a specific device will at the moment not work correctly. - def make_route(self, dst, gw=None, dev=None): - """Internal function : create a route for 'dst' via 'gw'. - """ - prefix, plen = (dst.split("/")+["128"])[:2] - plen = int(plen) - - if gw is None: - gw = "::" - if dev is None: - dev, ifaddr, x = self.route(gw) - else: - # TODO: do better than that - # replace that unique address by the list of all addresses - lifaddr = in6_getifaddr() - devaddrs = filter(lambda x: x[2] == dev, lifaddr) - ifaddr = construct_source_candidate_set(prefix, plen, devaddrs, LOOPBACK_NAME) - - return (prefix, plen, gw, dev, ifaddr) - - - def add(self, *args, **kargs): - """Ex: - add(dst="2001:db8:cafe:f000::/56") - add(dst="2001:db8:cafe:f000::/56", gw="2001:db8:cafe::1") - add(dst="2001:db8:cafe:f000::/64", gw="2001:db8:cafe::1", dev="eth0") - """ - self.invalidate_cache() - self.routes.append(self.make_route(*args, **kargs)) - - - def delt(self, dst, gw=None): - """ Ex: - delt(dst="::/0") - delt(dst="2001:db8:cafe:f000::/56") - delt(dst="2001:db8:cafe:f000::/56", gw="2001:db8:deca::1") - """ - tmp = dst+"/128" - dst, plen = tmp.split('/')[:2] - dst = in6_ptop(dst) - plen = int(plen) - l = filter(lambda x: in6_ptop(x[0]) == dst and x[1] == plen, self.routes) - if gw: - gw = in6_ptop(gw) - l = filter(lambda x: in6_ptop(x[0]) == gw, self.routes) - if len(l) == 0: - warning("No matching route found") - elif len(l) > 1: - warning("Found more than one match. Aborting.") - else: - i=self.routes.index(l[0]) - self.invalidate_cache() - del(self.routes[i]) - - def ifchange(self, iff, addr): - the_addr, the_plen = (addr.split("/")+["128"])[:2] - the_plen = int(the_plen) - - naddr = inet_pton(socket.AF_INET6, the_addr) - nmask = in6_cidr2mask(the_plen) - the_net = inet_ntop(socket.AF_INET6, in6_and(nmask,naddr)) - - for i in range(len(self.routes)): - net,plen,gw,iface,addr = self.routes[i] - if iface != iff: - continue - if gw == '::': - self.routes[i] = (the_net,the_plen,gw,iface,the_addr) - else: - self.routes[i] = (net,the_plen,gw,iface,the_addr) - self.invalidate_cache() - ip6_neigh_cache.flush() - - def ifdel(self, iff): - """ removes all route entries that uses 'iff' interface. """ - new_routes=[] - for rt in self.routes: - if rt[3] != iff: - new_routes.append(rt) - self.invalidate_cache() - self.routes = new_routes - - - def ifadd(self, iff, addr): - """ - Add an interface 'iff' with provided address into routing table. - - Ex: ifadd('eth0', '2001:bd8:cafe:1::1/64') will add following entry into - Scapy6 internal routing table: - - Destination Next Hop iface Def src @ - 2001:bd8:cafe:1::/64 :: eth0 2001:bd8:cafe:1::1 - - prefix length value can be omitted. In that case, a value of 128 - will be used. - """ - addr, plen = (addr.split("/")+["128"])[:2] - addr = in6_ptop(addr) - plen = int(plen) - naddr = inet_pton(socket.AF_INET6, addr) - nmask = in6_cidr2mask(plen) - prefix = inet_ntop(socket.AF_INET6, in6_and(nmask,naddr)) - self.invalidate_cache() - self.routes.append((prefix,plen,'::',iff,[addr])) - - def route(self, dst, dev=None): - """ - Provide best route to IPv6 destination address, based on Scapy6 - internal routing table content. - - When a set of address is passed (e.g. 2001:db8:cafe:*::1-5) an address - of the set is used. Be aware of that behavior when using wildcards in - upper parts of addresses ! - - If 'dst' parameter is a FQDN, name resolution is performed and result - is used. - - if optional 'dev' parameter is provided a specific interface, filtering - is performed to limit search to route associated to that interface. - """ - # Transform "2001:db8:cafe:*::1-5:0/120" to one IPv6 address of the set - dst = dst.split("/")[0] - savedst = dst # In case following inet_pton() fails - dst = dst.replace("*","0") - l = dst.find("-") - while l >= 0: - m = (dst[l:]+":").find(":") - dst = dst[:l]+dst[l+m:] - l = dst.find("-") - - try: - inet_pton(socket.AF_INET6, dst) - except socket.error: - dst = socket.getaddrinfo(savedst, None, socket.AF_INET6)[0][-1][0] - # TODO : Check if name resolution went well - - # Deal with dev-specific request for cache search - k = dst - if dev is not None: - k = dst + "%%" + dev - if k in self.cache: - return self.cache[k] - - pathes = [] - - # TODO : review all kinds of addresses (scope and *cast) to see - # if we are able to cope with everything possible. I'm convinced - # it's not the case. - # -- arnaud - for p, plen, gw, iface, cset in self.routes: - if dev is not None and iface != dev: - continue - if in6_isincluded(dst, p, plen): - pathes.append((plen, (iface, cset, gw))) - elif (in6_ismlladdr(dst) and in6_islladdr(p) and in6_islladdr(cset[0])): - pathes.append((plen, (iface, cset, gw))) - - if not pathes: - warning("No route found for IPv6 destination %s (no default route?)" % dst) - return (LOOPBACK_NAME, "::", "::") # XXX Linux specific - - # Sort with longest prefix first - pathes.sort(reverse=True) - - best_plen = pathes[0][0] - pathes = filter(lambda x: x[0] == best_plen, pathes) - - res = [] - for p in pathes: # Here we select best source address for every route - tmp = p[1] - srcaddr = get_source_addr_from_candidate_set(dst, p[1][1]) - if srcaddr is not None: - res.append((p[0], (tmp[0], srcaddr, tmp[2]))) - - if res == []: - warning("Found a route for IPv6 destination '%s', but no possible source address." % dst) - return (LOOPBACK_NAME, "::", "::") # XXX Linux specific - - # Symptom : 2 routes with same weight (our weight is plen) - # Solution : - # - dst is unicast global. Check if it is 6to4 and we have a source - # 6to4 address in those available - # - dst is link local (unicast or multicast) and multiple output - # interfaces are available. Take main one (conf.iface6) - # - if none of the previous or ambiguity persists, be lazy and keep - # first one - # XXX TODO : in a _near_ future, include metric in the game - - if len(res) > 1: - tmp = [] - if in6_isgladdr(dst) and in6_isaddr6to4(dst): - # TODO : see if taking the longest match between dst and - # every source addresses would provide better results - tmp = filter(lambda x: in6_isaddr6to4(x[1][1]), res) - elif in6_ismaddr(dst) or in6_islladdr(dst): - # TODO : I'm sure we are not covering all addresses. Check that - tmp = filter(lambda x: x[1][0] == conf.iface6, res) - - if tmp: - res = tmp - - # Fill the cache (including dev-specific request) - k = dst - if dev is not None: - k = dst + "%%" + dev - self.cache[k] = res[0][1] - - return res[0][1] - -conf.route6 = Route6() - -# TBD-hhaim no need for route -#_res = conf.route6.route("::/0") -_res = None; -if _res: - iff, gw, addr = _res - conf.iface6 = iff -del(_res) - diff --git a/scripts/external_libs/scapy-2.3.1/scapy/scapypipes.py b/scripts/external_libs/scapy-2.3.1/scapy/scapypipes.py deleted file mode 100644 index 29b370bc..00000000 --- a/scripts/external_libs/scapy-2.3.1/scapy/scapypipes.py +++ /dev/null @@ -1,123 +0,0 @@ -## This file is part of Scapy -## See http://www.secdev.org/projects/scapy for more informations -## Copyright (C) Philippe Biondi <phil@secdev.org> -## This program is published under a GPLv2 license - -from pipetool import Source,Drain,Sink -from config import conf - - -class SniffSource(Source): - """Read packets from an interface and send them to low exit. - +-----------+ - >>-| |->> - | | - >-| [iface]--|-> - +-----------+ -""" - def __init__(self, iface=None, filter=None, name=None): - Source.__init__(self, name=name) - self.iface = iface - self.filter = filter - def start(self): - self.s = conf.L2listen(iface=self.iface, filter=self.filter) - def stop(self): - self.s.close() - def fileno(self): - return self.s.fileno() - def deliver(self): - self._send(self.s.recv()) - -class RdpcapSource(Source): - """Read packets from a PCAP file send them to low exit. - +----------+ - >>-| |->> - | | - >-| [pcap]--|-> - +----------+ -""" - def __init__(self, fname, name=None): - Source.__init__(self, name=name) - self.fname = fname - self.f = PcapReader(self.fname) - def start(self): - print "start" - self.f = PcapReader(self.fname) - self.is_exhausted = False - def stop(self): - print "stop" - self.f.close() - def fileno(self): - return self.f.fileno() - def deliver(self): - p = self.f.recv() - print "deliver %r" % p - if p is None: - self.is_exhausted = True - else: - self._send(p) - - -class InjectSink(Sink): - """Packets received on low input are injected to an interface - +-----------+ - >>-| |->> - | | - >-|--[iface] |-> - +-----------+ -""" - def __init__(self, iface=None, name=None): - Sink.__init__(self, name=name) - if iface == None: - iface = conf.iface - self.iface = iface - def start(self): - self.s = conf.L2socket(iface=self.iface) - def stop(self): - self.s.close() - def push(self, msg): - self.s.send(msg) - -class Inject3Sink(InjectSink): - def start(self): - self.s = conf.L3socket(iface=self.iface) - - -class WrpcapSink(Sink): - """Packets received on low input are written to PCA file - +----------+ - >>-| |->> - | | - >-|--[pcap] |-> - +----------+ -""" - def __init__(self, fname, name=None): - Sink.__init__(self, name=name) - self.f = PcapWriter(fname) - def stop(self): - self.f.flush() - def push(self, msg): - self.f.write(msg) - - -class UDPDrain(Drain): - """Apply a function to messages on low and high entry - +-------------+ - >>-|--[payload]--|->> - | X | - >-|----[UDP]----|-> - +-------------+ -""" - def __init__(self, ip="127.0.0.1", port=1234): - Drain.__init__(self) - self.ip = ip - self.port = port - - def push(self, msg): - if IP in msg and msg[IP].proto == 17 and UDP in msg: - payload = msg[UDP].payload - self._high_send(str(payload)) - def high_push(self, msg): - p = IP(dst=self.ip)/UDP(sport=1234,dport=self.port)/msg - self._send(p) - diff --git a/scripts/external_libs/scapy-2.3.1/scapy/sendrecv.py b/scripts/external_libs/scapy-2.3.1/scapy/sendrecv.py deleted file mode 100644 index c4024eef..00000000 --- a/scripts/external_libs/scapy-2.3.1/scapy/sendrecv.py +++ /dev/null @@ -1,667 +0,0 @@ -## This file is part of Scapy -## See http://www.secdev.org/projects/scapy for more informations -## Copyright (C) Philippe Biondi <phil@secdev.org> -## This program is published under a GPLv2 license - -""" -Functions to send and receive packets. -""" - -import cPickle,os,sys,time,subprocess -from select import select -from data import * -import arch -from config import conf -from packet import Gen -from utils import warning,get_temp_file,PcapReader,wrpcap -import plist -from error import log_runtime,log_interactive -from base_classes import SetGen - -################# -## Debug class ## -################# - -class debug: - recv=[] - sent=[] - match=[] - - -#################### -## Send / Receive ## -#################### - - - - -def sndrcv(pks, pkt, timeout = None, inter = 0, verbose=None, chainCC=0, retry=0, multi=0): - if not isinstance(pkt, Gen): - pkt = SetGen(pkt) - - if verbose is None: - verbose = conf.verb - debug.recv = plist.PacketList([],"Unanswered") - debug.sent = plist.PacketList([],"Sent") - debug.match = plist.SndRcvList([]) - nbrecv=0 - ans = [] - # do it here to fix random fields, so that parent and child have the same - all_stimuli = tobesent = [p for p in pkt] - notans = len(tobesent) - - hsent={} - for i in tobesent: - h = i.hashret() - if h in hsent: - hsent[h].append(i) - else: - hsent[h] = [i] - if retry < 0: - retry = -retry - autostop=retry - else: - autostop=0 - - - while retry >= 0: - found=0 - - if timeout < 0: - timeout = None - - rdpipe,wrpipe = os.pipe() - rdpipe=os.fdopen(rdpipe) - wrpipe=os.fdopen(wrpipe,"w") - - pid=1 - try: - pid = os.fork() - if pid == 0: - try: - sys.stdin.close() - rdpipe.close() - try: - i = 0 - if verbose: - print "Begin emission:" - for p in tobesent: - pks.send(p) - i += 1 - time.sleep(inter) - if verbose: - print "Finished to send %i packets." % i - except SystemExit: - pass - except KeyboardInterrupt: - pass - except: - log_runtime.exception("--- Error in child %i" % os.getpid()) - log_runtime.info("--- Error in child %i" % os.getpid()) - finally: - try: - os.setpgrp() # Chance process group to avoid ctrl-C - sent_times = [p.sent_time for p in all_stimuli if p.sent_time] - cPickle.dump( (conf.netcache,sent_times), wrpipe ) - wrpipe.close() - except: - pass - elif pid < 0: - log_runtime.error("fork error") - else: - wrpipe.close() - stoptime = 0 - remaintime = None - inmask = [rdpipe,pks] - try: - try: - while 1: - if stoptime: - remaintime = stoptime-time.time() - if remaintime <= 0: - break - r = None - if arch.FREEBSD or arch.DARWIN: - inp, out, err = select(inmask,[],[], 0.05) - if len(inp) == 0 or pks in inp: - r = pks.nonblock_recv() - else: - inp, out, err = select(inmask,[],[], remaintime) - if len(inp) == 0: - break - if pks in inp: - r = pks.recv(MTU) - if rdpipe in inp: - if timeout: - stoptime = time.time()+timeout - del(inmask[inmask.index(rdpipe)]) - if r is None: - continue - ok = 0 - h = r.hashret() - if h in hsent: - hlst = hsent[h] - for i in range(len(hlst)): - if r.answers(hlst[i]): - ans.append((hlst[i],r)) - if verbose > 1: - os.write(1, "*") - ok = 1 - if not multi: - del(hlst[i]) - notans -= 1; - else: - if not hasattr(hlst[i], '_answered'): - notans -= 1; - hlst[i]._answered = 1; - break - if notans == 0 and not multi: - break - if not ok: - if verbose > 1: - os.write(1, ".") - nbrecv += 1 - if conf.debug_match: - debug.recv.append(r) - except KeyboardInterrupt: - if chainCC: - raise - finally: - try: - nc,sent_times = cPickle.load(rdpipe) - except EOFError: - warning("Child died unexpectedly. Packets may have not been sent %i"%os.getpid()) - else: - conf.netcache.update(nc) - for p,t in zip(all_stimuli, sent_times): - p.sent_time = t - os.waitpid(pid,0) - finally: - if pid == 0: - os._exit(0) - - remain = reduce(list.__add__, hsent.values(), []) - if multi: - remain = filter(lambda p: not hasattr(p, '_answered'), remain); - - if autostop and len(remain) > 0 and len(remain) != len(tobesent): - retry = autostop - - tobesent = remain - if len(tobesent) == 0: - break - retry -= 1 - - if conf.debug_match: - debug.sent=plist.PacketList(remain[:],"Sent") - debug.match=plist.SndRcvList(ans[:]) - - #clean the ans list to delete the field _answered - if (multi): - for s,r in ans: - if hasattr(s, '_answered'): - del(s._answered) - - if verbose: - print "\nReceived %i packets, got %i answers, remaining %i packets" % (nbrecv+len(ans), len(ans), notans) - return plist.SndRcvList(ans),plist.PacketList(remain,"Unanswered") - - -def __gen_send(s, x, inter=0, loop=0, count=None, verbose=None, realtime=None, *args, **kargs): - if type(x) is str: - x = conf.raw_layer(load=x) - if not isinstance(x, Gen): - x = SetGen(x) - if verbose is None: - verbose = conf.verb - n = 0 - if count is not None: - loop = -count - elif not loop: - loop=-1 - try: - while loop: - dt0 = None - for p in x: - if realtime: - ct = time.time() - if dt0: - st = dt0+p.time-ct - if st > 0: - time.sleep(st) - else: - dt0 = ct-p.time - s.send(p) - n += 1 - if verbose: - os.write(1,".") - time.sleep(inter) - if loop < 0: - loop += 1 - except KeyboardInterrupt: - pass - s.close() - if verbose: - print "\nSent %i packets." % n - -@conf.commands.register -def send(x, inter=0, loop=0, count=None, verbose=None, realtime=None, *args, **kargs): - """Send packets at layer 3 -send(packets, [inter=0], [loop=0], [verbose=conf.verb]) -> None""" - __gen_send(conf.L3socket(*args, **kargs), x, inter=inter, loop=loop, count=count,verbose=verbose, realtime=realtime) - -@conf.commands.register -def sendp(x, inter=0, loop=0, iface=None, iface_hint=None, count=None, verbose=None, realtime=None, *args, **kargs): - """Send packets at layer 2 -sendp(packets, [inter=0], [loop=0], [verbose=conf.verb]) -> None""" - if iface is None and iface_hint is not None: - iface = conf.route.route(iface_hint)[0] - __gen_send(conf.L2socket(iface=iface, *args, **kargs), x, inter=inter, loop=loop, count=count, verbose=verbose, realtime=realtime) - -@conf.commands.register -def sendpfast(x, pps=None, mbps=None, realtime=None, loop=0, file_cache=False, iface=None): - """Send packets at layer 2 using tcpreplay for performance - pps: packets per second - mpbs: MBits per second - realtime: use packet's timestamp, bending time with realtime value - loop: number of times to process the packet list - file_cache: cache packets in RAM instead of reading from disk at each iteration - iface: output interface """ - if iface is None: - iface = conf.iface - argv = [conf.prog.tcpreplay, "--intf1=%s" % iface ] - if pps is not None: - argv.append("--pps=%i" % pps) - elif mbps is not None: - argv.append("--mbps=%i" % mbps) - elif realtime is not None: - argv.append("--multiplier=%i" % realtime) - else: - argv.append("--topspeed") - - if loop: - argv.append("--loop=%i" % loop) - if file_cache: - argv.append("--enable-file-cache") - - f = get_temp_file() - argv.append(f) - wrpcap(f, x) - try: - subprocess.check_call(argv) - except KeyboardInterrupt: - log_interactive.info("Interrupted by user") - except Exception,e: - log_interactive.error("while trying to exec [%s]: %s" % (argv[0],e)) - finally: - os.unlink(f) - - - - - -@conf.commands.register -def sr(x,filter=None, iface=None, nofilter=0, *args,**kargs): - """Send and receive packets at layer 3 -nofilter: put 1 to avoid use of bpf filters -retry: if positive, how many times to resend unanswered packets - if negative, how many times to retry when no more packets are answered -timeout: how much time to wait after the last packet has been sent -verbose: set verbosity level -multi: whether to accept multiple answers for the same stimulus -filter: provide a BPF filter -iface: listen answers only on the given interface""" - if not kargs.has_key("timeout"): - kargs["timeout"] = -1 - s = conf.L3socket(filter=filter, iface=iface, nofilter=nofilter) - a,b=sndrcv(s,x,*args,**kargs) - s.close() - return a,b - -@conf.commands.register -def sr1(x,filter=None,iface=None, nofilter=0, *args,**kargs): - """Send packets at layer 3 and return only the first answer -nofilter: put 1 to avoid use of bpf filters -retry: if positive, how many times to resend unanswered packets - if negative, how many times to retry when no more packets are answered -timeout: how much time to wait after the last packet has been sent -verbose: set verbosity level -multi: whether to accept multiple answers for the same stimulus -filter: provide a BPF filter -iface: listen answers only on the given interface""" - if not kargs.has_key("timeout"): - kargs["timeout"] = -1 - s=conf.L3socket(filter=filter, nofilter=nofilter, iface=iface) - a,b=sndrcv(s,x,*args,**kargs) - s.close() - if len(a) > 0: - return a[0][1] - else: - return None - -@conf.commands.register -def srp(x,iface=None, iface_hint=None, filter=None, nofilter=0, type=ETH_P_ALL, *args,**kargs): - """Send and receive packets at layer 2 -nofilter: put 1 to avoid use of bpf filters -retry: if positive, how many times to resend unanswered packets - if negative, how many times to retry when no more packets are answered -timeout: how much time to wait after the last packet has been sent -verbose: set verbosity level -multi: whether to accept multiple answers for the same stimulus -filter: provide a BPF filter -iface: work only on the given interface""" - if not kargs.has_key("timeout"): - kargs["timeout"] = -1 - if iface is None and iface_hint is not None: - iface = conf.route.route(iface_hint)[0] - s = conf.L2socket(iface=iface, filter=filter, nofilter=nofilter, type=type) - a,b=sndrcv(s ,x,*args,**kargs) - s.close() - return a,b - -@conf.commands.register -def srp1(*args,**kargs): - """Send and receive packets at layer 2 and return only the first answer -nofilter: put 1 to avoid use of bpf filters -retry: if positive, how many times to resend unanswered packets - if negative, how many times to retry when no more packets are answered -timeout: how much time to wait after the last packet has been sent -verbose: set verbosity level -multi: whether to accept multiple answers for the same stimulus -filter: provide a BPF filter -iface: work only on the given interface""" - if not kargs.has_key("timeout"): - kargs["timeout"] = -1 - a,b=srp(*args,**kargs) - if len(a) > 0: - return a[0][1] - else: - return None - -def __sr_loop(srfunc, pkts, prn=lambda x:x[1].summary(), prnfail=lambda x:x.summary(), inter=1, timeout=None, count=None, verbose=None, store=1, *args, **kargs): - n = 0 - r = 0 - ct = conf.color_theme - if verbose is None: - verbose = conf.verb - parity = 0 - ans=[] - unans=[] - if timeout is None: - timeout = min(2*inter, 5) - try: - while 1: - parity ^= 1 - col = [ct.even,ct.odd][parity] - if count is not None: - if count == 0: - break - count -= 1 - start = time.time() - print "\rsend...\r", - res = srfunc(pkts, timeout=timeout, verbose=0, chainCC=1, *args, **kargs) - n += len(res[0])+len(res[1]) - r += len(res[0]) - if verbose > 1 and prn and len(res[0]) > 0: - msg = "RECV %i:" % len(res[0]) - print "\r"+ct.success(msg), - for p in res[0]: - print col(prn(p)) - print " "*len(msg), - if verbose > 1 and prnfail and len(res[1]) > 0: - msg = "fail %i:" % len(res[1]) - print "\r"+ct.fail(msg), - for p in res[1]: - print col(prnfail(p)) - print " "*len(msg), - if verbose > 1 and not (prn or prnfail): - print "recv:%i fail:%i" % tuple(map(len, res[:2])) - if store: - ans += res[0] - unans += res[1] - end=time.time() - if end-start < inter: - time.sleep(inter+start-end) - except KeyboardInterrupt: - pass - - if verbose and n>0: - print ct.normal("\nSent %i packets, received %i packets. %3.1f%% hits." % (n,r,100.0*r/n)) - return plist.SndRcvList(ans),plist.PacketList(unans) - -@conf.commands.register -def srloop(pkts, *args, **kargs): - """Send a packet at layer 3 in loop and print the answer each time -srloop(pkts, [prn], [inter], [count], ...) --> None""" - return __sr_loop(sr, pkts, *args, **kargs) - -@conf.commands.register -def srploop(pkts, *args, **kargs): - """Send a packet at layer 2 in loop and print the answer each time -srloop(pkts, [prn], [inter], [count], ...) --> None""" - return __sr_loop(srp, pkts, *args, **kargs) - - -def sndrcvflood(pks, pkt, prn=lambda (s,r):r.summary(), chainCC=0, store=1, unique=0): - if not isinstance(pkt, Gen): - pkt = SetGen(pkt) - tobesent = [p for p in pkt] - received = plist.SndRcvList() - seen = {} - - hsent={} - for i in tobesent: - h = i.hashret() - if h in hsent: - hsent[h].append(i) - else: - hsent[h] = [i] - - def send_in_loop(tobesent): - while 1: - for p in tobesent: - yield p - - packets_to_send = send_in_loop(tobesent) - - ssock = rsock = pks.fileno() - - try: - while 1: - readyr,readys,_ = select([rsock],[ssock],[]) - if ssock in readys: - pks.send(packets_to_send.next()) - - if rsock in readyr: - p = pks.recv(MTU) - if p is None: - continue - h = p.hashret() - if h in hsent: - hlst = hsent[h] - for i in hlst: - if p.answers(i): - res = prn((i,p)) - if unique: - if res in seen: - continue - seen[res] = None - if res is not None: - print res - if store: - received.append((i,p)) - except KeyboardInterrupt: - if chainCC: - raise - return received - -@conf.commands.register -def srflood(x,filter=None, iface=None, nofilter=None, *args,**kargs): - """Flood and receive packets at layer 3 -prn: function applied to packets received. Ret val is printed if not None -store: if 1 (default), store answers and return them -unique: only consider packets whose print -nofilter: put 1 to avoid use of bpf filters -filter: provide a BPF filter -iface: listen answers only on the given interface""" - s = conf.L3socket(filter=filter, iface=iface, nofilter=nofilter) - r=sndrcvflood(s,x,*args,**kargs) - s.close() - return r - -@conf.commands.register -def srpflood(x,filter=None, iface=None, iface_hint=None, nofilter=None, *args,**kargs): - """Flood and receive packets at layer 2 -prn: function applied to packets received. Ret val is printed if not None -store: if 1 (default), store answers and return them -unique: only consider packets whose print -nofilter: put 1 to avoid use of bpf filters -filter: provide a BPF filter -iface: listen answers only on the given interface""" - if iface is None and iface_hint is not None: - iface = conf.route.route(iface_hint)[0] - s = conf.L2socket(filter=filter, iface=iface, nofilter=nofilter) - r=sndrcvflood(s,x,*args,**kargs) - s.close() - return r - - - - -@conf.commands.register -def sniff(count=0, store=1, offline=None, prn = None, lfilter=None, L2socket=None, timeout=None, - opened_socket=None, stop_filter=None, *arg, **karg): - """Sniff packets -sniff([count=0,] [prn=None,] [store=1,] [offline=None,] [lfilter=None,] + L2ListenSocket args) -> list of packets - - count: number of packets to capture. 0 means infinity - store: wether to store sniffed packets or discard them - prn: function to apply to each packet. If something is returned, - it is displayed. Ex: - ex: prn = lambda x: x.summary() -lfilter: python function applied to each packet to determine - if further action may be done - ex: lfilter = lambda x: x.haslayer(Padding) -offline: pcap file to read packets from, instead of sniffing them -timeout: stop sniffing after a given time (default: None) -L2socket: use the provided L2socket -opened_socket: provide an object ready to use .recv() on -stop_filter: python function applied to each packet to determine - if we have to stop the capture after this packet - ex: stop_filter = lambda x: x.haslayer(TCP) - """ - c = 0 - - if opened_socket is not None: - s = opened_socket - else: - if offline is None: - if L2socket is None: - L2socket = conf.L2listen - s = L2socket(type=ETH_P_ALL, *arg, **karg) - else: - s = PcapReader(offline) - - lst = [] - if timeout is not None: - stoptime = time.time()+timeout - remain = None - try: - while 1: - if timeout is not None: - remain = stoptime-time.time() - if remain <= 0: - break - sel = select([s],[],[],remain) - if s in sel[0]: - p = s.recv(MTU) - if p is None: - break - if lfilter and not lfilter(p): - continue - if store: - lst.append(p) - c += 1 - if prn: - r = prn(p) - if r is not None: - print r - if stop_filter and stop_filter(p): - break - if count > 0 and c >= count: - break - except KeyboardInterrupt: - pass - if opened_socket is None: - s.close() - return plist.PacketList(lst,"Sniffed") - - -@conf.commands.register -def bridge_and_sniff(if1, if2, count=0, store=1, offline=None, prn = None, lfilter=None, L2socket=None, timeout=None, - stop_filter=None, *args, **kargs): - """Forward traffic between two interfaces and sniff packets exchanged -bridge_and_sniff([count=0,] [prn=None,] [store=1,] [offline=None,] [lfilter=None,] + L2Socket args) -> list of packets - - count: number of packets to capture. 0 means infinity - store: wether to store sniffed packets or discard them - prn: function to apply to each packet. If something is returned, - it is displayed. Ex: - ex: prn = lambda x: x.summary() -lfilter: python function applied to each packet to determine - if further action may be done - ex: lfilter = lambda x: x.haslayer(Padding) -timeout: stop sniffing after a given time (default: None) -L2socket: use the provided L2socket -stop_filter: python function applied to each packet to determine - if we have to stop the capture after this packet - ex: stop_filter = lambda x: x.haslayer(TCP) - """ - c = 0 - if L2socket is None: - L2socket = conf.L2socket - s1 = L2socket(iface=if1) - s2 = L2socket(iface=if2) - peerof={s1:s2,s2:s1} - label={s1:if1, s2:if2} - - lst = [] - if timeout is not None: - stoptime = time.time()+timeout - remain = None - try: - while True: - if timeout is not None: - remain = stoptime-time.time() - if remain <= 0: - break - ins,outs,errs = select([s1,s2],[],[], remain) - for s in ins: - p = s.recv() - if p is not None: - peerof[s].send(p.original) - if lfilter and not lfilter(p): - continue - if store: - p.sniffed_on = label[s] - lst.append(p) - c += 1 - if prn: - r = prn(p) - if r is not None: - print "%s: %s" % (label[s],r) - if stop_filter and stop_filter(p): - break - if count > 0 and c >= count: - break - except KeyboardInterrupt: - pass - finally: - return plist.PacketList(lst,"Sniffed") - - -@conf.commands.register -def tshark(*args,**kargs): - """Sniff packets and print them calling pkt.show(), a bit like text wireshark""" - sniff(prn=lambda x: x.display(),*args,**kargs) - diff --git a/scripts/external_libs/scapy-2.3.1/scapy/supersocket.py b/scripts/external_libs/scapy-2.3.1/scapy/supersocket.py deleted file mode 100644 index a5fe5e40..00000000 --- a/scripts/external_libs/scapy-2.3.1/scapy/supersocket.py +++ /dev/null @@ -1,141 +0,0 @@ -## This file is part of Scapy -## See http://www.secdev.org/projects/scapy for more informations -## Copyright (C) Philippe Biondi <phil@secdev.org> -## This program is published under a GPLv2 license - -""" -SuperSocket. -""" - -import socket,time -from config import conf -from data import * -from scapy.error import warning, log_runtime - -class _SuperSocket_metaclass(type): - def __repr__(self): - if self.desc is not None: - return "<%s: %s>" % (self.__name__,self.desc) - else: - return "<%s>" % self.__name__ - - -class SuperSocket: - __metaclass__ = _SuperSocket_metaclass - desc = None - closed=0 - def __init__(self, family=socket.AF_INET,type=socket.SOCK_STREAM, proto=0): - self.ins = socket.socket(family, type, proto) - self.outs = self.ins - self.promisc=None - def send(self, x): - sx = str(x) - if hasattr(x, "sent_time"): - x.sent_time = time.time() - return self.outs.send(sx) - def recv(self, x=MTU): - return conf.raw_layer(self.ins.recv(x)) - def fileno(self): - return self.ins.fileno() - def close(self): - if self.closed: - return - self.closed=1 - if self.ins != self.outs: - if self.outs and self.outs.fileno() != -1: - self.outs.close() - if self.ins and self.ins.fileno() != -1: - self.ins.close() - def sr(self, *args, **kargs): - return sendrecv.sndrcv(self, *args, **kargs) - def sr1(self, *args, **kargs): - a,b = sendrecv.sndrcv(self, *args, **kargs) - if len(a) > 0: - return a[0][1] - else: - return None - def sniff(self, *args, **kargs): - return sendrecv.sniff(opened_socket=self, *args, **kargs) - -class L3RawSocket(SuperSocket): - desc = "Layer 3 using Raw sockets (PF_INET/SOCK_RAW)" - def __init__(self, type = ETH_P_IP, filter=None, iface=None, promisc=None, nofilter=0): - self.outs = socket.socket(socket.AF_INET, socket.SOCK_RAW, socket.IPPROTO_RAW) - self.outs.setsockopt(socket.SOL_IP, socket.IP_HDRINCL, 1) - self.ins = socket.socket(socket.AF_PACKET, socket.SOCK_RAW, socket.htons(type)) - if iface is not None: - self.ins.bind((iface, type)) - def recv(self, x=MTU): - pkt, sa_ll = self.ins.recvfrom(x) - if sa_ll[2] == socket.PACKET_OUTGOING: - return None - if sa_ll[3] in conf.l2types: - cls = conf.l2types[sa_ll[3]] - lvl = 2 - elif sa_ll[1] in conf.l3types: - cls = conf.l3types[sa_ll[1]] - lvl = 3 - else: - cls = conf.default_l2 - warning("Unable to guess type (interface=%s protocol=%#x family=%i). Using %s" % (sa_ll[0],sa_ll[1],sa_ll[3],cls.name)) - lvl = 3 - - try: - pkt = cls(pkt) - except KeyboardInterrupt: - raise - except: - if conf.debug_dissector: - raise - pkt = conf.raw_layer(pkt) - if lvl == 2: - pkt = pkt.payload - - if pkt is not None: - from arch import get_last_packet_timestamp - pkt.time = get_last_packet_timestamp(self.ins) - return pkt - def send(self, x): - try: - sx = str(x) - x.sent_time = time.time() - self.outs.sendto(sx,(x.dst,0)) - except socket.error,msg: - log_runtime.error(msg) - -class SimpleSocket(SuperSocket): - desc = "wrapper arround a classic socket" - def __init__(self, sock): - self.ins = sock - self.outs = sock - - -class StreamSocket(SimpleSocket): - desc = "transforms a stream socket into a layer 2" - def __init__(self, sock, basecls=None): - if basecls is None: - basecls = conf.raw_layer - SimpleSocket.__init__(self, sock) - self.basecls = basecls - - def recv(self, x=MTU): - pkt = self.ins.recv(x, socket.MSG_PEEK) - x = len(pkt) - if x == 0: - raise socket.error((100,"Underlying stream socket tore down")) - pkt = self.basecls(pkt) - pad = pkt.getlayer(conf.padding_layer) - if pad is not None and pad.underlayer is not None: - del(pad.underlayer.payload) - while pad is not None and not isinstance(pad, NoPayload): - x -= len(pad.load) - pad = pad.payload - self.ins.recv(x) - return pkt - - - -if conf.L3socket is None: - conf.L3socket = L3RawSocket - -import sendrecv diff --git a/scripts/external_libs/scapy-2.3.1/scapy/themes.py b/scripts/external_libs/scapy-2.3.1/scapy/themes.py deleted file mode 100644 index 188fd547..00000000 --- a/scripts/external_libs/scapy-2.3.1/scapy/themes.py +++ /dev/null @@ -1,277 +0,0 @@ -## This file is part of Scapy -## See http://www.secdev.org/projects/scapy for more informations -## Copyright (C) Philippe Biondi <phil@secdev.org> -## This program is published under a GPLv2 license - -""" -Color themes for the interactive console. -""" - -################## -## Color themes ## -################## - -class Color: - normal = "\033[0m" - black = "\033[30m" - red = "\033[31m" - green = "\033[32m" - yellow = "\033[33m" - blue = "\033[34m" - purple = "\033[35m" - cyan = "\033[36m" - grey = "\033[37m" - - bold = "\033[1m" - uline = "\033[4m" - blink = "\033[5m" - invert = "\033[7m" - - -def create_styler(fmt=None, before="", after="", fmt2="%s"): - def do_style(val, fmt=fmt, before=before, after=after, fmt2=fmt2): - if fmt is None: - if type(val) is not str: - val = str(val) - else: - val = fmt % val - return fmt2 % (before+val+after) - return do_style - -class ColorTheme: - def __repr__(self): - return "<%s>" % self.__class__.__name__ - def __getattr__(self, attr): - return create_styler() - - -class NoTheme(ColorTheme): - pass - - -class AnsiColorTheme(ColorTheme): - def __getattr__(self, attr): - if attr.startswith("__"): - raise AttributeError(attr) - s = "style_%s" % attr - if s in self.__class__.__dict__: - before = getattr(self, s) - after = self.style_normal - else: - before = after = "" - - return create_styler(before=before, after=after) - - - style_normal = "" - style_prompt = "" - style_punct = "" - style_id = "" - style_not_printable = "" - style_layer_name = "" - style_field_name = "" - style_field_value = "" - style_emph_field_name = "" - style_emph_field_value = "" - style_packetlist_name = "" - style_packetlist_proto = "" - style_packetlist_value = "" - style_fail = "" - style_success = "" - style_odd = "" - style_even = "" - style_opening = "" - style_active = "" - style_closed = "" - style_left = "" - style_right = "" - -class BlackAndWhite(AnsiColorTheme): - pass - -class DefaultTheme(AnsiColorTheme): - style_normal = Color.normal - style_prompt = Color.blue+Color.bold - style_punct = Color.normal - style_id = Color.blue+Color.bold - style_not_printable = Color.grey - style_layer_name = Color.red+Color.bold - style_field_name = Color.blue - style_field_value = Color.purple - style_emph_field_name = Color.blue+Color.uline+Color.bold - style_emph_field_value = Color.purple+Color.uline+Color.bold - style_packetlist_name = Color.red+Color.bold - style_packetlist_proto = Color.blue - style_packetlist_value = Color.purple - style_fail = Color.red+Color.bold - style_success = Color.blue+Color.bold - style_even = Color.black+Color.bold - style_odd = Color.black - style_opening = Color.yellow - style_active = Color.black - style_closed = Color.grey - style_left = Color.blue+Color.invert - style_right = Color.red+Color.invert - -class BrightTheme(AnsiColorTheme): - style_normal = Color.normal - style_punct = Color.normal - style_id = Color.yellow+Color.bold - style_layer_name = Color.red+Color.bold - style_field_name = Color.yellow+Color.bold - style_field_value = Color.purple+Color.bold - style_emph_field_name = Color.yellow+Color.bold - style_emph_field_value = Color.green+Color.bold - style_packetlist_name = Color.red+Color.bold - style_packetlist_proto = Color.yellow+Color.bold - style_packetlist_value = Color.purple+Color.bold - style_fail = Color.red+Color.bold - style_success = Color.blue+Color.bold - style_even = Color.black+Color.bold - style_odd = Color.black - style_left = Color.cyan+Color.invert - style_right = Color.purple+Color.invert - - -class RastaTheme(AnsiColorTheme): - style_normal = Color.normal+Color.green+Color.bold - style_prompt = Color.yellow+Color.bold - style_punct = Color.red - style_id = Color.green+Color.bold - style_not_printable = Color.green - style_layer_name = Color.red+Color.bold - style_field_name = Color.yellow+Color.bold - style_field_value = Color.green+Color.bold - style_emph_field_name = Color.green - style_emph_field_value = Color.green - style_packetlist_name = Color.red+Color.bold - style_packetlist_proto = Color.yellow+Color.bold - style_packetlist_value = Color.green+Color.bold - style_fail = Color.red - style_success = Color.red+Color.bold - style_even = Color.yellow - style_odd = Color.green - style_left = Color.yellow+Color.invert - style_right = Color.red+Color.invert - -class ColorOnBlackTheme(AnsiColorTheme): - """Color theme for black backgrounds""" - style_normal = Color.normal - style_prompt = Color.green+Color.bold - style_punct = Color.normal - style_id = Color.green - style_not_printable = Color.black+Color.bold - style_layer_name = Color.yellow+Color.bold - style_field_name = Color.cyan - style_field_value = Color.purple+Color.bold - style_emph_field_name = Color.cyan+Color.bold - style_emph_field_value = Color.red+Color.bold - style_packetlist_name = Color.black+Color.bold - style_packetlist_proto = Color.yellow+Color.bold - style_packetlist_value = Color.purple+Color.bold - style_fail = Color.red+Color.bold - style_success = Color.green - style_even = Color.black+Color.bold - style_odd = Color.grey - style_opening = Color.yellow - style_active = Color.grey+Color.bold - style_closed = Color.black+Color.bold - style_left = Color.cyan+Color.bold - style_right = Color.red+Color.bold - - -class FormatTheme(ColorTheme): - def __getattr__(self, attr): - if attr.startswith("__"): - raise AttributeError(attr) - colfmt = self.__class__.__dict__.get("style_%s" % attr, "%s") - return create_styler(fmt2 = colfmt) - -class LatexTheme(FormatTheme): - style_prompt = r"\textcolor{blue}{%s}" - style_not_printable = r"\textcolor{gray}{%s}" - style_layer_name = r"\textcolor{red}{\bf %s}" - style_field_name = r"\textcolor{blue}{%s}" - style_field_value = r"\textcolor{purple}{%s}" - style_emph_field_name = r"\textcolor{blue}{\underline{%s}}" #ul - style_emph_field_value = r"\textcolor{purple}{\underline{%s}}" #ul - style_packetlist_name = r"\textcolor{red}{\bf %s}" - style_packetlist_proto = r"\textcolor{blue}{%s}" - style_packetlist_value = r"\textcolor{purple}{%s}" - style_fail = r"\textcolor{red}{\bf %s}" - style_success = r"\textcolor{blue}{\bf %s}" - style_left = r"\textcolor{blue}{%s}" - style_right = r"\textcolor{red}{%s}" -# style_even = r"}{\bf " -# style_odd = "" - -class LatexTheme2(FormatTheme): - style_prompt = r"@`@textcolor@[@blue@]@@[@%s@]@" - style_not_printable = r"@`@textcolor@[@gray@]@@[@%s@]@" - style_layer_name = r"@`@textcolor@[@red@]@@[@@`@bfseries@[@@]@%s@]@" - style_field_name = r"@`@textcolor@[@blue@]@@[@%s@]@" - style_field_value = r"@`@textcolor@[@purple@]@@[@%s@]@" - style_emph_field_name = r"@`@textcolor@[@blue@]@@[@@`@underline@[@%s@]@@]@" - style_emph_field_value = r"@`@textcolor@[@purple@]@@[@@`@underline@[@%s@]@@]@" - style_packetlist_name = r"@`@textcolor@[@red@]@@[@@`@bfseries@[@@]@%s@]@" - style_packetlist_proto = r"@`@textcolor@[@blue@]@@[@%s@]@" - style_packetlist_value = r"@`@textcolor@[@purple@]@@[@%s@]@" - style_fail = r"@`@textcolor@[@red@]@@[@@`@bfseries@[@@]@%s@]@" - style_success = r"@`@textcolor@[@blue@]@@[@@`@bfserices@[@@]@%s@]@" - style_even = r"@`@textcolor@[@gray@]@@[@@`@bfseries@[@@]@%s@]@" -# style_odd = r"@`@textcolor@[@black@]@@[@@`@bfseries@[@@]@%s@]@" - style_left = r"@`@textcolor@[@blue@]@@[@%s@]@" - style_right = r"@`@textcolor@[@red@]@@[@%s@]@" - -class HTMLTheme(FormatTheme): - style_prompt = "<span class=prompt>%s</span>" - style_not_printable = "<span class=not_printable>%s</span>" - style_layer_name = "<span class=layer_name>%s</span>" - style_field_name = "<span class=field_name>%s</span>" - style_field_value = "<span class=field_value>%s</span>" - style_emph_field_name = "<span class=emph_field_name>%s</span>" - style_emph_field_value = "<span class=emph_field_value>%s</span>" - style_packetlist_name = "<span class=packetlist_name>%s</span>" - style_packetlist_proto = "<span class=packetlist_proto>%s</span>" - style_packetlist_value = "<span class=packetlist_value>%s</span>" - style_fail = "<span class=fail>%s</span>" - style_success = "<span class=success>%s</span>" - style_even = "<span class=even>%s</span>" - style_odd = "<span class=odd>%s</span>" - style_left = "<span class=left>%s</span>" - style_right = "<span class=right>%s</span>" - -class HTMLTheme2(HTMLTheme): - style_prompt = "#[#span class=prompt#]#%s#[#/span#]#" - style_not_printable = "#[#span class=not_printable#]#%s#[#/span#]#" - style_layer_name = "#[#span class=layer_name#]#%s#[#/span#]#" - style_field_name = "#[#span class=field_name#]#%s#[#/span#]#" - style_field_value = "#[#span class=field_value#]#%s#[#/span#]#" - style_emph_field_name = "#[#span class=emph_field_name#]#%s#[#/span#]#" - style_emph_field_value = "#[#span class=emph_field_value#]#%s#[#/span#]#" - style_packetlist_name = "#[#span class=packetlist_name#]#%s#[#/span#]#" - style_packetlist_proto = "#[#span class=packetlist_proto#]#%s#[#/span#]#" - style_packetlist_value = "#[#span class=packetlist_value#]#%s#[#/span#]#" - style_fail = "#[#span class=fail#]#%s#[#/span#]#" - style_success = "#[#span class=success#]#%s#[#/span#]#" - style_even = "#[#span class=even#]#%s#[#/span#]#" - style_odd = "#[#span class=odd#]#%s#[#/span#]#" - style_left = "#[#span class=left#]#%s#[#/span#]#" - style_right = "#[#span class=right#]#%s#[#/span#]#" - - -class ColorPrompt: - __prompt = ">>> " - def __str__(self): - try: - ct = config.conf.color_theme - if isinstance(ct, AnsiColorTheme): - ## ^A and ^B delimit invisible caracters for readline to count right - return "\001%s\002" % ct.prompt("\002"+config.conf.prompt+"\001") - else: - return ct.prompt(config.conf.prompt) - except: - return self.__prompt - - -import config diff --git a/scripts/external_libs/scapy-2.3.1/scapy/tools/UTscapy.py b/scripts/external_libs/scapy-2.3.1/scapy/tools/UTscapy.py deleted file mode 100644 index d4310eb5..00000000 --- a/scripts/external_libs/scapy-2.3.1/scapy/tools/UTscapy.py +++ /dev/null @@ -1,664 +0,0 @@ -## This file is part of Scapy -## See http://www.secdev.org/projects/scapy for more informations -## Copyright (C) Philippe Biondi <phil@secdev.org> -## This program is published under a GPLv2 license - -""" -Unit testing infrastructure for Scapy -""" - -import sys,getopt,imp -import bz2, base64, os.path, time, traceback, zlib, sha - - -#### Import tool #### - -def import_module(name): - name = os.path.realpath(name) - thepath = os.path.dirname(name) - name = os.path.basename(name) - if name.endswith(".py"): - name = name[:-3] - f,path,desc = imp.find_module(name,[thepath]) - - try: - return imp.load_module(name, f, path, desc) - finally: - if f: - f.close() - - -#### INTERNAL/EXTERNAL FILE EMBEDDING #### - -class File: - def __init__(self, name, URL, local): - self.name = name - self.local = local - self.URL = URL - def get_local(self): - return bz2.decompress(base64.decodestring(self.local)) - def get_URL(self): - return URL - def write(self, dir): - if dir: - dir += "/" - open(dir+self.name,"w").write(self.get_local()) - - -# Embed a base64 encoded bziped version of js and css files -# to work if you can't reach Internet. -class External_Files: - UTscapy_js = File("UTscapy.js", "http://www.secdev.org/projects/UTscapy/UTscapy.js", -"""QlpoOTFBWSZTWWVijKQAAXxfgERUYOvAChIhBAC/79+qQAH8AFA0poANAMjQAAAG -ABo0NGEZNBo00BhgAaNDRhGTQaNNAYFURJinplGaKbRkJiekzSenqmpA0Gm1LFMp -RUklVQlK9WUTZYpNFI1IiEWEFT09Sfj5uO+qO6S5DQwKIxM92+Zku94wL6V/1KTK -an2c66Ug6SmVKy1ZIrgauxMVLF5xLH0lJRQuKlqLF10iatlTzqvw7S9eS3+h4lu3 -GZyMgoOude3NJ1pQy8eo+X96IYZw+ynehsiPj73m0rnvQ3QXZ9BJQiZQYQ5/uNcl -2WOlC5vyQqV/BWsnr2NZYLYXQLDs/Bffk4ZfR4/SH6GfA5Xlek4xHNHqbSsRbREO -gueXo3kcYi94K6hSO3ldD2O/qJXOFqJ8o3TE2aQahxtQpCVUKQMvODHwu2YkaORY -ZC6gihEallcHDIAtRPScBACAJnUggYhLDX6DEko7nC9GvAw5OcEkiyDUbLdiGCzD -aXWMC2DuQ2Y6sGf6NcRuON7QSbhHsPc4KKmZ/xdyRThQkGVijKQ=""") - UTscapy_css = File("UTscapy.css","http://www.secdev.org/projects/UTscapy/UTscapy.css", -"""QlpoOTFBWSZTWTbBCNEAAE7fgHxwSB//+Cpj2QC//9/6UAR+63dxbNzO3ccmtGEk -pM0m1I9E/Qp6g9Q09TNQ9QDR6gMgAkiBFG9U9TEGRkGgABoABoBmpJkRAaAxD1AN -Gh6gNADQBzAATJgATCYJhDAEYAEiQkwIyJk0n6qenpqeoaMUeo9RgIxp6pX78kfx -Jx4MUhDHKEb2pJAYAelG1cybiZBBDipH8ocxNyHDAqTUxiQmIAEDE3ApIBUUECAT -7Lvlf4xA/sVK0QHkSlYtT0JmErdOjx1v5NONPYSjrIhQnbl1MbG5m+InMYmVAWJp -uklD9cNdmQv2YigxbEtgUrsY2pDDV/qMT2SHnHsViu2rrp2LA01YJIHZqjYCGIQN -sGNobFxAYHLqqMOj9TI2Y4GRpRCUGu82PnMnXUBgDSkTY4EfmygaqvUwbGMbPwyE -220Q4G+sDvw7+6in3CAOS634pcOEAdREUW+QqMjvWvECrGISo1piv3vqubTGOL1c -ssrFnnSfU4T6KSCbPs98HJ2yjWN4i8Bk5WrM/JmELLNeZ4vgMkA4JVQInNnWTUTe -gmMSlJd/b7JuRwiM5RUzXOBTa0e3spO/rsNJiylu0rCxygdRo2koXdSJzmUVjJUm -BOFIkUKq8LrE+oT9h2qUqqUQ25fGV7e7OFkpmZopqUi0WeIBzlXdYY0Zz+WUJUTC -RC+CIPFIYh1RkopswMAop6ZjuZKRqR0WNuV+rfuF5aCXPpxAm0F14tPyhf42zFMT -GJUMxxowJnoauRq4xGQk+2lYFxbQ0FiC43WZSyYLHMuo5NTJ92QLAgs4FgOyZQqQ -xpsGKMA0cIisNeiootpnlWQvkPzNGUTPg8jqkwTvqQLguZLKJudha1hqfBib1IfO -LNChcU6OqF+3wyPKg5Y5oSbSJPAMcRDANwmS2i9oZm6vsD1pLkWtFGbAkEjjCuEU -W1ev1IsF2UVmWYFtJkqLT708ApUBK/ig3rbJWSq7RGQd3sSrOKu3lyKzTBdkXK2a -BGLV5dS1XURdKxaRkMplLLQxsimBYZEAa8KQkYyI+4EagMqycRR7RgwtZFxJSu0T -1q5wS2JG82iETHplbNj8DYo9IkmKzNAiw4FxK8bRfIYvwrbshbEagL11AQJFsqeZ -WeXDoWEx2FMyyZRAB5QyCFnwYtwtWAQmmITY8aIM2SZyRnHH9Wi8+Sr2qyCscFYo -vzM985aHXOHAxQN2UQZbQkUv3D4Vc+lyvalAffv3Tyg4ks3a22kPXiyeCGweviNX -0K8TKasyOhGsVamTUAZBXfQVw1zmdS4rHDnbHgtIjX3DcCt6UIr0BHTYjdV0JbPj -r1APYgXihjQwM2M83AKIhwQQJv/F3JFOFCQNsEI0QA==""") - def get_local_dict(cls): - return dict(map(lambda (x,y): (x, y.name), filter(lambda (x,y): isinstance(y, File), cls.__dict__.items()))) - get_local_dict = classmethod(get_local_dict) - def get_URL_dict(cls): - return dict(map(lambda (x,y): (x, y.URL), filter(lambda (x,y): isinstance(y, File), cls.__dict__.items()))) - get_URL_dict = classmethod(get_URL_dict) - - -#### HELPER CLASSES FOR PARAMETRING OUTPUT FORMAT #### - -class EnumClass: - def from_string(cls,x): - return cls.__dict__[x.upper()] - from_string = classmethod(from_string) - -class Format(EnumClass): - TEXT = 1 - ANSI = 2 - HTML = 3 - LATEX = 4 - XUNIT = 5 - - -#### TEST CLASSES #### - -class TestClass: - def __getitem__(self, item): - return getattr(self, item) - def add_keywords(self, kw): - if kw is str: - self.keywords.append(kw) - else: - self.keywords += kw - -class TestCampaign(TestClass): - def __init__(self, title): - self.title = title - self.filename = None - self.headcomments = "" - self.campaign = [] - self.keywords = [] - self.crc = None - self.sha = None - self.preexec = None - self.preexec_output = None - def add_testset(self, testset): - self.campaign.append(testset) - def __iter__(self): - return self.campaign.__iter__() - def all_tests(self): - for ts in self: - for t in ts: - yield t - -class TestSet(TestClass): - def __init__(self, name): - self.name = name - self.set = [] - self.comments = "" - self.keywords = [] - self.crc = None - self.expand = 1 - def add_test(self, test): - self.set.append(test) - def __iter__(self): - return self.set.__iter__() - -class UnitTest(TestClass): - def __init__(self, name): - self.name = name - self.test = "" - self.comments = "" - self.result = "" - self.res = True # must be True at init to have a different truth value than None - self.output = "" - self.num = -1 - self.keywords = [] - self.crc = None - self.expand = 1 - def __nonzero__(self): - return self.res - - -#### PARSE CAMPAIGN #### - -def parse_campaign_file(campaign_file): - test_campaign = TestCampaign("Test campaign") - test_campaign.filename= campaign_file.name - testset = None - test = None - testnb = 0 - - for l in campaign_file.readlines(): - if l[0] == '#': - continue - if l[0] == "~": - (test or testset or campaign_file).add_keywords(l[1:].split()) - elif l[0] == "%": - test_campaign.title = l[1:].strip() - elif l[0] == "+": - testset = TestSet(l[1:].strip()) - test_campaign.add_testset(testset) - test = None - elif l[0] == "=": - test = UnitTest(l[1:].strip()) - test.num = testnb - testnb += 1 - testset.add_test(test) - elif l[0] == "*": - if test is not None: - - test.comments += l[1:] - elif testset is not None: - testset.comments += l[1:] - else: - test_campaign.headcomments += l[1:] - else: - if test is None: - if l.strip(): - print >>sys.stderr, "Unkonwn content [%s]" % l.strip() - else: - test.test += l - return test_campaign - -def dump_campaign(test_campaign): - print "#"*(len(test_campaign.title)+6) - print "## %(title)s ##" % test_campaign - print "#"*(len(test_campaign.title)+6) - if test_campaign.sha and test_campaign.crc: - print "CRC=[%(crc)s] SHA=[%(sha)s]" % test_campaign - print "from file %(filename)s" % test_campaign - print - for ts in test_campaign: - if ts.crc: - print "+--[%s]%s(%s)--" % (ts.name,"-"*max(2,80-len(ts.name)-18),ts.crc) - else: - print "+--[%s]%s" % (ts.name,"-"*max(2,80-len(ts.name)-6)) - if ts.keywords: - print " kw=%s" % ",".join(ts.keywords) - for t in ts: - print "%(num)03i %(name)s" % t - c = k = "" - if t.keywords: - k = "kw=%s" % ",".join(t.keywords) - if t.crc: - c = "[%(crc)s] " % t - if c or k: - print " %s%s" % (c,k) - -#### COMPUTE CAMPAIGN DIGESTS #### - -def crc32(x): - return "%08X" % (0xffffffffL & zlib.crc32(x)) - -def sha1(x): - return sha.sha(x).hexdigest().upper() - -def compute_campaign_digests(test_campaign): - dc = "" - for ts in test_campaign: - dts = "" - for t in ts: - dt = t.test.strip() - t.crc = crc32(dt) - dts += "\0"+dt - ts.crc = crc32(dts) - dc += "\0\x01"+dts - test_campaign.crc = crc32(dc) - test_campaign.sha = sha1(open(test_campaign.filename).read()) - - -#### FILTER CAMPAIGN ##### - -def filter_tests_on_numbers(test_campaign, num): - if num: - for ts in test_campaign: - ts.set = filter(lambda t: t.num in num, ts.set) - test_campaign.campaign = filter(lambda ts: len(ts.set) > 0, test_campaign.campaign) - -def filter_tests_keep_on_keywords(test_campaign, kw): - def kw_match(lst, kw): - for k in lst: - if k in kw: - return True - return False - - if kw: - for ts in test_campaign: - ts.set = filter(lambda t: kw_match(t.keywords, kw), ts.set) - -def filter_tests_remove_on_keywords(test_campaign, kw): - def kw_match(lst, kw): - for k in kw: - if k not in lst: - return False - return True - - if kw: - for ts in test_campaign: - ts.set = filter(lambda t: not kw_match(t.keywords, kw), ts.set) - - -def remove_empty_testsets(test_campaign): - test_campaign.campaign = filter(lambda ts: len(ts.set) > 0, test_campaign.campaign) - - -#### RUN CAMPAIGN ##### - -def run_campaign(test_campaign, get_interactive_session, verb=2): - passed=failed=0 - if test_campaign.preexec: - test_campaign.preexec_output = get_interactive_session(test_campaign.preexec.strip())[0] - for testset in test_campaign: - for t in testset: - t.output,res = get_interactive_session(t.test.strip()) - the_res = False - try: - if res is None or res: - the_res= True - except Exception,msg: - t.output+="UTscapy: Error during result interpretation:\n" - t.output+="".join(traceback.format_exception(sys.exc_type, sys.exc_value, sys.exc_traceback,)) - if the_res: - t.res = True - res = "passed" - passed += 1 - else: - t.res = False - res = "failed" - failed += 1 - t.result = res - if verb > 1: - print >>sys.stderr,"%(result)6s %(crc)s %(name)s" % t - test_campaign.passed = passed - test_campaign.failed = failed - if verb: - print >>sys.stderr,"Campaign CRC=%(crc)s SHA=%(sha)s" % test_campaign - print >>sys.stderr,"PASSED=%i FAILED=%i" % (passed, failed) - - -#### INFO LINES #### - -def info_line(test_campaign): - filename = test_campaign.filename - if filename is None: - return "Run %s by UTscapy" % time.ctime() - else: - return "Run %s from [%s] by UTscapy" % (time.ctime(), filename) - -def html_info_line(test_campaign): - filename = test_campaign.filename - if filename is None: - return """Run %s by <a href="http://www.secdev.org/projects/UTscapy/">UTscapy</a><br>""" % time.ctime() - else: - return """Run %s from [%s] by <a href="http://www.secdev.org/projects/UTscapy/">UTscapy</a><br>""" % (time.ctime(), filename) - - -#### CAMPAIGN TO something #### - -def campaign_to_TEXT(test_campaign): - output="%(title)s\n" % test_campaign - output += "-- "+info_line(test_campaign)+"\n\n" - output += "Passed=%(passed)i\nFailed=%(failed)i\n\n%(headcomments)s\n" % test_campaign - - for testset in test_campaign: - output += "######\n## %(name)s\n######\n%(comments)s\n\n" % testset - for t in testset: - if t.expand: - output += "###(%(num)03i)=[%(result)s] %(name)s\n%(comments)s\n%(output)s\n\n" % t - - return output - -def campaign_to_ANSI(test_campaign): - output="%(title)s\n" % test_campaign - output += "-- "+info_line(test_campaign)+"\n\n" - output += "Passed=%(passed)i\nFailed=%(failed)i\n\n%(headcomments)s\n" % test_campaign - - for testset in test_campaign: - output += "######\n## %(name)s\n######\n%(comments)s\n\n" % testset - for t in testset: - if t.expand: - output += "###(%(num)03i)=[%(result)s] %(name)s\n%(comments)s\n%(output)s\n\n" % t - - return output - -def campaign_to_xUNIT(test_campaign): - output='<?xml version="1.0" encoding="UTF-8" ?>\n<testsuite>\n' - for testset in test_campaign: - for t in testset: - output += ' <testcase classname="%s"\n' % testset.name.encode("string_escape").replace('"',' ') - output += ' name="%s"\n' % t.name.encode("string_escape").replace('"',' ') - output += ' duration="0">\n' % t - if not t.res: - output += '<error><![CDATA[%(output)s]]></error>\n' % t - output += "</testcase>\n" - output += '</testsuite>' - return output - - -def campaign_to_HTML(test_campaign, local=0): - output = """<html> -<head> -<title>%(title)s</title> -<link rel="stylesheet" href="%%(UTscapy_css)s" type="text/css"> -<script language="JavaScript" src="%%(UTscapy_js)s" type="text/javascript"></script> -</head> -<body> - -<h1>%(title)s</h1> - -<span class=button onClick="hide_all('tst')">Shrink All</span> -<span class=button onClick="show_all('tst')">Expand All</span> -<span class=button onClick="show_passed('tst')">Expand Passed</span> -<span class=button onClick="show_failed('tst')">Expand Failed</span> -<p> -""" % test_campaign - - if local: - External_Files.UTscapy_js.write(os.path.dirname(test_campaign.output_file.name)) - External_Files.UTscapy_css.write(os.path.dirname(test_campaign.output_file.name)) - output %= External_Files.get_local_dict() - else: - output %= External_Files.get_URL_dict() - - if test_campaign.crc is not None and test_campaign.sha is not None: - output += "CRC=<span class=crc>%(crc)s</span> SHA=<span class=crc>%(sha)s</span><br>" % test_campaign - output += "<small><em>"+html_info_line(test_campaign)+"</em></small>" - output += test_campaign.headcomments + "\n<p>PASSED=%(passed)i FAILED=%(failed)i<p>\n\n" % test_campaign - for ts in test_campaign: - for t in ts: - output += """<span class=button%(result)s onClick="goto_id('tst%(num)il')">%(num)03i</span>\n""" % t - output += "\n\n" - - for testset in test_campaign: - output += "<h2>" % testset - if testset.crc is not None: - output += "<span class=crc>%(crc)s</span> " % testset - output += "%(name)s</h2>\n%(comments)s\n<ul>\n" % testset - for t in testset: - output += """<li class=%(result)s id="tst%(num)il">\n""" % t - if t.expand == 2: - output +=""" -<span id="tst%(num)i+" class="button%(result)s" onClick="show('tst%(num)i')" style="POSITION: absolute; VISIBILITY: hidden;">+%(num)03i+</span> -<span id="tst%(num)i-" class="button%(result)s" onClick="hide('tst%(num)i')">-%(num)03i-</span> -""" % t - else: - output += """ -<span id="tst%(num)i+" class="button%(result)s" onClick="show('tst%(num)i')">+%(num)03i+</span> -<span id="tst%(num)i-" class="button%(result)s" onClick="hide('tst%(num)i')" style="POSITION: absolute; VISIBILITY: hidden;">-%(num)03i-</span> -""" % t - if t.crc is not None: - output += "<span class=crc>%(crc)s</span>\n" % t - output += """%(name)s\n<span class="comment %(result)s" id="tst%(num)i" """ % t - if t.expand < 2: - output += """ style="POSITION: absolute; VISIBILITY: hidden;" """ - output += """><br>%(comments)s -<pre> -%(output)s</pre></span> -""" % t - output += "\n</ul>\n\n" - - output += "</body></html>" - return output - -def campaign_to_LATEX(test_campaign): - output = r"""\documentclass{report} -\usepackage{alltt} -\usepackage{xcolor} -\usepackage{a4wide} -\usepackage{hyperref} - -\title{%(title)s} -\date{%%s} - -\begin{document} -\maketitle -\tableofcontents - -\begin{description} -\item[Passed:] %(passed)i -\item[Failed:] %(failed)i -\end{description} - -%(headcomments)s - -""" % test_campaign - output %= info_line(test_campaign) - - for testset in test_campaign: - output += "\\chapter{%(name)s}\n\n%(comments)s\n\n" % testset - for t in testset: - if t.expand: - output += r"""\section{%(name)s} - -[%(num)03i] [%(result)s] - -%(comments)s -\begin{alltt} -%(output)s -\end{alltt} - -""" % t - - output += "\\end{document}\n" - return output - - - -#### USAGE #### - -def usage(): - print >>sys.stderr,"""Usage: UTscapy [-m module] [-f {text|ansi|HTML|LaTeX}] [-o output_file] - [-t testfile] [-k keywords [-k ...]] [-K keywords [-K ...]] - [-l] [-d|-D] [-F] [-q[q]] [-P preexecute_python_code] - [-s /path/to/scpay] --l\t\t: generate local files --F\t\t: expand only failed tests --d\t\t: dump campaign --D\t\t: dump campaign and stop --C\t\t: don't calculate CRC and SHA --s\t\t: path to scapy.py --q\t\t: quiet mode --qq\t\t: [silent mode] --n <testnum>\t: only tests whose numbers are given (eg. 1,3-7,12) --m <module>\t: additional module to put in the namespace --k <kw1>,<kw2>,...\t: include only tests with one of those keywords (can be used many times) --K <kw1>,<kw2>,...\t: remove tests with one of those keywords (can be used many times) --P <preexecute_python_code> -""" - raise SystemExit - - -#### MAIN #### - -def main(argv): - import __builtin__ - - # Parse arguments - - FORMAT = Format.ANSI - TESTFILE = sys.stdin - OUTPUTFILE = sys.stdout - LOCAL = 0 - NUM=None - KW_OK = [] - KW_KO = [] - DUMP = 0 - CRC = 1 - ONLYFAILED = 0 - VERB=2 - PREEXEC="" - SCAPY="scapy" - MODULES = [] - try: - opts = getopt.getopt(argv, "o:t:f:hln:m:k:K:DdCFqP:s:") - for opt,optarg in opts[0]: - if opt == "-h": - usage() - elif opt == "-F": - ONLYFAILED = 1 - elif opt == "-q": - VERB -= 1 - elif opt == "-D": - DUMP = 2 - elif opt == "-d": - DUMP = 1 - elif opt == "-C": - CRC = 0 - elif opt == "-s": - SCAPY = optarg - elif opt == "-P": - PREEXEC += "\n"+optarg - elif opt == "-f": - try: - FORMAT = Format.from_string(optarg) - except KeyError,msg: - raise getopt.GetoptError("Unknown output format %s" % msg) - elif opt == "-t": - TESTFILE = open(optarg) - elif opt == "-o": - OUTPUTFILE = open(optarg, "w") - elif opt == "-l": - LOCAL = 1 - elif opt == "-n": - NUM = [] - for v in map( lambda x: x.strip(), optarg.split(",") ): - try: - NUM.append(int(v)) - except ValueError: - v1,v2 = map(int, v.split("-")) - for vv in range(v1,v2+1): - NUM.append(vv) - elif opt == "-m": - MODULES.append(optarg) - elif opt == "-k": - KW_OK.append(optarg.split(",")) - elif opt == "-K": - KW_KO.append(optarg.split(",")) - - - try: - from scapy import all as scapy - except ImportError,e: - raise getopt.GetoptError("cannot import [%s]: %s" % (SCAPY,e)) - - for m in MODULES: - try: - mod = import_module(m) - __builtin__.__dict__.update(mod.__dict__) - except ImportError,e: - raise getopt.GetoptError("cannot import [%s]: %s" % (m,e)) - - except getopt.GetoptError,msg: - print >>sys.stderr,"ERROR:",msg - raise SystemExit - - autorun_func = { - Format.TEXT: scapy.autorun_get_text_interactive_session, - Format.ANSI: scapy.autorun_get_ansi_interactive_session, - Format.HTML: scapy.autorun_get_html_interactive_session, - Format.LATEX: scapy.autorun_get_latex_interactive_session, - Format.XUNIT: scapy.autorun_get_text_interactive_session, - } - - # Parse test file - test_campaign = parse_campaign_file(TESTFILE) - - # Report parameters - if PREEXEC: - test_campaign.preexec = PREEXEC - - - # Compute campaign CRC and SHA - if CRC: - compute_campaign_digests(test_campaign) - - # Filter out unwanted tests - filter_tests_on_numbers(test_campaign, NUM) - for k in KW_OK: - filter_tests_keep_on_keywords(test_campaign, k) - for k in KW_KO: - filter_tests_remove_on_keywords(test_campaign, k) - - remove_empty_testsets(test_campaign) - - - # Dump campaign - if DUMP: - dump_campaign(test_campaign) - if DUMP > 1: - sys.exit() - - # Run tests - test_campaign.output_file = OUTPUTFILE - run_campaign(test_campaign, autorun_func[FORMAT], verb=VERB) - - # Shrink passed - if ONLYFAILED: - for t in test_campaign.all_tests(): - if t: - t.expand = 0 - else: - t.expand = 2 - - # Generate report - if FORMAT == Format.TEXT: - output = campaign_to_TEXT(test_campaign) - elif FORMAT == Format.ANSI: - output = campaign_to_ANSI(test_campaign) - elif FORMAT == Format.HTML: - output = campaign_to_HTML(test_campaign, local=LOCAL) - elif FORMAT == Format.LATEX: - output = campaign_to_LATEX(test_campaign) - elif FORMAT == Format.XUNIT: - output = campaign_to_xUNIT(test_campaign) - - OUTPUTFILE.write(output) - OUTPUTFILE.close() - -if __name__ == "__main__": - main(sys.argv[1:]) diff --git a/scripts/external_libs/scapy-2.3.1/scapy/tools/__init__.py b/scripts/external_libs/scapy-2.3.1/scapy/tools/__init__.py deleted file mode 100644 index af6eec74..00000000 --- a/scripts/external_libs/scapy-2.3.1/scapy/tools/__init__.py +++ /dev/null @@ -1,8 +0,0 @@ -## This file is part of Scapy -## See http://www.secdev.org/projects/scapy for more informations -## Copyright (C) Philippe Biondi <phil@secdev.org> -## This program is published under a GPLv2 license - -""" -Additional tools to be run separately -""" diff --git a/scripts/external_libs/scapy-2.3.1/scapy/tools/check_asdis.py b/scripts/external_libs/scapy-2.3.1/scapy/tools/check_asdis.py deleted file mode 100644 index 2c1efa4c..00000000 --- a/scripts/external_libs/scapy-2.3.1/scapy/tools/check_asdis.py +++ /dev/null @@ -1,103 +0,0 @@ -#! /usr/bin/env python - -import getopt - -def usage(): - print >>sys.stderr,"""Usage: check_asdis -i <pcap_file> [-o <wrong_packets.pcap>] - -v increase verbosity - -d hexdiff packets that differ - -z compress output pcap - -a open pcap file in append mode""" - -def main(argv): - PCAP_IN = None - PCAP_OUT = None - COMPRESS=False - APPEND=False - DIFF=False - VERBOSE=0 - try: - opts=getopt.getopt(argv, "hi:o:azdv") - for opt, parm in opts[0]: - if opt == "-h": - usage() - raise SystemExit - elif opt == "-i": - PCAP_IN = parm - elif opt == "-o": - PCAP_OUT = parm - elif opt == "-v": - VERBOSE += 1 - elif opt == "-d": - DIFF = True - elif opt == "-a": - APPEND = True - elif opt == "-z": - COMPRESS = True - - - if PCAP_IN is None: - raise getopt.GetoptError("Missing pcap file (-i)") - - except getopt.GetoptError,e: - print >>sys.stderr,"ERROR: %s" % e - raise SystemExit - - - - from scapy.config import conf - from scapy.utils import RawPcapReader,RawPcapWriter,hexdiff - from scapy.layers import all - - - pcap = RawPcapReader(PCAP_IN) - pcap_out = None - if PCAP_OUT: - pcap_out = RawPcapWriter(PCAP_OUT, append=APPEND, gz=COMPRESS, linktype=pcap.linktype) - pcap_out._write_header(None) - - LLcls = conf.l2types.get(pcap.linktype) - if LLcls is None: - print >>sys.stderr," Unknown link type [%i]. Can't test anything!" % pcap.linktype - raise SystemExit - - - i=-1 - differ=0 - failed=0 - for p1,meta in pcap: - i += 1 - try: - p2d = LLcls(p1) - p2 = str(p2d) - except KeyboardInterrupt: - raise - except Exception,e: - print "Dissection error on packet %i" % i - failed += 1 - else: - if p1 == p2: - if VERBOSE >= 2: - print "Packet %i ok" % i - continue - else: - print "Packet %i differs" % i - differ += 1 - if VERBOSE >= 1: - print repr(p2d) - if DIFF: - hexdiff(p1,p2) - if pcap_out is not None: - pcap_out.write(p1) - i+=1 - correct = i-differ-failed - print "%i total packets. %i ok, %i differed, %i failed. %.2f%% correct." % (i, correct, differ, - failed, i and 100.0*(correct)/i) - - -if __name__ == "__main__": - import sys - try: - main(sys.argv[1:]) - except KeyboardInterrupt: - print >>sys.stderr,"Interrupted by user." diff --git a/scripts/external_libs/scapy-2.3.1/scapy/utils.py b/scripts/external_libs/scapy-2.3.1/scapy/utils.py deleted file mode 100644 index c5ac2520..00000000 --- a/scripts/external_libs/scapy-2.3.1/scapy/utils.py +++ /dev/null @@ -1,816 +0,0 @@ -## This file is part of Scapy -## See http://www.secdev.org/projects/scapy for more informations -## Copyright (C) Philippe Biondi <phil@secdev.org> -## This program is published under a GPLv2 license - -""" -General utility functions. -""" - -import os,sys,socket,types -import random,time -import gzip,zlib,cPickle -import re,struct,array -import subprocess - -import warnings -warnings.filterwarnings("ignore","tempnam",RuntimeWarning, __name__) - -from config import conf -from data import MTU -from error import log_runtime,log_loading,log_interactive, Scapy_Exception -from base_classes import BasePacketList - -WINDOWS=sys.platform.startswith("win32") - -########### -## Tools ## -########### - -def get_temp_file(keep=False, autoext=""): - f = os.tempnam("","scapy") - if not keep: - conf.temp_files.append(f+autoext) - return f - -def sane_color(x): - r="" - for i in x: - j = ord(i) - if (j < 32) or (j >= 127): - r=r+conf.color_theme.not_printable(".") - else: - r=r+i - return r - -def sane(x): - r="" - for i in x: - j = ord(i) - if (j < 32) or (j >= 127): - r=r+"." - else: - r=r+i - return r - -def lhex(x): - if type(x) in (int,long): - return hex(x) - elif type(x) is tuple: - return "(%s)" % ", ".join(map(lhex, x)) - elif type(x) is list: - return "[%s]" % ", ".join(map(lhex, x)) - else: - return x - -@conf.commands.register -def hexdump(x): - x=str(x) - l = len(x) - i = 0 - while i < l: - print "%04x " % i, - for j in range(16): - if i+j < l: - print "%02X" % ord(x[i+j]), - else: - print " ", - if j%16 == 7: - print "", - print " ", - print sane_color(x[i:i+16]) - i += 16 - -@conf.commands.register -def linehexdump(x, onlyasc=0, onlyhex=0): - x = str(x) - l = len(x) - if not onlyasc: - for i in range(l): - print "%02X" % ord(x[i]), - print "", - if not onlyhex: - print sane_color(x) - -def chexdump(x): - x=str(x) - print ", ".join(map(lambda x: "%#04x"%ord(x), x)) - -def hexstr(x, onlyasc=0, onlyhex=0): - s = [] - if not onlyasc: - s.append(" ".join(map(lambda x:"%02x"%ord(x), x))) - if not onlyhex: - s.append(sane(x)) - return " ".join(s) - - -@conf.commands.register -def hexdiff(x,y): - """Show differences between 2 binary strings""" - x=str(x)[::-1] - y=str(y)[::-1] - SUBST=1 - INSERT=1 - d={} - d[-1,-1] = 0,(-1,-1) - for j in range(len(y)): - d[-1,j] = d[-1,j-1][0]+INSERT, (-1,j-1) - for i in range(len(x)): - d[i,-1] = d[i-1,-1][0]+INSERT, (i-1,-1) - - for j in range(len(y)): - for i in range(len(x)): - d[i,j] = min( ( d[i-1,j-1][0]+SUBST*(x[i] != y[j]), (i-1,j-1) ), - ( d[i-1,j][0]+INSERT, (i-1,j) ), - ( d[i,j-1][0]+INSERT, (i,j-1) ) ) - - - backtrackx = [] - backtracky = [] - i=len(x)-1 - j=len(y)-1 - while not (i == j == -1): - i2,j2 = d[i,j][1] - backtrackx.append(x[i2+1:i+1]) - backtracky.append(y[j2+1:j+1]) - i,j = i2,j2 - - - - x = y = i = 0 - colorize = { 0: lambda x:x, - -1: conf.color_theme.left, - 1: conf.color_theme.right } - - dox=1 - doy=0 - l = len(backtrackx) - while i < l: - separate=0 - linex = backtrackx[i:i+16] - liney = backtracky[i:i+16] - xx = sum(len(k) for k in linex) - yy = sum(len(k) for k in liney) - if dox and not xx: - dox = 0 - doy = 1 - if dox and linex == liney: - doy=1 - - if dox: - xd = y - j = 0 - while not linex[j]: - j += 1 - xd -= 1 - print colorize[doy-dox]("%04x" % xd), - x += xx - line=linex - else: - print " ", - if doy: - yd = y - j = 0 - while not liney[j]: - j += 1 - yd -= 1 - print colorize[doy-dox]("%04x" % yd), - y += yy - line=liney - else: - print " ", - - print " ", - - cl = "" - for j in range(16): - if i+j < l: - if line[j]: - col = colorize[(linex[j]!=liney[j])*(doy-dox)] - print col("%02X" % ord(line[j])), - if linex[j]==liney[j]: - cl += sane_color(line[j]) - else: - cl += col(sane(line[j])) - else: - print " ", - cl += " " - else: - print " ", - if j == 7: - print "", - - - print " ",cl - - if doy or not yy: - doy=0 - dox=1 - i += 16 - else: - if yy: - dox=0 - doy=1 - else: - i += 16 - - -crc32 = zlib.crc32 - -if struct.pack("H",1) == "\x00\x01": # big endian - def checksum(pkt): - if len(pkt) % 2 == 1: - pkt += "\0" - s = sum(array.array("H", pkt)) - s = (s >> 16) + (s & 0xffff) - s += s >> 16 - s = ~s - return s & 0xffff -else: - def checksum(pkt): - if len(pkt) % 2 == 1: - pkt += "\0" - s = sum(array.array("H", pkt)) - s = (s >> 16) + (s & 0xffff) - s += s >> 16 - s = ~s - return (((s>>8)&0xff)|s<<8) & 0xffff - -def warning(x): - log_runtime.warning(x) - -def mac2str(mac): - return "".join(map(lambda x: chr(int(x,16)), mac.split(":"))) - -def str2mac(s): - return ("%02x:"*6)[:-1] % tuple(map(ord, s)) - -def strxor(x,y): - return "".join(map(lambda x,y:chr(ord(x)^ord(y)),x,y)) - -# Workarround bug 643005 : https://sourceforge.net/tracker/?func=detail&atid=105470&aid=643005&group_id=5470 -try: - socket.inet_aton("255.255.255.255") -except socket.error: - def inet_aton(x): - if x == "255.255.255.255": - return "\xff"*4 - else: - return socket.inet_aton(x) -else: - inet_aton = socket.inet_aton - -inet_ntoa = socket.inet_ntoa -try: - inet_ntop = socket.inet_ntop - inet_pton = socket.inet_pton -except AttributeError: - from scapy.pton_ntop import * - log_loading.info("inet_ntop/pton functions not found. Python IPv6 support not present") - - -def atol(x): - try: - ip = inet_aton(x) - except socket.error: - ip = inet_aton(socket.gethostbyname(x)) - return struct.unpack("!I", ip)[0] -def ltoa(x): - return inet_ntoa(struct.pack("!I", x&0xffffffff)) - -def itom(x): - return (0xffffffff00000000L>>x)&0xffffffffL - -def do_graph(graph,prog=None,format=None,target=None,type=None,string=None,options=None): - """do_graph(graph, prog=conf.prog.dot, format="svg", - target="| conf.prog.display", options=None, [string=1]): - string: if not None, simply return the graph string - graph: GraphViz graph description - format: output type (svg, ps, gif, jpg, etc.), passed to dot's "-T" option - target: filename or redirect. Defaults pipe to Imagemagick's display program - prog: which graphviz program to use - options: options to be passed to prog""" - - if format is None: - if WINDOWS: - format = "png" # use common format to make sure a viewer is installed - else: - format = "svg" - if string: - return graph - if type is not None: - format=type - if prog is None: - prog = conf.prog.dot - start_viewer=False - if target is None: - if WINDOWS: - tempfile = os.tempnam("", "scapy") + "." + format - target = "> %s" % tempfile - start_viewer = True - else: - target = "| %s" % conf.prog.display - if format is not None: - format = "-T %s" % format - w,r = os.popen2("%s %s %s %s" % (prog,options or "", format or "", target)) - w.write(graph) - w.close() - if start_viewer: - # Workaround for file not found error: We wait until tempfile is written. - waiting_start = time.time() - while not os.path.exists(tempfile): - time.sleep(0.1) - if time.time() - waiting_start > 3: - warning("Temporary file '%s' could not be written. Graphic will not be displayed." % tempfile) - break - else: - if conf.prog.display == conf.prog._default: - os.startfile(tempfile) - else: - subprocess.Popen([conf.prog.display, tempfile]) - -_TEX_TR = { - "{":"{\\tt\\char123}", - "}":"{\\tt\\char125}", - "\\":"{\\tt\\char92}", - "^":"\\^{}", - "$":"\\$", - "#":"\\#", - "~":"\\~", - "_":"\\_", - "&":"\\&", - "%":"\\%", - "|":"{\\tt\\char124}", - "~":"{\\tt\\char126}", - "<":"{\\tt\\char60}", - ">":"{\\tt\\char62}", - } - -def tex_escape(x): - s = "" - for c in x: - s += _TEX_TR.get(c,c) - return s - -def colgen(*lstcol,**kargs): - """Returns a generator that mixes provided quantities forever - trans: a function to convert the three arguments into a color. lambda x,y,z:(x,y,z) by default""" - if len(lstcol) < 2: - lstcol *= 2 - trans = kargs.get("trans", lambda x,y,z: (x,y,z)) - while 1: - for i in range(len(lstcol)): - for j in range(len(lstcol)): - for k in range(len(lstcol)): - if i != j or j != k or k != i: - yield trans(lstcol[(i+j)%len(lstcol)],lstcol[(j+k)%len(lstcol)],lstcol[(k+i)%len(lstcol)]) - -def incremental_label(label="tag%05i", start=0): - while True: - yield label % start - start += 1 - -######################### -#### Enum management #### -######################### - -class EnumElement: - _value=None - def __init__(self, key, value): - self._key = key - self._value = value - def __repr__(self): - return "<%s %s[%r]>" % (self.__dict__.get("_name", self.__class__.__name__), self._key, self._value) - def __getattr__(self, attr): - return getattr(self._value, attr) - def __str__(self): - return self._key - def __eq__(self, other): - return self._value == int(other) - - -class Enum_metaclass(type): - element_class = EnumElement - def __new__(cls, name, bases, dct): - rdict={} - for k,v in dct.iteritems(): - if type(v) is int: - v = cls.element_class(k,v) - dct[k] = v - rdict[v] = k - dct["__rdict__"] = rdict - return super(Enum_metaclass, cls).__new__(cls, name, bases, dct) - def __getitem__(self, attr): - return self.__rdict__[attr] - def __contains__(self, val): - return val in self.__rdict__ - def get(self, attr, val=None): - return self._rdict__.get(attr, val) - def __repr__(self): - return "<%s>" % self.__dict__.get("name", self.__name__) - - - -################### -## Object saving ## -################### - - -def export_object(obj): - print gzip.zlib.compress(cPickle.dumps(obj,2),9).encode("base64") - -def import_object(obj=None): - if obj is None: - obj = sys.stdin.read() - return cPickle.loads(gzip.zlib.decompress(obj.strip().decode("base64"))) - - -def save_object(fname, obj): - cPickle.dump(obj,gzip.open(fname,"wb")) - -def load_object(fname): - return cPickle.load(gzip.open(fname,"rb")) - -@conf.commands.register -def corrupt_bytes(s, p=0.01, n=None): - """Corrupt a given percentage or number of bytes from a string""" - s = array.array("B",str(s)) - l = len(s) - if n is None: - n = max(1,int(l*p)) - for i in random.sample(xrange(l), n): - s[i] = (s[i]+random.randint(1,255))%256 - return s.tostring() - -@conf.commands.register -def corrupt_bits(s, p=0.01, n=None): - """Flip a given percentage or number of bits from a string""" - s = array.array("B",str(s)) - l = len(s)*8 - if n is None: - n = max(1,int(l*p)) - for i in random.sample(xrange(l), n): - s[i/8] ^= 1 << (i%8) - return s.tostring() - - - - -############################# -## pcap capture file stuff ## -############################# - -@conf.commands.register -def wrpcap(filename, pkt, *args, **kargs): - """Write a list of packets to a pcap file -gz: set to 1 to save a gzipped capture -linktype: force linktype value -endianness: "<" or ">", force endianness""" - PcapWriter(filename, *args, **kargs).write(pkt) - -@conf.commands.register -def rdpcap(filename, count=-1): - """Read a pcap file and return a packet list -count: read only <count> packets""" - return PcapReader(filename).read_all(count=count) - - - -class RawPcapReader: - """A stateful pcap reader. Each packet is returned as a string""" - - def __init__(self, filename): - self.filename = filename - try: - self.f = gzip.open(filename,"rb") - magic = self.f.read(4) - except IOError: - self.f = open(filename,"rb") - magic = self.f.read(4) - if magic == "\xa1\xb2\xc3\xd4": #big endian - self.endian = ">" - elif magic == "\xd4\xc3\xb2\xa1": #little endian - self.endian = "<" - else: - raise Scapy_Exception("Not a pcap capture file (bad magic)") - hdr = self.f.read(20) - if len(hdr)<20: - raise Scapy_Exception("Invalid pcap file (too short)") - vermaj,vermin,tz,sig,snaplen,linktype = struct.unpack(self.endian+"HHIIII",hdr) - - self.linktype = linktype - - - - def __iter__(self): - return self - - def next(self): - """impliment the iterator protocol on a set of packets in a pcap file""" - pkt = self.read_packet() - if pkt == None: - raise StopIteration - return pkt - - - def read_packet(self, size=MTU): - """return a single packet read from the file - - returns None when no more packets are available - """ - hdr = self.f.read(16) - if len(hdr) < 16: - return None - sec,usec,caplen,wirelen = struct.unpack(self.endian+"IIII", hdr) - s = self.f.read(caplen)[:MTU] - return s,(sec,usec,wirelen) # caplen = len(s) - - - def dispatch(self, callback): - """call the specified callback routine for each packet read - - This is just a convienience function for the main loop - that allows for easy launching of packet processing in a - thread. - """ - for p in self: - callback(p) - - def read_all(self,count=-1): - """return a list of all packets in the pcap file - """ - res=[] - while count != 0: - count -= 1 - p = self.read_packet() - if p is None: - break - res.append(p) - return res - - def recv(self, size=MTU): - """ Emulate a socket - """ - return self.read_packet(size)[0] - - def fileno(self): - return self.f.fileno() - - def close(self): - return self.f.close() - - def __enter__(self): - return self - - def __exit__(self, exc_type, exc_value, tracback): - pass - - -class PcapReader(RawPcapReader): - def __init__(self, filename): - RawPcapReader.__init__(self, filename) - try: - self.LLcls = conf.l2types[self.linktype] - except KeyError: - warning("PcapReader: unknown LL type [%i]/[%#x]. Using Raw packets" % (self.linktype,self.linktype)) - self.LLcls = conf.raw_layer - def read_packet(self, size=MTU): - rp = RawPcapReader.read_packet(self,size) - if rp is None: - return None - s,(sec,usec,wirelen) = rp - - try: - p = self.LLcls(s) - except KeyboardInterrupt: - raise - except: - if conf.debug_dissector: - raise - p = conf.raw_layer(s) - p.time = sec+0.000001*usec - return p - def read_all(self,count=-1): - res = RawPcapReader.read_all(self, count) - import plist - return plist.PacketList(res,name = os.path.basename(self.filename)) - def recv(self, size=MTU): - return self.read_packet(size) - - - -class RawPcapWriter: - """A stream PCAP writer with more control than wrpcap()""" - def __init__(self, filename, linktype=None, gz=False, endianness="", append=False, sync=False): - """ - linktype: force linktype to a given value. If None, linktype is taken - from the first writter packet - gz: compress the capture on the fly - endianness: force an endianness (little:"<", big:">"). Default is native - append: append packets to the capture file instead of truncating it - sync: do not bufferize writes to the capture file - """ - - self.linktype = linktype - self.header_present = 0 - self.append=append - self.gz = gz - self.endian = endianness - self.filename=filename - self.sync=sync - bufsz=4096 - if sync: - bufsz=0 - - self.f = [open,gzip.open][gz](filename,append and "ab" or "wb", gz and 9 or bufsz) - - def fileno(self): - return self.f.fileno() - - def _write_header(self, pkt): - self.header_present=1 - - if self.append: - # Even if prone to race conditions, this seems to be - # safest way to tell whether the header is already present - # because we have to handle compressed streams that - # are not as flexible as basic files - g = [open,gzip.open][self.gz](self.filename,"rb") - if g.read(16): - return - - self.f.write(struct.pack(self.endian+"IHHIIII", 0xa1b2c3d4L, - 2, 4, 0, 0, MTU, self.linktype)) - self.f.flush() - - - def write(self, pkt): - """accepts a either a single packet or a list of packets - to be written to the dumpfile - """ - if not self.header_present: - self._write_header(pkt) - if type(pkt) is str: - self._write_packet(pkt) - else: - for p in pkt: - self._write_packet(p) - - def _write_packet(self, packet, sec=None, usec=None, caplen=None, wirelen=None): - """writes a single packet to the pcap file - """ - if caplen is None: - caplen = len(packet) - if wirelen is None: - wirelen = caplen - if sec is None or usec is None: - t=time.time() - it = int(t) - if sec is None: - sec = it - if usec is None: - usec = int(round((t-it)*1000000)) - self.f.write(struct.pack(self.endian+"IIII", sec, usec, caplen, wirelen)) - self.f.write(packet) - if self.gz and self.sync: - self.f.flush() - - def flush(self): - return self.f.flush() - - def close(self): - return self.f.close() - - def __enter__(self): - return self - def __exit__(self, exc_type, exc_value, tracback): - self.flush() - - -class PcapWriter(RawPcapWriter): - def _write_header(self, pkt): - if self.linktype == None: - if type(pkt) is list or type(pkt) is tuple or isinstance(pkt,BasePacketList): - pkt = pkt[0] - try: - self.linktype = conf.l2types[pkt.__class__] - except KeyError: - warning("PcapWriter: unknown LL type for %s. Using type 1 (Ethernet)" % pkt.__class__.__name__) - self.linktype = 1 - RawPcapWriter._write_header(self, pkt) - - def _write_packet(self, packet): - sec = int(packet.time) - usec = int(round((packet.time-sec)*1000000)) - s = str(packet) - caplen = len(s) - RawPcapWriter._write_packet(self, s, sec, usec, caplen, caplen) - - -re_extract_hexcap = re.compile("^((0x)?[0-9a-fA-F]{2,}[ :\t]{,3}|) *(([0-9a-fA-F]{2} {,2}){,16})") - -def import_hexcap(): - p = "" - try: - while 1: - l = raw_input().strip() - try: - p += re_extract_hexcap.match(l).groups()[2] - except: - warning("Parsing error during hexcap") - continue - except EOFError: - pass - - p = p.replace(" ","") - return p.decode("hex") - - - -@conf.commands.register -def wireshark(pktlist): - """Run wireshark on a list of packets""" - f = get_temp_file() - wrpcap(f, pktlist) - subprocess.Popen([conf.prog.wireshark, "-r", f]) - -@conf.commands.register -def hexedit(x): - x = str(x) - f = get_temp_file() - open(f,"w").write(x) - subprocess.call([conf.prog.hexedit, f]) - x = open(f).read() - os.unlink(f) - return x - -def __make_table(yfmtfunc, fmtfunc, endline, list, fxyz, sortx=None, sorty=None, seplinefunc=None): - vx = {} - vy = {} - vz = {} - vxf = {} - vyf = {} - l = 0 - for e in list: - xx,yy,zz = map(str, fxyz(e)) - l = max(len(yy),l) - vx[xx] = max(vx.get(xx,0), len(xx), len(zz)) - vy[yy] = None - vz[(xx,yy)] = zz - - vxk = vx.keys() - vyk = vy.keys() - if sortx: - vxk.sort(sortx) - else: - try: - vxk.sort(lambda x,y:int(x)-int(y)) - except: - try: - vxk.sort(lambda x,y: cmp(atol(x),atol(y))) - except: - vxk.sort() - if sorty: - vyk.sort(sorty) - else: - try: - vyk.sort(lambda x,y:int(x)-int(y)) - except: - try: - vyk.sort(lambda x,y: cmp(atol(x),atol(y))) - except: - vyk.sort() - - - if seplinefunc: - sepline = seplinefunc(l, map(lambda x:vx[x],vxk)) - print sepline - - fmt = yfmtfunc(l) - print fmt % "", - for x in vxk: - vxf[x] = fmtfunc(vx[x]) - print vxf[x] % x, - print endline - if seplinefunc: - print sepline - for y in vyk: - print fmt % y, - for x in vxk: - print vxf[x] % vz.get((x,y), "-"), - print endline - if seplinefunc: - print sepline - -def make_table(*args, **kargs): - __make_table(lambda l:"%%-%is" % l, lambda l:"%%-%is" % l, "", *args, **kargs) - -def make_lined_table(*args, **kargs): - __make_table(lambda l:"%%-%is |" % l, lambda l:"%%-%is |" % l, "", - seplinefunc=lambda a,x:"+".join(map(lambda y:"-"*(y+2), [a-1]+x+[-2])), - *args, **kargs) - -def make_tex_table(*args, **kargs): - __make_table(lambda l: "%s", lambda l: "& %s", "\\\\", seplinefunc=lambda a,x:"\\hline", *args, **kargs) - diff --git a/scripts/external_libs/scapy-2.3.1/scapy/utils6.py b/scripts/external_libs/scapy-2.3.1/scapy/utils6.py deleted file mode 100644 index b1b7ee73..00000000 --- a/scripts/external_libs/scapy-2.3.1/scapy/utils6.py +++ /dev/null @@ -1,791 +0,0 @@ -## This file is part of Scapy -## See http://www.secdev.org/projects/scapy for more informations -## Copyright (C) Philippe Biondi <phil@secdev.org> -## This program is published under a GPLv2 license - -## Copyright (C) 2005 Guillaume Valadon <guedou@hongo.wide.ad.jp> -## Arnaud Ebalard <arnaud.ebalard@eads.net> - -""" -Utility functions for IPv6. -""" - -from config import conf -from data import * -from utils import * - - -def construct_source_candidate_set(addr, plen, laddr, loname): - """ - Given all addresses assigned to a specific interface ('laddr' parameter), - this function returns the "candidate set" associated with 'addr/plen'. - - Basically, the function filters all interface addresses to keep only those - that have the same scope as provided prefix. - - This is on this list of addresses that the source selection mechanism - will then be performed to select the best source address associated - with some specific destination that uses this prefix. - """ - def cset_sort(x,y): - x_global = 0 - if in6_isgladdr(x): - x_global = 1 - y_global = 0 - if in6_isgladdr(y): - y_global = 1 - res = y_global - x_global - if res != 0 or y_global != 1: - return res - # two global addresses: if one is native, it wins. - if not in6_isaddr6to4(x): - return -1; - return -res - - cset = [] - if in6_isgladdr(addr) or in6_isuladdr(addr): - cset = filter(lambda x: x[1] == IPV6_ADDR_GLOBAL, laddr) - elif in6_islladdr(addr): - cset = filter(lambda x: x[1] == IPV6_ADDR_LINKLOCAL, laddr) - elif in6_issladdr(addr): - cset = filter(lambda x: x[1] == IPV6_ADDR_SITELOCAL, laddr) - elif in6_ismaddr(addr): - if in6_ismnladdr(addr): - cset = [('::1', 16, loname)] - elif in6_ismgladdr(addr): - cset = filter(lambda x: x[1] == IPV6_ADDR_GLOBAL, laddr) - elif in6_ismlladdr(addr): - cset = filter(lambda x: x[1] == IPV6_ADDR_LINKLOCAL, laddr) - elif in6_ismsladdr(addr): - cset = filter(lambda x: x[1] == IPV6_ADDR_SITELOCAL, laddr) - elif addr == '::' and plen == 0: - cset = filter(lambda x: x[1] == IPV6_ADDR_GLOBAL, laddr) - cset = map(lambda x: x[0], cset) - cset.sort(cmp=cset_sort) # Sort with global addresses first - return cset - -def get_source_addr_from_candidate_set(dst, candidate_set): - """ - This function implement a limited version of source address selection - algorithm defined in section 5 of RFC 3484. The format is very different - from that described in the document because it operates on a set - of candidate source address for some specific route. - """ - - def scope_cmp(a, b): - """ - Given two addresses, returns -1, 0 or 1 based on comparison of - their scope - """ - scope_mapper = {IPV6_ADDR_GLOBAL: 4, - IPV6_ADDR_SITELOCAL: 3, - IPV6_ADDR_LINKLOCAL: 2, - IPV6_ADDR_LOOPBACK: 1} - sa = in6_getscope(a) - if sa == -1: - sa = IPV6_ADDR_LOOPBACK - sb = in6_getscope(b) - if sb == -1: - sb = IPV6_ADDR_LOOPBACK - - sa = scope_mapper[sa] - sb = scope_mapper[sb] - - if sa == sb: - return 0 - if sa > sb: - return 1 - return -1 - - def rfc3484_cmp(source_a, source_b): - """ - The function implements a limited version of the rules from Source - Address selection algorithm defined section of RFC 3484. - """ - - # Rule 1: Prefer same address - if source_a == dst: - return 1 - if source_b == dst: - return 1 - - # Rule 2: Prefer appropriate scope - tmp = scope_cmp(source_a, source_b) - if tmp == -1: - if scope_cmp(source_a, dst) == -1: - return 1 - else: - return -1 - elif tmp == 1: - if scope_cmp(source_b, dst) == -1: - return 1 - else: - return -1 - - # Rule 3: cannot be easily implemented - # Rule 4: cannot be easily implemented - # Rule 5: does not make sense here - # Rule 6: cannot be implemented - # Rule 7: cannot be implemented - - # Rule 8: Longest prefix match - tmp1 = in6_get_common_plen(source_a, dst) - tmp2 = in6_get_common_plen(source_b, dst) - if tmp1 > tmp2: - return 1 - elif tmp2 > tmp1: - return -1 - return 0 - - if not candidate_set: - # Should not happen - return None - - candidate_set.sort(cmp=rfc3484_cmp, reverse=True) - - return candidate_set[0] - - -def find_ifaddr2(addr, plen, laddr): - dstAddrType = in6_getAddrType(addr) - - if dstAddrType == IPV6_ADDR_UNSPECIFIED: # Shouldn't happen as dst addr - return None - - if dstAddrType == IPV6_ADDR_LOOPBACK: - return None - - tmp = [[]] + map(lambda (x,y,z): (in6_getAddrType(x), x, y, z), laddr) - def filterSameScope(l, t): - if (t[0] & dstAddrType & IPV6_ADDR_SCOPE_MASK) == 0: - l.append(t) - return l - sameScope = reduce(filterSameScope, tmp) - - l = len(sameScope) - if l == 1: # Only one address for our scope - return sameScope[0][1] - - elif l > 1: # Muliple addresses for our scope - stfAddr = filter(lambda x: x[0] & IPV6_ADDR_6TO4, sameScope) - nativeAddr = filter(lambda x: not (x[0] & IPV6_ADDR_6TO4), sameScope) - - if not (dstAddrType & IPV6_ADDR_6TO4): # destination is not 6to4 - if len(nativeAddr) != 0: - return nativeAddr[0][1] - return stfAddr[0][1] - - else: # Destination is 6to4, try to use source 6to4 addr if any - if len(stfAddr) != 0: - return stfAddr[0][1] - return nativeAddr[0][1] - else: - return None - -# Think before modify it : for instance, FE::1 does exist and is unicast -# there are many others like that. -# TODO : integrate Unique Local Addresses -def in6_getAddrType(addr): - naddr = inet_pton(socket.AF_INET6, addr) - paddr = inet_ntop(socket.AF_INET6, naddr) # normalize - addrType = 0 - # _Assignable_ Global Unicast Address space - # is defined in RFC 3513 as those in 2000::/3 - if ((struct.unpack("B", naddr[0])[0] & 0xE0) == 0x20): - addrType = (IPV6_ADDR_UNICAST | IPV6_ADDR_GLOBAL) - if naddr[:2] == ' \x02': # Mark 6to4 @ - addrType |= IPV6_ADDR_6TO4 - elif naddr[0] == '\xff': # multicast - addrScope = paddr[3] - if addrScope == '2': - addrType = (IPV6_ADDR_LINKLOCAL | IPV6_ADDR_MULTICAST) - elif addrScope == 'e': - addrType = (IPV6_ADDR_GLOBAL | IPV6_ADDR_MULTICAST) - else: - addrType = (IPV6_ADDR_GLOBAL | IPV6_ADDR_MULTICAST) - elif ((naddr[0] == '\xfe') and ((int(paddr[2], 16) & 0xC) == 0x8)): - addrType = (IPV6_ADDR_UNICAST | IPV6_ADDR_LINKLOCAL) - elif paddr == "::1": - addrType = IPV6_ADDR_LOOPBACK - elif paddr == "::": - addrType = IPV6_ADDR_UNSPECIFIED - else: - # Everything else is global unicast (RFC 3513) - # Even old deprecated (RFC3879) Site-Local addresses - addrType = (IPV6_ADDR_GLOBAL | IPV6_ADDR_UNICAST) - - return addrType - -def in6_mactoifaceid(mac, ulbit=None): - """ - Compute the interface ID in modified EUI-64 format associated - to the Ethernet address provided as input. - value taken by U/L bit in the interface identifier is basically - the reversed value of that in given MAC address it can be forced - to a specific value by using optional 'ulbit' parameter. - """ - if len(mac) != 17: return None - m = "".join(mac.split(':')) - if len(m) != 12: return None - first = int(m[0:2], 16) - if ulbit is None or not (ulbit == 0 or ulbit == 1): - ulbit = [1,'-',0][first & 0x02] - ulbit *= 2 - first = "%.02x" % ((first & 0xFD) | ulbit) - eui64 = first + m[2:4] + ":" + m[4:6] + "FF:FE" + m[6:8] + ":" + m[8:12] - return eui64.upper() - -def in6_ifaceidtomac(ifaceid): # TODO: finish commenting function behavior - """ - Extract the mac address from provided iface ID. Iface ID is provided - in printable format ("XXXX:XXFF:FEXX:XXXX", eventually compressed). None - is returned on error. - """ - try: - ifaceid = inet_pton(socket.AF_INET6, "::"+ifaceid)[8:16] - except: - return None - if ifaceid[3:5] != '\xff\xfe': - return None - first = struct.unpack("B", ifaceid[:1])[0] - ulbit = 2*[1,'-',0][first & 0x02] - first = struct.pack("B", ((first & 0xFD) | ulbit)) - oui = first + ifaceid[1:3] - end = ifaceid[5:] - l = map(lambda x: "%.02x" % struct.unpack("B", x)[0], list(oui+end)) - return ":".join(l) - -def in6_addrtomac(addr): - """ - Extract the mac address from provided address. None is returned - on error. - """ - mask = inet_pton(socket.AF_INET6, "::ffff:ffff:ffff:ffff") - x = in6_and(mask, inet_pton(socket.AF_INET6, addr)) - ifaceid = inet_ntop(socket.AF_INET6, x)[2:] - return in6_ifaceidtomac(ifaceid) - -def in6_addrtovendor(addr): - """ - Extract the MAC address from a modified EUI-64 constructed IPv6 - address provided and use the IANA oui.txt file to get the vendor. - The database used for the conversion is the one loaded by Scapy, - based on Wireshark (/usr/share/wireshark/wireshark/manuf) None - is returned on error, "UNKNOWN" if the vendor is unknown. - """ - mac = in6_addrtomac(addr) - if mac is None: - return None - - res = conf.manufdb._get_manuf(mac) - if len(res) == 17 and res.count(':') != 5: # Mac address, i.e. unknown - res = "UNKNOWN" - - return res - -def in6_getLinkScopedMcastAddr(addr, grpid=None, scope=2): - """ - Generate a Link-Scoped Multicast Address as described in RFC 4489. - Returned value is in printable notation. - - 'addr' parameter specifies the link-local address to use for generating - Link-scoped multicast address IID. - - By default, the function returns a ::/96 prefix (aka last 32 bits of - returned address are null). If a group id is provided through 'grpid' - parameter, last 32 bits of the address are set to that value (accepted - formats : '\x12\x34\x56\x78' or '12345678' or 0x12345678 or 305419896). - - By default, generated address scope is Link-Local (2). That value can - be modified by passing a specific 'scope' value as an argument of the - function. RFC 4489 only authorizes scope values <= 2. Enforcement - is performed by the function (None will be returned). - - If no link-local address can be used to generate the Link-Scoped IPv6 - Multicast address, or if another error occurs, None is returned. - """ - if not scope in [0, 1, 2]: - return None - try: - if not in6_islladdr(addr): - return None - addr = inet_pton(socket.AF_INET6, addr) - except: - warning("in6_getLinkScopedMcastPrefix(): Invalid address provided") - return None - - iid = addr[8:] - - if grpid is None: - grpid = '\x00\x00\x00\x00' - else: - if type(grpid) is str: - if len(grpid) == 8: - try: - grpid = int(grpid, 16) & 0xffffffff - except: - warning("in6_getLinkScopedMcastPrefix(): Invalid group id provided") - return None - elif len(grpid) == 4: - try: - grpid = struct.unpack("!I", grpid)[0] - except: - warning("in6_getLinkScopedMcastPrefix(): Invalid group id provided") - return None - grpid = struct.pack("!I", grpid) - - flgscope = struct.pack("B", 0xff & ((0x3 << 4) | scope)) - plen = '\xff' - res = '\x00' - a = '\xff' + flgscope + res + plen + iid + grpid - - return inet_ntop(socket.AF_INET6, a) - -def in6_get6to4Prefix(addr): - """ - Returns the /48 6to4 prefix associated with provided IPv4 address - On error, None is returned. No check is performed on public/private - status of the address - """ - try: - addr = inet_pton(socket.AF_INET, addr) - addr = inet_ntop(socket.AF_INET6, '\x20\x02'+addr+'\x00'*10) - except: - return None - return addr - -def in6_6to4ExtractAddr(addr): - """ - Extract IPv4 address embbeded in 6to4 address. Passed address must be - a 6to4 addrees. None is returned on error. - """ - try: - addr = inet_pton(socket.AF_INET6, addr) - except: - return None - if addr[:2] != " \x02": - return None - return inet_ntop(socket.AF_INET, addr[2:6]) - - -def in6_getLocalUniquePrefix(): - """ - Returns a pseudo-randomly generated Local Unique prefix. Function - follows recommandation of Section 3.2.2 of RFC 4193 for prefix - generation. - """ - # Extracted from RFC 1305 (NTP) : - # NTP timestamps are represented as a 64-bit unsigned fixed-point number, - # in seconds relative to 0h on 1 January 1900. The integer part is in the - # first 32 bits and the fraction part in the last 32 bits. - - # epoch = (1900, 1, 1, 0, 0, 0, 5, 1, 0) - # x = time.time() - # from time import gmtime, strftime, gmtime, mktime - # delta = mktime(gmtime(0)) - mktime(self.epoch) - # x = x-delta - - tod = time.time() # time of day. Will bother with epoch later - i = int(tod) - j = int((tod - i)*(2**32)) - tod = struct.pack("!II", i,j) - # TODO: Add some check regarding system address gathering - rawmac = get_if_raw_hwaddr(conf.iface6)[1] - mac = ":".join(map(lambda x: "%.02x" % ord(x), list(rawmac))) - # construct modified EUI-64 ID - eui64 = inet_pton(socket.AF_INET6, '::' + in6_mactoifaceid(mac))[8:] - import sha - globalid = sha.new(tod+eui64).digest()[:5] - return inet_ntop(socket.AF_INET6, '\xfd' + globalid + '\x00'*10) - -def in6_getRandomizedIfaceId(ifaceid, previous=None): - """ - Implements the interface ID generation algorithm described in RFC 3041. - The function takes the Modified EUI-64 interface identifier generated - as described in RFC 4291 and an optional previous history value (the - first element of the output of this function). If no previous interface - identifier is provided, a random one is generated. The function returns - a tuple containing the randomized interface identifier and the history - value (for possible future use). Input and output values are provided in - a "printable" format as depicted below. - - ex: - - >>> in6_getRandomizedIfaceId('20b:93ff:feeb:2d3') - ('4c61:76ff:f46a:a5f3', 'd006:d540:db11:b092') - - >>> in6_getRandomizedIfaceId('20b:93ff:feeb:2d3', - previous='d006:d540:db11:b092') - ('fe97:46fe:9871:bd38', 'eeed:d79c:2e3f:62e') - """ - - s = "" - if previous is None: - d = "".join(map(chr, range(256))) - for i in range(8): - s += random.choice(d) - previous = s - s = inet_pton(socket.AF_INET6, "::"+ifaceid)[8:] + previous - import md5 - s = md5.new(s).digest() - s1,s2 = s[:8],s[8:] - s1 = chr(ord(s1[0]) | 0x04) + s1[1:] - s1 = inet_ntop(socket.AF_INET6, "\xff"*8 + s1)[20:] - s2 = inet_ntop(socket.AF_INET6, "\xff"*8 + s2)[20:] - return (s1, s2) - - -_rfc1924map = [ '0','1','2','3','4','5','6','7','8','9','A','B','C','D','E', - 'F','G','H','I','J','K','L','M','N','O','P','Q','R','S','T', - 'U','V','W','X','Y','Z','a','b','c','d','e','f','g','h','i', - 'j','k','l','m','n','o','p','q','r','s','t','u','v','w','x', - 'y','z','!','#','$','%','&','(',')','*','+','-',';','<','=', - '>','?','@','^','_','`','{','|','}','~' ] - -def in6_ctop(addr): - """ - Convert an IPv6 address in Compact Representation Notation - (RFC 1924) to printable representation ;-) - Returns None on error. - """ - if len(addr) != 20 or not reduce(lambda x,y: x and y, - map(lambda x: x in _rfc1924map, addr)): - return None - i = 0 - for c in addr: - j = _rfc1924map.index(c) - i = 85*i + j - res = [] - for j in range(4): - res.append(struct.pack("!I", i%2**32)) - i = i/(2**32) - res.reverse() - return inet_ntop(socket.AF_INET6, "".join(res)) - -def in6_ptoc(addr): - """ - Converts an IPv6 address in printable representation to RFC - 1924 Compact Representation ;-) - Returns None on error. - """ - try: - d=struct.unpack("!IIII", inet_pton(socket.AF_INET6, addr)) - except: - return None - res = 0 - m = [2**96, 2**64, 2**32, 1] - for i in range(4): - res += d[i]*m[i] - rem = res - res = [] - while rem: - res.append(_rfc1924map[rem%85]) - rem = rem/85 - res.reverse() - return "".join(res) - - -def in6_isaddr6to4(x): - """ - Return True if provided address (in printable format) is a 6to4 - address (being in 2002::/16). - """ - x = inet_pton(socket.AF_INET6, x) - return x[:2] == ' \x02' - -conf.teredoPrefix = "2001::" # old one was 3ffe:831f (it is a /32) -conf.teredoServerPort = 3544 - -def in6_isaddrTeredo(x): - """ - Return True if provided address is a Teredo, meaning it is under - the /32 conf.teredoPrefix prefix value (by default, 2001::). - Otherwise, False is returned. Address must be passed in printable - format. - """ - our = inet_pton(socket.AF_INET6, x)[0:4] - teredoPrefix = inet_pton(socket.AF_INET6, conf.teredoPrefix)[0:4] - return teredoPrefix == our - -def teredoAddrExtractInfo(x): - """ - Extract information from a Teredo address. Return value is - a 4-tuple made of IPv4 address of Teredo server, flag value (int), - mapped address (non obfuscated) and mapped port (non obfuscated). - No specific checks are performed on passed address. - """ - addr = inet_pton(socket.AF_INET6, x) - server = inet_ntop(socket.AF_INET, addr[4:8]) - flag = struct.unpack("!H",addr[8:10])[0] - mappedport = struct.unpack("!H",strxor(addr[10:12],'\xff'*2))[0] - mappedaddr = inet_ntop(socket.AF_INET, strxor(addr[12:16],'\xff'*4)) - return server, flag, mappedaddr, mappedport - -def in6_iseui64(x): - """ - Return True if provided address has an interface identifier part - created in modified EUI-64 format (meaning it matches *::*:*ff:fe*:*). - Otherwise, False is returned. Address must be passed in printable - format. - """ - eui64 = inet_pton(socket.AF_INET6, '::ff:fe00:0') - x = in6_and(inet_pton(socket.AF_INET6, x), eui64) - return x == eui64 - -def in6_isanycast(x): # RFC 2526 - if in6_iseui64(x): - s = '::fdff:ffff:ffff:ff80' - packed_x = inet_pton(socket.AF_INET6, x) - packed_s = inet_pton(socket.AF_INET6, s) - x_and_s = in6_and(packed_x, packed_s) - return x_and_s == packed_s - else: - # not EUI-64 - #| n bits | 121-n bits | 7 bits | - #+---------------------------------+------------------+------------+ - #| subnet prefix | 1111111...111111 | anycast ID | - #+---------------------------------+------------------+------------+ - # | interface identifier field | - warning('in6_isanycast(): TODO not EUI-64') - return 0 - -def _in6_bitops(a1, a2, operator=0): - a1 = struct.unpack('4I', a1) - a2 = struct.unpack('4I', a2) - fop = [ lambda x,y: x | y, - lambda x,y: x & y, - lambda x,y: x ^ y - ] - ret = map(fop[operator%len(fop)], a1, a2) - t = ''.join(map(lambda x: struct.pack('I', x), ret)) - return t - -def in6_or(a1, a2): - """ - Provides a bit to bit OR of provided addresses. They must be - passed in network format. Return value is also an IPv6 address - in network format. - """ - return _in6_bitops(a1, a2, 0) - -def in6_and(a1, a2): - """ - Provides a bit to bit AND of provided addresses. They must be - passed in network format. Return value is also an IPv6 address - in network format. - """ - return _in6_bitops(a1, a2, 1) - -def in6_xor(a1, a2): - """ - Provides a bit to bit XOR of provided addresses. They must be - passed in network format. Return value is also an IPv6 address - in network format. - """ - return _in6_bitops(a1, a2, 2) - -def in6_cidr2mask(m): - """ - Return the mask (bitstring) associated with provided length - value. For instance if function is called on 48, return value is - '\xff\xff\xff\xff\xff\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'. - - """ - if m > 128 or m < 0: - raise Scapy_Exception("value provided to in6_cidr2mask outside [0, 128] domain (%d)" % m) - - t = [] - for i in xrange(0, 4): - t.append(max(0, 2**32 - 2**(32-min(32, m)))) - m -= 32 - - return ''.join(map(lambda x: struct.pack('!I', x), t)) - -def in6_getnsma(a): - """ - Return link-local solicited-node multicast address for given - address. Passed address must be provided in network format. - Returned value is also in network format. - """ - - r = in6_and(a, inet_pton(socket.AF_INET6, '::ff:ffff')) - r = in6_or(inet_pton(socket.AF_INET6, 'ff02::1:ff00:0'), r) - return r - -def in6_getnsmac(a): # return multicast Ethernet address associated with multicast v6 destination - """ - Return the multicast mac address associated with provided - IPv6 address. Passed address must be in network format. - """ - - a = struct.unpack('16B', a)[-4:] - mac = '33:33:' - mac += ':'.join(map(lambda x: '%.2x' %x, a)) - return mac - -def in6_getha(prefix): - """ - Return the anycast address associated with all home agents on a given - subnet. - """ - r = in6_and(inet_pton(socket.AF_INET6, prefix), in6_cidr2mask(64)) - r = in6_or(r, inet_pton(socket.AF_INET6, '::fdff:ffff:ffff:fffe')) - return inet_ntop(socket.AF_INET6, r) - -def in6_ptop(str): - """ - Normalizes IPv6 addresses provided in printable format, returning the - same address in printable format. (2001:0db8:0:0::1 -> 2001:db8::1) - """ - return inet_ntop(socket.AF_INET6, inet_pton(socket.AF_INET6, str)) - -def in6_isincluded(addr, prefix, plen): - """ - Returns True when 'addr' belongs to prefix/plen. False otherwise. - """ - temp = inet_pton(socket.AF_INET6, addr) - pref = in6_cidr2mask(plen) - zero = inet_pton(socket.AF_INET6, prefix) - return zero == in6_and(temp, pref) - -def in6_isdocaddr(str): - """ - Returns True if provided address in printable format belongs to - 2001:db8::/32 address space reserved for documentation (as defined - in RFC 3849). - """ - return in6_isincluded(str, '2001:db8::', 32) - -def in6_islladdr(str): - """ - Returns True if provided address in printable format belongs to - _allocated_ link-local unicast address space (fe80::/10) - """ - return in6_isincluded(str, 'fe80::', 10) - -def in6_issladdr(str): - """ - Returns True if provided address in printable format belongs to - _allocated_ site-local address space (fec0::/10). This prefix has - been deprecated, address being now reserved by IANA. Function - will remain for historic reasons. - """ - return in6_isincluded(str, 'fec0::', 10) - -def in6_isuladdr(str): - """ - Returns True if provided address in printable format belongs to - Unique local address space (fc00::/7). - """ - return in6_isincluded(str, 'fc00::', 7) - -# TODO : we should see the status of Unique Local addresses against -# global address space. -# Up-to-date information is available through RFC 3587. -# We should review function behavior based on its content. -def in6_isgladdr(str): - """ - Returns True if provided address in printable format belongs to - _allocated_ global address space (2000::/3). Please note that, - Unique Local addresses (FC00::/7) are not part of global address - space, and won't match. - """ - return in6_isincluded(str, '2000::', 3) - -def in6_ismaddr(str): - """ - Returns True if provided address in printable format belongs to - allocated Multicast address space (ff00::/8). - """ - return in6_isincluded(str, 'ff00::', 8) - -def in6_ismnladdr(str): - """ - Returns True if address belongs to node-local multicast address - space (ff01::/16) as defined in RFC - """ - return in6_isincluded(str, 'ff01::', 16) - -def in6_ismgladdr(str): - """ - Returns True if address belongs to global multicast address - space (ff0e::/16). - """ - return in6_isincluded(str, 'ff0e::', 16) - -def in6_ismlladdr(str): - """ - Returns True if address balongs to link-local multicast address - space (ff02::/16) - """ - return in6_isincluded(str, 'ff02::', 16) - -def in6_ismsladdr(str): - """ - Returns True if address belongs to site-local multicast address - space (ff05::/16). Site local address space has been deprecated. - Function remains for historic reasons. - """ - return in6_isincluded(str, 'ff05::', 16) - -def in6_isaddrllallnodes(str): - """ - Returns True if address is the link-local all-nodes multicast - address (ff02::1). - """ - return (inet_pton(socket.AF_INET6, "ff02::1") == - inet_pton(socket.AF_INET6, str)) - -def in6_isaddrllallservers(str): - """ - Returns True if address is the link-local all-servers multicast - address (ff02::2). - """ - return (inet_pton(socket.AF_INET6, "ff02::2") == - inet_pton(socket.AF_INET6, str)) - -def in6_getscope(addr): - """ - Returns the scope of the address. - """ - if in6_isgladdr(addr) or in6_isuladdr(addr): - scope = IPV6_ADDR_GLOBAL - elif in6_islladdr(addr): - scope = IPV6_ADDR_LINKLOCAL - elif in6_issladdr(addr): - scope = IPV6_ADDR_SITELOCAL - elif in6_ismaddr(addr): - if in6_ismgladdr(addr): - scope = IPV6_ADDR_GLOBAL - elif in6_ismlladdr(addr): - scope = IPV6_ADDR_LINKLOCAL - elif in6_ismsladdr(addr): - scope = IPV6_ADDR_SITELOCAL - elif in6_ismnladdr(addr): - scope = IPV6_ADDR_LOOPBACK - else: - scope = -1 - elif addr == '::1': - scope = IPV6_ADDR_LOOPBACK - else: - scope = -1 - return scope - -def in6_get_common_plen(a, b): - """ - Return common prefix length of IPv6 addresses a and b. - """ - def matching_bits(byte1, byte2): - for i in range(8): - cur_mask = 0x80 >> i - if (byte1 & cur_mask) != (byte2 & cur_mask): - return i - return 8 - - tmpA = inet_pton(socket.AF_INET6, a) - tmpB = inet_pton(socket.AF_INET6, b) - for i in range(16): - mbits = matching_bits(ord(tmpA[i]), ord(tmpB[i])) - if mbits != 8: - return 8*i + mbits - return 128 diff --git a/scripts/external_libs/scapy-2.3.1/scapy/volatile.py b/scripts/external_libs/scapy-2.3.1/scapy/volatile.py deleted file mode 100644 index 5d3e2adc..00000000 --- a/scripts/external_libs/scapy-2.3.1/scapy/volatile.py +++ /dev/null @@ -1,671 +0,0 @@ -## This file is part of Scapy -## See http://www.secdev.org/projects/scapy for more informations -## Copyright (C) Philippe Biondi <phil@secdev.org> -## This program is published under a GPLv2 license - -""" -Fields that hold random numbers. -""" - -import random,time,math -from base_classes import Net -from utils import corrupt_bits,corrupt_bytes - -#################### -## Random numbers ## -#################### - - -class RandomEnumeration: - """iterate through a sequence in random order. - When all the values have been drawn, if forever=1, the drawing is done again. - If renewkeys=0, the draw will be in the same order, guaranteeing that the same - number will be drawn in not less than the number of integers of the sequence""" - def __init__(self, inf, sup, seed=None, forever=1, renewkeys=0): - self.forever = forever - self.renewkeys = renewkeys - self.inf = inf - self.rnd = random.Random(seed) - self.sbox_size = 256 - - self.top = sup-inf+1 - - n=0 - while (1<<n) < self.top: - n += 1 - self.n =n - - self.fs = min(3,(n+1)/2) - self.fsmask = 2**self.fs-1 - self.rounds = max(self.n,3) - self.turns = 0 - self.i = 0 - - def __iter__(self): - return self - def next(self): - while True: - if self.turns == 0 or (self.i == 0 and self.renewkeys): - self.cnt_key = self.rnd.randint(0,2**self.n-1) - self.sbox = [self.rnd.randint(0,self.fsmask) for k in xrange(self.sbox_size)] - self.turns += 1 - while self.i < 2**self.n: - ct = self.i^self.cnt_key - self.i += 1 - for k in range(self.rounds): # Unbalanced Feistel Network - lsb = ct & self.fsmask - ct >>= self.fs - lsb ^= self.sbox[ct%self.sbox_size] - ct |= lsb << (self.n-self.fs) - - if ct < self.top: - return self.inf+ct - self.i = 0 - if not self.forever: - raise StopIteration - - -class VolatileValue: - def __repr__(self): - return "<%s>" % self.__class__.__name__ - def __getattr__(self, attr): - if attr == "__setstate__": - raise AttributeError(attr) - elif attr == "__cmp__": - x = self._fix() - def cmp2(y,x=x): - if type(x) != type(y): - return -1 - return x.__cmp__(y) - return cmp2 - return getattr(self._fix(),attr) - def _fix(self): - return None - - -class RandField(VolatileValue): - pass - -class RandNum(RandField): - """Instances evaluate to random integers in selected range""" - min = 0 - max = 0 - def __init__(self, min, max): - self.min = min - self.max = max - def _fix(self): - return random.randrange(self.min, self.max+1) - -class RandNumGamma(RandField): - def __init__(self, alpha, beta): - self.alpha = alpha - self.beta = beta - def _fix(self): - return int(round(random.gammavariate(self.alpha, self.beta))) - -class RandNumGauss(RandField): - def __init__(self, mu, sigma): - self.mu = mu - self.sigma = sigma - def _fix(self): - return int(round(random.gauss(self.mu, self.sigma))) - -class RandNumExpo(RandField): - def __init__(self, lambd, base=0): - self.lambd = lambd - self.base = base - def _fix(self): - return self.base+int(round(random.expovariate(self.lambd))) - -class RandEnum(RandNum): - """Instances evaluate to integer sampling without replacement from the given interval""" - def __init__(self, min, max): - self.seq = RandomEnumeration(min,max) - def _fix(self): - return self.seq.next() - -class RandByte(RandNum): - def __init__(self): - RandNum.__init__(self, 0, 2L**8-1) - -class RandSByte(RandNum): - def __init__(self): - RandNum.__init__(self, -2L**7, 2L**7-1) - -class RandShort(RandNum): - def __init__(self): - RandNum.__init__(self, 0, 2L**16-1) - -class RandSShort(RandNum): - def __init__(self): - RandNum.__init__(self, -2L**15, 2L**15-1) - -class RandInt(RandNum): - def __init__(self): - RandNum.__init__(self, 0, 2L**32-1) - -class RandSInt(RandNum): - def __init__(self): - RandNum.__init__(self, -2L**31, 2L**31-1) - -class RandLong(RandNum): - def __init__(self): - RandNum.__init__(self, 0, 2L**64-1) - -class RandSLong(RandNum): - def __init__(self): - RandNum.__init__(self, -2L**63, 2L**63-1) - -class RandEnumByte(RandEnum): - def __init__(self): - RandEnum.__init__(self, 0, 2L**8-1) - -class RandEnumSByte(RandEnum): - def __init__(self): - RandEnum.__init__(self, -2L**7, 2L**7-1) - -class RandEnumShort(RandEnum): - def __init__(self): - RandEnum.__init__(self, 0, 2L**16-1) - -class RandEnumSShort(RandEnum): - def __init__(self): - RandEnum.__init__(self, -2L**15, 2L**15-1) - -class RandEnumInt(RandEnum): - def __init__(self): - RandEnum.__init__(self, 0, 2L**32-1) - -class RandEnumSInt(RandEnum): - def __init__(self): - RandEnum.__init__(self, -2L**31, 2L**31-1) - -class RandEnumLong(RandEnum): - def __init__(self): - RandEnum.__init__(self, 0, 2L**64-1) - -class RandEnumSLong(RandEnum): - def __init__(self): - RandEnum.__init__(self, -2L**63, 2L**63-1) - -class RandChoice(RandField): - def __init__(self, *args): - if not args: - raise TypeError("RandChoice needs at least one choice") - self._choice = args - def _fix(self): - return random.choice(self._choice) - -class RandString(RandField): - def __init__(self, size=None, chars="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789"): - if size is None: - size = RandNumExpo(0.01) - self.size = size - self.chars = chars - def _fix(self): - s = "" - for i in range(self.size): - s += random.choice(self.chars) - return s - -class RandBin(RandString): - def __init__(self, size=None): - RandString.__init__(self, size, "".join(map(chr,range(256)))) - - -class RandTermString(RandString): - def __init__(self, size, term): - RandString.__init__(self, size, "".join(map(chr,range(1,256)))) - self.term = term - def _fix(self): - return RandString._fix(self)+self.term - - - -class RandIP(RandString): - def __init__(self, iptemplate="0.0.0.0/0"): - self.ip = Net(iptemplate) - def _fix(self): - return self.ip.choice() - -class RandMAC(RandString): - def __init__(self, template="*"): - template += ":*:*:*:*:*" - template = template.split(":") - self.mac = () - for i in range(6): - if template[i] == "*": - v = RandByte() - elif "-" in template[i]: - x,y = template[i].split("-") - v = RandNum(int(x,16), int(y,16)) - else: - v = int(template[i],16) - self.mac += (v,) - def _fix(self): - return "%02x:%02x:%02x:%02x:%02x:%02x" % self.mac - -class RandIP6(RandString): - def __init__(self, ip6template="**"): - self.tmpl = ip6template - self.sp = self.tmpl.split(":") - for i,v in enumerate(self.sp): - if not v or v == "**": - continue - if "-" in v: - a,b = v.split("-") - elif v == "*": - a=b="" - else: - a=b=v - - if not a: - a = "0" - if not b: - b = "ffff" - if a==b: - self.sp[i] = int(a,16) - else: - self.sp[i] = RandNum(int(a,16), int(b,16)) - self.variable = "" in self.sp - self.multi = self.sp.count("**") - def _fix(self): - done = 0 - nbm = self.multi - ip = [] - for i,n in enumerate(self.sp): - if n == "**": - nbm -= 1 - remain = 8-(len(self.sp)-i-1)-len(ip)+nbm - if "" in self.sp: - remain += 1 - if nbm or self.variable: - remain = random.randint(0,remain) - for j in range(remain): - ip.append("%04x" % random.randint(0,65535)) - if n == 0: - ip.append("0") - elif not n: - ip.append("") - else: - ip.append("%04x" % n) - if len(ip) == 9: - ip.remove("") - if ip[-1] == "": - ip[-1] = 0 - return ":".join(ip) - -class RandOID(RandString): - def __init__(self, fmt=None, depth=RandNumExpo(0.1), idnum=RandNumExpo(0.01)): - self.ori_fmt = fmt - if fmt is not None: - fmt = fmt.split(".") - for i in range(len(fmt)): - if "-" in fmt[i]: - fmt[i] = tuple(map(int, fmt[i].split("-"))) - self.fmt = fmt - self.depth = depth - self.idnum = idnum - def __repr__(self): - if self.ori_fmt is None: - return "<%s>" % self.__class__.__name__ - else: - return "<%s [%s]>" % (self.__class__.__name__, self.ori_fmt) - def _fix(self): - if self.fmt is None: - return ".".join(map(str, [self.idnum for i in xrange(1+self.depth)])) - else: - oid = [] - for i in self.fmt: - if i == "*": - oid.append(str(self.idnum)) - elif i == "**": - oid += map(str, [self.idnum for i in xrange(1+self.depth)]) - elif type(i) is tuple: - oid.append(str(random.randrange(*i))) - else: - oid.append(i) - return ".".join(oid) - - -class RandRegExp(RandField): - def __init__(self, regexp, lambda_=0.3,): - self._regexp = regexp - self._lambda = lambda_ - - @staticmethod - def choice_expand(s): #XXX does not support special sets like (ex ':alnum:') - m = "" - invert = s and s[0] == "^" - while True: - p = s.find("-") - if p < 0: - break - if p == 0 or p == len(s)-1: - m = "-" - if p: - s = s[:-1] - else: - s = s[1:] - else: - c1 = s[p-1] - c2 = s[p+1] - rng = "".join(map(chr, range(ord(c1),ord(c2)+1))) - s = s[:p-1]+rng+s[p+1:] - res = m+s - if invert: - res = "".join([chr(x) for x in xrange(256) if chr(x) not in res]) - return res - - @staticmethod - def stack_fix(lst, index): - r = "" - mul = 1 - for e in lst: - if type(e) is list: - if mul != 1: - mul = mul-1 - r += RandRegExp.stack_fix(e[1:]*mul, index) - # only the last iteration should be kept for back reference - f = RandRegExp.stack_fix(e[1:], index) - for i,idx in enumerate(index): - if e is idx: - index[i] = f - r += f - mul = 1 - elif type(e) is tuple: - kind,val = e - if kind == "cite": - r += index[val-1] - elif kind == "repeat": - mul = val - - elif kind == "choice": - if mul == 1: - c = random.choice(val) - r += RandRegExp.stack_fix(c[1:], index) - else: - r += RandRegExp.stack_fix([e]*mul, index) - mul = 1 - else: - if mul != 1: - r += RandRegExp.stack_fix([e]*mul, index) - mul = 1 - else: - r += str(e) - return r - - def _fix(self): - stack = [None] - index = [] - current = stack - i = 0 - ln = len(self._regexp) - interp = True - while i < ln: - c = self._regexp[i] - i+=1 - - if c == '(': - current = [current] - current[0].append(current) - elif c == '|': - p = current[0] - ch = p[-1] - if type(ch) is not tuple: - ch = ("choice",[current]) - p[-1] = ch - else: - ch[1].append(current) - current = [p] - elif c == ')': - ch = current[0][-1] - if type(ch) is tuple: - ch[1].append(current) - index.append(current) - current = current[0] - elif c == '[' or c == '{': - current = [current] - current[0].append(current) - interp = False - elif c == ']': - current = current[0] - choice = RandRegExp.choice_expand("".join(current.pop()[1:])) - current.append(RandChoice(*list(choice))) - interp = True - elif c == '}': - current = current[0] - num = "".join(current.pop()[1:]) - e = current.pop() - if "," not in num: - n = int(num) - current.append([current]+[e]*n) - else: - num_min,num_max = num.split(",") - if not num_min: - num_min = "0" - if num_max: - n = RandNum(int(num_min),int(num_max)) - else: - n = RandNumExpo(self._lambda,base=int(num_min)) - current.append(("repeat",n)) - current.append(e) - interp = True - elif c == '\\': - c = self._regexp[i] - if c == "s": - c = RandChoice(" ","\t") - elif c in "0123456789": - c = ("cite",ord(c)-0x30) - current.append(c) - i += 1 - elif not interp: - current.append(c) - elif c == '+': - e = current.pop() - current.append([current]+[e]*(int(random.expovariate(self._lambda))+1)) - elif c == '*': - e = current.pop() - current.append([current]+[e]*int(random.expovariate(self._lambda))) - elif c == '?': - if random.randint(0,1): - current.pop() - elif c == '.': - current.append(RandChoice(*[chr(x) for x in xrange(256)])) - elif c == '$' or c == '^': - pass - else: - current.append(c) - - return RandRegExp.stack_fix(stack[1:], index) - def __repr__(self): - return "<%s [%r]>" % (self.__class__.__name__, self._regexp) - -class RandSingularity(RandChoice): - pass - -class RandSingNum(RandSingularity): - @staticmethod - def make_power_of_two(end): - sign = 1 - if end == 0: - end = 1 - if end < 0: - end = -end - sign = -1 - end_n = int(math.log(end)/math.log(2))+1 - return set([sign*2**i for i in range(end_n)]) - - def __init__(self, mn, mx): - sing = set([0, mn, mx, int((mn+mx)/2)]) - sing |= self.make_power_of_two(mn) - sing |= self.make_power_of_two(mx) - for i in sing.copy(): - sing.add(i+1) - sing.add(i-1) - for i in sing.copy(): - if not mn <= i <= mx: - sing.remove(i) - self._choice = list(sing) - - -class RandSingByte(RandSingNum): - def __init__(self): - RandSingNum.__init__(self, 0, 2L**8-1) - -class RandSingSByte(RandSingNum): - def __init__(self): - RandSingNum.__init__(self, -2L**7, 2L**7-1) - -class RandSingShort(RandSingNum): - def __init__(self): - RandSingNum.__init__(self, 0, 2L**16-1) - -class RandSingSShort(RandSingNum): - def __init__(self): - RandSingNum.__init__(self, -2L**15, 2L**15-1) - -class RandSingInt(RandSingNum): - def __init__(self): - RandSingNum.__init__(self, 0, 2L**32-1) - -class RandSingSInt(RandSingNum): - def __init__(self): - RandSingNum.__init__(self, -2L**31, 2L**31-1) - -class RandSingLong(RandSingNum): - def __init__(self): - RandSingNum.__init__(self, 0, 2L**64-1) - -class RandSingSLong(RandSingNum): - def __init__(self): - RandSingNum.__init__(self, -2L**63, 2L**63-1) - -class RandSingString(RandSingularity): - def __init__(self): - self._choice = [ "", - "%x", - "%%", - "%s", - "%i", - "%n", - "%x%x%x%x%x%x%x%x%x", - "%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s", - "%", - "%%%", - "A"*4096, - "\x00"*4096, - "\xff"*4096, - "\x7f"*4096, - "\x80"*4096, - " "*4096, - "\\"*4096, - "("*4096, - "../"*1024, - "/"*1024, - "${HOME}"*512, - " or 1=1 --", - "' or 1=1 --", - '" or 1=1 --', - " or 1=1; #", - "' or 1=1; #", - '" or 1=1; #', - ";reboot;", - "$(reboot)", - "`reboot`", - "index.php%00", - "\x00", - "%00", - "\\", - "../../../../../../../../../../../../../../../../../etc/passwd", - "%2e%2e%2f" * 20 + "etc/passwd", - "%252e%252e%252f" * 20 + "boot.ini", - "..%c0%af" * 20 + "etc/passwd", - "..%c0%af" * 20 + "boot.ini", - "//etc/passwd", - r"..\..\..\..\..\..\..\..\..\..\..\..\..\..\..\..\..\boot.ini", - "AUX:", - "CLOCK$", - "COM:", - "CON:", - "LPT:", - "LST:", - "NUL:", - "CON:", - r"C:\CON\CON", - r"C:\boot.ini", - r"\\myserver\share", - "foo.exe:", - "foo.exe\\", ] - - -class RandPool(RandField): - def __init__(self, *args): - """Each parameter is a volatile object or a couple (volatile object, weight)""" - pool = [] - for p in args: - w = 1 - if type(p) is tuple: - p,w = p - pool += [p]*w - self._pool = pool - def _fix(self): - r = random.choice(self._pool) - return r._fix() - -# Automatic timestamp - -class AutoTime(VolatileValue): - def __init__(self, base=None): - if base == None: - self.diff = 0 - else: - self.diff = time.time()-base - def _fix(self): - return time.time()-self.diff - -class IntAutoTime(AutoTime): - def _fix(self): - return int(time.time()-self.diff) - - -class ZuluTime(AutoTime): - def __init__(self, diff=None): - self.diff=diff - def _fix(self): - return time.strftime("%y%m%d%H%M%SZ",time.gmtime(time.time()+self.diff)) - - -class DelayedEval(VolatileValue): - """ Exemple of usage: DelayedEval("time.time()") """ - def __init__(self, expr): - self.expr = expr - def _fix(self): - return eval(self.expr) - - -class IncrementalValue(VolatileValue): - def __init__(self, start=0, step=1, restart=-1): - self.start = self.val = start - self.step = step - self.restart = restart - def _fix(self): - v = self.val - if self.val == self.restart : - self.val = self.start - else: - self.val += self.step - return v - -class CorruptedBytes(VolatileValue): - def __init__(self, s, p=0.01, n=None): - self.s = s - self.p = p - self.n = n - def _fix(self): - return corrupt_bytes(self.s, self.p, self.n) - -class CorruptedBits(CorruptedBytes): - def _fix(self): - return corrupt_bits(self.s, self.p, self.n) - |