blob: 09056d7ea36013e96eba45cebbff8f599ba62e1b [file] [log] [blame]
Rick Dean433dc642009-07-07 13:11:55 -05001# Copyright (C) Frederick Dean 2009, All rights reserved
2
3"""
4Unit tests for L{OpenSSL.rand}.
5"""
6
7from unittest import main
8import os
9import stat
10
11from OpenSSL.test.util import TestCase
12from OpenSSL import rand
13
Jean-Paul Calderonebc2bb812009-07-16 13:31:20 -040014
Rick Dean433dc642009-07-07 13:11:55 -050015class RandTests(TestCase):
16 def test_bytes(self):
17 """
18 Verify that we can obtain bytes from rand_bytes() and
19 that they are different each time. Test the parameter
20 of rand_bytes() for bad values.
21 """
22 b1 = rand.bytes(50)
23 self.assertEqual(len(b1), 50)
24 b2 = rand.bytes(num_bytes=50) # parameter by name
25 self.assertNotEqual(b1, b2) # Hip, Hip, Horay! FIPS complaince
26 b3 = rand.bytes(num_bytes=0)
27 self.assertEqual(len(b3), 0)
Jean-Paul Calderonebc2bb812009-07-16 13:31:20 -040028 exc = self.assertRaises(ValueError, rand.bytes, -1)
29 self.assertEqual(exc.message, "num_bytes must not be negative")
Rick Dean433dc642009-07-07 13:11:55 -050030
31
32 def test_add(self):
33 """
Jean-Paul Calderonebc2bb812009-07-16 13:31:20 -040034 L{OpenSSL.rand.add} adds entropy to the PRNG.
Rick Dean433dc642009-07-07 13:11:55 -050035 """
36 rand.add('hamburger', 3)
Jean-Paul Calderonebc2bb812009-07-16 13:31:20 -040037
38
39 def test_seed(self):
40 """
41 L{OpenSSL.rand.seed} adds entropy to the PRNG.
42 """
Rick Dean433dc642009-07-07 13:11:55 -050043 rand.seed('milk shake')
Jean-Paul Calderonebc2bb812009-07-16 13:31:20 -040044
45
46 def test_status(self):
47 """
48 L{OpenSSL.rand.status} returns C{True} if the PRNG has sufficient
49 entropy, C{False} otherwise.
50 """
51 # It's hard to know what it is actually going to return. Different
52 # OpenSSL random engines decide differently whether they have enough
53 # entropy or not.
54 self.assertTrue(rand.status() in (1, 2))
Rick Dean433dc642009-07-07 13:11:55 -050055
56
57 def test_files(self):
58 """
59 Test reading and writing of files via rand functions.
60 """
61 # Write random bytes to a file
62 tmpfile = self.mktemp()
Jean-Paul Calderoneb534ff42009-07-16 13:44:56 -040063 # Make sure it exists (so cleanup definitely succeeds)
64 fObj = file(tmpfile, 'w')
65 fObj.close()
66 try:
67 rand.write_file(tmpfile)
68 # Verify length of written file
69 size = os.stat(tmpfile)[stat.ST_SIZE]
70 self.assertEquals(size, 1024)
71 # Read random bytes from file
72 rand.load_file(tmpfile)
73 rand.load_file(tmpfile, 4) # specify a length
74 finally:
75 # Cleanup
76 os.unlink(tmpfile)
Rick Dean433dc642009-07-07 13:11:55 -050077
78
79if __name__ == '__main__':
80 main()