rand-posix.cpp revision bc06b76082e0a54a53fb1495d4f6b5dddfeffc30
5383c976362d5b18656cf7b9248b2063a764a203vboxsync/* $Id$ */
5383c976362d5b18656cf7b9248b2063a764a203vboxsync/** @file
5383c976362d5b18656cf7b9248b2063a764a203vboxsync * InnoTek Portable Runtime - Random Numbers and Byte Streams, POSIX.
5383c976362d5b18656cf7b9248b2063a764a203vboxsync */
5383c976362d5b18656cf7b9248b2063a764a203vboxsync
5383c976362d5b18656cf7b9248b2063a764a203vboxsync/*
5383c976362d5b18656cf7b9248b2063a764a203vboxsync * Copyright (C) 2006 InnoTek Systemberatung GmbH
5383c976362d5b18656cf7b9248b2063a764a203vboxsync *
5383c976362d5b18656cf7b9248b2063a764a203vboxsync * This file is part of VirtualBox Open Source Edition (OSE), as
5383c976362d5b18656cf7b9248b2063a764a203vboxsync * available from http://www.virtualbox.org. This file is free software;
5383c976362d5b18656cf7b9248b2063a764a203vboxsync * you can redistribute it and/or modify it under the terms of the GNU
5383c976362d5b18656cf7b9248b2063a764a203vboxsync * General Public License as published by the Free Software Foundation,
5383c976362d5b18656cf7b9248b2063a764a203vboxsync * in version 2 as it comes in the "COPYING" file of the VirtualBox OSE
5383c976362d5b18656cf7b9248b2063a764a203vboxsync * distribution. VirtualBox OSE is distributed in the hope that it will
5383c976362d5b18656cf7b9248b2063a764a203vboxsync * be useful, but WITHOUT ANY WARRANTY of any kind.
5383c976362d5b18656cf7b9248b2063a764a203vboxsync *
5383c976362d5b18656cf7b9248b2063a764a203vboxsync * If you received this file as part of a commercial VirtualBox
5383c976362d5b18656cf7b9248b2063a764a203vboxsync * distribution, then only the terms of your commercial VirtualBox
5383c976362d5b18656cf7b9248b2063a764a203vboxsync * license agreement apply instead of the previous paragraph.
5383c976362d5b18656cf7b9248b2063a764a203vboxsync */
5383c976362d5b18656cf7b9248b2063a764a203vboxsync
5383c976362d5b18656cf7b9248b2063a764a203vboxsync
5383c976362d5b18656cf7b9248b2063a764a203vboxsync/*******************************************************************************
5383c976362d5b18656cf7b9248b2063a764a203vboxsync* Header Files *
5383c976362d5b18656cf7b9248b2063a764a203vboxsync*******************************************************************************/
5383c976362d5b18656cf7b9248b2063a764a203vboxsync#include <errno.h>
5383c976362d5b18656cf7b9248b2063a764a203vboxsync#include <sys/stat.h>
5383c976362d5b18656cf7b9248b2063a764a203vboxsync#include <sys/types.h>
5383c976362d5b18656cf7b9248b2063a764a203vboxsync#include <sys/ioctl.h>
5383c976362d5b18656cf7b9248b2063a764a203vboxsync#include <sys/fcntl.h>
5383c976362d5b18656cf7b9248b2063a764a203vboxsync#include <fcntl.h>
5383c976362d5b18656cf7b9248b2063a764a203vboxsync#ifdef _MSC_VER
5383c976362d5b18656cf7b9248b2063a764a203vboxsync# include <io.h>
5383c976362d5b18656cf7b9248b2063a764a203vboxsync# include <stdio.h>
5383c976362d5b18656cf7b9248b2063a764a203vboxsync#else
d1966fe9681e9a100f8c895f08e450fc32dafd48vboxsync# include <unistd.h>
5383c976362d5b18656cf7b9248b2063a764a203vboxsync# include <sys/time.h>
5383c976362d5b18656cf7b9248b2063a764a203vboxsync#endif
5383c976362d5b18656cf7b9248b2063a764a203vboxsync
5383c976362d5b18656cf7b9248b2063a764a203vboxsync#include <iprt/rand.h>
d1966fe9681e9a100f8c895f08e450fc32dafd48vboxsync#include <iprt/err.h>
5383c976362d5b18656cf7b9248b2063a764a203vboxsync#include <iprt/assert.h>
5383c976362d5b18656cf7b9248b2063a764a203vboxsync#include "internal/rand.h"
d1966fe9681e9a100f8c895f08e450fc32dafd48vboxsync
5383c976362d5b18656cf7b9248b2063a764a203vboxsync
d1966fe9681e9a100f8c895f08e450fc32dafd48vboxsync/*******************************************************************************
5383c976362d5b18656cf7b9248b2063a764a203vboxsync* Global Variables *
d1966fe9681e9a100f8c895f08e450fc32dafd48vboxsync*******************************************************************************/
5383c976362d5b18656cf7b9248b2063a764a203vboxsync/** File handle of /dev/random. */
5383c976362d5b18656cf7b9248b2063a764a203vboxsyncstatic int g_fhDevRandom = -1;
5383c976362d5b18656cf7b9248b2063a764a203vboxsync
5383c976362d5b18656cf7b9248b2063a764a203vboxsync
5383c976362d5b18656cf7b9248b2063a764a203vboxsyncvoid rtRandLazyInitNative(void)
5383c976362d5b18656cf7b9248b2063a764a203vboxsync{
5383c976362d5b18656cf7b9248b2063a764a203vboxsync if (g_fhDevRandom != -1)
d1966fe9681e9a100f8c895f08e450fc32dafd48vboxsync return;
d1966fe9681e9a100f8c895f08e450fc32dafd48vboxsync
d1966fe9681e9a100f8c895f08e450fc32dafd48vboxsync int fh = open("/dev/urandom", O_RDONLY);
d1966fe9681e9a100f8c895f08e450fc32dafd48vboxsync if (fh <= 0)
d1966fe9681e9a100f8c895f08e450fc32dafd48vboxsync fh = open("/dev/random", O_RDONLY | O_NONBLOCK);
d1966fe9681e9a100f8c895f08e450fc32dafd48vboxsync if (fh >= 0)
d1966fe9681e9a100f8c895f08e450fc32dafd48vboxsync {
5383c976362d5b18656cf7b9248b2063a764a203vboxsync fcntl(fh, F_SETFD, FD_CLOEXEC);
5383c976362d5b18656cf7b9248b2063a764a203vboxsync g_fhDevRandom = fh;
5383c976362d5b18656cf7b9248b2063a764a203vboxsync }
5383c976362d5b18656cf7b9248b2063a764a203vboxsync}
5383c976362d5b18656cf7b9248b2063a764a203vboxsync
int rtRandGenBytesNative(void *pv, size_t cb)
{
int fh = g_fhDevRandom;
if (fh == -1)
return VERR_NOT_SUPPORTED;
ssize_t cbRead = read(fh, pv, cb);
if ((size_t)cbRead != cb)
{
/*
* Use the fallback for the remainder if /dev/urandom / /dev/random
* is out to lunch.
*/
if (cbRead <= 0)
rtRandGenBytesFallback(pv, cb);
else
{
AssertRelease((size_t)cbRead < cb);
rtRandGenBytesFallback((uint8_t *)pv + cbRead, cb - cbRead);
}
}
return VINF_SUCCESS;
}