import array, random
TEADELTA = 0x9e3779b9L
TEAROUNDS = 32
TEASBOXSIZE = 128
TEASBOXSHIFT = 7
class randrange(object):
def __init__(self, start, stop):
self.start = start
self.max = stop - start
self.sbox = array.array('I', [ random.randint(0, 0xffffffffL)
for i in range(TEASBOXSIZE) ])
bits = 0
while (1 << bits) < self.max:
bits += 1
self.left = bits / 2
self.right = bits - self.left
self.mask = (1 << bits) - 1
if TEASBOXSIZE < (1 << self.left):
self.sboxmask = TEASBOXSIZE - 1
self.kshift = TEASBOXSHIFT
else:
self.sboxmask = (1 << self.left) - 1
self.kshift = self.left
def __iter__(self):
enc = 0
for i in range(self.max):
c = self.max
while c >= self.max:
c = enc
enc += 1
s = 0
for j in range(TEAROUNDS):
s += TEADELTA
c ^= (self.sbox[(c ^ s) & self.sboxmask] << self.kshift)
c = (c + s) & self.mask
c = ((c << self.left) | (c >> self.right)) & self.mask
yield self.start + c
def __len__(self):
return self.max