Date: Fri, 13 Sep 2002 12:30:16 -0600 From: Stacy Millions <stacy@millions.ca> To: hackers@FreeBSD.ORG Cc: freebsd-security@FreeBSD.ORG Subject: kern_random interface Message-ID: <3D822EB8.4010201@millions.ca>
next in thread | raw e-mail | index | archive | help
[-- Attachment #1 --]
I have been working on a kld that provides a driver for the Intel 82802
hardware random number generator. I have it working (give or take), but
am not quite ready to release it. One of the features I want to include,
is the ability to feed entropy from the rng to kern_random. I have
attached a patch that adds an interface to kern_random to add the
entropy with out any of the quality estimate or timer delta calculations.
I am soliciting comments on this patch before I submit a pr.
I would also like to get some opinions on the how to enable the option to
add entropy to kern_random. Right now, I am implementing it as a sysctl
for my device, but I was thinking of a more general purpose solution.
I was thinking of an "rng interface". Then any hardware rng driver that
implemented the device_method specified by the interface would be
able to feed entropy to kern_random. It would be controlled by
rndcontrol, something like "rndcontrol -d rng0" to enable device rng0
to start feeding kern_random and "rndcontrol -D rng0" to disable it.
It could also be extended to include methods for getting random data
directly, so that things like IPSec could get their key data from a
specific rng.
Am I on the right track here? I have looked at the Hardware Crypto
Support stuff and I don't think anything I'm doing or purposing
conflicts with it.
-stacy
--
If they keep lowering education standards and raising the price of
gasoline, there are going to be a lot of stupid people walking around.
Stacy Millions stacy@millions.ca
Millions Consulting Limited
[-- Attachment #2 --]
diff -ur /usr/src/sys/kern/kern_random.c ./kern/kern_random.c
--- /usr/src/sys/kern/kern_random.c Thu Feb 21 15:23:33 2002
+++ ./kern/kern_random.c Wed Sep 11 14:24:28 2002
@@ -249,6 +249,22 @@
add_timer_randomness(&random_state, &irq_timer_state[intr], intr);
}
+/* add entropy without any song and dance. source should be a
+ * real RNG, like the Intel 82802 hardware RNG -stacy@millions.ca */
+void
+add_entropy(u_int32_t v)
+{
+ add_entropy_word(&random_state, v);
+ random_state.entropy_count += 32;
+
+ /* Prevent overflow */
+ if (random_state.entropy_count > POOLBITS)
+ random_state.entropy_count = POOLBITS;
+
+ if (random_state.entropy_count >= 8)
+ selwakeup(&random_state.rsel);
+}
+
#ifdef notused
void
add_blkdev_randomness(int major)
diff -ur /usr/src/sys/sys/random.h ./sys/random.h
--- /usr/src/sys/sys/random.h Tue May 9 20:04:52 2000
+++ ./sys/random.h Wed Sep 11 14:24:16 2002
@@ -71,6 +71,7 @@
void rand_initialize(void);
void add_keyboard_randomness(u_char scancode);
inthand2_t add_interrupt_randomness;
+void add_entropy(u_int32_t e);
#ifdef notused
void add_blkdev_randomness(int major);
#endif
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?3D822EB8.4010201>
