=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_OpenSSL(void);

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

Deprecated:

 #if OPENSSL_API_COMPAT < 0x10100000L
 void RAND_cleanup(void)
 #endif

=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 recommended
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)>. Its state can be saved in a seed file
(see L<RAND_load_file(3)>) to avoid having to go through the
seeding process whenever the application is started.

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

=head1 SEE ALSO

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

=head1 COPYRIGHT

Copyright 2000-2016 The OpenSSL Project Authors. All Rights Reserved.

Licensed under the OpenSSL license (the "License").  You may not use
this file except in compliance with the License.  You can obtain a copy
in the file LICENSE in the source distribution or at
L<https://www.openssl.org/source/license.html>.

=cut
