Changeset 930:9dcf73256a4a

Show
Ignore:
Timestamp:
10/01/08 17:47:49 (2 months ago)
Author:
Phil <phil@secdev.org>
Message:

Made volatile objects pickable again

Files:

Legend:

Unmodified
Added
Removed
Modified
Copied
Moved
  • scapy/volatile.py

    r929 r930  
    1212#################### 
    1313 
    14 def randseq(inf, sup, seed=None, forever=1, renewkeys=0): 
     14 
     15class RandomSequence: 
    1516    """iterate through a sequence in random order. 
    1617       When all the values have been drawn, if forever=1, the drawing is done again. 
    1718       If renewkeys=0, the draw will be in the same order, guaranteeing that the same 
    1819       number will be drawn in not less than the number of integers of the sequence""" 
    19     rnd = random.Random(seed) 
    20     sbox_size = 256 
    21  
    22     top = sup-inf+1 
     20    def __init__(self, inf, sup, seed=None, forever=1, renewkeys=0): 
     21        self.forever = forever 
     22        self.renewkeys = renewkeys 
     23        self.inf = inf 
     24        self.rnd = random.Random(seed) 
     25        self.sbox_size = 256 
     26 
     27        self.top = sup-inf+1 
    2328     
    24     n=0 
    25     while (1<<n) < top: 
    26         n += 1 
    27  
    28     fs = min(3,(n+1)/2) 
    29     fsmask = 2**fs-1 
    30     rounds = max(n,3) 
    31     turns = 0 
    32  
    33     while 1: 
    34         if turns == 0 or renewkeys: 
    35             sbox = [rnd.randint(0,fsmask) for k in xrange(sbox_size)] 
    36         turns += 1 
    37         i = 0 
    38         while i < 2**n: 
    39             ct = i 
    40             i += 1 
    41             for k in range(rounds): # Unbalanced Feistel Network 
    42                 lsb = ct & fsmask 
    43                 ct >>= fs 
    44                 lsb ^= sbox[ct%sbox_size] 
    45                 ct |= lsb << (n-fs) 
    46              
    47             if ct < top: 
    48                 yield inf+ct 
    49         if not forever: 
    50             break 
     29        n=0 
     30        while (1<<n) < self.top: 
     31            n += 1 
     32        self.n =n 
     33 
     34        self.fs = min(3,(n+1)/2) 
     35        self.fsmask = 2**self.fs-1 
     36        self.rounds = max(self.n,3) 
     37        self.turns = 0 
     38        self.i = 0 
     39 
     40    def __iter__(self): 
     41        return self 
     42    def next(self): 
     43        while True: 
     44            if self.turns == 0 or (self.i == 0 and self.renewkeys): 
     45                self.sbox = [self.rnd.randint(0,self.fsmask) for k in xrange(self.sbox_size)] 
     46            self.turns += 1 
     47            while self.i < 2**self.n: 
     48                ct = self.i 
     49                self.i += 1 
     50                for k in range(self.rounds): # Unbalanced Feistel Network 
     51                    lsb = ct & self.fsmask 
     52                    ct >>= self.fs 
     53                    lsb ^= self.sbox[ct%self.sbox_size] 
     54                    ct |= lsb << (self.n-self.fs) 
     55                 
     56                if ct < self.top: 
     57                    return self.inf+ct 
     58            self.i = 0 
     59            if not self.forever: 
     60                raise StopIteration 
    5161 
    5262 
     
    98108class RandSeq(RandNum): 
    99109    def __init__(self, min, max): 
    100         self.seq = randseq(min,max) 
     110        self.seq = RandomSequence(min,max) 
    101111    def _fix(self): 
    102112        return self.seq.next()