Implement getentropy for Cygwin
* miscfuncs.cc (getentropy): Move fhandler_dev_random::crypt_gen_random here and rename to getentropy. Fix type and return values to match getentropy requirements. * miscfuncs.h (getentropy): Add prototype. * fhandler.h (fhandler_dev_random::crypt_gen_random): Remove prototype. * fhandler_random.cc (fhandler_dev_random::crypt_gen_random): Drop. (fhandler_dev_random::write): Use getentropy instead. (fhandler_dev_random::read): Ditto. * fhandler_socket.cc (fhandler_socket::af_local_set_secret): Ditto. Signed-off-by: Corinna Vinschen <corinna@vinschen.de>
This commit is contained in:
@@ -29,23 +29,6 @@ details. */
|
||||
#define PSEUDO_MULTIPLIER (6364136223846793005LL)
|
||||
#define PSEUDO_SHIFTVAL (21)
|
||||
|
||||
/* There's a bug in ntsecapi.h (Mingw as well as MSFT). SystemFunction036
|
||||
is, in fact, a WINAPI function, but it's not defined as such. Therefore
|
||||
we have to do it correctly here. */
|
||||
#define RtlGenRandom SystemFunction036
|
||||
extern "C" BOOLEAN WINAPI RtlGenRandom (PVOID, ULONG);
|
||||
|
||||
bool
|
||||
fhandler_dev_random::crypt_gen_random (void *ptr, size_t len)
|
||||
{
|
||||
if (!RtlGenRandom (ptr, len))
|
||||
{
|
||||
debug_printf ("%E = RtlGenRandom()");
|
||||
return false;
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
int
|
||||
fhandler_dev_random::pseudo_write (const void *ptr, size_t len)
|
||||
{
|
||||
@@ -73,11 +56,8 @@ fhandler_dev_random::write (const void *ptr, size_t len)
|
||||
memcpy (buf, ptr, limited_len);
|
||||
|
||||
/* Mess up system entropy source. Return error if device is /dev/random. */
|
||||
if (!crypt_gen_random (buf, limited_len) && dev () == FH_RANDOM)
|
||||
{
|
||||
__seterrno ();
|
||||
return -1;
|
||||
}
|
||||
if (getentropy (buf, limited_len) && dev () == FH_RANDOM)
|
||||
return -1;
|
||||
/* Mess up the pseudo random number generator. */
|
||||
pseudo_write (buf, limited_len);
|
||||
return len;
|
||||
@@ -125,10 +105,9 @@ fhandler_dev_random::read (void *ptr, size_t& len)
|
||||
}
|
||||
for (size_t offset = 0; offset < len; offset += 512)
|
||||
{
|
||||
if (!crypt_gen_random (dummy, RESEED_INTERVAL) ||
|
||||
!crypt_gen_random ((PBYTE) ptr + offset, len - offset))
|
||||
if (getentropy (dummy, RESEED_INTERVAL) ||
|
||||
getentropy ((PBYTE) ptr + offset, len - offset))
|
||||
{
|
||||
__seterrno ();
|
||||
len = (size_t) -1;
|
||||
break;
|
||||
}
|
||||
@@ -138,6 +117,6 @@ fhandler_dev_random::read (void *ptr, size_t& len)
|
||||
|
||||
/* If device is /dev/urandom, just use system RNG as is, with our own
|
||||
PRNG as fallback. */
|
||||
else if (!crypt_gen_random (ptr, len))
|
||||
else if (getentropy (ptr, len))
|
||||
len = pseudo_read (ptr, len);
|
||||
}
|
||||
|
Reference in New Issue
Block a user