X-Git-Url: http://ftp.carnet.hr/carnet-debian/scm?a=blobdiff_plain;ds=sidebyside;f=src%2Fshared%2Frandombytes.c;fp=src%2Fshared%2Frandombytes.c;h=2a72138cf07099c82744de9a6203d978f4d59b37;hb=3f728675941dc69d4e544d3a880a56240a6e394a;hp=0000000000000000000000000000000000000000;hpb=927951d1c1ad45ba9e7325f07d996154a91c911b;p=ossec-hids.git diff --git a/src/shared/randombytes.c b/src/shared/randombytes.c new file mode 100644 index 0000000..2a72138 --- /dev/null +++ b/src/shared/randombytes.c @@ -0,0 +1,56 @@ +#ifndef WIN32 +#include +#include +#endif + +#include +#include + +#include "shared.h" + + +void randombytes(void *ptr, size_t length) +{ + char failed = 0; + +#ifdef WIN32 + static HCRYPTPROV prov = 0; + if (prov == 0) { + if (!CryptAcquireContext(&prov, NULL, NULL, PROV_RSA_FULL, 0)) { + failed = 1; + } + } + if (!failed && !CryptGenRandom(prov, length, ptr)) { + failed = 1; + } +#else + static int fh = -1; + + if (fh >= 0 || (fh = open("/dev/urandom", O_RDONLY)) >= 0 || (fh = open("/dev/random", O_RDONLY)) >= 0) { + const ssize_t ret = read(fh, ptr, length); + if (ret < 0 || (size_t) ret != length) { + failed = 1; + } + } else { + failed = 1; + } +#endif + + if (failed) { + ErrorExit("%s: ERROR: randombytes failed for all possible methods for accessing random data", __local_name); + } +} + +void srandom_init(void) +{ +#ifndef WIN32 +#ifdef __OpenBSD__ + srandomdev(); +#else + unsigned int seed; + randombytes(&seed, sizeof seed); + srandom(seed); +#endif /* !__OpenBSD__ */ +#endif /* !WIN32 */ +} +