From 7aeecc3f13934d3eda06874e4e0d409ee7a56701 Mon Sep 17 00:00:00 2001
From: Phil <phil@secdev.org>
Date: Thu, 27 Aug 2009 18:34:33 +0200
Subject: [PATCH] Added some ASN1 types (ENUMERATED, GAUGE, GENERALIZED TIME)
 and their BER/ASN1F couterparts

---
 scapy/asn1/asn1.py  | 16 ++++++++++++++++
 scapy/asn1/ber.py   | 12 ++++++++++++
 scapy/asn1fields.py |  9 +++++++++
 3 files changed, 37 insertions(+)

diff --git a/scapy/asn1/asn1.py b/scapy/asn1/asn1.py
index c8c42f72..5e1866da 100644
--- a/scapy/asn1/asn1.py
+++ b/scapy/asn1/asn1.py
@@ -161,7 +161,9 @@ class ASN1_Class_UNIVERSAL(ASN1_Class):
     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):
@@ -246,15 +248,27 @@ class ASN1_IPADDRESS(ASN1_STRING):
 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
     
@@ -276,6 +290,8 @@ class ASN1_OID(ASN1_Object):
         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)
     
 
 
diff --git a/scapy/asn1/ber.py b/scapy/asn1/ber.py
index 25c913dd..371274bf 100644
--- a/scapy/asn1/ber.py
+++ b/scapy/asn1/ber.py
@@ -223,6 +223,9 @@ class BERcodec_INTEGER(BERcodec_Object):
 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
@@ -232,6 +235,9 @@ class BERcodec_NULL(BERcodec_INTEGER):
         else:
             return super(cls,cls).enc(i)
 
+class BERcodec_SEP(BERcodec_NULL):
+    tag = ASN1_Class_UNIVERSAL.SEP
+
 class BERcodec_STRING(BERcodec_Object):
     tag = ASN1_Class_UNIVERSAL.STRING
     @classmethod
@@ -277,9 +283,15 @@ class BERcodec_IPADDRESS(BERcodec_STRING):
 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
 
diff --git a/scapy/asn1fields.py b/scapy/asn1fields.py
index 83722125..c32fbe31 100644
--- a/scapy/asn1fields.py
+++ b/scapy/asn1fields.py
@@ -123,6 +123,9 @@ class ASN1F_BOOLEAN(ASN1F_field):
 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)
@@ -155,6 +158,9 @@ class ASN1F_enum_INTEGER(ASN1F_INTEGER):
         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):
@@ -175,6 +181,9 @@ class ASN1F_TIME_TICKS(ASN1F_INTEGER):
 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):
-- 
GitLab