diff mbox

[U-Boot,v4,1/3] lib: add rand() function

Message ID 1336671134-16342-2-git-send-email-michael@walle.cc
State Superseded
Delegated to: Prafulla Wadaskar
Headers show

Commit Message

Michael Walle May 10, 2012, 5:32 p.m. UTC
It's a PRNG using the simple and fast xorshift method.

Signed-off-by: Michael Walle <michael@walle.cc>
---
 include/common.h |    4 ++++
 lib/Makefile     |    1 +
 lib/rand.c       |   43 +++++++++++++++++++++++++++++++++++++++++++
 3 files changed, 48 insertions(+), 0 deletions(-)
 create mode 100644 lib/rand.c

Comments

Wolfgang Denk May 11, 2012, 7:20 p.m. UTC | #1
Dear Michael Walle,

In message <1336671134-16342-2-git-send-email-michael@walle.cc> you wrote:
> It's a PRNG using the simple and fast xorshift method.
...
> +static unsigned int y = 2463534242U;

Hm... can we introduce at least a little entropy somewhere?


Best regards,

Wolfgang Denk
Michael Walle May 11, 2012, 8:32 p.m. UTC | #2
Am Freitag 11 Mai 2012, 21:20:02 schrieb Wolfgang Denk:
> Dear Michael Walle,
> 
> In message <1336671134-16342-2-git-send-email-michael@walle.cc> you wrote:
> > It's a PRNG using the simple and fast xorshift method.
> 
> ...
> 
> > +static unsigned int y = 2463534242U;
> 
> Hm... can we introduce at least a little entropy somewhere?
Mh? A user is supposed to seed via srand().
Wolfgang Denk May 11, 2012, 8:43 p.m. UTC | #3
Dear Michael Walle,

In message <201205112232.20664.michael@walle.cc> you wrote:
>
> > > +static unsigned int y = 2463534242U;
> > 
> > Hm... can we introduce at least a little entropy somewhere?
> Mh? A user is supposed to seed via srand().

Then why initialize y at all?

Best regards,

Wolfgang Denk
Wolfgang Denk May 11, 2012, 9:11 p.m. UTC | #4
Dear Michael Walle,

please keep the ML on Cc: - thanks.

In message <201205112249.27871.michael@walle.cc> you wrote:
>
> > > > > +static unsigned int y = 2463534242U;
> > > > 
> > > > Hm... can we introduce at least a little entropy somewhere?
> > > 
> > > Mh? A user is supposed to seed via srand().
> > 
> > Then why initialize y at all?
> To have a sane fallback. Maybe i should have written
>  "A user is supposed to seed via srand() if he wan't some 
> entropy."

This is inconsequent.  Either we assume that the user will seed
srand(), then y should not be initialized at all, so it goes to the
BSS segment and does not waste space in the binary image.  Or we want
to deal with cases where the user doesn call srand(), and then we
should provide a bit better than such a static initialization.

Best regards,

Wolfgang Denk
Michael Walle May 11, 2012, 9:20 p.m. UTC | #5
> please keep the ML on Cc: - thanks.
sorry wrong key

> In message <201205112249.27871.michael@walle.cc> you wrote:
> > > > > > +static unsigned int y = 2463534242U;
> > > > > 
> > > > > Hm... can we introduce at least a little entropy somewhere?
> > > > 
> > > > Mh? A user is supposed to seed via srand().
> > > 
> > > Then why initialize y at all?
> > 
> > To have a sane fallback. Maybe i should have written
> > 
> >  "A user is supposed to seed via srand() if he wan't some
> > 
> > entropy."
> 
> This is inconsequent.  Either we assume that the user will seed
> srand(), then y should not be initialized at all, so it goes to the
> BSS segment and does not waste space in the binary image.  Or we want
> to deal with cases where the user doesn call srand(), and then we
> should provide a bit better than such a static initialization.

Again, i wanted to stick with the regular rand() srand() semantics.

http://pubs.opengroup.org/onlinepubs/009695399/functions/rand.html
"If rand() is called before any calls to srand() are made, the same sequence 
shall be generated as when srand() is first called with a seed value of 1."

But i'm fine with removing the initialization.
Wolfgang Denk May 11, 2012, 9:29 p.m. UTC | #6
Dear Michael Walle,

In message <201205112320.15462.michael@walle.cc> you wrote:
> 
> > This is inconsequent.  Either we assume that the user will seed
> > srand(), then y should not be initialized at all, so it goes to the
> > BSS segment and does not waste space in the binary image.  Or we want
> > to deal with cases where the user doesn call srand(), and then we
> > should provide a bit better than such a static initialization.
> 
> Again, i wanted to stick with the regular rand() srand() semantics.
> 
> http://pubs.opengroup.org/onlinepubs/009695399/functions/rand.html
> "If rand() is called before any calls to srand() are made, the same sequence 
> shall be generated as when srand() is first called with a seed value of 1."

Good point.

But then y should be initialized as 1 ?

Best regards,

Wolfgang Denk
Michael Walle May 11, 2012, 9:34 p.m. UTC | #7
Am Freitag 11 Mai 2012, 23:29:47 schrieb Wolfgang Denk:
> Dear Michael Walle,
> 
> In message <201205112320.15462.michael@walle.cc> you wrote:
> > > This is inconsequent.  Either we assume that the user will seed
> > > srand(), then y should not be initialized at all, so it goes to the
> > > BSS segment and does not waste space in the binary image.  Or we want
> > > to deal with cases where the user doesn call srand(), and then we
> > > should provide a bit better than such a static initialization.
> > 
> > Again, i wanted to stick with the regular rand() srand() semantics.
> > 
> > http://pubs.opengroup.org/onlinepubs/009695399/functions/rand.html
> > "If rand() is called before any calls to srand() are made, the same
> > sequence shall be generated as when srand() is first called with a seed
> > value of 1."
> 
> Good point.
> 
> But then y should be initialized as 1 ?
I'm no crypto expert, so i sticked with the values/examples from the cited 
paper. But i guess it shouldn't make any difference, i'll change it to 1.
diff mbox

Patch

diff --git a/include/common.h b/include/common.h
index 4b5841e..fbea264 100644
--- a/include/common.h
+++ b/include/common.h
@@ -733,6 +733,10 @@  char *	strmhz(char *buf, unsigned long hz);
 /* lib/crc32.c */
 #include <u-boot/crc.h>
 
+/* lib/rand.c */
+void srand(unsigned int seed);
+unsigned int rand(void);
+
 /* common/console.c */
 int	console_init_f(void);	/* Before relocation; uses the serial  stuff	*/
 int	console_init_r(void);	/* After  relocation; uses the console stuff	*/
diff --git a/lib/Makefile b/lib/Makefile
index a0fec60..290bf6a 100644
--- a/lib/Makefile
+++ b/lib/Makefile
@@ -65,6 +65,7 @@  COBJS-y += string.o
 COBJS-y += time.o
 COBJS-$(CONFIG_BOOTP_PXE) += uuid.o
 COBJS-y += vsprintf.o
+COBJS-y += rand.o
 
 COBJS	:= $(COBJS-y)
 SRCS	:= $(COBJS:.o=.c)
diff --git a/lib/rand.c b/lib/rand.c
new file mode 100644
index 0000000..9923f67
--- /dev/null
+++ b/lib/rand.c
@@ -0,0 +1,43 @@ 
+/*
+ * Simple xorshift PRNG
+ *   see http://www.jstatsoft.org/v08/i14/paper
+ *
+ * Copyright (c) 2012 Michael Walle
+ * Michael Walle <michael@walle.cc>
+ *
+ * See file CREDITS for list of people who contributed to this
+ * project.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License as
+ * published by the Free Software Foundation; either version 2 of
+ * the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston,
+ * MA 02111-1307 USA
+ */
+
+#include <common.h>
+
+static unsigned int y = 2463534242U;
+
+void srand(unsigned int seed)
+{
+	y = seed;
+}
+
+unsigned int rand(void)
+{
+	y ^= (y << 13);
+	y ^= (y >> 17);
+	y ^= (y << 5);
+
+	return y;
+}