From d99bb186f47be67f4149e78b27fe55583d2aa7ad Mon Sep 17 00:00:00 2001
From: Martin Gallo <martin.gallo@gmail.com>
Date: Wed, 27 Aug 2014 10:13:23 -0300
Subject: [PATCH] Added EnumFields that takes values from dict's key when
 fuzzed

--HG--
branch : enumkeys
---
 scapy/fields.py   | 18 ++++++++++++++++++
 scapy/volatile.py | 11 +++++++++++
 2 files changed, 29 insertions(+)

diff --git a/scapy/fields.py b/scapy/fields.py
index 91df1ada..70d9576e 100644
--- a/scapy/fields.py
+++ b/scapy/fields.py
@@ -829,6 +829,24 @@ class BitMultiEnumField(BitField,MultiEnumField):
         return MultiEnumField.i2repr(self, pkt, x)
 
 
+class ByteEnumKeysField(ByteEnumField):
+    """ByteEnumField that picks valid values when fuzzed. """
+    def randval(self):
+        return RandEnumKeys(self.i2s)
+
+
+class ShortEnumKeysField(ShortEnumField):
+    """ShortEnumField that picks valid values when fuzzed. """
+    def randval(self):
+        return RandEnumKeys(self.i2s)
+
+
+class IntEnumKeysField(IntEnumField):
+    """IntEnumField that picks valid values when fuzzed. """
+    def randval(self):
+        return RandEnumKeys(self.i2s)
+
+
 # Little endian long field
 class LELongField(Field):
     def __init__(self, name, default):
diff --git a/scapy/volatile.py b/scapy/volatile.py
index 5d3e2adc..12fa1b0b 100644
--- a/scapy/volatile.py
+++ b/scapy/volatile.py
@@ -188,6 +188,17 @@ class RandEnumSLong(RandEnum):
     def __init__(self):
         RandEnum.__init__(self, -2L**63, 2L**63-1)
 
+class RandEnumKeys(RandEnum):
+    """Picks a random value from dict keys list. """
+    def __init__(self, enum):
+        self.enum = []
+        for key in list(enum.keys()):
+            self.enum.append(key)
+        self.seq = RandomEnumeration(0, len(list(enum.keys())) - 1)
+
+    def _fix(self):
+        return self.enum[self.seq.next()]
+
 class RandChoice(RandField):
     def __init__(self, *args):
         if not args:
-- 
GitLab