22 23 int RAND_egd(const char *path); 24 25 void RAND_set_rand_method(RAND_METHOD *meth); 26 RAND_METHOD *RAND_get_rand_method(void); 27 RAND_METHOD *RAND_SSLeay(void); 28 29 void RAND_cleanup(void); 30 31=head1 DESCRIPTION 32 33These functions implement a cryptographically secure pseudo-random 34number generator (PRNG). It is used by other library functions for 35example to generate random keys, and applications can use it when they 36need randomness. 37 38A cryptographic PRNG must be seeded with unpredictable data such as 39mouse movements or keys pressed at random by the user. This is 40described in L<RAND_add(3)|RAND_add(3)>. Its state can be saved in a seed file 41(see L<RAND_load_file(3)|RAND_load_file(3)>) to avoid having to go through the 42seeding process whenever the application is started. 43 44L<RAND_bytes(3)|RAND_bytes(3)> describes how to obtain random data from the 45PRNG. 46 47=head1 INTERNALS 48 49The RAND_SSLeay() method implements a PRNG based on a cryptographic 50hash function. 51 52The following description of its design is based on the SSLeay 53documentation: 54 55First up I will state the things I believe I need for a good RNG. 56 57=over 4 58 59=item 1 60 61A good hashing algorithm to mix things up and to convert the RNG 'state' 62to random numbers. 63 64=item 2 65 66An initial source of random 'state'. 67 68=item 3 69 70The state should be very large. If the RNG is being used to generate 714096 bit RSA keys, 2 2048 bit random strings are required (at a minimum). 72If your RNG state only has 128 bits, you are obviously limiting the 73search space to 128 bits, not 2048. I'm probably getting a little 74carried away on this last point but it does indicate that it may not be 75a bad idea to keep quite a lot of RNG state. It should be easier to 76break a cipher than guess the RNG seed data. 77 78=item 4 79 80Any RNG seed data should influence all subsequent random numbers 81generated. This implies that any random seed data entered will have 82an influence on all subsequent random numbers generated. 83 84=item 5 85 86When using data to seed the RNG state, the data used should not be 87extractable from the RNG state. I believe this should be a 88requirement because one possible source of 'secret' semi random 89data would be a private key or a password. This data must 90not be disclosed by either subsequent random numbers or a 91'core' dump left by a program crash. 92 93=item 6 94 95Given the same initial 'state', 2 systems should deviate in their RNG state 96(and hence the random numbers generated) over time if at all possible. 97 98=item 7 99 100Given the random number output stream, it should not be possible to determine 101the RNG state or the next random number. 102 103=back 104 105The algorithm is as follows. 106 107There is global state made up of a 1023 byte buffer (the 'state'), a 108working hash value ('md'), and a counter ('count'). 109 110Whenever seed data is added, it is inserted into the 'state' as 111follows. 112 113The input is chopped up into units of 20 bytes (or less for 114the last block). Each of these blocks is run through the hash 115function as follows: The data passed to the hash function 116is the current 'md', the same number of bytes from the 'state' 117(the location determined by in incremented looping index) as 118the current 'block', the new key data 'block', and 'count' 119(which is incremented after each use). 120The result of this is kept in 'md' and also xored into the 121'state' at the same locations that were used as input into the 122hash function. I 123believe this system addresses points 1 (hash function; currently 124SHA-1), 3 (the 'state'), 4 (via the 'md'), 5 (by the use of a hash 125function and xor). 126 127When bytes are extracted from the RNG, the following process is used. 128For each group of 10 bytes (or less), we do the following: 129 130Input into the hash function the top 10 bytes from the local 'md' 131(which is initialized from the global 'md' before any bytes are 132generated), the bytes that are to be overwritten by the random bytes, 133and bytes from the 'state' (incrementing looping index). From this 134digest output (which is kept in 'md'), the top (up to) 10 bytes are 135returned to the caller and the bottom (up to) 10 bytes are xored into 136the 'state'. 137 138Finally, after we have finished 'num' random bytes for the caller, 139'count' (which is incremented) and the local and global 'md' are fed 140into the hash function and the results are kept in the global 'md'. 141 142I believe the above addressed points 1 (use of SHA-1), 6 (by hashing 143into the 'state' the 'old' data from the caller that is about to be 144overwritten) and 7 (by not using the 10 bytes given to the caller to 145update the 'state', but they are used to update 'md'). 146 147So of the points raised, only 2 is not addressed (but see 148L<RAND_add(3)|RAND_add(3)>). 149 150=head1 SEE ALSO 151 152L<BN_rand(3)|BN_rand(3)>, L<RAND_add(3)|RAND_add(3)>, 153L<RAND_load_file(3)|RAND_load_file(3)>, L<RAND_egd(3)|RAND_egd(3)>, 154L<RAND_bytes(3)|RAND_bytes(3)>, 155L<RAND_set_rand_method(3)|RAND_set_rand_method(3)>, 156L<RAND_cleanup(3)|RAND_cleanup(3)> 157 158=cut
| 22 23 int RAND_egd(const char *path); 24 25 void RAND_set_rand_method(RAND_METHOD *meth); 26 RAND_METHOD *RAND_get_rand_method(void); 27 RAND_METHOD *RAND_SSLeay(void); 28 29 void RAND_cleanup(void); 30 31=head1 DESCRIPTION 32 33These functions implement a cryptographically secure pseudo-random 34number generator (PRNG). It is used by other library functions for 35example to generate random keys, and applications can use it when they 36need randomness. 37 38A cryptographic PRNG must be seeded with unpredictable data such as 39mouse movements or keys pressed at random by the user. This is 40described in L<RAND_add(3)|RAND_add(3)>. Its state can be saved in a seed file 41(see L<RAND_load_file(3)|RAND_load_file(3)>) to avoid having to go through the 42seeding process whenever the application is started. 43 44L<RAND_bytes(3)|RAND_bytes(3)> describes how to obtain random data from the 45PRNG. 46 47=head1 INTERNALS 48 49The RAND_SSLeay() method implements a PRNG based on a cryptographic 50hash function. 51 52The following description of its design is based on the SSLeay 53documentation: 54 55First up I will state the things I believe I need for a good RNG. 56 57=over 4 58 59=item 1 60 61A good hashing algorithm to mix things up and to convert the RNG 'state' 62to random numbers. 63 64=item 2 65 66An initial source of random 'state'. 67 68=item 3 69 70The state should be very large. If the RNG is being used to generate 714096 bit RSA keys, 2 2048 bit random strings are required (at a minimum). 72If your RNG state only has 128 bits, you are obviously limiting the 73search space to 128 bits, not 2048. I'm probably getting a little 74carried away on this last point but it does indicate that it may not be 75a bad idea to keep quite a lot of RNG state. It should be easier to 76break a cipher than guess the RNG seed data. 77 78=item 4 79 80Any RNG seed data should influence all subsequent random numbers 81generated. This implies that any random seed data entered will have 82an influence on all subsequent random numbers generated. 83 84=item 5 85 86When using data to seed the RNG state, the data used should not be 87extractable from the RNG state. I believe this should be a 88requirement because one possible source of 'secret' semi random 89data would be a private key or a password. This data must 90not be disclosed by either subsequent random numbers or a 91'core' dump left by a program crash. 92 93=item 6 94 95Given the same initial 'state', 2 systems should deviate in their RNG state 96(and hence the random numbers generated) over time if at all possible. 97 98=item 7 99 100Given the random number output stream, it should not be possible to determine 101the RNG state or the next random number. 102 103=back 104 105The algorithm is as follows. 106 107There is global state made up of a 1023 byte buffer (the 'state'), a 108working hash value ('md'), and a counter ('count'). 109 110Whenever seed data is added, it is inserted into the 'state' as 111follows. 112 113The input is chopped up into units of 20 bytes (or less for 114the last block). Each of these blocks is run through the hash 115function as follows: The data passed to the hash function 116is the current 'md', the same number of bytes from the 'state' 117(the location determined by in incremented looping index) as 118the current 'block', the new key data 'block', and 'count' 119(which is incremented after each use). 120The result of this is kept in 'md' and also xored into the 121'state' at the same locations that were used as input into the 122hash function. I 123believe this system addresses points 1 (hash function; currently 124SHA-1), 3 (the 'state'), 4 (via the 'md'), 5 (by the use of a hash 125function and xor). 126 127When bytes are extracted from the RNG, the following process is used. 128For each group of 10 bytes (or less), we do the following: 129 130Input into the hash function the top 10 bytes from the local 'md' 131(which is initialized from the global 'md' before any bytes are 132generated), the bytes that are to be overwritten by the random bytes, 133and bytes from the 'state' (incrementing looping index). From this 134digest output (which is kept in 'md'), the top (up to) 10 bytes are 135returned to the caller and the bottom (up to) 10 bytes are xored into 136the 'state'. 137 138Finally, after we have finished 'num' random bytes for the caller, 139'count' (which is incremented) and the local and global 'md' are fed 140into the hash function and the results are kept in the global 'md'. 141 142I believe the above addressed points 1 (use of SHA-1), 6 (by hashing 143into the 'state' the 'old' data from the caller that is about to be 144overwritten) and 7 (by not using the 10 bytes given to the caller to 145update the 'state', but they are used to update 'md'). 146 147So of the points raised, only 2 is not addressed (but see 148L<RAND_add(3)|RAND_add(3)>). 149 150=head1 SEE ALSO 151 152L<BN_rand(3)|BN_rand(3)>, L<RAND_add(3)|RAND_add(3)>, 153L<RAND_load_file(3)|RAND_load_file(3)>, L<RAND_egd(3)|RAND_egd(3)>, 154L<RAND_bytes(3)|RAND_bytes(3)>, 155L<RAND_set_rand_method(3)|RAND_set_rand_method(3)>, 156L<RAND_cleanup(3)|RAND_cleanup(3)> 157 158=cut
|