From 6d9a71e24d0f236bd74ae2f98ba361af0c7d2ef9 Mon Sep 17 00:00:00 2001
From: Phil <phil@secdev.org>
Date: Fri, 29 Feb 2008 14:37:09 +0100
Subject: [PATCH] Other ASN1 tweaks

---
 scapy.py | 19 ++++++++++++++++---
 1 file changed, 16 insertions(+), 3 deletions(-)

diff --git a/scapy.py b/scapy.py
index 070de55b..e0d24264 100755
--- a/scapy.py
+++ b/scapy.py
@@ -4845,6 +4845,9 @@ class ASN1F_optionnal(ASN1F_element):
         except ASN1F_badsequence:
             self._field.set_val(pkt,None)
             return s
+        except BER_Decoding_Error:
+            self._field.set_val(pkt,None)
+            return s
 
 class ASN1F_field(ASN1F_element):
     holds_packets=0
@@ -4987,9 +4990,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 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):
@@ -5018,6 +5021,10 @@ class ASN1F_SEQUENCE_OF(ASN1F_SEQUENCE):
         self.tag = chr(ASN1_tag)
         self.name = name
         self.default = default
+    def i2m(self, pkt, i):
+        if i is None:
+            return []
+        return i
     def get_fields_list(self):
         return [self]
     def build(self, pkt):
@@ -5027,6 +5034,10 @@ class ASN1F_SEQUENCE_OF(ASN1F_SEQUENCE):
         else:
             s = "".join(map(str, val ))
         return self.i2m(pkt, s)
+    def set_val(self, pkt, val):
+        if val is None:
+            val = []
+        ASN1F_field.set_val(self, pkt, val)
     def dissect(self, pkt, s):
         codec = self.ASN1_tag.get_codec(pkt.ASN1_codec)
         i,s1,remain = codec.check_type_check_len(s)
@@ -5047,6 +5058,8 @@ class ASN1F_SEQUENCE_OF(ASN1F_SEQUENCE):
         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
-- 
GitLab