changed test to itest because we're opening files (well, devices ...) using /dev/urandom if available else stdlib random, testing failure scenarios
This commit is contained in:
parent
a7a732e1f9
commit
e0d5e608f9
@ -23,6 +23,17 @@ class TestOneTimePad(unittest.TestCase):
|
|||||||
'{1}, actual={2}'.format(self._padsize,
|
'{1}, actual={2}'.format(self._padsize,
|
||||||
width, actual))
|
width, actual))
|
||||||
|
|
||||||
|
def test_get_randint_on_nonexistent_randomness_file_fails_ioerror(self):
|
||||||
|
OT._DEV_RANDOM['fp'] = None
|
||||||
|
self.assertRaises(IOError, OT._get_randint,
|
||||||
|
randomness_file='/foo/bar/busted/borken',
|
||||||
|
fallback_to_fake=False)
|
||||||
|
|
||||||
|
def test_get_randint_on_nonexistent_randomness_file_uses_fake(self):
|
||||||
|
OT._DEV_RANDOM['fp'] = None
|
||||||
|
random_int = OT._get_randint(randomness_file='/broke/as/joke')
|
||||||
|
self.assertTrue(random_int in range(0, 255))
|
||||||
|
|
||||||
def test_is_padline(self):
|
def test_is_padline(self):
|
||||||
for lineno in PADLINES:
|
for lineno in PADLINES:
|
||||||
self.assertTrue(OT._is_padline(lineno),
|
self.assertTrue(OT._is_padline(lineno),
|
@ -1,4 +1,3 @@
|
|||||||
import random
|
|
||||||
from itertools import izip
|
from itertools import izip
|
||||||
|
|
||||||
PAD_MODULO = 3
|
PAD_MODULO = 3
|
||||||
@ -46,7 +45,7 @@ def create_pad_lines(length, width=DEFAULT_PAD_WIDTH):
|
|||||||
def _create_chars_for_pad(length):
|
def _create_chars_for_pad(length):
|
||||||
chars = []
|
chars = []
|
||||||
for char in range(length):
|
for char in range(length):
|
||||||
chars.append(_AS_ALPHA[random.randint(CIPHER_FLOOR, CIPHER_CEIL)])
|
chars.append(_AS_ALPHA[_get_randint()])
|
||||||
return ''.join(chars)
|
return ''.join(chars)
|
||||||
|
|
||||||
|
|
||||||
@ -155,6 +154,34 @@ def _is_cipherline(lineno):
|
|||||||
return not lineno % PAD_MODULO
|
return not lineno % PAD_MODULO
|
||||||
|
|
||||||
|
|
||||||
|
def _get_randint(randomness_file='/dev/urandom', fallback_to_fake=True):
|
||||||
|
if not _DEV_RANDOM.get('fp'):
|
||||||
|
_get_urandom_fp(randomness_file=randomness_file,
|
||||||
|
fallback_to_fake=fallback_to_fake)
|
||||||
|
ret = ord(_DEV_RANDOM['fp'].read(1)) % CIPHER_CEIL
|
||||||
|
return ret if ret != 0 else _get_randint()
|
||||||
|
|
||||||
|
|
||||||
|
class _FakeDevUrandom(object):
|
||||||
|
|
||||||
|
def read(self, nchars):
|
||||||
|
import random
|
||||||
|
return ''.join([chr(random.randint(0, 255)) for i in range(0, nchars)])
|
||||||
|
|
||||||
|
|
||||||
|
def _get_urandom_fp(randomness_file='/dev/urandom', fallback_to_fake=True):
|
||||||
|
try:
|
||||||
|
_DEV_RANDOM['fp'] = open(randomness_file)
|
||||||
|
except (OSError, IOError):
|
||||||
|
if fallback_to_fake:
|
||||||
|
_DEV_RANDOM['fp'] = _FakeDevUrandom()
|
||||||
|
else:
|
||||||
|
raise
|
||||||
|
|
||||||
|
|
||||||
|
_DEV_RANDOM = {}
|
||||||
|
|
||||||
|
|
||||||
def _mk_as_alpha_as_nums():
|
def _mk_as_alpha_as_nums():
|
||||||
as_alpha = {}
|
as_alpha = {}
|
||||||
as_nums = {}
|
as_nums = {}
|
||||||
|
Loading…
Reference in New Issue
Block a user