Export getentropy and getrandom calls

getentropy per OpenBSD

  http://man.openbsd.org/cgi-bin/man.cgi/OpenBSD-current/man2/getentropy.2

getrandom per Linux

  http://man7.org/linux/man-pages/man2/getrandom.2.html

  Note that GRND_NONBLOCK is not handled
This commit is contained in:
Corinna Vinschen 2016-12-16 23:10:19 +01:00
parent f46f501471
commit 4e75d7f504
5 changed files with 96 additions and 6 deletions

View File

@ -604,6 +604,7 @@ getdelim = __getdelim SIGFE
getdomainname SIGFE
getdtablesize NOSIGFE
getegid NOSIGFE
getentropy SIGFE
getenv NOSIGFE
geteuid NOSIGFE
getgid NOSIGFE
@ -650,6 +651,7 @@ getpwnam SIGFE
getpwnam_r SIGFE
getpwuid SIGFE
getpwuid_r SIGFE
getrandom SIGFE
getrlimit SIGFE
getrusage SIGFE
gets SIGFE

View File

@ -10,8 +10,8 @@ details. */
the Cygwin shared library". This version is used to track important
changes to the DLL and is mainly informative in nature. */
#define CYGWIN_VERSION_DLL_MAJOR 2006
#define CYGWIN_VERSION_DLL_MINOR 1
#define CYGWIN_VERSION_DLL_MAJOR 2007
#define CYGWIN_VERSION_DLL_MINOR 0
/* Major numbers before CYGWIN_VERSION_DLL_EPOCH are incompatible. */
@ -470,12 +470,13 @@ details. */
303: Export pthread_getname_np, pthread_setname_np.
304: Export strerror_l, strptime_l, wcsftime_l.
305: [f]pathconf flag _PC_CASE_INSENSITIVE added.
306: Export getentropy, getrandom.
Note that we forgot to bump the api for ualarm, strtoll, strtoull,
sigaltstack, sethostname. */
#define CYGWIN_VERSION_API_MAJOR 0
#define CYGWIN_VERSION_API_MINOR 305
#define CYGWIN_VERSION_API_MINOR 306
/* There is also a compatibity version number associated with the shared memory
regions. It is incremented when incompatible changes are made to the shared

View File

@ -0,0 +1,29 @@
/* sys/random.h header file for Cygwin.
This file is part of Cygwin.
This software is a copyrighted work licensed under the terms of the
Cygwin license. Please consult the file "CYGWIN_LICENSE" for details. */
#ifndef _SYS_RANDOM_H
#define _SYS_RANDOM_H
#include <_ansi.h>
#include <sys/types.h>
/* getrandom flags */
#define GRND_NONBLOCK 1
#define GRND_RANDOM 2
#ifdef __cplusplus
extern "C" {
#endif
ssize_t getrandom (void *__ptr, size_t __len, unsigned int __flags);
int getentropy (void *__ptr, size_t __len);
#ifdef __cplusplus
}
#endif
#endif /* _SYS_RANDOM_H */

View File

@ -14,6 +14,7 @@ details. */
#include <alloca.h>
#include <limits.h>
#include <sys/param.h>
#include <sys/random.h>
#include <wchar.h>
#include "cygtls.h"
#include "ntdll.h"
@ -234,19 +235,62 @@ check_iovec (const struct iovec *iov, int iovcnt, bool forwrite)
return -1;
}
/* Used by arc2random, fhandler_socket and fhandler_random. */
extern "C" int
getentropy (void *ptr, size_t len)
{
if (!RtlGenRandom (ptr, len))
/* Per BSD man page: The maximum buffer size permitted is 256 bytes.
If buflen exceeds this, an error of EIO will be indicated. */
if (len > 256)
{
debug_printf ("%E = RtlGenRandom()");
debug_printf ("len (%U) > 256", len);
set_errno (EIO);
return -1;
}
__try
{
if (!RtlGenRandom (ptr, len))
{
debug_printf ("RtlGenRandom() = FALSE");
set_errno (EIO);
return -1;
}
}
__except (EFAULT)
{
return -1;
}
__endtry
return 0;
}
extern "C" ssize_t
getrandom (void *ptr, size_t len, unsigned int flags)
{
if (flags & ~(GRND_NONBLOCK | GRND_RANDOM))
{
debug_printf ("invalid flags: %y", flags);
set_errno (EINVAL);
return -1;
}
/* Max. bytes returned by Linux call. */
len = MAX (len, (flags & GRND_RANDOM) ? 512 : 33554431);
__try
{
if (!RtlGenRandom (ptr, len))
{
debug_printf ("RtlGenRandom() = FALSE");
set_errno (EIO);
return -1;
}
}
__except (EFAULT)
{
return -1;
}
__endtry
return len;
}
/* Try hard to schedule another thread.
Remember not to call this in a lock condition or you'll potentially
suffer starvation. */

View File

@ -0,0 +1,14 @@
What's new:
-----------
- New API: getentropy, getrandom.
What changed:
-------------
Bug Fixes
---------