1d9e397b599b13d642138480a28c14db7a136bf0Adam Langley/* Copyright (c) 2014, Google Inc. 2d9e397b599b13d642138480a28c14db7a136bf0Adam Langley * 3d9e397b599b13d642138480a28c14db7a136bf0Adam Langley * Permission to use, copy, modify, and/or distribute this software for any 4d9e397b599b13d642138480a28c14db7a136bf0Adam Langley * purpose with or without fee is hereby granted, provided that the above 5d9e397b599b13d642138480a28c14db7a136bf0Adam Langley * copyright notice and this permission notice appear in all copies. 6d9e397b599b13d642138480a28c14db7a136bf0Adam Langley * 7d9e397b599b13d642138480a28c14db7a136bf0Adam Langley * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES 8d9e397b599b13d642138480a28c14db7a136bf0Adam Langley * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF 9d9e397b599b13d642138480a28c14db7a136bf0Adam Langley * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY 10d9e397b599b13d642138480a28c14db7a136bf0Adam Langley * SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES 11d9e397b599b13d642138480a28c14db7a136bf0Adam Langley * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION 12d9e397b599b13d642138480a28c14db7a136bf0Adam Langley * OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN 13d9e397b599b13d642138480a28c14db7a136bf0Adam Langley * CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */ 14d9e397b599b13d642138480a28c14db7a136bf0Adam Langley 15d9e397b599b13d642138480a28c14db7a136bf0Adam Langley#ifndef OPENSSL_HEADER_RAND_H 16d9e397b599b13d642138480a28c14db7a136bf0Adam Langley#define OPENSSL_HEADER_RAND_H 17d9e397b599b13d642138480a28c14db7a136bf0Adam Langley 18d9e397b599b13d642138480a28c14db7a136bf0Adam Langley#include <openssl/base.h> 19d9e397b599b13d642138480a28c14db7a136bf0Adam Langley 20d9e397b599b13d642138480a28c14db7a136bf0Adam Langley#if defined(__cplusplus) 21d9e397b599b13d642138480a28c14db7a136bf0Adam Langleyextern "C" { 22d9e397b599b13d642138480a28c14db7a136bf0Adam Langley#endif 23d9e397b599b13d642138480a28c14db7a136bf0Adam Langley 24d9e397b599b13d642138480a28c14db7a136bf0Adam Langley 25e9ada863a7b3e81f5d2b1e3bdd2305da902a87f5Adam Langley/* Random number generation. */ 26e9ada863a7b3e81f5d2b1e3bdd2305da902a87f5Adam Langley 27e9ada863a7b3e81f5d2b1e3bdd2305da902a87f5Adam Langley 28e9ada863a7b3e81f5d2b1e3bdd2305da902a87f5Adam Langley/* RAND_bytes writes |len| bytes of random data to |buf| and returns one. */ 29d9e397b599b13d642138480a28c14db7a136bf0Adam LangleyOPENSSL_EXPORT int RAND_bytes(uint8_t *buf, size_t len); 30d9e397b599b13d642138480a28c14db7a136bf0Adam Langley 31d9e397b599b13d642138480a28c14db7a136bf0Adam Langley/* RAND_cleanup frees any resources used by the RNG. This is not safe if other 32d9e397b599b13d642138480a28c14db7a136bf0Adam Langley * threads might still be calling |RAND_bytes|. */ 33d9e397b599b13d642138480a28c14db7a136bf0Adam LangleyOPENSSL_EXPORT void RAND_cleanup(void); 34d9e397b599b13d642138480a28c14db7a136bf0Adam Langley 35d9e397b599b13d642138480a28c14db7a136bf0Adam Langley 36b8494591d1b1a143f3b192d845c238bbf3bc629dKenny Root/* Obscure functions. */ 37b8494591d1b1a143f3b192d845c238bbf3bc629dKenny Root 38b8494591d1b1a143f3b192d845c238bbf3bc629dKenny Root#if !defined(OPENSSL_WINDOWS) 39b8494591d1b1a143f3b192d845c238bbf3bc629dKenny Root/* RAND_set_urandom_fd causes the module to use a copy of |fd| for system 40b8494591d1b1a143f3b192d845c238bbf3bc629dKenny Root * randomness rather opening /dev/urandom internally. The caller retains 41b8494591d1b1a143f3b192d845c238bbf3bc629dKenny Root * ownership of |fd| and is at liberty to close it at any time. This is useful 42b8494591d1b1a143f3b192d845c238bbf3bc629dKenny Root * if, due to a sandbox, /dev/urandom isn't available. If used, it must be 43b8494591d1b1a143f3b192d845c238bbf3bc629dKenny Root * called before the first call to |RAND_bytes|, and it is mutually exclusive 44b8494591d1b1a143f3b192d845c238bbf3bc629dKenny Root * with |RAND_enable_fork_unsafe_buffering|. 45b8494591d1b1a143f3b192d845c238bbf3bc629dKenny Root * 46b8494591d1b1a143f3b192d845c238bbf3bc629dKenny Root * |RAND_set_urandom_fd| does not buffer any entropy, so it is safe to call 47b8494591d1b1a143f3b192d845c238bbf3bc629dKenny Root * |fork| at any time after calling |RAND_set_urandom_fd|. */ 48b8494591d1b1a143f3b192d845c238bbf3bc629dKenny RootOPENSSL_EXPORT void RAND_set_urandom_fd(int fd); 49b8494591d1b1a143f3b192d845c238bbf3bc629dKenny Root 50b8494591d1b1a143f3b192d845c238bbf3bc629dKenny Root/* RAND_enable_fork_unsafe_buffering enables efficient buffered reading of 51b8494591d1b1a143f3b192d845c238bbf3bc629dKenny Root * /dev/urandom. It adds an overhead of a few KB of memory per thread. It must 52b8494591d1b1a143f3b192d845c238bbf3bc629dKenny Root * be called before the first call to |RAND_bytes| and it is mutually exclusive 53b8494591d1b1a143f3b192d845c238bbf3bc629dKenny Root * with calls to |RAND_set_urandom_fd|. 54b8494591d1b1a143f3b192d845c238bbf3bc629dKenny Root * 55b8494591d1b1a143f3b192d845c238bbf3bc629dKenny Root * If |fd| is non-negative then a copy of |fd| will be used rather than opening 56b8494591d1b1a143f3b192d845c238bbf3bc629dKenny Root * /dev/urandom internally. Like |RAND_set_urandom_fd|, the caller retains 57b8494591d1b1a143f3b192d845c238bbf3bc629dKenny Root * ownership of |fd|. If |fd| is negative then /dev/urandom will be opened and 58b8494591d1b1a143f3b192d845c238bbf3bc629dKenny Root * any error from open(2) crashes the address space. 59b8494591d1b1a143f3b192d845c238bbf3bc629dKenny Root * 60b8494591d1b1a143f3b192d845c238bbf3bc629dKenny Root * It has an unusual name because the buffer is unsafe across calls to |fork|. 61b8494591d1b1a143f3b192d845c238bbf3bc629dKenny Root * Hence, this function should never be called by libraries. */ 62b8494591d1b1a143f3b192d845c238bbf3bc629dKenny RootOPENSSL_EXPORT void RAND_enable_fork_unsafe_buffering(int fd); 63b8494591d1b1a143f3b192d845c238bbf3bc629dKenny Root#endif 64b8494591d1b1a143f3b192d845c238bbf3bc629dKenny Root 65909b19f027eb0af12513f4d5589efdd67e34bd91Steven Valdez#if defined(BORINGSSL_UNSAFE_DETERMINISTIC_MODE) 664969cc9b0ab2905ec478277f50ed3849b37a6c6bDavid Benjamin/* RAND_reset_for_fuzzing resets the fuzzer-only deterministic RNG. This 674969cc9b0ab2905ec478277f50ed3849b37a6c6bDavid Benjamin * function is only defined in the fuzzer-only build configuration. */ 684969cc9b0ab2905ec478277f50ed3849b37a6c6bDavid BenjaminOPENSSL_EXPORT void RAND_reset_for_fuzzing(void); 694969cc9b0ab2905ec478277f50ed3849b37a6c6bDavid Benjamin#endif 704969cc9b0ab2905ec478277f50ed3849b37a6c6bDavid Benjamin 71b8494591d1b1a143f3b192d845c238bbf3bc629dKenny Root 72d9e397b599b13d642138480a28c14db7a136bf0Adam Langley/* Deprecated functions */ 73d9e397b599b13d642138480a28c14db7a136bf0Adam Langley 74d9e397b599b13d642138480a28c14db7a136bf0Adam Langley/* RAND_pseudo_bytes is a wrapper around |RAND_bytes|. */ 75d9e397b599b13d642138480a28c14db7a136bf0Adam LangleyOPENSSL_EXPORT int RAND_pseudo_bytes(uint8_t *buf, size_t len); 76d9e397b599b13d642138480a28c14db7a136bf0Adam Langley 774139edb02e59e7ad48e0a8f4c02e45923bc8a344Adam Langley/* RAND_seed reads a single byte of random data to ensure that any file 784139edb02e59e7ad48e0a8f4c02e45923bc8a344Adam Langley * descriptors etc are opened. */ 79d9e397b599b13d642138480a28c14db7a136bf0Adam LangleyOPENSSL_EXPORT void RAND_seed(const void *buf, int num); 80d9e397b599b13d642138480a28c14db7a136bf0Adam Langley 81f4e427204234da139fd0585def4b4e22502e33f0Adam Langley/* RAND_load_file returns a nonnegative number. */ 82f4e427204234da139fd0585def4b4e22502e33f0Adam LangleyOPENSSL_EXPORT int RAND_load_file(const char *path, long num); 83f4e427204234da139fd0585def4b4e22502e33f0Adam Langley 844969cc9b0ab2905ec478277f50ed3849b37a6c6bDavid Benjamin/* RAND_file_name returns NULL. */ 854969cc9b0ab2905ec478277f50ed3849b37a6c6bDavid BenjaminOPENSSL_EXPORT const char *RAND_file_name(char *buf, size_t num); 864969cc9b0ab2905ec478277f50ed3849b37a6c6bDavid Benjamin 87d9e397b599b13d642138480a28c14db7a136bf0Adam Langley/* RAND_add does nothing. */ 88d9e397b599b13d642138480a28c14db7a136bf0Adam LangleyOPENSSL_EXPORT void RAND_add(const void *buf, int num, double entropy); 89d9e397b599b13d642138480a28c14db7a136bf0Adam Langley 90b8494591d1b1a143f3b192d845c238bbf3bc629dKenny Root/* RAND_egd returns 255. */ 91b8494591d1b1a143f3b192d845c238bbf3bc629dKenny RootOPENSSL_EXPORT int RAND_egd(const char *); 92b8494591d1b1a143f3b192d845c238bbf3bc629dKenny Root 93d9e397b599b13d642138480a28c14db7a136bf0Adam Langley/* RAND_poll returns one. */ 94d9e397b599b13d642138480a28c14db7a136bf0Adam LangleyOPENSSL_EXPORT int RAND_poll(void); 95d9e397b599b13d642138480a28c14db7a136bf0Adam Langley 96f7e890d94bfb2ecad87621eed301e1897b5a6aefAdam Langley/* RAND_status returns one. */ 97f7e890d94bfb2ecad87621eed301e1897b5a6aefAdam LangleyOPENSSL_EXPORT int RAND_status(void); 98f7e890d94bfb2ecad87621eed301e1897b5a6aefAdam Langley 99b8494591d1b1a143f3b192d845c238bbf3bc629dKenny Root/* rand_meth_st is typedefed to |RAND_METHOD| in base.h. It isn't used; it 100b8494591d1b1a143f3b192d845c238bbf3bc629dKenny Root * exists only to be the return type of |RAND_SSLeay|. It's 101b8494591d1b1a143f3b192d845c238bbf3bc629dKenny Root * external so that variables of this type can be initialized. */ 102b8494591d1b1a143f3b192d845c238bbf3bc629dKenny Rootstruct rand_meth_st { 103b8494591d1b1a143f3b192d845c238bbf3bc629dKenny Root void (*seed) (const void *buf, int num); 104b8494591d1b1a143f3b192d845c238bbf3bc629dKenny Root int (*bytes) (uint8_t *buf, size_t num); 105b8494591d1b1a143f3b192d845c238bbf3bc629dKenny Root void (*cleanup) (void); 106b8494591d1b1a143f3b192d845c238bbf3bc629dKenny Root void (*add) (const void *buf, int num, double entropy); 107b8494591d1b1a143f3b192d845c238bbf3bc629dKenny Root int (*pseudorand) (uint8_t *buf, size_t num); 108b8494591d1b1a143f3b192d845c238bbf3bc629dKenny Root int (*status) (void); 109b8494591d1b1a143f3b192d845c238bbf3bc629dKenny Root}; 110b8494591d1b1a143f3b192d845c238bbf3bc629dKenny Root 111b8494591d1b1a143f3b192d845c238bbf3bc629dKenny Root/* RAND_SSLeay returns a pointer to a dummy |RAND_METHOD|. */ 112b8494591d1b1a143f3b192d845c238bbf3bc629dKenny RootOPENSSL_EXPORT RAND_METHOD *RAND_SSLeay(void); 113b8494591d1b1a143f3b192d845c238bbf3bc629dKenny Root 114b8494591d1b1a143f3b192d845c238bbf3bc629dKenny Root/* RAND_set_rand_method does nothing. */ 115b8494591d1b1a143f3b192d845c238bbf3bc629dKenny RootOPENSSL_EXPORT void RAND_set_rand_method(const RAND_METHOD *); 116b8494591d1b1a143f3b192d845c238bbf3bc629dKenny Root 117d9e397b599b13d642138480a28c14db7a136bf0Adam Langley 118d9e397b599b13d642138480a28c14db7a136bf0Adam Langley#if defined(__cplusplus) 119d9e397b599b13d642138480a28c14db7a136bf0Adam Langley} /* extern C */ 120d9e397b599b13d642138480a28c14db7a136bf0Adam Langley#endif 121d9e397b599b13d642138480a28c14db7a136bf0Adam Langley 122d9e397b599b13d642138480a28c14db7a136bf0Adam Langley#endif /* OPENSSL_HEADER_RAND_H */ 123