X-Git-Url: http://git.meshlink.io/?a=blobdiff_plain;f=src%2Fcrypto.c;h=1bdd8b0745597bd5a35f73bfefa18a7d10db3dca;hb=9457a9cdb66473ad36923845b0f5fb359eec2ef0;hp=e3797f8d79d04a0c8e8341786693e2fcc365979a;hpb=b1c340b62be086515b951572bf8ffac0acd6c78f;p=meshlink diff --git a/src/crypto.c b/src/crypto.c index e3797f8d..1bdd8b07 100644 --- a/src/crypto.c +++ b/src/crypto.c @@ -29,8 +29,11 @@ static int random_fd = -1; void crypto_init(void) { 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(); @@ -42,15 +45,21 @@ void crypto_exit(void) { } void randomize(void *out, size_t 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; } }