diff options
Diffstat (limited to 'randgen_win32.c')
| -rw-r--r-- | randgen_win32.c | 42 |
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; +} |
