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
|
#!/usr/bin/env python
"""Unit tests for M2Crypto.Rand.
Copyright (C) 2006 Open Source Applications Foundation (OSAF).
All Rights Reserved.
"""
import os
import ctypes
import warnings
from M2Crypto import Rand, m2
from tests import unittest
class RandTestCase(unittest.TestCase):
def test_bytes(self):
with self.assertRaises(MemoryError):
Rand.rand_bytes(-1)
self.assertEqual(Rand.rand_bytes(0), b'')
self.assertEqual(len(Rand.rand_bytes(1)), 1)
def test_pseudo_bytes(self):
with warnings.catch_warnings():
warnings.simplefilter('ignore', DeprecationWarning)
with self.assertRaises(MemoryError):
Rand.rand_pseudo_bytes(-1)
self.assertEqual(Rand.rand_pseudo_bytes(0), (b'', 1))
a, b = Rand.rand_pseudo_bytes(1)
self.assertEqual(len(a), 1)
self.assertEqual(b, 1)
def test_file_name(self):
if os.name == 'nt':
is_admin = ctypes.windll.shell32.IsUserAnAdmin() != 0
rand_env = ('RANDFILE', 'HOME', 'USERPROFILE', 'SYSTEMROOT')
else:
rand_env = ('RANDFILE', 'HOME')
is_admin = False
key = next((k for k in rand_env if os.environ.get(k)), None)
if is_admin and m2.OPENSSL_VERSION_NUMBER < 0x1010000F:
path = 'C:\\'
else:
path = os.path.join(os.environ[key])
self.assertIsNotNone(key, "Could not find required environment")
rand_file = os.path.abspath(os.path.join(path, '.rnd'))
self.assertEqual(os.path.abspath(Rand.rand_file_name()), rand_file)
def test_load_save(self):
try:
os.remove('tests/randpool.dat')
except OSError:
pass
self.assertIn(Rand.load_file('tests/randpool.dat', -1), [0, -1])
self.assertEqual(Rand.save_file('tests/randpool.dat'), 1024)
self.assertEqual(Rand.load_file('tests/randpool.dat', -1), 1024)
def test_seed_add(self):
self.assertIsNone(Rand.rand_seed(os.urandom(1024)))
# XXX Should there be limits on the entropy parameter?
self.assertIsNone(Rand.rand_add(os.urandom(2), 0.5))
Rand.rand_add(os.urandom(2), -0.5)
Rand.rand_add(os.urandom(2), 5000.0)
def test_rand_status(self):
# Although it is hard to believe we would ever get 0 (i.e., PRNG
# hasn't enough entropy), it is a legitimate value.
status = Rand.rand_status()
self.assertIn(status, [0, 1],
'Illegal value of RAND.rand_status {0}!'.format(status))
if status == 0:
warnings.warn('RAND_status reports insufficient seeding of PRNG!')
def suite():
suite = unittest.TestSuite()
suite.addTest(unittest.TestLoader().loadTestsFromTestCase(RandTestCase))
return suite
if __name__ == '__main__':
unittest.TextTestRunner().run(suite())
|