]> git.meshlink.io Git - meshlink/commitdiff
Use CryptGenRandom() instead of /dev/[u]random on Windows.
authorGuus Sliepen <guus@meshlink.io>
Sun, 25 May 2014 14:26:37 +0000 (16:26 +0200)
committerGuus Sliepen <guus@meshlink.io>
Sun, 25 May 2014 14:26:37 +0000 (16:26 +0200)
src/crypto.c

index cf000c8a0824f855a1f6e6815603e00500c6ed33..2e2fa5386555c02b1e8c5632ee597c6c52bd513d 100644 (file)
@@ -23,6 +23,8 @@
 
 //TODO: use a strict random source once to seed a PRNG?
 
+#ifndef HAVE_MINGW
+
 static int random_fd = -1;
 
 void crypto_init(void) {
@@ -36,11 +38,30 @@ void crypto_init(void) {
 }
 
 void crypto_exit(void) {
+       close(random_fd);
+}
+
+#else
+
+#include <wincrypt.h>
+HCRYPTPROV prov;
+
+void crypto_init(void) {
+       if(!CryptAcquireContext(&prov, NULL, NULL, PROV_RSA_FULL, CRYPT_VERIFYCONTEXT)) {
+               fprintf(stderr, "CryptAcquireContext() failed!\n");
+               abort();
+       }
+}
+
+void crypto_exit(void) {
+       CryptReleaseContext(prov, 0);
 }
 
 void randomize(void *out, size_t outlen) {
-       if(read(random_fd, out, outlen) != outlen) {
-               fprintf(stderr, "Error reading random numbers: %s\n", strerror(errno));
+       if(!CryptGenRandom(prov, outlen, out)) {
+               fprintf(stderr, "CryptGenRandom() failed\n");
                abort();
        }
 }
+
+#endif