Subject: Re: Kernel random number generator
To: Rick Byers <rickb@iaw.on.ca>
From: David Brownlee <abs@anim.dreamworks.com>
List: current-users
Date: 04/30/1997 18:20:30
	The openbsd people have done some interesting things with putting
	random number generators into the kernel - using the
	unpredicability of kernbel events to provide a 'pool' of
	randomness.

	Its probably very much worth looking at what they've done,
	possibly even integrating it into netbsd...

                David/abs               abs@anim.dreamworks.com

    		       - Oakwood apartments -
     - $1300 a month and people steal your laundry - What a place -

On Wed, 30 Apr 1997, Rick Byers wrote:

> James,
> 
> I thought about using crypt as well, but decided that it wasn't really the
> random number generator (or crypt) that was the problem, but the initial
> seed.  I.E. the possible end result is still dependant on the resolution
> of the clock.  Now given that a certain function (crypt in this example)
> won't take the exact same amount of time, it might work.  That is where
> the resolution of the timer comes in.  If the timer resolution is so bad
> that the time for crypt to run can be predicted within the accuracy of the
> clock, then it's no good.  Even if someone could calculate 100 possible
> values for the time difference, then it's still not good enough.  You
> could loop that n times, and end up with 100^n possible values, but I'm
> sure there would be other ways to narrow down the possibilities (i.e.
> subsequent calls to crypt are going to be very close in timing to other
> recent calls to crypt due to a similar load on the system at that time).
> 
> You do have a good idea about the conditions though, I'm not sure if the
> crypt call helps though.  Crypt just produces a different values based on
> it's input, but given the same imput, it creates the same value.  In this
> application, it doesn't matter WHAT the value is, just how many
> possibilities it has, and the number of possibile outputs of crypt is the
> number of possible inputs you give it.  For example, if tv_usec can only
> have 100 possible values (100ths of a second as Perry suggested), then
> you've only got 200 possible outcomes.  Obviously the more you loop it,
> the more possible outcomes, but it should be possible to predict
> approximatly how long each loop takes to run.  If the loop runs too
> quickly to get an accurate prediction, then it's faster than the system
> clock anyway and you'll end up with a predictable (same) value for
> tv_usec.  Can random be back-traced? I mean, can a value returned by
> random be used to find the initial seed?  If so, then I guess crypt would
> be a much better idea.  What do you think of something like this:
> 
> seed = timer
> do
> 	seed = seed * timer
> while !(seed % 100)
> 
> I'm just wondering if the gettimeofday call inside the loop will introduce
> enough randomness or not?  I'm also not sure about the probabilities
> surrouding multiplication.  I.E., if seed is initially even, then it will
> be even regardless of what timer is.  You mentioned xoring though, thats a
> great idea, that should help a lot because any bit of the output of xor
> can't be determined without knowing BOTH input bits.
> 
> I also can have the program wait for the user to press enter.  That's the
> concept pgp uses to generate it's random number, you have to type 100 keys
> or so and it measures the timing between your keystrokes for the seed.  I
> just don't want someone to have to press a key 100 times before it will
> output the result (since we will be using it a lot).
> 
> I'll go change my * to s - Thanks,
> 				Rick
> 
>  On Wed, 30 Apr 1997, Graham, James wrote:
> 
> > You _could_ do a random number generator triggered by cycling stuff
> > through
> > the crypt() call once, converting from the base-64 string into binary,
> > then
> > using that number to seed your generator.
> > 
> > There's an AWFUL lot of possibility there, especially if you grab
> > tv_usec,
> > even if there are a limited number of possible values.
> > 
> > Picture this one:
> > 
> > grab tv_usec;
> > translate to ascii;
> > run thru crypt();
> > translate result from base-64 to binary;
> > grab tv_usec again;
> > even-result:	run thru compression
> > odd-result:	run thru ebcdic encoding
> > convert result to a binary number;
> > seed your generator.
> > 
> > Convoluted, but if you throw several layers of uncertainty in there
> > (maybe repeat several times of grabbing the tv_usec, filtering it
> > thru crypt(), xoring the value and running it thru crypt() again),
> > especially ones which  have more than one possible return value,
> > you have a pretty-close-to-perfect implementation.
> > 
> > It would be really cool, but not strictly necessary, to have a
> > random number generator in the kernel.
> > 
> > /* note for crypt():  I mean the DES crypt or other routine
> >    which does a ratio of input:output better than 1:1024 */
> > 
> > Reply-To: greywolf@starwolf.com
> > 
> > This message made possible by
> > Microsoft
> > "I'VE GOT A BAD FEELING ABOUT THIS"
> > 
> 
> =========================================================================
> Rick Byers                                      Internet Access Worldwide
> rickb@iaw.on.ca                                      System Administrator
> Welland, Ontario, Canada                                    (905)714-1400
> http://www.iaw.on.ca/rickb/                         http://www.iaw.on.ca/
> 
>