-
Notifications
You must be signed in to change notification settings - Fork 421
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
restore a subset of the rand module (#708)
* restore a subset of the rand module * flake * remove cleanup, go ahead and assume status will always be 1 * lighten and add power
- Loading branch information
1 parent
4aa52c3
commit acbd662
Showing
3 changed files
with
81 additions
and
0 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,40 @@ | ||
""" | ||
PRNG management routines, thin wrappers. | ||
""" | ||
|
||
from OpenSSL._util import lib as _lib | ||
|
||
|
||
def add(buffer, entropy): | ||
""" | ||
Mix bytes from *string* into the PRNG state. | ||
The *entropy* argument is (the lower bound of) an estimate of how much | ||
randomness is contained in *string*, measured in bytes. | ||
For more information, see e.g. :rfc:`1750`. | ||
This function is only relevant if you are forking Python processes and | ||
need to reseed the CSPRNG after fork. | ||
:param buffer: Buffer with random data. | ||
:param entropy: The entropy (in bytes) measurement of the buffer. | ||
:return: :obj:`None` | ||
""" | ||
if not isinstance(buffer, bytes): | ||
raise TypeError("buffer must be a byte string") | ||
|
||
if not isinstance(entropy, int): | ||
raise TypeError("entropy must be an integer") | ||
|
||
_lib.RAND_add(buffer, len(buffer), entropy) | ||
|
||
|
||
def status(): | ||
""" | ||
Check whether the PRNG has been seeded with enough data. | ||
:return: 1 if the PRNG is seeded enough, 0 otherwise. | ||
""" | ||
return _lib.RAND_status() |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,38 @@ | ||
# Copyright (c) Frederick Dean | ||
# See LICENSE for details. | ||
|
||
""" | ||
Unit tests for `OpenSSL.rand`. | ||
""" | ||
|
||
import pytest | ||
|
||
from OpenSSL import rand | ||
|
||
|
||
class TestRand(object): | ||
|
||
@pytest.mark.parametrize('args', [ | ||
(b"foo", None), | ||
(None, 3), | ||
]) | ||
def test_add_wrong_args(self, args): | ||
""" | ||
`OpenSSL.rand.add` raises `TypeError` if called with arguments not of | ||
type `str` and `int`. | ||
""" | ||
with pytest.raises(TypeError): | ||
rand.add(*args) | ||
|
||
def test_add(self): | ||
""" | ||
`OpenSSL.rand.add` adds entropy to the PRNG. | ||
""" | ||
rand.add(b'hamburger', 3) | ||
|
||
def test_status(self): | ||
""" | ||
`OpenSSL.rand.status` returns `1` if the PRNG has sufficient entropy, | ||
`0` otherwise. | ||
""" | ||
assert rand.status() == 1 |