diff --git a/scapy/fields.py b/scapy/fields.py index fa6cba4d7ad22a90bd80da8fb9bb0c177b7c8280..6a28af736d05d8030a30e0d2e84089f449eb6339 100644 --- a/scapy/fields.py +++ b/scapy/fields.py @@ -827,6 +827,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 5d3e2adcb1b83b97fadd0b7c1ef9da4b5991c140..12fa1b0b62daae13ad7fcd7be6c3adeb4ac11f7a 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: