I've had this sitting around for a while.

GLib's g_rand* functions use a simple Mersenne Twister, and the docs
warn against their use where strong randomness is needed:

https://developer.gnome.org/glib/stable/glib-Random-Numbers.html

g_rand_* are deterministic, while g_random_* are nondeterministic.

Grepping for these functions in ports' source show that many projects
use them in crypto code. I've talked to the GNOME developers about this,
and they're considering how to deal with it. I've also reported bugs to
a handful of projects using these functions dangerously.

In the meantime, I think it's best to patch g_random_int() to call
arc4random(). The semantics are identical and g_random_int() is the most
commonly used of these functions, so I think it's a good place to start.
The others will probably take a little more care.

It doesn't cause test regressions, and the change seems straightforward.


Index: Makefile
===================================================================
RCS file: /cvs/ports/devel/glib2/Makefile,v
retrieving revision 1.252
diff -u -p -u -r1.252 Makefile
--- Makefile    18 Apr 2016 06:46:30 -0000      1.252
+++ Makefile    4 May 2016 23:42:20 -0000
@@ -4,6 +4,7 @@ COMMENT=                general-purpose utility librar
 
 GNOME_PROJECT=         glib
 GNOME_VERSION=         2.48.0
+REVISION=              0
 PKGNAME=               ${DISTNAME:S/glib/glib2/}
 
 CATEGORIES=            devel
Index: patches/patch-glib_grand_c
===================================================================
RCS file: patches/patch-glib_grand_c
diff -N patches/patch-glib_grand_c
--- /dev/null   1 Jan 1970 00:00:00 -0000
+++ patches/patch-glib_grand_c  4 May 2016 23:42:20 -0000
@@ -0,0 +1,16 @@
+$OpenBSD$
+--- glib/grand.c.orig  Mon Feb 29 09:32:44 2016
++++ glib/grand.c       Wed May  4 19:31:36 2016
+@@ -649,11 +649,7 @@ get_global_random (void)
+ guint32
+ g_random_int (void)
+ {
+-  guint32 result;
+-  G_LOCK (global_random);
+-  result = g_rand_int (get_global_random ());
+-  G_UNLOCK (global_random);
+-  return result;
++  return arc4random ();
+ }
+ 
+ /**

Reply via email to