=pod

=head1 NAME

RAND_set_rand_method, RAND_get_rand_method, RAND_SSLeay - select RAND method

=head1 SYNOPSIS

 #include <openssl/rand.h>

 void RAND_set_rand_method(const RAND_METHOD *meth);

 const RAND_METHOD *RAND_get_rand_method(void);

 RAND_METHOD *RAND_SSLeay(void);

=head1 DESCRIPTION

A B<RAND_METHOD> specifies the functions that OpenSSL uses for random number
generation. By modifying the method, alternative implementations such as
hardware RNGs may be used. IMPORTANT: See the NOTES section for important
information about how these RAND API functions are affected by the use of
B<ENGINE> API calls.

Initially, the default RAND_METHOD is the OpenSSL internal implementation, as
returned by RAND_SSLeay().

RAND_set_default_method() makes B<meth> the method for PRNG use. B<NB>: This is
true only whilst no ENGINE has been set as a default for RAND, so this function
is no longer recommended.

RAND_get_default_method() returns a pointer to the current RAND_METHOD.
However, the meaningfulness of this result is dependent on whether the ENGINE
API is being used, so this function is no longer recommended.

=head1 THE RAND_METHOD STRUCTURE

 typedef struct rand_meth_st
 {
        void (*seed)(const void *buf, int num);
        int (*bytes)(unsigned char *buf, int num);
        void (*cleanup)(void);
        void (*add)(const void *buf, int num, int entropy);
        int (*pseudorand)(unsigned char *buf, int num);
	int (*status)(void);
 } RAND_METHOD;

The components point to the implementation of RAND_seed(),
RAND_bytes(), RAND_cleanup(), RAND_add(), RAND_pseudo_rand()
and RAND_status().
Each component may be NULL if the function is not implemented.

=head1 RETURN VALUES

RAND_set_rand_method() returns no value. RAND_get_rand_method() and
RAND_SSLeay() return pointers to the respective methods.

=head1 NOTES

As of version 0.9.7, RAND_METHOD implementations are grouped together with other
algorithmic APIs (eg. RSA_METHOD, EVP_CIPHER, etc) in B<ENGINE> modules. If a
default ENGINE is specified for RAND functionality using an ENGINE API function,
that will override any RAND defaults set using the RAND API (ie.
RAND_set_rand_method()). For this reason, the ENGINE API is the recommended way
to control default implementations for use in RAND and other cryptographic
algorithms.

=head1 SEE ALSO

L<rand(3)|rand(3)>, L<engine(3)|engine(3)>

=head1 HISTORY

RAND_set_rand_method(), RAND_get_rand_method() and RAND_SSLeay() are
available in all versions of OpenSSL.

In the engine version of version 0.9.6, RAND_set_rand_method() was altered to
take an ENGINE pointer as its argument. As of version 0.9.7, that has been
reverted as the ENGINE API transparently overrides RAND defaults if used,
otherwise RAND API functions work as before. RAND_set_rand_engine() was also
introduced in version 0.9.7.

=cut
