From 9888e6c471300188166d82027d3869464c3f12e5 Mon Sep 17 00:00:00 2001
From: mtu <maxence.tury@ssi.gouv.fr>
Date: Mon, 2 Jan 2017 14:59:42 +0100
Subject: [PATCH] Fix complex ASN1 fields randval()

---
 scapy/asn1fields.py | 15 +++++++++++++--
 test/x509.uts       | 14 ++++++++++++++
 2 files changed, 27 insertions(+), 2 deletions(-)

diff --git a/scapy/asn1fields.py b/scapy/asn1fields.py
index d5d1add3..7262736f 100644
--- a/scapy/asn1fields.py
+++ b/scapy/asn1fields.py
@@ -367,7 +367,7 @@ class ASN1F_SEQUENCE_OF(ASN1F_field):
         return self.i2m(pkt, s)
 
     def randval(self):
-        return packet.fuzz(self.asn1pkt())
+        return packet.fuzz(self.cls())
     def __repr__(self):
         return "<%s %s>" % (self.__class__.__name__, self.name)
 
@@ -488,7 +488,16 @@ class ASN1F_CHOICE(ASN1F_field):
                                     explicit_tag=exp)
         return BER_tagging_enc(s, explicit_tag=self.explicit_tag)
     def randval(self):
-        return RandChoice(*(packet.fuzz(x()) for x in self.choices.itervalues()))
+        randchoices = []
+        for p in self.choices.itervalues():
+            if hasattr(p, "ASN1_root"):   # should be ASN1_Packet class
+                randchoices.append(packet.fuzz(p()))
+            elif hasattr(p, "ASN1_tag"):
+                if type(p) is type:       # should be (basic) ASN1F_field class
+                    randchoices.append(p("dummy", None).randval())
+                else:                     # should be ASN1F_PACKET instance
+                    randchoices.append(p.randval())
+        return RandChoice(*randchoices)
 
 class ASN1F_PACKET(ASN1F_field):
     holds_packets = 1
@@ -520,6 +529,8 @@ class ASN1F_PACKET(ASN1F_field):
             s = str(x)
         return BER_tagging_enc(s, implicit_tag=self.implicit_tag,
                                explicit_tag=self.explicit_tag)
+    def randval(self):
+        return packet.fuzz(self.cls())
 
 class ASN1F_BIT_STRING_ENCAPS(ASN1F_BIT_STRING):
     """
diff --git a/test/x509.uts b/test/x509.uts
index 8b42ac53..d61e2445 100644
--- a/test/x509.uts
+++ b/test/x509.uts
@@ -190,3 +190,17 @@ s = str(X509_CRL())
 str(X509_CRL(s)) == s
 
 
+############ Randval tests ###############################################
+
+= Randval tests : ASN1F_SEQUENCE_OF
+random.seed(42)
+r = ASN1F_SEQUENCE_OF("test", [], ASN1P_INTEGER).randval().number
+assert(isinstance(r, RandNum))
+int(r) == -16393048219351680611L
+
+= Randval tests : ASN1F_PACKET
+random.seed(0xcafecafe)
+r = ASN1F_PACKET("otherName", None, X509_OtherName).randval()
+assert(isinstance(r, X509_OtherName))
+str(r.type_id) == '171.184.10.271'
+
-- 
GitLab