summaryrefslogtreecommitdiffstats
path: root/winsup/cygwin/libc/getentropy.cc
diff options
context:
space:
mode:
authorCorinna Vinschen <corinna@vinschen.de>2017-01-19 20:58:06 +0100
committerCorinna Vinschen <corinna@vinschen.de>2017-01-19 20:58:06 +0100
commitbbf6993a2dba70ee9cd99b20a039e15d754400ef (patch)
treeec5115f975509c19c623b7799cd165c33a01bf26 /winsup/cygwin/libc/getentropy.cc
parente6e66224f382a83c9a9cae6431336645a7986b4a (diff)
downloadcygnal-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.cc70
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;
+}