X-Git-Url: http://git.meshlink.io/?a=blobdiff_plain;f=src%2Fcrypto.c;h=e3797f8d79d04a0c8e8341786693e2fcc365979a;hb=2e606e5823d06aece9a0d4719e07ce3b28ebeadc;hp=cf000c8a0824f855a1f6e6815603e00500c6ed33;hpb=0afa91b3c4f62db18c715e8499368a7c2c9ee5bd;p=meshlink diff --git a/src/crypto.c b/src/crypto.c index cf000c8a..e3797f8d 100644 --- a/src/crypto.c +++ b/src/crypto.c @@ -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,44 @@ void crypto_init(void) { } void crypto_exit(void) { + close(random_fd); +} + +void randomize(void *out, size_t outlen) { + while(outlen) { + size_t len = read(random_fd, out, outlen); + if(len <= 0) { + if(errno == EAGAIN || errno == EINTR) + continue; + fprintf(stderr, "Could not read random numbers: %s\n", strerror(errno)); + abort(); + } + out += len; + outlen -= len; + } +} + +#else + +#include +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