#include <sys_defs.h>
#include <fcntl.h>
#include <unistd.h>
#include <limits.h>
#include <errno.h>
#ifndef UCHAR_MAX
#define UCHAR_MAX 0xff
#endif
#ifdef USE_TLS
#include <openssl/rand.h>
#include <msg.h>
#include <mymalloc.h>
#include <connect.h>
#include <iostuff.h>
#include <tls_prng.h>
TLS_PRNG_SRC *tls_prng_dev_open(const char *name, int timeout)
{
const char *myname = "tls_prng_dev_open";
TLS_PRNG_SRC *dev;
int fd;
if ((fd = open(name, O_RDONLY, 0)) < 0) {
if (msg_verbose)
msg_info("%s: cannot open entropy device %s: %m", myname, name);
return (0);
} else {
dev = (TLS_PRNG_SRC *) mymalloc(sizeof(*dev));
dev->fd = fd;
dev->name = mystrdup(name);
dev->timeout = timeout;
if (msg_verbose)
msg_info("%s: opened entropy device %s", myname, name);
return (dev);
}
}
ssize_t tls_prng_dev_read(TLS_PRNG_SRC *dev, size_t len)
{
const char *myname = "tls_prng_dev_read";
unsigned char buffer[UCHAR_MAX];
ssize_t count;
size_t rand_bytes;
if (len <= 0)
msg_panic("%s: bad read length: %ld", myname, (long) len);
if (len > sizeof(buffer))
rand_bytes = sizeof(buffer);
else
rand_bytes = len;
errno = 0;
#ifdef __APPLE_OS_X_SERVER__
const char *p_no_poll = "apple-no-poll";
count = timed_read(dev->fd, buffer, rand_bytes, dev->timeout, (void *)p_no_poll);
#else
count = timed_read(dev->fd, buffer, rand_bytes, dev->timeout, (void *) 0);
#endif
if (count > 0) {
if (msg_verbose)
msg_info("%s: read %ld bytes from entropy device %s",
myname, (long) count, dev->name);
RAND_seed(buffer, count);
} else {
if (msg_verbose)
msg_info("%s: cannot read %ld bytes from entropy device %s: %m",
myname, (long) rand_bytes, dev->name);
}
return (count);
}
int tls_prng_dev_close(TLS_PRNG_SRC *dev)
{
const char *myname = "tls_prng_dev_close";
int err;
if (msg_verbose)
msg_info("%s: close entropy device %s", myname, dev->name);
err = close(dev->fd);
myfree(dev->name);
myfree((char *) dev);
return (err);
}
#endif