changeset 694:c85bb68e1db6

add loadavg and entropy_avail as sources
author Matt Johnston <matt@ucc.asn.au>
date Sat, 23 Feb 2013 10:27:49 +0800
parents c58a15983808
children 94aa1203be1e
files random.c
diffstat 1 files changed, 15 insertions(+), 4 deletions(-) [+]
line wrap: on
line diff
--- a/random.c	Tue Feb 12 15:52:57 2013 +0000
+++ b/random.c	Sat Feb 23 10:27:49 2013 +0800
@@ -73,10 +73,10 @@
 	}
 
 	readcount = 0;
-	while (readcount < len)
+	while (len == 0 || readcount < len)
 	{
 		int readlen, wantread;
-		unsigned char readbuf[128];
+		unsigned char readbuf[2048];
 		if (!already_blocked)
 		{
 			int ret;
@@ -93,7 +93,14 @@
 			}
 		}
 
-		wantread = MIN(sizeof(readbuf), len-readcount);
+		if (len == 0)
+		{
+			wantread = sizeof(readbuf);
+		} 
+		else
+		{
+			wantread = MIN(sizeof(readbuf), len-readcount);
+		}
 
 #ifdef DROPBEAR_PRNGD_SOCKET
 		if (prngd)
@@ -185,7 +192,8 @@
 	}
 #endif
 
-	/* A few other sources to fall back on. Add more here for other platforms */
+	/* A few other sources to fall back on. 
+	 * Add more here for other platforms */
 #ifdef __linux__
 	/* Seems to be a reasonable source of entropy from timers. Possibly hard
 	 * for even local attackers to reproduce */
@@ -193,6 +201,9 @@
 	/* Might help on systems with wireless */
 	process_file(&hs, "/proc/interrupts", 0, 0);
 
+	process_file(&hs, "/proc/loadavg", 0, 0);
+	process_file(&hs, "/proc/sys/kernel/random/entropy_avail", 0, 0);
+
 	/* Mostly network visible but useful in some situations */
 	process_file(&hs, "/proc/net/netstat", 0, 0);
 	process_file(&hs, "/proc/net/dev", 0, 0);