diff --git a/scapy.py b/scapy.py index 6b717999d792d9bcc06aad98553e639fb6d6b5c7..070de55b6e851d24919089cf1c8217645e60dc52 100755 --- a/scapy.py +++ b/scapy.py @@ -4834,13 +4834,28 @@ class ASN1F_badsequence(Exception): 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 + 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): + def __init__(self, name, default, context=None): + if context is not None: + self.context = context self.name = name self.default = default @@ -4855,7 +4870,7 @@ class ASN1F_field(ASN1F_element): def any2i(self, pkt, x): return x def m2i(self, pkt, x): - return self.ASN1_tag.get_codec(pkt.ASN1_codec).safedec(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 @@ -4910,6 +4925,9 @@ class ASN1F_INTEGER(ASN1F_field): def randval(self): return RandNum(-2**64, 2**64-1) +class ASN1F_NULL(ASN1F_INTEGER): + ASN1_tag= ASN1_Class_UNIVERSAL.NULL + class ASN1F_enum_INTEGER(ASN1F_INTEGER): def __init__(self, name, default, enum): ASN1F_INTEGER.__init__(self, name, default) @@ -4947,6 +4965,15 @@ class ASN1F_STRING(ASN1F_field): 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_UTC_TIME(ASN1F_STRING): + ASN1_tag = ASN1_Class_UNIVERSAL.UTC_TIME + class ASN1F_OID(ASN1F_field): ASN1_tag = ASN1_Class_UNIVERSAL.OID def randval(self): @@ -4960,6 +4987,9 @@ class ASN1F_SEQUENCE(ASN1F_field): 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 get_fields_list(self): return reduce(lambda x,y: x+y.get_fields_list(), self.seq, []) def build(self, pkt): @@ -4977,6 +5007,9 @@ class ASN1F_SEQUENCE(ASN1F_field): 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 @@ -5001,7 +5034,7 @@ class ASN1F_SEQUENCE_OF(ASN1F_SEQUENCE): while s1: try: p = self.asn1pkt(s1) - except ASN1F_badsequence: + except ASN1F_badsequence,e: lst.append(Raw(s1)) break lst.append(p)