From 9888e6c471300188166d82027d3869464c3f12e5 Mon Sep 17 00:00:00 2001 From: mtu 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 d5d1add3c..7262736ff 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 8b42ac538..d61e2445d 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' +