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 getdomainname SIGFE
getdtablesize NOSIGFE getdtablesize NOSIGFE
getegid NOSIGFE getegid NOSIGFE
getentropy SIGFE
getenv NOSIGFE getenv NOSIGFE
geteuid NOSIGFE geteuid NOSIGFE
getgid NOSIGFE getgid NOSIGFE
@ -650,6 +651,7 @@ getpwnam SIGFE
getpwnam_r SIGFE getpwnam_r SIGFE
getpwuid SIGFE getpwuid SIGFE
getpwuid_r SIGFE getpwuid_r SIGFE
getrandom SIGFE
getrlimit SIGFE getrlimit SIGFE
getrusage SIGFE getrusage SIGFE
gets SIGFE gets SIGFE

View File

@ -10,8 +10,8 @@ details. */
the Cygwin shared library". This version is used to track important the Cygwin shared library". This version is used to track important
changes to the DLL and is mainly informative in nature. */ changes to the DLL and is mainly informative in nature. */
#define CYGWIN_VERSION_DLL_MAJOR 2006 #define CYGWIN_VERSION_DLL_MAJOR 2007
#define CYGWIN_VERSION_DLL_MINOR 1 #define CYGWIN_VERSION_DLL_MINOR 0
/* Major numbers before CYGWIN_VERSION_DLL_EPOCH are incompatible. */ /* Major numbers before CYGWIN_VERSION_DLL_EPOCH are incompatible. */
@ -470,12 +470,13 @@ details. */
303: Export pthread_getname_np, pthread_setname_np. 303: Export pthread_getname_np, pthread_setname_np.
304: Export strerror_l, strptime_l, wcsftime_l. 304: Export strerror_l, strptime_l, wcsftime_l.
305: [f]pathconf flag _PC_CASE_INSENSITIVE added. 305: [f]pathconf flag _PC_CASE_INSENSITIVE added.
306: Export getentropy, getrandom.
Note that we forgot to bump the api for ualarm, strtoll, strtoull, Note that we forgot to bump the api for ualarm, strtoll, strtoull,
sigaltstack, sethostname. */ sigaltstack, sethostname. */
#define CYGWIN_VERSION_API_MAJOR 0 #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 /* There is also a compatibity version number associated with the shared memory
regions. It is incremented when incompatible changes are made to the shared 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 <alloca.h>
#include <limits.h> #include <limits.h>
#include <sys/param.h> #include <sys/param.h>
#include <sys/random.h>
#include <wchar.h> #include <wchar.h>
#include "cygtls.h" #include "cygtls.h"
#include "ntdll.h" #include "ntdll.h"
@ -234,19 +235,62 @@ check_iovec (const struct iovec *iov, int iovcnt, bool forwrite)
return -1; return -1;
} }
/* Used by arc2random, fhandler_socket and fhandler_random. */
extern "C" int extern "C" int
getentropy (void *ptr, size_t len) 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); set_errno (EIO);
return -1; return -1;
} }
__try
{
if (!RtlGenRandom (ptr, len))
{
debug_printf ("RtlGenRandom() = FALSE");
set_errno (EIO);
return -1;
}
}
__except (EFAULT)
{
return -1;
}
__endtry
return 0; 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. /* Try hard to schedule another thread.
Remember not to call this in a lock condition or you'll potentially Remember not to call this in a lock condition or you'll potentially
suffer starvation. */ suffer starvation. */

View File

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