Mercurial > p > roundup > code
annotate roundup/anypy/random_.py @ 5726:e199d0ae4a25
issue2551033: prevent reverse engineering hidden data by using etags
as an oracle to identify when the right data has been
guessed. Identified by Joseph Myers who also suggested remediation
methods. Implemented John Rouillard.
| author | John Rouillard <rouilj@ieee.org> |
|---|---|
| date | Thu, 23 May 2019 18:56:57 -0400 |
| parents | 52cb53eedf77 |
| children | adf54478cdaf |
| rev | line source |
|---|---|
|
5488
52cb53eedf77
reworked random number use
Christof Meerwald <cmeerw@cmeerw.org>
parents:
diff
changeset
|
1 try: |
|
52cb53eedf77
reworked random number use
Christof Meerwald <cmeerw@cmeerw.org>
parents:
diff
changeset
|
2 from secrets import choice, randbelow, token_bytes |
|
52cb53eedf77
reworked random number use
Christof Meerwald <cmeerw@cmeerw.org>
parents:
diff
changeset
|
3 def seed(v = None): |
|
52cb53eedf77
reworked random number use
Christof Meerwald <cmeerw@cmeerw.org>
parents:
diff
changeset
|
4 pass |
|
52cb53eedf77
reworked random number use
Christof Meerwald <cmeerw@cmeerw.org>
parents:
diff
changeset
|
5 |
|
52cb53eedf77
reworked random number use
Christof Meerwald <cmeerw@cmeerw.org>
parents:
diff
changeset
|
6 is_weak = False |
|
52cb53eedf77
reworked random number use
Christof Meerwald <cmeerw@cmeerw.org>
parents:
diff
changeset
|
7 except ImportError: |
|
52cb53eedf77
reworked random number use
Christof Meerwald <cmeerw@cmeerw.org>
parents:
diff
changeset
|
8 import os as _os |
|
52cb53eedf77
reworked random number use
Christof Meerwald <cmeerw@cmeerw.org>
parents:
diff
changeset
|
9 import random as _random |
|
52cb53eedf77
reworked random number use
Christof Meerwald <cmeerw@cmeerw.org>
parents:
diff
changeset
|
10 |
|
52cb53eedf77
reworked random number use
Christof Meerwald <cmeerw@cmeerw.org>
parents:
diff
changeset
|
11 # prefer to use SystemRandom if it is available |
|
52cb53eedf77
reworked random number use
Christof Meerwald <cmeerw@cmeerw.org>
parents:
diff
changeset
|
12 if hasattr(_random, 'SystemRandom'): |
|
52cb53eedf77
reworked random number use
Christof Meerwald <cmeerw@cmeerw.org>
parents:
diff
changeset
|
13 def seed(v = None): |
|
52cb53eedf77
reworked random number use
Christof Meerwald <cmeerw@cmeerw.org>
parents:
diff
changeset
|
14 pass |
|
52cb53eedf77
reworked random number use
Christof Meerwald <cmeerw@cmeerw.org>
parents:
diff
changeset
|
15 |
|
52cb53eedf77
reworked random number use
Christof Meerwald <cmeerw@cmeerw.org>
parents:
diff
changeset
|
16 _r = _random.SystemRandom() |
|
52cb53eedf77
reworked random number use
Christof Meerwald <cmeerw@cmeerw.org>
parents:
diff
changeset
|
17 is_weak = False |
|
52cb53eedf77
reworked random number use
Christof Meerwald <cmeerw@cmeerw.org>
parents:
diff
changeset
|
18 else: |
|
52cb53eedf77
reworked random number use
Christof Meerwald <cmeerw@cmeerw.org>
parents:
diff
changeset
|
19 # don't completely throw away the existing state, but add some |
|
52cb53eedf77
reworked random number use
Christof Meerwald <cmeerw@cmeerw.org>
parents:
diff
changeset
|
20 # more random state to the existing state |
|
52cb53eedf77
reworked random number use
Christof Meerwald <cmeerw@cmeerw.org>
parents:
diff
changeset
|
21 def seed(v = None): |
|
52cb53eedf77
reworked random number use
Christof Meerwald <cmeerw@cmeerw.org>
parents:
diff
changeset
|
22 import os, time |
|
52cb53eedf77
reworked random number use
Christof Meerwald <cmeerw@cmeerw.org>
parents:
diff
changeset
|
23 _r.seed((_r.getstate(), |
|
52cb53eedf77
reworked random number use
Christof Meerwald <cmeerw@cmeerw.org>
parents:
diff
changeset
|
24 v, |
|
52cb53eedf77
reworked random number use
Christof Meerwald <cmeerw@cmeerw.org>
parents:
diff
changeset
|
25 hasattr(os, 'getpid') and os.getpid(), |
|
52cb53eedf77
reworked random number use
Christof Meerwald <cmeerw@cmeerw.org>
parents:
diff
changeset
|
26 time.time())) |
|
52cb53eedf77
reworked random number use
Christof Meerwald <cmeerw@cmeerw.org>
parents:
diff
changeset
|
27 |
|
52cb53eedf77
reworked random number use
Christof Meerwald <cmeerw@cmeerw.org>
parents:
diff
changeset
|
28 # create our own instance so we don't mess with the global |
|
52cb53eedf77
reworked random number use
Christof Meerwald <cmeerw@cmeerw.org>
parents:
diff
changeset
|
29 # random number generator |
|
52cb53eedf77
reworked random number use
Christof Meerwald <cmeerw@cmeerw.org>
parents:
diff
changeset
|
30 _r = _random.Random() |
|
52cb53eedf77
reworked random number use
Christof Meerwald <cmeerw@cmeerw.org>
parents:
diff
changeset
|
31 seed() |
|
52cb53eedf77
reworked random number use
Christof Meerwald <cmeerw@cmeerw.org>
parents:
diff
changeset
|
32 is_weak = True |
|
52cb53eedf77
reworked random number use
Christof Meerwald <cmeerw@cmeerw.org>
parents:
diff
changeset
|
33 |
|
52cb53eedf77
reworked random number use
Christof Meerwald <cmeerw@cmeerw.org>
parents:
diff
changeset
|
34 choice = _r.choice |
|
52cb53eedf77
reworked random number use
Christof Meerwald <cmeerw@cmeerw.org>
parents:
diff
changeset
|
35 |
|
52cb53eedf77
reworked random number use
Christof Meerwald <cmeerw@cmeerw.org>
parents:
diff
changeset
|
36 def randbelow(i): |
|
52cb53eedf77
reworked random number use
Christof Meerwald <cmeerw@cmeerw.org>
parents:
diff
changeset
|
37 return _r.randint(0, i - 1) |
|
52cb53eedf77
reworked random number use
Christof Meerwald <cmeerw@cmeerw.org>
parents:
diff
changeset
|
38 |
|
52cb53eedf77
reworked random number use
Christof Meerwald <cmeerw@cmeerw.org>
parents:
diff
changeset
|
39 if hasattr(_os, 'urandom'): |
|
52cb53eedf77
reworked random number use
Christof Meerwald <cmeerw@cmeerw.org>
parents:
diff
changeset
|
40 def token_bytes(l): |
|
52cb53eedf77
reworked random number use
Christof Meerwald <cmeerw@cmeerw.org>
parents:
diff
changeset
|
41 return _os.urandom(l) |
|
52cb53eedf77
reworked random number use
Christof Meerwald <cmeerw@cmeerw.org>
parents:
diff
changeset
|
42 else: |
|
52cb53eedf77
reworked random number use
Christof Meerwald <cmeerw@cmeerw.org>
parents:
diff
changeset
|
43 def token_bytes(l): |
|
52cb53eedf77
reworked random number use
Christof Meerwald <cmeerw@cmeerw.org>
parents:
diff
changeset
|
44 _bchr = chr if str == bytes else lambda x: bytes((x,)) |
|
52cb53eedf77
reworked random number use
Christof Meerwald <cmeerw@cmeerw.org>
parents:
diff
changeset
|
45 return b''.join([_bchr(_r.getrandbits(8)) for i in range(l)]) |
