aboutsummaryrefslogtreecommitdiff
path: root/randgen_win32.c
diff options
context:
space:
mode:
Diffstat (limited to 'randgen_win32.c')
-rw-r--r--randgen_win32.c42
1 files changed, 42 insertions, 0 deletions
diff --git a/randgen_win32.c b/randgen_win32.c
new file mode 100644
index 0000000..d0b4123
--- /dev/null
+++ b/randgen_win32.c
@@ -0,0 +1,42 @@
+#include "randgen.h"
+
+#include <windows.h>
+#include <wincrypt.h>
+
+#include <stdio.h>
+#include <assert.h>
+
+struct randgen *randgen_open(const char *device)
+{
+ HCRYPTPROV prov;
+
+ (void) device;
+
+ if (!CryptAcquireContextW(&prov, 0, 0, PROV_RSA_FULL,
+ CRYPT_VERIFYCONTEXT | CRYPT_SILENT))
+ {
+ fprintf(stderr, "failed to open random generator: CryptAcquireContextW failed\n");
+ return NULL;
+ }
+
+ return (struct randgen *) prov;
+}
+
+int randgen_close(struct randgen *randgen)
+{
+ assert(randgen != NULL);
+ CryptReleaseContext((HCRYPTPROV) randgen, 0);
+ return 0;
+}
+
+int randgen_generate(struct randgen *randgen, void *buf, size_t size)
+{
+ assert(randgen != NULL);
+ assert(buf != NULL);
+ assert(size > 0);
+
+ if (!CryptGenRandom((HCRYPTPROV) randgen, size, buf))
+ return -1;
+
+ return 0;
+}