=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(RAND_METHOD *meth);

 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.  Initially, the
default is to use the OpenSSL internal implementation. RAND_SSLeay()
returns a pointer to that method.

RAND_set_rand_method() sets the RAND method to B<meth>.
RAND_get_rand_method() returns a pointer to the current method.

=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 SEE ALSO

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

=head1 HISTORY

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

=cut
