diff options
Diffstat (limited to 'scripts/external_libs/scapy-python3-0.18/scapy/asn1/asn1.py')
-rw-r--r-- | scripts/external_libs/scapy-python3-0.18/scapy/asn1/asn1.py | 321 |
1 files changed, 0 insertions, 321 deletions
diff --git a/scripts/external_libs/scapy-python3-0.18/scapy/asn1/asn1.py b/scripts/external_libs/scapy-python3-0.18/scapy/asn1/asn1.py deleted file mode 100644 index c94d0b12..00000000 --- a/scripts/external_libs/scapy-python3-0.18/scapy/asn1/asn1.py +++ /dev/null @@ -1,321 +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 = [ x._asn1_obj for x in - [ x for x in ASN1_Class_UNIVERSAL.__rdict__.values() if hasattr(x,"_asn1_obj") ]] -# objlist = map(lambda x:x._asn1_obj, -# [ x for x in ASN1_Class_UNIVERSAL.__rdict__.values() if hasattr(x,"_asn1_obj") ]) - self.objlist = objlist - self.chars = b"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(bytes([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 o([ x._fix(n+1) for x in [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): - #__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 as 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__.items(): - if k not in dct and isinstance(v,ASN1Tag): - dct[k] = v.clone() - - rdict = {} - for k,v in dct.items(): - 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): - pass - -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): - raise Exception("Should not get here") - #return self.enc(conf.ASN1_default_codec) - def __bytes__(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 __hash__(self): - return self.val - 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 - def __init__(self, val): - if type(val) is str: - self.val = val.encode('ascii') - elif type(val) is bytes: - self.val = val - else: - raise Exception("Unknown value type for ASN1_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): - if type(val) is str: - val = val.encode('ascii') - 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 |