X-Git-Url: http://git.meshlink.io/?a=blobdiff_plain;f=src%2Fcrypto.c;h=1bdd8b0745597bd5a35f73bfefa18a7d10db3dca;hb=facb61a34353a06d8286df34a6224585cc561c3e;hp=2e2fa5386555c02b1e8c5632ee597c6c52bd513d;hpb=7593adb9ad9e6ff73afe29e9bd445cea8615a151;p=meshlink diff --git a/src/crypto.c b/src/crypto.c index 2e2fa538..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(); @@ -41,6 +44,26 @@ void crypto_exit(void) { close(random_fd); } +void randomize(void *out, size_t outlen) { + char *ptr = out; + + while(outlen) { + size_t len = read(random_fd, ptr, outlen); + + if(len <= 0) { + if(errno == EAGAIN || errno == EINTR) { + continue; + } + + fprintf(stderr, "Could not read random numbers: %s\n", strerror(errno)); + abort(); + } + + ptr += len; + outlen -= len; + } +} + #else #include