diff options
author | Corinna Vinschen <corinna@vinschen.de> | 2017-01-19 20:58:06 +0100 |
---|---|---|
committer | Corinna Vinschen <corinna@vinschen.de> | 2017-01-19 20:58:06 +0100 |
commit | bbf6993a2dba70ee9cd99b20a039e15d754400ef (patch) | |
tree | ec5115f975509c19c623b7799cd165c33a01bf26 /winsup/cygwin/libc/getentropy.cc | |
parent | e6e66224f382a83c9a9cae6431336645a7986b4a (diff) | |
download | cygnal-bbf6993a2dba70ee9cd99b20a039e15d754400ef.tar.gz cygnal-bbf6993a2dba70ee9cd99b20a039e15d754400ef.tar.bz2 cygnal-bbf6993a2dba70ee9cd99b20a039e15d754400ef.zip |
Move getentropy/getrandom into own file
Signed-off-by: Corinna Vinschen <corinna@vinschen.de>
Diffstat (limited to 'winsup/cygwin/libc/getentropy.cc')
-rw-r--r-- | winsup/cygwin/libc/getentropy.cc | 70 |
1 files changed, 70 insertions, 0 deletions
diff --git a/winsup/cygwin/libc/getentropy.cc b/winsup/cygwin/libc/getentropy.cc new file mode 100644 index 000000000..5918eb5d9 --- /dev/null +++ b/winsup/cygwin/libc/getentropy.cc @@ -0,0 +1,70 @@ +/* getentropy.cc: getentropy/getrandmom functions + +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. */ + +#include "winsup.h" +#include <ntsecapi.h> +#include <sys/param.h> +#include <sys/random.h> +#include "cygtls.h" +#include "ntdll.h" + +extern "C" int +getentropy (void *ptr, size_t 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 ("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; +} |