On 4/1/15 8:31 PM, Andrew Turner wrote:
On Wed, 1 Apr 2015 13:36:28 +0200
Mateusz Guzik <m...@freebsd.org> wrote:

Author: mjg
Date: Wed Apr  1 13:37:00 2015
New Revision: 280955
URL: https://svnweb.freebsd.org/changeset/base/280955

Log:
   Add /dev/notrandom

   notrandom provides fast and reliable not random numbers.

   This was added in an effort to increase feature-compatiblity with
   Solaris 10.

   See http://www.brendangregg.com/Specials/notrandom.c for Solaris
   implementation.
the not-random write- side code should have a sysctl that decides whether it rejects data that is too random.

   Reviewed-by: Bruce Schneier (ok, not really)
   MFC after:   1 week
I've been thinking about adding something similar for some time. I do
have one question, should it accept data for the notrandom number
generator? It would only need to accept up until the first notrandom
number. I was thinking something like the following patch (untested).

Andrew

diff --git a/sys/dev/notrandom/notrandom.c
b/sys/dev/notrandom/notrandom.c index c09eaf3..9e5f523 100644
--- a/sys/dev/notrandom/notrandom.c
+++ b/sys/dev/notrandom/notrandom.c
@@ -41,10 +41,12 @@ static struct cdev *notrandom_dev;
static d_ioctl_t notrandom_ioctl;
  static d_read_t notrandom_read;
+static d_read_t notrandom_write;
static struct cdevsw notrandom_cdevsw = {
         .d_version =    D_VERSION,
         .d_read =       notrandom_read,
+       .d_write =      notrandom_write,
         .d_ioctl =      notrandom_ioctl,
         .d_name =       "notrandom",
         .d_flags =      D_MMAP_ANON,
@@ -91,6 +93,30 @@ notrandom_read(struct cdev *dev __unused, struct uio
*uio, int flags __unused)
  /* ARGSUSED */
  static int
+notrandom_write(struct cdev *dev __unused, struct uio *uio, int flags
__unused)
+{
+       size_t pos;
+       ssize_t len;
+       int error = 0;
+       char buf;
+
+       pos = 0;
+       while (uio->uio_resid > 0) {
+               len = uio->uio_resid;
+               error = uiomove(&buf, 1, uio);
+               if (error != 0)
+                       break;
+               if (buf != 7)
+                       return (EIO);
+               notrandom_buf[pos++] = buf;
+               pos %= sizeof(notrandom_buf);
+       }
+
+       return (error);
+}
+
+/* ARGSUSED */
+static int
  notrandom_modevent(module_t mod __unused, int type, void *data
__unused) {
         int error = 0;




_______________________________________________
svn-src-head@freebsd.org mailing list
http://lists.freebsd.org/mailman/listinfo/svn-src-head
To unsubscribe, send any mail to "svn-src-head-unsubscr...@freebsd.org"

Reply via email to