=pod

=head1 NAME

rand - pseudo-random number generator

=head1 SYNOPSIS

 #include <openssl/rand.h>

 int  RAND_set_rand_engine(ENGINE *engine);

 int  RAND_bytes(unsigned char *buf, int num);
 int  RAND_pseudo_bytes(unsigned char *buf, int num);

 void RAND_seed(const void *buf, int num);
 void RAND_add(const void *buf, int num, int entropy);
 int  RAND_status(void);

 int  RAND_load_file(const char *file, long max_bytes);
 int  RAND_write_file(const char *file);
 const char *RAND_file_name(char *file, size_t num);

 int  RAND_egd(const char *path);

 void RAND_set_rand_method(const RAND_METHOD *meth);
 const RAND_METHOD *RAND_get_rand_method(void);
 RAND_METHOD *RAND_SSLeay(void);

 void RAND_cleanup(void);

 /* For Win32 only */
 void RAND_screen(void);
 int RAND_event(UINT, WPARAM, LPARAM);

=head1 DESCRIPTION

Since the introduction of the ENGINE API, the recommended way of controlling
default implementations is by using the ENGINE API functions. The default
B<RAND_METHOD>, as set by RAND_set_rand_method() and returned by
RAND_get_rand_method(), is only used if no ENGINE has been set as the default
"rand" implementation. Hence, these two functions are no longer the recommened
way to control defaults.

If an alternative B<RAND_METHOD> implementation is being used (either set
directly or as provided by an ENGINE module), then it is entirely responsible
for the generation and management of a cryptographically secure PRNG stream. The
mechanisms described below relate solely to the software PRNG implementation
built in to OpenSSL and used by default.

These functions implement a cryptographically secure pseudo-random
number generator (PRNG). It is used by other library functions for
example to generate random keys, and applications can use it when they
need randomness.

A cryptographic PRNG must be seeded with unpredictable data such as
mouse movements or keys pressed at random by the user. This is
described in L<RAND_add(3)|RAND_add(3)>. Its state can be saved in a seed file
(see L<RAND_load_file(3)|RAND_load_file(3)>) to avoid having to go through the
seeding process whenever the application is started.

L<RAND_bytes(3)|RAND_bytes(3)> describes how to obtain random data from the
PRNG. 

=head1 INTERNALS

The RAND_SSLeay() method implements a PRNG based on a cryptographic
hash function.

The following description of its design is based on the SSLeay
documentation:

First up I will state the things I believe I need for a good RNG.

=over 4

=item C<1>

A good hashing algorithm to mix things up and to convert the RNG 'state'
to random numbers.

=item C<2>

An initial source of random 'state'.

=item C<3>

The state should be very large.  If the RNG is being used to generate
4096 bit RSA keys, 2 2048 bit random strings are required (at a minimum).
If your RNG state only has 128 bits, you are obviously limiting the
search space to 128 bits, not 2048.  I'm probably getting a little
carried away on this last point but it does indicate that it may not be
a bad idea to keep quite a lot of RNG state.  It should be easier to
break a cipher than guess the RNG seed data.

=item C<4>

Any RNG seed data should influence all subsequent random numbers
generated.  This implies that any random seed data entered will have
an influence on all subsequent random numbers generated.

=item C<5>

When using data to seed the RNG state, the data used should not be
extractable from the RNG state.  I believe this should be a
requirement because one possible source of 'secret' semi random
data would be a private key or a password.  This data must
not be disclosed by either subsequent random numbers or a
'core' dump left by a program crash.

=item C<6>

Given the same initial 'state', 2 systems should deviate in their RNG state
(and hence the random numbers generated) over time if at all possible.

=item C<7>

Given the random number output stream, it should not be possible to determine
the RNG state or the next random number.

=back

The algorithm is as follows.

There is global state made up of a 1023 byte buffer (the 'state'), a
working hash value ('md'), and a counter ('count').

Whenever seed data is added, it is inserted into the 'state' as
follows.

The input is chopped up into units of 20 bytes (or less for
the last block).  Each of these blocks is run through the hash
function as follows:  The data passed to the hash function
is the current 'md', the same number of bytes from the 'state'
(the location determined by in incremented looping index) as
the current 'block', the new key data 'block', and 'count'
(which is incremented after each use).
The result of this is kept in 'md' and also xored into the
'state' at the same locations that were used as input into the
hash function. I
believe this system addresses points 1 (hash function; currently
SHA-1), 3 (the 'state'), 4 (via the 'md'), 5 (by the use of a hash
function and xor).

When bytes are extracted from the RNG, the following process is used.
For each group of 10 bytes (or less), we do the following:

Input into the hash function the local 'md' (which is initialized from
the global 'md' before any bytes are generated), the bytes that are to
be overwritten by the random bytes, and bytes from the 'state'
(incrementing looping index). From this digest output (which is kept
in 'md'), the top (up to) 10 bytes are returned to the caller and the
bottom 10 bytes are xored into the 'state'.

Finally, after we have finished 'num' random bytes for the caller,
'count' (which is incremented) and the local and global 'md' are fed
into the hash function and the results are kept in the global 'md'.

I believe the above addressed points 1 (use of SHA-1), 6 (by hashing
into the 'state' the 'old' data from the caller that is about to be
overwritten) and 7 (by not using the 10 bytes given to the caller to
update the 'state', but they are used to update 'md').

So of the points raised, only 2 is not addressed (but see
L<RAND_add(3)|RAND_add(3)>).

=head1 SEE ALSO

L<BN_rand(3)|BN_rand(3)>, L<RAND_add(3)|RAND_add(3)>,
L<RAND_load_file(3)|RAND_load_file(3)>, L<RAND_egd(3)|RAND_egd(3)>,
L<RAND_bytes(3)|RAND_bytes(3)>,
L<RAND_set_rand_method(3)|RAND_set_rand_method(3)>,
L<RAND_cleanup(3)|RAND_cleanup(3)> 

=cut
