X-Git-Url: http://git.meshlink.io/?p=meshlink;a=blobdiff_plain;f=src%2Fcrypto.c;h=3244a0b4628bdd2e6ddb6f49dbf1a0c30fab17ad;hp=e3797f8d79d04a0c8e8341786693e2fcc365979a;hb=963c5055505f2fc117cd5efa06eaa02c9b2bf85d;hpb=b1c340b62be086515b951572bf8ffac0acd6c78f diff --git a/src/crypto.c b/src/crypto.c index e3797f8d..3244a0b4 100644 --- a/src/crypto.c +++ b/src/crypto.c @@ -28,9 +28,14 @@ static int random_fd = -1; void crypto_init(void) { + assert(random_fd == -1); + random_fd = open("/dev/urandom", O_RDONLY); - if(random_fd < 0) + + if(random_fd < 0) { random_fd = open("/dev/random", O_RDONLY); + } + if(random_fd < 0) { fprintf(stderr, "Could not open source of random numbers: %s\n", strerror(errno)); abort(); @@ -38,19 +43,30 @@ void crypto_init(void) { } void crypto_exit(void) { + assert(random_fd != -1); + close(random_fd); + random_fd = -1; } void randomize(void *out, size_t outlen) { + assert(outlen); + + char *ptr = out; + while(outlen) { - size_t len = read(random_fd, out, outlen); + size_t len = read(random_fd, ptr, outlen); + if(len <= 0) { - if(errno == EAGAIN || errno == EINTR) + if(errno == EAGAIN || errno == EINTR) { continue; + } + fprintf(stderr, "Could not read random numbers: %s\n", strerror(errno)); abort(); } - out += len; + + ptr += len; outlen -= len; } } @@ -72,6 +88,8 @@ void crypto_exit(void) { } void randomize(void *out, size_t outlen) { + assert(outlen); + if(!CryptGenRandom(prov, outlen, out)) { fprintf(stderr, "CryptGenRandom() failed\n"); abort();