summaryrefslogtreecommitdiff
path: root/crypto/rand/rand_egd.c
diff options
context:
space:
mode:
authorLutz Jänicke <jaenicke@openssl.org>2001-01-09 16:44:59 +0000
committerLutz Jänicke <jaenicke@openssl.org>2001-01-09 16:44:59 +0000
commit599c03530ae1b63df396d35b9227d239d451e8fd (patch)
tree81518ae1c99cdf7de23dfd4eaf8d50ae0ea7a5b8 /crypto/rand/rand_egd.c
parent56a67adb6486df1ab417217e9855a1acc07b40ba (diff)
downloadopenssl-new-599c03530ae1b63df396d35b9227d239d451e8fd.tar.gz
Add automatic query of EGD sockets to RAND_poll(). The EGD sockets are
only queried when the /dev/[u]random devices did not return enough entropy. Only the amount of entropy missing to reach the required minimum is queried, as EGD may be drained. Queried locations are: /etc/entropy, /var/run/egd-pool
Diffstat (limited to 'crypto/rand/rand_egd.c')
-rw-r--r--crypto/rand/rand_egd.c50
1 files changed, 40 insertions, 10 deletions
diff --git a/crypto/rand/rand_egd.c b/crypto/rand/rand_egd.c
index 02a0d86fa3..28fb1f2c60 100644
--- a/crypto/rand/rand_egd.c
+++ b/crypto/rand/rand_egd.c
@@ -60,6 +60,10 @@
*/
#if defined(WIN32) || defined(VMS) || defined(__VMS)
+int RAND_query_egd_bytes(const char *path, unsigned char *buf, int bytes)
+ {
+ return(-1);
+ }
int RAND_egd(const char *path)
{
return(-1);
@@ -81,13 +85,13 @@ int RAND_egd_bytes(const char *path,int bytes)
# define offsetof(TYPE, MEMBER) ((size_t) &((TYPE *)0)->MEMBER)
#endif
-int RAND_egd(const char *path)
+int RAND_query_egd_bytes(const char *path, unsigned char *buf, int bytes)
{
- int ret = -1;
+ int ret = 0;
struct sockaddr_un addr;
int len, num;
int fd = -1;
- unsigned char buf[256];
+ unsigned char egdbuf[2];
memset(&addr, 0, sizeof(addr));
addr.sun_family = AF_UNIX;
@@ -98,18 +102,44 @@ int RAND_egd(const char *path)
fd = socket(AF_UNIX, SOCK_STREAM, 0);
if (fd == -1) return (-1);
if (connect(fd, (struct sockaddr *)&addr, len) == -1) goto err;
- buf[0] = 1;
- buf[1] = 255;
- write(fd, buf, 2);
- if (read(fd, buf, 1) != 1) goto err;
- if (buf[0] == 0) goto err;
- num = read(fd, buf, 255);
+
+ while(bytes > 0)
+ {
+ egdbuf[0] = 1;
+ egdbuf[1] = bytes < 255 ? bytes : 255;
+ write(fd, egdbuf, 2);
+ if (read(fd, egdbuf, 1) != 1)
+ {
+ ret=-1;
+ goto err;
+ }
+ if(egdbuf[0] == 0)
+ goto err;
+ num = read(fd, buf + ret, egdbuf[0]);
+ if (num < 1)
+ {
+ ret=-1;
+ goto err;
+ }
+ ret += num;
+ bytes-=num;
+ }
+ err:
+ if (fd != -1) close(fd);
+ return(ret);
+ }
+
+int RAND_egd(const char *path)
+ {
+ int num, ret;
+ unsigned char buf[256];
+
+ num = RAND_query_egd_bytes(path, buf, 255);
if (num < 1) goto err;
RAND_seed(buf, num);
if (RAND_status() == 1)
ret = num;
err:
- if (fd != -1) close(fd);
return(ret);
}