Skip site navigation (1)Skip section navigation (2)
Date:      Thu, 04 Apr 2013 14:29:24 -0700
From:      Xin Li <delphij@delphij.net>
To:        Andrey Chernov <ache@freebsd.org>
Cc:        Xin LI <delphij@FreeBSD.org>, d@delphij.net, "freebsd-security@freebsd.org" <freebsd-security@freebsd.org>
Subject:   Kernel arc4 one-shot reseed upon /dev/random unblock
Message-ID:  <515DF0B4.6020000@delphij.net>
In-Reply-To: <515D295A.3020407@freebsd.org>
References:  <201304022341.r32NfL8L096954@svn.freebsd.org> <20130403165736.F819@besplex.bde.org> <515BDADF.8060303@freebsd.org> <515D0E70.8050701@delphij.net> <515D295A.3020407@freebsd.org>

next in thread | previous in thread | raw e-mail | index | archive | help
This is an OpenPGP/MIME signed message (RFC 4880 and 3156)
------enig2TSVUWWOHGUHBDXSBAGNL
Content-Type: multipart/mixed;
 boundary="------------070305050204090202030601"

This is a multi-part message in MIME format.
--------------070305050204090202030601
Content-Type: text/plain; charset=ISO-8859-1
Content-Transfer-Encoding: quoted-printable

(Moved to freebsd-security@)

On 04/04/13 00:18, Andrey Chernov wrote:
> Ok, patches are attached, one with atomic, and another one - without.
> They try to reseed arc4 immediately after we have enough of entropy.
> Only one of them is needed, not both. Atomic version works 100% right
> and non-atomic may cause chained arc4 reseed in edge case, which not
> harms arc4 itself, just takes time.

The atomic version of the patch (attached) looks reasonable to me, but
I'd like to give this more exposure first so please hold until Apr 18, 20=
13.

I have put this on secteam@'s agenda and have set a deadline on that
day, also noted on my own calendar as well as the agenda.

If we have received no objections by Apr 18, I assume the responsibility
of approving this proposed change and consider this as a formal approval
for committing.

Cheers,
--=20
Xin LI <delphij@delphij.net>    https://www.delphij.net/
FreeBSD - The Power to Serve!           Live free or die

--------------070305050204090202030601
Content-Type: text/plain; charset=UTF-8;
 name="atomic.patch.txt"
Content-Transfer-Encoding: quoted-printable
Content-Disposition: attachment;
 filename="atomic.patch.txt"

--- sys/libkern.h.old	2012-01-16 07:15:12.000000000 +0400
+++ sys/libkern.h	2012-01-28 08:49:19.000000000 +0400
@@ -70,6 +70,11 @@ static __inline int abs(int a) { return=20
 static __inline long labs(long a) { return (a < 0 ? -a : a); }
 static __inline quad_t qabs(quad_t a) { return (a < 0 ? -a : a); }
=20
+#define	ARC4_ENTR_NONE	0	/* Don't have entropy yet. */
+#define	ARC4_ENTR_HAVE	1	/* Have entropy. */
+#define	ARC4_ENTR_SEED	2	/* Reseeding. */
+extern int arc4rand_iniseed_state;
+
 /* Prototypes for non-quad routines. */
 struct malloc_type;
 uint32_t arc4random(void);
--- dev/random/randomdev_soft.c.old	2011-03-02 01:42:19.000000000 +0300
+++ dev/random/randomdev_soft.c	2012-01-28 08:48:22.000000000 +0400
@@ -366,6 +366,8 @@ random_yarrow_unblock(void)
 		selwakeuppri(&random_systat.rsel, PUSER);
 		wakeup(&random_systat);
 	}
+	(void)atomic_cmpset_int(&arc4rand_iniseed_state, ARC4_ENTR_NONE,
+	    ARC4_ENTR_HAVE);
 }
=20
 static int
--- libkern/arc4random.c.old	2008-08-08 01:51:09.000000000 +0400
+++ libkern/arc4random.c	2012-01-28 08:51:12.000000000 +0400
@@ -24,6 +24,8 @@ __FBSDID("$FreeBSD: src/sys/libkern/arc4
 #define	ARC4_RESEED_SECONDS 300
 #define	ARC4_KEYBYTES (256 / 8)
=20
+int arc4rand_iniseed_state =3D ARC4_ENTR_NONE;
+
 static u_int8_t arc4_i, arc4_j;
 static int arc4_numruns =3D 0;
 static u_int8_t arc4_sbox[256];
@@ -130,7 +132,8 @@ arc4rand(void *ptr, u_int len, int resee
 	struct timeval tv;
=20
 	getmicrouptime(&tv);
-	if (reseed ||=20
+	if (atomic_cmpset_int(&arc4rand_iniseed_state, ARC4_ENTR_HAVE,
+	    ARC4_ENTR_SEED) || reseed ||
 	   (arc4_numruns > ARC4_RESEED_BYTES) ||
 	   (tv.tv_sec > arc4_t_reseed))
 		arc4_randomstir();


--------------070305050204090202030601--

------enig2TSVUWWOHGUHBDXSBAGNL
Content-Type: application/pgp-signature; name="signature.asc"
Content-Description: OpenPGP digital signature
Content-Disposition: attachment; filename="signature.asc"

-----BEGIN PGP SIGNATURE-----

iQEcBAEBCgAGBQJRXfC0AAoJEG80Jeu8UPuzhkMIAKdKK9y7CXqWjbXMiImeMBaB
fmx14/xXatMNdpq6CaRahDscHZZc6MznjGfagusS8nu/SLtZqQTGE+YA3a0p+cAe
AHREIzrozNte3qs0YWmj4IHDgeQfarm/I/ecrzrjmDCwJeARquuk/WnFKhFESx/Q
3aj6E6lUjspmVu4eyd7w+yicfgSU07EZzNC5msdpdLytWIUI6UTBaNoGJENz867E
kSsbnFMDrS4Om1EtuiYb+8ButTlQaCVl55ZsGfhB8tRv0GzmY67V8lm7XofvBikA
VBuGssz3WGZHdSkrgobB6+kHi8IojXZpq3eWwi+b+wdN2YXXbf8ThZTicDdziIc=
=XDjD
-----END PGP SIGNATURE-----

------enig2TSVUWWOHGUHBDXSBAGNL--



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?515DF0B4.6020000>