/* Copyright (c) 2014, Google Inc. 
 | 
 * 
 | 
 * Permission to use, copy, modify, and/or distribute this software for any 
 | 
 * purpose with or without fee is hereby granted, provided that the above 
 | 
 * copyright notice and this permission notice appear in all copies. 
 | 
 * 
 | 
 * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES 
 | 
 * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF 
 | 
 * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY 
 | 
 * SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES 
 | 
 * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION 
 | 
 * OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN 
 | 
 * CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */ 
 | 
  
 | 
#ifndef OPENSSL_HEADER_RAND_H 
 | 
#define OPENSSL_HEADER_RAND_H 
 | 
  
 | 
#include <openssl/base.h> 
 | 
  
 | 
#if defined(__cplusplus) 
 | 
extern "C" { 
 | 
#endif 
 | 
  
 | 
  
 | 
// Random number generation. 
 | 
  
 | 
  
 | 
// RAND_bytes writes |len| bytes of random data to |buf| and returns one. 
 | 
OPENSSL_EXPORT int RAND_bytes(uint8_t *buf, size_t len); 
 | 
  
 | 
// RAND_cleanup frees any resources used by the RNG. This is not safe if other 
 | 
// threads might still be calling |RAND_bytes|. 
 | 
OPENSSL_EXPORT void RAND_cleanup(void); 
 | 
  
 | 
  
 | 
// Obscure functions. 
 | 
  
 | 
#if !defined(OPENSSL_WINDOWS) 
 | 
// RAND_set_urandom_fd causes the module to use a copy of |fd| for system 
 | 
// randomness rather opening /dev/urandom internally. The caller retains 
 | 
// ownership of |fd| and is at liberty to close it at any time. This is useful 
 | 
// if, due to a sandbox, /dev/urandom isn't available. If used, it must be 
 | 
// called before the first call to |RAND_bytes|, and it is mutually exclusive 
 | 
// with |RAND_enable_fork_unsafe_buffering|. 
 | 
// 
 | 
// |RAND_set_urandom_fd| does not buffer any entropy, so it is safe to call 
 | 
// |fork| at any time after calling |RAND_set_urandom_fd|. 
 | 
OPENSSL_EXPORT void RAND_set_urandom_fd(int fd); 
 | 
  
 | 
// RAND_enable_fork_unsafe_buffering enables efficient buffered reading of 
 | 
// /dev/urandom. It adds an overhead of a few KB of memory per thread. It must 
 | 
// be called before the first call to |RAND_bytes| and it is mutually exclusive 
 | 
// with calls to |RAND_set_urandom_fd|. 
 | 
// 
 | 
// If |fd| is non-negative then a copy of |fd| will be used rather than opening 
 | 
// /dev/urandom internally. Like |RAND_set_urandom_fd|, the caller retains 
 | 
// ownership of |fd|. If |fd| is negative then /dev/urandom will be opened and 
 | 
// any error from open(2) crashes the address space. 
 | 
// 
 | 
// It has an unusual name because the buffer is unsafe across calls to |fork|. 
 | 
// Hence, this function should never be called by libraries. 
 | 
OPENSSL_EXPORT void RAND_enable_fork_unsafe_buffering(int fd); 
 | 
#endif 
 | 
  
 | 
#if defined(BORINGSSL_UNSAFE_DETERMINISTIC_MODE) 
 | 
// RAND_reset_for_fuzzing resets the fuzzer-only deterministic RNG. This 
 | 
// function is only defined in the fuzzer-only build configuration. 
 | 
OPENSSL_EXPORT void RAND_reset_for_fuzzing(void); 
 | 
#endif 
 | 
  
 | 
  
 | 
// Deprecated functions 
 | 
  
 | 
// RAND_pseudo_bytes is a wrapper around |RAND_bytes|. 
 | 
OPENSSL_EXPORT int RAND_pseudo_bytes(uint8_t *buf, size_t len); 
 | 
  
 | 
// RAND_seed reads a single byte of random data to ensure that any file 
 | 
// descriptors etc are opened. 
 | 
OPENSSL_EXPORT void RAND_seed(const void *buf, int num); 
 | 
  
 | 
// RAND_load_file returns a nonnegative number. 
 | 
OPENSSL_EXPORT int RAND_load_file(const char *path, long num); 
 | 
  
 | 
// RAND_file_name returns NULL. 
 | 
OPENSSL_EXPORT const char *RAND_file_name(char *buf, size_t num); 
 | 
  
 | 
// RAND_add does nothing. 
 | 
OPENSSL_EXPORT void RAND_add(const void *buf, int num, double entropy); 
 | 
  
 | 
// RAND_egd returns 255. 
 | 
OPENSSL_EXPORT int RAND_egd(const char *); 
 | 
  
 | 
// RAND_poll returns one. 
 | 
OPENSSL_EXPORT int RAND_poll(void); 
 | 
  
 | 
// RAND_status returns one. 
 | 
OPENSSL_EXPORT int RAND_status(void); 
 | 
  
 | 
// rand_meth_st is typedefed to |RAND_METHOD| in base.h. It isn't used; it 
 | 
// exists only to be the return type of |RAND_SSLeay|. It's 
 | 
// external so that variables of this type can be initialized. 
 | 
struct rand_meth_st { 
 | 
  void (*seed) (const void *buf, int num); 
 | 
  int (*bytes) (uint8_t *buf, size_t num); 
 | 
  void (*cleanup) (void); 
 | 
  void (*add) (const void *buf, int num, double entropy); 
 | 
  int (*pseudorand) (uint8_t *buf, size_t num); 
 | 
  int (*status) (void); 
 | 
}; 
 | 
  
 | 
// RAND_SSLeay returns a pointer to a dummy |RAND_METHOD|. 
 | 
OPENSSL_EXPORT RAND_METHOD *RAND_SSLeay(void); 
 | 
  
 | 
// RAND_get_rand_method returns |RAND_SSLeay()|. 
 | 
OPENSSL_EXPORT const RAND_METHOD *RAND_get_rand_method(void); 
 | 
  
 | 
// RAND_set_rand_method does nothing. 
 | 
OPENSSL_EXPORT void RAND_set_rand_method(const RAND_METHOD *); 
 | 
  
 | 
  
 | 
#if defined(__cplusplus) 
 | 
}  // extern C 
 | 
#endif 
 | 
  
 | 
#endif  // OPENSSL_HEADER_RAND_H 
 |