Module Name:    src
Committed By:   pooka
Date:           Sat Apr 27 16:56:30 UTC 2013

Modified Files:
        src/lib/librumpuser: rumpuser.c rumpuser_port.h rumpuser_sp.c
        src/sys/rump/include/rump: rumpuser.h
        src/sys/rump/librump/rumpkern: cprng_stub.c

Log Message:
make the random hypercall more generic


To generate a diff of this commit:
cvs rdiff -u -r1.32 -r1.33 src/lib/librumpuser/rumpuser.c
cvs rdiff -u -r1.16 -r1.17 src/lib/librumpuser/rumpuser_port.h
cvs rdiff -u -r1.53 -r1.54 src/lib/librumpuser/rumpuser_sp.c
cvs rdiff -u -r1.84 -r1.85 src/sys/rump/include/rump/rumpuser.h
cvs rdiff -u -r1.4 -r1.5 src/sys/rump/librump/rumpkern/cprng_stub.c

Please note that diffs are not public domain; they are subject to the
copyright notices on the relevant files.

Modified files:

Index: src/lib/librumpuser/rumpuser.c
diff -u src/lib/librumpuser/rumpuser.c:1.32 src/lib/librumpuser/rumpuser.c:1.33
--- src/lib/librumpuser/rumpuser.c:1.32	Sat Apr 27 15:34:53 2013
+++ src/lib/librumpuser/rumpuser.c	Sat Apr 27 16:56:29 2013
@@ -1,4 +1,4 @@
-/*	$NetBSD: rumpuser.c,v 1.32 2013/04/27 15:34:53 pooka Exp $	*/
+/*	$NetBSD: rumpuser.c,v 1.33 2013/04/27 16:56:29 pooka Exp $	*/
 
 /*
  * Copyright (c) 2007-2010 Antti Kantee.  All Rights Reserved.
@@ -28,7 +28,7 @@
 #include "rumpuser_port.h"
 
 #if !defined(lint)
-__RCSID("$NetBSD: rumpuser.c,v 1.32 2013/04/27 15:34:53 pooka Exp $");
+__RCSID("$NetBSD: rumpuser.c,v 1.33 2013/04/27 16:56:29 pooka Exp $");
 #endif /* !lint */
 
 #include <sys/ioctl.h>
@@ -79,7 +79,7 @@ rumpuser_init(int version,
 		return 1;
 	}
 
-#ifdef RUMPUSER_USE_RANDOM
+#ifdef RUMPUSER_USE_DEVRANDOM
 	uint32_t rv;
 	int fd;
 
@@ -808,10 +808,21 @@ rumpuser_getnhostcpu(void)
 	return ncpu;
 }
 
-/* XXX: this hypercall needs a better name */
-uint32_t
-rumpuser_arc4random(void)
+size_t
+rumpuser_getrandom(void *buf, size_t buflen, int flags)
 {
+	size_t origlen = buflen;
+	uint32_t *p = buf;
+	uint32_t tmp;
+	int chunk;
 
-	return arc4random();
+	do {
+		chunk = buflen < 4 ? buflen : 4; /* portable MIN ... */
+		tmp = RUMPUSER_RANDOM();
+		memcpy(p, &tmp, chunk);
+		p++;
+		buflen -= chunk;
+	} while (chunk);
+
+	return origlen;
 }

Index: src/lib/librumpuser/rumpuser_port.h
diff -u src/lib/librumpuser/rumpuser_port.h:1.16 src/lib/librumpuser/rumpuser_port.h:1.17
--- src/lib/librumpuser/rumpuser_port.h:1.16	Wed Mar 20 12:59:10 2013
+++ src/lib/librumpuser/rumpuser_port.h	Sat Apr 27 16:56:29 2013
@@ -1,4 +1,4 @@
-/*	$NetBSD: rumpuser_port.h,v 1.16 2013/03/20 12:59:10 pooka Exp $	*/
+/*	$NetBSD: rumpuser_port.h,v 1.17 2013/04/27 16:56:29 pooka Exp $	*/
 
 /*
  * Portability header for non-NetBSD platforms.
@@ -151,8 +151,10 @@ posix_memalign(void **ptr, size_t align,
 #endif
 
 #if defined(__linux__) || defined(__sun__) || defined (__CYGWIN__)
-#define arc4random() random()
-#define RUMPUSER_USE_RANDOM
+#define RUMPUSER_RANDOM() random()
+#define RUMPUSER_USE_DEVRANDOM
+#else
+#define RUMPUSER_RANDOM() arc4random()
 #endif
 
 #ifndef __NetBSD_Prereq__

Index: src/lib/librumpuser/rumpuser_sp.c
diff -u src/lib/librumpuser/rumpuser_sp.c:1.53 src/lib/librumpuser/rumpuser_sp.c:1.54
--- src/lib/librumpuser/rumpuser_sp.c:1.53	Sat Apr 27 16:02:56 2013
+++ src/lib/librumpuser/rumpuser_sp.c	Sat Apr 27 16:56:29 2013
@@ -1,4 +1,4 @@
-/*      $NetBSD: rumpuser_sp.c,v 1.53 2013/04/27 16:02:56 pooka Exp $	*/
+/*      $NetBSD: rumpuser_sp.c,v 1.54 2013/04/27 16:56:29 pooka Exp $	*/
 
 /*
  * Copyright (c) 2010, 2011 Antti Kantee.  All Rights Reserved.
@@ -37,7 +37,7 @@
 #include "rumpuser_port.h"
 
 #if !defined(lint)
-__RCSID("$NetBSD: rumpuser_sp.c,v 1.53 2013/04/27 16:02:56 pooka Exp $");
+__RCSID("$NetBSD: rumpuser_sp.c,v 1.54 2013/04/27 16:56:29 pooka Exp $");
 #endif /* !lint */
 
 #include <sys/types.h>
@@ -1104,9 +1104,8 @@ handlereq(struct spclient *spc)
 		}
 
 		/* Ok, we have a new process context and a new curlwp */
-		for (i = 0; i < AUTHLEN; i++) {
-			pf->pf_auth[i] = auth[i] = arc4random();
-		}
+		rumpuser_getrandom(auth, sizeof(auth), 0);
+		memcpy(pf->pf_auth, auth, sizeof(pf->pf_auth));
 		pf->pf_lwp = lwproc_curlwp();
 		lwproc_switch(NULL);
 

Index: src/sys/rump/include/rump/rumpuser.h
diff -u src/sys/rump/include/rump/rumpuser.h:1.84 src/sys/rump/include/rump/rumpuser.h:1.85
--- src/sys/rump/include/rump/rumpuser.h:1.84	Sat Apr 27 16:32:56 2013
+++ src/sys/rump/include/rump/rumpuser.h	Sat Apr 27 16:56:30 2013
@@ -1,4 +1,4 @@
-/*	$NetBSD: rumpuser.h,v 1.84 2013/04/27 16:32:56 pooka Exp $	*/
+/*	$NetBSD: rumpuser.h,v 1.85 2013/04/27 16:56:30 pooka Exp $	*/
 
 /*
  * Copyright (c) 2007-2011 Antti Kantee.  All Rights Reserved.
@@ -121,7 +121,10 @@ int rumpuser_dprintf(const char *, ...) 
 
 int rumpuser_getnhostcpu(void);
 
-uint32_t rumpuser_arc4random(void);
+/* always succeeds unless NOWAIT is given */
+#define RUMPUSER_RANDOM_HARD	0x01
+#define RUMPUSER_RANDOM_NOWAIT	0x02
+size_t rumpuser_getrandom(void *, size_t, int);
 
 __dead void rumpuser_biothread(void *);
 

Index: src/sys/rump/librump/rumpkern/cprng_stub.c
diff -u src/sys/rump/librump/rumpkern/cprng_stub.c:1.4 src/sys/rump/librump/rumpkern/cprng_stub.c:1.5
--- src/sys/rump/librump/rumpkern/cprng_stub.c:1.4	Sat Dec 17 20:05:40 2011
+++ src/sys/rump/librump/rumpkern/cprng_stub.c	Sat Apr 27 16:56:30 2013
@@ -1,4 +1,4 @@
-/*	$NetBSD: cprng_stub.c,v 1.4 2011/12/17 20:05:40 tls Exp $ */
+/*	$NetBSD: cprng_stub.c,v 1.5 2013/04/27 16:56:30 pooka Exp $ */
 
 /*-
  * Copyright (c) 2011 The NetBSD Foundation, Inc.
@@ -100,37 +100,25 @@ cprng_strong_destroy(cprng_strong_t *c)
 size_t
 cprng_fast(void *p, size_t len)
 {
-	uint8_t *resp, *pchar = (uint8_t *)p;
-	uint32_t res;
-	size_t i;
-
-	do {
-		res = rumpuser_arc4random();
-		resp = (uint8_t *)&res;
-
-		for (i = 0; i < sizeof(res); i++) {
-		    *pchar++ = resp[i];
-		    if (pchar == (uint8_t *)p + len) {
-			return len;
-		    }
-		}
-	} while(1);
+
+	rumpuser_getrandom(p, len, 0);
+	return len;
 }
 
 uint32_t
 cprng_fast32(void)
 {
-	return rumpuser_arc4random();
+	uint32_t ret;
+
+	rumpuser_getrandom(&ret, sizeof(ret), 0);
+	return ret;
 }
 
 uint64_t
 cprng_fast64(void)
 {
 	uint64_t ret;
-	uint32_t *ret32;
 
-	ret32 = (uint32_t *)&ret;
-	ret32[0] = rumpuser_arc4random();
-	ret32[1] = rumpuser_arc4random();
+	rumpuser_getrandom(&ret, sizeof(ret), 0);
 	return ret;
 }

Reply via email to