-
Notifications
You must be signed in to change notification settings - Fork 10
/
Copy pathrdrand.py
90 lines (74 loc) · 3.27 KB
/
rdrand.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
# Copyright (c) 2013, Chris Stillson <[email protected]>
# All rights reserved.
#
# Redistribution and use in source and binary forms, with or without
# modification, are permitted provided that the following conditions are met:
#
# 1. Redistributions of source code must retain the above copyright notice,
# this list of conditions and the following disclaimer.
# 2. Redistributions in binary form must reproduce the above copyright notice,
# this list of conditions and the following disclaimer in the documentation
# and/or other materials provided with the distribution.
#
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
# LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
# POSSIBILITY OF SUCH DAMAGE.
from random import Random as StdRandom
from _rdrand import *
if HAS_RAND == 0:
print( "This module requires a cpu which supports the" +\
" RdRand instruction")
raise SystemError
if HAS_SEED == 0:
rdseed_get_bits = None
rdseed_get_bytes = None
class BaseRandom(StdRandom):
"""Base class for alternate random number generator using
Intel's RdRand or RdSeed instructions to access the
hardware random number generator. Not available on all
systems (see os.urandom() for details).
"""
get_bits = None
get_bytes = None
def random(self):
"""Get the next random number in the range [0.0, 1.0).
52 is the number of bits
"""
return (1.0 * self.get_bits(52)) / (2 ** 52)
def getrandbytes(self, k):
if k <= 0:
raise ValueError('number of bytes must be greater than zero')
if k != int(k):
raise TypeError('number of bytes should be an integer')
return self.get_bytes(k)
def getrandbits(self, k):
"""getrandbits(k) -> x. Generates a long int with k random bits."""
if k <= 0:
raise ValueError('number of bits must be greater than zero')
if k != int(k):
raise TypeError('number of bits should be an integer')
return self.get_bits(k)
def _stub(self, *args, **kwds):
"Stub method. Not used for a system random number generator."
return None
seed = jumpahead = _stub
def _notimplemented(self, *args, **kwds):
"Method should not be called for a system random number generator."
raise NotImplementedError('System entropy source does not have state.')
getstate = setstate = _notimplemented
if HAS_RAND == 1:
class RdRandom(BaseRandom):
get_bits = rdrand_get_bits
get_bytes = rdrand_get_bytes
if HAS_SEED == 1:
class RdSeedom(BaseRandom):
get_bits = rdseed_get_bits
get_bytes = rdseed_get_bytes