mirror of
https://github.com/python/cpython.git
synced 2025-08-04 08:59:19 +00:00
Issue #18747: Re-seed OpenSSL's pseudo-random number generator after fork.
A pthread_atfork() child handler is used to seeded the PRNG with pid, time and some stack data.
This commit is contained in:
parent
b1973c252c
commit
f77b4b20e9
6 changed files with 123 additions and 0 deletions
|
@ -130,6 +130,38 @@ class BasicSocketTests(unittest.TestCase):
|
|||
self.assertRaises(TypeError, ssl.RAND_egd, 'foo', 1)
|
||||
ssl.RAND_add("this is a random string", 75.0)
|
||||
|
||||
@unittest.skipUnless(os.name == 'posix', 'requires posix')
|
||||
def test_random_fork(self):
|
||||
status = ssl.RAND_status()
|
||||
if not status:
|
||||
self.fail("OpenSSL's PRNG has insufficient randomness")
|
||||
|
||||
rfd, wfd = os.pipe()
|
||||
pid = os.fork()
|
||||
if pid == 0:
|
||||
try:
|
||||
os.close(rfd)
|
||||
child_random = ssl.RAND_pseudo_bytes(16)[0]
|
||||
self.assertEqual(len(child_random), 16)
|
||||
os.write(wfd, child_random)
|
||||
os.close(wfd)
|
||||
except BaseException:
|
||||
os._exit(1)
|
||||
else:
|
||||
os._exit(0)
|
||||
else:
|
||||
os.close(wfd)
|
||||
self.addCleanup(os.close, rfd)
|
||||
_, status = os.waitpid(pid, 0)
|
||||
self.assertEqual(status, 0)
|
||||
|
||||
child_random = os.read(rfd, 16)
|
||||
self.assertEqual(len(child_random), 16)
|
||||
parent_random = ssl.RAND_pseudo_bytes(16)[0]
|
||||
self.assertEqual(len(parent_random), 16)
|
||||
|
||||
self.assertNotEqual(child_random, parent_random)
|
||||
|
||||
def test_parse_cert(self):
|
||||
# note that this uses an 'unofficial' function in _ssl.c,
|
||||
# provided solely for this test, to exercise the certificate
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue