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>